OGS
FormEigenTensor.cpp
Go to the documentation of this file.
1/*
2 * \file
3 * \copyright
4 * Copyright (c) 2012-2025, OpenGeoSys Community (http://www.opengeosys.org)
5 * Distributed under a Modified BSD License.
6 * See accompanying file LICENSE.txt or
7 * http://www.opengeosys.org/project/license
8 *
9 * Created on July 31, 2019, 11:28 AM
10 */
11
12#include "FormEigenTensor.h"
13
16
17namespace MaterialPropertyLib
18{
19template <int GlobalDim>
21{
22 Eigen::Matrix<double, GlobalDim, GlobalDim> operator()(
23 double const& value) const
24 {
25 return Eigen::Matrix<double, GlobalDim, GlobalDim>::Identity() * value;
26 }
27
28 Eigen::Matrix<double, GlobalDim, GlobalDim> operator()(
29 Eigen::Vector2d const& values) const
30 {
31 if constexpr (GlobalDim == 2)
32 {
33 return values.asDiagonal();
34 }
36 "Cannot convert 2d vector with values [{}] to {:d}x{:d} diagonal "
37 "matrix.",
38 values, GlobalDim, GlobalDim);
39 }
40
41 Eigen::Matrix<double, GlobalDim, GlobalDim> operator()(
42 Eigen::Vector3d const& values) const
43 {
44 if constexpr (GlobalDim == 3)
45 {
46 return values.asDiagonal();
47 }
49 "Cannot convert 3d vector with values [{}] to {:d}x{:d} diagonal "
50 "matrix.",
51 values, GlobalDim, GlobalDim);
52 }
53
54 Eigen::Matrix<double, GlobalDim, GlobalDim> operator()(
55 Eigen::Matrix<double, 2, 2> const& values) const
56 {
57 if constexpr (GlobalDim == 2)
58 {
59 return values;
60 }
62 "Cannot convert a 2d tensor with values [{}] to {:d}x{:d} matrix",
63 values, GlobalDim, GlobalDim);
64 }
65 Eigen::Matrix<double, GlobalDim, GlobalDim> operator()(
66 Eigen::Matrix<double, 3, 3> const& values) const
67 {
68 if constexpr (GlobalDim == 3)
69 {
70 return values;
71 }
73 "Cannot convert a 3d tensor with values [{}] to {:d}x{:d} matrix",
74 values, GlobalDim, GlobalDim);
75 }
76
77 Eigen::Matrix<double, GlobalDim, GlobalDim> operator()(
78 Eigen::Matrix<double, 4, 1> const& values) const
79 {
80 Eigen::Matrix<double, GlobalDim, GlobalDim> result;
81 if constexpr (GlobalDim == 2)
82 { // skip the z-direction in this case
83 result << values[0], values[3], values[3], values[1];
84 }
85 if constexpr (GlobalDim == 3)
86 {
87 result << values[0], values[3], 0, values[3], values[1], 0, 0, 0,
88 values[2];
89 }
90 return result;
91 }
92
93 Eigen::Matrix<double, GlobalDim, GlobalDim> operator()(
94 Eigen::Matrix<double, 6, 1> const& values) const
95 {
96 if constexpr (GlobalDim == 3)
97 {
98 Eigen::Matrix<double, GlobalDim, GlobalDim> result;
99 result << values[0], values[3], values[5], values[3], values[1],
100 values[4], values[5], values[4], values[2];
101 return result;
102 }
103
104 OGS_FATAL(
105 "Cannot convert a symmetric 3d tensor with values [{}] to a {}x{} "
106 "matrix",
107 values, GlobalDim, GlobalDim);
108 }
109
110 Eigen::Matrix<double, GlobalDim, GlobalDim> operator()(
111 Eigen::MatrixXd const& values) const
112 {
113 if (GlobalDim == values.rows() && GlobalDim == values.cols())
114 {
115 return values;
116 }
117
118 OGS_FATAL(
119 "Cannot convert a dynamic {}x{} matrix with values [{}] to a {}x{} "
120 "matrix",
121 values.rows(), values.cols(), values, GlobalDim, GlobalDim);
122 }
123};
124
125template <int GlobalDim>
126Eigen::Matrix<double, GlobalDim, GlobalDim> formEigenTensor(
128{
129 return std::visit(FormEigenTensor<GlobalDim>(), values);
130}
131
132template Eigen::Matrix<double, 1, 1> formEigenTensor<1>(
134
135template Eigen::Matrix<double, 2, 2> formEigenTensor<2>(
137
138template Eigen::Matrix<double, 3, 3> formEigenTensor<3>(
140
141template Eigen::Matrix<double, 4, 4> formEigenTensor<4>(
143
144template Eigen::Matrix<double, 6, 6> formEigenTensor<6>(
146
147} // namespace MaterialPropertyLib
#define OGS_FATAL(...)
Definition Error.h:26
template Eigen::Matrix< double, 4, 4 > formEigenTensor< 4 >(MaterialPropertyLib::PropertyDataType const &values)
template Eigen::Matrix< double, 6, 6 > formEigenTensor< 6 >(MaterialPropertyLib::PropertyDataType const &values)
template Eigen::Matrix< double, 3, 3 > formEigenTensor< 3 >(MaterialPropertyLib::PropertyDataType const &values)
Eigen::Matrix< double, GlobalDim, GlobalDim > formEigenTensor(MaterialPropertyLib::PropertyDataType const &values)
template Eigen::Matrix< double, 1, 1 > formEigenTensor< 1 >(MaterialPropertyLib::PropertyDataType const &values)
template Eigen::Matrix< double, 2, 2 > formEigenTensor< 2 >(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
Definition Property.h:31
Eigen::Matrix< double, GlobalDim, GlobalDim > operator()(Eigen::Vector2d const &values) const
Eigen::Matrix< double, GlobalDim, GlobalDim > operator()(Eigen::Matrix< double, 2, 2 > const &values) const
Eigen::Matrix< double, GlobalDim, GlobalDim > operator()(double const &value) const
Eigen::Matrix< double, GlobalDim, GlobalDim > operator()(Eigen::Vector3d const &values) const
Eigen::Matrix< double, GlobalDim, GlobalDim > operator()(Eigen::MatrixXd const &values) const
Eigen::Matrix< double, GlobalDim, GlobalDim > operator()(Eigen::Matrix< double, 4, 1 > const &values) const
Eigen::Matrix< double, GlobalDim, GlobalDim > operator()(Eigen::Matrix< double, 6, 1 > const &values) const
Eigen::Matrix< double, GlobalDim, GlobalDim > operator()(Eigen::Matrix< double, 3, 3 > const &values) const