RDM1 implementation that performs Anderson mixing of the electron density. Derives directly from RDM1 — no spectral decomposition. More...
#include <RDM1Mixing.h>


Public Types | |
| using | RealType = linearAlgebra::blasLapack::real_type< ValueType > |
| using | AttrStorage = typename RDM1< ValueType, memorySpace >::AttrStorage |
Public Types inherited from dftefe::ksdft::RDM1< ValueType, memorySpace > | |
| using | AttrStorage = std::vector< dftefe::quadrature::QuadratureValuesContainer< double, dftefe::utils::MemorySpace::HOST > > |
| using | AttrStorageRef = std::reference_wrapper< AttrStorage > |
| using | AttrStorageConstRef = std::reference_wrapper< const AttrStorage > |
Public Member Functions | |
| RDM1Mixing (MixingScheme< RealType, RealType > &mixingScheme, const size_type mixingHistory, const std::vector< RealType > &jxwDataHost, const double mixingParameter, const bool isAdaptiveMixingParameter, const double spinMixingEnhancementFactor, const SpinMode spinMode, const std::string &xcType, std::shared_ptr< linearAlgebra::LinAlgOpContext< utils::MemorySpace::HOST > > linAlgOpContextHost, const MPI_Comm &mpiCommDomain) | |
| Constructor. More... | |
| virtual | ~RDM1Mixing ()=default |
| void | setRDM1 (std::shared_ptr< RDM1< ValueType, memorySpace > > rdm1) |
| Store rdm1 as a weak_ptr (non-owning). More... | |
| const RDM1< ValueType, memorySpace > & | getRDM1 () const |
| void | mix () |
| Execute the Anderson mixing pipeline using the stored d_rdm1Ptr. Computes residual = densOut - d_densityInAttrVals, updates the Anderson history, and overwrites d_densityInAttrVals with the mixed density. d_densityInAttrVals must be initialized via setDescriptors() (done in KohnShamDFT constructor) before the first call. No normalization is performed here. More... | |
| void | getDescriptors (const std::set< DensityDescrAttr > &densityAttrs, const std::set< WfcDescrAttr > &wfcAttrs, std::unordered_map< DensityDescrAttr, AttrStorage > &densityAttrVals, std::unordered_map< WfcDescrAttr, AttrStorage > &wfcAttrVals) override |
| Returns d_densityInAttrVals (the last mixed in-density). More... | |
| void | setDescriptors (const std::unordered_map< DensityDescrAttr, AttrStorage > &densityAttrVals, const std::unordered_map< WfcDescrAttr, AttrStorage > &wfcAttrVals) override |
| void | getDensityObs (const std::set< DensityObsAttr > &densityObsAttrs, std::unordered_map< DensityObsAttr, std::vector< std::vector< double > > > &densityObsAttrVals) override |
| void | setEvalDescrFlag (const bool evalFlag) override |
| SpinMode | spinMode () const override |
| bool | isSOC () const override |
| size_type | getnKSOrbs () const override |
| std::vector< double > | getkPointCoords () const override |
| std::vector< double > | getkPointWeights () const override |
| std::unique_ptr< RDM1< ValueType, memorySpace > > | clone () const override |
Public Member Functions inherited from dftefe::ksdft::RDM1< ValueType, memorySpace > | |
| virtual | ~RDM1 ()=default |
| Default destructor. More... | |
| virtual void | setEvalDescrFlag (const bool evalFlag)=0 |
| virtual void | getDescriptors (const std::set< DensityDescrAttr > &densityAttrs, const std::set< WfcDescrAttr > &wfcAttrs, std::unordered_map< DensityDescrAttr, AttrStorage > &densityAttrVals, std::unordered_map< WfcDescrAttr, AttrStorage > &wfcAttrVals)=0 |
| virtual void | setDescriptors (const std::unordered_map< DensityDescrAttr, AttrStorage > &densityAttrVals, const std::unordered_map< WfcDescrAttr, AttrStorage > &wfcAttrVals)=0 |
| virtual void | getDensityObs (const std::set< DensityObsAttr > &densityObsAttrs, std::unordered_map< DensityObsAttr, std::vector< std::vector< double > > > &densityObsAttrVals)=0 |
| virtual SpinMode | spinMode () const =0 |
| virtual bool | isSOC () const =0 |
| virtual size_type | getnKSOrbs () const =0 |
| virtual std::vector< double > | getkPointCoords () const =0 |
| virtual std::vector< double > | getkPointWeights () const =0 |
| virtual std::unique_ptr< RDM1< ValueType, memorySpace > > | clone () const =0 |
Private Attributes | |
| std::weak_ptr< RDM1< ValueType, memorySpace > > | d_rdm1Ptr |
| MixingScheme< RealType, RealType > & | d_mixingScheme |
| size_type | d_mixingHistory |
| size_type | d_numElectrons |
| std::shared_ptr< linearAlgebra::LinAlgOpContext< utils::MemorySpace::HOST > > | d_linAlgOpContextHost |
| std::reference_wrapper< const MPI_Comm > | d_mpiCommDomain |
| AttrStorage | d_densityInAttrVals |
| AttrStorage | d_gradDensityInAttrVals |
RDM1 implementation that performs Anderson mixing of the electron density. Derives directly from RDM1 — no spectral decomposition.
setRDM1(rdm1) — stores the RDM1 pointer. mix() — explicit call from KohnShamDFT after each eigensolve. Fetches densOut from d_rdm1Ptr->getDescriptors(), computes residual = densOut - in, and performs Anderson mixing. No normalization is done here; KohnShamDFT normalizes densIn and densOut externally. getDescriptors — returns d_densityInAttrVals (the last mixed in-density).
The caller (KohnShamDFT) owns the MixingScheme object. All mixing variables (rho, mag*, gradRho, gradMag*) are registered in the RDM1Mixing constructor based on spinMode and xcType. d_rdm1Ptr is null until the first setRDM1() call.
| using dftefe::ksdft::RDM1Mixing< ValueType, memorySpace >::AttrStorage = typename RDM1<ValueType, memorySpace>::AttrStorage |
| using dftefe::ksdft::RDM1Mixing< ValueType, memorySpace >::RealType = linearAlgebra::blasLapack::real_type<ValueType> |
| dftefe::ksdft::RDM1Mixing< ValueType, memorySpace >::RDM1Mixing | ( | MixingScheme< RealType, RealType > & | mixingScheme, |
| const size_type | mixingHistory, | ||
| const std::vector< RealType > & | jxwDataHost, | ||
| const double | mixingParameter, | ||
| const bool | isAdaptiveMixingParameter, | ||
| const double | spinMixingEnhancementFactor, | ||
| const SpinMode | spinMode, | ||
| const std::string & | xcType, | ||
| std::shared_ptr< linearAlgebra::LinAlgOpContext< utils::MemorySpace::HOST > > | linAlgOpContextHost, | ||
| const MPI_Comm & | mpiCommDomain | ||
| ) |
Constructor.
| mixingScheme | Anderson mixing scheme owned by the caller. RDM1Mixing calls addVariableToInHist, addVariableToResidualHist, popOldHistory, computeAndersonMixingCoeff, and mixVariable on it inside mix(). The caller is responsible for calling addMixingVariable() on the scheme before the first setRDM1() call. |
| mixingHistory | Anderson mixing history length. |
| mixingParameter | Anderson mixing parameter applied to the charge-density variable (rho, gradRho). |
| spinMixingEnhancementFactor | Multiplier applied on top of mixingParameter for the spin/magnetization variables (magZ, magY, magX and their gradients). Magnetization typically needs a more aggressive mixing coefficient than the charge density to avoid lagging/oscillating relative to it |
| xcType | XC functional string (e.g. "GGA-PBE", "LDA-PW"). Used to determine whether gradient density mixing variables (gradRho, gradMag*) should be registered. |
| linAlgOpContextHost | LinAlg context for HOST-side operations. |
| mpiCommDomain | MPI communicator. |

