| 2 | 
  | 
#include "simError.h" | 
| 3 | 
  | 
#include <cmath> | 
| 4 | 
  | 
template<typename T> ZConstraint<T>::ZConstraint(SimInfo* theInfo, ForceFields* the_ff)  | 
| 5 | 
< | 
                                    : T(theInfo, the_ff), fz(NULL), curZPos(NULL), | 
| 5 | 
> | 
                                    : T(theInfo, the_ff), fz(NULL), curZPos(NULL), fzOut(NULL), | 
| 6 | 
  | 
                                 indexOfZConsMols(NULL), forcePolicy(NULL), curZconsTime(0) | 
| 7 | 
  | 
{ | 
| 8 | 
  | 
 | 
| 27 | 
  | 
  double halfOfLargestBox = max(info->boxL[0], max(info->boxL[1], info->boxL[2])) /2; | 
| 28 | 
  | 
  zForceConst = Kb * info->target_temp /(halfOfLargestBox * halfOfLargestBox); | 
| 29 | 
  | 
 | 
| 30 | 
< | 
  //creat force substraction policy | 
| 30 | 
> | 
  //creat force Subtraction policy | 
| 31 | 
  | 
  data = info->getProperty(ZCONSFORCEPOLICY_ID); | 
| 32 | 
  | 
  if(!data){ | 
| 33 | 
  | 
    sprintf( painCave.errMsg, | 
| 34 | 
< | 
               "ZConstraint Warning: User does not set force substraction policy, " | 
| 34 | 
> | 
               "ZConstraint Warning: User does not set force Subtraction policy, " | 
| 35 | 
  | 
               "PolicyByMass is used\n"); | 
| 36 | 
  | 
    painCave.isFatal = 0; | 
| 37 | 
  | 
    simError();       | 
| 38 | 
  | 
 | 
| 39 | 
< | 
    forcePolicy = (ForceSubstractionPolicy*) new PolicyByMass(this); | 
| 39 | 
> | 
    forcePolicy = (ForceSubtractionPolicy*) new PolicyByMass(this); | 
| 40 | 
  | 
  } | 
| 41 | 
  | 
  else{ | 
| 42 | 
  | 
    policy = dynamic_cast<StringData*>(data); | 
| 48 | 
  | 
      painCave.isFatal = 0; | 
| 49 | 
  | 
      simError();       | 
| 50 | 
  | 
 | 
| 51 | 
< | 
      forcePolicy = (ForceSubstractionPolicy*) new PolicyByMass(this); | 
| 51 | 
> | 
      forcePolicy = (ForceSubtractionPolicy*) new PolicyByMass(this); | 
| 52 | 
  | 
    } | 
| 53 | 
  | 
    else{ | 
| 54 | 
  | 
      if(policy->getData() == "BYNUMBER") | 
| 55 | 
< | 
        forcePolicy = (ForceSubstractionPolicy*) new PolicyByNumber(this); | 
| 55 | 
> | 
        forcePolicy = (ForceSubtractionPolicy*) new PolicyByNumber(this); | 
| 56 | 
  | 
      else if(policy->getData() == "BYMASS") | 
| 57 | 
< | 
        forcePolicy = (ForceSubstractionPolicy*) new PolicyByMass(this); | 
| 57 | 
> | 
        forcePolicy = (ForceSubtractionPolicy*) new PolicyByMass(this); | 
| 58 | 
  | 
      else{ | 
| 59 | 
  | 
        sprintf( painCave.errMsg, | 
| 60 | 
< | 
                  "ZConstraint Warning: unknown force substraction policy, " | 
| 60 | 
> | 
                  "ZConstraint Warning: unknown force Subtraction policy, " | 
| 61 | 
  | 
                  "PolicyByMass is used\n"); | 
| 62 | 
  | 
        painCave.isFatal = 0; | 
| 63 | 
  | 
        simError();       | 
| 64 | 
< | 
        forcePolicy = (ForceSubstractionPolicy*) new PolicyByMass(this); | 
| 64 | 
> | 
        forcePolicy = (ForceSubtractionPolicy*) new PolicyByMass(this); | 
| 65 | 
  | 
      }    | 
| 66 | 
  | 
    } | 
| 67 | 
  | 
  } | 
| 279 | 
  | 
      zPos.push_back((*parameters)[searchResult].zPos); | 
| 280 | 
  | 
//       cout << "index: "<< (*parameters)[searchResult].zconsIndex  | 
| 281 | 
  | 
//              <<"\tzPos = " << (*parameters)[searchResult].zPos << endl;  | 
| 282 | 
– | 
      kz.push_back((*parameters)[searchResult]. kRatio * zForceConst); | 
| 282 | 
  | 
       | 
| 283 | 
+ | 
      kz.push_back((*parameters)[searchResult]. kRatio * zForceConst); | 
