KIDS  ver-0.0.1
KIDS : Kernel Integrated Dynamics Simulator
Loading...
Searching...
No Matches
Kernel_GWP.cpp
Go to the documentation of this file.
1#include "kids/Kernel_GWP.h"
2
3#include "kids/Kernel_Elec.h"
6#include "kids/hash_fnv1a.h"
7#include "kids/linalg.h"
8#include "kids/macro_utils.h"
9#include "kids/vars_list.h"
10
11namespace PROJECT_NS {
12
13const std::string Kernel_GWP::getName() { return "Kernel_GWP"; }
14
16
17
19 kids_real* p, // [P,N]
20 kids_real* m, // [P,N]
21 int P, int N) {
22 for (int iP = 0; iP < P; ++iP) {
23 kids_real* Ekin = Ekin + iP;
24 kids_real* p = p + iP * N;
25 kids_real* m = m + iP * N;
26 Ekin[0] = 0;
27 for (int j = 0; j < N; ++j) Ekin[0] += p[j] * p[j] / m[j];
28 Ekin[0] /= 2;
29 }
30 return 0;
31}
32
37 kids_real* x1, // [P,N]
38 kids_real* p1, // [P,N]
39 kids_real* m1, // [P,N]
40 kids_real* g1, // [P]
41 kids_real* x2, // [P,N]
42 kids_real* p2, // [P,N]
43 kids_real* m2, // [P,N]
44 kids_real* g2, // [P]
45 kids_real* alpha, // [N]
46 int P, int N) {
47 // Eigen::Map<EigMX<kids_complex>> Map_Snuc(Snuc, P, P);
48 // Eigen::Map<EigMX<kids_real>> Map_x1(x1, P, N);
49 // Eigen::Map<EigMX<kids_real>> Map_p1(p1, P, N);
50 // Eigen::Map<EigMX<kids_real>> Map_m1(m1, P, N);
51 // Eigen::Map<EigMX<kids_real>> Map_g1(g1, P, 1);
52
53 // Eigen::Map<EigMX<kids_real>> Map_x2(x2, P, N);
54 // Eigen::Map<EigMX<kids_real>> Map_p2(p2, P, N);
55 // Eigen::Map<EigMX<kids_real>> Map_m2(m2, P, N);
56 // Eigen::Map<EigMX<kids_real>> Map_g2(g2, P, 1);
57
58 // Eigen::Map<EigMX<kids_real>> Map_a(alpha, N, 1);
59
60 // auto O_NP = EigMX<kids_real>::Ones(N, P);
61 // auto O_P1 = EigMX<kids_real>::Ones(P, 1);
62
63 // auto x1_mul = Map_x1 * Map_a.asDiagonal();
64 // auto x2_mul = Map_x2 * Map_a.asDiagonal();
65
66 // auto p1_div = Map_p1 * (1.0e0 / Map_a.array()).matrix().asDiagonal();
67 // auto p2_div = Map_p2 * (1.0e0 / Map_a.array()).matrix().asDiagonal();
68
69 // auto ax1x1_I = (Map_x1.array() * x1_mul.array()).matrix() * O_NP;
70 // auto ax1_x2 = x1_mul * Map_x2.transpose();
71 // auto I_ax2x2 = ((Map_x2.array() * x2_mul.array()).matrix() * O_NP).transpose();
72 // auto term1 = ax1x1_I + I_ax2x2 - 2 * ax1_x2;
73
74 // auto bp1p1_I = (Map_p1.array() * p1_div.array()).matrix() * O_NP;
75 // auto bp1_p2 = p1_div * Map_p2.transpose();
76 // auto I_bp2p2 = ((Map_p2.array() * p2_div.array()).matrix() * O_NP).transpose();
77 // auto term2 = bp1p1_I + I_bp2p2 - 2 * bp1_p2;
78
79 // auto x1p1_I = (Map_x1.array() * Map_p1.array()).matrix() * O_NP;
80 // auto I_x2p2 = ((Map_x2.array() * Map_p2.array()).matrix() * O_NP).transpose();
81 // auto x1_p2 = Map_x1 * Map_p2.transpose();
82 // auto p1_x2 = Map_p1 * Map_x2.transpose();
83 // auto term3 = x1p1_I + x1_p2 - p1_x2 - I_x2p2;
84
85 // auto g1_I = Map_g1 * O_P1.transpose();
86 // auto I_g2 = O_P1 * Map_g2.transpose();
87 // auto term4 = g1_I - I_g2;
88
89 // Map_Snuc = (-0.25 * (term1 + term2) + 0.5 * phys::math::im * term3 - phys::math::im *
90 // term4).array().exp().matrix();
91
92 // // ARRAY_SHOW(Snuc, P, P);
93 for (int a = 0, aN = 0, ab = 0; a < P; ++a, aN += N) {
94 for (int b = 0, bN = 0; b < P; ++b, ++ab, bN += N) {
95 kids_complex term = 0.0e0;
96 for (int j = 0, aj = aN, bj = bN; j < N; ++j, ++aj, ++bj) {
97 term += -0.25 * alpha[j] * (x1[aj] - x2[bj]) * (x1[aj] - x2[bj]) //
98 - 0.25 / alpha[j] * (p1[aj] - p2[bj]) * (p1[aj] - p2[bj]) //
99 + 0.5 * phys::math::im * (p1[aj] + p2[bj]) * (x1[aj] - x2[bj]); //
100 }
101 Snuc[ab] = std::exp(term - phys::math::im * (g1[a] - g2[b]));
102 }
103 }
104 // // ARRAY_SHOW(Snuc, P, P);
105 return 0;
106}
107
109 kids_complex* c1, // [P,F]
110 kids_complex* c2, // [P,F]
111 kids_real xi, //
112 kids_real gamma, //
113 int P, int F) {
114 // Eigen::Map<EigMX<kids_complex>> Map_S(Sele, P, P);
115 // Eigen::Map<EigMX<kids_complex>> Map_c1(c1, P, F);
116 // Eigen::Map<EigMX<kids_complex>> Map_c2(c2, P, F);
117 // Map_S = xi * Map_c1.conjugate() * Map_c2.transpose() - F * gamma * EigMXc::Identity(P, P); // or Ones(P, P)
118 // @BAD!!!
119 return 0; // @bug FATAL
120}
121
123 kids_real* x, // [P,N]
124 kids_real* p, // [P,N]
125 kids_real* m, // [P,N]
126 kids_real* f, // [P,N]
127 kids_real* alpha, // [N]
128 kids_real* Ekin, // [P]
129 int P, int N) {
130 // Eigen::Map<EigMX<kids_complex>> Map_dtlnSnuc(dtlnSnuc, P, P);
131 // Eigen::Map<EigMX<kids_real>> Map_x(x, P, N);
132 // Eigen::Map<EigMX<kids_real>> Map_p(p, P, N);
133 // Eigen::Map<EigMX<kids_real>> Map_m(m, P, N);
134 // Eigen::Map<EigMX<kids_real>> Map_f(f, P, N);
135 // Eigen::Map<EigMX<kids_real>> Map_Ekin(Ekin, P, 1);
136 // Eigen::Map<EigMX<kids_real>> Map_a(alpha, N, 1);
137
138 // auto O_NP = EigMX<kids_real>::Ones(N, P);
139 // auto O_P1 = EigMX<kids_real>::Ones(P, 1);
140
141 // auto x_mul = Map_x * Map_a.asDiagonal();
142 // auto p_div = Map_p * (1.0e0 / Map_a.array()).matrix().asDiagonal();
143
144 // auto ve = (Map_p.array() / Map_m.array()).matrix();
145 // auto ax_ve = x_mul * ve.transpose();
146 // auto I_axve = O_NP.transpose() * (x_mul.array() * ve.array()).matrix().transpose();
147 // auto p_ve = Map_p * ve.transpose();
148 // auto I_pve = O_NP.transpose() * (Map_p.array() * ve.array()).matrix().transpose();
149
150 // auto bp_f = p_div * Map_f.transpose();
151 // auto I_bpf = O_NP.transpose() * (p_div.array() * Map_f.array()).matrix().transpose();
152 // auto x_f = Map_x * Map_f.transpose();
153 // auto I_xf = O_NP.transpose() * (Map_x.array() * Map_f.array()).matrix().transpose();
154
155 // auto I_Ekin = O_P1 * Map_Ekin.transpose();
156
157 // auto term1 = 0.5e0 * (ax_ve - I_axve) - 0.5e0 * phys::math::im * (p_ve + I_pve);
158 // auto term2 = -(0.5e0 * (bp_f - I_bpf) + 0.5e0 * phys::math::im * (x_f - I_xf));
159 // auto term3 = phys::math::im * I_Ekin;
160
161 // Map_dtlnSnuc = term1 + term2 + term3;
162
163 // // ARRAY_SHOW(dtlnSnuc, P, P);
164 for (int a = 0, aN = 0, ab = 0; a < P; ++a, aN += N) {
165 for (int b = 0, bN = 0; b < P; ++b, ++ab, bN += N) {
166 kids_complex term = 0.0e0;
167 for (int j = 0, aj = aN, bj = bN; j < N; ++j, ++aj, ++bj) {
168 term +=
169 p[bj] / m[bj] * 0.5 * alpha[j] * (x[aj] - x[bj] + (p[aj] + p[bj]) / (phys::math::im * alpha[j]));
170 term += (-f[bj]) * 0.5 / alpha[j] * ((p[aj] - p[bj]) + phys::math::im * alpha[j] * (x[aj] - x[bj]));
171 term += phys::math::im * p[bj] * p[bj] / (2 * m[bj]);
172 }
173 dtlnSnuc[ab] = term;
174 }
175 }
176 // // ARRAY_SHOW(dtlnSnuc, P, P);
177 return 0;
178}
179
181 kids_complex* Sele, // [P,P]
182 kids_complex* c, // [P,F]
183 kids_complex* H, // [P,F,F]
184 kids_real* vpes, // [P]
185 int P, int F) {
186 int FF = F * F;
187
188 // Eigen::Map<EigMX<kids_complex>> Map_dtSele(dtSele, P, P);
189 // Eigen::Map<EigMX<kids_complex>> Map_S(Sele, P, P);
190 // Eigen::Map<EigMX<kids_complex>> Map_c(c, P, F);
191 // Eigen::Map<EigMX<kids_complex>> Map_H_P_FF(H, P, F * F);
192 // Eigen::Map<EigMX<kids_complex>> Map_H_PF_F(H, P * F, F);
193 // Eigen::Map<EigMX<kids_complex>> Map_H_F_PF(H, F, P * F);
194 // Eigen::Map<EigMX<kids_real>> Map_vpes(vpes, P, 1);
195
196 // Map_S = Map_c.conjugate() * Map_c.transpose();
197 for (int a = 0, ab = 0, aF = 0; a < P; ++a, aF += F) {
198 kids_complex* ca = c + aF;
199 for (int b = 0, bF = 0, bFF = 0; b < P; ++b, ++ab, bF += F, bFF += FF) {
200 kids_complex* cb = c + bF;
201 kids_complex* Hb = H + bFF;
202
203 kids_complex term1 = ARRAY_INNER_VMV_TRANS1(ca, H, cb, F, F);
204 kids_complex term2 = ARRAY_INNER_TRANS1(ca, cb, F);
205 dtSele[ab] = -phys::math::im * (term1 + vpes[b] * term2);
206 }
207 }
208 return 0;
209}
210
212 kids_complex* Acoeff, // [P]
213 kids_complex* Snuc, // [P,P]
214 kids_complex* c, // [P,F]
215 kids_real xi, // for kernel
216 kids_real gamma, // for kernel
217 int P_used, int P, int F) { //@bug
218 // Eigen::Map<EigMX<kids_complex>> Map_rhored(rhored, Dimension::F, Dimension::F);
219 // Eigen::Map<EigMX<kids_complex>> Map_Acoeff(Acoeff, Dimension::P, 1);
220 // Eigen::Map<EigMX<kids_complex>> Map_Snuc(Snuc, Dimension::P, Dimension::P);
221 // Eigen::Map<EigMX<kids_complex>> Map_c(c, Dimension::P, Dimension::F);
222 // Map_rhored =
223 // (xi * Map_c.adjoint() * Map_Acoeff.adjoint().asDiagonal() * Map_Snuc * Map_Acoeff.asDiagonal() * Map_c -
224 // gamma * (Map_Acoeff.adjoint() * Map_Snuc * Map_Acoeff).sum() * EigMXc::Identity(F, F));
225 // return std::abs(Map_rhored.trace());
226 return 0; //@bug FATAL
227}
228
230 kids_real* vpes, // [P]
231 kids_real* grad, // [P,N]
232 kids_real* V, // [P,F,F]
233 kids_real* dV, // [P,N,F,F]
234 kids_real* x, // [P,N]
235 kids_real* p, // [P,N]
236 kids_real* m, // [P,N]
237 kids_real* alpha, // [N]
238 kids_complex* Sele, // [P,P]
239 kids_complex* c, // [P,F]
240 int P, int N, int F // Dimensions
241) {
242 int FF = F * F;
243 int NFF = N * FF;
244
245 for (int a = 0, aN = 0, aF = 0, ab = 0; a < P; ++a, aN += N, aF += F) {
246 kids_real* Va = V + a * FF;
247 kids_complex* ca = c + aF;
248 for (int b = 0, bN = 0, bF = 0; b < P; ++b, ++ab, bN += N, bF += F) {
249 kids_real* Vb = V + b * FF;
250 kids_complex* cb = c + bF;
251
252 kids_complex Tab = 0.0e0;
253 kids_complex Vab = 0.0e0;
254
255 Vab += 0.5e0 * (vpes[a] * Sele[ab] + ARRAY_INNER_VMV_TRANS1(ca, Va, cb, F, F));
256 Vab += 0.5e0 * (vpes[b] * Sele[ab] + ARRAY_INNER_VMV_TRANS1(ca, Vb, cb, F, F));
257 for (int j = 0, jFF = 0, aj = aN, bj = bN; j < N; ++j, ++aj, ++bj, jFF += FF) {
258 kids_real* dVaj = dV + aj * FF;
259 kids_real* dVbj = dV + bj * FF;
260 kids_complex xabj = 0.5e0 * (x[aj] + x[bj] + (p[aj] - p[bj]) / (phys::math::im * alpha[j]));
261 kids_complex pabj = 0.5e0 * (p[aj] + p[bj] + (phys::math::im * alpha[j]) * (x[aj] - x[bj]));
262 Tab += alpha[j] / (4 * m[bj]) + pabj * pabj / (2 * m[bj]);
263
264 Vab += 0.5e0 * (xabj - x[aj]) * (grad[aj] * Sele[ab] + ARRAY_INNER_VMV_TRANS1(ca, dVaj, cb, F, F));
265 Vab += 0.5e0 * (xabj - x[bj]) * (grad[bj] * Sele[ab] + ARRAY_INNER_VMV_TRANS1(ca, dVbj, cb, F, F));
266 }
267 Hbasis[ab] = Tab + Vab;
268 }
269 }
270 return 0;
271};
272
274 kids_real* E, // [P,F]
275 kids_real* dE, // [P,N,F,F]
276 kids_real* x, // [P,N]
277 kids_real* p, // [P,N]
278 kids_real* m, // [P,N]
279 kids_real* alpha, // [N]
280 kids_complex* c, // [P,F]
281 int P, int N, int F // Dimensions
282) {
283 int FF = F * F;
284 int NFF = N * FF;
285
286 for (int a = 0, aN = 0, ab = 0; a < P; ++a, aN += N) {
287 for (int b = 0, bN = 0; b < P; ++b, ++ab, bN += N) {
288 kids_real* Ea = E + a * F;
289 kids_real* Eb = E + b * F;
290 kids_real* dEa = dE + a * NFF;
291 kids_real* dEb = dE + b * NFF;
292 kids_complex* ca = c + a * F;
293 kids_complex* cb = c + b * F;
294
295 kids_complex Tab = 0.0e0;
296 kids_complex Eab = 0.0e0;
297
298 for (int j = 0, jik = 0, jFF = 0, aj = aN, bj = bN; j < N; ++j, ++aj, ++bj, jFF += Dimension::FF) {
299 kids_real* dEaj = dEa + jFF;
300 kids_real* dEbj = dEb + jFF;
301 kids_complex xabj = 0.5e0 * (x[aj] + x[bj] + (p[aj] - p[bj]) / (phys::math::im * alpha[j]));
302 kids_complex pabj = 0.5e0 * (p[aj] + p[bj] + (phys::math::im * alpha[j]) * (x[aj] - x[bj]));
303 Tab += alpha[j] / (4 * m[j]) + pabj * pabj / (2 * m[j]);
304
305 for (int i = 0, ik = 0; i < F; ++i) {
306 for (int k = 0; k < F; ++k, ++ik) {
307 Eab += (i == k) ? 0.5e0 * std::conj(ca[i]) * cb[k] *
308 (Ea[i] + Eb[i] + (xabj - x[aj]) * dEaj[ik] + (xabj - x[bj]) * dEbj[ik])
309 : 0.5e0 * phys::math::im * std::conj(ca[i]) * cb[k] *
310 (p[aj] / m[aj] * dEaj[ik] / (Ea[k] - Ea[i]) +
311 p[bj] / m[bj] * dEbj[ik] / (Eb[k] - Eb[i]));
312 }
313 }
314 }
315 Hbasis[ab] = Tab + Eab;
316 }
317 }
318 return 0;
319}
320
321void Kernel_GWP::setInputParam_impl(std::shared_ptr<Param>& PM) {
322 dt = PM->get_double("dt", LOC(), phys::time_d); //
323 alpha0 = PM->get_double("alpha0", LOC(), 1.0f); //
324 width_scaling = PM->get_double("width_scaling", LOC(), 1.0f); //
325 break_thres = PM->get_double("break_thres", LOC(), 1.0f); //
326 P_used0 = PM->get_int("P_initial", LOC(), 1); //
327 max_clone = PM->get_int("max_clone", LOC(), 0); //
328 gamma = PM->get_double("gamma", LOC(), 0.0f); //
329 xi = 1 + Dimension::F * gamma;
330
331 impl_type = PM->get_int("impl_type", LOC(), 0); //
332 samp_type = PM->get_int("samp_type", LOC(), 0); //
333 aset_type = PM->get_int("aset_type", LOC(), 0); //
334 time_displace_step = PM->get_int("time_displace_step", LOC(), 1); //
335}
336
337void Kernel_GWP::setInputDataSet_impl(std::shared_ptr<DataSet>& DS) {
338 alpha = DS->def_real("integrator.alpha", Dimension::N);
339 Xcoeff = DS->def_complex("integrator.Xcoeff", Dimension::P);
340 Acoeff = DS->def_complex("integrator.Acoeff", Dimension::P);
341 dtAcoeff = DS->def_complex("integrator.dtAcoeff", Dimension::P);
342 Hcoeff = DS->def_complex("integrator.Hcoeff", Dimension::PP);
343 Hbasis = DS->def_complex("integrator.Hbasis", Dimension::PP);
344 UXdt = DS->def_complex("integrator.UXdt", Dimension::PP);
345 UYdt = DS->def_complex("integrator.UYdt", Dimension::PP);
346 rhored = DS->def_complex("integrator.rhored", Dimension::FF);
347 rhored2 = DS->def_complex("integrator.rhored2", Dimension::FF);
348 rhored3 = DS->def_complex("integrator.rhored3", Dimension::FF);
349
350 Snuc = DS->def_complex("integrator.Snuc", Dimension::PP);
351 Sele = DS->def_complex("integrator.Sele", Dimension::PP);
352 S = DS->def_complex("integrator.S", Dimension::PP);
353 invS = DS->def_complex("integrator.invS", Dimension::PP);
354 dtlnSnuc = DS->def_complex("integrator.dtlnSnuc", Dimension::PP);
355 dtSele = DS->def_complex("integrator.dtSele", Dimension::PP);
356 L = DS->def_real("integrator.GWP.L", Dimension::P);
357 L1 = DS->def_real("integrator.GWP.L1", Dimension::P);
358 L2 = DS->def_real("integrator.GWP.L2", Dimension::P);
359 R = DS->def_complex("integrator.GWP.R", Dimension::PP);
360 R1 = DS->def_complex("integrator.GWP.R1", Dimension::PP);
361 R2 = DS->def_complex("integrator.GWP.R2", Dimension::PP);
362 S1 = DS->def_complex("integrator.GWP.S1", Dimension::PP);
363 S1h = DS->def_complex("integrator.GWP.S1h", Dimension::PP);
364 invS1h = DS->def_complex("integrator.GWP.invS1h", Dimension::PP);
365 S2 = DS->def_complex("integrator.GWP.S2", Dimension::PP);
366 S2h = DS->def_complex("integrator.GWP.S2h", Dimension::PP);
367 invS2h = DS->def_complex("integrator.GWP.invS2h", Dimension::PP);
368 Sx = DS->def_complex("integrator.GWP.Sx", Dimension::PP);
369
370 Ekin = DS->def_real("integrator.Ekin", Dimension::P);
371 g = DS->def_real("integrator.g", Dimension::P);
372 clone_account = DS->def_int("integrator.clone_account", Dimension::P);
373 // pf_cross = DS->def<kids_bool>("integrator.pf_cross", Dimension::PF);
374
375 //
376 Udt = DS->def_complex("integrator.Udt", Dimension::PFF);
377 H = DS->def_complex("model.rep.H", Dimension::PFF);
378 vpes = DS->def_real("model.vpes", Dimension::P);
379 grad = DS->def_real("model.grad", Dimension::PN);
380 V = DS->def_real("model.V", Dimension::PFF);
381 dV = DS->def_real("model.dV", Dimension::PNFF);
382 E = DS->def_real("model.rep.E", Dimension::PF);
383 T = DS->def_real("model.rep.T", Dimension::PFF);
384 dE = DS->def_real("model.rep.dE", Dimension::PNFF);
385 x = DS->def_real("integrator.x", Dimension::PN);
386 p = DS->def_real("integrator.p", Dimension::PN);
387 m = DS->def_real("integrator.m", Dimension::PN);
388 f = DS->def_real("integrator.f", Dimension::PN);
389 c = DS->def_complex("integrator.c", Dimension::PF);
390
391 fun_diag_F = DS->def_complex("integrator.tmp.fun_diag_F", Dimension::F);
392 fun_diag_P = DS->def_complex("integrator.tmp.fun_diag_P", Dimension::P);
393 MatR_PP = DS->def_real("integrator.tmp.MatR_PP", Dimension::PP);
394 MatC_PP = DS->def_complex("integrator.tmp.MatC_PP", Dimension::PP);
395 I_PP = DS->def_complex("integrator.tmp.I_PP", Dimension::PP);
396 Ubranch = DS->def_complex("integrator.Ubranch", Dimension::FF);
397
398 x_last = DS->def_real("integrator.x_last", Dimension::PN);
399 p_last = DS->def_real("integrator.p_last", Dimension::PN);
400 grad_last = DS->def_real("integrator.grad_last", Dimension::PN);
401 dV_last = DS->def_real("integrator.dV_last", Dimension::PNFF);
402 g_last = DS->def_real("integrator.g_last", Dimension::P);
403 c_last = DS->def_complex("integrator.c_last", Dimension::PF);
404
405 P_used_ptr = DS->def_real("integrator.P_used");
406 norm_ptr = DS->def_real("integrator.norm");
407 veF = DS->def_real("integrator.veF", Dimension::FF);
408 ve = DS->def_real("integrator.ve", Dimension::N);
409}
410
412 // @begin debug
413 for (int iP = 0; iP < Dimension::P; ++iP) {
414 kids_real* x = this->x + iP * Dimension::N;
415 kids_real* p = this->p + iP * Dimension::N;
416 for (int j = 0; j < Dimension::N; ++j) {
417 x[j] = iP * 0.02 * (iP % 2 - 0.5) + 0.1 * j;
418 p[j] = -iP * 0.02 * (iP % 2 - 0.5) + 0.2 * j;
419 }
420 }
421 // @end debug
422
423 if (samp_type < 3) { // overlap or neighbourhood re-sampling
424 for (int iP = 0; iP < Dimension::P; ++iP) {
428 int* occ_nuc = Kernel_Elec::occ_nuc + iP;
429
430 kids_real* x = this->x + iP * Dimension::N;
431 kids_real* p = this->p + iP * Dimension::N;
432
434 if (samp_type == 1)
435 for (int j = 0; j < Dimension::N; ++j) {
436 x[j] = this->x[j];
437 p[j] = this->p[j];
438 }
439
440 if (samp_type == 2 && iP > 0) {
441 for (int j = 0; j < Dimension::N; ++j) {
442 double randu;
444 randu = sqrt(iP * iP % (j + 1));
445 x[j] = this->x[j] + width_scaling * randu / sqrt(Dimension::N * alpha0);
447 randu = sqrt(iP % (j + 1));
448 p[j] = this->p[j] + width_scaling * randu * sqrt(alpha0 / Dimension::N);
449 }
450 }
451
452 *w = 1.0e0;
453 *occ_nuc = Kernel_Elec::occ0;
455 for (int i = 0; i < Dimension::F; ++i) {
456 double randu;
458 c[i] = (i == *occ_nuc ? sqrt(1 + gamma) : sqrt(gamma)) * exp(phys::math::im * randu) / sqrt(xi);
459 }
461 }
462 }
463
465 if (samp_type == 3) {
466 *Kernel_Elec::w = 1.0e0;
468 for (int i = 0; i < Dimension::F; ++i) {
469 double randu;
471 Kernel_Elec::c[i] =
472 (i == *Kernel_Elec::occ_nuc ? sqrt(1 + gamma) : sqrt(gamma)) * exp(phys::math::im * randu) / sqrt(xi);
473 }
475 for (int iP = 1; iP < Dimension::P; ++iP) {
476 kids_real* x_now = x + iP * Dimension::N;
477 kids_real* p_now = p + iP * Dimension::N;
478 kids_real* f_now = f + iP * Dimension::N;
481 kids_complex* rho_nuc_now = Kernel_Elec::rho_nuc + iP * Dimension::FF;
482
483 kids_real* x_prev = x + std::max({iP - 2, 0}) * Dimension::N;
484 kids_real* p_prev = p + std::max({iP - 2, 0}) * Dimension::N;
485 kids_real* f_prev = f + std::max({iP - 2, 0}) * Dimension::N;
486 kids_complex* U_prev = Kernel_Elec::U + std::max({iP - 2, 0}) * Dimension::FF;
487
488 kids_real* E_now = E + iP * Dimension::F;
489 kids_real* T_now = T + iP * Dimension::FF;
490 kids_complex* Udt_now = Udt + iP * Dimension::FF;
491
492 kids_real signdt = (iP % 2 == 0) ? dt : -dt;
493
494 for (int j = 0; j < Dimension::N; ++j) x_now[j] = x_prev[j], p_now[j] = p_prev[j], f_now[j] = f_prev[j];
495
496 for (int istep_displace = 0; istep_displace < time_displace_step; ++istep_displace) {
497 for (int j = 0; j < Dimension::N; ++j) p_now[j] -= f_now[j] * 0.5 * signdt;
498 for (int j = 0; j < Dimension::N; ++j) x_now[j] += p_now[j] / m[j] * signdt;
499 _kmodel->executeKernel(stat); // only iP needed
500 _krepr->executeKernel(stat); // only iP needed
502 case RepresentationPolicy::Diabatic: {
503 for (int i = 0; i < Dimension::F; ++i) fun_diag_F[i] = exp(-phys::math::im * E_now[i] * signdt);
504 ARRAY_MATMUL3_TRANS2(Udt_now, T_now, fun_diag_F, T_now, Dimension::F, Dimension::F, 0,
506 break;
507 }
508 }
509 ARRAY_MATMUL(U_now, Udt_now, U_prev, Dimension::F, Dimension::F, Dimension::F);
510 ARRAY_MATMUL(c_now, U_now, c, Dimension::F, Dimension::F, 1);
511 Kernel_Elec::ker_from_c(rho_nuc_now, c_now, xi, gamma, Dimension::F);
512 _kforce->executeKernel(stat);
513 for (int j = 0; j < Dimension::N; ++j) p_now[j] -= f_now[j] * 0.5 * signdt;
514 }
515 // ARRAY_SHOW(x_now, 1, Dimension::N);
516 // ARRAY_SHOW(p_now, 1, Dimension::N);
517 }
518
519 for (int iP = 0; iP < Dimension::P; ++iP) {
523 int* occ_nuc = Kernel_Elec::occ_nuc + iP;
524
526
527 *w = 1.0e0;
528 *occ_nuc = Kernel_Elec::occ0;
530 // for (int i = 0; i < Dimension::F; ++i) {
531 // double randu;
532 // Kernel_Random::rand_uniform(&randu, 1, phys::math::twopi);
533 // c[i] = (i == *occ_nuc ? sqrt(1 + gamma) : sqrt(gamma)) * exp(phys::math::im * randu) / sqrt(xi);
534 // }
536 }
537 }
538
539 _kmodel->executeKernel(stat);
540 _krepr->executeKernel(stat);
541
542 for (int i = 0; i < Dimension::N; ++i) alpha[i] = alpha0;
543 for (int a = 0; a < Dimension::P; ++a) g[a] = 0.0e0;
544 if (aset_type == 0) {
545 for (int a = 0; a < Dimension::P; ++a) Acoeff[a] = (a == 0) ? 1.0e0 : 0.0e0;
546 } else if (aset_type == 1) {
547 for (int a = 0; a < Dimension::P; ++a) Acoeff[a] = 1.0e0; // @only for test
548 }
549
550 // normalization of A
551 P_used = P_used0;
552 P_used_ptr[0] = P_used;
553 // std::cout << "P_used_INIT = " << P_used << "\n";
554 for (int a = P_used; a < Dimension::P; ++a) Acoeff[a] = 0.0e0;
557 for (int ab = 0; ab < Dimension::PP; ++ab) { S[ab] = Snuc[ab] * Sele[ab]; }
558 kids_complex scale;
560 for (int a = 0; a < Dimension::P; ++a) Acoeff[a] /= sqrt(abs(scale));
562 xi = 1.0e0 + Dimension::F * gamma * std::abs(scale);
563
564 std::cout << "init scale: " << scale << "\n";
565 std::cout << "init xi: " << xi << "\n";
566
567 norm_ptr[0] = 1.0e0;
568
569 // ARRAY_SHOW(Acoeff, 1, Dimension::P);
570
571 Kernel_Elec::c_init = _dataset->def_complex("init.c", Kernel_Elec::c, Dimension::PF);
573
574 for (int a = 0; a < Dimension::P; ++a) g_last[a] = g[a];
575 for (int aj = 0; aj < Dimension::PN; ++aj) x_last[aj] = x[aj];
576 for (int aj = 0; aj < Dimension::PN; ++aj) p_last[aj] = p[aj];
577 for (int ai = 0; ai < Dimension::PF; ++ai) c_last[ai] = c[ai];
578
579 double dt_backup = dt;
580 dt = 0.0e0;
581 executeKernel(stat); // don't evolve!!!
582 dt = dt_backup;
583
584 return stat;
585}
586
588 // calculate overlap integral & time derivative of overlap integral
589
590 // ARRAY_SHOW(p, Dimension::P, Dimension::N);
591 // ARRAY_SHOW(x, Dimension::P, Dimension::N);
592 // ARRAY_SHOW(c, Dimension::P, Dimension::F);
593 // ARRAY_SHOW(g, 1, Dimension::P);
594
600 for (int ab = 0; ab < Dimension::PP; ++ab) { S[ab] = Snuc[ab] * Sele[ab]; }
601 // calculate inverse of overlap integral
603 for (int a = 0; a < Dimension::P; ++a) fun_diag_P[a] = 1.0e0 / L1[a];
605
606 // ARRAY_SHOW(Snuc, Dimension::P, Dimension::P);
607 // ARRAY_SHOW(Sele, Dimension::P, Dimension::P);
608 // ARRAY_SHOW(S, Dimension::P, Dimension::P);
609 // ARRAY_SHOW(invS, Dimension::P, Dimension::P);
610
611 // calculate Hamiltonian between two configurations basis
613 // calculate effective Hamiltonian
614 for (int ab = 0; ab < Dimension::PP; ++ab) {
615 Hcoeff[ab] =
616 (Snuc[ab] * Hbasis[ab] - phys::math::im * S[ab] * dtlnSnuc[ab] - phys::math::im * Snuc[ab] * dtSele[ab]);
617 }
619
620 // ARRAY_SHOW(Hcoeff, Dimension::P, Dimension::P);
622
623 // ARRAY_SHOW(UXdt, Dimension::P, Dimension::P);
624
625 // update Acoeff
626 for (int a = P_used; a < Dimension::P; ++a) Acoeff[a] = 0.0e0;
628 for (int a = P_used; a < Dimension::P; ++a) Acoeff[a] = 0.0e0;
629 kids_complex scale;
631 norm_ptr[0] *= std::abs(scale);
632 for (int a = 0; a < Dimension::P; ++a) Acoeff[a] /= sqrt(abs(scale));
633
634 for (int a = 0; a < Dimension::P; ++a) g[a] += Ekin[a] * dt;
635
636 cloning();
637 death();
638 return stat;
639}
640
642 // calculate overlap integral
646 for (int ab = 0; ab < Dimension::PP; ++ab) S1[ab] = Snuc[ab] * Sele[ab];
647
648 // ARRAY_SHOW(Acoeff, 1, Dimension::P);
649 // ARRAY_SHOW(S1, Dimension::P, Dimension::P);
650
651 // ARRAY_SHOW(S1, Dimension::P, Dimension::P);
652
655 for (int ab = 0; ab < Dimension::PP; ++ab) Sx[ab] = Snuc[ab] * Sele[ab];
656
657 // ARRAY_SHOW(Sx, Dimension::P, Dimension::P);
658
661 for (int ab = 0; ab < Dimension::PP; ++ab) S2[ab] = Snuc[ab] * Sele[ab];
662 for (int ab = 0; ab < Dimension::PP; ++ab) S[ab] = S2[ab];
663
664 // ARRAY_SHOW(S2, Dimension::P, Dimension::P);
665
667 for (int a = 0; a < Dimension::P; ++a) fun_diag_P[a] = sqrt(L1[a]);
669 for (int a = 0; a < Dimension::P; ++a) fun_diag_P[a] = 1.0e0 / sqrt(L1[a]);
671
673 for (int a = 0; a < Dimension::P; ++a) fun_diag_P[a] = sqrt(L2[a]);
675 for (int a = 0; a < Dimension::P; ++a) fun_diag_P[a] = 1.0e0 / sqrt(L2[a]);
677
678 // calculate Hamiltonian between two configurations basis
682
683 // ARRAY_SHOW(Hcoeff, Dimension::P, Dimension::P);
684
686 for (int a = 0; a < Dimension::P; ++a) fun_diag_P[a] = exp(-phys::math::im * L[a] * dt);
688
692
693 for (int a = P_used; a < Dimension::P; ++a) Acoeff[a] = 0.0e0;
695
696 kids_complex cnorm;
698 std::cout << "norm 1 = " << cnorm << "\n";
699
701
703 std::cout << "norm 2 = " << cnorm << "\n";
704
706
708 std::cout << "norm 3 = " << cnorm << "\n";
709
710 // ARRAY_MATMUL(Xcoeff, invS1h, Xcoeff, Dimension::P, Dimension::P, 1);
711 // ARRAY_MATMUL(Xcoeff, Sx, Xcoeff, Dimension::P, Dimension::P, 1);
712 // ARRAY_MATMUL(Xcoeff, invS2h, Xcoeff, Dimension::P, Dimension::P, 1);
714 for (int a = P_used; a < Dimension::P; ++a) Acoeff[a] = 0.0e0;
715
716 std::cout << "P_used = " << P_used << "\n";
717 // ARRAY_SHOW(Acoeff, 1, Dimension::P);
718 // ARRAY_SHOW(S2, Dimension::P, Dimension::P);
719 cloning();
720 death();
721
722 for (int a = 0; a < Dimension::P; ++a) g_last[a] = g[a];
723 for (int aj = 0; aj < Dimension::PN; ++aj) x_last[aj] = x[aj];
724 for (int aj = 0; aj < Dimension::PN; ++aj) p_last[aj] = p[aj];
725 for (int ai = 0; ai < Dimension::PF; ++ai) c_last[ai] = c[ai];
726 // update phase
727 for (int a = 0; a < Dimension::P; ++a) g[a] += Ekin[a] * dt;
728 return stat;
729}
731 for (int iP = 0; iP < Dimension::P; ++iP) {
737
740
742
743 for (int i = 0; i < Dimension::F; ++i) c[i] = c_init[i];
744
745 // 1) transform from inp_repr => ele_repr
749 SpacePolicy::H);
750 // 2) propagte along ele_repr
752
753 // 3) transform back from ele_repr => inp_repr
757 SpacePolicy::H);
758
761 }
762 switch (impl_type) {
763 case 0: {
764 impl_0(stat);
765 break;
766 }
767 case 1: {
768 impl_1(stat);
769 break;
770 }
771 }
772 kids_complex scale;
774 std::cout << "t scale : " << scale << "\n";
775 xi = 1.0e0 + Dimension::F * gamma * std::abs(scale);
777
779 for (int a = 0, aik = 0; a < P_used; ++a) {
780 for (int ik = 0; ik < Dimension::FF; ++ik, ++aik) rhored2[ik] += Kernel_Elec::K1[aik];
781 }
782 for (int ik = 0; ik < Dimension::FF; ++ik) rhored2[ik] /= double(P_used);
783 return stat;
784}
785
787 P_used_ptr[0] = P_used;
788 if (P_used >= Dimension::P) return 0;
789 int P_increase = P_used;
790
791 // calc_Snuc(Snuc, this->x, this->p, this->m, this->g, this->x, this->p, this->m, this->g, alpha, Dimension::P,
792 // Dimension::N);
793 // calc_density(rhored, Acoeff, Snuc, c, xi, gamma, P_used, Dimension::P, Dimension::F);
794 // ARRAY_SHOW(Snuc, Dimension::P, Dimension::P);
795 // ARRAY_SHOW(c, Dimension::P, Dimension::F);
796 // ARRAY_SHOW(Acoeff, Dimension::P, 1);
797 // ARRAY_SHOW(rhored, Dimension::F, Dimension::F);
798
799 // calc_density(rhored, Acoeff, Snuc, c, 1, 0, P_used, Dimension::P, Dimension::F);
800 // ARRAY_SHOW(rhored, Dimension::F, Dimension::F);
801
802 for (int iP = 0; iP < P_used; ++iP) {
803 kids_real* g = this->g + iP;
804 kids_real* x = this->x + iP * Dimension::N;
805 kids_real* p = this->p + iP * Dimension::N;
806 kids_real* f = this->f + iP * Dimension::N;
807 kids_real* grad = this->grad + iP * Dimension::N;
808 kids_real* V = this->V + iP * Dimension::FF;
809 kids_real* dV = this->dV + iP * Dimension::NFF;
810 kids_complex* c = this->c + iP * Dimension::F;
813
815
816 double max_break_val = 0.0e0;
817 int break_state_i = -1, break_state_k = -1;
818 // Eigen::Map<EigMXr> Map_veF(veF, Dimension::FF, 1);
819 // Eigen::Map<EigMXr> Map_dV(dV, Dimension::N, Dimension::FF);
820 // Eigen::Map<EigMXr> Map_p(p, Dimension::N, 1);
821 // Eigen::Map<EigMXr> Map_m(m, Dimension::N, 1);
822 // Map_veF = Map_dV.transpose() * (Map_p.array() / Map_m.array()).matrix();
823 for (int j = 0; j < Dimension::N; ++j) ve[j] = p[j] / m[j];
825
826
827 for (int i = 0; i < Dimension::F; ++i) {
828 for (int k = i + 1; k < Dimension::F; ++k) {
829 double break_val =
830 std::abs(c[i] * c[i] * c[k] * c[k] * (veF[i * Dimension::Fadd1] - veF[k * Dimension::Fadd1]) /
831 (1e-6 + std::abs(V[i * Dimension::Fadd1] - V[k * Dimension::Fadd1])));
832 if (break_val > max_break_val) {
833 max_break_val = break_val;
834 break_state_i = i;
835 break_state_k = k;
836 }
837 }
838 }
839 if (max_break_val > break_thres) {
840 int break_state = (std::abs(c[break_state_i]) > std::abs(c[break_state_k])) ? break_state_i : break_state_k;
841 double norm_b = std::abs(c[break_state]);
842 double norm_a = sqrt(1 - norm_b * norm_b);
843 kids_complex norm_phase_a = norm_a * (norm_a + phys::math::im * norm_b);
844 kids_complex norm_phase_b = norm_b * (norm_b - phys::math::im * norm_a);
845
846 // std::cout << "norm_a, norm_b, iP, P_used, P_increase: " << norm_a << ", " << norm_b << ", " << iP << ","
847 // << P_used << ", " << P_increase << "\n";
848
849 kids_real* g_new = this->g + P_increase;
850 kids_real* x_new = this->x + P_increase * Dimension::N;
851 kids_real* p_new = this->p + P_increase * Dimension::N;
852 kids_real* f_new = this->f + P_increase * Dimension::N;
853 kids_real* grad_new = this->grad + P_increase * Dimension::N;
854 kids_real* dV_new = this->dV + P_increase * Dimension::NFF;
855 kids_complex* c_new = this->c + P_increase * Dimension::F;
856 kids_complex* c_init_new = Kernel_Elec::c_init + P_increase * Dimension::F;
857 kids_complex* U_new = Kernel_Elec::U + P_increase * Dimension::FF;
858
859 g_new[0] = g[0];
860 for (int j = 0; j < Dimension::N; ++j) x_new[j] = x[j];
861 for (int j = 0; j < Dimension::N; ++j) p_new[j] = p[j];
862 for (int j = 0; j < Dimension::N; ++j) f_new[j] = f[j];
863 for (int j = 0; j < Dimension::N; ++j) grad_new[j] = grad[j];
864 for (int j = 0; j < Dimension::NFF; ++j) dV_new[j] = dV[j];
865
866 for (int i = 0; i < Dimension::F; ++i) fun_diag_F[i] = c[i];
867 for (int i = 0; i < Dimension::F; ++i) c_new[i] = ((i == break_state) ? 0.0e0 : (c[i] / norm_phase_a));
868 for (int i = 0; i < Dimension::F; ++i) c_init_new[i] = c_init[i];
871
872 for (int i = 0; i < Dimension::F; ++i) c[i] = ((i == break_state) ? c[i] / norm_phase_b : 0.0e0);
875
876 Acoeff[P_increase] = Acoeff[iP] * norm_phase_a;
877 Acoeff[iP] *= norm_phase_b;
878
879 P_increase++;
880
881 if (P_increase >= Dimension::P) break;
882 }
883 }
884
885 // std::cout << "cloning " << P_increase - P_used << " trajs\n";
886 // std::cout << "P_used = " << P_used << "\n";
887
888 if (P_increase > P_used) {
889 // std::cout << "\n#############################################\n\n";
890
891 P_used = P_increase;
892 // calc_Snuc(Snuc, this->x, this->p, this->m, this->g, this->x, this->p, this->m, this->g, alpha, Dimension::P,
893 // Dimension::N);
894 // calc_density(rhored, Acoeff, Snuc, c, xi, gamma, P_used, Dimension::P, Dimension::F);
895 // ARRAY_SHOW(Snuc, Dimension::P, Dimension::P);
896 // ARRAY_SHOW(c, Dimension::P, Dimension::F);
897 // ARRAY_SHOW(Acoeff, Dimension::P, 1);
898 // ARRAY_SHOW(rhored, Dimension::F, Dimension::F);
899 // calc_density(rhored, Acoeff, Snuc, c, 1, 0, P_used, Dimension::P, Dimension::F);
900 // ARRAY_SHOW(rhored, Dimension::F, Dimension::F);
901 }
902
903
904 // std::cout << "after P_used = " << P_used << "\n";
905 return 0;
906
907 // for (int iP = 0; iP < Dimension::P; ++iP) {
908 // kids_real* p = this->p + iP * Dimension::N;
909 // kids_real* grad = this->grad + iP * Dimension::N;
910 // kids_real* dV = this->dV + iP * Dimension::NFF;
911 // bool* pf_cross = this->pf_cross + iP * Dimension::F;
912
913 // /////////////////////////////////////////////////
914 // for (int i = 0; i < Dimension::F; ++i) {
915 // double cross = 0.0e0;
916 // for (int j = 0; j < Dimension::N; ++j) {
917 // cross += p[j] * (grad[j] + dV[j * Dimension::FF + i * Dimension::Fadd1]);
918 // }
919 // pf_cross[i] = (cross > 0);
920 // }
921
922 // // bool group1 = false;
923 // // bool group2 = false;
924 // // for (int i = 0; i < Dimension::F; ++i) {
925 // // if (pf_cross_last[i] && (!pf_cross[i])) {
926 // // group1 = true;
927 // // } else {
928 // // group2 = true;
929 // // }
930 // // }
931 // // if (group1 && group2) { // do branching
932 // // //
933 // // }
934 // }
935 return 0;
936}
937
938}; // namespace PROJECT_NS
initialization kernels for electonic DOFs
#define ARRAY_MATMUL_TRANS2(_A, _B, _C, _n1, _n2, _n3)
#define ARRAY_MATMUL3_TRANS1(_A, _B, _C, _D, _n1, _n2, _n0, _n3)
#define ARRAY_MATMUL3_TRANS2(_A, _B, _C, _D, _n1, _n2, _n0, _n3)
#define ARRAY_MATMUL(_A, _B, _C, _n1, _n2, _n3)
#define ARRAY_EYE(_A, _n)
Definition array_macro.h:75
#define ARRAY_MATMUL_TRANS1(_A, _B, _C, _n1, _n2, _n3)
#define ARRAY_CLEAR(_A, _n)
Definition array_macro.h:36
static kids_complex * U
dynamics variables for electronic DOFs
Definition Kernel_Elec.h:39
static int * occ_nuc
weighting density for nuclear force
Definition Kernel_Elec.h:48
static kids_real * T_init
Definition Kernel_Elec.h:43
static kids_real * T
Definition Kernel_Elec.h:43
static kids_complex * rho_nuc
Definition Kernel_Elec.h:49
static kids_complex * c
Definition Kernel_Elec.h:40
static int ker_from_c(kids_complex *ker, kids_complex *c, kids_real xi, kids_real gamma, int fdim)
convert c (electonic amplititude) to kernel (affine map of the density)
static kids_complex * c_init
electronic vector
Definition Kernel_Elec.h:40
static int occ0
read parameters
Definition Kernel_Elec.h:31
static kids_complex * K1
partial version of K1
Definition Kernel_Elec.h:63
static kids_complex * w
kernels for time correlation function
Definition Kernel_Elec.h:54
kids_complex * Xcoeff
Definition Kernel_GWP.h:126
Status & impl_0(Status &stat)
kids_complex * dtlnSnuc
Definition Kernel_GWP.h:118
kids_complex * Hbasis
Definition Kernel_GWP.h:122
kids_complex * S2
Definition Kernel_GWP.h:116
std::shared_ptr< Kernel > _krepr
Definition Kernel_GWP.h:96
kids_complex * UXdt
Definition Kernel_GWP.h:126
kids_complex * Snuc
Definition Kernel_GWP.h:113
static int calc_Hbasis_adia(kids_complex *Hbasis, kids_real *E, kids_real *dE, kids_real *x, kids_real *p, kids_real *m, kids_real *alpha, kids_complex *c, int P, int N, int F)
std::shared_ptr< Kernel > _kforce
Definition Kernel_GWP.h:97
virtual int getType() const
Get the type of the kernel.
kids_real * MatR_PP
temporary
Definition Kernel_GWP.h:133
static int calc_dtSele(kids_complex *dtlnSele, kids_complex *Sele, kids_complex *c, kids_complex *H, kids_real *vpes, int P, int F)
kids_complex * R2
Definition Kernel_GWP.h:116
static int calc_Sele(kids_complex *S, kids_complex *c1, kids_complex *c2, kids_real xi, kids_real gamma, int P, int F)
kids_complex * S1
Definition Kernel_GWP.h:115
Status & impl_1(Status &stat)
kids_complex * invS2h
Definition Kernel_GWP.h:116
virtual const std::string getName()
Get the name of the kernel.
kids_complex * fun_diag_P
Definition Kernel_GWP.h:136
Status & executeKernel_impl(Status &stat)
Virtual function to execute the kernel implementation.
kids_complex * I_PP
Definition Kernel_GWP.h:135
kids_complex * dtSele
Definition Kernel_GWP.h:118
kids_complex * Sx
Definition Kernel_GWP.h:117
kids_complex * Sele
Definition Kernel_GWP.h:113
static int calc_Ekin(kids_real *Ekin, kids_real *p, kids_real *m, int P, int N)
static int calc_dtlnSnuc(kids_complex *dtlnSnuc, kids_real *x, kids_real *p, kids_real *m, kids_real *f, kids_real *alpha, kids_real *Ekin, int P, int N)
static double calc_density(kids_complex *rhored, kids_complex *Acoeff, kids_complex *Snuc, kids_complex *c, kids_real xi, kids_real gamma, int Pu, int P, int F)
kids_complex * c_last
Definition Kernel_GWP.h:142
static int calc_Hbasis(kids_complex *Hbasis, kids_real *vpes, kids_real *grad, kids_real *V, kids_real *dV, kids_real *x, kids_real *p, kids_real *m, kids_real *alpha, kids_complex *Sele, kids_complex *c, int P, int N, int F)
std::shared_ptr< Kernel > _kmodel
Definition Kernel_GWP.h:95
kids_complex * Ubranch
Definition Kernel_GWP.h:138
kids_complex * rhored
Definition Kernel_GWP.h:127
kids_complex * dtAcoeff
Definition Kernel_GWP.h:124
kids_complex * S2h
Definition Kernel_GWP.h:116
kids_complex * fun_diag_F
Definition Kernel_GWP.h:137
kids_complex * invS
Definition Kernel_GWP.h:113
kids_complex * rhored2
Definition Kernel_GWP.h:128
kids_complex * rhored3
Definition Kernel_GWP.h:129
void setInputDataSet_impl(std::shared_ptr< DataSet > &DS)
Virtual function to set input data set for the kernel implementation.
kids_complex * R1
Definition Kernel_GWP.h:115
kids_complex * S1h
Definition Kernel_GWP.h:115
kids_complex * invS1h
Definition Kernel_GWP.h:115
Status & initializeKernel_impl(Status &stat)
Virtual function to initialize the kernel implementation.
static int calc_Snuc(kids_complex *S, kids_real *x1, kids_real *p1, kids_real *m1, kids_real *g1, kids_real *x2, kids_real *p2, kids_real *m2, kids_real *g2, kids_real *alpha, int P, int N)
the expression is exp(-0.25*a*(x1-x2)^2 -0.25*(p1-p2)/a + 0.5i*(p1+p2)(x1-x2) - i(g1-g2))
kids_complex * Udt
Definition Kernel_GWP.h:111
kids_complex * MatC_PP
Definition Kernel_GWP.h:134
kids_complex * Hcoeff
Definition Kernel_GWP.h:123
kids_complex * Acoeff
Definition Kernel_GWP.h:124
void setInputParam_impl(std::shared_ptr< Param > &PM)
Virtual function to set input parameters for the kernel implementation.
kids_complex * UYdt
Definition Kernel_GWP.h:126
static int rand_uniform(kids_real *res_arr, int N=1, kids_real sigma=1.0)
static int rand_gaussian(kids_real *res_arr, int N=1, kids_real sigma=1.0, kids_real mu=0.0)
static RepresentationPolicy::_type ele_repr_type
representation for electronic dynamics
static int transform(kids_complex *A, kids_real *T, int fdim, RepresentationPolicy::_type from, RepresentationPolicy::_type to, SpacePolicy::_type Stype)
static RepresentationPolicy::_type inp_repr_type
representatioin for input (quantities)
Status & executeKernel(Status &stat)
Execute the kernel's algorithm and those of its children.
Definition Kernel.cpp:48
std::shared_ptr< DataSet > _dataset
Shared pointer to the DataSet object associated with this kernel.
Definition Kernel.h:278
#define LOC()
show the location information for debug
Definition fmt.h:49
Provide linalg APIs.
#define FUNCTION_NAME
Definition macro_utils.h:9
std::size_t PN
Product of P and N (P * N).
Definition vars_list.cpp:14
std::size_t PNFF
Product of P, N, F, and F (P * N * F * F).
Definition vars_list.cpp:18
std::size_t NFF
Product of N, F, and F (N * F * F).
Definition vars_list.cpp:22
std::size_t N
Number of nuclear degrees of freedom.
Definition vars_list.cpp:10
std::size_t PF
Product of P and F (P * F).
Definition vars_list.cpp:16
std::size_t PFF
Product of P, F, and F (P * F * F).
Definition vars_list.cpp:17
std::size_t P
Number of parallel trajectories (swarms of trajectories) in each Monte Carlo run.
Definition vars_list.cpp:9
std::size_t F
Number of electronic degrees of freedom.
Definition vars_list.cpp:11
std::size_t Fadd1
F plus 1 (F + 1).
Definition vars_list.cpp:24
std::size_t FF
Product of F and F (F * F).
Definition vars_list.cpp:21
std::size_t PP
Product of P and P (P * P).
Definition vars_list.cpp:13
< http://warp.povusers.org/FunctionParser/fparser.html
Definition Context.h:39
void ARRAY_CORRECT_U(kids_complex *U, size_t N)
Definition linalg_1.cpp:132
kids_real ARRAY_INNER_TRANS1(kids_real *B, kids_real *C, size_t N1)
Compute the inner product of the transpose of B with C for real matrices.
Definition linalg.cpp:400
double kids_real
Alias for real number type.
Definition Types.h:59
std::complex< double > kids_complex
Alias for complex number type.
Definition Types.h:60
kids_real ARRAY_INNER_VMV_TRANS1(kids_real *B, kids_real *C, kids_real *D, size_t N1, size_t N2)
Compute the inner product of the transpose of the real vector B with the matrix C,...
Definition linalg.cpp:424
void EigenSolve(kids_real *E, kids_real *T, kids_real *A, size_t N)
Solve the eigenvalue problem for real matrices.
Definition linalg_1.cpp:44
void ARRAY_EXP_MAT_GENERAL(kids_complex *expkA, kids_complex *A, kids_complex k, size_t N)
Definition linalg_1.cpp:97
constexpr std::complex< real_precision > im(0.0L, 1.0L)
Imaginary Unit.
constexpr real_precision twopi
Definition phys.h:31
constexpr dimension7 time_d
[T]
Definition phys.h:187
constexpr uint32_t hash(const char *str)
Definition hash_fnv1a.h:12
declaration of variables used in the program.