|
virtualdefault |
|
overridevirtual |
Implements dftefe::ksdft::RDM1< ValueType, memorySpace >.
|
overridevirtual |
Implements dftefe::ksdft::RDM1< ValueType, memorySpace >.
|
overridevirtual |
Returns d_densityInAttrVals (the last mixed in-density).
Implements dftefe::ksdft::RDM1< ValueType, memorySpace >.
|
overridevirtual |
Implements dftefe::ksdft::RDM1< ValueType, memorySpace >.
|
overridevirtual |
Implements dftefe::ksdft::RDM1< ValueType, memorySpace >.
|
overridevirtual |
Implements dftefe::ksdft::RDM1< ValueType, memorySpace >.
| const RDM1< ValueType, memorySpace > & dftefe::ksdft::RDM1Mixing< ValueType, memorySpace >::getRDM1 |
|
overridevirtual |
Implements dftefe::ksdft::RDM1< ValueType, memorySpace >.
| void dftefe::ksdft::RDM1Mixing< ValueType, memorySpace >::mix |
Execute the Anderson mixing pipeline using the stored d_rdm1Ptr. Computes residual = densOut - d_densityInAttrVals, updates the Anderson history, and overwrites d_densityInAttrVals with the mixed density. d_densityInAttrVals must be initialized via setDescriptors() (done in KohnShamDFT constructor) before the first call. No normalization is performed here.

|
overridevirtual |
Implements dftefe::ksdft::RDM1< ValueType, memorySpace >.
|
overridevirtual |
Implements dftefe::ksdft::RDM1< ValueType, memorySpace >.
| void dftefe::ksdft::RDM1Mixing< ValueType, memorySpace >::setRDM1 | ( | std::shared_ptr< RDM1< ValueType, memorySpace > > | rdm1 | ) |
Store rdm1 as a weak_ptr (non-owning).
|
overridevirtual |
Implements dftefe::ksdft::RDM1< ValueType, memorySpace >.

|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |