| 50 | 
  | 
namespace oopse { | 
| 51 | 
  | 
  NPrT::NPrT(SimInfo* info) : NPT(info) { | 
| 52 | 
  | 
    Globals* simParams = info_->getSimParams(); | 
| 53 | 
< | 
    if (!simParams->haveTargetStress())  | 
| 53 | 
> | 
    if (!simParams->haveSurfaceTension()) { | 
| 54 | 
  | 
      sprintf(painCave.errMsg, | 
| 55 | 
  | 
              "If you use the NPT integrator, you must set tauBarostat.\n"); | 
| 56 | 
  | 
      painCave.severity = OOPSE_ERROR; | 
| 57 | 
  | 
      painCave.isFatal = 1; | 
| 58 | 
  | 
      simError(); | 
| 59 | 
  | 
    } else { | 
| 60 | 
< | 
      targetStress= simParams->getTargetStress(); | 
| 60 | 
> | 
      surfaceTension= simParams->getSurfaceTension(); | 
| 61 | 
  | 
    } | 
| 62 | 
  | 
 | 
| 63 | 
  | 
  } | 
| 64 | 
  | 
  void NPrT::evolveEtaA() { | 
| 65 | 
+ | 
    Mat3x3d hmat = currentSnapshot_->getHmat(); | 
| 66 | 
+ | 
    double hz = hmat(2, 2); | 
| 67 | 
+ | 
    double Axy = hmat(0,0) * hmat(1, 1); | 
| 68 | 
  | 
    double sx = -hz * (press(0, 0) - targetPressure/OOPSEConstant::pressureConvert); | 
| 69 | 
  | 
    double sy = -hz * (press(1, 1) - targetPressure/OOPSEConstant::pressureConvert); | 
| 70 | 
< | 
    eta(0,0) -= Axy * (sx - targetStress) / (NkBT*tb2); | 
| 71 | 
< | 
    eta(1,1) -= Axy * (sy - targetStress) / (NkBT*tb2); | 
| 70 | 
> | 
    eta(0,0) -= Axy * (sx - surfaceTension) / (NkBT*tb2); | 
| 71 | 
> | 
    eta(1,1) -= Axy * (sy - surfaceTension) / (NkBT*tb2); | 
| 72 | 
  | 
    eta(2,2) += dt2 *  instaVol * (press(2, 2) - targetPressure/OOPSEConstant::pressureConvert) / (NkBT*tb2); | 
| 73 | 
  | 
    oldEta = eta;   | 
| 74 | 
  | 
  } | 
| 75 | 
  | 
 | 
| 76 | 
  | 
  void NPrT::evolveEtaB() { | 
| 77 | 
< | 
 | 
| 77 | 
> | 
    Mat3x3d hmat = currentSnapshot_->getHmat(); | 
| 78 | 
> | 
    double hz = hmat(2, 2); | 
| 79 | 
> | 
    double Axy = hmat(0,0) * hmat(1, 1); | 
| 80 | 
  | 
    prevEta = eta; | 
| 81 | 
  | 
    double sx = -hz * (press(0, 0) - targetPressure/OOPSEConstant::pressureConvert); | 
| 82 | 
  | 
    double sy = -hz * (press(1, 1) - targetPressure/OOPSEConstant::pressureConvert); | 
| 83 | 
< | 
    eta(0,0) -= Axy * (sx -targetStress) / (NkBT*tb2); | 
| 84 | 
< | 
    eta(1,1) -= Axy * (sy -targetStress) / (NkBT*tb2); | 
| 83 | 
> | 
    eta(0,0) = oldEta(0, 0) - Axy * (sx -surfaceTension) / (NkBT*tb2); | 
| 84 | 
> | 
    eta(1,1) = oldEta(1, 1) - Axy * (sy -surfaceTension) / (NkBT*tb2); | 
| 85 | 
  | 
    eta(2,2) = oldEta(2, 2) + dt2 *  instaVol * | 
| 86 | 
  | 
            (press(2, 2) - targetPressure/OOPSEConstant::pressureConvert) / (NkBT*tb2); | 
| 87 | 
  | 
  } | 
| 238 | 
  | 
    // of freedom).   | 
| 239 | 
  | 
    fkBT = info_->getNdf()*OOPSEConstant::kB *targetTemp;     | 
| 240 | 
  | 
     | 
| 236 | 
– | 
    double conservedQuantity; | 
| 237 | 
– | 
    double totalEnergy; | 
| 238 | 
– | 
    double thermostat_kinetic; | 
| 239 | 
– | 
    double thermostat_potential; | 
| 240 | 
– | 
    double barostat_kinetic; | 
| 241 | 
– | 
    double barostat_potential; | 
| 242 | 
– | 
    double trEta; | 
| 241 | 
  | 
 | 
| 242 | 
< | 
    totalEnergy = thermo.getTotalE(); | 
| 245 | 
< | 
 | 
| 246 | 
< | 
    thermostat_kinetic = fkBT * tt2 * chi * chi /(2.0 * OOPSEConstant::energyConvert); | 
| 242 | 
> | 
    double totalEnergy = thermo.getTotalE(); | 
| 243 | 
  | 
 | 
| 244 | 
< | 
    thermostat_potential = fkBT* integralOfChidt / OOPSEConstant::energyConvert; | 
| 244 | 
> | 
    double thermostat_kinetic = fkBT * tt2 * chi * chi /(2.0 * OOPSEConstant::energyConvert); | 
| 245 | 
  | 
 | 
| 246 | 
+ | 
    double thermostat_potential = fkBT* integralOfChidt / OOPSEConstant::energyConvert; | 
| 247 | 
+ | 
 | 
| 248 | 
  | 
    SquareMatrix<double, 3> tmp = eta.transpose() * eta; | 
| 249 | 
< | 
    trEta = tmp.trace(); | 
| 249 | 
> | 
    double trEta = tmp.trace(); | 
| 250 | 
  | 
     | 
| 251 | 
< | 
    barostat_kinetic = NkBT * tb2 * trEta /(2.0 * OOPSEConstant::energyConvert); | 
| 251 | 
> | 
    double barostat_kinetic = NkBT * tb2 * trEta /(2.0 * OOPSEConstant::energyConvert); | 
| 252 | 
  | 
 | 
| 253 | 
< | 
    barostat_potential = (targetPressure * thermo.getVolume() / OOPSEConstant::pressureConvert) /OOPSEConstant::energyConvert; | 
| 253 | 
> | 
    double barostat_potential = (targetPressure * thermo.getVolume() / OOPSEConstant::pressureConvert) /OOPSEConstant::energyConvert; | 
| 254 | 
  | 
 | 
| 255 | 
< | 
    conservedQuantity = totalEnergy + thermostat_kinetic + thermostat_potential + | 
| 256 | 
< | 
      barostat_kinetic + barostat_potential; | 
| 255 | 
> | 
    Mat3x3d hmat = currentSnapshot_->getHmat(); | 
| 256 | 
> | 
    double hz = hmat(2, 2); | 
| 257 | 
> | 
    double area = hmat(0,0) * hmat(1, 1); | 
| 258 | 
  | 
 | 
| 259 | 
+ | 
    double conservedQuantity = totalEnergy + thermostat_kinetic + thermostat_potential + | 
| 260 | 
+ | 
      barostat_kinetic + barostat_potential - surfaceTension * area; | 
| 261 | 
+ | 
 | 
| 262 | 
  | 
    return conservedQuantity; | 
| 263 | 
  | 
 | 
| 264 | 
  | 
  } |