3.3.0
DUNE for Multi-{Phase, Component, Scale, Physics, ...} flow and transport in porous media
box/effectivestresslaw.hh
Go to the documentation of this file.
1// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2// vi: set et ts=4 sw=4 sts=4:
3/*****************************************************************************
4 * See the file COPYING for full copying permissions. *
5 * *
6 * This program is free software: you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation, either version 3 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
18 *****************************************************************************/
25#ifndef DUMUX_DISCRETIZATION_BOX_EFFECTIVE_STRESS_LAW_HH
26#define DUMUX_DISCRETIZATION_BOX_EFFECTIVE_STRESS_LAW_HH
27
31
32namespace Dumux {
33
41template<class StressType, class GridGeometry>
42class EffectiveStressLaw<StressType, GridGeometry, DiscretizationMethod::box>
43{
44 using FVElementGeometry = typename GridGeometry::LocalView;
45 using SubControlVolumeFace = typename FVElementGeometry::SubControlVolumeFace;
46 using Extrusion = Extrusion_t<GridGeometry>;
47
48 using GridView = typename GridGeometry::GridView;
49 using Element = typename GridView::template Codim<0>::Entity;
50
51 static constexpr int dim = GridView::dimension;
52 static constexpr int dimWorld = GridView::dimensionworld;
53 static_assert(dim == dimWorld, "EffectiveStressLaw not implemented for network/surface grids");
54 static_assert(StressType::discMethod == DiscretizationMethod::box, "The provided stress type must be specialized for the box scheme");
55
56public:
58 using Scalar = typename StressType::Scalar;
60 using StressTensor = typename StressType::StressTensor;
62 using ForceVector = typename StressType::ForceVector;
64 static constexpr DiscretizationMethod discMethod = DiscretizationMethod::box;
65
69 template<class Problem, class ElementVolumeVariables, class ElementFluxVarsCache>
70 static ForceVector force(const Problem& problem,
71 const Element& element,
72 const FVElementGeometry& fvGeometry,
73 const ElementVolumeVariables& elemVolVars,
74 const SubControlVolumeFace& scvf,
75 const ElementFluxVarsCache& elemFluxVarCache)
76 {
77 const auto sigma = stressTensor(problem, element, fvGeometry, elemVolVars, elemFluxVarCache[scvf]);
78
79 ForceVector scvfForce(0.0);
80 sigma.mv(scvf.unitOuterNormal(), scvfForce);
81 scvfForce *= Extrusion::area(scvf);
82
83 return scvfForce;
84 }
85
87 template<class Problem, class ElementVolumeVariables, class FluxVarsCache>
88 static StressTensor stressTensor(const Problem& problem,
89 const Element& element,
90 const FVElementGeometry& fvGeometry,
91 const ElementVolumeVariables& elemVolVars,
92 const FluxVarsCache& fluxVarsCache)
93 {
94 // compute the purely mechanical stress
95 auto sigma = StressType::stressTensor(problem, element, fvGeometry, elemVolVars, fluxVarsCache);
96
97 // obtain biot coefficient and effective pore pressure
98 const auto biotCoeff = problem.spatialParams().biotCoefficient(element, fvGeometry, elemVolVars, fluxVarsCache);
99 const auto effPress = problem.effectivePorePressure(element, fvGeometry, elemVolVars, fluxVarsCache);
100
101 // subtract pore pressure from the diagonal entries
102 const auto bcp = biotCoeff*effPress;
103 for (int i = 0; i < dim; ++i)
104 sigma[i][i] -= bcp;
105
106 return sigma;
107 }
108
110 template<class Problem, class ElementVolumeVariables, class FluxVarsCache>
111 static StressTensor effectiveStressTensor(const Problem& problem,
112 const Element& element,
113 const FVElementGeometry& fvGeometry,
114 const ElementVolumeVariables& elemVolVars,
115 const FluxVarsCache& fluxVarsCache)
116 { return StressType::stressTensor(problem, element, fvGeometry, elemVolVars, fluxVarsCache); }
117};
118
119} // end namespace Dumux
120
121#endif
The available discretization methods in Dumux.
Helper classes to compute the integration elements.
The effective stress law specialized for different discretization schemes. This computes the stress t...
DiscretizationMethod
The available discretization methods in Dumux.
Definition: method.hh:37
Definition: adapt.hh:29
typename Extrusion< T >::type Extrusion_t
Convenience alias for obtaining the extrusion type.
Definition: extrusion.hh:177
typename StressType::ForceVector ForceVector
export the type used for force vectors
Definition: box/effectivestresslaw.hh:62
typename StressType::StressTensor StressTensor
export the type used for the stress tensor
Definition: box/effectivestresslaw.hh:60
typename StressType::Scalar Scalar
export the type used for scalar values
Definition: box/effectivestresslaw.hh:58
static StressTensor effectiveStressTensor(const Problem &problem, const Element &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars, const FluxVarsCache &fluxVarsCache)
assembles the (effective) stress tensor of the solid skeleton at a given integration point
Definition: box/effectivestresslaw.hh:111
static ForceVector force(const Problem &problem, const Element &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars, const SubControlVolumeFace &scvf, const ElementFluxVarsCache &elemFluxVarCache)
Computes the force (in Newton) acting on a sub-control volume face.
Definition: box/effectivestresslaw.hh:70
static StressTensor stressTensor(const Problem &problem, const Element &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars, const FluxVarsCache &fluxVarsCache)
assembles the (total) stress tensor of the porous medium at a given integration point
Definition: box/effectivestresslaw.hh:88
This computes the stress tensor and surface forces resulting from poro-mechanical deformation.
Definition: effectivestresslaw.hh:39