version 0.4.1
asvariants.hh
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2021-2025 The Ikarus Developers ikarus@ibb.uni-stuttgart.de
2// SPDX-License-Identifier: LGPL-3.0-or-later
3
10#pragma once
11
15
16namespace Ikarus::PS {
17namespace Impl {
18 template <typename GEO, int myDim, typename ASFunction>
19 struct AssumedStressType;
20 template <typename GEO>
21 struct AssumedStressType<GEO, 3, PS::LinearStress>
22 {
23 using type = std::variant<S18<GEO>, S24<GEO>, S30<GEO>>;
24 };
25 template <typename GEO>
26 struct AssumedStressType<GEO, 2, PS::LinearStress>
27 {
28 using type = std::variant<S5<GEO>>;
29 };
30 template <typename GEO, int myDim>
31 struct AssumedStressType<GEO, myDim, PS::PK2Stress>
32 {
33 using type = AssumedStressType<GEO, myDim, PS::LinearStress>::type;
34 };
35} // namespace Impl
36
42template <typename ASFunction, typename GEO>
44{
45 static constexpr int myDim = GEO::mydimension;
46 using Variant = Impl::AssumedStressType<GEO, myDim, ASFunction>::type;
47 static_assert((myDim == 2) or (myDim == 3), "AssumedStress variants are only available for 2D and 3D elements.");
48
54 template <typename F>
55 void operator()(F&& f) const {
56 std::visit([&]<typename AssumedStressT>(const AssumedStressT& asFunction) { f(asFunction); }, var_);
57 }
58
64 return std::visit(
65 []<typename AssumedStressT>(const AssumedStressT&) -> int { return AssumedStressT::assumedStressSize; }, var_);
66 }
67
69 numberOfAssumedStressParameters_ = numberOfInternalVariables;
70 if (geometry_)
71 createAssumedStressType();
72 }
73 void bind(const GEO& geometry) {
74 geometry_ = std::make_optional<GEO>(geometry);
75 createAssumedStressType();
76 }
77
78private:
79 void createAssumedStressType() {
80 const std::string& errorMessage =
81 "The given AssumedStress parameters are not available for the " + std::to_string(myDim) + "D case.";
82
83 if constexpr (std::same_as<ASFunction, PS::LinearStress> or std::same_as<ASFunction, PS::PK2Stress>) {
84 if constexpr (myDim == 2) {
85 switch (numberOfAssumedStressParameters_) {
86 case 5:
87 var_ = S5(geometry_.value());
88 break;
89 default:
90 DUNE_THROW(Dune::NotImplemented, errorMessage);
91 }
92 } else if constexpr (myDim == 3) {
93 switch (numberOfAssumedStressParameters_) {
94 case 18:
95 var_ = S18(geometry_.value());
96 break;
97 case 24:
98 var_ = S24(geometry_.value());
99 break;
100 case 30:
101 var_ = S30(geometry_.value());
102 break;
103 default:
104 DUNE_THROW(Dune::NotImplemented, errorMessage);
105 }
106 }
107 }
108 }
109 std::optional<GEO> geometry_;
110 Variant var_;
111 int numberOfAssumedStressParameters_;
112};
113} // namespace Ikarus::PS
Helper for the Eigen::Tensor types.
Header file for various assumed stress functions.
Definition of the types of Assumed Stress formulations for 2D and 3D linear solid elements,...
Definition: linearstress.hh:19
Wrapper around the AssumedStress variant, contains helper functions.
Definition: asvariants.hh:44
auto numberOfInternalVariables() const
A helper function to get the number of AssumedStress parameters.
Definition: asvariants.hh:63
void bind(const GEO &geometry)
Definition: asvariants.hh:73
Impl::AssumedStressType< GEO, myDim, ASFunction >::type Variant
Definition: asvariants.hh:46
void setAssumedStressType(int numberOfInternalVariables)
Definition: asvariants.hh:68
static constexpr int myDim
Definition: asvariants.hh:45
void operator()(F &&f) const
Executes a function F on the variant.
Definition: asvariants.hh:55
S5 struct for AssumedStress (PS) for Q1 with 5 assumed stress parameters.
Definition: linearandpk2stress.hh:60