24#ifndef DUMUX_SOLIDMECHANICS_HYPERELASTIC_VOLISO_LOCAL_RESIDUAL_HH
25#define DUMUX_SOLIDMECHANICS_HYPERELASTIC_VOLISO_LOCAL_RESIDUAL_HH
29#include <dune/common/fmatrix.hh>
30#include <dune/common/fvector.hh>
34#include <dumux/common/typetraits/localdofs_.hh>
52template<
class TypeTag>
60 using ElementDiscretization =
typename GridDiscretization::LocalView;
61 using GridView =
typename GridDiscretization::GridView;
63 using Tensor = Dune::FieldMatrix<Scalar, GridView::dimension, GridView::dimension>;
64 static constexpr int dim = GridView::dimension;
67 using ElementVariables =
typename GridVariables::GridVariablesCache::LocalView;
70 using ParentType::ParentType;
73 NumEqVector
storageIntegral(
const ElementDiscretization&,
const ElementVariables&,
74 const auto&,
bool)
const
79 const Problem& problem,
81 const ElementDiscretization& elemDisc,
82 const ElementVariables& elemVars)
const
84 if constexpr (Dumux::Detail::LocalDofs::hasNonCVLocalDofsInterface<ElementDiscretization>())
86 if (nonCVLocalDofs(elemDisc).empty())
91 const auto& ipCache = cache(elemVars, qpData.ipData());
93 const auto F = deformationGradient_(elemDisc, elemVars, ipCache);
94 const auto P = firstPiolaKirchhoffStressTensor_(problem, F, elemDisc, qpData.ipData());
95 const auto f = problem.source(elemDisc, elemVars, qpData.ipData());
96 const auto& shapeValues = ipCache.shapeValues();
98 for (
const auto& nonCVdof : nonCVLocalDofs(elemDisc))
100 const auto idx = nonCVdof.index();
101 for (
int i = 0; i < dim; ++i)
103 for (
int j = 0; j < dim; ++j)
104 residual[idx][Indices::momentum(i)] += P[i][j] * ipCache.gradN(idx)[j] * qpData.weight();
105 residual[idx][Indices::momentum(i)] -= f[Indices::momentum(i)] * shapeValues[idx][0] * qpData.weight();
113 template<
class SubControlVolumeFace>
115 const ElementVariables& elemVars,
116 const SubControlVolumeFace& scvf)
const
118 const auto& problem = this->asImp().problem();
119 const auto& n = scvf.unitOuterNormal();
124 const auto& ipCache = cache(elemVars, qpData.ipData());
125 const auto F = deformationGradient_(elemDisc, elemVars, ipCache);
126 const auto P = firstPiolaKirchhoffStressTensor_(problem, F, elemDisc, qpData.ipData());
128 for (
int i = 0; i < dim; ++i)
129 for (
int j = 0; j < dim; ++j)
130 f[Indices::momentum(i)] -= P[i][j] * n[j] * qpData.weight();
136 template<
class IpData>
138 const ElementDiscretization& elemDisc,
139 const IpData& ipData)
const
140 {
return problem.couplingManager().pressure(elemDisc, ipData); }
143 template<
class IpCache>
144 Tensor deformationGradient_(
const ElementDiscretization& elemDisc,
145 const ElementVariables& elemVars,
146 const IpCache& ipCache)
const
149 for (
const auto& localDof :
localDofs(elemDisc))
150 for (
int d = 0; d < dim; ++d)
151 F[d].axpy(elemVars[localDof].displacement(d), ipCache.gradN(localDof.index()));
152 for (
int d = 0; d < dim; ++d)
157 template<
class IpData>
158 Tensor firstPiolaKirchhoffStressTensor_(
const Problem& problem,
160 const ElementDiscretization& elemDisc,
161 const IpData& ipData)
const
163 auto P = problem.isochoricFirstPiolaKirchhoffStressTensor(F, elemDisc, ipData.global());
167 const Scalar pJ = this->asImp().volumetricStressPressure(problem, elemDisc, ipData)*F.determinant();
168 for (
int i = 0; i < dim; ++i)
169 for (
int j = 0; j < dim; ++j)
170 P[i][j] += pJ*Finv[j][i];
185template<
class TypeTag>
193 using ElementDiscretization =
typename GridDiscretization::LocalView;
194 using GridView =
typename GridDiscretization::GridView;
195 using Tensor = Dune::FieldMatrix<Scalar, GridView::dimension, GridView::dimension>;
198 using ElementVariables =
typename GridVariables::GridVariablesCache::LocalView;
201 using ParentType::ParentType;
205 const auto&,
bool)
const
208 NumEqVector
fluxIntegral(
const ElementDiscretization&,
const ElementVariables&,
220 const ElementVariables& elemVars,
221 const auto& scv)
const
223 NumEqVector source(0.0);
225 const auto& problem = this->asImp().problem();
226 const auto& localBasis = elemDisc.gridDiscretization().feCache().get(elemDisc.element().type()).localBasis();
227 std::vector< Dune::FieldVector<Scalar, 1> > shapeValues;
231 const Tensor F = problem.couplingManager().deformationGradient(elemDisc, qpData.ipData());
232 const Scalar J = F.determinant();
233 const Scalar psEq = problem.volumetricPressure(J);
235 localBasis.evaluateFunction(qpData.ipData().local(), shapeValues);
237 for (
const auto& localDof :
localDofs(elemDisc))
238 ps += elemVars[localDof].pressure() * shapeValues[localDof.index()][0];
240 source[0] -= (psEq - ps) * qpData.weight();
250 const Problem& problem,
252 const ElementDiscretization& elemDisc,
253 const ElementVariables& elemVars)
const
255 if constexpr (Dumux::Detail::LocalDofs::hasNonCVLocalDofsInterface<ElementDiscretization>())
257 if (nonCVLocalDofs(elemDisc).empty())
260 const auto& problem = this->asImp().problem();
261 const auto& localBasis = elemDisc.gridDiscretization().feCache().get(elemDisc.element().type()).localBasis();
262 std::vector< Dune::FieldVector<Scalar, 1> > shapeValues;
266 const Tensor F = problem.couplingManager().deformationGradient(elemDisc, qpData.ipData());
267 const Scalar J = F.determinant();
268 const Scalar psEq = problem.volumetricPressure(J);
270 localBasis.evaluateFunction(qpData.ipData().local(), shapeValues);
272 for (
const auto& localDof :
localDofs(elemDisc))
273 ps += elemVars[localDof].pressure() * shapeValues[localDof.index()][0];
275 for (
const auto& nonCVdof : nonCVLocalDofs(elemDisc))
277 const auto idx = nonCVdof.index();
278 residual[idx][0] -= (psEq - ps) * shapeValues[idx][0] * qpData.weight();
Momentum local residual for the mixed – hyperelastic model.
Definition solidmechanics/hyperelastic_voliso/localresidual.hh:54
Scalar volumetricStressPressure(const Problem &problem, const ElementDiscretization &elemDisc, const IpData &ipData) const
The scalar of the volumetric stress .
Definition solidmechanics/hyperelastic_voliso/localresidual.hh:137
void addToElementFluxAndSourceResidual(ElementResidualVector &residual, const Problem &problem, const auto &element, const ElementDiscretization &elemDisc, const ElementVariables &elemVars) const
FE contributions of stress divergence and body force for non-CV dofs (e.g. PQ2 hybrid).
Definition solidmechanics/hyperelastic_voliso/localresidual.hh:78
NumEqVector storageIntegral(const ElementDiscretization &, const ElementVariables &, const auto &, bool) const
Definition solidmechanics/hyperelastic_voliso/localresidual.hh:73
NumEqVector fluxIntegral(const ElementDiscretization &elemDisc, const ElementVariables &elemVars, const SubControlVolumeFace &scvf) const
Interior flux integral: .
Definition solidmechanics/hyperelastic_voliso/localresidual.hh:114
typename ParentType::ElementResidualVector ElementResidualVector
Definition solidmechanics/hyperelastic_voliso/localresidual.hh:71
Pressure local residual for the mixed – hyperelastic model.
Definition solidmechanics/hyperelastic_voliso/localresidual.hh:187
void addToElementFluxAndSourceResidual(ElementResidualVector &residual, const Problem &problem, const auto &element, const ElementDiscretization &elemDisc, const ElementVariables &elemVars) const
FE contributions for non-CV DOFs.
Definition solidmechanics/hyperelastic_voliso/localresidual.hh:249
NumEqVector sourceIntegral(const ElementDiscretization &elemDisc, const ElementVariables &elemVars, const auto &scv) const
Pressure constraint integrated over an SCV.
Definition solidmechanics/hyperelastic_voliso/localresidual.hh:219
NumEqVector fluxIntegral(const ElementDiscretization &, const ElementVariables &, const auto &) const
Definition solidmechanics/hyperelastic_voliso/localresidual.hh:208
typename ParentType::ElementResidualVector ElementResidualVector
Definition solidmechanics/hyperelastic_voliso/localresidual.hh:202
NumEqVector storageIntegral(const ElementDiscretization &, const ElementVariables &, const auto &, bool) const
Definition solidmechanics/hyperelastic_voliso/localresidual.hh:204
Defines all properties used in Dumux.
The default local operator than can be specialized for each discretization scheme.
typename NumEqVectorTraits< PrimaryVariables >::type NumEqVector
A vector with the same size as numbers of equations This is the default implementation and has to be ...
Definition numeqvector.hh:34
typename GetProp< TypeTag, Property >::type GetPropType
get the type alias defined in the property
Definition propertysystem.hh:296
auto quadratureRule(const FVElementGeometry &fvGeometry, const typename FVElementGeometry::SubControlVolume &scv, QuadratureRules::MidpointQuadrature)
Midpoint quadrature for scv.
Definition quadraturerules.hh:160
typename Detail::DiscretizationDefaultLocalOperator< TypeTag >::type DiscretizationDefaultLocalOperator
Definition defaultlocaloperator.hh:26
auto localDofs(const FVElementGeometry &fvGeometry)
range over local dofs
Definition localdof.hh:50
A helper to deduce a vector with the same size as numbers of equations.
Quadrature rules over sub-control volumes and sub-control volume faces.
Dune-based quadrature rule with specified order.
Definition quadraturerules.hh:67