21 template <
bool strainlike = false>
22 struct VectorizeWithVoigt
24 template <
typename Derived>
25 static auto transform(
const Eigen::DenseBase<Derived>& mat) {
26 return toVoigt(mat.derived(), strainlike);
30 struct VectorizeGeneric
32 template <
typename Derived>
33 static auto transform(
const Eigen::DenseBase<Derived>& mat) {
34 return mat.derived().reshaped().eval();
38 template <
bool strainlike = false>
39 struct MatricizeWithVoigt
41 template <
typename Derived,
int RowsAtCompileTime,
int ColsAtCompileTime>
42 static auto transform(
const Eigen::DenseBase<Derived>& vec,
int rows = RowsAtCompileTime,
43 int cols = ColsAtCompileTime) {
44 assert(rows == RowsAtCompileTime && cols == ColsAtCompileTime &&
45 "Only the fixed size values work for voigt matrices and vectors");
46 static_assert(RowsAtCompileTime != Eigen::Dynamic and ColsAtCompileTime != Eigen::Dynamic,
47 "Voigt notation only available for fixed size vectors and matrices");
48 return fromVoigt(vec.derived(), strainlike);
52 struct MatricizeGeneric
54 template <
typename Derived,
int RowsAtCompileTime,
int ColsAtCompileTime>
55 static auto transform(
const Eigen::DenseBase<Derived>& vec,
int rows = RowsAtCompileTime,
56 int cols = ColsAtCompileTime) {
57 return vec.derived().reshaped(Eigen::fix<RowsAtCompileTime>(rows), Eigen::fix<ColsAtCompileTime>(cols)).eval();
63namespace ResultTypes {
64#define REGISTER_RESULTTYPE_IMPL(resultTypeName, rowsExpr, colsExpr, MaxRowsExpr, MaxColsExpr, VectorizeStruct, \
66 template <typename ScalarType, int gridDim, int worldDim> \
67 struct resultTypeName \
69 friend std::string toString(resultTypeName) { return #resultTypeName; } \
71 using type = Eigen::Matrix<ScalarType, rowsExpr, colsExpr, 0, MaxRowsExpr, MaxColsExpr>; \
72 using Vectorizer = VectorizeStruct; \
73 using Matricizer = MatricizeStruct; \
75 template <typename ScalarType_, int gridDim_, int worldDim_> \
76 using Rebind = resultTypeName<ScalarType_, gridDim_, worldDim_>; \
86#define REGISTER_SIMPLE_SYMMETRIC_RESULTTYPE(resultTypeName, rowsExpr, colsExpr, strainlike) \
87 REGISTER_RESULTTYPE_IMPL(resultTypeName, rowsExpr, colsExpr, rowsExpr, colsExpr, \
88 Ikarus::Impl::VectorizeWithVoigt<strainlike>, Ikarus::Impl::MatricizeWithVoigt<strainlike>)
97#define REGISTER_RESULTTYPE(resultTypeName, rowsExpr, colsExpr) \
98 REGISTER_RESULTTYPE_IMPL(resultTypeName, rowsExpr, colsExpr, Ikarus::Impl::VectorizeGeneric, \
99 Ikarus::Impl::MatricizeGeneric)
109#define REGISTER_RESERVED_RESULTTYPE(resultTypeName, rowsExpr, colsExpr, MaxRowsExpr, MaxColsExpr) \
110 REGISTER_RESULTTYPE_IMPL(resultTypeName, rowsExpr, colsExpr, MaxRowsExpr, MaxColsExpr, \
111 Ikarus::Impl::VectorizeGeneric, Ikarus::Impl::MatricizeGeneric)
119#define REGISTER_SIMPLE_RESULTTYPE(resultTypeName, rowsExpr, colsExpr) \
120 REGISTER_RESERVED_RESULTTYPE(resultTypeName, rowsExpr, colsExpr, rowsExpr, colsExpr)
157template <
typename RT, ResultShape storedResultShape = ResultShape::Vector>
161 using ResultTypeValueType =
typename RT::type;
162 static constexpr Eigen::Index rowsAtCompileTime = ResultTypeValueType::RowsAtCompileTime;
163 static constexpr Eigen::Index colsAtCompileTime = ResultTypeValueType::ColsAtCompileTime;
167 using VecType = std::invoke_result_t<
decltype(&RT::Vectorizer::template transform<ResultTypeValueType>),
168 const ResultTypeValueType&>;
170 std::invoke_result_t<
decltype(&RT::Matricizer::template transform<VecType, rowsAtCompileTime, colsAtCompileTime>),
172 using StoredType = std::conditional_t<storedValueIsVector, VecType, MatType>;
180 if constexpr (storedValueIsVector)
183 return RT::Vectorizer::transform(value_);
192 auto asMat(Eigen::Index rows = rowsAtCompileTime, Eigen::Index cols = colsAtCompileTime)
const {
193 if constexpr (storedValueIsVector) {
194 if constexpr (rowsAtCompileTime == Eigen::Dynamic)
195 assert(rows != rowsAtCompileTime &&
196 "For dynamic size result types you have to pass rows by hand, since it is not clear how the result "
197 "should be reshaped");
198 if constexpr (colsAtCompileTime == Eigen::Dynamic)
199 assert(cols != colsAtCompileTime &&
200 "For dynamic size result types you have to pass cols by hand, since it is not clear how the result "
201 "should be reshaped");
202 return RT::Matricizer::template transform<VecType, rowsAtCompileTime, colsAtCompileTime>(value_, rows, cols);
210 this->value_ = value;
214 this->value_ = std::move(value);
223 template <
template <
typename,
int,
int>
class RT>
224 using DummyRT = RT<double, 1, 1>;
232template <
template <
typename,
int,
int>
class RT>
234 return Impl::DummyRT<RT>{};
242template <
template <
typename,
int,
int>
class RT>
244 return toString(Impl::DummyRT<RT>{});
252template <
template <
typename,
int,
int>
class RT1,
template <
typename,
int,
int>
class RT2>
256 template <
typename T,
typename Tuple>
259 template <
typename T,
typename... Us>
260 struct hasType<T,
std::tuple<Us...>> : std::disjunction<std::is_same<T, Us>...>
270template <
template <
typename,
int,
int>
typename... ResultTypes>
277 template <
template <
typename,
int,
int>
typename RT>
Helper for the Eigen::Tensor types.
constexpr Eigen::Index toVoigt(Eigen::Index i, Eigen::Index j) noexcept
Converts 2D indices to Voigt notation index.
Definition: tensorutils.hh:166
auto fromVoigt(const Eigen::Matrix< ST, size, 1, Options, maxSize, 1 > &EVoigt, bool isStrain=true)
Converts a vector given in Voigt notation to a matrix.
Definition: tensorutils.hh:271
Definition: assemblermanipulatorbuildingblocks.hh:22
auto makeRT()
Creates a dummy resultType which can be stored in a variable.
Definition: feresulttypes.hh:233
constexpr bool isSameResultType
Meta variable to test whether two ResultType templates are the same.
Definition: feresulttypes.hh:253
ResultShape
Definition: feresulttypes.hh:146
constexpr std::string toString(DBCOption _e)
Definition: dirichletbcenforcement.hh:7
REGISTER_SIMPLE_SYMMETRIC_RESULTTYPE(linearStress, worldDim, worldDim, false)
REGISTER_SIMPLE_RESULTTYPE(director, worldDim, 1)
Container that is used for FE Results. It gives access to the stored value, but can also be used to a...
Definition: feresulttypes.hh:159
std::conditional_t< storedValueIsVector, VecType, MatType > StoredType
Definition: feresulttypes.hh:172
std::invoke_result_t< decltype(&RT::Matricizer::template transform< VecType, rowsAtCompileTime, colsAtCompileTime >), const VecType &, int, int > MatType
Definition: feresulttypes.hh:171
ResultWrapper(StoredType &&value)
Definition: feresulttypes.hh:207
ResultWrapper & operator=(StoredType &&value)
Definition: feresulttypes.hh:213
std::invoke_result_t< decltype(&RT::Vectorizer::template transform< ResultTypeValueType >), const ResultTypeValueType & > VecType
Definition: feresulttypes.hh:168
ResultWrapper & operator=(const StoredType &value)
Definition: feresulttypes.hh:209
auto asVec() const
Returns the stored value as Vector.
Definition: feresulttypes.hh:179
ResultWrapper(const StoredType &value)
Definition: feresulttypes.hh:208
auto asMat(Eigen::Index rows=rowsAtCompileTime, Eigen::Index cols=colsAtCompileTime) const
Returns the stored value as Matrix (if possible)
Definition: feresulttypes.hh:192
RT ResultType
Definition: feresulttypes.hh:173
Base class for element definitions that provides common functionality for ResultTypes.
Definition: feresulttypes.hh:272
std::tuple< decltype(makeRT< ResultTypes >())... > SupportedResultTypes
Definition: feresulttypes.hh:282
static consteval bool supportsResultType()
Returns whether a ResultType is provided by the element.
Definition: feresulttypes.hh:278