2021-06-23 08:48:43 +02:00
|
|
|
#+TITLE: Jastrow Factor
|
|
|
|
#+SETUPFILE: ../tools/theme.setup
|
|
|
|
#+INCLUDE: ../tools/lib.org
|
|
|
|
|
|
|
|
Functions for the calculation of the Jastrow factor \(f_{ee}, f_{en}, f_{een}\).
|
2021-06-23 10:55:59 +02:00
|
|
|
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.
|
2021-06-23 08:48:43 +02:00
|
|
|
|
2021-06-23 10:55:59 +02:00
|
|
|
* Headers :noexport:
|
|
|
|
#+begin_src elisp :noexport :results none
|
|
|
|
(org-babel-lob-ingest "../tools/lib.org")
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
|
|
|
|
#+begin_src c :tangle (eval h_private_type)
|
|
|
|
#ifndef QMCKL_JASTROW_HPT
|
|
|
|
#define QMCKL_JASTROW_HPT
|
|
|
|
#include <stdbool.h>
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
#+begin_src c :tangle (eval c_test) :noweb yes
|
|
|
|
#include "qmckl.h"
|
|
|
|
#include <assert.h>
|
|
|
|
#include <math.h>
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include "config.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "chbrclf.h"
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
qmckl_context context;
|
|
|
|
context = qmckl_context_create();
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
#+begin_src c :tangle (eval c)
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include "config.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef HAVE_STDINT_H
|
|
|
|
#include <stdint.h>
|
|
|
|
#elif HAVE_INTTYPES_H
|
|
|
|
#include <inttypes.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <stdbool.h>
|
|
|
|
#include <assert.h>
|
|
|
|
#include <math.h>
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
#include "qmckl.h"
|
|
|
|
#include "qmckl_context_private_type.h"
|
|
|
|
#include "qmckl_memory_private_type.h"
|
|
|
|
#include "qmckl_memory_private_func.h"
|
|
|
|
#include "qmckl_jastrow_private_func.h"
|
2021-06-23 14:26:01 +02:00
|
|
|
#include "qmckl_jastrow_private_type.h"
|
2021-06-23 10:55:59 +02:00
|
|
|
#+end_src
|
|
|
|
|
|
|
|
* Context
|
|
|
|
:PROPERTIES:
|
|
|
|
:Name: qmckl_jastrow
|
|
|
|
:CRetType: qmckl_exit_code
|
|
|
|
:FRetType: qmckl_exit_code
|
|
|
|
:END:
|
|
|
|
|
|
|
|
The following data stored in the context:
|
|
|
|
|
|
|
|
#+NAME: qmckl_jastrow_args
|
2021-06-23 13:57:01 +02:00
|
|
|
|------------+-------------------------------------------+-----+-------------------------------------------------------------------|
|
|
|
|
| ~int32_t~ | ~uninitialized~ | in | Keeps bit set for uninitialized data |
|
|
|
|
| ~int64_t~ | ~aord_num~ | in | The number of a coeffecients |
|
|
|
|
| ~int64_t~ | ~bord_num~ | in | The number of b coeffecients |
|
|
|
|
| ~int64_t~ | ~cord_num~ | in | The number of c coeffecients |
|
|
|
|
| ~uint64_t~ | ~type_nuc_num~ | in | Number of Nucleii types |
|
|
|
|
| ~double~ | ~aord_vector[aord_num + 1][type_nuc_num]~ | in | Order of a polynomial coefficients |
|
|
|
|
| ~double~ | ~bord_vector[bord_num + 1]~ | in | Order of b polynomial coefficients |
|
|
|
|
| ~double~ | ~cord_vector[cord_num][type_nuc_num]~ | in | Order of c polynomial coefficients |
|
|
|
|
| ~double~ | ~factor_ee~ | out | Jastrow factor: electron-electron part |
|
2021-06-25 05:24:50 +02:00
|
|
|
| ~double~ | ~factor_ee_date~ | out | Jastrow factor: electron-electron part |
|
2021-06-23 13:57:01 +02:00
|
|
|
| ~double~ | ~factor_en~ | out | Jastrow factor: electron-nucleus part |
|
2021-06-25 05:24:50 +02:00
|
|
|
| ~double~ | ~factor_en_date~ | out | Jastrow factor: electron-nucleus part |
|
2021-06-23 13:57:01 +02:00
|
|
|
| ~double~ | ~factor_een~ | out | Jastrow factor: electron-electron-nucleus part |
|
2021-06-25 05:24:50 +02:00
|
|
|
| ~double~ | ~factor_een_date~ | out | Jastrow factor: electron-electron-nucleus part |
|
2021-06-23 13:57:01 +02:00
|
|
|
| ~double~ | ~factor_ee_deriv_e[4][nelec]~ | out | Derivative of the Jastrow factor: electron-electron-nucleus part |
|
|
|
|
| ~double~ | ~factor_en_deriv_e[4][nelec]~ | out | Derivative of the Jastrow factor: electron-electron-nucleus part |
|
|
|
|
| ~double~ | ~factor_een_deriv_e[4][nelec]~ | out | Derivative of the Jastrow factor: electron-electron-nucleus part |
|
|
|
|
|
|
|
|
computed data:
|
|
|
|
|
2021-06-25 05:24:50 +02:00
|
|
|
|-----------+--------------------------------------------------+-------------------------------------------------|
|
|
|
|
| ~int64_t~ | ~dim_cord_vec~ | Number of unique C coefficients |
|
|
|
|
| ~double~ | ~asymp_jasb[2]~ | Asymptotic component |
|
|
|
|
| ~int64_t~ | ~asymp_jasb_date~ | Asymptotic component |
|
|
|
|
| ~double~ | ~coord_vect_full[dim_cord_vec][nuc_num]~ | vector of non-zero coefficients |
|
|
|
|
| ~int64_t~ | ~lkpm_of_cindex[4][dim_cord_vec]~ | Transform l,k,p, and m into consecutive indices |
|
|
|
|
| ~double~ | ~tmp_c[elec_num][nuc_num][ncord + 1][ncord]~ | vector of non-zero coefficients |
|
|
|
|
| ~double~ | ~dtmp_c[elec_num][4][nuc_num][ncord + 1][ncord]~ | vector of non-zero coefficients |
|
2021-06-24 11:12:33 +02:00
|
|
|
|
|
|
|
For H2O we have the following data:
|
|
|
|
|
|
|
|
#+BEGIN_EXAMPLE
|
|
|
|
type_nuc_num = 1
|
|
|
|
aord_num = 5
|
|
|
|
bord_num = 5
|
|
|
|
cord_num = 23
|
|
|
|
dim_cord_vec = 23
|
|
|
|
aord_vector = [ 0.000000000000000E+000, 0.000000000000000E+000, -0.380512000000000E+000,
|
|
|
|
-0.157996000000000E+000, -3.155800000000000E-002, 2.151200000000000E-002]
|
|
|
|
bord_vector = [ 0.500000000000000E-000, 0.153660000000000E-000, 6.722620000000000E-002,
|
|
|
|
2.157000000000000E-002, 7.309600000000000E-003, 2.866000000000000E-003]
|
|
|
|
cord_vector = [ 0.571702000000000E-000, -0.514253000000000E-000, -0.513043000000000E-000,
|
|
|
|
9.486000000000000E-003, -4.205000000000000E-003, 0.426325800000000E-000,
|
|
|
|
8.288150000000000E-002, 5.118600000000000E-003, -2.997800000000000E-003,
|
|
|
|
-5.270400000000000E-003, -7.499999999999999E-005, -8.301649999999999E-002,
|
|
|
|
1.454340000000000E-002, 5.143510000000000E-002, 9.250000000000000E-004,
|
|
|
|
-4.099100000000000E-003, 4.327600000000000E-003, -1.654470000000000E-003,
|
|
|
|
2.614000000000000E-003, -1.477000000000000E-003, -1.137000000000000E-003,
|
|
|
|
-4.010475000000000E-002, 6.106710000000000E-003 ]
|
|
|
|
cord_vector_full = [
|
|
|
|
[ 0.571702000000000E-000, -0.514253000000000E-000, -0.513043000000000E-000,
|
|
|
|
9.486000000000000E-003, -4.205000000000000E-003, 0.426325800000000E-000,
|
|
|
|
8.288150000000000E-002, 5.118600000000000E-003, -2.997800000000000E-003,
|
|
|
|
-5.270400000000000E-003, -7.499999999999999E-005, -8.301649999999999E-002,
|
|
|
|
1.454340000000000E-002, 5.143510000000000E-002, 9.250000000000000E-004,
|
|
|
|
-4.099100000000000E-003, 4.327600000000000E-003, -1.654470000000000E-003,
|
|
|
|
2.614000000000000E-003, -1.477000000000000E-003, -1.137000000000000E-003,
|
|
|
|
-4.010475000000000E-002, 6.106710000000000E-003 ],
|
|
|
|
[ 0.571702000000000E-000, -0.514253000000000E-000, -0.513043000000000E-000,
|
|
|
|
9.486000000000000E-003, -4.205000000000000E-003, 0.426325800000000E-000,
|
|
|
|
8.288150000000000E-002, 5.118600000000000E-003, -2.997800000000000E-003,
|
|
|
|
-5.270400000000000E-003, -7.499999999999999E-005, -8.301649999999999E-002,
|
|
|
|
1.454340000000000E-002, 5.143510000000000E-002, 9.250000000000000E-004,
|
|
|
|
-4.099100000000000E-003, 4.327600000000000E-003, -1.654470000000000E-003,
|
|
|
|
2.614000000000000E-003, -1.477000000000000E-003, -1.137000000000000E-003,
|
|
|
|
-4.010475000000000E-002, 6.106710000000000E-003 ],
|
|
|
|
]
|
|
|
|
lkpm_of_cindex =
|
|
|
|
[ 1, 1, 2, 0, 0, 0, 2, 1, 1, 2, 3, 0, 2, 1, 3, 0, 0, 1,
|
|
|
|
3, 1, 1, 0, 3, 1, 1, 3, 4, 0, 2, 2, 4, 0, 0, 2, 4, 1,
|
|
|
|
3, 1, 4, 0, 1, 1, 4, 1, 2, 0, 4, 1, 0, 0, 4, 2, 1, 4,
|
|
|
|
5, 0, 2, 3, 5, 0, 0, 3, 5, 1, 3, 2, 5, 0, 1, 2, 5, 1,
|
|
|
|
4, 1, 5, 0, 2, 1, 5, 1, 0, 1, 5, 2, 3, 0, 5, 1, 1, 0,
|
|
|
|
5, 2 ]
|
|
|
|
#+END_EXAMPLE
|
|
|
|
|
2021-06-23 10:55:59 +02:00
|
|
|
** Data structure
|
|
|
|
|
2021-06-23 14:26:01 +02:00
|
|
|
#+begin_src c :comments org :tangle (eval h_private_type)
|
|
|
|
typedef struct qmckl_jastrow_struct{
|
2021-06-24 13:35:16 +02:00
|
|
|
int32_t uninitialized;
|
|
|
|
int64_t aord_num;
|
|
|
|
int64_t bord_num;
|
|
|
|
int64_t cord_num;
|
|
|
|
int64_t type_nuc_num;
|
2021-06-25 05:24:50 +02:00
|
|
|
int64_t asymp_jasb_date;
|
|
|
|
int64_t tmp_c_date;
|
|
|
|
int64_t dtmp_c_date;
|
|
|
|
int64_t factor_ee_date;
|
|
|
|
int64_t factor_en_date;
|
|
|
|
int64_t factor_een_date;
|
2021-06-23 14:26:01 +02:00
|
|
|
double * aord_vector;
|
|
|
|
double * bord_vector;
|
|
|
|
double * cord_vector;
|
2021-06-25 05:24:50 +02:00
|
|
|
double * asymp_jasb;
|
2021-06-23 14:26:01 +02:00
|
|
|
double * factor_ee;
|
|
|
|
double * factor_en;
|
|
|
|
double * factor_een;
|
|
|
|
double * factor_ee_deriv_e;
|
|
|
|
double * factor_en_deriv_e;
|
|
|
|
double * factor_een_deriv_e;
|
2021-06-24 13:35:16 +02:00
|
|
|
int64_t dim_cord_vec;
|
2021-06-24 11:14:43 +02:00
|
|
|
double * coord_vect_full;
|
|
|
|
double * tmp_c;
|
|
|
|
double * dtmp_c;
|
2021-06-24 13:35:16 +02:00
|
|
|
bool provided;
|
2021-06-25 04:18:08 +02:00
|
|
|
char * type;
|
2021-06-23 14:26:01 +02:00
|
|
|
} qmckl_jastrow_struct;
|
2021-06-23 10:55:59 +02:00
|
|
|
#+end_src
|
|
|
|
|
|
|
|
|
|
|
|
The ~uninitialized~ integer contains one bit set to one for each
|
|
|
|
initialization function which has not been called. It becomes equal
|
|
|
|
to zero after all initialization functions have been called. The
|
|
|
|
struct is then initialized and ~provided == true~.
|
|
|
|
Some values are initialized by default, and are not concerned by
|
|
|
|
this mechanism.
|
|
|
|
|
2021-06-25 04:18:08 +02:00
|
|
|
#+begin_src c :comments org :tangle (eval h_func)
|
2021-06-23 10:55:59 +02:00
|
|
|
qmckl_exit_code qmckl_init_jastrow(qmckl_context context);
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
#+begin_src c :comments org :tangle (eval c)
|
|
|
|
qmckl_exit_code qmckl_init_jastrow(qmckl_context context) {
|
|
|
|
|
|
|
|
if (qmckl_context_check(context) == QMCKL_NULL_CONTEXT) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
qmckl_context_struct* const ctx = (qmckl_context_struct* const) context;
|
|
|
|
assert (ctx != NULL);
|
|
|
|
|
2021-06-24 14:02:42 +02:00
|
|
|
ctx->jastrow.uninitialized = (1 << 6) - 1;
|
2021-06-23 10:55:59 +02:00
|
|
|
|
|
|
|
/* Default values */
|
|
|
|
|
|
|
|
return QMCKL_SUCCESS;
|
|
|
|
}
|
|
|
|
#+end_src
|
|
|
|
|
2021-06-24 13:35:16 +02:00
|
|
|
** Access functions
|
|
|
|
|
2021-06-25 04:18:08 +02:00
|
|
|
#+begin_src c :comments org :tangle (eval h_func) :exports none
|
|
|
|
qmckl_exit_code qmckl_get_jastrow_aord_num (qmckl_context context, int64_t* const aord_num);
|
|
|
|
qmckl_exit_code qmckl_get_jastrow_bord_num (qmckl_context context, int64_t* const bord_num);
|
|
|
|
qmckl_exit_code qmckl_get_jastrow_cord_num (qmckl_context context, int64_t* const bord_num);
|
|
|
|
qmckl_exit_code qmckl_get_jastrow_type_nuc_num (qmckl_context context, int64_t* const type_nuc_num);
|
|
|
|
qmckl_exit_code qmckl_get_jastrow_aord_vector (qmckl_context context, double * const aord_vector);
|
|
|
|
qmckl_exit_code qmckl_get_jastrow_bord_vector (qmckl_context context, double * const bord_vector);
|
|
|
|
qmckl_exit_code qmckl_get_jastrow_cord_vector (qmckl_context context, double * const cord_vector);
|
2021-06-24 13:35:16 +02:00
|
|
|
#+end_src
|
|
|
|
|
2021-06-24 13:56:24 +02:00
|
|
|
Along with these core functions, calculation of the jastrow factor
|
|
|
|
requires the following additional information to be set:
|
|
|
|
|
|
|
|
|
2021-06-24 13:35:16 +02:00
|
|
|
When all the data for the AOs have been provided, the following
|
|
|
|
function returns ~true~.
|
|
|
|
|
|
|
|
#+begin_src c :comments org :tangle (eval h_func)
|
|
|
|
bool qmckl_jastrow_provided (const qmckl_context context);
|
|
|
|
#+end_src
|
|
|
|
|
2021-06-24 13:56:24 +02:00
|
|
|
#+begin_src c :comments org :tangle (eval c) :noweb yes :exports none
|
|
|
|
bool qmckl_jastrow_provided(const qmckl_context context) {
|
|
|
|
|
|
|
|
if (qmckl_context_check(context) == QMCKL_NULL_CONTEXT) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
qmckl_context_struct* const ctx = (qmckl_context_struct* const) context;
|
|
|
|
assert (ctx != NULL);
|
|
|
|
|
|
|
|
return ctx->jastrow.provided;
|
|
|
|
}
|
|
|
|
#+end_src
|
|
|
|
|
2021-06-24 13:35:16 +02:00
|
|
|
#+NAME:post
|
|
|
|
#+begin_src c :exports none
|
|
|
|
if ( (ctx->jastrow.uninitialized & mask) != 0) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
#+begin_src c :comments org :tangle (eval c) :noweb yes :exports none
|
2021-06-25 04:18:08 +02:00
|
|
|
qmckl_exit_code qmckl_get_jastrow_aord_num (const qmckl_context context, int64_t* const aord_num) {
|
2021-06-24 13:35:16 +02:00
|
|
|
|
|
|
|
if (qmckl_context_check(context) == QMCKL_NULL_CONTEXT) {
|
|
|
|
return (char) 0;
|
|
|
|
}
|
|
|
|
|
2021-06-25 04:18:08 +02:00
|
|
|
if (aord_num == NULL) {
|
|
|
|
return qmckl_failwith( context,
|
|
|
|
QMCKL_INVALID_ARG_2,
|
|
|
|
"qmckl_get_jastrow_aord_num",
|
|
|
|
"aord_num is a null pointer");
|
|
|
|
}
|
|
|
|
|
2021-06-24 13:35:16 +02:00
|
|
|
qmckl_context_struct* const ctx = (qmckl_context_struct* const) context;
|
|
|
|
assert (ctx != NULL);
|
|
|
|
|
|
|
|
int32_t mask = 1 << 0;
|
|
|
|
|
|
|
|
if ( (ctx->jastrow.uninitialized & mask) != 0) {
|
|
|
|
return (char) 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
assert (ctx->jastrow.aord_num > 0);
|
2021-06-25 04:18:08 +02:00
|
|
|
*aord_num = ctx->jastrow.aord_num;
|
|
|
|
return QMCKL_SUCCESS;
|
2021-06-24 13:35:16 +02:00
|
|
|
}
|
|
|
|
|
2021-06-25 04:18:08 +02:00
|
|
|
qmckl_exit_code qmckl_get_jastrow_bord_num (const qmckl_context context, int64_t* const bord_num) {
|
2021-06-24 13:35:16 +02:00
|
|
|
|
|
|
|
if (qmckl_context_check(context) == QMCKL_NULL_CONTEXT) {
|
|
|
|
return (char) 0;
|
|
|
|
}
|
|
|
|
|
2021-06-25 04:18:08 +02:00
|
|
|
if (bord_num == NULL) {
|
|
|
|
return qmckl_failwith( context,
|
|
|
|
QMCKL_INVALID_ARG_2,
|
|
|
|
"qmckl_get_jastrow_bord_num",
|
|
|
|
"aord_num is a null pointer");
|
|
|
|
}
|
|
|
|
|
2021-06-24 13:35:16 +02:00
|
|
|
qmckl_context_struct* const ctx = (qmckl_context_struct* const) context;
|
|
|
|
assert (ctx != NULL);
|
|
|
|
|
2021-06-25 04:18:08 +02:00
|
|
|
int32_t mask = 1 << 0;
|
2021-06-24 13:35:16 +02:00
|
|
|
|
|
|
|
if ( (ctx->jastrow.uninitialized & mask) != 0) {
|
|
|
|
return (char) 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
assert (ctx->jastrow.bord_num > 0);
|
2021-06-25 04:18:08 +02:00
|
|
|
*bord_num = ctx->jastrow.bord_num;
|
|
|
|
return QMCKL_SUCCESS;
|
2021-06-24 13:35:16 +02:00
|
|
|
}
|
|
|
|
|
2021-06-25 04:18:08 +02:00
|
|
|
qmckl_exit_code qmckl_get_jastrow_cord_num (const qmckl_context context, int64_t* const cord_num) {
|
2021-06-24 13:35:16 +02:00
|
|
|
|
|
|
|
if (qmckl_context_check(context) == QMCKL_NULL_CONTEXT) {
|
|
|
|
return (char) 0;
|
|
|
|
}
|
|
|
|
|
2021-06-25 04:18:08 +02:00
|
|
|
if (cord_num == NULL) {
|
|
|
|
return qmckl_failwith( context,
|
|
|
|
QMCKL_INVALID_ARG_2,
|
|
|
|
"qmckl_get_jastrow_cord_num",
|
|
|
|
"aord_num is a null pointer");
|
|
|
|
}
|
|
|
|
|
2021-06-24 13:35:16 +02:00
|
|
|
qmckl_context_struct* const ctx = (qmckl_context_struct* const) context;
|
|
|
|
assert (ctx != NULL);
|
|
|
|
|
|
|
|
int32_t mask = 1 << 0;
|
|
|
|
|
|
|
|
if ( (ctx->jastrow.uninitialized & mask) != 0) {
|
|
|
|
return (char) 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
assert (ctx->jastrow.cord_num > 0);
|
2021-06-25 04:18:08 +02:00
|
|
|
*cord_num = ctx->jastrow.cord_num;
|
|
|
|
return QMCKL_SUCCESS;
|
2021-06-24 13:35:16 +02:00
|
|
|
}
|
|
|
|
|
2021-06-25 04:18:08 +02:00
|
|
|
qmckl_exit_code qmckl_get_type_nuc_num (const qmckl_context context, int64_t* const type_nuc_num) {
|
2021-06-24 13:35:16 +02:00
|
|
|
|
|
|
|
if (qmckl_context_check(context) == QMCKL_NULL_CONTEXT) {
|
|
|
|
return (char) 0;
|
|
|
|
}
|
|
|
|
|
2021-06-25 04:18:08 +02:00
|
|
|
if (type_nuc_num == NULL) {
|
|
|
|
return qmckl_failwith( context,
|
|
|
|
QMCKL_INVALID_ARG_2,
|
|
|
|
"qmckl_get_jastrow_type_nuc_num",
|
|
|
|
"type_nuc_num is a null pointer");
|
|
|
|
}
|
|
|
|
|
2021-06-24 13:35:16 +02:00
|
|
|
qmckl_context_struct* const ctx = (qmckl_context_struct* const) context;
|
|
|
|
assert (ctx != NULL);
|
|
|
|
|
|
|
|
int32_t mask = 1 << 2;
|
|
|
|
|
|
|
|
if ( (ctx->jastrow.uninitialized & mask) != 0) {
|
|
|
|
return (char) 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
assert (ctx->jastrow.type_nuc_num > 0);
|
2021-06-25 04:18:08 +02:00
|
|
|
*type_nuc_num = ctx->jastrow.type_nuc_num;
|
|
|
|
return QMCKL_SUCCESS;
|
2021-06-24 13:35:16 +02:00
|
|
|
}
|
|
|
|
|
2021-06-25 04:18:08 +02:00
|
|
|
qmckl_exit_code qmckl_get_aord_vector (const qmckl_context context, double * const aord_vector) {
|
2021-06-24 13:35:16 +02:00
|
|
|
|
|
|
|
if (qmckl_context_check(context) == QMCKL_NULL_CONTEXT) {
|
|
|
|
return (char) 0;
|
|
|
|
}
|
2021-06-25 04:18:08 +02:00
|
|
|
|
|
|
|
if (aord_vector == NULL) {
|
|
|
|
return qmckl_failwith( context,
|
|
|
|
QMCKL_INVALID_ARG_2,
|
|
|
|
"qmckl_get_jastrow_aord_vector",
|
|
|
|
"aord_vector is a null pointer");
|
|
|
|
}
|
2021-06-24 13:35:16 +02:00
|
|
|
|
|
|
|
qmckl_context_struct* const ctx = (qmckl_context_struct* const) context;
|
|
|
|
assert (ctx != NULL);
|
|
|
|
|
|
|
|
int32_t mask = 1 << 3;
|
|
|
|
|
|
|
|
if ( (ctx->jastrow.uninitialized & mask) != 0) {
|
|
|
|
return (char) 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
assert (ctx->jastrow.aord_vector != NULL);
|
2021-06-25 04:18:08 +02:00
|
|
|
memcpy(aord_vector, ctx->jastrow.aord_vector, ctx->jastrow.aord_num*sizeof(double));
|
|
|
|
return QMCKL_SUCCESS;
|
2021-06-24 13:35:16 +02:00
|
|
|
}
|
|
|
|
|
2021-06-25 04:18:08 +02:00
|
|
|
qmckl_exit_code qmckl_get_bord_vector (const qmckl_context context, double * const bord_vector) {
|
2021-06-24 13:35:16 +02:00
|
|
|
|
|
|
|
if (qmckl_context_check(context) == QMCKL_NULL_CONTEXT) {
|
|
|
|
return (char) 0;
|
|
|
|
}
|
2021-06-25 04:18:08 +02:00
|
|
|
|
|
|
|
if (bord_vector == NULL) {
|
|
|
|
return qmckl_failwith( context,
|
|
|
|
QMCKL_INVALID_ARG_2,
|
|
|
|
"qmckl_get_jastrow_bord_vector",
|
|
|
|
"bord_vector is a null pointer");
|
|
|
|
}
|
2021-06-24 13:35:16 +02:00
|
|
|
|
|
|
|
qmckl_context_struct* const ctx = (qmckl_context_struct* const) context;
|
|
|
|
assert (ctx != NULL);
|
|
|
|
|
|
|
|
int32_t mask = 1 << 3;
|
|
|
|
|
|
|
|
if ( (ctx->jastrow.uninitialized & mask) != 0) {
|
|
|
|
return (char) 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
assert (ctx->jastrow.bord_vector != NULL);
|
2021-06-25 04:18:08 +02:00
|
|
|
memcpy(bord_vector, ctx->jastrow.bord_vector, ctx->jastrow.bord_num*sizeof(double));
|
|
|
|
return QMCKL_SUCCESS;
|
2021-06-24 13:35:16 +02:00
|
|
|
}
|
|
|
|
|
2021-06-25 04:18:08 +02:00
|
|
|
qmckl_exit_code qmckl_get_cord_vector (const qmckl_context context, double * const cord_vector) {
|
2021-06-24 13:35:16 +02:00
|
|
|
|
|
|
|
if (qmckl_context_check(context) == QMCKL_NULL_CONTEXT) {
|
|
|
|
return (char) 0;
|
|
|
|
}
|
2021-06-25 04:18:08 +02:00
|
|
|
|
|
|
|
if (cord_vector == NULL) {
|
|
|
|
return qmckl_failwith( context,
|
|
|
|
QMCKL_INVALID_ARG_2,
|
|
|
|
"qmckl_get_jastrow_cord_vector",
|
|
|
|
"cord_vector is a null pointer");
|
|
|
|
}
|
2021-06-24 13:35:16 +02:00
|
|
|
|
|
|
|
qmckl_context_struct* const ctx = (qmckl_context_struct* const) context;
|
|
|
|
assert (ctx != NULL);
|
|
|
|
|
|
|
|
int32_t mask = 1 << 3;
|
|
|
|
|
|
|
|
if ( (ctx->jastrow.uninitialized & mask) != 0) {
|
|
|
|
return (char) 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
assert (ctx->jastrow.cord_vector != NULL);
|
2021-06-25 04:18:08 +02:00
|
|
|
memcpy(cord_vector, ctx->jastrow.cord_vector, ctx->jastrow.cord_num*sizeof(double));
|
|
|
|
return QMCKL_SUCCESS;
|
2021-06-24 13:35:16 +02:00
|
|
|
}
|
2021-06-25 04:18:08 +02:00
|
|
|
|
2021-06-24 13:35:16 +02:00
|
|
|
#+end_src
|
|
|
|
|
|
|
|
** Initialization functions
|
|
|
|
|
|
|
|
To prepare for the Jastrow and its derivative, all the following functions need to be
|
|
|
|
called.
|
|
|
|
|
|
|
|
#+begin_src c :comments org :tangle (eval h_func)
|
|
|
|
qmckl_exit_code qmckl_set_jastrow_ord_num (qmckl_context context, const int64_t aord_num, const int64_t bord_num, const int64_t cord_num);
|
|
|
|
qmckl_exit_code qmckl_set_jastrow_type_nuc_num (qmckl_context context, const int64_t type_nuc_num);
|
|
|
|
qmckl_exit_code qmckl_set_jastrow_aord_vector (qmckl_context context, const double * aord_vector);
|
|
|
|
qmckl_exit_code qmckl_set_jastrow_bord_vector (qmckl_context context, const double * bord_vector);
|
|
|
|
qmckl_exit_code qmckl_set_jastrow_cord_vector (qmckl_context context, const double * cord_vector);
|
2021-06-24 14:02:42 +02:00
|
|
|
qmckl_exit_code qmckl_set_jastrow_dependencies (qmckl_context context);
|
2021-06-24 13:35:16 +02:00
|
|
|
#+end_src
|
|
|
|
|
|
|
|
#+NAME:pre2
|
|
|
|
#+begin_src c :exports none
|
|
|
|
if (qmckl_context_check(context) == QMCKL_NULL_CONTEXT) {
|
|
|
|
return QMCKL_NULL_CONTEXT;
|
|
|
|
}
|
|
|
|
|
|
|
|
qmckl_context_struct* const ctx = (qmckl_context_struct* const) context;
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
#+NAME:post2
|
|
|
|
#+begin_src c :exports none
|
|
|
|
ctx->jastrow.uninitialized &= ~mask;
|
|
|
|
ctx->jastrow.provided = (ctx->jastrow.uninitialized == 0);
|
|
|
|
if (ctx->jastrow.provided) {
|
|
|
|
qmckl_exit_code rc_ = qmckl_finalize_basis(context);
|
|
|
|
if (rc_ != QMCKL_SUCCESS) return rc_;
|
|
|
|
}
|
|
|
|
|
|
|
|
return QMCKL_SUCCESS;
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
|
|
|
|
#+begin_src c :comments org :tangle (eval c) :noweb yes :exports none
|
|
|
|
qmckl_exit_code qmckl_set_jastrow_ord_num(qmckl_context context, const int64_t aord_num, const int64_t bord_num, const int64_t cord_num) {
|
|
|
|
<<pre2>>
|
|
|
|
|
|
|
|
if (aord_num <= 0) {
|
|
|
|
return qmckl_failwith( context,
|
|
|
|
QMCKL_INVALID_ARG_2,
|
|
|
|
"qmckl_set_jastrow_ord_num",
|
|
|
|
"aord_num <= 0");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (bord_num <= 0) {
|
|
|
|
return qmckl_failwith( context,
|
|
|
|
QMCKL_INVALID_ARG_2,
|
|
|
|
"qmckl_set_jastrow_ord_num",
|
|
|
|
"bord_num <= 0");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (cord_num <= 0) {
|
|
|
|
return qmckl_failwith( context,
|
|
|
|
QMCKL_INVALID_ARG_2,
|
|
|
|
"qmckl_set_jastrow_ord_num",
|
|
|
|
"cord_num <= 0");
|
|
|
|
}
|
|
|
|
|
|
|
|
int32_t mask = 1 << 1;
|
|
|
|
ctx->jastrow.aord_num = aord_num;
|
|
|
|
ctx->jastrow.bord_num = bord_num;
|
|
|
|
ctx->jastrow.cord_num = cord_num;
|
|
|
|
|
|
|
|
<<post2>>
|
|
|
|
}
|
|
|
|
|
|
|
|
qmckl_exit_code qmckl_set_jastrow_type_nuc_num(qmckl_context context, const int64_t type_nuc_num) {
|
|
|
|
<<pre2>>
|
|
|
|
|
|
|
|
if (type_nuc_num <= 0) {
|
|
|
|
return qmckl_failwith( context,
|
|
|
|
QMCKL_INVALID_ARG_2,
|
|
|
|
"qmckl_set_jastrow_type_nuc_num",
|
|
|
|
"type_nuc_num < 0");
|
|
|
|
}
|
|
|
|
|
|
|
|
int32_t mask = 1 << 2;
|
|
|
|
ctx->jastrow.type_nuc_num = type_nuc_num;
|
|
|
|
|
|
|
|
<<post2>>
|
|
|
|
}
|
|
|
|
|
|
|
|
qmckl_exit_code qmckl_set_jastrow_aord_vector(qmckl_context context, double const * aord_vector) {
|
|
|
|
<<pre2>>
|
|
|
|
|
|
|
|
int32_t mask = 1 << 3;
|
|
|
|
|
2021-06-25 04:18:08 +02:00
|
|
|
int64_t aord_num;
|
|
|
|
int rc = qmckl_get_jastrow_aord_num(context, &aord_num);
|
|
|
|
if (rc != QMCKL_SUCCESS) return rc;
|
|
|
|
|
2021-06-24 13:35:16 +02:00
|
|
|
if (aord_num == 0) {
|
|
|
|
return qmckl_failwith( context,
|
|
|
|
QMCKL_FAILURE,
|
|
|
|
"qmckl_set_jastrow_coefficient",
|
|
|
|
"aord_num is not set");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (aord_vector == NULL) {
|
|
|
|
return qmckl_failwith( context,
|
|
|
|
QMCKL_INVALID_ARG_2,
|
|
|
|
"qmckl_set_jastrow_aord_vector",
|
|
|
|
"aord_vector = NULL");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ctx->jastrow.aord_vector != NULL) {
|
|
|
|
qmckl_exit_code rc = qmckl_free(context, ctx->jastrow.aord_vector);
|
|
|
|
if (rc != QMCKL_SUCCESS) {
|
|
|
|
return qmckl_failwith( context, rc,
|
|
|
|
"qmckl_set_ord_vector",
|
|
|
|
NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
qmckl_memory_info_struct mem_info = qmckl_memory_info_struct_zero;
|
|
|
|
mem_info.size = aord_num * sizeof(double);
|
|
|
|
double* new_array = (double*) qmckl_malloc(context, mem_info);
|
|
|
|
|
|
|
|
if(new_array == NULL) {
|
|
|
|
return qmckl_failwith( context,
|
|
|
|
QMCKL_ALLOCATION_FAILED,
|
|
|
|
"qmckl_set_jastrow_coefficient",
|
|
|
|
NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
memcpy(new_array, aord_vector, mem_info.size);
|
|
|
|
|
|
|
|
ctx->jastrow.aord_vector = new_array;
|
|
|
|
|
|
|
|
<<post2>>
|
|
|
|
}
|
|
|
|
|
|
|
|
qmckl_exit_code qmckl_set_jastrow_bord_vector(qmckl_context context, double const * bord_vector) {
|
|
|
|
<<pre2>>
|
|
|
|
|
|
|
|
int32_t mask = 1 << 4;
|
|
|
|
|
2021-06-25 04:18:08 +02:00
|
|
|
int64_t bord_num;
|
|
|
|
int rc = qmckl_get_jastrow_bord_num(context, &bord_num);
|
|
|
|
if (rc != QMCKL_SUCCESS) return rc;
|
|
|
|
|
2021-06-24 13:35:16 +02:00
|
|
|
if (bord_num == 0) {
|
|
|
|
return qmckl_failwith( context,
|
|
|
|
QMCKL_FAILURE,
|
|
|
|
"qmckl_set_jastrow_coefficient",
|
|
|
|
"bord_num is not set");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (bord_vector == NULL) {
|
|
|
|
return qmckl_failwith( context,
|
|
|
|
QMCKL_INVALID_ARG_2,
|
|
|
|
"qmckl_set_jastrow_bord_vector",
|
|
|
|
"bord_vector = NULL");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ctx->jastrow.bord_vector != NULL) {
|
|
|
|
qmckl_exit_code rc = qmckl_free(context, ctx->jastrow.bord_vector);
|
|
|
|
if (rc != QMCKL_SUCCESS) {
|
|
|
|
return qmckl_failwith( context, rc,
|
|
|
|
"qmckl_set_ord_vector",
|
|
|
|
NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
qmckl_memory_info_struct mem_info = qmckl_memory_info_struct_zero;
|
|
|
|
mem_info.size = bord_num * sizeof(double);
|
|
|
|
double* new_array = (double*) qmckl_malloc(context, mem_info);
|
|
|
|
|
|
|
|
if(new_array == NULL) {
|
|
|
|
return qmckl_failwith( context,
|
|
|
|
QMCKL_ALLOCATION_FAILED,
|
|
|
|
"qmckl_set_jastrow_coefficient",
|
|
|
|
NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
memcpy(new_array, bord_vector, mem_info.size);
|
|
|
|
|
2021-06-25 04:18:08 +02:00
|
|
|
ctx->jastrow.bord_vector = new_array;
|
2021-06-24 13:35:16 +02:00
|
|
|
|
|
|
|
<<post2>>
|
|
|
|
}
|
|
|
|
|
|
|
|
qmckl_exit_code qmckl_set_jastrow_cord_vector(qmckl_context context, double const * cord_vector) {
|
|
|
|
<<pre2>>
|
|
|
|
|
|
|
|
int32_t mask = 1 << 5;
|
|
|
|
|
2021-06-25 04:18:08 +02:00
|
|
|
int64_t cord_num;
|
|
|
|
int rc = qmckl_get_jastrow_cord_num(context, &cord_num);
|
|
|
|
if (rc != QMCKL_SUCCESS) return rc;
|
|
|
|
|
2021-06-24 13:35:16 +02:00
|
|
|
if (cord_num == 0) {
|
|
|
|
return qmckl_failwith( context,
|
|
|
|
QMCKL_FAILURE,
|
|
|
|
"qmckl_set_jastrow_coefficient",
|
|
|
|
"cord_num is not set");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (cord_vector == NULL) {
|
|
|
|
return qmckl_failwith( context,
|
|
|
|
QMCKL_INVALID_ARG_2,
|
|
|
|
"qmckl_set_jastrow_cord_vector",
|
|
|
|
"cord_vector = NULL");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ctx->jastrow.cord_vector != NULL) {
|
|
|
|
qmckl_exit_code rc = qmckl_free(context, ctx->jastrow.cord_vector);
|
|
|
|
if (rc != QMCKL_SUCCESS) {
|
|
|
|
return qmckl_failwith( context, rc,
|
|
|
|
"qmckl_set_ord_vector",
|
|
|
|
NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
qmckl_memory_info_struct mem_info = qmckl_memory_info_struct_zero;
|
|
|
|
mem_info.size = cord_num * sizeof(double);
|
|
|
|
double* new_array = (double*) qmckl_malloc(context, mem_info);
|
|
|
|
|
|
|
|
if(new_array == NULL) {
|
|
|
|
return qmckl_failwith( context,
|
|
|
|
QMCKL_ALLOCATION_FAILED,
|
|
|
|
"qmckl_set_jastrow_coefficient",
|
|
|
|
NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
memcpy(new_array, cord_vector, mem_info.size);
|
|
|
|
|
|
|
|
ctx->jastrow.cord_vector = new_array;
|
|
|
|
|
|
|
|
<<post2>>
|
|
|
|
}
|
2021-06-24 14:02:42 +02:00
|
|
|
|
|
|
|
qmckl_exit_code qmckl_set_jastrow_dependencies(qmckl_context context) {
|
|
|
|
<<pre2>>
|
|
|
|
|
|
|
|
/* Check for electron data */
|
|
|
|
if (!(ctx->electron.provided)) {
|
|
|
|
return qmckl_failwith( context,
|
|
|
|
QMCKL_NOT_PROVIDED,
|
|
|
|
"qmckl_provide_ee_distance",
|
|
|
|
NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Check for nucleus data */
|
|
|
|
if (!(ctx->nucleus.provided)) {
|
|
|
|
return qmckl_failwith( context,
|
|
|
|
QMCKL_NOT_PROVIDED,
|
|
|
|
"qmckl_provide_en_distance",
|
|
|
|
NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
int32_t mask = 1 << 6;
|
|
|
|
|
|
|
|
<<post2>>
|
|
|
|
}
|
|
|
|
|
2021-06-24 13:35:16 +02:00
|
|
|
#+end_src
|
|
|
|
|
2021-06-24 13:39:39 +02:00
|
|
|
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.
|
|
|
|
|
|
|
|
#+begin_src c :comments org :tangle (eval h_private_func) :noweb yes :exports none
|
|
|
|
qmckl_exit_code qmckl_finalize_jastrow(qmckl_context context);
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
#+begin_src c :comments org :tangle (eval c) :noweb yes :exports none
|
|
|
|
qmckl_exit_code qmckl_finalize_jastrow(qmckl_context context) {
|
|
|
|
|
|
|
|
if (qmckl_context_check(context) == QMCKL_NULL_CONTEXT) {
|
|
|
|
return QMCKL_INVALID_CONTEXT;
|
|
|
|
}
|
|
|
|
|
|
|
|
qmckl_context_struct* const ctx = (qmckl_context_struct* const) context;
|
|
|
|
assert (ctx != NULL);
|
|
|
|
|
2021-06-25 05:24:50 +02:00
|
|
|
/* ----------------------------------- */
|
|
|
|
/* Check for the necessary information */
|
|
|
|
/* ----------------------------------- */
|
|
|
|
|
|
|
|
/* Check for the electron data
|
|
|
|
1. elec_num
|
|
|
|
2. ee_distances_rescaled
|
|
|
|
*/
|
|
|
|
if (!(ctx->electron.provided)) {
|
|
|
|
return qmckl_failwith( context,
|
|
|
|
QMCKL_NOT_PROVIDED,
|
|
|
|
"qmckl_electron",
|
|
|
|
NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Check for the nucleus data
|
|
|
|
1. nuc_num
|
|
|
|
2. en_distances_rescaled
|
|
|
|
*/
|
|
|
|
if (!(ctx->nucleus.provided)) {
|
|
|
|
return qmckl_failwith( context,
|
|
|
|
QMCKL_NOT_PROVIDED,
|
|
|
|
"qmckl_nucleus",
|
|
|
|
NULL);
|
|
|
|
}
|
|
|
|
|
2021-06-24 13:39:39 +02:00
|
|
|
qmckl_exit_code rc = QMCKL_FAILURE;
|
2021-06-24 13:56:24 +02:00
|
|
|
|
2021-06-25 05:24:50 +02:00
|
|
|
|
|
|
|
/* ----------------------------------- */
|
|
|
|
/* Start calculation of data */
|
|
|
|
/* ----------------------------------- */
|
|
|
|
|
|
|
|
|
2021-06-24 13:39:39 +02:00
|
|
|
}
|
|
|
|
#+end_src
|
2021-06-23 08:48:43 +02:00
|
|
|
|
2021-06-25 05:24:50 +02:00
|
|
|
* Computation
|
|
|
|
|
|
|
|
The computed data is stored in the context so that it can be reused
|
|
|
|
by different kernels. To ensure that the data is valid, for each
|
|
|
|
computed data the date of the context is stored when it is computed.
|
|
|
|
To know if some data needs to be recomputed, we check if the date of
|
|
|
|
the dependencies are more recent than the date of the data to
|
|
|
|
compute. If it is the case, then the data is recomputed and the
|
|
|
|
current date is stored.
|
|
|
|
|
|
|
|
** 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
|
|
|
|
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}
|
|
|
|
\]
|
|
|
|
|
|
|
|
*** Get
|
|
|
|
#+begin_src c :comments org :tangle (eval h_func) :noweb yes
|
|
|
|
qmckl_exit_code qmckl_get_jastrow_asymp_jasb(qmckl_context context, double* const asymp_jasb);
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
#+begin_src c :comments org :tangle (eval c) :noweb yes :exports none
|
|
|
|
qmckl_exit_code qmckl_get_jastrow_asymp_jasb(qmckl_context context, double* const asymp_jasb)
|
|
|
|
{
|
|
|
|
if (qmckl_context_check(context) == QMCKL_NULL_CONTEXT) {
|
|
|
|
return QMCKL_NULL_CONTEXT;
|
|
|
|
}
|
|
|
|
|
|
|
|
qmckl_exit_code rc;
|
|
|
|
|
|
|
|
rc = qmckl_provide_asymp_jasb(context);
|
|
|
|
if (rc != QMCKL_SUCCESS) return rc;
|
|
|
|
|
|
|
|
qmckl_context_struct* const ctx = (qmckl_context_struct* const) context;
|
|
|
|
assert (ctx != NULL);
|
|
|
|
|
|
|
|
size_t sze = 2;
|
|
|
|
memcpy(asymp_jasb, ctx->jastrow.asymp_jasb, sze * sizeof(double));
|
|
|
|
|
|
|
|
return QMCKL_SUCCESS;
|
|
|
|
}
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
*** Provide :noexport:
|
|
|
|
#+begin_src c :comments org :tangle (eval h_private_func) :noweb yes :exports none
|
|
|
|
qmckl_exit_code qmckl_provide_asymp_jasb(qmckl_context context);
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
#+begin_src c :comments org :tangle (eval c) :noweb yes :exports none
|
|
|
|
qmckl_exit_code qmckl_provide_asymp_jasb(qmckl_context context)
|
|
|
|
{
|
|
|
|
|
|
|
|
qmckl_exit_code rc;
|
|
|
|
|
|
|
|
if (qmckl_context_check(context) == QMCKL_NULL_CONTEXT) {
|
|
|
|
return QMCKL_NULL_CONTEXT;
|
|
|
|
}
|
|
|
|
|
|
|
|
qmckl_context_struct* const ctx = (qmckl_context_struct* const) context;
|
|
|
|
assert (ctx != NULL);
|
|
|
|
|
|
|
|
/* Check if ee kappa is provided */
|
|
|
|
double rescale_factor_kappa_ee;
|
|
|
|
rc = qmckl_get_electron_rescale_factor_ee(context, &rescale_factor_kappa_ee);
|
|
|
|
if(rc != QMCKL_SUCCESS) return rc;
|
|
|
|
|
|
|
|
/* Compute if necessary */
|
|
|
|
if (ctx->date > ctx->jastrow.asymp_jasb_date) {
|
|
|
|
|
|
|
|
/* Allocate array */
|
|
|
|
if (ctx->jastrow.asymp_jasb == NULL) {
|
|
|
|
|
|
|
|
qmckl_memory_info_struct mem_info = qmckl_memory_info_struct_zero;
|
|
|
|
mem_info.size = 2 * sizeof(double);
|
|
|
|
double* asymp_jasb = (double*) qmckl_malloc(context, mem_info);
|
|
|
|
|
|
|
|
if (asymp_jasb == NULL) {
|
|
|
|
return qmckl_failwith( context,
|
|
|
|
QMCKL_ALLOCATION_FAILED,
|
|
|
|
"qmckl_asymp_jasb",
|
|
|
|
NULL);
|
|
|
|
}
|
|
|
|
ctx->jastrow.asymp_jasb = asymp_jasb;
|
|
|
|
}
|
|
|
|
|
|
|
|
qmckl_exit_code rc =
|
|
|
|
qmckl_compute_asymp_jasb(context,
|
|
|
|
ctx->jastrow.bord_num,
|
|
|
|
ctx->jastrow.bord_vector,
|
|
|
|
rescale_factor_kappa_ee,
|
|
|
|
ctx->jastrow.asymp_jasb);
|
|
|
|
if (rc != QMCKL_SUCCESS) {
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
|
|
|
ctx->jastrow.asymp_jasb_date = ctx->date;
|
|
|
|
}
|
|
|
|
|
|
|
|
return QMCKL_SUCCESS;
|
|
|
|
}
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
*** Compute
|
|
|
|
:PROPERTIES:
|
|
|
|
:Name: qmckl_compute_asymp_jasb
|
|
|
|
:CRetType: qmckl_exit_code
|
|
|
|
:FRetType: qmckl_exit_code
|
|
|
|
:END:
|
|
|
|
|
|
|
|
#+NAME: qmckl_asymp_jasb_args
|
|
|
|
| qmckl_context | context | in | Global state |
|
|
|
|
| int64_t | bord_num | in | Number of electrons |
|
|
|
|
| double | bord_vector[bord_num + 1] | in | Number of walkers |
|
|
|
|
| double | rescale_factor_kappa_ee | in | Electron coordinates |
|
|
|
|
| double | asymp_jasb[2] | out | Electron-electron distances |
|
|
|
|
|
|
|
|
#+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) &
|
|
|
|
result(info)
|
|
|
|
use qmckl
|
|
|
|
implicit none
|
|
|
|
integer(qmckl_context), intent(in) :: context
|
|
|
|
integer*8 , intent(in) :: bord_num
|
|
|
|
double precision , intent(in) :: bord_vector(bord_num)
|
|
|
|
double precision , intent(in) :: rescale_factor_kappa_ee
|
|
|
|
double precision , intent(out) :: asymp_jasb(2)
|
|
|
|
|
|
|
|
integer*8 :: i, p
|
|
|
|
double precision :: kappa_inv, x, asym_one
|
|
|
|
kappa_inv = 1.0d0 / rescale_factor_kappa_ee
|
|
|
|
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
|
|
|
|
if (context == QMCKL_NULL_CONTEXT) then
|
|
|
|
info = QMCKL_INVALID_CONTEXT
|
|
|
|
return
|
|
|
|
endif
|
|
|
|
|
|
|
|
if (bord_num <= 0) then
|
|
|
|
info = QMCKL_INVALID_ARG_2
|
|
|
|
return
|
|
|
|
endif
|
|
|
|
|
|
|
|
asym_one = bord_vector(1) * kappa_inv / (1.0d0 + bord_vector(2) * kappa_inv)
|
|
|
|
asymp_jasb(:) = (/asym_one, 0.5d0 * asym_one/)
|
|
|
|
|
|
|
|
do i = 1, 2
|
|
|
|
x = kappa_inv
|
|
|
|
do p = 2, bord_num
|
|
|
|
x = x * kappa_inv
|
|
|
|
asymp_jasb(i) = asymp_jasb(i) + bord_vector(p + 1) * x
|
|
|
|
end do
|
|
|
|
end do
|
|
|
|
|
|
|
|
end function qmckl_compute_asymp_jasb_f
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
#+CALL: generate_c_header(table=qmckl_asymp_jasb_args,rettyp=get_value("CRetType"),fname=get_value("Name"))
|
|
|
|
|
|
|
|
#+RESULTS:
|
|
|
|
#+begin_src c :tangle (eval h_private_func) :comments org
|
|
|
|
qmckl_exit_code qmckl_compute_asymp_jasb (
|
|
|
|
const qmckl_context context,
|
|
|
|
const int64_t bord_num,
|
|
|
|
const double* bord_vector,
|
|
|
|
const double rescale_factor_kappa_ee,
|
|
|
|
double* const asymp_jasb );
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
|
|
|
|
#+CALL: generate_c_interface(table=qmckl_asymp_jasb_args,rettyp=get_value("CRetType"),fname=get_value("Name"))
|
|
|
|
|
|
|
|
#+RESULTS:
|
|
|
|
#+begin_src f90 :tangle (eval f) :comments org :exports none
|
|
|
|
integer(c_int32_t) function qmckl_compute_asymp_jasb &
|
|
|
|
(context, bord_num, bord_vector, rescale_factor_kappa_ee, asymp_jasb) &
|
|
|
|
bind(C) result(info)
|
|
|
|
|
|
|
|
use, intrinsic :: iso_c_binding
|
|
|
|
implicit none
|
|
|
|
|
|
|
|
integer (c_int64_t) , intent(in) , value :: context
|
|
|
|
integer (c_int64_t) , intent(in) , value :: bord_num
|
|
|
|
real (c_double ) , intent(in) :: bord_vector(bord_num + 1)
|
|
|
|
real (c_double ) , intent(in) , value :: rescale_factor_kappa_ee
|
|
|
|
real (c_double ) , intent(out) :: asymp_jasb(2)
|
|
|
|
|
|
|
|
integer(c_int32_t), external :: qmckl_compute_asymp_jasb_f
|
|
|
|
info = qmckl_compute_asymp_jasb_f &
|
|
|
|
(context, bord_num, bord_vector, rescale_factor_kappa_ee, asymp_jasb)
|
|
|
|
|
|
|
|
end function qmckl_compute_asymp_jasb
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
*** Test
|
|
|
|
|
2021-06-23 14:26:01 +02:00
|
|
|
* End of files :noexport:
|
|
|
|
|
|
|
|
#+begin_src c :tangle (eval h_private_type)
|
|
|
|
#endif
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
*** Test
|
|
|
|
#+begin_src c :tangle (eval c_test)
|
|
|
|
qmckl_exit_code rc = qmckl_context_destroy(context);
|
|
|
|
assert (rc == QMCKL_SUCCESS);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
|
|
|
|
# -*- mode: org -*-
|
|
|
|
# vim: syntax=c
|
|
|
|
|
|
|
|
|
|
|
|
|