62 for (
int idim = 0; idim <
OHMMS_DIM; idim++)
73 for (
size_t i = 0; i < data.size(); i++)
81 std::vector<Value> ygrid = {0, 1, 8, 27, 64, 125, 216, 343, 512};
82 Value result_simpsons(0.0);
91 std::vector<Real> xgrid(npoints);
95 Real delta = (stop - start) /
Real(npoints - 1);
98 for (
int i = 0; i < npoints; i++)
99 CHECK(xgrid[i] == Approx(start + i * delta));
104 for (
int i = 0; i < npoints; i++)
106 bool ok = (xgrid[i] >= start) && (xgrid[i] <= stop);
119 TEST_CASE(
"MagnetizationDensity::MagnetizationDensity(SPInput, Lattice, SpeciesSet)",
"[estimators]")
121 using namespace testing;
127 MagnetizationDensityInput mdi(
node);
131 MagnetizationDensity magdens(std::move(mdi),
lattice);
132 MagnetizationDensityTests magdenstest;
133 magdenstest.testCopyConstructor(magdens);
136 TEST_CASE(
"MagnetizationDensity::spawnCrowdClone()",
"[estimators]")
138 using namespace testing;
144 MagnetizationDensityInput mdi(
node);
154 TEST_CASE(
"MagnetizationDensity::integrals",
"[estimators]")
156 using namespace testing;
162 MagnetizationDensityInput mdi(
node);
166 MagnetizationDensity magdens(std::move(mdi),
lattice);
168 MagnetizationDensityTests magdenstest;
169 magdenstest.testIntegrationFunctions(magdens);
170 magdenstest.testGrids(magdens);
173 TEST_CASE(
"MagnetizationDensity::gridAssignment",
"[estimators]")
175 using namespace testing;
178 {-2.32013211, 0, 5.31201011},
179 {3.48086859, 1.61996772, 1.77067004},
180 {0.23241546, 1.61996772, 5.31201011},
181 {3.48086859, -1.61996772, 1.77067004},
182 {0.23241546, -1.61996772, 5.31201011},
183 {6.03341616, 0, 1.77067004},
184 {2.78496304, 0, 5.31201011}};
210 MagnetizationDensityInput maginput(
node);
212 maginput.calculateDerivedParameters(
lattice);
213 MagnetizationDensity magdensity(std::move(maginput),
lattice);
215 MagnetizationDensityTests magdenstest;
216 for (
int ibin = 0; ibin < nbintest; ibin++)
218 int mag_bin_x = magdenstest.computeBinAccessor(magdensity, Rtest[ibin], 0);
219 int mag_bin_y = magdenstest.computeBinAccessor(magdensity, Rtest[ibin], 1);
220 int mag_bin_z = magdenstest.computeBinAccessor(magdensity, Rtest[ibin], 2);
228 CHECK(mag_bin_x == test_bin_x);
229 CHECK(mag_bin_y == test_bin_y);
230 CHECK(mag_bin_z == test_bin_z);
234 TEST_CASE(
"MagnetizationDensity::integralAPI",
"[estimators]")
236 using namespace testing;
237 using WF = WaveFunctionTypes<QMCTraits::ValueType, QMCTraits::FullPrecValueType>;
239 using Value = WF::Value;
249 xmlNodePtr node_simpsons = doc_simpsons.
getRoot();
250 xmlNodePtr node_mc = doc_mc.
getRoot();
251 MagnetizationDensityInput mdi_simpsons(node_simpsons);
252 MagnetizationDensityInput mdi_mc(node_mc);
256 MagnetizationDensity magdens_simpsons(std::move(mdi_simpsons),
lattice);
257 MagnetizationDensity magdens_mc(std::move(mdi_mc),
lattice);
260 std::vector<Value> ygrid = {0, 1, 8, 27, 64, 125, 216, 343, 512};
261 Value result_simpsons(0.0);
262 Value result_mc(0.0);
265 result_simpsons = magdens_simpsons.integrateMagnetizationDensity(ygrid);
266 result_mc = magdens_mc.integrateMagnetizationDensity(ygrid);
269 Approx(
Real(16.2539682539)));
275 TEST_CASE(
"MagnetizationDensity::IntegrationTest",
"[estimators]")
277 app_log() <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n";
278 app_log() <<
"!!!! Evaluate MagDensity !!!!\n";
279 app_log() <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n";
284 using WF = WaveFunctionTypes<QMCTraits::ValueType, QMCTraits::FullPrecValueType>;
286 using Value = WF::Value;
287 using Grad = WF::Grad;
289 using GradVector = Vector<Grad>;
290 using ValueMatrix = Matrix<Value>;
292 using MCPWalker = Walker<QMCTraits, PtclOnLatticeTraits>;
294 using GradMatrix = Matrix<Grad>;
295 using namespace testing;
322 MagnetizationDensityInput maginput(
node);
324 maginput.calculateDerivedParameters(
lattice);
326 const SimulationCell simulation_cell(
lattice);
327 ParticleSet elec_(simulation_cell);
329 elec_.setName(
"elec");
332 elec_.R[0] = {5, 0, 0};
333 elec_.R[1] = {2.22798, 0, 4.249609};
334 elec_.spins[0] = 1.9;
335 elec_.spins[1] = 2.5410;
336 elec_.setSpinor(
true);
338 SpeciesSet& tspecies = elec_.getSpeciesSet();
339 int upIdx = tspecies.addSpecies(
"u");
340 int chargeIdx = tspecies.addAttribute(
"charge");
341 tspecies(chargeIdx, upIdx) = -1;
355 ValueVector uprow0{Value(0.92387953, 0), Value(0.92387953, 0.)};
356 ValueVector dnrow0{Value(0.27059805, 0.27059805), Value(0.27059805, 0.27059805)};
357 ValueVector uprow1{Value(0.29131988, 0.87674747), Value(0.81078057, 0.44293144)};
358 ValueVector dnrow1{Value(-0.17146777, 0.342119), Value(0.10774051, 0.36720375)};
360 ValueMatrix mup, mdn;
361 mup.resize(nelec, norb);
362 mdn.resize(nelec, norb);
364 for (
int iorb = 0; iorb < norb; iorb++)
366 mup(0, iorb) = uprow0[iorb];
367 mdn(0, iorb) = dnrow0[iorb];
368 mup(1, iorb) = uprow1[iorb];
369 mdn(1, iorb) = dnrow1[iorb];
371 auto spo_up = std::make_unique<ConstantSPOSet>(
"ConstantUpSet", nelec, norb);
372 auto spo_dn = std::make_unique<ConstantSPOSet>(
"ConstantDnSet", nelec, norb);
374 spo_up->setRefVals(mup);
375 spo_dn->setRefVals(mdn);
376 auto spinor_set = std::make_unique<SpinorSet>(
"ConstSpinorSet");
377 spinor_set->set_spos(std::move(spo_up), std::move(spo_dn));
379 auto dd = std::make_unique<DiracDeterminant<>>(std::move(spinor_set), 0, nelec);
381 std::vector<std::unique_ptr<DiracDeterminantBase>> dirac_dets;
382 dirac_dets.push_back(std::move(dd));
383 auto sd = std::make_unique<SlaterDet>(elec_, std::move(dirac_dets));
385 RuntimeOptions runtime_options;
386 TrialWaveFunction psi(runtime_options);
387 psi.addComponent(std::move(sd));
390 psi.evaluateLog(elec_);
392 MagnetizationDensity magdensity(std::move(maginput),
lattice);
395 PropertySetType Observables;
397 my_walker.Weight = 1.0;
399 elec_.saveWalker(my_walker);
403 std::vector<MCPWalker>
walkers(nwalkers);
404 std::vector<ParticleSet> psets{elec_, elec_};
406 psets[1].R[0][0] = 0;
407 psets[1].R[0][1] = 0.5;
408 psets[1].R[0][2] = 0;
409 psets[1].R[1][0] = 1;
410 psets[1].R[1][1] = 3;
411 psets[1].R[1][2] = 1;
413 std::vector<UPtr<TrialWaveFunction>> twfcs(2);
414 for (
int iw = 0; iw < nwalkers; iw++)
415 twfcs[iw] = psi.makeClone(psets[iw]);
417 auto updateWalker = [](
auto&
walker,
auto&
pset_target,
auto& trial_wavefunction) {
423 for (
int iw = 0; iw < nwalkers; iw++)
424 updateWalker(
walkers[iw], psets[iw], *(twfcs[iw]));
426 std::vector<QMCHamiltonian> hams;
427 auto ref_walkers(makeRefVector<MCPWalker>(
walkers));
428 auto ref_psets(makeRefVector<ParticleSet>(psets));
430 auto ref_hams(makeRefVector<QMCHamiltonian>(hams));
433 magdensity.accumulate(ref_walkers, ref_psets, ref_twfcs, ref_hams, rng);
442 Data ref_data(datsize, 0);
445 ref_data[0] = -0.97448154;
446 ref_data[1] = -0.37462387;
447 ref_data[2] = 2.36817514;
449 ref_data[12] = -0.97448154;
450 ref_data[13] = -0.37462387;
451 ref_data[14] = 2.36817514;
454 ref_data[18] = 1.20557377;
455 ref_data[19] = -0.60536469;
456 ref_data[20] = 0.98980165;
458 ref_data[21] = 1.20557377;
459 ref_data[22] = -0.60536469;
460 ref_data[23] = 0.98980165;
463 MagnetizationDensityTests magdenstest;
464 magdenstest.testData(magdensity, ref_data);
class that handles xmlDoc
Lattice makeTestLattice()
size_t computeBin(const Position &r, const unsigned int component) const
For a given spatial position r and spin component s, this returns the bin for accumulating the observ...
helper functions for EinsplineSetBuilder
if(!okay) throw std xmlNodePtr node
CrystalLattice< OHMMS_PRECISION, OHMMS_DIM > ParticleLayout
TEST_CASE("complex_helper", "[type_traits]")
Consistent way to get the set of types used in the QMCWaveFunction module, without resorting to ifdef...
Declaration of OperatorBase.
OrbitalSetTraits< ValueType >::ValueVector ValueVector
std::unique_ptr< OperatorEstBase > spawnCrowdClone() const override
standard interface
static RefVector< T > convertUPtrToRefVector(const UPtrVector< T > &ptr_list)
convert a vector of std::unique_ptrs<T> to a refvector<T>
DataLocality data_locality_
locality for accumulation of estimator data.
CrystalLattice< OHMMS_PRECISION, OHMMS_DIM > lattice
Value integrateBySimpsonsRule(const std::vector< Value > &fgrid, Real gridDx) const
Implementation of Simpson's 1/3 rule to integrate a function on a uniform grid.
REQUIRE(std::filesystem::exists(filename))
TinyVector< int, DIM > gdims_
constexpr std::array< std::string_view, 4 > valid_mag_density_input_sections
void generateUniformGrid(std::vector< Real > &sgrid, const Real start, const Real stop) const
Generate a uniform grid between [start,stop] for numerical quadrature.
MagnetizationDensity::Data Data
void testCopyConstructor(const MagnetizationDensity &magdens)
int computeBinAccessor(const MagnetizationDensity &magdens, const Position &r, const int spin_index)
TinyVector< int, DIM > grid_
Declaration of a TrialWaveFunction.
std::vector< QMCT::RealType > Data
bool parseFromString(const std::string_view data)
Walker< QMCTraits, PtclOnLatticeTraits > MCPWalker
CHECK(log_values[0]==ComplexApprox(std::complex< double >{ 5.603777579195571, -6.1586603331188225 }))
ParticleAttrib< SingleParticlePos > ParticlePos
void generateRandomGrid(std::vector< Real > &sgrid, RandomBase< FullPrecReal > &rng, Real start, Real stop) const
Generate random grid between [start,stop] for MC integration.
Declaration of DiracDeterminant with a S(ingle)P(article)O(rbital)Set.
void testData(const MagnetizationDensity &magdens, const Data &data)
Declaration of WaveFunctionComponent.
Magnetization density estimator for non-collinear spin calculations.
SpinDensityNew original(std::move(sdi), lattice, species_set)
void testGrids(const MagnetizationDensity &magdens)
void testIntegrationFunctions(const MagnetizationDensity &magdens)
RecordNamedProperty< FullPrecRealType > PropertySetType
define PropertyList_t