| 284 | 
  | 
      molecules[i].getCOM(COM); | 
| 285 | 
  | 
    } | 
| 286 | 
  | 
    else | 
| 330 | 
  | 
                      MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);   | 
| 331 | 
  | 
#endif | 
| 332 | 
  | 
 | 
| 333 | 
– | 
 | 
| 333 | 
  | 
  //get total number of unconstrained atoms | 
| 334 | 
  | 
  int nUnconsAtoms_local; | 
| 335 | 
  | 
  nUnconsAtoms_local = 0; | 
| 343 | 
  | 
                      MPI_INT,MPI_SUM, MPI_COMM_WORLD);   | 
| 344 | 
  | 
#endif   | 
| 345 | 
  | 
 | 
| 347 | 
– | 
  // creat zconsWriter   | 
| 348 | 
– | 
  fzOut = new ZConsWriter(zconsOutput.c_str(), parameters);    | 
| 349 | 
– | 
   | 
| 350 | 
– | 
  if(!fzOut){ | 
| 351 | 
– | 
    sprintf( painCave.errMsg, | 
| 352 | 
– | 
             "Memory allocation failure in class Zconstraint\n"); | 
| 353 | 
– | 
    painCave.isFatal = 1; | 
| 354 | 
– | 
    simError(); | 
| 355 | 
– | 
  } | 
| 356 | 
– | 
 | 
| 346 | 
  | 
  forcePolicy->update(); | 
| 347 | 
  | 
} | 
| 348 | 
  | 
 | 
| 394 | 
  | 
      zconsMols.push_back(&molecules[i]);       | 
| 395 | 
  | 
      zPos.push_back((*parameters)[index].zPos); | 
| 396 | 
  | 
      kz.push_back((*parameters)[index].kRatio * zForceConst); | 
| 408 | 
– | 
       | 
| 397 | 
  | 
      massOfZConsMols.push_back(molecules[i].getTotalMass());   | 
| 398 | 
  | 
        | 
| 399 | 
  | 
      molecules[i].getCOM(COM); | 
| 494 | 
  | 
} | 
| 495 | 
  | 
 | 
| 496 | 
  | 
