Changeset 36bb2d for src/Actions


Ignore:
Timestamp:
Nov 20, 2012, 11:04:12 AM (12 years ago)
Author:
Frederik Heber <heber@…>
Branches:
Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Added_ParseSaveFragmentResults, AddingActions_SaveParseParticleParameters, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_ParticleName_to_Atom, Adding_StructOpt_integration_tests, AtomFragments, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, CombiningParticlePotentialParsing, Combining_Subpackages, Debian_Package_split, Debian_package_split_molecuildergui_only, Disabling_MemDebug, Docu_Python_wait, EmpiricalPotential_contain_HomologyGraph, EmpiricalPotential_contain_HomologyGraph_documentation, Enable_parallel_make_install, Enhance_userguide, Enhanced_StructuralOptimization, Enhanced_StructuralOptimization_continued, Example_ManyWaysToTranslateAtom, Exclude_Hydrogens_annealWithBondGraph, FitPartialCharges_GlobalError, Fix_BoundInBox_CenterInBox_MoleculeActions, Fix_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_PopActions, Fix_QtFragmentList_sorted_selection, Fix_Restrictedkeyset_FragmentMolecule, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, Fix_fitting_potentials, Fixes, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, FragmentAction_writes_AtomFragments, FragmentMolecule_checks_bonddegrees, GeometryObjects, Gui_Fixes, Gui_displays_atomic_force_velocity, ImplicitCharges, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, MoreRobust_FragmentAutomation, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PdbParser_setsAtomName, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, Rewrite_FitPartialCharges, RotateToPrincipalAxisSystem_UndoRedo, SaturateAtoms_findBestMatching, SaturateAtoms_singleDegree, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, Switchable_LogView, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, TremoloParser_setsAtomName, Ubuntu_1604_changes, stable
Children:
a22e05
Parents:
cebac0 (diff), a1436b (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'VMGJob_SamplingNucleiCharges' into Candidate_v1.3.5

Location:
src/Actions/FragmentationAction
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/Actions/FragmentationAction/FragmentationAutomationAction.cpp

    rcebac0 r36bb2d  
    3939#include "CodePatterns/MemDebug.hpp"
    4040
    41 #include <boost/assign.hpp>
     41#include <boost/mpl/remove.hpp>
    4242
    4343#include "CodePatterns/Assert.hpp"
     
    4848
    4949#include "Atom/atom.hpp"
     50#include "Box.hpp"
    5051#include "Fragmentation/EnergyMatrix.hpp"
    5152#include "Fragmentation/ForceMatrix.hpp"
     
    5657#include "Fragmentation/KeySet.hpp"
    5758#include "Fragmentation/KeySetsContainer.hpp"
    58 #include "Fragmentation/Summation/printSum.hpp"
     59#include "Fragmentation/Summation/AllLevelOrthogonalSummator.hpp"
     60#include "Fragmentation/Summation/AllLevelSummator.hpp"
     61#include "Fragmentation/Summation/writeTable.hpp"
    5962#include "Graph/DepthFirstSearchAnalysis.hpp"
     63#include "Helpers/defs.hpp"
    6064#include "Jobs/MPQCJob.hpp"
    6165#include "Jobs/MPQCData.hpp"
    6266#include "Jobs/MPQCData_printKeyNames.hpp"
     67#include "LinearAlgebra/RealSpaceMatrix.hpp"
     68#ifdef HAVE_VMG
     69#include "Jobs/VMGJob.hpp"
     70#endif
    6371#include "molecule.hpp"
    6472#include "World.hpp"
     
    7381
    7482using namespace MoleCuilder;
    75 
    76 using namespace boost::assign;
    7783
    7884// and construct the stuff
     
    8894  return NULL;
    8995}
     96
     97const int LEVEL = 5;
    9098
    9199/** Creates a MPQCCommandJob with argument \a filename.
     
    107115  std::string output((std::istreambuf_iterator<char>(file)),
    108116      std::istreambuf_iterator<char>());
    109   FragmentJob::ptr testJob( new MPQCJob(nextid, output) );
     117  double begin[NDIM] = { 0., 0., 0. };
     118  const RealSpaceMatrix& M = World::getInstance().getDomain().getM();
     119  const double size = M.at(0,0);
     120  ASSERT( M.determinant() == size*size*size,
     121      "parsejob() - current domain matrix "+toString(M)+" is not cubic.");
     122  const int level = LEVEL;
     123  FragmentJob::ptr testJob( new MPQCJob(nextid, output, begin, size, level) );
    110124  jobs.push_back(testJob);
    111125  file.close();
     
    142156}
    143157
     158/** Extracts MPQCData from received vector of FragmentResults.
     159 *
     160 * @param results results to extract MPQCData from
     161 * @param fragmentData on return array filled with extracted MPQCData
     162 */
     163void ConvertFragmentResultToMPQCData(
     164    const std::vector<FragmentResult::ptr> &results,
     165    std::vector<MPQCData> &fragmentData)
     166{
     167  // extract results
     168  fragmentData.clear();
     169  fragmentData.reserve(results.size());
     170
     171  LOG(2, "DEBUG: Parsing now through " << results.size() << " results.");
     172  for (std::vector<FragmentResult::ptr>::const_iterator iter = results.begin();
     173      iter != results.end(); ++iter) {
     174    //LOG(1, "RESULT: job #"+toString((*iter)->getId())+": "+toString((*iter)->result));
     175    MPQCData extractedData;
     176    std::stringstream inputstream((*iter)->result);
     177    LOG(2, "DEBUG: First 50 characters FragmentResult's string: "+(*iter)->result.substr(0, 50));
     178    boost::archive::text_iarchive ia(inputstream);
     179    ia >> extractedData;
     180    LOG(1, "INFO: extracted data is " << extractedData << ".");
     181    fragmentData.push_back(extractedData);
     182  }
     183
     184  ASSERT( results.size() == fragmentData.size(),
     185      "ConvertFragmentResultToMPQCData() - the number of extracted data differs from the number of results.");
     186}
     187
    144188
    145189/** Print MPQCData from received results.
    146190 *
    147  * @param results received results to extract MPQCData from
     191 * @param results results with ids to associate with fragment number
     192 * @param fragmentData MPQCData resulting from the jobs
    148193 * @param KeySetFilename filename with keysets to associate forces correctly
    149194 * @param NoAtoms total number of atoms
     
    151196bool printReceivedMPQCResults(
    152197    const std::vector<FragmentResult::ptr> &results,
     198    const std::vector<MPQCData> &fragmentData,
    153199    const std::string &KeySetFilename,
    154200    size_t NoAtoms)
     
    173219      IdResultMap.insert( make_pair((*iter)->getId(), *iter) );
    174220      ASSERT( inserter.second,
    175           "printReceivedMPQCResults() - two results have same id "
     221          "ExtractMPQCDataFromResults() - two results have same id "
    176222          +toString((*iter)->getId())+".");
    177223    }
     
    183229  LOG(1, "INFO: There are " << FragmentCounter << " fragments.");
    184230
    185   // extract results
    186   std::vector<MPQCData> fragmentData(results.size());
    187   MPQCData combinedData;
    188 
    189   LOG(2, "DEBUG: Parsing now through " << results.size() << " results.");
    190   for (std::vector<FragmentResult::ptr>::const_iterator iter = results.begin();
    191       iter != results.end(); ++iter) {
    192     LOG(1, "RESULT: job #"+toString((*iter)->getId())+": "+toString((*iter)->result));
    193     MPQCData extractedData;
    194     std::stringstream inputstream((*iter)->result);
    195     LOG(2, "DEBUG: First 50 characters FragmentResult's string: "+(*iter)->result.substr(0, 50));
    196     boost::archive::text_iarchive ia(inputstream);
    197     ia >> extractedData;
    198     LOG(1, "INFO: extracted data is " << extractedData << ".");
    199 
     231  std::vector<MPQCData>::const_iterator dataiter = fragmentData.begin();
     232  std::vector<FragmentResult::ptr>::const_iterator resultiter = results.begin();
     233  for (; dataiter != fragmentData.end(); ++dataiter, ++resultiter) {
     234    const MPQCData &extractedData = *dataiter;
    200235    // place results into EnergyMatrix ...
    201236    {
     
    204239      matrix[0].resize(1, extractedData.energies.total);
    205240      if (!Energy.AddMatrix(
    206           std::string("MPQCJob ")+toString((*iter)->getId()),
     241          std::string("MPQCJob ")+toString((*resultiter)->getId()),
    207242          matrix,
    208           MatrixNrLookup[(*iter)->getId()])) {
     243          MatrixNrLookup[(*resultiter)->getId()])) {
    209244        ELOG(1, "Adding energy matrix failed.");
    210245        return false;
     
    225260      }
    226261      if (!Force.AddMatrix(
    227           std::string("MPQCJob ")+toString((*iter)->getId()),
     262          std::string("MPQCJob ")+toString((*resultiter)->getId()),
    228263          matrix,
    229           MatrixNrLookup[(*iter)->getId()])) {
     264          MatrixNrLookup[(*resultiter)->getId()])) {
    230265        ELOG(1, "Adding force matrix failed.");
    231266        return false;
     
    248283  // initialise indices
    249284  KeySetsContainer KeySet;
     285  KeySetsContainer ForceKeySet;
    250286  if (!Energy.InitialiseIndices()) return false;
    251287
    252288  if (!Force.ParseIndices(KeySetFilename.c_str())) return false;
    253289
    254   if (!KeySet.ParseKeySets(KeySetFilename.c_str(), Force.RowCounter, Force.MatrixCounter)) return false;
     290  {
     291    std::stringstream filename;
     292    filename << FRAGMENTPREFIX << KEYSETFILE;
     293    if (!KeySet.ParseKeySets(KeySetFilename, filename.str(), FragmentCounter)) return false;
     294  }
     295
     296  {
     297    std::stringstream filename;
     298    filename << FRAGMENTPREFIX << FORCESFILE;
     299    if (!ForceKeySet.ParseKeySets(KeySetFilename, filename.str(), FragmentCounter)) return false;
     300  }
    255301
    256302  /// prepare for OrthogonalSummation
    257303
    258   // gather all present indices in AllIndices
    259   IndexSet::ptr AllIndices(new IndexSet);
    260   for (KeySetsContainer::ArrayOfIntVectors::const_iterator iter = KeySet.KeySets.begin();
    261       iter != KeySet.KeySets.end(); ++iter)
    262     for(KeySetsContainer::IntVector::const_iterator keyiter = (*iter).begin();
    263         keyiter != (*iter).end(); ++keyiter) {
    264       if (*keyiter != -1)
    265         (*AllIndices) += *keyiter;
    266     }
    267   LOG(1, "INFO: AllIndices is " << AllIndices << ".");
    268   // create container with all keysets
    269   IndexSetContainer::ptr container(new IndexSetContainer(AllIndices));
    270   for (KeySetsContainer::ArrayOfIntVectors::const_iterator iter = KeySet.KeySets.begin();
    271       iter != KeySet.KeySets.end(); ++iter) {
    272     IndexSet tempset;
    273     for(KeySetsContainer::IntVector::const_iterator keyiter = (*iter).begin();
    274         keyiter != (*iter).end(); ++keyiter)
    275       if (*keyiter != -1)
    276         tempset += *keyiter;
    277     container->insert(tempset);
    278   }
     304  // convert KeySetContainer to IndexSetContainer
     305  IndexSetContainer::ptr container(new IndexSetContainer(KeySet));
    279306  // create the map of all keysets
    280307  SubsetMap::ptr subsetmap(new SubsetMap(*container));
     308
     309// we probably don't need this, it suffices if IndexedVectors has some extra indices
     310//  // forces need different keysets: they must include hydrogen
     311//  // (though without ones added by saturation)
     312//  IndexSetContainer::ptr forceindices(new IndexSetContainer(ForceKeySet));
     313//  // create the map of all keysets
     314//  SubsetMap::ptr subsetmapforces(new SubsetMap(*forceindices));
    281315
    282316  /// convert all MPQCData to MPQCDataMap_t
     
    303337
    304338    // forces
    305     const IndexSetContainer::Container_t &indices = container->getContainer();
    306     ASSERT( indices.size() == fragmentData.size(),
    307         "FragmentationAutomationAction::performCall() - indices and fragmentData differ in size.");
     339    ASSERT( ForceKeySet.KeySets.size() == fragmentData.size(),
     340        "FragmentationAutomationAction::performCall() - ForceKeySet's KeySets and fragmentData differ in size.");
    308341    std::vector<MPQCDataForceMap_t> MPQCData_Force_fused;
    309342    MPQCData_Force_fused.reserve(fragmentData.size());
    310343    std::vector<MPQCData>::const_iterator dataiter = fragmentData.begin();
    311     IndexSetContainer::Container_t::const_iterator indexiter = indices.begin();
    312     for(;dataiter != fragmentData.end(); ++dataiter, ++indexiter) {
     344    KeySetsContainer::ArrayOfIntVectors::const_iterator arrayiter = ForceKeySet.KeySets.begin();
     345    for(;dataiter != fragmentData.end(); ++dataiter, ++arrayiter) {
    313346      const MPQCData &extractedData = *dataiter;
    314347      LOG(2, "DEBUG: Current extracted Data is " << extractedData << ".");
    315348      MPQCDataForceMap_t instance;
     349      // must convert int to index_t
     350      IndexedVectors::indices_t indices(arrayiter->begin(), arrayiter->end());
    316351      boost::fusion::at_key<MPQCDataFused::forces>(instance) =
    317           IndexedVectors(**indexiter, extractedData.forces);
     352          IndexedVectors(indices, extractedData.forces);
    318353      MPQCData_Force_fused.push_back(instance);
     354    }
     355
     356    // sampled_grid
     357    std::vector<MPQCDataGridMap_t> MPQCData_Grid_fused;
     358    MPQCData_Grid_fused.reserve(fragmentData.size());
     359    for(std::vector<MPQCData>::const_iterator dataiter = fragmentData.begin();
     360        dataiter != fragmentData.end(); ++dataiter) {
     361      const MPQCData &extractedData = *dataiter;
     362      LOG(2, "DEBUG: Current extracted Data is " << extractedData << ".");
     363      MPQCDataGridMap_t instance;
     364      boost::fusion::at_key<MPQCDataFused::sampled_grid>(instance) = extractedData.sampled_grid;
     365      MPQCData_Grid_fused.push_back(instance);
    319366    }
    320367
     
    339386            boost::bind(&FragmentResult::ptr::operator->, _1)));
    340387
    341     // sum up and print energies
    342     boost::mpl::for_each<MPQCDataEnergyVector_t>(
    343         printSum<MPQCDataEnergyMap_t>(
    344             subsetmap,
    345             MPQCData_Energy_fused,
    346             jobids,
    347             container->getContainer(),
    348             MatrixNrLookup)
    349         );
    350 
    351     // sum up and print forces
    352     boost::mpl::for_each<MPQCDataForceVector_t>(
    353         printSum<MPQCDataForceMap_t>(
    354             subsetmap,
    355             MPQCData_Force_fused,
    356             jobids,
    357             container->getContainer(),
    358             MatrixNrLookup)
    359         );
    360 
    361     // TODO: Times should just be summed not orthogonalized
    362 //    // sum up and print times
    363 //    boost::mpl::for_each<MPQCDataTimeVector_t>(
    364 //        printSum<MPQCDataTimeMap_t>(
    365 //            subsetmap,
    366 //            MPQCData_Time_fused,
    367 //            jobids,
    368 //            container->getContainer(),
    369 //            MatrixNrLookup)
    370 //        );
     388    // create summation instances
     389    std::vector<MPQCDataEnergyMap_t> Result_Energy_fused(subsetmap->getMaximumSubsetLevel());
     390    AllLevelOrthogonalSummator<MPQCDataEnergyMap_t> energySummer(
     391                subsetmap,
     392                MPQCData_Energy_fused,
     393                jobids,
     394                container->getContainer(),
     395                MatrixNrLookup,
     396                Result_Energy_fused);
     397    std::vector<MPQCDataForceMap_t> Result_Force_fused(subsetmap->getMaximumSubsetLevel());
     398    AllLevelOrthogonalSummator<MPQCDataForceMap_t> forceSummer(
     399                subsetmap,
     400                MPQCData_Force_fused,
     401                jobids,
     402                container->getContainer(),
     403                MatrixNrLookup,
     404                Result_Force_fused);
     405    std::vector<MPQCDataGridMap_t> Result_Grid_fused(subsetmap->getMaximumSubsetLevel());
     406    AllLevelOrthogonalSummator<MPQCDataGridMap_t> gridSummer(
     407                subsetmap,
     408                MPQCData_Grid_fused,
     409                jobids,
     410                container->getContainer(),
     411                MatrixNrLookup,
     412                Result_Grid_fused);
     413    std::vector<MPQCDataTimeMap_t> Result_Time_fused(subsetmap->getMaximumSubsetLevel());
     414    AllLevelSummator<MPQCDataTimeMap_t> timeSummer(
     415                subsetmap,
     416                MPQCData_Time_fused,
     417                jobids,
     418                container->getContainer(),
     419                MatrixNrLookup,
     420                Result_Time_fused);
     421
     422    // sum up
     423    boost::mpl::for_each<MPQCDataEnergyVector_t>(boost::ref(energySummer));
     424    boost::mpl::for_each<MPQCDataForceVector_t>(boost::ref(forceSummer));
     425    boost::mpl::for_each<MPQCDataGridVector_t>(boost::ref(gridSummer));
     426    boost::mpl::for_each<MPQCDataTimeVector_t>(boost::ref(timeSummer));
     427
     428    // print tables (without eigenvalues, they go extra)
     429    const size_t MaxLevel = subsetmap->getMaximumSubsetLevel();
     430    typedef boost::mpl::remove<MPQCDataEnergyVector_t, MPQCDataFused::energy_eigenvalues>::type MPQCDataEnergyVector_noeigenvalues_t;
     431    const std::string energyresult =
     432        writeTable<MPQCDataEnergyMap_t, MPQCDataEnergyVector_noeigenvalues_t >()(
     433            Result_Energy_fused, MaxLevel);
     434    LOG(0, "Energy table is \n" << energyresult);
     435    const std::string eigenvalueresult;
     436
     437    LOG(0, "Eigenvalue table is \n" << eigenvalueresult);
     438    const std::string forceresult =
     439        writeTable<MPQCDataForceMap_t, MPQCDataForceVector_t>()(
     440            Result_Force_fused, MaxLevel);
     441    LOG(0, "Force table is \n" << forceresult);
     442    // we don't want to print grid to a table
     443    // print times (without flops for now)
     444    typedef boost::mpl::remove<MPQCDataTimeVector_t, MPQCDataFused::times_flops>::type MPQCDataTimeVector_noflops_t;
     445    const std::string timesresult =
     446        writeTable<MPQCDataTimeMap_t, MPQCDataTimeVector_noflops_t >()(
     447            Result_Time_fused, MaxLevel);
     448    LOG(0, "Times table is \n" << timesresult);
    371449  }
    372450
     
    448526}
    449527
     528#ifdef HAVE_VMG
     529bool createLongRangeJobs(
     530    FragmentController &controller,
     531    const FragmentationFragmentationAutomationAction::FragmentationFragmentationAutomationParameters &params,
     532    const std::vector<MPQCData> &fragmentData)
     533{
     534  std::vector<FragmentJob::ptr> jobs;
     535  // add one job for each fragment as the short-range correction which we need
     536  // to subtract from the obtained full potential to get the long-range part only
     537  for (std::vector<MPQCData>::const_iterator iter = fragmentData.begin();
     538      iter != fragmentData.end(); ++iter) {
     539    const JobId_t next_id = controller.getAvailableId();
     540    LOG(1, "INFO: Creating VMGJob with " << iter->sampled_grid.sampled_grid.size()
     541        << " gridpoints and " << iter->charges.size() << " particle charges.");
     542    FragmentJob::ptr testJob(
     543        new VMGJob(next_id, iter->sampled_grid, iter->positions, iter->charges) );
     544    jobs.push_back(testJob);
     545  }
     546
     547  // add one more job for the full calculation
     548  // TODO: Here, we actually have to combine all the other sampled_grids
     549  {
     550    const int level = LEVEL;
     551    const int GRID = pow(2, level);
     552    std::vector<double> full_sample(GRID*GRID*GRID, 0.);
     553    double begin[NDIM] = { 0., 0., 0. };
     554    const RealSpaceMatrix& M = World::getInstance().getDomain().getM();
     555    const double size = M.at(0,0);
     556    ASSERT( M.determinant() == size*size*size,
     557        "createLongRangeJobs() - current domain matrix "+toString(M)+" is not cubic.");
     558    const SamplingGrid full_sampled_grid(begin, size, level, full_sample);
     559    const std::vector< std::vector<double> > positions;
     560    const std::vector<double> charges;
     561    const JobId_t next_id = controller.getAvailableId();
     562    LOG(1, "INFO: Creating full VMGJob with " << full_sample.size()
     563        << " gridpoints and " << charges.size() << " particle charges.");
     564    FragmentJob::ptr testJob(
     565        new VMGJob(next_id, full_sampled_grid, positions, charges) );
     566    jobs.push_back(testJob);
     567  }
     568
     569  // then send jobs to controller
     570  controller.addJobs(jobs);
     571  controller.sendJobs(params.host.get(), params.port.get());
     572  return true;
     573}
     574#endif
     575
    450576void WaitforResults(
    451577    boost::asio::io_service &io_service,
     
    483609  RunService(io_service, "Requesting ids");
    484610
    485   // Phase Two: create and add jobs
     611  // Phase Two: create and add MPQCJobs
    486612  if (!createJobsFromFiles(controller, params, jobfiles))
    487613    return Action::failure;
    488   RunService(io_service, "Adding jobs");
     614  RunService(io_service, "Adding MPQCJobs");
    489615
    490616  // Phase Three: calculate result
    491617  WaitforResults(io_service, controller, params, jobfiles.size());
    492 
    493   // Phase Three: get result
    494618  controller.receiveResults(params.host.get(), params.port.get());
    495   RunService(io_service, "Phase Four");
     619  RunService(io_service, "Requesting short-range results");
     620  std::vector<FragmentResult::ptr> MPQCresults = controller.getReceivedResults();
     621  std::vector<MPQCData> fragmentData;
     622  ConvertFragmentResultToMPQCData(MPQCresults, fragmentData);
     623
     624  // print intermediate short-range results
     625  {
     626    LOG(1, "INFO: Parsing fragment files from " << params.path.get() << ".");
     627    printReceivedMPQCResults(
     628        MPQCresults,
     629        fragmentData,
     630        params.path.get(),
     631        getNoAtomsFromAdjacencyFile(params.path.get()));
     632  }
     633
     634#ifdef HAVE_VMG
     635  if (params.DoLongrange.get()) {
     636  // Phase Four: obtain more ids
     637  requestIds(controller, params, fragmentData.size()+1);
     638  RunService(io_service, "Requesting ids");
     639
     640  // Phase Five: create VMGJobs
     641  if (!createLongRangeJobs(controller, params, fragmentData))
     642    return Action::failure;
     643  RunService(io_service, "Adding VMGJobs");
     644
     645  // Phase Six: calculate result
     646  WaitforResults(io_service, controller, params, fragmentData.size()+1);
     647  controller.receiveResults(params.host.get(), params.port.get());
     648  RunService(io_service, "Requesting long-range results");
     649  std::vector<FragmentResult::ptr> VMGresults = controller.getReceivedResults();
     650  ASSERT( MPQCresults.size()+1 == VMGresults.size(),
     651      "FragmentationFragmentationAutomationAction::performCall() - number of MPQCresultd and VMGresults don't match.");
    496652
    497653  // Final phase: print result
    498654  {
    499655    LOG(1, "INFO: Parsing fragment files from " << params.path.get() << ".");
    500     std::vector<FragmentResult::ptr> results = controller.getReceivedResults();
    501656    printReceivedMPQCResults(
    502         results,
     657        MPQCresults,
     658        fragmentData,
    503659        params.path.get(),
    504660        getNoAtomsFromAdjacencyFile(params.path.get()));
    505661  }
     662  }
     663#endif
    506664  size_t Exitflag = controller.getExitflag();
    507665
  • src/Actions/FragmentationAction/FragmentationAutomationAction.def

    rcebac0 r36bb2d  
    2020// ValueStorage by the token "Z" -> first column: int, Z, "Z"
    2121// "undefine" if no parameters are required, use (NOPARAM_DEFAULT) for each (undefined) default value
    22 #define paramtypes (std::vector< boost::filesystem::path >)(std::string)(std::string)(std::string)(boost::filesystem::path)
    23 #define paramtokens ("fragment-jobs")("fragment-path")("server-address")("server-port")("fragment-executable")
    24 #define paramdescriptions ("vector of fragment files")("prefix of each fragment file")("hostname of server")("controller port of server")("executable to launch on clients")
    25 #define paramdefaults (NOPARAM_DEFAULT)(NOPARAM_DEFAULT)(PARAM_DEFAULT("127.0.0.1"))(PARAM_DEFAULT("1026"))(NOPARAM_DEFAULT)
    26 #define paramreferences (jobfiles)(path)(host)(port)(executable)
     22#define paramtypes (std::vector< boost::filesystem::path >)(std::string)(std::string)(std::string)(boost::filesystem::path)(bool)
     23#define paramtokens ("fragment-jobs")("fragment-path")("server-address")("server-port")("fragment-executable")("DoLongrange")
     24#define paramdescriptions ("vector of fragment files")("prefix of each fragment file")("hostname of server")("controller port of server")("executable to launch on clients")("whether to calculate long-range contributions")
     25#define paramdefaults (NOPARAM_DEFAULT)(NOPARAM_DEFAULT)(PARAM_DEFAULT("127.0.0.1"))(PARAM_DEFAULT("1026"))(NOPARAM_DEFAULT)(PARAM_DEFAULT("0"))
     26#define paramreferences (jobfiles)(path)(host)(port)(executable)(DoLongrange)
    2727#define paramvalids \
    2828(STLVectorValidator< std::vector< boost::filesystem::path > >(ParserFileValidator() && FilePresentValidator())) \
     
    3030(DummyValidator< std::string >()) \
    3131(DummyValidator< std::string >()) \
    32 (DummyValidator< boost::filesystem::path >())
     32(DummyValidator< boost::filesystem::path >()) \
     33(DummyValidator< bool >())
    3334
    3435#undef statetypes
Note: See TracChangeset for help on using the changeset viewer.