--- trunk/src/io/Globals.cpp 2005/10/17 03:06:29 674 +++ trunk/src/io/Globals.cpp 2005/12/16 18:26:41 816 @@ -45,32 +45,13 @@ #include #include "io/Globals.hpp" +#include "io/ParamConstraint.hpp" +#include "utils/MemoryUtils.hpp" #include "utils/simError.h" -#ifdef IS_MPI -#include "io/mpiBASS.h" -#endif // is_mpi -#include "io/ParamConstraint.hpp" - -#define DefineParameter(NAME,KEYWORD) \ - NAME.setKeyword(KEYWORD); \ - parameters_.insert(std::make_pair(std::string(KEYWORD), &NAME)); - -#define DefineOptionalParameter(NAME,KEYWORD) \ - NAME.setKeyword(KEYWORD); NAME.setOptional(true); \ - parameters_.insert(std::make_pair(std::string(KEYWORD), &NAME)); - -#define DefineOptionalParameterWithDefaultValue(NAME,KEYWORD, DEFAULTVALUE) \ - NAME.setKeyword(KEYWORD); NAME.setOptional(true); NAME.setDefaultValue(DEFAULTVALUE); \ - parameters_.insert(std::make_pair(std::string(KEYWORD), &NAME)); - -#define CheckParameter(NAME, CONSTRAINT) \ - if (!NAME.empty()) { if (!(CONSTRAINT)(NAME.getData())) { sprintf(painCave.errMsg,"Error in checking %s : should be %s\n",NAME.getKeyword().c_str(),(CONSTRAINT).getConstraintDescription().c_str()); painCave.isFatal = 1; painCave.severity = OOPSE_ERROR; simError();} } - -Globals::Globals(){ - +namespace oopse { +Globals::Globals() { DefineParameter(ForceField, "forceField") - DefineParameter(NComponents, "nComponents") DefineOptionalParameter(TargetTemp, "targetTemp"); DefineOptionalParameter(Ensemble, "ensemble"); @@ -78,12 +59,6 @@ Globals::Globals(){ DefineOptionalParameter(RunTime, "runTime"); DefineOptionalParameter(InitialConfig, "initialConfig"); DefineOptionalParameter(FinalConfig, "finalConfig"); - DefineOptionalParameter(NMol, "nMol"); - DefineOptionalParameter(Density, "density"); - DefineOptionalParameter(Box, "box"); - DefineOptionalParameter(BoxX, "boxX"); - DefineOptionalParameter(BoxY, "boxY"); - DefineOptionalParameter(BoxZ, "boxZ"); DefineOptionalParameter(SampleTime, "sampleTime"); DefineOptionalParameter(ResetTime, "resetTime"); DefineOptionalParameter(StatusTime, "statusTime"); @@ -96,7 +71,6 @@ Globals::Globals(){ DefineOptionalParameter(TauThermostat, "tauThermostat"); DefineOptionalParameter(TauBarostat, "tauBarostat"); DefineOptionalParameter(ZconsTime, "zconsTime"); - DefineOptionalParameter(NZconstraints, "nZconstraints"); DefineOptionalParameter(ZconsTol, "zconsTol"); DefineOptionalParameter(ZconsForcePolicy, "zconsForcePolicy"); DefineOptionalParameter(Seed, "seed"); @@ -121,9 +95,9 @@ Globals::Globals(){ DefineOptionalParameter(SurfaceTension, "surfaceTension"); DefineOptionalParameter(PrintPressureTensor, "printPressureTensor"); DefineOptionalParameter(ElectrostaticSummationMethod, "electrostaticSummationMethod"); + DefineOptionalParameter(ElectrostaticScreeningMethod, "electrostaticScreeningMethod"); DefineOptionalParameter(CutoffPolicy, "cutoffPolicy"); - DefineOptionalParameter(StatFileFormat, "statFileFormat"); - + DefineOptionalParameter(SwitchingFunctionType, "switchingFunctionType"); DefineOptionalParameterWithDefaultValue(MixingRule, "mixingRule", "standard"); DefineOptionalParameterWithDefaultValue(UsePeriodicBoundaryConditions, "usePeriodicBoundaryConditions", true); DefineOptionalParameterWithDefaultValue(UseInitalTime, "useInitialTime", false); @@ -134,224 +108,33 @@ Globals::Globals(){ DefineOptionalParameterWithDefaultValue(ThermIntDistSpringConst, "thermIntDistSpringConst", 6.0); DefineOptionalParameterWithDefaultValue(ThermIntThetaSpringConst, "thermIntThetaSpringConst", 7.5); DefineOptionalParameterWithDefaultValue(ThermIntOmegaSpringConst, "thermIntOmegaSpringConst", 13.5); - DefineOptionalParameterWithDefaultValue(DampingAlpha, "dampingAlpha", 1.5); + DefineOptionalParameterWithDefaultValue(DampingAlpha, "dampingAlpha", 0.2); DefineOptionalParameterWithDefaultValue(CompressDumpFile, "compressDumpFile", 0); + DefineOptionalParameterWithDefaultValue(OutputForceVector, "outputForceVector", 0); DefineOptionalParameterWithDefaultValue(SkinThickness, "skinThickness", 1.0); - -} - -int Globals::globalAssign( event* the_event ){ - char errorMessage[65535]; - int key; - interface_assign_type the_type = the_event->evt.asmt.asmt_type; - char* lhs = the_event->evt.asmt.lhs; - std::string keyword(lhs); - - bool result = false; - - /**@todo fix memory leak */ - ParamMap::iterator i =parameters_.find(keyword); - if (i != parameters_.end()) { - if( the_type == STRING ){ - result = i->second->setData(std::string(the_event->evt.asmt.rhs.sval)); - if (!result ) { - sprintf(errorMessage, "Error in parsing %s: expect %s, but get a string \"%s\".\n", keyword.c_str(), i->second->getParamType().c_str(), the_event->evt.asmt.rhs.sval); - the_event->err_msg = strdup(errorMessage); - } - } else if( the_type == DOUBLE ){ - result = i->second->setData(the_event->evt.asmt.rhs.dval); - if (!result ) - sprintf(errorMessage, "Error in parsing %s: expect %s, but get a double %f.\n", keyword.c_str(), i->second->getParamType().c_str(), the_event->evt.asmt.rhs.dval ); - the_event->err_msg = strdup(errorMessage); - } - else if (the_type == INT ){ - result = i->second->setData(the_event->evt.asmt.rhs.ival); - if (!result ) - sprintf(errorMessage, "Error in parsing %s: expect %s, but get an int %d.\n", keyword.c_str(), i->second->getParamType().c_str(), the_event->evt.asmt.rhs.ival ); - the_event->err_msg = strdup(errorMessage); - - } else { - sprintf(errorMessage, "Internal error of parser\n"); - the_event->err_msg = strdup(errorMessage); - } - } else { - sprintf(errorMessage, "%s is an unrecognized keyword\n", keyword.c_str() ); - the_event->err_msg = strdup(errorMessage); - } - - if (keyword == "nComponents" && getNComponents() > 0) { - components = new Component*[getNComponents()]; - }else if (keyword == "nZconstraints" && getNZconstraints() > 0) { - zConstraints = new ZconStamp*[getNZconstraints()]; - } - - return result; -} - -int Globals::newComponent( event* the_event ){ - - current_component = new Component; - int index = the_event->evt.blk_index; - char err[200]; - - if( haveNComponents() && index < getNComponents() ) - components[index] = current_component; - else{ - if( haveNComponents() ){ - sprintf( err, "meta-data parsing error: %d out of nComponents range", - index ); - the_event->err_msg = strdup( err ); - return 0; - } - else{ - the_event->err_msg = strdup("meta-data parsing error: nComponents not given before" - " first component declaration." ); - return 0; - } - } - - return 1; -} - - - -int Globals::componentAssign( event* the_event ){ - - switch( the_event->evt.asmt.asmt_type ){ - - case STRING: - return current_component->assignString( the_event->evt.asmt.lhs, - the_event->evt.asmt.rhs.sval, - &(the_event->err_msg)); - break; - - case DOUBLE: - return current_component->assignDouble( the_event->evt.asmt.lhs, - the_event->evt.asmt.rhs.dval, - &(the_event->err_msg)); - break; - - case INT: - return current_component->assignInt( the_event->evt.asmt.lhs, - the_event->evt.asmt.rhs.ival, - &(the_event->err_msg)); - break; - - default: - the_event->err_msg = strdup( "Globals error. Invalid component" - " assignment type" ); - return 0; - break; - } - return 0; -} - -int Globals::componentEnd( event* the_event ){ - - the_event->err_msg = current_component->checkMe(); - if( the_event->err_msg != NULL ) return 0; + DefineOptionalParameterWithDefaultValue(StatFileFormat, "statFileFormat", "TIME|TOTAL_ENERGY|POTENTIAL_ENERGY|KINETIC_ENERGY|TEMPERATURE|PRESSURE|VOLUME|CONSERVED_QUANTITY"); - return 1; -} -int Globals::newZconstraint( event* the_event ){ - - - int index = the_event->evt.blk_index; - char err[200]; - current_zConstraint = new ZconStamp( index ); - - if( haveNZconstraints() && index < getNZconstraints() ) - zConstraints[index] = current_zConstraint; - else{ - if( haveNZconstraints() ){ - sprintf( err, "meta-data parsing error: %d out of nZconstraints range", - index ); - the_event->err_msg = strdup( err ); - return 0; - } - else{ - the_event->err_msg = strdup("meta-data parsing error: nZconstraints" - " not given before" - " first zConstraint declaration." ); - return 0; - } - } - - return 1; -} - - - -int Globals::zConstraintAssign( event* the_event ){ - - switch( the_event->evt.asmt.asmt_type ){ + deprecatedKeywords_.insert("nComponents"); + deprecatedKeywords_.insert("nZconstraints"); - case STRING: - return current_zConstraint->assignString( the_event->evt.asmt.lhs, - the_event->evt.asmt.rhs.sval, - &(the_event->err_msg)); - break; - - case DOUBLE: - return current_zConstraint->assignDouble( the_event->evt.asmt.lhs, - the_event->evt.asmt.rhs.dval, - &(the_event->err_msg)); - break; - - case INT: - return current_zConstraint->assignInt( the_event->evt.asmt.lhs, - the_event->evt.asmt.rhs.ival, - &(the_event->err_msg)); - break; - - default: - the_event->err_msg = strdup( "Globals error. Invalid zConstraint" - " assignment type" ); - return 0; - break; - } - return 0; } -int Globals::zConstraintEnd( event* the_event ){ - - the_event->err_msg = current_zConstraint->checkMe(); - if( the_event->err_msg != NULL ) return 0; - - return 1; +Globals::~Globals() { + MemoryUtils::deletePointers(components_); + MemoryUtils::deletePointers(zconstraints_); } -char* Globals::checkMe( void ){ +void Globals::validate() { + DataHolder::validate(); - - std::string err("The following required keywords are missing:\n"); - short int have_err = 0; - - ParamMap::iterator i; - for (i = parameters_.begin(); i != parameters_.end(); ++i) { - if (!i->second->isOptional() && i->second->empty()) { - err += i->second->getKeyword() + "\n"; - } - } - CheckParameter(ForceField, isNotEmpty()); - CheckParameter(NComponents,isPositive()); CheckParameter(TargetTemp, isPositive()); - CheckParameter(Ensemble, isEqualIgnoreCase(std::string("NVE")) || isEqualIgnoreCase(std::string("NVT")) || - isEqualIgnoreCase(std::string("NPTi")) || isEqualIgnoreCase(std::string("NPTf"))|| - isEqualIgnoreCase(std::string("NPTxyz")) ); - + CheckParameter(Ensemble, isEqualIgnoreCase(std::string("NVE")) || isEqualIgnoreCase(std::string("NVT")) || isEqualIgnoreCase(std::string("NPTi")) || isEqualIgnoreCase(std::string("NPTf")) || isEqualIgnoreCase(std::string("NPTxyz")) ); CheckParameter(Dt, isPositive()); CheckParameter(RunTime, isPositive()); CheckParameter(InitialConfig, isNotEmpty()); CheckParameter(FinalConfig, isNotEmpty()); - CheckParameter(NMol, isPositive()); - CheckParameter(Density, isPositive()); - CheckParameter(Box, isPositive()); - CheckParameter(BoxX, isPositive()); - CheckParameter(BoxY, isPositive()); - CheckParameter(BoxZ, isPositive()); CheckParameter(SampleTime, isNonNegative()); CheckParameter(ResetTime, isNonNegative()); CheckParameter(StatusTime, isNonNegative()); @@ -363,9 +146,7 @@ char* Globals::checkMe( void ){ CheckParameter(TauThermostat, isPositive()); CheckParameter(TauBarostat, isPositive()); CheckParameter(ZconsTime, isPositive()); - CheckParameter(NZconstraints, isPositive()); CheckParameter(ZconsTol, isPositive()); - //CheckParameter(ZconsForcePolicy,); CheckParameter(Seed, isPositive()); CheckParameter(Minimizer, isEqualIgnoreCase(std::string("SD")) || isEqualIgnoreCase(std::string("CG"))); CheckParameter(MinimizerMaxIter, isPositive()); @@ -385,30 +166,49 @@ char* Globals::checkMe( void ){ CheckParameter(ThermIntThetaSpringConst, isPositive()); CheckParameter(ThermIntOmegaSpringConst, isPositive()); CheckParameter(SurfaceTension, isPositive()); - CheckParameter(ElectrostaticSummationMethod, isEqualIgnoreCase(std::string("NONE")) || isEqualIgnoreCase(std::string("UNDAMPED_WOLF")) || isEqualIgnoreCase(std::string("DAMPED_WOLF")) || isEqualIgnoreCase(std::string("REACTION_FIELD")) ); + CheckParameter(ElectrostaticSummationMethod, isEqualIgnoreCase(std::string("NONE")) || isEqualIgnoreCase(std::string("SHIFTED_POTENTIAL")) || isEqualIgnoreCase(std::string("SHIFTED_FORCE")) || isEqualIgnoreCase(std::string("REACTION_FIELD"))); + CheckParameter(ElectrostaticScreeningMethod, isEqualIgnoreCase(std::string("UNDAMPED")) || isEqualIgnoreCase(std::string("DAMPED"))); CheckParameter(CutoffPolicy, isEqualIgnoreCase(std::string("MIX")) || isEqualIgnoreCase(std::string("MAX")) || isEqualIgnoreCase(std::string("TRADITIONAL"))); + CheckParameter(SwitchingFunctionType, isEqualIgnoreCase(std::string("CUBIC")) || isEqualIgnoreCase(std::string("FIFTH_ORDER_POLYNOMIAL"))); //CheckParameter(StatFileFormat,); //CheckParameter(MixingRule,); CheckParameter(OrthoBoxTolerance, isPositive()); CheckParameter(ThermIntDistSpringConst, isPositive()); CheckParameter(ThermIntThetaSpringConst, isPositive()); CheckParameter(ThermIntOmegaSpringConst, isPositive()); - CheckParameter(DampingAlpha,isPositive()); + CheckParameter(DampingAlpha,isNonNegative()); CheckParameter(SkinThickness, isPositive()); - - //@todo memory leak - if( have_err ) - return strdup( err.c_str() ); - - return NULL; + for(std::vector::iterator i = components_.begin(); i != components_.end(); ++i) { + if (!(*i)->findMoleculeStamp(moleculeStamps_)) { + std::cout << "Globals Error: can not find molecule stamp for component" << std::endl; + } + } +} + +bool Globals::addComponent(Component* comp) { + components_.push_back(comp); + return true; +} +bool Globals::addZConsStamp(ZConsStamp* zcons) { + zconstraints_.push_back(zcons); + return true; } -int Globals::globalEnd( event* the_event ){ - - the_event->err_msg = checkMe(); - if( the_event->err_msg != NULL ) return 0; +bool Globals::addMoleculeStamp(MoleculeStamp* molStamp) { + std::string molStampName = molStamp->getName(); + std::map::iterator i; + bool ret = false; + i = moleculeStamps_.find(molStampName); + if (i == moleculeStamps_.end()) { + moleculeStamps_.insert(std::map::value_type(molStampName, molStamp)); + ret = true; + } else { + std::cout << "Globals Error: Molecule Stamp " << molStamp->getName() << "appears multiple times\n"; + } + return ret; +} + - return 1; }