19 #include "spline2/MultiBsplineEval.hpp" 36 SplineInst->copy_spline(spline_r, 2 * ispline);
37 SplineInst->copy_spline(spline_i, 2 * ispline + 1);
44 o <<
"spline_" << MyIndex;
45 einspline_engine<SplineType> bigtable(SplineInst->getSplinePtr());
46 return h5f.
readEntry(bigtable, o.str().c_str());
53 o <<
"spline_" << MyIndex;
54 einspline_engine<SplineType> bigtable(SplineInst->getSplinePtr());
55 return h5f.
writeEntry(bigtable, o.str().c_str());
66 last = last > kPoints.size() ? kPoints.size() : last;
68 const ST x = r[0], y = r[1], z = r[2];
69 const ST* restrict kx = myKcart.
data(0);
70 const ST* restrict ky = myKcart.data(1);
71 const ST* restrict kz = myKcart.data(2);
73 TT* restrict psi_s = psi.data() + first_spo;
74 const size_t requested_orb_size = psi.size();
76 for (
size_t j = first; j <
std::min(nComplexBands, last); j++)
79 const size_t jr = j << 1;
80 const size_t ji = jr + 1;
81 const ST val_r = myV[jr];
82 const ST val_i = myV[ji];
84 if (jr < requested_orb_size)
85 psi_s[jr] = val_r * c - val_i *
s;
86 if (ji < requested_orb_size)
87 psi_s[ji] = val_i * c + val_r *
s;
90 psi_s += nComplexBands;
92 for (
size_t j = std::max(nComplexBands, first); j < last; j++)
95 const ST val_r = myV[2 * j];
96 const ST val_i = myV[2 * j + 1];
98 if (j + nComplexBands < requested_orb_size)
99 psi_s[j] = val_r * c - val_i *
s;
103 template<
typename ST>
107 PointType ru(PrimLattice.toUnit_floor(r));
114 spline2::evaluate3d(SplineInst->getSplinePtr(), ru, myV, first, last);
115 assign_v(r, myV, psi, first / 2, last / 2);
119 template<
typename ST>
123 std::vector<TT>& ratios)
125 const bool need_resize = ratios_private.rows() < VP.
getTotalNum();
139 const int first_cplx = first / 2;
140 const int last_cplx = kPoints.size() < last / 2 ? kPoints.size() : last / 2;
145 PointType ru(PrimLattice.toUnit_floor(r));
147 spline2::evaluate3d(SplineInst->getSplinePtr(), ru, myV, first, last);
148 assign_v(r, myV, psi, first_cplx, last_cplx);
150 const int first_real = first_cplx +
std::min(nComplexBands, first_cplx);
151 const int last_real = last_cplx +
std::min(nComplexBands, last_cplx);
152 ratios_private[iat][tid] =
simd::dot(psi.data() + first_real, psiinv.data() + first_real, last_real - first_real);
160 for (
int tid = 0; tid < ratios_private.cols(); tid++)
161 ratios[iat] += ratios_private[iat][tid];
167 template<
typename ST>
176 last = last > kPoints.size() ? kPoints.size() : last;
179 const ST g00 = PrimLattice.G(0), g01 = PrimLattice.G(1), g02 = PrimLattice.G(2), g10 = PrimLattice.G(3),
180 g11 = PrimLattice.G(4), g12 = PrimLattice.G(5), g20 = PrimLattice.G(6), g21 = PrimLattice.G(7),
181 g22 = PrimLattice.G(8);
182 const ST x = r[0], y = r[1], z = r[2];
183 const ST symGG[6] = {GGt[0], GGt[1] + GGt[3], GGt[2] + GGt[6], GGt[4], GGt[5] + GGt[7], GGt[8]};
185 const ST* restrict k0 = myKcart.
data(0);
187 const ST* restrict k1 = myKcart.data(1);
189 const ST* restrict k2 = myKcart.data(2);
192 const ST* restrict g0 = myG.data(0);
194 const ST* restrict g1 = myG.data(1);
196 const ST* restrict g2 = myG.data(2);
198 const ST* restrict h00 = myH.data(0);
200 const ST* restrict h01 = myH.data(1);
202 const ST* restrict h02 = myH.data(2);
204 const ST* restrict h11 = myH.data(3);
206 const ST* restrict h12 = myH.data(4);
208 const ST* restrict h22 = myH.data(5);
211 const size_t requested_orb_size = psi.size();
213 for (
size_t j = first; j <
std::min(nComplexBands, last); j++)
215 const size_t jr = j << 1;
216 const size_t ji = jr + 1;
221 const ST val_r = myV[jr];
222 const ST val_i = myV[ji];
229 const ST dX_r = g00 * g0[jr] + g01 * g1[jr] + g02 * g2[jr];
230 const ST dY_r = g10 * g0[jr] + g11 * g1[jr] + g12 * g2[jr];
231 const ST dZ_r = g20 * g0[jr] + g21 * g1[jr] + g22 * g2[jr];
233 const ST dX_i = g00 * g0[ji] + g01 * g1[ji] + g02 * g2[ji];
234 const ST dY_i = g10 * g0[ji] + g11 * g1[ji] + g12 * g2[ji];
235 const ST dZ_i = g20 * g0[ji] + g21 * g1[ji] + g22 * g2[ji];
238 const ST gX_r = dX_r + val_i * kX;
239 const ST gY_r = dY_r + val_i * kY;
240 const ST gZ_r = dZ_r + val_i * kZ;
241 const ST gX_i = dX_i - val_r * kX;
242 const ST gY_i = dY_i - val_r * kY;
243 const ST gZ_i = dZ_i - val_r * kZ;
245 const ST lcart_r =
SymTrace(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], symGG);
246 const ST lcart_i =
SymTrace(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], symGG);
247 const ST lap_r = lcart_r + mKK[j] * val_r + two * (kX * dX_i + kY * dY_i + kZ * dZ_i);
248 const ST lap_i = lcart_i + mKK[j] * val_i - two * (kX * dX_r + kY * dY_r + kZ * dZ_r);
250 const size_t psiIndex = first_spo + jr;
251 if (psiIndex < requested_orb_size)
253 psi[psiIndex] = c * val_r -
s * val_i;
254 dpsi[psiIndex][0] = c * gX_r -
s * gX_i;
255 dpsi[psiIndex][1] = c * gY_r -
s * gY_i;
256 dpsi[psiIndex][2] = c * gZ_r -
s * gZ_i;
257 d2psi[psiIndex] = c * lap_r -
s * lap_i;
259 if (psiIndex + 1 < requested_orb_size)
261 psi[psiIndex + 1] = c * val_i +
s * val_r;
262 dpsi[psiIndex + 1][0] = c * gX_i +
s * gX_r;
263 dpsi[psiIndex + 1][1] = c * gY_i +
s * gY_r;
264 dpsi[psiIndex + 1][2] = c * gZ_i +
s * gZ_r;
265 d2psi[psiIndex + 1] = c * lap_i +
s * lap_r;
270 for (
size_t j = std::max(nComplexBands, first); j < last; j++)
272 const size_t jr = j << 1;
273 const size_t ji = jr + 1;
278 const ST val_r = myV[jr];
279 const ST val_i = myV[ji];
286 const ST dX_r = g00 * g0[jr] + g01 * g1[jr] + g02 * g2[jr];
287 const ST dY_r = g10 * g0[jr] + g11 * g1[jr] + g12 * g2[jr];
288 const ST dZ_r = g20 * g0[jr] + g21 * g1[jr] + g22 * g2[jr];
290 const ST dX_i = g00 * g0[ji] + g01 * g1[ji] + g02 * g2[ji];
291 const ST dY_i = g10 * g0[ji] + g11 * g1[ji] + g12 * g2[ji];
292 const ST dZ_i = g20 * g0[ji] + g21 * g1[ji] + g22 * g2[ji];
295 const ST gX_r = dX_r + val_i * kX;
296 const ST gY_r = dY_r + val_i * kY;
297 const ST gZ_r = dZ_r + val_i * kZ;
298 const ST gX_i = dX_i - val_r * kX;
299 const ST gY_i = dY_i - val_r * kY;
300 const ST gZ_i = dZ_i - val_r * kZ;
302 if (
const size_t psiIndex = first_spo + nComplexBands + j; psiIndex < requested_orb_size)
304 psi[psiIndex] = c * val_r -
s * val_i;
305 dpsi[psiIndex][0] = c * gX_r -
s * gX_i;
306 dpsi[psiIndex][1] = c * gY_r -
s * gY_i;
307 dpsi[psiIndex][2] = c * gZ_r -
s * gZ_i;
309 const ST lcart_r =
SymTrace(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], symGG);
310 const ST lcart_i =
SymTrace(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], symGG);
311 const ST lap_r = lcart_r + mKK[j] * val_r + two * (kX * dX_i + kY * dY_i + kZ * dZ_i);
312 const ST lap_i = lcart_i + mKK[j] * val_i - two * (kX * dX_r + kY * dY_r + kZ * dZ_r);
313 d2psi[psiIndex] = c * lap_r -
s * lap_i;
320 template<
typename ST>
324 const ST x = r[0], y = r[1], z = r[2];
326 const ST* restrict k0 = myKcart.
data(0);
328 const ST* restrict k1 = myKcart.data(1);
330 const ST* restrict k2 = myKcart.data(2);
333 const ST* restrict g0 = myG.data(0);
335 const ST* restrict g1 = myG.data(1);
337 const ST* restrict g2 = myG.data(2);
340 const size_t N = kPoints.size();
342 const size_t requested_orb_size = psi.size();
344 for (
size_t j = 0; j < nComplexBands; j++)
346 const size_t jr = j << 1;
347 const size_t ji = jr + 1;
352 const ST val_r = myV[jr];
353 const ST val_i = myV[ji];
360 const ST dX_r = g0[jr];
361 const ST dY_r = g1[jr];
362 const ST dZ_r = g2[jr];
364 const ST dX_i = g0[ji];
365 const ST dY_i = g1[ji];
366 const ST dZ_i = g2[ji];
369 const ST gX_r = dX_r + val_i * kX;
370 const ST gY_r = dY_r + val_i * kY;
371 const ST gZ_r = dZ_r + val_i * kZ;
372 const ST gX_i = dX_i - val_r * kX;
373 const ST gY_i = dY_i - val_r * kY;
374 const ST gZ_i = dZ_i - val_r * kZ;
376 const ST lap_r = myL[jr] + mKK[j] * val_r + two * (kX * dX_i + kY * dY_i + kZ * dZ_i);
377 const ST lap_i = myL[ji] + mKK[j] * val_i - two * (kX * dX_r + kY * dY_r + kZ * dZ_r);
379 const size_t psiIndex = first_spo + jr;
380 if (psiIndex < requested_orb_size)
382 psi[psiIndex] = c * val_r -
s * val_i;
383 d2psi[psiIndex] = c * lap_r -
s * lap_i;
384 dpsi[psiIndex][0] = c * gX_r -
s * gX_i;
385 dpsi[psiIndex][1] = c * gY_r -
s * gY_i;
386 dpsi[psiIndex][2] = c * gZ_r -
s * gZ_i;
388 if (psiIndex + 1 < requested_orb_size)
390 psi[psiIndex + 1] = c * val_i +
s * val_r;
391 d2psi[psiIndex + 1] = c * lap_i +
s * lap_r;
392 dpsi[psiIndex + 1][0] = c * gX_i +
s * gX_r;
393 dpsi[psiIndex + 1][1] = c * gY_i +
s * gY_r;
394 dpsi[psiIndex + 1][2] = c * gZ_i +
s * gZ_r;
399 for (
size_t j = nComplexBands; j <
N; j++)
401 const size_t jr = j << 1;
402 const size_t ji = jr + 1;
407 const ST val_r = myV[jr];
408 const ST val_i = myV[ji];
415 const ST dX_r = g0[jr];
416 const ST dY_r = g1[jr];
417 const ST dZ_r = g2[jr];
419 const ST dX_i = g0[ji];
420 const ST dY_i = g1[ji];
421 const ST dZ_i = g2[ji];
424 const ST gX_r = dX_r + val_i * kX;
425 const ST gY_r = dY_r + val_i * kY;
426 const ST gZ_r = dZ_r + val_i * kZ;
427 const ST gX_i = dX_i - val_r * kX;
428 const ST gY_i = dY_i - val_r * kY;
429 const ST gZ_i = dZ_i - val_r * kZ;
430 if (
const size_t psiIndex = first_spo + nComplexBands + j; psiIndex < requested_orb_size)
432 psi[psiIndex] = c * val_r -
s * val_i;
433 dpsi[psiIndex][0] = c * gX_r -
s * gX_i;
434 dpsi[psiIndex][1] = c * gY_r -
s * gY_i;
435 dpsi[psiIndex][2] = c * gZ_r -
s * gZ_i;
437 const ST lap_r = myL[jr] + mKK[j] * val_r + two * (kX * dX_i + kY * dY_i + kZ * dZ_i);
438 const ST lap_i = myL[ji] + mKK[j] * val_i - two * (kX * dX_r + kY * dY_r + kZ * dZ_r);
439 d2psi[psiIndex] = c * lap_r -
s * lap_i;
444 template<
typename ST>
452 PointType ru(PrimLattice.toUnit_floor(r));
459 spline2::evaluate3d_vgh(SplineInst->getSplinePtr(), ru, myV, myG, myH, first, last);
460 assign_vgl(r, psi, dpsi, d2psi, first / 2, last / 2);
464 template<
typename ST>
473 last = last > kPoints.size() ? kPoints.size() : last;
475 const ST g00 = PrimLattice.G(0), g01 = PrimLattice.G(1), g02 = PrimLattice.G(2), g10 = PrimLattice.G(3),
476 g11 = PrimLattice.G(4), g12 = PrimLattice.G(5), g20 = PrimLattice.G(6), g21 = PrimLattice.G(7),
477 g22 = PrimLattice.G(8);
478 const ST x = r[0], y = r[1], z = r[2];
480 const ST* restrict k0 = myKcart.
data(0);
481 const ST* restrict k1 = myKcart.data(1);
482 const ST* restrict k2 = myKcart.data(2);
484 const ST* restrict g0 = myG.data(0);
485 const ST* restrict g1 = myG.data(1);
486 const ST* restrict g2 = myG.data(2);
487 const ST* restrict h00 = myH.data(0);
488 const ST* restrict h01 = myH.data(1);
489 const ST* restrict h02 = myH.data(2);
490 const ST* restrict h11 = myH.data(3);
491 const ST* restrict h12 = myH.data(4);
492 const ST* restrict h22 = myH.data(5);
494 const size_t requested_orb_size = psi.size();
496 for (
size_t j = first; j <
std::min(nComplexBands, last); j++)
504 const ST val_r = myV[jr];
505 const ST val_i = myV[ji];
512 const ST dX_r = g00 * g0[jr] + g01 * g1[jr] + g02 * g2[jr];
513 const ST dY_r = g10 * g0[jr] + g11 * g1[jr] + g12 * g2[jr];
514 const ST dZ_r = g20 * g0[jr] + g21 * g1[jr] + g22 * g2[jr];
516 const ST dX_i = g00 * g0[ji] + g01 * g1[ji] + g02 * g2[ji];
517 const ST dY_i = g10 * g0[ji] + g11 * g1[ji] + g12 * g2[ji];
518 const ST dZ_i = g20 * g0[ji] + g21 * g1[ji] + g22 * g2[ji];
521 const ST gX_r = dX_r + val_i * kX;
522 const ST gY_r = dY_r + val_i * kY;
523 const ST gZ_r = dZ_r + val_i * kZ;
524 const ST gX_i = dX_i - val_r * kX;
525 const ST gY_i = dY_i - val_r * kY;
526 const ST gZ_i = dZ_i - val_r * kZ;
528 const size_t psiIndex = first_spo + jr;
529 if (psiIndex < requested_orb_size)
531 psi[psiIndex] = c * val_r -
s * val_i;
532 dpsi[psiIndex][0] = c * gX_r -
s * gX_i;
533 dpsi[psiIndex][1] = c * gY_r -
s * gY_i;
534 dpsi[psiIndex][2] = c * gZ_r -
s * gZ_i;
536 if (psiIndex + 1 < requested_orb_size)
538 psi[psiIndex + 1] = c * val_i +
s * val_r;
539 dpsi[psiIndex + 1][0] = c * gX_i +
s * gX_r;
540 dpsi[psiIndex + 1][1] = c * gY_i +
s * gY_r;
541 dpsi[psiIndex + 1][2] = c * gZ_i +
s * gZ_r;
545 v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g00, g01, g02, g00, g01, g02) + kX * (gX_i + dX_i);
547 v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g00, g01, g02, g10, g11, g12) + kX * (gY_i + dY_i);
549 v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g00, g01, g02, g20, g21, g22) + kX * (gZ_i + dZ_i);
551 v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g10, g11, g12, g00, g01, g02) + kY * (gX_i + dX_i);
553 v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g10, g11, g12, g10, g11, g12) + kY * (gY_i + dY_i);
555 v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g10, g11, g12, g20, g21, g22) + kY * (gZ_i + dZ_i);
557 v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g20, g21, g22, g00, g01, g02) + kZ * (gX_i + dX_i);
559 v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g20, g21, g22, g10, g11, g12) + kZ * (gY_i + dY_i);
561 v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g20, g21, g22, g20, g21, g22) + kZ * (gZ_i + dZ_i);
564 v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g00, g01, g02, g00, g01, g02) - kX * (gX_r + dX_r);
566 v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g00, g01, g02, g10, g11, g12) - kX * (gY_r + dY_r);
568 v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g00, g01, g02, g20, g21, g22) - kX * (gZ_r + dZ_r);
570 v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g10, g11, g12, g00, g01, g02) - kY * (gX_r + dX_r);
572 v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g10, g11, g12, g10, g11, g12) - kY * (gY_r + dY_r);
574 v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g10, g11, g12, g20, g21, g22) - kY * (gZ_r + dZ_r);
576 v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g20, g21, g22, g00, g01, g02) - kZ * (gX_r + dX_r);
578 v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g20, g21, g22, g10, g11, g12) - kZ * (gY_r + dY_r);
580 v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g20, g21, g22, g20, g21, g22) - kZ * (gZ_r + dZ_r);
582 if (psiIndex < requested_orb_size)
584 grad_grad_psi[psiIndex][0] = c * h_xx_r -
s * h_xx_i;
585 grad_grad_psi[psiIndex][1] = c * h_xy_r -
s * h_xy_i;
586 grad_grad_psi[psiIndex][2] = c * h_xz_r -
s * h_xz_i;
587 grad_grad_psi[psiIndex][3] = c * h_yx_r -
s * h_yx_i;
588 grad_grad_psi[psiIndex][4] = c * h_yy_r -
s * h_yy_i;
589 grad_grad_psi[psiIndex][5] = c * h_yz_r -
s * h_yz_i;
590 grad_grad_psi[psiIndex][6] = c * h_zx_r -
s * h_zx_i;
591 grad_grad_psi[psiIndex][7] = c * h_zy_r -
s * h_zy_i;
592 grad_grad_psi[psiIndex][8] = c * h_zz_r -
s * h_zz_i;
594 if (psiIndex + 1 < requested_orb_size)
596 grad_grad_psi[psiIndex + 1][0] = c * h_xx_i +
s * h_xx_r;
597 grad_grad_psi[psiIndex + 1][1] = c * h_xy_i +
s * h_xy_r;
598 grad_grad_psi[psiIndex + 1][2] = c * h_xz_i +
s * h_xz_r;
599 grad_grad_psi[psiIndex + 1][3] = c * h_yx_i +
s * h_yx_r;
600 grad_grad_psi[psiIndex + 1][4] = c * h_yy_i +
s * h_yy_r;
601 grad_grad_psi[psiIndex + 1][5] = c * h_yz_i +
s * h_yz_r;
602 grad_grad_psi[psiIndex + 1][6] = c * h_zx_i +
s * h_zx_r;
603 grad_grad_psi[psiIndex + 1][7] = c * h_zy_i +
s * h_zy_r;
604 grad_grad_psi[psiIndex + 1][8] = c * h_zz_i +
s * h_zz_r;
609 for (
size_t j = std::max(nComplexBands, first); j < last; j++)
617 const ST val_r = myV[jr];
618 const ST val_i = myV[ji];
625 const ST dX_r = g00 * g0[jr] + g01 * g1[jr] + g02 * g2[jr];
626 const ST dY_r = g10 * g0[jr] + g11 * g1[jr] + g12 * g2[jr];
627 const ST dZ_r = g20 * g0[jr] + g21 * g1[jr] + g22 * g2[jr];
629 const ST dX_i = g00 * g0[ji] + g01 * g1[ji] + g02 * g2[ji];
630 const ST dY_i = g10 * g0[ji] + g11 * g1[ji] + g12 * g2[ji];
631 const ST dZ_i = g20 * g0[ji] + g21 * g1[ji] + g22 * g2[ji];
634 const ST gX_r = dX_r + val_i * kX;
635 const ST gY_r = dY_r + val_i * kY;
636 const ST gZ_r = dZ_r + val_i * kZ;
637 const ST gX_i = dX_i - val_r * kX;
638 const ST gY_i = dY_i - val_r * kY;
639 const ST gZ_i = dZ_i - val_r * kZ;
641 if (
const size_t psiIndex = first_spo + nComplexBands + j; psiIndex < requested_orb_size)
643 psi[psiIndex] = c * val_r -
s * val_i;
644 dpsi[psiIndex][0] = c * gX_r -
s * gX_i;
645 dpsi[psiIndex][1] = c * gY_r -
s * gY_i;
646 dpsi[psiIndex][2] = c * gZ_r -
s * gZ_i;
648 const ST h_xx_r =
v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g00, g01, g02, g00, g01, g02) +
650 const ST h_xy_r =
v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g00, g01, g02, g10, g11, g12) +
652 const ST h_xz_r =
v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g00, g01, g02, g20, g21, g22) +
654 const ST h_yx_r =
v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g10, g11, g12, g00, g01, g02) +
656 const ST h_yy_r =
v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g10, g11, g12, g10, g11, g12) +
658 const ST h_yz_r =
v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g10, g11, g12, g20, g21, g22) +
660 const ST h_zx_r =
v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g20, g21, g22, g00, g01, g02) +
662 const ST h_zy_r =
v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g20, g21, g22, g10, g11, g12) +
664 const ST h_zz_r =
v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g20, g21, g22, g20, g21, g22) +
667 const ST h_xx_i =
v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g00, g01, g02, g00, g01, g02) -
669 const ST h_xy_i =
v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g00, g01, g02, g10, g11, g12) -
671 const ST h_xz_i =
v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g00, g01, g02, g20, g21, g22) -
673 const ST h_yx_i =
v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g10, g11, g12, g00, g01, g02) -
675 const ST h_yy_i =
v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g10, g11, g12, g10, g11, g12) -
677 const ST h_yz_i =
v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g10, g11, g12, g20, g21, g22) -
679 const ST h_zx_i =
v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g20, g21, g22, g00, g01, g02) -
681 const ST h_zy_i =
v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g20, g21, g22, g10, g11, g12) -
683 const ST h_zz_i =
v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g20, g21, g22, g20, g21, g22) -
686 grad_grad_psi[psiIndex][0] = c * h_xx_r -
s * h_xx_i;
687 grad_grad_psi[psiIndex][1] = c * h_xy_r -
s * h_xy_i;
688 grad_grad_psi[psiIndex][2] = c * h_xz_r -
s * h_xz_i;
689 grad_grad_psi[psiIndex][3] = c * h_yx_r -
s * h_yx_i;
690 grad_grad_psi[psiIndex][4] = c * h_yy_r -
s * h_yy_i;
691 grad_grad_psi[psiIndex][5] = c * h_yz_r -
s * h_yz_i;
692 grad_grad_psi[psiIndex][6] = c * h_zx_r -
s * h_zx_i;
693 grad_grad_psi[psiIndex][7] = c * h_zy_r -
s * h_zy_i;
694 grad_grad_psi[psiIndex][8] = c * h_zz_r -
s * h_zz_i;
699 template<
typename ST>
707 PointType ru(PrimLattice.toUnit_floor(r));
713 spline2::evaluate3d_vgh(SplineInst->getSplinePtr(), ru, myV, myG, myH, first, last);
714 assign_vgh(r, psi, dpsi, grad_grad_psi, first / 2, last / 2);
718 template<
typename ST>
728 last = last < 0 ? kPoints.size() : (last > kPoints.size() ? kPoints.size() : last);
730 const ST g00 = PrimLattice.G(0), g01 = PrimLattice.G(1), g02 = PrimLattice.G(2), g10 = PrimLattice.G(3),
731 g11 = PrimLattice.G(4), g12 = PrimLattice.G(5), g20 = PrimLattice.G(6), g21 = PrimLattice.G(7),
732 g22 = PrimLattice.G(8);
733 const ST x = r[0], y = r[1], z = r[2];
735 const ST* restrict k0 = myKcart.
data(0);
736 const ST* restrict k1 = myKcart.data(1);
737 const ST* restrict k2 = myKcart.data(2);
739 const ST* restrict g0 = myG.data(0);
740 const ST* restrict g1 = myG.data(1);
741 const ST* restrict g2 = myG.data(2);
742 const ST* restrict h00 = myH.data(0);
743 const ST* restrict h01 = myH.data(1);
744 const ST* restrict h02 = myH.data(2);
745 const ST* restrict h11 = myH.data(3);
746 const ST* restrict h12 = myH.data(4);
747 const ST* restrict h22 = myH.data(5);
749 const ST* restrict gh000 = mygH.data(0);
750 const ST* restrict gh001 = mygH.data(1);
751 const ST* restrict gh002 = mygH.data(2);
752 const ST* restrict gh011 = mygH.data(3);
753 const ST* restrict gh012 = mygH.data(4);
754 const ST* restrict gh022 = mygH.data(5);
755 const ST* restrict gh111 = mygH.data(6);
756 const ST* restrict gh112 = mygH.data(7);
757 const ST* restrict gh122 = mygH.data(8);
758 const ST* restrict gh222 = mygH.data(9);
760 const size_t requested_orb_size = psi.size();
763 for (
size_t j = first; j <
std::min(nComplexBands, last); j++)
771 const ST val_r = myV[jr];
772 const ST val_i = myV[ji];
779 const ST dX_r = g00 * g0[jr] + g01 * g1[jr] + g02 * g2[jr];
780 const ST dY_r = g10 * g0[jr] + g11 * g1[jr] + g12 * g2[jr];
781 const ST dZ_r = g20 * g0[jr] + g21 * g1[jr] + g22 * g2[jr];
783 const ST dX_i = g00 * g0[ji] + g01 * g1[ji] + g02 * g2[ji];
784 const ST dY_i = g10 * g0[ji] + g11 * g1[ji] + g12 * g2[ji];
785 const ST dZ_i = g20 * g0[ji] + g21 * g1[ji] + g22 * g2[ji];
788 const ST gX_r = dX_r + val_i * kX;
789 const ST gY_r = dY_r + val_i * kY;
790 const ST gZ_r = dZ_r + val_i * kZ;
791 const ST gX_i = dX_i - val_r * kX;
792 const ST gY_i = dY_i - val_r * kY;
793 const ST gZ_i = dZ_i - val_r * kZ;
795 const size_t psiIndex = first_spo + jr;
796 if (psiIndex < requested_orb_size)
798 psi[psiIndex] = c * val_r -
s * val_i;
799 dpsi[psiIndex][0] = c * gX_r -
s * gX_i;
800 dpsi[psiIndex][1] = c * gY_r -
s * gY_i;
801 dpsi[psiIndex][2] = c * gZ_r -
s * gZ_i;
803 if (psiIndex + 1 < requested_orb_size)
805 psi[psiIndex + 1] = c * val_i +
s * val_r;
806 dpsi[psiIndex + 1][0] = c * gX_i +
s * gX_r;
807 dpsi[psiIndex + 1][1] = c * gY_i +
s * gY_r;
808 dpsi[psiIndex + 1][2] = c * gZ_i +
s * gZ_r;
812 const ST f_xx_r =
v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g00, g01, g02, g00, g01, g02);
813 const ST f_xy_r =
v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g00, g01, g02, g10, g11, g12);
814 const ST f_xz_r =
v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g00, g01, g02, g20, g21, g22);
815 const ST f_yy_r =
v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g10, g11, g12, g10, g11, g12);
816 const ST f_yz_r =
v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g10, g11, g12, g20, g21, g22);
817 const ST f_zz_r =
v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g20, g21, g22, g20, g21, g22);
819 const ST f_xx_i =
v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g00, g01, g02, g00, g01, g02);
820 const ST f_xy_i =
v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g00, g01, g02, g10, g11, g12);
821 const ST f_xz_i =
v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g00, g01, g02, g20, g21, g22);
822 const ST f_yy_i =
v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g10, g11, g12, g10, g11, g12);
823 const ST f_yz_i =
v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g10, g11, g12, g20, g21, g22);
824 const ST f_zz_i =
v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g20, g21, g22, g20, g21, g22);
826 const ST h_xx_r = f_xx_r + 2 * kX * dX_i - kX * kX * val_r;
827 const ST h_xy_r = f_xy_r + (kX * dY_i + kY * dX_i) - kX * kY * val_r;
828 const ST h_xz_r = f_xz_r + (kX * dZ_i + kZ * dX_i) - kX * kZ * val_r;
829 const ST h_yy_r = f_yy_r + 2 * kY * dY_i - kY * kY * val_r;
830 const ST h_yz_r = f_yz_r + (kY * dZ_i + kZ * dY_i) - kY * kZ * val_r;
831 const ST h_zz_r = f_zz_r + 2 * kZ * dZ_i - kZ * kZ * val_r;
833 const ST h_xx_i = f_xx_i - 2 * kX * dX_r - kX * kX * val_i;
834 const ST h_xy_i = f_xy_i - (kX * dY_r + kY * dX_r) - kX * kY * val_i;
835 const ST h_xz_i = f_xz_i - (kX * dZ_r + kZ * dX_r) - kX * kZ * val_i;
836 const ST h_yy_i = f_yy_i - 2 * kY * dY_r - kY * kY * val_i;
837 const ST h_yz_i = f_yz_i - (kZ * dY_r + kY * dZ_r) - kZ * kY * val_i;
838 const ST h_zz_i = f_zz_i - 2 * kZ * dZ_r - kZ * kZ * val_i;
840 if (psiIndex < requested_orb_size)
842 grad_grad_psi[psiIndex][0] = c * h_xx_r -
s * h_xx_i;
843 grad_grad_psi[psiIndex][1] = c * h_xy_r -
s * h_xy_i;
844 grad_grad_psi[psiIndex][2] = c * h_xz_r -
s * h_xz_i;
845 grad_grad_psi[psiIndex][3] = c * h_xy_r -
s * h_xy_i;
846 grad_grad_psi[psiIndex][4] = c * h_yy_r -
s * h_yy_i;
847 grad_grad_psi[psiIndex][5] = c * h_yz_r -
s * h_yz_i;
848 grad_grad_psi[psiIndex][6] = c * h_xz_r -
s * h_xz_i;
849 grad_grad_psi[psiIndex][7] = c * h_yz_r -
s * h_yz_i;
850 grad_grad_psi[psiIndex][8] = c * h_zz_r -
s * h_zz_i;
853 if (psiIndex + 1 < requested_orb_size)
855 grad_grad_psi[psiIndex + 1][0] = c * h_xx_i +
s * h_xx_r;
856 grad_grad_psi[psiIndex + 1][1] = c * h_xy_i +
s * h_xy_r;
857 grad_grad_psi[psiIndex + 1][2] = c * h_xz_i +
s * h_xz_r;
858 grad_grad_psi[psiIndex + 1][3] = c * h_xy_i +
s * h_xy_r;
859 grad_grad_psi[psiIndex + 1][4] = c * h_yy_i +
s * h_yy_r;
860 grad_grad_psi[psiIndex + 1][5] = c * h_yz_i +
s * h_yz_r;
861 grad_grad_psi[psiIndex + 1][6] = c * h_xz_i +
s * h_xz_r;
862 grad_grad_psi[psiIndex + 1][7] = c * h_yz_i +
s * h_yz_r;
863 grad_grad_psi[psiIndex + 1][8] = c * h_zz_i +
s * h_zz_r;
869 const ST f3_xxx_r =
t3_contract(gh000[jr], gh001[jr], gh002[jr], gh011[jr], gh012[jr], gh022[jr], gh111[jr],
870 gh112[jr], gh122[jr], gh222[jr], g00, g01, g02, g00, g01, g02, g00, g01, g02);
871 const ST f3_xxy_r =
t3_contract(gh000[jr], gh001[jr], gh002[jr], gh011[jr], gh012[jr], gh022[jr], gh111[jr],
872 gh112[jr], gh122[jr], gh222[jr], g00, g01, g02, g00, g01, g02, g10, g11, g12);
873 const ST f3_xxz_r =
t3_contract(gh000[jr], gh001[jr], gh002[jr], gh011[jr], gh012[jr], gh022[jr], gh111[jr],
874 gh112[jr], gh122[jr], gh222[jr], g00, g01, g02, g00, g01, g02, g20, g21, g22);
875 const ST f3_xyy_r =
t3_contract(gh000[jr], gh001[jr], gh002[jr], gh011[jr], gh012[jr], gh022[jr], gh111[jr],
876 gh112[jr], gh122[jr], gh222[jr], g00, g01, g02, g10, g11, g12, g10, g11, g12);
877 const ST f3_xyz_r =
t3_contract(gh000[jr], gh001[jr], gh002[jr], gh011[jr], gh012[jr], gh022[jr], gh111[jr],
878 gh112[jr], gh122[jr], gh222[jr], g00, g01, g02, g10, g11, g12, g20, g21, g22);
879 const ST f3_xzz_r =
t3_contract(gh000[jr], gh001[jr], gh002[jr], gh011[jr], gh012[jr], gh022[jr], gh111[jr],
880 gh112[jr], gh122[jr], gh222[jr], g00, g01, g02, g20, g21, g22, g20, g21, g22);
881 const ST f3_yyy_r =
t3_contract(gh000[jr], gh001[jr], gh002[jr], gh011[jr], gh012[jr], gh022[jr], gh111[jr],
882 gh112[jr], gh122[jr], gh222[jr], g10, g11, g12, g10, g11, g12, g10, g11, g12);
883 const ST f3_yyz_r =
t3_contract(gh000[jr], gh001[jr], gh002[jr], gh011[jr], gh012[jr], gh022[jr], gh111[jr],
884 gh112[jr], gh122[jr], gh222[jr], g10, g11, g12, g10, g11, g12, g20, g21, g22);
885 const ST f3_yzz_r =
t3_contract(gh000[jr], gh001[jr], gh002[jr], gh011[jr], gh012[jr], gh022[jr], gh111[jr],
886 gh112[jr], gh122[jr], gh222[jr], g10, g11, g12, g20, g21, g22, g20, g21, g22);
887 const ST f3_zzz_r =
t3_contract(gh000[jr], gh001[jr], gh002[jr], gh011[jr], gh012[jr], gh022[jr], gh111[jr],
888 gh112[jr], gh122[jr], gh222[jr], g20, g21, g22, g20, g21, g22, g20, g21, g22);
890 const ST f3_xxx_i =
t3_contract(gh000[ji], gh001[ji], gh002[ji], gh011[ji], gh012[ji], gh022[ji], gh111[ji],
891 gh112[ji], gh122[ji], gh222[ji], g00, g01, g02, g00, g01, g02, g00, g01, g02);
892 const ST f3_xxy_i =
t3_contract(gh000[ji], gh001[ji], gh002[ji], gh011[ji], gh012[ji], gh022[ji], gh111[ji],
893 gh112[ji], gh122[ji], gh222[ji], g00, g01, g02, g00, g01, g02, g10, g11, g12);
894 const ST f3_xxz_i =
t3_contract(gh000[ji], gh001[ji], gh002[ji], gh011[ji], gh012[ji], gh022[ji], gh111[ji],
895 gh112[ji], gh122[ji], gh222[ji], g00, g01, g02, g00, g01, g02, g20, g21, g22);
896 const ST f3_xyy_i =
t3_contract(gh000[ji], gh001[ji], gh002[ji], gh011[ji], gh012[ji], gh022[ji], gh111[ji],
897 gh112[ji], gh122[ji], gh222[ji], g00, g01, g02, g10, g11, g12, g10, g11, g12);
898 const ST f3_xyz_i =
t3_contract(gh000[ji], gh001[ji], gh002[ji], gh011[ji], gh012[ji], gh022[ji], gh111[ji],
899 gh112[ji], gh122[ji], gh222[ji], g00, g01, g02, g10, g11, g12, g20, g21, g22);
900 const ST f3_xzz_i =
t3_contract(gh000[ji], gh001[ji], gh002[ji], gh011[ji], gh012[ji], gh022[ji], gh111[ji],
901 gh112[ji], gh122[ji], gh222[ji], g00, g01, g02, g20, g21, g22, g20, g21, g22);
902 const ST f3_yyy_i =
t3_contract(gh000[ji], gh001[ji], gh002[ji], gh011[ji], gh012[ji], gh022[ji], gh111[ji],
903 gh112[ji], gh122[ji], gh222[ji], g10, g11, g12, g10, g11, g12, g10, g11, g12);
904 const ST f3_yyz_i =
t3_contract(gh000[ji], gh001[ji], gh002[ji], gh011[ji], gh012[ji], gh022[ji], gh111[ji],
905 gh112[ji], gh122[ji], gh222[ji], g10, g11, g12, g10, g11, g12, g20, g21, g22);
906 const ST f3_yzz_i =
t3_contract(gh000[ji], gh001[ji], gh002[ji], gh011[ji], gh012[ji], gh022[ji], gh111[ji],
907 gh112[ji], gh122[ji], gh222[ji], g10, g11, g12, g20, g21, g22, g20, g21, g22);
908 const ST f3_zzz_i =
t3_contract(gh000[ji], gh001[ji], gh002[ji], gh011[ji], gh012[ji], gh022[ji], gh111[ji],
909 gh112[ji], gh122[ji], gh222[ji], g20, g21, g22, g20, g21, g22, g20, g21, g22);
912 const ST gh_xxx_r = f3_xxx_r + 3 * kX * f_xx_i - 3 * kX * kX * dX_r - kX * kX * kX * val_i;
913 const ST gh_xxx_i = f3_xxx_i - 3 * kX * f_xx_r - 3 * kX * kX * dX_i + kX * kX * kX * val_r;
915 f3_xxy_r + (kY * f_xx_i + 2 * kX * f_xy_i) - (kX * kX * dY_r + 2 * kX * kY * dX_r) - kX * kX * kY * val_i;
917 f3_xxy_i - (kY * f_xx_r + 2 * kX * f_xy_r) - (kX * kX * dY_i + 2 * kX * kY * dX_i) + kX * kX * kY * val_r;
919 f3_xxz_r + (kZ * f_xx_i + 2 * kX * f_xz_i) - (kX * kX * dZ_r + 2 * kX * kZ * dX_r) - kX * kX * kZ * val_i;
921 f3_xxz_i - (kZ * f_xx_r + 2 * kX * f_xz_r) - (kX * kX * dZ_i + 2 * kX * kZ * dX_i) + kX * kX * kZ * val_r;
923 f3_xyy_r + (2 * kY * f_xy_i + kX * f_yy_i) - (2 * kX * kY * dY_r + kY * kY * dX_r) - kX * kY * kY * val_i;
925 f3_xyy_i - (2 * kY * f_xy_r + kX * f_yy_r) - (2 * kX * kY * dY_i + kY * kY * dX_i) + kX * kY * kY * val_r;
926 const ST gh_xyz_r = f3_xyz_r + (kX * f_yz_i + kY * f_xz_i + kZ * f_xy_i) -
927 (kX * kY * dZ_r + kY * kZ * dX_r + kZ * kX * dY_r) - kX * kY * kZ * val_i;
928 const ST gh_xyz_i = f3_xyz_i - (kX * f_yz_r + kY * f_xz_r + kZ * f_xy_r) -
929 (kX * kY * dZ_i + kY * kZ * dX_i + kZ * kX * dY_i) + kX * kY * kZ * val_r;
931 f3_xzz_r + (2 * kZ * f_xz_i + kX * f_zz_i) - (2 * kX * kZ * dZ_r + kZ * kZ * dX_r) - kX * kZ * kZ * val_i;
933 f3_xzz_i - (2 * kZ * f_xz_r + kX * f_zz_r) - (2 * kX * kZ * dZ_i + kZ * kZ * dX_i) + kX * kZ * kZ * val_r;
934 const ST gh_yyy_r = f3_yyy_r + 3 * kY * f_yy_i - 3 * kY * kY * dY_r - kY * kY * kY * val_i;
935 const ST gh_yyy_i = f3_yyy_i - 3 * kY * f_yy_r - 3 * kY * kY * dY_i + kY * kY * kY * val_r;
937 f3_yyz_r + (kZ * f_yy_i + 2 * kY * f_yz_i) - (kY * kY * dZ_r + 2 * kY * kZ * dY_r) - kY * kY * kZ * val_i;
939 f3_yyz_i - (kZ * f_yy_r + 2 * kY * f_yz_r) - (kY * kY * dZ_i + 2 * kY * kZ * dY_i) + kY * kY * kZ * val_r;
941 f3_yzz_r + (2 * kZ * f_yz_i + kY * f_zz_i) - (2 * kY * kZ * dZ_r + kZ * kZ * dY_r) - kY * kZ * kZ * val_i;
943 f3_yzz_i - (2 * kZ * f_yz_r + kY * f_zz_r) - (2 * kY * kZ * dZ_i + kZ * kZ * dY_i) + kY * kZ * kZ * val_r;
944 const ST gh_zzz_r = f3_zzz_r + 3 * kZ * f_zz_i - 3 * kZ * kZ * dZ_r - kZ * kZ * kZ * val_i;
945 const ST gh_zzz_i = f3_zzz_i - 3 * kZ * f_zz_r - 3 * kZ * kZ * dZ_i + kZ * kZ * kZ * val_r;
947 if (psiIndex < requested_orb_size)
949 grad_grad_grad_psi[psiIndex][0][0] = c * gh_xxx_r -
s * gh_xxx_i;
950 grad_grad_grad_psi[psiIndex][0][1] = c * gh_xxy_r -
s * gh_xxy_i;
951 grad_grad_grad_psi[psiIndex][0][2] = c * gh_xxz_r -
s * gh_xxz_i;
952 grad_grad_grad_psi[psiIndex][0][3] = c * gh_xxy_r -
s * gh_xxy_i;
953 grad_grad_grad_psi[psiIndex][0][4] = c * gh_xyy_r -
s * gh_xyy_i;
954 grad_grad_grad_psi[psiIndex][0][5] = c * gh_xyz_r -
s * gh_xyz_i;
955 grad_grad_grad_psi[psiIndex][0][6] = c * gh_xxz_r -
s * gh_xxz_i;
956 grad_grad_grad_psi[psiIndex][0][7] = c * gh_xyz_r -
s * gh_xyz_i;
957 grad_grad_grad_psi[psiIndex][0][8] = c * gh_xzz_r -
s * gh_xzz_i;
959 grad_grad_grad_psi[psiIndex][1][0] = c * gh_xxy_r -
s * gh_xxy_i;
960 grad_grad_grad_psi[psiIndex][1][1] = c * gh_xyy_r -
s * gh_xyy_i;
961 grad_grad_grad_psi[psiIndex][1][2] = c * gh_xyz_r -
s * gh_xyz_i;
962 grad_grad_grad_psi[psiIndex][1][3] = c * gh_xyy_r -
s * gh_xyy_i;
963 grad_grad_grad_psi[psiIndex][1][4] = c * gh_yyy_r -
s * gh_yyy_i;
964 grad_grad_grad_psi[psiIndex][1][5] = c * gh_yyz_r -
s * gh_yyz_i;
965 grad_grad_grad_psi[psiIndex][1][6] = c * gh_xyz_r -
s * gh_xyz_i;
966 grad_grad_grad_psi[psiIndex][1][7] = c * gh_yyz_r -
s * gh_yyz_i;
967 grad_grad_grad_psi[psiIndex][1][8] = c * gh_yzz_r -
s * gh_yzz_i;
969 grad_grad_grad_psi[psiIndex][2][0] = c * gh_xxz_r -
s * gh_xxz_i;
970 grad_grad_grad_psi[psiIndex][2][1] = c * gh_xyz_r -
s * gh_xyz_i;
971 grad_grad_grad_psi[psiIndex][2][2] = c * gh_xzz_r -
s * gh_xzz_i;
972 grad_grad_grad_psi[psiIndex][2][3] = c * gh_xyz_r -
s * gh_xyz_i;
973 grad_grad_grad_psi[psiIndex][2][4] = c * gh_yyz_r -
s * gh_yyz_i;
974 grad_grad_grad_psi[psiIndex][2][5] = c * gh_yzz_r -
s * gh_yzz_i;
975 grad_grad_grad_psi[psiIndex][2][6] = c * gh_xzz_r -
s * gh_xzz_i;
976 grad_grad_grad_psi[psiIndex][2][7] = c * gh_yzz_r -
s * gh_yzz_i;
977 grad_grad_grad_psi[psiIndex][2][8] = c * gh_zzz_r -
s * gh_zzz_i;
980 if (psiIndex + 1 < requested_orb_size)
982 grad_grad_grad_psi[psiIndex + 1][0][0] = c * gh_xxx_i +
s * gh_xxx_r;
983 grad_grad_grad_psi[psiIndex + 1][0][1] = c * gh_xxy_i +
s * gh_xxy_r;
984 grad_grad_grad_psi[psiIndex + 1][0][2] = c * gh_xxz_i +
s * gh_xxz_r;
985 grad_grad_grad_psi[psiIndex + 1][0][3] = c * gh_xxy_i +
s * gh_xxy_r;
986 grad_grad_grad_psi[psiIndex + 1][0][4] = c * gh_xyy_i +
s * gh_xyy_r;
987 grad_grad_grad_psi[psiIndex + 1][0][5] = c * gh_xyz_i +
s * gh_xyz_r;
988 grad_grad_grad_psi[psiIndex + 1][0][6] = c * gh_xxz_i +
s * gh_xxz_r;
989 grad_grad_grad_psi[psiIndex + 1][0][7] = c * gh_xyz_i +
s * gh_xyz_r;
990 grad_grad_grad_psi[psiIndex + 1][0][8] = c * gh_xzz_i +
s * gh_xzz_r;
992 grad_grad_grad_psi[psiIndex + 1][1][0] = c * gh_xxy_i +
s * gh_xxy_r;
993 grad_grad_grad_psi[psiIndex + 1][1][1] = c * gh_xyy_i +
s * gh_xyy_r;
994 grad_grad_grad_psi[psiIndex + 1][1][2] = c * gh_xyz_i +
s * gh_xyz_r;
995 grad_grad_grad_psi[psiIndex + 1][1][3] = c * gh_xyy_i +
s * gh_xyy_r;
996 grad_grad_grad_psi[psiIndex + 1][1][4] = c * gh_yyy_i +
s * gh_yyy_r;
997 grad_grad_grad_psi[psiIndex + 1][1][5] = c * gh_yyz_i +
s * gh_yyz_r;
998 grad_grad_grad_psi[psiIndex + 1][1][6] = c * gh_xyz_i +
s * gh_xyz_r;
999 grad_grad_grad_psi[psiIndex + 1][1][7] = c * gh_yyz_i +
s * gh_yyz_r;
1000 grad_grad_grad_psi[psiIndex + 1][1][8] = c * gh_yzz_i +
s * gh_yzz_r;
1002 grad_grad_grad_psi[psiIndex + 1][2][0] = c * gh_xxz_i +
s * gh_xxz_r;
1003 grad_grad_grad_psi[psiIndex + 1][2][1] = c * gh_xyz_i +
s * gh_xyz_r;
1004 grad_grad_grad_psi[psiIndex + 1][2][2] = c * gh_xzz_i +
s * gh_xzz_r;
1005 grad_grad_grad_psi[psiIndex + 1][2][3] = c * gh_xyz_i +
s * gh_xyz_r;
1006 grad_grad_grad_psi[psiIndex + 1][2][4] = c * gh_yyz_i +
s * gh_yyz_r;
1007 grad_grad_grad_psi[psiIndex + 1][2][5] = c * gh_yzz_i +
s * gh_yzz_r;
1008 grad_grad_grad_psi[psiIndex + 1][2][6] = c * gh_xzz_i +
s * gh_xzz_r;
1009 grad_grad_grad_psi[psiIndex + 1][2][7] = c * gh_yzz_i +
s * gh_yzz_r;
1010 grad_grad_grad_psi[psiIndex + 1][2][8] = c * gh_zzz_i +
s * gh_zzz_r;
1014 for (
size_t j = std::max(nComplexBands, first); j < last; j++)
1019 const ST kX = k0[j];
1020 const ST kY = k1[j];
1021 const ST kZ = k2[j];
1022 const ST val_r = myV[jr];
1023 const ST val_i = myV[ji];
1030 const ST dX_r = g00 * g0[jr] + g01 * g1[jr] + g02 * g2[jr];
1031 const ST dY_r = g10 * g0[jr] + g11 * g1[jr] + g12 * g2[jr];
1032 const ST dZ_r = g20 * g0[jr] + g21 * g1[jr] + g22 * g2[jr];
1034 const ST dX_i = g00 * g0[ji] + g01 * g1[ji] + g02 * g2[ji];
1035 const ST dY_i = g10 * g0[ji] + g11 * g1[ji] + g12 * g2[ji];
1036 const ST dZ_i = g20 * g0[ji] + g21 * g1[ji] + g22 * g2[ji];
1039 const ST gX_r = dX_r + val_i * kX;
1040 const ST gY_r = dY_r + val_i * kY;
1041 const ST gZ_r = dZ_r + val_i * kZ;
1042 const ST gX_i = dX_i - val_r * kX;
1043 const ST gY_i = dY_i - val_r * kY;
1044 const ST gZ_i = dZ_i - val_r * kZ;
1046 if (
const size_t psiIndex = first_spo + nComplexBands + j; psiIndex < requested_orb_size)
1048 psi[psiIndex] = c * val_r -
s * val_i;
1049 dpsi[psiIndex][0] = c * gX_r -
s * gX_i;
1050 dpsi[psiIndex][1] = c * gY_r -
s * gY_i;
1051 dpsi[psiIndex][2] = c * gZ_r -
s * gZ_i;
1054 const ST f_xx_r =
v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g00, g01, g02, g00, g01, g02);
1055 const ST f_xy_r =
v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g00, g01, g02, g10, g11, g12);
1056 const ST f_xz_r =
v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g00, g01, g02, g20, g21, g22);
1057 const ST f_yy_r =
v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g10, g11, g12, g10, g11, g12);
1058 const ST f_yz_r =
v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g10, g11, g12, g20, g21, g22);
1059 const ST f_zz_r =
v_m_v(h00[jr], h01[jr], h02[jr], h11[jr], h12[jr], h22[jr], g20, g21, g22, g20, g21, g22);
1061 const ST f_xx_i =
v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g00, g01, g02, g00, g01, g02);
1062 const ST f_xy_i =
v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g00, g01, g02, g10, g11, g12);
1063 const ST f_xz_i =
v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g00, g01, g02, g20, g21, g22);
1064 const ST f_yy_i =
v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g10, g11, g12, g10, g11, g12);
1065 const ST f_yz_i =
v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g10, g11, g12, g20, g21, g22);
1066 const ST f_zz_i =
v_m_v(h00[ji], h01[ji], h02[ji], h11[ji], h12[ji], h22[ji], g20, g21, g22, g20, g21, g22);
1068 const ST h_xx_r = f_xx_r + 2 * kX * dX_i - kX * kX * val_r;
1069 const ST h_xy_r = f_xy_r + (kX * dY_i + kY * dX_i) - kX * kY * val_r;
1070 const ST h_xz_r = f_xz_r + (kX * dZ_i + kZ * dX_i) - kX * kZ * val_r;
1071 const ST h_yy_r = f_yy_r + 2 * kY * dY_i - kY * kY * val_r;
1072 const ST h_yz_r = f_yz_r + (kY * dZ_i + kZ * dY_i) - kY * kZ * val_r;
1073 const ST h_zz_r = f_zz_r + 2 * kZ * dZ_i - kZ * kZ * val_r;
1075 const ST h_xx_i = f_xx_i - 2 * kX * dX_r - kX * kX * val_i;
1076 const ST h_xy_i = f_xy_i - (kX * dY_r + kY * dX_r) - kX * kY * val_i;
1077 const ST h_xz_i = f_xz_i - (kX * dZ_r + kZ * dX_r) - kX * kZ * val_i;
1078 const ST h_yy_i = f_yy_i - 2 * kY * dY_r - kY * kY * val_i;
1079 const ST h_yz_i = f_yz_i - (kZ * dY_r + kY * dZ_r) - kZ * kY * val_i;
1080 const ST h_zz_i = f_zz_i - 2 * kZ * dZ_r - kZ * kZ * val_i;
1082 grad_grad_psi[psiIndex][0] = c * h_xx_r -
s * h_xx_i;
1083 grad_grad_psi[psiIndex][1] = c * h_xy_r -
s * h_xy_i;
1084 grad_grad_psi[psiIndex][2] = c * h_xz_r -
s * h_xz_i;
1085 grad_grad_psi[psiIndex][3] = c * h_xy_r -
s * h_xy_i;
1086 grad_grad_psi[psiIndex][4] = c * h_yy_r -
s * h_yy_i;
1087 grad_grad_psi[psiIndex][5] = c * h_yz_r -
s * h_yz_i;
1088 grad_grad_psi[psiIndex][6] = c * h_xz_r -
s * h_xz_i;
1089 grad_grad_psi[psiIndex][7] = c * h_yz_r -
s * h_yz_i;
1090 grad_grad_psi[psiIndex][8] = c * h_zz_r -
s * h_zz_i;
1095 const ST f3_xxx_r =
t3_contract(gh000[jr], gh001[jr], gh002[jr], gh011[jr], gh012[jr], gh022[jr], gh111[jr],
1096 gh112[jr], gh122[jr], gh222[jr], g00, g01, g02, g00, g01, g02, g00, g01, g02);
1097 const ST f3_xxy_r =
t3_contract(gh000[jr], gh001[jr], gh002[jr], gh011[jr], gh012[jr], gh022[jr], gh111[jr],
1098 gh112[jr], gh122[jr], gh222[jr], g00, g01, g02, g00, g01, g02, g10, g11, g12);
1099 const ST f3_xxz_r =
t3_contract(gh000[jr], gh001[jr], gh002[jr], gh011[jr], gh012[jr], gh022[jr], gh111[jr],
1100 gh112[jr], gh122[jr], gh222[jr], g00, g01, g02, g00, g01, g02, g20, g21, g22);
1101 const ST f3_xyy_r =
t3_contract(gh000[jr], gh001[jr], gh002[jr], gh011[jr], gh012[jr], gh022[jr], gh111[jr],
1102 gh112[jr], gh122[jr], gh222[jr], g00, g01, g02, g10, g11, g12, g10, g11, g12);
1103 const ST f3_xyz_r =
t3_contract(gh000[jr], gh001[jr], gh002[jr], gh011[jr], gh012[jr], gh022[jr], gh111[jr],
1104 gh112[jr], gh122[jr], gh222[jr], g00, g01, g02, g10, g11, g12, g20, g21, g22);
1105 const ST f3_xzz_r =
t3_contract(gh000[jr], gh001[jr], gh002[jr], gh011[jr], gh012[jr], gh022[jr], gh111[jr],
1106 gh112[jr], gh122[jr], gh222[jr], g00, g01, g02, g20, g21, g22, g20, g21, g22);
1107 const ST f3_yyy_r =
t3_contract(gh000[jr], gh001[jr], gh002[jr], gh011[jr], gh012[jr], gh022[jr], gh111[jr],
1108 gh112[jr], gh122[jr], gh222[jr], g10, g11, g12, g10, g11, g12, g10, g11, g12);
1109 const ST f3_yyz_r =
t3_contract(gh000[jr], gh001[jr], gh002[jr], gh011[jr], gh012[jr], gh022[jr], gh111[jr],
1110 gh112[jr], gh122[jr], gh222[jr], g10, g11, g12, g10, g11, g12, g20, g21, g22);
1111 const ST f3_yzz_r =
t3_contract(gh000[jr], gh001[jr], gh002[jr], gh011[jr], gh012[jr], gh022[jr], gh111[jr],
1112 gh112[jr], gh122[jr], gh222[jr], g10, g11, g12, g20, g21, g22, g20, g21, g22);
1113 const ST f3_zzz_r =
t3_contract(gh000[jr], gh001[jr], gh002[jr], gh011[jr], gh012[jr], gh022[jr], gh111[jr],
1114 gh112[jr], gh122[jr], gh222[jr], g20, g21, g22, g20, g21, g22, g20, g21, g22);
1116 const ST f3_xxx_i =
t3_contract(gh000[ji], gh001[ji], gh002[ji], gh011[ji], gh012[ji], gh022[ji], gh111[ji],
1117 gh112[ji], gh122[ji], gh222[ji], g00, g01, g02, g00, g01, g02, g00, g01, g02);
1118 const ST f3_xxy_i =
t3_contract(gh000[ji], gh001[ji], gh002[ji], gh011[ji], gh012[ji], gh022[ji], gh111[ji],
1119 gh112[ji], gh122[ji], gh222[ji], g00, g01, g02, g00, g01, g02, g10, g11, g12);
1120 const ST f3_xxz_i =
t3_contract(gh000[ji], gh001[ji], gh002[ji], gh011[ji], gh012[ji], gh022[ji], gh111[ji],
1121 gh112[ji], gh122[ji], gh222[ji], g00, g01, g02, g00, g01, g02, g20, g21, g22);
1122 const ST f3_xyy_i =
t3_contract(gh000[ji], gh001[ji], gh002[ji], gh011[ji], gh012[ji], gh022[ji], gh111[ji],
1123 gh112[ji], gh122[ji], gh222[ji], g00, g01, g02, g10, g11, g12, g10, g11, g12);
1124 const ST f3_xyz_i =
t3_contract(gh000[ji], gh001[ji], gh002[ji], gh011[ji], gh012[ji], gh022[ji], gh111[ji],
1125 gh112[ji], gh122[ji], gh222[ji], g00, g01, g02, g10, g11, g12, g20, g21, g22);
1126 const ST f3_xzz_i =
t3_contract(gh000[ji], gh001[ji], gh002[ji], gh011[ji], gh012[ji], gh022[ji], gh111[ji],
1127 gh112[ji], gh122[ji], gh222[ji], g00, g01, g02, g20, g21, g22, g20, g21, g22);
1128 const ST f3_yyy_i =
t3_contract(gh000[ji], gh001[ji], gh002[ji], gh011[ji], gh012[ji], gh022[ji], gh111[ji],
1129 gh112[ji], gh122[ji], gh222[ji], g10, g11, g12, g10, g11, g12, g10, g11, g12);
1130 const ST f3_yyz_i =
t3_contract(gh000[ji], gh001[ji], gh002[ji], gh011[ji], gh012[ji], gh022[ji], gh111[ji],
1131 gh112[ji], gh122[ji], gh222[ji], g10, g11, g12, g10, g11, g12, g20, g21, g22);
1132 const ST f3_yzz_i =
t3_contract(gh000[ji], gh001[ji], gh002[ji], gh011[ji], gh012[ji], gh022[ji], gh111[ji],
1133 gh112[ji], gh122[ji], gh222[ji], g10, g11, g12, g20, g21, g22, g20, g21, g22);
1134 const ST f3_zzz_i =
t3_contract(gh000[ji], gh001[ji], gh002[ji], gh011[ji], gh012[ji], gh022[ji], gh111[ji],
1135 gh112[ji], gh122[ji], gh222[ji], g20, g21, g22, g20, g21, g22, g20, g21, g22);
1138 const ST gh_xxx_r = f3_xxx_r + 3 * kX * f_xx_i - 3 * kX * kX * dX_r - kX * kX * kX * val_i;
1139 const ST gh_xxx_i = f3_xxx_i - 3 * kX * f_xx_r - 3 * kX * kX * dX_i + kX * kX * kX * val_r;
1141 f3_xxy_r + (kY * f_xx_i + 2 * kX * f_xy_i) - (kX * kX * dY_r + 2 * kX * kY * dX_r) - kX * kX * kY * val_i;
1143 f3_xxy_i - (kY * f_xx_r + 2 * kX * f_xy_r) - (kX * kX * dY_i + 2 * kX * kY * dX_i) + kX * kX * kY * val_r;
1145 f3_xxz_r + (kZ * f_xx_i + 2 * kX * f_xz_i) - (kX * kX * dZ_r + 2 * kX * kZ * dX_r) - kX * kX * kZ * val_i;
1147 f3_xxz_i - (kZ * f_xx_r + 2 * kX * f_xz_r) - (kX * kX * dZ_i + 2 * kX * kZ * dX_i) + kX * kX * kZ * val_r;
1149 f3_xyy_r + (2 * kY * f_xy_i + kX * f_yy_i) - (2 * kX * kY * dY_r + kY * kY * dX_r) - kX * kY * kY * val_i;
1151 f3_xyy_i - (2 * kY * f_xy_r + kX * f_yy_r) - (2 * kX * kY * dY_i + kY * kY * dX_i) + kX * kY * kY * val_r;
1152 const ST gh_xyz_r = f3_xyz_r + (kX * f_yz_i + kY * f_xz_i + kZ * f_xy_i) -
1153 (kX * kY * dZ_r + kY * kZ * dX_r + kZ * kX * dY_r) - kX * kY * kZ * val_i;
1154 const ST gh_xyz_i = f3_xyz_i - (kX * f_yz_r + kY * f_xz_r + kZ * f_xy_r) -
1155 (kX * kY * dZ_i + kY * kZ * dX_i + kZ * kX * dY_i) + kX * kY * kZ * val_r;
1157 f3_xzz_r + (2 * kZ * f_xz_i + kX * f_zz_i) - (2 * kX * kZ * dZ_r + kZ * kZ * dX_r) - kX * kZ * kZ * val_i;
1159 f3_xzz_i - (2 * kZ * f_xz_r + kX * f_zz_r) - (2 * kX * kZ * dZ_i + kZ * kZ * dX_i) + kX * kZ * kZ * val_r;
1160 const ST gh_yyy_r = f3_yyy_r + 3 * kY * f_yy_i - 3 * kY * kY * dY_r - kY * kY * kY * val_i;
1161 const ST gh_yyy_i = f3_yyy_i - 3 * kY * f_yy_r - 3 * kY * kY * dY_i + kY * kY * kY * val_r;
1163 f3_yyz_r + (kZ * f_yy_i + 2 * kY * f_yz_i) - (kY * kY * dZ_r + 2 * kY * kZ * dY_r) - kY * kY * kZ * val_i;
1165 f3_yyz_i - (kZ * f_yy_r + 2 * kY * f_yz_r) - (kY * kY * dZ_i + 2 * kY * kZ * dY_i) + kY * kY * kZ * val_r;
1167 f3_yzz_r + (2 * kZ * f_yz_i + kY * f_zz_i) - (2 * kY * kZ * dZ_r + kZ * kZ * dY_r) - kY * kZ * kZ * val_i;
1169 f3_yzz_i - (2 * kZ * f_yz_r + kY * f_zz_r) - (2 * kY * kZ * dZ_i + kZ * kZ * dY_i) + kY * kZ * kZ * val_r;
1170 const ST gh_zzz_r = f3_zzz_r + 3 * kZ * f_zz_i - 3 * kZ * kZ * dZ_r - kZ * kZ * kZ * val_i;
1171 const ST gh_zzz_i = f3_zzz_i - 3 * kZ * f_zz_r - 3 * kZ * kZ * dZ_i + kZ * kZ * kZ * val_r;
1173 grad_grad_grad_psi[psiIndex][0][0] = c * gh_xxx_r -
s * gh_xxx_i;
1174 grad_grad_grad_psi[psiIndex][0][1] = c * gh_xxy_r -
s * gh_xxy_i;
1175 grad_grad_grad_psi[psiIndex][0][2] = c * gh_xxz_r -
s * gh_xxz_i;
1176 grad_grad_grad_psi[psiIndex][0][3] = c * gh_xxy_r -
s * gh_xxy_i;
1177 grad_grad_grad_psi[psiIndex][0][4] = c * gh_xyy_r -
s * gh_xyy_i;
1178 grad_grad_grad_psi[psiIndex][0][5] = c * gh_xyz_r -
s * gh_xyz_i;
1179 grad_grad_grad_psi[psiIndex][0][6] = c * gh_xxz_r -
s * gh_xxz_i;
1180 grad_grad_grad_psi[psiIndex][0][7] = c * gh_xyz_r -
s * gh_xyz_i;
1181 grad_grad_grad_psi[psiIndex][0][8] = c * gh_xzz_r -
s * gh_xzz_i;
1183 grad_grad_grad_psi[psiIndex][1][0] = c * gh_xxy_r -
s * gh_xxy_i;
1184 grad_grad_grad_psi[psiIndex][1][1] = c * gh_xyy_r -
s * gh_xyy_i;
1185 grad_grad_grad_psi[psiIndex][1][2] = c * gh_xyz_r -
s * gh_xyz_i;
1186 grad_grad_grad_psi[psiIndex][1][3] = c * gh_xyy_r -
s * gh_xyy_i;
1187 grad_grad_grad_psi[psiIndex][1][4] = c * gh_yyy_r -
s * gh_yyy_i;
1188 grad_grad_grad_psi[psiIndex][1][5] = c * gh_yyz_r -
s * gh_yyz_i;
1189 grad_grad_grad_psi[psiIndex][1][6] = c * gh_xyz_r -
s * gh_xyz_i;
1190 grad_grad_grad_psi[psiIndex][1][7] = c * gh_yyz_r -
s * gh_yyz_i;
1191 grad_grad_grad_psi[psiIndex][1][8] = c * gh_yzz_r -
s * gh_yzz_i;
1193 grad_grad_grad_psi[psiIndex][2][0] = c * gh_xxz_r -
s * gh_xxz_i;
1194 grad_grad_grad_psi[psiIndex][2][1] = c * gh_xyz_r -
s * gh_xyz_i;
1195 grad_grad_grad_psi[psiIndex][2][2] = c * gh_xzz_r -
s * gh_xzz_i;
1196 grad_grad_grad_psi[psiIndex][2][3] = c * gh_xyz_r -
s * gh_xyz_i;
1197 grad_grad_grad_psi[psiIndex][2][4] = c * gh_yyz_r -
s * gh_yyz_i;
1198 grad_grad_grad_psi[psiIndex][2][5] = c * gh_yzz_r -
s * gh_yzz_i;
1199 grad_grad_grad_psi[psiIndex][2][6] = c * gh_xzz_r -
s * gh_xzz_i;
1200 grad_grad_grad_psi[psiIndex][2][7] = c * gh_yzz_r -
s * gh_yzz_i;
1201 grad_grad_grad_psi[psiIndex][2][8] = c * gh_zzz_r -
s * gh_zzz_i;
1206 template<
typename ST>
1215 PointType ru(PrimLattice.toUnit_floor(r));
1216 #pragma omp parallel 1221 spline2::evaluate3d_vghgh(SplineInst->getSplinePtr(), ru, myV, myG, myH, mygH, first, last);
1222 assign_vghgh(r, psi, dpsi, grad_grad_psi, grad_grad_grad_psi, first / 2, last / 2);
OrbitalSetTraits< ValueType >::HessVector HessVector
class to match std::complex<ST> spline with BsplineSet::ValueType (real) SPOs
bool read_splines(hdf_archive &h5f)
T SymTrace(T h00, T h01, T h02, T h11, T h12, T h22, const T gg[6])
compute Trace(H*G)
void evaluateVGH(const ParticleSet &P, const int iat, ValueVector &psi, GradVector &dpsi, HessVector &grad_grad_psi) override
evaluate the values, gradients and hessians of this single-particle orbital set
helper functions for EinsplineSetBuilder
T dot(const T *restrict a, const T *restrict b, int n, TRES res=TRES())
dot product
SplineC2R(const std::string &my_name)
void assign_vghgh(const PointType &r, ValueVector &psi, GradVector &dpsi, HessVector &grad_grad_psi, GGGVector &grad_grad_grad_psi, int first=0, int last=-1) const
void evaluateDetRatios(const VirtualParticleSet &VP, ValueVector &psi, const ValueVector &psiinv, std::vector< TT > &ratios) override
A ParticleSet that handles virtual moves of a selected particle of a given physical ParticleSet Virtu...
void assign_vgl_from_l(const PointType &r, ValueVector &psi, GradVector &dpsi, ValueVector &d2psi)
assign_vgl_from_l can be used when myL is precomputed and myV,myG,myL in cartesian ...
void assign_v(const PointType &r, const vContainer_type &myV, ValueVector &psi, int first, int last) const
size_t getTotalNum() const
T v_m_v(T h00, T h01, T h02, T h11, T h12, T h22, T g1x, T g1y, T g1z, T g2x, T g2y, T g2z)
compute vector[3]^T x matrix[3][3] x vector[3]
T t3_contract(T h000, T h001, T h002, T h011, T h012, T h022, T h111, T h112, T h122, T h222, T g1x, T g1y, T g1z, T g2x, T g2y, T g2z, T g3x, T g3y, T g3z)
Coordinate transform for a 3rd rank symmetric tensor representing coordinate derivatives (hence t3_co...
void assign_v(ST x, ST y, ST z, TT *restrict results_scratch_ptr, const ST *restrict offload_scratch_ptr, const ST *restrict myKcart_ptr, size_t myKcart_padded_size, size_t first_spo, int index)
void assign_vgh(const PointType &r, ValueVector &psi, GradVector &dpsi, HessVector &grad_grad_psi, int first, int last) const
void evaluateVGHGH(const ParticleSet &P, const int iat, ValueVector &psi, GradVector &dpsi, HessVector &grad_grad_psi, GGGVector &grad_grad_grad_psi) override
evaluate the values, gradients, hessians, and grad hessians of this single-particle orbital set ...
omp_int_t omp_get_thread_num()
Specialized paritlce class for atomistic simulations.
class to handle complex splines to real orbitals with splines of arbitrary precision ...
void FairDivideAligned(const int ntot, const int base, const int npart, const int me, int &first, int &last)
Partition ntot over npart and the size of each partition is a multiple of base size.
OrbitalSetTraits< ValueType >::ValueVector ValueVector
bool write_splines(hdf_archive &h5f)
UBspline_3d_d SingleSplineType
const PosType & activeR(int iat) const
return the active position if the particle is active or the return current position if not ...
omp_int_t omp_get_num_threads()
OrbitalSetTraits< ValueType >::GradHessVector GGGVector
OrbitalSetTraits< ValueType >::GradVector GradVector
void assign_vgl(ST x, ST y, ST z, TT *restrict results_scratch_ptr, size_t orb_padded_size, const ST *mKK_ptr, const ST *restrict offload_scratch_ptr, size_t spline_padded_size, const ST G[9], const ST *myKcart_ptr, size_t myKcart_padded_size, size_t first_spo, int index)
assign_vgl
void sincos(T a, T *restrict s, T *restrict c)
sincos function wrapper
void set_spline(SingleSplineType *spline_r, SingleSplineType *spline_i, int twist, int ispline, int level)
#define ASSUME_ALIGNED(x)
void evaluateVGL(const ParticleSet &P, const int iat, ValueVector &psi, GradVector &dpsi, ValueVector &d2psi) override
evaluate the values, gradients and laplacians of this single-particle orbital set ...
bool readEntry(T &data, const std::string &aname)
read the data from the group aname and return status use read() for inbuilt error checking ...
void evaluateValue(const ParticleSet &P, const int iat, ValueVector &psi) override
evaluate the values of this single-particle orbital set
void assign_vgl(const PointType &r, ValueVector &psi, GradVector &dpsi, ValueVector &d2psi, int first, int last) const
assign_vgl
bool writeEntry(T &data, const std::string &aname)
write the data to the group aname and return status use write() for inbuilt error checking ...
typename BsplineSet::ValueType TT