template<typename T> void ZConstraint<T>::integrate(){ | 
| 497 | 
+ | 
 | 
| 498 | 
+ | 
  // creat zconsWriter   | 
| 499 | 
+ | 
  fzOut = new ZConsWriter(zconsOutput.c_str(), parameters);    | 
| 500 | 
  | 
   | 
| 501 | 
+ | 
  if(!fzOut){ | 
| 502 | 
+ | 
    sprintf( painCave.errMsg, | 
| 503 | 
+ | 
             "Memory allocation failure in class Zconstraint\n"); | 
| 504 | 
+ | 
    painCave.isFatal = 1; | 
| 505 | 
+ | 
    simError(); | 
| 506 | 
+ | 
  } | 
| 507 | 
+ | 
   | 
| 508 | 
  | 
  //zero out the velocities of center of mass of unconstrained molecules  | 
| 509 | 
  | 
  //and the velocities of center of mass of every single z-constrained molecueles | 
| 510 | 
  | 
  zeroOutVel(); | 
| 530 | 
  | 
 | 
| 531 | 
  | 
  T::calcForce(calcPot, calcStress); | 
| 532 | 
  | 
 | 
| 533 | 
< | 
  if (checkZConsState()){ | 
| 534 | 
< | 
     | 
| 537 | 
< | 
#ifdef IS_MPI | 
| 538 | 
< | 
    if(worldRank == 0){ | 
| 539 | 
< | 
#endif | 
| 540 | 
< | 
//       std::cerr << "\n" | 
| 541 | 
< | 
//              << "*******************************************\n" | 
| 542 | 
< | 
//              << " about to call zeroOutVel()\n" | 
| 543 | 
< | 
//              << "*******************************************\n" | 
| 544 | 
< | 
//              << "\n"; | 
| 545 | 
< | 
#ifdef IS_MPI | 
| 546 | 
< | 
    } | 
| 547 | 
< | 
#endif | 
| 548 | 
< | 
    zeroOutVel(); | 
| 549 | 
< | 
 | 
| 550 | 
< | 
#ifdef IS_MPI | 
| 551 | 
< | 
    if(worldRank == 0){ | 
| 552 | 
< | 
#endif | 
| 553 | 
< | 
//       std::cerr << "\n" | 
| 554 | 
< | 
//              << "*******************************************\n" | 
| 555 | 
< | 
//              << " finished zeroOutVel()\n" | 
| 556 | 
< | 
//              << "*******************************************\n" | 
| 557 | 
< | 
//              << "\n"; | 
| 558 | 
< | 
#ifdef IS_MPI | 
| 559 | 
< | 
    } | 
| 560 | 
< | 
#endif | 
| 561 | 
< | 
     | 
| 533 | 
> | 
  if (checkZConsState()){     | 
| 534 | 
> | 
    zeroOutVel();     | 
| 535 | 
  | 
    forcePolicy->update(); | 
| 536 | 
  | 
  }   | 
| 537 | 
  | 
   | 
| 540 | 
  | 
#ifdef IS_MPI | 
| 541 | 
  | 
  if(worldRank == 0){ | 
| 542 | 
  | 
#endif | 
| 543 | 
< | 
//     cout << "---------------------------------------------------------------------" <<endl; | 
| 544 | 
< | 
//     cout << "current time: " << info->getTime() << endl; | 
| 545 | 
< | 
//     cout << "center of mass at z: " << zsys << endl;      | 
| 546 | 
< | 
//     cout << "before calcForce, the COMVel of system is " << zSysCOMVel <<endl; | 
| 543 | 
> | 
     //cout << "---------------------------------------------------------------------" <<endl; | 
| 544 | 
> | 
     //cout << "current time: " << info->getTime() << endl; | 
| 545 | 
> | 
     //cout << "center of mass at z: " << zsys << endl;      | 
| 546 | 
> | 
     //cout << "before calcForce, the COMVel of system is " << zSysCOMVel <<endl; | 
| 547 | 
  | 
 | 
| 548 | 
  | 
#ifdef IS_MPI | 
| 549 | 
  | 
  } | 
| 582 | 
  | 
#ifdef IS_MPI | 
| 583 | 
  | 
  if(worldRank == 0){ | 
| 584 | 
  | 
#endif | 
| 585 | 
< | 
 //    cout << "after calcForce, the COMVel of system is " << zSysCOMVel <<endl; | 
| 585 | 
> | 
     //cout << "after calcForce, the COMVel of system is " << zSysCOMVel <<endl; | 
| 586 | 
  | 
#ifdef IS_MPI | 
| 587 | 
  | 
  } | 
| 588 | 
  | 
#endif | 
| 659 | 
  | 
    if (states[i] == zcsFixed){  | 
| 660 | 
  | 
 | 
| 661 | 
  | 
     zconsMols[i]->getCOMvel(COMvel);       | 
| 662 | 
< | 
    //cout << "before resetting " << indexOfZConsMols[i] <<"'s vz is " << COMvel[whichDirection] << endl; | 
| 662 | 
> | 
     //cout << "before resetting " << indexOfZConsMols[i] <<"'s vz is " << COMvel[whichDirection] << endl; | 
| 663 | 
  | 
 | 
| 664 | 
  | 
      fixedZAtoms = zconsMols[i]->getMyAtoms();  | 
| 665 | 
  | 
     | 
| 681 | 
  | 
#ifdef IS_MPI | 
| 682 | 
  | 
  if(worldRank == 0){ | 
| 683 | 
  | 
#endif | 
| 684 | 
< | 
//     cout << "before resetting the COMVel of sytem is " << zSysCOMVel << endl;   | 
| 684 | 
> | 
     //cout << "before resetting the COMVel of sytem is " << zSysCOMVel << endl;   | 
| 685 | 
  | 
#ifdef IS_MPI | 
| 686 | 
  | 
  } | 
| 687 | 
  | 
#endif | 
| 755 | 
  | 
#ifdef IS_MPI | 
| 756 | 
  | 
  if(worldRank == 0){ | 
| 757 | 
  | 
#endif | 
| 758 | 
< | 
//     cout << "after resetting the COMVel of moving molecules is " << zSysCOMVel << endl;   | 
| 758 | 
> | 
     //cout << "after resetting the COMVel of moving molecules is " << zSysCOMVel << endl;   | 
| 759 | 
  | 
#ifdef IS_MPI | 
| 760 | 
  | 
  } | 
| 761 | 
  | 
#endif | 
| 781 | 
  | 
  totalFZ_local = 0; | 
| 782 | 
  | 
 | 
| 783 | 
  | 
  //calculate the total z-contrained force of fixed z-contrained molecules | 
| 784 | 
+ | 
   | 
| 785 | 
+ | 
  //cout << "before zero out z-constraint force on fixed z-constraint molecuels " | 
| 786 | 
+ | 
  //       << "total force is " << calcTotalForce() << endl; | 
| 787 | 
  | 
 | 
| 788 | 
  | 
  for(int i = 0; i < zconsMols.size(); i++){ | 
| 789 | 
  | 
     | 
| 801 | 
  | 
 | 
| 802 | 
  | 
      //cout << "Fixed Molecule\tindex: " << indexOfZConsMols[i]  | 
| 803 | 
  | 
      //      <<"\tcurrent zpos: " << COM[whichDirection]  | 
| 804 | 
< | 
      //       << "\tcurrent fz: " <<fz[i] << endl; | 
| 804 | 
> | 
      //      << "\tcurrent fz: " <<fz[i] << endl; | 
| 805 | 
  | 
 | 
| 806 | 
  | 
 | 
| 807 | 
  | 
    } | 
| 838 | 
  | 
   | 
| 839 | 
  | 
  }  | 
| 840 | 
  | 
 | 
| 841 | 
< | 
//   cout << "after zero out z-constraint force on fixed z-constraint molecuels " | 
| 842 | 
< | 
//        << "total force is " << calcTotalForce() << endl; | 
| 841 | 
> | 
  //cout << "after zero out z-constraint force on fixed z-constraint molecuels " | 
| 842 | 
> | 
  //      << "total force is " << calcTotalForce() << endl; | 
| 843 | 
> | 
    | 
| 844 | 
  | 
 | 
| 845 | 
  | 
  force[0]= 0; | 
| 846 | 
  | 
  force[1]= 0; | 
| 872 | 
  | 
      } | 
| 873 | 
  | 
    } | 
