--- trunk/OOPSE/libmdtools/SimSetup.cpp 2003/10/29 17:55:28 841 +++ trunk/OOPSE/libmdtools/SimSetup.cpp 2004/01/19 18:36:21 962 @@ -30,6 +30,30 @@ using namespace std; using namespace std; +/** + * Check whether dividend is divisble by divisor or not + */ +bool isDivisible(double dividend, double divisor){ + double tolerance = 0.000001; + double quotient; + double diff; + int intQuotient; + + quotient = dividend / divisor; + + if (quotient < 0) + quotient = -quotient; + + intQuotient = int (quotient + tolerance); + + diff = fabs(fabs(dividend) - intQuotient * fabs(divisor)); + + if (diff <= tolerance) + return true; + else + return false; +} + SimSetup::SimSetup(){ initSuspend = false; @@ -103,6 +127,10 @@ void SimSetup::createSim(void){ sysObjectsCreation(); + // check on the post processing info + + finalInfoCheck(); + // initialize the system coordinates if ( !initSuspend ){ @@ -111,10 +139,6 @@ void SimSetup::createSim(void){ if( !(globals->getUseInitTime()) ) info[0].currentTime = 0.0; } - - // check on the post processing info - - finalInfoCheck(); // make the output filenames @@ -665,8 +689,37 @@ void SimSetup::gatherInfo(void){ " Please give nMol in the components.\n"); painCave.isFatal = 1; simError(); + } + + //check whether sample time, status time, thermal time and reset time are divisble by dt + if (!isDivisible(globals->getSampleTime(), globals->getDt())){ + sprintf(painCave.errMsg, + "Sample time is not divisible by dt \n"); + painCave.isFatal = 0; + simError(); + } + + if (globals->haveStatusTime() && !isDivisible(globals->getSampleTime(), globals->getDt())){ + sprintf(painCave.errMsg, + "Status time is not divisible by dt\n"); + painCave.isFatal = 0; + simError(); } + if (globals->haveThermalTime() && !isDivisible(globals->getThermalTime(), globals->getDt())){ + sprintf(painCave.errMsg, + "Thermal time is not divisible by dt\n"); + painCave.isFatal = 0; + simError(); + } + + if (globals->haveResetTime() && !isDivisible(globals->getResetTime(), globals->getDt())){ + sprintf(painCave.errMsg, + "Reset time is not divisible by dt\n"); + painCave.isFatal = 0; + simError(); + } + // set the status, sample, and thermal kick times for (i = 0; i < nInfo; i++){ @@ -699,6 +752,11 @@ void SimSetup::gatherInfo(void){ if (globals->haveTempSet()) info[i].setTemp = globals->getTempSet(); + + // check for the extended State init + + info[i].useInitXSstate = globals->getUseInitXSstate(); + info[i].orthoTolerance = globals->getOrthoBoxTolerance(); } @@ -776,18 +834,11 @@ void SimSetup::finalInfoCheck(void){ if (!globals->haveECR()){ sprintf(painCave.errMsg, - "SimSetup Warning: using default value of 1/2 the smallest " - "box length for the electrostaticCutoffRadius.\n" - "I hope you have a very fast processor!\n"); + "SimSetup Warning: using default value of 15.0 angstroms" + "box length for the electrostaticCutoffRadius.\n"); painCave.isFatal = 0; simError(); - double smallest; - smallest = info[i].boxL[0]; - if (info[i].boxL[1] <= smallest) - smallest = info[i].boxL[1]; - if (info[i].boxL[2] <= smallest) - smallest = info[i].boxL[2]; - theEcr = 0.5 * smallest; + theEcr = 15.0; } else{ theEcr = globals->getECR(); @@ -820,23 +871,16 @@ void SimSetup::finalInfoCheck(void){ if (usesDipoles){ if (!globals->haveECR()){ sprintf(painCave.errMsg, - "SimSetup Warning: using default value of 1/2 the smallest " - "box length for the electrostaticCutoffRadius.\n" - "I hope you have a very fast processor!\n"); - painCave.isFatal = 0; - simError(); - double smallest; - smallest = info[i].boxL[0]; - if (info[i].boxL[1] <= smallest) - smallest = info[i].boxL[1]; - if (info[i].boxL[2] <= smallest) - smallest = info[i].boxL[2]; - theEcr = 0.5 * smallest; + "SimSetup Warning: using default value of 15.0 angstroms" + "box length for the electrostaticCutoffRadius.\n"); + painCave.isFatal = 0; + simError(); + theEcr = 15.0; } else{ theEcr = globals->getECR(); } - + if (!globals->haveEST()){ sprintf(painCave.errMsg, "SimSetup Warning: using default value of 0.05 * the " @@ -849,18 +893,17 @@ void SimSetup::finalInfoCheck(void){ else{ theEst = globals->getEST(); } - + info[i].setDefaultEcr(theEcr, theEst); } } } - #ifdef IS_MPI strcpy(checkPointMsg, "post processing checks out"); MPIcheckPoint(); #endif // is_mpi } - + void SimSetup::initSystemCoords(void){ int i; @@ -888,21 +931,14 @@ void SimSetup::initSystemCoords(void){ delete fileInit; } else{ -#ifdef IS_MPI - + // no init from bass - + sprintf(painCave.errMsg, - "Cannot intialize a parallel simulation without an initial configuration file.\n"); + "Cannot intialize a simulation without an initial configuration file.\n"); painCave.isFatal = 1;; simError(); - -#else - - initFromBass(); - - -#endif + } #ifdef IS_MPI @@ -1414,6 +1450,7 @@ void SimSetup::makeIntegrator(void){ if (globals->haveTauThermostat()) myNPTf->setTauThermostat(globals->getTauThermostat()); + else{ sprintf(painCave.errMsg, "SimSetup error: If you use an NPT\n" @@ -1424,6 +1461,7 @@ void SimSetup::makeIntegrator(void){ if (globals->haveTauBarostat()) myNPTf->setTauBarostat(globals->getTauBarostat()); + else{ sprintf(painCave.errMsg, "SimSetup error: If you use an NPT\n"