19#ifndef kerkerSolverProblemWrapper_H_
20#define kerkerSolverProblemWrapper_H_
25#ifdef DFTFE_WITH_DEVICE
31#define kerkerSolverProblemWrapperTemplates(T1) \
32 std::shared_ptr<kerkerSolverProblem<T1>>,
33#define kerkerSolverProblemWrapperTemplatesL(T1) \
34 std::shared_ptr<kerkerSolverProblem<T1>>
35#include "kerkerSolverProblemWrapper.def"
36#undef kerkerSolverProblemWrapperTemplates
37#undef kerkerSolverProblemWrapperTemplatesL
39 template <
class... Args>
45#define kerkerSolverProblemWrapperTemplates(T1) \
47 return kerkerSolverProblemObject( \
48 std::make_shared<kerkerSolverProblem<T1>>(std::forward<Args>(args)...));
49#define kerkerSolverProblemWrapperTemplatesL(T1) \
51 return kerkerSolverProblemObject( \
52 std::make_shared<kerkerSolverProblem<T1>>(std::forward<Args>(args)...));
53#include "kerkerSolverProblemWrapper.def"
54#undef kerkerSolverProblemWrapperTemplates
55#undef kerkerSolverProblemWrapperTemplatesL
57 throw std::logic_error{
58 "createKerkerSolverProblemObject dispatch failed"};
68 const MPI_Comm &mpi_comm_parent,
69 const MPI_Comm &mpi_comm_domain)
87 std::visit([&](
auto &t) { t->vmult(Ax, x); },
94 std::visit([&](
auto &t) { t->computeRhs(rhs); },
101 const double omega)
const
104 auto const &t) { t->precondition_Jacobi(dst, src, omega); },
111 std::visit([](
auto &t) { t->distributeX(); },
117 const std::string &identifier =
"")
const
122 const std::string &identifier =
"")
const
131 template <
typename... Args>
135 std::visit([&](
auto &t) { t->reinit(std::forward<Args>(args)...); },
139 template <
typename... Args>
143 std::visit([&](
auto &t) { t->init(std::forward<Args>(args)...); },
151#ifdef DFTFE_WITH_DEVICE
152 using kerkerSolverProblemDeviceObject = std::variant<
153# define kerkerSolverProblemWrapperTemplates(T1) \
154 std::shared_ptr<kerkerSolverProblemDevice<T1>>,
155# define kerkerSolverProblemWrapperTemplatesL(T1) \
156 std::shared_ptr<kerkerSolverProblemDevice<T1>>
157# include "kerkerSolverProblemWrapper.def"
158# undef kerkerSolverProblemWrapperTemplates
159# undef kerkerSolverProblemWrapperTemplatesL
163 template <
class... Args>
164 inline kerkerSolverProblemDeviceObject
165 createKerkerSolverProblemDeviceObject(
dftfe::Int feOrder, Args &&...args)
169# define kerkerSolverProblemWrapperTemplates(T1) \
171 return kerkerSolverProblemDeviceObject{ \
172 std::make_shared<kerkerSolverProblemDevice<T1>>( \
173 std::forward<Args>(args)...)};
174# define kerkerSolverProblemWrapperTemplatesL(T1) \
176 return kerkerSolverProblemDeviceObject{ \
177 std::make_shared<kerkerSolverProblemDevice<T1>>( \
178 std::forward<Args>(args)...)};
179# include "kerkerSolverProblemWrapper.def"
180# undef kerkerSolverProblemWrapperTemplates
181# undef kerkerSolverProblemWrapperTemplatesL
183 throw std::logic_error{
184 "createKerkerSolverProblemDeviceObject dispatch failed"};
189 class kerkerSolverProblemDeviceWrapperClass :
public linearSolverProblemDevice
193 kerkerSolverProblemDeviceWrapperClass(
const dftfe::Int feOrder,
194 const MPI_Comm &mpi_comm_parent,
195 const MPI_Comm &mpi_comm_domain)
196 : d_kerkerSolverProblemObject(
197 createKerkerSolverProblemDeviceObject(feOrder,
202 distributedDeviceVec<double> &
206 [](
auto &t) -> distributedDeviceVec<double> & {
return t->getX(); },
207 d_kerkerSolverProblemObject);
210 distributedDeviceVec<double> &
214 [](
auto &t) -> distributedDeviceVec<double> & {
215 return t->getPreconditioner();
217 d_kerkerSolverProblemObject);
221 computeAX(distributedDeviceVec<double> &dst,
222 distributedDeviceVec<double> &src)
224 std::visit([&](
auto &t) { t->computeAX(dst, src); },
225 d_kerkerSolverProblemObject);
230 computeRhs(distributedCPUVec<double> &rhs)
232 std::visit([&](
auto &t) { t->computeRhs(rhs); },
233 d_kerkerSolverProblemObject);
239 std::visit([](
auto &t) { t->setX(); }, d_kerkerSolverProblemObject);
245 std::visit([](
auto &t) { t->distributeX(); },
246 d_kerkerSolverProblemObject);
250 copyXfromDeviceToHost()
252 std::visit([](
auto &t) { t->copyXfromDeviceToHost(); },
253 d_kerkerSolverProblemObject);
256 template <
typename... Args>
258 reinit(Args &&...args)
260 std::visit([&](
auto &t) { t->reinit(std::forward<Args>(args)...); },
261 d_kerkerSolverProblemObject);
264 template <
typename... Args>
268 std::visit([&](
auto &t) { t->init(std::forward<Args>(args)...); },
269 d_kerkerSolverProblemObject);
273 kerkerSolverProblemDeviceObject d_kerkerSolverProblemObject;
dealiiLinearSolverProblem()
Constructor.
kerkerSolverProblemObject d_kerkerSolverProblemObject
Definition kerkerSolverProblemWrapper.h:148
void reinit(Args &&...args)
Definition kerkerSolverProblemWrapper.h:133
distributedCPUVec< double > & getX()
get the reference to x field
Definition kerkerSolverProblemWrapper.h:77
void subscribe(std::atomic< bool > *const validity, const std::string &identifier="") const
Definition kerkerSolverProblemWrapper.h:116
void vmult(distributedCPUVec< double > &Ax, distributedCPUVec< double > &x)
Compute A matrix multipled by x.
Definition kerkerSolverProblemWrapper.h:85
bool operator!=(double val) const
function needed by dealii to mimic SparseMatrix
Definition kerkerSolverProblemWrapper.h:126
kerkerSolverProblemWrapperClass(const dftfe::Int feOrder, const MPI_Comm &mpi_comm_parent, const MPI_Comm &mpi_comm_domain)
Constructor.
Definition kerkerSolverProblemWrapper.h:67
void precondition_Jacobi(distributedCPUVec< double > &dst, const distributedCPUVec< double > &src, const double omega) const
Jacobi preconditioning function.
Definition kerkerSolverProblemWrapper.h:99
void unsubscribe(std::atomic< bool > *const validity, const std::string &identifier="") const
Definition kerkerSolverProblemWrapper.h:121
void init(Args &&...args)
Definition kerkerSolverProblemWrapper.h:141
void computeRhs(distributedCPUVec< double > &rhs)
Compute right hand side vector for the problem Ax = rhs.
Definition kerkerSolverProblemWrapper.h:92
void distributeX()
distribute x to the constrained nodes.
Definition kerkerSolverProblemWrapper.h:109
Definition pseudoPotentialToDftfeConverter.cc:34
kerkerSolverProblemObject createKerkerSolverProblemObject(dftfe::Int feOrder, Args &&...args)
Definition kerkerSolverProblemWrapper.h:57
std::variant< #define kerkerSolverProblemWrapperTemplates(T1) \ #define kerkerSolverProblemWrapperTemplatesL(T1) \ # 1 "/github/workspace/include/kerkerSolverProblemWrapper.def" 1 kerkerSolverProblemWrapperTemplates(1) kerkerSolverProblemWrapperTemplates(2) kerkerSolverProblemWrapperTemplates(3) kerkerSolverProblemWrapperTemplates(4) kerkerSolverProblemWrapperTemplates(5) kerkerSolverProblemWrapperTemplates(6) kerkerSolverProblemWrapperTemplates(7) kerkerSolverProblemWrapperTemplates(8) kerkerSolverProblemWrapperTemplates(9) kerkerSolverProblemWrapperTemplates(10) kerkerSolverProblemWrapperTemplates(11) kerkerSolverProblemWrapperTemplates(12) kerkerSolverProblemWrapperTemplates(13) kerkerSolverProblemWrapperTemplates(14) kerkerSolverProblemWrapperTemplates(15) kerkerSolverProblemWrapperTemplatesL(16)# 35 "/github/workspace/include/kerkerSolverProblemWrapper.h" 2 > kerkerSolverProblemObject
Definition kerkerSolverProblemWrapper.h:30
dealii::LinearAlgebra::distributed::Vector< elem_type, dealii::MemorySpace::Host > distributedCPUVec
Definition headers.h:92
std::int32_t Int
Definition TypeConfig.h:11