From 484c0a7d5c338da65211cd20537856b14a33b616 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Wed, 9 Feb 2022 14:37:38 +0100 Subject: [PATCH] Documentation of Jastrow --- org/qmckl_distance.org | 2 +- org/qmckl_jastrow.org | 170 ++++++++++++++++++++++++++--------------- 2 files changed, 110 insertions(+), 62 deletions(-) diff --git a/org/qmckl_distance.org b/org/qmckl_distance.org index 918d176..6d3900e 100644 --- a/org/qmckl_distance.org +++ b/org/qmckl_distance.org @@ -872,7 +872,7 @@ end function test_qmckl_dist pairs of points in two sets, one point within each set: \[ - C_{ij} = \left( 1 - \exp{-\kappa C_{ij}}\right)/\kappa + C_{ij} = \left( 1 - \exp \left(-\kappa C_{ij} \right) \right)/\kappa \] If the input array is normal (~'N'~), the xyz coordinates are in diff --git a/org/qmckl_jastrow.org b/org/qmckl_jastrow.org index 0d92e00..a7675a5 100644 --- a/org/qmckl_jastrow.org +++ b/org/qmckl_jastrow.org @@ -3,10 +3,61 @@ #+SETUPFILE: ../tools/theme.setup #+INCLUDE: ../tools/lib.org -Functions for the calculation of the Jastrow factor \(f_{ee}, f_{en}, f_{een}\). -These are stored in the ~factor_ee~, ~factor_en~, and ~factor_een~ variables. -The ~jastrow~ structure contains all the information required to build -these factors along with their derivatives. +* Introduction + + The Jastrow factor depends on the electronic ($\mathbf{r}$) and + nuclear ($\mathbf{R}$) coordinates. Its defined as $\exp(J(\mathbf{r},\mathbf{R}))$, where + + \[ + J(\mathbf{r},\mathbf{R}) = J_{\text{eN}}(\mathbf{r},\mathbf{R}) + J_{\text{ee}}(\mathbf{r}) + J_{\text{eeN}}(\mathbf{r},\mathbf{R}) + \] + + In the following, we us the notations $r_{ij} = |\mathbf{r}_i - \mathbf{r}_j|$ and + $R_{i\alpha} = |\mathbf{r}_i - \mathbf{R}_\alpha|$. + + $J_{\text{eN}}$ contains electron-nucleus terms: + + \[ + J_{\text{eN}}(\mathbf{r},\mathbf{R}) = \sum_{i=1}^{N_\text{elec}} \sum_{\alpha=1}^{N_\text{nucl}} + \frac{a_1\, f(R_{i\alpha})}{1+a_2\, f(R_{i\alpha})} + + \sum_{p=2}^{N_\text{ord}^a} a_{p+1}\, [f(R_{i\alpha})]^p - J_{eN}^\infty + \] + + $J_{\text{ee}}$ contains electron-electron terms: + \[ + J_{\text{ee}}(\mathbf{r}) = + \sum_{i=1}^{N_\text{elec}} \sum_{j=1}^{i-1} + \frac{b_1\, f(r_{ij})}{1+b_2\, f(r_{ij})} + + \sum_{p=2}^{N_\text{ord}^b} a_{p+1}\, [f(r_{ij})]^p - J_{ee}^\infty + \] + + and $J_{\text{eeN}}$ contains electron-electron-Nucleus terms: + + \[ + J_{\text{eeN}}(\mathbf{r},\mathbf{R}) = + \sum_{\alpha=1}^{N_{\text{nucl}}} + \sum_{i=1}^{N_{\text{elec}}} + \sum_{j=1}^{i-1} + \sum_{p=2}^{N_{\text{ord}}} + \sum_{k=0}^{p-1} + \sum_{l=0}^{p-k-2\delta_{k,0}} + c_{lkp\alpha} \left[ g({r}_{ij}) \right]^k + \left[ \left[ g({R}_{i\alpha}) \right]^l + \left[ g({R}_{j\alpha}) \right]^l \right] + \left[ g({R}_{i\,\alpha}) \, g({R}_{j\alpha}) \right]^{(p-k-l)/2} + \] + + $c_{lkp\alpha}$ are non-zero only when $p-k-l$ is even. + + $f$ and $g$ are scaling function defined as + + \[ + f(r) = \frac{1-e^{-\kappa\, r}}{\kappa} \text{ and } + g(r) = e^{-\kappa\, r}. + \] + + The terms $J_{\text{ee}}^\infty$ and $J_{\text{eN}}^\infty$ are shifts to ensure that + $J_{\text{ee}}$ and $J_{\text{eN}}$ have an asymptotic value of zero. + * Headers :noexport: #+begin_src elisp :noexport :results none @@ -80,7 +131,7 @@ int main() { #+NAME: qmckl_jastrow_args | Variable | Type | In/Out | Description | |---------------------------+---------------------------------------+--------+-------------------------------------------------------------------| - | ~uninitialized~ | ~int32_t~ | in | Keeps bit set for uninitialized data | + | ~uninitialized~ | ~int32_t~ | in | Keeps bits set for uninitialized data | | ~aord_num~ | ~int64_t~ | in | The number of a coeffecients | | ~bord_num~ | ~int64_t~ | in | The number of b coeffecients | | ~cord_num~ | ~int64_t~ | in | The number of c coeffecients | @@ -124,12 +175,11 @@ int main() { | ~een_rescaled_n_deriv_e~ | ~double[walk_num][elec_num][4][nucl_num][0:cord_num]~ | The electron-electron rescaled distances raised to the powers defined by cord derivatives wrt electrons | | | ~een_rescaled_n_deriv_e_date~ | ~uint64_t~ | Keep track of the date of creation | | - For H2O we have the following data: - #+NAME: jastrow_data - #+BEGIN_SRC python :results output + #+BEGIN_SRC python :results none :exports none import numpy as np +# For H2O we have the following data: elec_num = 10 nucl_num = 2 up_num = 5 @@ -150,46 +200,46 @@ elec_coord = [[[-0.250655104764153 , 0.503070975550133 , -0.16655 [ 0.397978144318712 , -0.254277292595981 , 2.54553335476344]]]; ee_distance_rescaled = [ -[ 0.000000000000000E+000 ,0.000000000000000E+000 ,0.000000000000000E+000, - 0.000000000000000E+000 ,0.000000000000000E+000 ,0.000000000000000E+000, - 0.000000000000000E+000 ,0.000000000000000E+000 ,0.000000000000000E+000, - 0.000000000000000E+000], -[ 0.550227800352402 ,0.000000000000000E+000 ,0.000000000000000E+000, - 0.000000000000000E+000 ,0.000000000000000E+000 ,0.000000000000000E+000, - 0.000000000000000E+000 ,0.000000000000000E+000 ,0.000000000000000E+000, - 0.000000000000000E+000], -[ 0.919155060185168 ,0.937695909123175 ,0.000000000000000E+000, - 0.000000000000000E+000 ,0.000000000000000E+000 ,0.000000000000000E+000, - 0.000000000000000E+000 ,0.000000000000000E+000 ,0.000000000000000E+000, - 0.000000000000000E+000], -[ 0.893325429242815 ,0.851181978173561 ,0.978501685226877 , - 0.000000000000000E+000 ,0.000000000000000E+000 ,0.000000000000000E+000, - 0.000000000000000E+000 ,0.000000000000000E+000 ,0.000000000000000E+000, - 0.000000000000000E+000], -[ 0.982457268305353 ,0.976125002619471 ,0.994349933143149 , - 0.844077311588328 ,0.000000000000000E+000 ,0.000000000000000E+000, - 0.000000000000000E+000 ,0.000000000000000E+000 ,0.000000000000000E+000, - 0.000000000000000E+000], -[ 0.482407528408731 ,0.414816073699124 ,0.894716035479343 , - 0.876540187084407 ,0.978921170036895 ,0.000000000000000E+000, - 0.000000000000000E+000 ,0.000000000000000E+000 ,0.000000000000000E+000, - 0.000000000000000E+000], -[ 0.459541909660400 ,0.545007215761510 ,0.883752955884551 , - 0.918958134888791 ,0.986386936267237 ,0.362209822236419 , - 0.000000000000000E+000 ,0.000000000000000E+000 ,0.000000000000000E+000, - 0.000000000000000E+000], -[ 0.763732576854455 ,0.817282762358449 ,0.801802919535959 , - 0.900089095449775 ,0.975704636491453 ,0.707836537586060 , - 0.755705808346586 ,0.000000000000000E+000 ,0.000000000000000E+000, - 0.000000000000000E+000], -[ 0.904249454052971 ,0.871097965261373 ,0.982717262706270 , - 0.239901207363622 ,0.836519456769083 ,0.896135326270534 , - 0.930694340243023 ,0.917708540815567 ,0.000000000000000E+000, - 0.000000000000000E+000], -[ 0.944400908070716 ,0.922589018494961 ,0.984615718580670 , - 0.514328661540623 ,0.692362267147064 ,0.931894098453677 , - 0.956034127544344 ,0.931221472309472 ,0.540903688625053 , - 0.000000000000000E+000]] +[ 0.000000000000000, 0.000000000000000, 0.000000000000000, + 0.000000000000000, 0.000000000000000, 0.000000000000000, + 0.000000000000000, 0.000000000000000, 0.000000000000000, + 0.000000000000000 ], +[ 0.550227800352402, 0.000000000000000, 0.000000000000000, + 0.000000000000000, 0.000000000000000, 0.000000000000000, + 0.000000000000000, 0.000000000000000, 0.000000000000000, + 0.000000000000000 ], +[ 0.919155060185168, 0.937695909123175, 0.000000000000000, + 0.000000000000000, 0.000000000000000, 0.000000000000000, + 0.000000000000000, 0.000000000000000, 0.000000000000000, + 0.000000000000000 ], +[ 0.893325429242815, 0.851181978173561, 0.978501685226877, + 0.000000000000000, 0.000000000000000, 0.000000000000000, + 0.000000000000000, 0.000000000000000, 0.000000000000000, + 0.000000000000000 ], +[ 0.982457268305353, 0.976125002619471, 0.994349933143149, + 0.844077311588328, 0.000000000000000, 0.000000000000000, + 0.000000000000000, 0.000000000000000, 0.000000000000000, + 0.000000000000000 ], +[ 0.482407528408731, 0.414816073699124, 0.894716035479343, + 0.876540187084407, 0.978921170036895, 0.000000000000000, + 0.000000000000000, 0.000000000000000, 0.000000000000000, + 0.000000000000000 ], +[ 0.459541909660400, 0.545007215761510, 0.883752955884551, + 0.918958134888791, 0.986386936267237, 0.362209822236419, + 0.000000000000000, 0.000000000000000, 0.000000000000000, + 0.000000000000000 ], +[ 0.763732576854455, 0.817282762358449, 0.801802919535959, + 0.900089095449775, 0.975704636491453, 0.707836537586060, + 0.755705808346586, 0.000000000000000, 0.000000000000000, + 0.000000000000000 ], +[ 0.904249454052971, 0.871097965261373, 0.982717262706270, + 0.239901207363622, 0.836519456769083, 0.896135326270534, + 0.930694340243023, 0.917708540815567, 0.000000000000000, + 0.000000000000000 ], +[ 0.944400908070716, 0.922589018494961, 0.984615718580670, + 0.514328661540623, 0.692362267147064, 0.931894098453677, + 0.956034127544344, 0.931221472309472, 0.540903688625053, + 0.000000000000000 ]] en_distance_rescaled = np.transpose(np.array([ [ 0.443570948411811 , 0.467602196999105 , 0.893870160799932 , @@ -276,8 +326,6 @@ kappa = 1.0 kappa_inv = 1.0/kappa #+END_SRC - #+RESULTS: jastrow_data - ** Data structure #+begin_src c :comments org :tangle (eval h_private_type) @@ -922,7 +970,7 @@ qmckl_exit_code qmckl_set_jastrow_cord_vector(qmckl_context context, double cons When the required information is completely entered, other data structures are computed to accelerate the calculations. The intermediates factors - are precontracted using BLAS LEVEL 3 operations for an optimal FLOP count. + are precontracted using BLAS LEVEL 3 operations for an optimal flop count. #+begin_src c :comments org :tangle (eval h_private_func) :noweb yes :exports none qmckl_exit_code qmckl_finalize_jastrow(qmckl_context context); @@ -1151,14 +1199,14 @@ assert(qmckl_nucleus_provided(context)); compute. If it is the case, then the data is recomputed and the current date is stored. -** Asymptotic component for \(f_{ee}\) +** Asymptotic component for \(J_{ee}\) Calculate the asymptotic component ~asymp_jasb~ to be substracted from the final - electron-electron jastrow factor \(f_{ee}\). The asymptotic componenet is calculated + electron-electron jastrow factor \(J_{\text{ee}}\). The asymptotic component is calculated via the ~bord_vector~ and the electron-electron rescale factor ~rescale_factor_kappa~. \[ - J_{asymp} = \frac{b_1 \kappa^-1}{1 + b_2 \kappa^-1} + J_{\text{ee}}^{\infty} = \frac{b_1 \kappa^{-1}}{1 + b_2 \kappa^{-1}} \] *** Get @@ -1255,13 +1303,13 @@ qmckl_exit_code qmckl_provide_asymp_jasb(qmckl_context context) :END: #+NAME: qmckl_asymp_jasb_args - | Variable | Type | In/Out | Description | - |---------------------------+----------------------+--------+-----------------------------| - | ~context~ | ~qmckl_context~ | in | Global state | - | ~bord_num~ | ~int64_t~ | in | Number of electrons | - | ~bord_vector~ | ~double[bord_num+1]~ | in | Number of walkers | - | ~rescale_factor_kappa_ee~ | ~double~ | in | Electron coordinates | - | ~asymp_jasb~ | ~double[2]~ | out | Electron-electron distances | + | Variable | Type | In/Out | Description | + |---------------------------+----------------------+--------+-------------------------| + | ~context~ | ~qmckl_context~ | in | Global state | + | ~bord_num~ | ~int64_t~ | in | Order of the polynomial | + | ~bord_vector~ | ~double[bord_num+1]~ | in | Values of b | + | ~rescale_factor_kappa_ee~ | ~double~ | in | Electron coordinates | + | ~asymp_jasb~ | ~double[2]~ | out | Asymptotic value | #+begin_src f90 :comments org :tangle (eval f) :noweb yes integer function qmckl_compute_asymp_jasb_f(context, bord_num, bord_vector, rescale_factor_kappa_ee, asymp_jasb) &