DFT-EFE
 
Loading...
Searching...
No Matches
KohnShamDFT.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 dftefeKohnShamDFT_h
27#define dftefeKohnShamDFT_h
28
29#include <variant>
32#include <ksdft/KineticFE.h>
38#include <ksdft/RDM1FE.h>
40#include <ksdft/MixingScheme.h>
41#include <ksdft/RDM1Mixing.h>
42#include <utils/Profiler.h>
46
47namespace dftefe
48{
49 namespace ksdft
50 {
51 template <typename ValueTypeElectrostaticsCoeff,
52 typename ValueTypeElectrostaticsBasis,
53 typename ValueTypeWaveFunctionCoeff,
54 typename ValueTypeWaveFunctionBasis,
55 utils::MemorySpace memorySpace,
56 size_type dim>
58 {
59 public:
60 using HamiltonianPtrVariant = std::variant<
61 std::shared_ptr<Hamiltonian<float, memorySpace>>,
62 std::shared_ptr<Hamiltonian<double, memorySpace>>,
63 std::shared_ptr<Hamiltonian<std::complex<float>, memorySpace>>,
64 std::shared_ptr<Hamiltonian<std::complex<double>, memorySpace>>>;
65
67 linearAlgebra::blasLapack::scalar_type<ValueTypeElectrostaticsBasis,
68 ValueTypeWaveFunctionBasis>;
70 linearAlgebra::blasLapack::scalar_type<ValueTypeElectrostaticsCoeff,
71 ValueTypeWaveFunctionCoeff>;
72 using ValueType =
76 using OpContext = typename linearAlgebra::HermitianIterativeEigenSolver<
79 memorySpace>::OpContext;
80
81 public:
82 // used if analytical vself canellation route taken
84 /* Atom related info */
85 const std::vector<utils::Point> &atomCoordinates,
86 const std::vector<double> & atomCharges,
87 const double & smearedChargeRadius,
88 const size_type numElectrons,
89 /* SCF related info */
90 const size_type numWantedEigenvalues,
91 const double smearingTemperature,
92 const double fermiEnergyTolerance,
93 const double fracOccupancyTolerance,
94 const double eigenSolveResidualTolerance,
95 const double scfDensityResidualNormTolerance,
96 const size_type maxChebyshevFilterPass,
97 const size_type maxSCFIter,
98 const bool evaluateEnergyEverySCF,
99 /* Mixing related info */
100 const size_type mixingHistory,
101 const double mixingParameter,
102 const bool isAdaptiveAndersonMixingParameter,
103 /* Electron density related info */
105 &atomicElectronicChargeDensityFunction,
106 /* Basis related info */
107 /* Field boundary */
108 std::shared_ptr<
109 const basis::FEBasisManager<ValueTypeElectrostaticsCoeff,
110 ValueTypeElectrostaticsBasis,
112 dim>> feBMTotalCharge,
113 std::shared_ptr<const basis::FEBasisManager<ValueTypeWaveFunctionCoeff,
114 ValueTypeWaveFunctionBasis,
115 memorySpace,
116 dim>> feBMWaveFn,
117 /* Field data storages poisson solves*/
118 std::shared_ptr<
119 const basis::FEBasisDataStorage<ValueTypeElectrostaticsBasis,
121 feBDTotalChargeStiffnessMatrix,
122 std::shared_ptr<
123 const basis::FEBasisDataStorage<ValueTypeElectrostaticsBasis,
125 feBDNuclearChargeRhs,
126 std::shared_ptr<
127 const basis::FEBasisDataStorage<ValueTypeElectrostaticsBasis,
129 feBDElectronicChargeRhs,
130 /* Field data storages eigen solve*/
131 std::shared_ptr<
132 const basis::FEBasisDataStorage<ValueTypeWaveFunctionBasis,
133 memorySpace>> feBDKineticHamiltonian,
134 std::shared_ptr<
135 const basis::FEBasisDataStorage<ValueTypeWaveFunctionBasis,
136 memorySpace>>
137 feBDElectrostaticsHamiltonian,
138 std::shared_ptr<
139 const basis::FEBasisDataStorage<ValueTypeWaveFunctionBasis,
140 memorySpace>> feBDEXCHamiltonian,
141 /* PSP/AE related info */
142 const utils::ScalarSpatialFunctionReal &externalPotentialFunction,
143 /* exc type */
144 const std::string &xcType,
145 /* linAgOperations Context*/
147 linAlgOpContext,
148 /* basis overlap related info */
149 const OpContext &MContextForInv =
152 memorySpace>(),
153 const OpContext &MContext =
156 memorySpace>(),
157 const OpContext &MInvContext =
160 memorySpace>(),
161 bool isResidualChebyshevFilter = true,
162 const std::vector<double> & atomMagZFactors = {},
164 bool isGHEP = true,
167 /* If 0 (default), the Chebyshev polynomial degree is computed each
168 * SCF iteration from CHEBY_ORDER_LOOKUP (see
169 * ksdft::LinearEigenSolverDefaults); if > 0, it is pinned to this
170 * value for the whole run. */
171 const size_type chebyshevPolynomialDegree = 0,
172 const double spinMixingEnhancementFactor =
174
175
176 // used if numerical poisson solve vself canellation route taken
178 /* Atom related info */
179 const std::vector<utils::Point> &atomCoordinates,
180 const std::vector<double> & atomCharges,
181 const double & smearedChargeRadius,
182 const size_type numElectrons,
183 /* SCF related info */
184 const size_type numWantedEigenvalues,
185 const double smearingTemperature,
186 const double fermiEnergyTolerance,
187 const double fracOccupancyTolerance,
188 const double eigenSolveResidualTolerance,
189 const double scfDensityResidualNormTolerance,
190 const size_type maxChebyshevFilterPass,
191 const size_type maxSCFIter,
192 const bool evaluateEnergyEverySCF,
193 /* Mixing related info */
194 const size_type mixingHistory,
195 const double mixingParameter,
196 const bool isAdaptiveAndersonMixingParameter,
197 /* Electron density related info */
199 &atomicElectronicChargeDensityFunction,
200 /* Basis related info */
201 /* Field boundary */
202 std::shared_ptr<
203 const basis::FEBasisManager<ValueTypeElectrostaticsCoeff,
204 ValueTypeElectrostaticsBasis,
206 dim>> feBMTotalCharge,
207 std::shared_ptr<const basis::FEBasisManager<ValueTypeWaveFunctionCoeff,
208 ValueTypeWaveFunctionBasis,
209 memorySpace,
210 dim>> feBMWaveFn,
211 /* Field data storages poisson solves */
212 std::shared_ptr<
213 const basis::FEBasisDataStorage<ValueTypeElectrostaticsBasis,
215 feBDTotalChargeStiffnessMatrix,
216 std::shared_ptr<
217 const basis::FEBasisDataStorage<ValueTypeElectrostaticsBasis,
219 feBDNuclearChargeRhs,
220 std::shared_ptr<
221 const basis::FEBasisDataStorage<ValueTypeElectrostaticsBasis,
223 feBDElectronicChargeRhs,
224 std::shared_ptr<
225 const basis::FEBasisDataStorage<ValueTypeElectrostaticsBasis,
227 feBDNuclChargeStiffnessMatrixNumSol,
228 std::shared_ptr<
229 const basis::FEBasisDataStorage<ValueTypeElectrostaticsBasis,
231 feBDNuclChargeRhsNumSol,
232 /* Field data storages eigen solve*/
233 std::shared_ptr<
234 const basis::FEBasisDataStorage<ValueTypeWaveFunctionBasis,
235 memorySpace>> feBDKineticHamiltonian,
236 std::shared_ptr<
237 const basis::FEBasisDataStorage<ValueTypeWaveFunctionBasis,
238 memorySpace>>
239 feBDElectrostaticsHamiltonian,
240 std::shared_ptr<
241 const basis::FEBasisDataStorage<ValueTypeWaveFunctionBasis,
242 memorySpace>> feBDEXCHamiltonian,
243 /* PSP/AE related info */
244 const utils::ScalarSpatialFunctionReal &externalPotentialFunction,
245 /* exc type */
246 const std::string &xcType,
247 /* linAgOperations Context*/
249 linAlgOpContext,
250 /* basis overlap related info */
251 const OpContext &MContextForInv =
254 memorySpace>(),
255 const OpContext &MContext =
258 memorySpace>(),
259 const OpContext &MInvContext =
262 memorySpace>(),
263 bool isResidualChebyshevFilter = true,
264 const std::vector<double> & atomMagZFactors = {},
266 bool isGHEP = true,
269 /* If 0 (default), the Chebyshev polynomial degree is computed each
270 * SCF iteration from CHEBY_ORDER_LOOKUP (see
271 * ksdft::LinearEigenSolverDefaults); if > 0, it is pinned to this
272 * value for the whole run. */
273 const size_type chebyshevPolynomialDegree = 0,
274 const double spinMixingEnhancementFactor =
276
277 // used if delta rho approach is taken with phi total from 1D KS solve
278 // with analytical vself energy cancellation
279 KohnShamDFT(
280 /* Atom related info */
281 const std::vector<utils::Point> &atomCoordinates,
282 const std::vector<double> & atomCharges,
283 const std::vector<std::string> & atomSymbolVec,
284 const double & smearedChargeRadius,
285 const size_type numElectrons,
286 /* SCF related info */
287 const size_type numWantedEigenvalues,
288 const double smearingTemperature,
289 const double fermiEnergyTolerance,
290 const double fracOccupancyTolerance,
291 const double eigenSolveResidualTolerance,
292 const double scfDensityResidualNormTolerance,
293 const size_type maxChebyshevFilterPass,
294 const size_type maxSCFIter,
295 const bool evaluateEnergyEverySCF,
296 /* Mixing related info */
297 const size_type mixingHistory,
298 const double mixingParameter,
299 const bool isAdaptiveAndersonMixingParameter,
300 /* Atomic Field for delta rho ; Here vTotal atomic scalar sp fn.*/
302 &atomicTotalElectroPotentialFunction,
304 &atomicElectronicChargeDensityFunction,
305 /* Field boundary */
306 std::shared_ptr<
307 const basis::FEBasisManager<ValueTypeElectrostaticsCoeff,
308 ValueTypeElectrostaticsBasis,
310 dim>> feBMTotalCharge,
311 std::shared_ptr<const basis::FEBasisManager<ValueTypeWaveFunctionCoeff,
312 ValueTypeWaveFunctionBasis,
313 memorySpace,
314 dim>> feBMWaveFn,
315 /* Field data storages poisson solves*/
316 std::shared_ptr<
317 const basis::FEBasisDataStorage<ValueTypeElectrostaticsBasis,
319 feBDTotalChargeStiffnessMatrix,
320 std::shared_ptr<
321 const basis::FEBasisDataStorage<ValueTypeElectrostaticsBasis,
323 feBDNuclearChargeRhs,
324 std::shared_ptr<
325 const basis::FEBasisDataStorage<ValueTypeElectrostaticsBasis,
327 feBDElectronicChargeRhs,
328 /* Field data storages eigen solve*/
329 std::shared_ptr<
330 const basis::FEBasisDataStorage<ValueTypeWaveFunctionBasis,
331 memorySpace>> feBDKineticHamiltonian,
332 std::shared_ptr<
333 const basis::FEBasisDataStorage<ValueTypeWaveFunctionBasis,
334 memorySpace>>
335 feBDElectrostaticsHamiltonian,
336 std::shared_ptr<
337 const basis::FEBasisDataStorage<ValueTypeWaveFunctionBasis,
338 memorySpace>> feBDEXCHamiltonian,
339 /* PSP/AE related info */
340 const utils::ScalarSpatialFunctionReal &externalPotentialFunction,
341 /* exc type */
342 const std::string &xcType,
343 /* linAgOperations Context*/
345 linAlgOpContext,
346 /* basis overlap related info */
347 const OpContext &MContextForInv =
350 memorySpace>(),
351 const OpContext &MContext =
354 memorySpace>(),
355 const OpContext &MInvContext =
358 memorySpace>(),
359 bool isResidualChebyshevFilter = true,
360 /* TCI related info */
362 const std::vector<double> & atomMagZFactors = {},
364 bool isGHEP = true,
367 /* If 0 (default), the Chebyshev polynomial degree is computed each
368 * SCF iteration from CHEBY_ORDER_LOOKUP (see
369 * ksdft::LinearEigenSolverDefaults); if > 0, it is pinned to this
370 * value for the whole run. */
371 const size_type chebyshevPolynomialDegree = 0,
372 const double spinMixingEnhancementFactor =
374
376 KohnShamDFT(
377 /* Atom related info */
378 const std::vector<utils::Point> &atomCoordinates,
379 const std::vector<double> & atomCharges,
380 const std::vector<std::string> & atomSymbolVec,
381 const double & smearedChargeRadius,
382 const size_type numElectrons,
383 /* SCF related info */
384 const size_type numWantedEigenvalues,
385 const double smearingTemperature,
386 const double fermiEnergyTolerance,
387 const double fracOccupancyTolerance,
388 const double eigenSolveResidualTolerance,
389 const double scfDensityResidualNormTolerance,
390 const size_type maxChebyshevFilterPass,
391 const size_type maxSCFIter,
392 const bool evaluateEnergyEverySCF,
393 /* Mixing related info */
394 const size_type mixingHistory,
395 const double mixingParameter,
396 const bool isAdaptiveAndersonMixingParameter,
397 /* Electron density related info */
398 const atoms::AtomSuperpositionFunction<memorySpace>
399 &atomicElectronicChargeDensityFunction,
400 /* Basis related info */
401 /* Field boundary */
402 std::shared_ptr<
403 const basis::FEBasisManager<ValueTypeElectrostaticsCoeff,
404 ValueTypeElectrostaticsBasis,
406 dim>> feBMTotalCharge,
407 std::shared_ptr<const basis::FEBasisManager<ValueTypeWaveFunctionCoeff,
408 ValueTypeWaveFunctionBasis,
409 memorySpace,
410 dim>> feBMWaveFn,
411 /* Field data storages poisson solves*/
412 std::shared_ptr<
413 const basis::FEBasisDataStorage<ValueTypeElectrostaticsBasis,
415 feBDTotalChargeStiffnessMatrix,
416 std::shared_ptr<
417 const basis::FEBasisDataStorage<ValueTypeElectrostaticsBasis,
419 feBDNuclearChargeRhs,
420 std::shared_ptr<
421 const basis::FEBasisDataStorage<ValueTypeElectrostaticsBasis,
423 feBDElectronicChargeRhs,
424 /* Field data storages eigen solve*/
425 std::shared_ptr<
426 const basis::FEBasisDataStorage<ValueTypeWaveFunctionBasis,
427 memorySpace>> feBDKineticHamiltonian,
428 std::shared_ptr<
429 const basis::FEBasisDataStorage<ValueTypeWaveFunctionBasis,
430 memorySpace>>
431 feBDElectrostaticsHamiltonian,
432 std::shared_ptr<
433 const basis::FEBasisDataStorage<ValueTypeWaveFunctionBasis,
434 memorySpace>> feBDEXCHamiltonian,
435 /* PSP related info */
436 std::shared_ptr<
437 const basis::FEBasisDataStorage<ValueTypeWaveFunctionBasis,
438 memorySpace>>
439 feBDAtomCenterNonLocalOperator,
440 const std::map<std::string, std::string> &atomSymbolToPSPFilename,
441 /* exc type */
442 const std::string &xcType,
443 /* linAgOperations Context*/
444 std::shared_ptr<linearAlgebra::LinAlgOpContext<memorySpace>>
445 linAlgOpContext,
446 /* basis overlap related info */
447 const OpContext &MContextForInv =
448 linearAlgebra::IdentityOperatorContext<ValueTypeOperator,
450 memorySpace>(),
451 const OpContext &MContext =
452 linearAlgebra::IdentityOperatorContext<ValueTypeOperator,
454 memorySpace>(),
455 const OpContext &MInvContext =
456 linearAlgebra::IdentityOperatorContext<ValueTypeOperator,
458 memorySpace>(),
459 bool isResidualChebyshevFilter = true,
460 const std::vector<double> &atomMagZFactors = {},
462 /* If 0 (default), the Chebyshev polynomial degree is computed each
463 * SCF iteration from CHEBY_ORDER_LOOKUP (see
464 * ksdft::LinearEigenSolverDefaults); if > 0, it is pinned to this
465 * value for the whole run. */
466 const size_type chebyshevPolynomialDegree = 0,
467 const double spinMixingEnhancementFactor =
469
470
471 // used if delta rho with PSP approach is taken with phi total from 1D KS
472 // solve with analytical vself energy cancellation
474 /* Atom related info */
475 const std::vector<utils::Point> &atomCoordinates,
476 const std::vector<double> & atomCharges,
477 const std::vector<std::string> & atomSymbolVec,
478 const double & smearedChargeRadius,
479 const size_type numElectrons,
480 /* SCF related info */
481 const size_type numWantedEigenvalues,
482 const double smearingTemperature,
483 const double fermiEnergyTolerance,
484 const double fracOccupancyTolerance,
485 const double eigenSolveResidualTolerance,
486 const double scfDensityResidualNormTolerance,
487 const size_type maxChebyshevFilterPass,
488 const size_type maxSCFIter,
489 const bool evaluateEnergyEverySCF,
490 /* Mixing related info */
491 const size_type mixingHistory,
492 const double mixingParameter,
493 const bool isAdaptiveAndersonMixingParameter,
494 /* Atomic Field for delta rho ; Here vTotal atomic scalar sp fn.*/
495 const atoms::AtomSuperpositionFunction<memorySpace>
496 &atomicTotalElectroPotentialFunction,
497 const atoms::AtomSuperpositionFunction<memorySpace>
498 &atomicElectronicChargeDensityFunction,
499 /* Field boundary */
500 std::shared_ptr<
501 const basis::FEBasisManager<ValueTypeElectrostaticsCoeff,
502 ValueTypeElectrostaticsBasis,
504 dim>> feBMTotalCharge,
505 std::shared_ptr<const basis::FEBasisManager<ValueTypeWaveFunctionCoeff,
506 ValueTypeWaveFunctionBasis,
507 memorySpace,
508 dim>> feBMWaveFn,
509 /* Field data storages poisson solves*/
510 std::shared_ptr<
511 const basis::FEBasisDataStorage<ValueTypeElectrostaticsBasis,
513 feBDTotalChargeStiffnessMatrix,
514 std::shared_ptr<
515 const basis::FEBasisDataStorage<ValueTypeElectrostaticsBasis,
517 feBDNuclearChargeRhs,
518 std::shared_ptr<
519 const basis::FEBasisDataStorage<ValueTypeElectrostaticsBasis,
521 feBDElectronicChargeRhs,
522 /* Field data storages eigen solve*/
523 std::shared_ptr<
524 const basis::FEBasisDataStorage<ValueTypeWaveFunctionBasis,
525 memorySpace>> feBDKineticHamiltonian,
526 std::shared_ptr<
527 const basis::FEBasisDataStorage<ValueTypeWaveFunctionBasis,
528 memorySpace>>
529 feBDElectrostaticsHamiltonian,
530 std::shared_ptr<
531 const basis::FEBasisDataStorage<ValueTypeWaveFunctionBasis,
532 memorySpace>> feBDEXCHamiltonian,
533 /* PSP related info */
534 std::shared_ptr<
535 const basis::FEBasisDataStorage<ValueTypeWaveFunctionBasis,
536 memorySpace>>
537 feBDAtomCenterNonLocalOperator,
538 const std::map<std::string, std::string> &atomSymbolToPSPFilename,
539 /* exc type */
540 const std::string &xcType,
541 /* linAgOperations Context*/
542 std::shared_ptr<linearAlgebra::LinAlgOpContext<memorySpace>>
543 linAlgOpContext,
544 /* basis overlap related info */
545 const OpContext &MContextForInv =
546 linearAlgebra::IdentityOperatorContext<ValueTypeOperator,
548 memorySpace>(),
549 const OpContext &MContext =
550 linearAlgebra::IdentityOperatorContext<ValueTypeOperator,
552 memorySpace>(),
553 const OpContext &MInvContext =
554 linearAlgebra::IdentityOperatorContext<ValueTypeOperator,
556 memorySpace>(),
557 bool isResidualChebyshevFilter = false,
558 /* TCI related info */
559 const atoms::TCIADataParams &params = TCIADataDefaults::TCIA_PARAMS,
560 const std::vector<double> & atomMagZFactors = {},
562 /* If 0 (default), the Chebyshev polynomial degree is computed each
563 * SCF iteration from CHEBY_ORDER_LOOKUP (see
564 * ksdft::LinearEigenSolverDefaults); if > 0, it is pinned to this
565 * value for the whole run. */
566 const size_type chebyshevPolynomialDegree = 0,
567 const double spinMixingEnhancementFactor =
569
570 ~KohnShamDFT();
571
572 void
573 solve();
574
575 double
577
578 double
580
581 void
583
584 const std::shared_ptr<
585 KohnShamOperatorContextFE<ValueTypeElectrostaticsCoeff,
586 ValueTypeElectrostaticsBasis,
587 ValueTypeWaveFunctionCoeff,
588 ValueTypeWaveFunctionBasis,
589 memorySpace,
590 dim>> &
592 {
594 }
595
596 const std::shared_ptr<KineticFE<ValueTypeWaveFunctionBasis,
597 ValueTypeWaveFunctionCoeff,
598 memorySpace,
599 dim>> &
601 {
602 return d_hamitonianKin;
603 }
604
605 const std::shared_ptr<ElectrostaticFE<ValueTypeElectrostaticsBasis,
606 ValueTypeElectrostaticsCoeff,
607 ValueTypeWaveFunctionBasis,
608 memorySpace,
609 dim>> &
611 {
612 return d_hamitonianElec;
613 }
614
615 const std::shared_ptr<ExchangeCorrelationFE<ValueTypeWaveFunctionBasis,
616 ValueTypeWaveFunctionCoeff,
617 memorySpace,
618 dim>> &
620 {
621 return d_hamitonianXC;
622 }
623
624 private:
627 const double d_SCFTol;
628 std::vector<RealType> d_jxwDataHost;
629 std::shared_ptr<
632 std::shared_ptr<RDM1Spectral<
633 linearAlgebra::blasLapack::scalar_type<ValueTypeWaveFunctionBasis,
634 ValueTypeWaveFunctionCoeff>,
635 memorySpace>>
637 std::shared_ptr<RDM1Mixing<
638 linearAlgebra::blasLapack::scalar_type<ValueTypeWaveFunctionBasis,
639 ValueTypeWaveFunctionCoeff>,
640 memorySpace>>
642 std::shared_ptr<KohnShamOperatorContextFE<ValueTypeElectrostaticsCoeff,
643 ValueTypeElectrostaticsBasis,
644 ValueTypeWaveFunctionCoeff,
645 ValueTypeWaveFunctionBasis,
646 memorySpace,
647 dim>>
649 std::shared_ptr<ExchangeCorrelationFE<ValueTypeWaveFunctionBasis,
650 ValueTypeWaveFunctionCoeff,
651 memorySpace,
652 dim>>
654 std::shared_ptr<ElectrostaticFE<ValueTypeElectrostaticsBasis,
655 ValueTypeElectrostaticsCoeff,
656 ValueTypeWaveFunctionBasis,
657 memorySpace,
658 dim>>
660 std::shared_ptr<KineticFE<ValueTypeWaveFunctionBasis,
661 ValueTypeWaveFunctionCoeff,
662 memorySpace,
663 dim>>
665
666 std::shared_ptr<const basis::FEBasisManager<ValueTypeWaveFunctionCoeff,
667 ValueTypeWaveFunctionBasis,
668 memorySpace,
669 dim>>
671 std::vector<RealType> d_kohnShamEnergies;
678 std::shared_ptr<linearAlgebra::LinAlgOpContext<memorySpace>>
681
682 std::shared_ptr<
683 const basis::FEBasisDataStorage<ValueTypeWaveFunctionBasis,
684 memorySpace>>
686
691
692 std::shared_ptr<ElectrostaticExcFE<ValueTypeElectrostaticsCoeff,
693 ValueTypeElectrostaticsBasis,
694 ValueTypeWaveFunctionCoeff,
695 ValueTypeWaveFunctionBasis,
696 memorySpace,
697 dim>>
701
702 std::shared_ptr<atoms::AtomSphericalDataContainer>
704
706
707 std::shared_ptr<linearAlgebra::ElpaScalapackManager> d_elpaScala;
708 std::shared_ptr<linearAlgebra::LinAlgOpContext<memorySpaceHost>>
711 std::string d_xcType;
712
713 }; // end of KohnShamDFT
714 } // end of namespace ksdft
715} // end of namespace dftefe
716#include "KohnShamDFT.t.cpp"
717#endif // dftefeKohnShamDFT_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: ElectrostaticExcFE.h:54
A derived class of linearAlgebra::OperatorContext to encapsulate the action of a discrete operator on...
Definition: ElectrostaticFE.h:66
Definition: ExchangeCorrelationFE.h:57
Definition: KineticFE.h:52
Definition: KohnShamDFT.h:58
const utils::mpi::MPIComm & d_mpiCommDomain
Definition: KohnShamDFT.h:676
std::vector< RealType > d_kohnShamEnergies
Definition: KohnShamDFT.h:671
std::shared_ptr< RDM1Spectral< linearAlgebra::blasLapack::scalar_type< ValueTypeWaveFunctionBasis, ValueTypeWaveFunctionCoeff >, memorySpace > > d_rdm1Spectral
Definition: KohnShamDFT.h:636
std::shared_ptr< linearAlgebra::ElpaScalapackManager > d_elpaScala
Definition: KohnShamDFT.h:707
utils::Profiler< memorySpace > d_p
Definition: KohnShamDFT.h:689
linearAlgebra::blasLapack::real_type< ValueType > RealType
Definition: KohnShamDFT.h:75
const size_type d_numElectrons
Definition: KohnShamDFT.h:680
double d_smearingTemperature
Definition: KohnShamDFT.h:710
bool d_isOEFEBasis
Definition: KohnShamDFT.h:700
std::shared_ptr< atoms::AtomSphericalDataContainer > d_atomSphericalDataContainerPSP
Definition: KohnShamDFT.h:703
const OpContext * d_MContext
Definition: KohnShamDFT.h:675
const size_type d_numWantedEigenvalues
Definition: KohnShamDFT.h:626
bool d_isSolved
Definition: KohnShamDFT.h:688
std::shared_ptr< const basis::FEBasisManager< ValueTypeWaveFunctionCoeff, ValueTypeWaveFunctionBasis, memorySpace, dim > > d_feBMWaveFn
Definition: KohnShamDFT.h:670
bool d_isONCVNonLocPSP
Definition: KohnShamDFT.h:705
std::string d_xcType
Definition: KohnShamDFT.h:711
bool d_isNlcc
Definition: KohnShamDFT.h:705
MixingScheme< RealType, RealType > d_mixingScheme
Definition: KohnShamDFT.h:677
void printTotalInScopeTimings()
Definition: KohnShamDFT.t.cpp:3942
linearAlgebra::blasLapack::scalar_type< ValueTypeOperator, ValueTypeOperator > ValueType
Definition: KohnShamDFT.h:74
const std::shared_ptr< KineticFE< ValueTypeWaveFunctionBasis, ValueTypeWaveFunctionCoeff, memorySpace, dim > > & getHamitonianKin() const
Definition: KohnShamDFT.h:600
double d_freeEnergy
Definition: KohnShamDFT.h:710
const std::shared_ptr< ExchangeCorrelationFE< ValueTypeWaveFunctionBasis, ValueTypeWaveFunctionCoeff, memorySpace, dim > > & getHamitonianXC() const
Definition: KohnShamDFT.h:619
double getFreeEnergy()
Definition: KohnShamDFT.t.cpp:3922
utils::Profiler< memorySpace > d_pTotal
Definition: KohnShamDFT.h:689
std::vector< RealType > d_jxwDataHost
Definition: KohnShamDFT.h:628
std::shared_ptr< const basis::FEBasisDataStorage< ValueTypeWaveFunctionBasis, memorySpace > > d_feBDEXCHamiltonian
Definition: KohnShamDFT.h:685
bool d_isResidualChebyshevFilter
Definition: KohnShamDFT.h:699
RealType d_groundStateEnergy
Definition: KohnShamDFT.h:687
size_type d_numMaxSCFIter
Definition: KohnShamDFT.h:674
std::shared_ptr< linearAlgebra::LinAlgOpContext< memorySpaceHost > > d_linAlgOpContextHost
Definition: KohnShamDFT.h:709
typename linearAlgebra::HermitianIterativeEigenSolver< ValueTypeOperator, ValueTypeOperand, memorySpace >::OpContext OpContext
Definition: KohnShamDFT.h:79
std::shared_ptr< linearAlgebra::LinAlgOpContext< memorySpace > > d_linAlgOpContext
Definition: KohnShamDFT.h:679
std::shared_ptr< KineticFE< ValueTypeWaveFunctionBasis, ValueTypeWaveFunctionCoeff, memorySpace, dim > > d_hamitonianKin
Definition: KohnShamDFT.h:664
linearAlgebra::blasLapack::scalar_type< ValueTypeElectrostaticsBasis, ValueTypeWaveFunctionBasis > ValueTypeOperator
Definition: KohnShamDFT.h:68
std::shared_ptr< KohnShamEigenSolver< ValueTypeOperator, ValueTypeOperand, memorySpace > > d_ksEigSolve
Definition: KohnShamDFT.h:631
SpinMode d_spinMode
Definition: KohnShamDFT.h:625
bool d_evaluateEnergyEverySCF
Definition: KohnShamDFT.h:673
utils::ConditionalOStream d_rootCout
Definition: KohnShamDFT.h:672
std::shared_ptr< ElectrostaticExcFE< ValueTypeElectrostaticsCoeff, ValueTypeElectrostaticsBasis, ValueTypeWaveFunctionCoeff, ValueTypeWaveFunctionBasis, memorySpace, dim > > d_hamiltonianElectroExc
Definition: KohnShamDFT.h:698
const std::shared_ptr< ElectrostaticFE< ValueTypeElectrostaticsBasis, ValueTypeElectrostaticsCoeff, ValueTypeWaveFunctionBasis, memorySpace, dim > > & getHamitonianElec() const
Definition: KohnShamDFT.h:610
std::variant< std::shared_ptr< Hamiltonian< float, memorySpace > >, std::shared_ptr< Hamiltonian< double, memorySpace > >, std::shared_ptr< Hamiltonian< std::complex< float >, memorySpace > >, std::shared_ptr< Hamiltonian< std::complex< double >, memorySpace > > > HamiltonianPtrVariant
Definition: KohnShamDFT.h:64
const double d_SCFTol
Definition: KohnShamDFT.h:627
void solve()
Definition: KohnShamDFT.t.cpp:3283
KohnShamDFT(const std::vector< utils::Point > &atomCoordinates, const std::vector< double > &atomCharges, const double &smearedChargeRadius, const size_type numElectrons, const size_type numWantedEigenvalues, const double smearingTemperature, const double fermiEnergyTolerance, const double fracOccupancyTolerance, const double eigenSolveResidualTolerance, const double scfDensityResidualNormTolerance, const size_type maxChebyshevFilterPass, const size_type maxSCFIter, const bool evaluateEnergyEverySCF, const size_type mixingHistory, const double mixingParameter, const bool isAdaptiveAndersonMixingParameter, const atoms::AtomSuperpositionFunction< memorySpace > &atomicElectronicChargeDensityFunction, std::shared_ptr< const basis::FEBasisManager< ValueTypeElectrostaticsCoeff, ValueTypeElectrostaticsBasis, memorySpaceHost, dim > > feBMTotalCharge, std::shared_ptr< const basis::FEBasisManager< ValueTypeWaveFunctionCoeff, ValueTypeWaveFunctionBasis, memorySpace, dim > > feBMWaveFn, std::shared_ptr< const basis::FEBasisDataStorage< ValueTypeElectrostaticsBasis, memorySpaceHost > > feBDTotalChargeStiffnessMatrix, std::shared_ptr< const basis::FEBasisDataStorage< ValueTypeElectrostaticsBasis, memorySpaceHost > > feBDNuclearChargeRhs, std::shared_ptr< const basis::FEBasisDataStorage< ValueTypeElectrostaticsBasis, memorySpaceHost > > feBDElectronicChargeRhs, std::shared_ptr< const basis::FEBasisDataStorage< ValueTypeWaveFunctionBasis, memorySpace > > feBDKineticHamiltonian, std::shared_ptr< const basis::FEBasisDataStorage< ValueTypeWaveFunctionBasis, memorySpace > > feBDElectrostaticsHamiltonian, std::shared_ptr< const basis::FEBasisDataStorage< ValueTypeWaveFunctionBasis, memorySpace > > feBDEXCHamiltonian, const utils::ScalarSpatialFunctionReal &externalPotentialFunction, const std::string &xcType, std::shared_ptr< linearAlgebra::LinAlgOpContext< memorySpace > > linAlgOpContext, const OpContext &MContextForInv=linearAlgebra::IdentityOperatorContext< ValueTypeOperator, ValueTypeOperand, memorySpace >(), const OpContext &MContext=linearAlgebra::IdentityOperatorContext< ValueTypeOperator, ValueTypeOperand, memorySpace >(), const OpContext &MInvContext=linearAlgebra::IdentityOperatorContext< ValueTypeOperator, ValueTypeOperand, memorySpace >(), bool isResidualChebyshevFilter=true, const std::vector< double > &atomMagZFactors={}, SpinMode spinMode=SpinMode::Unpolarized, bool isGHEP=true, linearAlgebra::OrthogonalizationType orthoType=linearAlgebra::OrthogonalizationType::CHOLESKY_GRAMSCHMIDT, const size_type chebyshevPolynomialDegree=0, const double spinMixingEnhancementFactor=MixingDefaults::SPIN_MIXING_ENHANCEMENT_FACTOR)
Definition: KohnShamDFT.t.cpp:303
const OpContext * d_MInvContext
Definition: KohnShamDFT.h:675
~KohnShamDFT()
Definition: KohnShamDFT.t.cpp:3266
const std::shared_ptr< KohnShamOperatorContextFE< ValueTypeElectrostaticsCoeff, ValueTypeElectrostaticsBasis, ValueTypeWaveFunctionCoeff, ValueTypeWaveFunctionBasis, memorySpace, dim > > & getHamiltonianOperator() const
Definition: KohnShamDFT.h:591
std::shared_ptr< KohnShamOperatorContextFE< ValueTypeElectrostaticsCoeff, ValueTypeElectrostaticsBasis, ValueTypeWaveFunctionCoeff, ValueTypeWaveFunctionBasis, memorySpace, dim > > d_hamitonianOperator
Definition: KohnShamDFT.h:648
double getGroundStateEnergy()
Definition: KohnShamDFT.t.cpp:3902
std::shared_ptr< RDM1Mixing< linearAlgebra::blasLapack::scalar_type< ValueTypeWaveFunctionBasis, ValueTypeWaveFunctionCoeff >, memorySpace > > d_rdm1Mix
Definition: KohnShamDFT.h:641
CalculationType d_calculationType
Definition: KohnShamDFT.h:690
std::shared_ptr< ExchangeCorrelationFE< ValueTypeWaveFunctionBasis, ValueTypeWaveFunctionCoeff, memorySpace, dim > > d_hamitonianXC
Definition: KohnShamDFT.h:653
linearAlgebra::blasLapack::scalar_type< ValueTypeElectrostaticsCoeff, ValueTypeWaveFunctionCoeff > ValueTypeOperand
Definition: KohnShamDFT.h:71
std::shared_ptr< ElectrostaticFE< ValueTypeElectrostaticsBasis, ValueTypeElectrostaticsCoeff, ValueTypeWaveFunctionBasis, memorySpace, dim > > d_hamitonianElec
Definition: KohnShamDFT.h:659
Definition: KohnShamEigenSolver.h:63
A derived class of linearAlgebra::OperatorContext to encapsulate the action of a discrete Kohn-Sham o...
Definition: KohnShamOperatorContextFE.h:71
static const double SPIN_MIXING_ENHANCEMENT_FACTOR
Setting all the MixingDefaults.
Definition: Defaults.h:208
This class performs the anderson mixing in a variable agnostic way This class takes can take differen...
Definition: MixingScheme.h:72
RDM1 implementation that performs Anderson mixing of the electron density. Derives directly from RDM1...
Definition: RDM1Mixing.h:64
Intermediate abstract class that stores the spectral (eigen) decomposition of the one-particle reduce...
Definition: RDM1Spectral.h:63
static const atoms::TCIADataParams TCIA_PARAMS
Definition: Defaults.h:189
Abstract class to encapsulate the action of a discrete operator on vectors, matrices,...
Definition: IdentityOperatorContext.h:53
Definition: LinAlgOpContext.h:52
Provides an interface to print based on whether a certain condition is met or not....
Definition: ConditionalOStream.h:47
Definition: Profiler.h:50
Abstract base for scalar functions of a spatial point.
Definition: ScalarSpatialFunction.h:23
SpinMode
Definition: KSAttributes.h:55
CalculationType
Definition: KSAttributes.h:66
typeInternal::real_type< ValueType > real_type
Definition: BlasLapackTypedef.h:177
typeInternal::scalar_type< ValueType1, ValueType2 > scalar_type
Definition: BlasLapackTypedef.h:183
OrthogonalizationType
Definition: ChebyshevFilteredEigenSolver.h:47
int MPIComm
Definition: MPITypes.h:84
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:213
Definition: AtomTCIASpline.h:44