--- trunk/OOPSE/libmdtools/SimSetup.cpp 2003/11/06 22:01:37 855 +++ 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,7 +689,36 @@ 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 @@ -781,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(); @@ -825,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 " @@ -854,21 +893,17 @@ void SimSetup::finalInfoCheck(void){ else{ theEst = globals->getEST(); } - + info[i].setDefaultEcr(theEcr, theEst); } } - - if( !initSuspend ) - info[i].checkCutOffs(); } - #ifdef IS_MPI strcpy(checkPointMsg, "post processing checks out"); MPIcheckPoint(); #endif // is_mpi } - + void SimSetup::initSystemCoords(void){ int i; @@ -896,21 +931,14 @@ void SimSetup::initSystemCoords(void){ delete fileInit; } else{ -#ifdef IS_MPI - - // no init from bass - + + // 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