DFT-EFE
 
Loading...
Searching...
No Matches
ElectrostaticLocalFE.h
Go to the documentation of this file.
1/******************************************************************************
2 * Copyright (c) 2021. *
3 * The Regents of the University of Michigan and DFT-EFE developers. *
4 * *
5 * This file is part of the DFT-EFE code. *
6 * *
7 * DFT-EFE is free software: you can redistribute it and/or modify *
8 * it under the terms of the Lesser GNU General Public License as *
9 * published by the Free Software Foundation, either version 3 of *
10 * the License, or (at your option) any later version. *
11 * *
12 * DFT-EFE is distributed in the hope that it will be useful, but *
13 * WITHOUT ANY WARRANTY; without even the implied warranty *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
15 * See the Lesser GNU General Public License for more details. *
16 * *
17 * You should have received a copy of the GNU Lesser General Public *
18 * License at the top level of DFT-EFE distribution. If not, see *
19 * <https://www.gnu.org/licenses/>. *
20 ******************************************************************************/
21
22/*
23 * @author Avirup Sircar
24 */
25
26#ifndef dftefeElectrostaticLocalFE_h
27#define dftefeElectrostaticLocalFE_h
28
43#include "Defaults.h"
44
45namespace dftefe
46{
47 namespace ksdft
48 {
49 template <typename ValueTypeBasisData,
50 typename ValueTypeBasisCoeff,
51 typename ValueTypeWaveFnBasisData,
52 utils::MemorySpace memorySpace,
53 size_type dim>
55 : public ElectrostaticFE<ValueTypeBasisData,
56 ValueTypeBasisCoeff,
57 ValueTypeWaveFnBasisData,
58 memorySpace,
59 dim>
60 {
61 public:
62 using ValueType = typename ElectrostaticFE<ValueTypeBasisData,
63 ValueTypeBasisCoeff,
64 ValueTypeWaveFnBasisData,
65 memorySpace,
66 dim>::ValueType;
67 using Storage = typename ElectrostaticFE<ValueTypeBasisData,
68 ValueTypeBasisCoeff,
69 ValueTypeWaveFnBasisData,
70 memorySpace,
71 dim>::Storage;
72 using RealType = typename ElectrostaticFE<ValueTypeBasisData,
73 ValueTypeBasisCoeff,
74 ValueTypeWaveFnBasisData,
75 memorySpace,
76 dim>::RealType;
77
78 public:
82 // used if analytical vself canellation route taken
84 const std::vector<utils::Point> &atomCoordinates,
85 const std::vector<double> & atomCharges,
86 const double & smearedChargeRadius,
88 & electronChargeDensity,
89 std::shared_ptr<const basis::FEBasisManager<ValueTypeBasisCoeff,
90 ValueTypeBasisData,
92 dim>> feBMTotalCharge,
93 std::shared_ptr<
95 feBDTotalChargeStiffnessMatrix,
96 std::shared_ptr<
98 feBDNuclearChargeRhs,
99 std::shared_ptr<
101 feBDElectronicChargeRhs,
102 std::shared_ptr<
103 const basis::FEBasisDataStorage<ValueTypeWaveFnBasisData,
104 memorySpace>> feBDHamiltonian,
105 const utils::ScalarSpatialFunctionReal &externalPotentialFunction,
107 linAlgOpContext,
108 const size_type maxCellBlock,
109 bool useDealiiMatrixFreePoissonSolve = true);
110
111 // used if numerical poisson solve vself canellation route taken
113 const std::vector<utils::Point> &atomCoordinates,
114 const std::vector<double> & atomCharges,
115 const double & smearedChargeRadius,
117 & electronChargeDensity,
118 std::shared_ptr<const basis::FEBasisManager<ValueTypeBasisCoeff,
119 ValueTypeBasisData,
121 dim>> feBMTotalCharge,
122 std::shared_ptr<
124 feBDTotalChargeStiffnessMatrix,
125 std::shared_ptr<
127 feBDNuclearChargeRhs,
128 std::shared_ptr<
130 feBDElectronicChargeRhs,
131 std::shared_ptr<
133 feBDNuclChargeStiffnessMatrixNumSol,
134 std::shared_ptr<
136 feBDNuclChargeRhsNumSol,
137 std::shared_ptr<
138 const basis::FEBasisDataStorage<ValueTypeWaveFnBasisData,
139 memorySpace>> feBDHamiltonian,
140 const utils::ScalarSpatialFunctionReal &externalPotentialFunction,
142 linAlgOpContext,
143 const size_type maxCellBlock,
144 bool useDealiiMatrixFreePoissonSolve = true);
145
146 // used if delta rho approach is taken with phi total from 1D KS solve
147 // with analytical vself energy cancellation
149 const std::vector<utils::Point> &atomCoordinates,
150 const std::vector<std::string> & atomSymbols,
151 const std::vector<double> & atomCharges,
152 const double & smearedChargeRadius,
154 &atomicTotalElectroPotentialFunction,
156 &atomicElectronicChargeDensityFunction,
157 std::shared_ptr<const basis::FEBasisManager<ValueTypeBasisCoeff,
158 ValueTypeBasisData,
160 dim>>
161 feBMTotalCharge, // will be same as bc of totalCharge -
162 // atomicTotalCharge
163 std::shared_ptr<
165 feBDTotalChargeStiffnessMatrix,
166 std::shared_ptr<
168 feBDNuclearChargeRhs,
169 std::shared_ptr<
171 feBDElectronicChargeRhs,
172 std::shared_ptr<
173 const basis::FEBasisDataStorage<ValueTypeWaveFnBasisData,
174 memorySpace>> feBDHamiltonian,
175 const utils::ScalarSpatialFunctionReal &externalPotentialFunction,
177 linAlgOpContext,
178 const size_type maxCellBlock,
179 const std::unordered_map<std::string,
180 std::shared_ptr<atoms::AtomTCIASpline>>
181 fieldToTCIASplineMap = {},
182 const bool useDealiiMatrixFreePoissonSolve = true,
183 const bool calculateIntegralDeltaRho = false);
184
185
187
188 // used if analytical vself canellation route taken
189 void
191 const std::vector<utils::Point> & atomCoordinates,
192 std::shared_ptr<const basis::FEBasisManager<ValueTypeBasisCoeff,
193 ValueTypeBasisData,
195 dim>> feBMTotalCharge,
196 std::shared_ptr<
198 feBDTotalChargeStiffnessMatrix,
199 std::shared_ptr<
201 feBDNuclearChargeRhs,
202 std::shared_ptr<
204 feBDElectronicChargeRhs,
205 std::shared_ptr<
206 const basis::FEBasisDataStorage<ValueTypeWaveFnBasisData,
207 memorySpace>> feBDHamiltonian,
208 const utils::ScalarSpatialFunctionReal &externalPotentialFunction);
209
210 // used if numerical poisson solve vself canellation route taken
211 void
213 const std::vector<utils::Point> & atomCoordinates,
214 std::shared_ptr<const basis::FEBasisManager<ValueTypeBasisCoeff,
215 ValueTypeBasisData,
217 dim>> feBMTotalCharge,
218 std::shared_ptr<
220 feBDTotalChargeStiffnessMatrix,
221 std::shared_ptr<
223 feBDNuclearChargeRhs,
224 std::shared_ptr<
226 feBDElectronicChargeRhs,
227 std::shared_ptr<
229 feBDNuclChargeStiffnessMatrixNumSol,
230 std::shared_ptr<
232 feBDNuclChargeRhsNumSol,
233 std::shared_ptr<
234 const basis::FEBasisDataStorage<ValueTypeWaveFnBasisData,
235 memorySpace>> feBDHamiltonian,
236 const utils::ScalarSpatialFunctionReal &externalPotentialFunction);
237
238 // used if delta rho approach is taken with phi total from 1D KS solve
239 // with analytical vself energy cancellation
240 void
242 const std::vector<utils::Point> &atomCoordinates,
244 &atomicTotalElectroPotentialFunction,
246 &atomicElectronicChargeDensityFunction,
247 std::shared_ptr<const basis::FEBasisManager<ValueTypeBasisCoeff,
248 ValueTypeBasisData,
250 dim>> feBMTotalCharge,
251 std::shared_ptr<
253 feBDTotalChargeStiffnessMatrix,
254 std::shared_ptr<
256 feBDNuclearChargeRhs,
257 std::shared_ptr<
259 feBDElectronicChargeRhs,
260 std::shared_ptr<
261 const basis::FEBasisDataStorage<ValueTypeWaveFnBasisData,
262 memorySpace>> feBDHamiltonian,
263 const utils::ScalarSpatialFunctionReal &externalPotentialFunction);
264
265 void
268 &electronChargeDensity);
269
270 void
271 getLocal(Storage &cellWiseStorage) const override;
272
273 void
274 evalEnergy();
275
277 getEnergy() const override;
278
280 getFunctionalDerivative() const override;
281
282 void
286 bool updateGhostX,
287 bool updateGhostY) const override;
288
289 bool
290 hasLocalComponent() const override;
291
292 bool
293 hasNonLocalComponent() const override;
294
295 private:
296 /* Solves the nuclear potential problem, gets \sum \integral b_sm*V_sm ,
297 * gets \sum \integral V_sm * rho, \sum V_smAtRhoQuadPts
298 */
299 void
301 std::shared_ptr<
303 feBDNuclearChargeStiffnessMatrix,
304 std::shared_ptr<
306 feBDNuclearChargeRhs);
307
308 void
310
311 void
313
320 std::vector<utils::Point> d_atomCoordinates;
322 const std::vector<double> d_atomCharges;
326
327 // Causing memory errors: Change these to smart pointers
332 quadrature::QuadratureValuesContainer<ValueTypeBasisCoeff,
336 d_atomicElectronChargeDensity /*,d_atomicElectronChargeDensityNucQuad*/;
341
352
355
358 std::vector<linearAlgebra::MultiVector<ValueType, memorySpaceHost> *>
360
361 std::vector<std::shared_ptr<basis::FEBasisManager<ValueTypeBasisCoeff,
362 ValueTypeBasisData,
364 dim>>>
366
367 std::shared_ptr<const basis::FEBasisOperations<ValueTypeBasisCoeff,
368 ValueTypeBasisData,
370 dim>>
372 std::shared_ptr<const basis::FEBasisOperations<ValueTypeBasisCoeff,
373 ValueTypeBasisData,
375 dim>>
377 std::shared_ptr<const basis::FEBasisOperations<ValueTypeBasisCoeff,
378 ValueTypeWaveFnBasisData,
379 memorySpace,
380 dim>>
382
383 std::shared_ptr<const basis::FEBasisManager<ValueTypeBasisCoeff,
384 ValueTypeBasisData,
386 dim>>
388 std::shared_ptr<
391 std::shared_ptr<
394 std::shared_ptr<
397 std::shared_ptr<
400 std::shared_ptr<linearAlgebra::LinAlgOpContext<memorySpace>>
402 std::shared_ptr<linearAlgebra::LinAlgOpContext<memorySpaceHost>>
404 std::vector<RealType> d_nuclearChargeQuad;
406 std::shared_ptr<
408 ValueTypeBasisCoeff,
410 dim>>
412 std::shared_ptr<
414 ValueTypeBasisCoeff,
415 memorySpace,
416 dim>>
419
421
422 std::map<
423 std::string,
424 std::shared_ptr<
427
430
431 std::vector<std::string> d_atomSymbolVec;
432 const std::unordered_map<std::string,
433 std::shared_ptr<atoms::AtomTCIASpline>>
438
439 }; // end of class ElectrostaticLocalFE
440 } // end of namespace ksdft
441} // end of namespace dftefe
443#endif // dftefeElectrostaticLocalFE_h
Definition: AtomSuperpositionFunction.h:55
An abstract class to store and access data for a given basis, such as the basis function values on a ...
Definition: FEBasisDataStorage.h:54
An abstract class to encapsulate the partitioning of a finite element basis across multiple processor...
Definition: FEBasisManager.h:44
Definition: FEBasisOperations.h:64
A derived class of linearAlgebra::LinearSolverFunction to encapsulate the Poisson partial differentia...
Definition: PoissonLinearSolverFunctionFE.h:77
A derived class of linearAlgebra::LinearSolverFunction to encapsulate the Poisson partial differentia...
Definition: PoissonSolverDealiiMatrixFreeFE.h:83
A derived class of linearAlgebra::OperatorContext to encapsulate the action of a discrete operator on...
Definition: ElectrostaticFE.h:65
Definition: ElectrostaticLocalFE.h:60
RealType d_intRhoAtPhiAt
Definition: ElectrostaticLocalFE.h:428
void getLocal(Storage &cellWiseStorage) const override
Definition: ElectrostaticLocalFE.t.cpp:2033
typename ElectrostaticFE< ValueTypeBasisData, ValueTypeBasisCoeff, ValueTypeWaveFnBasisData, memorySpace, dim >::ValueType ValueType
Definition: ElectrostaticLocalFE.h:66
RealType d_energy
Definition: ElectrostaticLocalFE.h:324
std::shared_ptr< const basis::FEBasisDataStorage< ValueTypeBasisData, memorySpaceHost > > d_feBDNuclChargeRhsNumSol
Definition: ElectrostaticLocalFE.h:399
~ElectrostaticLocalFE()
Definition: ElectrostaticLocalFE.t.cpp:430
const size_type d_numAtoms
Definition: ElectrostaticLocalFE.h:321
void deleteStorages()
Definition: ElectrostaticLocalFE.t.cpp:445
std::vector< utils::Point > d_atomCoordinates
Definition: ElectrostaticLocalFE.h:320
quadrature::QuadratureValuesContainer< RealType, memorySpaceHost > * d_scratchDensRhoQuad
Definition: ElectrostaticLocalFE.h:345
double d_integralAtRho
Definition: ElectrostaticLocalFE.h:437
RealType d_nuclearSelfEnergy
Definition: ElectrostaticLocalFE.h:325
quadrature::QuadratureValuesContainer< ValueType, memorySpaceHost > * d_scratchPotNuclearQuad
Definition: ElectrostaticLocalFE.h:351
void evalEnergy()
Definition: ElectrostaticLocalFE.t.cpp:2494
std::shared_ptr< electrostatics::PoissonSolverDealiiMatrixFreeFE< ValueTypeBasisData, ValueTypeBasisCoeff, memorySpace, dim > > d_poissonSolverDealiiMatFree
Definition: ElectrostaticLocalFE.h:417
void nuclearPotentialSolve(std::shared_ptr< const basis::FEBasisDataStorage< ValueTypeBasisData, memorySpaceHost > > feBDNuclearChargeStiffnessMatrix, std::shared_ptr< const basis::FEBasisDataStorage< ValueTypeBasisData, memorySpaceHost > > feBDNuclearChargeRhs)
Definition: ElectrostaticLocalFE.t.cpp:2085
quadrature::QuadratureValuesContainer< ValueType, memorySpaceHost > * d_scratchPotHamQuad
Definition: ElectrostaticLocalFE.h:347
quadrature::QuadratureValuesContainer< ValueType, memorySpaceHost > * d_correctionPotRhoQuad
Definition: ElectrostaticLocalFE.h:340
utils::ConditionalOStream d_rootCout
Definition: ElectrostaticLocalFE.h:420
std::shared_ptr< const basis::FEBasisDataStorage< ValueTypeBasisData, memorySpaceHost > > d_feBDNuclearChargeRhs
Definition: ElectrostaticLocalFE.h:396
bool hasNonLocalComponent() const override
Definition: ElectrostaticLocalFE.t.cpp:2769
void reinitBasis(const std::vector< utils::Point > &atomCoordinates, std::shared_ptr< const basis::FEBasisManager< ValueTypeBasisCoeff, ValueTypeBasisData, memorySpaceHost, dim > > feBMTotalCharge, std::shared_ptr< const basis::FEBasisDataStorage< ValueTypeBasisData, memorySpaceHost > > feBDTotalChargeStiffnessMatrix, std::shared_ptr< const basis::FEBasisDataStorage< ValueTypeBasisData, memorySpaceHost > > feBDNuclearChargeRhs, std::shared_ptr< const basis::FEBasisDataStorage< ValueTypeBasisData, memorySpaceHost > > feBDElectronicChargeRhs, std::shared_ptr< const basis::FEBasisDataStorage< ValueTypeWaveFnBasisData, memorySpace > > feBDHamiltonian, const utils::ScalarSpatialFunctionReal &externalPotentialFunction)
Definition: ElectrostaticLocalFE.t.cpp:841
const std::unordered_map< std::string, std::shared_ptr< atoms::AtomTCIASpline > > d_fieldToTCIASplineMap
Definition: ElectrostaticLocalFE.h:434
bool d_isTCIEnabled
Definition: ElectrostaticLocalFE.h:435
std::vector< RealType > d_nuclearChargeQuad
Definition: ElectrostaticLocalFE.h:404
std::shared_ptr< const basis::FEBasisDataStorage< ValueTypeBasisData, memorySpaceHost > > d_feBDTotalChargeStiffnessMatrix
Definition: ElectrostaticLocalFE.h:390
const quadrature::QuadratureValuesContainer< ValueType, memorySpace > & getFunctionalDerivative() const override
Definition: ElectrostaticLocalFE.t.cpp:2693
std::shared_ptr< linearAlgebra::LinAlgOpContext< memorySpaceHost > > d_linAlgOpContextHost
Definition: ElectrostaticLocalFE.h:403
quadrature::QuadratureValuesContainer< RealType, memorySpaceHost > * d_scratchDensNuclearQuad
Definition: ElectrostaticLocalFE.h:343
std::vector< linearAlgebra::MultiVector< ValueType, memorySpaceHost > * > d_nuclearChargesPotential
Definition: ElectrostaticLocalFE.h:359
void reinitField(const quadrature::QuadratureValuesContainer< RealType, memorySpaceHost > &electronChargeDensity)
Definition: ElectrostaticLocalFE.t.cpp:1774
std::vector< std::string > d_atomSymbolVec
Definition: ElectrostaticLocalFE.h:431
const bool d_isCalculateIntegralDeltaRho
Definition: ElectrostaticLocalFE.h:315
void computeNuclearSelfEnergy()
Definition: ElectrostaticLocalFE.t.cpp:2283
const std::vector< double > d_atomCharges
Definition: ElectrostaticLocalFE.h:322
const size_type d_numComponents
Definition: ElectrostaticLocalFE.h:319
const size_type d_maxCellBlock
Definition: ElectrostaticLocalFE.h:318
std::map< std::string, std::shared_ptr< const basis::FEBasisDataStorage< ValueTypeBasisData, memorySpaceHost > > > d_feBasisDataStorageRhsMap
Definition: ElectrostaticLocalFE.h:426
std::shared_ptr< linearAlgebra::LinAlgOpContext< memorySpace > > d_linAlgOpContext
Definition: ElectrostaticLocalFE.h:401
quadrature::QuadratureValuesContainer< ValueTypeBasisCoeff, memorySpaceHost > * d_atomicTotalElecPotElectronicQuad
Definition: ElectrostaticLocalFE.h:334
quadrature::QuadratureValuesContainer< RealType, memorySpaceHost > * d_nuclearChargesDensity
Definition: ElectrostaticLocalFE.h:329
std::shared_ptr< const basis::FEBasisOperations< ValueTypeBasisCoeff, ValueTypeBasisData, memorySpaceHost, dim > > d_feBasisOpElectronic
Definition: ElectrostaticLocalFE.h:376
typename ElectrostaticFE< ValueTypeBasisData, ValueTypeBasisCoeff, ValueTypeWaveFnBasisData, memorySpace, dim >::RealType RealType
Definition: ElectrostaticLocalFE.h:76
bool hasLocalComponent() const override
Definition: ElectrostaticLocalFE.t.cpp:2754
const quadrature::QuadratureValuesContainer< RealType, memorySpaceHost > * d_electronChargeDensity
Definition: ElectrostaticLocalFE.h:331
RealType d_totNuclearChargeQuad
Definition: ElectrostaticLocalFE.h:418
std::shared_ptr< const basis::FEBasisOperations< ValueTypeBasisCoeff, ValueTypeWaveFnBasisData, memorySpace, dim > > d_feBasisOpHamiltonian
Definition: ElectrostaticLocalFE.h:381
RealType d_integralPhiAtxbSmear
Definition: ElectrostaticLocalFE.h:428
bool d_isNumericalVSelfSolve
Definition: ElectrostaticLocalFE.h:316
double d_integralDiffVZZCorrVSmearxSumBZZCorrBSmear
Definition: ElectrostaticLocalFE.h:436
typename ElectrostaticFE< ValueTypeBasisData, ValueTypeBasisCoeff, ValueTypeWaveFnBasisData, memorySpace, dim >::Storage Storage
Definition: ElectrostaticLocalFE.h:71
std::vector< std::shared_ptr< basis::FEBasisManager< ValueTypeBasisCoeff, ValueTypeBasisData, memorySpaceHost, dim > > > d_feBMNuclearCharge
Definition: ElectrostaticLocalFE.h:365
RealType d_correctionEnergyAtomic
Definition: ElectrostaticLocalFE.h:429
quadrature::QuadratureValuesContainer< ValueType, memorySpaceHost > * d_scratchPotRhoQuad
Definition: ElectrostaticLocalFE.h:349
bool d_useDealiiMatrixFreePoissonSolve
Definition: ElectrostaticLocalFE.h:314
std::shared_ptr< electrostatics::PoissonLinearSolverFunctionFE< ValueTypeBasisData, ValueTypeBasisCoeff, memorySpaceHost, dim > > d_linearSolverFunction
Definition: ElectrostaticLocalFE.h:411
quadrature::QuadratureValuesContainer< ValueType, memorySpaceHost > * d_correctionPotHamQuad
Definition: ElectrostaticLocalFE.h:338
std::shared_ptr< const basis::FEBasisDataStorage< ValueTypeBasisData, memorySpaceHost > > d_feBDElectronicChargeRhs
Definition: ElectrostaticLocalFE.h:393
size_type d_cellTimesNumVecPoisson
Definition: ElectrostaticLocalFE.h:405
void applyNonLocal(linearAlgebra::MultiVector< ValueTypeWaveFnBasisData, memorySpace > &X, linearAlgebra::MultiVector< ValueTypeWaveFnBasisData, memorySpace > &Y, bool updateGhostX, bool updateGhostY) const override
Definition: ElectrostaticLocalFE.t.cpp:2733
linearAlgebra::MultiVector< ValueTypeBasisCoeff, memorySpaceHost > * d_totalChargePotential
Definition: ElectrostaticLocalFE.h:357
const double d_smearedChargeRadius
Definition: ElectrostaticLocalFE.h:323
std::shared_ptr< const basis::FEBasisOperations< ValueTypeBasisCoeff, ValueTypeBasisData, memorySpaceHost, dim > > d_feBasisOpNuclear
Definition: ElectrostaticLocalFE.h:371
quadrature::QuadratureValuesContainer< ValueType, memorySpace > * d_potentialHamQuadMemspace
Definition: ElectrostaticLocalFE.h:354
RealType getEnergy() const override
Definition: ElectrostaticLocalFE.t.cpp:2672
std::shared_ptr< const basis::FEBasisManager< ValueTypeBasisCoeff, ValueTypeBasisData, memorySpaceHost, dim > > d_feBMTotalCharge
Definition: ElectrostaticLocalFE.h:387
quadrature::QuadratureValuesContainer< RealType, memorySpaceHost > d_atomicElectronChargeDensity
Definition: ElectrostaticLocalFE.h:336
bool d_isDeltaRhoSolve
Definition: ElectrostaticLocalFE.h:317
Definition: LinAlgOpContext.h:52
An class template to encapsulate a MultiVector. A MultiVector is a collection of vectors belonging t...
Definition: MultiVector.h:134
Definition: QuadratureValuesContainer.h:39
Provides an interface to print based on whether a certain condition is met or not....
Definition: ConditionalOStream.h:47
Abstract base for scalar functions of a spatial point.
Definition: ScalarSpatialFunction.h:23
MemorySpace
Definition: MemorySpaceType.h:37
dealii includes
Definition: AtomFieldDataSpherical.cpp:31
std::uint64_t size_type
Definition: TypeConfig.h:9
static constexpr utils::MemorySpace memorySpaceHost
Definition: Defaults.h:185
Definition: TypeConfig.h:17