Skip to content
Snippets Groups Projects
Commit 60c67b07 authored by Axel Kohlmeyer's avatar Axel Kohlmeyer
Browse files

import updated fix msst file with some additional cleanup and simplification

parent a59b7e4d
No related branches found
No related tags found
No related merge requests found
...@@ -446,7 +446,7 @@ void FixMSST::initial_integrate(int vflag) ...@@ -446,7 +446,7 @@ void FixMSST::initial_integrate(int vflag)
{ {
int i,k; int i,k;
double p_msst; // MSST driving pressure double p_msst; // MSST driving pressure
double vol,TS,TS_term,escale_term; double vol;
int nlocal = atom->nlocal; int nlocal = atom->nlocal;
int *mask = atom->mask; int *mask = atom->mask;
...@@ -469,12 +469,16 @@ void FixMSST::initial_integrate(int vflag) ...@@ -469,12 +469,16 @@ void FixMSST::initial_integrate(int vflag)
// must convert energy to mv^2 units // must convert energy to mv^2 units
if (dftb) { if (dftb) {
double TS_dftb = fix_external->compute_vector(0); const double TS_dftb = fix_external->compute_vector(0);
TS = force->ftm2v*TS_dftb; const double TS = force->ftm2v*TS_dftb;
// update S_elec terms and compute TS_dot via finite differences
S_elec_2 = S_elec_1;
S_elec_1 = S_elec;
const double Temp = temperature->compute_scalar();
S_elec = TS/Temp;
TS_dot = Temp*(3.0*S_elec-4.0*S_elec_1+S_elec_2)/(2.0*update->dt);
TS_int += (update->dt*TS_dot);
if (update->ntimestep == 1) T0S0 = TS; if (update->ntimestep == 1) T0S0 = TS;
} else {
TS = 0.0;
T0S0 = 0.0;
} }
// compute new pressure and volume // compute new pressure and volume
...@@ -484,16 +488,6 @@ void FixMSST::initial_integrate(int vflag) ...@@ -484,16 +488,6 @@ void FixMSST::initial_integrate(int vflag)
couple(); couple();
vol = compute_vol(); vol = compute_vol();
// update S_elec terms and compute TS_dot via finite differences
S_elec_2 = S_elec_1;
S_elec_1 = S_elec;
double Temp = temperature->compute_scalar();
S_elec = TS/Temp;
TS_dot = Temp*(3.0*S_elec-4.0*S_elec_1+S_elec_2)/(2.0*update->dt);
TS_int += (update->dt*TS_dot);
//TS_int += (update->dt*TS_dot)/total_mass;
// compute etot + extra terms for conserved quantity // compute etot + extra terms for conserved quantity
double e_scale = compute_etotal() + compute_scalar(); double e_scale = compute_etotal() + compute_scalar();
...@@ -530,9 +524,9 @@ void FixMSST::initial_integrate(int vflag) ...@@ -530,9 +524,9 @@ void FixMSST::initial_integrate(int vflag)
for (i = 0; i < nlocal; i++) { for (i = 0; i < nlocal; i++) {
if (mask[i] & groupbit) { if (mask[i] & groupbit) {
for ( k = 0; k < 3; k++ ) { for ( k = 0; k < 3; k++ ) {
double C = f[i][k] * force->ftm2v / mass[type[i]]; const double C = f[i][k] * force->ftm2v / mass[type[i]];
TS_term = TS_dot/(mass[type[i]]*velocity_sum); const double TS_term = TS_dot/(mass[type[i]]*velocity_sum);
escale_term = force->ftm2v*beta*(e0-e_scale) / const double escale_term = force->ftm2v*beta*(e0-e_scale) /
(mass[type[i]]*velocity_sum); (mass[type[i]]*velocity_sum);
double D = mu * omega[sd] * omega[sd] / double D = mu * omega[sd] * omega[sd] /
(velocity_sum * mass[type[i]] * vol ); (velocity_sum * mass[type[i]] * vol );
...@@ -540,7 +534,7 @@ void FixMSST::initial_integrate(int vflag) ...@@ -540,7 +534,7 @@ void FixMSST::initial_integrate(int vflag)
old_velocity[i][k] = v[i][k]; old_velocity[i][k] = v[i][k];
if ( k == direction ) D -= 2.0 * omega[sd] / vol; if ( k == direction ) D -= 2.0 * omega[sd] / vol;
if ( fabs(dthalf * D) > 1.0e-06 ) { if ( fabs(dthalf * D) > 1.0e-06 ) {
double expd = exp(D * dthalf); const double expd = exp(D * dthalf);
v[i][k] = expd * ( C + D * v[i][k] - C / expd ) / D; v[i][k] = expd * ( C + D * v[i][k] - C / expd ) / D;
} else { } else {
v[i][k] = v[i][k] + ( C + D * v[i][k] ) * dthalf + v[i][k] = v[i][k] + ( C + D * v[i][k] ) * dthalf +
...@@ -553,15 +547,15 @@ void FixMSST::initial_integrate(int vflag) ...@@ -553,15 +547,15 @@ void FixMSST::initial_integrate(int vflag)
for (i = 0; i < nlocal; i++) { for (i = 0; i < nlocal; i++) {
if (mask[i] & groupbit) { if (mask[i] & groupbit) {
for ( k = 0; k < 3; k++ ) { for ( k = 0; k < 3; k++ ) {
double C = f[i][k] * force->ftm2v / mass[type[i]]; const double C = f[i][k] * force->ftm2v / mass[type[i]];
double D = mu * omega[sd] * omega[sd] / double D = mu * omega[sd] * omega[sd] /
(velocity_sum * mass[type[i]] * vol ); (velocity_sum * mass[type[i]] * vol );
old_velocity[i][k] = v[i][k]; old_velocity[i][k] = v[i][k];
if ( k == direction ) { if ( k == direction ) {
D = D - 2.0 * omega[sd] / vol; D -= 2.0 * omega[sd] / vol;
} }
if ( fabs(dthalf * D) > 1.0e-06 ) { if ( fabs(dthalf * D) > 1.0e-06 ) {
double expd = exp(D * dthalf); const double expd = exp(D * dthalf);
v[i][k] = expd * ( C + D * v[i][k] - C / expd ) / D; v[i][k] = expd * ( C + D * v[i][k] - C / expd ) / D;
} else { } else {
v[i][k] = v[i][k] + ( C + D * v[i][k] ) * dthalf + v[i][k] = v[i][k] + ( C + D * v[i][k] ) * dthalf +
...@@ -590,16 +584,16 @@ void FixMSST::initial_integrate(int vflag) ...@@ -590,16 +584,16 @@ void FixMSST::initial_integrate(int vflag)
for (i = 0; i < nlocal; i++) { for (i = 0; i < nlocal; i++) {
if (mask[i] & groupbit) { if (mask[i] & groupbit) {
for ( k = 0; k < 3; k++ ) { for ( k = 0; k < 3; k++ ) {
double C = f[i][k] * force->ftm2v / mass[type[i]]; const double C = f[i][k] * force->ftm2v / mass[type[i]];
TS_term = TS_dot/(mass[type[i]]*velocity_sum); const double TS_term = TS_dot/(mass[type[i]]*velocity_sum);
escale_term = force->ftm2v*beta*(e0-e_scale) / const double escale_term = force->ftm2v*beta*(e0-e_scale) /
(mass[type[i]]*velocity_sum); (mass[type[i]]*velocity_sum);
double D = mu * omega[sd] * omega[sd] / double D = mu * omega[sd] * omega[sd] /
(velocity_sum * mass[type[i]] * vol ); (velocity_sum * mass[type[i]] * vol );
D += escale_term - TS_term; D += escale_term - TS_term;
if ( k == direction ) D -= 2.0 * omega[sd] / vol; if ( k == direction ) D -= 2.0 * omega[sd] / vol;
if ( fabs(dthalf * D) > 1.0e-06 ) { if ( fabs(dthalf * D) > 1.0e-06 ) {
double expd = exp(D * dthalf); const double expd = exp(D * dthalf);
v[i][k] = expd * ( C + D * v[i][k] - C / expd ) / D; v[i][k] = expd * ( C + D * v[i][k] - C / expd ) / D;
} else { } else {
v[i][k] = v[i][k] + ( C + D * v[i][k] ) * dthalf + v[i][k] = v[i][k] + ( C + D * v[i][k] ) * dthalf +
...@@ -612,14 +606,14 @@ void FixMSST::initial_integrate(int vflag) ...@@ -612,14 +606,14 @@ void FixMSST::initial_integrate(int vflag)
for (i = 0; i < nlocal; i++) { for (i = 0; i < nlocal; i++) {
if (mask[i] & groupbit) { if (mask[i] & groupbit) {
for ( k = 0; k < 3; k++ ) { for ( k = 0; k < 3; k++ ) {
double C = f[i][k] * force->ftm2v / mass[type[i]]; const double C = f[i][k] * force->ftm2v / mass[type[i]];
double D = mu * omega[sd] * omega[sd] / double D = mu * omega[sd] * omega[sd] /
(velocity_sum * mass[type[i]] * vol ); (velocity_sum * mass[type[i]] * vol );
if ( k == direction ) { if ( k == direction ) {
D = D - 2.0 * omega[sd] / vol; D -= 2.0 * omega[sd] / vol;
} }
if ( fabs(dthalf * D) > 1.0e-06 ) { if ( fabs(dthalf * D) > 1.0e-06 ) {
double expd = exp(D * dthalf); const double expd = exp(D * dthalf);
v[i][k] = expd * ( C + D * v[i][k] - C / expd ) / D; v[i][k] = expd * ( C + D * v[i][k] - C / expd ) / D;
} else { } else {
v[i][k] = v[i][k] + ( C + D * v[i][k] ) * dthalf + v[i][k] = v[i][k] + ( C + D * v[i][k] ) * dthalf +
...@@ -669,7 +663,6 @@ void FixMSST::final_integrate() ...@@ -669,7 +663,6 @@ void FixMSST::final_integrate()
{ {
int i; int i;
double p_msst; // MSST driving pressure double p_msst; // MSST driving pressure
double TS_term,escale_term;
// v update only for atoms in MSST group // v update only for atoms in MSST group
...@@ -687,22 +680,38 @@ void FixMSST::final_integrate() ...@@ -687,22 +680,38 @@ void FixMSST::final_integrate()
double e_scale = compute_etotal() + compute_scalar(); double e_scale = compute_etotal() + compute_scalar();
// for DFTB, extract TS_dftb from fix external
// must convert energy to mv^2 units
if (dftb) {
const double TS_dftb = fix_external->compute_vector(0);
const double TS = force->ftm2v*TS_dftb;
S_elec_2 = S_elec_1;
S_elec_1 = S_elec;
const double Temp = temperature->compute_scalar();
// update S_elec terms and compute TS_dot via finite differences
S_elec = TS/Temp;
TS_dot = Temp*(3.0*S_elec-4.0*S_elec_1+S_elec_2)/(2.0*update->dt);
TS_int += (update->dt*TS_dot);
if (update->ntimestep == 1) T0S0 = TS;
}
// propagate particle velocities 1/2 step // propagate particle velocities 1/2 step
if (dftb) { if (dftb) {
for (i = 0; i < nlocal; i++) { for (i = 0; i < nlocal; i++) {
if (mask[i] & groupbit) { if (mask[i] & groupbit) {
for ( int k = 0; k < 3; k++ ) { for ( int k = 0; k < 3; k++ ) {
double C = f[i][k] * force->ftm2v / mass[type[i]]; const double C = f[i][k] * force->ftm2v / mass[type[i]];
TS_term = TS_dot/(mass[type[i]]*velocity_sum); const double TS_term = TS_dot/(mass[type[i]]*velocity_sum);
escale_term = force->ftm2v*beta*(e0-e_scale) / const double escale_term = force->ftm2v*beta*(e0-e_scale) /
(mass[type[i]]*velocity_sum); (mass[type[i]]*velocity_sum);
double D = mu * omega[sd] * omega[sd] / double D = mu * omega[sd] * omega[sd] /
(velocity_sum * mass[type[i]] * vol ); (velocity_sum * mass[type[i]] * vol );
D += escale_term - TS_term; D += escale_term - TS_term;
if ( k == direction ) D -= 2.0 * omega[sd] / vol; if ( k == direction ) D -= 2.0 * omega[sd] / vol;
if ( fabs(dthalf * D) > 1.0e-06 ) { if ( fabs(dthalf * D) > 1.0e-06 ) {
double expd = exp(D * dthalf); const double expd = exp(D * dthalf);
v[i][k] = expd * ( C + D * v[i][k] - C / expd ) / D; v[i][k] = expd * ( C + D * v[i][k] - C / expd ) / D;
} else { } else {
v[i][k] = v[i][k] + ( C + D * v[i][k] ) * dthalf + v[i][k] = v[i][k] + ( C + D * v[i][k] ) * dthalf +
...@@ -715,14 +724,14 @@ void FixMSST::final_integrate() ...@@ -715,14 +724,14 @@ void FixMSST::final_integrate()
for (i = 0; i < nlocal; i++) { for (i = 0; i < nlocal; i++) {
if (mask[i] & groupbit) { if (mask[i] & groupbit) {
for ( int k = 0; k < 3; k++ ) { for ( int k = 0; k < 3; k++ ) {
double C = f[i][k] * force->ftm2v / mass[type[i]]; const double C = f[i][k] * force->ftm2v / mass[type[i]];
double D = mu * omega[sd] * omega[sd] / double D = mu * omega[sd] * omega[sd] /
(velocity_sum * mass[type[i]] * vol ); (velocity_sum * mass[type[i]] * vol );
if ( k == direction ) { if ( k == direction ) {
D = D - 2.0 * omega[sd] / vol; D -= 2.0 * omega[sd] / vol;
} }
if ( fabs(dthalf * D) > 1.0e-06 ) { if ( fabs(dthalf * D) > 1.0e-06 ) {
double expd = exp(D * dthalf); const double expd = exp(D * dthalf);
v[i][k] = expd * ( C + D * v[i][k] - C / expd ) / D; v[i][k] = expd * ( C + D * v[i][k] - C / expd ) / D;
} else { } else {
v[i][k] = v[i][k] + ( C + D * v[i][k] ) * dthalf + v[i][k] = v[i][k] + ( C + D * v[i][k] ) * dthalf +
...@@ -748,7 +757,7 @@ void FixMSST::final_integrate() ...@@ -748,7 +757,7 @@ void FixMSST::final_integrate()
( v0 - vol )/( v0 * v0 ); ( v0 - vol )/( v0 * v0 );
double A = total_mass * ( p_current[sd] - p0 - p_msst ) / double A = total_mass * ( p_current[sd] - p0 - p_msst ) /
( qmass * nktv2p * mvv2e ); ( qmass * nktv2p * mvv2e );
double B = total_mass * mu / ( qmass * vol ); const double B = total_mass * mu / ( qmass * vol );
// prevent blow-up of the volume // prevent blow-up of the volume
...@@ -950,7 +959,9 @@ double FixMSST::compute_scalar() ...@@ -950,7 +959,9 @@ double FixMSST::compute_scalar()
// subtract off precomputed TS_int integral value // subtract off precomputed TS_int integral value
energy -= TS_int; if (dftb) { // TS_int == 0 for non DFTB calculations
energy -= TS_int;
}
return energy; return energy;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment