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

Comparing trunk/OOPSE/libmdtools/SimSetup.cpp (file contents):
Revision 814 by mmeineke, Thu Oct 23 19:57:25 2003 UTC vs.
Revision 962 by tim, Mon Jan 19 18:36:21 2004 UTC

# Line 1 | Line 1
1   #include <algorithm>
2 < #include <cstdlib>
2 > #include <stdlib.h>
3   #include <iostream>
4 < #include <cmath>
4 > #include <math.h>
5   #include <string>
6   #include <sprng.h>
7   #include "SimSetup.hpp"
# Line 29 | Line 29 | using namespace std;
29   #define FF_EAM  2
30  
31   using namespace std;
32 +
33 + /**
34 + * Check whether dividend is divisble by divisor or not
35 + */
36 + bool isDivisible(double dividend, double divisor){
37 +  double tolerance = 0.000001;
38 +  double quotient;
39 +  double diff;
40 +  int intQuotient;
41 +  
42 +  quotient = dividend / divisor;
43 +
44 +  if (quotient < 0)
45 +    quotient = -quotient;
46 +
47 +  intQuotient = int (quotient + tolerance);
48 +
49 +  diff = fabs(fabs(dividend) - intQuotient  * fabs(divisor));
50 +
51 +  if (diff <= tolerance)
52 +    return true;
53 +  else
54 +    return false;  
55 + }
56  
57   SimSetup::SimSetup(){
58 +  
59 +  initSuspend = false;
60    isInfoArray = 0;
61    nInfo = 1;
62  
# Line 53 | Line 79 | void SimSetup::setSimInfo(SimInfo* the_info, int theNi
79    info = the_info;
80    nInfo = theNinfo;
81    isInfoArray = 1;
82 +  initSuspend = true;
83   }
84  
85  
# Line 106 | Line 133 | void SimSetup::createSim(void){
133  
134    // initialize the system coordinates
135  
136 <  if (!isInfoArray){
136 >  if ( !initSuspend ){
137      initSystemCoords();
138  
139      if( !(globals->getUseInitTime()) )
# Line 664 | Line 691 | void SimSetup::gatherInfo(void){
691      simError();
692    }
693  
694 +  //check whether sample time, status time, thermal time and reset time are divisble by dt
695 +  if (!isDivisible(globals->getSampleTime(), globals->getDt())){
696 +    sprintf(painCave.errMsg,
697 +              "Sample time is not divisible by dt \n");
698 +    painCave.isFatal = 0;
699 +    simError();    
700 +  }
701 +
702 +  if (globals->haveStatusTime() && !isDivisible(globals->getSampleTime(), globals->getDt())){
703 +    sprintf(painCave.errMsg,
704 +              "Status time is not divisible by dt\n");
705 +    painCave.isFatal = 0;
706 +    simError();    
707 +  }
708 +
709 +  if (globals->haveThermalTime() && !isDivisible(globals->getThermalTime(), globals->getDt())){
710 +    sprintf(painCave.errMsg,
711 +              "Thermal time is not divisible by dt\n");
712 +    painCave.isFatal = 0;
713 +    simError();    
714 +  }  
715 +
716 +  if (globals->haveResetTime() && !isDivisible(globals->getResetTime(), globals->getDt())){
717 +    sprintf(painCave.errMsg,
718 +              "Reset time is not divisible by dt\n");
719 +    painCave.isFatal = 0;
720 +    simError();    
721 +  }
722 +
723    // set the status, sample, and thermal kick times
724  
725    for (i = 0; i < nInfo; i++){
# Line 693 | Line 749 | void SimSetup::gatherInfo(void){
749      }
750  
751      // check for the temperature set flag
752 <
752 >    
753      if (globals->haveTempSet())
754        info[i].setTemp = globals->getTempSet();
755  
756 <    // get some of the tricky things that may still be in the globals
756 >    // check for the extended State init
757  
758 <    double boxVector[3];
759 <    if (globals->haveBox()){
760 <      boxVector[0] = globals->getBox();
705 <      boxVector[1] = globals->getBox();
706 <      boxVector[2] = globals->getBox();
707 <
708 <      info[i].setBox(boxVector);
709 <    }
710 <    else if (globals->haveDensity()){
711 <      double vol;
712 <      vol = (double) tot_nmol / globals->getDensity();
713 <      boxVector[0] = pow(vol, (1.0 / 3.0));
714 <      boxVector[1] = boxVector[0];
715 <      boxVector[2] = boxVector[0];
716 <
717 <      info[i].setBox(boxVector);
718 <    }
719 <    else{
720 <      if (!globals->haveBoxX()){
721 <        sprintf(painCave.errMsg,
722 <                "SimSetup error, no periodic BoxX size given.\n");
723 <        painCave.isFatal = 1;
724 <        simError();
725 <      }
726 <      boxVector[0] = globals->getBoxX();
727 <
728 <      if (!globals->haveBoxY()){
729 <        sprintf(painCave.errMsg,
730 <                "SimSetup error, no periodic BoxY size given.\n");
731 <        painCave.isFatal = 1;
732 <        simError();
733 <      }
734 <      boxVector[1] = globals->getBoxY();
735 <
736 <      if (!globals->haveBoxZ()){
737 <        sprintf(painCave.errMsg,
738 <                "SimSetup error, no periodic BoxZ size given.\n");
739 <        painCave.isFatal = 1;
740 <        simError();
741 <      }
742 <      boxVector[2] = globals->getBoxZ();
743 <
744 <      info[i].setBox(boxVector);
745 <    }
758 >    info[i].useInitXSstate = globals->getUseInitXSstate();
759 >    info[i].orthoTolerance = globals->getOrthoBoxTolerance();
760 >    
761    }
762 <
762 >  
763    //setup seed for random number generator
764    int seedValue;
765  
# Line 819 | Line 834 | void SimSetup::finalInfoCheck(void){
834  
835        if (!globals->haveECR()){
836          sprintf(painCave.errMsg,
837 <                "SimSetup Warning: using default value of 1/2 the smallest "
838 <                "box length for the electrostaticCutoffRadius.\n"
824 <                "I hope you have a very fast processor!\n");
837 >                "SimSetup Warning: using default value of 15.0 angstroms"
838 >                "box length for the electrostaticCutoffRadius.\n");
839          painCave.isFatal = 0;
840          simError();
841 <        double smallest;
828 <        smallest = info[i].boxL[0];
829 <        if (info[i].boxL[1] <= smallest)
830 <          smallest = info[i].boxL[1];
831 <        if (info[i].boxL[2] <= smallest)
832 <          smallest = info[i].boxL[2];
833 <        theEcr = 0.5 * smallest;
841 >        theEcr = 15.0;
842        }
843        else{
844          theEcr = globals->getECR();
# Line 848 | Line 856 | void SimSetup::finalInfoCheck(void){
856          theEst = globals->getEST();
857        }
858  
859 <      info[i].setEcr(theEcr, theEst);
859 >      info[i].setDefaultEcr(theEcr, theEst);
860  
861        if (!globals->haveDielectric()){
862          sprintf(painCave.errMsg,
# Line 863 | Line 871 | void SimSetup::finalInfoCheck(void){
871        if (usesDipoles){
872          if (!globals->haveECR()){
873            sprintf(painCave.errMsg,
874 <                  "SimSetup Warning: using default value of 1/2 the smallest "
875 <                  "box length for the electrostaticCutoffRadius.\n"
876 <                  "I hope you have a very fast processor!\n");
877 <          painCave.isFatal = 0;
878 <          simError();
871 <          double smallest;
872 <          smallest = info[i].boxL[0];
873 <          if (info[i].boxL[1] <= smallest)
874 <            smallest = info[i].boxL[1];
875 <          if (info[i].boxL[2] <= smallest)
876 <            smallest = info[i].boxL[2];
877 <          theEcr = 0.5 * smallest;
874 >                  "SimSetup Warning: using default value of 15.0 angstroms"
875 >                  "box length for the electrostaticCutoffRadius.\n");
876 >          painCave.isFatal = 0;
877 >          simError();
878 >          theEcr = 15.0;
879          }
880          else{
881            theEcr = globals->getECR();
882          }
883 <
883 >        
884          if (!globals->haveEST()){
885            sprintf(painCave.errMsg,
886                    "SimSetup Warning: using default value of 0.05 * the "
# Line 892 | Line 893 | void SimSetup::finalInfoCheck(void){
893          else{
894            theEst = globals->getEST();
895          }
896 <
897 <        info[i].setEcr(theEcr, theEst);
896 >        
897 >        info[i].setDefaultEcr(theEcr, theEst);
898        }
899      }
900    }
900
901   #ifdef IS_MPI
902    strcpy(checkPointMsg, "post processing checks out");
903    MPIcheckPoint();
904   #endif // is_mpi
905   }
906 <
906 >  
907   void SimSetup::initSystemCoords(void){
908    int i;
909  
# Line 931 | Line 931 | void SimSetup::initSystemCoords(void){
931      delete fileInit;
932    }
933    else{
934 < #ifdef IS_MPI
935 <
934 >    
935      // no init from bass
936 <
936 >    
937      sprintf(painCave.errMsg,
938 <            "Cannot intialize a parallel simulation without an initial configuration file.\n");
938 >            "Cannot intialize a simulation without an initial configuration file.\n");
939      painCave.isFatal = 1;;
940      simError();
941 <
943 < #else
944 <
945 <    initFromBass();
946 <
947 <
948 < #endif
941 >    
942    }
943  
944   #ifdef IS_MPI
# Line 1457 | Line 1450 | void SimSetup::makeIntegrator(void){
1450  
1451          if (globals->haveTauThermostat())
1452            myNPTf->setTauThermostat(globals->getTauThermostat());
1453 +
1454          else{
1455            sprintf(painCave.errMsg,
1456                    "SimSetup error: If you use an NPT\n"
# Line 1467 | Line 1461 | void SimSetup::makeIntegrator(void){
1461  
1462          if (globals->haveTauBarostat())
1463            myNPTf->setTauBarostat(globals->getTauBarostat());
1464 +
1465          else{
1466            sprintf(painCave.errMsg,
1467                    "SimSetup error: If you use an NPT\n"

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines