X-Git-Url: http://git.treefish.org/~alex/phys/latlib.git/blobdiff_plain/3db2602cfe30c61445e89cc334541ebb4ff76ed8..7d17aa8c6bde2e49502401aa190a900bd4688362:/o815/o815.cpp diff --git a/o815/o815.cpp b/o815/o815.cpp index 956eb09..29f5fd3 100644 --- a/o815/o815.cpp +++ b/o815/o815.cpp @@ -2,6 +2,8 @@ #include +#include "latlib/progress.h" + o815::o815(int argc, char **argv, const string& _programid) { long timestamp; @@ -50,6 +52,44 @@ o815::o815(int argc, char **argv, const string& _programid) { out = new writeout(comargs.outdir, programid+headMaster(), rank, numprocs, timestamp); } +void o815::mainLoop() { + *out->log << "OBS: Starting main loop." << endl; + + for (vector::iterator obsit = observables.begin(); obsit != observables.end(); ++obsit) + (*obsit)->start(); + + while( nextParas() ) { + *out->log << endl << "O815: < "; + for (vector::iterator parait = paraQ->allParaIds.begin(); parait != paraQ->allParaIds.end(); ++parait) + *out->log << *parait << "=" << (*paraQ)[*parait] << " "; + *out->log << ">" << endl << flush; + + progress measProg(comargs.nmeas); + + *out->log << "OBS: Starting measurements." << endl << flush; + + for( int imeas=0; imeas::iterator obsit = observables.begin(); obsit != observables.end(); ++obsit) { + if( hypercache::readO( (*obsit)->ocid ) != -1 ) { + if (!nextAlready) { + Sim->nextConfig(); + nextAlready = true; + } + (*obsit)->meas(false); + hypercache::writeO( (*obsit)->ocid ); + } + else + (*obsit)->meas(true); + } + while( measProg.madeStep(imeas) ) + *out->log << "O815: " << measProg.done()*100 << "% of measurements done." << endl << flush; + } + for (vector::iterator obsit = observables.begin(); obsit != observables.end(); ++obsit) + (*obsit)->finish(); + } +} + void o815::parseArgs(int argc, char **argv) { int opt = 0; @@ -121,3 +161,29 @@ string o815::headMaster() return hm.str(); } +o815::~o815() { + if(comargs.outdir=="") { + MPI_Barrier(MPI_COMM_WORLD); + if(rank==0) + cout << "#end" << endl << flush; + } + hypercache::finalize(); + delete out; + MPI_Finalize(); +} + +int o815::nextParas() +{ + if( paraQ->nextParas() ) { + for (vector::iterator parait = paraQ->allParaIds.begin(); parait != paraQ->allParaIds.end(); ++parait) + hypercache::setPara(*parait, (*paraQ)[*parait]); + return 1; + } + else + return 0; +} + +void o815::addPara(const string& paraid, const double& paraDefault) { + hypercache::addPara(paraid); + paraQ->setDefault(paraid, paraDefault); +}