@@ -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
0 commit comments