18 template <
typename GEO,
int myDim,
typename ASFunction>
19 struct AssumedStressType;
20 template <
typename GEO>
21 struct AssumedStressType<GEO, 3, PS::LinearStress>
23 using type = std::variant<S18<GEO>, S24<GEO>, S30<GEO>>;
25 template <
typename GEO>
26 struct AssumedStressType<GEO, 2, PS::LinearStress>
28 using type = std::variant<S5<GEO>>;
30 template <
typename GEO,
int myDim>
31 struct AssumedStressType<GEO, myDim, PS::PK2Stress>
33 using type = AssumedStressType<GEO, myDim, PS::LinearStress>::type;
42template <
typename ASFunction,
typename GEO>
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.");
56 std::visit([&]<
typename AssumedStressT>(
const AssumedStressT& asFunction) { f(asFunction); }, var_);
65 []<
typename AssumedStressT>(
const AssumedStressT&) ->
int {
return AssumedStressT::assumedStressSize; }, var_);
71 createAssumedStressType();
73 void bind(
const GEO& geometry) {
74 geometry_ = std::make_optional<GEO>(geometry);
75 createAssumedStressType();
79 void createAssumedStressType() {
80 const std::string& errorMessage =
81 "The given AssumedStress parameters are not available for the " + std::to_string(
myDim) +
"D case.";
83 if constexpr (std::same_as<ASFunction, PS::LinearStress> or std::same_as<ASFunction, PS::PK2Stress>) {
84 if constexpr (
myDim == 2) {
85 switch (numberOfAssumedStressParameters_) {
87 var_ =
S5(geometry_.value());
90 DUNE_THROW(Dune::NotImplemented, errorMessage);
92 }
else if constexpr (
myDim == 3) {
93 switch (numberOfAssumedStressParameters_) {
95 var_ = S18(geometry_.value());
98 var_ = S24(geometry_.value());
101 var_ = S30(geometry_.value());
104 DUNE_THROW(Dune::NotImplemented, errorMessage);
109 std::optional<GEO> geometry_;
111 int numberOfAssumedStressParameters_;
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