| 874 | 
  | 
  } | 
| 875 | 
+ | 
//  cout << "after substracting z-constraint force from moving molecuels " | 
| 876 | 
+ | 
//        << "total force is " << calcTotalForce()  << endl; | 
| 877 | 
  | 
 | 
| 899 | 
– | 
  //cout << "after substracting z-constraint force from moving molecuels " | 
| 900 | 
– | 
  //      << "total force is " << calcTotalForce()  << endl; | 
| 901 | 
– | 
 | 
| 878 | 
  | 
} | 
| 879 | 
  | 
 | 
| 880 | 
  | 
/** | 
| 931 | 
  | 
  MPI_Allreduce(&totalFZ_local, &totalFZ, 1, MPI_DOUBLE,MPI_SUM, MPI_COMM_WORLD);   | 
| 932 | 
  | 
#endif | 
| 933 | 
  | 
 | 
| 934 | 
+ | 
  //cout << "before substracting harmonic force from moving molecuels " | 
| 935 | 
+ | 
  //      << "total force is " << calcTotalForce()  << endl; | 
| 936 | 
+ | 
 | 
| 937 | 
  | 
  force[0]= 0; | 
| 938 | 
  | 
  force[1]= 0; | 
| 939 | 
  | 
  force[2]= 0; | 
| 949 | 
  | 
       unconsAtoms[j]->addFrc(force);      | 
| 950 | 
  | 
     } | 
| 951 | 
  | 
  }    | 
| 952 | 
+ | 
 | 
| 953 | 
+ | 
  //cout << "after substracting harmonic force from moving molecuels " | 
| 954 | 
+ | 
  //      << "total force is " << calcTotalForce()  << endl; | 
| 955 | 
  | 
 | 
| 956 | 
  | 
} | 
| 957 | 
  | 
 | 
| 1169 | 
  | 
  nMovingZAtoms = nMovingZAtoms_local; | 
| 1170 | 
  | 
#endif | 
| 1171 | 
  | 
  totNumOfMovingAtoms = nMovingZAtoms + zconsIntegrator->totNumOfUnconsAtoms; | 
| 1190 | 
– | 
 | 
| 1191 | 
– | 
#ifdef IS_MPI | 
| 1192 | 
– | 
  if(worldRank == 0){ | 
| 1193 | 
– | 
#endif | 
| 1194 | 
– | 
 //    std::cerr << "\n" | 
| 1195 | 
– | 
//            << "*******************************************\n" | 
| 1196 | 
– | 
//            << " fiished Policy by numbr()\n" | 
| 1197 | 
– | 
//            << "*******************************************\n" | 
| 1198 | 
– | 
//            << "\n"; | 
| 1199 | 
– | 
#ifdef IS_MPI | 
| 1200 | 
– | 
  } | 
| 1201 | 
– | 
#endif | 
| 1172 | 
  | 
} | 
| 1173 | 
  | 
 | 
| 1174 | 
  | 
template<typename T>double ZConstraint<T>::PolicyByNumber::getZFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce){ | 
| 1206 | 
  | 
#else | 
| 1207 | 
  | 
  massOfMovingZAtoms = massOfMovingZAtoms_local; | 
| 1208 | 
  | 
#endif | 
| 1209 | 
< | 
  totMassOfMovingAtoms = massOfMovingZAtoms_local + zconsIntegrator->totalMassOfUncons; | 
| 1209 | 
> | 
  totMassOfMovingAtoms = massOfMovingZAtoms + zconsIntegrator->totalMassOfUncons; | 
| 1210 | 
  | 
} | 
| 1211 | 
  | 
 | 
| 1212 | 
  | 
template<typename T> double ZConstraint<T>::PolicyByMass::getZFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce){ |