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

Comparing trunk/OOPSE-1.0/libmdtools/SimSetup.cpp (file contents):
Revision 1417 by tim, Tue Jul 27 15:41:17 2004 UTC vs.
Revision 1435 by tim, Thu Jul 29 18:16:16 2004 UTC

# Line 57 | Line 57 | bool isDivisible(double dividend, double divisor){
57      return false;  
58   }
59  
60 + string getPrefix(const string& str ){
61 +  string prefix;
62 +  string suffix;
63 +  int pos;
64 +
65 +  pos = str.rfind(".");
66 +
67 +  if (pos >= 0) {
68 +     prefix = str.substr(0, pos);
69 +     suffix = str.substr(pos, str.size());
70 +
71 +     // leave .bass there in case we've reverted to old habits
72 +     if (LowerCase(suffix) == ".md" || LowerCase(suffix) == ".bass")
73 +       return prefix;
74 +     else
75 +       return str;
76 +    
77 +  } else
78 +    return str;
79 + };
80 +
81 +
82   SimSetup::SimSetup(){
83    
84    initSuspend = false;
# Line 74 | Line 96 | SimSetup::~SimSetup(){
96   }
97  
98   SimSetup::~SimSetup(){
99 +  // clean up the forcefield
100 +  the_ff->cleanMe();
101 +
102    delete stamps;
103    delete globals;
104   }
# Line 92 | Line 117 | void SimSetup::parseFile(char* fileName){
117   #endif // is_mpi
118  
119      inFileName = fileName;
120 +
121 +    globals->initalize();
122      set_interface_stamps(stamps, globals);
123  
124   #ifdef IS_MPI
# Line 122 | Line 149 | void SimSetup::createSim(void){
149  
150   void SimSetup::createSim(void){
151  
152 <  // gather all of the information from the Bass file
152 >  // gather all of the information from the meta-data file
153  
154    gatherInfo();
155  
# Line 643 | Line 670 | void SimSetup::makeMolecules(void){
670    sprintf(checkPointMsg, "all molecules initialized succesfully");
671    MPIcheckPoint();
672   #endif // is_mpi
646
647 }
648
649 void SimSetup::initFromBass(void){
650  int i, j, k;
651  int n_cells;
652  double cellx, celly, cellz;
653  double temp1, temp2, temp3;
654  int n_per_extra;
655  int n_extra;
656  int have_extra, done;
657
658  double vel[3];
659  vel[0] = 0.0;
660  vel[1] = 0.0;
661  vel[2] = 0.0;
662
663  temp1 = (double) tot_nmol / 4.0;
664  temp2 = pow(temp1, (1.0 / 3.0));
665  temp3 = ceil(temp2);
666
667  have_extra = 0;
668  if (temp2 < temp3){
669    // we have a non-complete lattice
670    have_extra = 1;
671
672    n_cells = (int) temp3 - 1;
673    cellx = info[0].boxL[0] / temp3;
674    celly = info[0].boxL[1] / temp3;
675    cellz = info[0].boxL[2] / temp3;
676    n_extra = tot_nmol - (4 * n_cells * n_cells * n_cells);
677    temp1 = ((double) n_extra) / (pow(temp3, 3.0) - pow(n_cells, 3.0));
678    n_per_extra = (int) ceil(temp1);
679
680    if (n_per_extra > 4){
681      sprintf(painCave.errMsg,
682              "SimSetup error. There has been an error in constructing"
683              " the non-complete lattice.\n");
684      painCave.isFatal = 1;
685      simError();
686    }
687  }
688  else{
689    n_cells = (int) temp3;
690    cellx = info[0].boxL[0] / temp3;
691    celly = info[0].boxL[1] / temp3;
692    cellz = info[0].boxL[2] / temp3;
693  }
694
695  current_mol = 0;
696  current_comp_mol = 0;
697  current_comp = 0;
698  current_atom_ndx = 0;
699
700  for (i = 0; i < n_cells ; i++){
701    for (j = 0; j < n_cells; j++){
702      for (k = 0; k < n_cells; k++){
703        makeElement(i * cellx, j * celly, k * cellz);
704
705        makeElement(i * cellx + 0.5 * cellx, j * celly + 0.5 * celly, k * cellz);
706
707        makeElement(i * cellx, j * celly + 0.5 * celly, k * cellz + 0.5 * cellz);
708
709        makeElement(i * cellx + 0.5 * cellx, j * celly, k * cellz + 0.5 * cellz);
710      }
711    }
712  }
713
714  if (have_extra){
715    done = 0;
716
717    int start_ndx;
718    for (i = 0; i < (n_cells + 1) && !done; i++){
719      for (j = 0; j < (n_cells + 1) && !done; j++){
720        if (i < n_cells){
721          if (j < n_cells){
722            start_ndx = n_cells;
723          }
724          else
725            start_ndx = 0;
726        }
727        else
728          start_ndx = 0;
729
730        for (k = start_ndx; k < (n_cells + 1) && !done; k++){
731          makeElement(i * cellx, j * celly, k * cellz);
732          done = (current_mol >= tot_nmol);
733
734          if (!done && n_per_extra > 1){
735            makeElement(i * cellx + 0.5 * cellx, j * celly + 0.5 * celly,
736                        k * cellz);
737            done = (current_mol >= tot_nmol);
738          }
739
740          if (!done && n_per_extra > 2){
741            makeElement(i * cellx, j * celly + 0.5 * celly,
742                        k * cellz + 0.5 * cellz);
743            done = (current_mol >= tot_nmol);
744          }
745
746          if (!done && n_per_extra > 3){
747            makeElement(i * cellx + 0.5 * cellx, j * celly,
748                        k * cellz + 0.5 * cellz);
749            done = (current_mol >= tot_nmol);
750          }
751        }
752      }
753    }
754  }
755
756  for (i = 0; i < info[0].n_atoms; i++){
757    info[0].atoms[i]->setVel(vel);
758  }
759 }
760
761 void SimSetup::makeElement(double x, double y, double z){
762  int k;
763  AtomStamp* current_atom;
764  DirectionalAtom* dAtom;
765  double rotMat[3][3];
766  double pos[3];
767
768  for (k = 0; k < comp_stamps[current_comp]->getNAtoms(); k++){
769    current_atom = comp_stamps[current_comp]->getAtom(k);
770    if (!current_atom->havePosition()){
771      sprintf(painCave.errMsg,
772              "SimSetup:initFromBass error.\n"
773              "\tComponent %s, atom %s does not have a position specified.\n"
774              "\tThe initialization routine is unable to give a start"
775              " position.\n",
776              comp_stamps[current_comp]->getID(), current_atom->getType());
777      painCave.isFatal = 1;
778      simError();
779    }
780
781    pos[0] = x + current_atom->getPosX();
782    pos[1] = y + current_atom->getPosY();
783    pos[2] = z + current_atom->getPosZ();
784
785    info[0].atoms[current_atom_ndx]->setPos(pos);
786
787    if (info[0].atoms[current_atom_ndx]->isDirectional()){
788      dAtom = (DirectionalAtom *) info[0].atoms[current_atom_ndx];
673  
790      rotMat[0][0] = 1.0;
791      rotMat[0][1] = 0.0;
792      rotMat[0][2] = 0.0;
793
794      rotMat[1][0] = 0.0;
795      rotMat[1][1] = 1.0;
796      rotMat[1][2] = 0.0;
797
798      rotMat[2][0] = 0.0;
799      rotMat[2][1] = 0.0;
800      rotMat[2][2] = 1.0;
801
802      dAtom->setA(rotMat);
803    }
804
805    current_atom_ndx++;
806  }
807
808  current_mol++;
809  current_comp_mol++;
810
811  if (current_comp_mol >= components_nmol[current_comp]){
812    current_comp_mol = 0;
813    current_comp++;
814  }
674   }
675  
817
676   void SimSetup::gatherInfo(void){
677    int i;
678  
# Line 1003 | Line 861 | void SimSetup::gatherInfo(void){
861                    "\tKeyword useSolidThermInt was set to 'true' but\n"
862                    "\tthermodynamicIntegrationLambda (and/or\n"
863                    "\tthermodynamicIntegrationK) was not specified.\n"
864 <                  "\tPlease provide a lambda value and k value in your .md file.\n");
864 >                  "\tPlease provide a lambda value and k value in your meta-data file.\n");
865            painCave.isFatal = 1;
866            simError();    
867          }
# Line 1012 | Line 870 | void SimSetup::gatherInfo(void){
870          if (globals->getUseSolidThermInt()) {
871            sprintf( painCave.errMsg,
872                     "SimSetup Warning: It appears that you have both solid and\n"
873 <                   "\tliquid thermodynamic integration activated in your .md\n"
873 >                   "\tliquid thermodynamic integration activated in your meta-data\n"
874                     "\tfile. To avoid confusion, specify only one technique in\n"
875 <                   "\tyour .md file. Liquid-state thermodynamic integration\n"
875 >                   "\tyour meta-data file. Liquid-state thermodynamic integration\n"
876                     "\twill be assumed for the current simulation. If this is not\n"
877                     "\twhat you desire, set useSolidThermInt to 'true' and\n"
878 <                   "\tuseLiquidThermInt to 'false' in your .md file.\n");
878 >                   "\tuseLiquidThermInt to 'false' in your meta-data file.\n");
879            painCave.isFatal = 0;
880            simError();
881          }
# Line 1032 | Line 890 | void SimSetup::gatherInfo(void){
890                    "\tKeyword useLiquidThermInt was set to 'true' but\n"
891                    "\tthermodynamicIntegrationLambda (and/or\n"
892                    "\tthermodynamicIntegrationK) was not specified.\n"
893 <                  "\tPlease provide a lambda value and k value in your .md file.\n");
893 >                  "\tPlease provide a lambda value and k value in your meta-data file.\n");
894            painCave.isFatal = 1;
895            simError();    
896          }
# Line 1041 | Line 899 | void SimSetup::gatherInfo(void){
899          sprintf(painCave.errMsg,
900                  "SimSetup Warning: If you want to use Thermodynamic\n"
901                  "\tIntegration, set useSolidThermInt or useLiquidThermInt to\n"
902 <                "\t'true' in your .md file.  These keywords are set to\n"
902 >                "\t'true' in your meta-data file.  These keywords are set to\n"
903                  "\t'false' by default, so your lambda and/or k values are\n"
904                  "\tbeing ignored.\n");
905          painCave.isFatal = 0;
# Line 1136 | Line 994 | void SimSetup::gatherInfo(void){
994    }
995    
996   #ifdef IS_MPI
997 <  strcpy(checkPointMsg, "Successfully gathered all information from Bass\n");
997 >  strcpy(checkPointMsg, "Successfully gathered all information from meta-data file\n");
998    MPIcheckPoint();
999   #endif // is_mpi
1000   }
# Line 1273 | Line 1131 | void SimSetup::finalInfoCheck(void){
1131    MPIcheckPoint();
1132   #endif // is_mpi
1133  
1276  // clean up the forcefield
1277  the_ff->cleanMe();
1134   }
1135    
1136   void SimSetup::initSystemCoords(void){
# Line 1330 | Line 1186 | void SimSetup::makeOutNames(void){
1186      if (worldRank == 0){
1187   #endif // is_mpi
1188        
1189 <      if(globals->haveFinalConfig())
1189 >      if(globals->haveFinalConfig())
1190          prefix = getPrefix(globals->getFinalConfig());  
1191        else
1192 <        prefix = getPrefix(info[k].finalName);
1192 >        prefix = getPrefix(inFileName);
1193  
1194        info[k].finalName = prefix + ".eor";      
1195        info[k].sampleName = prefix + ".dump";
# Line 1765 | Line 1621 | void SimSetup::makeIntegrator(void){
1621          else{
1622            sprintf(painCave.errMsg,
1623                    "SimSetup error: If you use a constant pressure\n"
1624 <                  "\tensemble, you must set targetPressure in the BASS file.\n");
1624 >                  "\tensemble, you must set targetPressure in the meta-data file.\n");
1625            painCave.isFatal = 1;
1626            simError();
1627          }
# Line 1816 | Line 1672 | void SimSetup::makeIntegrator(void){
1672          else{
1673            sprintf(painCave.errMsg,
1674                    "SimSetup error: If you use a constant pressure\n"
1675 <                  "\tensemble, you must set targetPressure in the BASS file.\n");
1675 >                  "\tensemble, you must set targetPressure in the meta-data file.\n");
1676            painCave.isFatal = 1;
1677            simError();
1678          }    
# Line 1869 | Line 1725 | void SimSetup::makeIntegrator(void){
1725          else{
1726            sprintf(painCave.errMsg,
1727                    "SimSetup error: If you use a constant pressure\n"
1728 <                  "\tensemble, you must set targetPressure in the BASS file.\n");
1728 >                  "\tensemble, you must set targetPressure in the meta-data file.\n");
1729            painCave.isFatal = 1;
1730            simError();
1731          }    

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines