DFT-FE 1.1.0-pre
Density Functional Theory With Finite-Elements
Loading...
Searching...
No Matches
energyCalculator.h
Go to the documentation of this file.
1// ---------------------------------------------------------------------
2//
3// Copyright (c) 2017-2025 The Regents of the University of Michigan and DFT-FE
4// authors.
5//
6// This file is part of the DFT-FE code.
7//
8// The DFT-FE code is free software; you can use it, redistribute
9// it, and/or modify it under the terms of the GNU Lesser General
10// Public License as published by the Free Software Foundation; either
11// version 2.1 of the License, or (at your option) any later version.
12// The full text of the license can be found in the file LICENSE at
13// the top level of the DFT-FE distribution.
14//
15// ---------------------------------------------------------------------
16//
17
18#include <headers.h>
19#include <dftd.h>
20#include <excManager.h>
21#include "dftParameters.h"
22#include <FEBasisOperations.h>
23#include <AuxDensityMatrix.h>
24#ifndef energyCalculator_H_
25# define energyCalculator_H_
26
27namespace dftfe
28{
30 {
31 template <typename T>
32 double
34 const std::shared_ptr<
36 FEBasisOperations<T, double, dftfe::utils::MemorySpace::HOST>>
37 & basisOperationsPtr,
38 const unsigned int quadratureId,
39 const std::map<dealii::CellId, std::vector<double>> &fieldValues,
41 &densityQuadValues);
42
43 template <typename T>
44 double
46 const std::shared_ptr<
48 FEBasisOperations<T, double, dftfe::utils::MemorySpace::HOST>>
49 & basisOperationsPtr,
50 const unsigned int quadratureId,
51 const std::map<dealii::CellId, std::vector<double>> &fieldValues,
53 &densityQuadValuesIn,
55 &densityQuadValuesOut);
56
57 template <typename T>
58 double
60 const std::shared_ptr<
62 FEBasisOperations<T, double, dftfe::utils::MemorySpace::HOST>>
63 & basisOperationsPtr,
64 const unsigned int quadratureId,
66 &fieldValues,
68 &densityQuadValues);
69
70 template <typename T>
71 double
73 const std::shared_ptr<
75 FEBasisOperations<T, double, dftfe::utils::MemorySpace::HOST>>
76 & basisOperationsPtr,
77 const unsigned int quadratureId,
79 &fieldValues,
81 &densityQuadValuesIn,
83 &densityQuadValuesOut);
84
85 void
86 printEnergy(const double bandEnergy,
87 const double totalkineticEnergy,
88 const double totalexchangeEnergy,
89 const double totalcorrelationEnergy,
90 const double totalElectrostaticEnergy,
91 const double dispersionEnergy,
92 const double totalEnergy,
93 const unsigned int numberAtoms,
94 const dealii::ConditionalOStream &pcout,
95 const bool reproducibleOutput,
96 const bool isPseudo,
97 const unsigned int verbosity,
98 const dftParameters & dftParams);
99
100 double
101 localBandEnergy(const std::vector<std::vector<double>> &eigenValues,
102 const std::vector<std::vector<double>> &partialOccupancies,
103 const std::vector<double> & kPointWeights,
104 const double fermiEnergy,
105 const double fermiEnergyUp,
106 const double fermiEnergyDown,
107 const double TVal,
108 const unsigned int spinPolarized,
109 const dealii::ConditionalOStream & scout,
110 const MPI_Comm & interpoolcomm,
111 const unsigned int lowerBoundKindex,
112 const unsigned int verbosity,
113 const dftParameters & dftParams);
114
115 double
117 const distributedCPUVec<double> & phiTotRhoOut,
118 const std::vector<std::vector<double>> & localVselfs,
119 const std::map<dealii::CellId, std::vector<double>> &smearedbValues,
120 const std::map<dealii::CellId, std::vector<unsigned int>>
121 & smearedbNonTrivialAtomIds,
122 const dealii::DoFHandler<3> &dofHandlerElectrostatic,
123 const dealii::Quadrature<3> &quadratureElectrostatic,
124 const dealii::Quadrature<3> &quadratureSmearedCharge,
125 const std::map<dealii::types::global_dof_index, double>
126 & atomElectrostaticNodeIdToChargeMap,
127 const bool smearedNuclearCharges = false);
128
129 double
131 const distributedCPUVec<double> & phiTotRhoIn,
132 const distributedCPUVec<double> & phiTotRhoOut,
133 const std::map<dealii::CellId, std::vector<double>> &smearedbValues,
134 const std::map<dealii::CellId, std::vector<unsigned int>>
135 & smearedbNonTrivialAtomIds,
136 const dealii::DoFHandler<3> &dofHandlerElectrostatic,
137 const dealii::Quadrature<3> &quadratureSmearedCharge,
138 const std::map<dealii::types::global_dof_index, double>
139 & atomElectrostaticNodeIdToChargeMap,
140 const bool smearedNuclearCharges = false);
141
142 double
144 const std::vector<std::vector<double>> &atomLocationsAndCharge,
145 const bool isPseudopotential);
146 } // namespace internalEnergy
147
148 /**
149 * @brief Calculates the ksdft problem total energy and its components
150 *
151 * @author Sambit Das, Shiva Rudraraju, Phani Motamarri, Krishnendu Ghosh
152 */
153 template <dftfe::utils::MemorySpace memorySpace>
155 {
156 public:
157 /**
158 * @brief Constructor
159 *
160 * @param mpi_comm_parent parent mpi communicator
161 * @param mpi_comm_domain mpi communicator of domain decomposition
162 * @param interpool_comm mpi interpool communicator over k points
163 * @param interBandGroupComm mpi interpool communicator over band groups
164 */
165 energyCalculator(const MPI_Comm & mpi_comm_parent,
166 const MPI_Comm & mpi_comm_domain,
167 const MPI_Comm & interpool_comm,
168 const MPI_Comm & interBandGroupComm,
169 const dftParameters &dftParams);
170
171 /**
172 * Computes total energy of the ksdft problem in the current state and also
173 * prints the individual components of the energy
174 *
175 * @param dofHandlerElectrostatic p refined DoFHandler object used for re-computing
176 * the electrostatic fields using the ground state electron density. If
177 * electrostatics is not recomputed on p refined mesh, use
178 * dofHandlerElectronic for this argument.
179 * @param dofHandlerElectronic DoFHandler object on which the electrostatics for the
180 * eigen solve are computed.
181 * @param quadratureElectrostatic qudarature object for dofHandlerElectrostatic.
182 * @param quadratureElectronic qudarature object for dofHandlerElectronic.
183 * @param eigenValues eigenValues for each k point.
184 * @param kPointWeights
185 * @param fermiEnergy
186 * @param funcX exchange functional object.
187 * @param funcC correlation functional object.
188 * @param phiTotRhoIn nodal vector field of total electrostatic potential using input
189 * electron density to an eigensolve. This vector field is based on
190 * dofHandlerElectronic.
191 * @param phiTotRhoOut nodal vector field of total electrostatic potential using output
192 * electron density to an eigensolve. This vector field is based on
193 * dofHandlerElectrostatic.
194 * @param rhoInValues cell quadrature data of input electron density to an eigensolve. This
195 * data must correspond to quadratureElectronic.
196 * @param rhoOutValues cell quadrature data of output electron density of an eigensolve. This
197 * data must correspond to quadratureElectronic.
198 * @param rhoOutValuesElectrostatic cell quadrature data of output electron density of an eigensolve
199 * evaluated on a p refined mesh. This data corresponds to
200 * quadratureElectrostatic.
201 * @param gradRhoInValues cell quadrature data of input gradient electron density
202 * to an eigensolve. This data must correspond to quadratureElectronic.
203 * @param gradRhoOutValues cell quadrature data of output gradient electron density
204 * of an eigensolve. This data must correspond to quadratureElectronic.
205 * @param localVselfs peak vselfs of local atoms in each vself bin
206 * @param atomElectrostaticNodeIdToChargeMap map between locally processor atom global node ids
207 * of dofHandlerElectrostatic to atom charge value.
208 * @param numberGlobalAtoms
209 * @param lowerBoundKindex global k index of lower bound of the local k point set in the current pool
210 * @param if scf is converged
211 * @param print
212 *
213 * @return total energy
214 */
215 double
217 const std::shared_ptr<
219 double,
221 &basisOperationsPtr,
222 const std::shared_ptr<
224 FEBasisOperations<double, double, dftfe::utils::MemorySpace::HOST>>
225 & basisOperationsPtrElectro,
226 const unsigned int densityQuadratureID,
227 const unsigned int densityQuadratureIDElectro,
228 const unsigned int smearedChargeQuadratureIDElectro,
229 const unsigned int lpspQuadratureIDElectro,
230 const std::vector<std::vector<double>> &eigenValues,
231 const std::vector<std::vector<double>> &partialOccupancies,
232 const std::vector<double> & kPointWeights,
233 const double fermiEnergy,
234 const double fermiEnergyUp,
235 const double fermiEnergyDown,
236 const std::shared_ptr<excManager<memorySpace>> excManagerPtr,
237 const dispersionCorrection & dispersionCorr,
239 &phiTotRhoInValues,
241 & phiTotRhoOutValues,
242 const distributedCPUVec<double> &phiTotRhoOut,
243 const std::vector<
245 &densityInValues,
246 const std::vector<
248 &densityOutValues,
249 const std::vector<
251 &gradDensityOutValues,
253 &rhoOutValuesLpsp,
254 std::shared_ptr<AuxDensityMatrix<memorySpace>>
255 auxDensityXCInRepresentationPtr,
256 std::shared_ptr<AuxDensityMatrix<memorySpace>>
257 auxDensityXCOutRepresentationPtr,
258 const std::map<dealii::CellId, std::vector<double>> &smearedbValues,
259 const std::map<dealii::CellId, std::vector<unsigned int>>
260 & smearedbNonTrivialAtomIds,
261 const std::vector<std::vector<double>> &localVselfs,
262 const std::map<dealii::CellId, std::vector<double>> &pseudoLocValues,
263 const std::map<dealii::types::global_dof_index, double>
264 & atomElectrostaticNodeIdToChargeMap,
265 const unsigned int numberGlobalAtoms,
266 const unsigned int lowerBoundKindex,
267 const unsigned int scfConverged,
268 const bool print,
269 const bool smearedNuclearCharges = false);
270
271 double
273 const std::shared_ptr<
275 double,
277 &basisOperationsPtr,
278 const std::shared_ptr<
280 FEBasisOperations<double, double, dftfe::utils::MemorySpace::HOST>>
281 & basisOperationsPtrElectro,
282 const unsigned int densityQuadratureID,
283 const unsigned int densityQuadratureIDElectro,
284 const unsigned int smearedChargeQuadratureIDElectro,
285 const unsigned int lpspQuadratureIDElectro,
286 const std::shared_ptr<excManager<memorySpace>> excManagerPtr,
288 &phiTotRhoInValues,
290 & phiTotRhoOutValues,
291 const distributedCPUVec<double> &phiTotRhoIn,
292 const distributedCPUVec<double> &phiTotRhoOut,
293 const std::vector<
295 &densityInValues,
296 const std::vector<
298 &densityOutValues,
299 const std::vector<
301 &gradDensityInValues,
302 const std::vector<
304 &gradDensityOutValues,
305 std::shared_ptr<AuxDensityMatrix<memorySpace>>
306 AuxDensityXCInRepresentationPtr,
307 std::shared_ptr<AuxDensityMatrix<memorySpace>>
308 AuxDensityXCOutRepresentationPtr,
309 const std::map<dealii::CellId, std::vector<double>> &smearedbValues,
310 const std::map<dealii::CellId, std::vector<unsigned int>>
311 & smearedbNonTrivialAtomIds,
312 const std::vector<std::vector<double>> &localVselfs,
313 const std::map<dealii::types::global_dof_index, double>
314 & atomElectrostaticNodeIdToChargeMap,
315 const bool smearedNuclearCharges);
316
317
318
319 void
321 const std::shared_ptr<
323 double,
325 & basisOperationsPtr,
326 const unsigned int quadratureId,
327 const std::shared_ptr<excManager<memorySpace>> excManagerPtr,
328 const std::vector<
330 &densityInValues,
331 const std::vector<
333 &gradDensityOutValues,
334 std::shared_ptr<AuxDensityMatrix<memorySpace>>
335 AuxDensityXCInRepresentationPtr,
336 std::shared_ptr<AuxDensityMatrix<memorySpace>>
337 auxDensityXCOutRepresentationPtr,
338 double &exchangeEnergy,
339 double &correlationEnergy,
340 double &excCorrPotentialTimesRho);
341
342 double
344 const std::vector<std::vector<double>> &eigenValues,
345 const std::vector<std::vector<double>> &partialOccupancies,
346 const std::vector<double> & kPointWeights,
347 const double fermiEnergy,
348 const double fermiEnergyUp,
349 const double fermiEnergyDown,
350 const bool isSpinPolarized,
351 const bool isConstraintMagnetization,
352 const double temperature) const;
353
354
355
356 private:
357 const MPI_Comm d_mpiCommParent;
358 const MPI_Comm mpi_communicator;
359 const MPI_Comm interpoolcomm;
360 const MPI_Comm interBandGroupComm;
361
363
364 /// parallel message stream
365 dealii::ConditionalOStream pcout;
366 };
367
368} // namespace dftfe
369#endif // energyCalculator_H_
Definition AuxDensityMatrix.h:33
Definition FEBasisOperations.h:84
Namespace which declares the input parameters and the functions to parse them from the input paramete...
Definition dftParameters.h:35
Calculates dispersion correction to energy, force and stress.
Definition dftd.h:37
const MPI_Comm interpoolcomm
Definition energyCalculator.h:359
double computeEntropicEnergy(const std::vector< std::vector< double > > &eigenValues, const std::vector< std::vector< double > > &partialOccupancies, const std::vector< double > &kPointWeights, const double fermiEnergy, const double fermiEnergyUp, const double fermiEnergyDown, const bool isSpinPolarized, const bool isConstraintMagnetization, const double temperature) const
const MPI_Comm d_mpiCommParent
Definition energyCalculator.h:357
const dftParameters & d_dftParams
Definition energyCalculator.h:362
const MPI_Comm interBandGroupComm
Definition energyCalculator.h:360
const MPI_Comm mpi_communicator
Definition energyCalculator.h:358
dealii::ConditionalOStream pcout
parallel message stream
Definition energyCalculator.h:365
void computeXCEnergyTermsSpinPolarized(const std::shared_ptr< dftfe::basis::FEBasisOperations< dataTypes::number, double, dftfe::utils::MemorySpace::HOST > > &basisOperationsPtr, const unsigned int quadratureId, const std::shared_ptr< excManager< memorySpace > > excManagerPtr, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &densityInValues, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &gradDensityOutValues, std::shared_ptr< AuxDensityMatrix< memorySpace > > AuxDensityXCInRepresentationPtr, std::shared_ptr< AuxDensityMatrix< memorySpace > > auxDensityXCOutRepresentationPtr, double &exchangeEnergy, double &correlationEnergy, double &excCorrPotentialTimesRho)
double computeEnergyResidual(const std::shared_ptr< dftfe::basis::FEBasisOperations< dataTypes::number, double, dftfe::utils::MemorySpace::HOST > > &basisOperationsPtr, const std::shared_ptr< dftfe::basis::FEBasisOperations< double, double, dftfe::utils::MemorySpace::HOST > > &basisOperationsPtrElectro, const unsigned int densityQuadratureID, const unsigned int densityQuadratureIDElectro, const unsigned int smearedChargeQuadratureIDElectro, const unsigned int lpspQuadratureIDElectro, const std::shared_ptr< excManager< memorySpace > > excManagerPtr, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &phiTotRhoInValues, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &phiTotRhoOutValues, const distributedCPUVec< double > &phiTotRhoIn, const distributedCPUVec< double > &phiTotRhoOut, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &densityInValues, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &densityOutValues, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &gradDensityInValues, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &gradDensityOutValues, std::shared_ptr< AuxDensityMatrix< memorySpace > > AuxDensityXCInRepresentationPtr, std::shared_ptr< AuxDensityMatrix< memorySpace > > AuxDensityXCOutRepresentationPtr, const std::map< dealii::CellId, std::vector< double > > &smearedbValues, const std::map< dealii::CellId, std::vector< unsigned int > > &smearedbNonTrivialAtomIds, const std::vector< std::vector< double > > &localVselfs, const std::map< dealii::types::global_dof_index, double > &atomElectrostaticNodeIdToChargeMap, const bool smearedNuclearCharges)
double computeEnergy(const std::shared_ptr< dftfe::basis::FEBasisOperations< dataTypes::number, double, dftfe::utils::MemorySpace::HOST > > &basisOperationsPtr, const std::shared_ptr< dftfe::basis::FEBasisOperations< double, double, dftfe::utils::MemorySpace::HOST > > &basisOperationsPtrElectro, const unsigned int densityQuadratureID, const unsigned int densityQuadratureIDElectro, const unsigned int smearedChargeQuadratureIDElectro, const unsigned int lpspQuadratureIDElectro, const std::vector< std::vector< double > > &eigenValues, const std::vector< std::vector< double > > &partialOccupancies, const std::vector< double > &kPointWeights, const double fermiEnergy, const double fermiEnergyUp, const double fermiEnergyDown, const std::shared_ptr< excManager< memorySpace > > excManagerPtr, const dispersionCorrection &dispersionCorr, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &phiTotRhoInValues, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &phiTotRhoOutValues, const distributedCPUVec< double > &phiTotRhoOut, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &densityInValues, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &densityOutValues, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &gradDensityOutValues, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &rhoOutValuesLpsp, std::shared_ptr< AuxDensityMatrix< memorySpace > > auxDensityXCInRepresentationPtr, std::shared_ptr< AuxDensityMatrix< memorySpace > > auxDensityXCOutRepresentationPtr, const std::map< dealii::CellId, std::vector< double > > &smearedbValues, const std::map< dealii::CellId, std::vector< unsigned int > > &smearedbNonTrivialAtomIds, const std::vector< std::vector< double > > &localVselfs, const std::map< dealii::CellId, std::vector< double > > &pseudoLocValues, const std::map< dealii::types::global_dof_index, double > &atomElectrostaticNodeIdToChargeMap, const unsigned int numberGlobalAtoms, const unsigned int lowerBoundKindex, const unsigned int scfConverged, const bool print, const bool smearedNuclearCharges=false)
energyCalculator(const MPI_Comm &mpi_comm_parent, const MPI_Comm &mpi_comm_domain, const MPI_Comm &interpool_comm, const MPI_Comm &interBandGroupComm, const dftParameters &dftParams)
Constructor.
Definition excManager.h:28
Definition MemoryStorage.h:33
Definition FEBasisOperations.h:30
double number
Definition dftfeDataTypes.h:44
Definition energyCalculator.h:30
double localBandEnergy(const std::vector< std::vector< double > > &eigenValues, const std::vector< std::vector< double > > &partialOccupancies, const std::vector< double > &kPointWeights, const double fermiEnergy, const double fermiEnergyUp, const double fermiEnergyDown, const double TVal, const unsigned int spinPolarized, const dealii::ConditionalOStream &scout, const MPI_Comm &interpoolcomm, const unsigned int lowerBoundKindex, const unsigned int verbosity, const dftParameters &dftParams)
void printEnergy(const double bandEnergy, const double totalkineticEnergy, const double totalexchangeEnergy, const double totalcorrelationEnergy, const double totalElectrostaticEnergy, const double dispersionEnergy, const double totalEnergy, const unsigned int numberAtoms, const dealii::ConditionalOStream &pcout, const bool reproducibleOutput, const bool isPseudo, const unsigned int verbosity, const dftParameters &dftParams)
double nuclearElectrostaticEnergyResidualLocal(const distributedCPUVec< double > &phiTotRhoIn, const distributedCPUVec< double > &phiTotRhoOut, const std::map< dealii::CellId, std::vector< double > > &smearedbValues, const std::map< dealii::CellId, std::vector< unsigned int > > &smearedbNonTrivialAtomIds, const dealii::DoFHandler< 3 > &dofHandlerElectrostatic, const dealii::Quadrature< 3 > &quadratureSmearedCharge, const std::map< dealii::types::global_dof_index, double > &atomElectrostaticNodeIdToChargeMap, const bool smearedNuclearCharges=false)
double computeFieldTimesDensityResidual(const std::shared_ptr< dftfe::basis::FEBasisOperations< T, double, dftfe::utils::MemorySpace::HOST > > &basisOperationsPtr, const unsigned int quadratureId, const std::map< dealii::CellId, std::vector< double > > &fieldValues, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &densityQuadValuesIn, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &densityQuadValuesOut)
double nuclearElectrostaticEnergyLocal(const distributedCPUVec< double > &phiTotRhoOut, const std::vector< std::vector< double > > &localVselfs, const std::map< dealii::CellId, std::vector< double > > &smearedbValues, const std::map< dealii::CellId, std::vector< unsigned int > > &smearedbNonTrivialAtomIds, const dealii::DoFHandler< 3 > &dofHandlerElectrostatic, const dealii::Quadrature< 3 > &quadratureElectrostatic, const dealii::Quadrature< 3 > &quadratureSmearedCharge, const std::map< dealii::types::global_dof_index, double > &atomElectrostaticNodeIdToChargeMap, const bool smearedNuclearCharges=false)
double computeRepulsiveEnergy(const std::vector< std::vector< double > > &atomLocationsAndCharge, const bool isPseudopotential)
double computeFieldTimesDensity(const std::shared_ptr< dftfe::basis::FEBasisOperations< T, double, dftfe::utils::MemorySpace::HOST > > &basisOperationsPtr, const unsigned int quadratureId, const std::map< dealii::CellId, std::vector< double > > &fieldValues, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &densityQuadValues)
@ HOST
Definition MemorySpaceType.h:34
Definition pseudoPotentialToDftfeConverter.cc:34
dealii::LinearAlgebra::distributed::Vector< elem_type, dealii::MemorySpace::Host > distributedCPUVec
Definition headers.h:92