Changeset 3690e4 for src/Jobs


Ignore:
Timestamp:
Feb 2, 2016, 5:50:29 PM (9 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:
9ae11c
Parents:
d1831e (diff), 62d092 (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 'Enhancing_Interdistance' into Candidate_v1.5.1

Location:
src/Jobs
Files:
2 added
8 edited

Legend:

Unmodified
Added
Removed
  • src/Jobs/InterfaceVMGJob.cpp

    rd1831e r3690e4  
    5757#include "CodePatterns/Log.hpp"
    5858
     59#include "Fragmentation/Summation/SetValues/FragmentForces.hpp"
    5960#include "Jobs/WindowGrid_converter.hpp"
     61#include "Jobs/ChargeSmearer.hpp"
    6062
    6163using namespace VMG;
     
    7476    const ImportParticles_t _ImportParticles,
    7577    const bool _DoPrintDebug,
     78    const bool _DoSmearCharges,
    7679    int coarseningSteps,
    7780    double alpha) :
    7881  VMG::Interface(boundary, levelMin, levelMax,
    7982      _box_begin, _box_end, coarseningSteps, alpha),
    80   spl(near_field_cells, Extent(MaxLevel()).MeshWidth().Max()),
     83  nfc(near_field_cells),
     84  meshwidth(Extent(MaxLevel()).MeshWidth().Max()),
     85  spl(nfc, meshwidth),
    8186  sampled_input(_sampled_input),
    8287  returndata(_returndata),
     
    8489  ImportParticles(_ImportParticles),
    8590  DoPrintDebug(_DoPrintDebug),
    86   OpenBoundaryCondition(boundary[0] == VMG::Open)
     91  OpenBoundaryCondition(boundary[0] == VMG::Open),
     92  DoSmearCharges(_DoSmearCharges)
    8793{
    8894  for (size_t i=0;i<3;++i) {
     
    158164
    159165  // add sampled electron charge density onto grid
     166  if (DoSmearCharges) {
     167    ChargeSmearer &smearer = ChargeSmearer::getInstance();
     168    smearer.initializeSplineArray(spl, nfc, meshwidth);
     169  }
    160170  WindowGrid_converter::addWindowOntoGrid(
    161171      grid,
    162172      sampled_input,
    163173      1.,
    164       OpenBoundaryCondition);
     174      OpenBoundaryCondition,
     175      DoSmearCharges);
    165176
    166177  if (DoPrintDebug) {
     
    318329        const vmg_float length = dir.Length();
    319330
    320         if (length < r_cut) {
     331        if ((length < r_cut) && (length > std::numeric_limits<double>::epsilon())) {
    321332
    322333          (*p1)->Pot() += (*p2)->Charge() / length * (1.0 + spl.EvaluatePotential(length));
     
    331342      }
    332343
     344  const vmg_int& num_particles_local = factory.GetObjectStorageVal<vmg_int>("PARTICLE_NUM_LOCAL");
     345
    333346  /* Remove average force term */
     347//  if (!particles.empty()) {
     348//    Vector average_force = 0.0;
     349//    for (std::list<Particle::Particle>::const_iterator iter=particles.begin(); iter!=particles.end(); ++iter)
     350//      average_force += iter->Charge() * iter->Field();
     351//    const vmg_int num_particles_global = comm.GlobalSum(num_particles_local);
     352//    average_force /= (double)num_particles_global;
     353//    comm.GlobalSumArray(average_force.vec(), 3);
     354//    for (std::list<Particle::Particle>::iterator iter=particles.begin(); iter!=particles.end(); ++iter)
     355//      iter->Field() -= average_force / iter->Charge();
     356//    comm.PrintOnce(Debug, "Average force term is:         %e %e %e", average_force[0], average_force[1], average_force[2]);
     357//  }
     358
     359  comm.CommParticlesBack(particles);
     360
     361  vmg_float* q = factory.GetObjectStorageArray<vmg_float>("PARTICLE_CHARGE_ARRAY");
     362  const vmg_float* p = factory.GetObjectStorageArray<vmg_float>("PARTICLE_POTENTIAL_ARRAY");
     363  const vmg_float* f = factory.GetObjectStorageArray<vmg_float>("PARTICLE_FIELD_ARRAY");
     364
     365  // extract forces
    334366  if (!particles.empty()) {
    335     Vector average_force = 0.0;
    336     for (std::list<Particle::Particle>::const_iterator iter=particles.begin(); iter!=particles.end(); ++iter)
    337       average_force += iter->Charge() * iter->Field();
    338     const vmg_int& npl = MG::GetFactory().GetObjectStorageVal<vmg_int>("PARTICLE_NUM_LOCAL");
    339     const vmg_int num_particles_global = comm.GlobalSum(npl);
    340     average_force /= num_particles_global;
    341     comm.GlobalSumArray(average_force.vec(), 3);
    342     for (std::list<Particle::Particle>::iterator iter=particles.begin(); iter!=particles.end(); ++iter)
    343       iter->Field() -= average_force / iter->Charge();
    344   }
    345 
    346   comm.CommParticlesBack(particles);
    347 
    348   vmg_float* q = factory.GetObjectStorageArray<vmg_float>("PARTICLE_CHARGE_ARRAY");
    349   const vmg_int& num_particles_local = factory.GetObjectStorageVal<vmg_int>("PARTICLE_NUM_LOCAL");
    350   const vmg_float* p = factory.GetObjectStorageArray<vmg_float>("PARTICLE_POTENTIAL_ARRAY");
    351 //  const vmg_float* f = factory.GetObjectStorageArray<vmg_float>("PARTICLE_FIELD_ARRAY");
    352 
     367    size_t index = 0;
     368    returndata.forces.resize(
     369        num_particles_local, FragmentForces::force_t(3, 0.) );
     370    for (FragmentForces::forces_t::iterator iter = returndata.forces.begin();
     371        iter != returndata.forces.end(); ++iter) {
     372      comm.PrintOnce(Debug, "%d force vector:        %e %e %e", (index/3)+1, f[index+0], f[index+1], f[index+2]);
     373      for (size_t i=0;i<3;++i)
     374          (*iter)[i] = f[index++];
     375    }
     376    returndata.hasForces = true;
     377  }
    353378
    354379  e_long = comm.GlobalSumRoot(e_long);
  • src/Jobs/InterfaceVMGJob.hpp

    rd1831e r3690e4  
    5353      const ImportParticles_t _ImportParticles=DoImportParticles,
    5454      const bool _DoPrintDebug=false,
     55      const bool _DoSmearCharges=false,
    5556      int coarseningSteps=9,
    5657      double alpha=1.6
     
    6364
    6465protected:
     66  unsigned int nfc;
     67  const double meshwidth;
    6568  VMG::Particle::BSpline spl;
    6669
     
    8891  //!> open boundary conditions or not
    8992  const bool OpenBoundaryCondition;
     93
     94  //!> whether to smear out electronic charge distributions with bsplines or not
     95  const bool DoSmearCharges;
    9096};
    9197
  • src/Jobs/MPQCCommandJob.cpp

    rd1831e r3690e4  
    5151
    5252#include "LinearAlgebra/defs.hpp"
     53
     54#include "Fragmentation/Summation/SetValues/FragmentForces.hpp"
    5355
    5456const std::string MPQCCommandJob::keyword_hartreefock_energy("total scf energy");
     
    110112        tok_iter++;
    111113        tok_iter++;
    112         MPQCData::vector_type forcevector(NDIM);
     114        FragmentForces::force_t forcevector(NDIM);
    113115        try { // first col is index, second is element
    114116          for (size_t index = 0;index < NDIM; ++index)
  • src/Jobs/Makefile.am

    rd1831e r3690e4  
    1717if CONDVMG
    1818JOBSSOURCE += \
     19        Jobs/ChargeSmearer.cpp \
    1920        Jobs/InterfaceVMGDebugGridJob.cpp \
    2021        Jobs/InterfaceVMGJob.cpp \
     
    4344if CONDVMG
    4445JOBSHEADER += \
     46        Jobs/ChargeSmearer.hpp \
    4547        Jobs/InterfaceVMGDebugGridJob.hpp \
    4648        Jobs/InterfaceVMGJob.hpp \
     
    121123nodist_libMolecuilderJobs_libinclude_HEADERS = $(top_builddir)/libmolecuilder_config.h
    122124
    123 ## Install the generated pkg-config file (.pc) into the expected location for
    124 ## architecture-dependent package configuration information.  Occasionally,
    125 ## pkg-config files are also used for architecture-independent data packages,
    126 ## in which case the correct install location would be $(datadir)/pkgconfig.
    127 #pkgconfigdir = $(libdir)/pkgconfig
    128 #pkgconfig_DATA = $(top_builddir)/MoleCuilder.pc
    129 
  • src/Jobs/VMGJob.cpp

    rd1831e r3690e4  
    9292    const bool _DoImportParticles,
    9393    const bool _DoPrintDebug,
    94     const bool _OpenBoundaryConditions) :
     94    const bool _OpenBoundaryConditions,
     95    const bool _DoSmearCharges) :
    9596  FragmentJob(_JobId),
    9697  density_grid(_density_grid),
     
    102103  DoPrintDebug(_DoPrintDebug),
    103104  OpenBoundaryConditions(_OpenBoundaryConditions),
     105  DoSmearCharges(_DoSmearCharges),
    104106  returndata(static_cast<const SamplingGridProperties &>(_density_grid)),
    105107  particles()
     
    113115  DoPrintDebug(false),
    114116  OpenBoundaryConditions(false),
     117  DoSmearCharges(false),
    115118  particles()
    116119{}
     
    246249          VMGInterfaces::InterfaceVMGJob::DoImportParticles
    247250          : VMGInterfaces::InterfaceVMGJob::DontImportParticles,
    248       DoPrintDebug);
     251      DoPrintDebug,
     252      DoSmearCharges);
    249253  const int cycle_type = 1; // V-type
    250254  if (OpenBoundaryConditions) {
  • src/Jobs/VMGJob.hpp

    rd1831e r3690e4  
    4444   * @param _DoImportParticles whether we import particles (true) or evaluate only
    4545   * @param _DoPrintDebug whether we do print grid for debug visualization or not
     46   * @param _OpenBoundaryConditions whether we have open (true) boundary conditions or periodic (false)
     47   * @param _DoSmearCharges whether to smear out electronic charge distributions with bsplines or not
    4648   */
    4749  VMGJob(const JobId_t _JobId,
     
    5355      const bool _DoImportParticles=true,
    5456      const bool _DoPrintDebug=false,
    55       const bool _OpenBoundaryConditions=false
     57      const bool _OpenBoundaryConditions=false,
     58      const bool _DoSmearCharges=false
    5659      );
    5760  virtual ~VMGJob();
     
    8184  //!> whether we have open (true) boundary conditions or periodic (false)
    8285  const bool OpenBoundaryConditions;
     86  //!> whether to smear out electronic charge distributions with bsplines or not
     87  const bool DoSmearCharges;
    8388
    8489private:
     
    134139    ar & const_cast< bool &>(DoPrintDebug);
    135140    ar & const_cast< bool &>(OpenBoundaryConditions);
     141    ar & const_cast< bool &>(DoSmearCharges);
    136142    ar & returndata;
    137143  }
  • src/Jobs/WindowGrid_converter.cpp

    rd1831e r3690e4  
    5050
    5151#include "Fragmentation/Summation/SetValues/SamplingGrid.hpp"
     52#include "Jobs/ChargeSmearer.hpp"
    5253
    5354void WindowGrid_converter::addGridOntoWindow(
     
    178179    const SamplingGrid &grid,
    179180    const double prefactor,
    180     const bool OpenBoundaryConditions)
     181    const bool OpenBoundaryConditions,
     182    const bool DoSmearCharges)
    181183{
    182184#ifndef NDEBUG
     
    244246  }
    245247
     248  /// reset grid to zero everywhere
     249
    246250  VMG::Grid::iterator griditer = window.Iterators().Local().Begin();
    247251//  griditer.advance(pre_offset[0]*total[1]*total[2]);
     252  for(N[0]=0; N[0] < total[0]; ++N[0])
     253    for(N[1]=0; N[1] < total[1]; ++N[1])
     254      for(N[2]=0; N[2] < total[2]; ++N[2]) {
     255        ASSERT( griditer != window.Iterators().Local().End(),
     256            "InterfaceVMGJob::addWindowOntoGrid() - griditer is already at end of window.");
     257        window(*griditer++) = 0.;
     258      }
     259
     260#ifndef NDEBUG
     261  ASSERT( griditer == window.Iterators().Local().End(),
     262      "InterfaceVMGJob::addWindowOntoGrid() - griditer is not at end of window.");
     263#endif
     264
     265  /// then apply charges onto grid
     266
     267  griditer = window.Iterators().Local().Begin();
     268  SamplingGrid::sampledvalues_t::const_iterator copyiter = grid.sampled_grid.begin();
     269  const ChargeSmearer &smearer = ChargeSmearer::getInstance();
     270  // NOTE: GridIterator::operator+=()'s implementation in vmg is broken. DON'T USE!
     271//  griditer += pre_offset[0] * total[1] * total[2];
    248272  for(N[0]=0; N[0] < pre_offset[0]; ++N[0])
    249273    for(N[1]=0; N[1] < total[1]; ++N[1])
     
    251275        ASSERT( griditer != window.Iterators().Local().End(),
    252276            "InterfaceVMGJob::addWindowOntoGrid() - griditer is already at end of window.");
    253         window(*griditer++) = 0.;
    254       }
    255   SamplingGrid::sampledvalues_t::const_iterator copyiter = grid.sampled_grid.begin();
     277        griditer++;
     278      }
    256279  for(N[0]=0; N[0] < length[0]; ++N[0]) {
    257 //    griditer.advance(pre_offset[1]*total[2]);
     280//    griditer += pre_offset[1] * total[2];
    258281      for(N[1]=0; N[1] < pre_offset[1]; ++N[1])
    259282        for(N[2]=0; N[2] < total[2]; ++N[2]) {
    260283          ASSERT( griditer != window.Iterators().Local().End(),
    261284              "InterfaceVMGJob::addWindowOntoGrid() - griditer is already at end of window.");
    262           window(*griditer++) = 0.;
     285          griditer++;
    263286        }
    264287    for(N[1]=0; N[1] < length[1]; ++N[1]) {
    265 //      griditer.advance(pre_offset[2]);
    266       for(N[2]=0; N[2] < pre_offset[2]; ++N[2])
    267         window(*griditer++) = 0.;
     288//      griditer += pre_offset[2];
     289      for(N[2]=0; N[2] < pre_offset[2]; ++N[2]) {
     290        griditer++;
     291      }
     292
    268293      for(N[2]=0; N[2] < length[2]; ++N[2]) {
    269294        ASSERT( griditer != window.Iterators().Local().End(),
     
    271296        ASSERT( copyiter != grid.sampled_grid.end(),
    272297            "InterfaceVMGJob::addWindowOntoGrid() - griditer is already at end of window.");
    273         window(*griditer++) += prefactor*(*copyiter++);
    274       }
    275 //      griditer.advance(post_offset[2]);
     298        // either smear out charges or not.
     299        if (DoSmearCharges) {
     300          smearer(window, griditer++, prefactor*(*copyiter++));
     301        } else {
     302          window(*griditer++) += prefactor*(*copyiter++);
     303        }
     304      }
     305//      griditer += post_offset[2];
    276306      for(N[2]=0; N[2] < post_offset[2]; ++N[2]) {
    277307        ASSERT( griditer != window.Iterators().Local().End(),
    278308            "InterfaceVMGJob::addWindowOntoGrid() - griditer is already at end of window.");
    279         window(*griditer++) = 0.;
     309        griditer++;
    280310      }
    281311    }
    282 //    griditer.advance(post_offset[1]*total[2]);
     312//    griditer += post_offset[1] * total[2];
    283313    for(N[1]=0; N[1] < post_offset[1]; ++N[1])
    284314      for(N[2]=0; N[2] < total[2]; ++N[2]) {
    285315        ASSERT( griditer != window.Iterators().Local().End(),
    286316            "InterfaceVMGJob::addWindowOntoGrid() - griditer is already at end of window.");
    287         window(*griditer++) = 0.;
    288       }
    289   }
    290   //  griditer.advance(post_offset[0]*total[1]*total[2]);
     317        griditer++;
     318      }
     319  }
     320//  griditer += post_offset[0] * total[1] * total[2];
    291321  for(N[0]=0; N[0] < post_offset[0]; ++N[0])
    292322    for(N[1]=0; N[1] < total[1]; ++N[1])
     
    294324        ASSERT( griditer != window.Iterators().Local().End(),
    295325            "InterfaceVMGJob::addWindowOntoGrid() - griditer is already at end of window.");
    296         window(*griditer++) = 0.;
     326        griditer++;
    297327      }
    298328#ifndef NDEBUG
     
    302332      "InterfaceVMGJob::addWindowOntoGrid() - copyiter is not at end of window.");
    303333#endif
    304 //  LOG(2, "DEBUG: Grid after adding other is " << grid << ".");
     334
     335  //  LOG(2, "DEBUG: Grid after adding other is " << grid << ".");
    305336}
  • src/Jobs/WindowGrid_converter.hpp

    rd1831e r3690e4  
    4949      const SamplingGrid &grid,
    5050      const double prefactor,
    51       const bool OpenBoundaryConditions = false);
     51      const bool OpenBoundaryConditions = false,
     52      const bool DoSmearCharges = false);
    5253
    5354};
Note: See TracChangeset for help on using the changeset viewer.