-
Notifications
You must be signed in to change notification settings - Fork 0
/
Jastrow.cpp
127 lines (98 loc) · 2.87 KB
/
Jastrow.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/*
* File: Jastrow.cpp
* Author: jorgehog
*
* Created on 30. mars 2012, 16:52
*/
#include "QMCheaders.h"
Jastrow::Jastrow(int n_p, int dim) {
this->n_p = n_p;
this->n2 = n_p / 2;
this->dim = dim;
}
Jastrow::Jastrow(){
}
No_Jastrow::No_Jastrow() {
}
Pade_Jastrow::Pade_Jastrow(int n_p, int dim, double beta)
: Jastrow(n_p, dim) {
this->beta = beta;
a = arma::zeros<arma::mat>(n_p, n_p);
}
void Pade_Jastrow::initialize() {
int i, j;
double a_sym, a_asym;
if (dim == 2) {
a_sym = 1. / 3;
a_asym = 1.0;
} else if (dim == 3) {
a_sym = 1. / 4;
a_asym = 1. / 2;
} else {
std::cout << "Unable to initialize Jastrow paremters: Unknown dimension" << std::endl;
exit(1);
}
for (i = 0; i < n_p; i++) {
for (j = 0; j < n_p; j++) {
if ((j < n2 && i < n2) || (j >= n2 && i >= n2)) {
a(i,j) = a_sym;
} else {
a(i,j) = a_asym;
}
}
}
}
double Pade_Jastrow::get_val(const Walker* walker) const{
int i, j;
double arg;
arg = 0;
for (i = 0; i < n_p - 1; i++) {
for (j = i + 1; j < n_p; j++) {
arg += a(i,j) * walker->r_rel(i,j) / (1.0 + beta * walker->r_rel(i,j));
}
}
return exp(arg);
}
void Pade_Jastrow::get_grad(Walker* walker) const{
int i, j, k;
double b_ij, deriv;
for (i = 0; i < n_p; i++) {
for (k = 0; k < dim; k++) {
deriv = 0;
for (j = 0; j < i; j++) {
b_ij = 1.0 + beta * walker->r_rel(i,j);
deriv += a(i,j) * (walker->r(i,k) - walker->r(j,k)) / (walker->r_rel(i,j) * b_ij * b_ij);
}
for (j = i + 1; j < n_p; j++) {
b_ij = 1.0 + beta * walker->r_rel(i,j);
deriv += a(i,j) * (walker->r(i,k) - walker->r(j,k)) / (walker->r_rel(i,j) * b_ij * b_ij);
}
walker->jast_grad(i,k) = deriv;
}
}
}
double Pade_Jastrow::get_j_ratio(const Walker* walker_new, const Walker* walker_old, int i) const{
int j;
double j_ratio;
j_ratio = 0;
for (j = 0; j < n_p; j++) {
j_ratio += a(i,j) * (walker_new->r_rel(i,j) / (1.0 + beta * walker_new->r_rel(i,j)) -
walker_old->r_rel(i,j) / (1.0 + beta * walker_old->r_rel(i,j)));
}
return exp(j_ratio);
}
double Pade_Jastrow::get_lapl_sum(const Walker* walker) const {
int k, j, d;
double sum1, sum2, b_kj;
sum1 = sum2 = 0;
for (k = 0; k < n_p; k++) {
for (j = k + 1; j < n_p; j++) {
b_kj = 1 + beta * walker->r_rel(k,j);
sum2 += a(k,j) * (1 - beta * walker->r_rel(k,j)) / (walker->r_rel(k,j) * b_kj * b_kj * b_kj);
}
for (d = 0; d < dim; d++) {
sum1 += walker->jast_grad(k,d) * walker->jast_grad(k,d);
}
}
return sum1 + 2 * sum2;
}