Skip to content
Snippets Groups Projects
Commit 460e8a99 authored by Giovanni Bussi's avatar Giovanni Bussi
Browse files

Further split of workflow

Allow for splitting of performCalc() into
performCalcNoUpdate() and update()

This makes it possible to call performCalc() multiple times per step
parent ad14b3a2
No related branches found
No related tags found
No related merge requests found
......@@ -47,7 +47,7 @@
using namespace std;
enum { SETBOX, SETPOSITIONS, SETMASSES, SETCHARGES, SETPOSITIONSX, SETPOSITIONSY, SETPOSITIONSZ, SETVIRIAL, SETENERGY, SETFORCES, SETFORCESX, SETFORCESY, SETFORCESZ, CALC, PREPAREDEPENDENCIES, SHAREDATA, PREPARECALC, PERFORMCALC, SETSTEP, SETSTEPLONG, SETATOMSNLOCAL, SETATOMSGATINDEX, SETATOMSFGATINDEX, SETATOMSCONTIGUOUS, CREATEFULLLIST, GETFULLLIST, CLEARFULLLIST, READ, CLEAR, GETAPIVERSION, INIT, SETREALPRECISION, SETMDLENGTHUNITS, SETMDENERGYUNITS, SETMDTIMEUNITS, SETMDCHARGEUNITS, SETMDMASSUNITS, SETNATURALUNITS, SETNOVIRIAL, SETPLUMEDDAT, SETMPICOMM, SETMPIFCOMM, SETMPIMULTISIMCOMM, SETNATOMS, SETTIMESTEP, SETMDENGINE, SETLOG, SETLOGFILE, SETSTOPFLAG, GETEXCHANGESFLAG, SETEXCHANGESSEED, SETNUMBEROFREPLICAS, GETEXCHANGESLIST, RUNFINALJOBS, ISENERGYNEEDED, GETBIAS, SETKBT, SETRESTART, READINPUTLINE };
enum { SETBOX, SETPOSITIONS, SETMASSES, SETCHARGES, SETPOSITIONSX, SETPOSITIONSY, SETPOSITIONSZ, SETVIRIAL, SETENERGY, SETFORCES, SETFORCESX, SETFORCESY, SETFORCESZ, CALC, PREPAREDEPENDENCIES, SHAREDATA, PREPARECALC, PERFORMCALC, PERFORMCALCNOUPDATE, UPDATE, SETSTEP, SETSTEPLONG, SETATOMSNLOCAL, SETATOMSGATINDEX, SETATOMSFGATINDEX, SETATOMSCONTIGUOUS, CREATEFULLLIST, GETFULLLIST, CLEARFULLLIST, READ, CLEAR, GETAPIVERSION, INIT, SETREALPRECISION, SETMDLENGTHUNITS, SETMDENERGYUNITS, SETMDTIMEUNITS, SETMDCHARGEUNITS, SETMDMASSUNITS, SETNATURALUNITS, SETNOVIRIAL, SETPLUMEDDAT, SETMPICOMM, SETMPIFCOMM, SETMPIMULTISIMCOMM, SETNATOMS, SETTIMESTEP, SETMDENGINE, SETLOG, SETLOGFILE, SETSTOPFLAG, GETEXCHANGESFLAG, SETEXCHANGESSEED, SETNUMBEROFREPLICAS, GETEXCHANGESLIST, RUNFINALJOBS, ISENERGYNEEDED, GETBIAS, SETKBT, SETRESTART, READINPUTLINE };
namespace PLMD{
......@@ -97,6 +97,8 @@ PlumedMain::PlumedMain():
word_map["shareData"]=SHAREDATA;
word_map["prepareCalc"]=PREPARECALC;
word_map["performCalc"]=PERFORMCALC;
word_map["performCalcNoUpdate"]=PERFORMCALCNOUPDATE;
word_map["update"]=UPDATE;
word_map["setStep"]=SETSTEP;
word_map["setStepLong"]=SETSTEPLONG;
word_map["setAtomsNlocal"]=SETATOMSNLOCAL;
......@@ -251,6 +253,14 @@ void PlumedMain::cmd(const std::string & word,void*val){
CHECK_INIT(initialized,word);
performCalc();
break;
case PERFORMCALCNOUPDATE:
CHECK_INIT(initialized,word);
performCalcNoUpdate();
break;
case UPDATE:
CHECK_INIT(initialized,word);
update();
break;
case SETSTEP:
CHECK_INIT(initialized,word);
CHECK_NULL(val,word);
......@@ -647,10 +657,17 @@ void PlumedMain::shareData(){
stopwatch.stop("2 Sharing data");
}
void PlumedMain::performCalcNoUpdate(){
waitData();
justCalculate();
backwardPropagate();
}
void PlumedMain::performCalc(){
waitData();
justCalculate();
justApply();
backwardPropagate();
update();
}
void PlumedMain::waitData(){
......@@ -703,7 +720,11 @@ void PlumedMain::justCalculate(){
}
void PlumedMain::justApply(){
backwardPropagate();
update();
}
void PlumedMain::backwardPropagate(){
if(!active)return;
int iaction=0;
stopwatch.start("5 Applying (backward loop)");
......@@ -732,8 +753,13 @@ void PlumedMain::justApply(){
if(detailedTimers) stopwatch.start("5B Update forces");
if(atoms.getNatoms()>0) atoms.updateForces();
if(detailedTimers) stopwatch.stop("5B Update forces");
stopwatch.stop("5 Applying (backward loop)");
}
if(detailedTimers) stopwatch.start("5C Update");
void PlumedMain::update(){
if(!active)return;
stopwatch.start("6 Update");
// update step (for statistics, etc)
updateFlags.push(true);
for(ActionSet::iterator p=actionSet.begin();p!=actionSet.end();++p){
......@@ -741,14 +767,12 @@ void PlumedMain::justApply(){
if((*p)->isActive() && (*p)->checkUpdate() && updateFlagsTop()) (*p)->update();
}
while(!updateFlags.empty()) updateFlags.pop();
if(detailedTimers) stopwatch.stop("5C Update");
if(!updateFlags.empty()) plumed_merror("non matching changes in the update flags");
// Check that no action has told the calculation to stop
if(stopNow){
if(stopFlag) (*stopFlag)=1;
else plumed_merror("your md code cannot handle plumed stop events - add a call to plumed.comm(stopFlag,stopCondition)");
}
stopwatch.stop("5 Applying (backward loop)");
// flush by default every 10000 steps
// hopefully will not affect performance
......@@ -757,6 +781,7 @@ void PlumedMain::justApply(){
log.flush();
for(ActionSet::const_iterator p=actionSet.begin();p!=actionSet.end();++p) (*p)->fflush();
}
stopwatch.stop("6 Update");
}
void PlumedMain::load(const std::string& ss){
......
......@@ -228,9 +228,15 @@ public:
void shareData();
/**
Perform the calculation.
Shortcut for waitData() + justCalculate() + justApply()
Shortcut for waitData() + justCalculate() + justApply().
Equivalently: waitData() + justCalculate() + backwardPropagate() + update().
*/
void performCalc();
/**
Perform the calculation without update()
Shortcut for: waitData() + justCalculate() + backwardPropagate()
*/
void performCalcNoUpdate();
/**
Complete PLUMED calculation.
Shortcut for prepareCalc() + performCalc()
......@@ -246,11 +252,21 @@ public:
Perform the forward loop on active actions.
*/
void justCalculate();
/**
Backward propagate and update.
Shortcut for backwardPropagate() + update()
I leave it here for backward compatibility
*/
void justApply();
/**
Perform the backward loop on active actions.
Needed to apply the forces back.
*/
void justApply();
void backwardPropagate();
/**
Call the update() method.
*/
void update();
/**
If there are calculations that need to be done at the very end of the calculations this
makes sures they are done
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment