![]() |
QMCPACK
|
Magnetization density estimator for non-collinear spin calculations. More...
Public Types | |
using | Value = QMCTraits::ValueType |
using | FullPrecValue = QMCTraits::FullPrecValueType |
using | Real = RealAlias< Value > |
using | FullPrecReal = RealAlias< FullPrecValue > |
using | Grad = TinyVector< Value, OHMMS_DIM > |
using | Lattice = PtclOnLatticeTraits::ParticleLayout |
using | Position = QMCTraits::PosType |
using | Integrator = MagnetizationDensityInput::Integrator |
![]() | |
using | QMCT = QMCTraits |
using | FullPrecRealType = QMCT::FullPrecRealType |
using | MCPWalker = Walker< QMCTraits, PtclOnLatticeTraits > |
using | Data = std::vector< QMCT::RealType > |
Public Member Functions | |
MagnetizationDensity (MagnetizationDensityInput &&min, const Lattice &lattice) | |
MagnetizationDensity (const MagnetizationDensity &magdens, DataLocality dl) | |
void | startBlock (int steps) override |
void | accumulate (const RefVector< MCPWalker > &walkers, const RefVector< ParticleSet > &psets, const RefVector< TrialWaveFunction > &wfns, const RefVector< QMCHamiltonian > &hams, RandomBase< FullPrecReal > &rng) override |
void | collect (const RefVector< OperatorEstBase > &operator_estimators) override |
Reduce estimator result data from crowds to rank. More... | |
size_t | getFullDataSize () |
This returns the total size of data object required for this estimator. More... | |
std::unique_ptr< OperatorEstBase > | spawnCrowdClone () const override |
void | registerOperatorEstimator (hdf_archive &file) override |
Value | integrateMagnetizationDensity (const std::vector< Value > &fgrid) const |
This is a convenience function that handles ^{2} dx f(x). More... | |
![]() | |
OperatorEstBase (DataLocality dl) | |
constructor More... | |
OperatorEstBase (const OperatorEstBase &oth) | |
Shallow copy constructor! This alows us to keep the default copy constructors for derived classes which is quite useful to the spawnCrowdClone design. More... | |
virtual | ~OperatorEstBase ()=default |
virtual destructor More... | |
virtual void | accumulate (const RefVector< MCPWalker > &walkers, const RefVector< ParticleSet > &psets, const RefVector< TrialWaveFunction > &wfns, const RefVector< QMCHamiltonian > &hams, RandomBase< FullPrecRealType > &rng)=0 |
Accumulate whatever it is you are accumulating with respect to walkers. More... | |
virtual void | normalize (QMCT::RealType invToWgt) |
std::vector< QMCT::RealType > & | get_data () |
void | write (hdf_archive &file) |
Write to previously registered observable_helper hdf5 wrapper. More... | |
void | zero () |
zero data appropriately for the DataLocality More... | |
QMCT::FullPrecRealType | get_walkers_weight () const |
Return the total walker weight for this block. More... | |
const std::string & | get_my_name () const |
virtual void | registerListeners (QMCHamiltonian &ham_leader) |
Register 0-many listeners with a leading QMCHamiltonian instance i.e. More... | |
bool | isListenerRequired () |
DataLocality | get_data_locality () const |
Static Public Attributes | |
static constexpr int | DIM = QMCTraits::DIM |
Private Member Functions | |
MagnetizationDensity (const MagnetizationDensity &magdens)=default | |
void | generateSpinIntegrand (ParticleSet &pset, TrialWaveFunction &wfn, const int iat, std::vector< Value > &sx, std::vector< Value > &sy, std::vector< Value > &sz) |
Generates the spin integrand (s')/Psi(s)* s | {} | s' for a specific electron iat. More... | |
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. More... | |
void | generateGrid (std::vector< Real > &sgrid) const |
Convenience function to generate a grid between 0 and 2pi, consistent with nsamples_ and integration method. More... | |
void | generateUniformGrid (std::vector< Real > &sgrid, const Real start, const Real stop) const |
Generate a uniform grid between [start,stop] for numerical quadrature. More... | |
void | generateRandomGrid (std::vector< Real > &sgrid, RandomBase< FullPrecReal > &rng, Real start, Real stop) const |
Generate random grid between [start,stop] for MC integration. More... | |
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 observable. More... | |
Private Attributes | |
MagnetizationDensityInput | input_ |
Integrator | integrator_ |
Lattice | lattice_ |
Position | rcorner_ |
Position | center_ |
TinyVector< int, DIM > | grid_ |
TinyVector< int, DIM > | gdims_ |
size_t | npoints_ |
int | nsamples_ |
Friends | |
class | testing::MagnetizationDensityTests |
Additional Inherited Members | |
![]() | |
DataLocality | data_locality_ |
locality for accumulation of estimator data. More... | |
std::string | my_name_ |
name of this object – only used for debugging and h5 output More... | |
QMCT::FullPrecRealType | walkers_weight_ |
std::vector< ObservableHelper > | h5desc_ |
Data | data_ |
bool | requires_listener_ = false |
Magnetization density estimator for non-collinear spin calculations.
As documented in the manual, the following formula is computed:
{m}_c = d{X} |{({X})}|^2 {}d{r} ({r}-{{r}}_i)^{2} {ds'_i}{2} {( {r}_i s'_i )}{( {r}_i s_i )} s_i | {} | s'_i
The way that the above relates to the underlying data structure data_ is as follows. We grid space up and assign an index for each of the real space bins (identical to SpinDensityNew). To account for the fact that magnetization is vectorial, we triple the length of this array. If grid_i is the index of the real space gridpoint i, then the data is layed out like: [grid_0_x, grid_0_y, grid_0_z, grid_1_x, ..., grid_N_x, grid_N_y, grid_N_z]. This is also the way it is stored in HDF5.
Definition at line 42 of file MagnetizationDensity.h.
using FullPrecReal = RealAlias<FullPrecValue> |
Definition at line 48 of file MagnetizationDensity.h.
Definition at line 46 of file MagnetizationDensity.h.
using Grad = TinyVector<Value, OHMMS_DIM> |
Definition at line 49 of file MagnetizationDensity.h.
Definition at line 52 of file MagnetizationDensity.h.
Definition at line 50 of file MagnetizationDensity.h.
using Position = QMCTraits::PosType |
Definition at line 51 of file MagnetizationDensity.h.
Definition at line 47 of file MagnetizationDensity.h.
using Value = QMCTraits::ValueType |
Definition at line 45 of file MagnetizationDensity.h.
MagnetizationDensity | ( | MagnetizationDensityInput && | min, |
const Lattice & | lattice | ||
) |
Definition at line 16 of file MagnetizationDensity.cpp.
References CrystalLattice< T, D >::Center, MagnetizationDensity::center_, MagnetizationDensityInput::DerivedParameters::corner, qmcplusplus::crowd, OperatorEstBase::data_, MagnetizationDensityInput::DerivedParameters::gdims, MagnetizationDensity::gdims_, MagnetizationDensityInput::get_integrator(), MagnetizationDensityInput::get_nsamples(), MagnetizationDensity::getFullDataSize(), MagnetizationDensityInput::DerivedParameters::grid, MagnetizationDensity::grid_, MagnetizationDensity::input_, MagnetizationDensity::integrator_, MagnetizationDensity::lattice_, OperatorEstBase::my_name_, MagnetizationDensityInput::DerivedParameters::npoints, MagnetizationDensity::npoints_, MagnetizationDensity::nsamples_, and MagnetizationDensity::rcorner_.
MagnetizationDensity | ( | const MagnetizationDensity & | magdens, |
DataLocality | dl | ||
) |
Definition at line 39 of file MagnetizationDensity.cpp.
References OperatorEstBase::data_locality_, and OperatorEstBase::my_name_.
|
privatedefault |
|
override |
Definition at line 49 of file MagnetizationDensity.cpp.
References MagnetizationDensity::computeBin(), OperatorEstBase::data_, MagnetizationDensity::generateSpinIntegrand(), MagnetizationDensity::integrateMagnetizationDensity(), MagnetizationDensity::nsamples_, qmcplusplus::pset, qmcplusplus::walker, qmcplusplus::hdf::walkers, and OperatorEstBase::walkers_weight_.
|
overridevirtual |
Reduce estimator result data from crowds to rank.
This is assumed to be called from only from one thread per crowds->rank reduction. Implied is this is during a global sync or there is a guarantee that the crowd operator estimators accumulation data is not being written to.
There could be concurrent operations inside the scope of the collect call.
Reimplemented from OperatorEstBase.
Definition at line 91 of file MagnetizationDensity.cpp.
References OperatorEstBase::collect(), qmcplusplus::crowd, and OperatorEstBase::data_locality_.
|
private |
For a given spatial position r and spin component s, this returns the bin for accumulating the observable.
[in] | Position | in real space. 3D |
[in] | component,the | x=0,y=1,z=2 component of the spin. |
Definition at line 103 of file MagnetizationDensity.cpp.
References QMCTraits::DIM, MagnetizationDensity::DIM, qmcplusplus::floor(), MagnetizationDensity::gdims_, MagnetizationDensity::grid_, MagnetizationDensity::lattice_, MagnetizationDensity::rcorner_, and CrystalLattice< T, D >::toUnit().
Referenced by MagnetizationDensity::accumulate(), and MagnetizationDensityTests::computeBinAccessor().
|
private |
Convenience function to generate a grid between 0 and 2pi, consistent with nsamples_ and integration method.
Can be uniform or random, depending on choice of integrator.
[out] | sgrid | A grid with nsamples_ points between 0 and 2pi. Overwritten. |
Definition at line 174 of file MagnetizationDensity.cpp.
References MagnetizationDensity::generateUniformGrid(), MagnetizationDensity::integrator_, MagnetizationDensityInput::MONTECARLO, MagnetizationDensity::nsamples_, and MagnetizationDensityInput::SIMPSONS.
Referenced by MagnetizationDensity::generateSpinIntegrand().
|
private |
Generate random grid between [start,stop] for MC integration.
RAN_GEN | Random number generator type. |
[out] | sgrid | Random number grid between "start" and "stop". Number of points taken from size of sgrid. |
[in] | rng | Random number generator queried to generate random points. |
[in] | start | start of grid interval |
[in] | stop | end of grid interval |
Definition at line 244 of file MagnetizationDensity.cpp.
Referenced by MagnetizationDensityTests::testGrids().
|
private |
Generates the spin integrand (s')/Psi(s)* s | {} | s' for a specific electron iat.
Since this is a vectorial quantity, this function returns sx, sy, and sz in their own arrays.
[in] | pset | ParticleSet |
[in] | wfn | TrialWaveFunction |
[in] | iat | electron index |
[out] | sx | x component of spin integrand |
[out] | sy | y component of spin integrand |
[out] | sz | z component of spin integrand |
Definition at line 136 of file MagnetizationDensity.cpp.
References qmcplusplus::cos(), TrialWaveFunction::evaluateRatios(), MagnetizationDensity::generateGrid(), MagnetizationDensity::nsamples_, qmcplusplus::pset_target, and qmcplusplus::sin().
Referenced by MagnetizationDensity::accumulate().
|
private |
Generate a uniform grid between [start,stop] for numerical quadrature.
[out] | sgrid | Random number grid between "start" and "stop". Number of points taken from size of sgrid. |
[in] | start | start of grid interval |
[in] | stop | end of grid interval |
Definition at line 166 of file MagnetizationDensity.cpp.
Referenced by MagnetizationDensity::generateGrid(), and MagnetizationDensityTests::testGrids().
size_t getFullDataSize | ( | ) |
This returns the total size of data object required for this estimator.
Right now, it's 3*number_of_realspace_gridpoints
Definition at line 47 of file MagnetizationDensity.cpp.
References MagnetizationDensity::DIM, and MagnetizationDensity::npoints_.
Referenced by MagnetizationDensity::MagnetizationDensity(), and MagnetizationDensity::registerOperatorEstimator().
|
private |
Implementation of Simpson's 1/3 rule to integrate a function on a uniform grid.
[in] | fgrid | f(x), the function to integrate. |
[in] | gridDx,the | grid spacing for the uniform grid. Assumed to be consistent with size of fgrid. |
Definition at line 203 of file MagnetizationDensity.cpp.
Referenced by MagnetizationDensity::integrateMagnetizationDensity(), and MagnetizationDensityTests::testIntegrationFunctions().
MagnetizationDensity::Value integrateMagnetizationDensity | ( | const std::vector< Value > & | fgrid | ) | const |
This is a convenience function that handles ^{2} dx f(x).
There are two provided methods for integrating this, so this function picks Simpson's or Monte Carlo to perform this integration, while keeping awareness of the integration interval and number of samples.
Value | type. Real or complex in double or single precision. Return type is same as fgrid type. |
[in] | fgrid | f(x), the function to integrate. Assumed to be on a [0-2pi] interval, and if the grid isn't random, it's assumed to be uniform. |
Definition at line 220 of file MagnetizationDensity.cpp.
References MagnetizationDensity::integrateBySimpsonsRule(), MagnetizationDensity::integrator_, MagnetizationDensityInput::MONTECARLO, MagnetizationDensity::nsamples_, and MagnetizationDensityInput::SIMPSONS.
Referenced by MagnetizationDensity::accumulate().
|
overridevirtual |
Reimplemented from OperatorEstBase.
Definition at line 191 of file MagnetizationDensity.cpp.
References MagnetizationDensity::getFullDataSize(), OperatorEstBase::h5desc_, OperatorEstBase::my_name_, qmcplusplus::oh, and ObservableHelper::set_dimensions().
|
overridevirtual |
Implements OperatorEstBase.
Definition at line 116 of file MagnetizationDensity.cpp.
References OperatorEstBase::data_, OperatorEstBase::data_locality_, qmcplusplus::queue, and qmcplusplus::rank.
|
overridevirtual |
|
friend |
Definition at line 172 of file MagnetizationDensity.h.
|
private |
Definition at line 166 of file MagnetizationDensity.h.
Referenced by MagnetizationDensity::MagnetizationDensity(), and MagnetizationDensityTests::testCopyConstructor().
|
static |
Definition at line 53 of file MagnetizationDensity.h.
Referenced by MagnetizationDensity::computeBin(), and MagnetizationDensity::getFullDataSize().
|
private |
Definition at line 168 of file MagnetizationDensity.h.
Referenced by MagnetizationDensity::computeBin(), MagnetizationDensity::MagnetizationDensity(), and MagnetizationDensityTests::testCopyConstructor().
|
private |
Definition at line 167 of file MagnetizationDensity.h.
Referenced by MagnetizationDensity::computeBin(), MagnetizationDensity::MagnetizationDensity(), and MagnetizationDensityTests::testCopyConstructor().
|
private |
Definition at line 161 of file MagnetizationDensity.h.
Referenced by MagnetizationDensity::MagnetizationDensity().
|
private |
Definition at line 163 of file MagnetizationDensity.h.
Referenced by MagnetizationDensity::generateGrid(), MagnetizationDensity::integrateMagnetizationDensity(), MagnetizationDensity::MagnetizationDensity(), and MagnetizationDensityTests::testCopyConstructor().
|
private |
Definition at line 164 of file MagnetizationDensity.h.
Referenced by MagnetizationDensity::computeBin(), and MagnetizationDensity::MagnetizationDensity().
|
private |
Definition at line 169 of file MagnetizationDensity.h.
Referenced by MagnetizationDensity::getFullDataSize(), and MagnetizationDensity::MagnetizationDensity().
|
private |
Definition at line 170 of file MagnetizationDensity.h.
Referenced by MagnetizationDensity::accumulate(), MagnetizationDensity::generateGrid(), MagnetizationDensity::generateSpinIntegrand(), MagnetizationDensity::integrateMagnetizationDensity(), MagnetizationDensity::MagnetizationDensity(), and MagnetizationDensityTests::testCopyConstructor().
|
private |
Definition at line 165 of file MagnetizationDensity.h.
Referenced by MagnetizationDensity::computeBin(), MagnetizationDensity::MagnetizationDensity(), and MagnetizationDensityTests::testCopyConstructor().