Skip to content

Commit 07ecb61

Browse files
kartickrPhani Motamarri
authored andcommitted
Merged in computeVeffGPU (pull request #683)
Internal XC evaluation: GPU porting XC evaluation Approved-by: Sambit Das Approved-by: Phani Motamarri
2 parents 3b75272 + 52a56b0 commit 07ecb61

36 files changed

+2634
-894
lines changed

CMakeLists.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ SET(TARGET_SRC
103103
./src/excManager/SlaterBasis.cpp
104104
./src/excManager/GaussianBasis.cpp
105105
./src/excManager/hubbardClass.cpp
106+
./src/excManager/exchangeCorrelationFunctionalEvaluatorCPU.cc
106107
./src/poisson/poissonSolverProblem.cc
107108
./src/poisson/MultiVectorPoissonLinearSolverProblem.cpp
108109
./src/helmholtz/kerkerSolverProblem.cc
@@ -253,6 +254,9 @@ SET(DEVICE_SRC
253254
./utils/matrixFreeDeviceKernels.cc
254255
./utils/FEBasisOperationsKernelsInternalDevice.cc
255256
./src/atom/AtomicCenteredNonLocalOperatorKernelsDevice.cc
257+
./src/dftOperator/KohnShamHamiltonianOperatorDeviceKernels.cc
258+
./src/excManager/excManagerDeviceKernels.cc
259+
./src/excManager/exchangeCorrelationFunctionalEvaluatorDevice.cc
256260
)
257261
ELSEIF ("${GPU_LANG}" STREQUAL "hip")
258262
SET(DEVICE_SRC
@@ -272,6 +276,9 @@ SET(DEVICE_SRC
272276
./utils/matrixFreeDeviceKernels.cc
273277
./utils/FEBasisOperationsKernelsInternalDevice.cc
274278
./src/atom/AtomicCenteredNonLocalOperatorKernelsDevice.cc
279+
./src/dftOperator/KohnShamHamiltonianOperatorDeviceKernels.cc
280+
./src/excManager/excManagerDeviceKernels.cc
281+
./src/excManager/exchangeCorrelationFunctionalEvaluatorDevice.cc
275282
)
276283
ELSEIF ("${GPU_LANG}" STREQUAL "sycl")
277284
SET(DEVICE_SRC
@@ -291,6 +298,9 @@ SET(DEVICE_SRC
291298
./utils/matrixFreeDeviceKernels.cc
292299
./utils/FEBasisOperationsKernelsInternalDevice.cc
293300
./src/atom/AtomicCenteredNonLocalOperatorKernelsDevice.cc
301+
./src/dftOperator/KohnShamHamiltonianOperatorDeviceKernels.cc
302+
./src/excManager/excManagerDeviceKernels.cc
303+
./src/excManager/exchangeCorrelationFunctionalEvaluatorDevice.cc
294304
)
295305

296306
ENDIF()

include/AuxDensityMatrix.h

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,24 +46,31 @@ namespace dftfe
4646
virtual void
4747
applyLocalOperations(
4848
const std::pair<dftfe::uInt, dftfe::uInt> &quadIndexRange,
49-
std::unordered_map<DensityDescriptorDataAttributes, std::vector<double>>
49+
std::unordered_map<
50+
DensityDescriptorDataAttributes,
51+
dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>>
5052
&densityData) = 0;
5153

5254

5355

5456
virtual void
5557
applyLocalOperations(
5658
const std::pair<dftfe::uInt, dftfe::uInt> &quadIndexRange,
57-
std::unordered_map<WfcDescriptorDataAttributes, std::vector<double>>
59+
std::unordered_map<
60+
WfcDescriptorDataAttributes,
61+
dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>>
5862
&wfcData) = 0;
5963

6064
/**
6165
* @brief Compute aux basis overlap matrix batchwise contribution from
6266
* supplied set of quadrature points and their associated weights
6367
*/
6468
virtual void
65-
evalOverlapMatrixStart(const std::vector<double> &quadpts,
66-
const std::vector<double> &quadWt) = 0;
69+
evalOverlapMatrixStart(
70+
const dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>
71+
&quadpts,
72+
const dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>
73+
&quadWt) = 0;
6774

6875
/**
6976
* @brief for MPI accumulation
@@ -79,7 +86,9 @@ namespace dftfe
7986
projectDensityMatrixStart(
8087
const std::unordered_map<std::string, std::vector<dataTypes::number>>
8188
&projectionInputsDataType,
82-
const std::unordered_map<std::string, std::vector<double>>
89+
const std::unordered_map<
90+
std::string,
91+
dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>>
8392
&projectionInputsReal,
8493
const dftfe::Int iSpin) = 0;
8594

@@ -95,7 +104,9 @@ namespace dftfe
95104
*/
96105
virtual void
97106
projectDensityStart(
98-
const std::unordered_map<std::string, std::vector<double>>
107+
const std::unordered_map<
108+
std::string,
109+
dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>>
99110
&projectionInputs) = 0;
100111

101112
/**

include/AuxDensityMatrixFE.h

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,27 @@ namespace dftfe
2727
void
2828
applyLocalOperations(
2929
const std::pair<dftfe::uInt, dftfe::uInt> &quadIndexRange,
30-
std::unordered_map<DensityDescriptorDataAttributes, std::vector<double>>
30+
std::unordered_map<
31+
DensityDescriptorDataAttributes,
32+
dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>>
3133
&densityData) override;
3234

3335

3436

3537
void
3638
applyLocalOperations(
3739
const std::pair<dftfe::uInt, dftfe::uInt> &quadIndexRange,
38-
std::unordered_map<WfcDescriptorDataAttributes, std::vector<double>>
40+
std::unordered_map<
41+
WfcDescriptorDataAttributes,
42+
dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>>
3943
&wfcData) override;
4044

4145
void
42-
evalOverlapMatrixStart(const std::vector<double> &quadpts,
43-
const std::vector<double> &quadWt) override;
46+
evalOverlapMatrixStart(
47+
const dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>
48+
&quadpts,
49+
const dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>
50+
&quadWt) override;
4451

4552
void
4653
evalOverlapMatrixEnd(const MPI_Comm &mpiComm) override;
@@ -49,7 +56,9 @@ namespace dftfe
4956
projectDensityMatrixStart(
5057
const std::unordered_map<std::string, std::vector<dataTypes::number>>
5158
&projectionInputsDataType,
52-
const std::unordered_map<std::string, std::vector<double>>
59+
const std::unordered_map<
60+
std::string,
61+
dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>>
5362
&projectionInputsReal,
5463
const dftfe::Int iSpin) override;
5564

@@ -79,7 +88,9 @@ namespace dftfe
7988
*/
8089
void
8190
projectDensityStart(
82-
const std::unordered_map<std::string, std::vector<double>>
91+
const std::unordered_map<
92+
std::string,
93+
dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>>
8394
&projectionInputs) override;
8495

8596
void
@@ -97,17 +108,27 @@ namespace dftfe
97108

98109
const std::vector<std::vector<double>> *d_fractionalOccupancies;
99110

100-
std::vector<double> d_densityValsTotalAllQuads;
101-
std::vector<double> d_densityValsSpinUpAllQuads;
102-
std::vector<double> d_densityValsSpinDownAllQuads;
103-
std::vector<double> d_gradDensityValsSpinUpAllQuads;
104-
std::vector<double> d_gradDensityValsSpinDownAllQuads;
105-
std::vector<double> d_tauValsTotalAllQuads;
106-
std::vector<double> d_tauValsSpinUpAllQuads;
107-
std::vector<double> d_tauValsSpinDownAllQuads;
108-
109-
std::vector<double> d_quadPointsAll;
110-
std::vector<double> d_quadWeightsAll;
111+
dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>
112+
d_densityValsTotalAllQuads;
113+
dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>
114+
d_densityValsSpinUpAllQuads;
115+
dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>
116+
d_densityValsSpinDownAllQuads;
117+
dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>
118+
d_gradDensityValsSpinUpAllQuads;
119+
dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>
120+
d_gradDensityValsSpinDownAllQuads;
121+
dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>
122+
d_tauValsTotalAllQuads;
123+
dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>
124+
d_tauValsSpinUpAllQuads;
125+
dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>
126+
d_tauValsSpinDownAllQuads;
127+
128+
dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>
129+
d_quadPointsAll;
130+
dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>
131+
d_quadWeightsAll;
111132
};
112133
} // namespace dftfe
113134

include/ExcDFTPlusU.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,13 @@ namespace dftfe
8888
computeRhoTauDependentXCData(
8989
AuxDensityMatrix<memorySpace> &auxDensityMatrix,
9090
const std::pair<dftfe::uInt, dftfe::uInt> &quadIndexRange,
91-
std::unordered_map<xcRemainderOutputDataAttributes, std::vector<double>>
91+
std::unordered_map<
92+
xcRemainderOutputDataAttributes,
93+
dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>>
9294
&xDataOut,
93-
std::unordered_map<xcRemainderOutputDataAttributes, std::vector<double>>
95+
std::unordered_map<
96+
xcRemainderOutputDataAttributes,
97+
dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>>
9498
&cDataout) const override;
9599
void
96100
checkInputOutputDataAttributesConsistency(

include/ExcSSDFunctionalBaseClass.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,9 +191,13 @@ namespace dftfe
191191
computeRhoTauDependentXCData(
192192
AuxDensityMatrix<memorySpace> &auxDensityMatrix,
193193
const std::pair<dftfe::uInt, dftfe::uInt> &quadIndexRange,
194-
std::unordered_map<xcRemainderOutputDataAttributes, std::vector<double>>
194+
std::unordered_map<
195+
xcRemainderOutputDataAttributes,
196+
dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>>
195197
&xDataOut,
196-
std::unordered_map<xcRemainderOutputDataAttributes, std::vector<double>>
198+
std::unordered_map<
199+
xcRemainderOutputDataAttributes,
200+
dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>>
197201
&cDataout) const = 0;
198202

199203

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
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+
#ifndef kohnShamHamiltonianOperatorDeviceKernels_H_
19+
#define kohnShamHamiltonianOperatorDeviceKernels_H_
20+
21+
22+
#include <DataTypeOverloads.h>
23+
#include <DeviceAPICalls.h>
24+
#include <DeviceDataTypeOverloads.h>
25+
#include <DeviceTypeConfig.h>
26+
#include <DeviceKernelLauncherHelpers.h>
27+
#include <MemoryStorage.h>
28+
#include <memory>
29+
namespace dftfe
30+
{
31+
namespace internal
32+
{
33+
template <dftfe::utils::MemorySpace memorySpace>
34+
void
35+
computeVeffJxWEntries(
36+
const std::pair<dftfe::uInt, dftfe::uInt> cellRange,
37+
const dftfe::uInt numQuadsPerCell,
38+
const dftfe::utils::MemoryStorage<double, memorySpace> &phiVector,
39+
const dftfe::utils::MemoryStorage<double, memorySpace> &pdecVector,
40+
const dftfe::utils::MemoryStorage<double, memorySpace> &pdexVector,
41+
const dftfe::utils::MemoryStorage<double, memorySpace> &jxwVector,
42+
dftfe::utils::MemoryStorage<double, memorySpace> &VeffJxW);
43+
44+
template <dftfe::utils::MemorySpace memorySpace>
45+
void
46+
computeInvJacderExcWithSigmaTimesGradRhoJxWEntries(
47+
const std::pair<dftfe::uInt, dftfe::uInt> cellRange,
48+
const dftfe::uInt numQuadsPerCell,
49+
const dftfe::Int spinIndex,
50+
const dftfe::Int cellsTypeFlag,
51+
const dftfe::utils::MemoryStorage<double, memorySpace> &pdecVector,
52+
const dftfe::utils::MemoryStorage<double, memorySpace> &pdexVector,
53+
const dftfe::utils::MemoryStorage<double, memorySpace> &jxwVector,
54+
const dftfe::utils::MemoryStorage<double, memorySpace>
55+
&invJacobianEntries,
56+
const dftfe::utils::MemoryStorage<double, memorySpace>
57+
&gradientRhoSpinIndex,
58+
const dftfe::utils::MemoryStorage<double, memorySpace>
59+
&gradientRhoOtherSpinIndex,
60+
dftfe::utils::MemoryStorage<double, memorySpace>
61+
&invJacderExcWithSigmaTimesGradRhoJxW);
62+
63+
template <dftfe::utils::MemorySpace memorySpace>
64+
void
65+
computeHalfInvJacinvJacderExcWithTauJxWEntries(
66+
const std::pair<dftfe::uInt, dftfe::uInt> cellRange,
67+
const dftfe::uInt numQuadsPerCell,
68+
const dftfe::Int cellsTypeFlag,
69+
const dftfe::utils::MemoryStorage<double, memorySpace> &pdecVector,
70+
const dftfe::utils::MemoryStorage<double, memorySpace> &pdexVector,
71+
const dftfe::utils::MemoryStorage<double, memorySpace> &jxwVector,
72+
const dftfe::utils::MemoryStorage<double, memorySpace>
73+
&invJacobianEntries,
74+
dftfe::utils::MemoryStorage<double, memorySpace>
75+
&invJacinvJacderExcWithTauJxW);
76+
template <dftfe::utils::MemorySpace memorySpace>
77+
void
78+
computeKPointDependenderExcWithTauJxWEntries(
79+
const std::pair<dftfe::uInt, dftfe::uInt> cellRange,
80+
const dftfe::uInt numQuadsPerCell,
81+
const dftfe::Int cellsTypeFlag,
82+
const dftfe::uInt offset,
83+
const dftfe::utils::MemoryStorage<double, memorySpace> &kPointCoordinate,
84+
const dftfe::utils::MemoryStorage<double, memorySpace> &pdecVector,
85+
const dftfe::utils::MemoryStorage<double, memorySpace> &pdexVector,
86+
const dftfe::utils::MemoryStorage<double, memorySpace> &jxwVector,
87+
const dftfe::utils::MemoryStorage<double, memorySpace>
88+
&invJacobianEntries,
89+
dftfe::utils::MemoryStorage<double, memorySpace>
90+
&halfKSquareTimesDerExcwithTauJxW,
91+
dftfe::utils::MemoryStorage<double, memorySpace>
92+
&invJacKpointTimesderExcwithTauJxW);
93+
}; // namespace internal
94+
} // namespace dftfe
95+
#endif

include/dftParameters.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ namespace dftfe
5252
std::string modelXCInputFile;
5353
std::string auxBasisTypeXC;
5454
std::string auxBasisDataXC;
55+
bool useLiXCForXCEvaluation;
5556

5657
double radiusAtomBall, mixingParameter, spinMixingEnhancementFactor;
5758
bool adaptAndersonMixingParameter;

include/excDensityGGAClass.h

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,15 @@ namespace dftfe
2626
class excDensityGGAClass : public ExcSSDFunctionalBaseClass<memorySpace>
2727
{
2828
public:
29-
excDensityGGAClass(std::shared_ptr<xc_func_type> funcXPtr,
30-
std::shared_ptr<xc_func_type> funcCPtr);
29+
excDensityGGAClass(std::shared_ptr<xc_func_type> &funcXPtr,
30+
std::shared_ptr<xc_func_type> &funcCPtr,
31+
const bool useLibXC);
3132

3233

33-
excDensityGGAClass(std::shared_ptr<xc_func_type> funcXPtr,
34-
std::shared_ptr<xc_func_type> funcCPtr,
35-
std::string modelXCInputFile);
34+
excDensityGGAClass(std::shared_ptr<xc_func_type> &funcXPtr,
35+
std::shared_ptr<xc_func_type> &funcCPtr,
36+
std::string modelXCInputFile,
37+
const bool useLibXC);
3638

3739

3840
~excDensityGGAClass();
@@ -43,9 +45,13 @@ namespace dftfe
4345
computeRhoTauDependentXCData(
4446
AuxDensityMatrix<memorySpace> &auxDensityMatrix,
4547
const std::pair<dftfe::uInt, dftfe::uInt> &quadIndexRange,
46-
std::unordered_map<xcRemainderOutputDataAttributes, std::vector<double>>
48+
std::unordered_map<
49+
xcRemainderOutputDataAttributes,
50+
dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>>
4751
&xDataOut,
48-
std::unordered_map<xcRemainderOutputDataAttributes, std::vector<double>>
52+
std::unordered_map<
53+
xcRemainderOutputDataAttributes,
54+
dftfe::utils::MemoryStorage<double, dftfe::utils::MemorySpace::HOST>>
4955
&cDataout) const override;
5056
void
5157
checkInputOutputDataAttributesConsistency(
@@ -105,6 +111,7 @@ namespace dftfe
105111
std::shared_ptr<xc_func_type> d_funcCPtr;
106112
std::vector<double> d_spacingFDStencil;
107113
dftfe::uInt d_vxcDivergenceTermFDStencilSize;
114+
bool d_useLibXC; ///< Flag to indicate whether to use libxc or not
108115
};
109116
} // namespace dftfe
110117
#endif // DFTFE_EXCDENSITYGGACLASS_H

0 commit comments

Comments
 (0)