12#if HAVE_DUNE_LOCALFEFUNCTIONS
13 #include <dune/fufem/boundarypatch.hh>
14 #include <dune/geometry/quadraturerules.hh>
15 #include <dune/geometry/type.hh>
16 #include <dune/localfefunctions/cachedlocalBasis/cachedlocalBasis.hh>
17 #include <dune/localfefunctions/expressions/greenLagrangeStrains.hh>
18 #include <dune/localfefunctions/impl/standardLocalFunction.hh>
19 #include <dune/localfefunctions/manifolds/realTuple.hh>
33template <
typename PreFE,
typename FE,
typename PRE>
34class NonLinearElastic;
40template <
typename MAT>
46 template <
typename PreFE,
typename FE>
59template <
typename PreFE,
typename FE,
typename PRE>
75 using LocalBasisType =
decltype(std::declval<LocalView>().tree().child(0).finiteElement().localBasis());
85 : mat_{pre.material} {}
92 const auto& localView = underlying().localView();
93 const auto& element = localView.element();
94 auto& firstChild = localView.tree().child(0);
95 const auto& fe = firstChild.finiteElement();
96 geo_ = std::make_shared<const Geometry>(element.geometry());
97 numberOfNodes_ = fe.size();
98 order_ = 2 * (fe.localBasis().order());
99 localBasis_ = Dune::CachedLocalBasis(fe.localBasis());
100 if constexpr (
requires { element.impl().getQuadratureRule(order_); })
101 if (element.impl().isTrimmed())
102 localBasis_.bind(element.impl().getQuadratureRule(order_), Dune::bindDerivatives(0, 1));
104 localBasis_.bind(Dune::QuadratureRules<double, myDim>::rule(element.type(), order_),
105 Dune::bindDerivatives(0, 1));
107 localBasis_.bind(Dune::QuadratureRules<double, myDim>::rule(element.type(), order_), Dune::bindDerivatives(0, 1));
119 template <
typename ScalarType =
double>
122 const std::optional<std::reference_wrapper<
const Eigen::VectorX<ScalarType>>>& dx = std::nullopt)
const {
124 auto disp = Ikarus::FEHelper::localSolutionBlockVector<Traits>(d, underlying().localView(), dx);
125 Dune::StandardLocalFunction uFunction(localBasis_, disp, geo_);
137 template <
typename ScalarType =
double>
140 const std::optional<std::reference_wrapper<
const Eigen::VectorX<ScalarType>>>& dx = std::nullopt)
const {
153 template <
typename ScalarType,
int strainDim,
bool voigt = true>
155 if constexpr (std::is_same_v<ScalarType, double>)
156 return mat_.template tangentModuli<strainType, voigt>(strain);
158 decltype(
auto) matAD = mat_.template rebind<ScalarType>();
159 return matAD.template tangentModuli<strainType, voigt>(strain);
171 template <
typename ScalarType,
int strainDim>
173 if constexpr (std::is_same_v<ScalarType, double>)
174 return mat_.template storedEnergy<strainType>(strain);
176 decltype(
auto) matAD = mat_.template rebind<ScalarType>();
177 return matAD.template storedEnergy<strainType>(strain);
190 template <
typename ScalarType,
int strainDim,
bool voigt = true>
191 auto getStress(
const Eigen::Vector<ScalarType, strainDim>& strain)
const {
192 if constexpr (std::is_same_v<ScalarType, double>)
193 return mat_.template stresses<strainType, voigt>(strain);
195 decltype(
auto) matAD = mat_.template rebind<ScalarType>();
196 return matAD.template stresses<strainType, voigt>(strain);
202 [[nodiscard]]
int order()
const {
return order_; }
207 template <
template <
typename,
int,
int>
class RT>
208 static consteval bool canProvideResultType() {
209 return isSameResultType<RT, ResultTypes::PK2Stress>;
222 template <
template <
typename,
int,
int>
class RT>
223 requires(canProvideResultType<RT>())
225 Dune::PriorityTag<1>)
const {
226 using namespace Dune::DerivativeDirections;
229 if constexpr (isSameResultType<RT, ResultTypes::PK2Stress>) {
231 const auto H = uFunction.evaluateDerivative(local, Dune::wrt(spatialAll), Dune::on(gridElement));
232 const auto E = (0.5 * (H.transpose() + H + H.transpose() * H)).eval();
234 return RTWrapper{mat_.template stresses<StrainTags::greenLagrangian>(
toVoigt(E))};
240 const auto& underlying()
const {
return static_cast<const FE&
>(*this); }
241 auto& underlying() {
return static_cast<FE&
>(*this); }
242 std::shared_ptr<const Geometry> geo_;
243 Dune::CachedLocalBasis<std::remove_cvref_t<LocalBasisType>> localBasis_;
245 size_t numberOfNodes_{0};
256 template <
typename ScalarType>
259 const std::optional<std::reference_wrapper<
const Eigen::VectorX<ScalarType>>>& dx = std::nullopt)
const {
260 using namespace Dune::DerivativeDirections;
261 using namespace Dune;
264 for (
const auto& [gpIndex, gp] : eps.viewOverIntegrationPoints()) {
265 const double intElement = geo_->integrationElement(gp.position()) * gp.weight();
266 const auto EVoigt = (eps.evaluate(gpIndex, on(gridElement))).eval();
267 const auto u = (uFunction.evaluate(gpIndex, on(gridElement))).eval();
271 for (
size_t i = 0; i < numberOfNodes_; ++i) {
272 const auto bopI = eps.evaluateDerivative(gpIndex, wrt(coeff(i)), on(gridElement));
273 for (
size_t j = 0; j < numberOfNodes_; ++j) {
274 const auto bopJ = eps.evaluateDerivative(gpIndex, wrt(coeff(j)), on(gridElement));
275 const auto kgIJ = eps.evaluateDerivative(gpIndex, wrt(coeff(i, j)), along(stresses), on(gridElement));
276 K.template block<myDim, myDim>(i *
myDim, j *
myDim) += (bopI.transpose() * C * bopJ + kgIJ) * intElement;
282 template <
typename ScalarType>
284 const std::optional<std::reference_wrapper<
const Eigen::VectorX<ScalarType>>>& dx =
285 std::nullopt)
const -> ScalarType {
286 using namespace Dune::DerivativeDirections;
287 using namespace Dune;
290 const auto& lambda = par.parameter();
291 ScalarType energy = 0.0;
293 for (
const auto& [gpIndex, gp] : eps.viewOverIntegrationPoints()) {
294 const auto EVoigt = (eps.evaluate(gpIndex, on(gridElement))).eval();
296 energy += internalEnergy * geo_->integrationElement(gp.position()) * gp.weight();
302 template <
typename ScalarType>
305 const std::optional<std::reference_wrapper<
const Eigen::VectorX<ScalarType>>>& dx = std::nullopt)
const {
306 using namespace Dune::DerivativeDirections;
307 using namespace Dune;
311 for (
const auto& [gpIndex, gp] : eps.viewOverIntegrationPoints()) {
312 const double intElement = geo_->integrationElement(gp.position()) * gp.weight();
313 const auto EVoigt = (eps.evaluate(gpIndex, on(gridElement))).eval();
315 for (
size_t i = 0; i < numberOfNodes_; ++i) {
316 const auto bopI = eps.evaluateDerivative(gpIndex, wrt(coeff(i)), on(gridElement));
317 force.template segment<myDim>(
myDim * i) += bopI.transpose() * stresses * intElement;
329template <
typename MAT>
339 #error NonLinearElastic depends on dune-localfefunctions, which is not included
Helper for the autodiff library.
Collection of fallback default functions.
Helper for transform between Dune linear algebra types and Eigen.
Contains the FE class, which is used as a base class for all finite elements. It provides information...
Definition of the LinearElastic class for finite element mechanics computations.
Definition of several material related enums.
Header file for types of loads in Ikarus finite element mechanics.
Material property functions and conversion utilities.
constexpr Eigen::Index toVoigt(Eigen::Index i, Eigen::Index j) noexcept
Converts 2D indices to Voigt notation index.
Definition: tensorutils.hh:166
Definition: dirichletbcenforcement.hh:6
MatrixAffordance
A strongly typed enum class representing the matrix affordance.
Definition: ferequirements.hh:63
auto nonLinearElastic(const MAT &mat)
A helper function to create a non-linear elastic pre finite element.
Definition: nonlinearelastic.hh:330
VectorAffordance
A strongly typed enum class representing the vector affordance.
Definition: ferequirements.hh:48
ScalarAffordance
A strongly typed enum class representing the scalar affordance.
Definition: ferequirements.hh:37
Definition: utils/dirichletvalues.hh:28
FE class is a base class for all finite elements.
Definition: febase.hh:79
FETraits< BH, useEigenRef, useFlat > Traits
Definition: febase.hh:38
Class representing the requirements for finite element calculations.
Definition: ferequirements.hh:252
SolutionVectorReturnType globalSolution()
Get the global solution vector.
Definition: ferequirements.hh:308
Container that is used for FE Results. It gives access to the stored value, but can also be used to a...
Definition: feresulttypes.hh:155
Traits for handling finite elements.
Definition: fetraits.hh:25
typename Basis::LocalView LocalView
Type of the local view.
Definition: fetraits.hh:42
typename Element::Geometry Geometry
Type of the element geometry.
Definition: fetraits.hh:51
std::conditional_t< useFlat, FlatBasis, UntouchedBasis > Basis
Type of the basis version.
Definition: fetraits.hh:39
typename Basis::GridView GridView
Type of the grid view.
Definition: fetraits.hh:45
typename BasisHandler::FlatBasis FlatBasis
Type of the flat basis.
Definition: fetraits.hh:33
typename LocalView::Element Element
Type of the grid element.
Definition: fetraits.hh:48
static constexpr int mydim
Dimension of the geometry.
Definition: fetraits.hh:63
NonLinearElastic class represents a non-linear elastic finite element.
Definition: nonlinearelastic.hh:61
auto getInternalEnergy(const Eigen::Vector< ScalarType, strainDim > &strain) const
Get the internal energy for the given strain.
Definition: nonlinearelastic.hh:172
typename Traits::Basis Basis
Definition: nonlinearelastic.hh:64
typename Traits::Geometry Geometry
Definition: nonlinearelastic.hh:69
auto calculateScalarImpl(const Requirement &par, ScalarAffordance affordance, const std::optional< std::reference_wrapper< const Eigen::VectorX< ScalarType > > > &dx=std::nullopt) const -> ScalarType
Definition: nonlinearelastic.hh:283
typename Traits::FlatBasis FlatBasis
Definition: nonlinearelastic.hh:65
auto strainFunction(const Requirement &par, const std::optional< std::reference_wrapper< const Eigen::VectorX< ScalarType > > > &dx=std::nullopt) const
The strain function for the given Requirement.
Definition: nonlinearelastic.hh:138
PRE::Material Material
Definition: nonlinearelastic.hh:72
typename Traits::GridView GridView
Definition: nonlinearelastic.hh:70
void bindImpl()
A helper function to bind the local view to the element.
Definition: nonlinearelastic.hh:91
const Geometry & geometry() const
Definition: nonlinearelastic.hh:200
static constexpr int myDim
Definition: nonlinearelastic.hh:77
void calculateVectorImpl(const Requirement &par, VectorAffordance affordance, typename Traits::template VectorType< ScalarType > force, const std::optional< std::reference_wrapper< const Eigen::VectorX< ScalarType > > > &dx=std::nullopt) const
Definition: nonlinearelastic.hh:303
NonLinearElastic(const Pre &pre)
Constructor for the NonLinearElastic class.
Definition: nonlinearelastic.hh:84
typename Traits::Element Element
Definition: nonlinearelastic.hh:71
PRE Pre
Definition: nonlinearelastic.hh:73
auto calculateAtImpl(const Requirement &req, const Dune::FieldVector< double, Traits::mydim > &local, Dune::PriorityTag< 1 >) const
Calculates a requested result at a specific local position.
Definition: nonlinearelastic.hh:224
void calculateMatrixImpl(const Requirement &par, const MatrixAffordance &affordance, typename Traits::template MatrixType<> K, const std::optional< std::reference_wrapper< const Eigen::VectorX< ScalarType > > > &dx=std::nullopt) const
Calculate the matrix associated with the given Requirement.
Definition: nonlinearelastic.hh:257
std::tuple< decltype(makeRT< ResultTypes::PK2Stress >())> SupportedResultTypes
Definition: nonlinearelastic.hh:204
auto materialTangent(const Eigen::Vector< ScalarType, strainDim > &strain) const
Get the material tangent for the given strain.
Definition: nonlinearelastic.hh:154
auto displacementFunction(const Requirement &par, const std::optional< std::reference_wrapper< const Eigen::VectorX< ScalarType > > > &dx=std::nullopt) const
Get the displacement function for the given Requirement.
Definition: nonlinearelastic.hh:120
static constexpr auto strainType
Definition: nonlinearelastic.hh:78
typename Traits::LocalView LocalView
Definition: nonlinearelastic.hh:68
int order() const
Definition: nonlinearelastic.hh:202
decltype(std::declval< LocalView >().tree().child(0).finiteElement().localBasis()) LocalBasisType
Definition: nonlinearelastic.hh:75
auto getStress(const Eigen::Vector< ScalarType, strainDim > &strain) const
Get the stress for the given strain.
Definition: nonlinearelastic.hh:191
size_t numberOfNodes() const
Definition: nonlinearelastic.hh:201
A PreFE struct for non-linear elastic elements.
Definition: nonlinearelastic.hh:42
MAT Material
Definition: nonlinearelastic.hh:43
MAT material
Definition: nonlinearelastic.hh:44
Definition: utils/dirichletvalues.hh:30