Ignore:
Timestamp:
Nov 15, 2012, 3:12:54 PM (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:
fb69e9
Parents:
092be05
git-author:
Frederik Heber <heber@…> (07/26/12 10:17:56)
git-committer:
Frederik Heber <heber@…> (11/15/12 15:12:54)
Message:

Positions and charges of nuclei are also contained in MPQCData and used by VMGJob and InterfaceVMGJob, respectively.

  • this is a temporary solution until we finally create the fragments and send prepare the MPQCJobs in one go. I.e. for now mpqc has to fill in the vacant MPQCData entries of positions and charges to be used by the VMGJob created from this information.
  • Using CommSerial/MPI in ImportRightHandSide() to getParticleGrid().
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Jobs/InterfaceVMGJob.cpp

    r092be05 rcd77fc  
    3232#endif
    3333
     34#ifdef HAVE_MPI
     35#include "mpi.h"
     36#endif
     37
    3438#include "CodePatterns/MemDebug.hpp"
    3539
     
    4044
    4145#include "base/vector.hpp"
     46#include "base/math.hpp"
     47#ifdef HAVE_MPI
     48#include "comm/comm_mpi.hpp"
     49#else
     50#include "comm/comm_serial.hpp"
     51#endif
    4252#include "grid/grid.hpp"
    4353#include "grid/multigrid.hpp"
     
    4858using VMGInterfaces::InterfaceVMGJob;
    4959
     60InterfaceVMGJob::InterfaceVMGJob(const std::vector< double > &_sampled_input,
     61    std::vector< double > &_sampled_output,
     62    const std::vector< std::vector<double> > &_particle_positions,
     63    const std::vector< double > &_particle_charges,
     64    VMG::Boundary boundary,
     65    int levelMin,
     66    int levelMax,
     67    const VMG::Vector &box_begin,
     68    vmg_float box_end,
     69    const int& near_field_cells,
     70    int coarseningSteps,
     71    double alpha) :
     72  VMG::Interface(boundary, levelMin, levelMax,
     73      box_begin, box_end, coarseningSteps, alpha),
     74  spl(near_field_cells, Extent(MaxLevel()).MeshWidth().Max()),
     75  sampled_input(_sampled_input),
     76  sampled_output(_sampled_output),
     77  level(levelMax)
     78{
     79  std::vector< std::vector<double> >::const_iterator positer = _particle_positions.begin();
     80  std::vector<double>::const_iterator chargeiter = _particle_charges.begin();
     81  double pos[3];
     82  for (; positer != _particle_positions.end(); ++positer, ++chargeiter) {
     83    ASSERT( (*positer).size() == 3,
     84        "InterfaceVMGJob::InterfaceVMGJob() - particle "
     85        +toString(distance(_particle_positions.begin(), positer))+" has not exactly 3 coordinates.");
     86    for (size_t i=0;i<3;++i)
     87      pos[i] = (*positer)[i];
     88    particles.push_back(Particle::Particle(pos, *chargeiter));
     89  }
     90}
     91
     92InterfaceVMGJob::~InterfaceVMGJob()
     93{}
     94
    5095void InterfaceVMGJob::ImportRightHandSide(Multigrid& multigrid)
    5196{
    5297  Index i;
    5398  Vector pos;
    54 
    55 //  VMG::TempGrid *temp_grid = new VMG::TempGrid(129, 0, 0., 1.);
     99  //  VMG::TempGrid *temp_grid = new VMG::TempGrid(129, 0, 0., 1.);
    56100
    57101  Grid& grid = multigrid(multigrid.MaxLevel());
    58102  grid.ClearBoundary();
     103
     104  /// 1. assign nuclei as smeared-out charges to the grid
     105
     106  /*
     107   * Charge assignment on the grid
     108   */
     109#ifdef HAVE_MPI
     110  CommMPI& comm = *dynamic_cast<CommMPI*>(VMG::MG::GetComm());
     111#else
     112  CommSerial& comm = *dynamic_cast<CommSerial*>(VMG::MG::GetComm());
     113#endif
     114  Grid& particle_grid = comm.GetParticleGrid();
     115
     116  particle_grid.Clear();
     117
     118  assert(particle_grid.Global().LocalSize().IsComponentwiseGreater(
     119      VMG::MG::GetFactory().GetObjectStorageVal<int>("PARTICLE_NEAR_FIELD_CELLS")));
     120
     121  for (std::list<Particle::Particle>::iterator iter = particles.begin();
     122      iter != particles.end(); ++iter)
     123    spl.SetSpline(particle_grid, *iter);
     124
     125  // Communicate charges over halo
     126  comm.CommFromGhosts(particle_grid);
     127
     128  // Assign charge values to the right hand side
     129  for (int i=0; i<grid.Local().Size().X(); ++i)
     130    for (int j=0; j<grid.Local().Size().Y(); ++j)
     131      for (int k=0; k<grid.Local().Size().Z(); ++k)
     132  grid(grid.Local().Begin().X() + i,
     133       grid.Local().Begin().Y() + j,
     134       grid.Local().Begin().Z() + k) = 4.0 * VMG::Math::pi *
     135    particle_grid.GetVal(particle_grid.Local().Begin().X() + i,
     136             particle_grid.Local().Begin().Y() + j,
     137             particle_grid.Local().Begin().Z() + k);
     138
     139  /// 2. add sampled electron density to the grid
    59140
    60141  const Index begin_local = grid.Global().LocalBegin() - grid.Local().HaloSize1();
     
    71152      << "Z in [" << grid.Local().Begin().Z() << "," << grid.Local().End().Z() << "].");
    72153
     154  const double element_volume =
     155      grid.Extent().MeshWidth().X() * grid.Extent().MeshWidth().Y() * grid.Extent().MeshWidth().Z();
    73156  std::vector<double>::const_iterator sample_iter = sampled_input.begin();
    74157  for (i.X()=grid.Local().Begin().X(); i.X()<grid.Local().End().X(); ++i.X())
    75158    for (i.Y()=grid.Local().Begin().Y(); i.Y()<grid.Local().End().Y(); ++i.Y())
    76       for (i.Z()=grid.Local().Begin().Z(); i.Z()<grid.Local().End().Z(); ++i.Z()) {
    77         pos = grid.Extent().MeshWidth() * static_cast<Vector>(begin_local + i);
    78 //        R.x() = pos.X();
    79 //        R.y() = pos.Y();
    80 //        R.z() = pos.Z();
    81         grid(i) = *sample_iter; //temp_grid(i);
    82         ++sample_iter;
    83       }
     159      for (i.Z()=grid.Local().Begin().Z(); i.Z()<grid.Local().End().Z(); ++i.Z())
     160        grid(i) -= (*sample_iter++) * element_volume; //temp_grid(i);
    84161  assert( sample_iter == sampled_input.end() );
    85162
Note: See TracChangeset for help on using the changeset viewer.