15template <
int GlobalDim>
18 constexpr Eigen::Matrix<double, GlobalDim, GlobalDim>
operator()(
19 double const& value)
const
21 return Eigen::Matrix<double, GlobalDim, GlobalDim>::Identity() * value;
25 template <
int Dim = GlobalDim>
26 constexpr std::enable_if_t<Dim == 2, Eigen::Matrix<double, 2, 2>>
29 return values.asDiagonal();
33 template <
int Dim = GlobalDim>
34 constexpr std::enable_if_t<Dim != 2,
35 Eigen::Matrix<double, GlobalDim, GlobalDim>>
39 "Cannot convert 2d vector with values [{}] to {:d}x{:d} diagonal "
41 values, GlobalDim, GlobalDim);
45 template <
int Dim = GlobalDim>
46 constexpr std::enable_if_t<Dim == 3, Eigen::Matrix<double, 3, 3>>
49 return values.asDiagonal();
53 template <
int Dim = GlobalDim>
54 constexpr std::enable_if_t<Dim != 3,
55 Eigen::Matrix<double, GlobalDim, GlobalDim>>
59 "Cannot convert 3d vector with values [{}] to {:d}x{:d} diagonal "
61 values, GlobalDim, GlobalDim);
65 template <
int Dim = GlobalDim>
66 constexpr std::enable_if_t<Dim == 2, Eigen::Matrix<double, 2, 2>>
67 operator()(Eigen::Matrix<double, 2, 2>
const& values)
const
73 template <
int Dim = GlobalDim>
74 constexpr std::enable_if_t<Dim != 2,
75 Eigen::Matrix<double, GlobalDim, GlobalDim>>
76 operator()(Eigen::Matrix<double, 2, 2>
const& values)
const
79 "Cannot convert a 2d tensor with values [{}] to {:d}x{:d} matrix",
80 values, GlobalDim, GlobalDim);
84 template <
int Dim = GlobalDim>
85 constexpr std::enable_if_t<Dim == 3, Eigen::Matrix<double, 3, 3>>
86 operator()(Eigen::Matrix<double, 3, 3>
const& values)
const
92 template <
int Dim = GlobalDim>
93 constexpr std::enable_if_t<Dim != 3,
94 Eigen::Matrix<double, GlobalDim, GlobalDim>>
95 operator()(Eigen::Matrix<double, 3, 3>
const& values)
const
98 "Cannot convert a 3d tensor with values [{}] to {:d}x{:d} matrix",
99 values, GlobalDim, GlobalDim);
102 constexpr Eigen::Matrix<double, GlobalDim, GlobalDim>
operator()(
103 Eigen::Matrix<double, 4, 1>
const& values)
const
105 if constexpr (GlobalDim == 2)
107 Eigen::Matrix<double, GlobalDim, GlobalDim> result;
108 result << values[0], values[3], values[3], values[1];
111 else if constexpr (GlobalDim == 3)
113 Eigen::Matrix<double, GlobalDim, GlobalDim> result;
114 result << values[0], values[3], 0, values[3], values[1], 0, 0, 0,
120 OGS_FATAL(
"Cannot convert 4d vector to {:d}x{:d} matrix", GlobalDim,
125 template <
int Dim = GlobalDim>
126 constexpr std::enable_if_t<Dim == 3, Eigen::Matrix<double, 3, 3>>
129 Eigen::Matrix<double, 3, 3> result;
130 result << values[0], values[3], values[5], values[3], values[1],
131 values[4], values[5], values[4], values[2];
136 template <
int Dim = GlobalDim>
137 constexpr std::enable_if_t<Dim != 3,
138 Eigen::Matrix<double, GlobalDim, GlobalDim>>
142 "Cannot convert a symmetric 3d tensor with values [{}] to a {}x{} "
144 values, GlobalDim, GlobalDim);
148 Eigen::MatrixXd
const& values)
const
150 if (GlobalDim == values.rows() && GlobalDim == values.cols())
156 "Cannot convert a dynamic {}x{} matrix with values [{}] to a {}x{} "
158 values.rows(), values.cols(), values, GlobalDim, GlobalDim);
162template <
int GlobalDim>
constexpr Eigen::Matrix< double, GlobalDim, GlobalDim > formEigenTensor(MaterialPropertyLib::PropertyDataType const &values)
std::variant< double, Eigen::Matrix< double, 2, 1 >, Eigen::Matrix< double, 3, 1 >, Eigen::Matrix< double, 2, 2 >, Eigen::Matrix< double, 3, 3 >, Eigen::Matrix< double, 4, 1 >, Eigen::Matrix< double, 6, 1 >, Eigen::MatrixXd > PropertyDataType