diff --git a/CHANGELOG.md b/CHANGELOG.md index b4137e53fb4cfa64f7b492339f59422906547923..a2d762ab8d91d3c807c8f4f7964ec8c7fe12335d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -96,6 +96,7 @@ The parameters describing your dispersion tensor can then be included in your `s - the `temperature` and `extrusionFactor` interfaces in the problem class have been deprecated and have been moved to the spatial parameters. - Porous medium flow models should now inherit from the new base spatial parameters that can be found in the folder `dumux/porousmediumflow/`, which allow users to overload the new `temperature` and `extrusionFactor` interfaces. - Free flow and pore network models now also expect the user problems to expose spatial parameters, in which `gravity`, `temperature` and `extrusionFactor` are defined. The respective problem interfaces have been deprecated. +- The problem interfaces for fluid properties in the poroelastic model, namely `effectiveFluidDensity` and `effectivePorePressure`, have been deprecated and were moved to the spatial parameters. ### New experimental features (possibly subject to backwards-incompatible changes in the future) diff --git a/dumux/common/deprecated.hh b/dumux/common/deprecated.hh index 0c41de06f92974209b79f0b72cebcd033d6a8c84..53043e42e009cce2f815f78ec3a008aaf2d9f2bf 100644 --- a/dumux/common/deprecated.hh +++ b/dumux/common/deprecated.hh @@ -108,6 +108,38 @@ using HasBaseProblemExtrusionFactorAtPosDetector = decltype(std::declval +using HasBaseProblemEffectiveFluidDensity = decltype(std::declval().effectiveFluidDensity( + std::declval(), + std::declval(), + double{} + )); + +template +using HasEffectiveFluidDensityAtPos = decltype(std::declval().effectiveFluidDensityAtPos( + std::declval() + )); + +template +using HasBaseProblemEffectivePorePressure = decltype(std::declval().effectivePorePressure( + std::declval(), + std::declval(), + std::declval(), + std::declval(), + double{} + )); + +template +using HasEffectivePorePressureAtPos = decltype(std::declval().effectivePorePressureAtPos( + std::declval() + )); + + #ifdef __clang__ #pragma clang diagnostic pop #endif // __clang__ @@ -183,6 +215,65 @@ decltype(auto) temperature(const Problem& problem, const Element& element, const return problem.temperatureAtPos(scv.dofPosition()); } +template +decltype(auto) effectiveFluidDensity(const Problem& problem, + const Element& element, + const SubControlVolume& scv) +{ + using GlobalPosition = typename SubControlVolume::Traits::GlobalPosition; + + static constexpr bool hasBaseProblemDensity = Dune::Std::is_detected< + HasBaseProblemEffectiveFluidDensity, Problem, Element, SubControlVolume + >::value; + + static constexpr bool hasProblemDensityAtPos = Dune::Std::is_detected< + HasEffectiveFluidDensityAtPos, Problem, GlobalPosition + >::value; + + static constexpr bool problemDefinesUserDensity = + hasProblemDensityAtPos || !hasBaseProblemDensity; + + if constexpr (problemDefinesUserDensity) + return problem.effectiveFluidDensity(element, scv); + else + return problem.spatialParams().effectiveFluidDensity(element, scv); +} + +template +decltype(auto) effectivePorePressure(const Problem& problem, + const Element& element, + const FVElementGeometry& fvGeometry, + const ElemVolVars& elemVolVars, + const FluxVarsCache& fluxVarsCache) +{ + using GlobalPosition = typename FVElementGeometry::GridGeometry::SubControlVolume::Traits::GlobalPosition; + + static constexpr bool hasBaseProblemPressure = Dune::Std::is_detected< + HasBaseProblemEffectivePorePressure, + Problem, + Element, + FVElementGeometry, + ElemVolVars, + FluxVarsCache + >::value; + + static constexpr bool hasProblemPressureAtPos = Dune::Std::is_detected< + HasEffectivePorePressureAtPos, Problem, GlobalPosition + >::value; + + static constexpr bool problemDefinesUserPressure = + hasProblemPressureAtPos || !hasBaseProblemPressure; + + if constexpr (problemDefinesUserPressure) + return problem.effectivePorePressure( + element, fvGeometry, elemVolVars, fluxVarsCache + ); + else + return problem.spatialParams().effectivePorePressure( + element, fvGeometry, elemVolVars, fluxVarsCache + ); +} + } // end namespace Deprecated #endif diff --git a/dumux/flux/box/effectivestresslaw.hh b/dumux/flux/box/effectivestresslaw.hh index 3d27b0c19378828b5d47999fa5a848c7705d61b8..9bd94a4863de0e4f9724edaac668808daee129b9 100644 --- a/dumux/flux/box/effectivestresslaw.hh +++ b/dumux/flux/box/effectivestresslaw.hh @@ -28,6 +28,7 @@ #include #include #include +#include namespace Dumux { @@ -99,7 +100,7 @@ public: // obtain biot coefficient and effective pore pressure const auto biotCoeff = problem.spatialParams().biotCoefficient(element, fvGeometry, elemVolVars, fluxVarsCache); - const auto effPress = problem.effectivePorePressure(element, fvGeometry, elemVolVars, fluxVarsCache); + const auto effPress = Deprecated::effectivePorePressure(problem, element, fvGeometry, elemVolVars, fluxVarsCache); // subtract pore pressure from the diagonal entries const auto bcp = biotCoeff*effPress; diff --git a/dumux/geomechanics/fvproblem.hh b/dumux/geomechanics/fvproblem.hh index c0703a789d47f89d74109b5d660ac7f7c46ed436..1512eb9f999271fd92213ba8b6c881c4ea36f167 100644 --- a/dumux/geomechanics/fvproblem.hh +++ b/dumux/geomechanics/fvproblem.hh @@ -27,35 +27,10 @@ #include #include -namespace Dumux { - -#ifndef DOXYGEN -namespace Detail { -// helper struct detecting if the user-defined problem class has an effectiveFluidDensityAtPos function -// for g++ > 5.3, this can be replaced by a lambda -template -struct hasEffFluidDensityAtPos -{ - template - auto operator()(const Problem& a) - -> decltype(a.effectiveFluidDensityAtPos(std::declval())) - {} -}; - -// helper struct detecting if the user-defined problem class has an effectivePorePressureAtPos function -// for g++ > 5.3, this can be replaced by a lambda -template -struct hasEffPorePressureAtPos -{ - template - auto operator()(const Problem& a) - -> decltype(a.effectivePorePressureAtPos(std::declval())) - {} -}; - -} // end namespace Detail -#endif +// for helpers in detail namespace (TODO: Remove after deprecation period after release 3.5) +#include "poroelastic/fvspatialparams.hh" +namespace Dumux { /*! * \ingroup Geomechanics @@ -85,13 +60,18 @@ public: /*! * \brief Returns the effective fluid density within an scv. * \note This is only enabled if the model considers fluid phases. + * \note This is deprecated and moved into poroelastic/fvspatialparams * * \param element The current element * \param scv The sub-control volume + * \param deprecationHelper Helper to distinguish this interface from + * user-provided implementations. */ template< int n = numFP, std::enable_if_t<(n > 0), int> = 0 > + [[deprecated("effectiveFluidDensity() is now defined in the spatial params. This interface will be removed after release 3.5.")]] Scalar effectiveFluidDensity(const Element& element, - const SubControlVolume& scv) const + const SubControlVolume& scv, + int deprecationHelper = 0) const { static_assert(decltype(isValid(Detail::hasEffFluidDensityAtPos())(this->asImp_()))::value," \n\n" " Your problem class has to either implement\n\n" @@ -111,17 +91,22 @@ public: * for an integration point inside the element. Therefore, * a flux variables cache object is passed to this function * containing data on shape functions at the integration point. + * \note This is deprecated and moved into poroelastic/fvspatialparams * * \param element The current element * \param fvGeometry The local finite volume geometry * \param elemVolVars Primary/Secondary variables inside the element * \param fluxVarsCache Contains data on shape functions at the integration point + * \param deprecationHelper Helper to distinguish this interface from + * user-provided implementations. */ template< class ElemVolVars, class FluxVarsCache, int n = numFP, std::enable_if_t<(n > 0), int> = 0 > + [[deprecated("effectivePorePressure() is now defined in the spatial params. This interface will be removed after release 3.5.")]] Scalar effectivePorePressure(const Element& element, const FVElementGeometry& fvGeometry, const ElemVolVars& elemVolVars, - const FluxVarsCache& fluxVarsCache) const + const FluxVarsCache& fluxVarsCache, + int deprecationHelper = 0) const { static_assert(decltype(isValid(Detail::hasEffPorePressureAtPos())(this->asImp_()))::value," \n\n" " Your problem class has to either implement\n\n" diff --git a/dumux/geomechanics/poroelastic/fvspatialparams.hh b/dumux/geomechanics/poroelastic/fvspatialparams.hh index 525bcf846a5e17b1f51d50a1b7517839bbd9edf4..8b9c4c423a7a8832af5b95661bba26bf7f32d72a 100644 --- a/dumux/geomechanics/poroelastic/fvspatialparams.hh +++ b/dumux/geomechanics/poroelastic/fvspatialparams.hh @@ -35,6 +35,28 @@ namespace Dumux { #ifndef DOXYGEN namespace Detail { +// helper struct detecting if the user-defined problem class has an effectiveFluidDensityAtPos function +// for g++ > 5.3, this can be replaced by a lambda +template +struct hasEffFluidDensityAtPos +{ + template + auto operator()(const Problem& a) + -> decltype(a.effectiveFluidDensityAtPos(std::declval())) + {} +}; + +// helper struct detecting if the user-defined problem class has an effectivePorePressureAtPos function +// for g++ > 5.3, this can be replaced by a lambda +template +struct hasEffPorePressureAtPos +{ + template + auto operator()(const Problem& a) + -> decltype(a.effectivePorePressureAtPos(std::declval())) + {} +}; + // helper struct detecting if the user-defined spatial params class has a reactiveVolumeFractionAtPos function template struct hasReactiveVolumeFractionAtPos @@ -79,6 +101,59 @@ public: : ParentType(gridGeometry) {} + /*! + * \brief Returns the effective fluid density within an scv. + * \note This is only enabled if the model considers fluid phases. + * + * \param element The current element + * \param scv The sub-control volume + */ + Scalar effectiveFluidDensity(const Element& element, + const SubControlVolume& scv) const + { + static_assert(decltype(isValid(Detail::hasEffFluidDensityAtPos())(this->asImp_()))::value," \n\n" + " Your problem class has to either implement\n\n" + " Scalar effectiveFluidDensityAtPos(const GlobalPosition& globalPos) const\n\n" + " or overload this function\n\n" + " template\n" + " Scalar effectiveFluidDensity(const Element& element,\n\ + const SubControlVolume& scv) const\n\n"); + + return this->asImp_().effectiveFluidDensityAtPos(scv.center()); + } + + /*! + * \brief Returns the effective pore pressure + * \note This is only enabled if the model considers fluid phases. + * This is possibly solution dependent and is evaluated + * for an integration point inside the element. Therefore, + * a flux variables cache object is passed to this function + * containing data on shape functions at the integration point. + * + * \param element The current element + * \param fvGeometry The local finite volume geometry + * \param elemVolVars Primary/Secondary variables inside the element + * \param fluxVarsCache Contains data on shape functions at the integration point + */ + template + Scalar effectivePorePressure(const Element& element, + const FVElementGeometry& fvGeometry, + const ElemVolVars& elemVolVars, + const FluxVarsCache& fluxVarsCache) const + { + static_assert(decltype(isValid(Detail::hasEffPorePressureAtPos())(this->asImp_()))::value," \n\n" + " Your problem class has to either implement\n\n" + " Scalar effectivePorePressureAtPos(const GlobalPosition& globalPos) const\n\n" + " or overload this function\n\n" + " template\n" + " Scalar effectivePorePressure(const Element& element,\n" + " const FVElementGeometry& fvGeometry,\n" + " const ElemVolVars& elemVolVars,\n" + " const FluxVarsCache& fluxVarsCache) const\n\n"); + + return this->asImp_().effectivePorePressureAtPos(element.geometry().center()); + } + /*! * \brief Function for defining the solid volume fraction of a solid * component that takes part in some sort of reaction. The reaction diff --git a/dumux/geomechanics/poroelastic/localresidual.hh b/dumux/geomechanics/poroelastic/localresidual.hh index ad65f0d81cbc9e9cda8a9c304a464aed383e3c5f..d43efc18611af8157dbfb682829cb3859b4e0b5c 100644 --- a/dumux/geomechanics/poroelastic/localresidual.hh +++ b/dumux/geomechanics/poroelastic/localresidual.hh @@ -91,7 +91,7 @@ public: // compute average density const auto& vv = elemVolVars[scv]; const auto phi = vv.porosity(); - const auto rhoFluid = problem.effectiveFluidDensity(element, scv); + const auto rhoFluid = Deprecated::effectiveFluidDensity(problem, element, scv); const auto rhoAverage = phi*rhoFluid + (1.0 - phi*vv.solidDensity()); // add body force diff --git a/test/geomechanics/poroelastic/main.cc b/test/geomechanics/poroelastic/main.cc index 8f5587c2ac7066315fd0c7043aa20cecc469d60f..a49d03f5d51328c63b4694beb7e4cb2ae46e4c11 100644 --- a/test/geomechanics/poroelastic/main.cc +++ b/test/geomechanics/poroelastic/main.cc @@ -148,7 +148,7 @@ int main(int argc, char** argv) // also, add exact solution to the output SolutionVector xExact(gridGeometry->numDofs()); for (const auto& v : vertices(leafGridView)) - xExact[ gridGeometry->vertexMapper().index(v) ] = problem->exactSolution(v.geometry().center()); + xExact[ gridGeometry->vertexMapper().index(v) ] = problem->exactDisplacement(v.geometry().center()); vtkWriter.addField(xExact, "u_exact"); // Furthermore, write out element stress tensors diff --git a/test/geomechanics/poroelastic/problem.hh b/test/geomechanics/poroelastic/problem.hh index ed01afaac31c06a5a37d3ae4b1bc5cc44a1ed4ea..ec3e40728a8e3cc760ddeba3fa5abf2da0ea8ed1 100644 --- a/test/geomechanics/poroelastic/problem.hh +++ b/test/geomechanics/poroelastic/problem.hh @@ -57,9 +57,6 @@ class PoroElasticProblem : public GeomechanicsFVProblem using GlobalPosition = typename Element::Geometry::GlobalCoordinate; static constexpr Scalar pi = M_PI; - static constexpr int dim = GridView::dimension; - static constexpr int dimWorld = GridView::dimensionworld; - using GradU = Dune::FieldMatrix; public: PoroElasticProblem(std::shared_ptr gridGeometry) @@ -74,32 +71,6 @@ public: PrimaryVariables dirichletAtPos(const GlobalPosition& globalPos) const { return PrimaryVariables(0.0); } - /*! - * \brief Returns the effective fluid density. - * - * \param globalPos The global position - */ - Scalar effectiveFluidDensityAtPos(const GlobalPosition& globalPos) const - { - // This test uses the constant component, obtain density only once - using FS = GetPropType; - static const Scalar rho = FS::density( - effectivePorePressureAtPos(globalPos), this->spatialParams().temperatureAtPos(globalPos) - ); - return rho; - } - - /*! - * \brief Returns the effective pore pressure - * - * \note We use the x-displacement as pressure solution. The shift to - * higher values is done to see a mor pronounced effect in stresses. - * - * \param globalPos The global position - */ - Scalar effectivePorePressureAtPos(const GlobalPosition& globalPos) const - { return exactSolution(globalPos)[0] + 10; } - /*! * \brief Specifies which kind of boundary condition should be * used for which equation on a given boundary segment. @@ -149,17 +120,19 @@ public: const Scalar dE12_dy = 0.5*pi_2_square*(cos_2pix*cos_2piy - (x-x*x)*sin_2piy); const Scalar dE21_dx = 0.5*((1.0-2*x)*pi_2*cos_2piy - pi_2_square*sin_2pix*sin_2piy); - // compute exact divergence of sigma + // The source term is composed of the divergence of the stress tensor + // resulting from the exact solution minus the pressure gradient PrimaryVariables divSigma(0.0); divSigma[Indices::momentum(/*x-dir*/0)] = lambda*(dE11_dx + dE22_dx) + 2*mu*(dE11_dx + dE12_dy); divSigma[Indices::momentum(/*y-dir*/1)] = lambda*(dE11_dy + dE22_dy) + 2*mu*(dE21_dx + dE22_dy); + divSigma -= this->spatialParams().effectivePorePressureGradient(ipGlobal); return divSigma; } /*! * \brief Evaluates the exact displacement to this problem at a given position. */ - PrimaryVariables exactSolution(const GlobalPosition& globalPos) const + PrimaryVariables exactDisplacement(const GlobalPosition& globalPos) const { using std::sin; @@ -172,28 +145,6 @@ public: return exact; } - /*! - * \brief Evaluates the exact displacement gradient to this problem at a given position. - */ - GradU exactGradient(const GlobalPosition& globalPos) const - { - using std::sin; - using std::cos; - - const auto x = globalPos[0]; - const auto y = globalPos[1]; - - static constexpr int xIdx = Indices::momentum(/*x-dir*/0); - static constexpr int yIdx = Indices::momentum(/*y-dir*/1); - - GradU exactGrad(0.0); - exactGrad[xIdx][xIdx] = (1-2*x)*sin(2*pi*y); - exactGrad[xIdx][yIdx] = (x - x*x)*2*pi*cos(2*pi*y); - exactGrad[yIdx][xIdx] = 2*pi*cos(2*pi*x)*sin(2*pi*y); - exactGrad[yIdx][yIdx] = 2*pi*sin(2*pi*x)*cos(2*pi*y); - return exactGrad; - } - private: static constexpr Scalar eps_ = 3e-6; }; diff --git a/test/geomechanics/poroelastic/properties.hh b/test/geomechanics/poroelastic/properties.hh index 6e93610375300e5d70478258843b2e8341f1bae3..d751bced34a5cdbe56816100665b491adc9da7d7 100644 --- a/test/geomechanics/poroelastic/properties.hh +++ b/test/geomechanics/poroelastic/properties.hh @@ -61,8 +61,12 @@ struct FluidSystem template struct SpatialParams { + using FS = GetPropType; + using PV = GetPropType; + using Indices = typename GetPropType::Indices; using type = PoroElasticSpatialParams< GetPropType, - GetPropType >; + GetPropType, + FS, PV, Indices>; }; } // end namespace Dumux::Properties diff --git a/test/geomechanics/poroelastic/spatialparams.hh b/test/geomechanics/poroelastic/spatialparams.hh index 2bdb776ec944620962a7eb0c0974ff098b12102a..0e8e0823a7f5385c0782b05764cb910bb4667876 100644 --- a/test/geomechanics/poroelastic/spatialparams.hh +++ b/test/geomechanics/poroelastic/spatialparams.hh @@ -35,12 +35,12 @@ namespace Dumux { * \ingroup GeomechanicsTests * \brief Definition of the spatial parameters for the poro-elastic problem. */ -template +template class PoroElasticSpatialParams : public FVPoroElasticSpatialParams< GridGeometry, Scalar, - PoroElasticSpatialParams > + PoroElasticSpatialParams > { - using ThisType = PoroElasticSpatialParams; + using ThisType = PoroElasticSpatialParams; using ParentType = FVPoroElasticSpatialParams; using SubControlVolume = typename GridGeometry::SubControlVolume; @@ -48,6 +48,7 @@ class PoroElasticSpatialParams : public FVPoroElasticSpatialParams< GridGeometry using Element = typename GridView::template Codim<0>::Entity; using GlobalPosition = typename Element::Geometry::GlobalCoordinate; + static constexpr Scalar pi = M_PI; public: //! Export the type of the lame parameters using LameParams = Dumux::LameParams; @@ -73,6 +74,51 @@ public: return poroLaw.evaluatePorosity(this->gridGeometry(), element, scv, elemSol, /*refPoro*/0.3); } + /*! + * \brief Returns the effective pore pressure + * + * \note We use the x-displacement as pressure solution. The shift to + * higher values is done to see a more pronounced effect in stresses. + * + * \param globalPos The global position + */ + Scalar effectivePorePressureAtPos(const GlobalPosition& globalPos) const + { + using std::sin; + const auto x = globalPos[0]; + const auto y = globalPos[1]; + return (x-x*x)*sin(2.*pi*y) + 10; + } + + /*! + * \brief Returns the effective pore pressure gradient + * \param globalPos The global position + */ + GlobalPosition effectivePorePressureGradient(const GlobalPosition& globalPos) const + { + using std::sin; + using std::cos; + const auto x = globalPos[0]; + const auto y = globalPos[1]; + return {{ + (1.-2.*x)*sin(2.*pi*y), + 2.*pi*(x-x*x)*cos(2.*pi*y), + }}; + } + + /*! + * \brief Returns the effective fluid density. + * + * \param globalPos The global position + */ + Scalar effectiveFluidDensityAtPos(const GlobalPosition& globalPos) const + { + return FluidSystem::density( + effectivePorePressureAtPos(globalPos), + this->temperatureAtPos(globalPos) + ); + } + //! Returns the Biot coefficient of the porous medium. Scalar biotCoefficientAtPos(const GlobalPosition& globalPos) const { return 1.0; } diff --git a/test/multidomain/poromechanics/el1p/main.cc b/test/multidomain/poromechanics/el1p/main.cc index 0c8fd89651163aaf39571f2bc30aad422acc0940..1f2b8fe29b7bcf765ffc01a94387aaf6e8149074 100644 --- a/test/multidomain/poromechanics/el1p/main.cc +++ b/test/multidomain/poromechanics/el1p/main.cc @@ -92,7 +92,8 @@ int main(int argc, char** argv) using PoroMechProblem = GetPropType; auto onePSpatialParams = std::make_shared(onePFvGridGeometry, couplingManager); auto onePProblem = std::make_shared(onePFvGridGeometry, onePSpatialParams, "OneP"); - auto poroMechProblem = std::make_shared(poroMechFvGridGeometry, couplingManager, "PoroElastic"); + auto poroMechSpatialParams = std::make_shared(poroMechFvGridGeometry, couplingManager); + auto poroMechProblem = std::make_shared(poroMechFvGridGeometry, poroMechSpatialParams, "PoroElastic"); // the solution vectors using SolutionVector = typename Traits::SolutionVector; diff --git a/test/multidomain/poromechanics/el1p/problem_poroelastic.hh b/test/multidomain/poromechanics/el1p/problem_poroelastic.hh index 45042cdd346ccca73e6dcfb6c666fab52ec49d7d..74477882d8387b4301a9125b3da3a8e95e8bd227 100644 --- a/test/multidomain/poromechanics/el1p/problem_poroelastic.hh +++ b/test/multidomain/poromechanics/el1p/problem_poroelastic.hh @@ -47,7 +47,6 @@ class PoroElasticSubProblem : public GeomechanicsFVProblem using Scalar = GetPropType; using Indices = typename GetPropType::Indices; using BoundaryTypes = Dumux::BoundaryTypes::numEq()>; - using CouplingManager = GetPropType; using PrimaryVariables = GetPropType; using ElementVolumeVariables = typename GetPropType::LocalView; @@ -65,10 +64,9 @@ class PoroElasticSubProblem : public GeomechanicsFVProblem public: PoroElasticSubProblem(std::shared_ptr gridGeometry, - std::shared_ptr couplingManagerPtr, + std::shared_ptr> spatialParams, const std::string& paramGroup = "PoroElastic") - : ParentType(gridGeometry, paramGroup) - , couplingManagerPtr_(couplingManagerPtr) + : ParentType(gridGeometry, spatialParams, paramGroup) { problemName_ = getParam("Vtk.OutputName") + "_" + getParamFromGroup(this->paramGroup(), "Problem.Name"); } @@ -92,31 +90,6 @@ public: PrimaryVariables neumannAtPos(const GlobalPosition& globalPos) const { return PrimaryVariables(0.0); } - /*! - * \brief Returns the effective fluid density. - */ - Scalar effectiveFluidDensity(const Element& element, - const SubControlVolume& scv) const - { - // get porous medium flow volume variables from coupling manager - const auto pmFlowVolVars = couplingManager().getPMFlowVolVars(element); - return pmFlowVolVars.density(); - } - - /*! - * \brief Returns the effective pore pressure. - */ - template< class FluxVarsCache > - Scalar effectivePorePressure(const Element& element, - const FVElementGeometry& fvGeometry, - const ElementVolumeVariables& elemVolVars, - const FluxVarsCache& fluxVarsCache) const - { - // get porous medium flow volume variables from coupling manager - const auto pmFlowVolVars = couplingManager().getPMFlowVolVars(element); - return pmFlowVolVars.pressure(); - } - /*! * \brief Specifies which kind of boundary condition should be * used for which equation on a given boundary segment. @@ -140,12 +113,7 @@ public: const SubControlVolume& scv) const { return PrimaryVariables(0.0); } - //! Returns reference to the coupling manager. - const CouplingManager& couplingManager() const - { return *couplingManagerPtr_; } - private: - std::shared_ptr couplingManagerPtr_; static constexpr Scalar eps_ = 3e-6; std::string problemName_; }; diff --git a/test/multidomain/poromechanics/el1p/properties.hh b/test/multidomain/poromechanics/el1p/properties.hh index a28d740405c7b727fc3ee35430d5607fd33d62a3..ddcc44f500efab2ee3e037149f0b61cfce22efb7 100644 --- a/test/multidomain/poromechanics/el1p/properties.hh +++ b/test/multidomain/poromechanics/el1p/properties.hh @@ -97,8 +97,10 @@ struct FluidSystem template struct SpatialParams { + using CouplingManager = GetPropType; using type = PoroElasticSpatialParams< GetPropType, - GetPropType >; + GetPropType, + CouplingManager>; }; template diff --git a/test/multidomain/poromechanics/el1p/spatialparams_poroelastic.hh b/test/multidomain/poromechanics/el1p/spatialparams_poroelastic.hh index 860fcbde04158c67c1d2a48da2674540fe7a2992..b06457535f2ecae5708b7e529ceae23c2c6433d9 100644 --- a/test/multidomain/poromechanics/el1p/spatialparams_poroelastic.hh +++ b/test/multidomain/poromechanics/el1p/spatialparams_poroelastic.hh @@ -35,25 +35,27 @@ namespace Dumux { * \brief Definition of the spatial parameters for the poro-elastic * sub-problem in the coupled poro-mechanical el1p problem. */ -template +template class PoroElasticSpatialParams : public FVPoroElasticSpatialParams< GridGeometry, Scalar, - PoroElasticSpatialParams > + PoroElasticSpatialParams > { - using ThisType = PoroElasticSpatialParams; + using ThisType = PoroElasticSpatialParams; using ParentType = FVPoroElasticSpatialParams; using SubControlVolume = typename GridGeometry::SubControlVolume; using GridView = typename GridGeometry::GridView; using Element = typename GridView::template Codim<0>::Entity; + using FVElementGeometry = typename GridGeometry::LocalView; using GlobalPosition = typename Element::Geometry::GlobalCoordinate; - public: //! Export the type of the lame parameters using LameParams = Dumux::LameParams; - PoroElasticSpatialParams(std::shared_ptr gridGeometry) + PoroElasticSpatialParams(std::shared_ptr gridGeometry, + std::shared_ptr couplingManagerPtr) : ParentType(gridGeometry) + , couplingManager_(couplingManagerPtr) , initPorosity_(getParam("SpatialParams.InitialPorosity")) { // Young's modulus [Pa] @@ -79,11 +81,41 @@ public: return PorosityDeformation::evaluatePorosity(this->gridGeometry(), element, scv, elemSol, initPorosity_); } + /*! + * \brief Returns the effective fluid density. + */ + Scalar effectiveFluidDensity(const Element& element, + const SubControlVolume& scv) const + { + // get porous medium flow volume variables from coupling manager + const auto& pmFlowVolVars = couplingManager().getPMFlowVolVars(element); + return pmFlowVolVars.density(); + } + + /*! + * \brief Returns the effective pore pressure. + */ + template + Scalar effectivePorePressure(const Element& element, + const FVElementGeometry& fvGeometry, + const ElementVolumeVariables& elemVolVars, + const FluxVarsCache& fluxVarsCache) const + { + // get porous medium flow volume variables from coupling manager + const auto& pmFlowVolVars = couplingManager().getPMFlowVolVars(element); + return pmFlowVolVars.pressure(); + } + //! Returns the Biot coefficient of the porous medium. Scalar biotCoefficientAtPos(const GlobalPosition& globalPos) const { return 1.0; } + //! Returns reference to the coupling manager. + const CouplingManager& couplingManager() const + { return *couplingManager_; } + private: + std::shared_ptr couplingManager_; Scalar initPorosity_; LameParams lameParams_; }; diff --git a/test/multidomain/poromechanics/el2p/main.cc b/test/multidomain/poromechanics/el2p/main.cc index d43c3f1c681ff647c02c4decf99e625117b2b48f..e3ced45b3cb14124397fddc06fe1d3fcec675c59 100644 --- a/test/multidomain/poromechanics/el2p/main.cc +++ b/test/multidomain/poromechanics/el2p/main.cc @@ -93,7 +93,8 @@ int main(int argc, char** argv) using PoroMechProblem = GetPropType; auto twoPSpatialParams = std::make_shared(twoPFvGridGeometry, couplingManager); auto twoPProblem = std::make_shared(twoPFvGridGeometry, twoPSpatialParams, "TwoP"); - auto poroMechProblem = std::make_shared(poroMechFvGridGeometry, couplingManager, "PoroElastic"); + auto poroMechSpatialParams = std::make_shared(poroMechFvGridGeometry, couplingManager); + auto poroMechProblem = std::make_shared(poroMechFvGridGeometry, poroMechSpatialParams, "PoroElastic"); // the solution vectors using SolutionVector = typename Traits::SolutionVector; diff --git a/test/multidomain/poromechanics/el2p/problem_poroelastic.hh b/test/multidomain/poromechanics/el2p/problem_poroelastic.hh index 0c72d7ef8f055e26230d8ab47436a35d48b66d46..64d91f7e8150b0e32506bdf0270a99174e4e2cef 100644 --- a/test/multidomain/poromechanics/el2p/problem_poroelastic.hh +++ b/test/multidomain/poromechanics/el2p/problem_poroelastic.hh @@ -47,7 +47,6 @@ class PoroElasticSubProblem : public GeomechanicsFVProblem using Scalar = GetPropType; using Indices = typename GetPropType::Indices; using BoundaryTypes = Dumux::BoundaryTypes::numEq()>; - using CouplingManager = GetPropType; using PrimaryVariables = GetPropType; using ElementVolumeVariables = typename GetPropType::LocalView; @@ -65,10 +64,9 @@ class PoroElasticSubProblem : public GeomechanicsFVProblem public: PoroElasticSubProblem(std::shared_ptr gridGeometry, - std::shared_ptr couplingManagerPtr, + std::shared_ptr> spatialParams, const std::string& paramGroup = "PoroElastic") - : ParentType(gridGeometry, paramGroup) - , couplingManagerPtr_(couplingManagerPtr) + : ParentType(gridGeometry, spatialParams, paramGroup) { problemName_ = getParam("Vtk.OutputName") + "_" + getParamFromGroup(this->paramGroup(), "Problem.Name"); } @@ -93,40 +91,6 @@ public: PrimaryVariables neumannAtPos(const GlobalPosition& globalPos) const { return PrimaryVariables(0.0); } - /*! - * \brief Returns the effective fluid density. - */ - Scalar effectiveFluidDensity(const Element& element, const SubControlVolume& scv) const - { - // get porous medium flow volume variables from coupling manager - const auto pmFlowVolVars = couplingManager().getPMFlowVolVars(element); - - Scalar wPhaseDensity = pmFlowVolVars.density(FluidSystem::phase0Idx); - Scalar nPhaseDensity = pmFlowVolVars.density(FluidSystem::phase1Idx); - Scalar Sw = pmFlowVolVars.saturation(FluidSystem::phase0Idx); - Scalar Sn = pmFlowVolVars.saturation(FluidSystem::phase1Idx); - return (wPhaseDensity * Sw + nPhaseDensity * Sn); - } - - /*! - * \brief Returns the effective pore pressure. - */ - template< class FluxVarsCache > - Scalar effectivePorePressure(const Element& element, - const FVElementGeometry& fvGeometry, - const ElementVolumeVariables& elemVolVars, - const FluxVarsCache& fluxVarsCache) const - { - // get porous medium flow volume variables from coupling manager - const auto pmFlowVolVars = couplingManager().getPMFlowVolVars(element); - - Scalar pw = pmFlowVolVars.pressure(FluidSystem::phase0Idx); - Scalar pn = pmFlowVolVars.pressure(FluidSystem::phase1Idx); - Scalar Sw = pmFlowVolVars.saturation(FluidSystem::phase0Idx); - Scalar Sn = pmFlowVolVars.saturation(FluidSystem::phase1Idx); - return (pw * Sw + pn * Sn); - } - /*! * \brief Specifies which kind of boundary condition should be * used for which equation on a given boundary segment. @@ -150,12 +114,7 @@ public: const SubControlVolume& scv) const { return PrimaryVariables(0.0); } - //! Returns reference to the coupling manager. - const CouplingManager& couplingManager() const - { return *couplingManagerPtr_; } - private: - std::shared_ptr couplingManagerPtr_; static constexpr Scalar eps_ = 3e-6; std::string problemName_; }; diff --git a/test/multidomain/poromechanics/el2p/properties.hh b/test/multidomain/poromechanics/el2p/properties.hh index c87f8a4761d3d7ee4dcba8828d371cd405622473..44d902738bcf950a2340766749a16d130d662b39 100644 --- a/test/multidomain/poromechanics/el2p/properties.hh +++ b/test/multidomain/poromechanics/el2p/properties.hh @@ -102,8 +102,11 @@ struct FluidSystem template struct SpatialParams { + using CouplingManager = GetPropType; + using FluidSystem = GetPropType; using type = PoroElasticSpatialParams< GetPropType, - GetPropType >; + GetPropType, + CouplingManager, FluidSystem>; }; template diff --git a/test/multidomain/poromechanics/el2p/spatialparams_poroelastic.hh b/test/multidomain/poromechanics/el2p/spatialparams_poroelastic.hh index 2d2646b5a24ceaf554dda04d9f80708a3cbde146..cd0c82d376798ed3b1c6136b11cf1b3c3b67830b 100644 --- a/test/multidomain/poromechanics/el2p/spatialparams_poroelastic.hh +++ b/test/multidomain/poromechanics/el2p/spatialparams_poroelastic.hh @@ -35,25 +35,29 @@ namespace Dumux { * \brief Definition of the spatial parameters for the poro-elastic * sub-problem in the coupled poro-mechanical el1p problem. */ -template +template class PoroElasticSpatialParams : public FVPoroElasticSpatialParams< GridGeometry, Scalar, - PoroElasticSpatialParams > + PoroElasticSpatialParams > { - using ThisType = PoroElasticSpatialParams; + using ThisType = PoroElasticSpatialParams; using ParentType = FVPoroElasticSpatialParams; using SubControlVolume = typename GridGeometry::SubControlVolume; using GridView = typename GridGeometry::GridView; using Element = typename GridView::template Codim<0>::Entity; + using FVElementGeometry = typename GridGeometry::LocalView; using GlobalPosition = typename Element::Geometry::GlobalCoordinate; public: //! Export the type of the lame parameters using LameParams = Dumux::LameParams; - PoroElasticSpatialParams(std::shared_ptr gridGeometry) + PoroElasticSpatialParams(std::shared_ptr gridGeometry, + std::shared_ptr couplingManagerPtr) : ParentType(gridGeometry) + , couplingManager_(couplingManagerPtr) , initPorosity_(getParam("SpatialParams.InitialPorosity")) { // Young's modulus [Pa] @@ -79,6 +83,40 @@ public: return PorosityDeformation::evaluatePorosity(this->gridGeometry(), element, scv, elemSol, initPorosity_); } + /*! + * \brief Returns the effective fluid density. + */ + Scalar effectiveFluidDensity(const Element& element, const SubControlVolume& scv) const + { + // get porous medium flow volume variables from coupling manager + const auto& pmFlowVolVars = couplingManager().getPMFlowVolVars(element); + + Scalar wPhaseDensity = pmFlowVolVars.density(FluidSystem::phase0Idx); + Scalar nPhaseDensity = pmFlowVolVars.density(FluidSystem::phase1Idx); + Scalar Sw = pmFlowVolVars.saturation(FluidSystem::phase0Idx); + Scalar Sn = pmFlowVolVars.saturation(FluidSystem::phase1Idx); + return (wPhaseDensity * Sw + nPhaseDensity * Sn); + } + + /*! + * \brief Returns the effective pore pressure. + */ + template + Scalar effectivePorePressure(const Element& element, + const FVElementGeometry& fvGeometry, + const ElementVolumeVariables& elemVolVars, + const FluxVarsCache& fluxVarsCache) const + { + // get porous medium flow volume variables from coupling manager + const auto& pmFlowVolVars = couplingManager().getPMFlowVolVars(element); + + Scalar pw = pmFlowVolVars.pressure(FluidSystem::phase0Idx); + Scalar pn = pmFlowVolVars.pressure(FluidSystem::phase1Idx); + Scalar Sw = pmFlowVolVars.saturation(FluidSystem::phase0Idx); + Scalar Sn = pmFlowVolVars.saturation(FluidSystem::phase1Idx); + return (pw * Sw + pn * Sn); + } + //! Returns the Biot coefficient of the porous medium. Scalar biotCoefficientAtPos(const GlobalPosition& globalPos) const { return 1.0; } @@ -87,7 +125,12 @@ public: Scalar temperatureAtPos(const GlobalPosition& globalPos) const { return 273.15 + 10; } + //! Returns reference to the coupling manager. + const CouplingManager& couplingManager() const + { return *couplingManager_; } + private: + std::shared_ptr couplingManager_; Scalar initPorosity_; LameParams lameParams_; }; diff --git a/test/references/test_poroelastic_box-reference.vtu b/test/references/test_poroelastic_box-reference.vtu index 81e85a515b2b24350309b85eb3f458b6af2b424c..198fe9dad227bfa647a7aa06a20ff6b5d0f4f154 100644 --- a/test/references/test_poroelastic_box-reference.vtu +++ b/test/references/test_poroelastic_box-reference.vtu @@ -4,47 +4,47 @@ - 0.655203 0.868329 0.672437 0.830133 0.899819 0.861442 0.890522 0.846568 0.813685 0.749571 0 0 - 1 1 1 1 1 1 1 1 1 1 0.621734 0.586077 - 0.538282 0.473145 0.383017 0.252817 0.051129 0 0 0 0 0.431814 1 1 - 1 1 0.541949 0.795026 0.836609 0.812389 0.629529 0.0797655 0 1 1 1 - 1 0.635513 0.86485 0.896869 0.885038 0.788117 0.527552 1 1 1 1 1 - 0.643345 0.86925 0.901265 0.892533 0.818094 0.65486 1 1 1 1 1 0.57287 - 0.819178 0.862068 0.855446 0.788806 0.680536 0 0 0 0 0.173414 0.348159 0.461374 - 0.537691 0.591657 0.632757 0.633306 0.0286361 0.764376 0.833118 0.825643 0.727822 0 1 1 - 1 0 0.456711 0.520115 0.85746 0.895792 0.887766 0.81069 0 1 1 1 - 1 0 0.602325 0.86295 0.897555 0.888803 0.81162 0 1 1 1 1 + 0.655433 0.868323 0.673007 0.829742 0.899778 0.860935 0.890441 0.845739 0.813398 0.74706 0 0 + 1 1 1 1 1 1 1 1 1 1 0.622657 0.582873 + 0.530497 0.459697 0.362053 0.221299 0.00392792 0 0 0 0 0.43368 1 1 + 1 1 0.532211 0.793253 0.835704 0.811659 0.629244 0.0846488 0 1 1 1 + 1 0.633066 0.864543 0.896728 0.884937 0.788132 0.528307 1 1 1 1 1 + 0.645392 0.869508 0.901388 0.892633 0.81819 0.654846 1 1 1 1 1 0.580769 + 0.820502 0.862699 0.855891 0.788993 0.680161 0 0 0 0 0.208237 0.370369 0.475464 + 0.546141 0.595773 0.633181 0.632466 0.021907 0.765078 0.833856 0.82673 0.730821 0 1 1 + 1 0 0.454613 0.518772 0.85745 0.895845 0.887874 0.811065 0 1 1 1 + 1 0 0.602019 0.862957 0.897598 0.888887 0.811913 0 1 1 1 1 0 - 0 0 0 0 0 0 0 0 0 0.0481153 0.363957 0 - 0 0 0 0.0934166 0.58934 0 0 0 0 0.130954 0.589376 0 - 0 0 0 0.155976 0.364446 0 0 0 0 0.164956 0.000518449 0 - 0 0 0 0.156554 -0.363477 0 0 0 0 0.131993 -0.588613 0 - 0 0 0 0.0946667 -0.588909 0 0 0 0 0.0491385 -0.363932 0 - 0 0 0 0 0 0 0 0 0 0.0838484 0.590559 0 - 0.152264 0.953557 0 0.20395 0.95324 0 0.236441 0.590205 0 0.247828 0.0029933 0 - 0.23735 -0.584491 0 0.205573 -0.948337 0 0.154177 -0.949978 0 0.0853257 -0.588714 0 - 0 0 0 0 0 0 0.0869138 0.59232 0 0.150812 0.955588 0 - 0.193915 0.955417 0 0.218695 0.592875 0 0.227034 0.00630311 0 0.219587 -0.580797 0 - 0.195501 -0.944912 0 0.152661 -0.947661 0 0.0883236 -0.587912 0 0 0 0 - 0 0 0 0.0556681 0.368707 0 0.0894817 0.594634 0 0.106461 0.595281 0 - 0.11319 0.371574 0 0.114957 0.00905389 0 0.113735 -0.354203 0 0.107428 -0.580103 0 - 0.0906056 -0.583065 0 0.0565214 -0.36215 0 0 0 0 0 0 0 - 0.00219115 0.00512468 0 -0.00779061 0.00822956 0 -0.0239508 0.00992753 0 -0.0381341 0.0105005 0 - -0.043704 0.0101149 0 -0.0381341 0.00891322 0 -0.0239508 0.00705559 0 -0.00779061 0.00474666 0 - 0.00219115 0.00226344 0 0 0 0 0 0 0 -0.0529906 -0.3597 0 - -0.103629 -0.580047 0 -0.147159 -0.577593 0 -0.177014 -0.352809 0 -0.187839 0.00905389 0 - -0.177559 0.37018 0 -0.148126 0.592771 0 -0.104753 0.591616 0 -0.0538439 0.366257 0 - 0 0 0 0 0 0 -0.0888655 -0.586512 0 -0.161633 -0.945823 0 - -0.216467 -0.943322 0 -0.250905 -0.579895 0 -0.262955 0.00630311 0 -0.251797 0.591973 0 - -0.218052 0.953827 0 -0.163482 0.95375 0 -0.0902753 0.59092 0 0 0 0 - 0 0 0 -0.0918459 -0.588504 0 -0.160151 -0.949473 0 -0.206475 -0.947793 0 - -0.233242 -0.584154 0 -0.242265 0.0029933 0 -0.234151 0.589868 0 -0.208099 0.952696 0 - -0.162064 0.953053 0 -0.0933231 0.59035 0 0 0 0 0 0 0 - -0.0603096 -0.364402 0 -0.0996524 -0.589188 0 -0.122767 -0.588728 0 -0.134401 -0.36351 0 - -0.138052 0.000518449 0 -0.134979 0.364478 0 -0.123806 0.589491 0 -0.100902 0.589619 0 - -0.0613327 0.364427 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0.0486589 0.363955 0 + 0 0 0 0.0940824 0.589126 0 0 0 0 0.131509 0.588989 0 + 0 0 0 0.156285 0.363953 0 0 0 0 0.164956 -9.51701e-06 0 + 0 0 0 0.156245 -0.36397 0 0 0 0 0.131438 -0.589 0 + 0 0 0 0.0940009 -0.589123 0 0 0 0 0.0485949 -0.363933 0 + 0 0 0 0 0 0 0 0 0 0.0846379 0.589629 0 + 0.153289 0.951747 0 0.204822 0.95076 0 0.23693 0.587317 0 0.247828 -3.19437e-05 0 + 0.236861 -0.587379 0 0.204701 -0.950817 0 0.153151 -0.951788 0 0.0845361 -0.589645 0 + 0 0 0 0 0 0 0.0876695 0.590077 0 0.151807 0.951569 0 + 0.19477 0.950106 0 0.219177 0.586777 0 0.227034 -5.86404e-05 0 0.219106 -0.586895 0 + 0.194646 -0.950224 0 0.151666 -0.951679 0 0.0875678 -0.590155 0 0 0 0 + 0 0 0 0.0561262 0.365362 0 0.0900875 0.588766 0 0.106983 0.587607 0 + 0.113485 0.362807 0 0.114957 -7.98866e-05 0 0.11344 -0.36297 0 0.106906 -0.587777 0 + 0.0899998 -0.588934 0 0.0560633 -0.365495 0 0 0 0 0 0 0 + 0.00219115 0.0013533 0 -0.00779061 0.00164582 0 -0.0239508 0.0013414 0 -0.0381341 0.000703644 0 + -0.043704 -8.79524e-05 0 -0.0381341 -0.000883643 0 -0.0239508 -0.00153054 0 -0.00779061 -0.00183707 0 + 0.00219115 -0.00150793 0 0 0 0 0 0 0 -0.0534487 -0.363046 0 + -0.104235 -0.585916 0 -0.147681 -0.585267 0 -0.177309 -0.361576 0 -0.187839 -7.98866e-05 0 + -0.177264 0.361413 0 -0.147603 0.585097 0 -0.104147 0.585747 0 -0.0533858 0.362912 0 + 0 0 0 0 0 0 -0.0896213 -0.588755 0 -0.162628 -0.949841 0 + -0.217322 -0.948633 0 -0.251387 -0.585993 0 -0.262955 -5.86404e-05 0 -0.251316 0.585875 0 + -0.217198 0.948515 0 -0.162487 0.949732 0 -0.0895196 0.588677 0 0 0 0 + 0 0 0 -0.0926354 -0.589435 0 -0.161177 -0.951283 0 -0.207348 -0.950273 0 + -0.233731 -0.587042 0 -0.242265 -3.19437e-05 0 -0.233662 0.58698 0 -0.207226 0.950216 0 + -0.161038 0.951242 0 -0.0925336 0.589419 0 0 0 0 0 0 0 + -0.0608532 -0.364404 0 -0.100318 -0.589402 0 -0.123322 -0.589115 0 -0.13471 -0.364003 0 + -0.138052 -9.51701e-06 0 -0.13467 0.363986 0 -0.123252 0.589104 0 -0.100237 0.589404 0 + -0.0607892 0.364425 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 @@ -96,112 +96,112 @@ 0 0 0 0 - -4.93165 4.12072 0 0.852608 3.66916 0 2.85535 2.24407 0 0.218572 0.61999 0 - -6.15744 -0.429951 0 -13.9581 -0.42486 0 -20.328 0.63411 0 -22.953 2.26364 0 - -20.9337 3.68783 0 -15.1281 4.1307 0 -3.81349 9.90249 0 -0.78345 6.82962 0 - -0.194182 1.31561 0 -2.56243 -4.34505 0 -7.30686 -7.87801 0 -12.952 -7.87811 0 - -17.6815 -4.34606 0 -20.0213 1.31153 0 -19.393 6.81939 0 -16.3202 9.88833 0 - -4.90703 11.8594 0 -6.12019 7.2788 0 -7.30173 -0.119743 0 -8.4609 -7.53357 0 - -9.59592 -12.1232 0 -10.7152 -12.1314 0 -11.8322 -7.55796 0 -12.9572 -0.159769 0 - -14.092 7.22495 0 -15.249 11.7962 0 -7.9971 9.29781 0 -13.0175 4.9662 0 - -15.5601 -1.48308 0 -15.0532 -7.79209 0 -12.0826 -11.6667 0 -8.16684 -11.6829 0 - -5.18181 -7.8394 0 -4.6475 -1.55839 0 -7.15222 4.86807 0 -12.1262 9.1826 0 - -11.9147 3.20355 0 -18.8243 0.782829 0 -21.7509 -2.25339 0 -19.7582 -5.0487 0 - -13.7907 -6.72891 0 -6.30428 -6.74989 0 -0.331271 -5.11006 0 1.6719 -2.35047 0 - -1.24022 0.657061 0 -8.13192 3.05556 0 -15.1576 -4.09757 0 -21.3102 -3.68262 0 - -23.4907 -2.14893 0 -20.7592 -0.367308 0 -14.0591 0.784621 0 -5.84597 0.763641 0 - 0.848633 -0.428665 0 3.56978 -2.24601 0 1.37475 -3.80839 0 -4.7958 -4.24556 0 - -16.4854 -9.82087 0 -19.5249 -6.73537 0 -20.1143 -1.22357 0 -17.6729 4.45011 0 - -12.7844 7.99054 0 -6.96622 7.97442 0 -2.09211 4.4028 0 0.321887 -1.29888 0 - -0.305422 -6.8335 0 -3.39137 -9.93608 0 -15.3938 -11.78 0 -14.1611 -7.21778 0 - -12.9285 0.156543 0 -11.696 7.5472 0 -10.4603 12.117 0 -9.22851 12.1088 0 - -8.01093 7.52281 0 -6.81264 0.116517 0 -5.62675 -7.27163 0 -4.45025 -11.8432 0 - -12.2852 -9.2137 0 -7.28242 -4.93719 0 -4.73798 1.46346 0 -5.17088 7.71407 0 - -7.99828 11.5423 0 -11.7428 11.5422 0 -14.5851 7.71306 0 -15.0465 1.45938 0 - -12.5411 -4.94742 0 -7.58112 -9.22786 0 -8.15059 -3.04093 0 -1.60499 -0.648233 0 - 1.14365 2.22879 0 -0.756332 4.82386 0 -6.40314 6.36481 0 -13.4813 6.3699 0 - -19.1342 4.83798 0 -21.046 2.24836 0 -18.314 -0.629562 0 -11.7896 -3.03094 0 + -4.91536 4.12614 0 0.854117 3.67913 0 2.84601 2.25455 0 0.202398 0.627571 0 + -6.17691 -0.427214 0 -13.9776 -0.427597 0 -20.3442 0.62653 0 -22.9623 2.25316 0 + -20.9321 3.67786 0 -15.1119 4.12528 0 -3.78278 9.89563 0 -0.797953 6.82475 0 + -0.23901 1.31397 0 -2.62619 -4.34522 0 -7.37973 -7.87793 0 -13.0249 -7.87819 0 + -17.7453 -4.34589 0 -20.0661 1.31317 0 -19.4075 6.82425 0 -16.2895 9.89519 0 + -4.8738 11.8274 0 -6.14113 7.2516 0 -7.36094 -0.139846 0 -8.54401 -7.54577 0 + -9.6905 -12.1273 0 -10.8098 -12.1273 0 -11.9153 -7.54576 0 -13.0164 -0.139666 0 + -14.1129 7.25215 0 -15.2157 11.8283 0 -7.97171 9.23895 0 -13.0354 4.91634 0 + -15.6089 -1.52128 0 -15.1215 -7.81608 0 -12.1603 -11.6749 0 -8.24455 -11.6747 0 + -5.25015 -7.81541 0 -4.69634 -1.52019 0 -7.17014 4.91793 0 -12.1008 9.24145 0 + -11.9052 3.1278 0 -18.8313 0.718834 0 -21.7697 -2.30275 0 -19.7845 -5.07991 0 + -13.8205 -6.73959 0 -6.33412 -6.73922 0 -0.357515 -5.07885 0 1.65312 -2.30111 0 + -1.24721 0.721057 0 -8.12244 3.13131 0 -15.167 -4.17332 0 -21.3032 -3.74662 0 + -23.472 -2.19829 0 -20.7329 -0.398519 0 -14.0292 0.773945 0 -5.81614 0.774317 0 + 0.874877 -0.397454 0 3.58856 -2.19665 0 1.38173 -3.74439 0 -4.80528 -4.16981 0 + -16.5108 -9.87973 0 -19.507 -6.78522 0 -20.0654 -1.26177 0 -17.6046 4.42612 0 + -12.7067 7.98237 0 -6.88852 7.98259 0 -2.02377 4.42679 0 0.370721 -1.26068 0 + -0.287512 -6.78364 0 -3.41677 -9.87723 0 -15.427 -11.812 0 -14.1402 -7.24498 0 + -12.8693 0.13644 0 -11.6128 7.535 0 -10.3658 12.1129 0 -9.13394 12.1129 0 + -7.92782 7.53501 0 -6.75343 0.13662 0 -5.60581 -7.24443 0 -4.48348 -11.8111 0 + -12.3159 -9.22056 0 -7.26792 -4.94206 0 -4.69315 1.46182 0 -5.10712 7.7139 0 + -7.92541 11.5424 0 -11.6699 11.5421 0 -14.5214 7.71323 0 -15.0017 1.46102 0 + -12.5266 -4.94256 0 -7.61182 -9.221 0 -8.16688 -3.03551 0 -1.6065 -0.638264 0 + 1.15299 2.23927 0 -0.740157 4.83144 0 -6.38366 6.36755 0 -13.4618 6.36717 0 + -19.1181 4.8304 0 -21.0367 2.23788 0 -18.3155 -0.639531 0 -11.8059 -3.03636 0 - 5.08303 4.12072 0 10.892 3.66916 0 12.9133 2.24407 0 10.2889 0.61999 0 - 3.91904 -0.429951 0 -3.88166 -0.42486 0 -10.2577 0.63411 0 -12.895 2.26364 0 - -10.8943 3.68783 0 -5.11347 4.1307 0 6.22494 9.90249 0 9.3197 6.82962 0 - 9.95751 1.31561 0 7.62162 -4.34505 0 2.89337 -7.87801 0 -2.75182 -7.87811 0 - -7.49749 -4.34606 0 -9.86961 1.31153 0 -9.28988 6.81939 0 -6.28175 9.88833 0 - 5.14047 11.8594 0 4.00731 7.2788 0 2.88577 -0.119743 0 1.7666 -7.53357 0 - 0.651581 -12.1232 0 -0.46772 -12.1314 0 -1.60472 -7.55796 0 -2.76967 -0.159769 0 - -3.96447 7.22495 0 -5.20146 11.7962 0 2.04133 9.29781 0 -2.91432 4.9662 0 - -5.40841 -1.48308 0 -4.86912 -7.79209 0 -1.88232 -11.6667 0 2.03339 -11.6829 0 - 5.00224 -7.8394 0 5.50419 -1.55839 0 2.95093 4.86807 0 -2.08773 9.1826 0 - -1.90004 3.20355 0 -8.78491 0.782829 0 -11.693 -2.25339 0 -9.68791 -5.0487 0 - -3.71419 -6.72891 0 3.7722 -6.74989 0 9.73903 -5.11006 0 11.7298 -2.35047 0 - 8.79918 0.657061 0 1.88275 3.05556 0 -5.17223 -4.09757 0 -11.3496 -3.68262 0 - -13.5487 -2.14893 0 -10.8295 -0.367308 0 -4.13555 0.784621 0 4.07754 0.763641 0 - 10.7783 -0.428665 0 13.5118 -2.24601 0 11.3353 -3.80839 0 5.18952 -4.24556 0 - -6.5238 -9.82087 0 -9.62804 -6.73537 0 -10.266 -1.22357 0 -7.85696 4.45011 0 - -2.98462 7.99054 0 2.83355 7.97442 0 7.72384 4.4028 0 10.1702 -1.29888 0 - 9.59143 -6.8335 0 6.5702 -9.93608 0 -5.44126 -11.78 0 -4.28859 -7.21778 0 - -3.11596 0.156543 0 -1.92345 7.5472 0 -0.707847 12.117 0 0.523986 12.1088 0 - 1.76157 7.52281 0 2.99986 0.116517 0 4.24575 -7.27163 0 5.50225 -11.8432 0 - -2.32365 -9.2137 0 2.61443 -4.93719 0 5.11033 1.46346 0 4.64507 7.71407 0 - 1.80149 11.5423 0 -1.94305 11.5422 0 -4.7692 7.71306 0 -5.19823 1.45938 0 - -2.64424 -4.94742 0 2.38045 -9.22786 0 1.83473 -3.04093 0 8.35561 -0.648233 0 - 11.0857 2.22879 0 9.17337 4.82386 0 3.52038 6.36481 0 -3.55777 6.3699 0 - -9.20453 4.83798 0 -11.104 2.24836 0 -8.35336 -0.629562 0 -1.80429 -3.03094 0 + 5.09931 4.12614 0 10.8935 3.67913 0 12.904 2.25455 0 10.2727 0.627571 0 + 3.89957 -0.427214 0 -3.90114 -0.427597 0 -10.2739 0.62653 0 -12.9044 2.25316 0 + -10.8927 3.67786 0 -5.09718 4.12528 0 6.25564 9.89563 0 9.3052 6.82475 0 + 9.91268 1.31397 0 7.55786 -4.34522 0 2.82051 -7.87793 0 -2.82468 -7.87819 0 + -7.56125 -4.34589 0 -9.91444 1.31317 0 -9.30439 6.82425 0 -6.25104 9.89519 0 + 5.1737 11.8274 0 3.98637 7.2516 0 2.82656 -0.139846 0 1.68349 -7.54577 0 + 0.557004 -12.1273 0 -0.562296 -12.1273 0 -1.68783 -7.54576 0 -2.82887 -0.139666 0 + -3.9854 7.25215 0 -5.16822 11.8283 0 2.06672 9.23895 0 -2.93223 4.91634 0 + -5.45725 -1.52128 0 -4.93746 -7.81608 0 -1.96002 -11.6749 0 1.95569 -11.6747 0 + 4.9339 -7.81541 0 5.45536 -1.52019 0 2.93301 4.91793 0 -2.06233 9.24145 0 + -1.89056 3.1278 0 -8.79189 0.718834 0 -11.7118 -2.30275 0 -9.71415 -5.07991 0 + -3.74403 -6.73959 0 3.74236 -6.73922 0 9.71279 -5.07885 0 11.7111 -2.30111 0 + 8.79219 0.721057 0 1.89224 3.13131 0 -5.18172 -4.17332 0 -11.3426 -3.74662 0 + -13.5299 -2.19829 0 -10.8032 -0.398519 0 -4.10571 0.773945 0 4.10738 0.774317 0 + 10.8046 -0.397454 0 13.5306 -2.19665 0 11.3423 -3.74439 0 5.18004 -4.16981 0 + -6.5492 -9.87973 0 -9.61012 -6.78522 0 -10.2171 -1.26177 0 -7.78862 4.42612 0 + -2.90691 7.98237 0 2.91125 7.98259 0 7.79218 4.42679 0 10.219 -1.26068 0 + 9.60934 -6.78364 0 6.5448 -9.87723 0 -5.4745 -11.812 0 -4.26766 -7.24498 0 + -3.05676 0.13644 0 -1.84034 7.535 0 -0.613271 12.1129 0 0.618563 12.1129 0 + 1.84468 7.53501 0 3.05907 0.13662 0 4.26669 -7.24443 0 5.46902 -11.8111 0 + -2.35435 -9.22056 0 2.62893 -4.94206 0 5.15516 1.46182 0 4.70883 7.7139 0 + 1.87436 11.5424 0 -1.87018 11.5421 0 -4.70544 7.71323 0 -5.1534 1.46102 0 + -2.62974 -4.94256 0 2.34975 -9.221 0 1.81844 -3.03551 0 8.3541 -0.638264 0 + 11.0951 2.23927 0 9.18954 4.83144 0 3.53986 6.36755 0 -3.53829 6.36717 0 + -9.18835 4.8304 0 -11.0946 2.23788 0 -8.35487 -0.639531 0 -1.82058 -3.03636 0 - 4.12072 1.38517 0 3.66916 19.0125 0 2.24407 25.6789 0 0.61999 18.7946 0 - -0.429951 0.962239 0 -0.42486 -21.0493 0 0.63411 -38.8786 0 2.26364 -45.7569 0 - 3.68783 -39.0799 0 4.1307 -21.424 0 9.90249 -1.9207 0 6.82962 8.75862 0 - 1.31561 12.583 0 -4.34505 8.07977 0 -7.87801 -3.14952 0 -7.87811 -16.9452 0 - -4.34606 -28.1695 0 1.31153 -32.6627 0 6.81939 -28.8225 0 9.88833 -18.1265 0 - 11.8594 -8.28707 0 7.2788 -8.69065 0 -0.119743 -9.11337 0 -7.53357 -9.50936 0 - -12.1232 -9.87084 0 -12.1314 -10.2167 0 -7.55796 -10.5726 0 -0.159769 -10.9576 0 - 7.22495 -11.3658 0 11.7962 -11.7599 0 9.29781 -15.321 0 4.9662 -26.663 0 - -1.48308 -31.1836 0 -7.79209 -27.3121 0 -11.6667 -16.6557 0 -11.6829 -3.40656 0 - -7.8394 7.25414 0 -1.55839 11.1338 0 4.86807 6.62336 0 9.1826 -4.71401 0 - 3.20355 -20.3435 0 0.782829 -38.3007 0 -2.25339 -45.2025 0 -5.0487 -38.5377 0 - -6.72891 -20.9149 0 -6.74989 0.892307 0 -5.11006 18.5167 0 -2.35047 25.1846 0 - 0.657061 18.2863 0 3.05556 0.330589 0 -4.09757 -21.4381 0 -3.68262 -39.1599 0 - -2.14893 -45.8129 0 -0.367308 -38.895 0 0.784621 -21.0186 0 0.763641 1.04115 0 - -0.428665 18.9159 0 -2.24601 25.8308 0 -3.80839 19.1742 0 -4.24556 1.45103 0 - -9.82087 -18.1845 0 -6.73537 -28.9085 0 -1.22357 -32.7771 0 4.45011 -28.2434 0 - 7.99054 -16.9236 0 7.97442 -3.01412 0 4.4028 8.3013 0 -1.29888 12.8268 0 - -6.8335 8.9482 0 -9.93608 -1.78051 0 -11.78 -11.8194 0 -7.21778 -11.4525 0 - 0.156543 -11.0677 0 7.5472 -10.6464 0 12.117 -10.1903 0 12.1088 -9.72223 0 - 7.52281 -9.2716 0 0.116517 -8.86131 0 -7.27163 -8.49105 0 -11.8432 -8.13362 0 - -9.2137 -4.76007 0 -4.93719 6.55828 0 1.46346 11.0378 0 7.71407 7.19131 0 - 11.5423 -3.38143 0 11.5422 -16.5238 0 7.71306 -27.1015 0 1.45938 -30.9581 0 - -4.94742 -26.4944 0 -9.22786 -15.1927 0 -3.04093 0.343648 0 -0.648233 18.2537 0 - 2.22879 25.1643 0 4.82386 18.5211 0 6.36481 0.929716 0 6.3699 -20.8427 0 - 4.83798 -38.4371 0 2.24836 -45.0863 0 -0.629562 -38.1863 0 -3.03094 -20.3048 0 + 4.12614 1.39055 0 3.67913 19.0073 0 2.25455 25.6598 0 0.627571 18.7657 0 + -0.427214 0.928528 0 -0.427597 -21.083 0 0.62653 -38.9075 0 2.25316 -45.776 0 + 3.67786 -39.0852 0 4.12528 -21.4186 0 9.89563 -1.93524 0 6.82475 8.68643 0 + 1.31397 12.4696 0 -4.34522 7.93882 0 -7.87793 -3.30429 0 -7.87819 -17.1 0 + -4.34589 -28.3105 0 1.31317 -32.776 0 6.82425 -28.8946 0 9.89519 -18.1411 0 + 11.8274 -8.31099 0 7.2516 -8.79149 0 -0.139846 -9.26748 0 -7.54577 -9.69816 0 + -12.1273 -10.0769 0 -12.1273 -10.4227 0 -7.54576 -10.7614 0 -0.139666 -11.1117 0 + 7.25215 -11.4667 0 11.8283 -11.7839 0 9.23895 -15.3419 0 4.91634 -26.7477 0 + -1.52128 -31.3122 0 -7.81608 -27.469 0 -11.6749 -16.8267 0 -11.6747 -3.57756 0 + -7.81541 7.09719 0 -1.52019 11.0052 0 4.91793 6.53867 0 9.24145 -4.73493 0 + 3.1278 -20.3518 0 0.718834 -38.3334 0 -2.30275 -45.2522 0 -5.07991 -38.5982 0 + -6.73959 -20.9808 0 -6.73922 0.826391 0 -5.07885 18.4562 0 -2.30111 25.1349 0 + 0.721057 18.2536 0 3.13131 0.322385 0 -4.17332 -21.4299 0 -3.74662 -39.1271 0 + -2.19829 -45.7632 0 -0.398519 -38.8344 0 0.773945 -20.9527 0 0.774317 1.10706 0 + -0.397454 18.9765 0 -2.19665 25.8805 0 -3.74439 19.207 0 -4.16981 1.45923 0 + -9.87973 -18.1636 0 -6.78522 -28.8238 0 -1.26177 -32.6485 0 4.42612 -28.0864 0 + 7.98237 -16.7526 0 7.98259 -2.84313 0 4.42679 8.45825 0 -1.26068 12.9554 0 + -6.78364 9.03289 0 -9.87723 -1.75959 0 -11.812 -11.7955 0 -7.24498 -11.3516 0 + 0.13644 -10.9136 0 7.535 -10.4576 0 12.1129 -9.98419 0 12.1129 -9.51614 0 + 7.53501 -9.0828 0 0.13662 -8.70719 0 -7.24443 -8.39021 0 -11.8111 -8.1097 0 + -9.22056 -4.74553 0 -4.94206 6.63046 0 1.46182 11.1511 0 7.7139 7.33226 0 + 11.5424 -3.22666 0 11.5421 -16.3691 0 7.71323 -26.9606 0 1.46102 -30.8447 0 + -4.94256 -26.4222 0 -9.221 -15.1781 0 -3.03551 0.338265 0 -0.638264 18.2589 0 + 2.23927 25.1834 0 4.83144 18.5499 0 6.36755 0.963427 0 6.36717 -20.809 0 + 4.8304 -38.4082 0 2.23788 -45.0672 0 -0.639531 -38.181 0 -3.03636 -20.3102 0 - 4.12072 11.3998 0 3.66916 29.0519 0 2.24407 35.7369 0 0.61999 28.8649 0 - -0.429951 11.0387 0 -0.42486 -10.9728 0 0.63411 -28.8083 0 2.26364 -35.6989 0 - 3.68783 -29.0405 0 4.1307 -11.4093 0 9.90249 8.11772 0 6.82962 18.8618 0 - 1.31561 22.7347 0 -4.34505 18.2638 0 -7.87801 7.05071 0 -7.87811 -6.74497 0 - -4.34606 -17.9855 0 1.31153 -22.511 0 6.81939 -18.7193 0 9.88833 -8.08811 0 - 11.8594 1.76043 0 7.2788 1.43685 0 -0.119743 1.07413 0 -7.53357 0.71814 0 - -12.1232 0.376661 0 -12.1314 0.0308437 0 -7.55796 -0.345099 0 -0.159769 -0.77012 0 - 7.22495 -1.23832 0 11.7962 -1.71244 0 9.29781 -5.28257 0 4.9662 -16.5599 0 - -1.48308 -21.0319 0 -7.79209 -17.128 0 -11.6667 -6.45545 0 -11.6829 6.79367 0 - -7.8394 17.4382 0 -1.55839 21.2855 0 4.86807 16.7265 0 9.1826 5.32442 0 - 3.20355 -10.3289 0 0.782829 -28.2613 0 -2.25339 -35.1446 0 -5.0487 -28.4674 0 - -6.72891 -10.8384 0 -6.74989 10.9688 0 -5.11006 28.587 0 -2.35047 35.2425 0 - 0.657061 28.3257 0 3.05556 10.3453 0 -4.09757 -11.4527 0 -3.68262 -29.1993 0 - -2.14893 -35.8708 0 -0.367308 -28.9653 0 0.784621 -11.0951 0 0.763641 10.9647 0 - -0.428665 28.8456 0 -2.24601 35.7729 0 -3.80839 29.1348 0 -4.24556 11.4363 0 - -9.82087 -8.22291 0 -6.73537 -19.0117 0 -1.22357 -22.9288 0 4.45011 -18.4274 0 - 7.99054 -7.12387 0 7.97442 6.78564 0 4.4028 18.1173 0 -1.29888 22.6751 0 - -6.8335 18.845 0 -9.93608 8.18106 0 -11.78 -1.86687 0 -7.21778 -1.57997 0 - 0.156543 -1.25521 0 7.5472 -0.873941 0 12.117 -0.437774 0 12.1088 0.0302692 0 - 7.52281 0.5009 0 0.116517 0.951194 0 -7.27163 1.38145 0 -11.8432 1.81888 0 - -9.2137 5.2015 0 -4.93719 16.4551 0 1.46346 20.8861 0 7.71407 17.0073 0 - 11.5423 6.41834 0 11.5422 -6.72407 0 7.71306 -17.2856 0 1.45938 -21.1098 0 - -4.94742 -16.5976 0 -9.22786 -5.23111 0 -3.04093 10.329 0 -0.648233 28.2143 0 - 2.22879 35.1063 0 4.82386 28.4508 0 6.36481 10.8532 0 6.3699 -10.9192 0 - 4.83798 -28.5074 0 2.24836 -35.1443 0 -0.629562 -28.2257 0 -3.03094 -10.3195 0 + 4.12614 11.4052 0 3.67913 29.0467 0 2.25455 35.7177 0 0.627571 28.836 0 + -0.427214 11.005 0 -0.427597 -11.0065 0 0.62653 -28.8372 0 2.25316 -35.7181 0 + 3.67786 -29.0458 0 4.12528 -11.4039 0 9.89563 8.10319 0 6.82475 18.7896 0 + 1.31397 22.6213 0 -4.34522 18.1229 0 -7.87793 6.89594 0 -7.87819 -6.89974 0 + -4.34589 -18.1264 0 1.31317 -22.6243 0 6.82425 -18.7915 0 9.89519 -8.10265 0 + 11.8274 1.73651 0 7.2516 1.33601 0 -0.139846 0.920016 0 -7.54577 0.529337 0 + -12.1273 0.170574 0 -12.1273 -0.175243 0 -7.54576 -0.533901 0 -0.139666 -0.924238 0 + 7.25215 -1.33917 0 11.8283 -1.73636 0 9.23895 -5.30349 0 4.91634 -16.6446 0 + -1.52128 -21.1605 0 -7.81608 -17.285 0 -11.6749 -6.62645 0 -11.6747 6.62268 0 + -7.81541 17.2812 0 -1.52019 21.1569 0 4.91793 16.6418 0 9.24145 5.3035 0 + 3.1278 -10.3371 0 0.718834 -28.294 0 -2.30275 -35.1942 0 -5.07991 -28.5279 0 + -6.73959 -10.9043 0 -6.73922 10.9029 0 -5.07885 28.5265 0 -2.30111 35.1928 0 + 0.721057 28.293 0 3.13131 10.3371 0 -4.17332 -11.4445 0 -3.74662 -29.1665 0 + -2.19829 -35.8212 0 -0.398519 -28.9047 0 0.773945 -11.0291 0 0.774317 11.0306 0 + -0.397454 28.9062 0 -2.19665 35.8225 0 -3.74439 29.1676 0 -4.16981 11.4446 0 + -9.87973 -8.20199 0 -6.78522 -18.927 0 -1.26177 -22.8002 0 4.42612 -18.2705 0 + 7.98237 -6.95287 0 7.98259 6.95664 0 4.42679 18.2742 0 -1.26068 22.8037 0 + -6.78364 18.9297 0 -9.87723 8.20198 0 -11.812 -1.84295 0 -7.24498 -1.47913 0 + 0.13644 -1.10109 0 7.535 -0.685138 0 12.1129 -0.231687 0 12.1129 0.236356 0 + 7.53501 0.689703 0 0.13662 1.10531 0 -7.24443 1.48229 0 -11.8111 1.8428 0 + -9.22056 5.21604 0 -4.94206 16.5273 0 1.46182 20.9994 0 7.7139 17.1482 0 + 11.5424 6.5731 0 11.5421 -6.5693 0 7.71323 -17.1446 0 1.46102 -20.9964 0 + -4.94256 -16.5254 0 -9.221 -5.21657 0 -3.03551 10.3236 0 -0.638264 28.2195 0 + 2.23927 35.1255 0 4.83144 28.4796 0 6.36755 10.8869 0 6.36717 -10.8855 0 + 4.8304 -28.4785 0 2.23788 -35.1251 0 -0.639531 -28.2204 0 -3.03636 -10.3249 0