Skip to content

Commit 984f11c

Browse files
committed
added kcrpmd langevin thermostat parameter for kinked-pair regime
1 parent 8364348 commit 984f11c

3 files changed

Lines changed: 56 additions & 21 deletions

File tree

src/dyn/Dynamics.cpp

Lines changed: 46 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1126,12 +1126,13 @@ void propagate_electronic_kcrpmd(dyn_variables& dyn_var, nHamiltonian& Ham, dyn_
11261126
int num_el = prms.num_electronic_substeps;
11271127
double dt = prms.dt / num_el;
11281128
double beta = (hartree/boltzmann) / prms.Temperature;
1129-
double eta = prms.kcrpmd_eta;
1130-
double gam = prms.kcrpmd_gamma;
11311129
double a = prms.kcrpmd_a;
11321130
double b = prms.kcrpmd_b;
11331131
double c = prms.kcrpmd_c;
11341132
double d = prms.kcrpmd_d;
1133+
double eta = prms.kcrpmd_eta;
1134+
double gam = prms.kcrpmd_gamma;
1135+
double gamKP = prms.kcrpmd_gammaKP;
11351136
double sigma;
11361137
double xi;
11371138
double theta;
@@ -1141,26 +1142,51 @@ void propagate_electronic_kcrpmd(dyn_variables& dyn_var, nHamiltonian& Ham, dyn_
11411142
vector<double>& p_aux_var = dyn_var.p_aux_var;
11421143
vector<double>& f_aux_var = dyn_var.f_aux_var;
11431144

1144-
if(gam == 0.0){
1145-
p_aux_var[0] += 0.5 * f_aux_var[0] * dt;
1146-
y_aux_var[0] += p_aux_var[0] / m_aux_var[0] * dt;
1147-
f_aux_var[0] = (Ham.kcrpmd_effective_auxiliary_force(y_aux_var, beta, eta, a, b, c, d))[0];
1148-
p_aux_var[0] += 0.5 * f_aux_var[0] * dt;
1145+
if(y_aux_var[0] >= -0.5 && y_aux_var[0] <= 0.5){
1146+
if(gamKP == 0.0){
1147+
p_aux_var[0] += 0.5 * f_aux_var[0] * dt;
1148+
y_aux_var[0] += p_aux_var[0] / m_aux_var[0] * dt;
1149+
f_aux_var[0] = (Ham.kcrpmd_effective_auxiliary_force(y_aux_var, beta, eta, a, b, c, d))[0];
1150+
p_aux_var[0] += 0.5 * f_aux_var[0] * dt;
1151+
}
1152+
else{
1153+
sigma = sqrt(2.0 * gamKP / (beta * m_aux_var[0]));
1154+
xi = rnd.normal();
1155+
theta = rnd.normal();
1156+
p_aux_var[0] += 0.5 * xi * sigma * m_aux_var[0] * sqrt(dt)
1157+
+ 0.5 * (f_aux_var[0] - gamKP * p_aux_var[0]) * dt
1158+
- 0.25 * (xi / 2.0 + theta / sqrt(3.0)) * gamKP * sigma * m_aux_var[0] * sqrt(pow(dt,3))
1159+
- 0.125 * gamKP * (f_aux_var[0] - gamKP * p_aux_var[0]) * pow(dt,2);
1160+
y_aux_var[0] += p_aux_var[0] / m_aux_var[0] * dt + 0.5 * theta / sqrt(3.0) * sigma * sqrt(pow(dt,3));
1161+
f_aux_var[0] = (Ham.kcrpmd_effective_auxiliary_force(y_aux_var, beta, eta, a, b, c, d))[0];
1162+
p_aux_var[0] += 0.5 * xi * sigma * m_aux_var[0] * sqrt(dt)
1163+
+ 0.5 * (f_aux_var[0] - gamKP * p_aux_var[0]) * dt
1164+
- 0.25 * (xi / 2.0 + theta / sqrt(3.0)) * gamKP * sigma * m_aux_var[0] * sqrt(pow(dt,3))
1165+
- 0.125 * gamKP * (f_aux_var[0] - gamKP * p_aux_var[0]) * pow(dt,2);
1166+
}
11491167
}
11501168
else{
1151-
sigma = sqrt(2.0 * gam / (beta * m_aux_var[0]));
1152-
xi = rnd.normal();
1153-
theta = rnd.normal();
1154-
p_aux_var[0] += 0.5 * xi * sigma * m_aux_var[0] * sqrt(dt)
1155-
+ 0.5 * (f_aux_var[0] - gam * p_aux_var[0]) * dt
1156-
- 0.25 * (xi / 2.0 + theta / sqrt(3.0)) * gam * sigma * m_aux_var[0] * sqrt(pow(dt,3))
1157-
- 0.125 * gam * (f_aux_var[0] - gam * p_aux_var[0]) * pow(dt,2);
1158-
y_aux_var[0] += p_aux_var[0] / m_aux_var[0] * dt + 0.5 * theta / sqrt(3.0) * sigma * sqrt(pow(dt,3));
1159-
f_aux_var[0] = (Ham.kcrpmd_effective_auxiliary_force(y_aux_var, beta, eta, a, b, c, d))[0];
1160-
p_aux_var[0] += 0.5 * xi * sigma * m_aux_var[0] * sqrt(dt)
1161-
+ 0.5 * (f_aux_var[0] - gam * p_aux_var[0]) * dt
1162-
- 0.25 * (xi / 2.0 + theta / sqrt(3.0)) * gam * sigma * m_aux_var[0] * sqrt(pow(dt,3))
1163-
- 0.125 * gam * (f_aux_var[0] - gam * p_aux_var[0]) * pow(dt,2);
1169+
if(gam == 0.0){
1170+
p_aux_var[0] += 0.5 * f_aux_var[0] * dt;
1171+
y_aux_var[0] += p_aux_var[0] / m_aux_var[0] * dt;
1172+
f_aux_var[0] = (Ham.kcrpmd_effective_auxiliary_force(y_aux_var, beta, eta, a, b, c, d))[0];
1173+
p_aux_var[0] += 0.5 * f_aux_var[0] * dt;
1174+
}
1175+
else{
1176+
sigma = sqrt(2.0 * gam / (beta * m_aux_var[0]));
1177+
xi = rnd.normal();
1178+
theta = rnd.normal();
1179+
p_aux_var[0] += 0.5 * xi * sigma * m_aux_var[0] * sqrt(dt)
1180+
+ 0.5 * (f_aux_var[0] - gam * p_aux_var[0]) * dt
1181+
- 0.25 * (xi / 2.0 + theta / sqrt(3.0)) * gam * sigma * m_aux_var[0] * sqrt(pow(dt,3))
1182+
- 0.125 * gam * (f_aux_var[0] - gam * p_aux_var[0]) * pow(dt,2);
1183+
y_aux_var[0] += p_aux_var[0] / m_aux_var[0] * dt + 0.5 * theta / sqrt(3.0) * sigma * sqrt(pow(dt,3));
1184+
f_aux_var[0] = (Ham.kcrpmd_effective_auxiliary_force(y_aux_var, beta, eta, a, b, c, d))[0];
1185+
p_aux_var[0] += 0.5 * xi * sigma * m_aux_var[0] * sqrt(dt)
1186+
+ 0.5 * (f_aux_var[0] - gam * p_aux_var[0]) * dt
1187+
- 0.25 * (xi / 2.0 + theta / sqrt(3.0)) * gam * sigma * m_aux_var[0] * sqrt(pow(dt,3))
1188+
- 0.125 * gam * (f_aux_var[0] - gam * p_aux_var[0]) * pow(dt,2);
1189+
}
11641190
}
11651191
}
11661192

src/dyn/dyn_control_params.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ dyn_control_params::dyn_control_params(){
9292
kcrpmd_c = 0.5;
9393
kcrpmd_d = 3.0;
9494
kcrpmd_gamma = 0.0;
95+
kcrpmd_gammaKP = 0.0;
9596

9697
///================= Decoherence options =========================================
9798
decoherence_algo = -1;
@@ -211,6 +212,7 @@ dyn_control_params::dyn_control_params(const dyn_control_params& x){
211212
kcrpmd_c = x.kcrpmd_c;
212213
kcrpmd_d = x.kcrpmd_d;
213214
kcrpmd_gamma = x.kcrpmd_gamma;
215+
kcrpmd_gammaKP = x.kcrpmd_gammaKP;
214216

215217
///================= Decoherence options =========================================
216218
decoherence_algo = x.decoherence_algo;
@@ -422,6 +424,7 @@ void dyn_control_params::set_parameters(bp::dict params){
422424
else if(key=="kcrpmd_c"){ kcrpmd_c = bp::extract<double>(params.values()[i]); }
423425
else if(key=="kcrpmd_d"){ kcrpmd_d = bp::extract<double>(params.values()[i]); }
424426
else if(key=="kcrpmd_gamma"){ kcrpmd_gamma = bp::extract<double>(params.values()[i]); }
427+
else if(key=="kcrpmd_gammaKP"){ kcrpmd_gammaKP = bp::extract<double>(params.values()[i]); }
425428

426429
///================= Decoherence options =========================================
427430
else if(key=="decoherence_algo"){ decoherence_algo = bp::extract<int>(params.values()[i]); }

src/dyn/dyn_control_params.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -538,11 +538,17 @@ class dyn_control_params{
538538
double kcrpmd_d;
539539

540540
/**
541-
KC-RPMD Langevin frictional coefficient
541+
KC-RPMD Langevin frictional coefficient within donor-acceptor basin
542542
Default: 0.0
543543
*/
544544
double kcrpmd_gamma;
545545

546+
/**
547+
KC-RPMD Langevin frictional coefficient within kinked-pair regime
548+
Default: 0.0
549+
*/
550+
double kcrpmd_gammaKP;
551+
546552

547553
///===============================================================================
548554
///================= Decoherence options =========================================

0 commit comments

Comments
 (0)