DUNE-ACFEM (unstable)

operatorselector.hh
1#ifndef __ACFEM_OPERATORSELECTOR_HH__
2#define __ACFEM_OPERATORSELECTOR_HH__
3
4#include <dune/fem/space/common/capabilities.hh>
5
6#include "modelparameters.hh"
7#include "../common/literals.hh"
8#include "../models/modules/nitschedirichletmodel.hh"
9
10namespace Dune {
11
12 namespace ACFem {
13
14 using namespace Literals;
15
24 enum DGFlavour { sip, iip, nip };
25
29 template<class DiscreteFunctionSpace, class Model, DGFlavour flavour = sip>
31 {
32 private:
33 static const bool isContinuous = Dune::Fem::Capabilities::isContinuous<DiscreteFunctionSpace>::v;
34 static const bool hasFlux = ModelMethodExists<Model, PDEModel::flux>::value;
35 static const bool isSymmetric = ExpressionTraits<Model>::isSymmetric && flavour == sip;
36 public:
37 static const bool useDG = hasFlux && !(isContinuous);
38 static const DGFlavour dgFlavour = flavour;
39 static const int sFormDG = (dgFlavour == sip) ? 1 : (dgFlavour == nip ? -1 : 0);
40 static auto dgPenalty()
41 {
42 if constexpr (useDG) {
43 return ModelParameters::dgPenalty();
44 } else {
45 return 0_f;
46 }
47 }
48 };
49
50 template<class Model, class DiscreteSpace, class Symmetrize = PDEModel::SkeletonSymmetrizeDefault<Model>,
51 std::enable_if_t<(IsPDEModel<Model>::value
52 && OperatorTypeSelector<DiscreteSpace, Model>::useDG
53 && IsSign<Symmetrize>::value
54 ), int> = 0>
55 auto discreteModel(Model&& m, const DiscreteSpace& space, Symmetrize&& = Symmetrize{})
56 {
57 return nitscheDirichletModel(std::forward<Model>(m), space.gridPart(),
58 OperatorTypeSelector<DiscreteSpace, Model>::dgPenalty(), Symmetrize{});
59 }
60
61 template<class Model, class DiscreteSpace, class Symmetrize = PDEModel::SkeletonSymmetrizeDefault<Model>,
62 std::enable_if_t<(IsPDEModel<Model>::value
63 && !OperatorTypeSelector<DiscreteSpace, Model>::useDG
64 && IsSign<Symmetrize>::value
65 ), int> = 0>
66 constexpr decltype(auto) discreteModel(Model&& m, const DiscreteSpace& space, Symmetrize&& = Symmetrize{})
67 {
68 return std::forward<Model>(m);
69 }
70
71 template<class Model, class DiscreteSpace, class Symmetrize = PDEModel::SkeletonSymmetrizeDefault<Model> >
72 using DiscreteModel = std::decay_t<
73 decltype(
75 discreteModel(std::declval<Model>(), std::declval<DiscreteSpace>(), Symmetrize{})))>;
76
79 }//namespace ACFem
80
81}//namespace Dune
82
83#endif //__ACFEM_OPERATORSELECTOR_HH__
DGFlavour
Definition: operatorselector.hh:24
constexpr decltype(auto) asExpression(T &&t)
Return a non-closure expression as is.
Definition: interface.hh:122
auto nitscheDirichletModel(const Model &m, const PenaltyFunction &p, Symmetrize=Symmetrize{})
Wrap an existing model converting any Dirichlet boundary conditions into weak Dirichlet boundary cond...
Definition: nitschedirichletmodel.hh:570
typename ModelTraits< Model >::template Exists< ModelIntrospection::CheckMethodTag< tag >::value > ModelMethodExists
Check for either non-linear or linearized method.
Definition: modeltraits.hh:906
Default expression traits definition is a recursion in order to ease disambiguation.
Definition: expressiontraits.hh:54
Definition: operatorselector.hh:31
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Jul 15, 22:36, 2024)