OGS
ShapeMatrixCache.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#pragma once
5
6#include <boost/mp11.hpp>
7
10
11namespace NumLib
12{
13namespace detail
14{
15template <typename ElementTraitsLagrange>
16using GetMeshElement = typename ElementTraitsLagrange::Element;
17
18template <typename ElementTraitsLagrange>
20 typename ElementTraitsLagrange::ShapeFunction;
21
22template <typename ElementTraitsLagrange>
24 typename ElementTraitsLagrange::LowerOrderShapeFunction;
25
26template <typename ShapeFunction>
28 // dim does not matter, here, but
29 // NumLib::detail::naturalCoordinatesMappingComputeShapeMatrices<>()
30 // must be instantiated for this dim.
32
33template <typename ShapeMatrixPolicy>
34using GetShapeMatrix_N = typename ShapeMatrixPolicy::ShapeMatrices::ShapeType;
35} // namespace detail
36
38{
40
42 boost::mp11::mp_transform<detail::GetMeshElement, ETLs>;
43
44 // Higher order shape functions
45
47 boost::mp11::mp_transform<detail::GetShapeFunctionHigherOrder, ETLs>;
49 boost::mp11::mp_transform<detail::GetShapeMatrixPolicy,
52 boost::mp11::mp_transform<detail::GetShapeMatrix_N,
54
55 // std::tuple<std::vector<ShapeMatrix_N>, ...>
57 boost::mp11::mp_transform<std::vector, ShapeMatricesHigherOrder_N>;
58
59 static_assert(
61 boost::mp11::mp_rename<ShapeMatrixVectorsHigherOrder_N,
62 std::tuple>>,
63 "The type alias ShapeMatrixVectorsHigherOrder_N must be a "
64 "std::tuple<...>.");
65
66 // Lower order shape functions
67
69 boost::mp11::mp_transform<detail::GetShapeFunctionLowerOrder, ETLs>;
71 boost::mp11::mp_transform<detail::GetShapeMatrixPolicy,
74 boost::mp11::mp_transform<detail::GetShapeMatrix_N,
76
77 // std::tuple<std::vector<ShapeMatrix_N>, ...>
79 boost::mp11::mp_transform<std::vector, ShapeMatricesLowerOrder_N>;
80
81 static_assert(
82 std::is_same_v<
84 boost::mp11::mp_rename<ShapeMatrixVectorsLowerOrder_N, std::tuple>>,
85 "The type alias ShapeMatrixVectorsLowerOrder_N must be a "
86 "std::tuple<...>.");
87
88public:
89 explicit ShapeMatrixCache(unsigned const integration_order);
90
91 template <typename MeshElement>
92 auto const& NsHigherOrder() const
93 {
94 using Index = boost::mp11::mp_find<MeshElements, MeshElement>;
95 return std::get<Index::value>(Nss_higher_order_);
96 }
97
98 template <typename MeshElement>
99 auto const& NsLowerOrder() const
100 {
101 using Index = boost::mp11::mp_find<MeshElements, MeshElement>;
102 return std::get<Index::value>(Nss_lower_order_);
103 }
104
107 static constexpr std::size_t size()
108 {
109 return boost::mp11::mp_size<ETLs>::value;
110 }
111
112 template <typename MeshElement>
114 boost::mp11::mp_at<ShapeFunctionsHigherOrder,
115 boost::mp11::mp_find<MeshElements, MeshElement>>;
116
117 template <typename MeshElement>
119 boost::mp11::mp_at<ShapeFunctionsLowerOrder,
120 boost::mp11::mp_find<MeshElements, MeshElement>>;
121
122private:
125};
126} // namespace NumLib
EigenFixedShapeMatrixPolicy< ShapeFunction, GlobalDim > ShapeMatrixPolicyType
boost::mp11::mp_transform< std::vector, ShapeMatricesLowerOrder_N > ShapeMatrixVectorsLowerOrder_N
auto const & NsLowerOrder() const
boost::mp11::mp_transform< detail::GetMeshElement, ETLs > MeshElements
boost::mp11::mp_transform< detail::GetShapeMatrixPolicy, ShapeFunctionsHigherOrder > ShapeMatrixPoliciesHigherOrder
boost::mp11::mp_transform< detail::GetShapeFunctionHigherOrder, ETLs > ShapeFunctionsHigherOrder
boost::mp11::mp_transform< detail::GetShapeFunctionLowerOrder, ETLs > ShapeFunctionsLowerOrder
boost::mp11::mp_at< ShapeFunctionsLowerOrder, boost::mp11::mp_find< MeshElements, MeshElement > > ShapeFunctionLowerOrder
ShapeMatrixCache(unsigned const integration_order)
boost::mp11::mp_transform< std::vector, ShapeMatricesHigherOrder_N > ShapeMatrixVectorsHigherOrder_N
static constexpr std::size_t size()
boost::mp11::mp_at< ShapeFunctionsHigherOrder, boost::mp11::mp_find< MeshElements, MeshElement > > ShapeFunctionHigherOrder
boost::mp11::mp_transform< detail::GetShapeMatrix_N, ShapeMatrixPoliciesHigherOrder > ShapeMatricesHigherOrder_N
NumLib::AllElementTraitsLagrange ETLs
boost::mp11::mp_transform< detail::GetShapeMatrixPolicy, ShapeFunctionsLowerOrder > ShapeMatrixPoliciesLowerOrder
boost::mp11::mp_transform< detail::GetShapeMatrix_N, ShapeMatrixPoliciesLowerOrder > ShapeMatricesLowerOrder_N
ShapeMatrixVectorsLowerOrder_N Nss_lower_order_
auto const & NsHigherOrder() const
ShapeMatrixVectorsHigherOrder_N Nss_higher_order_
typename ElementTraitsLagrange::ShapeFunction GetShapeFunctionHigherOrder
typename ElementTraitsLagrange::Element GetMeshElement
typename ShapeMatrixPolicy::ShapeMatrices::ShapeType GetShapeMatrix_N
typename ElementTraitsLagrange::LowerOrderShapeFunction GetShapeFunctionLowerOrder
ShapeMatrixPolicyType< ShapeFunction, 3 > GetShapeMatrixPolicy
BaseLib::TMP::Map_t< ElementTraitsLagrange, MeshLib::AllElementTypes > AllElementTraitsLagrange