25#include <boost/math/distributions/normal.hpp>
26#include <boost/math/special_functions/spherical_harmonic.hpp>
27#include <boost/random/normal_distribution.hpp>
37 std::vector<unsigned int> & globalMasterNodeIdList,
38 unsigned int numMeshPartitions,
39 const MPI_Comm & mpi_communicator)
41 int numberMasterNodesOnLocalProc = masterNodeIdList.size();
43 int *masterNodeIdListSizes =
new int[numMeshPartitions];
45 MPI_Allgather(&numberMasterNodesOnLocalProc,
48 masterNodeIdListSizes,
53 int newMasterNodeIdListSize =
54 std::accumulate(&(masterNodeIdListSizes[0]),
55 &(masterNodeIdListSizes[numMeshPartitions]),
58 globalMasterNodeIdList.resize(newMasterNodeIdListSize);
60 int *mpiOffsets =
new int[numMeshPartitions];
64 for (
int i = 1; i < numMeshPartitions; ++i)
65 mpiOffsets[i] = masterNodeIdListSizes[i - 1] + mpiOffsets[i - 1];
67 MPI_Allgatherv(&(masterNodeIdList[0]),
68 numberMasterNodesOnLocalProc,
70 &(globalMasterNodeIdList[0]),
71 &(masterNodeIdListSizes[0]),
77 delete[] masterNodeIdListSizes;
86 unsigned int numMeshPartitions,
87 const MPI_Comm & mpi_communicator)
90 std::map<int, int>::iterator iter;
92 std::vector<int> localSpreadVec;
94 iter = localMap.begin();
95 while (iter != localMap.end())
97 localSpreadVec.push_back(iter->first);
98 localSpreadVec.push_back(iter->second);
102 int localSpreadVecSize = localSpreadVec.size();
104 int *spreadVecSizes =
new int[numMeshPartitions];
106 MPI_Allgather(&localSpreadVecSize,
114 int globalSpreadVecSize =
115 std::accumulate(&(spreadVecSizes[0]),
116 &(spreadVecSizes[numMeshPartitions]),
119 std::vector<int> globalSpreadVec(globalSpreadVecSize);
121 int *mpiOffsets =
new int[numMeshPartitions];
125 for (
int i = 1; i < numMeshPartitions; ++i)
126 mpiOffsets[i] = spreadVecSizes[i - 1] + mpiOffsets[i - 1];
128 MPI_Allgatherv(&(localSpreadVec[0]),
131 &(globalSpreadVec[0]),
132 &(spreadVecSizes[0]),
137 for (
int i = 0; i < globalSpreadVecSize; i = i + 2)
138 localMap[globalSpreadVec[i]] = globalSpreadVec[i + 1];
141 delete[] spreadVecSizes;
150 const alglib::spline1dinterpolant *spline)
152 splineVal = alglib::spline1dcalc(*spline, radialCoordinate);
161 double & sphericalHarmonicVal)
164 sphericalHarmonicVal =
165 std::sqrt(2.0) * boost::math::spherical_harmonic_i(l, -m, theta, phi);
168 sphericalHarmonicVal =
169 boost::math::spherical_harmonic_r(l, m, theta, phi);
172 sphericalHarmonicVal =
173 std::sqrt(2.0) * boost::math::spherical_harmonic_r(l, m, theta, phi);
184 double tolerance = 1
e-12;
185 r = std::sqrt(x[0] * x[0] + x[1] * x[1] + x[2] * x[2]);
187 if (std::fabs(r - 0.0) <= tolerance)
194 theta = std::acos(x[2] / r);
203 if (fabs(theta - 0.0) >= tolerance && fabs(theta - M_PI) >= tolerance)
204 phi = std::atan2(x[1], x[0]);
wrapper to convert pseudopotential file from upf to dftfe format and returns the nonlinear core corre...
Definition pseudoPotentialToDftfeConverter.cc:36
void exchangeLocalList(const std::vector< unsigned int > &masterNodeIdList, std::vector< unsigned int > &globalMasterNodeIdList, unsigned int numMeshPartitions, const MPI_Comm &mpi_communicator)
Definition pseudoUtils.h:36
void getRadialFunctionVal(const double radialCoordinate, double &splineVal, const alglib::spline1dinterpolant *spline)
Definition pseudoUtils.h:148
void convertCartesianToSpherical(double *x, double &r, double &theta, double &phi)
Definition pseudoUtils.h:179
void exchangeNumberingMap(std::map< int, int > &localMap, unsigned int numMeshPartitions, const MPI_Comm &mpi_communicator)
Definition pseudoUtils.h:85
void getSphericalHarmonicVal(const double theta, const double phi, const int l, const int m, double &sphericalHarmonicVal)
Definition pseudoUtils.h:157
Definition pseudoPotentialToDftfeConverter.cc:34
@ e
Definition ExcSSDFunctionalBaseClass.h:52