/** * \file * \copyright * Copyright (c) 2012-2023, OpenGeoSys Community (http://www.opengeosys.org) * Distributed under a Modified BSD License. * See accompanying file LICENSE.txt or * http://www.opengeosys.org/project/license * */ #pragma once #include #include "NumLib/Fem/FiniteElement/ElementTraitsLagrange.h" #include "NumLib/Fem/ShapeMatrixPolicy.h" namespace NumLib { namespace detail { template using GetMeshElement = typename ElementTraitsLagrange::Element; template using GetShapeFunctionHigherOrder = typename ElementTraitsLagrange::ShapeFunction; template using GetShapeFunctionLowerOrder = typename ElementTraitsLagrange::LowerOrderShapeFunction; template using GetShapeMatrixPolicy = // dim does not matter, here, but // NumLib::detail::naturalCoordinatesMappingComputeShapeMatrices<>() // must be instantiated for this dim. ShapeMatrixPolicyType; template using GetShapeMatrix_N = typename ShapeMatrixPolicy::ShapeMatrices::ShapeType; } // namespace detail class ShapeMatrixCache { using ETLs = NumLib::AllElementTraitsLagrange; using MeshElements = boost::mp11::mp_transform; // Higher order shape functions using ShapeFunctionsHigherOrder = boost::mp11::mp_transform; using ShapeMatrixPoliciesHigherOrder = boost::mp11::mp_transform; using ShapeMatricesHigherOrder_N = boost::mp11::mp_transform; // std::tuple, ...> using ShapeMatrixVectorsHigherOrder_N = boost::mp11::mp_transform; static_assert( std::is_same_v>, "The type alias ShapeMatrixVectorsHigherOrder_N must be a " "std::tuple<...>."); // Lower order shape functions using ShapeFunctionsLowerOrder = boost::mp11::mp_transform; using ShapeMatrixPoliciesLowerOrder = boost::mp11::mp_transform; using ShapeMatricesLowerOrder_N = boost::mp11::mp_transform; // std::tuple, ...> using ShapeMatrixVectorsLowerOrder_N = boost::mp11::mp_transform; static_assert( std::is_same_v< ShapeMatrixVectorsLowerOrder_N, boost::mp11::mp_rename>, "The type alias ShapeMatrixVectorsLowerOrder_N must be a " "std::tuple<...>."); public: explicit ShapeMatrixCache(unsigned const integration_order); template auto const& NsHigherOrder() const { using Index = boost::mp11::mp_find; return std::get(Nss_higher_order_); } template auto const& NsLowerOrder() const { using Index = boost::mp11::mp_find; return std::get(Nss_lower_order_); } /// Returns the number of elements in the ShapeMatrixVectorsHigherOrder_N /// tuple. static constexpr std::size_t size() { return boost::mp11::mp_size::value; } template using ShapeFunctionHigherOrder = boost::mp11::mp_at>; template using ShapeFunctionLowerOrder = boost::mp11::mp_at>; private: ShapeMatrixVectorsHigherOrder_N Nss_higher_order_; ShapeMatrixVectorsLowerOrder_N Nss_lower_order_; }; } // namespace NumLib