1 #ifndef __DUNE_ACFEM_MODELS_MODULES_NITSCHEDIRICHLETMODEL_HH__
2 #define __DUNE_ACFEM_MODELS_MODULES_NITSCHEDIRICHLETMODEL_HH__
4 #include <dune/fem/function/localfunction/const.hh>
6 #include "../../algorithms/modelparameters.hh"
7 #include "../indicators/boundaryindicator.hh"
8 #include "../modeltraits.hh"
9 #include "../expressions.hh"
13 namespace ACFem::PDEModel {
15 using namespace Literals;
31 template<
class Model,
class Penalty,
bool linear,
class LinArgs,
class Args>
32 class RobinFluxProviderBase;
34 template<
class Model,
class Penalty,
bool linear, std::size_t... LinArgsIdx, std::size_t... ArgsIdx>
35 class RobinFluxProviderBase<Model, Penalty, linear,
37 IndexSequence<ModelIntrospection::pointIndex, ModelIntrospection::normalIndex, ArgsIdx...> >
39 static constexpr std::size_t pointIndex = ModelIntrospection::pointIndex;
40 static constexpr std::size_t normalIndex = ModelIntrospection::normalIndex;
41 static constexpr std::size_t fluxTag = linear ? ModelIntrospection::linearizedFlux : ModelIntrospection::flux;
42 static constexpr std::size_t robinFluxTag = linear ? ModelIntrospection::linearizedRobinFlux : ModelIntrospection::robinFlux;
43 static constexpr std::size_t dirichletTag = linear ? ModelIntrospection::linearizedDirichlet : ModelIntrospection::dirichlet;
45 RobinFluxProviderBase(
const RobinFluxProviderBase&);
47 RobinFluxProviderBase(
const Model& m,
const Penalty& p)
48 : flux_(m), robinFlux_(m), dirichlet_(m), p_(p)
51 template<
class Quadrature>
52 auto robinMethod(
const TupleElement<LinArgsIdx, PDEModel::AllArgs<Model> >&... linArgs,
53 const QuadraturePoint<Quadrature>& x,
54 const typename Model::DomainType& unitOuterNormal,
55 const TupleElement<ArgsIdx, PDEModel::AllArgs<Model> >&... args)
const
57 auto result = robinFlux_(linArgs..., x, unitOuterNormal, args...);
58 auto dirichlet = dirichlet_(linArgs..., x, args...);
59 const auto flux = flux_(linArgs..., x, args...);
60 const typename Model::RangeFieldType penalty = p_.evaluate(x);
63 flux.usmv(-1.0, unitOuterNormal, result);
64 result += (dirichlet *= penalty);
67 result += penalty * dirichlet;
73 const PDEModel::TaggedModelMethod<Model, fluxTag,
SequenceMask<LinArgsIdx..., pointIndex, ArgsIdx...>::value> flux_;
74 const PDEModel::TaggedModelMethod<Model, robinFluxTag,
SequenceMask<LinArgsIdx..., pointIndex, normalIndex, ArgsIdx...>::value> robinFlux_;
75 const PDEModel::TaggedModelMethod<Model, dirichletTag,
SequenceMask<LinArgsIdx..., pointIndex, ArgsIdx...>::value> dirichlet_;
79 template<
class Model,
class Penalty,
bool linear,
bool enable,
class LinArgs,
class Args>
80 class RobinFluxProvider;
82 template<
class Model,
class Penalty,
bool linear,
class LinArgs,
class Args>
83 class RobinFluxProvider<Model, Penalty, linear, false, LinArgs, Args>
86 RobinFluxProvider(
const Model& m,
const Penalty& p)
90 template<
class Model,
class Penalty, std::size_t... ArgsIdx>
91 class RobinFluxProvider<Model, Penalty, false, true,
94 : RobinFluxProviderBase<Model, Penalty, false,
96 IndexSequence<ModelIntrospection::pointIndex, ArgsIdx...> >
98 using BaseType = RobinFluxProviderBase<Model, Penalty,
false,
101 using BaseType::robinMethod;
103 RobinFluxProvider(
const Model& m,
const Penalty& p)
107 template<
class Quadrature>
109 robinFlux(
const QuadraturePoint<Quadrature>& x,
110 const TupleElement<ArgsIdx, PDEModel::AllArgs<Model> >&... args)
const
112 return robinMethod(x, args...);
116 template<
class Model,
class Penalty, std::size_t... LinArgsIdx, std::size_t... ArgsIdx>
117 class RobinFluxProvider<Model, Penalty, true, true,
120 : RobinFluxProviderBase<Model, Penalty, true,
121 IndexSequence<LinArgsIdx...>,
122 IndexSequence<ModelIntrospection::pointIndex, ArgsIdx...> >
124 using BaseType = RobinFluxProviderBase<Model, Penalty,
true,
127 using BaseType::robinMethod;
129 RobinFluxProvider(
const Model& m,
const Penalty& p)
133 template<
class Quadrature>
135 linearizedRobinFlux(
const TupleElement<LinArgsIdx, PDEModel::AllArgs<Model> >&... linArgs,
136 const QuadraturePoint<Quadrature>& x,
137 const TupleElement<ArgsIdx, PDEModel::AllArgs<Model> >&... args)
const
139 return robinMethod(linArgs..., x, args...);
143 template<
class Model, std::ptrdiff_t symmetry,
bool linear,
class LinArgs,
class Po
intArgs,
class Args>
144 class SingularFluxProviderBase;
146 template<
class Model, std::ptrdiff_t symmetry,
bool linear, std::size_t... LinArgsIdx, std::size_t... PointIdx, std::size_t... ArgsIdx>
147 class SingularFluxProviderBase<Model, symmetry, linear,
152 static constexpr std::size_t pointIndex = ModelIntrospection::pointIndex;
153 static constexpr std::size_t normalIndex = ModelIntrospection::normalIndex;
154 static constexpr std::size_t jacobianIndex = ModelIntrospection::jacobianIndex;
155 static constexpr std::size_t fluxTag = linear ? ModelIntrospection::linearizedFlux : ModelIntrospection::flux;
156 static constexpr std::size_t singularFluxTag = linear ? ModelIntrospection::linearizedSingularFlux : ModelIntrospection::singularFlux;
157 static constexpr std::size_t dirichletTag = linear ? ModelIntrospection::linearizedDirichlet : ModelIntrospection::dirichlet;
159 template<
class Quadrature>
160 using AllArgs = PDEModel::AllArgs<Model, Quadrature>;
163 SingularFluxProviderBase(
const Model& m)
164 : flux_(m), singularFlux_(m), dirichlet_(m)
167 template<
class Quadrature = Po
intWrapperQuadrature<
typename Model::DomainType> >
168 auto singularFluxMethod(
const TupleElement<LinArgsIdx, AllArgs<Quadrature> >&... linArgs,
169 const TupleElement<PointIdx, AllArgs<Quadrature> >&... xArg,
170 const typename Model::DomainType& unitOuterNormal,
171 const TupleElement<ArgsIdx, AllArgs<Quadrature> >&... args)
const
173 using DomainRangeType =
typename Model::DomainRangeType;
174 using DomainJacobianRangeType =
typename Model::DomainJacobianRangeType;
176 DomainJacobianRangeType result = singularFlux_(linArgs..., xArg..., unitOuterNormal, args...);
177 const auto dirichlet = dirichlet_(linArgs..., xArg..., args...);
180 DomainJacobianRangeType un;
182 un =
outer(dirichlet, unitOuterNormal);
184 result -= flux_(linArgs..., xArg..., DomainRangeType(0), un) * symmetry;
185 if (!ModelTraits<Model>::template IsLinear<fluxTag>::value) {
186 result += flux_(linArgs..., xArg..., DomainRangeType(0), DomainJacobianRangeType(0)) * symmetry;
192 const PDEModel::TaggedModelMethod<Model, fluxTag,
SequenceMask<LinArgsIdx..., PointIdx..., ArgsIdx...>::value> flux_;
193 const PDEModel::TaggedModelMethod<Model, singularFluxTag,
SequenceMask<LinArgsIdx..., PointIdx..., normalIndex, ArgsIdx...>::value> singularFlux_;
194 const PDEModel::TaggedModelMethod<Model, dirichletTag,
SequenceMask<LinArgsIdx..., PointIdx..., ArgsIdx...>::value> dirichlet_;
197 template<
class Model, std::ptrdiff_t symmetry,
bool linear,
bool enable,
class LinArgs,
class Args>
198 class SingularFluxProvider;
200 template<
class Model, std::ptrdiff_t symmetry,
bool linear,
class LinArgs,
class Args>
201 class SingularFluxProvider<Model, symmetry, linear, false, LinArgs, Args>
204 SingularFluxProvider(
const Model& m)
208 template<
class Model, std::ptrdiff_t symmetry, std::size_t... ArgsIdx>
209 class SingularFluxProvider<Model, symmetry, false, true,
212 : SingularFluxProviderBase<Model, symmetry, false,
214 IndexSequence<ModelIntrospection::pointIndex>,
215 IndexSequence<ArgsIdx...> >
217 using BaseType = SingularFluxProviderBase<Model, symmetry,
false,
219 IndexSequence<ModelIntrospection::pointIndex>,
221 using BaseType::singularFluxMethod;
223 SingularFluxProvider(
const Model& m)
227 template<
class Quadrature>
228 auto singularFlux(
const QuadraturePoint<Quadrature>& x,
229 const TupleElement<ArgsIdx, PDEModel::AllArgs<Model> >&... args)
const
231 return BaseType::template singularFluxMethod<Quadrature>(x, args...);
235 template<
class Model, std::ptrdiff_t symmetry, std::size_t... LinArgsIdx, std::size_t... ArgsIdx>
236 class SingularFluxProvider<Model, symmetry, true, true,
239 : SingularFluxProviderBase<Model, symmetry, true,
240 IndexSequence<LinArgsIdx...>,
241 IndexSequence<ModelIntrospection::pointIndex>,
242 IndexSequence<ArgsIdx...> >
244 using BaseType = SingularFluxProviderBase<Model, symmetry,
true,
246 IndexSequence<ModelIntrospection::pointIndex>,
248 using BaseType::singularFluxMethod;
251 SingularFluxProvider(
const Model& m)
255 template<
class Quadrature>
256 auto linearizedSingularFlux(
const TupleElement<LinArgsIdx, PDEModel::AllArgs<Model> >&... linArgs,
257 const QuadraturePoint<Quadrature>& x,
258 const TupleElement<ArgsIdx, PDEModel::AllArgs<Model> >&... args)
const
260 return BaseType::template singularFluxMethod<Quadrature>(linArgs..., x, args...);
264 template<
class Model, std::ptrdiff_t symmetry, std::size_t... ArgsIdx>
265 class SingularFluxProvider<Model, symmetry, false, true,
268 : SingularFluxProviderBase<Model, symmetry, false,
271 IndexSequence<ArgsIdx...> >
273 using BaseType = SingularFluxProviderBase<Model, symmetry,
false,
277 using BaseType::singularFluxMethod;
279 SingularFluxProvider(
const Model& m)
283 auto singularFlux(
const TupleElement<ArgsIdx, PDEModel::AllArgs<Model> >&... args)
const
285 return singularFluxMethod(args...);
289 template<
class Model, std::ptrdiff_t symmetry, std::size_t... LinArgsIdx, std::size_t... ArgsIdx>
290 class SingularFluxProvider<Model, symmetry, true, true,
293 : SingularFluxProviderBase<Model, symmetry, true,
294 IndexSequence<LinArgsIdx...>,
296 IndexSequence<ArgsIdx...> >
298 using BaseType = SingularFluxProviderBase<Model, symmetry,
true,
302 using BaseType::singularFluxMethod;
305 SingularFluxProvider(
const Model& m)
309 auto linearizedSingularFlux(
const TupleElement<LinArgsIdx, PDEModel::AllArgs<Model> >&... linArgs,
310 const TupleElement<ArgsIdx, PDEModel::AllArgs<Model> >&... args)
const
312 return singularFluxMethod(linArgs..., args...);
316 template<
class Model>
317 using NeedRobinFlux = BoolConstant<ModelTraits<Model>::template HasMethod<ModelIntrospection::flux>::value
319 ModelTraits<Model>::template HasMethod<ModelIntrospection::robinFlux>::value
321 ModelTraits<Model>::template HasMethod<ModelIntrospection::dirichlet>::value>;
322 template<
class Model>
323 using NeedLinearizedRobinFlux = BoolConstant<ModelTraits<Model>::template HasMethod<ModelIntrospection::linearizedFlux>::value
325 ModelTraits<Model>::template HasMethod<ModelIntrospection::linearizedRobinFlux>::value
327 ModelTraits<Model>::template HasMethod<ModelIntrospection::linearizedDirichlet>::value>;
328 template<
class Model>
329 using RobinFluxSignature = ModelIntrospection::ArgumentMask<SequenceMask<ModelIntrospection::pointIndex, ModelIntrospection::normalIndex>::value
331 ModelMethodSignatureClosure<Model, ModelIntrospection::flux>::value
333 ModelMethodSignatureClosure<Model, ModelIntrospection::robinFlux>::value
335 ModelMethodSignatureClosure<Model, ModelIntrospection::dirichlet>::value>;
336 template<
class Model>
337 using LinearizedRobinFluxSignature = ModelIntrospection::ArgumentMask<SequenceMask<ModelIntrospection::pointIndex, ModelIntrospection::normalIndex>::value
339 ModelMethodSignatureClosure<Model, ModelIntrospection::linearizedFlux>::value
341 ModelMethodSignatureClosure<Model, ModelIntrospection::linearizedRobinFlux>::value
343 ModelMethodSignatureClosure<Model, ModelIntrospection::linearizedDirichlet>::value>;
345 template<
class Model,
class PenaltyFunction>
346 using RobinFluxMethod = RobinFluxProvider<Model, Fem::ConstLocalFunction<PenaltyFunction>,
347 false, NeedRobinFlux<Model>::value,
348 IndexSequence<>, MaskSequence<RobinFluxSignature<Model>::signature()> >;
349 template<
class Model,
class PenaltyFunction>
350 using LinearizedRobinFluxMethod = RobinFluxProvider<Model, Fem::ConstLocalFunction<PenaltyFunction>,
351 true, NeedLinearizedRobinFlux<Model>::value,
352 MaskSequence<LinearizedRobinFluxSignature<Model>::linearizationSignature()>,
353 MaskSequence<LinearizedRobinFluxSignature<Model>::signature()> >;
355 template<
class Model>
356 using NeedSingularFlux = BoolConstant<ModelTraits<Model>::template HasMethod<ModelIntrospection::flux>::value
358 ModelTraits<Model>::template HasMethod<ModelIntrospection::singularFlux>::value
360 ModelTraits<Model>::template HasMethod<ModelIntrospection::dirichlet>::value>;
361 template<
class Model>
362 using NeedLinearizedSingularFlux = BoolConstant<ModelTraits<Model>::template HasMethod<ModelIntrospection::linearizedFlux>::value
364 ModelTraits<Model>::template HasMethod<ModelIntrospection::linearizedSingularFlux>::value
366 ModelTraits<Model>::template HasMethod<ModelIntrospection::linearizedDirichlet>::value>;
367 template<
class Model>
368 using SingularFluxSignature = ModelIntrospection::ArgumentMask<SequenceMask<ModelIntrospection::normalIndex>::value
370 ModelMethodSignatureClosure<Model, ModelIntrospection::flux>::value
372 ModelMethodSignatureClosure<Model, ModelIntrospection::singularFlux>::value
374 ModelMethodSignatureClosure<Model, ModelIntrospection::dirichlet>::value>;
375 template<
class Model>
376 using LinearizedSingularFluxSignature = ModelIntrospection::ArgumentMask<SequenceMask<ModelIntrospection::normalIndex>::value
378 ModelMethodSignatureClosure<Model, ModelIntrospection::linearizedFlux>::value
380 ModelMethodSignatureClosure<Model, ModelIntrospection::linearizedSingularFlux>::value
382 ModelMethodSignatureClosure<Model, ModelIntrospection::linearizedDirichlet>::value>;
384 template<
class Model, std::ptrdiff_t symmetry>
385 using SingularFluxMethod = SingularFluxProvider<Model, symmetry,
386 false, NeedSingularFlux<Model>::value && symmetry != 0,
387 IndexSequence<>, MaskSequence<SingularFluxSignature<Model>::signature()> >;
388 template<
class Model, std::ptrdiff_t symmetry>
389 using LinearizedSingularFluxMethod = SingularFluxProvider<Model, symmetry,
390 true, NeedLinearizedSingularFlux<Model>::value && symmetry != 0,
391 MaskSequence<LinearizedSingularFluxSignature<Model>::linearizationSignature()>,
392 MaskSequence<LinearizedSingularFluxSignature<Model>::signature()> >;
428 template<
class Model,
class PenaltyFunction,
class Symmetrize = SkeletonSymmetrizeDefault<Model> >
430 :
public ModelCrop<Model,
432 PDEModel::linearizedRobinFlux,
433 PDEModel::singularFlux,
434 PDEModel::linearizedSingularFlux,
436 PDEModel::linearizedDirichlet>
437 ,
public RobinFluxMethod<std::decay_t<Model>, PenaltyFunction>
438 ,
public LinearizedRobinFluxMethod<std::decay_t<Model>, PenaltyFunction>
439 ,
public SingularFluxMethod<std::decay_t<Model>, Symmetrize{}>
440 ,
public LinearizedSingularFluxMethod<std::decay_t<Model>, Symmetrize{}>
444 using BaseType = ModelCrop<Model,
446 PDEModel::linearizedRobinFlux,
447 PDEModel::singularFlux,
448 PDEModel::linearizedSingularFlux,
450 PDEModel::linearizedDirichlet>;
451 using ModelDecay = std::decay_t<Model>;
452 using PenaltyDecay = std::decay_t<PenaltyFunction>;
453 using LocalPenalty = Fem::ConstLocalFunction<PenaltyDecay>;
454 static constexpr std::ptrdiff_t symmetry = Symmetrize{};
455 using RobinFluxBase = RobinFluxMethod<ModelDecay, PenaltyDecay>;
456 using LinearizedRobinFluxBase = LinearizedRobinFluxMethod<ModelDecay, PenaltyDecay>;
457 using SingularFluxBase = SingularFluxMethod<ModelDecay, symmetry>;
458 using LinearizedSingularFluxBase = LinearizedSingularFluxMethod<ModelDecay, symmetry>;
462 "PenaltyFunction must provide a local function");
463 static_assert(std::is_convertible<
typename PenaltyDecay::FunctionSpaceType::RangeFieldType,
464 typename ModelDecay::RangeFieldType>::value,
465 "PenaltyFunction should be convertible to model's RangeFieldType");
467 "Symmetrize must be a sign.");
470 using ModelType = Model;
471 using typename BaseType::DomainType;
472 using typename BaseType::DomainRangeType;
473 using typename BaseType::DomainJacobianRangeType;
474 using typename BaseType::RangeType;
475 using typename BaseType::BoundaryConditionsType;
477 using BaseType::model;
479 template<
class ModelArg,
class FunctionArg,
480 std::enable_if_t<(std::is_constructible<BaseType, ModelArg>::value
481 && std::is_constructible<LocalPenalty, FunctionArg>::value
484 const std::string& name =
"")
486 , RobinFluxBase(model(), localPenalty_)
487 , LinearizedRobinFluxBase(model(), localPenalty_)
488 , SingularFluxBase(model())
489 , LinearizedSingularFluxBase(model())
490 , localPenalty_(std::forward<FunctionArg>(penalty))
491 , name_(name ==
"" ?
"NitscheDirichlet("+model().name()+
")" : name)
496 , RobinFluxBase(model(), localPenalty_)
497 , LinearizedRobinFluxBase(model(), localPenalty_)
498 , SingularFluxBase(model())
499 , LinearizedSingularFluxBase(model())
500 , localPenalty_(other.localPenalty_)
506 , RobinFluxBase(model(), localPenalty_)
507 , LinearizedRobinFluxBase(model(), localPenalty_)
508 , SingularFluxBase(model())
509 , LinearizedSingularFluxBase(model())
510 , localPenalty_(std::move(other.localPenalty_))
511 , name_(std::move(other.name_))
514 std::string name()
const
520 template<
class Entity>
521 void bind(
const Entity& entity)
523 BaseType::bind(entity);
524 localPenalty_.bind(entity);
530 localPenalty_.unbind();
535 template<
class Intersection>
539 wrappedSupported_ = model().classifyBoundary(intersection);
540 supported_.first = wrappedSupported_.first;
545 LocalPenalty localPenalty_;
546 BoundaryConditionsType wrappedSupported_;
547 BoundaryConditionsType supported_;
561 template<
class Model,
562 class PenaltyFunction,
563 class Symmetrize = SkeletonSymmetrizeDefault<Model>,
564 std::enable_if_t<(IsProperPDEModel<Model>::value
566 && !Expressions::IsPromotedTopLevel<PenaltyFunction>::value
573 NitscheDirichletBoundaryModel<Model, PenaltyFunction, Symmetrize>(
583 template<
class Model,
585 class Param = decltype(ModelParameters::nitscheDirichletPenalty()),
586 class Symmetrize = SkeletonSymmetrizeDefault<Model>,
587 std::enable_if_t<(IsPDEModel<Model>::value
588 && ModelMethodExists<Model, ModelIntrospection::dirichlet>::value
589 && IsTensor<Param>::value
590 && IsSign<Symmetrize>::value
594 const GridPart& gridPart,
595 Param&& p = ModelParameters::nitscheDirichletPenalty(),
596 Symmetrize = Symmetrize{})
605 template<
class Model,
class... T,
606 std::enable_if_t<(IsProperPDEModel<Model>::value
607 && !ModelMethodExists<Model, ModelIntrospection::dirichlet>::value
617 template<
class GridFunction,
620 class Symmetrize = Sign<1>,
623 && IsTensor<Param>::value
628 Param&& p = ModelParameters::nitscheDirichletPenalty(),
629 Indicator&& where = Indicator(),
630 Symmetrize = Symmetrize{})
634 std::forward<Param>(p) *
meshPenalty(values.gridPart()),
650 template<
class Model,
class PenaltyFunction,
class Symmetrize>
651 struct ExpressionTraits<PDEModel::NitscheDirichletBoundaryModel<Model, PenaltyFunction, Symmetrize> >
652 : ExpressionTraits<Model>
654 using ExpressionType = PDEModel::NitscheDirichletBoundaryModel<Model, PenaltyFunction, Symmetrize>;
655 using Definiteness =
typename ExpressionTraits<Model>::Definiteness;
656 static constexpr
bool isSymmetric = ExpressionTraits<Model>::isSymmetric && (Symmetrize{} == 1_f);
This model constructs from a given other model weak Dirichlet conditions as first introduced by .
Definition: nitschedirichletmodel.hh:441
constexpr decltype(auto) expressionClosure(T &&t)
Do-nothing default implementation for pathologic cases.
Definition: interface.hh:93
decltype(operate(std::declval< OptOrF >(), std::declval< Rest >()...)) ExpressionType
Generate the type of an expression by calling operate().
Definition: optimizationbase.hh:256
std::is_base_of< Tag, std::decay_t< A > > HasTag
Evaluate to std::true_type if std::decay_t<A> is derived from Tag, otherwise to std::false_type.
Definition: tags.hh:176
auto meshPenalty(const GridPart &gridPart)
Create a penalty function diverging with the inverse element diameter towards infinity.
Definition: meshpenalty.hh:21
void bind(const Entity &entity)
Unbind from the previously bound entity.
Definition: nitschedirichletmodel.hh:521
constexpr auto dirichletBoundaryModel(T &&values, Indicator &&where, const std::string &name="")
Generate the zero model for the empty indicator.
Definition: dirichletmodel.hh:237
auto nitscheDirichletModel(GridFunction &&values, Param &&p=ModelParameters::nitscheDirichletPenalty(), Indicator &&where=Indicator(), Symmetrize=Symmetrize{})
Create a model supplying weak Dirichet conditions from a given grid-function.
Definition: nitschedirichletmodel.hh:627
void unbind()
Unbind from the previously bound entity.
Definition: nitschedirichletmodel.hh:528
auto classifyBoundary(const Intersection &intersection)
Bind to the given intersection and classify the components w.r.t.
Definition: nitschedirichletmodel.hh:536
std::tuple_element_t< N, std::decay_t< TupleLike > > TupleElement
Forward to std::tuple_element<N, std::decay_t<T> >
Definition: access.hh:125
IndexConstant< SequenceMaskHelper< I... >::value > SequenceMask
Generate a bit-mask from the given index-sequence.
Definition: mask.hh:78
auto outer(T1 &&t1, T2 &&t2)
Outer tensor product.
Definition: expressions.hh:138
constexpr auto contractInner(T1 &&t1, T2 &&t2, IndexConstant< N >=IndexConstant< N >{})
Contraction over the #N inner dimensions.
Definition: expressions.hh:118
Sequence< std::size_t, V... > IndexSequence
Sequence of std::size_t values.
Definition: types.hh:64
typename ModelTraits< Model >::template Exists< ModelIntrospection::CheckMethodTag< tag >::value > ModelMethodExists
Check for either non-linear or linearized method.
Definition: modeltraits.hh:906
BoundaryIndicator::Constant< true > EntireBoundaryIndicator
A boundary indicator applying to all parts of the boundary.
Definition: boundaryindicator.hh:376
ModelIntrospection::Traits< Model > ModelTraits
Traits class for models.
Definition: modeltraits.hh:898
TrueType if T is a BoundaryIndicator.
Definition: boundaryindicator.hh:49
Definition: localfunctiontraits.hh:88
A structure defining some basic default types and methods.
Definition: modelbase.hh:41
Definition: fractionconstant.hh:173