void PlumedMain::load(const std::string& ss){ if(DLLoader::installed()){ string s=ss; size_t n=s.find_last_of("."); string extension=""; string base=s; if(n!=std::string::npos && n<s.length()-1) extension=s.substr(n+1); if(n!=std::string::npos && n<s.length()) base=s.substr(0,n); if(extension=="cpp"){ string cmd="plumed mklib "+s; log<<"Executing: "<<cmd; if(comm.Get_size()>0) log<<" (only on master node)"; log<<"\n"; if(comm.Get_rank()==0) system(cmd.c_str()); comm.Barrier(); base="./"+base; } s=base+"."+config::getSoExt(); void *p=dlloader.load(s); if(!p){ log<<"ERROR\n"; log<<"I cannot load library "<<ss<<"\n"; log<<dlloader.error(); log<<"\n"; this->exit(1); } log<<"Loading shared library "<<s.c_str()<<"\n"; log<<"Here is the new list of available actions\n"; log<<actionRegister(); } else plumed_merror("loading not enabled, please recompile with -D__PLUMED_HAS_DLOPEN"); }
void PlumedMain::load(const std::string& ss) { if(DLLoader::installed()) { string s=ss; size_t n=s.find_last_of("."); string extension=""; string base=s; if(n!=std::string::npos && n<s.length()-1) extension=s.substr(n+1); if(n!=std::string::npos && n<s.length()) base=s.substr(0,n); if(extension=="cpp") { // full path command, including environment setup // this will work even if plumed is not in the execution path or if it has been // installed with a name different from "plumed" string cmd=config::getEnvCommand()+" \""+config::getPlumedRoot()+"\"/scripts/mklib.sh "+s; log<<"Executing: "<<cmd; if(comm.Get_size()>0) log<<" (only on master node)"; log<<"\n"; if(comm.Get_rank()==0) system(cmd.c_str()); comm.Barrier(); base="./"+base; } s=base+"."+config::getSoExt(); void *p=dlloader.load(s); if(!p) { const std::string error_msg="I cannot load library " + ss + " " + dlloader.error(); log<<"ERROR\n"; log<<error_msg<<"\n"; plumed_merror(error_msg); } log<<"Loading shared library "<<s.c_str()<<"\n"; log<<"Here is the new list of available actions\n"; log<<actionRegister(); } else plumed_merror("loading not enabled, please recompile with -D__PLUMED_HAS_DLOPEN"); }
void PlumedMain::readInputWords(const std::vector<std::string> & words) { plumed_assert(initialized); if(words.empty())return; else if(words[0]=="ENDPLUMED") return; else if(words[0]=="_SET_SUFFIX") { plumed_assert(words.size()==2); setSuffix(words[1]); } else { std::vector<std::string> interpreted(words); Tools::interpretLabel(interpreted); Action* action=actionRegister().create(ActionOptions(*this,interpreted)); if(!action) { log<<"ERROR\n"; log<<"I cannot understand line:"; for(unsigned i=0; i<interpreted.size(); ++i) log<<" "<<interpreted[i]; log<<"\n"; log.flush(); plumed_merror("I cannot understand line " + interpreted[0] + " " + interpreted[1]); }; action->checkRead(); actionSet.push_back(action); }; pilots=actionSet.select<ActionPilot*>(); }
void PlumedMain::cmd(const std::string & word,void*val){ stopwatch.start(); std::vector<std::string> words=Tools::getWords(word); unsigned nw=words.size(); if(nw==0){ // do nothing } else { int iword=-1; double d; std::map<std::string, int>::const_iterator it=plumedMainWordMap().find(words[0]); if(it!=plumedMainWordMap().end()) iword=it->second; switch(iword) { case cmd_setBox: CHECK_INIT(initialized,word); CHECK_NOTNULL(val,word); atoms.setBox(val); break; case cmd_setPositions: CHECK_INIT(initialized,word); atoms.setPositions(val); break; case cmd_setMasses: CHECK_INIT(initialized,word); atoms.setMasses(val); break; case cmd_setCharges: CHECK_INIT(initialized,word); atoms.setCharges(val); break; case cmd_setPositionsX: CHECK_INIT(initialized,word); atoms.setPositions(val,0); break; case cmd_setPositionsY: CHECK_INIT(initialized,word); atoms.setPositions(val,1); break; case cmd_setPositionsZ: CHECK_INIT(initialized,word); atoms.setPositions(val,2); break; case cmd_setVirial: CHECK_INIT(initialized,word); CHECK_NOTNULL(val,word); atoms.setVirial(val); break; case cmd_setEnergy: CHECK_INIT(initialized,word); CHECK_NOTNULL(val,word); atoms.setEnergy(val); break; case cmd_setForces: CHECK_INIT(initialized,word); atoms.setForces(val); break; case cmd_setForcesX: CHECK_INIT(initialized,word); atoms.setForces(val,0); break; case cmd_setForcesY: CHECK_INIT(initialized,word); atoms.setForces(val,1); break; case cmd_setForcesZ: CHECK_INIT(initialized,word); atoms.setForces(val,2); break; case cmd_calc: CHECK_INIT(initialized,word); calc(); break; case cmd_prepareDependencies: CHECK_INIT(initialized,word); prepareDependencies(); break; case cmd_shareData: CHECK_INIT(initialized,word); shareData(); break; case cmd_prepareCalc: CHECK_INIT(initialized,word); prepareCalc(); break; case cmd_performCalc: CHECK_INIT(initialized,word); performCalc(); break; case cmd_performCalcNoUpdate: CHECK_INIT(initialized,word); performCalcNoUpdate(); break; case cmd_update: CHECK_INIT(initialized,word); update(); break; case cmd_setStep: CHECK_INIT(initialized,word); CHECK_NOTNULL(val,word); step=(*static_cast<int*>(val)); atoms.startStep(); break; case cmd_setStepLong: CHECK_INIT(initialized,word); CHECK_NOTNULL(val,word); step=(*static_cast<long int*>(val)); atoms.startStep(); break; // words used less frequently: case cmd_setAtomsNlocal: CHECK_INIT(initialized,word); CHECK_NOTNULL(val,word); atoms.setAtomsNlocal(*static_cast<int*>(val)); break; case cmd_setAtomsGatindex: CHECK_INIT(initialized,word); atoms.setAtomsGatindex(static_cast<int*>(val),false); break; case cmd_setAtomsFGatindex: CHECK_INIT(initialized,word); atoms.setAtomsGatindex(static_cast<int*>(val),true); break; case cmd_setAtomsContiguous: CHECK_INIT(initialized,word); CHECK_NOTNULL(val,word); atoms.setAtomsContiguous(*static_cast<int*>(val)); break; case cmd_createFullList: CHECK_INIT(initialized,word); CHECK_NOTNULL(val,word); atoms.createFullList(static_cast<int*>(val)); break; case cmd_getFullList: CHECK_INIT(initialized,word); CHECK_NOTNULL(val,word); atoms.getFullList(static_cast<int**>(val)); break; case cmd_clearFullList: CHECK_INIT(initialized,word); atoms.clearFullList(); break; case cmd_read: CHECK_INIT(initialized,word); if(val)readInputFile(static_cast<char*>(val)); else readInputFile("plumed.dat"); break; case cmd_readInputLine: CHECK_INIT(initialized,word); CHECK_NOTNULL(val,word); readInputLine(static_cast<char*>(val)); break; case cmd_clear: CHECK_INIT(initialized,word); actionSet.clearDelete(); break; case cmd_getApiVersion: CHECK_NOTNULL(val,word); *(static_cast<int*>(val))=4; break; // commands which can be used only before initialization: case cmd_init: CHECK_NOTINIT(initialized,word); init(); break; case cmd_setRealPrecision: CHECK_NOTINIT(initialized,word); CHECK_NOTNULL(val,word); atoms.setRealPrecision(*static_cast<int*>(val)); break; case cmd_setMDLengthUnits: CHECK_NOTINIT(initialized,word); CHECK_NOTNULL(val,word); atoms.MD2double(val,d); atoms.setMDLengthUnits(d); break; case cmd_setMDChargeUnits: CHECK_NOTINIT(initialized,word); CHECK_NOTNULL(val,word); atoms.MD2double(val,d); atoms.setMDChargeUnits(d); break; case cmd_setMDMassUnits: CHECK_NOTINIT(initialized,word); CHECK_NOTNULL(val,word); atoms.MD2double(val,d); atoms.setMDMassUnits(d); break; case cmd_setMDEnergyUnits: CHECK_NOTINIT(initialized,word); CHECK_NOTNULL(val,word); atoms.MD2double(val,d); atoms.setMDEnergyUnits(d); break; case cmd_setMDTimeUnits: CHECK_NOTINIT(initialized,word); CHECK_NOTNULL(val,word); atoms.MD2double(val,d); atoms.setMDTimeUnits(d); break; case cmd_setNaturalUnits: // set the boltzman constant for MD in natural units (kb=1) // only needed in LJ codes if the MD is passing temperatures to plumed (so, not yet...) // use as cmd("setNaturalUnits") CHECK_NOTINIT(initialized,word); atoms.setMDNaturalUnits(true); break; case cmd_setNoVirial: CHECK_NOTINIT(initialized,word); novirial=true; break; case cmd_setPlumedDat: CHECK_NOTINIT(initialized,word); CHECK_NOTNULL(val,word); plumedDat=static_cast<char*>(val); break; case cmd_setMPIComm: CHECK_NOTINIT(initialized,word); comm.Set_comm(val); atoms.setDomainDecomposition(comm); break; case cmd_setMPIFComm: CHECK_NOTINIT(initialized,word); comm.Set_fcomm(val); atoms.setDomainDecomposition(comm); break; case cmd_setMPImultiSimComm: CHECK_NOTINIT(initialized,word); multi_sim_comm.Set_comm(val); break; case cmd_setNatoms: CHECK_NOTINIT(initialized,word); CHECK_NOTNULL(val,word); atoms.setNatoms(*static_cast<int*>(val)); break; case cmd_setTimestep: CHECK_NOTINIT(initialized,word); CHECK_NOTNULL(val,word); atoms.setTimeStep(val); break; /* ADDED WITH API==2 */ case cmd_setKbT: CHECK_NOTINIT(initialized,word); CHECK_NOTNULL(val,word); atoms.setKbT(val); break; /* ADDED WITH API==3 */ case cmd_setRestart: CHECK_NOTINIT(initialized,word); CHECK_NOTNULL(val,word); if(*static_cast<int*>(val)!=0) restart=true; break; case cmd_setMDEngine: CHECK_NOTINIT(initialized,word); CHECK_NOTNULL(val,word); MDEngine=static_cast<char*>(val); break; case cmd_setLog: CHECK_NOTINIT(initialized,word); log.link(static_cast<FILE*>(val)); break; case cmd_setLogFile: CHECK_NOTINIT(initialized,word); CHECK_NOTNULL(val,word); log.open(static_cast<char*>(val)); break; // other commands that should be used after initialization: case cmd_setStopFlag: CHECK_INIT(initialized,word); CHECK_NOTNULL(val,word); stopFlag=static_cast<int*>(val); break; case cmd_getExchangesFlag: CHECK_INIT(initialized,word); CHECK_NOTNULL(val,word); exchangePatterns.getFlag((*static_cast<int*>(val))); break; case cmd_setExchangesSeed: CHECK_INIT(initialized,word); CHECK_NOTNULL(val,word); exchangePatterns.setSeed((*static_cast<int*>(val))); break; case cmd_setNumberOfReplicas: CHECK_INIT(initialized,word); CHECK_NOTNULL(val,word); exchangePatterns.setNofR((*static_cast<int*>(val))); break; case cmd_getExchangesList: CHECK_INIT(initialized,word); CHECK_NOTNULL(val,word); exchangePatterns.getList((static_cast<int*>(val))); break; case cmd_runFinalJobs: CHECK_INIT(initialized,word); runJobsAtEndOfCalculation(); break; case cmd_isEnergyNeeded: CHECK_INIT(initialized,word); CHECK_NOTNULL(val,word); if(atoms.isEnergyNeeded()) *(static_cast<int*>(val))=1; else *(static_cast<int*>(val))=0; break; case cmd_getBias: CHECK_INIT(initialized,word); CHECK_NOTNULL(val,word); atoms.double2MD(getBias()/(atoms.getMDUnits().getEnergy()/atoms.getUnits().getEnergy()),val); break; case cmd_checkAction: CHECK_NOTNULL(val,word); plumed_assert(nw==2); *(static_cast<int*>(val))=(actionRegister().check(words[1]) ? 1:0); break; case cmd_GREX: if(!grex) grex=new GREX(*this); plumed_massert(grex,"error allocating grex"); { std::string kk=words[1]; for(unsigned i=2;i<words.size();i++) kk+=" "+words[i]; grex->cmd(kk.c_str(),val); } break; case cmd_CLTool: CHECK_NOTINIT(initialized,word); if(!cltool) cltool=new CLToolMain; { std::string kk=words[1]; for(unsigned i=2;i<words.size();i++) kk+=" "+words[i]; cltool->cmd(kk.c_str(),val); } break; default: plumed_merror("cannot interpret cmd(\"" + word + "\"). check plumed developers manual to see the available commands."); break; } } stopwatch.pause(); }