QMCPACK
MinimalParticlePool.h
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) 2019 QMCPACK developers.
6 //
7 // File developed by: Peter Doak, doakpw@ornl.gov, Oak Ridge National Laboratory
8 //
9 // File created by: Peter Doak, doakpw@ornl.gov, Oak Ridge National Laboratory
10 //////////////////////////////////////////////////////////////////////////////////////
11 
12 #ifndef QMCPLUSPLUS_MINIMALPARTICLEPOOL_H
13 #define QMCPLUSPLUS_MINIMALPARTICLEPOOL_H
14 
15 #include "Message/Communicate.h"
16 #include "OhmmsData/Libxml2Doc.h"
18 
19 namespace qmcplusplus
20 {
21 /** This should be the minimal ParticleSetPool for integration tests
22  *
23  */
25 {
26  // See ParticleIO/tests/test_xml_io.cpp for particle parsing
27  static constexpr const char* const particles_xml = R"(
28 <tmp>
29  <simulationcell>
30  <parameter name='lattice' units='bohr'>
31  3.37316115 3.37316115 0.00000000
32  0.00000000 3.37316115 3.37316115
33  3.37316115 0.00000000 3.37316115
34  </parameter>
35  <parameter name='bconds'>
36  p p p
37  </parameter>
38  <parameter name='LR_dim_cutoff'>15 </parameter>
39  </simulationcell>
40  <particleset name="ion" size="2">
41  <group name="C">
42  <parameter name="charge">4</parameter>
43  </group>
44  <attrib name="position" datatype="posArray">
45  0.00000000 0.00000000 0.00000000
46  1.68658058 1.68658058 1.68658058
47  </attrib>
48  </particleset>
49  <particleset name="e" random="yes" >
50  <group name="u" size="4">
51  <parameter name="charge">-1</parameter>
52  </group>
53  <group name="d" size="4">
54  <parameter name="charge">-1</parameter>
55  </group>
56  </particleset>
57 </tmp>
58 )";
59 
60  static constexpr const char* const particles_xml_spinor = R"(
61 <tmp>
62  <simulationcell>
63  <parameter name="lattice" units="bohr">
64  5.10509515 -3.23993545 0.00000000
65  5.10509515 3.23993545 -0.00000000
66  -6.49690625 0.00000000 7.08268015
67  </parameter>
68  <parameter name="bconds">
69  p p p
70  </parameter>
71  <parameter name="LR_dim_cutoff" > 15 </parameter>
72  </simulationcell>
73  <particleset name="ion0">
74  <group name="O" size="2" mass="29164.3928678">
75  <parameter name="charge" > 6 </parameter>
76  <parameter name="valence" > 6 </parameter>
77  <parameter name="atomicnumber" > 8 </parameter>
78  <parameter name="mass" > 29164.3928678 </parameter>
79  <attrib name="position" datatype="posArray" condition="0">
80  -0.00000000 -0.00000000 1.08659253
81  0.00000000 0.00000000 -1.08659253
82  </attrib>
83  </group>
84  </particleset>
85  <particleset name="e" spinor="yes" random="yes">
86  <group name="u" size="12" mass="1.0">
87  <parameter name="charge" > -1 </parameter>
88  <parameter name="mass" > 1.0 </parameter>
89  </group>
90  </particleset>
91 </tmp>
92 )";
93 
94  static constexpr const char* const particles_xml_NiO_a4 = R"(
95 <tmp>
96  <simulationcell>
97  <parameter name="lattice">
98  3.94055 3.94055 7.8811
99  7.8811 3.94055 3.94055
100  3.94055 7.8811 3.94055
101  </parameter>
102  <parameter name="bconds">p p p </parameter>
103  <parameter name="LR_dim_cutoff">15</parameter>
104  </simulationcell>
105  <particleset name="i" size="4">
106  <group name="O">
107  <parameter name="charge">6.000000</parameter>
108  <parameter name="valence">6.000000</parameter>
109  <parameter name="atomicnumber">8.000000</parameter>
110  </group>
111  <group name="Ni">
112  <parameter name="charge">18</parameter>
113  <parameter name="valence">18</parameter>
114  <parameter name="atomicnumber">28</parameter>
115  </group>
116  <attrib name="position" datatype="posArray" condition="1">
117  0.25 0.25 0.25
118  0.75 0.75 0.75
119  0 0 0
120  0.5 0.5 0.5
121  </attrib>
122  <attrib name="ionid" datatype="stringArray">
123  O O Ni Ni
124  </attrib>
125  </particleset>
126  <particleset name="e" random="yes" randomsrc="i">
127  <group name="u" size="24">
128  <parameter name="charge">-1</parameter>
129  </group>
130  <group name="d" size="24">
131  <parameter name="charge">-1</parameter>
132  </group>
133  </particleset>
134 </tmp>
135 )";
136 
137  static constexpr const char* const particles_xml_H2 = R"(
138 <tmp>
139  <particleset name="ion" size="2">
140  <group name="H">
141  <parameter name="charge">1</parameter>
142  <parameter name="valence">1</parameter>
143  <parameter name="atomicnumber">1</parameter>
144  </group>
145  <attrib name="position" datatype="posArray">
146  0.0000000000e+00 0.0000000000e+00 -9.4486299390e-01
147  0.0000000000e+00 0.0000000000e+00 9.4486299390e-01
148 </attrib>
149  <attrib name="ionid" datatype="stringArray">
150  H H
151 </attrib>
152  </particleset>
153  <particleset name="e">
154  <group name="u" size="1">
155  <parameter name="charge">-1</parameter>
156  <attrib name="position" datatype="posArray">
157  5.2261545687e-01 4.6234802699e-01 -1.2355134293e+00
158 </attrib>
159  </group>
160  <group name="d" size="1">
161  <parameter name="charge">-1</parameter>
162  <attrib name="position" datatype="posArray">
163  6.4451072699e-01 1.3453681375e-01 1.3161796485e+00
164 </attrib>
165  </group>
166  </particleset>
167 </tmp>
168 )";
169 
170 public:
171  static void parseParticleSetXML(const char* xml_string, ParticleSetPool& pp)
172  {
174 
175  doc.parseFromString(xml_string);
176 
177  xmlNodePtr root = doc.getRoot();
178  xmlNodePtr sim_cell = xmlFirstElementChild(root);
179 
180  // Need to set up simulation cell lattice before reading particle sets
181  pp.readSimulationCellXML(sim_cell);
182 
183  xmlNodePtr part_ion = xmlNextElementSibling(sim_cell);
184  pp.put(part_ion);
185  xmlNodePtr part_elec = xmlNextElementSibling(part_ion);
186  pp.put(part_elec);
187  pp.randomize();
188  }
189 
191  {
192  ParticleSetPool pp(c);
194  return pp;
195  }
196 
198  {
199  ParticleSetPool pp(c);
201  return pp;
202  }
203 
205  {
206  ParticleSetPool pp(c);
208  return pp;
209  }
210 
212  {
214 
216 
217  xmlNodePtr root = doc.getRoot();
218  xmlNodePtr part_ion = xmlFirstElementChild(root);
219 
220  ParticleSetPool pp(c);
221  // Don't set up simulation cell lattice before reading particle sets
222  // convention is to leave out when doing open boundary cond.
223 
224  pp.put(part_ion);
225  xmlNodePtr part_elec = xmlNextElementSibling(part_ion);
226  pp.put(part_elec);
227  pp.randomize();
228 
229  return pp;
230  }
231 };
232 
233 } // namespace qmcplusplus
234 
235 #endif
class that handles xmlDoc
Definition: Libxml2Doc.h:76
helper functions for EinsplineSetBuilder
Definition: Configuration.h:43
static constexpr const char *const particles_xml
bool put(xmlNodePtr cur)
process an xml element
static constexpr const char *const particles_xml_H2
static ParticleSetPool make_diamondC_1x1x1(Communicate *c)
xmlNodePtr getRoot()
Definition: Libxml2Doc.h:88
This should be the minimal ParticleSetPool for integration tests.
Wrapping information on parallelism.
Definition: Communicate.h:68
static ParticleSetPool make_NiO_a4(Communicate *c)
static ParticleSetPool make_O2_spinor(Communicate *c)
Manage a collection of ParticleSet objects.
static constexpr const char *const particles_xml_NiO_a4
bool readSimulationCellXML(xmlNodePtr cur)
initialize the supercell shared by all the particle sets
bool parseFromString(const std::string_view data)
Definition: Libxml2Doc.cpp:204
static ParticleSetPool make_H2(Communicate *c)
void randomize()
randomize a particleset particleset/=&#39;yes&#39; && particleset exists
static constexpr const char *const particles_xml_spinor
static void parseParticleSetXML(const char *xml_string, ParticleSetPool &pp)
Declaration of ParticleSetPool.