DFT-FE 1.1.0-pre
Density Functional Theory With Finite-Elements
Loading...
Searching...
No Matches
feevaluationWrapper.h
Go to the documentation of this file.
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
19#ifndef FEEvaluationWrapper_H_
20#define FEEvaluationWrapper_H_
21#include <variant>
22#include <memory>
23#include <headers.h>
24namespace dftfe
25{
26 constexpr dftfe::Int
28 {
29 return a * 100 + b;
30 }
31
32 template <dftfe::Int components>
34 {
35 using type = std::variant<
36#define FEEvaluationWrapperTemplates(T1, T2) \
37 std::shared_ptr<dealii::FEEvaluation<3, T1, T2, components>>,
38#include "feevaluationWrapper.def"
39#undef FEEvaluationWrapperTemplates
40 std::shared_ptr<dealii::FEEvaluation<3, -1, 1, components>>>;
41 };
42
43 template <>
44 struct FEEvalTrait<3>
45 {
46 using type = std::variant<
47#define FEEvaluationWrapperTemplates(T1, T2) \
48 std::shared_ptr<dealii::FEEvaluation<3, T1, T2, 3>>,
49#include "feevaluationWrapper3Comp.def"
50#undef FEEvaluationWrapperTemplates
51 std::shared_ptr<dealii::FEEvaluation<3, -1, 1, 3>>>;
52 };
53
54
55 template <dftfe::Int components>
57
58
59 template <dftfe::Int components, class... Args>
62 dftfe::Int quadrature,
63 Args &&...args)
64 {
65 const dftfe::Int key = encodeFEEvaluation(feOrder, quadrature);
66 if constexpr (components == 1)
67 {
68 switch (key)
69 {
70#define FEEvaluationWrapperTemplates(T1, T2) \
71 case encodeFEEvaluation(T1, T2): \
72 return FEEvaluationObject<components>( \
73 std::make_shared<dealii::FEEvaluation<3, T1, T2, components>>( \
74 std::forward<Args>(args)...));
75#include "feevaluationWrapper.def"
76#undef FEEvaluationWrapperTemplates
77 default:
79 std::make_shared<dealii::FEEvaluation<3, -1, 1, components>>(
80 std::forward<Args>(args)...));
81 };
82 }
83 if constexpr (components == 3)
84 {
85 switch (key)
86 {
87#define FEEvaluationWrapperTemplates(T1, T2) \
88 case encodeFEEvaluation(T1, T2): \
89 return FEEvaluationObject<components>( \
90 std::make_shared<dealii::FEEvaluation<3, T1, T2, components>>( \
91 std::forward<Args>(args)...));
92#include "feevaluationWrapper3Comp.def"
93#undef FEEvaluationWrapperTemplates
94 default:
96 std::make_shared<dealii::FEEvaluation<3, -1, 1, components>>(
97 std::forward<Args>(args)...));
98 };
99 }
100 }
101
102 template <dftfe::Int components>
104 {
105 public:
106 /// Constructor
108 const dftfe::Int feOrder,
109 const dftfe::Int quadrature,
110 const dealii::MatrixFree<3, double> &matrixFreeData,
111 const dftfe::uInt matrixFreeVectorComponent,
112 const dftfe::uInt matrixFreeQuadratureComponent)
114 createFEEvaluationObject<components>(feOrder,
115 quadrature,
116 matrixFreeData,
117 matrixFreeVectorComponent,
118 matrixFreeQuadratureComponent))
119 , n_q_points(matrixFreeData.get_n_q_points(matrixFreeQuadratureComponent))
120 {}
121
122 template <typename... Args>
123 void
124 reinit(Args &&...args)
125 {
126 std::visit([&](auto &t) { t->reinit(std::forward<Args>(args)...); },
128 }
129
130 template <typename... Args>
131 void
132 read_dof_values(Args &&...args)
133 {
134 std::visit(
135 [&](auto &t) { t->read_dof_values(std::forward<Args>(args)...); },
137 }
138
139 template <typename... Args>
140 void
141 read_dof_values_plain(Args &&...args)
142 {
143 std::visit(
144 [&](auto &t) { t->read_dof_values_plain(std::forward<Args>(args)...); },
146 }
147
148 template <typename... Args>
149 void
150 evaluate(Args &&...args)
151 {
152 std::visit([&](auto &t) { t->evaluate(std::forward<Args>(args)...); },
154 }
155
156 template <typename... Args>
157 void
158 submit_gradient(Args &&...args)
159 {
160 std::visit(
161 [&](auto &t) { t->submit_gradient(std::forward<Args>(args)...); },
163 }
164
165 template <typename... Args>
166 void
167 submit_value(Args &&...args)
168 {
169 std::visit([&](auto &t) { t->submit_value(std::forward<Args>(args)...); },
171 }
172
173 template <typename... Args>
174 decltype(auto)
175 get_value(Args &&...args)
176 {
177 return std::visit(
178 [&](auto &t) -> decltype(auto) {
179 return t->get_value(std::forward<Args>(args)...);
180 },
182 }
183
184 template <typename... Args>
185 decltype(auto)
186 get_gradient(Args &&...args)
187 {
188 return std::visit(
189 [&](auto &t) -> decltype(auto) {
190 return t->get_gradient(std::forward<Args>(args)...);
191 },
193 }
194
195 template <typename... Args>
196 decltype(auto)
197 integrate_value(Args &&...args)
198 {
199 return std::visit(
200 [&](auto &t) -> decltype(auto) {
201 return t->integrate_value(std::forward<Args>(args)...);
202 },
204 }
205
206 template <typename... Args>
207 decltype(auto)
208 get_hessian(Args &&...args)
209 {
210 return std::visit(
211 [&](auto &t) -> decltype(auto) {
212 return t->get_hessian(std::forward<Args>(args)...);
213 },
215 }
216
217 template <typename... Args>
218 void
219 integrate(Args &&...args)
220 {
221 std::visit([&](auto &t) { t->integrate(std::forward<Args>(args)...); },
223 }
224
225 template <typename... Args>
226 decltype(auto)
227 quadrature_point(Args &&...args)
228 {
229 return std::visit(
230 [&](auto &t) -> decltype(auto) {
231 return t->quadrature_point(std::forward<Args>(args)...);
232 },
234 }
235
236 template <typename... Args>
237 decltype(auto)
238 JxW(Args &&...args)
239 {
240 return std::visit(
241 [&](auto &t) -> decltype(auto) {
242 return t->JxW(std::forward<Args>(args)...);
243 },
245 }
246
247 template <typename... Args>
248 void
250 {
251 std::visit(
252 [&](auto &t) {
253 t->distribute_local_to_global(std::forward<Args>(args)...);
254 },
256 }
257
258
260
261 private:
263 };
264
265} // namespace dftfe
266
267#endif
const dftfe::uInt n_q_points
Definition feevaluationWrapper.h:259
decltype(auto) quadrature_point(Args &&...args)
Definition feevaluationWrapper.h:227
void read_dof_values(Args &&...args)
Definition feevaluationWrapper.h:132
decltype(auto) get_value(Args &&...args)
Definition feevaluationWrapper.h:175
void read_dof_values_plain(Args &&...args)
Definition feevaluationWrapper.h:141
void submit_gradient(Args &&...args)
Definition feevaluationWrapper.h:158
void integrate(Args &&...args)
Definition feevaluationWrapper.h:219
decltype(auto) JxW(Args &&...args)
Definition feevaluationWrapper.h:238
FEEvaluationObject< components > d_FEEvaluationObject
Definition feevaluationWrapper.h:262
decltype(auto) integrate_value(Args &&...args)
Definition feevaluationWrapper.h:197
void reinit(Args &&...args)
Definition feevaluationWrapper.h:124
void distribute_local_to_global(Args &&...args)
Definition feevaluationWrapper.h:249
decltype(auto) get_hessian(Args &&...args)
Definition feevaluationWrapper.h:208
decltype(auto) get_gradient(Args &&...args)
Definition feevaluationWrapper.h:186
void evaluate(Args &&...args)
Definition feevaluationWrapper.h:150
FEEvaluationWrapperClass(const dftfe::Int feOrder, const dftfe::Int quadrature, const dealii::MatrixFree< 3, double > &matrixFreeData, const dftfe::uInt matrixFreeVectorComponent, const dftfe::uInt matrixFreeQuadratureComponent)
Constructor.
Definition feevaluationWrapper.h:107
void submit_value(Args &&...args)
Definition feevaluationWrapper.h:167
Definition pseudoPotentialToDftfeConverter.cc:34
FEEvaluationObject< components > createFEEvaluationObject(dftfe::Int feOrder, dftfe::Int quadrature, Args &&...args)
Definition feevaluationWrapper.h:61
constexpr dftfe::Int encodeFEEvaluation(dftfe::Int a, dftfe::Int b)
Definition feevaluationWrapper.h:27
typename FEEvalTrait< components >::type FEEvaluationObject
Definition feevaluationWrapper.h:56
std::uint32_t uInt
Definition TypeConfig.h:10
std::int32_t Int
Definition TypeConfig.h:11
std::variant< #define FEEvaluationWrapperTemplates(T1, T2) \ # 1 "/github/workspace/include/feevaluationWrapper3Comp.def" 1 FEEvaluationWrapperTemplates(1, 2) FEEvaluationWrapperTemplates(1, 3) FEEvaluationWrapperTemplates(1, 4) FEEvaluationWrapperTemplates(1, 5) FEEvaluationWrapperTemplates(1, 6) FEEvaluationWrapperTemplates(1, 7) FEEvaluationWrapperTemplates(1, 8) FEEvaluationWrapperTemplates(1, 9) FEEvaluationWrapperTemplates(1, 10) FEEvaluationWrapperTemplates(1, 11) FEEvaluationWrapperTemplates(1, 12) FEEvaluationWrapperTemplates(1, 13) FEEvaluationWrapperTemplates(1, 14) # 49 "/github/workspace/include/feevaluationWrapper.h" 2 std::shared_ptr< dealii::FEEvaluation< 3, -1, 1, 3 > > > type
Definition feevaluationWrapper.h:46
Definition feevaluationWrapper.h:34
std::variant< #define FEEvaluationWrapperTemplates(T1, T2) \ # 1 "/github/workspace/include/feevaluationWrapper.def" 1 FEEvaluationWrapperTemplates(1, 2) FEEvaluationWrapperTemplates(1, 4) FEEvaluationWrapperTemplates(2, 3) FEEvaluationWrapperTemplates(2, 5) FEEvaluationWrapperTemplates(3, 4) FEEvaluationWrapperTemplates(3, 6) FEEvaluationWrapperTemplates(4, 5) FEEvaluationWrapperTemplates(4, 7) FEEvaluationWrapperTemplates(5, 6) FEEvaluationWrapperTemplates(5, 8) FEEvaluationWrapperTemplates(6, 7) FEEvaluationWrapperTemplates(6, 9) FEEvaluationWrapperTemplates(7, 8) FEEvaluationWrapperTemplates(7, 10) FEEvaluationWrapperTemplates(8, 9) FEEvaluationWrapperTemplates(8, 11) FEEvaluationWrapperTemplates(9, 10) FEEvaluationWrapperTemplates(9, 12) FEEvaluationWrapperTemplates(10, 11) FEEvaluationWrapperTemplates(10, 13) FEEvaluationWrapperTemplates(11, 12) FEEvaluationWrapperTemplates(11, 14) FEEvaluationWrapperTemplates(12, 13) FEEvaluationWrapperTemplates(12, 15) FEEvaluationWrapperTemplates(13, 14) FEEvaluationWrapperTemplates(13, 16) FEEvaluationWrapperTemplates(14, 15) FEEvaluationWrapperTemplates(14, 17)# 38 "/github/workspace/include/feevaluationWrapper.h" 2 std::shared_ptr< dealii::FEEvaluation< 3, -1, 1, components > > > type
Definition feevaluationWrapper.h:35