mirror of
https://github.com/TREX-CoE/qmc-lttc.git
synced 2024-12-22 04:15:01 +01:00
OK up to VMC
This commit is contained in:
parent
a095fc0eec
commit
e8bf999e25
83
QMC.org
83
QMC.org
@ -49,7 +49,7 @@
|
|||||||
starting from an approximate wave function.
|
starting from an approximate wave function.
|
||||||
|
|
||||||
Code examples will be given in Python and Fortran. You can use
|
Code examples will be given in Python and Fortran. You can use
|
||||||
whatever language you prefer to write the program.
|
whatever language you prefer to write the programs.
|
||||||
|
|
||||||
We consider the stationary solution of the Schrödinger equation, so
|
We consider the stationary solution of the Schrödinger equation, so
|
||||||
the wave functions considered here are real: for an $N$ electron
|
the wave functions considered here are real: for an $N$ electron
|
||||||
@ -80,14 +80,17 @@
|
|||||||
= \frac{\int |\Psi(\mathbf{r})|^2\, E_L(\mathbf{r})\,d\mathbf{r}}{\int |\Psi(\mathbf{r}) |^2 d\mathbf{r}}
|
= \frac{\int |\Psi(\mathbf{r})|^2\, E_L(\mathbf{r})\,d\mathbf{r}}{\int |\Psi(\mathbf{r}) |^2 d\mathbf{r}}
|
||||||
\end{eqnarray*}
|
\end{eqnarray*}
|
||||||
|
|
||||||
For few dimensions, one can easily compute $E$ by evaluating the integrals on a grid but, for a high number of dimensions, one can resort to Monte Carlo techniques to compute $E$.
|
For few dimensions, one can easily compute $E$ by evaluating the
|
||||||
|
integrals on a grid but, for a high number of dimensions, one can
|
||||||
|
resort to Monte Carlo techniques to compute $E$.
|
||||||
|
|
||||||
To this aim, recall that the probabilistic /expected value/ of an arbitrary function $f(x)$
|
To this aim, recall that the probabilistic /expected value/ of an
|
||||||
with respect to a probability density function $P(x)$ is given by
|
arbitrary function $f(x)$ with respect to a probability density
|
||||||
|
function $P(x)$ is given by
|
||||||
|
|
||||||
$$ \langle f \rangle_p = \int_{-\infty}^\infty P(x)\, f(x)\,dx, $$
|
$$ \langle f \rangle_P = \int_{-\infty}^\infty P(x)\, f(x)\,dx, $$
|
||||||
|
|
||||||
where a probability density function $p(x)$ is non-negative
|
where a probability density function $P(x)$ is non-negative
|
||||||
and integrates to one:
|
and integrates to one:
|
||||||
|
|
||||||
$$ \int_{-\infty}^\infty P(x)\,dx = 1. $$
|
$$ \int_{-\infty}^\infty P(x)\,dx = 1. $$
|
||||||
@ -95,13 +98,15 @@
|
|||||||
Similarly, we can view the the energy of a system, $E$, as the expected value of the local energy with respect to
|
Similarly, we can view the the energy of a system, $E$, as the expected value of the local energy with respect to
|
||||||
a probability density $P(\mathbf{r})$ defined in 3$N$ dimensions:
|
a probability density $P(\mathbf{r})$ defined in 3$N$ dimensions:
|
||||||
|
|
||||||
$$ E = \int E_L(\mathbf{r}) P(\mathbf{r})\,d\mathbf{r} \equiv \langle E_L \rangle_{\Psi^2}\,, $$
|
$$ E = \int E_L(\mathbf{r}) P(\mathbf{r})\,d\mathbf{r} \equiv \langle E_L \rangle_{P}\,, $$
|
||||||
|
|
||||||
where the probability density is given by the square of the wave function:
|
where the probability density is given by the square of the wave function:
|
||||||
|
|
||||||
$$ P(\mathbf{r}) = \frac{|\Psi(\mathbf{r})|^2}{\int |\Psi(\mathbf{r})|^2 d\mathbf{r}}\,. $$
|
$$ P(\mathbf{r}) = \frac{|\Psi(\mathbf{r})|^2}{\int |\Psi(\mathbf{r})|^2 d\mathbf{r}}\,. $$
|
||||||
|
|
||||||
If we can sample $N_{\rm MC}$ configurations $\{\mathbf{r}\}$ distributed as $p$, we can estimate $E$ as the average of the local energy computed over these configurations:
|
If we can sample $N_{\rm MC}$ configurations $\{\mathbf{r}\}$
|
||||||
|
distributed as $P$, we can estimate $E$ as the average of the local
|
||||||
|
energy computed over these configurations:
|
||||||
|
|
||||||
$$ E \approx \frac{1}{N_{\rm MC}} \sum_{i=1}^{N_{\rm MC}} E_L(\mathbf{r}_i) \,. $$
|
$$ E \approx \frac{1}{N_{\rm MC}} \sum_{i=1}^{N_{\rm MC}} E_L(\mathbf{r}_i) \,. $$
|
||||||
|
|
||||||
@ -148,7 +153,7 @@
|
|||||||
|
|
||||||
#+begin_exercise
|
#+begin_exercise
|
||||||
Write a function which computes the potential at $\mathbf{r}$.
|
Write a function which computes the potential at $\mathbf{r}$.
|
||||||
The function accepts a 3-dimensional vector =r= as input arguments
|
The function accepts a 3-dimensional vector =r= as input argument
|
||||||
and returns the potential.
|
and returns the potential.
|
||||||
#+end_exercise
|
#+end_exercise
|
||||||
|
|
||||||
@ -254,7 +259,7 @@ end function psi
|
|||||||
local kinetic energy.
|
local kinetic energy.
|
||||||
#+end_exercise
|
#+end_exercise
|
||||||
|
|
||||||
The local kinetic energy is defined as $$-\frac{1}{2}\frac{\Delta \Psi}{\Psi}.$$
|
The local kinetic energy is defined as $$T_L(\mathbf{r}) = -\frac{1}{2}\frac{\Delta \Psi(\mathbf{r})}{\Psi(\mathbf{r})}.$$
|
||||||
|
|
||||||
We differentiate $\Psi$ with respect to $x$:
|
We differentiate $\Psi$ with respect to $x$:
|
||||||
|
|
||||||
@ -281,7 +286,7 @@ end function psi
|
|||||||
|
|
||||||
Therefore, the local kinetic energy is
|
Therefore, the local kinetic energy is
|
||||||
$$
|
$$
|
||||||
-\frac{1}{2} \frac{\Delta \Psi}{\Psi} (\mathbf{r}) = -\frac{1}{2}\left(a^2 - \frac{2a}{\mathbf{|r|}} \right)
|
T_L (\mathbf{r}) = -\frac{1}{2}\left(a^2 - \frac{2a}{\mathbf{|r|}} \right)
|
||||||
$$
|
$$
|
||||||
|
|
||||||
*Python*
|
*Python*
|
||||||
@ -352,11 +357,24 @@ def e_loc(a,r):
|
|||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
*Fortran*
|
*Fortran*
|
||||||
|
|
||||||
|
#+begin_note
|
||||||
|
When you call a function in Fortran, you need to declare its
|
||||||
|
return type.
|
||||||
|
You might by accident choose a function name which is the
|
||||||
|
same as an internal function of Fortran. So it is recommended to
|
||||||
|
*always* use the keyword ~external~ to make sure the function you
|
||||||
|
are calling is yours.
|
||||||
|
#+end_note
|
||||||
|
|
||||||
#+BEGIN_SRC f90 :tangle none
|
#+BEGIN_SRC f90 :tangle none
|
||||||
double precision function e_loc(a,r)
|
double precision function e_loc(a,r)
|
||||||
implicit none
|
implicit none
|
||||||
double precision, intent(in) :: a, r(3)
|
double precision, intent(in) :: a, r(3)
|
||||||
|
|
||||||
|
double precision, external :: kinetic
|
||||||
|
double precision, external :: potential
|
||||||
|
|
||||||
! TODO
|
! TODO
|
||||||
|
|
||||||
end function e_loc
|
end function e_loc
|
||||||
@ -375,7 +393,8 @@ double precision function e_loc(a,r)
|
|||||||
implicit none
|
implicit none
|
||||||
double precision, intent(in) :: a, r(3)
|
double precision, intent(in) :: a, r(3)
|
||||||
|
|
||||||
double precision, external :: kinetic, potential
|
double precision, external :: kinetic
|
||||||
|
double precision, external :: potential
|
||||||
|
|
||||||
e_loc = kinetic(a,r) + potential(r)
|
e_loc = kinetic(a,r) + potential(r)
|
||||||
|
|
||||||
@ -408,20 +427,38 @@ end function e_loc
|
|||||||
:header-args:f90: :tangle plot_hydrogen.f90
|
:header-args:f90: :tangle plot_hydrogen.f90
|
||||||
:END:
|
:END:
|
||||||
|
|
||||||
#+begin_note
|
The program you will write in this section will be written in
|
||||||
The potential and the kinetic energy both diverge at $r=0$, so we
|
another file (~plot_hydrogen.py~ or ~plot_hydrogen.f90~ for
|
||||||
choose a grid which does not contain the origin.
|
example).
|
||||||
#+end_note
|
It will use the functions previously defined.
|
||||||
|
|
||||||
|
In Python, you should put at the beginning of the file
|
||||||
|
#+BEGIN_SRC python :results none :tangle none
|
||||||
|
from hydrogen import e_loc
|
||||||
|
#+END_SRC
|
||||||
|
to be able to use the ~e_loc~ function of the ~hydrogen.py~ file.
|
||||||
|
|
||||||
|
In Fortran, you will need to compile all the source files together:
|
||||||
|
#+begin_src sh :exports both
|
||||||
|
gfortran hydrogen.f90 plot_hydrogen.f90 -o plot_hydrogen
|
||||||
|
#+end_src
|
||||||
|
|
||||||
*** Exercise
|
*** Exercise
|
||||||
|
|
||||||
#+begin_exercise
|
#+begin_exercise
|
||||||
For multiple values of $a$ (0.1, 0.2, 0.5, 1., 1.5, 2.), plot the
|
For multiple values of $a$ (0.1, 0.2, 0.5, 1., 1.5, 2.), plot the
|
||||||
local energy along the $x$ axis. In Python, you can use matplotlib
|
local energy along the $x$ axis. In Python, you can use matplotlib
|
||||||
for example. In Fortran, it is convenient to write in a text file
|
for example. In Fortran, it is convenient to write in a text file
|
||||||
the values of $x$ and $E_L(\mathbf{r})$ for each point, and use
|
the values of $x$ and $E_L(\mathbf{r})$ for each point, and use
|
||||||
Gnuplot to plot the files.
|
Gnuplot to plot the files. With Gnuplot, you will need 2 blank
|
||||||
|
lines to separate the data corresponding to different values of $a$.
|
||||||
#+end_exercise
|
#+end_exercise
|
||||||
|
|
||||||
|
#+begin_note
|
||||||
|
The potential and the kinetic energy both diverge at $r=0$, so we
|
||||||
|
choose a grid which does not contain the origin to avoid numerical issues.
|
||||||
|
#+end_note
|
||||||
|
|
||||||
*Python*
|
*Python*
|
||||||
#+BEGIN_SRC python :results none :tangle none
|
#+BEGIN_SRC python :results none :tangle none
|
||||||
import numpy as np
|
import numpy as np
|
||||||
@ -3007,3 +3044,15 @@ gfortran hydrogen.f90 qmc_stats.f90 vmc.f90 -o vmc
|
|||||||
- [ ] Propose a project for the students to continue the
|
- [ ] Propose a project for the students to continue the
|
||||||
programs. Idea: Modify the program to compute the exact energy of
|
programs. Idea: Modify the program to compute the exact energy of
|
||||||
the H$_2$ molecule at $R$=1.4010 bohr. Answer: 0.17406 a.u.
|
the H$_2$ molecule at $R$=1.4010 bohr. Answer: 0.17406 a.u.
|
||||||
|
|
||||||
|
* Schedule
|
||||||
|
|
||||||
|
|------------------------------+---------|
|
||||||
|
| <2021-02-04 Thu 09:00-10:30> | Lecture |
|
||||||
|
|------------------------------+---------|
|
||||||
|
| <2021-02-04 Thu 10:45-11:10> | 2.1 |
|
||||||
|
| <2021-02-04 Thu 11:10-11:30> | 2.2 |
|
||||||
|
| <2021-02-04 Thu 11:30-12:15> | 2.3 |
|
||||||
|
| <2021-02-04 Thu 12:15-12:30> | 2.4 |
|
||||||
|
|------------------------------+---------|
|
||||||
|
| | |
|
||||||
|
Loading…
Reference in New Issue
Block a user