3#ifndef DUNE_PDELAB_LOCALOPERATOR_CALLSWITCH_HH
4#define DUNE_PDELAB_LOCALOPERATOR_CALLSWITCH_HH
17 template<
typename LOP,
bool doIt,
bool isLinear = LOP::isLinear>
18 struct LocalAssemblerCallSwitchHelper
23 template<
typename LFSU,
typename LFSV,
typename LocalPattern>
24 static void pattern_volume (
const LOP& lop,
const LFSU& lfsu,
const LFSV& lfsv, LocalPattern& pattern)
27 template<
typename LFSU,
typename LFSV,
typename LocalPattern>
28 static void pattern_volume_post_skeleton
30 const LFSU& lfsu,
const LFSV& lfsv,
31 LocalPattern& pattern)
34 template<
typename LFSU,
typename LFSV,
typename LocalPattern>
35 static void pattern_skeleton (
const LOP& lop,
const LFSU& lfsu_s,
const LFSV& lfsv_s,
36 const LFSU& lfsu_n,
const LFSV& lfsv_n,
37 LocalPattern& pattern_sn,
38 LocalPattern& pattern_ns)
41 template<
typename LFSU,
typename LFSV,
typename LocalPattern>
42 static void pattern_boundary(
const LOP& lop,
43 const LFSU& lfsu_s,
const LFSV& lfsv_s,
44 LocalPattern& pattern_ss)
51 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename R>
52 static void alpha_volume (
const LOP& lop,
const EG& eg,
const LFSU& lfsu,
const X& x,
const LFSV& lfsv, R& r)
55 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename R>
56 static void alpha_volume_post_skeleton (
const LOP& lop,
const EG& eg,
const LFSU& lfsu,
const X& x,
const LFSV& lfsv, R& r)
59 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename R>
60 static void alpha_skeleton (
const LOP& lop,
const IG& ig,
61 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
62 const LFSU& lfsu_n,
const X& x_n,
const LFSV& lfsv_n,
66 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename R>
67 static void alpha_boundary (
const LOP& lop,
const IG& ig,
68 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
76 template<
typename EG,
typename LFSV,
typename R>
77 static void lambda_volume (
const LOP& lop,
const EG& eg,
const LFSV& lfsv, R& r)
80 template<
typename EG,
typename LFSV,
typename R>
81 static void lambda_volume_post_skeleton (
const LOP& lop,
const EG& eg,
const LFSV& lfsv, R& r)
84 template<
typename IG,
typename LFSV,
typename R>
85 static void lambda_skeleton(
const LOP& lop,
const IG& ig,
86 const LFSV& lfsv_s,
const LFSV& lfsv_n,
90 template<
typename IG,
typename LFSV,
typename R>
91 static void lambda_boundary (
const LOP& lop,
const IG& ig,
const LFSV& lfsv, R& r)
98 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename Y>
99 static void jacobian_apply_volume (
const LOP& lop,
const EG& eg,
const LFSU& lfsu,
const X& x,
const X& z,
const LFSV& lfsv, Y& y)
102 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename Y>
103 static void jacobian_apply_volume_post_skeleton (
const LOP& lop,
const EG& eg,
const LFSU& lfsu,
const X& x,
const X& z,
const LFSV& lfsv, Y& y)
106 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename Y>
107 static void jacobian_apply_skeleton (
const LOP& lop,
const IG& ig,
108 const LFSU& lfsu_s,
const X& x_s,
const X& z_s,
const LFSV& lfsv_s,
109 const LFSU& lfsu_n,
const X& x_n,
const X& z_n,
const LFSV& lfsv_n,
113 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename Y>
114 static void jacobian_apply_boundary (
const LOP& lop,
const IG& ig,
115 const LFSU& lfsu_s,
const X& x_s,
const X& z_s,
const LFSV& lfsv_s,
123 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename M>
124 static void jacobian_volume (
const LOP& lop,
const EG& eg,
const LFSU& lfsu,
const X& x,
const LFSV& lfsv, M & mat)
127 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename M>
128 static void jacobian_volume_post_skeleton (
const LOP& lop,
const EG& eg,
const LFSU& lfsu,
const X& x,
const LFSV& lfsv, M& mat)
131 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename M>
132 static void jacobian_skeleton (
const LOP& lop,
const IG& ig,
133 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
134 const LFSU& lfsu_n,
const X& x_n,
const LFSV& lfsv_n,
135 M & mat_ss, M & mat_sn,
136 M & mat_ns, M & mat_nn)
139 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename M>
140 static void jacobian_boundary (
const LOP& lop,
const IG& ig,
141 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
148 template<
typename LOP>
149 struct LocalAssemblerCallSwitchHelper<LOP,true,true>
154 template<
typename LFSU,
typename LFSV,
typename LocalPattern>
155 static void pattern_volume (
const LOP& lop,
const LFSU& lfsu,
const LFSV& lfsv, LocalPattern& pattern)
157 lop.pattern_volume(lfsu,lfsv,pattern);
159 template<
typename LFSU,
typename LFSV,
typename LocalPattern>
160 static void pattern_volume_post_skeleton
162 const LFSU& lfsu,
const LFSV& lfsv,
163 LocalPattern& pattern)
165 lop.pattern_volume_post_skeleton(lfsu,lfsv,pattern);
167 template<
typename LFSU,
typename LFSV,
typename LocalPattern>
168 static void pattern_skeleton (
const LOP& lop,
const LFSU& lfsu_s,
const LFSV& lfsv_s,
169 const LFSU& lfsu_n,
const LFSV& lfsv_n,
170 LocalPattern& pattern_sn,
171 LocalPattern& pattern_ns)
173 lop.pattern_skeleton(lfsu_s,lfsv_s,lfsu_n,lfsv_n,
174 pattern_sn, pattern_ns);
176 template<
typename LFSU,
typename LFSV,
typename LocalPattern>
177 static void pattern_boundary(
const LOP& lop,
178 const LFSU& lfsu_s,
const LFSV& lfsv_s,
179 LocalPattern& pattern_ss)
181 lop.pattern_boundary(lfsu_s,lfsv_s,pattern_ss);
187 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename R>
188 static void alpha_volume (
const LOP& lop,
const EG& eg,
const LFSU& lfsu,
const X& x,
const LFSV& lfsv, R& r)
190 lop.alpha_volume(eg,lfsu,x,lfsv,r);
192 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename R>
193 static void alpha_volume_post_skeleton (
const LOP& lop,
const EG& eg,
const LFSU& lfsu,
const X& x,
const LFSV& lfsv, R& r)
195 lop.alpha_volume_post_skeleton(eg,lfsu,x,lfsv,r);
197 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename R>
198 static void alpha_skeleton (
const LOP& lop,
const IG& ig,
199 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
200 const LFSU& lfsu_n,
const X& x_n,
const LFSV& lfsv_n,
203 lop.alpha_skeleton(ig,lfsu_s,x_s,lfsv_s,lfsu_n,x_n,lfsv_n,r_s,r_n);
205 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename R>
206 static void alpha_boundary (
const LOP& lop,
const IG& ig,
207 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
210 lop.alpha_boundary(ig,lfsu_s,x_s,lfsv_s,r_s);
216 template<
typename EG,
typename LFSV,
typename R>
217 static void lambda_volume (
const LOP& lop,
const EG& eg,
const LFSV& lfsv, R& r)
219 lop.lambda_volume(eg,lfsv,r);
221 template<
typename EG,
typename LFSV,
typename R>
222 static void lambda_volume_post_skeleton (
const LOP& lop,
const EG& eg,
const LFSV& lfsv, R& r)
224 lop.lambda_volume_post_skeleton(eg,lfsv,r);
226 template<
typename IG,
typename LFSV,
typename R>
227 static void lambda_skeleton(
const LOP& lop,
const IG& ig,
228 const LFSV& lfsv_s,
const LFSV& lfsv_n,
231 lop.lambda_skeleton(ig, lfsv_s, lfsv_n, r_s, r_n);
233 template<
typename IG,
typename LFSV,
typename R>
234 static void lambda_boundary (
const LOP& lop,
const IG& ig,
const LFSV& lfsv, R& r)
236 lop.lambda_boundary(ig,lfsv,r);
242 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename Y>
243 static auto jacobian_apply_volume (
const LOP& lop,
const EG& eg,
const LFSU& lfsu,
const X& x,
const X& z,
const LFSV& lfsv, Y& y)
245 lop.jacobian_apply_volume(eg,lfsu,z,lfsv,y);
247 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename Y>
248 static void jacobian_apply_volume_post_skeleton (
const LOP& lop,
const EG& eg,
const LFSU& lfsu,
const X& x,
const X& z,
const LFSV& lfsv, Y& y)
250 lop.jacobian_apply_volume_post_skeleton(eg,lfsu,z,lfsv,y);
252 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename Y>
253 static void jacobian_apply_skeleton (
const LOP& lop,
const IG& ig,
254 const LFSU& lfsu_s,
const X& x_s,
const X& z_s,
const LFSV& lfsv_s,
255 const LFSU& lfsu_n,
const X& x_n,
const X& z_n,
const LFSV& lfsv_n,
258 lop.jacobian_apply_skeleton(ig,lfsu_s,z_s,lfsv_s,lfsu_n,z_n,lfsv_n,y_s,y_n);
260 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename Y>
261 static void jacobian_apply_boundary (
const LOP& lop,
const IG& ig,
262 const LFSU& lfsu_s,
const X& x_s,
const X& z_s,
const LFSV& lfsv_s,
265 lop.jacobian_apply_boundary(ig,lfsu_s,z_s,lfsv_s,y_s);
271 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename M>
272 static void jacobian_volume (
const LOP& lop,
const EG& eg,
const LFSU& lfsu,
const X& x,
const LFSV& lfsv, M & mat)
274 lop.jacobian_volume(eg,lfsu,x,lfsv,mat);
276 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename M>
277 static void jacobian_volume_post_skeleton (
const LOP& lop,
const EG& eg,
const LFSU& lfsu,
const X& x,
const LFSV& lfsv, M & mat)
279 lop.jacobian_volume_post_skeleton(eg,lfsu,x,lfsv,mat);
281 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename M>
282 static void jacobian_skeleton (
const LOP& lop,
const IG& ig,
283 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
284 const LFSU& lfsu_n,
const X& x_n,
const LFSV& lfsv_n,
285 M & mat_ss, M & mat_sn,
286 M & mat_ns, M & mat_nn)
288 lop.jacobian_skeleton(ig,lfsu_s,x_s,lfsv_s,lfsu_n,x_n,lfsv_n,
289 mat_ss, mat_sn, mat_ns, mat_nn);
291 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename M>
292 static void jacobian_boundary (
const LOP& lop,
const IG& ig,
293 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
296 lop.jacobian_boundary(ig,lfsu_s,x_s,lfsv_s,mat_ss);
305 template<
typename LOP>
306 struct LocalAssemblerCallSwitchHelper<LOP,true,false> :
307 public LocalAssemblerCallSwitchHelper<LOP,true,true>
312 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename Y>
313 static auto jacobian_apply_volume (
const LOP& lop,
const EG& eg,
const LFSU& lfsu,
const X& x,
const X& z,
const LFSV& lfsv, Y& y)
315 lop.jacobian_apply_volume(eg,lfsu,x,z,lfsv,y);
317 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename Y>
318 static void jacobian_apply_volume_post_skeleton (
const LOP& lop,
const EG& eg,
const LFSU& lfsu,
const X& x,
const X& z,
const LFSV& lfsv, Y& y)
320 lop.jacobian_apply_volume_post_skeleton(eg,lfsu,x,z,lfsv,y);
322 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename Y>
323 static void jacobian_apply_skeleton (
const LOP& lop,
const IG& ig,
324 const LFSU& lfsu_s,
const X& x_s,
const X& z_s,
const LFSV& lfsv_s,
325 const LFSU& lfsu_n,
const X& x_n,
const X& z_n,
const LFSV& lfsv_n,
328 lop.jacobian_apply_skeleton(ig,lfsu_s,x_s,z_s,lfsv_s,lfsu_n,x_n,z_n,lfsv_n,y_s,y_n);
330 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename Y>
331 static void jacobian_apply_boundary (
const LOP& lop,
const IG& ig,
332 const LFSU& lfsu_s,
const X& x_s,
const X& z_s,
const LFSV& lfsv_s,
335 lop.jacobian_apply_boundary(ig,lfsu_s,x_s,z_s,lfsv_s,y_s);
342 template<
typename LOP,
bool doIt>
343 using LocalAssemblerCallSwitch =
344 Impl::LocalAssemblerCallSwitchHelper<LOP,doIt>;
346 namespace LocalOperatorApply {
348 auto patternVolume = [](
const auto& lop,
auto&... args)
350 using LOP = std::decay_t<
decltype(lop)>;
351 Impl::LocalAssemblerCallSwitchHelper<LOP,LOP::doPatternVolume>::
352 pattern_volume(lop, args...);
355 auto patternVolumePostSkeleton = [](
const auto& lop,
auto&... args)
357 using LOP = std::decay_t<
decltype(lop)>;
358 Impl::LocalAssemblerCallSwitchHelper<LOP,LOP::doPatternVolumePostSkeleton>::
359 pattern_volume_post_skeleton(lop, args...);
362 auto patternSkeleton = [](
const auto& lop,
auto&... args)
364 using LOP = std::decay_t<
decltype(lop)>;
365 Impl::LocalAssemblerCallSwitchHelper<LOP,LOP::doPatternSkeleton>::
366 pattern_skeleton(lop, args...);
369 auto patternBoundary = [](
const auto& lop,
auto&... args)
371 using LOP = std::decay_t<
decltype(lop)>;
372 Impl::LocalAssemblerCallSwitchHelper<LOP,LOP::doPatternBoundary>::
373 pattern_boundary(lop, args...);
377 auto alphaVolume = [](
const auto& lop,
auto&... args)
379 using LOP = std::decay_t<
decltype(lop)>;
380 Impl::LocalAssemblerCallSwitchHelper<LOP,LOP::doAlphaVolume>::
381 alpha_volume(lop, args...);
384 auto alphaVolumePostSkeleton = [](
const auto& lop,
auto&... args)
386 using LOP = std::decay_t<
decltype(lop)>;
387 Impl::LocalAssemblerCallSwitchHelper<LOP,LOP::doAlphaVolumePostSkeleton>::
388 alpha_volume_post_skeleton(lop, args...);
391 auto alphaSkeleton = [](
const auto& lop,
auto&... args)
393 using LOP = std::decay_t<
decltype(lop)>;
394 Impl::LocalAssemblerCallSwitchHelper<LOP,LOP::doAlphaSkeleton>::
395 alpha_skeleton(lop, args...);
398 auto alphaBoundary = [](
const auto& lop,
auto&... args)
400 using LOP = std::decay_t<
decltype(lop)>;
401 Impl::LocalAssemblerCallSwitchHelper<LOP,LOP::doAlphaBoundary>::
402 alpha_boundary(lop, args...);
407 auto lambdaVolume = [](
const auto& lop,
auto&... args)
409 using LOP = std::decay_t<
decltype(lop)>;
410 Impl::LocalAssemblerCallSwitchHelper<LOP,LOP::doLambdaVolume>::
411 lambda_volume(lop, args...);
414 auto lambdaVolumePostSkeleton = [](
const auto& lop,
auto&... args)
416 using LOP = std::decay_t<
decltype(lop)>;
417 Impl::LocalAssemblerCallSwitchHelper<LOP,LOP::doLambdaVolumePostSkeleton>::
418 lambda_volume_post_skeleton(lop, args...);
421 auto lambdaSkeleton = [](
const auto& lop,
auto&... args)
423 using LOP = std::decay_t<
decltype(lop)>;
424 Impl::LocalAssemblerCallSwitchHelper<LOP,LOP::doLambdaSkeleton>::
425 lambda_skeleton(lop, args...);
428 auto lambdaBoundary = [](
const auto& lop,
auto&... args)
430 using LOP = std::decay_t<
decltype(lop)>;
431 Impl::LocalAssemblerCallSwitchHelper<LOP,LOP::doLambdaBoundary>::
432 lambda_boundary(lop, args...);
437 auto jacobianVolume = [](
const auto& lop,
auto&... args)
439 using LOP = std::decay_t<
decltype(lop)>;
440 Impl::LocalAssemblerCallSwitchHelper<LOP,LOP::doAlphaVolume>::
441 jacobian_volume(lop, args...);
444 auto jacobianVolumePostSkeleton = [](
const auto& lop,
auto&... args)
446 using LOP = std::decay_t<
decltype(lop)>;
447 Impl::LocalAssemblerCallSwitchHelper<LOP,LOP::doAlphaVolumePostSkeleton>::
448 jacobian_volume_post_skeleton(lop, args...);
451 auto jacobianSkeleton = [](
const auto& lop,
auto&... args)
453 using LOP = std::decay_t<
decltype(lop)>;
454 Impl::LocalAssemblerCallSwitchHelper<LOP,LOP::doAlphaSkeleton>::
455 jacobian_skeleton(lop, args...);
458 auto jacobianBoundary = [](
const auto& lop,
auto&... args)
460 using LOP = std::decay_t<
decltype(lop)>;
461 Impl::LocalAssemblerCallSwitchHelper<LOP,LOP::doAlphaBoundary>::
462 jacobian_boundary(lop, args...);
467 auto jacobianApplyVolume = [](
const auto& lop,
auto&... args)
469 using LOP = std::decay_t<
decltype(lop)>;
470 Impl::LocalAssemblerCallSwitchHelper<LOP,LOP::doAlphaVolume>::
471 jacobian_apply_volume(lop, args...);
474 auto jacobianApplyVolumePostSkeleton = [](
const auto& lop,
auto&... args)
476 using LOP = std::decay_t<
decltype(lop)>;
477 Impl::LocalAssemblerCallSwitchHelper<LOP,LOP::doAlphaVolumePostSkeleton>::
478 jacobian_apply_volume_post_skeleton(lop, args...);
481 auto jacobianApplySkeleton = [](
const auto& lop,
auto&... args)
483 using LOP = std::decay_t<
decltype(lop)>;
484 Impl::LocalAssemblerCallSwitchHelper<LOP,LOP::doAlphaSkeleton>::
485 jacobian_apply_skeleton(lop, args...);
488 auto jacobianApplyBoundary = [](
const auto& lop,
auto&... args)
490 using LOP = std::decay_t<
decltype(lop)>;
491 Impl::LocalAssemblerCallSwitchHelper<LOP,LOP::doAlphaBoundary>::
492 jacobian_apply_boundary(lop, args...);
Infrastructure for concepts.
Traits for type conversions and type information.
Dune namespace.
Definition: alignedallocator.hh:14