--- trunk/OOPSE/libmdtools/SimInfo.cpp 2003/08/07 21:47:18 670 +++ trunk/OOPSE/libmdtools/SimInfo.cpp 2003/09/19 14:55:41 770 @@ -26,16 +26,20 @@ SimInfo::SimInfo(){ SimInfo::SimInfo(){ excludes = NULL; n_constraints = 0; + nZconstraints = 0; n_oriented = 0; n_dipoles = 0; ndf = 0; ndfRaw = 0; + nZconstraints = 0; the_integrator = NULL; setTemp = 0; thermalTime = 0.0; currentTime = 0.0; rCut = 0.0; + origRcut = -1.0; ecr = 0.0; + origEcr = -1.0; est = 0.0; oldEcr = 0.0; oldRcut = 0.0; @@ -362,7 +366,7 @@ int SimInfo::getNDF(){ ndf = ndf_local; #endif - ndf = ndf - 3; + ndf = ndf - 3 - nZconstraints; return ndf; } @@ -381,7 +385,23 @@ int SimInfo::getNDFraw() { return ndfRaw; } - + +int SimInfo::getNDFtranslational() { + int ndfTrans_local, ndfTrans; + + ndfTrans_local = 3 * n_atoms - n_constraints; + +#ifdef IS_MPI + MPI_Allreduce(&ndfTrans_local,&ndfTrans,1,MPI_INT,MPI_SUM, MPI_COMM_WORLD); +#else + ndfTrans = ndfTrans_local; +#endif + + ndfTrans = ndfTrans - 3 - nZconstraints; + + return ndfTrans; +} + void SimInfo::refreshSim(){ simtype fInfo; @@ -437,7 +457,7 @@ void SimInfo::refreshSim(){ this->ndf = this->getNDF(); this->ndfRaw = this->getNDFraw(); - + this->ndfTrans = this->getNDFtranslational(); } @@ -473,13 +493,11 @@ void SimInfo::checkCutOffs( void ){ void SimInfo::checkCutOffs( void ){ int cutChanged = 0; - - - + if( boxIsInit ){ //we need to check cutOffs against the box - + if(( maxCutoff > rCut )&&(usePBC)){ if( rCut < origRcut ){ rCut = origRcut; @@ -487,65 +505,70 @@ void SimInfo::checkCutOffs( void ){ sprintf( painCave.errMsg, "New Box size is setting the long range cutoff radius " - "to %lf\n", - rCut ); + "to %lf at time %lf\n", + rCut, currentTime ); painCave.isFatal = 0; simError(); } } - + if( maxCutoff > ecr ){ if( ecr < origEcr ){ - rCut = origEcr; + ecr = origEcr; if (ecr > maxCutoff) ecr = maxCutoff; sprintf( painCave.errMsg, "New Box size is setting the electrostaticCutoffRadius " - "to %lf\n", - ecr ); + "to %lf at time %lf\n", + ecr, currentTime ); painCave.isFatal = 0; simError(); } } - - + + if ((rCut > maxCutoff)&&(usePBC)) { sprintf( painCave.errMsg, "New Box size is setting the long range cutoff radius " - "to %lf\n", - maxCutoff ); + "to %lf at time %lf\n", + maxCutoff, currentTime ); painCave.isFatal = 0; simError(); rCut = maxCutoff; } - + if( ecr > maxCutoff){ sprintf( painCave.errMsg, "New Box size is setting the electrostaticCutoffRadius " - "to %lf\n", - maxCutoff ); + "to %lf at time %lf\n", + maxCutoff, currentTime ); painCave.isFatal = 0; simError(); ecr = maxCutoff; } + if( (oldEcr != ecr) || ( oldRcut != rCut ) ) cutChanged = 1; - } - - - if( (oldEcr != ecr) || ( oldRcut != rCut ) ) cutChanged = 1; - - // rlist is the 1.0 plus max( rcut, ecr ) - - ( rCut > ecr )? rList = rCut + 1.0: rList = ecr + 1.0; - - if( cutChanged ){ + // rlist is the 1.0 plus max( rcut, ecr ) - notifyFortranCutOffs( &rCut, &rList, &ecr, &est ); + ( rCut > ecr )? rList = rCut + 1.0: rList = ecr + 1.0; + + if( cutChanged ){ + + notifyFortranCutOffs( &rCut, &rList, &ecr, &est ); + } + + oldEcr = ecr; + oldRcut = rCut; + + } else { + // initialize this stuff before using it, OK? + sprintf( painCave.errMsg, + "Trying to check cutoffs without a box. Be smarter.\n" ); + painCave.isFatal = 1; + simError(); } - - oldEcr = ecr; - oldRcut = rCut; + } void SimInfo::addProperty(GenericData* prop){ @@ -595,4 +618,9 @@ vector SimInfo::getProperties(){ return result; } +double SimInfo::matTrace3(double m[3][3]){ + double trace; + trace = m[0][0] + m[1][1] + m[2][2]; + return trace; +}