OGS
MFrontGeneric.cpp
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#include "MFrontGeneric.h"
5
7{
8const char* varTypeToString(int v)
9{
10 using V = mgis::behaviour::Variable;
11 if (v == V::SCALAR)
12 {
13 return "SCALAR";
14 }
15 if (v == V::VECTOR)
16 {
17 return "VECTOR";
18 }
19 if (v == V::STENSOR)
20 {
21 return "STENSOR";
22 }
23 if (v == V::TENSOR)
24 {
25 return "TENSOR";
26 }
27
28 OGS_FATAL("Unknown variable type {}.", v);
29}
30
31int getEquivalentPlasticStrainOffset(mgis::behaviour::Behaviour const& b)
32{
33 return mgis::behaviour::contains(b.isvs, "EquivalentPlasticStrain")
34 ? mgis::behaviour::getVariableOffset(
35 b.isvs, "EquivalentPlasticStrain", b.hypothesis)
36 : -1;
37}
38
39template <int DisplacementDim>
41 std::vector<double> const& mfront_data,
42 std::optional<
44 mgis::behaviour::Behaviour const& behaviour)
45{
46 using VT = mgis::behaviour::Variable::Type;
49
50 std::vector<double> ogs_data(mfront_data.size());
51
52 std::size_t offset = 0;
53 constexpr auto kv_size =
55
56 for (auto const& [var1, var2] : behaviour.to_blocks)
57 {
58 std::size_t size;
59
60 auto const* const d_in = mfront_data.data() + offset;
61 auto* const d_out = ogs_data.data() + offset;
62
63 if (var1.type == VT::SCALAR && var2.type == VT::SCALAR)
64 {
65 size = 1;
66 *d_out = *d_in;
67 }
68 else if (var1.type == VT::SCALAR && var2.type == VT::STENSOR)
69 {
70 assert(getVariableSize(var2, behaviour.hypothesis) == kv_size);
71 size = kv_size;
72
73 if (Q)
74 {
76 "Coordinate frame rotation not yet implemented for "
77 "dScalar/dSTensor.");
78 }
79
80 Eigen::Map<KV>{d_out} = eigenSwap45View(Eigen::Map<const KV>{d_in});
81 }
82 else if (var1.type == VT::STENSOR && var2.type == VT::SCALAR)
83 {
84 assert(getVariableSize(var1, behaviour.hypothesis) == kv_size);
85 size = kv_size;
86
87 if (Q)
88 {
90 "Coordinate frame rotation not yet implemented for "
91 "dSTensor/dScalar.");
92 }
93
94 Eigen::Map<KV>{d_out} = eigenSwap45View(Eigen::Map<const KV>{d_in});
95 }
96 else if (var1.type == VT::STENSOR && var2.type == VT::STENSOR)
97 {
98 assert(getVariableSize(var1, behaviour.hypothesis) == kv_size);
99 assert(getVariableSize(var2, behaviour.hypothesis) == kv_size);
100 size = kv_size * kv_size;
101
102 if (Q)
103 {
104 Eigen::Map<KM>{d_out} =
105 *Q * eigenSwap45View(Eigen::Map<const KM>{d_in}) *
106 Q->transpose();
107 }
108 else
109 {
110 Eigen::Map<KM>{d_out} =
111 eigenSwap45View(Eigen::Map<const KM>{d_in});
112 }
113 }
114 else
115 {
116 OGS_FATAL("unsupported variable type combination");
117 }
118
119 offset += size;
120 }
121
122 return {std::move(ogs_data)};
123}
124
126 std::vector<double> const& mfront_data,
127 std::optional<MathLib::KelvinVector::KelvinMatrixType<2>> const& Q,
128 mgis::behaviour::Behaviour const& behaviour);
130 std::vector<double> const& mfront_data,
131 std::optional<MathLib::KelvinVector::KelvinMatrixType<3>> const& Q,
132 mgis::behaviour::Behaviour const& behaviour);
133
134} // namespace MaterialLib::Solids::MFront
#define OGS_FATAL(...)
Definition Error.h:19
OGSMFrontTangentOperatorData tangentOperatorDataMFrontToOGS(std::vector< double > const &mfront_data, std::optional< MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > > const &Q, mgis::behaviour::Behaviour const &behaviour)
template OGSMFrontTangentOperatorData tangentOperatorDataMFrontToOGS< 3 >(std::vector< double > const &mfront_data, std::optional< MathLib::KelvinVector::KelvinMatrixType< 3 > > const &Q, mgis::behaviour::Behaviour const &behaviour)
template OGSMFrontTangentOperatorData tangentOperatorDataMFrontToOGS< 2 >(std::vector< double > const &mfront_data, std::optional< MathLib::KelvinVector::KelvinMatrixType< 2 > > const &Q, mgis::behaviour::Behaviour const &behaviour)
constexpr auto eigenSwap45View(Eigen::MatrixBase< Derived > const &matrix)
const char * varTypeToString(int v)
int getEquivalentPlasticStrainOffset(mgis::behaviour::Behaviour const &b)
constexpr int kelvin_vector_dimensions(int const displacement_dim)
Kelvin vector dimensions for given displacement dimension.
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), 1, Eigen::ColMajor > KelvinVectorType
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), kelvin_vector_dimensions(DisplacementDim), Eigen::RowMajor > KelvinMatrixType
Used for disambiguation with MFront's thermodynamic forces data.