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 return "SCALAR";
13 if (v == V::VECTOR)
14 return "VECTOR";
15 if (v == V::STENSOR)
16 return "STENSOR";
17 if (v == V::TENSOR)
18 return "TENSOR";
19
20 OGS_FATAL("Unknown variable type {}.", v);
21}
22
23int getEquivalentPlasticStrainOffset(mgis::behaviour::Behaviour const& b)
24{
25 return mgis::behaviour::contains(b.isvs, "EquivalentPlasticStrain")
26 ? mgis::behaviour::getVariableOffset(
27 b.isvs, "EquivalentPlasticStrain", b.hypothesis)
28 : -1;
29}
30
31template <int DisplacementDim>
33 std::vector<double> const& mfront_data,
34 std::optional<
36 mgis::behaviour::Behaviour const& behaviour)
37{
38 using VT = mgis::behaviour::Variable::Type;
41
42 std::vector<double> ogs_data(mfront_data.size());
43
44 std::size_t offset = 0;
45 constexpr auto kv_size =
47
48 for (auto const& [var1, var2] : behaviour.to_blocks)
49 {
50 std::size_t size;
51
52 auto const* const d_in = mfront_data.data() + offset;
53 auto* const d_out = ogs_data.data() + offset;
54
55 if (var1.type == VT::SCALAR && var2.type == VT::SCALAR)
56 {
57 size = 1;
58 *d_out = *d_in;
59 }
60 else if (var1.type == VT::SCALAR && var2.type == VT::STENSOR)
61 {
62 assert(getVariableSize(var2, behaviour.hypothesis) == kv_size);
63 size = kv_size;
64
65 if (Q)
66 {
68 "Coordinate frame rotation not yet implemented for "
69 "dScalar/dSTensor.");
70 }
71
72 Eigen::Map<KV>{d_out} = eigenSwap45View(Eigen::Map<const KV>{d_in});
73 }
74 else if (var1.type == VT::STENSOR && var2.type == VT::SCALAR)
75 {
76 assert(getVariableSize(var1, behaviour.hypothesis) == kv_size);
77 size = kv_size;
78
79 if (Q)
80 {
82 "Coordinate frame rotation not yet implemented for "
83 "dSTensor/dScalar.");
84 }
85
86 Eigen::Map<KV>{d_out} = eigenSwap45View(Eigen::Map<const KV>{d_in});
87 }
88 else if (var1.type == VT::STENSOR && var2.type == VT::STENSOR)
89 {
90 assert(getVariableSize(var1, behaviour.hypothesis) == kv_size);
91 assert(getVariableSize(var2, behaviour.hypothesis) == kv_size);
92 size = kv_size * kv_size;
93
94 if (Q)
95 {
96 Eigen::Map<KM>{d_out} =
97 *Q * eigenSwap45View(Eigen::Map<const KM>{d_in}) *
98 Q->transpose();
99 }
100 else
101 {
102 Eigen::Map<KM>{d_out} =
103 eigenSwap45View(Eigen::Map<const KM>{d_in});
104 }
105 }
106 else
107 {
108 OGS_FATAL("unsupported variable type combination");
109 }
110
111 offset += size;
112 }
113
114 return {std::move(ogs_data)};
115}
116
118 std::vector<double> const& mfront_data,
119 std::optional<MathLib::KelvinVector::KelvinMatrixType<2>> const& Q,
120 mgis::behaviour::Behaviour const& behaviour);
122 std::vector<double> const& mfront_data,
123 std::optional<MathLib::KelvinVector::KelvinMatrixType<3>> const& Q,
124 mgis::behaviour::Behaviour const& behaviour);
125
126} // 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.