diff --git a/CHANGELOG b/CHANGELOG index 7c8a717dc4e192716d85de30d7ad9f79a8ce07e9..6326f4208a86129047313511dc69371eb08351ea 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,33 @@ +Differences Between DuMuX 2.7 and DuMuX 2.8 +=================================================== + +* IMPORTANT NOTES: + +* IMPROVEMENTS and ENHANCEMENTS: + - The zero equation turbulence models (zeroeq) have been added as new models + to the freeflow folder. + - Tests for coupling a turbulent free flow using zeroeq turbulence models + with flow in a porous medium have been added. + +* IMMEDIATE INTERFACE CHANGES not allowing/requiring a deprecation period: + +* Deprecated PROPERTY and PARAMETER NAMES, to be removed after 2.7: BEWARE: The + compiler will not print any warning if a deprecated property or parameter name + is used. However, a run-time warning should appear in the summary lines after + the corresponding run. + +* Deprecated CLASSES/FILES, to be removed after 2.7: + +* Deprecated MEMBER FUNCTIONS, to be removed after 2.7: + +* Deprecated protected MEMBER VARIABLES, to be removed after 2.7: BEWARE: Older + compilers will not print any warning if a deprecated protected member variable + is used. + +* DELETED classes/files, property names, constants/enums, + member functions, which have been deprecated in DuMuX 2.6: + Everything listed as deprecated below has been removed. + Differences Between DuMuX 2.6 and DuMuX 2.7 =================================================== diff --git a/configure.ac b/configure.ac index 4302bd7ca4615c382311bf9d6dfb0571f826b09a..df7af336f0fbb53e5b8fd7571a673670496e5f44 100644 --- a/configure.ac +++ b/configure.ac @@ -137,6 +137,8 @@ AC_CONFIG_FILES([dumux.pc test/multidomain/Makefile test/multidomain/2cstokes2p2c/Makefile test/multidomain/2cnistokes2p2cni/Makefile + test/multidomain/2czeroeq2p2c/Makefile + test/multidomain/2cnizeroeq2p2cni/Makefile test/references/Makefile tutorial/Makefile ]) diff --git a/test/multidomain/2cnizeroeq2p2cni/2cnizeroeq2p2cniproblem.hh b/test/multidomain/2cnizeroeq2p2cni/2cnizeroeq2p2cniproblem.hh new file mode 100644 index 0000000000000000000000000000000000000000..ef4ed40017ca5904f0a6e6fc1017d8018d5c1a1f --- /dev/null +++ b/test/multidomain/2cnizeroeq2p2cni/2cnizeroeq2p2cniproblem.hh @@ -0,0 +1,237 @@ +// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- +// vi: set et ts=4 sw=4 sts=4: +/***************************************************************************** + * See the file COPYING for full copying permissions. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see <http://www.gnu.org/licenses/>. * + *****************************************************************************/ +/** + * \file + * \brief The problem class for the coupling of a non-isothermal two-component ZeroEq + * and a non-isothermal two-phase two-component Darcy model. + */ +#ifndef DUMUX_TWOCNIZEROEQTWOPTWOCNIPROBLEM_HH +#define DUMUX_TWOCNIZEROEQTWOPTWOCNIPROBLEM_HH + +#include <dune/grid/multidomaingrid.hh> +#include <dune/grid/common/gridinfo.hh> +#include <dune/grid/io/file/dgfparser.hh> + +#include <dumux/material/fluidsystems/h2oairfluidsystem.hh> +#include <dumux/multidomain/common/multidomainproblem.hh> +#include <dumux/multidomain/2cnistokes2p2cni/2cnistokes2p2cnilocaloperator.hh> +#include <dumux/multidomain/2cnistokes2p2cni/2cnistokes2p2cnipropertydefaults.hh> + +#include "2cnizeroeq2p2cnispatialparameters.hh" +#include "zeroeq2cnisubproblem.hh" +#include "2p2cnisubproblem.hh" + +namespace Dumux +{ +template <class TypeTag> +class TwoCNIZeroEqTwoPTwoCNIProblem; + +namespace Properties +{ +NEW_TYPE_TAG(TwoCNIZeroEqTwoPTwoCNIProblem, INHERITS_FROM(TwoCNIStokesTwoPTwoCNI)); + +// Set the grid type +#if HAVE_UG +SET_TYPE_PROP(TwoCNIZeroEqTwoPTwoCNIProblem, Grid, Dune::UGGrid<2>); +#elif HAVE_ALUGRID +SET_TYPE_PROP(TwoCNIZeroEqTwoPTwoCNIProblem, Grid, Dune::ALUGrid<2, 2, Dune::cube, Dune::nonconforming>); +#else +#error Requires UG or ALUGrid. +#endif + +// Set the global problem +SET_TYPE_PROP(TwoCNIZeroEqTwoPTwoCNIProblem, Problem, TwoCNIZeroEqTwoPTwoCNIProblem<TypeTag>); + +// Set the local coupling operator +SET_TYPE_PROP(TwoCNIZeroEqTwoPTwoCNIProblem, MultiDomainCouplingLocalOperator, + Dumux::TwoCNIStokesTwoPTwoCNILocalOperator<TypeTag>); + +// Set the two sub-problems of the global problem +SET_TYPE_PROP(TwoCNIZeroEqTwoPTwoCNIProblem, SubDomain1TypeTag, TTAG(ZeroEq2cniSubProblem)); +SET_TYPE_PROP(TwoCNIZeroEqTwoPTwoCNIProblem, SubDomain2TypeTag, TTAG(TwoPTwoCNISubProblem)); + +// Set the global problem in the context of the two sub-problems +SET_TYPE_PROP(ZeroEq2cniSubProblem, MultiDomainTypeTag, TTAG(TwoCNIZeroEqTwoPTwoCNIProblem)); +SET_TYPE_PROP(TwoPTwoCNISubProblem, MultiDomainTypeTag, TTAG(TwoCNIZeroEqTwoPTwoCNIProblem)); + +// Set the other sub-problem for each of the two sub-problems +SET_TYPE_PROP(ZeroEq2cniSubProblem, OtherSubDomainTypeTag, TTAG(TwoPTwoCNISubProblem)); +SET_TYPE_PROP(TwoPTwoCNISubProblem, OtherSubDomainTypeTag, TTAG(ZeroEq2cniSubProblem)); + +// Set the same spatial parameters for both sub-problems +SET_TYPE_PROP(ZeroEq2cniSubProblem, SpatialParams, Dumux::TwoCNIZeroEqTwoPTwoCNISpatialParams<TypeTag>); +SET_TYPE_PROP(TwoPTwoCNISubProblem, SpatialParams, Dumux::TwoCNIZeroEqTwoPTwoCNISpatialParams<TypeTag>); + +// Set the fluid system +SET_PROP(TwoCNIZeroEqTwoPTwoCNIProblem, FluidSystem) +{ + typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; + typedef Dumux::FluidSystems::H2OAir<Scalar, + Dumux::H2O<Scalar>, + /*useComplexrelations=*/true> type; +}; + +// If SuperLU is not available, the UMFPack solver is used: +#ifdef HAVE_SUPERLU +SET_TYPE_PROP(TwoCNIZeroEqTwoPTwoCNIProblem, LinearSolver, SuperLUBackend<TypeTag>); +#else +SET_TYPE_PROP(TwoCNIZeroEqTwoPTwoCNIProblem, LinearSolver, UMFPackBackend<TypeTag>); +#endif +} + +/*! + * \brief The problem class for the coupling of a non-isothermal two-component ZeroEq (zeroeq2cni) + * and a non-isothermal two-phase two-component Darcy model (2p2cni). + * + * The problem class for the coupling of a non-isothermal two-component ZeroEq (zeroeq2cni) + * and a non-isothermal two-phase two-component Darcy model (2p2cni). + * It uses the 2p2cniCoupling model and the ZeroEq2cnicoupling model and provides + * the problem specifications for common parameters of the two submodels. + * The initial and boundary conditions of the submodels are specified in the two subproblems, + * 2p2cnisubproblem.hh and zeroeq2cnisubproblem.hh, which are accessible via the coupled problem. + */ +template <class TypeTag = TTAG(TwoCNIZeroEqTwoPTwoCNIProblem) > +class TwoCNIZeroEqTwoPTwoCNIProblem : public MultiDomainProblem<TypeTag> +{ + typedef MultiDomainProblem<TypeTag> ParentType; + + typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; + typedef typename GET_PROP_TYPE(TypeTag, TimeManager) TimeManager; + + typedef typename GET_PROP_TYPE(TypeTag, MultiDomainGrid) MDGrid; + typedef typename MDGrid::LeafGridView MDGridView; + enum { dim = MDGridView::dimension }; + typedef Dune::FieldVector<Scalar, dim> GlobalPosition; + + typedef typename MDGrid::template Codim<0>::LeafIterator ElementIterator; + + typedef typename GET_PROP_TYPE(TypeTag, FluidSystem) FluidSystem; + +public: + /*! + * \brief docme + * + * \param hostGrid docme + * \param timeManager The TimeManager which is used by the simulation + * + */ + TwoCNIZeroEqTwoPTwoCNIProblem(MDGrid &mdGrid, + TimeManager &timeManager) + : ParentType(mdGrid, timeManager) + { + dtInit_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, TimeManager, DtInitial); + episodeLength_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, TimeManager, EpisodeLength); + + // define location of the interface + interfacePos_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, InterfacePos); + noDarcyX1_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, NoDarcyX1); + noDarcyX2_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, NoDarcyX2); + + // define output options + freqRestart_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, int, Output, FreqRestart); + freqOutput_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, int, Output, FreqOutput); + + zeroeq2cni_ = this->sdID1(); + twoPtwoCNI_ = this->sdID2(); + + initializeGrid(); + + // initialize the tables of the fluid system + FluidSystem::init(); +// FluidSystem::init(/*tempMin=*/273.15, /*tempMax=*/373.15, /*numTemp=*/200, +// /*pMin=*/1e4, /*pMax=*/2e5, /*numP=*/200); + + this->timeManager().startNextEpisode(episodeLength_); + } + + /*! + * \brief Initialization of the grids + * + * This function splits the multidomain grid in the two + * individual subdomain grids and takes care of parallelization. + */ + void initializeGrid() + { + MDGrid& mdGrid = this->mdGrid(); + mdGrid.startSubDomainMarking(); + + // subdivide grid in two subdomains + ElementIterator eendit = mdGrid.template leafend<0>(); + for (ElementIterator elementIt = mdGrid.template leafbegin<0>(); + elementIt != eendit; ++elementIt) + { + // this is required for parallelization checks if element is within a partition + if (elementIt->partitionType() != Dune::InteriorEntity) + continue; + + GlobalPosition globalPos = elementIt->geometry().center(); + + if (globalPos[1] > interfacePos_) + mdGrid.addToSubDomain(zeroeq2cni_,*elementIt); + else + if(globalPos[0] > noDarcyX1_ && globalPos[0] < noDarcyX2_) + mdGrid.addToSubDomain(twoPtwoCNI_,*elementIt); + } + mdGrid.preUpdateSubDomains(); + mdGrid.updateSubDomains(); + mdGrid.postUpdateSubDomains(); + + gridinfo(this->sdGrid1()); + gridinfo(this->sdGrid2()); + } + + //! \copydoc Dumux::CoupledProblem::episodeEnd() + void episodeEnd() + { this->timeManager().startNextEpisode(episodeLength_); } + + //! \copydoc Dumux::CoupledProblem::shouldWriteRestartFile() + bool shouldWriteRestartFile() const + { + return ( ((this->timeManager().timeStepIndex() > 0) + && (this->timeManager().timeStepIndex() % freqRestart_ == 0)) + // also write a restart file at the end of each episode + || this->timeManager().episodeWillBeOver()); + } + + //! \copydoc Dumux::CoupledProblem::shouldWriteOutput() + bool shouldWriteOutput() const + { + return ( ((this->timeManager().timeStepIndex() > 0) + && (this->timeManager().timeStepIndex() % freqOutput_ == 0)) + // also write a restart file at the end of each episode + || this->timeManager().episodeWillBeOver()); + } + +private: + typename MDGrid::SubDomainType zeroeq2cni_; + typename MDGrid::SubDomainType twoPtwoCNI_; + + unsigned freqRestart_; + unsigned freqOutput_; + + Scalar interfacePos_; + Scalar noDarcyX1_; + Scalar noDarcyX2_; + Scalar episodeLength_; + Scalar dtInit_; +}; + +} //end namespace + +#endif // DUMUX_TWOCNIZEROEQTWOPTWOCNIPROBLEM_HH diff --git a/test/multidomain/2cnizeroeq2p2cni/2cnizeroeq2p2cnispatialparameters.hh b/test/multidomain/2cnizeroeq2p2cni/2cnizeroeq2p2cnispatialparameters.hh new file mode 100644 index 0000000000000000000000000000000000000000..20e8c5e408dc3403000c2317432a11ea27a0bdec --- /dev/null +++ b/test/multidomain/2cnizeroeq2p2cni/2cnizeroeq2p2cnispatialparameters.hh @@ -0,0 +1,206 @@ +// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- +// vi: set et ts=4 sw=4 sts=4: +/***************************************************************************** + * See the file COPYING for full copying permissions. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see <http://www.gnu.org/licenses/>. * + *****************************************************************************/ +/*! + * \file + * + * \brief Spatial parameters for the + * coupling of a non-isothermal two-component ZeroEq + * and a non-isothermal two-phase two-component Darcy model. + */ +#ifndef DUMUX_TWOCNIZEROEQTWOPTWOCNISPATIALPARAMS_HH +#define DUMUX_TWOCNIZEROEQTWOPTWOCNISPATIALPARAMS_HH + +#include <dune/grid/io/file/vtk/common.hh> + +#include <dumux/material/spatialparams/implicitspatialparams.hh> +#include <dumux/material/fluidmatrixinteractions/2p/linearmaterial.hh> +#include <dumux/material/fluidmatrixinteractions/2p/regularizedvangenuchten.hh> +#include <dumux/material/fluidmatrixinteractions/2p/regularizedbrookscorey.hh> +#include <dumux/material/fluidmatrixinteractions/2p/efftoabslaw.hh> + +namespace Dumux +{ +//forward declaration +template<class TypeTag> +class TwoCNIZeroEqTwoPTwoCNISpatialParams; + +namespace Properties +{ +// The spatial parameters TypeTag +NEW_TYPE_TAG(TwoCNIZeroEqTwoPTwoCNISpatialParams); + +// Set the spatial parameters +SET_TYPE_PROP(TwoCNIZeroEqTwoPTwoCNISpatialParams, SpatialParams, + TwoCNIZeroEqTwoPTwoCNISpatialParams<TypeTag>); + +// Set the material law parameterized by absolute saturations +SET_TYPE_PROP(TwoCNIZeroEqTwoPTwoCNISpatialParams, + MaterialLaw, + EffToAbsLaw<RegularizedVanGenuchten<typename GET_PROP_TYPE(TypeTag, Scalar)>>); +// EffToAbsLaw<RegularizedBrooksCorey<typename GET_PROP_TYPE(TypeTag, Scalar)> >); +} + + +/*! + * \ingroup TwoPTwoCNIModel + * \ingroup ZeroEqTwoCNIModel + * \ingroup ImplicitTestProblems + * \brief Definition of the spatial parameters for + * the coupling of a non-isothermal two-component ZeroEq + * and a non-isothermal two-phase two-component Darcy model. + */ +template<class TypeTag> +class TwoCNIZeroEqTwoPTwoCNISpatialParams : public ImplicitSpatialParams<TypeTag> +{ + typedef ImplicitSpatialParams<TypeTag> ParentType; + typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; + typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; + typedef typename GridView::ctype CoordScalar; + + enum { + dim=GridView::dimension, + dimWorld=GridView::dimensionworld + }; + typedef typename GridView::template Codim<0>::Entity Element; + + typedef typename GET_PROP_TYPE(TypeTag, FVElementGeometry) FVElementGeometry; + typedef typename GET_PROP_TYPE(TypeTag, FluxVariables) FluxVariables; + typedef typename GET_PROP_TYPE(TypeTag, ElementVolumeVariables) ElementVolumeVariables; + +public: + typedef typename GET_PROP_TYPE(TypeTag, MaterialLaw) MaterialLaw; + typedef typename MaterialLaw::Params MaterialLawParams; + + /*! + * \brief Spatial parameters for the + * coupling of a non-isothermal two-component ZeroEq + * and a non-isothermal two-phase two-component Darcy model. + * + * \param gridView The GridView which is used by the problem + */ + TwoCNIZeroEqTwoPTwoCNISpatialParams(const GridView& gridView) + : ParentType(gridView) + { + permeability_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, SpatialParams, Permeability); + porosity_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, SpatialParams, Porosity); + thermalConductivitySolid_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, SpatialParams, ThermalConductivitySolid); + + spatialParams_.setSwr(GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, SpatialParams, Swr)); + spatialParams_.setSnr(GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, SpatialParams, Snr)); + spatialParams_.setVgAlpha(GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, SpatialParams, VgAlpha)); + spatialParams_.setVgn(GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, SpatialParams, VgN)); + } + + /*! + * \brief Returns the intrinsic permeability tensor \f$[m^2]\f$ + * + * \param element The finite element + * \param fvGeometry The finite volume geometry of the element + * \param scvIdx The local index of the sub-control volume + */ + Scalar intrinsicPermeability(const Element &element, + const FVElementGeometry &fvGeometry, + const int scvIdx) const + { + return permeability_; + } + + /*! + * \brief Returns the porosity \f$[-]\f$ + * + * \param element The finite element + * \param fvGeometry The finite volume geometry of the element + * \param scvIdx The local index of the sub-control volume + */ + Scalar porosity(const Element &element, + const FVElementGeometry &fvGeometry, + const int scvIdx) const + { + return porosity_; + } + + /*! + * \brief Returns the parameter object for the material law + * + * \param element The finite element + * \param fvGeometry The finite volume geometry of the element + * \param scvIdx The local index of the sub-control volume + */ + const MaterialLawParams& materialLawParams(const Element &element, + const FVElementGeometry &fvGeometry, + const int scvIdx) const + { + return spatialParams_; + } + + /*! + * \brief Returns the heat capacity \f$[J / (kg K)]\f$ of the rock matrix. + * + * This is only required for non-isothermal models. + * + * \param element The finite element + * \param fvGeometry The finite volume geometry + * \param scvIdx The local index of the sub-control volume + */ + Scalar solidHeatCapacity(const Element &element, + const FVElementGeometry &fvGeometry, + const int scvIdx) const + { + return 790.0; + } + + /*! + * \brief Returns the density of the solid material (not the bulk density) \f$[kg/m^3]\f$ + * + * \param element The finite element + * \param fvGeometry The finite volume geometry of the element + * \param scvIdx The local index of the sub-control volume + */ + Scalar solidDensity(const Element &element, + const FVElementGeometry &fvGeometry, + const int scvIdx) const + { + return 2650.0; + } + + /*! + * \brief Returns the thermal conductivity \f$[W/(m*K)]\f$ of the solid + * + * This is only required for non-isothermal models. + * + * \param element The finite element + * \param fvGeometry The finite volume geometry of the element + * \param scvIdx The local index of the sub-control volume + */ + Scalar solidThermalConductivity(const Element &element, + const FVElementGeometry &fvGeometry, + const int scvIdx) const + { + return thermalConductivitySolid_; + } + +private: + Scalar permeability_; + Scalar porosity_; + Scalar thermalConductivitySolid_; + MaterialLawParams spatialParams_; +}; +} // end namespace + +#endif // DUMUX_TWOCNIZEROEQTWOPTWOCNISPATIALPARAMS_HH diff --git a/test/multidomain/2cnizeroeq2p2cni/2p2cnisubproblem.hh b/test/multidomain/2cnizeroeq2p2cni/2p2cnisubproblem.hh new file mode 100644 index 0000000000000000000000000000000000000000..8412a9258097c0f51b85e4c007c2d88b8d0e7978 --- /dev/null +++ b/test/multidomain/2cnizeroeq2p2cni/2p2cnisubproblem.hh @@ -0,0 +1,414 @@ +// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- +// vi: set et ts=4 sw=4 sts=4: +/***************************************************************************** + * See the file COPYING for full copying permissions. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see <http://www.gnu.org/licenses/>. * + *****************************************************************************/ +/*! + * \file + * + * \brief Non-isothermal two-phase two-component porous-medium subproblem + * with coupling at the top boundary. + */ +#ifndef DUMUX_2P2CNISUB_PROBLEM_HH +#define DUMUX_2P2CNISUB_PROBLEM_HH + +#include <dumux/implicit/2p2c/2p2cindices.hh> +#include <dumux/implicit/common/implicitporousmediaproblem.hh> +#include <dumux/material/fluidmatrixinteractions/2p/thermalconductivityjohansen.hh> +#include <dumux/material/fluidmatrixinteractions/2p/thermalconductivitysomerton.hh> +#include <dumux/multidomain/common/subdomainpropertydefaults.hh> +#include <dumux/multidomain/common/multidomainlocaloperator.hh> +#include <dumux/multidomain/couplinglocalresiduals/2p2cnicouplinglocalresidual.hh> + +#include "2cnizeroeq2p2cnispatialparameters.hh" + +namespace Dumux +{ +template <class TypeTag> +class TwoPTwoCNISubProblem; + +namespace Properties +{ +NEW_TYPE_TAG(TwoPTwoCNISubProblem, + INHERITS_FROM(BoxTwoPTwoCNI, SubDomain, TwoCNIZeroEqTwoPTwoCNISpatialParams)); + +// Set the problem property +SET_TYPE_PROP(TwoPTwoCNISubProblem, Problem, TwoPTwoCNISubProblem<TTAG(TwoPTwoCNISubProblem)>); + +// Use the 2p2cni local jacobian operator for the 2p2cniCoupling model +SET_TYPE_PROP(TwoPTwoCNISubProblem, LocalResidual, TwoPTwoCNICouplingLocalResidual<TypeTag>); + +// Choose pn and Sw as primary variables +SET_INT_PROP(TwoPTwoCNISubProblem, Formulation, TwoPTwoCFormulation::pnsw); + +// The gas component balance (air) is replaced by the total mass balance +SET_PROP(TwoPTwoCNISubProblem, ReplaceCompEqIdx) +{ + typedef typename GET_PROP_TYPE(TypeTag, Indices) Indices; + static const int value = Indices::contiNEqIdx; +}; + +// Use the fluid system from the coupled problem +SET_TYPE_PROP(TwoPTwoCNISubProblem, + FluidSystem, + typename GET_PROP_TYPE(typename GET_PROP_TYPE(TypeTag, MultiDomainTypeTag), FluidSystem)); + +// Johanson is used as model to compute the effective thermal heat conductivity +SET_TYPE_PROP(TwoPTwoCNISubProblem, ThermalConductivityModel, + ThermalConductivityJohansen<typename GET_PROP_TYPE(TypeTag, Scalar)>); + +// Use formulation based on mass fractions +SET_BOOL_PROP(TwoPTwoCNISubProblem, UseMoles, false); + +// Enable/disable velocity output +SET_BOOL_PROP(TwoPTwoCNISubProblem, VtkAddVelocity, true); + +// Enable gravity +SET_BOOL_PROP(TwoPTwoCNISubProblem, ProblemEnableGravity, true); +} + +/*! + * \ingroup ImplicitTestProblems + * \ingroup MultidomainProblems + * \brief Non-isothermal two-phase two-component porous-medium subproblem + * with coupling at the top boundary. + * + * \todo update description + * + * This sub problem uses the \ref TwoPTwoCModel. It is part of the 2p2cni model and + * is combined with the zeroeq2cnisubproblem for the free flow domain. + */ +template <class TypeTag = TTAG(TwoPTwoCNISubProblem) > +class TwoPTwoCNISubProblem : public ImplicitPorousMediaProblem<TypeTag> +{ + typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; + typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; + typedef typename GridView::Grid Grid; + + typedef TwoPTwoCNISubProblem<TypeTag> ThisType; + typedef ImplicitPorousMediaProblem<TypeTag> ParentType; + + // copy some indices for convenience + typedef typename GET_PROP_TYPE(TypeTag, Indices) Indices; + + // the type tag of the coupled problem + typedef typename GET_PROP_TYPE(TypeTag, MultiDomainTypeTag) CoupledTypeTag; + + enum { numEq = GET_PROP_VALUE(TypeTag, NumEq) }; + enum { numPhases = GET_PROP_VALUE(TypeTag, NumPhases) }; + enum { numComponents = GET_PROP_VALUE(TypeTag, NumComponents) }; + enum { // the equation indices + contiTotalMassIdx = Indices::contiNEqIdx, + contiWEqIdx = Indices::contiWEqIdx, + energyEqIdx = Indices::energyEqIdx + }; + enum { // the indices of the primary variables + pressureIdx = Indices::pressureIdx, + switchIdx = Indices::switchIdx, + temperatureIdx = Indices::temperatureIdx + }; + enum { + wPhaseOnly = Indices::wPhaseOnly, + nPhaseOnly = Indices::nPhaseOnly, + bothPhases = Indices::bothPhases + }; + enum { + wPhaseIdx = Indices::wPhaseIdx, + nPhaseIdx = Indices::nPhaseIdx + }; + enum { // grid and world dimension + dim = GridView::dimension, + dimWorld = GridView::dimensionworld + }; + + typedef typename GET_PROP_TYPE(TypeTag, PrimaryVariables) PrimaryVariables; + typedef typename GET_PROP_TYPE(TypeTag, BoundaryTypes) BoundaryTypes; + typedef typename GET_PROP_TYPE(TypeTag, TimeManager) TimeManager; + + typedef typename GridView::template Codim<0>::Entity Element; + typedef typename GridView::template Codim<dim>::Entity Vertex; + typedef typename GridView::Intersection Intersection; + + typedef typename GET_PROP_TYPE(TypeTag, FVElementGeometry) FVElementGeometry; + typedef typename GET_PROP_TYPE(TypeTag, FluidSystem) FluidSystem; + + typedef Dune::FieldVector<Scalar, dimWorld> GlobalPosition; + +public: + /*! + * \brief The sub-problem for the porous-medium subdomain + * + * \param timeManager The TimeManager which is used by the simulation + * \param gridView The simulation's idea about physical space + */ + TwoPTwoCNISubProblem(TimeManager &timeManager, const GridView &gridView) + : ParentType(timeManager, gridView) + { + Scalar noDarcyX1 = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, NoDarcyX1); + Scalar noDarcyX2 = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, NoDarcyX2); + Scalar xMin = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, XMin); + Scalar xMax = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, XMax); + + bBoxMin_[0] = std::max(xMin,noDarcyX1); + bBoxMax_[0] = std::min(xMax,noDarcyX2); + bBoxMin_[1] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, YMin); + bBoxMax_[1] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, InterfacePos); + runUpDistanceX1_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, RunUpDistanceX1); // first part of the interface without coupling + runUpDistanceX2_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, RunUpDistanceX2); // second part of the interface without coupling + + refTemperature_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, PorousMedium, RefTemperaturePM); + refPressure_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, PorousMedium, RefPressurePM); + refSw_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, PorousMedium, RefSw); + + freqMassOutput_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, int, Output, FreqMassOutput); + + storageLastTimestep_ = Scalar(0); + lastMassOutputTime_ = Scalar(0); + + outfile.open("storage.out"); + outfile << "Time[s]" << ";" + << "TotalMassChange[kg/(s*mDepth)]" << ";" + << "WaterMassChange[kg/(s*mDepth))]" << ";" + << "IntEnergyChange[J/(m^3*s*mDepth)]" << ";" + << "WaterMass[kg/mDepth]" << ";" + << "WaterMassLoss[kg/mDepth]" << ";" + << "EvaporationRate[mm/s]" + << std::endl; + } + + //! \brief The destructor + ~TwoPTwoCNISubProblem() + { + outfile.close(); + } + + /*! + * \name Problem parameters + */ + // \{ + + //! \copydoc Dumux::ImplicitProblem::name() + const std::string &name() const + { return GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, std::string, Output, NamePM); } + + //! \copydoc Dumux::ImplicitProblem::init() + void init() + { + ParentType::init(); + this->model().globalStorage(storageLastTimestep_); + } + + // \} + + /*! + * \name Boundary conditions + */ + // \{ + + //! \copydoc Dumux::ImplicitProblem::boundaryTypesAtPos() + void boundaryTypesAtPos(BoundaryTypes &values, + const GlobalPosition &globalPos) const + { + values.setAllNeumann(); + + if (onLowerBoundary_(globalPos)) + { + values.setDirichlet(temperatureIdx, energyEqIdx); + } + + if (onUpperBoundary_(globalPos)) + { + if (globalPos[0] > runUpDistanceX1_ - eps_ + && globalPos[0] < runUpDistanceX2_ + eps_) + { + values.setAllCouplingInflow(); + } + else + values.setAllNeumann(); + } + } + + //! \copydoc Dumux::ImplicitProblem::dirichletAtPos() + void dirichletAtPos(PrimaryVariables &values, const GlobalPosition &globalPos) const + { + initial_(values, globalPos); + } + + //! \copydoc Dumux::ImplicitProblem::neumannAtPos() + void neumannAtPos(PrimaryVariables &values, const GlobalPosition &globalPos) const + { + values = 0.; + } + + // \} + + /*! + * \name Volume terms + */ + // \{ + //! \copydoc Dumux::ImplicitProblem::sourceAtPos() + void sourceAtPos(PrimaryVariables &values, const GlobalPosition &globalPos) const + { + values = 0.; + } + + //! \copydoc Dumux::ImplicitProblem::initialAtPos() + void initialAtPos(PrimaryVariables &values, const GlobalPosition &globalPos) const + { + initial_(values, globalPos); + } + + /*! + * \brief Return the initial phase state inside a control volume. + * + * \param vertex The vertex + * \param globalIdx The index of the global vertex + * \param globalPos The global position + */ + int initialPhasePresence(const Vertex &vertex, + const int &globalIdx, + const GlobalPosition &globalPos) const + { + return bothPhases; + } + + /*! + * \brief Called by the time manager after the time integration to + * do some post processing on the solution. + */ + void postTimeStep() + { + // Calculate masses + PrimaryVariables storage; + + this->model().globalStorage(storage); + const Scalar time = this->timeManager().time() + this->timeManager().timeStepSize(); + + static Scalar initialWaterContent = 0.0; ; + if (this->timeManager().time() < this->timeManager().timeStepSize() + 1e-10) + initialWaterContent = storage[contiWEqIdx]; + + // Write mass balance information for rank 0 + if (this->gridView().comm().rank() == 0) + { + if (this->timeManager().timeStepIndex() % freqMassOutput_ == 0 + || this->timeManager().episodeWillBeOver()) + { + PrimaryVariables storageChange(0.); + storageChange = storageLastTimestep_ - storage; + + assert(time - lastMassOutputTime_ != 0); + storageChange /= (time - lastMassOutputTime_); + + std::cout << "Time[s]: " << time + << " TotalMass[kg]: " << storage[contiTotalMassIdx] + << " WaterMass[kg]: " << storage[contiWEqIdx] + << " IntEnergy[J/m^3]: " << storage[energyEqIdx] + << " WaterMassChange[kg/s]: " << storageChange[contiWEqIdx] + << std::endl; + if (this->timeManager().time() != 0.) + outfile << time << ";" + << storageChange[contiTotalMassIdx] << ";" + << storageChange[contiWEqIdx] << ";" + << storageChange[energyEqIdx] << ";" + << storage[contiWEqIdx] << ";" + << initialWaterContent - storage[contiWEqIdx] << ";" + << storageChange[contiWEqIdx] / (bBoxMax_[0]-bBoxMin_[0]) + << std::endl; + + storageLastTimestep_ = storage; + lastMassOutputTime_ = time; + } + } + } + + /*! + * \brief Determine if we are on a corner of the grid + * + * \param globalPos The global position + */ + bool isCornerPoint(const GlobalPosition &globalPos) + { + return ((onLeftBoundary_(globalPos) && onLowerBoundary_(globalPos)) + || (onLeftBoundary_(globalPos) && onUpperBoundary_(globalPos)) + || (onRightBoundary_(globalPos) && onLowerBoundary_(globalPos)) + || (onRightBoundary_(globalPos) && onUpperBoundary_(globalPos))); + } + + /*! + * \brief Returns whether the position is an interface corner point + * + * This function is required in case of mortar coupling otherwise it should return false + * + * \param globalPos The global position + */ + bool isInterfaceCornerPoint(const GlobalPosition &globalPos) const + { return false; } + + // \} + +private: + /*! + * \brief Internal method for the initial condition + * (reused for the dirichlet conditions!) + */ + void initial_(PrimaryVariables &values, + const GlobalPosition &globalPos) const + { + values[pressureIdx] = refPressure_ + + 1000. * this->gravity()[1] * (globalPos[1] - bBoxMax_[1]); + values[switchIdx] = refSw_; + values[temperatureIdx] = refTemperature_; + } + + bool onLeftBoundary_(const GlobalPosition &globalPos) const + { return globalPos[0] < bBoxMin_[0] + eps_; } + + bool onRightBoundary_(const GlobalPosition &globalPos) const + { return globalPos[0] > bBoxMax_[0] - eps_; } + + bool onLowerBoundary_(const GlobalPosition &globalPos) const + { return globalPos[1] < bBoxMin_[1] + eps_; } + + bool onUpperBoundary_(const GlobalPosition &globalPos) const + { return globalPos[1] > bBoxMax_[1] - eps_; } + + bool onBoundary_(const GlobalPosition &globalPos) const + { + return (onLeftBoundary_(globalPos) || onRightBoundary_(globalPos) + || onLowerBoundary_(globalPos) || onUpperBoundary_(globalPos)); + } + + static constexpr Scalar eps_ = 1e-8; + GlobalPosition bBoxMin_; + GlobalPosition bBoxMax_; + + int freqMassOutput_; + + PrimaryVariables storageLastTimestep_; + Scalar lastMassOutputTime_; + + Scalar refTemperature_; + Scalar refPressure_; + Scalar refSw_; + + Scalar runUpDistanceX1_; + Scalar runUpDistanceX2_; + std::ofstream outfile; +}; +} //end namespace Dumux + +#endif // DUMUX_TWOPTWOCNI_SUBPROBLEM_HH diff --git a/test/multidomain/2cnizeroeq2p2cni/CMakeLists.txt b/test/multidomain/2cnizeroeq2p2cni/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..f6ce5add56ce64d6923f22f9d9f25a4d6521c0d0 --- /dev/null +++ b/test/multidomain/2cnizeroeq2p2cni/CMakeLists.txt @@ -0,0 +1,21 @@ +file(COPY evaporationRates.gp DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + +# test: test_2cnizeroeq2p2cni_1ff +add_dumux_test(test_2cnizeroeq2p2cni_1ff test_2cnizeroeq2p2cni test_2cnizeroeq2p2cni.cc + ${CMAKE_SOURCE_DIR}/bin/runTest.sh + ${CMAKE_SOURCE_DIR}/bin/fuzzycomparevtu.py + ${CMAKE_SOURCE_DIR}/test/references/2cnizeroeq2p2cni-ff-reference.vtu + ${CMAKE_CURRENT_BINARY_DIR}/zeroeq2cni-00008.vtu + ${CMAKE_CURRENT_BINARY_DIR}/test_2cnizeroeq2p2cni + -ParameterFile ${CMAKE_CURRENT_SOURCE_DIR}/test_2cnizeroeq2p2cni_reference.input + ) + +# test: test_2cnizeroeq2p2cni_2pm +add_dumux_test(test_2cnizeroeq2p2cni_2pm test_2cnizeroeq2p2cni test_2cnizeroeq2p2cni.cc + ${CMAKE_SOURCE_DIR}/bin/runTest.sh + ${CMAKE_SOURCE_DIR}/bin/fuzzycomparevtu.py + ${CMAKE_SOURCE_DIR}/test/references/2cnizeroeq2p2cni-pm-reference.vtu + ${CMAKE_CURRENT_BINARY_DIR}/2p2cni-00008.vtu + ${CMAKE_CURRENT_BINARY_DIR}/test_2cnizeroeq2p2cni + -ParameterFile ${CMAKE_CURRENT_SOURCE_DIR}/test_2cnizeroeq2p2cni_reference.input + ) diff --git a/test/multidomain/2cnizeroeq2p2cni/Makefile.am b/test/multidomain/2cnizeroeq2p2cni/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..04e515bc8ffad8a74dfdf0ae087c6eb8068d000b --- /dev/null +++ b/test/multidomain/2cnizeroeq2p2cni/Makefile.am @@ -0,0 +1,6 @@ +# tests where program to build and program to run are equal +check_PROGRAMS = test_2cnizeroeq2p2cni + +test_2cnizeroeq2p2cni_SOURCES = test_2cnizeroeq2p2cni.cc + +include $(top_srcdir)/am/global-rules diff --git a/test/multidomain/2cnizeroeq2p2cni/evaporationRates.gp b/test/multidomain/2cnizeroeq2p2cni/evaporationRates.gp new file mode 100644 index 0000000000000000000000000000000000000000..3b50921549ee3a0bf0932867c513b922b87c3462 --- /dev/null +++ b/test/multidomain/2cnizeroeq2p2cni/evaporationRates.gp @@ -0,0 +1,13 @@ +reset +set datafile separator ';' + +set xlabel 'Time [d]' +set ylabel 'Evaporation rate [mm/d]' +set xrange [0:5] +set yrange [0:5] +plot \ +'storage.out' u ($1/86400):($3*86400) w l lw 2 t 'current' + +set terminal pngcairo size 1200,900 +set output 'evaporationRates.png' +replot \ No newline at end of file diff --git a/test/multidomain/2cnizeroeq2p2cni/test_2cnizeroeq2p2cni.cc b/test/multidomain/2cnizeroeq2p2cni/test_2cnizeroeq2p2cni.cc new file mode 100644 index 0000000000000000000000000000000000000000..82557555a92df481132a441028a3abeddfa5cdce --- /dev/null +++ b/test/multidomain/2cnizeroeq2p2cni/test_2cnizeroeq2p2cni.cc @@ -0,0 +1,342 @@ +// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- +// vi: set et ts=4 sw=4 sts=4: +/***************************************************************************** + * See the file COPYING for full copying permissions. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see <http://www.gnu.org/licenses/>. * + *****************************************************************************/ +/*! + * \file + * + * \brief Test for the coupled non-isothermal two-component ZeroEq and + * non-isothermal two-phase two-component Darcy model + */ + +#include "config.h" +#include <iostream> + +#include <dune/common/parallel/mpihelper.hh> +#include <dune/common/parametertreeparser.hh> + +#include <dumux/common/start.hh> +#include <dumux/io/interfacemeshcreator.hh> + +#include "2cnizeroeq2p2cniproblem.hh" + +/*! + * \brief Print a usage string for simulations. + * + * \param progName The name of the program, that was tried to be started. + * \param errorMsg The error message that was issued by the start function. + * Comprises the thing that went wrong and a general help message. + */ +void printUsage(const char *progName, const std::string &errorMsg) +{ + if (errorMsg.size() > 0) { + std::string errorMessageOut = "\nUsage: "; + errorMessageOut += progName; + errorMessageOut += " [options]\n"; + errorMessageOut += errorMsg; + errorMessageOut += "\nThe list of mandatory options for this program is:\n" + "[Grid]\n" + "XMin Minumum x-coordinate [m]\n" + "XMax Maximum x-coordinate [m]\n" + "YMin Minumum y-coordinate [m]\n" + "YMax Maximum y-coordinate [m]\n" + "CellsX Number of cells in x-direction\n" + "CellsY Number of cells in y-direction\n" + "GradingY Vertical grading of the cells\n" + "RefineTop Specifies whethter the top of the free flow will be refined\n" + "InterfacePos Vertical position of the interface [m]\n" + "NoDarcyX1 Horizontal position where the porous medium starts [m]\n" + "NoDarcyX2 Horizontal position where the porous medium ends [m]\n" + "RunUpDistanceX1 Horizontal position where the coupling starts [m]\n" + "RunUpDistanceX2 Horizontal position where the coupling ends [m]\n" + "\n" + "[SpatialParams]\n" + "AlphaBJ Beavers-Joseph coefficient [-]\n" + "Permeability Hydraulic conductivity [m^2]\n" + "Porosity Porosity [-]\n" + "Swr Residual water saturation [-]\n" + "Snr Residual gas saturation [-]\n" + "VgAlpha Van-Genuchten parameter [1/Pa]\n" + "VgN Van-Genuchten parameter [-]\n" + "ThermalConductivitySolid Thermal conductivity of the solid material [W/(m*K)]\n" + "\n" + "[FreeFlow]\n" + "RefVelocity Inflow velocity [m/s]\n" + "RefPressure Reference pressure [Pa]\n" + "RefMassfrac Inflow water mass fraction [-]\n" + "RefTemperature Inflow temperature [K]\n" + "\n" + "[PorousMedium]\n" + "RefSw Initial water saturation [-]\n" + "RefPressurePM Initial pressure [Pa]\n" + "RefTemperaturePM Initial temperature [K]\n" + "\n" + "[Output]\n" + "NameFF Name free flow .vtu files\n" + "NamePM Name porous medium .vtu files\n" + "FreqRestart Frequency of writting restart information\n" + "FreqOutput Frequency of writting vtu output\n" + "FreqMassOutput Frequency of writting storage output\n" + "FreqFluxOutput Frequency of writting flux output\n" + "FreqVaporFluxOutput Frequency of writting vapor flux output\n" + "\n" + "[TimeManager]\n" + "EpisodeLength Length of one episode [s]\n" + "\n" + "[BoundaryLayer]\n" + "Model Enable use of boundary layer models (discouraged)\n" + "\n" + "[MassTransfer]\n" + "Model Enable use of mass transfer models (discouraged)\n" + "\n"; + + std::cout << errorMessageOut + << "\n"; + } +} + +template <class TypeTag> +int startLocal_(int argc, char **argv, + void (*usage)(const char *, const std::string &)) +{ + typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; + typedef typename GET_PROP_TYPE(TypeTag, Grid) Grid; + typedef typename GET_PROP_TYPE(TypeTag, MultiDomainGrid) MDGrid; + typedef typename GET_PROP_TYPE(TypeTag, GridCreator) GridCreator; + typedef typename GET_PROP_TYPE(TypeTag, Problem) Problem; + typedef typename GET_PROP_TYPE(TypeTag, TimeManager) TimeManager; + + // print dumux start message + Dumux::dumuxMessage_(true); + + //////////////////////////////////////////////////////////// + // Load the input parameters + //////////////////////////////////////////////////////////// + + typedef typename GET_PROP(TypeTag, ParameterTree) ParameterTree; + Dune::ParameterTreeParser::readOptions(argc, argv, ParameterTree::tree()); + + if (ParameterTree::tree().hasKey("ParameterFile") || argc==1) + { + // read input file, but do not overwrite options specified + // on the command line, since the latter have precedence. + std::string inputFileName ; + if(argc==1) // if there are no arguments given (and there is a file ./<programname>.input) we use it as input file + { + std::cout<< "\nNo parameter file given. \n" + << "Defaulting to '" + << argv[0] + << ".input' for input file.\n"; + inputFileName = argv[0]; + inputFileName += ".input"; + } + else + inputFileName = GET_RUNTIME_PARAM(TypeTag, std::string, ParameterFile); // otherwise we read from the command line + + std::ifstream parameterFile; + + // check whether the parameter file exists. + parameterFile.open(inputFileName.c_str()); + if (not parameterFile.is_open()){ + std::cout<< "\n\t -> Could not open file" + << inputFileName + << ". <- \n\n\n\n"; + printUsage(argv[0], Dumux::usageTextBlock()); + return 1; + } + parameterFile.close(); + + Dune::ParameterTreeParser::readINITree(inputFileName, + ParameterTree::tree(), + /*overwrite=*/false); + } + + // initialize MPI, finalize is done automatically on exit + static Dune::MPIHelper& mpiHelper = Dune::MPIHelper::instance(argc, argv); + + // define the problem dimensions + const int dim=2; + + std::string dgfFileName = "temp.dgf"; + Scalar dt, tEnd; + Dune::FieldVector<int, dim> nElements; + Scalar interfacePos, gradingFactor; + bool refineTop; + + try + { + dt = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, TimeManager, DtInitial); + tEnd = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, TimeManager, TEnd); + + nElements[0] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, int, Grid, CellsX); + nElements[1] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, int, Grid, CellsY); + interfacePos = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, InterfacePos); + gradingFactor = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, GradingY); + refineTop = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, bool, Grid, RefineTop); + } + catch (Dumux::ParameterException &e) { + std::cerr << e << ". Abort!\n"; + exit(1) ; + } + catch (...) { + std::cerr << "Unknown exception thrown!\n"; + exit(1); + } + std::cout << "Starting with timestep size = " << dt << "s, simulation end = " << tEnd << "s\n"; + + try + { + Dune::FieldVector<Scalar, dim> min; + Dune::FieldVector<Scalar, dim> max; + Dune::FieldVector<int, dim> cells(1); + min[0] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, XMin); + min[1] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, YMin); + max[0] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, XMax); + max[1] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, YMax); + + std::ofstream outfile; + outfile.open(dgfFileName); + outfile << "DGF" << std::endl; + outfile << "Interval" << std::endl; + outfile << min[0] << " " << min[1] << " % first corner" << std::endl; + outfile << max[0] << " " << max[1] << " % second corner" << std::endl; + outfile << cells[0] << " " << cells[1] << " % cells in x and y direction" << std::endl; + outfile << "#" << std::endl; + outfile << "" << std::endl; + outfile << "Cube" << std::endl; + outfile << "0 1 2 3" << std::endl; + outfile << "#" << std::endl; + outfile << "" << std::endl; + outfile << "BOUNDARYDOMAIN" << std::endl; + outfile << "default 1 % all boundaries have id 1" << std::endl; + outfile << "BOUNDARYDOMAIN" << std::endl; + outfile << "# unitcube.dgf" << std::endl; + outfile.close(); + } + catch (Dumux::ParameterException &e) { + std::cerr << e << ". Abort!\n"; + exit(1) ; + } + catch (...) { + std::cerr << "Unknown exception thrown!\n"; + exit(1); + } + + Dumux::InterfaceMeshCreator<Grid> interfaceMeshCreator; + GridCreator::gridPtr() = interfaceMeshCreator.create(dgfFileName, nElements, interfacePos, gradingFactor, refineTop); + + if (mpiHelper.size() > 1) { + if (!Dune::Capabilities::isParallel<Grid>::v) { + std::cerr << "WARNING: THE PROGRAM IS STARTED USING MPI, BUT THE GRID IMPLEMENTATION\n" + << " YOU HAVE CHOSEN IS NOT PARALLEL!\n"; + } + GridCreator::loadBalance(); + } + + // Instantiate the time manager + TimeManager timeManager; + + // instantiate grid + Dune::shared_ptr<MDGrid> mdGrid_ = Dune::make_shared<MDGrid> (GridCreator::grid()); + + // instantiate coupled problem + Problem problem(*mdGrid_, + timeManager); + + // print all properties and properties + bool printProps = false; + if (ParameterTree::tree().hasKey("PrintProperties") + || ParameterTree::tree().hasKey("TimeManager.PrintProperties")) + printProps = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, bool, TimeManager, PrintProperties); + if (printProps) + { + Dumux::Properties::print<TypeTag>(); + Dumux::Parameters::print<TypeTag>(); + } + + // deal with the restart stuff + bool restart = false; + Scalar restartTime = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, TimeManager, DtInitial); + if (ParameterTree::tree().hasKey("Restart") + || ParameterTree::tree().hasKey("TimeManager.Restart")) { + restart = true; + restartTime = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, TimeManager, Restart); + } + + // run the simulation + timeManager.init(problem, + restartTime, // initial time + dt, // initial time step + tEnd, // final time + restart); + + timeManager.run(); + + // print all parameters + bool printParams = true; + if (ParameterTree::tree().hasKey("PrintParameters") + || ParameterTree::tree().hasKey("TimeManager.PrintParameters")) + printParams = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, bool, TimeManager, PrintParameters); + if (printParams) + Dumux::Parameters::print<TypeTag>(); + + // print dumux end message + Dumux::dumuxMessage_(false); + + return 0; +} + +/*! + * \brief Provides a main function which reads in parameters from the + * command line and a parameter file. + * + * In this function only the differentiation between debugger + * or not is made. + * + * \tparam TypeTag The type tag of the problem which needs to be solved + * + * \param argc The number of command line arguments of the program + * \param argv The contents of the command line arguments of the program + */ +template <class TypeTag> +int startLocal(int argc, char **argv, + void (*printUsage)(const char *, const std::string &)) +{ + try { + return startLocal_<TypeTag>(argc, argv, printUsage); + } + catch (Dumux::ParameterException &e) + { + std::cerr << e << ". Abort!\n"; + printUsage(argv[0], Dumux::usageTextBlock()); + return 1; + } + catch (Dune::Exception &e) { + std::cerr << "Dune reported error: " << e << std::endl; + return 2; + } + catch (...) { + std::cerr << "Unknown exception thrown!\n"; + return 3; + } +} + +int main(int argc, char** argv) +{ + typedef TTAG(TwoCNIZeroEqTwoPTwoCNIProblem) ProblemTypeTag; + return startLocal<ProblemTypeTag>(argc, argv, printUsage); +} diff --git a/test/multidomain/2cnizeroeq2p2cni/test_2cnizeroeq2p2cni.input b/test/multidomain/2cnizeroeq2p2cni/test_2cnizeroeq2p2cni.input new file mode 100644 index 0000000000000000000000000000000000000000..6ad03a64e9a9b91b52512f1fa65774a54c469fca --- /dev/null +++ b/test/multidomain/2cnizeroeq2p2cni/test_2cnizeroeq2p2cni.input @@ -0,0 +1,90 @@ +[TimeManager] +DtInitial = 5e-5 # [s] +MaxTimeStepSize = 360 # [s] +TEnd = 3600 # [s] +EpisodeLength = 14400 # [s] # 14400s = 4h + +[Grid] +XMin = 0.0 +XMax = 0.75 +YMin = 0.0 +YMax = 0.75 +# Number of elements in x-, y-direction +CellsX = 15 +CellsY = 30 +# Grading and refinement of the mesh +GradingY = 1.16 +RefineTop = true +# Position information +NoDarcyX1 = 0.25 # [m] # Beginning of PM below +NoDarcyX2 = 0.5 # [m] # End of PM below +RunUpDistanceX1 = 0.251 # [m] # Beginning of without Coupling to PM (x-coordinate) +RunUpDistanceX2 = 0.499 # [m] # End of without Coupling to PM (x-coordinate) +InterfacePos = 0.25 # [m] # Vertical position of coupling interface + +[Output] +NameFF = zeroeq2cni +NamePM = 2p2cni +# Frequency of restart file, flux and VTK output +FreqRestart = 5 # how often restart files are written out +FreqOutput = 5 # 10 # frequency of VTK output +FreqMassOutput = 5 # 20 # frequency of mass and evaporation rate output (Darcy) +FreqFluxOutput = 100 # 100 # frequency of detailed flux output +FreqVaporFluxOutput = 3 # 5 # frequency of summarized flux output + +[FreeFlow] +RefVelocity = 1.0 # [m/s] +RefPressure = 1e5 # [Pa] +RefMassfrac = 0.008 # [-] +RefTemperature = 298.15 # [K] + +[BoundaryLayer] +Model = 0 # disable boundary layer models + +[MassTransfer] +Model = 0 # disable mass transfer models + +[PorousMedium] +RefPressurePM = 1e5 # [Pa] +RefTemperaturePM = 298.15 # [K] +RefSw = 0.98 # [-] + +[SpatialParams] +AlphaBJ = 1.0 # [-] +Permeability = 2.65e-10 # [m^2] +Porosity = 0.41 # [-] +Swr = 0.005 # [-] +Snr = 0.01 # [-] +VgAlpha = 6.371e-4 # [1/Pa] +VgN = 8.0 # [-] +ThermalConductivitySolid = 5.26 # [W/(m*K)] + +[Newton] +MaxRelativeShift = 1e-5 +TargetSteps = 8 +MaxSteps = 12 +WriteConvergence = false + +[LinearSolver] +ResidualReduction = 1e-9 +Verbosity = 0 +MaxIterations = 100 + +[ZeroEq] +WriteAllSCVData = -1.0 +# Eddy Viscosity Models +# 0 = none +# 1 = Prandtl +# 2 = modified Van Driest +# 3 = Baldwin Lomax +EddyViscosityModel = 2 +# Eddy Diffusivity and Eddy Conductivity Models +# 0 = none +# 1 = Reynolds analogy +# 2 = modified Van Driest +# 3 = Deissler +# 4 = Meier and Rotta +EddyDiffusivityModel = 3 +EddyConductivityModel = 3 +BBoxMinSandGrainRoughness = 0.0 # [m] +BBoxMaxSandGrainRoughness = 0.0 # [m] diff --git a/test/multidomain/2cnizeroeq2p2cni/test_2cnizeroeq2p2cni_reference.input b/test/multidomain/2cnizeroeq2p2cni/test_2cnizeroeq2p2cni_reference.input new file mode 100644 index 0000000000000000000000000000000000000000..2a8cea7706e0d61bc5cab745d92e5c270f3e4765 --- /dev/null +++ b/test/multidomain/2cnizeroeq2p2cni/test_2cnizeroeq2p2cni_reference.input @@ -0,0 +1,90 @@ +[TimeManager] +DtInitial = 1e-4 # [s] +MaxTimeStepSize = 360 # [s] +TEnd = 3600 # [s] +EpisodeLength = 14400 # [s] # 14400s = 4h + +[Grid] +XMin = 0.0 +XMax = 0.75 +YMin = 0.0 +YMax = 0.75 +# Number of elements in x-, y-direction +CellsX = 15 +CellsY = 15 +# Grading and refinement of the mesh +GradingY = 1.75 +RefineTop = true +# Position information +NoDarcyX1 = 0.25 # [m] # Beginning of PM below +NoDarcyX2 = 0.5 # [m] # End of PM below +RunUpDistanceX1 = 0.251 # [m] # Beginning of without Coupling to PM (x-coordinate) +RunUpDistanceX2 = 0.499 # [m] # End of without Coupling to PM (x-coordinate) +InterfacePos = 0.25 # [m] # Vertical position of coupling interface + +[Output] +NameFF = zeroeq2cni +NamePM = 2p2cni +# Frequency of restart file, flux and VTK output +FreqRestart = 1000 # how often restart files are written out +FreqOutput = 5 # 10 # frequency of VTK output +FreqMassOutput = 1 # 20 # frequency of mass and evaporation rate output (Darcy) +FreqFluxOutput = 100 # 100 # frequency of detailed flux output +FreqVaporFluxOutput = 2 # 5 # frequency of summarized flux output + +[FreeFlow] +RefVelocity = 3.5 # [m/s] +RefPressure = 1e5 # [Pa] +RefMassfrac = 0.008 # [-] +RefTemperature = 298.15 # [K] + +[BoundaryLayer] +Model = 0 # disable boundary layer models + +[MassTransfer] +Model = 0 # disable mass transfer models + +[PorousMedium] +RefPressurePM = 1e5 # [Pa] +RefTemperaturePM = 298.15 # [K] +RefSw = 0.28 # [-] + +[SpatialParams] +AlphaBJ = 1.0 # [-] +Permeability = 2.65e-10 # [m^2] +Porosity = 0.41 # [-] +Swr = 0.005 # [-] +Snr = 0.01 # [-] +VgAlpha = 6.371e-4 # [1/Pa] +VgN = 8.0 # [-] +ThermalConductivitySolid = 5.26 # [W/(m*K)] + +[Newton] +MaxRelativeShift = 1e-5 +TargetSteps = 8 +MaxSteps = 12 +WriteConvergence = false + +[LinearSolver] +ResidualReduction = 1e-9 +Verbosity = 0 +MaxIterations = 100 + +[ZeroEq] +WriteAllSCVData = -1.0 +# Eddy Viscosity Models +# 0 = none +# 1 = Prandtl +# 2 = modified Van Driest +# 3 = Baldwin Lomax +EddyViscosityModel = 2 +# Eddy Diffusivity and Eddy Conductivity Models +# 0 = none +# 1 = Reynolds analogy +# 2 = modified Van Driest +# 3 = Deissler +# 4 = Meier and Rotta +EddyDiffusivityModel = 3 +EddyConductivityModel = 3 +BBoxMinSandGrainRoughness = 0.0 # [m] +BBoxMaxSandGrainRoughness = 0.0 # [m] diff --git a/test/multidomain/2cnizeroeq2p2cni/zeroeq2cnisubproblem.hh b/test/multidomain/2cnizeroeq2p2cni/zeroeq2cnisubproblem.hh new file mode 100644 index 0000000000000000000000000000000000000000..c045774b3ce16c2169a992b25d07aed9da0c8536 --- /dev/null +++ b/test/multidomain/2cnizeroeq2p2cni/zeroeq2cnisubproblem.hh @@ -0,0 +1,422 @@ +// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- +// vi: set et ts=4 sw=4 sts=4: +/***************************************************************************** + * See the file COPYING for full copying permissions. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see <http://www.gnu.org/licenses/>. * + *****************************************************************************/ +/** + * \file + * \brief Non-isothermal two-component ZeroEq subproblem with air flowing + * from the left to the right and coupling at the bottom. + */ +#ifndef DUMUX_ZEROEQTWOCNI_SUBPROBLEM_HH +#define DUMUX_ZEROEQTWOCNI_SUBPROBLEM_HH + +#include <dumux/freeflow/zeroeqncni/zeroeqncnimodel.hh> +#include <dumux/multidomain/common/subdomainpropertydefaults.hh> +#include <dumux/multidomain/couplinglocalresiduals/stokesncnicouplinglocalresidual.hh> + +#include "2cnizeroeq2p2cnispatialparameters.hh" + +namespace Dumux +{ + +template <class TypeTag> +class ZeroEq2cniSubProblem; + +namespace Properties +{ +NEW_TYPE_TAG(ZeroEq2cniSubProblem, + INHERITS_FROM(BoxZeroEqncni, SubDomain, TwoCNIZeroEqTwoPTwoCNISpatialParams)); + +// Set the problem property +SET_TYPE_PROP(ZeroEq2cniSubProblem, Problem, Dumux::ZeroEq2cniSubProblem<TypeTag>); + +// Use the StokesncniCouplingLocalResidual for the computation of the local residual in the ZeroEq domain +SET_TYPE_PROP(ZeroEq2cniSubProblem, LocalResidual, StokesncniCouplingLocalResidual<TypeTag>); + +// Set the property for the material parameters by extracting it from the material law. +SET_TYPE_PROP(ZeroEq2cniSubProblem, + MaterialLawParams, + typename GET_PROP_TYPE(TypeTag, MaterialLaw)::Params); + +// Use the fluid system from the coupled problem +SET_TYPE_PROP(ZeroEq2cniSubProblem, + FluidSystem, + typename GET_PROP_TYPE(typename GET_PROP_TYPE(TypeTag, MultiDomainTypeTag), FluidSystem)); + +// Disable use of mole formulation +SET_BOOL_PROP(ZeroEq2cniSubProblem, UseMoles, false); + +// Disable gravity +SET_BOOL_PROP(ZeroEq2cniSubProblem, ProblemEnableGravity, false); + +// Enable Navier-Stokes +SET_BOOL_PROP(ZeroEq2cniSubProblem, EnableNavierStokes, true); + +// Set the properties for variable inflow BC +NEW_PROP_TAG(FreeFlowSinusVelocityAmplitude); +NEW_PROP_TAG(FreeFlowSinusVelocityPeriod); +SET_SCALAR_PROP(ZeroEq2cniSubProblem, FreeFlowSinusVelocityAmplitude, 0.0); +SET_SCALAR_PROP(ZeroEq2cniSubProblem, FreeFlowSinusVelocityPeriod, 3600.0); +NEW_PROP_TAG(FreeFlowSinusPressureAmplitude); +NEW_PROP_TAG(FreeFlowSinusPressurePeriod); +SET_SCALAR_PROP(ZeroEq2cniSubProblem, FreeFlowSinusPressureAmplitude, 0.0); +SET_SCALAR_PROP(ZeroEq2cniSubProblem, FreeFlowSinusPressurePeriod, 3600.0); +NEW_PROP_TAG(FreeFlowSinusConcentrationAmplitude); +NEW_PROP_TAG(FreeFlowSinusConcentrationPeriod); +SET_SCALAR_PROP(ZeroEq2cniSubProblem, FreeFlowSinusConcentrationAmplitude, 0.0); +SET_SCALAR_PROP(ZeroEq2cniSubProblem, FreeFlowSinusConcentrationPeriod, 3600.0); +NEW_PROP_TAG(FreeFlowSinusTemperatureAmplitude); +NEW_PROP_TAG(FreeFlowSinusTemperaturePeriod); +SET_SCALAR_PROP(ZeroEq2cniSubProblem, FreeFlowSinusTemperatureAmplitude, 0.0); +SET_SCALAR_PROP(ZeroEq2cniSubProblem, FreeFlowSinusTemperaturePeriod, 3600.0); +} + +/*! + * \ingroup ImplicitTestProblems + * \ingroup MultidomainProblems + * \brief ZeroEq2cni problem with air flowing from the left to the right. + * + * \todo update test description + * This sub problem uses the \ref ZeroEq2cniModel. It is part of the 2cnizeroeq2p2cni model and + * is combined with the 2p2csubproblem for the Darcy domain. + */ +template <class TypeTag> +class ZeroEq2cniSubProblem : public ZeroEqProblem<TypeTag> +{ + typedef ZeroEq2cniSubProblem<TypeTag> ThisType; + typedef ZeroEqProblem<TypeTag> ParentType; + + typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; + typedef typename GET_PROP_TYPE(TypeTag, TimeManager) TimeManager; + + typedef typename GET_PROP_TYPE(TypeTag, SpatialParams) SpatialParams; + + typedef typename GET_PROP_TYPE(TypeTag, Indices) Indices; + + enum { + dim = GridView::dimension + }; + enum { // equation indices + massBalanceIdx = Indices::massBalanceIdx, + momentumXIdx = Indices::momentumXIdx, // Index of the x-component of the momentum balance + momentumYIdx = Indices::momentumYIdx, // Index of the y-component of the momentum balance + momentumZIdx = Indices::momentumZIdx, // Index of the z-component of the momentum balance + transportEqIdx = Indices::transportEqIdx, // Index of the transport equation (massfraction) + energyEqIdx = Indices::energyEqIdx // Index of the energy equation (temperature) + }; + enum { // primary variable indices + pressureIdx = Indices::pressureIdx, + velocityXIdx = Indices::velocityXIdx, + velocityYIdx = Indices::velocityYIdx, + velocityZIdx = Indices::velocityZIdx, + massOrMoleFracIdx = Indices::massOrMoleFracIdx, + temperatureIdx = Indices::temperatureIdx + }; + enum { + transportCompIdx = Indices::transportCompIdx, // water component index + phaseCompIdx = Indices::phaseCompIdx // air component index + }; + + typedef typename GET_PROP_TYPE(TypeTag, PrimaryVariables) PrimaryVariables; + typedef typename GET_PROP_TYPE(TypeTag, BoundaryTypes) BoundaryTypes; + + typedef typename GridView::template Codim<0>::Entity Element; + typedef typename GridView::template Codim<dim>::Entity Vertex; + typedef typename GridView::ctype CoordScalar; + + typedef typename GET_PROP_TYPE(TypeTag, FVElementGeometry) FVElementGeometry; + typedef typename GET_PROP_TYPE(TypeTag, FluidSystem) FluidSystem; + typedef typename GET_PROP_TYPE(TypeTag, FluidState) FluidState; + + typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; + typedef Dune::FieldVector<CoordScalar, dim> GlobalPosition; + + +public: + /*! + * \brief The sub-problem for the ZeroEq subdomain + * + * \param timeManager The TimeManager which is used by the simulation + * \param gridView The simulation's idea about physical space + */ + ZeroEq2cniSubProblem(TimeManager &timeManager, const GridView &gridView) + : ParentType(timeManager, gridView), + spatialParams_(gridView) + { + bBoxMin_[0] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, XMin); + bBoxMax_[0] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, XMax); + bBoxMin_[1] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, InterfacePos); + bBoxMax_[1] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, YMax); + runUpDistanceX1_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, RunUpDistanceX1); // first part of the interface without coupling + runUpDistanceX2_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, RunUpDistanceX2); // second part of the interface without coupling + + refVelocity_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, RefVelocity); + refPressure_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, RefPressure); + refMassfrac_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, RefMassfrac); + refTemperature_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, RefTemperature); + + alphaBJ_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, SpatialParams, AlphaBJ); + } + + // functions have to be overwritten, otherwise they remain uninitialised + //! \copydoc BoxProblem::&bBoxMin() + const GlobalPosition &bBoxMin() const + { return bBoxMin_; } + + //! \copydoc BoxProblem::&bBoxMax() + const GlobalPosition &bBoxMax() const + { return bBoxMax_; } + + /*! + * \name Problem parameters + */ + // \{ + + //! \copydoc Dumux::ImplicitProblem::name() + const std::string &name() const + { return GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, std::string, Output, NameFF); } + + // \} + + /*! + * \name Boundary conditions + */ + // \{ + + //! \copydoc Dumux::ImplicitProblem::boundaryTypesAtPos() + void boundaryTypesAtPos(BoundaryTypes &values, + const GlobalPosition &globalPos) const + { + values.setAllDirichlet(); + + + if (onUpperBoundary_(globalPos)) + { + values.setNeumann(transportEqIdx); + values.setDirichlet(temperatureIdx, energyEqIdx); + } + + if (onLowerBoundary_(globalPos)) + { + values.setNeumann(transportEqIdx); + values.setDirichlet(temperatureIdx, energyEqIdx); + + if (globalPos[0] > runUpDistanceX1_ - eps_ + && globalPos[0] < runUpDistanceX2_ + eps_) + { + values.setAllCouplingOutflow(); + } + } + + if (onRightBoundary_(globalPos)) + { + values.setAllOutflow(); + + if (onUpperBoundary_(globalPos) || onLowerBoundary_(globalPos)) // corner points + values.setAllDirichlet(); + } + + if (onLeftBoundary_(globalPos)) + { + values.setAllDirichlet(); + } + + // the mass balance has to be of type outflow + // it does not get a coupling condition, since pn is a condition for stokes + values.setOutflow(massBalanceIdx); + + if (onRightBoundary_(globalPos)) + { + values.setAllOutflow(); + values.setDirichlet(pressureIdx, massBalanceIdx); + } + } + + //! \copydoc Dumux::ImplicitProblem::dirichletAtPos() + void dirichletAtPos(PrimaryVariables &values, const GlobalPosition &globalPos) const + { + values = 0.0; + + values[velocityXIdx] = xVelocity_(globalPos); + values[velocityYIdx] = 0.0; + values[pressureIdx] = refPressure() + + 1.189 * this->gravity()[1] * (globalPos[1] - bBoxMin_[1]); + values[massOrMoleFracIdx] = refMassfrac(); + values[temperatureIdx] = refTemperature(); + } + + //! \copydoc Dumux::ImplicitProblem::neumannAtPos() + void neumannAtPos(PrimaryVariables &values, const GlobalPosition &globalPos) const + { + values = 0.; + } + + /*! + * \brief Evaluate the Beavers-Joseph coefficient at given position + * + * \param globalPos The global position + */ + Scalar beaversJosephCoeffAtPos(const GlobalPosition &globalPos) const + { + return alphaBJ_; + } + + /*! + * \brief Evaluate the intrinsic permeability at the corner of a given element + * + * \param element The finite element + * \param fvGeometry The finite-volume geometry + * \param scvIdx The local subcontrolvolume index + */ + Scalar permeability(const Element &element, + const FVElementGeometry &fvGeometry, + const int scvIdx) const + { + return spatialParams_.intrinsicPermeability(element, + fvGeometry, + scvIdx); + } + + //! \copydoc Dumux::ImplicitProblem::sourceAtPos() + void sourceAtPos(PrimaryVariables &values, + const GlobalPosition &globalPos) const + { + values = 0.0; + } + + //! \copydoc Dumux::ImplicitProblem::initialAtPos() + void initialAtPos(PrimaryVariables &values, const GlobalPosition &globalPos) const + { + initial_(values, globalPos); + } + + // \} + + /*! + * \brief Determine if we are on a corner of the grid + * + * \param globalPos The global position + */ + bool isCornerPoint(const GlobalPosition &globalPos) + { + return ((onLeftBoundary_(globalPos) && onLowerBoundary_(globalPos)) + || (onLeftBoundary_(globalPos) && onUpperBoundary_(globalPos)) + || (onRightBoundary_(globalPos) && onLowerBoundary_(globalPos)) + || (onRightBoundary_(globalPos) && onUpperBoundary_(globalPos))); + } + + /*! + * \brief Auxiliary function used for the mortar coupling, if mortar coupling, + * this should return true + * + * \param globalPos The global position + */ + bool isInterfaceCornerPoint(const GlobalPosition &globalPos) const + { + return false; + } + + //! \brief Returns the velocity at the inflow. + const Scalar refVelocity() const + { + return refVelocity_ + variation_(GET_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, SinusVelocityAmplitude), + GET_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, SinusVelocityPeriod)); + } + + //! \brief Returns the pressure at the inflow. + const Scalar refPressure() const + { + return refPressure_ + variation_(GET_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, SinusPressureAmplitude), + GET_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, SinusPressurePeriod)); + } + + //! \brief Returns the mass fraction at the inflow. + const Scalar refMassfrac() const + { + return refMassfrac_ + variation_(GET_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, SinusConcentrationAmplitude), + GET_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, SinusConcentrationPeriod)); + } + + //! \brief Returns the temperature at the inflow. + const Scalar refTemperature() const + { + return refTemperature_ + variation_(GET_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, SinusTemperatureAmplitude), + GET_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, SinusTemperaturePeriod)); + } + +private: + // Internal method for the initial and Dirichlet conditions + void initial_(PrimaryVariables &values, + const GlobalPosition &globalPos) const + { + values[velocityXIdx] = xVelocity_(globalPos); + values[velocityYIdx] = 0.; + + values[pressureIdx] = refPressure() + 1.189 * this->gravity()[1] * (globalPos[1] - bBoxMin_[1]); + values[massOrMoleFracIdx] = refMassfrac(); + values[temperatureIdx] = refTemperature(); + } + + // returns the inflow velocity profile + const Scalar xVelocity_(const GlobalPosition &globalPos) const + { + if (onUpperBoundary_(globalPos) || onLowerBoundary_(globalPos)) + return 0.0; + return refVelocity(); + } + + // can be used for the variation of a boundary condition + const Scalar variation_(const Scalar amplitude, const Scalar period) const + { return sin(2*M_PI*this->timeManager().time()/period) * amplitude; } + + bool onLeftBoundary_(const GlobalPosition &globalPos) const + { return globalPos[0] < bBoxMin_[0] + eps_; } + + bool onRightBoundary_(const GlobalPosition &globalPos) const + { return globalPos[0] > bBoxMax_[0] - eps_; } + + bool onLowerBoundary_(const GlobalPosition &globalPos) const + { return globalPos[1] < bBoxMin_[1] + eps_; } + + bool onUpperBoundary_(const GlobalPosition &globalPos) const + { return globalPos[1] > bBoxMax_[1] - eps_; } + + bool onBoundary_(const GlobalPosition &globalPos) const + { + return (onLeftBoundary_(globalPos) || onRightBoundary_(globalPos) + || onLowerBoundary_(globalPos) || onUpperBoundary_(globalPos)); + } + + SpatialParams spatialParams_; + + static constexpr Scalar eps_ = 1e-8; + GlobalPosition bBoxMin_; + GlobalPosition bBoxMax_; + + Scalar refVelocity_; + Scalar refPressure_; + Scalar refMassfrac_; + Scalar refTemperature_; + + Scalar alphaBJ_; + + Scalar runUpDistanceX1_; + Scalar runUpDistanceX2_; +}; +} //end namespace + +#endif // DUMUX_ZEROEQTWOCNI_SUBPROBLEM_HH diff --git a/test/multidomain/2czeroeq2p2c/2czeroeq2p2cproblem.hh b/test/multidomain/2czeroeq2p2c/2czeroeq2p2cproblem.hh new file mode 100644 index 0000000000000000000000000000000000000000..3c34ff8fd98799c5b4f96cfb1b4b06007946d43a --- /dev/null +++ b/test/multidomain/2czeroeq2p2c/2czeroeq2p2cproblem.hh @@ -0,0 +1,239 @@ +// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- +// vi: set et ts=4 sw=4 sts=4: +/***************************************************************************** + * See the file COPYING for full copying permissions. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see <http://www.gnu.org/licenses/>. * + *****************************************************************************/ +/** + * \file + * \brief The problem class for the coupling of an isothermal two-component ZeroEq + * and an isothermal two-phase two-component Darcy model. + */ +#ifndef DUMUX_TWOCZEROEQTWOPTWOCPROBLEM_HH +#define DUMUX_TWOCZEROEQTWOPTWOCPROBLEM_HH + +#include <dune/grid/multidomaingrid.hh> +#include <dune/grid/common/gridinfo.hh> +#include <dune/grid/io/file/dgfparser.hh> + +#include <dumux/material/fluidsystems/h2oairfluidsystem.hh> +#include <dumux/multidomain/common/multidomainproblem.hh> +#include <dumux/multidomain/2cstokes2p2c/2cstokes2p2clocaloperator.hh> +#include <dumux/multidomain/2cstokes2p2c/2cstokes2p2cpropertydefaults.hh> + +#include "2czeroeq2p2cspatialparameters.hh" +#include "zeroeq2csubproblem.hh" +#include "2p2csubproblem.hh" + +namespace Dumux +{ +template <class TypeTag> +class TwoCZeroEqTwoPTwoCProblem; + +namespace Properties +{ +NEW_TYPE_TAG(TwoCZeroEqTwoPTwoCProblem, INHERITS_FROM(TwoCStokesTwoPTwoC)); + +// Set the grid type +#if HAVE_UG +SET_TYPE_PROP(TwoCZeroEqTwoPTwoCProblem, Grid, Dune::UGGrid<2>); +#elif HAVE_ALUGRID +SET_TYPE_PROP(TwoCZeroEqTwoPTwoCProblem, Grid, Dune::ALUGrid<2, 2, Dune::cube, Dune::nonconforming>); +#else +#error Requires UG or ALUGrid. +#endif + +// Set the global problem +SET_TYPE_PROP(TwoCZeroEqTwoPTwoCProblem, Problem, TwoCZeroEqTwoPTwoCProblem<TypeTag>); + +// Set the two sub-problems of the global problem +SET_TYPE_PROP(TwoCZeroEqTwoPTwoCProblem, SubDomain1TypeTag, TTAG(ZeroEq2cSubProblem)); +SET_TYPE_PROP(TwoCZeroEqTwoPTwoCProblem, SubDomain2TypeTag, TTAG(TwoPTwoCSubProblem)); + +// Set the local coupling operator +SET_TYPE_PROP(TwoCZeroEqTwoPTwoCProblem, MultiDomainCouplingLocalOperator, + Dumux::TwoCStokesTwoPTwoCLocalOperator<TypeTag>); + +// Set the global problem in the context of the two sub-problems +SET_TYPE_PROP(ZeroEq2cSubProblem, MultiDomainTypeTag, TTAG(TwoCZeroEqTwoPTwoCProblem)); +SET_TYPE_PROP(TwoPTwoCSubProblem, MultiDomainTypeTag, TTAG(TwoCZeroEqTwoPTwoCProblem)); + +// Set the other sub-problem for each of the two sub-problems +SET_TYPE_PROP(ZeroEq2cSubProblem, OtherSubDomainTypeTag, TTAG(TwoPTwoCSubProblem)); +SET_TYPE_PROP(TwoPTwoCSubProblem, OtherSubDomainTypeTag, TTAG(ZeroEq2cSubProblem)); + +// Set the same spatial parameters for both sub-problems +SET_TYPE_PROP(ZeroEq2cSubProblem, SpatialParams, Dumux::TwoCZeroEqTwoPTwoCSpatialParams<TypeTag>); +SET_TYPE_PROP(TwoPTwoCSubProblem, SpatialParams, Dumux::TwoCZeroEqTwoPTwoCSpatialParams<TypeTag>); + +// Set the fluid system +SET_PROP(TwoCZeroEqTwoPTwoCProblem, FluidSystem) +{ + typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; + typedef Dumux::FluidSystems::H2OAir<Scalar, + Dumux::H2O<Scalar>, + /*useComplexrelations=*/false> type; +}; + +// If SuperLU is not available, the UMFPack solver is used: +#ifdef HAVE_SUPERLU +SET_TYPE_PROP(TwoCZeroEqTwoPTwoCProblem, LinearSolver, SuperLUBackend<TypeTag>); +#else +SET_TYPE_PROP(TwoCZeroEqTwoPTwoCProblem, LinearSolver, UMFPackBackend<TypeTag>); +#endif +} + +/*! + * \brief The problem class for the coupling of an isothermal two-component ZeroEq (zeroeq2c) + * and an isothermal two-phase two-component Darcy model (2p2c). + * + * The problem class for the coupling of a non-isothermal two-component ZeroEq (zeroeq2c) + * and an isothermal two-phase two-component Darcy model (2p2c). + * It uses the 2p2cCoupling model and the ZeroEq2ccoupling model and provides + * the problem specifications for common parameters of the two submodels. + * The initial and boundary conditions of the submodels are specified in the two subproblems, + * 2p2csubproblem.hh and zeroeq2csubproblem.hh, which are accessible via the coupled problem. + */ +template <class TypeTag = TTAG(TwoCZeroEqTwoPTwoCProblem) > +class TwoCZeroEqTwoPTwoCProblem : public MultiDomainProblem<TypeTag> +{ + typedef MultiDomainProblem<TypeTag> ParentType; + + typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; + typedef typename GET_PROP_TYPE(TypeTag, TimeManager) TimeManager; + + typedef typename GET_PROP_TYPE(TypeTag, MultiDomainGrid) MDGrid; + typedef typename MDGrid::LeafGridView MDGridView; + enum { dim = MDGridView::dimension }; + typedef Dune::FieldVector<Scalar, dim> GlobalPosition; + + typedef typename MDGrid::template Codim<0>::LeafIterator ElementIterator; + + typedef typename GET_PROP_TYPE(TypeTag, FluidSystem) FluidSystem; + +public: + /*! + * \brief The problem for the coupling of ZeroEq and Darcy flow + * + * \param mdGrid The multidomain grid + * \param timeManager The time manager + */ + TwoCZeroEqTwoPTwoCProblem(MDGrid &mdGrid, + TimeManager &timeManager) + : ParentType(mdGrid, timeManager) + { + dtInit_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, TimeManager, DtInitial); + episodeLength_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, TimeManager, EpisodeLength); + + // define location of the interface + interfacePos_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, InterfacePos); + noDarcyX_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, NoDarcyX); + + // define output options + freqRestart_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, int, Output, FreqRestart); + freqOutput_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, int, Output, FreqOutput); + + zeroeq2c_ = this->sdID1(); + twoPtwoC_ = this->sdID2(); + + initializeGrid(); + + // initialize the tables of the fluid system + FluidSystem::init(/*tempMin=*/273.15, /*tempMax=*/373.15, /*numTemp=*/200, + /*pMin=*/1e4, /*pMax=*/2e5, /*numP=*/200); + + this->timeManager().startNextEpisode(episodeLength_); + } + + /*! + * \brief Initialization of the grids + * + * This function splits the multidomain grid in the two + * individual subdomain grids and takes care of parallelization. + */ + void initializeGrid() + { + MDGrid& mdGrid = this->mdGrid(); + mdGrid.startSubDomainMarking(); + + // subdivide grid in two subdomains + ElementIterator eendit = mdGrid.template leafend<0>(); + for (ElementIterator elementIt = mdGrid.template leafbegin<0>(); + elementIt != eendit; ++elementIt) + { + // this is required for parallelization + // checks if element is within a partition + if (elementIt->partitionType() != Dune::InteriorEntity) + continue; + + GlobalPosition globalPos = elementIt->geometry().center(); + + if (globalPos[1] > interfacePos_) + mdGrid.addToSubDomain(zeroeq2c_,*elementIt); + else + if(globalPos[0] > noDarcyX_) + mdGrid.addToSubDomain(twoPtwoC_,*elementIt); + } + mdGrid.preUpdateSubDomains(); + mdGrid.updateSubDomains(); + mdGrid.postUpdateSubDomains(); + + gridinfo(this->sdGrid1()); + gridinfo(this->sdGrid2()); + } + + /*! + * \brief Called when the end of an simulation episode is reached. + * + * Typically a new episode should be started in this method. + */ + void episodeEnd() + { this->timeManager().startNextEpisode(episodeLength_); } + + //! \copydoc Dumux::CoupledProblem::shouldWriteRestartFile() + bool shouldWriteRestartFile() const + { + return ( ((this->timeManager().timeStepIndex() > 0) + && (this->timeManager().timeStepIndex() % freqRestart_ == 0)) + // also write a restart file at the end of each episode + || this->timeManager().episodeWillBeOver()); + } + + //! \copydoc Dumux::CoupledProblem::shouldWriteOutput() + bool shouldWriteOutput() const + { + return ( ((this->timeManager().timeStepIndex() > 0) + && (this->timeManager().timeStepIndex() % freqOutput_ == 0)) + // also write a restart file at the end of each episode + || this->timeManager().episodeWillBeOver()); + } + +private: + typename MDGrid::SubDomainType zeroeq2c_; + typename MDGrid::SubDomainType twoPtwoC_; + + unsigned freqRestart_; + unsigned freqOutput_; + + Scalar interfacePos_; + Scalar noDarcyX_; + Scalar episodeLength_; + Scalar initializationTime_; + Scalar dtInit_; +}; + +} // namespace Dumux + +#endif // DUMUX_TWOCZEROEQTWOPTWOCPROBLEM_HH diff --git a/test/multidomain/2czeroeq2p2c/2czeroeq2p2cspatialparameters.hh b/test/multidomain/2czeroeq2p2c/2czeroeq2p2cspatialparameters.hh new file mode 100644 index 0000000000000000000000000000000000000000..cc3f382933737f0ba45abeeda9ee459e8cab6546 --- /dev/null +++ b/test/multidomain/2czeroeq2p2c/2czeroeq2p2cspatialparameters.hh @@ -0,0 +1,160 @@ +// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- +// vi: set et ts=4 sw=4 sts=4: +/***************************************************************************** + * See the file COPYING for full copying permissions. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see <http://www.gnu.org/licenses/>. * + *****************************************************************************/ +/*! + * \file + * + * \brief Spatial parameters for the + * coupling of an isothermal two-component ZeroEq + * and an isothermal two-phase two-component Darcy model. + */ + +#ifndef DUMUX_TWOCZEROEQTWOPTWOCSPATIALPARAMS_HH +#define DUMUX_TWOCZEROEQTWOPTWOCSPATIALPARAMS_HH + +#include <dune/grid/io/file/vtk/common.hh> + +#include <dumux/material/spatialparams/implicitspatialparams.hh> +#include <dumux/material/fluidmatrixinteractions/2p/linearmaterial.hh> +#include <dumux/material/fluidmatrixinteractions/2p/regularizedvangenuchten.hh> +#include <dumux/material/fluidmatrixinteractions/2p/efftoabslaw.hh> + +namespace Dumux +{ + +//forward declaration +template<class TypeTag> +class TwoCZeroEqTwoPTwoCSpatialParams; + +namespace Properties +{ +// The spatial parameters TypeTag +NEW_TYPE_TAG(TwoCZeroEqTwoPTwoCSpatialParams); + +// Set the spatial parameters +SET_TYPE_PROP(TwoCZeroEqTwoPTwoCSpatialParams, SpatialParams, TwoCZeroEqTwoPTwoCSpatialParams<TypeTag>); + +// Set the material law parameterized by absolute saturations +SET_TYPE_PROP(TwoCZeroEqTwoPTwoCSpatialParams, + MaterialLaw, + EffToAbsLaw<RegularizedVanGenuchten<typename GET_PROP_TYPE(TypeTag, Scalar)>>); +// EffToAbsLaw<RegularizedBrooksCorey<typename GET_PROP_TYPE(TypeTag, Scalar)> >); +} + + +/*! + * \ingroup TwoPTwoCModel + * \ingroup ZeroEqModel + * \ingroup ImplicitTestProblems + * \brief Definition of the spatial parameters for + * the coupling of an isothermal two-component ZeroEq + * and an isothermal two-phase two-component Darcy model. + */ +template<class TypeTag> +class TwoCZeroEqTwoPTwoCSpatialParams : public ImplicitSpatialParams<TypeTag> +{ + typedef ImplicitSpatialParams<TypeTag> ParentType; + typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; + typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; + typedef typename GridView::ctype CoordScalar; + + enum { + dim=GridView::dimension, + dimWorld=GridView::dimensionworld + }; + typedef typename GridView::template Codim<0>::Iterator ElementIterator; + typedef typename GridView::template Codim<0>::Entity Element; + + typedef typename GET_PROP_TYPE(TypeTag, FVElementGeometry) FVElementGeometry; + typedef typename GET_PROP_TYPE(TypeTag, FluxVariables) FluxVariables; + typedef typename GET_PROP_TYPE(TypeTag, ElementVolumeVariables) ElementVolumeVariables; + +public: + typedef typename GET_PROP_TYPE(TypeTag, MaterialLaw) MaterialLaw; + typedef typename MaterialLaw::Params MaterialLawParams; + + /*! + * \brief Spatial parameters for the + * coupling of an isothermal two-component ZeroEq + * and an isothermal two-phase two-component Darcy model. + * + * \param gridView The GridView which is used by the problem + */ + TwoCZeroEqTwoPTwoCSpatialParams(const GridView& gridView) + : ParentType(gridView) + { + permeability_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, SpatialParams, Permeability); + porosity_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, SpatialParams, Porosity); + + spatialParams_.setSwr(GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, SpatialParams, Swr)); + spatialParams_.setSnr(GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, SpatialParams, Snr)); + spatialParams_.setVgAlpha(GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, SpatialParams, VgAlpha)); + spatialParams_.setVgn(GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, SpatialParams, VgN)); + } + + /*! + * \brief Returns the intrinsic permeability tensor \f$[m^2]\f$ + * + * \param element The finite element + * \param fvGeometry The finite volume geometry of the element + * \param scvIdx The local index of the sub-control volume + */ + const Scalar intrinsicPermeability(const Element &element, + const FVElementGeometry &fvGeometry, + const int scvIdx) const + { + return permeability_; + } + + /*! + * \brief Returns the porosity \f$[-]\f$ + * + * \param element The finite element + * \param fvGeometry The finite volume geometry of the element + * \param scvIdx The local index of the sub-control volume + */ + Scalar porosity(const Element &element, + const FVElementGeometry &fvGeometry, + const int scvIdx) const + { + return porosity_; + } + + /*! + * \brief Returns the parameter object for the material law + * + * \param element The finite element + * \param fvGeometry The finite volume geometry of the element + * \param scvIdx The local index of the sub-control volume + */ + const MaterialLawParams& materialLawParams(const Element &element, + const FVElementGeometry &fvGeometry, + const int scvIdx) const + { + return spatialParams_; + } + +private: + Scalar permeability_; + Scalar porosity_; + MaterialLawParams spatialParams_; +}; + +} // end namespace Dumux + +#endif // DUMUX_TWOCZEROEQTWOPTWOCSPATIALPARAMS_HH diff --git a/test/multidomain/2czeroeq2p2c/2p2csubproblem.hh b/test/multidomain/2czeroeq2p2c/2p2csubproblem.hh new file mode 100644 index 0000000000000000000000000000000000000000..7c0ec9394df437ab1a2e56fb7612b21e042f5493 --- /dev/null +++ b/test/multidomain/2czeroeq2p2c/2p2csubproblem.hh @@ -0,0 +1,399 @@ +// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- +// vi: set et ts=4 sw=4 sts=4: +/***************************************************************************** + * See the file COPYING for full copying permissions. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see <http://www.gnu.org/licenses/>. * + *****************************************************************************/ +/*! + * \file + * + * \brief Isothermal two-phase two-component porous-medium subproblem + * with coupling at the top boundary. + */ +#ifndef DUMUX_TWOPTWOC_SUBPROBLEM_HH +#define DUMUX_TWOPTWOC_SUBPROBLEM_HH + +#include <dumux/implicit/2p2c/2p2cindices.hh> +#include <dumux/implicit/common/implicitporousmediaproblem.hh> +#include <dumux/multidomain/common/subdomainpropertydefaults.hh> +#include <dumux/multidomain/common/multidomainlocaloperator.hh> +#include <dumux/multidomain/couplinglocalresiduals/2p2ccouplinglocalresidual.hh> + +#include "2czeroeq2p2cspatialparameters.hh" + +namespace Dumux +{ +template <class TypeTag> +class TwoPTwoCSubProblem; + +namespace Properties +{ +NEW_TYPE_TAG(TwoPTwoCSubProblem, + INHERITS_FROM(BoxTwoPTwoC, SubDomain, TwoCZeroEqTwoPTwoCSpatialParams)); + +// Set the problem property +SET_TYPE_PROP(TwoPTwoCSubProblem, Problem, TwoPTwoCSubProblem<TTAG(TwoPTwoCSubProblem)>); + +// Set the local residual extended for the coupling +SET_TYPE_PROP(TwoPTwoCSubProblem, LocalResidual, TwoPTwoCCouplingLocalResidual<TypeTag>); + +// Set pn and Sw as primary variables +SET_INT_PROP(TwoPTwoCSubProblem, Formulation, TwoPTwoCFormulation::pnsw); + +// Set the gas component balance (air) to be replaced by the total mass balance +SET_PROP(TwoPTwoCSubProblem, ReplaceCompEqIdx) +{ + typedef typename GET_PROP_TYPE(TypeTag, Indices) Indices; + static const int value = Indices::contiNEqIdx; +}; + +// Used the fluid system from the coupled problem +SET_TYPE_PROP(TwoPTwoCSubProblem, + FluidSystem, + typename GET_PROP_TYPE(typename GET_PROP_TYPE(TypeTag, MultiDomainTypeTag), FluidSystem)); + +// Disable use of mole formulation +SET_BOOL_PROP(TwoPTwoCSubProblem, UseMoles, false); + +// Enable velocity output +SET_BOOL_PROP(TwoPTwoCSubProblem, VtkAddVelocity, true); + +// Enable gravity +SET_BOOL_PROP(TwoPTwoCSubProblem, ProblemEnableGravity, true); +} + +/*! + * \ingroup ImplicitTestProblems + * \ingroup MultidomainProblems + * \brief Isothermal two-phase two-component porous-medium subproblem + * with coupling at the top boundary. + * + * \todo update description + * + * This sub problem uses the \ref TwoPTwoCModel. It is part of the 2p2c model and + * is combined with the zeroeq2csubproblem for the free flow domain. + */ +template <class TypeTag = TTAG(TwoPTwoCSubProblem) > +class TwoPTwoCSubProblem : public ImplicitPorousMediaProblem<TypeTag> +{ + typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; + typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; + typedef typename GridView::Grid Grid; + + typedef TwoPTwoCSubProblem<TypeTag> ThisType; + typedef ImplicitPorousMediaProblem<TypeTag> ParentType; + + // copy some indices for convenience + typedef typename GET_PROP_TYPE(TypeTag, Indices) Indices; + + // the type tag of the coupled problem + typedef typename GET_PROP_TYPE(TypeTag, MultiDomainTypeTag) CoupledTypeTag; + + enum { numEq = GET_PROP_VALUE(TypeTag, NumEq)}; + enum { // the equation indices + contiTotalMassIdx = Indices::contiNEqIdx, + contiWEqIdx = Indices::contiWEqIdx, + }; + enum { // the indices of the primary variables + pressureIdx = Indices::pressureIdx, + switchIdx = Indices::switchIdx, + }; + enum { // the indices for the phase presence + wPhaseOnly = Indices::wPhaseOnly, + nPhaseOnly = Indices::nPhaseOnly, + bothPhases = Indices::bothPhases + }; + enum { // grid and world dimension + dim = GridView::dimension, + dimWorld = GridView::dimensionworld + }; + + typedef typename GET_PROP_TYPE(TypeTag, PrimaryVariables) PrimaryVariables; + typedef typename GET_PROP_TYPE(TypeTag, BoundaryTypes) BoundaryTypes; + typedef typename GET_PROP_TYPE(TypeTag, TimeManager) TimeManager; + + typedef typename GridView::template Codim<0>::Entity Element; + typedef typename GridView::template Codim<dim>::Entity Vertex; + typedef typename GridView::Intersection Intersection; + + typedef typename GET_PROP_TYPE(TypeTag, FVElementGeometry) FVElementGeometry; + typedef typename GET_PROP_TYPE(TypeTag, FluidSystem) FluidSystem; + + typedef Dune::FieldVector<Scalar, dimWorld> GlobalPosition; + +public: + /*! + * \brief The sub-problem for the porous-medium subdomain + * + * \param timeManager The TimeManager which is used by the simulation + * \param gridView The simulation's idea about physical space + */ + TwoPTwoCSubProblem(TimeManager &timeManager, const GridView gridView) + : ParentType(timeManager, gridView) + { + Scalar noDarcyX = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, NoDarcyX); + Scalar xMin = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, XMin); + + bBoxMin_[0] = std::max(xMin,noDarcyX); + bBoxMax_[0] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, XMax); + bBoxMin_[1] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, YMin); + bBoxMax_[1] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, InterfacePos); + runUpDistanceX_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, RunUpDistanceX); // first part of the interface without coupling + + refTemperature_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, PorousMedium, RefTemperaturePM); + refPressure_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, PorousMedium, RefPressurePM); + refSw_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, PorousMedium, RefSw); + + freqMassOutput_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, int, Output, FreqMassOutput); + + storageLastTimestep_ = Scalar(0); + lastMassOutputTime_ = Scalar(0); + + outfile.open("storage.out"); + outfile << "Time;" + << "TotalMassChange;" + << "WaterMassChange;" + << "WaterMass" + << std::endl; + } + + //! \brief The destructor + ~TwoPTwoCSubProblem() + { + outfile.close(); + } + + /*! + * \name Problem parameters + */ + // \{ + + /*! + * \brief Returns the problem name + * + * This is used as a prefix for files generated by the simulation. + */ + const std::string &name() const + { return GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, std::string, Output, NamePM); } + + /*! + * \brief Called by the Dumux::TimeManager in order to + * initialize the problem. + * + * If you overload this method don't forget to call + * ParentType::init() + */ + void init() + { + ParentType::init(); + this->model().globalStorage(storageLastTimestep_); + } + + /*! + * \brief Returns the temperature \f$ K \f$ + * + * \param globalPos The global position + */ + Scalar temperatureAtPos(const GlobalPosition &globalPos) const + { + return refTemperature_; + } + + // \} + + /*! + * \name Boundary conditions + */ + // \{ + + //! \copydoc ImplicitProblem::boundaryTypesAtPos() + void boundaryTypesAtPos(BoundaryTypes &values, + const GlobalPosition &globalPos) const + { + values.setAllNeumann(); + + if (onUpperBoundary_(globalPos)) + { + if (globalPos[0] > runUpDistanceX_ - eps_) + values.setAllCouplingInflow(); + else + values.setAllNeumann(); + } + } + + //! \copydoc ImplicitProblem::dirichletAtPos() + void dirichletAtPos(PrimaryVariables &values, + const GlobalPosition &globalPos) const + { + initial_(values, globalPos); + } + + //! \copydoc ImplicitProblem::neumannAtPos() + void neumannAtPos(PrimaryVariables &values, + const GlobalPosition &globalPos) const + { + values = 0.; + } + + // \} + + /*! + * \name Volume terms + */ + // \{ + + //! \copydoc ImplicitProblem::sourceAtPos() + void sourceAtPos(PrimaryVariables &values, + const GlobalPosition &globalPos) const + { + values = Scalar(0); + } + + //! \copydoc ImplicitProblem::initialAtPos() + void initialAtPos(PrimaryVariables &values, + const GlobalPosition &globalPos) const + { + initial_(values, globalPos); + } + + // \} + + /*! + * \brief Return the initial phase state inside a control volume. + * + * \param vertex The vertex + * \param globalIdx The index of the global vertex + * \param globalPos The global position + */ + int initialPhasePresence(const Vertex &vertex, + const int &globalIdx, + const GlobalPosition &globalPos) const + { + return bothPhases; + } + + /*! + * \brief Called by the time manager after the time integration to + * do some post processing on the solution. + */ + void postTimeStep() + { + // Calculate masses + PrimaryVariables storage; + + this->model().globalStorage(storage); + const Scalar time = this->timeManager().time() + this->timeManager().timeStepSize(); + + // Write mass balance information for rank 0 + if (this->gridView().comm().rank() == 0) + { + if (this->timeManager().timeStepIndex() % freqMassOutput_ == 0 + || this->timeManager().episodeWillBeOver()) + { + PrimaryVariables storageChange(0.); + storageChange = storageLastTimestep_ - storage; + + assert(time - lastMassOutputTime_ != 0); + storageChange /= (time - lastMassOutputTime_); + // 2d: interface length has to be accounted for + // in order to obtain kg/m²s + storageChange /= (bBoxMax_[0]-bBoxMin_[0]); + + std::cout << "Time: " << time + << " TotalMass: " << storage[contiTotalMassIdx] + << " WaterMass: " << storage[contiWEqIdx] + << " WaterMassChange: " << storageChange[contiWEqIdx] + << std::endl; + if (this->timeManager().time() != 0.) + outfile << time << ";" + << storageChange[contiTotalMassIdx] << ";" + << storageChange[contiWEqIdx] << ";" + << storage[contiWEqIdx] + << std::endl; + + storageLastTimestep_ = storage; + lastMassOutputTime_ = time; + } + } + } + + /*! + * \brief Determines if globalPos is a corner of the grid + * + * \param globalPos The global position + */ + bool isCornerPoint(const GlobalPosition &globalPos) + { + return ((onLeftBoundary_(globalPos) && onLowerBoundary_(globalPos)) + || (onLeftBoundary_(globalPos) && onUpperBoundary_(globalPos)) + || (onRightBoundary_(globalPos) && onLowerBoundary_(globalPos)) + || (onRightBoundary_(globalPos) && onUpperBoundary_(globalPos))); + } + + /*! + * \brief Returns whether the position is an interface corner point + * + * This function is required in case of mortar coupling otherwise it should return false + * + * \param globalPos The global position + */ + bool isInterfaceCornerPoint(const GlobalPosition &globalPos) const + { return false; } + +private: + // Internal method for the initial condition (reused for the dirichlet conditions!) + void initial_(PrimaryVariables &values, + const GlobalPosition &globalPos) const + { + values[pressureIdx] = refPressure_ + + 1000. * this->gravity()[1] * (globalPos[1] - bBoxMax_[1]); + values[switchIdx] = refSw_; + } + + bool onLeftBoundary_(const GlobalPosition &globalPos) const + { return globalPos[0] < bBoxMin_[0] + eps_; } + + bool onRightBoundary_(const GlobalPosition &globalPos) const + { return globalPos[0] > bBoxMax_[0] - eps_; } + + bool onLowerBoundary_(const GlobalPosition &globalPos) const + { return globalPos[1] < bBoxMin_[1] + eps_; } + + bool onUpperBoundary_(const GlobalPosition &globalPos) const + { return globalPos[1] > bBoxMax_[1] - eps_; } + + bool onBoundary_(const GlobalPosition &globalPos) const + { + return (onLeftBoundary_(globalPos) || onRightBoundary_(globalPos) + || onLowerBoundary_(globalPos) || onUpperBoundary_(globalPos)); + } + + static constexpr Scalar eps_ = 1e-8; + GlobalPosition bBoxMin_; + GlobalPosition bBoxMax_; + Scalar runUpDistanceX_; + + Scalar refTemperature_; + Scalar refPressure_; + Scalar refSw_; + + PrimaryVariables storageLastTimestep_; + Scalar lastMassOutputTime_; + int freqMassOutput_; + std::ofstream outfile; +}; +} //end namespace Dumux + +#endif // DUMUX_TWOPTWOC_SUBPROBLEM_HH diff --git a/test/multidomain/2czeroeq2p2c/CMakeLists.txt b/test/multidomain/2czeroeq2p2c/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..144e6cf8966711c1ba4155784dfb36a411fe0be7 --- /dev/null +++ b/test/multidomain/2czeroeq2p2c/CMakeLists.txt @@ -0,0 +1,19 @@ +# test: test_2czeroeq2p2c_1ff +add_dumux_test(test_2czeroeq2p2c_1ff test_2czeroeq2p2c test_2czeroeq2p2c.cc + ${CMAKE_SOURCE_DIR}/bin/runTest.sh + ${CMAKE_SOURCE_DIR}/bin/fuzzycomparevtu.py + ${CMAKE_SOURCE_DIR}/test/references/2czeroeq2p2c-ff-reference.vtu + ${CMAKE_CURRENT_BINARY_DIR}/zeroeq2c-00026.vtu + ${CMAKE_CURRENT_BINARY_DIR}/test_2czeroeq2p2c + -ParameterFile ${CMAKE_CURRENT_SOURCE_DIR}/test_2czeroeq2p2c_reference.input + ) + +# test: test_2czeroeq2p2c_2pm +add_dumux_test(test_2czeroeq2p2c_2pm test_2czeroeq2p2c test_2czeroeq2p2c.cc + ${CMAKE_SOURCE_DIR}/bin/runTest.sh + ${CMAKE_SOURCE_DIR}/bin/fuzzycomparevtu.py + ${CMAKE_SOURCE_DIR}/test/references/2czeroeq2p2c-pm-reference.vtu + ${CMAKE_CURRENT_BINARY_DIR}/2p2c-00026.vtu + ${CMAKE_CURRENT_BINARY_DIR}/test_2czeroeq2p2c + -ParameterFile ${CMAKE_CURRENT_SOURCE_DIR}/test_2czeroeq2p2c_reference.input + ) diff --git a/test/multidomain/2czeroeq2p2c/Makefile.am b/test/multidomain/2czeroeq2p2c/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..3b459d4ee7a361e5cbd16377a79dfd5e9d6870f7 --- /dev/null +++ b/test/multidomain/2czeroeq2p2c/Makefile.am @@ -0,0 +1,6 @@ +# tests where program to build and program to run are equal +check_PROGRAMS = test_2czeroeq2p2c + +test_2czeroeq2p2c_SOURCES = test_2czeroeq2p2c.cc + +include $(top_srcdir)/am/global-rules diff --git a/test/multidomain/2czeroeq2p2c/test_2czeroeq2p2c.cc b/test/multidomain/2czeroeq2p2c/test_2czeroeq2p2c.cc new file mode 100644 index 0000000000000000000000000000000000000000..d67b86b6b3eb94789b088de0ad4ecde3b524b297 --- /dev/null +++ b/test/multidomain/2czeroeq2p2c/test_2czeroeq2p2c.cc @@ -0,0 +1,330 @@ +// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- +// vi: set et ts=4 sw=4 sts=4: +/***************************************************************************** + * See the file COPYING for full copying permissions. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see <http://www.gnu.org/licenses/>. * + *****************************************************************************/ +/*! + * \file + * + * \brief Test for the coupled isothermal two-component ZeroEq and + * isothermal two-phase two-component Darcy model + */ + +#include "config.h" +#include <iostream> + +#include <dune/common/parallel/mpihelper.hh> +#include <dune/common/parametertreeparser.hh> + +#include <dumux/common/start.hh> +#include <dumux/io/interfacemeshcreator.hh> + +#include "2czeroeq2p2cproblem.hh" + +/*! + * \brief Print a usage string for simulations. + * + * \param progName The name of the program, that was tried to be started. + * \param errorMsg The error message that was issued by the start function. + * Comprises the thing that went wrong and a general help message. + */ +void printUsage(const char *progName, const std::string &errorMsg) +{ + if (errorMsg.size() > 0) { + std::string errorMessageOut = "\nUsage: "; + errorMessageOut += progName; + errorMessageOut += " [options]\n"; + errorMessageOut += errorMsg; + errorMessageOut += "\nThe list of mandatory options for this program is:\n" + "[Grid]\n" + "XMin Minumum x-coordinate [m]\n" + "XMax Maximum x-coordinate [m]\n" + "YMin Minumum y-coordinate [m]\n" + "YMax Maximum y-coordinate [m]\n" + "CellsX Number of cells in x-direction\n" + "CellsY Number of cells in y-direction\n" + "GradingY Vertical grading of the cells\n" + "RefineTop Specifies whethter the top of the free flow will be refined\n" + "InterfacePos Vertical position of the interface [m]\n" + "NoDarcyX Horizontal position where the porous medium starts [m]\n" + "\n" + "[SpatialParams]\n" + "AlphaBJ Beavers-Joseph coefficient [-]\n" + "Permeability Hydraulic conductivity [m^2]\n" + "Porosity Porosity [-]\n" + "Swr Residual water saturation [-]\n" + "Snr Residual gas saturation [-]\n" + "VgAlpha Van-Genuchten parameter [1/Pa]\n" + "VgN Van-Genuchten parameter [-]\n" + "\n" + "[FreeFlow]\n" + "RefVelocity Inflow velocity [m/s]\n" + "RefPressure Reference pressure [Pa]\n" + "RefMassfrac Inflow water mass fraction [-]\n" + "RefTemperature Inflow temperature [K]\n" + "\n" + "[PorousMedium]\n" + "RefSw Initial water saturation [-]\n" + "RefPressurePM Initial pressure [Pa]\n" + "RefTemperaturePM Initial temperature [K]\n" + "\n" + "[Output]\n" + "NameFF Name free flow .vtu files\n" + "NamePM Name porous medium .vtu files\n" + "FreqRestart Frequency of writting restart information\n" + "FreqOutput Frequency of writting vtu output\n" + "FreqMassOutput Frequency of writting storage output\n" + "FreqFluxOutput Frequency of writting flux output\n" + "FreqVaporFluxOutput Frequency of writting vapor flux output\n" + "\n" + "[TimeManager]\n" + "EpisodeLength Length of one episode [s]\n" + "\n"; + + std::cout << errorMessageOut + << "\n"; + } +} + +template <class TypeTag> +int startLocal_(int argc, char **argv, + void (*usage)(const char *, const std::string &)) +{ + typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; + typedef typename GET_PROP_TYPE(TypeTag, Grid) Grid; + typedef typename GET_PROP_TYPE(TypeTag, MultiDomainGrid) MDGrid; + typedef typename GET_PROP_TYPE(TypeTag, GridCreator) GridCreator; + typedef typename GET_PROP_TYPE(TypeTag, Problem) Problem; + typedef typename GET_PROP_TYPE(TypeTag, TimeManager) TimeManager; + + // print dumux start message + Dumux::dumuxMessage_(true); + + //////////////////////////////////////////////////////////// + // Load the input parameters + //////////////////////////////////////////////////////////// + + typedef typename GET_PROP(TypeTag, ParameterTree) ParameterTree; + Dune::ParameterTreeParser::readOptions(argc, argv, ParameterTree::tree()); + + if (ParameterTree::tree().hasKey("ParameterFile") || argc==1) + { + // read input file, but do not overwrite options specified + // on the command line, since the latter have precedence. + std::string inputFileName ; + if(argc==1) // if there are no arguments given (and there is a file ./<programname>.input) we use it as input file + { + std::cout<< "\nNo parameter file given. \n" + << "Defaulting to '" + << argv[0] + << ".input' for input file.\n"; + inputFileName = argv[0]; + inputFileName += ".input"; + } + else + inputFileName = GET_RUNTIME_PARAM(TypeTag, std::string, ParameterFile); // otherwise we read from the command line + + std::ifstream parameterFile; + + // check whether the parameter file exists. + parameterFile.open(inputFileName.c_str()); + if (not parameterFile.is_open()){ + std::cout<< "\n\t -> Could not open file" + << inputFileName + << ". <- \n\n\n\n"; + printUsage(argv[0], Dumux::usageTextBlock()); + return 1; + } + parameterFile.close(); + + Dune::ParameterTreeParser::readINITree(inputFileName, + ParameterTree::tree(), + /*overwrite=*/false); + } + + // initialize MPI, finalize is done automatically on exit + static Dune::MPIHelper& mpiHelper = Dune::MPIHelper::instance(argc, argv); + + // define the problem dimensions + const int dim=2; + + std::string dgfFileName = "temp.dgf"; + Scalar dt, tEnd; + Dune::FieldVector<int, dim> nElements; + Scalar interfacePos, gradingFactor; + bool refineTop; + + try { + dt = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, TimeManager, DtInitial); + tEnd = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, TimeManager, TEnd); + + nElements[0] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, int, Grid, CellsX); + nElements[1] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, int, Grid, CellsY); + interfacePos = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, InterfacePos); + gradingFactor = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, GradingY); + refineTop = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, bool, Grid, RefineTop); + } + catch (Dumux::ParameterException &e) { + std::cerr << e << ". Abort!\n"; + exit(1) ; + } + catch (...) { + std::cerr << "Unknown exception thrown!\n"; + exit(1); + } + std::cout << "Starting with timestep size = " << dt << "s, simulation end = " << tEnd << "s\n"; + + try + { + Dune::FieldVector<Scalar, dim> min; + Dune::FieldVector<Scalar, dim> max; + Dune::FieldVector<int, dim> cells(1); + min[0] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, XMin); + min[1] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, YMin); + max[0] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, XMax); + max[1] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, YMax); + + std::ofstream outfile; + outfile.open(dgfFileName); + outfile << "DGF" << std::endl; + outfile << "Interval" << std::endl; + outfile << min[0] << " " << min[1] << " % first corner" << std::endl; + outfile << max[0] << " " << max[1] << " % second corner" << std::endl; + outfile << cells[0] << " " << cells[1] << " % cells in x and y direction" << std::endl; + outfile << "#" << std::endl; + outfile << "" << std::endl; + outfile << "Cube" << std::endl; + outfile << "0 1 2 3" << std::endl; + outfile << "#" << std::endl; + outfile << "" << std::endl; + outfile << "BOUNDARYDOMAIN" << std::endl; + outfile << "default 1 % all boundaries have id 1" << std::endl; + outfile << "BOUNDARYDOMAIN" << std::endl; + outfile << "# unitcube.dgf" << std::endl; + outfile.close(); + } + catch (Dumux::ParameterException &e) { + std::cerr << e << ". Abort!\n"; + exit(1) ; + } + catch (...) { + std::cerr << "Unknown exception thrown!\n"; + exit(1); + } + + Dumux::InterfaceMeshCreator<Grid> interfaceMeshCreator; + GridCreator::gridPtr() = interfaceMeshCreator.create(dgfFileName, nElements, interfacePos, gradingFactor, refineTop); + + if (mpiHelper.size() > 1) { + if (!Dune::Capabilities::isParallel<Grid>::v) { + std::cerr << "WARNING: THE PROGRAM IS STARTED USING MPI, BUT THE GRID IMPLEMENTATION\n" + << " YOU HAVE CHOSEN IS NOT PARALLEL!\n"; + } + GridCreator::loadBalance(); + } + + // Instantiate the time manager + TimeManager timeManager; + + // instantiate grid + Dune::shared_ptr<MDGrid> mdGrid_ = Dune::make_shared<MDGrid> (GridCreator::grid()); + + // instantiate coupled problem + Problem problem(*mdGrid_, timeManager); + + // print all properties and properties + bool printProps = false; + if (ParameterTree::tree().hasKey("PrintProperties") + || ParameterTree::tree().hasKey("TimeManager.PrintProperties")) + printProps = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, bool, TimeManager, PrintProperties); + if (printProps) + { + Dumux::Properties::print<TypeTag>(); + Dumux::Parameters::print<TypeTag>(); + } + + // deal with the restart stuff + bool restart = false; + Scalar restartTime = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, TimeManager, DtInitial); + if (ParameterTree::tree().hasKey("Restart") + || ParameterTree::tree().hasKey("TimeManager.Restart")) { + restart = true; + restartTime = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, TimeManager, Restart); + } + + // run the simulation + timeManager.init(problem, + restartTime, // initial time + dt, // initial time step + tEnd, // final time + restart); + + timeManager.run(); + + // print all parameters + bool printParams = true; + if (ParameterTree::tree().hasKey("PrintParameters") + || ParameterTree::tree().hasKey("TimeManager.PrintParameters")) + printParams = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, bool, TimeManager, PrintParameters); + if (printParams) + Dumux::Parameters::print<TypeTag>(); + + // print dumux end message + Dumux::dumuxMessage_(false); + + return 0; +} + +/*! + * \brief Provides a main function which reads in parameters from the + * command line and a parameter file. + * + * In this function only the differentiation between debugger + * or not is made. + * + * \tparam TypeTag The type tag of the problem which needs to be solved + * + * \param argc The number of command line arguments of the program + * \param argv The contents of the command line arguments of the program + */ +template <class TypeTag> +int startLocal(int argc, char **argv, + void (*printUsage)(const char *, const std::string &)) +{ + try { + return startLocal_<TypeTag>(argc, argv, printUsage); + } + catch (Dumux::ParameterException &e) + { + std::cerr << e << ". Abort!\n"; + printUsage(argv[0], Dumux::usageTextBlock()); + return 1; + } + catch (Dune::Exception &e) { + std::cerr << "Dune reported error: " << e << std::endl; + return 2; + } + catch (...) { + std::cerr << "Unknown exception thrown!\n"; + return 3; + } +} + +int main(int argc, char** argv) +{ + typedef TTAG(TwoCZeroEqTwoPTwoCProblem) ProblemTypeTag; + return startLocal<ProblemTypeTag>(argc, argv, printUsage); +} diff --git a/test/multidomain/2czeroeq2p2c/test_2czeroeq2p2c.input b/test/multidomain/2czeroeq2p2c/test_2czeroeq2p2c.input new file mode 100644 index 0000000000000000000000000000000000000000..d896a91fd1e268490eed9b6ad4dcf3deb860d698 --- /dev/null +++ b/test/multidomain/2czeroeq2p2c/test_2czeroeq2p2c.input @@ -0,0 +1,83 @@ +[TimeManager] +DtInitial = 5e-5 # [s] +MaxTimeStepSize = 900 # [s] +TEnd = 518400 # [s] # 518400 = 6 days +EpisodeLength = 8e5 # [s] # 43200 + +[Grid] +XMin = 0.0 # [m] +XMax = 0.5 # [m] +YMin = 0.0 # [m] +YMax = 0.75 # [m] +# Number of elements in x-, y-direction +CellsX = 20 +CellsY = 40 +# Grading and refinement of the mesh +GradingY = 1.16 +Refinement = 0 +RefineTop = false +# Position information +NoDarcyX = 0.25 # [m] # Horizontal position without PM below +RunUpDistanceX = 0.26 # [m] # Horizontal position without Coupling to PM +InterfacePos = 0.25 # [m] # Vertical position of coupling interface + +[Output] +NameFF = zeroeq2c +NamePM = 2p2c +# Frequency of restart file, flux and VTK output +FreqRestart = 50 # 500 # how often restart files are written out +FreqOutput = 5 # 10 # frequency of VTK output +FreqMassOutput = 5 # 20 # frequency of mass and evaporation rate output (Darcy) +FreqFluxOutput = 3 # 100 # frequency of detailed flux output +FreqVaporFluxOutput = 3 # 5 # frequency of summarized flux output + +[FreeFlow] +RefVelocity = 3.5 # [m/s] +RefPressure = 1e5 # [Pa] +RefMassfrac = 0.008 # [-] +RefTemperature = 298.15 # [K] +SlipVelocity = 0.0 # [m/s] + +[PorousMedium] +RefPressurePM = 1e5 # [Pa] +RefTemperaturePM = 298.15 # [K] +RefSw = 0.9 # [-] + +[SpatialParams] +AlphaBJ = 1.0 # [-] +Permeability = 2.65e-10 # [m^2] +Porosity = 0.41 # [-] +Swr = 0.005 # [-] +Snr = 0.01 # [-] +VgAlpha = 6.371e-4 # [1/Pa] +VgN = 6.9 # [-] + +# optional parameters +[Newton] +MaxRelativeShift = 1e-5 +TargetSteps = 10 +MaxSteps = 15 +WriteConvergence = false + +[LinearSolver] +ResidualReduction = 1e-8 +Verbosity = 0 +MaxIterations = 100 + +[ZeroEq] +WriteAllSCVData = -1.0 +# Eddy Viscosity Models +# 0 = none +# 1 = Prandtl +# 2 = modified Van Driest +# 3 = Baldwin Lomax +EddyViscosityModel = 3 +# Eddy Diffusivity Models +# 0 = none +# 1 = Reynolds analogy +# 2 = modified Van Driest +# 3 = Deissler +# 4 = Meier and Rotta +EddyDiffusivityModel = 3 +BBoxMinSandGrainRoughness = 0.0 # [m] # 0.6e-3 +BBoxMaxSandGrainRoughness = 0.0 # [m] # 0 diff --git a/test/multidomain/2czeroeq2p2c/test_2czeroeq2p2c_reference.input b/test/multidomain/2czeroeq2p2c/test_2czeroeq2p2c_reference.input new file mode 100644 index 0000000000000000000000000000000000000000..93bfb438070bed44a522b19d88380d887493010a --- /dev/null +++ b/test/multidomain/2czeroeq2p2c/test_2czeroeq2p2c_reference.input @@ -0,0 +1,82 @@ +[TimeManager] +DtInitial = 5e-5 # [s] +MaxTimeStepSize = 900 # [s] +TEnd = 86400 # [s] +EpisodeLength = 8e5 # [s] + +[Grid] +XMin = 0.0 +XMax = 0.5 +YMin = 0.0 +YMax = 0.75 +# Number of elements in x-, y-direction +CellsX = 10 +CellsY = 25 +# Grading and refinement of the mesh +GradingY = 1.1 +RefineTop = false +# Position information +NoDarcyX = 0.25 # [m] # Horizontal position without PM below +RunUpDistanceX = 0.26 # [m] # Horizontal position without Coupling to PM +InterfacePos = 0.25 # [m] # Vertical position of coupling interface + +[Output] +NameFF = zeroeq2c +NamePM = 2p2c +# Frequency of restart file, flux and VTK output +FreqRestart = 100 # 500 # how often restart files are written out +FreqOutput = 5 # 10 # frequency of VTK output +FreqMassOutput = 5 # 20 # frequency of mass and evaporation rate output (Darcy) +FreqFluxOutput = 3 # 100 # frequency of detailed flux output +FreqVaporFluxOutput = 3 # 5 # frequency of summarized flux output + +[FreeFlow] +RefVelocity = 3.5 # [m/s] +RefPressure = 1e5 # [Pa] +RefMassfrac = 0.008 # [-] +RefTemperature = 298.15 # [K] + +[PorousMedium] +RefPressurePM = 1e5 # [Pa] +RefTemperaturePM = 298.15 # [K] +RefSw = 0.9 # [-] + +[SpatialParams] +AlphaBJ = 1.0 # [-] +Permeability = 2.65e-10 # [m^2] +Porosity = 0.41 # [-] +Swr = 0.005 # [-] +Snr = 0.01 # [-] +VgAlpha = 6.371e-4 # [1/Pa] +VgN = 6.9 # [-] + +# optional parameters +[Newton] +MaxRelativeShift = 1e-5 +TargetSteps = 10 +MaxSteps = 15 +WriteConvergence = false +MaxTimeStepDivisions = 20 + +[LinearSolver] +ResidualReduction = 1e-8 +Verbosity = 0 +MaxIterations = 100 + +[ZeroEq] +WriteAllSCVData = -1.0 +# Eddy Viscosity Models +# 0 = none +# 1 = Prandtl +# 2 = modified Van Driest +# 3 = Baldwin Lomax +EddyViscosityModel = 3 +# Eddy Diffusivity Models +# 0 = none +# 1 = Reynolds analogy +# 2 = modified Van Driest +# 3 = Deissler +# 4 = Meier and Rotta +EddyDiffusivityModel = 3 +BBoxMinSandGrainRoughness = 0.0 # [m] # 0.6e-3 +BBoxMaxSandGrainRoughness = 0.0 # [m] # 0 diff --git a/test/multidomain/2czeroeq2p2c/zeroeq2csubproblem.hh b/test/multidomain/2czeroeq2p2c/zeroeq2csubproblem.hh new file mode 100644 index 0000000000000000000000000000000000000000..47471c7a993a79fff91879876fa8bc340d702cea --- /dev/null +++ b/test/multidomain/2czeroeq2p2c/zeroeq2csubproblem.hh @@ -0,0 +1,466 @@ +// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- +// vi: set et ts=4 sw=4 sts=4: +/***************************************************************************** + * See the file COPYING for full copying permissions. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see <http://www.gnu.org/licenses/>. * + *****************************************************************************/ +/** + * \file + * \brief Isothermal two-component ZeroEq subproblem with air flowing + * from the left to the right and coupling at the bottom. + */ +#ifndef DUMUX_ZEROEQTWOCSUBPROBLEM_HH +#define DUMUX_ZEROEQTWOCSUBPROBLEM_HH + +#include <dumux/freeflow/zeroeqnc/zeroeqncmodel.hh> +#include <dumux/multidomain/common/subdomainpropertydefaults.hh> +#include <dumux/multidomain/couplinglocalresiduals/stokesnccouplinglocalresidual.hh> + +#include "2czeroeq2p2cspatialparameters.hh" + +namespace Dumux +{ + +template <class TypeTag> +class ZeroEq2cSubProblem; + +namespace Properties +{ +NEW_TYPE_TAG(ZeroEq2cSubProblem, + INHERITS_FROM(BoxZeroEqnc, SubDomain, TwoCZeroEqTwoPTwoCSpatialParams)); + +// Set the problem property +SET_TYPE_PROP(ZeroEq2cSubProblem, Problem, Dumux::ZeroEq2cSubProblem<TypeTag>); + +// Set the property for the material parameters by extracting it from the material law. +SET_TYPE_PROP(ZeroEq2cSubProblem, + MaterialLawParams, + typename GET_PROP_TYPE(TypeTag, MaterialLaw)::Params); + +// Use the StokencCouplingLocalResidual for the computation of the local residual in the ZeroEq domain +SET_TYPE_PROP(ZeroEq2cSubProblem, LocalResidual, + StokesncCouplingLocalResidual<TypeTag>); + +// Used the fluid system from the coupled problem +SET_TYPE_PROP(ZeroEq2cSubProblem, + FluidSystem, + typename GET_PROP_TYPE(typename GET_PROP_TYPE(TypeTag, MultiDomainTypeTag), FluidSystem)); + +// Disable use of mole formulation +SET_BOOL_PROP(ZeroEq2cSubProblem, UseMoles, false); + +// Disable gravity +SET_BOOL_PROP(ZeroEq2cSubProblem, ProblemEnableGravity, false); + +// Enable Navier-Stokes +SET_BOOL_PROP(ZeroEq2cSubProblem, EnableNavierStokes, true); + +// Set the properties for variable inflow BC +NEW_PROP_TAG(FreeFlowSinusVelocityAmplitude); +NEW_PROP_TAG(FreeFlowSinusVelocityPeriod); +SET_SCALAR_PROP(ZeroEq2cSubProblem, FreeFlowSinusVelocityAmplitude, 0.0); +SET_SCALAR_PROP(ZeroEq2cSubProblem, FreeFlowSinusVelocityPeriod, 3600.0); +NEW_PROP_TAG(FreeFlowSinusPressureAmplitude); +NEW_PROP_TAG(FreeFlowSinusPressurePeriod); +SET_SCALAR_PROP(ZeroEq2cSubProblem, FreeFlowSinusPressureAmplitude, 0.0); +SET_SCALAR_PROP(ZeroEq2cSubProblem, FreeFlowSinusPressurePeriod, 3600.0); +NEW_PROP_TAG(FreeFlowSinusConcentrationAmplitude); +NEW_PROP_TAG(FreeFlowSinusConcentrationPeriod); +SET_SCALAR_PROP(ZeroEq2cSubProblem, FreeFlowSinusConcentrationAmplitude, 0.0); +SET_SCALAR_PROP(ZeroEq2cSubProblem, FreeFlowSinusConcentrationPeriod, 3600.0); +NEW_PROP_TAG(FreeFlowSinusTemperatureAmplitude); +NEW_PROP_TAG(FreeFlowSinusTemperaturePeriod); +SET_SCALAR_PROP(ZeroEq2cSubProblem, FreeFlowSinusTemperatureAmplitude, 0.0); +SET_SCALAR_PROP(ZeroEq2cSubProblem, FreeFlowSinusTemperaturePeriod, 3600.0); +} + +/*! + * \ingroup ImplicitTestProblems + * \ingroup MultidomainProblems + * \brief ZeroEq2c problem with air flowing from the left to the right. + * + * \todo update test description + * The zeroeq subdomain is sized 1m times 1m. The boundary conditions for the momentum balances + * are all set to Dirichlet. The mass balance receives + * outflow bcs, which are replaced in the localresidual by the sum + * of the two momentum balances. In the middle of the right boundary, + * one vertex receives Dirichlet bcs, to set the pressure level. + * + * This sub problem uses the \ref ZeroEqTwoCModel. It is part of the 2czeroeq2p2c model and + * is combined with the 2p2csubproblem for the Darcy domain. + */ +template <class TypeTag> +class ZeroEq2cSubProblem : public ZeroEqProblem<TypeTag> +{ + typedef ZeroEq2cSubProblem<TypeTag> ThisType; + typedef ZeroEqProblem<TypeTag> ParentType; + + typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; + typedef typename GET_PROP_TYPE(TypeTag, TimeManager) TimeManager; + + typedef typename GET_PROP_TYPE(TypeTag, SpatialParams) SpatialParams; + + typedef typename GET_PROP_TYPE(TypeTag, Indices) Indices; + + enum { + dim = GridView::dimension + }; + enum { // equation indices + massBalanceIdx = Indices::massBalanceIdx, + momentumXIdx = Indices::momentumXIdx, // Index of the x-component of the momentum balance + momentumYIdx = Indices::momentumYIdx, // Index of the y-component of the momentum balance + momentumZIdx = Indices::momentumZIdx, // Index of the z-component of the momentum balance + transportEqIdx = Indices::transportEqIdx // Index of the transport equation (massfraction) + }; + enum { // primary variable indices + pressureIdx = Indices::pressureIdx, + velocityXIdx = Indices::velocityXIdx, + velocityYIdx = Indices::velocityYIdx, + velocityZIdx = Indices::velocityZIdx, + massOrMoleFracIdx = Indices::massOrMoleFracIdx + }; + enum { phaseIdx = Indices::phaseIdx }; + enum { numComponents = Indices::numComponents }; + enum { + transportCompIdx = Indices::transportCompIdx, // water component index + phaseCompIdx = Indices::phaseCompIdx // air component index + }; + + typedef typename GET_PROP_TYPE(TypeTag, PrimaryVariables) PrimaryVariables; + typedef typename GET_PROP_TYPE(TypeTag, BoundaryTypes) BoundaryTypes; + + typedef typename GridView::template Codim<0>::Entity Element; + typedef typename GridView::template Codim<dim>::Entity Vertex; + typedef typename GridView::ctype CoordScalar; + typedef typename GridView::Intersection Intersection; + + typedef typename GET_PROP_TYPE(TypeTag, FVElementGeometry) FVElementGeometry; + typedef typename GET_PROP_TYPE(TypeTag, FluidSystem) FluidSystem; + typedef typename GET_PROP_TYPE(TypeTag, FluidState) FluidState; + typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; + typedef Dune::FieldVector<CoordScalar, dim> GlobalPosition; + + +public: + /*! + * \brief The sub-problem for the ZeroEq subdomain + * + * \param timeManager The TimeManager which is used by the simulation + * \param gridView The simulation's idea about physical space + */ + ZeroEq2cSubProblem(TimeManager &timeManager, const GridView gridView) + : ParentType(timeManager, gridView), + spatialParams_(gridView) + { + bBoxMin_[0] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, XMin); + bBoxMax_[0] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, XMax); + bBoxMin_[1] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, InterfacePos); + bBoxMax_[1] = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, YMax); + runUpDistanceX_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, Grid, RunUpDistanceX); // first part of the interface without coupling + + refVelocity_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, RefVelocity); + refPressure_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, RefPressure); + refMassfrac_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, RefMassfrac); + refTemperature_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, RefTemperature); + alphaBJ_ = GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, Scalar, SpatialParams, AlphaBJ); + } + + // functions have to be overwritten, otherwise they remain uninitialised + //! \copydoc BoxProblem::&bBoxMin() + const GlobalPosition &bBoxMin() const + { return bBoxMin_; } + + //! \copydoc BoxProblem::&bBoxMax() + const GlobalPosition &bBoxMax() const + { return bBoxMax_; } + + /*! + * \brief Returns the problem name + * + * This is used as a prefix for files generated by the simulation. + */ + const std::string &name() const + { return GET_RUNTIME_PARAM_FROM_GROUP(TypeTag, std::string, Output, NameFF); } + + /*! + * \brief Returns the temperature \f$ K \f$ + * + * \param globalPos The global position + */ + Scalar temperatureAtPos(const GlobalPosition &globalPos) const + { + return refTemperature_; + }; + + /*! + * \name Boundary conditions + */ + // \{ + + //! \copydoc ImplicitProblem::boundaryTypesAtPos() + void boundaryTypesAtPos(BoundaryTypes &values, + const GlobalPosition &globalPos) const + { + values.setAllDirichlet(); + + if (onUpperBoundary_(globalPos)) + { + values.setNeumann(transportEqIdx); + } + + if (onRightBoundary_(globalPos)) + { + values.setAllOutflow(); + + if (onUpperBoundary_(globalPos)) // corner point + values.setAllDirichlet(); + } + + if (onLowerBoundary_(globalPos)) + { + values.setAllDirichlet(); + values.setNeumann(transportEqIdx); + + if (globalPos[0] > runUpDistanceX_-eps_) + values.setAllCouplingOutflow(); + } + if (onLeftBoundary_(globalPos)) + { + // Left inflow boundaries should be Neumann, otherwise the + // evaporative fluxes are much more grid dependent + values.setNeumann(transportEqIdx); + + if (onUpperBoundary_(globalPos) || onLowerBoundary_(globalPos)) // corner point + values.setAllDirichlet(); + } + + // the mass balance has to be of type outflow + // it does not get a coupling condition, since pn is a condition for ZeroEq + values.setOutflow(massBalanceIdx); + + if (onRightBoundary_(globalPos)) + values.setDirichlet(pressureIdx, massBalanceIdx); + } + + //! \copydoc ImplicitProblem::dirichletAtPos() + void dirichletAtPos(PrimaryVariables &values, + const GlobalPosition &globalPos) const + { + initial_(values, globalPos); + } + + //! \copydoc ImplicitProblem::neumannAtPos() + void neumannAtPos(PrimaryVariables &values, + const GlobalPosition &globalPos) const + { + values = 0.0; + + FluidState fluidState; + updateFluidStateForBC_(fluidState); + const Scalar density = FluidSystem::density(fluidState, phaseIdx); + + // rho*v*X at inflow + if (onLeftBoundary_(globalPos) + && globalPos[1] > bBoxMin_[1] && globalPos[1] < bBoxMax_[1]) + { + values[transportEqIdx] = -xVelocity_(globalPos) * density * refMassfrac(); + } + } + + /*! + * \brief Evaluate the Beavers-Joseph coefficient at given position + * + * \param globalPos The global position + * + * \return Beavers-Joseph coefficient + */ + Scalar beaversJosephCoeffAtPos(const GlobalPosition &globalPos) const + { + return alphaBJ_; + } + + /*! + * \brief Returns the intrinsic permeability tensor \f$[m^2]\f$ + * + * \param element The finite element + * \param fvGeometry The finite volume geometry of the element + * \param scvIdx The local index of the sub-control volume + */ + Scalar permeability(const Element &element, + const FVElementGeometry &fvGeometry, + const int scvIdx) const + { + return spatialParams_.intrinsicPermeability(element, + fvGeometry, + scvIdx); + } + + // \} + + /*! + * \name Volume terms + */ + // \{ + + //! \copydoc ImplicitProblem::sourceAtPos() + void sourceAtPos(PrimaryVariables &values, + const GlobalPosition &globalPos) const + { + values = Scalar(0); + } + + //! \copydoc ImplicitProblem::initialAtPos() + void initialAtPos(PrimaryVariables &values, + const GlobalPosition &globalPos) const + { + initial_(values, globalPos); + } + + // \} + + /*! + * \brief Determines if globalPos is a corner of the grid + * + * \param globalPos The global position + */ + bool isCornerPoint(const GlobalPosition &globalPos) + { + return ((onLeftBoundary_(globalPos) && onLowerBoundary_(globalPos)) + || (onLeftBoundary_(globalPos) && onUpperBoundary_(globalPos)) + || (onRightBoundary_(globalPos) && onLowerBoundary_(globalPos)) + || (onRightBoundary_(globalPos) && onUpperBoundary_(globalPos))); + } + + /*! + * \brief Auxiliary function used for the mortar coupling, if mortar coupling, + * this should return true + * + * \param globalPos The global position + */ + bool isInterfaceCornerPoint(const GlobalPosition &globalPos) const + { return false; } + + //! \brief Returns the velocity at the inflow. + const Scalar refVelocity() const + { + return refVelocity_ + variation_(GET_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, SinusVelocityAmplitude), + GET_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, SinusVelocityPeriod)); + } + + //! \brief Returns the pressure at the inflow. + const Scalar refPressure() const + { + return refPressure_ + variation_(GET_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, SinusPressureAmplitude), + GET_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, SinusPressurePeriod)); + } + + //! \brief Returns the mass fraction at the inflow. + const Scalar refMassfrac() const + { + return refMassfrac_ + variation_(GET_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, SinusConcentrationAmplitude), + GET_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, SinusConcentrationPeriod)); + } + + //! \brief Returns the temperature at the inflow. + const Scalar refTemperature() const + { + return refTemperature_ + variation_(GET_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, SinusTemperatureAmplitude), + GET_PARAM_FROM_GROUP(TypeTag, Scalar, FreeFlow, SinusTemperaturePeriod)); + } + +private: + // Internal method for the initial condition (reused for the dirichlet conditions!) + void initial_(PrimaryVariables &values, + const GlobalPosition &globalPos) const + { + + FluidState fluidState; + updateFluidStateForBC_(fluidState); + const Scalar density = FluidSystem::density(fluidState, phaseIdx); + + values[velocityXIdx] = xVelocity_(globalPos); + values[velocityYIdx] = 0.0; + values[pressureIdx] = refPressure() + + density * this->gravity()[1] * (globalPos[1] - bBoxMin_[1]); + values[massOrMoleFracIdx] = refMassfrac(); + } + + // Set the profile of the inflow velocity (horizontal direction) + const Scalar xVelocity_(const GlobalPosition &globalPos) const + { + if (onUpperBoundary_(globalPos) || onLowerBoundary_(globalPos)) + return 0.0; + return refVelocity(); + } + + // Updates the fluid state to obtain required quantities for IC/BC + void updateFluidStateForBC_(FluidState& fluidState) const + { + fluidState.setTemperature(refTemperature()); + fluidState.setPressure(phaseIdx, refPressure()); + + Scalar massFraction[numComponents]; + massFraction[transportCompIdx] = refMassfrac(); + massFraction[phaseCompIdx] = 1 - massFraction[transportCompIdx]; + + // calculate average molar mass of the gas phase + Scalar M1 = FluidSystem::molarMass(transportCompIdx); + Scalar M2 = FluidSystem::molarMass(phaseCompIdx); + Scalar X2 = massFraction[phaseCompIdx]; + Scalar massToMoleDenominator = M2 + X2*(M1 - M2); + + fluidState.setMoleFraction(phaseIdx, transportCompIdx, massFraction[transportCompIdx]*M2/massToMoleDenominator); + fluidState.setMoleFraction(phaseIdx, phaseCompIdx, massFraction[phaseCompIdx]*M1/massToMoleDenominator); + } + + // can be used for the variation of a boundary condition + const Scalar variation_(const Scalar amplitude, const Scalar period) const + { return sin(2*M_PI*this->timeManager().time()/period) * amplitude; } + + bool onLeftBoundary_(const GlobalPosition &globalPos) const + { return globalPos[0] < bBoxMin_[0] + eps_; } + + bool onRightBoundary_(const GlobalPosition &globalPos) const + { return globalPos[0] > bBoxMax_[0] - eps_; } + + bool onLowerBoundary_(const GlobalPosition &globalPos) const + { return globalPos[1] < bBoxMin_[1] + eps_; } + + bool onUpperBoundary_(const GlobalPosition &globalPos) const + { return globalPos[1] > bBoxMax_[1] - eps_; } + + bool onBoundary_(const GlobalPosition &globalPos) const + { + return (onLeftBoundary_(globalPos) || onRightBoundary_(globalPos) + || onLowerBoundary_(globalPos) || onUpperBoundary_(globalPos)); + } + + // spatial parameters + SpatialParams spatialParams_; + + static constexpr Scalar eps_ = 1e-8; + GlobalPosition bBoxMin_; + GlobalPosition bBoxMax_; + Scalar runUpDistanceX_; + + Scalar refVelocity_; + Scalar refPressure_; + Scalar refMassfrac_; + Scalar refTemperature_; + Scalar alphaBJ_; +}; +} //end namespace Dumux + +#endif // DUMUX_ZEROEQ2C_SUBPROBLEM_HH diff --git a/test/multidomain/CMakeLists.txt b/test/multidomain/CMakeLists.txt index 3cc98ca7e0978f812ae16ac6c6fd49c0f2aebcb0..f562a68846f0beecb7604f8c34aeca444438a0bc 100644 --- a/test/multidomain/CMakeLists.txt +++ b/test/multidomain/CMakeLists.txt @@ -1,2 +1,4 @@ add_subdirectory("2cstokes2p2c") add_subdirectory("2cnistokes2p2cni") +add_subdirectory("2czeroeq2p2c") +add_subdirectory("2cnizeroeq2p2cni") diff --git a/test/multidomain/Makefile.am b/test/multidomain/Makefile.am index ca63840bcb1e0757359ef33b91ca7061f2d79482..ec367d39e78df4fdd84c2c43ad227a87ccbadd99 100644 --- a/test/multidomain/Makefile.am +++ b/test/multidomain/Makefile.am @@ -1,8 +1,9 @@ SUBDIRS = \ 2cstokes2p2c \ - 2cnistokes2p2cni + 2cnistokes2p2cni \ + 2czeroeq2p2c \ + 2cnizeroeq2p2cni EXTRA_DIST = CMakeLists.txt installRequiredModules.sh include $(top_srcdir)/am/global-rules - diff --git a/test/references/2cnizeroeq2p2cni-ff-reference.vtu b/test/references/2cnizeroeq2p2cni-ff-reference.vtu new file mode 100644 index 0000000000000000000000000000000000000000..182c10dfa1d72b26e8cbaed59ff898a6b8361055 --- /dev/null +++ b/test/references/2cnizeroeq2p2cni-ff-reference.vtu @@ -0,0 +1,289 @@ +<?xml version="1.0"?> +<VTKFile type="UnstructuredGrid" version="0.1" byte_order="LittleEndian"> + <UnstructuredGrid> + <Piece NumberOfCells="150" NumberOfPoints="176"> + <PointData Scalars="P" Vectors="v"> + <DataArray type="Float32" Name="P" NumberOfComponents="1" format="ascii"> + 100015 99988.6 100015 99988.6 100014 100014 99989.6 99989.6 100012 100012 99991.3 99991.2 + 100010 100010 99993.5 99993 100008 100008 99995 99994.8 100006 100006 99996.5 99996.5 + 100004 100004 99998.2 99998.2 100002 100002 100000 100000 100018 99987.6 100014 99989.5 + 100012 99991.3 100010 99993.3 100008 99994.9 100006 99996.5 100004 99998.2 100002 100000 + 100017 99987.4 100014 99989.2 100012 99991.1 100010 99992.9 100008 99994.7 100006 99996.5 + 100004 99998.2 100003 100000 100017 99987.1 100015 99989.1 100012 99991 100010 99993 + 100008 99994.7 100006 99996.5 100005 99998.2 100003 100000 100017 99987.1 100015 99989 + 100012 99990.9 100010 99992.7 100009 99994.5 100007 99996.4 100005 99998.2 100003 100000 + 100017 99987.1 100015 99989.1 100012 99991 100010 99992.8 100008 99994.6 100006 99996.4 + 100005 99998.2 100003 100000 100017 99987.4 100014 99989.2 100012 99991 100010 99992.8 + 100008 99994.6 100006 99996.4 100004 99998.2 100003 100000 100018 99987.6 100014 99989.4 + 100012 99991.1 100010 99992.9 100008 99994.7 100006 99996.5 100004 99998.2 100002 100000 + 100015 99988.6 100014 99989.6 100012 99991.2 100010 99992.9 100008 99994.7 100006 99996.5 + 100004 99998.2 100002 100000 100015 99988.6 100014 99989.5 100012 99991.2 100010 99992.9 + 100008 99994.7 100006 99996.5 100004 99998.2 100002 100000 + </DataArray> + <DataArray type="Float32" Name="delP" NumberOfComponents="1" format="ascii"> + 14.9338 -11.4362 14.9567 -11.4133 13.6823 13.6848 -10.4036 -10.4002 11.9229 11.9373 -8.69525 -8.76971 + 9.67047 10.1029 -6.48061 -6.96785 7.95471 8.18343 -5.02132 -5.19894 6.31562 6.35073 -3.54476 -3.54993 + 4.40077 4.40192 -1.76312 -1.76231 2.37932 2.36774 0 0 17.6635 -12.3723 14.1585 -10.544 + 12.0087 -8.71708 9.84568 -6.65659 8.0536 -5.06219 6.30137 -3.49891 4.39634 -1.76843 2.43834 0 + 16.9772 -12.621 14.4644 -10.7638 12.2541 -8.92822 10.2815 -7.12957 8.31592 -5.29699 6.38596 -3.5383 + 4.45793 -1.7844 2.56562 0 16.617 -12.863 14.5095 -10.8791 12.3664 -8.9555 10.2771 -7.04887 + 8.32222 -5.26678 6.41372 -3.52887 4.52993 -1.78052 2.70329 0 16.5325 -12.9067 14.5336 -10.9932 + 12.5005 -9.12334 10.4926 -7.29367 8.50707 -5.46085 6.55654 -3.6378 4.63928 -1.81918 2.76135 0 + 16.6077 -12.8631 14.5293 -10.9078 12.4203 -9.01611 10.3719 -7.15972 8.39268 -5.35021 6.457 -3.56974 + 4.55989 -1.79681 2.72104 0 16.9641 -12.6195 14.4832 -10.7907 12.3003 -8.96944 10.2949 -7.15503 + 8.34436 -5.34937 6.41146 -3.56058 4.48226 -1.79292 2.57921 0 17.6386 -12.3734 14.1919 -10.6009 + 12.1215 -8.85314 10.2014 -7.08082 8.28975 -5.30248 6.36978 -3.52894 4.4347 -1.77498 2.45624 0 + 14.9327 -11.4144 13.7137 -10.4456 12.0166 -8.83874 10.175 -7.08921 8.28138 -5.3101 6.36411 -3.53001 + 4.42257 -1.76134 2.38053 0 14.9098 -11.4373 13.7117 -10.4515 12.0161 -8.83968 10.175 -7.08905 + 8.28152 -5.30993 6.36418 -3.53011 4.42294 -1.7621 2.39274 0 + </DataArray> + <DataArray type="Float32" Name="X^H2O" NumberOfComponents="1" format="ascii"> + 0.008 0.00622658 0.008 0.00792512 0.00598599 0.00788434 0.00583605 0.00784301 0.00591219 0.00781546 0.00621079 0.00779806 + 0.00754476 0.00779776 0.00939182 0.00782734 0.0107062 0.00786771 0.0109197 0.00792815 0.0115109 0.00799964 0.0109309 0.0080463 + 0.0104995 0.00807898 0.0103333 0.00810682 0.00775501 0.00809998 0.0059721 0.00766512 0.008 0.00799624 0.00799233 0.00798685 + 0.00798182 0.00797669 0.00797301 0.00796895 0.00796663 0.00796574 0.00796705 0.00796983 0.00797317 0.00797692 0.00797625 0.00771151 + 0.008 0.00799992 0.00799975 0.00799942 0.00799902 0.00799848 0.00799796 0.00799728 0.00799661 0.00799587 0.0079952 0.00799462 + 0.00799418 0.00799353 0.00798616 0.00775718 0.008 0.008 0.008 0.00799999 0.00799999 0.00799997 0.00799995 0.00799991 + 0.00799987 0.00799982 0.00799976 0.00799968 0.00799957 0.0079988 0.00798684 0.00775569 0.008 0.008 0.008 0.008 + 0.00799999 0.00799999 0.00799998 0.00799998 0.00799997 0.00799996 0.00799995 0.00799994 0.00799988 0.00799908 0.00798441 0.00775215 + 0.008 0.00799999 0.00799996 0.00799993 0.00799988 0.00799983 0.00799976 0.00799967 0.00799958 0.00799948 0.00799937 0.00799925 + 0.00799913 0.00799881 0.0079906 0.00776135 0.008 0.00799971 0.0079993 0.0079987 0.00799806 0.00799731 0.00799654 0.00799569 + 0.00799484 0.00799394 0.00799308 0.00799218 0.00799137 0.00799059 0.00798595 0.00775814 0.008 0.00799441 0.00798944 0.00798328 + 0.00797817 0.00797299 0.00796856 0.00796425 0.00796052 0.00795694 0.00795389 0.00795102 0.00794875 0.00794656 0.00794231 0.0076764 + 0.008 0.00791749 0.0078772 0.00783769 0.0078172 0.0078026 0.00779499 0.00779114 0.00779009 0.00779107 0.00779335 0.00779664 + 0.00780174 0.00780312 0.00779054 0.00737342 0.008 0.00624493 0.00601681 0.00585947 0.00602312 0.006231 0.00647328 0.00672531 + 0.00693001 0.00711547 0.00724865 0.00735113 0.00745775 0.00772897 0.006229 0.00494063 + </DataArray> + <DataArray type="Float32" Name="rho" NumberOfComponents="1" format="ascii"> + 1.16276 1.1637 1.16276 1.16251 1.16416 1.16283 1.16399 1.16257 1.16419 1.16285 1.16374 1.16262 + 1.17425 1.16286 1.19112 1.16282 1.20091 1.16305 1.19934 1.16311 1.1602 1.16321 1.16049 1.16306 + 1.16089 1.16313 1.16093 1.16304 1.16279 1.16307 1.18744 1.16835 1.16279 1.16245 1.16276 1.16247 + 1.16274 1.1625 1.16272 1.16253 1.16271 1.16256 1.16269 1.16258 1.16267 1.1626 1.16265 1.166 + 1.16278 1.16244 1.16276 1.16246 1.16273 1.16249 1.16271 1.16251 1.16269 1.16253 1.16267 1.16255 + 1.16264 1.16257 1.16263 1.16549 1.16278 1.16244 1.16276 1.16246 1.16273 1.16248 1.16271 1.16251 + 1.16268 1.16253 1.16266 1.16255 1.16264 1.16257 1.16263 1.16552 1.16278 1.16244 1.16276 1.16246 + 1.16273 1.16248 1.16271 1.1625 1.16269 1.16252 1.16266 1.16255 1.16264 1.16257 1.16263 1.16556 + 1.16278 1.16244 1.16276 1.16246 1.16273 1.16248 1.16271 1.1625 1.16269 1.16253 1.16266 1.16255 + 1.16264 1.16257 1.16263 1.16553 1.16278 1.16244 1.16276 1.16246 1.16273 1.16249 1.16271 1.16251 + 1.16269 1.16253 1.16267 1.16255 1.16265 1.16257 1.16263 1.16551 1.16279 1.16245 1.16276 1.16248 + 1.16274 1.1625 1.16273 1.16253 1.16271 1.16255 1.16269 1.16258 1.16267 1.1626 1.16266 1.16602 + 1.16276 1.16251 1.16283 1.16258 1.16285 1.16262 1.16284 1.16265 1.16283 1.16267 1.1628 1.16268 + 1.16277 1.1627 1.16277 1.1681 1.16276 1.16369 1.16414 1.16397 1.16412 1.16373 1.16378 1.1634 + 1.16343 1.16315 1.16319 1.163 1.16302 1.16276 1.16386 1.18809 + </DataArray> + <DataArray type="Float32" Name="mu" NumberOfComponents="1" format="ascii"> + 1.81222e-05 1.81479e-05 1.81222e-05 1.81233e-05 1.81514e-05 1.81239e-05 1.81536e-05 1.81245e-05 1.81525e-05 1.8125e-05 1.81482e-05 1.81252e-05 + 1.79936e-05 1.8125e-05 1.77501e-05 1.81224e-05 1.76091e-05 1.81208e-05 1.76206e-05 1.81168e-05 1.80716e-05 1.81156e-05 1.80799e-05 1.81149e-05 + 1.80861e-05 1.81144e-05 1.80885e-05 1.81141e-05 1.81258e-05 1.81144e-05 1.78719e-05 1.80603e-05 1.81222e-05 1.81223e-05 1.81223e-05 1.81224e-05 + 1.81225e-05 1.81226e-05 1.81226e-05 1.81227e-05 1.81227e-05 1.81227e-05 1.81226e-05 1.81225e-05 1.81224e-05 1.81224e-05 1.81224e-05 1.80876e-05 + 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81223e-05 1.81223e-05 1.81223e-05 1.81223e-05 1.81223e-05 1.81223e-05 1.81223e-05 + 1.81223e-05 1.81223e-05 1.81224e-05 1.80927e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 + 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81224e-05 1.80924e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 + 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81224e-05 1.8092e-05 + 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 + 1.81222e-05 1.81222e-05 1.81223e-05 1.80921e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81222e-05 1.81223e-05 1.81223e-05 1.81223e-05 1.81223e-05 + 1.81223e-05 1.81223e-05 1.81223e-05 1.81223e-05 1.81224e-05 1.81224e-05 1.81224e-05 1.80924e-05 1.81222e-05 1.81223e-05 1.81224e-05 1.81225e-05 + 1.81226e-05 1.81226e-05 1.81227e-05 1.81228e-05 1.81228e-05 1.81229e-05 1.81229e-05 1.8123e-05 1.8123e-05 1.8123e-05 1.81231e-05 1.80881e-05 + 1.81222e-05 1.81234e-05 1.8124e-05 1.81246e-05 1.81249e-05 1.81251e-05 1.81253e-05 1.81253e-05 1.81253e-05 1.81253e-05 1.81253e-05 1.81252e-05 + 1.81252e-05 1.81251e-05 1.81252e-05 1.807e-05 1.81222e-05 1.81477e-05 1.8151e-05 1.81533e-05 1.81509e-05 1.81479e-05 1.81444e-05 1.81407e-05 + 1.81377e-05 1.8135e-05 1.81331e-05 1.81316e-05 1.81301e-05 1.81262e-05 1.81479e-05 1.78877e-05 + </DataArray> + <DataArray type="Float32" Name="v" NumberOfComponents="3" format="ascii"> + 0 0 0 0 0 0 3.5 0 0 3.42882 0.102831 0 + 0 0 0 3.12033 0.00888965 0 0 0 0 3.23492 0.0250088 0 + 0 0 0 2.91421 0.00796738 0 0 0 0 3.11557 0.00537881 0 + 0.0265927 -0.00442212 0 2.79992 -0.0368189 0 0.260362 0.00671295 0 3.025 0.0125029 0 + 0.0135791 -0.00557923 0 2.73487 -0.00563452 0 0.25174 0.00373404 0 2.96154 0.00574155 0 + 0 0 0 2.67089 0.0155556 0 0 0 0 2.92057 0.00184655 0 + 0 0 0 2.6197 0.00197139 0 0 0 0 2.8943 0.00118524 0 + 0 0 0 2.62412 -0.0366102 0 1.00648 -0.00725145 0 2.87305 -0.047548 0 + 3.5 0 0 3.83764 0.1139 0 3.60914 0.0365758 0 3.81297 0.0620856 0 + 3.56647 0.0264748 0 3.76552 0.035235 0 3.49958 0.0121173 0 3.67212 0.0273948 0 + 3.44497 0.0127998 0 3.61618 0.0231502 0 3.39317 0.0201092 0 3.58326 0.0158747 0 + 3.34994 0.00755705 0 3.55237 0.00380736 0 3.3234 -0.0268679 0 3.50477 -0.0323767 0 + 3.5 0 0 3.7965 0.0530881 0 3.58192 0.0348213 0 3.83174 0.0529557 0 + 3.62172 0.030784 0 3.84598 0.0396834 0 3.63792 0.0129947 0 3.85077 0.036085 0 + 3.64583 0.0221042 0 3.8514 0.0338985 0 3.6521 0.0276761 0 3.85637 0.0266335 0 + 3.65489 0.0158968 0 3.85515 0.0109235 0 3.64941 -0.011512 0 3.83131 -0.015253 0 + 3.5 0 0 3.74876 0.0173781 0 3.52306 0.0184163 0 3.76854 0.0272178 0 + 3.55177 0.0188408 0 3.78773 0.0246647 0 3.57395 0.0173603 0 3.79758 0.0221225 0 + 3.59405 0.0156268 0 3.81228 0.0206952 0 3.61376 0.0146725 0 3.82848 0.01665 0 + 3.6294 0.00902373 0 3.83785 0.00764436 0 3.63502 -0.00146545 0 3.83273 -0.00293924 0 + 3.5 0 0 3.73744 -6.56461e-05 0 3.51322 -0.000644705 0 3.75131 -1.30716e-05 0 + 3.5357 -0.00150479 0 3.76758 -0.000135594 0 3.55741 -0.00264728 0 3.78369 0.000528393 0 + 3.57659 -0.000911225 0 3.79717 0.00153294 0 3.59346 0.00068055 0 3.80858 0.00175858 0 + 3.60655 0.000986566 0 3.81564 0.00129446 0 3.6126 0.000723964 0 3.81597 0.000595173 0 + 3.5 0 0 3.74616 -0.0175151 0 3.52292 -0.0192653 0 3.76553 -0.0273057 0 + 3.55131 -0.0206185 0 3.7844 -0.0249855 0 3.57481 -0.017902 0 3.80017 -0.0217802 0 + 3.59481 -0.0160212 0 3.81513 -0.0189575 0 3.61262 -0.0135217 0 3.82864 -0.0148049 0 + 3.62705 -0.00807985 0 3.83695 -0.0065884 0 3.63233 0.00194918 0 3.83119 0.00330661 0 + 3.5 0 0 3.79274 -0.0530063 0 3.58152 -0.0354653 0 3.82772 -0.0522742 0 + 3.62022 -0.0336115 0 3.84364 -0.0406984 0 3.63772 -0.0298172 0 3.85132 -0.032684 0 + 3.64621 -0.0259332 0 3.85445 -0.0273553 0 3.65001 -0.0213722 0 3.85506 -0.0218203 0 + 3.65176 -0.0122009 0 3.85357 -0.00826005 0 3.64669 0.0139402 0 3.82972 0.0175634 0 + 3.5 0 0 3.83175 -0.113618 0 3.60887 -0.0371117 0 3.80533 -0.0610134 0 + 3.56638 -0.0285282 0 3.74568 -0.0359244 0 3.50107 -0.0209872 0 3.68242 -0.0246889 0 + 3.43861 -0.0165681 0 3.62575 -0.0187842 0 3.3855 -0.0126929 0 3.57974 -0.0142077 0 + 3.3455 -0.00622179 0 3.55098 -0.00351178 0 3.32176 0.0274053 0 3.50484 0.0330586 0 + 3.5 0 0 3.42268 -0.102815 0 3.12092 -0.00817394 0 3.22822 -0.025862 0 + 2.91668 -0.00359975 0 3.10551 -0.00508346 0 2.80001 -0.000452951 0 3.02456 5.83809e-05 0 + 2.722 0.000217902 0 2.96428 0.000234495 0 2.66352 -1.98939e-05 0 2.91884 -0.000836122 0 + 2.62082 0.00107814 0 2.89698 -9.37616e-05 0 2.62635 0.0384585 0 2.87645 0.0493796 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 + 0 0 0 0 0 0 0 0 0 1.01298 0.00752403 0 + </DataArray> + <DataArray type="Float32" Name="temperature" NumberOfComponents="1" format="ascii"> + 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.151 298.15 298.151 298.15 298.151 + 295.299 298.147 290.745 298.1 288.19 298.079 288.493 298.014 298.15 298.009 298.15 298.009 + 298.15 298.009 298.15 298.01 298.15 298.015 292.268 296.739 298.15 298.15 298.15 298.15 + 298.15 298.15 298.15 298.15 298.15 298.149 298.147 298.147 298.146 298.146 298.145 297.33 + 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 + 298.15 298.15 298.149 297.451 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 + 298.15 298.15 298.15 298.15 298.15 298.15 298.149 297.444 298.15 298.15 298.15 298.15 + 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.149 297.435 + 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 + 298.15 298.15 298.149 297.44 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 + 298.15 298.15 298.15 298.15 298.15 298.15 298.15 297.447 298.15 298.15 298.15 298.15 + 298.15 298.15 298.15 298.15 298.15 298.15 298.151 298.151 298.151 298.151 298.15 297.331 + 298.15 298.15 298.151 298.151 298.151 298.151 298.151 298.151 298.151 298.151 298.151 298.151 + 298.151 298.151 298.149 296.856 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 + 298.15 298.15 298.15 298.15 298.15 298.15 298.15 292.289 + </DataArray> + </PointData> + <Points> + <DataArray type="Float32" Name="Coordinates" NumberOfComponents="3" format="ascii"> + 0 0.25 0 0.05 0.25 0 0 0.262165 0 0.05 0.262165 0 + 0.1 0.25 0 0.1 0.262165 0 0.15 0.25 0 0.15 0.262165 0 + 0.2 0.25 0 0.2 0.262165 0 0.25 0.25 0 0.25 0.262165 0 + 0.3 0.25 0 0.3 0.262165 0 0.35 0.25 0 0.35 0.262165 0 + 0.4 0.25 0 0.4 0.262165 0 0.45 0.25 0 0.45 0.262165 0 + 0.5 0.25 0 0.5 0.262165 0 0.55 0.25 0 0.55 0.262165 0 + 0.6 0.25 0 0.6 0.262165 0 0.65 0.25 0 0.65 0.262165 0 + 0.7 0.25 0 0.7 0.262165 0 0.75 0.25 0 0.75 0.262165 0 + 0 0.283454 0 0.05 0.283454 0 0.1 0.283454 0 0.15 0.283454 0 + 0.2 0.283454 0 0.25 0.283454 0 0.3 0.283454 0 0.35 0.283454 0 + 0.4 0.283454 0 0.45 0.283454 0 0.5 0.283454 0 0.55 0.283454 0 + 0.6 0.283454 0 0.65 0.283454 0 0.7 0.283454 0 0.75 0.283454 0 + 0 0.320709 0 0.05 0.320709 0 0.1 0.320709 0 0.15 0.320709 0 + 0.2 0.320709 0 0.25 0.320709 0 0.3 0.320709 0 0.35 0.320709 0 + 0.4 0.320709 0 0.45 0.320709 0 0.5 0.320709 0 0.55 0.320709 0 + 0.6 0.320709 0 0.65 0.320709 0 0.7 0.320709 0 0.75 0.320709 0 + 0 0.385906 0 0.05 0.385906 0 0.1 0.385906 0 0.15 0.385906 0 + 0.2 0.385906 0 0.25 0.385906 0 0.3 0.385906 0 0.35 0.385906 0 + 0.4 0.385906 0 0.45 0.385906 0 0.5 0.385906 0 0.55 0.385906 0 + 0.6 0.385906 0 0.65 0.385906 0 0.7 0.385906 0 0.75 0.385906 0 + 0 0.5 0 0.05 0.5 0 0.1 0.5 0 0.15 0.5 0 + 0.2 0.5 0 0.25 0.5 0 0.3 0.5 0 0.35 0.5 0 + 0.4 0.5 0 0.45 0.5 0 0.5 0.5 0 0.55 0.5 0 + 0.6 0.5 0 0.65 0.5 0 0.7 0.5 0 0.75 0.5 0 + 0 0.614094 0 0.05 0.614094 0 0.1 0.614094 0 0.15 0.614094 0 + 0.2 0.614094 0 0.25 0.614094 0 0.3 0.614094 0 0.35 0.614094 0 + 0.4 0.614094 0 0.45 0.614094 0 0.5 0.614094 0 0.55 0.614094 0 + 0.6 0.614094 0 0.65 0.614094 0 0.7 0.614094 0 0.75 0.614094 0 + 0 0.679291 0 0.05 0.679291 0 0.1 0.679291 0 0.15 0.679291 0 + 0.2 0.679291 0 0.25 0.679291 0 0.3 0.679291 0 0.35 0.679291 0 + 0.4 0.679291 0 0.45 0.679291 0 0.5 0.679291 0 0.55 0.679291 0 + 0.6 0.679291 0 0.65 0.679291 0 0.7 0.679291 0 0.75 0.679291 0 + 0 0.716546 0 0.05 0.716546 0 0.1 0.716546 0 0.15 0.716546 0 + 0.2 0.716546 0 0.25 0.716546 0 0.3 0.716546 0 0.35 0.716546 0 + 0.4 0.716546 0 0.45 0.716546 0 0.5 0.716546 0 0.55 0.716546 0 + 0.6 0.716546 0 0.65 0.716546 0 0.7 0.716546 0 0.75 0.716546 0 + 0 0.737835 0 0.05 0.737835 0 0.1 0.737835 0 0.15 0.737835 0 + 0.2 0.737835 0 0.25 0.737835 0 0.3 0.737835 0 0.35 0.737835 0 + 0.4 0.737835 0 0.45 0.737835 0 0.5 0.737835 0 0.55 0.737835 0 + 0.6 0.737835 0 0.65 0.737835 0 0.7 0.737835 0 0.75 0.737835 0 + 0 0.75 0 0.05 0.75 0 0.1 0.75 0 0.15 0.75 0 + 0.2 0.75 0 0.25 0.75 0 0.3 0.75 0 0.35 0.75 0 + 0.4 0.75 0 0.45 0.75 0 0.5 0.75 0 0.55 0.75 0 + 0.6 0.75 0 0.65 0.75 0 0.7 0.75 0 0.75 0.75 0 + </DataArray> + </Points> + <Cells> + <DataArray type="Int32" Name="connectivity" NumberOfComponents="1" format="ascii"> + 0 1 3 2 1 4 5 3 4 6 7 5 + 6 8 9 7 8 10 11 9 10 12 13 11 + 12 14 15 13 14 16 17 15 16 18 19 17 + 18 20 21 19 20 22 23 21 22 24 25 23 + 24 26 27 25 26 28 29 27 28 30 31 29 + 2 3 33 32 3 5 34 33 5 7 35 34 + 7 9 36 35 9 11 37 36 11 13 38 37 + 13 15 39 38 15 17 40 39 17 19 41 40 + 19 21 42 41 21 23 43 42 23 25 44 43 + 25 27 45 44 27 29 46 45 29 31 47 46 + 32 33 49 48 33 34 50 49 34 35 51 50 + 35 36 52 51 36 37 53 52 37 38 54 53 + 38 39 55 54 39 40 56 55 40 41 57 56 + 41 42 58 57 42 43 59 58 43 44 60 59 + 44 45 61 60 45 46 62 61 46 47 63 62 + 48 49 65 64 49 50 66 65 50 51 67 66 + 51 52 68 67 52 53 69 68 53 54 70 69 + 54 55 71 70 55 56 72 71 56 57 73 72 + 57 58 74 73 58 59 75 74 59 60 76 75 + 60 61 77 76 61 62 78 77 62 63 79 78 + 64 65 81 80 65 66 82 81 66 67 83 82 + 67 68 84 83 68 69 85 84 69 70 86 85 + 70 71 87 86 71 72 88 87 72 73 89 88 + 73 74 90 89 74 75 91 90 75 76 92 91 + 76 77 93 92 77 78 94 93 78 79 95 94 + 80 81 97 96 81 82 98 97 82 83 99 98 + 83 84 100 99 84 85 101 100 85 86 102 101 + 86 87 103 102 87 88 104 103 88 89 105 104 + 89 90 106 105 90 91 107 106 91 92 108 107 + 92 93 109 108 93 94 110 109 94 95 111 110 + 96 97 113 112 97 98 114 113 98 99 115 114 + 99 100 116 115 100 101 117 116 101 102 118 117 + 102 103 119 118 103 104 120 119 104 105 121 120 + 105 106 122 121 106 107 123 122 107 108 124 123 + 108 109 125 124 109 110 126 125 110 111 127 126 + 112 113 129 128 113 114 130 129 114 115 131 130 + 115 116 132 131 116 117 133 132 117 118 134 133 + 118 119 135 134 119 120 136 135 120 121 137 136 + 121 122 138 137 122 123 139 138 123 124 140 139 + 124 125 141 140 125 126 142 141 126 127 143 142 + 128 129 145 144 129 130 146 145 130 131 147 146 + 131 132 148 147 132 133 149 148 133 134 150 149 + 134 135 151 150 135 136 152 151 136 137 153 152 + 137 138 154 153 138 139 155 154 139 140 156 155 + 140 141 157 156 141 142 158 157 142 143 159 158 + 144 145 161 160 145 146 162 161 146 147 163 162 + 147 148 164 163 148 149 165 164 149 150 166 165 + 150 151 167 166 151 152 168 167 152 153 169 168 + 153 154 170 169 154 155 171 170 155 156 172 171 + 156 157 173 172 157 158 174 173 158 159 175 174 + </DataArray> + <DataArray type="Int32" Name="offsets" NumberOfComponents="1" format="ascii"> + 4 8 12 16 20 24 28 32 36 40 44 48 + 52 56 60 64 68 72 76 80 84 88 92 96 + 100 104 108 112 116 120 124 128 132 136 140 144 + 148 152 156 160 164 168 172 176 180 184 188 192 + 196 200 204 208 212 216 220 224 228 232 236 240 + 244 248 252 256 260 264 268 272 276 280 284 288 + 292 296 300 304 308 312 316 320 324 328 332 336 + 340 344 348 352 356 360 364 368 372 376 380 384 + 388 392 396 400 404 408 412 416 420 424 428 432 + 436 440 444 448 452 456 460 464 468 472 476 480 + 484 488 492 496 500 504 508 512 516 520 524 528 + 532 536 540 544 548 552 556 560 564 568 572 576 + 580 584 588 592 596 600 + </DataArray> + <DataArray type="UInt8" Name="types" NumberOfComponents="1" format="ascii"> + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 + </DataArray> + </Cells> + </Piece> + </UnstructuredGrid> +</VTKFile> diff --git a/test/references/2cnizeroeq2p2cni-pm-reference.vtu b/test/references/2cnizeroeq2p2cni-pm-reference.vtu new file mode 100644 index 0000000000000000000000000000000000000000..f44c037b81f9177ed9e6d11d026ff7c3294c0588 --- /dev/null +++ b/test/references/2cnizeroeq2p2cni-pm-reference.vtu @@ -0,0 +1,174 @@ +<?xml version="1.0"?> +<VTKFile type="UnstructuredGrid" version="0.1" byte_order="LittleEndian"> + <UnstructuredGrid> + <Piece NumberOfCells="25" NumberOfPoints="36"> + <PointData Scalars="Sn" Vectors="velocityW"> + <DataArray type="Float32" Name="Sn" NumberOfComponents="1" format="ascii"> + 0.0750879 0.0750906 0.875107 0.874938 0.0750629 0.8746 0.0750438 0.874156 0.0750472 0.873755 0.0750519 0.873594 + 0.938627 0.9388 0.937982 0.937143 0.936472 0.93608 0.957838 0.96014 0.958001 0.955501 0.954155 0.953244 + 0.97054 0.979307 0.976986 0.971314 0.966526 0.963334 0.965619 1 1 0.984275 0.976549 0.96919 + </DataArray> + <DataArray type="Float32" Name="Sw" NumberOfComponents="1" format="ascii"> + 0.924912 0.924909 0.124893 0.125062 0.924937 0.1254 0.924956 0.125844 0.924953 0.126245 0.924948 0.126406 + 0.0613725 0.0611999 0.0620181 0.0628566 0.0635281 0.0639198 0.0421615 0.0398596 0.0419992 0.044499 0.0458449 0.046756 + 0.0294595 0.0206932 0.0230136 0.0286856 0.0334739 0.036666 0.0343812 0 0 0.0157249 0.0234506 0.0308099 + </DataArray> + <DataArray type="Float32" Name="pn" NumberOfComponents="1" format="ascii"> + 100007 100007 100004 100004 100006 100004 100006 100003 100006 100002 100006 100002 + 100004 100004 100003 100002 100001 100001 100005 100005 100001 100002 99999.6 99999.2 + 100005 100007 99997.8 100005 99997.5 99998.7 100005 100010 99993.7 100008 99995 99999.1 + </DataArray> + <DataArray type="Float32" Name="pw" NumberOfComponents="1" format="ascii"> + 98859.7 98859.7 97908.5 97908.8 98859.5 97909.2 98859.3 97909.8 98859.1 97910.5 98859 97910.7 + 97653.9 97652.3 97656.1 97660.6 97663.6 97665.5 97505.9 97481.9 97500.1 97525.3 97534.6 97542.2 + 97349.1 97174.5 97221.3 97335.9 97399.2 97440.2 97418.1 96325.4 96309.5 97016.2 97228.2 97363.4 + </DataArray> + <DataArray type="Float32" Name="pc" NumberOfComponents="1" format="ascii"> + 1146.91 1146.92 2095.7 2095.24 1146.85 2094.32 1146.8 2093.11 1146.81 2092.02 1146.82 2091.58 + 2350.55 2351.62 2346.57 2341.49 2337.47 2335.15 2499.36 2522.84 2500.96 2477.14 2464.99 2457.03 + 2656.29 2832.23 2776.46 2668.7 2598.33 2558.45 2586.5 3684.13 3684.13 2991.69 2766.87 2635.66 + </DataArray> + <DataArray type="Float32" Name="rhoW" NumberOfComponents="1" format="ascii"> + 997.055 997.055 997.114 997.117 997.055 997.121 997.055 997.12 997.055 997.112 997.055 997.108 + 997.323 997.376 997.435 997.452 997.382 997.319 997.534 997.788 997.973 998.118 997.924 997.598 + 997.554 998.08 998.351 998.719 998.52 997.669 997.668 997.756 998.682 999.103 999.057 997.504 + </DataArray> + <DataArray type="Float32" Name="rhoN" NumberOfComponents="1" format="ascii"> + 1.15435 1.15435 1.15541 1.15546 1.15435 1.15554 1.15435 1.15551 1.15434 1.15537 1.15434 1.15529 + 1.15935 1.16036 1.16148 1.16179 1.16042 1.15922 1.16345 1.16855 1.17241 1.17557 1.17134 1.16465 + 1.16383 1.1748 1.18081 1.18999 1.18487 1.16605 1.16611 1.17425 1.19112 1.20091 1.19934 1.16279 + </DataArray> + <DataArray type="Float32" Name="mobW" NumberOfComponents="1" format="ascii"> + 907.079 907.066 2.45157 2.46061 907.198 2.47902 907.289 2.50503 907.273 2.53001 907.251 2.54044 + 0.291851 0.287916 0.298081 0.309989 0.3223 0.330315 0.0894122 0.0729038 0.0843765 0.0996158 0.11178 0.122983 + 0.0278011 0.00763081 0.0108525 0.0221623 0.0380559 0.0564579 0.0458204 0 0 0.00229257 0.0104817 0.0324517 + </DataArray> + <DataArray type="Float32" Name="mobN" NumberOfComponents="1" format="ascii"> + 242.962 242.983 45242 45227.3 242.768 45197.6 242.621 45156.2 242.647 45117.1 242.684 45101 + 51931.4 51970.2 51900.7 51812.5 51710.4 51643.1 53991.8 54304.6 54197.3 54033.4 53812.4 53583.1 + 55016.8 55761.1 55786.9 55666.3 55200.9 54524.3 54706.7 55575.2 56337.7 56602.8 56223.1 54903.3 + </DataArray> + <DataArray type="Float32" Name="X_liquid^H2O" NumberOfComponents="1" format="ascii"> + 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 + 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999977 0.999977 0.999977 0.999977 0.999978 + 0.999978 0.999977 0.999976 0.999975 0.999976 0.999977 0.999977 0.452322 0.745811 0.999974 0.999974 0.999978 + </DataArray> + <DataArray type="Float32" Name="X_liquid^Air" NumberOfComponents="1" format="ascii"> + 2.15483e-05 2.15483e-05 2.16354e-05 2.16394e-05 2.15483e-05 2.16463e-05 2.15482e-05 2.1644e-05 2.15482e-05 2.1633e-05 2.15482e-05 2.16266e-05 + 2.19593e-05 2.20444e-05 2.21408e-05 2.21677e-05 2.20522e-05 2.19511e-05 2.23077e-05 2.27596e-05 2.31174e-05 2.3416e-05 2.30191e-05 2.24169e-05 + 2.23408e-05 2.3338e-05 2.39345e-05 2.48871e-05 2.43496e-05 2.25407e-05 2.25412e-05 2.30241e-05 2.49001e-05 2.61252e-05 2.59543e-05 2.22553e-05 + </DataArray> + <DataArray type="Float32" Name="X_gas^H2O" NumberOfComponents="1" format="ascii"> + 0.0199555 0.0199556 0.0196794 0.0196667 0.0199556 0.0196451 0.0199556 0.0196518 0.0199557 0.019686 0.0199557 0.0197058 + 0.0187047 0.0184602 0.018189 0.0181141 0.0184367 0.0187266 0.0177352 0.0165855 0.015752 0.0151054 0.0159738 0.0174441 + 0.017647 0.015272 0.0140715 0.0124361 0.0133201 0.0171252 0.0171265 0.00754476 0.00939182 0.0107062 0.0109197 0.0178733 + </DataArray> + <DataArray type="Float32" Name="X_gas^Air" NumberOfComponents="1" format="ascii"> + 0.980044 0.980044 0.980321 0.980333 0.980044 0.980355 0.980044 0.980348 0.980044 0.980314 0.980044 0.980294 + 0.981295 0.98154 0.981811 0.981886 0.981563 0.981273 0.982265 0.983414 0.984248 0.984895 0.984026 0.982556 + 0.982353 0.984728 0.985929 0.987564 0.98668 0.982875 0.982873 0.992455 0.990608 0.989294 0.98908 0.982127 + </DataArray> + <DataArray type="Float32" Name="x_liquid^H2O" NumberOfComponents="1" format="ascii"> + 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 + 0.999986 0.999986 0.999986 0.999986 0.999986 0.999986 0.999986 0.999986 0.999986 0.999985 0.999986 0.999986 + 0.999986 0.999985 0.999985 0.999985 0.999985 0.999986 0.999986 0.45233 0.745821 0.999984 0.999984 0.999986 + </DataArray> + <DataArray type="Float32" Name="x_liquid^Air" NumberOfComponents="1" format="ascii"> + 1.34047e-05 1.34047e-05 1.34589e-05 1.34614e-05 1.34047e-05 1.34656e-05 1.34046e-05 1.34642e-05 1.34046e-05 1.34574e-05 1.34046e-05 1.34534e-05 + 1.36603e-05 1.37133e-05 1.37733e-05 1.379e-05 1.37182e-05 1.36553e-05 1.38771e-05 1.41582e-05 1.43808e-05 1.45665e-05 1.43196e-05 1.3945e-05 + 1.38977e-05 1.4518e-05 1.48891e-05 1.54817e-05 1.51473e-05 1.40221e-05 1.40224e-05 1.43229e-05 1.54899e-05 1.62519e-05 1.61456e-05 1.38445e-05 + </DataArray> + <DataArray type="Float32" Name="x_gas^H2O" NumberOfComponents="1" format="ascii"> + 0.0316949 0.031695 0.0312615 0.0312416 0.031695 0.0312076 0.0316951 0.0312182 0.0316952 0.0312718 0.0316952 0.031303 + 0.0297306 0.0293463 0.0289198 0.028802 0.0293094 0.0297651 0.028206 0.0263958 0.0250819 0.0240615 0.0254316 0.0277479 + 0.0280673 0.0243246 0.0224286 0.0198415 0.0212407 0.0272459 0.0272479 0.0120731 0.015012 0.0170994 0.0174381 0.0284233 + </DataArray> + <DataArray type="Float32" Name="x_gas^Air" NumberOfComponents="1" format="ascii"> + 0.968305 0.968305 0.968739 0.968758 0.968305 0.968792 0.968305 0.968782 0.968305 0.968728 0.968305 0.968697 + 0.970269 0.970654 0.97108 0.971198 0.970691 0.970235 0.971794 0.973604 0.974918 0.975938 0.974568 0.972252 + 0.971933 0.975675 0.977571 0.980159 0.978759 0.972754 0.972752 0.987927 0.984988 0.982901 0.982562 0.971577 + </DataArray> + <DataArray type="Float32" Name="porosity" NumberOfComponents="1" format="ascii"> + 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 + 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 + 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 + </DataArray> + <DataArray type="Float32" Name="temperature" NumberOfComponents="1" format="ascii"> + 298.15 298.15 297.919 297.908 298.15 297.89 298.15 297.895 298.15 297.924 298.15 297.941 + 297.081 296.864 296.621 296.553 296.843 297.099 296.208 295.116 294.281 293.607 294.507 295.937 + 296.126 293.784 292.473 290.52 291.602 295.636 295.638 295.299 290.745 288.19 288.493 296.334 + </DataArray> + <DataArray type="Float32" Name="phase presence" NumberOfComponents="1" format="ascii"> + 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 2 2 3 3 3 + </DataArray> + <DataArray type="Float32" Name="velocityW" NumberOfComponents="3" format="ascii"> + -1.13827e-08 -9.38867e-07 0 -2.02936e-08 -9.43886e-07 0 3.67637e-10 -6.9645e-07 0 -4.89952e-09 -6.95475e-07 0 + -3.32727e-08 -9.54168e-07 0 -1.1732e-08 -7.10208e-07 0 -3.44622e-08 -9.68821e-07 0 -1.22953e-08 -7.29101e-07 0 + -2.19662e-08 -9.83091e-07 0 -8.49334e-09 -7.47566e-07 0 -1.23489e-08 -9.89044e-07 0 -5.69332e-09 -7.57778e-07 0 + 6.46854e-09 -2.94085e-07 0 -8.5928e-10 -2.75075e-07 0 -9.47256e-09 -2.95962e-07 0 -8.4042e-09 -3.25321e-07 0 + -5.12068e-09 -3.49662e-07 0 -4.19098e-09 -3.6815e-07 0 1.89538e-08 -6.94712e-08 0 5.01846e-09 -1.6798e-08 0 + -1.33765e-08 -2.99025e-08 0 -1.34456e-08 -8.18932e-08 0 -8.12791e-09 -1.10338e-07 0 -7.20068e-09 -1.39335e-07 0 + 3.98571e-08 1.01552e-08 0 1.89117e-08 8.65335e-08 0 -1.14392e-08 1.16956e-07 0 -1.79959e-08 6.05178e-08 0 + -1.48476e-08 7.61521e-09 0 -1.4548e-08 -4.10402e-08 0 2.09619e-07 2.51157e-08 0 1.04809e-07 1.03575e-07 0 + -3.39414e-09 1.68041e-07 0 -8.24859e-09 1.23561e-07 0 -1.44586e-08 4.8624e-08 0 -1.92083e-08 -1.31981e-08 0 + </DataArray> + <DataArray type="Float32" Name="velocityN" NumberOfComponents="3" format="ascii"> + 1.39233e-07 6.47251e-07 0 2.4638e-07 7.19854e-07 0 5.75125e-05 -9.52283e-05 0 9.57313e-05 -6.36067e-05 0 + 3.88318e-07 8.84205e-07 0 0.00013264 -1.45967e-06 0 3.78512e-07 1.06416e-06 0 0.000122537 1.91172e-05 0 + 2.30399e-07 1.19748e-06 0 8.0125e-05 5.83971e-05 0 1.26884e-07 1.25052e-06 0 4.65057e-05 7.91642e-05 0 + 0.000138223 -0.000329088 0 0.000268815 -0.000246146 0 0.000254242 0.000119787 0 0.000208719 -4.34298e-05 0 + 0.000208455 0.000207451 0 0.000108549 0.000265968 0 7.57763e-05 -0.000522431 0 0.00062318 -0.000653991 0 + 0.000326743 0.000691165 0 0.000188181 -0.000491347 0 0.000475768 0.000521091 0 5.80777e-05 0.000417074 0 + -0.000471595 -0.000435573 0 0.00112488 -0.00143926 0 0.000312129 0.00189921 0 2.83532e-05 -0.00151907 0 + 0.000886834 0.00113801 0 -0.000380138 0.000346331 0 -0.00119016 -0.000293355 0 0.00149089 -0.0019349 0 + 0.000224842 0.00265946 0 -0.000144805 -0.00217949 0 0.0012347 0.00153314 0 -0.000963249 0.000233374 0 + </DataArray> + </PointData> + <CellData Scalars="process rank"> + <DataArray type="Float32" Name="process rank" NumberOfComponents="1" format="ascii"> + 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 + </DataArray> + </CellData> + <Points> + <DataArray type="Float32" Name="Coordinates" NumberOfComponents="3" format="ascii"> + 0.25 0 0 0.3 0 0 0.25 0.114094 0 0.3 0.114094 0 + 0.35 0 0 0.35 0.114094 0 0.4 0 0 0.4 0.114094 0 + 0.45 0 0 0.45 0.114094 0 0.5 0 0 0.5 0.114094 0 + 0.25 0.179291 0 0.3 0.179291 0 0.35 0.179291 0 0.4 0.179291 0 + 0.45 0.179291 0 0.5 0.179291 0 0.25 0.216546 0 0.3 0.216546 0 + 0.35 0.216546 0 0.4 0.216546 0 0.45 0.216546 0 0.5 0.216546 0 + 0.25 0.237835 0 0.3 0.237835 0 0.35 0.237835 0 0.4 0.237835 0 + 0.45 0.237835 0 0.5 0.237835 0 0.25 0.25 0 0.3 0.25 0 + 0.35 0.25 0 0.4 0.25 0 0.45 0.25 0 0.5 0.25 0 + </DataArray> + </Points> + <Cells> + <DataArray type="Int32" Name="connectivity" NumberOfComponents="1" format="ascii"> + 0 1 3 2 1 4 5 3 4 6 7 5 + 6 8 9 7 8 10 11 9 2 3 13 12 + 3 5 14 13 5 7 15 14 7 9 16 15 + 9 11 17 16 12 13 19 18 13 14 20 19 + 14 15 21 20 15 16 22 21 16 17 23 22 + 18 19 25 24 19 20 26 25 20 21 27 26 + 21 22 28 27 22 23 29 28 24 25 31 30 + 25 26 32 31 26 27 33 32 27 28 34 33 + 28 29 35 34 + </DataArray> + <DataArray type="Int32" Name="offsets" NumberOfComponents="1" format="ascii"> + 4 8 12 16 20 24 28 32 36 40 44 48 + 52 56 60 64 68 72 76 80 84 88 92 96 + 100 + </DataArray> + <DataArray type="UInt8" Name="types" NumberOfComponents="1" format="ascii"> + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 + </DataArray> + </Cells> + </Piece> + </UnstructuredGrid> +</VTKFile> diff --git a/test/references/2czeroeq2p2c-ff-reference.vtu b/test/references/2czeroeq2p2c-ff-reference.vtu new file mode 100644 index 0000000000000000000000000000000000000000..eff1e3a54112e29b1c66108dc71d98fb5ff11d2b --- /dev/null +++ b/test/references/2czeroeq2p2c-ff-reference.vtu @@ -0,0 +1,258 @@ +<?xml version="1.0"?> +<VTKFile type="UnstructuredGrid" version="0.1" byte_order="LittleEndian"> + <UnstructuredGrid> + <Piece NumberOfCells="140" NumberOfPoints="165"> + <PointData Scalars="P" Vectors="v"> + <DataArray type="Float32" Name="P" NumberOfComponents="1" format="ascii"> + 100013 99987.5 100013 99987.5 100012 100012 99989.5 99989.5 100009 100009 99991.8 99991.4 + 100004 100006 99995.2 99993.9 100002 100003 99997.4 99996.6 100000 100000 100017 99986.2 + 100012 99989.1 100009 99991.6 100004 99994.8 100002 99997.1 100000 100016 99986.1 100012 + 99988.9 100009 99991.3 100006 99993.7 100003 99996.4 100000 100016 99985.8 100012 99988.7 + 100009 99991.4 100005 99994.3 100003 99996.8 100000 100016 99985.9 100013 99988.6 100009 + 99991.2 100006 99993.6 100003 99996.2 100000 100016 99985.6 100012 99988.5 100009 99991.2 + 100006 99994 100003 99996.5 100000 100016 99985.8 100013 99988.5 100010 99991.1 100007 + 99993.6 100003 99996.1 100000 100015 99985.6 100013 99988.4 100009 99991.1 100006 99993.8 + 100003 99996.3 100000 100016 99985.9 100013 99988.6 100010 99991.2 100006 99993.7 100003 + 99996.2 100000 100016 99985.6 100013 99988.5 100009 99991.1 100006 99993.7 100003 99996.3 + 100000 100016 99986.2 100013 99988.9 100009 99991.5 100006 99993.9 100003 99996.4 100000 + 100017 99985.9 100013 99988.9 100009 99991.5 100006 99994 100003 99996.4 100000 100014 + 99988.8 100011 99990.3 100008 99992.3 100005 99994.4 100003 99996.8 100000 100014 99988.8 + 100011 99990.2 100008 99992.2 100005 99994.4 100003 99996.7 100000 + </DataArray> + <DataArray type="Float32" Name="delP" NumberOfComponents="1" format="ascii"> + 12.7076 -12.4945 12.7147 -12.4873 11.5107 11.5158 -10.5338 -10.5425 8.73663 8.82835 -8.18645 -8.55845 + 3.71356 6.01525 -4.74737 -6.10381 2.06491 3.03852 -2.64549 -3.44214 0 0 17.0914 -13.8383 + 12.1097 -10.8542 8.76432 -8.37632 4.4706 -5.18672 2.29655 -2.85157 0 16.3375 -13.8691 12.3292 + -11.076 9.14511 -8.69825 6.32756 -6.2847 3.16635 -3.64969 0 15.9681 -14.1798 12.4226 -11.2617 + 8.97967 -8.61866 5.23928 -5.70375 2.62092 -3.25249 0 15.8914 -14.1375 12.5676 -11.3627 9.39897 + -8.82097 6.47907 -6.38522 3.25645 -3.81512 0 15.6062 -14.3606 12.4863 -11.4896 9.17212 -8.80719 + 5.734 -6.04666 2.861 -3.53865 0 15.7283 -14.2093 12.6345 -11.4624 9.5261 -8.87624 6.51486 + -6.40337 3.28666 -3.87781 0 15.4858 -14.4277 12.5174 -11.5889 9.30705 -8.90985 6.02325 -6.23511 + 3.01126 -3.70012 0 15.8087 -14.1284 12.6719 -11.3985 9.53782 -8.81664 6.4479 -6.32766 3.24639 + -3.82553 0 15.5736 -14.3812 12.6133 -11.5458 9.36205 -8.87881 6.12033 -6.26005 3.04599 -3.72436 + 0 16.2371 -13.7486 12.6555 -11.0583 9.35481 -8.53976 6.20458 -6.09135 3.08707 -3.63627 0 + 16.8246 -14.0623 12.6584 -11.1259 9.10147 -8.52942 5.87792 -6.01484 2.8939 -3.61811 0 14.0211 + -11.1779 11.285 -9.69386 8.39836 -7.73738 5.49217 -5.58777 2.66224 -3.24038 0 13.9475 -11.2514 + 11.2436 -9.77022 8.35548 -7.79895 5.45528 -5.63374 2.63353 -3.28055 0 + </DataArray> + <DataArray type="Float32" Name="X^H2O" NumberOfComponents="1" format="ascii"> + 0.008 0.00639858 0.00884764 0.00866148 0.00568373 0.00850738 0.00475249 0.00828663 0.00388155 0.00802916 0.00354285 0.00780191 + 0.00561738 0.00776443 0.00701838 0.007743 0.00815446 0.00774103 0.00940333 0.00779163 0.0199569 0.00888273 0.00758332 0.00769322 + 0.00774766 0.00779033 0.0078032 0.00779355 0.0077811 0.00776858 0.00775815 0.00775621 0.00819061 0.00752683 0.00754476 0.0075634 + 0.0075875 0.00760789 0.00762438 0.00763296 0.00764089 0.00764682 0.00765974 0.00799899 0.00756122 0.00756113 0.00756274 0.0075666 + 0.00757175 0.00757794 0.00758306 0.00758864 0.00759415 0.00760953 0.00789157 0.00758727 0.00758609 0.00758514 0.00758443 0.00758434 + 0.00758484 0.00758576 0.00758707 0.00758924 0.00760374 0.00790229 0.00760326 0.00760237 0.00760149 0.00760055 0.00759976 0.00759909 + 0.0075987 0.00759846 0.00759931 0.00761493 0.00791603 0.00761129 0.00761075 0.00761018 0.00760955 0.00760896 0.00760838 0.0076079 + 0.00760756 0.00760848 0.0076266 0.00793841 0.00761523 0.00761435 0.0076136 0.00761294 0.00761243 0.00761204 0.00761182 0.00761183 + 0.00761333 0.00763434 0.00794521 0.00761071 0.00761049 0.00761036 0.00761041 0.00761072 0.00761134 0.00761227 0.00761359 0.00761624 + 0.00763889 0.00794919 0.00760424 0.00760393 0.00760459 0.00760631 0.00760889 0.00761242 0.00761642 0.00762111 0.00762659 0.0076476 + 0.00795234 0.00757301 0.00758345 0.0075951 0.00760946 0.00762337 0.00763827 0.00765176 0.00766519 0.00767758 0.00770162 0.00800484 + 0.00761882 0.00767841 0.00772312 0.00776918 0.00780216 0.00783126 0.00785091 0.00786636 0.00787653 0.00789583 0.00820428 0.00891555 + 0.00884878 0.00878432 0.00870188 0.00862544 0.00853867 0.00846084 0.00837967 0.00830662 0.00825266 0.00872767 0.008 0.00733974 + 0.0068826 0.00631456 0.0059062 0.00548498 0.00517694 0.00489343 0.00467724 0.0044644 0.008 + </DataArray> + <DataArray type="Float32" Name="rho" NumberOfComponents="1" format="ascii"> + 1.16273 1.16356 1.16213 1.16197 1.16435 1.16236 1.16475 1.16226 1.16559 1.16266 1.16563 1.16262 + 1.1643 1.16282 1.16322 1.16269 1.1625 1.1628 1.16157 1.16269 1.15424 1.16196 1.16307 1.16264 + 1.1629 1.1626 1.16282 1.16263 1.16279 1.16268 1.16278 1.16272 1.16245 1.1631 1.16274 1.16303 + 1.16274 1.16296 1.16274 1.16291 1.16276 1.16287 1.16278 1.16258 1.16308 1.16273 1.16303 1.16276 + 1.16299 1.16278 1.16294 1.1628 1.1629 1.16282 1.16266 1.16306 1.16271 1.16302 1.16274 1.16298 + 1.16277 1.16295 1.1628 1.16291 1.16282 1.16265 1.16304 1.16269 1.16301 1.16273 1.16297 1.16276 + 1.16293 1.16279 1.1629 1.16281 1.16264 1.16304 1.16269 1.163 1.16272 1.16297 1.16275 1.16293 + 1.16278 1.16289 1.1628 1.16262 1.16303 1.16268 1.163 1.16272 1.16296 1.16275 1.16292 1.16278 + 1.16289 1.1628 1.16262 1.16304 1.16269 1.163 1.16272 1.16297 1.16275 1.16293 1.16278 1.16289 + 1.16279 1.16262 1.16304 1.16269 1.16301 1.16272 1.16297 1.16275 1.16292 1.16278 1.16288 1.16279 + 1.16261 1.16307 1.16271 1.16301 1.16273 1.16296 1.16274 1.1629 1.16275 1.16284 1.16275 1.16258 + 1.16305 1.16264 1.16292 1.16261 1.16283 1.1626 1.16275 1.16261 1.1627 1.16261 1.16244 1.1621 + 1.16186 1.16216 1.16198 1.16224 1.16211 1.16232 1.16225 1.1624 1.16237 1.16207 1.16274 1.16291 + 1.1635 1.16365 1.16415 1.16426 1.16463 1.1647 1.16495 1.16503 1.16258 + </DataArray> + <DataArray type="Float32" Name="mu" NumberOfComponents="1" format="ascii"> + 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 + 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 + 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 + 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 + 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 + 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 + 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 + 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 + 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 + 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 + 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 + 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 + 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 + 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 1.82387e-05 + </DataArray> + <DataArray type="Float32" Name="v" NumberOfComponents="3" format="ascii"> + 0 0 0 0 0 0 3.5 0 0 3.52261 0.133439 0 + 0 0 0 3.10318 0.0397147 0 0 0 0 3.32717 0.0969562 0 + 0 0 0 2.78192 0.0977522 0 0 0 0 3.06062 0.102388 0 + -0.115849 -0.00175612 0 2.55383 -0.0717298 0 0.32921 0.00308935 0 2.90739 0.0240212 0 + -0.112088 -0.0019973 0 2.42871 -0.0148873 0 0.383762 0.0016687 0 2.78055 0.0462522 0 + -0.416799 -0.00103634 0 2.21883 0.147873 0 3.5 0 0 3.97611 0.135411 0 + 3.63171 0.0331452 0 3.96465 0.105193 0 3.62018 0.0667938 0 3.99838 0.0771861 0 + 3.62136 0.0251646 0 3.85319 0.0462281 0 3.53092 0.029934 0 3.75459 0.0704872 0 + 3.46606 0.162208 0 3.5 0 0 3.96827 0.0929385 0 3.64746 0.0569344 0 + 4.0091 0.115685 0 3.73122 0.0926953 0 4.0703 0.103988 0 3.78528 -0.00884531 0 + 4.09312 0.0518312 0 3.80518 0.0221414 0 4.10276 0.0843086 0 3.86436 0.101274 0 + 3.5 0 0 3.91554 0.0540075 0 3.58704 0.0297174 0 3.97234 0.0668087 0 + 3.68263 0.0384946 0 4.07347 0.0504149 0 3.76906 0.0303677 0 4.06877 0.0404479 0 + 3.80092 0.032808 0 4.09855 0.0586242 0 3.8703 0.0664113 0 3.5 0 0 + 3.88719 0.0369148 0 3.56405 0.0374395 0 3.93426 0.0664135 0 3.6435 0.0470753 0 + 3.99244 0.0581781 0 3.71145 -0.00316295 0 4.05398 0.0303077 0 3.77579 0.0104698 0 + 4.11531 0.0473784 0 3.85955 0.0566774 0 3.5 0 0 3.86659 0.0129515 0 + 3.53694 0.00779407 0 3.9143 0.0182623 0 3.61177 0.00450286 0 3.9875 0.00911529 0 + 3.68695 0.00574065 0 4.017 0.00687795 0 3.73889 0.00457519 0 4.06504 0.0128807 0 + 3.81561 0.015201 0 3.5 0 0 3.85981 0.0108036 0 3.53731 0.0102988 0 + 3.90102 0.0195087 0 3.60194 0.00621148 0 3.95428 0.00999858 0 3.66873 -0.0207267 0 + 4.02149 -0.00651645 0 3.74162 -0.0182141 0 4.09276 -0.00166231 0 3.82756 0.0015045 0 + 3.5 0 0 3.85133 -0.0120295 0 3.52373 -0.0193841 0 3.89305 -0.0279505 0 + 3.58843 -0.0318146 0 3.95588 -0.0377894 0 3.65991 -0.0330108 0 4.00349 -0.0399422 0 + 3.7231 -0.0381885 0 4.06268 -0.0436643 0 3.80329 -0.0466272 0 3.5 0 0 + 3.86121 -0.00870985 0 3.54081 -0.0211788 0 3.9056 -0.0295636 0 3.60759 -0.0375571 0 + 3.96355 -0.0447559 0 3.6795 -0.0556996 0 4.03222 -0.056937 0 3.75518 -0.0612776 0 + 4.1044 -0.061733 0 3.83627 -0.0653025 0 3.5 0 0 3.85782 -0.0444244 0 + 3.53418 -0.0548395 0 3.90939 -0.0852571 0 3.61127 -0.0779007 0 3.97607 -0.0981892 0 + 3.69005 -0.083874 0 4.03606 -0.100417 0 3.7624 -0.0928305 0 4.10025 -0.107962 0 + 3.83348 -0.114762 0 3.5 0 0 3.91481 -0.0504797 0 3.60303 -0.0663328 0 + 3.97994 -0.102633 0 3.69545 -0.0925367 0 4.04625 -0.11732 0 3.77283 -0.106078 0 + 4.10656 -0.122519 0 3.83404 -0.115238 0 4.15444 -0.123512 0 3.88891 -0.132938 0 + 3.5 0 0 3.93779 -0.160023 0 3.62328 -0.102881 0 3.99174 -0.179873 0 + 3.69479 -0.132112 0 4.02409 -0.172299 0 3.72755 -0.132414 0 4.02713 -0.154781 0 + 3.7226 -0.129947 0 4.0036 -0.151507 0 3.69493 -0.169734 0 3.5 0 0 + 3.66153 -0.162261 0 3.33193 -0.0838218 0 3.51551 -0.151727 0 3.13615 -0.0987867 0 + 3.34681 -0.129778 0 2.94834 -0.0922446 0 3.18652 -0.103511 0 2.7813 -0.0786421 0 + 3.0359 -0.096603 0 2.61508 -0.0181357 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 + </DataArray> + </PointData> + <Points> + <DataArray type="Float32" Name="Coordinates" NumberOfComponents="3" format="ascii"> + 0 0.25 0 0.05 0.25 0 0 0.267873 0 0.05 0.267873 0 + 0.1 0.25 0 0.1 0.267873 0 0.15 0.25 0 0.15 0.267873 0 + 0.2 0.25 0 0.2 0.267873 0 0.25 0.25 0 0.25 0.267873 0 + 0.3 0.25 0 0.3 0.267873 0 0.35 0.25 0 0.35 0.267873 0 + 0.4 0.25 0 0.4 0.267873 0 0.45 0.25 0 0.45 0.267873 0 + 0.5 0.25 0 0.5 0.267873 0 0 0.287534 0 0.05 0.287534 0 + 0.1 0.287534 0 0.15 0.287534 0 0.2 0.287534 0 0.25 0.287534 0 + 0.3 0.287534 0 0.35 0.287534 0 0.4 0.287534 0 0.45 0.287534 0 + 0.5 0.287534 0 0 0.30916 0 0.05 0.30916 0 0.1 0.30916 0 + 0.15 0.30916 0 0.2 0.30916 0 0.25 0.30916 0 0.3 0.30916 0 + 0.35 0.30916 0 0.4 0.30916 0 0.45 0.30916 0 0.5 0.30916 0 + 0 0.332949 0 0.05 0.332949 0 0.1 0.332949 0 0.15 0.332949 0 + 0.2 0.332949 0 0.25 0.332949 0 0.3 0.332949 0 0.35 0.332949 0 + 0.4 0.332949 0 0.45 0.332949 0 0.5 0.332949 0 0 0.359117 0 + 0.05 0.359117 0 0.1 0.359117 0 0.15 0.359117 0 0.2 0.359117 0 + 0.25 0.359117 0 0.3 0.359117 0 0.35 0.359117 0 0.4 0.359117 0 + 0.45 0.359117 0 0.5 0.359117 0 0 0.387902 0 0.05 0.387902 0 + 0.1 0.387902 0 0.15 0.387902 0 0.2 0.387902 0 0.25 0.387902 0 + 0.3 0.387902 0 0.35 0.387902 0 0.4 0.387902 0 0.45 0.387902 0 + 0.5 0.387902 0 0 0.419565 0 0.05 0.419565 0 0.1 0.419565 0 + 0.15 0.419565 0 0.2 0.419565 0 0.25 0.419565 0 0.3 0.419565 0 + 0.35 0.419565 0 0.4 0.419565 0 0.45 0.419565 0 0.5 0.419565 0 + 0 0.454395 0 0.05 0.454395 0 0.1 0.454395 0 0.15 0.454395 0 + 0.2 0.454395 0 0.25 0.454395 0 0.3 0.454395 0 0.35 0.454395 0 + 0.4 0.454395 0 0.45 0.454395 0 0.5 0.454395 0 0 0.492708 0 + 0.05 0.492708 0 0.1 0.492708 0 0.15 0.492708 0 0.2 0.492708 0 + 0.25 0.492708 0 0.3 0.492708 0 0.35 0.492708 0 0.4 0.492708 0 + 0.45 0.492708 0 0.5 0.492708 0 0 0.534851 0 0.05 0.534851 0 + 0.1 0.534851 0 0.15 0.534851 0 0.2 0.534851 0 0.25 0.534851 0 + 0.3 0.534851 0 0.35 0.534851 0 0.4 0.534851 0 0.45 0.534851 0 + 0.5 0.534851 0 0 0.58121 0 0.05 0.58121 0 0.1 0.58121 0 + 0.15 0.58121 0 0.2 0.58121 0 0.25 0.58121 0 0.3 0.58121 0 + 0.35 0.58121 0 0.4 0.58121 0 0.45 0.58121 0 0.5 0.58121 0 + 0 0.632204 0 0.05 0.632204 0 0.1 0.632204 0 0.15 0.632204 0 + 0.2 0.632204 0 0.25 0.632204 0 0.3 0.632204 0 0.35 0.632204 0 + 0.4 0.632204 0 0.45 0.632204 0 0.5 0.632204 0 0 0.688297 0 + 0.05 0.688297 0 0.1 0.688297 0 0.15 0.688297 0 0.2 0.688297 0 + 0.25 0.688297 0 0.3 0.688297 0 0.35 0.688297 0 0.4 0.688297 0 + 0.45 0.688297 0 0.5 0.688297 0 0 0.75 0 0.05 0.75 0 + 0.1 0.75 0 0.15 0.75 0 0.2 0.75 0 0.25 0.75 0 + 0.3 0.75 0 0.35 0.75 0 0.4 0.75 0 0.45 0.75 0 + 0.5 0.75 0 + </DataArray> + </Points> + <Cells> + <DataArray type="Int32" Name="connectivity" NumberOfComponents="1" format="ascii"> + 0 1 3 2 1 4 5 3 4 6 7 5 + 6 8 9 7 8 10 11 9 10 12 13 11 + 12 14 15 13 14 16 17 15 16 18 19 17 + 18 20 21 19 2 3 23 22 3 5 24 23 + 5 7 25 24 7 9 26 25 9 11 27 26 + 11 13 28 27 13 15 29 28 15 17 30 29 + 17 19 31 30 19 21 32 31 22 23 34 33 + 23 24 35 34 24 25 36 35 25 26 37 36 + 26 27 38 37 27 28 39 38 28 29 40 39 + 29 30 41 40 30 31 42 41 31 32 43 42 + 33 34 45 44 34 35 46 45 35 36 47 46 + 36 37 48 47 37 38 49 48 38 39 50 49 + 39 40 51 50 40 41 52 51 41 42 53 52 + 42 43 54 53 44 45 56 55 45 46 57 56 + 46 47 58 57 47 48 59 58 48 49 60 59 + 49 50 61 60 50 51 62 61 51 52 63 62 + 52 53 64 63 53 54 65 64 55 56 67 66 + 56 57 68 67 57 58 69 68 58 59 70 69 + 59 60 71 70 60 61 72 71 61 62 73 72 + 62 63 74 73 63 64 75 74 64 65 76 75 + 66 67 78 77 67 68 79 78 68 69 80 79 + 69 70 81 80 70 71 82 81 71 72 83 82 + 72 73 84 83 73 74 85 84 74 75 86 85 + 75 76 87 86 77 78 89 88 78 79 90 89 + 79 80 91 90 80 81 92 91 81 82 93 92 + 82 83 94 93 83 84 95 94 84 85 96 95 + 85 86 97 96 86 87 98 97 88 89 100 99 + 89 90 101 100 90 91 102 101 91 92 103 102 + 92 93 104 103 93 94 105 104 94 95 106 105 + 95 96 107 106 96 97 108 107 97 98 109 108 + 99 100 111 110 100 101 112 111 101 102 113 112 + 102 103 114 113 103 104 115 114 104 105 116 115 + 105 106 117 116 106 107 118 117 107 108 119 118 + 108 109 120 119 110 111 122 121 111 112 123 122 + 112 113 124 123 113 114 125 124 114 115 126 125 + 115 116 127 126 116 117 128 127 117 118 129 128 + 118 119 130 129 119 120 131 130 121 122 133 132 + 122 123 134 133 123 124 135 134 124 125 136 135 + 125 126 137 136 126 127 138 137 127 128 139 138 + 128 129 140 139 129 130 141 140 130 131 142 141 + 132 133 144 143 133 134 145 144 134 135 146 145 + 135 136 147 146 136 137 148 147 137 138 149 148 + 138 139 150 149 139 140 151 150 140 141 152 151 + 141 142 153 152 143 144 155 154 144 145 156 155 + 145 146 157 156 146 147 158 157 147 148 159 158 + 148 149 160 159 149 150 161 160 150 151 162 161 + 151 152 163 162 152 153 164 163 + </DataArray> + <DataArray type="Int32" Name="offsets" NumberOfComponents="1" format="ascii"> + 4 8 12 16 20 24 28 32 36 40 44 48 + 52 56 60 64 68 72 76 80 84 88 92 96 + 100 104 108 112 116 120 124 128 132 136 140 144 + 148 152 156 160 164 168 172 176 180 184 188 192 + 196 200 204 208 212 216 220 224 228 232 236 240 + 244 248 252 256 260 264 268 272 276 280 284 288 + 292 296 300 304 308 312 316 320 324 328 332 336 + 340 344 348 352 356 360 364 368 372 376 380 384 + 388 392 396 400 404 408 412 416 420 424 428 432 + 436 440 444 448 452 456 460 464 468 472 476 480 + 484 488 492 496 500 504 508 512 516 520 524 528 + 532 536 540 544 548 552 556 560 + </DataArray> + <DataArray type="UInt8" Name="types" NumberOfComponents="1" format="ascii"> + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 + </DataArray> + </Cells> + </Piece> + </UnstructuredGrid> +</VTKFile> diff --git a/test/references/2czeroeq2p2c-pm-reference.vtu b/test/references/2czeroeq2p2c-pm-reference.vtu new file mode 100644 index 0000000000000000000000000000000000000000..23a98f9b68b350a6e99a3e3dfba4cb728f043df1 --- /dev/null +++ b/test/references/2czeroeq2p2c-pm-reference.vtu @@ -0,0 +1,277 @@ +<?xml version="1.0"?> +<VTKFile type="UnstructuredGrid" version="0.1" byte_order="LittleEndian"> + <UnstructuredGrid> + <Piece NumberOfCells="55" NumberOfPoints="72"> + <PointData Scalars="Sn" Vectors="velocityW"> + <DataArray type="Float32" Name="Sn" NumberOfComponents="1" format="ascii"> + 0.0140853 0.0140839 0.0243754 0.0243607 0.0140812 0.024332 0.0140789 0.024308 0.0140775 0.0242924 0.014077 0.0242871 + 0.115755 0.115683 0.115543 0.115426 0.115349 0.115323 0.34387 0.343736 0.343462 0.343232 0.343084 0.343031 + 0.598441 0.598316 0.598049 0.597839 0.597697 0.597641 0.768045 0.767974 0.767786 0.767656 0.767543 0.76748 + 0.861092 0.861128 0.861028 0.860967 0.860838 0.860708 0.911419 0.91173 0.911748 0.911738 0.911514 0.911146 + 0.940176 0.941222 0.941415 0.941453 0.941026 0.93998 0.957922 0.960868 0.961251 0.961356 0.96063 0.957807 + 0.969141 0.97723 0.977527 0.977785 0.976824 0.969236 0.965501 1 1 1 1 0.965964 + </DataArray> + <DataArray type="Float32" Name="Sw" NumberOfComponents="1" format="ascii"> + 0.985915 0.985916 0.975625 0.975639 0.985919 0.975668 0.985921 0.975692 0.985923 0.975708 0.985923 0.975713 + 0.884245 0.884317 0.884457 0.884574 0.884651 0.884677 0.65613 0.656264 0.656538 0.656768 0.656916 0.656969 + 0.401559 0.401684 0.401951 0.402161 0.402303 0.402359 0.231955 0.232026 0.232214 0.232344 0.232457 0.23252 + 0.138908 0.138872 0.138972 0.139033 0.139162 0.139292 0.088581 0.0882699 0.0882516 0.0882616 0.0884865 0.0888542 + 0.0598236 0.0587778 0.0585848 0.0585468 0.0589737 0.0600202 0.0420784 0.0391316 0.0387488 0.038644 0.0393696 0.0421927 + 0.0308594 0.0227695 0.0224725 0.0222153 0.0231765 0.0307642 0.0344987 0 0 0 0 0.0340357 + </DataArray> + <DataArray type="Float32" Name="pn" NumberOfComponents="1" format="ascii"> + 100003 100003 100003 100002 100003 100002 100002 100002 100002 100002 100002 100002 + 100002 100002 100002 100002 100002 100001 100002 100002 100002 100001 100001 100001 + 100002 100002 100001 100001 100001 100001 100001 100001 100001 100001 100001 100000 + 100001 100001 100001 100000 100000 100000 100001 100001 100000 100000 100000 99999.9 + 100001 100001 99999.7 100000 99999.7 99999.7 100001 100001 99999 100000 99999.3 99999.6 + 100001 100002 99997.7 100001 99998.7 99999.6 100001 100003 99995.6 100002 99997.6 100000 + </DataArray> + <DataArray type="Float32" Name="pw" NumberOfComponents="1" format="ascii"> + 99472.7 99472.7 99130.5 99130.5 99472.7 99130.5 99472.7 99130.5 99472.7 99130.5 99472.7 99130.5 + 98819.3 98819.3 98819.3 98819.3 98819.3 98819.3 98536.5 98536.5 98536.5 98536.5 98536.5 98536.5 + 98279.3 98279.3 98279.3 98279.3 98279.3 98279.3 98045.4 98045.4 98045.3 98045.3 98045.4 98045.4 + 97832.4 97832 97831.8 97831.8 97832 97832.4 97636.7 97634.8 97634 97634 97634.9 97636.7 + 97453.2 97444.2 97441.3 97441.3 97444.5 97453.1 97273.5 97233.9 97226.3 97226 97235.3 97273.1 + 97098.4 96906 96893 96888.1 96914.9 97094.9 97163 95700.5 95693.1 95699.4 95695.1 97154.4 + </DataArray> + <DataArray type="Float32" Name="pc" NumberOfComponents="1" format="ascii"> + 530.282 530.154 872.149 872.018 529.901 871.761 529.685 871.546 529.546 871.406 529.499 871.358 + 1182.93 1182.8 1182.54 1182.33 1182.19 1182.14 1465.47 1465.34 1465.07 1464.84 1464.69 1464.64 + 1722.37 1722.23 1721.93 1721.69 1721.53 1721.47 1956.04 1955.91 1955.58 1955.35 1955.15 1955.04 + 2169.01 2169.12 2168.81 2168.63 2168.24 2167.84 2364.59 2366.17 2366.27 2366.21 2365.07 2363.2 + 2548.18 2556.8 2558.41 2558.73 2555.17 2546.58 2727.9 2767.27 2772.67 2774.16 2763.95 2726.44 + 2902.88 3095.76 3104.7 3112.58 3083.79 2904.72 2837.83 4302.49 4302.49 4302.49 4302.49 2845.58 + </DataArray> + <DataArray type="Float32" Name="rhoW" NumberOfComponents="1" format="ascii"> + 997.047 997.047 997.047 997.047 997.047 997.047 997.047 997.047 997.047 997.047 997.047 997.047 + 997.047 997.047 997.047 997.047 997.047 997.047 997.047 997.047 997.047 997.047 997.047 997.047 + 997.047 997.047 997.047 997.047 997.047 997.047 997.047 997.047 997.047 997.047 997.047 997.047 + 997.047 997.047 997.047 997.047 997.047 997.047 997.047 997.047 997.047 997.047 997.047 997.047 + 997.047 997.047 997.047 997.047 997.047 997.047 997.046 997.046 997.046 997.046 997.046 997.046 + 997.046 997.046 997.046 997.046 997.046 997.046 997.046 997.046 997.046 997.046 997.046 997.046 + </DataArray> + <DataArray type="Float32" Name="rhoN" NumberOfComponents="1" format="ascii"> + 1.15427 1.15427 1.15427 1.15427 1.15427 1.15426 1.15427 1.15426 1.15426 1.15426 1.15426 1.15426 + 1.15426 1.15426 1.15426 1.15426 1.15426 1.15425 1.15426 1.15426 1.15426 1.15425 1.15425 1.15425 + 1.15426 1.15426 1.15425 1.15425 1.15425 1.15425 1.15425 1.15425 1.15425 1.15425 1.15424 1.15424 + 1.15425 1.15425 1.15424 1.15424 1.15424 1.15424 1.15425 1.15425 1.15424 1.15424 1.15424 1.15424 + 1.15425 1.15425 1.15423 1.15424 1.15423 1.15423 1.15425 1.15425 1.15423 1.15424 1.15423 1.15423 + 1.15425 1.15426 1.15421 1.15424 1.15422 1.15423 1.15425 1.16429 1.16322 1.16249 1.16157 1.15424 + </DataArray> + <DataArray type="Float32" Name="mobW" NumberOfComponents="1" format="ascii"> + 1122.18 1122.18 1107.45 1107.48 1122.19 1107.54 1122.19 1107.59 1122.19 1107.63 1122.19 1107.64 + 734.377 734.578 734.969 735.298 735.513 735.587 285.574 285.753 286.118 286.423 286.622 286.692 + 65.7264 65.7869 65.9163 66.0183 66.0869 66.114 13.0872 13.0989 13.1302 13.1517 13.1705 13.1811 + 2.88784 2.88562 2.89178 2.89557 2.90355 2.91159 0.752847 0.744891 0.744426 0.744681 0.750423 0.759879 + 0.226654 0.214569 0.212385 0.211958 0.216799 0.228973 0.074536 0.0589032 0.0570449 0.0565427 0.0600782 0.0751911 + 0.0267663 0.0092188 0.0087878 0.00842538 0.00983122 0.0264872 0.0389117 0 0 0 0 0.0372013 + </DataArray> + <DataArray type="Float32" Name="mobN" NumberOfComponents="1" format="ascii"> + 0.970566 0.969906 12.6741 12.6477 0.968603 12.5962 0.967496 12.5531 0.966782 12.5253 0.966536 12.5157 + 737.705 736.691 734.716 733.06 731.98 731.604 7430.79 7424.87 7412.82 7402.72 7396.18 7393.86 + 22392.5 22383.5 22364.2 22349 22338.8 22334.8 35810.4 35804.4 35788.4 35777.5 35767.9 35762.5 + 43865.9 43869 43860.3 43854.9 43843.6 43832.2 48404 48436.1 48437.9 48436.9 48413.7 48375.9 + 51436.7 51542.9 51562.4 51566.2 51523 51416.6 53099.9 53338.8 53368.9 53377.1 53320 53090.4 + 53933.3 54387.3 54401.3 54413.2 54367.8 53939.4 53686.5 54828.6 54828.6 54828.6 54828.6 53719.3 + </DataArray> + <DataArray type="Float32" Name="X_liquid^H2O" NumberOfComponents="1" format="ascii"> + 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 + 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 + 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 + 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 + 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 + 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.999978 0.283916 0.354401 0.411513 0.47416 0.999978 + </DataArray> + <DataArray type="Float32" Name="X_liquid^Air" NumberOfComponents="1" format="ascii"> + 2.15475e-05 2.15475e-05 2.15474e-05 2.15474e-05 2.15474e-05 2.15473e-05 2.15474e-05 2.15473e-05 2.15474e-05 2.15473e-05 2.15473e-05 2.15473e-05 + 2.15474e-05 2.15473e-05 2.15473e-05 2.15472e-05 2.15472e-05 2.15472e-05 2.15473e-05 2.15473e-05 2.15472e-05 2.15471e-05 2.15471e-05 2.15471e-05 + 2.15472e-05 2.15472e-05 2.15471e-05 2.15471e-05 2.1547e-05 2.1547e-05 2.15472e-05 2.15471e-05 2.15471e-05 2.1547e-05 2.1547e-05 2.1547e-05 + 2.15472e-05 2.15471e-05 2.1547e-05 2.15469e-05 2.15469e-05 2.15469e-05 2.15471e-05 2.15471e-05 2.15469e-05 2.15469e-05 2.15468e-05 2.15468e-05 + 2.15471e-05 2.15471e-05 2.15468e-05 2.15469e-05 2.15468e-05 2.15468e-05 2.15472e-05 2.15471e-05 2.15466e-05 2.15469e-05 2.15467e-05 2.15468e-05 + 2.15471e-05 2.15472e-05 2.15463e-05 2.1547e-05 2.15466e-05 2.15468e-05 2.1547e-05 2.20521e-05 2.20009e-05 2.19621e-05 2.1917e-05 2.15469e-05 + </DataArray> + <DataArray type="Float32" Name="X_gas^H2O" NumberOfComponents="1" format="ascii"> + 0.0199563 0.0199563 0.0199564 0.0199564 0.0199564 0.0199564 0.0199564 0.0199565 0.0199564 0.0199565 0.0199564 0.0199565 + 0.0199564 0.0199565 0.0199565 0.0199565 0.0199566 0.0199566 0.0199565 0.0199565 0.0199566 0.0199566 0.0199566 0.0199567 + 0.0199565 0.0199566 0.0199566 0.0199567 0.0199567 0.0199567 0.0199566 0.0199566 0.0199567 0.0199567 0.0199568 0.0199568 + 0.0199566 0.0199567 0.0199568 0.0199568 0.0199568 0.0199568 0.0199566 0.0199567 0.0199568 0.0199568 0.0199569 0.0199569 + 0.0199566 0.0199567 0.0199569 0.0199569 0.019957 0.0199569 0.0199566 0.0199566 0.0199571 0.0199569 0.019957 0.019957 + 0.0199566 0.0199565 0.0199574 0.0199568 0.0199572 0.019957 0.0199567 0.00561738 0.00701838 0.00815446 0.00940333 0.0199569 + </DataArray> + <DataArray type="Float32" Name="X_gas^Air" NumberOfComponents="1" format="ascii"> + 0.980044 0.980044 0.980044 0.980044 0.980044 0.980044 0.980044 0.980044 0.980044 0.980043 0.980044 0.980043 + 0.980044 0.980044 0.980043 0.980043 0.980043 0.980043 0.980044 0.980043 0.980043 0.980043 0.980043 0.980043 + 0.980043 0.980043 0.980043 0.980043 0.980043 0.980043 0.980043 0.980043 0.980043 0.980043 0.980043 0.980043 + 0.980043 0.980043 0.980043 0.980043 0.980043 0.980043 0.980043 0.980043 0.980043 0.980043 0.980043 0.980043 + 0.980043 0.980043 0.980043 0.980043 0.980043 0.980043 0.980043 0.980043 0.980043 0.980043 0.980043 0.980043 + 0.980043 0.980043 0.980043 0.980043 0.980043 0.980043 0.980043 0.994383 0.992982 0.991846 0.990597 0.980043 + </DataArray> + <DataArray type="Float32" Name="x_liquid^H2O" NumberOfComponents="1" format="ascii"> + 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 + 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 + 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 + 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 + 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 + 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.999987 0.283924 0.354409 0.411521 0.474168 0.999987 + </DataArray> + <DataArray type="Float32" Name="x_liquid^Air" NumberOfComponents="1" format="ascii"> + 1.34042e-05 1.34042e-05 1.34041e-05 1.34041e-05 1.34041e-05 1.34041e-05 1.34041e-05 1.34041e-05 1.34041e-05 1.3404e-05 1.34041e-05 1.3404e-05 + 1.34041e-05 1.34041e-05 1.3404e-05 1.3404e-05 1.3404e-05 1.3404e-05 1.34041e-05 1.3404e-05 1.3404e-05 1.3404e-05 1.34039e-05 1.34039e-05 + 1.3404e-05 1.3404e-05 1.3404e-05 1.34039e-05 1.34039e-05 1.34039e-05 1.3404e-05 1.3404e-05 1.34039e-05 1.34039e-05 1.34039e-05 1.34038e-05 + 1.3404e-05 1.34039e-05 1.34039e-05 1.34038e-05 1.34038e-05 1.34038e-05 1.3404e-05 1.34039e-05 1.34038e-05 1.34038e-05 1.34038e-05 1.34038e-05 + 1.3404e-05 1.34039e-05 1.34037e-05 1.34038e-05 1.34037e-05 1.34037e-05 1.3404e-05 1.3404e-05 1.34036e-05 1.34038e-05 1.34037e-05 1.34037e-05 + 1.3404e-05 1.3404e-05 1.34035e-05 1.34039e-05 1.34036e-05 1.34037e-05 1.34039e-05 1.37184e-05 1.36864e-05 1.36622e-05 1.36342e-05 1.34038e-05 + </DataArray> + <DataArray type="Float32" Name="x_gas^H2O" NumberOfComponents="1" format="ascii"> + 0.0316961 0.0316961 0.0316962 0.0316963 0.0316962 0.0316963 0.0316963 0.0316964 0.0316963 0.0316964 0.0316963 0.0316965 + 0.0316963 0.0316964 0.0316964 0.0316965 0.0316966 0.0316966 0.0316964 0.0316965 0.0316966 0.0316966 0.0316967 0.0316967 + 0.0316965 0.0316966 0.0316967 0.0316967 0.0316968 0.0316968 0.0316966 0.0316966 0.0316968 0.0316968 0.0316969 0.0316969 + 0.0316966 0.0316967 0.0316969 0.0316969 0.031697 0.031697 0.0316966 0.0316967 0.031697 0.031697 0.0316971 0.0316971 + 0.0316966 0.0316967 0.0316971 0.031697 0.0316972 0.0316971 0.0316966 0.0316967 0.0316974 0.031697 0.0316973 0.0316972 + 0.0316966 0.0316965 0.0316978 0.0316968 0.0316975 0.0316972 0.0316968 0.00899941 0.0112344 0.0130439 0.0150303 0.031697 + </DataArray> + <DataArray type="Float32" Name="x_gas^Air" NumberOfComponents="1" format="ascii"> + 0.968304 0.968304 0.968304 0.968304 0.968304 0.968304 0.968304 0.968304 0.968304 0.968304 0.968304 0.968304 + 0.968304 0.968304 0.968304 0.968304 0.968303 0.968303 0.968304 0.968304 0.968303 0.968303 0.968303 0.968303 + 0.968304 0.968303 0.968303 0.968303 0.968303 0.968303 0.968303 0.968303 0.968303 0.968303 0.968303 0.968303 + 0.968303 0.968303 0.968303 0.968303 0.968303 0.968303 0.968303 0.968303 0.968303 0.968303 0.968303 0.968303 + 0.968303 0.968303 0.968303 0.968303 0.968303 0.968303 0.968303 0.968303 0.968303 0.968303 0.968303 0.968303 + 0.968303 0.968304 0.968302 0.968303 0.968303 0.968303 0.968303 0.991001 0.988766 0.986956 0.98497 0.968303 + </DataArray> + <DataArray type="Float32" Name="porosity" NumberOfComponents="1" format="ascii"> + 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 + 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 + 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 + 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 + 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 + 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 0.41 + </DataArray> + <DataArray type="Float32" Name="temperature" NumberOfComponents="1" format="ascii"> + 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 + 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 + 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 + 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 + 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 + 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 298.15 + </DataArray> + <DataArray type="Float32" Name="phase presence" NumberOfComponents="1" format="ascii"> + 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 2 2 2 2 3 + </DataArray> + <DataArray type="Float32" Name="velocityW" NumberOfComponents="3" format="ascii"> + 3.10381e-09 -1.86032e-09 0 4.06777e-09 -3.62789e-10 0 4.52264e-09 -1.74433e-09 0 5.8113e-09 1.88955e-09 0 + 2.46815e-09 2.10586e-09 0 3.49318e-09 7.60247e-09 0 -2.62968e-09 2.08528e-09 0 -3.6771e-09 7.54959e-09 0 + -4.15043e-09 -3.97595e-10 0 -5.8919e-09 1.8046e-09 0 -3.13693e-09 -1.88365e-09 0 -4.54319e-09 -1.79452e-09 0 + 6.94243e-09 8.05697e-09 0 8.27558e-09 1.71883e-08 0 4.73953e-09 2.98709e-08 0 -4.93102e-09 2.97373e-08 0 + -8.33281e-09 1.69921e-08 0 -6.93327e-09 7.95837e-09 0 7.32583e-09 3.7112e-08 0 8.08261e-09 5.31766e-08 0 + 4.35641e-09 7.24513e-08 0 -4.53139e-09 7.2228e-08 0 -8.10286e-09 5.28827e-08 0 -7.26953e-09 3.70301e-08 0 + 6.33295e-09 7.22187e-08 0 6.19503e-09 9.50427e-08 0 2.97302e-09 1.18659e-07 0 -3.12602e-09 1.1837e-07 0 + -6.19717e-09 9.47028e-08 0 -6.25338e-09 7.22544e-08 0 6.43265e-09 9.59252e-08 0 5.56601e-09 1.25196e-07 0 + 2.29565e-09 1.50992e-07 0 -2.45353e-09 1.50661e-07 0 -5.56479e-09 1.24827e-07 0 -6.3306e-09 9.61195e-08 0 + 7.78875e-09 1.06514e-07 0 6.05569e-09 1.42907e-07 0 2.1079e-09 1.69619e-07 0 -2.28851e-09 1.69259e-07 0 + -6.05839e-09 1.42476e-07 0 -7.64658e-09 1.06866e-07 0 1.02872e-08 1.08487e-07 0 7.22141e-09 1.53668e-07 0 + 2.03625e-09 1.80249e-07 0 -2.24648e-09 1.79897e-07 0 -7.23882e-09 1.53115e-07 0 -1.00678e-08 1.0901e-07 0 + 1.42747e-08 1.04834e-07 0 8.98346e-09 1.61494e-07 0 1.84977e-09 1.86577e-07 0 -2.08683e-09 1.86327e-07 0 + -9.03024e-09 1.60718e-07 0 -1.38795e-08 1.0559e-07 0 2.16512e-08 9.62593e-08 0 1.20328e-08 1.68955e-07 0 + 1.33199e-09 1.90267e-07 0 -1.58444e-09 1.90333e-07 0 -1.20573e-08 1.67734e-07 0 -2.06963e-08 9.74483e-08 0 + 4.71047e-08 7.71452e-08 0 2.38369e-08 1.692e-07 0 3.53107e-10 1.87898e-07 0 -4.71711e-10 1.83816e-07 0 + -2.31524e-08 1.74893e-07 0 -4.52241e-08 7.94672e-08 0 2.36137e-07 6.35992e-08 0 1.18069e-07 1.65533e-07 0 + 0 1.84231e-07 0 0 1.75768e-07 0 -1.12336e-07 1.7844e-07 0 -2.24672e-07 6.67604e-08 0 + </DataArray> + <DataArray type="Float32" Name="velocityN" NumberOfComponents="3" format="ascii"> + 6.65527e-10 -7.77578e-10 0 9.87679e-10 -5.3726e-10 0 8.84014e-09 -9.79259e-09 0 1.30401e-08 -6.45179e-09 0 + 1.20768e-09 -2.40279e-10 0 1.5815e-08 -2.39377e-09 0 9.07379e-10 -1.73045e-10 0 1.18024e-08 -1.54563e-09 0 + 4.7598e-10 -1.48442e-10 0 6.18097e-09 -1.22053e-09 0 2.42732e-10 -1.41791e-10 0 3.14712e-09 -1.13734e-09 0 + 5.22306e-07 -3.49776e-07 0 7.70695e-07 -1.76963e-07 0 9.32476e-07 3.41563e-08 0 6.93205e-07 7.58981e-08 0 + 3.62552e-07 9.19486e-08 0 1.84562e-07 9.61057e-08 0 5.47481e-06 -3.72401e-06 0 8.23758e-06 -1.88796e-06 0 + 9.97164e-06 6.15181e-07 0 7.26592e-06 1.0563e-06 0 3.74706e-06 1.17943e-06 0 1.90519e-06 1.2225e-06 0 + 1.85232e-05 -1.60647e-05 0 2.81583e-05 -8.27875e-06 0 3.27752e-05 3.63809e-06 0 2.24806e-05 4.58818e-06 0 + 1.15512e-05 4.99031e-06 0 5.89821e-06 5.19116e-06 0 3.62742e-05 -4.18775e-05 0 5.55921e-05 -2.19169e-05 0 + 5.87063e-05 1.34327e-05 0 3.55434e-05 1.04024e-05 0 1.90989e-05 1.21194e-05 0 9.61364e-06 1.25074e-05 0 + 5.68274e-05 -8.19032e-05 0 9.12839e-05 -4.49265e-05 0 8.24469e-05 3.85259e-05 0 3.95387e-05 1.35007e-05 0 + 2.54479e-05 2.24009e-05 0 1.0972e-05 2.14403e-05 0 7.6703e-05 -0.000134297 0 0.000143492 -8.41305e-05 0 + 0.000105261 9.55282e-05 0 3.14239e-05 1.8791e-06 0 3.42354e-05 3.8966e-05 0 5.86438e-06 2.82625e-05 0 + 8.05915e-05 -0.000190896 0 0.000224798 -0.000158102 0 0.000128241 0.000216531 0 5.34087e-06 -4.95329e-05 0 + 5.20097e-05 7.3689e-05 0 -1.91851e-05 2.41316e-05 0 2.52377e-05 -0.000226901 0 0.000346918 -0.000306389 0 + 0.000147862 0.000459181 0 -4.94446e-05 -0.000189107 0 8.81045e-05 0.000155098 0 -9.77756e-05 -1.22691e-05 0 + -0.000177105 -0.000185125 0 0.000526485 -0.000590764 0 0.000160483 0.000924177 0 -0.000147491 -0.000492576 0 + 0.00015734 0.000343024 0 -0.000299449 -0.000125361 0 -0.00049421 -0.000135058 0 0.000707074 -0.000775835 0 + 0.000162631 0.0012283 0 -0.000257662 -0.000696346 0 0.000241856 0.000473668 0 -0.000584061 -0.000208449 0 + </DataArray> + </PointData> + <CellData Scalars="process rank"> + <DataArray type="Float32" Name="process rank" NumberOfComponents="1" format="ascii"> + 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 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 + </DataArray> + </CellData> + <Points> + <DataArray type="Float32" Name="Coordinates" NumberOfComponents="3" format="ascii"> + 0.25 0 0 0.3 0 0 0.25 0.0349916 0 0.3 0.0349916 0 + 0.35 0 0 0.35 0.0349916 0 0.4 0 0 0.4 0.0349916 0 + 0.45 0 0 0.45 0.0349916 0 0.5 0 0 0.5 0.0349916 0 + 0.25 0.0668022 0 0.3 0.0668022 0 0.35 0.0668022 0 0.4 0.0668022 0 + 0.45 0.0668022 0 0.5 0.0668022 0 0.25 0.0957209 0 0.3 0.0957209 0 + 0.35 0.0957209 0 0.4 0.0957209 0 0.45 0.0957209 0 0.5 0.0957209 0 + 0.25 0.122011 0 0.3 0.122011 0 0.35 0.122011 0 0.4 0.122011 0 + 0.45 0.122011 0 0.5 0.122011 0 0.25 0.14591 0 0.3 0.14591 0 + 0.35 0.14591 0 0.4 0.14591 0 0.45 0.14591 0 0.5 0.14591 0 + 0.25 0.167637 0 0.3 0.167637 0 0.35 0.167637 0 0.4 0.167637 0 + 0.45 0.167637 0 0.5 0.167637 0 0.25 0.187389 0 0.3 0.187389 0 + 0.35 0.187389 0 0.4 0.187389 0 0.45 0.187389 0 0.5 0.187389 0 + 0.25 0.205345 0 0.3 0.205345 0 0.35 0.205345 0 0.4 0.205345 0 + 0.45 0.205345 0 0.5 0.205345 0 0.25 0.221669 0 0.3 0.221669 0 + 0.35 0.221669 0 0.4 0.221669 0 0.45 0.221669 0 0.5 0.221669 0 + 0.25 0.236509 0 0.3 0.236509 0 0.35 0.236509 0 0.4 0.236509 0 + 0.45 0.236509 0 0.5 0.236509 0 0.25 0.25 0 0.3 0.25 0 + 0.35 0.25 0 0.4 0.25 0 0.45 0.25 0 0.5 0.25 0 + </DataArray> + </Points> + <Cells> + <DataArray type="Int32" Name="connectivity" NumberOfComponents="1" format="ascii"> + 0 1 3 2 1 4 5 3 4 6 7 5 + 6 8 9 7 8 10 11 9 2 3 13 12 + 3 5 14 13 5 7 15 14 7 9 16 15 + 9 11 17 16 12 13 19 18 13 14 20 19 + 14 15 21 20 15 16 22 21 16 17 23 22 + 18 19 25 24 19 20 26 25 20 21 27 26 + 21 22 28 27 22 23 29 28 24 25 31 30 + 25 26 32 31 26 27 33 32 27 28 34 33 + 28 29 35 34 30 31 37 36 31 32 38 37 + 32 33 39 38 33 34 40 39 34 35 41 40 + 36 37 43 42 37 38 44 43 38 39 45 44 + 39 40 46 45 40 41 47 46 42 43 49 48 + 43 44 50 49 44 45 51 50 45 46 52 51 + 46 47 53 52 48 49 55 54 49 50 56 55 + 50 51 57 56 51 52 58 57 52 53 59 58 + 54 55 61 60 55 56 62 61 56 57 63 62 + 57 58 64 63 58 59 65 64 60 61 67 66 + 61 62 68 67 62 63 69 68 63 64 70 69 + 64 65 71 70 + </DataArray> + <DataArray type="Int32" Name="offsets" NumberOfComponents="1" format="ascii"> + 4 8 12 16 20 24 28 32 36 40 44 48 + 52 56 60 64 68 72 76 80 84 88 92 96 + 100 104 108 112 116 120 124 128 132 136 140 144 + 148 152 156 160 164 168 172 176 180 184 188 192 + 196 200 204 208 212 216 220 + </DataArray> + <DataArray type="UInt8" Name="types" NumberOfComponents="1" format="ascii"> + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 + </DataArray> + </Cells> + </Piece> + </UnstructuredGrid> +</VTKFile>