28 app_log() <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n";
29 app_log() <<
"!!!!!!! LCAO SpinorSet from HDF !!!!!!!\n";
30 app_log() <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n";
46 ions_.R[0] = {0.00000000, 0.00000000, 0.00000000};
54 elec_.
R[0] = {0.1, -0.3, 1.7};
61 tspecies(chargeIdx, upIdx) = -1;
67 const char* particles = R
"XML(<tmp> 68 <sposet_builder name="spinorbuilder" type="molecularorbital" href="lcao_spinor.h5" source="ion" precision="float"> 69 <basisset transform="yes"/> 70 <sposet name="myspo" size="2"/> 80 xmlNodePtr bnode = xmlFirstElementChild(root);
83 auto& bb = *spo_builder_ptr;
86 std::unique_ptr<SPOSet> spo;
87 processChildren(bnode, [&](
const std::string& cname,
const xmlNodePtr element) {
88 if (cname ==
"sposet")
89 spo = bb.createSPOSet(element);
102 spo->evaluate_notranspose(elec_, 0, elec_.
R.size(), psiM, dpsiM, d2psiM);
104 ValueType val(5.584596565578567
e-05, 0.0012321335483993093);
105 ValueType vdx(-2.7922982853738495
e-05, -0.0006160667747698895);
106 ValueType vdy(8.376894847079449
e-05, 0.0018482003223147029);
107 ValueType vdz(-0.00047469070804637896, -0.010473135160780798);
108 ValueType vlp(0.0033369958606517744, 0.07362437917398082);
109 ValueType vds(1.0474021389417806
e-05, -0.00040482519442528657);
112 for (
unsigned int iat = 0; iat < 1; iat++)
114 CHECK(psiM[iat][0] == ComplexApprox(val).epsilon(eps));
115 CHECK(dpsiM[iat][0][0] == ComplexApprox(vdx).epsilon(eps));
116 CHECK(dpsiM[iat][0][1] == ComplexApprox(vdy).epsilon(eps));
117 CHECK(dpsiM[iat][0][2] == ComplexApprox(vdz).epsilon(eps));
118 CHECK(d2psiM[iat][0] == ComplexApprox(vlp).epsilon(eps));
127 spo->evaluateGradSource(elec_, 0, elec_.
R.size(), ions_, 0, gradIon);
128 for (
int iat = 0; iat < 1; iat++)
130 CHECK(gradIon[iat][0][0] == ComplexApprox(-vdx).epsilon(eps));
131 CHECK(gradIon[iat][0][1] == ComplexApprox(-vdy).epsilon(eps));
132 CHECK(gradIon[iat][0][2] == ComplexApprox(-vdz).epsilon(eps));
147 psi_work.resize(elec_.
R.size());
148 dpsi_work.resize(elec_.
R.size());
149 d2psi_work.resize(elec_.
R.size());
150 dspsi_work.resize(elec_.
R.size());
171 for (
unsigned int iat = 0; iat < 1; iat++)
174 elec_.
makeMove(iat, -dR[iat],
false);
175 spo->evaluateValue(elec_, iat, psi_work);
177 CHECK(psi_work[0] == ComplexApprox(val));
182 for (
unsigned int iat = 0; iat < 1; iat++)
189 elec_.
makeMove(iat, -dR[iat],
false);
190 spo->evaluateVGL_spin(elec_, iat, psi_work, dpsi_work, d2psi_work, dspsi_work);
192 CHECK(psi_work[0] == ComplexApprox(val).epsilon(eps));
193 CHECK(dpsi_work[0][0] == ComplexApprox(vdx).epsilon(eps));
194 CHECK(dpsi_work[0][1] == ComplexApprox(vdy).epsilon(eps));
195 CHECK(dpsi_work[0][2] == ComplexApprox(vdz).epsilon(eps));
196 CHECK(d2psi_work[0] == ComplexApprox(vlp).epsilon(eps));
197 CHECK(dspsi_work[0] == ComplexApprox(vds).epsilon(eps));
203 for (
unsigned int iat = 0; iat < 1; iat++)
208 elec_.
makeMove(iat, -dR[iat],
false);
209 spo->evaluate_spin(elec_, iat, psi_work, dspsi_work);
211 CHECK(psi_work[0] == ComplexApprox(val).epsilon(eps));
212 CHECK(dspsi_work[0] == ComplexApprox(vds).epsilon(eps));
229 elec_2.
R[0] = {-0.4, 1.5, -0.2};
230 elec_2.
spins[0] = -1.3;
233 ValueType val2(-0.00010787670610075059, -5.882498404872149
e-05);
234 ValueType vdx2(-0.0002157534121903495, -0.00011764996809136147);
235 ValueType vdy2(0.0008090752956289096, 0.0004411873802963092);
236 ValueType vdz2(-0.00010787670612158852, -5.8824984060083926
e-05);
237 ValueType vlp2(-0.004989237947754119, -0.0027206229528162103);
238 ValueType vds2(0.0001907917398151183, 0.005002478563410625);
243 p_list.push_back(elec_);
244 p_list.push_back(elec_2);
249 std::unique_ptr<SPOSet> spo_2(spo->makeClone());
251 spo_list.push_back(*spo);
252 spo_list.push_back(*spo_2);
257 spo->createResource(spo_res);
271 logdet_list.push_back(psiM);
272 logdet_list.push_back(psiM_2);
273 dlogdet_list.push_back(dpsiM);
274 dlogdet_list.push_back(dpsiM_2);
275 d2logdet_list.push_back(d2psiM);
276 d2logdet_list.push_back(d2psiM_2);
278 spo->mw_evaluate_notranspose(spo_list, p_list, 0, 1, logdet_list, dlogdet_list, d2logdet_list);
279 for (
unsigned int iat = 0; iat < 1; iat++)
282 CHECK(logdet_list[0].
get()[iat][0] == ComplexApprox(val).epsilon(eps));
283 CHECK(dlogdet_list[0].
get()[iat][0][0] == ComplexApprox(vdx).epsilon(eps));
284 CHECK(dlogdet_list[0].
get()[iat][0][1] == ComplexApprox(vdy).epsilon(eps));
285 CHECK(dlogdet_list[0].
get()[iat][0][2] == ComplexApprox(vdz).epsilon(eps));
286 CHECK(d2logdet_list[0].
get()[iat][0] == ComplexApprox(vlp).epsilon(eps));
288 CHECK(logdet_list[1].
get()[iat][0] == ComplexApprox(val2).epsilon(eps));
289 CHECK(dlogdet_list[1].
get()[iat][0][0] == ComplexApprox(vdx2).epsilon(eps));
290 CHECK(dlogdet_list[1].
get()[iat][0][1] == ComplexApprox(vdy2).epsilon(eps));
291 CHECK(dlogdet_list[1].
get()[iat][0][2] == ComplexApprox(vdz2).epsilon(eps));
292 CHECK(d2logdet_list[1].
get()[iat][0] == ComplexApprox(vlp2).epsilon(eps));
296 for (
int iat = 0; iat < 1; iat++)
300 displs.
spins = {dS[iat], dS[iat]};
302 std::vector<bool> accept = {
true,
true};
315 mw_dspin.
resize(2, elec_.
R.size());
317 for (
int iat = 0; iat < 1; iat++)
330 displs.
spins = {-dS[iat], -dS[iat]};
332 spo->mw_evaluateVGLWithSpin(spo_list, p_list, iat, psi_v_list, dpsi_v_list, d2psi_v_list, mw_dspin);
334 CHECK(psi_v_list[0].
get()[0] == ComplexApprox(val).epsilon(eps));
335 CHECK(dpsi_v_list[0].
get()[0][0] == ComplexApprox(vdx).epsilon(eps));
336 CHECK(dpsi_v_list[0].
get()[0][1] == ComplexApprox(vdy).epsilon(eps));
337 CHECK(dpsi_v_list[0].
get()[0][2] == ComplexApprox(vdz).epsilon(eps));
338 CHECK(d2psi_v_list[0].
get()[0] == ComplexApprox(vlp).epsilon(eps));
339 CHECK(mw_dspin(0, 0) == ComplexApprox(vds).epsilon(eps));
341 CHECK(psi_v_list[1].
get()[0] == ComplexApprox(val2).epsilon(eps));
342 CHECK(dpsi_v_list[1].
get()[0][0] == ComplexApprox(vdx2).epsilon(eps));
343 CHECK(dpsi_v_list[1].
get()[0][1] == ComplexApprox(vdy2).epsilon(eps));
344 CHECK(dpsi_v_list[1].
get()[0][2] == ComplexApprox(vdz2).epsilon(eps));
345 CHECK(d2psi_v_list[1].
get()[0] == ComplexApprox(vlp2).epsilon(eps));
346 CHECK(mw_dspin(1, 0) == ComplexApprox(vds2).epsilon(eps));
348 std::vector<bool> accept = {
false,
false};
355 app_log() <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n";
356 app_log() <<
"!! LCAO SpinorSet from HDF with excited !!\n";
357 app_log() <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n";
369 ions_.setName(
"ion");
373 ions_.R[0] = {0.00000000, 0.00000000, 0.00000000};
375 int hIdx =
ispecies.addSpecies(
"H");
381 elec_.
R[0] = {0.1, -0.3, 1.7};
382 elec_.
spins[0] = 0.6;
388 tspecies(chargeIdx, upIdx) = -1;
394 const char* particles = R
"XML(<tmp> 395 <sposet_builder name="spinorbuilder" type="molecularorbital" href="lcao_spinor.h5" source="ion" precision="float"> 396 <basisset name="myset" transform="yes"/> 397 <sposet name="myspo" basisset="myset" size="1"> 398 <occupation mode="excited"> 411 xmlNodePtr bnode = xmlFirstElementChild(root);
414 auto& bb = *sposet_builder_ptr;
417 std::unique_ptr<SPOSet> spo;
418 processChildren(bnode, [&](
const std::string& cname,
const xmlNodePtr element) {
419 if (cname ==
"sposet")
420 spo = bb.createSPOSet(element);
424 const int OrbitalSetSize = spo->getOrbitalSetSize();
425 CHECK(OrbitalSetSize == 1);
432 spo->evaluate_notranspose(elec_, 0, elec_.
R.size(), psiM, dpsiM, d2psiM);
434 ValueType val(0.0008237860500019983, 1.0474021389417806
e-05);
435 ValueType vdx(-0.00041189302538224967, -5.237010699556317
e-06);
436 ValueType vdy(0.0012356790748129446, 1.5711032081710294
e-05);
437 ValueType vdz(-0.007002181424606922, -8.90291818048377
e-05);
438 ValueType vlp(0.04922415803252472, 0.0006258601782677606);
439 ValueType vds(-0.0010017050778321178, -5.584596565578559
e-05);
442 for (
unsigned int iat = 0; iat < 1; iat++)
444 CHECK(psiM[iat][0] == ComplexApprox(val).epsilon(eps));
445 CHECK(dpsiM[iat][0][0] == ComplexApprox(vdx).epsilon(eps));
446 CHECK(dpsiM[iat][0][1] == ComplexApprox(vdy).epsilon(eps));
447 CHECK(dpsiM[iat][0][2] == ComplexApprox(vdz).epsilon(eps));
448 CHECK(d2psiM[iat][0] == ComplexApprox(vlp).epsilon(eps));
457 spo->evaluateGradSource(elec_, 0, elec_.
R.size(), ions_, 0, gradIon);
458 for (
int iat = 0; iat < 1; iat++)
460 CHECK(gradIon[iat][0][0] == ComplexApprox(-vdx).epsilon(eps));
461 CHECK(gradIon[iat][0][1] == ComplexApprox(-vdy).epsilon(eps));
462 CHECK(gradIon[iat][0][2] == ComplexApprox(-vdz).epsilon(eps));
477 psi_work.resize(OrbitalSetSize);
478 dpsi_work.resize(OrbitalSetSize);
479 d2psi_work.resize(OrbitalSetSize);
480 dspsi_work.resize(OrbitalSetSize);
501 for (
unsigned int iat = 0; iat < 1; iat++)
504 elec_.
makeMove(iat, -dR[iat],
false);
505 spo->evaluateValue(elec_, iat, psi_work);
507 CHECK(psi_work[0] == ComplexApprox(val));
512 for (
unsigned int iat = 0; iat < 1; iat++)
519 elec_.
makeMove(iat, -dR[iat],
false);
520 spo->evaluateVGL_spin(elec_, iat, psi_work, dpsi_work, d2psi_work, dspsi_work);
522 CHECK(psi_work[0] == ComplexApprox(val).epsilon(eps));
523 CHECK(dpsi_work[0][0] == ComplexApprox(vdx).epsilon(eps));
524 CHECK(dpsi_work[0][1] == ComplexApprox(vdy).epsilon(eps));
525 CHECK(dpsi_work[0][2] == ComplexApprox(vdz).epsilon(eps));
526 CHECK(d2psi_work[0] == ComplexApprox(vlp).epsilon(eps));
527 CHECK(dspsi_work[0] == ComplexApprox(vds).epsilon(eps));
532 for (
unsigned int iat = 0; iat < 1; iat++)
537 elec_.
makeMove(iat, -dR[iat],
false);
538 spo->evaluate_spin(elec_, iat, psi_work, dspsi_work);
540 CHECK(psi_work[0] == ComplexApprox(val).epsilon(eps));
541 CHECK(dspsi_work[0] == ComplexApprox(vds).epsilon(eps));
558 elec_2.
R[0] = {-0.4, 1.5, -0.2};
559 elec_2.
spins[0] = -1.3;
562 ValueType val2(0.0026291910291941015, 0.00019079173981511807);
563 ValueType vdx2(0.005258382058116388, 0.00038158347961051147);
564 ValueType vdy2(-0.019718932715867252, -0.0014309380483892627);
565 ValueType vdz2(0.002629191029701947, 0.00019079173985197097);
566 ValueType vlp2(0.1215986298515522, 0.008824012363842379);
567 ValueType vds2(0.004256243259981321, 0.00010787670610075102);
572 p_list.push_back(elec_);
573 p_list.push_back(elec_2);
577 spo->createResource(spo_res);
578 std::unique_ptr<SPOSet> spo_2(spo->makeClone());
580 spo_list.push_back(*spo);
581 spo_list.push_back(*spo_2);
591 logdet_list.push_back(psiM);
592 logdet_list.push_back(psiM_2);
593 dlogdet_list.push_back(dpsiM);
594 dlogdet_list.push_back(dpsiM_2);
595 d2logdet_list.push_back(d2psiM);
596 d2logdet_list.push_back(d2psiM_2);
602 spo->mw_evaluate_notranspose(spo_list, p_list, 0, 1, logdet_list, dlogdet_list, d2logdet_list);
603 for (
unsigned int iat = 0; iat < 1; iat++)
606 CHECK(logdet_list[0].
get()[iat][0] == ComplexApprox(val).epsilon(eps));
607 CHECK(dlogdet_list[0].
get()[iat][0][0] == ComplexApprox(vdx).epsilon(eps));
608 CHECK(dlogdet_list[0].
get()[iat][0][1] == ComplexApprox(vdy).epsilon(eps));
609 CHECK(dlogdet_list[0].
get()[iat][0][2] == ComplexApprox(vdz).epsilon(eps));
610 CHECK(d2logdet_list[0].
get()[iat][0] == ComplexApprox(vlp).epsilon(eps));
612 CHECK(logdet_list[1].
get()[iat][0] == ComplexApprox(val2).epsilon(eps));
613 CHECK(dlogdet_list[1].
get()[iat][0][0] == ComplexApprox(vdx2).epsilon(eps));
614 CHECK(dlogdet_list[1].
get()[iat][0][1] == ComplexApprox(vdy2).epsilon(eps));
615 CHECK(dlogdet_list[1].
get()[iat][0][2] == ComplexApprox(vdz2).epsilon(eps));
616 CHECK(d2logdet_list[1].
get()[iat][0] == ComplexApprox(vlp2).epsilon(eps));
620 for (
int iat = 0; iat < 1; iat++)
624 displs.
spins = {dS[iat], dS[iat]};
626 std::vector<bool> accept = {
true,
true};
639 mw_dspin.
resize(2, OrbitalSetSize);
641 for (
int iat = 0; iat < 1; iat++)
654 displs.
spins = {-dS[iat], -dS[iat]};
656 spo->mw_evaluateVGLWithSpin(spo_list, p_list, iat, psi_v_list, dpsi_v_list, d2psi_v_list, mw_dspin);
658 CHECK(psi_v_list[0].
get()[0] == ComplexApprox(val).epsilon(eps));
659 CHECK(dpsi_v_list[0].
get()[0][0] == ComplexApprox(vdx).epsilon(eps));
660 CHECK(dpsi_v_list[0].
get()[0][1] == ComplexApprox(vdy).epsilon(eps));
661 CHECK(dpsi_v_list[0].
get()[0][2] == ComplexApprox(vdz).epsilon(eps));
662 CHECK(d2psi_v_list[0].
get()[0] == ComplexApprox(vlp).epsilon(eps));
663 CHECK(mw_dspin(0, 0) == ComplexApprox(vds).epsilon(eps));
665 CHECK(psi_v_list[1].
get()[0] == ComplexApprox(val2).epsilon(eps));
666 CHECK(dpsi_v_list[1].
get()[0][0] == ComplexApprox(vdx2).epsilon(eps));
667 CHECK(dpsi_v_list[1].
get()[0][1] == ComplexApprox(vdy2).epsilon(eps));
668 CHECK(dpsi_v_list[1].
get()[0][2] == ComplexApprox(vdz2).epsilon(eps));
669 CHECK(d2psi_v_list[1].
get()[0] == ComplexApprox(vlp2).epsilon(eps));
670 CHECK(mw_dspin(1, 0) == ComplexApprox(vds2).epsilon(eps));
671 std::vector<bool> accept = {
false,
false};
678 app_log() <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n";
679 app_log() <<
"!!!! LCAO SpinorSet from HDF (ion derivatives) !!!!\n";
680 app_log() <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n";
692 ions_.setName(
"ion");
696 ions_.R[0] = {0.10000000, 0.20000000, 0.30000000};
697 ions_.R[1] = {-0.30000000, -0.20000000, -0.10000000};
699 int hIdx =
ispecies.addSpecies(
"H");
705 elec_.
R[0] = {0.01, -0.02, 0.03};
706 elec_.
spins[0] = 0.6;
712 tspecies(chargeIdx, upIdx) = -1;
718 const char* particles = R
"XML(<tmp> 719 <sposet_builder name="spinorbuilder" type="molecularorbital" href="lcao_spinor_molecule.h5" source="ion" precision="float"> 720 <basisset transform="yes"/> 721 <sposet name="myspo" size="1"/> 731 xmlNodePtr bnode = xmlFirstElementChild(root);
734 auto& bb = *spo_builder_ptr;
737 std::unique_ptr<SPOSet> spo;
738 processChildren(bnode, [&](
const std::string& cname,
const xmlNodePtr element) {
739 if (cname ==
"sposet")
740 spo = bb.createSPOSet(element);
754 spo->evaluateGradSource(elec_, 0, elec_.
R.size(), ions_, 0, gradIon);
755 CHECK(gradIon[0][0][0] == ComplexApprox(dx0).epsilon(eps));
756 CHECK(gradIon[0][0][1] == ComplexApprox(dy0).epsilon(eps));
757 CHECK(gradIon[0][0][2] == ComplexApprox(dz0).epsilon(eps));
758 spo->evaluateGradSource(elec_, 0, elec_.
R.size(), ions_, 1, gradIon);
759 CHECK(gradIon[0][0][0] == ComplexApprox(dx1).epsilon(eps));
760 CHECK(gradIon[0][0][1] == ComplexApprox(dy1).epsilon(eps));
761 CHECK(gradIon[0][0][2] == ComplexApprox(dz1).epsilon(eps));
void resize(size_type n, Type_t val=Type_t())
Resize the container.
Class for Melton & Mitas style Spinors.
void setName(const std::string &aname)
class that handles xmlDoc
static void mw_makeMove(const RefVectorWithLeader< ParticleSet > &p_list, int iat, const MCCoords< CT > &displs)
batched version of makeMove
int addSpecies(const std::string &aname)
When a name species does not exist, add a new species.
std::vector< QMCTraits::PosType > positions
helper functions for EinsplineSetBuilder
ParticleScalar spins
internal spin variables for dynamical spin calculations
QTBase::RealType RealType
TEST_CASE("complex_helper", "[type_traits]")
void addParticleSet(std::unique_ptr< ParticleSet > &&p)
add a ParticleSet* to the pool with its ownership transferred ParticleSet built outside the ParticleS...
OrbitalSetTraits< ValueType >::ValueMatrix ValueMatrix
void createResource(ResourceCollection &collection) const
initialize a shared resource and hand it to a collection
void resize(size_type n, size_type m)
Resize the container.
void update(bool skipSK=false)
update the internal data
Attaches a unit to a Vector for IO.
Communicate * Controller
Global Communicator for a process.
static void mw_accept_rejectMove(const RefVectorWithLeader< ParticleSet > &p_list, Index_t iat, const std::vector< bool > &isAccepted, bool forward_mode=true)
batched version of acceptMove and rejectMove fused, templated on CoordsType
int addAttribute(const std::string &aname)
for a new attribute, allocate the data, !More often used to get the index of a species ...
std::vector< QMCTraits::FullPrecRealType > spins
OrbitalSetTraits< ValueType >::GradMatrix GradMatrix
Wrapping information on parallelism.
int addTable(const ParticleSet &psrc, DTModes modes=DTModes::ALL_OFF)
add a distance table
Specialized paritlce class for atomistic simulations.
QTBase::ValueType ValueType
REQUIRE(std::filesystem::exists(filename))
void rejectMove(Index_t iat)
reject a proposed move in regular mode
void test_lcao_spinor_excited()
Manage a collection of ParticleSet objects.
OrbitalSetTraits< ValueType >::ValueVector ValueVector
SpeciesSet & getSpeciesSet()
retrun the SpeciesSet of this particle set
void create(const std::vector< int > &agroup)
create grouped particles
std::vector< std::reference_wrapper< T > > RefVector
void processChildren(const xmlNodePtr cur, const F &functor)
process through all the children of an XML element F is a lambda or functor void F/[](const std::stri...
OrbitalSetTraits< ValueType >::GradVector GradVector
void makeMove(Index_t iat, const SingleParticlePos &displ, bool maybe_accept=true)
move the iat-th particle to active_pos_
bool parseFromString(const std::string_view data)
static void mw_update(const RefVectorWithLeader< ParticleSet > &p_list, bool skipSK=false)
batched version of update
CHECK(log_values[0]==ComplexApprox(std::complex< double >{ 5.603777579195571, -6.1586603331188225 }))
handles acquire/release resource by the consumer (RefVectorWithLeader type).
LatticeGaussianProduct::ValueType ValueType
std::unique_ptr< SPOSetBuilder > createSPOSetBuilder(xmlNodePtr rootNode)
Custom container for set of attributes for a set of species.
void setSpinor(bool is_spinor)
const PoolType & getPool() const
get the Pool object
void test_lcao_spinor_ion_derivs()
const auto & getSimulationCell() const
get simulation cell
bool isResourceOwned() const
check if the multi walker resource is owned. For testing only.
Declaration of ParticleSetPool.