13inline bool isFileExists(
const std::string& name) {
return std::ifstream{name.c_str()}.good(); }
15double phi(
double lambda,
double N0_max,
int F) {
16 double x = lambda * N0_max / 2;
19 const double TOLERANCE = 1.0e-10;
20 int a = 1, b = 1, c = 1 + F;
21 double t = a * b * x / c;
24 while (abs(t) > TOLERANCE) {
26 t *= a * b * x / c / n;
31 for (
int i = 1; i < F; ++i) Fact *= i;
32 term1 = 2 * (F - 2) * (F - 1) * term1 / Fact / F;
33 double term2 = (6 - 2 * F - 2 * x) / Fact;
34 return pow(lambda, F) * pow(2 - 2 * x, 1 - F) * (term1 + term2);
40 int ii = i * (F + 1), kk = k * (F + 1), ik = i * F + k;
41 if (V[ii] == V[kk])
return 1.0e0;
42 double res = 2.0e0 /
phys::math::pi * atan(2 * V[ik] / (V[ii] - V[kk]));
43 if (abs(res) < 1.0e-4) res = copysign(1.0e-4, res);
53 kids_real L = 1.0e0 - log(std::abs(alpha));
58 wrho[ik] = copysign(1.0, std::real(rho[ik])) * std::pow(std::abs(rho[ik]), L);
61 wrho[ik] = xi * rho[ik];
73 case NADForcePolicy::BO:
74 case NADForcePolicy::CV: {
80 Ecalc += std::real(wrho[ii] * E[i]);
109 kids_real L = 1.0e0 - log(std::abs(alpha));
110 kids_real rate_default = (L == 1.0e0) ? 1.0e0 : 0.0e0;
121 double rate = ((std::real(rho[ii]) == 0.0e0) ? rate_default : std::real(wrho[ii] / rho[ii]));
122 double coeff = (E[i] - (E[i] - Ew) * L * rate);
124 if (i == k)
continue;
135 if (to == from)
return from;
138 kids_real coeffa = 0.0f, coeffb = 0.0f, coeffc = Eto - Efrom;
140 coeffa += 0.5f * direction[i] * direction[i] / nm[i];
141 coeffb += np[i] / nm[i] * direction[i];
143 coeffb /= coeffa, coeffc /= coeffa;
145 kids_real coeffd = coeffb * coeffb - 4 * coeffc;
147 kids_real x1 = 0.5f * (-coeffb + sqrt(coeffd)), x2 = 0.5f * (-coeffb - sqrt(coeffd));
148 kids_real xx = (std::abs(x1) < std::abs(x2)) ? x1 : x2;
149 for (
int i = 0; i <
Dimension::N; ++i) np[i] += xx * direction[i];
151 }
else if (reflect) {
153 for (
int i = 0; i <
Dimension::N; ++i) np[i] += xx * direction[i];
166 cmsh_type = NADPolicy::_from(PM->get_string(
"cmsh_flag",
LOC(),
"CVSH"));
168 alpha0 = PM->get_double(
"alpha0",
LOC(), 0.5);
177 use_wmm = PM->get_bool(
"use_wmm",
LOC(),
false);
178 use_sqc = PM->get_bool(
"use_sqc",
LOC(),
false);
186 use_sum = PM->get_bool(
"use_sum",
LOC(),
false);
202 case NADPolicy::BOSH:
208 case NADPolicy::CVSH:
215 case NADPolicy::BOSD:
219 case NADPolicy::CVSD:
286 for (
int i = 0; i <
Dimension::F; ++i) c[i] = std::abs(c[i] * c[i]);
308 for (
int i = 0; i <
Dimension::F; ++i) norm += std::abs(c[i] * c[i]);
321 std::string init_nuclinp =
_param->get_string(
"init_nuclinp",
LOC());
322 std::string open_file = init_nuclinp;
325 std::string stmp, eachline;
326 std::ifstream ifs(open_file);
327 while (getline(ifs, eachline)) {
328 if (eachline.find(
"init.c") != eachline.npos) {
329 getline(ifs, eachline);
330 for (
int i = 0; i < Dimension::N; ++i) ifs >> c[i];
342 double randu = 1.0e0;
344 double gamma_uu = 0.0e0;
357 if (i == iocc || j == iocc)
continue;
365 }
else if (i == iocc || j == iocc) {
366 rho_ele[ij] *= gamma_ou;
368 rho_ele[ij] *= gamma_uu;
398 RepresentationPolicy::Adiabatic,
403 RepresentationPolicy::Adiabatic,
410 RepresentationPolicy::Adiabatic,
412 wz_A[0] = std::abs(rho_ele[0] - rho_ele[3]);
415 ww_A[0] = 4.0 - 1.0 / (max_val * max_val);
417 RepresentationPolicy::Adiabatic,
418 RepresentationPolicy::Diabatic,
420 wz_D[0] = std::abs(rho_ele[0] - rho_ele[3]);
423 ww_D[0] = 4.0 - 1.0 / (max_val * max_val);
425 RepresentationPolicy::Diabatic,
488 for (
int i = 0; i <
Dimension::F; ++i) c[i] = c_init[i];
489 for (
int ik = 0; ik <
Dimension::FF; ++ik) rho_ele[ik] = rho_ele_init[ik];
490 for (
int ik = 0; ik <
Dimension::FF; ++ik) rho_nuc[ik] = rho_nuc_init[ik];
512 RepresentationPolicy::Adiabatic,
516 RepresentationPolicy::Adiabatic,
524 Efrom =
calc_Ew(
E, rho_nuc, *occ_nuc);
577 Epot[0] =
vpes[0] + ((*occ_nuc == to) ? Eto : Efrom);
600 if (Ew_new != Ew_old) {
601 double vdotd = 0.0e0;
603 double xsolve = (Ew_new - Ew_old) / (
scale *
dt) / vdotd;
610 RepresentationPolicy::Adiabatic,
615 RepresentationPolicy::Adiabatic,
622 for (
int i = 0; i <
Dimension::FF; ++i) rho_nuc[i] = rho_ele[i] + (rho_nuc_init[i] - rho_ele_init[i]);
625 RepresentationPolicy::Adiabatic,
635 ww_A[0] = 4.0 - 1.0 / (max_val * max_val);
636 ww_A[0] = std::min({std::abs(ww_A[0]), std::abs(ww_A_init[0])});
654 RepresentationPolicy::Adiabatic,
658 RepresentationPolicy::Adiabatic,
662 RepresentationPolicy::Adiabatic,
666 RepresentationPolicy::Adiabatic,
671 RepresentationPolicy::Adiabatic,
672 RepresentationPolicy::Diabatic,
682 ww_D[0] = 4.0 - 1.0 / (max_val * max_val);
684 double y = max_val - 0.5e0;
685 ww_D[0] = (23.0e0 / 2 * y - 72.0e0 * y * y + 140.0e0 * y * y * y + 480.0e0 * y * y * y * y -
686 840.0e0 * y * y * y * y * y) +
687 (9.0e0 / 4.0 - 9.0e0 * y * y - 420.0e0 * y * y * y * y + 1680.0e0 * y * y * y * y * y * y) *
690 ww_D[0] = std::min({std::abs(ww_D[0]), std::abs(ww_D_init[0])});
694 RepresentationPolicy::Diabatic,
696 double vmax0 = 0.0e0, vsec0 = 0.0e0;
697 double vmaxt = 0.0e0, vsect = 0.0e0;
699 if (std::abs(rho_ele_init[ii]) > vmax0) {
701 vmax0 = std::abs(rho_ele_init[ii]);
702 }
else if (std::abs(rho_ele_init[ii]) > vsec0) {
703 vsec0 = std::abs(rho_ele_init[ii]);
705 if (std::abs(rho_ele[ii]) > vmax0) {
707 vmaxt = std::abs(rho_ele[ii]);
708 }
else if (std::abs(rho_ele[ii]) > vsect) {
709 vsect = std::abs(rho_ele[ii]);
713 double lambda1 = std::min({1 / vsect, 2 / (vmax0 + vsec0)});
714 double lambda2 = std::max({1 / vmaxt, 1 / vmax0});
715 if (lambda1 > lambda2) {
721 RepresentationPolicy::Diabatic,
759 RepresentationPolicy::Diabatic,
763 RepresentationPolicy::Diabatic,
767 RepresentationPolicy::Diabatic,
771 RepresentationPolicy::Diabatic,
775 RepresentationPolicy::Diabatic,
779 RepresentationPolicy::Diabatic,
783 RepresentationPolicy::Diabatic,
787 RepresentationPolicy::Diabatic,
bool isFileExists(const std::string &name)
double phi(double lambda, double N0_max, int F)
this file provides Kernel_Elec_NAD class for electronic dynamics and properties in nonadiabatic traje...
this file provides Kernel_NADForce class enabling force weighting from electronic properties.
#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)
#define ARRAY_CLEAR(_A, _n)
virtual const std::string getName()
Get the name of the kernel.
virtual Status & executeKernel_impl(Status &stat)
Virtual function to execute the kernel implementation.
virtual int getType() const
Get the type of the kernel.
NADPolicy::_type cmsh_type
kids_bint * at_samplingstep_finally_ptr
virtual void setInputDataSet_impl(std::shared_ptr< DataSet > &DS)
Virtual function to set input data set for the kernel implementation.
bool disable_inner_switch
virtual Status & initializeKernel_impl(Status &stat)
Virtual function to initialize the kernel implementation.
virtual void setInputParam_impl(std::shared_ptr< Param > &PM)
Virtual function to set input parameters for the kernel implementation.
static kids_complex * U
dynamics variables for electronic DOFs
static int ker_from_rho(kids_complex *ker, kids_complex *rho, kids_real xi, kids_real gamma, int fdim, bool quantize=false, int occ=-1)
convert c (electonic amplititude) to kernel (affine map of the density)
static kids_complex * ww_A_init
static int * occ_nuc
weighting density for nuclear force
static kids_complex * K1QA
Simplex Quantization.
static kids_complex * ww_D_init
static kids_real * T_init
static kids_complex * rho_ele
static kids_complex * rho_nuc_init
static kids_complex * K1QD
Simplex Quantization.
static kids_complex * rho_nuc
static kids_complex * K2QA
Heaviside Quantization.
static kids_complex * K2QD
Heaviside Quantization.
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 * ww_D
static kids_complex * c_init
electronic vector
static kids_complex * K2
partial version of K2
static kids_complex * ww_A
static int occ0
read parameters
static kids_complex * K1DD
static kids_complex * K2DD
static kids_complex * K1DA
static kids_complex * wz_A
static kids_complex * rho_ele_init
electronic density
static kids_complex * K1
partial version of K1
static kids_complex * K0
partial version of K0
static kids_complex * K2DA
static kids_complex * w
kernels for time correlation function
static kids_complex * wz_D
static NADForcePolicy::_type NADForce_type
static int rand_uniform(kids_real *res_arr, int N=1, kids_real sigma=1.0)
static int rand_catalog(int *res_arr, int N=1, bool reset=false, int begin=0, int end=1)
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)
std::shared_ptr< Param > _param
Shared pointer to the Param object associated with this kernel.
Status & executeKernel(Status &stat)
Execute the kernel's algorithm and those of its children.
std::shared_ptr< DataSet > _dataset
Shared pointer to the DataSet object associated with this kernel.
static int hopping_choose(kids_complex *rho, kids_complex *H, int from, kids_real dt)
static double gamma_wigner(int fdim)
static int pop_neg_choose(kids_complex *rho)
static int pop_choose(kids_complex *rho)
static int c_window(kids_complex *c, int iocc, int type, int fdim)
static double gamma_opt(int fdim)
static int c_focus(kids_complex *c, double xi, double gamma, int occ, int fdim)
static void hopping_direction(kids_real *direction, kids_real *dE, int from, int to)
static int max_choose(kids_complex *rho)
static int c_sphere(kids_complex *c, int fdim)
sampling mapping variables from uniform sphere distribution (i.e.
static int ker_binning(kids_complex *ker, kids_complex *rho, int sqc_type)
provide utils for debugging the code
#define LOC()
show the location information for debug
VARIABLE< kids_real > direction
VARIABLE< kids_complex > wrho
VARIABLE< kids_real > ftmp
VARIABLE< kids_real > sqcIA
VARIABLE< kids_real > Epot
VARIABLE< kids_real > alpha
VARIABLE< kids_real > fadd
VARIABLE< kids_real > sqcID
VARIABLE< kids_real > sqcw
VARIABLE< kids_bint > at_samplingstep_finally
VARIABLE< kids_complex > H
VARIABLE< kids_real > vpes
std::size_t NFF
Product of N, F, and F (N * F * F).
std::size_t N
Number of nuclear degrees of freedom.
std::size_t PF
Product of P and F (P * F).
std::size_t PFF
Product of P, F, and F (P * F * F).
std::size_t P
Number of parallel trajectories (swarms of trajectories) in each Monte Carlo run.
std::size_t F
Number of electronic degrees of freedom.
std::size_t Fadd1
F plus 1 (F + 1).
std::size_t FF
Product of F and F (F * F).
< http://warp.povusers.org/FunctionParser/fparser.html
double calc_alpha(kids_real *V, int i=0, int k=1, int F=2)
void ARRAY_MAT_DIAG(kids_real *A, kids_real *B, size_t N1)
Copy the diagonal elements from matrix B to matrix A for real matrices.
int calc_distforce(kids_real *f1, kids_real *E, kids_real *dE, kids_complex *wrho, kids_complex *rho, double alpha)
the force driven from the shape of distorted-density W(\rho)
double calc_Ew(kids_real *E, kids_complex *wrho, int occ)
double kids_real
Alias for real number type.
std::complex< double > kids_complex
Alias for complex number type.
int hopping_impulse(kids_real *direction, kids_real *np, kids_real *nm, kids_real Efrom, kids_real Eto, int from, int to, bool reflect)
int calc_wrho(kids_complex *wrho, kids_complex *rho, double xi, double gamma, double alpha)
constexpr real_precision halfpi
constexpr std::complex< real_precision > iu(1.0L, 0.0L)
constexpr real_precision pi
pi
constexpr real_precision sqrthalf
constexpr std::complex< real_precision > im(0.0L, 1.0L)
Imaginary Unit.
constexpr real_precision twopi
constexpr std::complex< real_precision > iz(0.0L, 0.0L)
constexpr dimension7 time_d
[T]
std::basic_string< CharT > concat(const separator_t< CharT > &sep, Args &&... seq)
constexpr uint32_t hash(const char *str)
declaration of variables used in the program.