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 
10 namespace 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.80.0 (May 2, 22:35, 2024)