6#include <MGIS/Behaviour/Variable.hxx>
7#include <boost/mp11.hpp>
8#include <range/v3/view/enumerate.hpp>
9#include <range/v3/view/filter.hpp>
10#include <range/v3/view/map.hpp>
11#include <range/v3/view/zip.hpp>
24static constexpr std::array<double, 3 * 3 * 3 * 3>
56template <
typename Gradients,
typename TDynForces,
typename ExtStateVars>
59 static_assert(boost::mp11::mp_is_set<Gradients>::value);
60 static_assert(boost::mp11::mp_is_set<TDynForces>::value);
61 static_assert(boost::mp11::mp_is_set<ExtStateVars>::value);
64 boost::mp11::mp_append<Gradients, ExtStateVars>;
66 static_assert(boost::mp11::mp_is_set<GradientsAndExtStateVars>::value);
69 mp_product<boost::mp11::mp_list, TDynForces, GradientsAndExtStateVars>;
85template <
int DisplacementDim,
typename ForcesGradsCombinations>
88 static_assert(boost::mp11::mp_is_set<ForcesGradsCombinations>::value);
98 std::vector<std::pair<mgis::behaviour::Variable,
99 mgis::behaviour::Variable>>
const& to_blocks)
103 std::vector<bool> used_blocks(
104 to_blocks.size(),
false);
106 boost::mp11::mp_for_each<ForcesGradsCombinations>(
109 this]<
typename Force,
typename GradOrExtStateVar>(
110 boost::mp11::mp_list<Force, GradOrExtStateVar>)
112 std::size_t data_offset = 0;
113 for (
auto [
block, is_used] :
114 ranges::views::zip(to_blocks, used_blocks))
116 auto const& [force, grad] =
block;
117 if (force.name == Force::name &&
118 grad.name == GradOrExtStateVar::name)
120 auto constexpr block_idx =
127 data_offset +=
size(force.type) *
size(grad.type);
132 auto indices = ranges::views::enumerate(used_blocks) |
133 ranges::views::filter([](
auto const& pair)
134 {
return !pair.second; }) |
137 if (!indices.empty())
139 ERR(
"There are unused tangent operator blocks provided by MFront. "
140 "Following blocks are unused:");
142 for (
auto const i : indices)
144 auto const& [force, grad] = to_blocks[i];
145 ERR(
"\t{}/{}", force.name, grad.name);
147 OGS_FATAL(
"All tangent operator blocks must be used.");
157 template <
typename Force,
typename GradOrExtStateVar>
163 boost::mp11::mp_contains<
165 boost::mp11::mp_list<Force, GradOrExtStateVar>>::value,
166 "Requested tangent block was not created in the "
167 "OGSMFrontTangentOperatorBlocksView.");
170 const auto offset =
offsets_[index];
173 constexpr auto grad_size =
176 if constexpr (grad_size == 1 && force_size == 1)
183 return data.
data[offset];
187 constexpr auto order =
188 grad_size == 1 ? Eigen::ColMajor : Eigen::RowMajor;
190 using Result = Eigen::Map<
191 const Eigen::Matrix<double, force_size, grad_size, order>>;
199 return Result{data.
data.data() + offset};
204 static constexpr std::size_t
size(mgis::behaviour::Variable::Type vt)
206 using VT = mgis::behaviour::Variable::Type;
216 return DisplacementDim;
228 case VT::HIGHER_ORDER_TENSOR:
233 OGS_FATAL(
"Unsupported MGIS variable type {}.",
238 template <
typename Force,
typename GradOrExtStateVar>
241 return boost::mp11::mp_find<
243 boost::mp11::mp_list<Force, GradOrExtStateVar>>::value;
250 std::array<std::size_t,
251 boost::mp11::mp_size<ForcesGradsCombinations>::value>
void ERR(fmt::format_string< Args... > fmt, Args &&... args)
OGSMFrontTangentOperatorBlocksView(std::vector< std::pair< mgis::behaviour::Variable, mgis::behaviour::Variable > > const &to_blocks)
static constexpr std::size_t size(mgis::behaviour::Variable::Type vt)
static constexpr std::size_t blockIndex()
Computes the index of a tangent operator block in the offsets_ array.
static constexpr std::size_t invalid_offset_
std::array< std::size_t, boost::mp11::mp_size< ForcesGradsCombinations >::value > offsets_
auto block(Force, GradOrExtStateVar, OGSMFrontTangentOperatorData const &data) const
constexpr auto to_underlying(E e) noexcept
Converts an enumeration to its underlying type.
static constexpr std::array< double, 3 *3 *3 *3 > OGSMFrontTangentOperatorBlocksViewZeroes
constexpr int tensorSize(int dim)
See Tensor type for details.
constexpr int kelvin_vector_dimensions(int const displacement_dim)
Kelvin vector dimensions for given displacement dimension.
boost::mp11:: mp_product< boost::mp11::mp_list, TDynForces, GradientsAndExtStateVars > type
boost::mp11::mp_append< Gradients, ExtStateVars > GradientsAndExtStateVars
Used for disambiguation with MFront's thermodynamic forces data.
std::vector< double > data