31#ifndef dftefe_SphericalDataNumericalDeviceKernels_h
32#define dftefe_SphericalDataNumericalDeviceKernels_h
48 template <dftefe::utils::MemorySpace memorySpace>
57 , d_polarAngleTolerance(1e-12)
58 , d_cutoffTolerance(1e-12)
59 , d_radiusTolerance(1e-10)
65 template <dftefe::utils::MemorySpace memorySpace>
74 double polarAngleTolerance,
75 double cutoffTolerance,
76 double radiusTolerance)
77 : d_radialSpline(radialSpline)
81 , d_constant(constant)
96 template <dftefe::utils::MemorySpace memorySpace>
100 const double *origin)
const
102 double shifted[3] = {point[0] - origin[0],
103 point[1] - origin[1],
104 point[2] - origin[2]};
106 double r, theta, phi;
113 const double radialValue = d_radialSpline.eval(r);
115 const double plmVal = plm(d_l, d_mEff, cos(theta));
116 const double qm =
Qm(d_m, phi);
118 return radialValue * cutoffValue * d_constant * plmVal * qm;
127 template <dftefe::utils::MemorySpace memorySpace>
131 const double *origin,
134 double shifted[3] = {point[0] - origin[0],
135 point[1] - origin[1],
136 point[2] - origin[2]};
138 double r, theta, phi;
150 const double cosTheta = cos(theta);
151 const double sinTheta = sin(theta);
152 const double cosPhi = cos(phi);
153 const double sinPhi = sin(phi);
155 const double radialValue = d_radialSpline.eval(r);
156 const double radialDeriv = d_radialSpline.deriv(1, r);
158 const double cutoffDeriv =
161 const double plmVal = plm(d_l, d_mEff, cosTheta);
162 const double dPlmVal = dplmDTheta(d_l, d_mEff, cosTheta);
163 const double qm =
Qm(d_m, phi);
165 const double Ylm = d_constant * plmVal * qm;
166 const double dYlmDTheta = d_constant * dPlmVal * qm;
168 double dYlmDPhiBysinTheta = 0.0;
171 const double d2PlmVal = d2plmDTheta2(d_l, d_mEff, cosTheta);
172 const double dqm =
dQmDPhi(d_m, phi);
173 dYlmDPhiBysinTheta = d_constant *
174 (sinTheta * d2PlmVal + cosTheta * dPlmVal +
175 sinTheta * (double)(d_l * (d_l + 1)) * plmVal) *
176 (1.0 / ((double)d_m * (
double)d_m)) * dqm;
180 (radialDeriv * cutoffValue + cutoffDeriv * radialValue) * Ylm;
181 double dValueDThetaByr = (radialValue / r) * cutoffValue * dYlmDTheta;
182 double dValueDPhiByrsinTheta =
183 (radialValue / r) * cutoffValue * dYlmDPhiBysinTheta;
185 if (r < 1e-4 && d_l > 0)
187 dValueDThetaByr = dValueDR * dYlmDTheta;
188 dValueDPhiByrsinTheta = dValueDR * dYlmDPhiBysinTheta;
191 grad[0] = dValueDR * (sinTheta * cosPhi) +
192 dValueDThetaByr * (cosTheta * cosPhi) -
193 sinPhi * dValueDPhiByrsinTheta;
194 grad[1] = dValueDR * (sinTheta * sinPhi) +
195 dValueDThetaByr * (cosTheta * sinPhi) +
196 cosPhi * dValueDPhiByrsinTheta;
197 grad[2] = dValueDR * cosTheta - dValueDThetaByr * sinTheta;
#define DFTEFE_HOST_DEVICE_FUNC
Definition: DeviceKernelLauncherHelpers.h:306
Func()
Definition: SphericalDataNumericalKernels.h:49
DFTEFE_HOST_DEVICE_FUNC double getValue(const double *point, const double *origin) const
Definition: SphericalDataNumericalKernels.h:98
DFTEFE_HOST_DEVICE_FUNC void getGradientValue(const double *point, const double *origin, double *grad) const
Definition: SphericalDataNumericalKernels.h:129
double d_smoothness
Definition: SphericalDataNumerical.h:209
double d_cutoffTolerance
Definition: SphericalDataNumerical.h:212
double d_radiusTolerance
Definition: SphericalDataNumerical.h:213
double d_cutoff
Definition: SphericalDataNumerical.h:208
double d_polarAngleTolerance
Definition: SphericalDataNumerical.h:211
DFTEFE_HOST_DEVICE_FUNC double smoothCutoffDerivative(const double x, const double r, const double d, const double tolerance)
Definition: SmoothCutoffFunctions.h:33
void convertCartesianToSpherical(const utils::Point &x, double &r, double &theta, double &phi, double polarAngleTolerance)
Definition: SphericalHarmonicFunctions.cpp:251
DFTEFE_HOST_DEVICE_FUNC double smoothCutoffValue(const double x, const double r, const double d)
Definition: SmoothCutoffFunctions.h:23
DFTEFE_HOST_DEVICE_FUNC double dQmDPhi(const int m, const double phi)
Definition: SphericalHarmonicFunctions.h:319
DFTEFE_HOST_DEVICE_FUNC double Qm(const int m, const double phi)
Definition: SphericalHarmonicFunctions.h:306
dealii includes
Definition: AtomFieldDataSpherical.cpp:31