QMCPACK
test_spacewarp.cpp
Go to the documentation of this file.
1 //////////////////////////////////////////////////////////////////////////////////////
2 // This file is distributed under the University of Illinois/NCSA Open Source License.
3 // See LICENSE file in top directory for details.
4 //
5 // Copyright (c) 2016 Jeongnim Kim and QMCPACK developers.
6 //
7 // File developed by: Mark Dewing, markdewing@gmail.com, University of Illinois at Urbana-Champaign
8 //
9 // File created by: Mark Dewing, markdewing@gmail.com, University of Illinois at Urbana-Champaign
10 //////////////////////////////////////////////////////////////////////////////////////
11 
12 
13 #include "catch.hpp"
14 
15 #include "OhmmsData/Libxml2Doc.h"
16 #include "OhmmsPETE/OhmmsMatrix.h"
17 #include "Particle/ParticleSet.h"
20 //#include "QMCWaveFunctions/SPOSetBuilderFactory.h"
21 //#include "QMCHamiltonians/ForceChiesaPBCAA.h"
22 //#include "QMCHamiltonians/ForceCeperley.h"
23 //#include "QMCHamiltonians/CoulombPotential.h"
24 //#include "QMCHamiltonians/CoulombPBCAA.h"
25 //#include "QMCHamiltonians/CoulombPBCAB.h"
26 //#include "QMCWaveFunctions/TrialWaveFunction.h"
27 //#include "QMCWaveFunctions/Fermion/DiracDeterminant.h"
28 //#include "QMCWaveFunctions/Fermion/SlaterDet.h"
29 
30 #include <stdio.h>
31 #include <string>
32 
33 using std::string;
34 
35 namespace qmcplusplus
36 {
38 TEST_CASE("SpaceWarp", "[hamiltonian]")
39 {
41 
43  bool okay = doc.parse("Na2.structure.xml");
44  REQUIRE(okay);
45  xmlNodePtr root = doc.getRoot();
46 
47  const SimulationCell simulation_cell;
48 
49  ParticleSet ions(simulation_cell);
50  XMLParticleParser parse_ions(ions);
51  OhmmsXPathObject particleset_ion("//particleset[@name='ion0']", doc.getXPathContext());
52  REQUIRE(particleset_ion.size() == 1);
53  parse_ions.readXML(particleset_ion[0]);
54 
55  REQUIRE(ions.groups() == 1);
56  REQUIRE(ions.R.size() == 2);
57  ions.update();
58 
59  ParticleSet elec(simulation_cell);
60  XMLParticleParser parse_elec(elec);
61  OhmmsXPathObject particleset_elec("//particleset[@name='e']", doc.getXPathContext());
62  REQUIRE(particleset_elec.size() == 1);
63  parse_elec.readXML(particleset_elec[0]);
64 
65  REQUIRE(elec.groups() == 2);
66  REQUIRE(elec.R.size() == 2);
67 
68  elec.addTable(ions);
69  elec.update();
70 
71  //Now build the wavefunction. This will be needed to test \Nabla_i E_L and \Nabla_i logPsi contributions.
72  //For now, just take them from a reference calculation.
73 
74  using Force_t = ParticleSet::ParticlePos;
75  Force_t dE_L;
76  Force_t el_contribution;
77  Force_t psi_contribution;
78 
79  dE_L.resize(elec.getTotalNum());
80  el_contribution.resize(ions.getTotalNum());
81  psi_contribution.resize(ions.getTotalNum());
82 
83  dE_L[0][0] = -0.0328339806050;
84  dE_L[0][1] = -0.0834441565340;
85  dE_L[0][2] = 0.0997813066140;
86  dE_L[1][0] = -0.0140597469190;
87  dE_L[1][1] = 0.0591827022730;
88  dE_L[1][2] = -0.0622852142310;
89 
90  elec.G[0][0] = 0.4167938814700;
91  elec.G[0][1] = 0.2878426639600;
92  elec.G[0][2] = -0.3470187402100;
93  elec.G[1][0] = -0.2946265813200;
94  elec.G[1][1] = -0.3606166249000;
95  elec.G[1][2] = 0.3751881159300;
96 
97  SpaceWarpTransformation swt(elec, ions);
98  swt.setPow(3.0);
99 
100  CHECK(swt.f(2.0) == Approx(0.125));
101  CHECK(swt.df(2.0) == Approx(-0.1875));
102 
103  swt.setPow(4.0);
104  CHECK(swt.f(2.0) == Approx(0.0625));
105  CHECK(swt.df(2.0) == Approx(-0.125));
106 
107  swt.computeSWT(elec, ions, dE_L, elec.G, el_contribution, psi_contribution);
108  app_log() << "EL_Contribution: " << el_contribution << std::endl;
109  app_log() << "PSi_Contribution: " << psi_contribution << std::endl;
110  CHECK(el_contribution[0][0] == Approx(-0.0326934696861));
111  CHECK(el_contribution[0][1] == Approx(-0.0826080664130));
112  CHECK(el_contribution[0][2] == Approx(0.0988243408507));
113  CHECK(el_contribution[1][0] == Approx(-0.0142002578379));
114  CHECK(el_contribution[1][1] == Approx(0.0583466121520));
115  CHECK(el_contribution[1][2] == Approx(-0.0613282484677));
116 
117  CHECK(psi_contribution[0][0] == Approx(0.4051467191368));
118  CHECK(psi_contribution[0][1] == Approx(0.2757724717133));
119  CHECK(psi_contribution[0][2] == Approx(-0.3334287440127));
120  CHECK(psi_contribution[1][0] == Approx(-0.2829794189868));
121  CHECK(psi_contribution[1][1] == Approx(-0.3485464326533));
122  CHECK(psi_contribution[1][2] == Approx(0.3615981197327));
123 }
124 } //namespace qmcplusplus
This implements the differential space warp transformation for ZVZB estimators given by Sorella & Cap...
class that handles xmlDoc
Definition: Libxml2Doc.h:76
helper functions for EinsplineSetBuilder
Definition: Configuration.h:43
QTBase::RealType RealType
Definition: Configuration.h:58
xmlXPathContextPtr getXPathContext()
Definition: Libxml2Doc.cpp:100
size_t getTotalNum() const
Definition: ParticleSet.h:493
std::ostream & app_log()
Definition: OutputManager.h:65
RealType df(RealType r)
Derivative of space warp transformation function F(r) w.r.t.
TEST_CASE("complex_helper", "[type_traits]")
xmlNodePtr getRoot()
Definition: Libxml2Doc.h:88
void setPow(RealType swpow_in)
Sets the exponent for power law space warp transformation.
void update(bool skipSK=false)
update the internal data
Communicate * Controller
Global Communicator for a process.
Definition: Communicate.cpp:35
class to handle xmlXPathObject
Definition: Libxml2Doc.h:26
Wrapping information on parallelism.
Definition: Communicate.h:68
int groups() const
return the number of groups
Definition: ParticleSet.h:511
int addTable(const ParticleSet &psrc, DTModes modes=DTModes::ALL_OFF)
add a distance table
Specialized paritlce class for atomistic simulations.
Definition: ParticleSet.h:55
RealType f(RealType r)
Space warp transformation function F(r).
void computeSWT(ParticleSet &elec, const ParticleSet &ions, Force_t &dEl, ParticleGradient &dlogpsi, Force_t &el_contribution, Force_t &psi_contribution)
Takes in precomputed grad(E_L) and grad(logPsi) and computes the ZV and ZB space warp contributions t...
size_type size() const
return the current size
Definition: OhmmsVector.h:162
REQUIRE(std::filesystem::exists(filename))
ParticleGradient G
gradients of the particles
Definition: ParticleSet.h:83
bool readXML(xmlNodePtr cur)
process xmlnode <particleset/> which contains everything about the particle set to initialize ...
ParticlePos R
Position.
Definition: ParticleSet.h:79
QMCTraits::RealType RealType
CHECK(log_values[0]==ComplexApprox(std::complex< double >{ 5.603777579195571, -6.1586603331188225 }))
ParticleAttrib< SingleParticlePos > ParticlePos
Definition: Configuration.h:92
bool parse(const std::string &fname)
Definition: Libxml2Doc.cpp:180