ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/ZConstraint.cpp
(Generate patch)

Comparing trunk/OOPSE/libmdtools/ZConstraint.cpp (file contents):
Revision 696 by tim, Thu Aug 14 16:16:39 2003 UTC vs.
Revision 699 by tim, Fri Aug 15 19:24:13 2003 UTC

# Line 2 | Line 2 | template<typename T> ZConstraint<T>::ZConstraint(SimIn
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),
6 <                                      indexOfZConsMols(NULL)
5 >                                    : T(theInfo, the_ff), fz(NULL), curZPos(NULL),
6 >                                                         indexOfZConsMols(NULL), forcePolicy(NULL), curZconsTime(0)
7   {
8  
9    //get properties from SimInfo
# Line 11 | Line 11 | template<typename T> ZConstraint<T>::ZConstraint(SimIn
11    ZConsParaData* zConsParaData;
12    DoubleData* sampleTime;
13    DoubleData* tolerance;
14 +  StringData* policy;
15    StringData* filename;
16    double COM[3];
17  
# Line 25 | Line 26 | template<typename T> ZConstraint<T>::ZConstraint(SimIn
26    
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
31 +  data = info->getProperty(ZCONSFORCEPOLICY_ID);
32 +  if(!data){
33 +    sprintf( painCave.errMsg,
34 +               "ZConstraint Warning: User does not set force substraction policy, "
35 +               "average force substraction policy is used\n");
36 +    painCave.isFatal = 0;
37 +    simError();      
38 +
39 +    forcePolicy = (ForceSubstractionPolicy*) new PolicyByNumber(this);
40 +  }
41 +  else{
42 +    policy = dynamic_cast<StringData*>(data);
43 +                
44 +         if(!policy){
45 +      sprintf( painCave.errMsg,
46 +                 "ZConstraint Error: Convertion from GenericData to StringData failure, "
47 +                 "average force substraction policy is used\n");
48 +      painCave.isFatal = 0;
49 +      simError();      
50  
51 +      forcePolicy = (ForceSubstractionPolicy*) new PolicyByNumber(this);
52 +         }
53 +         else{
54 +                if(policy->getData() == "BYNUMBER")
55 +         forcePolicy = (ForceSubstractionPolicy*) new PolicyByNumber(this);
56 +                else if(policy->getData() == "BYMASS")
57 +         forcePolicy = (ForceSubstractionPolicy*) new PolicyByMass(this);
58 +                else{
59 +        sprintf( painCave.errMsg,
60 +                  "ZConstraint Warning: unknown force substraction policy, "
61 +                  "average force substraction policy is used\n");
62 +        painCave.isFatal = 0;
63 +        simError();      
64 +           }            
65 +         }
66 +  }
67 +        
68 +  
69 +
70    //retrieve sample time of z-contraint
71    data = info->getProperty(ZCONSTIME_ID);
72    
# Line 238 | Line 279 | template<typename T> ZConstraint<T>::ZConstraint(SimIn
279        massOfZConsMols.push_back(molecules[i].getTotalMass());  
280  
281        zPos.push_back((*parameters)[searchResult].zPos);
282 +                cout << "index: "<< (*parameters)[searchResult].zconsIndex <<"\tzPos = " << (*parameters)[searchResult].zPos << endl;
283             kz.push_back((*parameters)[searchResult]. kRatio * zForceConst);
284        
285        molecules[i].getCOM(COM);
# Line 252 | Line 294 | template<typename T> ZConstraint<T>::ZConstraint(SimIn
294    }
295  
296    fz = new double[zconsMols.size()];
297 +  curZPos = new double[zconsMols.size()];
298    indexOfZConsMols = new int [zconsMols.size()];
299  
300 <  if(!fz || !indexOfZConsMols){
300 >  if(!fz || !curZPos || !indexOfZConsMols){
301      sprintf( painCave.errMsg,
302               "Memory allocation failure in class Zconstraint\n");
303      painCave.isFatal = 1;
# Line 284 | Line 327 | template<typename T> ZConstraint<T>::ZConstraint(SimIn
327   #ifndef IS_MPI
328    totalMassOfUncons = totalMassOfUncons_local;
329   #else
330 <  MPI_Allreduce(&totalMassOfUncons_local, &totalMassOfUncons, 1, MPI_DOUBLE,MPI_SUM, MPI_COMM_WORLD);  
330 >  MPI_Allreduce(&totalMassOfUncons_local, &totalMassOfUncons, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);  
331   #endif
332  
333  
# Line 297 | Line 340 | template<typename T> ZConstraint<T>::ZConstraint(SimIn
340   #ifndef IS_MPI
341    totNumOfUnconsAtoms = nUnconsAtoms_local;
342   #else
343 <  MPI_Allreduce(&nUnconsAtoms_local, &totNumOfUnconsAtoms, 1, MPI_DOUBLE,MPI_SUM, MPI_COMM_WORLD);  
343 >  MPI_Allreduce(&nUnconsAtoms_local, &totNumOfUnconsAtoms, 1, MPI_INT,MPI_SUM, MPI_COMM_WORLD);  
344   #endif  
345  
346    // creat zconsWriter  
347 <  fzOut = new ZConsWriter(zconsOutput.c_str());  
347 >  fzOut = new ZConsWriter(zconsOutput.c_str(), parameters);  
348    
349    if(!fzOut){
350      sprintf( painCave.errMsg,
# Line 309 | Line 352 | template<typename T> ZConstraint<T>::ZConstraint(SimIn
352      painCave.isFatal = 1;
353      simError();
354    }
355 <  
355 >
356 >  forcePolicy->update();
357   }
358  
359   template<typename T> ZConstraint<T>::~ZConstraint()
360   {
361    if(fz)
362      delete[] fz;
363 +
364 +  if(curZPos)
365 +    delete[] curZPos;
366    
367    if(indexOfZConsMols)
368      delete[] indexOfZConsMols;
369    
370    if(fzOut)
371      delete fzOut;
372 +        
373 +  if(forcePolicy)
374 +    delete forcePolicy;
375   }
376  
377   #ifdef IS_MPI
# Line 377 | Line 427 | template<typename T> void ZConstraint<T>::update()
427    // that we want to make the MPI communication simple
428    if(fz)
429      delete[] fz;
430 +        
431 +  if(curZPos)
432 +    delete[] curZPos;
433      
434    if(indexOfZConsMols)
435      delete[] indexOfZConsMols;
436      
437    if (zconsMols.size() > 0){
438      fz = new double[zconsMols.size()];
439 +         curZPos = new double[zconsMols.size()];
440      indexOfZConsMols =  new int[zconsMols.size()];
441      
442 <    if(!fz || !indexOfZConsMols){
442 >    if(!fz || !curZPos || !indexOfZConsMols){
443        sprintf( painCave.errMsg,
444                 "Memory allocation failure in class Zconstraint\n");
445        painCave.isFatal = 1;
# Line 399 | Line 453 | template<typename T> void ZConstraint<T>::update()
453    }
454    else{
455      fz = NULL;
456 +         curZPos = NULL;
457      indexOfZConsMols = NULL;
458    }
459 +        
460 +  //
461 +  forcePolicy->update();
462    
463   }
464  
# Line 459 | Line 517 | template<typename T> void ZConstraint<T>::calcForce(in
517   */
518   template<typename T> void ZConstraint<T>::calcForce(int calcPot, int calcStress){
519    double zsys;
520 +  double COM[3];
521 +  double force[3];
522  
523    T::calcForce(calcPot, calcStress);
524  
525 <  if (checkZConsState())
525 >  if (checkZConsState()){
526      zeroOutVel();
527 <  
527 >         forcePolicy->update();
528 >  }  
529    zsys = calcZSys();
530    cout << "---------------------------------------------------------------------" <<endl;
531    cout << "current time: " << info->getTime() << endl;
# Line 484 | Line 545 | template<typename T> void ZConstraint<T>::calcForce(in
545  
546    //cout <<      "after doHarmonic, totalForce is " << calcTotalForce() << endl;
547  
548 <  fzOut->writeFZ(info->getTime(), zconsMols.size(),indexOfZConsMols, fz);
548 >  //write out forces and current positions of z-constraint molecules
549 >  if(info->getTime() >= curZconsTime){          
550 >         for(int i = 0; i < zconsMols.size(); i++){
551 >      zconsMols[i]->getCOM(COM);
552 >                curZPos[i] = COM[whichDirection];
553 >
554 >                //if the z-constraint molecule is still moving, just record its force
555 >                if(states[i] == zcsMoving){
556 >         fz[i] = 0;
557 >                  Atom** movingZAtoms;
558 >                  movingZAtoms = zconsMols[i]->getMyAtoms();
559 >                  for(int j = 0; j < zconsMols[i]->getNAtoms(); j++){
560 >           movingZAtoms[j]->getFrc(force);
561 >           fz[i] += force[whichDirection];
562 >                  }
563 >           }
564 >         }
565 >    fzOut->writeFZ(info->getTime(), zconsMols.size(), indexOfZConsMols, fz, curZPos);
566 >         curZconsTime += zconsTime;
567 >  }
568 >        
569    //cout << "after calcForce, the COMVel of moving molecules is " << calcMovingMolsCOMVel() <<endl;
570    cout << "after calcForce, the COMVel of system is " << calcSysCOMVel() <<endl;
571   }
# Line 513 | Line 594 | template<typename T> double ZConstraint<T>::calcZSys()
594  
595    
596   #ifdef IS_MPI  
597 <  MPI_Allreduce(&totalMass_local, &totalMass, 1, MPI_DOUBLE,MPI_SUM, MPI_COMM_WORLD);
598 <  MPI_Allreduce(&totalMZ_local, &totalMZ, 1, MPI_DOUBLE,MPI_SUM, MPI_COMM_WORLD);  
597 >  MPI_Allreduce(&totalMass_local, &totalMass, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
598 >  MPI_Allreduce(&totalMZ_local, &totalMZ, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);  
599   #else
600    totalMass = totalMass_local;
601    totalMZ = totalMZ_local;
# Line 571 | Line 652 | template<typename T> void ZConstraint<T>::zeroOutVel()
652    }
653  
654          //cout << "before resetting the COMVel of moving molecules is " << calcMovingMolsCOMVel() <<endl;      
655 <        cout << "before resetting the COMVel of sytem is " << calcSysCOMVel() << endl;  
655 >
656 > #ifdef IS_MPI
657 >  if (worldRank == 0){
658 > #endif
659 >    cout << "before resetting the COMVel of sytem is " << calcSysCOMVel() << endl;      
660 > #ifdef IS_MPI
661 >  }
662 > #endif
663                    
664    // calculate the vz of center of mass of unconstrained molecules and moving z-constrained molecules
665    double MVzOfMovingMols_local;
# Line 637 | Line 725 | template<typename T> void ZConstraint<T>::zeroOutVel()
725  
726   }
727  
728 + #ifdef IS_MPI
729 +  if (worldRank == 0){
730 + #endif
731          cout << "after resetting the COMVel of moving molecules is " << calcSysCOMVel() <<endl;
732 + #ifdef IS_MPI
733 +  }
734 + #endif
735  
736   }
737  
# Line 658 | Line 752 | template<typename T> void ZConstraint<T>::doZconstrain
752    totalFZ_local = 0;
753  
754    //calculate the total z-contrained force of fixed z-contrained molecules
755 <  cout << "Fixed Molecules" << endl;
755 >
756 > #ifdef IS_MPI
757 >  if (worldRank == 0){
758 > #endif
759 >    cout << "Fixed Molecules" << endl;
760 > #ifdef IS_MPI
761 >  }
762 > #endif
763 >
764    for(int i = 0; i < zconsMols.size(); i++){
765                  
766      if (states[i] == zcsFixed){
# Line 680 | Line 782 | template<typename T> void ZConstraint<T>::doZconstrain
782      }
783            
784    }
785 +
786 +  //calculate total z-constraint force
787 + #ifdef IS_MPI
788 +  MPI_Allreduce(&totalFZ_local, &totalFZ, 1, MPI_DOUBLE,MPI_SUM, MPI_COMM_WORLD);
789 + #else
790 +  totalFZ = totalFZ_local;
791 + #endif
792 +
793          
794    // apply negative to fixed z-constrained molecues;
795    force[0]= 0;
# Line 694 | Line 804 | template<typename T> void ZConstraint<T>::doZconstrain
804        zconsAtoms = zconsMols[i]->getMyAtoms();  
805      
806        for(int j =0; j < nAtomOfCurZConsMol; j++) {
807 <        force[whichDirection] = -fz[i]/ nAtomOfCurZConsMol;
807 >                  force[whichDirection] = -fz[i]/ nAtomOfCurZConsMol;
808 >        //force[whichDirection] = - forcePolicy->getZFOfFixedZMols(zconsMols[i], zconsAtoms[j], fz[i]);
809          zconsAtoms[j]->addFrc(force);
810        }
811                  
# Line 702 | Line 813 | template<typename T> void ZConstraint<T>::doZconstrain
813          
814    }
815  
816 <  cout << "after zero out z-constraint force on fixed z-constraint molecuels "
817 <                  << "total force is " << calcTotalForce() << endl;
816 >  //cout << "after zero out z-constraint force on fixed z-constraint molecuels "
817 >  //               << "total force is " << calcTotalForce() << endl;
818 >
819    //calculate the number of atoms of moving z-constrained molecules
820    int nMovingZAtoms_local;
821    int nMovingZAtoms;
# Line 714 | Line 826 | template<typename T> void ZConstraint<T>::doZconstrain
826             nMovingZAtoms_local += zconsMols[i]->getNAtoms();
827    
828   #ifdef IS_MPI
717  MPI_Allreduce(&totalFZ_local, &totalFZ, 1, MPI_DOUBLE,MPI_SUM, MPI_COMM_WORLD);
829    MPI_Allreduce(&nMovingZAtoms_local, &nMovingZAtoms, 1, MPI_DOUBLE,MPI_SUM, MPI_COMM_WORLD);
830   #else
720  totalFZ = totalFZ_local;
831    nMovingZAtoms = nMovingZAtoms_local;
832   #endif
833  
834    force[0]= 0;
835    force[1]= 0;
836    force[2]= 0;
727  force[whichDirection] = totalFZ / (totNumOfUnconsAtoms + nMovingZAtoms);
837  
838    //modify the forces of unconstrained molecules
730  int accessCount = 0;
839    for(int i = 0; i < unconsMols.size(); i++){
840      
841       Atom** unconsAtoms = unconsMols[i]->getMyAtoms();
842      
843 <     for(int j = 0; j < unconsMols[i]->getNAtoms(); j++)          
843 >     for(int j = 0; j < unconsMols[i]->getNAtoms(); j++){          
844 >       force[whichDirection] = totalFZ / (totNumOfUnconsAtoms + nMovingZAtoms);
845 >       //force[whichDirection] = forcePolicy->getZFOfMovingMols(unconsAtoms[j],totalFZ);
846         unconsAtoms[j]->addFrc(force);
847 +     }
848      
849    }      
850  
# Line 743 | Line 854 | template<typename T> void ZConstraint<T>::doZconstrain
854                  
855        Atom** movingZAtoms = zconsMols[i]->getMyAtoms();    
856  
857 <      for(int j = 0; j < zconsMols[i]->getNAtoms(); j++)
857 >      for(int j = 0; j < zconsMols[i]->getNAtoms(); j++){
858 >        force[whichDirection] = totalFZ / (totNumOfUnconsAtoms + nMovingZAtoms);
859 >        //force[whichDirection] = forcePolicy->getZFOfMovingMols(movingZAtoms[j],totalFZ);
860          movingZAtoms[j]->addFrc(force);
861 +      }
862      }
863    }
750        
751  cout << "after substracting z-constraint force from moving molecuels "
752                  << "total force is " << calcTotalForce()  << endl;
864  
865 +  //cout << "after substracting z-constraint force from moving molecuels "
866 +  //              << "total force is " << calcTotalForce()  << endl;
867 +
868   }
869  
870   template<typename T> bool ZConstraint<T>::checkZConsState(){
871    double COM[3];
872    double diff;
873    
874 <  bool changed;
874 >  int changed_local;
875 >  int changed;
876 >        
877 >  changed_local = 0;
878    
762  changed = false;
763  
879    for(int i =0; i < zconsMols.size(); i++){
880  
881      zconsMols[i]->getCOM(COM);
882      diff = fabs(COM[whichDirection] - zPos[i]);  
883      if (  diff <= zconsTol && states[i] == zcsMoving){
884        states[i] = zcsFixed;
885 <        changed = true;
885 >           changed_local = 1;
886      }
887      else if ( diff > zconsTol && states[i] == zcsFixed){
888        states[i] = zcsMoving;
889 <        changed = true;  
889 >           changed_local = 1;    
890      }
891    
892    }
893  
894 <  return changed;
894 > #ifndef IS_MPI
895 >  changed =changed_local;
896 > #else
897 >  MPI_Allreduce(&changed_local, &changed, 1, MPI_INT,MPI_SUM, MPI_COMM_WORLD);
898 > #endif
899 >
900 >  return changed > 0 ? true : false;
901   }
902  
903   template<typename T> bool ZConstraint<T>::haveFixedZMols(){
904 +
905 +  int havingFixed_local;
906 +  int havingFixed;
907 +
908 +  havingFixed_local = 0;
909 +
910    for(int i = 0; i < zconsMols.size(); i++)
911 <    if (states[i] == zcsFixed)
912 <      return true;
911 >    if (states[i] == zcsFixed){
912 >      havingFixed_local = 1;
913 >                break;
914 >    }
915  
916 <  return false;
916 > #ifndef IS_MPI
917 >  havingFixed = havingFixed_local;
918 > #else
919 >  MPI_Allreduce(&havingFixed_local, &havingFixed, 1, MPI_INT,MPI_SUM, MPI_COMM_WORLD);
920 > #endif
921 >
922 >  return havingFixed > 0 ? true : false;
923   }
924  
925  
# Line 792 | Line 927 | template<typename T> bool ZConstraint<T>::haveMovingZM
927   *
928   */
929   template<typename T> bool ZConstraint<T>::haveMovingZMols(){
930 +
931 +  int havingMoving_local;
932 +  int havingMoving;
933 +
934 +  havingMoving_local = 0;
935 +
936    for(int i = 0; i < zconsMols.size(); i++)
937 <    if (states[i] == zcsMoving)
938 <      return true;
937 >    if (states[i] == zcsMoving){
938 >      havingMoving_local = 1;
939 >                break;
940 >    }
941  
942 <  return false;
942 > #ifndef IS_MPI
943 >  havingMoving = havingMoving_local;
944 > #else
945 >  MPI_Allreduce(&havingMoving_local, &havingMoving, 1, MPI_INT,MPI_SUM, MPI_COMM_WORLD);
946 > #endif
947 >
948 >  return havingMoving > 0 ? true : false;
949    
950   }
951  
# Line 811 | Line 960 | template<typename T> void ZConstraint<T>::doHarmonic()
960    double harmonicF;
961    double COM[3];
962    double diff;
963 +  double totalFZ_local;
964    double totalFZ;
965          
966    force[0] = 0;
967    force[1] = 0;
968    force[2] = 0;
969  
970 <  totalFZ = 0;
970 >  totalFZ_local = 0;
971  
972 <  cout << "Moving Molecules" << endl;  
972 > #ifdef IS_MPI
973 >  if (worldRank == 0){
974 > #endif
975 >    cout << "Moving Molecules" << endl;
976 > #ifdef IS_MPI
977 >  }
978 > #endif
979 >
980 >
981    for(int i = 0; i < zconsMols.size(); i++) {
982  
983      if (states[i] == zcsMoving){
# Line 832 | Line 990 | template<typename T> void ZConstraint<T>::doHarmonic()
990                  info->lrPot += harmonicU;
991  
992        harmonicF =  - kz[i] * diff;
993 <      totalFZ += harmonicF;
993 >      totalFZ_local += harmonicF;
994  
995 <       //
838 <                force[whichDirection] = harmonicF / zconsMols[i]->getNAtoms();
995 >       //adjust force
996                  
997        Atom** movingZAtoms = zconsMols[i]->getMyAtoms();    
998  
999 <       for(int j = 0; j < zconsMols[i]->getNAtoms(); j++)          
999 >       for(int j = 0; j < zconsMols[i]->getNAtoms(); j++){          
1000 >                  force[whichDirection] = harmonicF / zconsMols[i]->getNAtoms();
1001 >         //force[whichDirection] = forcePolicy->getHFOfFixedZMols(zconsMols[i], movingZAtoms[j], harmonicF);
1002           movingZAtoms[j]->addFrc(force);
1003 +       }
1004      }
1005  
1006    }
1007 <        
1007 >
1008 > #ifndef IS_MPI
1009 >  totalFZ = totalFZ_local;
1010 > #else
1011 >  MPI_Allreduce(&totalFZ_local, &totalFZ, 1, MPI_DOUBLE,MPI_SUM, MPI_COMM_WORLD);  
1012 > #endif
1013 >
1014    force[0]= 0;
1015    force[1]= 0;
1016    force[2]= 0;
851  force[whichDirection] = -totalFZ /totNumOfUnconsAtoms;
1017  
1018    //modify the forces of unconstrained molecules
1019    for(int i = 0; i < unconsMols.size(); i++){
1020      
1021       Atom** unconsAtoms = unconsMols[i]->getMyAtoms();
1022      
1023 <     for(int j = 0; j < unconsMols[i]->getNAtoms(); j++)          
1023 >     for(int j = 0; j < unconsMols[i]->getNAtoms(); j++){          
1024 >       force[whichDirection] = - totalFZ /totNumOfUnconsAtoms;
1025 >       //force[whichDirection] = - forcePolicy->getHFOfUnconsMols(unconsAtoms[j], totalFZ);
1026         unconsAtoms[j]->addFrc(force);    
1027 +     }
1028    }  
1029  
1030   }
# Line 905 | Line 1073 | template<typename T> double ZConstraint<T>::calcSysCOM
1073   template<typename T> double ZConstraint<T>::calcSysCOMVel()
1074   {
1075    double COMvel[3];
1076 <  double tempMVz = 0;
1077 <                
1076 >  double tempMVz_local;
1077 >  double tempMVz;
1078 >  double massOfZCons_local;
1079 >  double massOfZCons;
1080 >
1081 >
1082 > tempMVz_local = 0;
1083 >
1084    for(int i =0 ; i < nMols; i++){
1085      molecules[i].getCOMvel(COMvel);
1086 <         tempMVz += molecules[i].getTotalMass()*COMvel[whichDirection];
1086 >         tempMVz_local += molecules[i].getTotalMass()*COMvel[whichDirection];
1087    }
1088  
915  double massOfZCons_local;
916  double massOfZCons;
917
1089    massOfZCons_local = 0;
1090          
1091    for(int i = 0; i < massOfZConsMols.size(); i++){
# Line 922 | Line 1093 | template<typename T> double ZConstraint<T>::calcSysCOM
1093    }
1094   #ifndef IS_MPI
1095    massOfZCons = massOfZCons_local;
1096 +  tempMVz = tempMVz_local;
1097   #else
1098    MPI_Allreduce(&massOfZCons_local, &massOfZCons, 1, MPI_DOUBLE,MPI_SUM, MPI_COMM_WORLD);
1099 +  MPI_Allreduce(&tempMVz_local, &tempMVz, 1, MPI_DOUBLE,MPI_SUM, MPI_COMM_WORLD);
1100   #endif
1101  
1102    return tempMVz /(totalMassOfUncons + massOfZCons);
# Line 951 | Line 1124 | template<typename T> double ZConstraint<T>::calcTotalF
1124    return totalForce;
1125  
1126   }
1127 +
1128 + /**
1129 + *
1130 + */
1131 +
1132 + template<typename T> void ZConstraint<T>::PolicyByNumber::update(){
1133 +  //calculate the number of atoms of moving z-constrained molecules
1134 +  int nMovingZAtoms_local;
1135 +  int nMovingZAtoms;
1136 +        
1137 +  nMovingZAtoms_local = 0;
1138 +  for(int i = 0; i < (zconsIntegrator->zconsMols).size(); i++)
1139 +    if((zconsIntegrator->states)[i] == (zconsIntegrator->zcsMoving))
1140 +           nMovingZAtoms_local += (zconsIntegrator->zconsMols)[i]->getNAtoms();
1141 +  
1142 + #ifdef IS_MPI
1143 +  MPI_Allreduce(&nMovingZAtoms_local, &nMovingZAtoms, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD);
1144 + #else
1145 +  nMovingZAtoms = nMovingZAtoms_local;
1146 + #endif
1147 +  totNumOfMovingAtoms = nMovingZAtoms + zconsIntegrator->totNumOfUnconsAtoms;
1148 + }
1149 +
1150 + template<typename T> double ZConstraint<T>::PolicyByNumber::getZFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce){
1151 +  return totalForce / mol->getNAtoms();
1152 + }
1153 +
1154 + template<typename T> double ZConstraint<T>::PolicyByNumber::getZFOfMovingMols(Atom* atom, double totalForce){
1155 +  return totalForce / totNumOfMovingAtoms;
1156 + }
1157 +
1158 + template<typename T> double ZConstraint<T>::PolicyByNumber::getHFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce){
1159 +    return totalForce / mol->getNAtoms();
1160 + }
1161 +
1162 + template<typename T> double ZConstraint<T>::PolicyByNumber::getHFOfUnconsMols(Atom* atom, double totalForce){
1163 +  return totalForce / zconsIntegrator->totNumOfUnconsAtoms;
1164 + }
1165 +
1166 + /**
1167 + *
1168 + */
1169 +
1170 + template<typename T> void ZConstraint<T>::PolicyByMass::update(){
1171 +  //calculate the number of atoms of moving z-constrained molecules
1172 +  double massOfMovingZAtoms_local;
1173 +  double massOfMovingZAtoms;
1174 +        
1175 +  massOfMovingZAtoms_local = 0;
1176 +  for(int i = 0; i < (zconsIntegrator->zconsMols).size(); i++)
1177 +    if((zconsIntegrator->states)[i] == (zconsIntegrator->zcsMoving))
1178 +           massOfMovingZAtoms_local += (zconsIntegrator->zconsMols)[i]->getTotalMass();
1179 +  
1180 + #ifdef IS_MPI
1181 +  MPI_Allreduce(&massOfMovingZAtoms_local, &massOfMovingZAtoms, 1, MPI_DOUBLE,MPI_SUM, MPI_COMM_WORLD);
1182 + #else
1183 +  massOfMovingZAtoms = massOfMovingZAtoms_local;
1184 + #endif
1185 +  totMassOfMovingAtoms = massOfMovingZAtoms_local + zconsIntegrator->totalMassOfUncons;
1186 + }
1187 +
1188 + template<typename T> double ZConstraint<T>::PolicyByMass::getZFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce){
1189 +  return totalForce * atom->getMass() / mol->getTotalMass();
1190 + }
1191 +
1192 + template<typename T> double ZConstraint<T>::PolicyByMass::getZFOfMovingMols( Atom* atom, double totalForce){
1193 +    return totalForce * atom->getMass() / totMassOfMovingAtoms;
1194 + }
1195 +
1196 + template<typename T> double ZConstraint<T>::PolicyByMass::getHFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce){
1197 +  return totalForce * atom->getMass() / mol->getTotalMass();
1198 + }
1199 +
1200 + template<typename T> double ZConstraint<T>::PolicyByMass::getHFOfUnconsMols(Atom* atom, double totalForce){
1201 +    return totalForce * atom->getMass() / zconsIntegrator->totalMassOfUncons;
1202 + }
1203 +

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines