From 35cfc628b8f9a2882cbfca89a1ad70e8ef39e512 Mon Sep 17 00:00:00 2001 From: Timo Koch Date: Tue, 2 Mar 2021 13:09:53 +0100 Subject: [PATCH 01/12] [test][1pni] Add nonisothermal test with SimpleH2O --- .../1p/nonisothermal/CMakeLists.txt | 1 + .../1p/nonisothermal/simple/CMakeLists.txt | 11 ++ .../1p/nonisothermal/simple/main.cc | 104 ++++++++++++++++++ .../1p/nonisothermal/simple/params.input | 15 +++ .../1p/nonisothermal/simple/problem.hh | 99 +++++++++++++++++ .../1p/nonisothermal/simple/properties.hh | 74 +++++++++++++ .../1p/nonisothermal/simple/spatialparams.hh | 76 +++++++++++++ 7 files changed, 380 insertions(+) create mode 100644 test/porousmediumflow/1p/nonisothermal/simple/CMakeLists.txt create mode 100644 test/porousmediumflow/1p/nonisothermal/simple/main.cc create mode 100644 test/porousmediumflow/1p/nonisothermal/simple/params.input create mode 100644 test/porousmediumflow/1p/nonisothermal/simple/problem.hh create mode 100644 test/porousmediumflow/1p/nonisothermal/simple/properties.hh create mode 100644 test/porousmediumflow/1p/nonisothermal/simple/spatialparams.hh diff --git a/test/porousmediumflow/1p/nonisothermal/CMakeLists.txt b/test/porousmediumflow/1p/nonisothermal/CMakeLists.txt index 9b2594e883..527d15c132 100644 --- a/test/porousmediumflow/1p/nonisothermal/CMakeLists.txt +++ b/test/porousmediumflow/1p/nonisothermal/CMakeLists.txt @@ -1,3 +1,4 @@ +add_subdirectory(simple) add_input_file_links() # non-isothermal tests diff --git a/test/porousmediumflow/1p/nonisothermal/simple/CMakeLists.txt b/test/porousmediumflow/1p/nonisothermal/simple/CMakeLists.txt new file mode 100644 index 0000000000..28895a6472 --- /dev/null +++ b/test/porousmediumflow/1p/nonisothermal/simple/CMakeLists.txt @@ -0,0 +1,11 @@ +add_input_file_links() + +dumux_add_test(NAME test_1pni_simple + LABELS porousmediumflow 1p 1pni + SOURCES main.cc + COMPILE_DEFINITIONS TYPETAG=OnePNISimpleTpfa + COMMAND ${CMAKE_SOURCE_DIR}/bin/testing/runtest.py + CMD_ARGS --script fuzzy + --files ${CMAKE_SOURCE_DIR}/test/references/test_1pni_conduction_mpfa-reference.vtu + ${CMAKE_CURRENT_BINARY_DIR}/test_1pni_conduction_mpfa-00005.vtu + --command "${CMAKE_CURRENT_BINARY_DIR}/test_1pni_conduction_mpfa params.input -Problem.Name test_1pni_conduction_mpfa") diff --git a/test/porousmediumflow/1p/nonisothermal/simple/main.cc b/test/porousmediumflow/1p/nonisothermal/simple/main.cc new file mode 100644 index 0000000000..bcf28fda9c --- /dev/null +++ b/test/porousmediumflow/1p/nonisothermal/simple/main.cc @@ -0,0 +1,104 @@ +// -*- 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 3 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 . * + *****************************************************************************/ +/*! + * \file + * \ingroup OnePTests + * \brief Test for the 1pni CC model + */ + +#include + +#include + +#include + +#include +#include + +#include +#include +#include + +#include + +#include +#include + +#include "properties.hh" + +int main(int argc, char** argv) +{ + using namespace Dumux; + + // define the type tag for this problem + using TypeTag = Properties::TTag::TYPETAG; + + // initialize MPI, finalize is done automatically on exit + const auto& mpiHelper = Dune::MPIHelper::instance(argc, argv); + + // parse command line arguments and input file + Parameters::init(argc, argv); + + // try to create a grid (from the given grid file or the input file) + GridManager> gridManager; + gridManager.init(); + + // we compute on the leaf grid view + const auto& leafGridView = gridManager.grid().leafGridView(); + + // create the finite volume grid geometry + using GridGeometry = GetPropType; + auto gridGeometry = std::make_shared(leafGridView); + gridGeometry->update(); + + // the problem (initial and boundary conditions) + using Problem = GetPropType; + auto problem = std::make_shared(gridGeometry); + + using SolutionVector = GetPropType; + SolutionVector x; + problem->applyInitialSolution(x); + + // the grid variables + using GridVariables = GetPropType; + auto gridVariables = std::make_shared(problem, gridGeometry); + gridVariables->init(x); + + // intialize the vtk output module + using IOFields = GetPropType; + VtkOutputModule vtkWriter(*gridVariables, x, problem->name()); + IOFields::initOutputModule(vtkWriter); // Add model specific output fields + vtkWriter.write(0.0); + + using Assembler = FVAssembler; + auto assembler = std::make_shared(problem, gridGeometry, gridVariables); + + using LinearSolver = ILU0BiCGSTABBackend; + auto linearSolver = std::make_shared(); + + using NewtonSolver = Dumux::NewtonSolver; + NewtonSolver nonLinearSolver(assembler, linearSolver); + nonLinearSolver.solve(x); + vtkWriter.write(1.0); + + if (mpiHelper.rank() == 0) + Parameters::print(); + + return 0; +} // end main diff --git a/test/porousmediumflow/1p/nonisothermal/simple/params.input b/test/porousmediumflow/1p/nonisothermal/simple/params.input new file mode 100644 index 0000000000..36017c98fd --- /dev/null +++ b/test/porousmediumflow/1p/nonisothermal/simple/params.input @@ -0,0 +1,15 @@ +[Grid] +UpperRight = 1 1 +Cells = 20 20 + +[Problem] +Name = simple_1pni +EnableGravity = false # disable gravity + +[SimpleH2O] +ReferenceTemperature = 0 + +[Component] +SolidDensity = 2700 +SolidThermalConductivity = 0.0 +SolidHeatCapacity = 790 diff --git a/test/porousmediumflow/1p/nonisothermal/simple/problem.hh b/test/porousmediumflow/1p/nonisothermal/simple/problem.hh new file mode 100644 index 0000000000..ea80091859 --- /dev/null +++ b/test/porousmediumflow/1p/nonisothermal/simple/problem.hh @@ -0,0 +1,99 @@ +// -*- 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 3 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 . * + *****************************************************************************/ +/** + * \file + * \ingroup OnePTests + * \brief Test for the OnePModel in combination with the NI model for a conduction problem. + * + * The simulation domain is a tube with an elevated temperature on the left hand side. + */ + +#ifndef DUMUX_1PNI_CONDUCTION_PROBLEM_HH +#define DUMUX_1PNI_CONDUCTION_PROBLEM_HH + +#include +#include + +#include +#include + +namespace Dumux { + +/*! + * \ingroup OnePTests + * \brief Test for the OnePModel in combination with the NI model + */ +template +class OnePNISimpleProblem : public PorousMediumFlowProblem +{ + using ParentType = PorousMediumFlowProblem; + using GridView = typename GetPropType::GridView; + using Scalar = GetPropType; + using PrimaryVariables = GetPropType; + using FluidSystem = GetPropType; + using BoundaryTypes = Dumux::BoundaryTypes::numEq()>; + using ThermalConductivityModel = GetPropType; + using VolumeVariables = GetPropType; + using SolutionVector = GetPropType; + using Element = typename GridView::template Codim<0>::Entity; + using GlobalPosition = typename Element::Geometry::GlobalCoordinate; + using GridGeometry = GetPropType; + +public: + OnePNISimpleProblem(std::shared_ptr gridGeometry) + : ParentType(gridGeometry) + { + name_ = getParam("Problem.Name"); + } + + const std::string& name() const + { return name_; } + + + BoundaryTypes boundaryTypesAtPos(const GlobalPosition &globalPos) const + { + BoundaryTypes bcTypes; + + if (globalPos[0] < this->gridGeometry().bBoxMin()[0] + eps_ || globalPos[0] > this->gridGeometry().bBoxMax()[0] - eps_) + bcTypes.setAllDirichlet(); + else + bcTypes.setAllNeumann(); + + return bcTypes; + } + + PrimaryVariables dirichletAtPos(const GlobalPosition &globalPos) const + { + if (globalPos[0] < this->gridGeometry().bBoxMin()[0] + eps_) + return {1e5, 300.0}; + else + return {10e5, 300.0}; + } + + PrimaryVariables initialAtPos(const GlobalPosition &globalPos) const + { return dirichletAtPos(globalPos); } + +private: + static constexpr Scalar eps_ = 1e-6; + std::string name_; +}; + +} // end namespace Dumux + +#endif diff --git a/test/porousmediumflow/1p/nonisothermal/simple/properties.hh b/test/porousmediumflow/1p/nonisothermal/simple/properties.hh new file mode 100644 index 0000000000..da4ec3c0db --- /dev/null +++ b/test/porousmediumflow/1p/nonisothermal/simple/properties.hh @@ -0,0 +1,74 @@ +// -*- 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 3 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 . * + *****************************************************************************/ +/** + * \file + * \ingroup OnePTests + * \brief Test for the OnePModel in combination with the NI model for a conduction problem. + * + * The simulation domain is a tube with an elevated temperature on the left hand side. + */ + +#ifndef DUMUX_1PNI_CONDUCTION_PROBLEM_PROPERTIES_HH +#define DUMUX_1PNI_CONDUCTION_PROBLEM_PROPERTIES_HH + +#include + +#include +#include +#include +#include +#include + +#include "problem.hh" +#include "spatialparams.hh" + +namespace Dumux::Properties { +// Create new type tags +namespace TTag { +struct OnePNISimple { using InheritsFrom = std::tuple; }; +struct OnePNISimpleTpfa { using InheritsFrom = std::tuple; }; +} // end namespace TTag + +// Set the grid type +template +struct Grid { using type = Dune::YaspGrid<2>; }; + +// Set the problem property +template +struct Problem { using type = OnePNISimpleProblem; }; + +// Set the fluid system +template +struct FluidSystem +{ + using type = FluidSystems::OnePLiquid, + Components::SimpleH2O> >; +}; + +// Set the spatial parameters +template +struct SpatialParams +{ + using GridGeometry = GetPropType; + using Scalar = GetPropType; + using type = OnePNISpatialParams; +}; +} // end namespace Dumux + +#endif diff --git a/test/porousmediumflow/1p/nonisothermal/simple/spatialparams.hh b/test/porousmediumflow/1p/nonisothermal/simple/spatialparams.hh new file mode 100644 index 0000000000..860a13b715 --- /dev/null +++ b/test/porousmediumflow/1p/nonisothermal/simple/spatialparams.hh @@ -0,0 +1,76 @@ +// -*- 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 3 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 . * + *****************************************************************************/ +/*! + * \file + * \ingroup OnePTests + * \brief Definition of the spatial parameters for the 1pni problems. + */ + +#ifndef DUMUX_TEST_1PNI_SPATIAL_PARAMS_HH +#define DUMUX_TEST_1PNI_SPATIAL_PARAMS_HH + +#include +#include + +namespace Dumux { + +/*! + * \ingroup OnePTests + * \brief Definition of the spatial parameters for the 1pni problems. + */ +template +class OnePNISpatialParams +: public FVSpatialParamsOneP> +{ + using GridView = typename GridGeometry::GridView; + using ParentType = FVSpatialParamsOneP>; + + static const int dimWorld = GridView::dimensionworld; + using Element = typename GridView::template Codim<0>::Entity; + using GlobalPosition = typename Element::Geometry::GlobalCoordinate; + +public: + // export permeability type + using PermeabilityType = Scalar; + + OnePNISpatialParams(std::shared_ptr gridGeometry) + : ParentType(gridGeometry) {} + + /*! + * \brief Defines the intrinsic permeability \f$\mathrm{[m^2]}\f$. + * + * \param globalPos The global position + */ + PermeabilityType permeabilityAtPos(const GlobalPosition& globalPos) const + { return 1e-10; } + + /*! + * \brief Defines the porosity \f$\mathrm{[-]}\f$. + * + * \param globalPos The global position + */ + Scalar porosityAtPos(const GlobalPosition& globalPos) const + { return 0.4; } +}; + +} // end namespace Dumux + +#endif -- GitLab From 19a6f3f043d49de4ce431af1acf03af4aff634a8 Mon Sep 17 00:00:00 2001 From: Timo Koch Date: Tue, 2 Mar 2021 14:03:07 +0100 Subject: [PATCH 02/12] [test][1pni] Add box test --- .../1p/nonisothermal/simple/CMakeLists.txt | 12 +++++++++++- .../1p/nonisothermal/simple/properties.hh | 2 ++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/test/porousmediumflow/1p/nonisothermal/simple/CMakeLists.txt b/test/porousmediumflow/1p/nonisothermal/simple/CMakeLists.txt index 28895a6472..9a25240cf2 100644 --- a/test/porousmediumflow/1p/nonisothermal/simple/CMakeLists.txt +++ b/test/porousmediumflow/1p/nonisothermal/simple/CMakeLists.txt @@ -1,6 +1,6 @@ add_input_file_links() -dumux_add_test(NAME test_1pni_simple +dumux_add_test(NAME test_1pni_simple_tpfa LABELS porousmediumflow 1p 1pni SOURCES main.cc COMPILE_DEFINITIONS TYPETAG=OnePNISimpleTpfa @@ -9,3 +9,13 @@ dumux_add_test(NAME test_1pni_simple --files ${CMAKE_SOURCE_DIR}/test/references/test_1pni_conduction_mpfa-reference.vtu ${CMAKE_CURRENT_BINARY_DIR}/test_1pni_conduction_mpfa-00005.vtu --command "${CMAKE_CURRENT_BINARY_DIR}/test_1pni_conduction_mpfa params.input -Problem.Name test_1pni_conduction_mpfa") + +dumux_add_test(NAME test_1pni_simple_box + LABELS porousmediumflow 1p 1pni + SOURCES main.cc + COMPILE_DEFINITIONS TYPETAG=OnePNISimpleBox + COMMAND ${CMAKE_SOURCE_DIR}/bin/testing/runtest.py + CMD_ARGS --script fuzzy + --files ${CMAKE_SOURCE_DIR}/test/references/test_1pni_conduction_mpfa-reference.vtu + ${CMAKE_CURRENT_BINARY_DIR}/test_1pni_conduction_mpfa-00005.vtu + --command "${CMAKE_CURRENT_BINARY_DIR}/test_1pni_conduction_mpfa params.input -Problem.Name test_1pni_conduction_mpfa") diff --git a/test/porousmediumflow/1p/nonisothermal/simple/properties.hh b/test/porousmediumflow/1p/nonisothermal/simple/properties.hh index da4ec3c0db..58c5951c69 100644 --- a/test/porousmediumflow/1p/nonisothermal/simple/properties.hh +++ b/test/porousmediumflow/1p/nonisothermal/simple/properties.hh @@ -30,6 +30,7 @@ #include #include +#include #include #include #include @@ -43,6 +44,7 @@ namespace Dumux::Properties { namespace TTag { struct OnePNISimple { using InheritsFrom = std::tuple; }; struct OnePNISimpleTpfa { using InheritsFrom = std::tuple; }; +struct OnePNISimpleBox { using InheritsFrom = std::tuple; }; } // end namespace TTag // Set the grid type -- GitLab From ce76d972f34f6482d9b954cbde12b1556c1fa654 Mon Sep 17 00:00:00 2001 From: Timo Koch Date: Mon, 8 Mar 2021 15:18:13 +0100 Subject: [PATCH 03/12] [nonisothermal] Consider volume work in energy balance --- dumux/porousmediumflow/nonisothermal/localresidual.hh | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/dumux/porousmediumflow/nonisothermal/localresidual.hh b/dumux/porousmediumflow/nonisothermal/localresidual.hh index e049009582..64b9811b68 100644 --- a/dumux/porousmediumflow/nonisothermal/localresidual.hh +++ b/dumux/porousmediumflow/nonisothermal/localresidual.hh @@ -171,10 +171,17 @@ public: FluxVariables& fluxVars, int phaseIdx) { - auto upwindTerm = [phaseIdx](const auto& volVars) - { return volVars.density(phaseIdx)*volVars.mobility(phaseIdx)*volVars.enthalpy(phaseIdx); }; + const auto upwindTerm = [phaseIdx](const auto& volVars) + { return volVars.density(phaseIdx)*volVars.mobility(phaseIdx)*volVars.internalEnergy(phaseIdx); }; flux[energyEqIdx] += fluxVars.advectiveFlux(phaseIdx, upwindTerm); + + // volume work + const auto insidePressure = fluxVars.elemVolVars()[fluxVars.scvFace().insideScvIdx()].pressure(phaseIdx); + const auto velUpwindTerm = [phaseIdx](const auto& volVars) + { return volVars.mobility(phaseIdx); }; + + flux[energyEqIdx] += -insidePressure*fluxVars.advectiveFlux(phaseIdx, velUpwindTerm); } /*! -- GitLab From 570c6f43981c8bc781c70aceb64b1e0a1392de07 Mon Sep 17 00:00:00 2001 From: Bernd Flemisch Date: Thu, 29 Jul 2021 15:56:11 +0200 Subject: [PATCH 04/12] [nonisothermal] implement p.div(v) term for box Evaluate as part of the evalSource function. Requires to pass the flux variables cache to the source evaluation routines. Leads to inferior Newton convergence for TPFA compared to the original implementation as flux term. --- dumux/assembly/fvlocalresidual.hh | 5 +- .../immiscible/localresidual.hh | 33 +++++++++ .../nonisothermal/localresidual.hh | 74 +++++++++++++++++-- 3 files changed, 102 insertions(+), 10 deletions(-) diff --git a/dumux/assembly/fvlocalresidual.hh b/dumux/assembly/fvlocalresidual.hh index 01713a4ee6..c087e35e66 100644 --- a/dumux/assembly/fvlocalresidual.hh +++ b/dumux/assembly/fvlocalresidual.hh @@ -173,7 +173,7 @@ public: // evaluate the volume terms (storage + source terms) // forward to the local residual specialized for the discretization methods for (auto&& scv : scvs(fvGeometry)) - asImp().evalSource(residual, this->problem(), element, fvGeometry, elemVolVars, scv); + asImp().evalSource(residual, this->problem(), element, fvGeometry, elemVolVars, elemFluxVarsCache, scv); // forward to the local residual specialized for the discretization methods for (auto&& scvf : scvfs(fvGeometry)) @@ -334,11 +334,12 @@ public: const Element& element, const FVElementGeometry& fvGeometry, const ElementVolumeVariables& curElemVolVars, + const ElementFluxVariablesCache& elemFluxVarsCache, const SubControlVolume& scv) const { //! Compute source with the model specific storage residual const auto& curVolVars = curElemVolVars[scv]; - NumEqVector source = asImp().computeSource(problem, element, fvGeometry, curElemVolVars, scv); + NumEqVector source = asImp().computeSource(problem, element, fvGeometry, curElemVolVars, elemFluxVarsCache, scv); source *= Extrusion::volume(scv)*curVolVars.extrusionFactor(); //! subtract source from local rate (sign convention in user interface) diff --git a/dumux/porousmediumflow/immiscible/localresidual.hh b/dumux/porousmediumflow/immiscible/localresidual.hh index 311ff5552e..28814d542e 100644 --- a/dumux/porousmediumflow/immiscible/localresidual.hh +++ b/dumux/porousmediumflow/immiscible/localresidual.hh @@ -135,6 +135,39 @@ public: return flux; } + + /*! + * \brief Calculate the source term of the equation + * + * \param problem The problem to solve + * \param element The DUNE Codim<0> entity for which the residual + * ought to be calculated + * \param fvGeometry The finite-volume geometry of the element + * \param elemVolVars The volume variables associated with the element stencil + * \param scv The sub-control volume over which we integrate the source term + * \note This is the default implementation for all models as sources are computed + * in the user interface of the problem + * + */ + NumEqVector computeSource(const Problem& problem, + const Element& element, + const FVElementGeometry& fvGeometry, + const ElementVolumeVariables& elemVolVars, + const ElementFluxVariablesCache& elemFluxVarsCache, + const SubControlVolume &scv) const + { + NumEqVector source(0.0); + + // add contributions from volume flux sources + source += problem.source(element, fvGeometry, elemVolVars, scv); + + // add contribution from possible point sources + source += problem.scvPointSources(element, fvGeometry, elemVolVars, scv); + + EnergyLocalResidual::computeVolumeWork(source, problem, element, fvGeometry, elemVolVars, elemFluxVarsCache, scv); + + return source; + } }; } // end namespace Dumux diff --git a/dumux/porousmediumflow/nonisothermal/localresidual.hh b/dumux/porousmediumflow/nonisothermal/localresidual.hh index 64b9811b68..8ec97f7d8d 100644 --- a/dumux/porousmediumflow/nonisothermal/localresidual.hh +++ b/dumux/porousmediumflow/nonisothermal/localresidual.hh @@ -118,9 +118,17 @@ class EnergyLocalResidualImplementation using GridView = typename GetPropType::GridView; using Element = typename GridView::template Codim<0>::Entity; using ElementVolumeVariables = typename GetPropType::LocalView; + using ElementFluxVariablesCache = typename GetPropType::LocalView; using Indices = typename GetPropType::Indices; + using ModelTraits = GetPropType; + using Problem = GetPropType; + using BoundaryTypes = Dumux::BoundaryTypes; + using GridGeometry = GetPropType; + using Extrusion = Extrusion_t; - enum { energyEqIdx = Indices::energyEqIdx }; + static constexpr int numPhases = ModelTraits::numFluidPhases(); + static constexpr int energyEqIdx = Indices::energyEqIdx; + static constexpr bool isBox = GridGeometry::discMethod == DiscretizationMethod::box; public: @@ -175,13 +183,6 @@ public: { return volVars.density(phaseIdx)*volVars.mobility(phaseIdx)*volVars.internalEnergy(phaseIdx); }; flux[energyEqIdx] += fluxVars.advectiveFlux(phaseIdx, upwindTerm); - - // volume work - const auto insidePressure = fluxVars.elemVolVars()[fluxVars.scvFace().insideScvIdx()].pressure(phaseIdx); - const auto velUpwindTerm = [phaseIdx](const auto& volVars) - { return volVars.mobility(phaseIdx); }; - - flux[energyEqIdx] += -insidePressure*fluxVars.advectiveFlux(phaseIdx, velUpwindTerm); } /*! @@ -196,6 +197,7 @@ public: flux[energyEqIdx] += fluxVars.heatConductionFlux(); } + /*! * \brief heat transfer between the phases for nonequilibrium models * @@ -205,6 +207,62 @@ public: * \param elemVolVars The volume variables of the current element * \param scv The sub-control volume over which we integrate the source term */ + static void computeVolumeWork(NumEqVector& source, + const Problem& problem, + const Element& element, + const FVElementGeometry& fvGeometry, + const ElementVolumeVariables& elemVolVars, + const ElementFluxVariablesCache& elemFluxVarsCache, + const SubControlVolume &scv) + { + Scalar volumeWork = 0.0; + + for (auto&& scvf : scvfs(fvGeometry)) + { + // only treat scvfs that are faces of the scv + if (isBox && scvf.insideScvIdx() != scv.localDofIndex() + && scvf.outsideScvIdx() != scv.localDofIndex()) + continue; + + // determine boundary types and if the scv is inside relative to the scvf + BoundaryTypes bcTypes; + bool isInsideScv = true; + if constexpr (isBox) + { + bcTypes = problem.boundaryTypes(element, scv); + isInsideScv = scvf.insideScvIdx() == scv.localDofIndex(); + } + else + bcTypes = problem.boundaryTypes(element, scvf); + + // \todo: treat general Neumann boundary faces + if (!scvf.boundary() || bcTypes.hasDirichlet()) + { + FluxVariables fluxVars; + fluxVars.init(problem, element, fvGeometry, elemVolVars, scvf, elemFluxVarsCache); + + for (int phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) + { + const auto scvPressure = elemVolVars[scv].pressure(phaseIdx); + const auto velUpwindTerm = [phaseIdx](const auto& volVars) + { return volVars.mobility(phaseIdx); }; + + // add or subtract depending on the orientation of scv and scvf + if (isInsideScv) + volumeWork -= scvPressure*fluxVars.advectiveFlux(phaseIdx, velUpwindTerm); + else + volumeWork += scvPressure*fluxVars.advectiveFlux(phaseIdx, velUpwindTerm); + } + } + } + + // divide by the volume and the extrusion factor as this term is + // multiplied with in the general evalSource function + volumeWork /= Extrusion::volume(scv)*elemVolVars[scv].extrusionFactor(); + + source[energyEqIdx] += volumeWork; + } + static void computeSourceEnergy(NumEqVector& source, const Element& element, const FVElementGeometry& fvGeometry, -- GitLab From a895aab0371ed444168cefea7d062b4b179ef905 Mon Sep 17 00:00:00 2001 From: Bernd Flemisch Date: Tue, 3 Aug 2021 14:25:56 +0200 Subject: [PATCH 05/12] [assembly] use isValid to branch between different source functions --- dumux/assembly/fvlocalresidual.hh | 40 +++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/dumux/assembly/fvlocalresidual.hh b/dumux/assembly/fvlocalresidual.hh index c087e35e66..5f7f46326a 100644 --- a/dumux/assembly/fvlocalresidual.hh +++ b/dumux/assembly/fvlocalresidual.hh @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -36,6 +37,26 @@ namespace Dumux { +namespace Detail { +template +struct evalSourceNeedsCache +{ + template + auto operator()(const LocalResidual& r) + -> decltype(r.evalSource(std::declval(), std::declval

(), std::declval(), std::declval(), std::declval(), std::declval(), std::declval())) + {} +}; + +template +struct computeSourceNeedsCache +{ + template + auto operator()(const LocalResidual& r) + -> decltype(r.computeSource(std::declval

(), std::declval(), std::declval(), std::declval(), std::declval(), std::declval())) + {} +}; +} + /*! * \ingroup Assembly * \brief The element-wise residual for finite volume schemes @@ -173,7 +194,14 @@ public: // evaluate the volume terms (storage + source terms) // forward to the local residual specialized for the discretization methods for (auto&& scv : scvs(fvGeometry)) - asImp().evalSource(residual, this->problem(), element, fvGeometry, elemVolVars, elemFluxVarsCache, scv); + { + static constexpr auto needsCache = decltype(isValid(Detail::evalSourceNeedsCache())(asImp()))::value; + + if constexpr (needsCache) + asImp().evalSource(residual, this->problem(), element, fvGeometry, elemVolVars, elemFluxVarsCache, scv); + else + asImp().evalSource(residual, this->problem(), element, fvGeometry, elemVolVars, scv); + } // forward to the local residual specialized for the discretization methods for (auto&& scvf : scvfs(fvGeometry)) @@ -339,7 +367,15 @@ public: { //! Compute source with the model specific storage residual const auto& curVolVars = curElemVolVars[scv]; - NumEqVector source = asImp().computeSource(problem, element, fvGeometry, curElemVolVars, elemFluxVarsCache, scv); + + static constexpr auto needsCache = decltype(isValid(Detail::computeSourceNeedsCache())(asImp()))::value; + + NumEqVector source; + if constexpr (needsCache) + source = asImp().computeSource(problem, element, fvGeometry, curElemVolVars, elemFluxVarsCache, scv); + else + source = asImp().computeSource(problem, element, fvGeometry, curElemVolVars, scv); + source *= Extrusion::volume(scv)*curVolVars.extrusionFactor(); //! subtract source from local rate (sign convention in user interface) -- GitLab From cd34d3d1e8e383247f9c7abcd4934c53f388b358 Mon Sep 17 00:00:00 2001 From: Bernd Flemisch Date: Wed, 4 Aug 2021 11:22:50 +0200 Subject: [PATCH 06/12] [nonisothermal] compute contribution of p.div(v) depending on discretization By assuming a constant cell pressure, the contribution of p.div(v) is calculated by summing p.v.n over all scvfs of one scv. As p corresponds to the scv, one such term (p.v.n)_scvf is usually different for the two scvs sharing the scvf. By default, each term is calculated separately for each scv and scvf by means of the routine heatConvectionFlux. For box, symmetric fluxes are assumed and the heat convection for one scvf is only calculated once for both participating scvs. Therefore, the calculation of p.div(v) for box is outsourced to a function computeVolumeWork which is called as part of evalSource. --- .../immiscible/localresidual.hh | 8 +++++- .../nonisothermal/localresidual.hh | 27 ++++++++++++------- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/dumux/porousmediumflow/immiscible/localresidual.hh b/dumux/porousmediumflow/immiscible/localresidual.hh index 28814d542e..e39f1258ba 100644 --- a/dumux/porousmediumflow/immiscible/localresidual.hh +++ b/dumux/porousmediumflow/immiscible/localresidual.hh @@ -57,6 +57,9 @@ class ImmiscibleLocalResidual : public GetPropType; + static constexpr bool isBox = GridGeometry::discMethod == DiscretizationMethod::box; + public: using ParentType::ParentType; @@ -164,7 +167,10 @@ public: // add contribution from possible point sources source += problem.scvPointSources(element, fvGeometry, elemVolVars, scv); - EnergyLocalResidual::computeVolumeWork(source, problem, element, fvGeometry, elemVolVars, elemFluxVarsCache, scv); + // for box, add the contribution from p.div(v) + // for cell-centered, this is part of EnergyLocalResidual::heatConvectionFlux + if constexpr (isBox) + EnergyLocalResidual::computeVolumeWork(source, problem, element, fvGeometry, elemVolVars, elemFluxVarsCache, scv); return source; } diff --git a/dumux/porousmediumflow/nonisothermal/localresidual.hh b/dumux/porousmediumflow/nonisothermal/localresidual.hh index 8ec97f7d8d..b0e99aebc1 100644 --- a/dumux/porousmediumflow/nonisothermal/localresidual.hh +++ b/dumux/porousmediumflow/nonisothermal/localresidual.hh @@ -183,6 +183,17 @@ public: { return volVars.density(phaseIdx)*volVars.mobility(phaseIdx)*volVars.internalEnergy(phaseIdx); }; flux[energyEqIdx] += fluxVars.advectiveFlux(phaseIdx, upwindTerm); + + // by default, add the contribution from p.div(v) + // for box, this is done in computeVolumeWork as part of evalSource + if constexpr (!isBox) + { + const auto insidePressure = fluxVars.elemVolVars()[fluxVars.scvFace().insideScvIdx()].pressure(phaseIdx); + const auto velUpwindTerm = [phaseIdx](const auto& volVars) + { return volVars.mobility(phaseIdx); }; + + flux[energyEqIdx] += -insidePressure*fluxVars.advectiveFlux(phaseIdx, velUpwindTerm); + } } /*! @@ -215,25 +226,21 @@ public: const ElementFluxVariablesCache& elemFluxVarsCache, const SubControlVolume &scv) { + static_assert(isBox, "This function should only be called for the box discretization.\n" + "Other discretizations are treated by means of heatConvectionFlux."); + Scalar volumeWork = 0.0; for (auto&& scvf : scvfs(fvGeometry)) { // only treat scvfs that are faces of the scv - if (isBox && scvf.insideScvIdx() != scv.localDofIndex() + if (scvf.insideScvIdx() != scv.localDofIndex() && scvf.outsideScvIdx() != scv.localDofIndex()) continue; // determine boundary types and if the scv is inside relative to the scvf - BoundaryTypes bcTypes; - bool isInsideScv = true; - if constexpr (isBox) - { - bcTypes = problem.boundaryTypes(element, scv); - isInsideScv = scvf.insideScvIdx() == scv.localDofIndex(); - } - else - bcTypes = problem.boundaryTypes(element, scvf); + BoundaryTypes bcTypes = problem.boundaryTypes(element, scv); + bool isInsideScv = scvf.insideScvIdx() == scv.localDofIndex(); // \todo: treat general Neumann boundary faces if (!scvf.boundary() || bcTypes.hasDirichlet()) -- GitLab From 7829f90cd77c8c825de87448111e9ac22912ebf5 Mon Sep 17 00:00:00 2001 From: Bernd Flemisch Date: Wed, 4 Aug 2021 11:34:09 +0200 Subject: [PATCH 07/12] [test][nonisothermal] add reference solutions for the simple 1pni test --- .../1p/nonisothermal/simple/CMakeLists.txt | 12 +- test/references/1pni_simple_box-reference.vtu | 450 ++++++++++++++++++ .../references/1pni_simple_tpfa-reference.vtu | 442 +++++++++++++++++ 3 files changed, 898 insertions(+), 6 deletions(-) create mode 100644 test/references/1pni_simple_box-reference.vtu create mode 100644 test/references/1pni_simple_tpfa-reference.vtu diff --git a/test/porousmediumflow/1p/nonisothermal/simple/CMakeLists.txt b/test/porousmediumflow/1p/nonisothermal/simple/CMakeLists.txt index 9a25240cf2..665d6b91af 100644 --- a/test/porousmediumflow/1p/nonisothermal/simple/CMakeLists.txt +++ b/test/porousmediumflow/1p/nonisothermal/simple/CMakeLists.txt @@ -6,9 +6,9 @@ dumux_add_test(NAME test_1pni_simple_tpfa COMPILE_DEFINITIONS TYPETAG=OnePNISimpleTpfa COMMAND ${CMAKE_SOURCE_DIR}/bin/testing/runtest.py CMD_ARGS --script fuzzy - --files ${CMAKE_SOURCE_DIR}/test/references/test_1pni_conduction_mpfa-reference.vtu - ${CMAKE_CURRENT_BINARY_DIR}/test_1pni_conduction_mpfa-00005.vtu - --command "${CMAKE_CURRENT_BINARY_DIR}/test_1pni_conduction_mpfa params.input -Problem.Name test_1pni_conduction_mpfa") + --files ${CMAKE_SOURCE_DIR}/test/references/1pni_simple_tpfa-reference.vtu + ${CMAKE_CURRENT_BINARY_DIR}/1pni_simple_tpfa-00001.vtu + --command "${CMAKE_CURRENT_BINARY_DIR}/test_1pni_simple_tpfa params.input -Problem.Name 1pni_simple_tpfa") dumux_add_test(NAME test_1pni_simple_box LABELS porousmediumflow 1p 1pni @@ -16,6 +16,6 @@ dumux_add_test(NAME test_1pni_simple_box COMPILE_DEFINITIONS TYPETAG=OnePNISimpleBox COMMAND ${CMAKE_SOURCE_DIR}/bin/testing/runtest.py CMD_ARGS --script fuzzy - --files ${CMAKE_SOURCE_DIR}/test/references/test_1pni_conduction_mpfa-reference.vtu - ${CMAKE_CURRENT_BINARY_DIR}/test_1pni_conduction_mpfa-00005.vtu - --command "${CMAKE_CURRENT_BINARY_DIR}/test_1pni_conduction_mpfa params.input -Problem.Name test_1pni_conduction_mpfa") + --files ${CMAKE_SOURCE_DIR}/test/references/1pni_simple_box-reference.vtu + ${CMAKE_CURRENT_BINARY_DIR}/1pni_simple_box-00001.vtu + --command "${CMAKE_CURRENT_BINARY_DIR}/test_1pni_simple_box params.input -Problem.Name 1pni_simple_box") diff --git a/test/references/1pni_simple_box-reference.vtu b/test/references/1pni_simple_box-reference.vtu new file mode 100644 index 0000000000..bf8ea7968a --- /dev/null +++ b/test/references/1pni_simple_box-reference.vtu @@ -0,0 +1,450 @@ + + + + + + + 100000 145000 100000 145000 190000 190000 235000 235000 280000 280000 325000 325000 + 370000 370000 415000 415000 460000 460000 505000 505000 550000 550000 595000 595000 + 640000 640000 685000 685000 730000 730000 775000 775000 820000 820000 865000 865000 + 910000 910000 955000 955000 1e+06 1e+06 100000 145000 190000 235000 280000 325000 + 370000 415000 460000 505000 550000 595000 640000 685000 730000 775000 820000 865000 + 910000 955000 1e+06 100000 145000 190000 235000 280000 325000 370000 415000 460000 + 505000 550000 595000 640000 685000 730000 775000 820000 865000 910000 955000 1e+06 + 100000 145000 190000 235000 280000 325000 370000 415000 460000 505000 550000 595000 + 640000 685000 730000 775000 820000 865000 910000 955000 1e+06 100000 145000 190000 + 235000 280000 325000 370000 415000 460000 505000 550000 595000 640000 685000 730000 + 775000 820000 865000 910000 955000 1e+06 100000 145000 190000 235000 280000 325000 + 370000 415000 460000 505000 550000 595000 640000 685000 730000 775000 820000 865000 + 910000 955000 1e+06 100000 145000 190000 235000 280000 325000 370000 415000 460000 + 505000 550000 595000 640000 685000 730000 775000 820000 865000 910000 955000 1e+06 + 100000 145000 190000 235000 280000 325000 370000 415000 460000 505000 550000 595000 + 640000 685000 730000 775000 820000 865000 910000 955000 1e+06 100000 145000 190000 + 235000 280000 325000 370000 415000 460000 505000 550000 595000 640000 685000 730000 + 775000 820000 865000 910000 955000 1e+06 100000 145000 190000 235000 280000 325000 + 370000 415000 460000 505000 550000 595000 640000 685000 730000 775000 820000 865000 + 910000 955000 1e+06 100000 145000 190000 235000 280000 325000 370000 415000 460000 + 505000 550000 595000 640000 685000 730000 775000 820000 865000 910000 955000 1e+06 + 100000 145000 190000 235000 280000 325000 370000 415000 460000 505000 550000 595000 + 640000 685000 730000 775000 820000 865000 910000 955000 1e+06 100000 145000 190000 + 235000 280000 325000 370000 415000 460000 505000 550000 595000 640000 685000 730000 + 775000 820000 865000 910000 955000 1e+06 100000 145000 190000 235000 280000 325000 + 370000 415000 460000 505000 550000 595000 640000 685000 730000 775000 820000 865000 + 910000 955000 1e+06 100000 145000 190000 235000 280000 325000 370000 415000 460000 + 505000 550000 595000 640000 685000 730000 775000 820000 865000 910000 955000 1e+06 + 100000 145000 190000 235000 280000 325000 370000 415000 460000 505000 550000 595000 + 640000 685000 730000 775000 820000 865000 910000 955000 1e+06 100000 145000 190000 + 235000 280000 325000 370000 415000 460000 505000 550000 595000 640000 685000 730000 + 775000 820000 865000 910000 955000 1e+06 100000 145000 190000 235000 280000 325000 + 370000 415000 460000 505000 550000 595000 640000 685000 730000 775000 820000 865000 + 910000 955000 1e+06 100000 145000 190000 235000 280000 325000 370000 415000 460000 + 505000 550000 595000 640000 685000 730000 775000 820000 865000 910000 955000 1e+06 + 100000 145000 190000 235000 280000 325000 370000 415000 460000 505000 550000 595000 + 640000 685000 730000 775000 820000 865000 910000 955000 1e+06 + + + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 + + + + + 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 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 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 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 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 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 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 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 + + + + + 0 0 0 0.05 0 0 0 0.05 0 0.05 0.05 0 + 0.1 0 0 0.1 0.05 0 0.15 0 0 0.15 0.05 0 + 0.2 0 0 0.2 0.05 0 0.25 0 0 0.25 0.05 0 + 0.3 0 0 0.3 0.05 0 0.35 0 0 0.35 0.05 0 + 0.4 0 0 0.4 0.05 0 0.45 0 0 0.45 0.05 0 + 0.5 0 0 0.5 0.05 0 0.55 0 0 0.55 0.05 0 + 0.6 0 0 0.6 0.05 0 0.65 0 0 0.65 0.05 0 + 0.7 0 0 0.7 0.05 0 0.75 0 0 0.75 0.05 0 + 0.8 0 0 0.8 0.05 0 0.85 0 0 0.85 0.05 0 + 0.9 0 0 0.9 0.05 0 0.95 0 0 0.95 0.05 0 + 1 0 0 1 0.05 0 0 0.1 0 0.05 0.1 0 + 0.1 0.1 0 0.15 0.1 0 0.2 0.1 0 0.25 0.1 0 + 0.3 0.1 0 0.35 0.1 0 0.4 0.1 0 0.45 0.1 0 + 0.5 0.1 0 0.55 0.1 0 0.6 0.1 0 0.65 0.1 0 + 0.7 0.1 0 0.75 0.1 0 0.8 0.1 0 0.85 0.1 0 + 0.9 0.1 0 0.95 0.1 0 1 0.1 0 0 0.15 0 + 0.05 0.15 0 0.1 0.15 0 0.15 0.15 0 0.2 0.15 0 + 0.25 0.15 0 0.3 0.15 0 0.35 0.15 0 0.4 0.15 0 + 0.45 0.15 0 0.5 0.15 0 0.55 0.15 0 0.6 0.15 0 + 0.65 0.15 0 0.7 0.15 0 0.75 0.15 0 0.8 0.15 0 + 0.85 0.15 0 0.9 0.15 0 0.95 0.15 0 1 0.15 0 + 0 0.2 0 0.05 0.2 0 0.1 0.2 0 0.15 0.2 0 + 0.2 0.2 0 0.25 0.2 0 0.3 0.2 0 0.35 0.2 0 + 0.4 0.2 0 0.45 0.2 0 0.5 0.2 0 0.55 0.2 0 + 0.6 0.2 0 0.65 0.2 0 0.7 0.2 0 0.75 0.2 0 + 0.8 0.2 0 0.85 0.2 0 0.9 0.2 0 0.95 0.2 0 + 1 0.2 0 0 0.25 0 0.05 0.25 0 0.1 0.25 0 + 0.15 0.25 0 0.2 0.25 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 + 0.55 0.25 0 0.6 0.25 0 0.65 0.25 0 0.7 0.25 0 + 0.75 0.25 0 0.8 0.25 0 0.85 0.25 0 0.9 0.25 0 + 0.95 0.25 0 1 0.25 0 0 0.3 0 0.05 0.3 0 + 0.1 0.3 0 0.15 0.3 0 0.2 0.3 0 0.25 0.3 0 + 0.3 0.3 0 0.35 0.3 0 0.4 0.3 0 0.45 0.3 0 + 0.5 0.3 0 0.55 0.3 0 0.6 0.3 0 0.65 0.3 0 + 0.7 0.3 0 0.75 0.3 0 0.8 0.3 0 0.85 0.3 0 + 0.9 0.3 0 0.95 0.3 0 1 0.3 0 0 0.35 0 + 0.05 0.35 0 0.1 0.35 0 0.15 0.35 0 0.2 0.35 0 + 0.25 0.35 0 0.3 0.35 0 0.35 0.35 0 0.4 0.35 0 + 0.45 0.35 0 0.5 0.35 0 0.55 0.35 0 0.6 0.35 0 + 0.65 0.35 0 0.7 0.35 0 0.75 0.35 0 0.8 0.35 0 + 0.85 0.35 0 0.9 0.35 0 0.95 0.35 0 1 0.35 0 + 0 0.4 0 0.05 0.4 0 0.1 0.4 0 0.15 0.4 0 + 0.2 0.4 0 0.25 0.4 0 0.3 0.4 0 0.35 0.4 0 + 0.4 0.4 0 0.45 0.4 0 0.5 0.4 0 0.55 0.4 0 + 0.6 0.4 0 0.65 0.4 0 0.7 0.4 0 0.75 0.4 0 + 0.8 0.4 0 0.85 0.4 0 0.9 0.4 0 0.95 0.4 0 + 1 0.4 0 0 0.45 0 0.05 0.45 0 0.1 0.45 0 + 0.15 0.45 0 0.2 0.45 0 0.25 0.45 0 0.3 0.45 0 + 0.35 0.45 0 0.4 0.45 0 0.45 0.45 0 0.5 0.45 0 + 0.55 0.45 0 0.6 0.45 0 0.65 0.45 0 0.7 0.45 0 + 0.75 0.45 0 0.8 0.45 0 0.85 0.45 0 0.9 0.45 0 + 0.95 0.45 0 1 0.45 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.8 0.5 0 0.85 0.5 0 + 0.9 0.5 0 0.95 0.5 0 1 0.5 0 0 0.55 0 + 0.05 0.55 0 0.1 0.55 0 0.15 0.55 0 0.2 0.55 0 + 0.25 0.55 0 0.3 0.55 0 0.35 0.55 0 0.4 0.55 0 + 0.45 0.55 0 0.5 0.55 0 0.55 0.55 0 0.6 0.55 0 + 0.65 0.55 0 0.7 0.55 0 0.75 0.55 0 0.8 0.55 0 + 0.85 0.55 0 0.9 0.55 0 0.95 0.55 0 1 0.55 0 + 0 0.6 0 0.05 0.6 0 0.1 0.6 0 0.15 0.6 0 + 0.2 0.6 0 0.25 0.6 0 0.3 0.6 0 0.35 0.6 0 + 0.4 0.6 0 0.45 0.6 0 0.5 0.6 0 0.55 0.6 0 + 0.6 0.6 0 0.65 0.6 0 0.7 0.6 0 0.75 0.6 0 + 0.8 0.6 0 0.85 0.6 0 0.9 0.6 0 0.95 0.6 0 + 1 0.6 0 0 0.65 0 0.05 0.65 0 0.1 0.65 0 + 0.15 0.65 0 0.2 0.65 0 0.25 0.65 0 0.3 0.65 0 + 0.35 0.65 0 0.4 0.65 0 0.45 0.65 0 0.5 0.65 0 + 0.55 0.65 0 0.6 0.65 0 0.65 0.65 0 0.7 0.65 0 + 0.75 0.65 0 0.8 0.65 0 0.85 0.65 0 0.9 0.65 0 + 0.95 0.65 0 1 0.65 0 0 0.7 0 0.05 0.7 0 + 0.1 0.7 0 0.15 0.7 0 0.2 0.7 0 0.25 0.7 0 + 0.3 0.7 0 0.35 0.7 0 0.4 0.7 0 0.45 0.7 0 + 0.5 0.7 0 0.55 0.7 0 0.6 0.7 0 0.65 0.7 0 + 0.7 0.7 0 0.75 0.7 0 0.8 0.7 0 0.85 0.7 0 + 0.9 0.7 0 0.95 0.7 0 1 0.7 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 0.8 0.75 0 + 0.85 0.75 0 0.9 0.75 0 0.95 0.75 0 1 0.75 0 + 0 0.8 0 0.05 0.8 0 0.1 0.8 0 0.15 0.8 0 + 0.2 0.8 0 0.25 0.8 0 0.3 0.8 0 0.35 0.8 0 + 0.4 0.8 0 0.45 0.8 0 0.5 0.8 0 0.55 0.8 0 + 0.6 0.8 0 0.65 0.8 0 0.7 0.8 0 0.75 0.8 0 + 0.8 0.8 0 0.85 0.8 0 0.9 0.8 0 0.95 0.8 0 + 1 0.8 0 0 0.85 0 0.05 0.85 0 0.1 0.85 0 + 0.15 0.85 0 0.2 0.85 0 0.25 0.85 0 0.3 0.85 0 + 0.35 0.85 0 0.4 0.85 0 0.45 0.85 0 0.5 0.85 0 + 0.55 0.85 0 0.6 0.85 0 0.65 0.85 0 0.7 0.85 0 + 0.75 0.85 0 0.8 0.85 0 0.85 0.85 0 0.9 0.85 0 + 0.95 0.85 0 1 0.85 0 0 0.9 0 0.05 0.9 0 + 0.1 0.9 0 0.15 0.9 0 0.2 0.9 0 0.25 0.9 0 + 0.3 0.9 0 0.35 0.9 0 0.4 0.9 0 0.45 0.9 0 + 0.5 0.9 0 0.55 0.9 0 0.6 0.9 0 0.65 0.9 0 + 0.7 0.9 0 0.75 0.9 0 0.8 0.9 0 0.85 0.9 0 + 0.9 0.9 0 0.95 0.9 0 1 0.9 0 0 0.95 0 + 0.05 0.95 0 0.1 0.95 0 0.15 0.95 0 0.2 0.95 0 + 0.25 0.95 0 0.3 0.95 0 0.35 0.95 0 0.4 0.95 0 + 0.45 0.95 0 0.5 0.95 0 0.55 0.95 0 0.6 0.95 0 + 0.65 0.95 0 0.7 0.95 0 0.75 0.95 0 0.8 0.95 0 + 0.85 0.95 0 0.9 0.95 0 0.95 0.95 0 1 0.95 0 + 0 1 0 0.05 1 0 0.1 1 0 0.15 1 0 + 0.2 1 0 0.25 1 0 0.3 1 0 0.35 1 0 + 0.4 1 0 0.45 1 0 0.5 1 0 0.55 1 0 + 0.6 1 0 0.65 1 0 0.7 1 0 0.75 1 0 + 0.8 1 0 0.85 1 0 0.9 1 0 0.95 1 0 + 1 1 0 + + + + + 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 + 30 32 33 31 32 34 35 33 34 36 37 35 + 36 38 39 37 38 40 41 39 2 3 43 42 + 3 5 44 43 5 7 45 44 7 9 46 45 + 9 11 47 46 11 13 48 47 13 15 49 48 + 15 17 50 49 17 19 51 50 19 21 52 51 + 21 23 53 52 23 25 54 53 25 27 55 54 + 27 29 56 55 29 31 57 56 31 33 58 57 + 33 35 59 58 35 37 60 59 37 39 61 60 + 39 41 62 61 42 43 64 63 43 44 65 64 + 44 45 66 65 45 46 67 66 46 47 68 67 + 47 48 69 68 48 49 70 69 49 50 71 70 + 50 51 72 71 51 52 73 72 52 53 74 73 + 53 54 75 74 54 55 76 75 55 56 77 76 + 56 57 78 77 57 58 79 78 58 59 80 79 + 59 60 81 80 60 61 82 81 61 62 83 82 + 63 64 85 84 64 65 86 85 65 66 87 86 + 66 67 88 87 67 68 89 88 68 69 90 89 + 69 70 91 90 70 71 92 91 71 72 93 92 + 72 73 94 93 73 74 95 94 74 75 96 95 + 75 76 97 96 76 77 98 97 77 78 99 98 + 78 79 100 99 79 80 101 100 80 81 102 101 + 81 82 103 102 82 83 104 103 84 85 106 105 + 85 86 107 106 86 87 108 107 87 88 109 108 + 88 89 110 109 89 90 111 110 90 91 112 111 + 91 92 113 112 92 93 114 113 93 94 115 114 + 94 95 116 115 95 96 117 116 96 97 118 117 + 97 98 119 118 98 99 120 119 99 100 121 120 + 100 101 122 121 101 102 123 122 102 103 124 123 + 103 104 125 124 105 106 127 126 106 107 128 127 + 107 108 129 128 108 109 130 129 109 110 131 130 + 110 111 132 131 111 112 133 132 112 113 134 133 + 113 114 135 134 114 115 136 135 115 116 137 136 + 116 117 138 137 117 118 139 138 118 119 140 139 + 119 120 141 140 120 121 142 141 121 122 143 142 + 122 123 144 143 123 124 145 144 124 125 146 145 + 126 127 148 147 127 128 149 148 128 129 150 149 + 129 130 151 150 130 131 152 151 131 132 153 152 + 132 133 154 153 133 134 155 154 134 135 156 155 + 135 136 157 156 136 137 158 157 137 138 159 158 + 138 139 160 159 139 140 161 160 140 141 162 161 + 141 142 163 162 142 143 164 163 143 144 165 164 + 144 145 166 165 145 146 167 166 147 148 169 168 + 148 149 170 169 149 150 171 170 150 151 172 171 + 151 152 173 172 152 153 174 173 153 154 175 174 + 154 155 176 175 155 156 177 176 156 157 178 177 + 157 158 179 178 158 159 180 179 159 160 181 180 + 160 161 182 181 161 162 183 182 162 163 184 183 + 163 164 185 184 164 165 186 185 165 166 187 186 + 166 167 188 187 168 169 190 189 169 170 191 190 + 170 171 192 191 171 172 193 192 172 173 194 193 + 173 174 195 194 174 175 196 195 175 176 197 196 + 176 177 198 197 177 178 199 198 178 179 200 199 + 179 180 201 200 180 181 202 201 181 182 203 202 + 182 183 204 203 183 184 205 204 184 185 206 205 + 185 186 207 206 186 187 208 207 187 188 209 208 + 189 190 211 210 190 191 212 211 191 192 213 212 + 192 193 214 213 193 194 215 214 194 195 216 215 + 195 196 217 216 196 197 218 217 197 198 219 218 + 198 199 220 219 199 200 221 220 200 201 222 221 + 201 202 223 222 202 203 224 223 203 204 225 224 + 204 205 226 225 205 206 227 226 206 207 228 227 + 207 208 229 228 208 209 230 229 210 211 232 231 + 211 212 233 232 212 213 234 233 213 214 235 234 + 214 215 236 235 215 216 237 236 216 217 238 237 + 217 218 239 238 218 219 240 239 219 220 241 240 + 220 221 242 241 221 222 243 242 222 223 244 243 + 223 224 245 244 224 225 246 245 225 226 247 246 + 226 227 248 247 227 228 249 248 228 229 250 249 + 229 230 251 250 231 232 253 252 232 233 254 253 + 233 234 255 254 234 235 256 255 235 236 257 256 + 236 237 258 257 237 238 259 258 238 239 260 259 + 239 240 261 260 240 241 262 261 241 242 263 262 + 242 243 264 263 243 244 265 264 244 245 266 265 + 245 246 267 266 246 247 268 267 247 248 269 268 + 248 249 270 269 249 250 271 270 250 251 272 271 + 252 253 274 273 253 254 275 274 254 255 276 275 + 255 256 277 276 256 257 278 277 257 258 279 278 + 258 259 280 279 259 260 281 280 260 261 282 281 + 261 262 283 282 262 263 284 283 263 264 285 284 + 264 265 286 285 265 266 287 286 266 267 288 287 + 267 268 289 288 268 269 290 289 269 270 291 290 + 270 271 292 291 271 272 293 292 273 274 295 294 + 274 275 296 295 275 276 297 296 276 277 298 297 + 277 278 299 298 278 279 300 299 279 280 301 300 + 280 281 302 301 281 282 303 302 282 283 304 303 + 283 284 305 304 284 285 306 305 285 286 307 306 + 286 287 308 307 287 288 309 308 288 289 310 309 + 289 290 311 310 290 291 312 311 291 292 313 312 + 292 293 314 313 294 295 316 315 295 296 317 316 + 296 297 318 317 297 298 319 318 298 299 320 319 + 299 300 321 320 300 301 322 321 301 302 323 322 + 302 303 324 323 303 304 325 324 304 305 326 325 + 305 306 327 326 306 307 328 327 307 308 329 328 + 308 309 330 329 309 310 331 330 310 311 332 331 + 311 312 333 332 312 313 334 333 313 314 335 334 + 315 316 337 336 316 317 338 337 317 318 339 338 + 318 319 340 339 319 320 341 340 320 321 342 341 + 321 322 343 342 322 323 344 343 323 324 345 344 + 324 325 346 345 325 326 347 346 326 327 348 347 + 327 328 349 348 328 329 350 349 329 330 351 350 + 330 331 352 351 331 332 353 352 332 333 354 353 + 333 334 355 354 334 335 356 355 336 337 358 357 + 337 338 359 358 338 339 360 359 339 340 361 360 + 340 341 362 361 341 342 363 362 342 343 364 363 + 343 344 365 364 344 345 366 365 345 346 367 366 + 346 347 368 367 347 348 369 368 348 349 370 369 + 349 350 371 370 350 351 372 371 351 352 373 372 + 352 353 374 373 353 354 375 374 354 355 376 375 + 355 356 377 376 357 358 379 378 358 359 380 379 + 359 360 381 380 360 361 382 381 361 362 383 382 + 362 363 384 383 363 364 385 384 364 365 386 385 + 365 366 387 386 366 367 388 387 367 368 389 388 + 368 369 390 389 369 370 391 390 370 371 392 391 + 371 372 393 392 372 373 394 393 373 374 395 394 + 374 375 396 395 375 376 397 396 376 377 398 397 + 378 379 400 399 379 380 401 400 380 381 402 401 + 381 382 403 402 382 383 404 403 383 384 405 404 + 384 385 406 405 385 386 407 406 386 387 408 407 + 387 388 409 408 388 389 410 409 389 390 411 410 + 390 391 412 411 391 392 413 412 392 393 414 413 + 393 394 415 414 394 395 416 415 395 396 417 416 + 396 397 418 417 397 398 419 418 399 400 421 420 + 400 401 422 421 401 402 423 422 402 403 424 423 + 403 404 425 424 404 405 426 425 405 406 427 426 + 406 407 428 427 407 408 429 428 408 409 430 429 + 409 410 431 430 410 411 432 431 411 412 433 432 + 412 413 434 433 413 414 435 434 414 415 436 435 + 415 416 437 436 416 417 438 437 417 418 439 438 + 418 419 440 439 + + + 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 604 608 612 616 620 624 + 628 632 636 640 644 648 652 656 660 664 668 672 + 676 680 684 688 692 696 700 704 708 712 716 720 + 724 728 732 736 740 744 748 752 756 760 764 768 + 772 776 780 784 788 792 796 800 804 808 812 816 + 820 824 828 832 836 840 844 848 852 856 860 864 + 868 872 876 880 884 888 892 896 900 904 908 912 + 916 920 924 928 932 936 940 944 948 952 956 960 + 964 968 972 976 980 984 988 992 996 1000 1004 1008 + 1012 1016 1020 1024 1028 1032 1036 1040 1044 1048 1052 1056 + 1060 1064 1068 1072 1076 1080 1084 1088 1092 1096 1100 1104 + 1108 1112 1116 1120 1124 1128 1132 1136 1140 1144 1148 1152 + 1156 1160 1164 1168 1172 1176 1180 1184 1188 1192 1196 1200 + 1204 1208 1212 1216 1220 1224 1228 1232 1236 1240 1244 1248 + 1252 1256 1260 1264 1268 1272 1276 1280 1284 1288 1292 1296 + 1300 1304 1308 1312 1316 1320 1324 1328 1332 1336 1340 1344 + 1348 1352 1356 1360 1364 1368 1372 1376 1380 1384 1388 1392 + 1396 1400 1404 1408 1412 1416 1420 1424 1428 1432 1436 1440 + 1444 1448 1452 1456 1460 1464 1468 1472 1476 1480 1484 1488 + 1492 1496 1500 1504 1508 1512 1516 1520 1524 1528 1532 1536 + 1540 1544 1548 1552 1556 1560 1564 1568 1572 1576 1580 1584 + 1588 1592 1596 1600 + + + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 + + + + + diff --git a/test/references/1pni_simple_tpfa-reference.vtu b/test/references/1pni_simple_tpfa-reference.vtu new file mode 100644 index 0000000000..67e06bde63 --- /dev/null +++ b/test/references/1pni_simple_tpfa-reference.vtu @@ -0,0 +1,442 @@ + + + + + + + 122500 167500 212500 257500 302500 347500 392500 437500 482500 527500 572500 617500 + 662500 707500 752500 797500 842500 887500 932500 977500 122500 167500 212500 257500 + 302500 347500 392500 437500 482500 527500 572500 617500 662500 707500 752500 797500 + 842500 887500 932500 977500 122500 167500 212500 257500 302500 347500 392500 437500 + 482500 527500 572500 617500 662500 707500 752500 797500 842500 887500 932500 977500 + 122500 167500 212500 257500 302500 347500 392500 437500 482500 527500 572500 617500 + 662500 707500 752500 797500 842500 887500 932500 977500 122500 167500 212500 257500 + 302500 347500 392500 437500 482500 527500 572500 617500 662500 707500 752500 797500 + 842500 887500 932500 977500 122500 167500 212500 257500 302500 347500 392500 437500 + 482500 527500 572500 617500 662500 707500 752500 797500 842500 887500 932500 977500 + 122500 167500 212500 257500 302500 347500 392500 437500 482500 527500 572500 617500 + 662500 707500 752500 797500 842500 887500 932500 977500 122500 167500 212500 257500 + 302500 347500 392500 437500 482500 527500 572500 617500 662500 707500 752500 797500 + 842500 887500 932500 977500 122500 167500 212500 257500 302500 347500 392500 437500 + 482500 527500 572500 617500 662500 707500 752500 797500 842500 887500 932500 977500 + 122500 167500 212500 257500 302500 347500 392500 437500 482500 527500 572500 617500 + 662500 707500 752500 797500 842500 887500 932500 977500 122500 167500 212500 257500 + 302500 347500 392500 437500 482500 527500 572500 617500 662500 707500 752500 797500 + 842500 887500 932500 977500 122500 167500 212500 257500 302500 347500 392500 437500 + 482500 527500 572500 617500 662500 707500 752500 797500 842500 887500 932500 977500 + 122500 167500 212500 257500 302500 347500 392500 437500 482500 527500 572500 617500 + 662500 707500 752500 797500 842500 887500 932500 977500 122500 167500 212500 257500 + 302500 347500 392500 437500 482500 527500 572500 617500 662500 707500 752500 797500 + 842500 887500 932500 977500 122500 167500 212500 257500 302500 347500 392500 437500 + 482500 527500 572500 617500 662500 707500 752500 797500 842500 887500 932500 977500 + 122500 167500 212500 257500 302500 347500 392500 437500 482500 527500 572500 617500 + 662500 707500 752500 797500 842500 887500 932500 977500 122500 167500 212500 257500 + 302500 347500 392500 437500 482500 527500 572500 617500 662500 707500 752500 797500 + 842500 887500 932500 977500 122500 167500 212500 257500 302500 347500 392500 437500 + 482500 527500 572500 617500 662500 707500 752500 797500 842500 887500 932500 977500 + 122500 167500 212500 257500 302500 347500 392500 437500 482500 527500 572500 617500 + 662500 707500 752500 797500 842500 887500 932500 977500 122500 167500 212500 257500 + 302500 347500 392500 437500 482500 527500 572500 617500 662500 707500 752500 797500 + 842500 887500 932500 977500 + + + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 300 300 300 300 300 300 300 300 + 300 300 300 300 + + + 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 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 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 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 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 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 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 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 + + + + + 0 0 0 0.05 0 0 0 0.05 0 0.05 0.05 0 + 0.1 0 0 0.1 0.05 0 0.15 0 0 0.15 0.05 0 + 0.2 0 0 0.2 0.05 0 0.25 0 0 0.25 0.05 0 + 0.3 0 0 0.3 0.05 0 0.35 0 0 0.35 0.05 0 + 0.4 0 0 0.4 0.05 0 0.45 0 0 0.45 0.05 0 + 0.5 0 0 0.5 0.05 0 0.55 0 0 0.55 0.05 0 + 0.6 0 0 0.6 0.05 0 0.65 0 0 0.65 0.05 0 + 0.7 0 0 0.7 0.05 0 0.75 0 0 0.75 0.05 0 + 0.8 0 0 0.8 0.05 0 0.85 0 0 0.85 0.05 0 + 0.9 0 0 0.9 0.05 0 0.95 0 0 0.95 0.05 0 + 1 0 0 1 0.05 0 0 0.1 0 0.05 0.1 0 + 0.1 0.1 0 0.15 0.1 0 0.2 0.1 0 0.25 0.1 0 + 0.3 0.1 0 0.35 0.1 0 0.4 0.1 0 0.45 0.1 0 + 0.5 0.1 0 0.55 0.1 0 0.6 0.1 0 0.65 0.1 0 + 0.7 0.1 0 0.75 0.1 0 0.8 0.1 0 0.85 0.1 0 + 0.9 0.1 0 0.95 0.1 0 1 0.1 0 0 0.15 0 + 0.05 0.15 0 0.1 0.15 0 0.15 0.15 0 0.2 0.15 0 + 0.25 0.15 0 0.3 0.15 0 0.35 0.15 0 0.4 0.15 0 + 0.45 0.15 0 0.5 0.15 0 0.55 0.15 0 0.6 0.15 0 + 0.65 0.15 0 0.7 0.15 0 0.75 0.15 0 0.8 0.15 0 + 0.85 0.15 0 0.9 0.15 0 0.95 0.15 0 1 0.15 0 + 0 0.2 0 0.05 0.2 0 0.1 0.2 0 0.15 0.2 0 + 0.2 0.2 0 0.25 0.2 0 0.3 0.2 0 0.35 0.2 0 + 0.4 0.2 0 0.45 0.2 0 0.5 0.2 0 0.55 0.2 0 + 0.6 0.2 0 0.65 0.2 0 0.7 0.2 0 0.75 0.2 0 + 0.8 0.2 0 0.85 0.2 0 0.9 0.2 0 0.95 0.2 0 + 1 0.2 0 0 0.25 0 0.05 0.25 0 0.1 0.25 0 + 0.15 0.25 0 0.2 0.25 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 + 0.55 0.25 0 0.6 0.25 0 0.65 0.25 0 0.7 0.25 0 + 0.75 0.25 0 0.8 0.25 0 0.85 0.25 0 0.9 0.25 0 + 0.95 0.25 0 1 0.25 0 0 0.3 0 0.05 0.3 0 + 0.1 0.3 0 0.15 0.3 0 0.2 0.3 0 0.25 0.3 0 + 0.3 0.3 0 0.35 0.3 0 0.4 0.3 0 0.45 0.3 0 + 0.5 0.3 0 0.55 0.3 0 0.6 0.3 0 0.65 0.3 0 + 0.7 0.3 0 0.75 0.3 0 0.8 0.3 0 0.85 0.3 0 + 0.9 0.3 0 0.95 0.3 0 1 0.3 0 0 0.35 0 + 0.05 0.35 0 0.1 0.35 0 0.15 0.35 0 0.2 0.35 0 + 0.25 0.35 0 0.3 0.35 0 0.35 0.35 0 0.4 0.35 0 + 0.45 0.35 0 0.5 0.35 0 0.55 0.35 0 0.6 0.35 0 + 0.65 0.35 0 0.7 0.35 0 0.75 0.35 0 0.8 0.35 0 + 0.85 0.35 0 0.9 0.35 0 0.95 0.35 0 1 0.35 0 + 0 0.4 0 0.05 0.4 0 0.1 0.4 0 0.15 0.4 0 + 0.2 0.4 0 0.25 0.4 0 0.3 0.4 0 0.35 0.4 0 + 0.4 0.4 0 0.45 0.4 0 0.5 0.4 0 0.55 0.4 0 + 0.6 0.4 0 0.65 0.4 0 0.7 0.4 0 0.75 0.4 0 + 0.8 0.4 0 0.85 0.4 0 0.9 0.4 0 0.95 0.4 0 + 1 0.4 0 0 0.45 0 0.05 0.45 0 0.1 0.45 0 + 0.15 0.45 0 0.2 0.45 0 0.25 0.45 0 0.3 0.45 0 + 0.35 0.45 0 0.4 0.45 0 0.45 0.45 0 0.5 0.45 0 + 0.55 0.45 0 0.6 0.45 0 0.65 0.45 0 0.7 0.45 0 + 0.75 0.45 0 0.8 0.45 0 0.85 0.45 0 0.9 0.45 0 + 0.95 0.45 0 1 0.45 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.8 0.5 0 0.85 0.5 0 + 0.9 0.5 0 0.95 0.5 0 1 0.5 0 0 0.55 0 + 0.05 0.55 0 0.1 0.55 0 0.15 0.55 0 0.2 0.55 0 + 0.25 0.55 0 0.3 0.55 0 0.35 0.55 0 0.4 0.55 0 + 0.45 0.55 0 0.5 0.55 0 0.55 0.55 0 0.6 0.55 0 + 0.65 0.55 0 0.7 0.55 0 0.75 0.55 0 0.8 0.55 0 + 0.85 0.55 0 0.9 0.55 0 0.95 0.55 0 1 0.55 0 + 0 0.6 0 0.05 0.6 0 0.1 0.6 0 0.15 0.6 0 + 0.2 0.6 0 0.25 0.6 0 0.3 0.6 0 0.35 0.6 0 + 0.4 0.6 0 0.45 0.6 0 0.5 0.6 0 0.55 0.6 0 + 0.6 0.6 0 0.65 0.6 0 0.7 0.6 0 0.75 0.6 0 + 0.8 0.6 0 0.85 0.6 0 0.9 0.6 0 0.95 0.6 0 + 1 0.6 0 0 0.65 0 0.05 0.65 0 0.1 0.65 0 + 0.15 0.65 0 0.2 0.65 0 0.25 0.65 0 0.3 0.65 0 + 0.35 0.65 0 0.4 0.65 0 0.45 0.65 0 0.5 0.65 0 + 0.55 0.65 0 0.6 0.65 0 0.65 0.65 0 0.7 0.65 0 + 0.75 0.65 0 0.8 0.65 0 0.85 0.65 0 0.9 0.65 0 + 0.95 0.65 0 1 0.65 0 0 0.7 0 0.05 0.7 0 + 0.1 0.7 0 0.15 0.7 0 0.2 0.7 0 0.25 0.7 0 + 0.3 0.7 0 0.35 0.7 0 0.4 0.7 0 0.45 0.7 0 + 0.5 0.7 0 0.55 0.7 0 0.6 0.7 0 0.65 0.7 0 + 0.7 0.7 0 0.75 0.7 0 0.8 0.7 0 0.85 0.7 0 + 0.9 0.7 0 0.95 0.7 0 1 0.7 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 0.8 0.75 0 + 0.85 0.75 0 0.9 0.75 0 0.95 0.75 0 1 0.75 0 + 0 0.8 0 0.05 0.8 0 0.1 0.8 0 0.15 0.8 0 + 0.2 0.8 0 0.25 0.8 0 0.3 0.8 0 0.35 0.8 0 + 0.4 0.8 0 0.45 0.8 0 0.5 0.8 0 0.55 0.8 0 + 0.6 0.8 0 0.65 0.8 0 0.7 0.8 0 0.75 0.8 0 + 0.8 0.8 0 0.85 0.8 0 0.9 0.8 0 0.95 0.8 0 + 1 0.8 0 0 0.85 0 0.05 0.85 0 0.1 0.85 0 + 0.15 0.85 0 0.2 0.85 0 0.25 0.85 0 0.3 0.85 0 + 0.35 0.85 0 0.4 0.85 0 0.45 0.85 0 0.5 0.85 0 + 0.55 0.85 0 0.6 0.85 0 0.65 0.85 0 0.7 0.85 0 + 0.75 0.85 0 0.8 0.85 0 0.85 0.85 0 0.9 0.85 0 + 0.95 0.85 0 1 0.85 0 0 0.9 0 0.05 0.9 0 + 0.1 0.9 0 0.15 0.9 0 0.2 0.9 0 0.25 0.9 0 + 0.3 0.9 0 0.35 0.9 0 0.4 0.9 0 0.45 0.9 0 + 0.5 0.9 0 0.55 0.9 0 0.6 0.9 0 0.65 0.9 0 + 0.7 0.9 0 0.75 0.9 0 0.8 0.9 0 0.85 0.9 0 + 0.9 0.9 0 0.95 0.9 0 1 0.9 0 0 0.95 0 + 0.05 0.95 0 0.1 0.95 0 0.15 0.95 0 0.2 0.95 0 + 0.25 0.95 0 0.3 0.95 0 0.35 0.95 0 0.4 0.95 0 + 0.45 0.95 0 0.5 0.95 0 0.55 0.95 0 0.6 0.95 0 + 0.65 0.95 0 0.7 0.95 0 0.75 0.95 0 0.8 0.95 0 + 0.85 0.95 0 0.9 0.95 0 0.95 0.95 0 1 0.95 0 + 0 1 0 0.05 1 0 0.1 1 0 0.15 1 0 + 0.2 1 0 0.25 1 0 0.3 1 0 0.35 1 0 + 0.4 1 0 0.45 1 0 0.5 1 0 0.55 1 0 + 0.6 1 0 0.65 1 0 0.7 1 0 0.75 1 0 + 0.8 1 0 0.85 1 0 0.9 1 0 0.95 1 0 + 1 1 0 + + + + + 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 + 30 32 33 31 32 34 35 33 34 36 37 35 + 36 38 39 37 38 40 41 39 2 3 43 42 + 3 5 44 43 5 7 45 44 7 9 46 45 + 9 11 47 46 11 13 48 47 13 15 49 48 + 15 17 50 49 17 19 51 50 19 21 52 51 + 21 23 53 52 23 25 54 53 25 27 55 54 + 27 29 56 55 29 31 57 56 31 33 58 57 + 33 35 59 58 35 37 60 59 37 39 61 60 + 39 41 62 61 42 43 64 63 43 44 65 64 + 44 45 66 65 45 46 67 66 46 47 68 67 + 47 48 69 68 48 49 70 69 49 50 71 70 + 50 51 72 71 51 52 73 72 52 53 74 73 + 53 54 75 74 54 55 76 75 55 56 77 76 + 56 57 78 77 57 58 79 78 58 59 80 79 + 59 60 81 80 60 61 82 81 61 62 83 82 + 63 64 85 84 64 65 86 85 65 66 87 86 + 66 67 88 87 67 68 89 88 68 69 90 89 + 69 70 91 90 70 71 92 91 71 72 93 92 + 72 73 94 93 73 74 95 94 74 75 96 95 + 75 76 97 96 76 77 98 97 77 78 99 98 + 78 79 100 99 79 80 101 100 80 81 102 101 + 81 82 103 102 82 83 104 103 84 85 106 105 + 85 86 107 106 86 87 108 107 87 88 109 108 + 88 89 110 109 89 90 111 110 90 91 112 111 + 91 92 113 112 92 93 114 113 93 94 115 114 + 94 95 116 115 95 96 117 116 96 97 118 117 + 97 98 119 118 98 99 120 119 99 100 121 120 + 100 101 122 121 101 102 123 122 102 103 124 123 + 103 104 125 124 105 106 127 126 106 107 128 127 + 107 108 129 128 108 109 130 129 109 110 131 130 + 110 111 132 131 111 112 133 132 112 113 134 133 + 113 114 135 134 114 115 136 135 115 116 137 136 + 116 117 138 137 117 118 139 138 118 119 140 139 + 119 120 141 140 120 121 142 141 121 122 143 142 + 122 123 144 143 123 124 145 144 124 125 146 145 + 126 127 148 147 127 128 149 148 128 129 150 149 + 129 130 151 150 130 131 152 151 131 132 153 152 + 132 133 154 153 133 134 155 154 134 135 156 155 + 135 136 157 156 136 137 158 157 137 138 159 158 + 138 139 160 159 139 140 161 160 140 141 162 161 + 141 142 163 162 142 143 164 163 143 144 165 164 + 144 145 166 165 145 146 167 166 147 148 169 168 + 148 149 170 169 149 150 171 170 150 151 172 171 + 151 152 173 172 152 153 174 173 153 154 175 174 + 154 155 176 175 155 156 177 176 156 157 178 177 + 157 158 179 178 158 159 180 179 159 160 181 180 + 160 161 182 181 161 162 183 182 162 163 184 183 + 163 164 185 184 164 165 186 185 165 166 187 186 + 166 167 188 187 168 169 190 189 169 170 191 190 + 170 171 192 191 171 172 193 192 172 173 194 193 + 173 174 195 194 174 175 196 195 175 176 197 196 + 176 177 198 197 177 178 199 198 178 179 200 199 + 179 180 201 200 180 181 202 201 181 182 203 202 + 182 183 204 203 183 184 205 204 184 185 206 205 + 185 186 207 206 186 187 208 207 187 188 209 208 + 189 190 211 210 190 191 212 211 191 192 213 212 + 192 193 214 213 193 194 215 214 194 195 216 215 + 195 196 217 216 196 197 218 217 197 198 219 218 + 198 199 220 219 199 200 221 220 200 201 222 221 + 201 202 223 222 202 203 224 223 203 204 225 224 + 204 205 226 225 205 206 227 226 206 207 228 227 + 207 208 229 228 208 209 230 229 210 211 232 231 + 211 212 233 232 212 213 234 233 213 214 235 234 + 214 215 236 235 215 216 237 236 216 217 238 237 + 217 218 239 238 218 219 240 239 219 220 241 240 + 220 221 242 241 221 222 243 242 222 223 244 243 + 223 224 245 244 224 225 246 245 225 226 247 246 + 226 227 248 247 227 228 249 248 228 229 250 249 + 229 230 251 250 231 232 253 252 232 233 254 253 + 233 234 255 254 234 235 256 255 235 236 257 256 + 236 237 258 257 237 238 259 258 238 239 260 259 + 239 240 261 260 240 241 262 261 241 242 263 262 + 242 243 264 263 243 244 265 264 244 245 266 265 + 245 246 267 266 246 247 268 267 247 248 269 268 + 248 249 270 269 249 250 271 270 250 251 272 271 + 252 253 274 273 253 254 275 274 254 255 276 275 + 255 256 277 276 256 257 278 277 257 258 279 278 + 258 259 280 279 259 260 281 280 260 261 282 281 + 261 262 283 282 262 263 284 283 263 264 285 284 + 264 265 286 285 265 266 287 286 266 267 288 287 + 267 268 289 288 268 269 290 289 269 270 291 290 + 270 271 292 291 271 272 293 292 273 274 295 294 + 274 275 296 295 275 276 297 296 276 277 298 297 + 277 278 299 298 278 279 300 299 279 280 301 300 + 280 281 302 301 281 282 303 302 282 283 304 303 + 283 284 305 304 284 285 306 305 285 286 307 306 + 286 287 308 307 287 288 309 308 288 289 310 309 + 289 290 311 310 290 291 312 311 291 292 313 312 + 292 293 314 313 294 295 316 315 295 296 317 316 + 296 297 318 317 297 298 319 318 298 299 320 319 + 299 300 321 320 300 301 322 321 301 302 323 322 + 302 303 324 323 303 304 325 324 304 305 326 325 + 305 306 327 326 306 307 328 327 307 308 329 328 + 308 309 330 329 309 310 331 330 310 311 332 331 + 311 312 333 332 312 313 334 333 313 314 335 334 + 315 316 337 336 316 317 338 337 317 318 339 338 + 318 319 340 339 319 320 341 340 320 321 342 341 + 321 322 343 342 322 323 344 343 323 324 345 344 + 324 325 346 345 325 326 347 346 326 327 348 347 + 327 328 349 348 328 329 350 349 329 330 351 350 + 330 331 352 351 331 332 353 352 332 333 354 353 + 333 334 355 354 334 335 356 355 336 337 358 357 + 337 338 359 358 338 339 360 359 339 340 361 360 + 340 341 362 361 341 342 363 362 342 343 364 363 + 343 344 365 364 344 345 366 365 345 346 367 366 + 346 347 368 367 347 348 369 368 348 349 370 369 + 349 350 371 370 350 351 372 371 351 352 373 372 + 352 353 374 373 353 354 375 374 354 355 376 375 + 355 356 377 376 357 358 379 378 358 359 380 379 + 359 360 381 380 360 361 382 381 361 362 383 382 + 362 363 384 383 363 364 385 384 364 365 386 385 + 365 366 387 386 366 367 388 387 367 368 389 388 + 368 369 390 389 369 370 391 390 370 371 392 391 + 371 372 393 392 372 373 394 393 373 374 395 394 + 374 375 396 395 375 376 397 396 376 377 398 397 + 378 379 400 399 379 380 401 400 380 381 402 401 + 381 382 403 402 382 383 404 403 383 384 405 404 + 384 385 406 405 385 386 407 406 386 387 408 407 + 387 388 409 408 388 389 410 409 389 390 411 410 + 390 391 412 411 391 392 413 412 392 393 414 413 + 393 394 415 414 394 395 416 415 395 396 417 416 + 396 397 418 417 397 398 419 418 399 400 421 420 + 400 401 422 421 401 402 423 422 402 403 424 423 + 403 404 425 424 404 405 426 425 405 406 427 426 + 406 407 428 427 407 408 429 428 408 409 430 429 + 409 410 431 430 410 411 432 431 411 412 433 432 + 412 413 434 433 413 414 435 434 414 415 436 435 + 415 416 437 436 416 417 438 437 417 418 439 438 + 418 419 440 439 + + + 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 604 608 612 616 620 624 + 628 632 636 640 644 648 652 656 660 664 668 672 + 676 680 684 688 692 696 700 704 708 712 716 720 + 724 728 732 736 740 744 748 752 756 760 764 768 + 772 776 780 784 788 792 796 800 804 808 812 816 + 820 824 828 832 836 840 844 848 852 856 860 864 + 868 872 876 880 884 888 892 896 900 904 908 912 + 916 920 924 928 932 936 940 944 948 952 956 960 + 964 968 972 976 980 984 988 992 996 1000 1004 1008 + 1012 1016 1020 1024 1028 1032 1036 1040 1044 1048 1052 1056 + 1060 1064 1068 1072 1076 1080 1084 1088 1092 1096 1100 1104 + 1108 1112 1116 1120 1124 1128 1132 1136 1140 1144 1148 1152 + 1156 1160 1164 1168 1172 1176 1180 1184 1188 1192 1196 1200 + 1204 1208 1212 1216 1220 1224 1228 1232 1236 1240 1244 1248 + 1252 1256 1260 1264 1268 1272 1276 1280 1284 1288 1292 1296 + 1300 1304 1308 1312 1316 1320 1324 1328 1332 1336 1340 1344 + 1348 1352 1356 1360 1364 1368 1372 1376 1380 1384 1388 1392 + 1396 1400 1404 1408 1412 1416 1420 1424 1428 1432 1436 1440 + 1444 1448 1452 1456 1460 1464 1468 1472 1476 1480 1484 1488 + 1492 1496 1500 1504 1508 1512 1516 1520 1524 1528 1532 1536 + 1540 1544 1548 1552 1556 1560 1564 1568 1572 1576 1580 1584 + 1588 1592 1596 1600 + + + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 9 9 9 9 9 9 9 9 + 9 9 9 9 + + + + + -- GitLab From a62ac1e4d5d456c7b2e2688ab5d7bf0b2942bcf5 Mon Sep 17 00:00:00 2001 From: Bernd Flemisch Date: Wed, 4 Aug 2021 13:32:29 +0200 Subject: [PATCH 08/12] [assembly][nonisothermal] add default for computeVolumeWork, improve documentation --- dumux/assembly/fvlocalresidual.hh | 1 + .../immiscible/localresidual.hh | 1 + .../nonisothermal/localresidual.hh | 30 +++++++++++++++++-- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/dumux/assembly/fvlocalresidual.hh b/dumux/assembly/fvlocalresidual.hh index 5f7f46326a..0dedd666d6 100644 --- a/dumux/assembly/fvlocalresidual.hh +++ b/dumux/assembly/fvlocalresidual.hh @@ -355,6 +355,7 @@ public: * \param fvGeometry The finite-volume geometry of the element * \param curElemVolVars The volume averaged variables for all * sub-control volumes of the element at the current time level + * \param elemFluxVarsCache The cache related to flux computation * \param scv The sub control volume the source term is integrated over */ void evalSource(ElementResidualVector& residual, diff --git a/dumux/porousmediumflow/immiscible/localresidual.hh b/dumux/porousmediumflow/immiscible/localresidual.hh index e39f1258ba..189d9e471b 100644 --- a/dumux/porousmediumflow/immiscible/localresidual.hh +++ b/dumux/porousmediumflow/immiscible/localresidual.hh @@ -147,6 +147,7 @@ public: * ought to be calculated * \param fvGeometry The finite-volume geometry of the element * \param elemVolVars The volume variables associated with the element stencil + * \param elemFluxVarsCache The cache related to flux computation * \param scv The sub-control volume over which we integrate the source term * \note This is the default implementation for all models as sources are computed * in the user interface of the problem diff --git a/dumux/porousmediumflow/nonisothermal/localresidual.hh b/dumux/porousmediumflow/nonisothermal/localresidual.hh index b0e99aebc1..f09011bf4a 100644 --- a/dumux/porousmediumflow/nonisothermal/localresidual.hh +++ b/dumux/porousmediumflow/nonisothermal/localresidual.hh @@ -51,6 +51,11 @@ class EnergyLocalResidualImplementation using FVElementGeometry = typename GetPropType::LocalView; using SubControlVolume = typename FVElementGeometry::SubControlVolume; using FluxVariables = GetPropType; + using Problem = GetPropType; + using GridView = typename GetPropType::GridView; + using Element = typename GridView::template Codim<0>::Entity; + using ElementVolumeVariables = typename GetPropType::LocalView; + using ElementFluxVariablesCache = typename GetPropType::LocalView; public: /*! @@ -100,6 +105,26 @@ public: static void heatConductionFlux(NumEqVector& flux, FluxVariables& fluxVars) {} + + /*! + * \brief compute the contribution of p.div(v) for the box method + * + * \param source The source which ought to be simulated + * \param problem The problem to solve + * \param element An element which contains part of the control volume + * \param fvGeometry The finite-volume geometry + * \param elemVolVars The volume variables of the current element + * \param elemFluxVarsCache The cache related to flux computation + * \param scv The sub-control volume over which we integrate the source term + */ + static void computeVolumeWork(NumEqVector& source, + const Problem& problem, + const Element& element, + const FVElementGeometry& fvGeometry, + const ElementVolumeVariables& elemVolVars, + const ElementFluxVariablesCache& elemFluxVarsCache, + const SubControlVolume &scv) + {} }; /*! @@ -208,14 +233,15 @@ public: flux[energyEqIdx] += fluxVars.heatConductionFlux(); } - /*! - * \brief heat transfer between the phases for nonequilibrium models + * \brief compute the contribution of p.div(v) for the box method * * \param source The source which ought to be simulated + * \param problem The problem to solve * \param element An element which contains part of the control volume * \param fvGeometry The finite-volume geometry * \param elemVolVars The volume variables of the current element + * \param elemFluxVarsCache The cache related to flux computation * \param scv The sub-control volume over which we integrate the source term */ static void computeVolumeWork(NumEqVector& source, -- GitLab From 95341c7659148e05dc3312d8abc0b62beb6c701b Mon Sep 17 00:00:00 2001 From: Bernd Flemisch Date: Wed, 4 Aug 2021 15:21:31 +0200 Subject: [PATCH 09/12] [localresidual] move computeSource function to BoxLocalResidual --- dumux/assembly/boxlocalresidual.hh | 38 ++++++++++++++++++ .../immiscible/localresidual.hh | 40 ------------------- .../nonisothermal/localresidual.hh | 1 + 3 files changed, 39 insertions(+), 40 deletions(-) diff --git a/dumux/assembly/boxlocalresidual.hh b/dumux/assembly/boxlocalresidual.hh index 5b8853c4c7..6cd2f15013 100644 --- a/dumux/assembly/boxlocalresidual.hh +++ b/dumux/assembly/boxlocalresidual.hh @@ -54,9 +54,11 @@ class BoxLocalResidual : public FVLocalResidual using FVElementGeometry = typename GridGeometry::LocalView; using Extrusion = Extrusion_t; using ElementVolumeVariables = typename GetPropType::LocalView; + using SubControlVolume = typename FVElementGeometry::SubControlVolume; using SubControlVolumeFace = typename FVElementGeometry::SubControlVolumeFace; using ElementFluxVariablesCache = typename GetPropType::LocalView; using NumEqVector = Dumux::NumEqVector>; + using EnergyLocalResidual = GetPropType; public: using ElementResidualVector = typename ParentType::ElementResidualVector; @@ -129,6 +131,42 @@ public: return flux; } + + /*! + * \brief Calculate the source term of the equation + * + * \param problem The problem to solve + * \param element The DUNE Codim<0> entity for which the residual + * ought to be calculated + * \param fvGeometry The finite-volume geometry of the element + * \param elemVolVars The volume variables associated with the element stencil + * \param elemFluxVarsCache The cache related to flux computation + * \param scv The sub-control volume over which we integrate the source term + * \note This is the default implementation for all models as sources are computed + * in the user interface of the problem + * + */ + NumEqVector computeSource(const Problem& problem, + const Element& element, + const FVElementGeometry& fvGeometry, + const ElementVolumeVariables& elemVolVars, + const ElementFluxVariablesCache& elemFluxVarsCache, + const SubControlVolume &scv) const + { + NumEqVector source(0.0); + + // add contributions from volume flux sources + source += problem.source(element, fvGeometry, elemVolVars, scv); + + // add contribution from possible point sources + source += problem.scvPointSources(element, fvGeometry, elemVolVars, scv); + + // add the contribution from p.div(v) + // for cell-centered, this is part of EnergyLocalResidual::heatConvectionFlux + EnergyLocalResidual::computeVolumeWork(source, problem, element, fvGeometry, elemVolVars, elemFluxVarsCache, scv); + + return source; + } }; } // end namespace Dumux diff --git a/dumux/porousmediumflow/immiscible/localresidual.hh b/dumux/porousmediumflow/immiscible/localresidual.hh index 189d9e471b..311ff5552e 100644 --- a/dumux/porousmediumflow/immiscible/localresidual.hh +++ b/dumux/porousmediumflow/immiscible/localresidual.hh @@ -57,9 +57,6 @@ class ImmiscibleLocalResidual : public GetPropType; - static constexpr bool isBox = GridGeometry::discMethod == DiscretizationMethod::box; - public: using ParentType::ParentType; @@ -138,43 +135,6 @@ public: return flux; } - - /*! - * \brief Calculate the source term of the equation - * - * \param problem The problem to solve - * \param element The DUNE Codim<0> entity for which the residual - * ought to be calculated - * \param fvGeometry The finite-volume geometry of the element - * \param elemVolVars The volume variables associated with the element stencil - * \param elemFluxVarsCache The cache related to flux computation - * \param scv The sub-control volume over which we integrate the source term - * \note This is the default implementation for all models as sources are computed - * in the user interface of the problem - * - */ - NumEqVector computeSource(const Problem& problem, - const Element& element, - const FVElementGeometry& fvGeometry, - const ElementVolumeVariables& elemVolVars, - const ElementFluxVariablesCache& elemFluxVarsCache, - const SubControlVolume &scv) const - { - NumEqVector source(0.0); - - // add contributions from volume flux sources - source += problem.source(element, fvGeometry, elemVolVars, scv); - - // add contribution from possible point sources - source += problem.scvPointSources(element, fvGeometry, elemVolVars, scv); - - // for box, add the contribution from p.div(v) - // for cell-centered, this is part of EnergyLocalResidual::heatConvectionFlux - if constexpr (isBox) - EnergyLocalResidual::computeVolumeWork(source, problem, element, fvGeometry, elemVolVars, elemFluxVarsCache, scv); - - return source; - } }; } // end namespace Dumux diff --git a/dumux/porousmediumflow/nonisothermal/localresidual.hh b/dumux/porousmediumflow/nonisothermal/localresidual.hh index f09011bf4a..3f098b4689 100644 --- a/dumux/porousmediumflow/nonisothermal/localresidual.hh +++ b/dumux/porousmediumflow/nonisothermal/localresidual.hh @@ -28,6 +28,7 @@ #include #include +#include namespace Dumux { -- GitLab From 94433b96d848f10b410e81f406bc697a9cc7758c Mon Sep 17 00:00:00 2001 From: Bernd Flemisch Date: Mon, 9 Aug 2021 10:11:13 +0200 Subject: [PATCH 10/12] [test][1pni] cleanup test files --- .../1p/nonisothermal/simple/problem.hh | 15 +++++++-------- .../1p/nonisothermal/simple/properties.hh | 9 +++------ .../1p/nonisothermal/simple/spatialparams.hh | 8 +++----- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/test/porousmediumflow/1p/nonisothermal/simple/problem.hh b/test/porousmediumflow/1p/nonisothermal/simple/problem.hh index ea80091859..551047ea24 100644 --- a/test/porousmediumflow/1p/nonisothermal/simple/problem.hh +++ b/test/porousmediumflow/1p/nonisothermal/simple/problem.hh @@ -19,13 +19,16 @@ /** * \file * \ingroup OnePTests - * \brief Test for the OnePModel in combination with the NI model for a conduction problem. + * \brief Test for the OnePModel in combination with the NI model for a simple problem. * - * The simulation domain is a tube with an elevated temperature on the left hand side. + * The simulation domain is the unit square. While a pressure gradient from left + * to right is imposed by corresponding Dirichlet conditions, the prescribed + * temperature is the same on both sides. Therefore, a uniform constant temperature + * distribution should be expected. */ -#ifndef DUMUX_1PNI_CONDUCTION_PROBLEM_HH -#define DUMUX_1PNI_CONDUCTION_PROBLEM_HH +#ifndef DUMUX_TEST_1PNI_SIMPLE_PROBLEM_HH +#define DUMUX_TEST_1PNI_SIMPLE_PROBLEM_HH #include #include @@ -46,11 +49,7 @@ class OnePNISimpleProblem : public PorousMediumFlowProblem using GridView = typename GetPropType::GridView; using Scalar = GetPropType; using PrimaryVariables = GetPropType; - using FluidSystem = GetPropType; using BoundaryTypes = Dumux::BoundaryTypes::numEq()>; - using ThermalConductivityModel = GetPropType; - using VolumeVariables = GetPropType; - using SolutionVector = GetPropType; using Element = typename GridView::template Codim<0>::Entity; using GlobalPosition = typename Element::Geometry::GlobalCoordinate; using GridGeometry = GetPropType; diff --git a/test/porousmediumflow/1p/nonisothermal/simple/properties.hh b/test/porousmediumflow/1p/nonisothermal/simple/properties.hh index 58c5951c69..4bcaadec8e 100644 --- a/test/porousmediumflow/1p/nonisothermal/simple/properties.hh +++ b/test/porousmediumflow/1p/nonisothermal/simple/properties.hh @@ -19,13 +19,11 @@ /** * \file * \ingroup OnePTests - * \brief Test for the OnePModel in combination with the NI model for a conduction problem. - * - * The simulation domain is a tube with an elevated temperature on the left hand side. + * \brief Test for the OnePModel in combination with the NI model for a simple problem. */ -#ifndef DUMUX_1PNI_CONDUCTION_PROBLEM_PROPERTIES_HH -#define DUMUX_1PNI_CONDUCTION_PROBLEM_PROPERTIES_HH +#ifndef DUMUX_TEST_1PNI_SIMPLE_PROPERTIES_HH +#define DUMUX_TEST_1PNI_SIMPLE_PROPERTIES_HH #include @@ -34,7 +32,6 @@ #include #include #include -#include #include "problem.hh" #include "spatialparams.hh" diff --git a/test/porousmediumflow/1p/nonisothermal/simple/spatialparams.hh b/test/porousmediumflow/1p/nonisothermal/simple/spatialparams.hh index 860a13b715..d12685adcb 100644 --- a/test/porousmediumflow/1p/nonisothermal/simple/spatialparams.hh +++ b/test/porousmediumflow/1p/nonisothermal/simple/spatialparams.hh @@ -19,13 +19,12 @@ /*! * \file * \ingroup OnePTests - * \brief Definition of the spatial parameters for the 1pni problems. + * \brief Definition of the spatial parameters for the simple 1pni problem. */ -#ifndef DUMUX_TEST_1PNI_SPATIAL_PARAMS_HH -#define DUMUX_TEST_1PNI_SPATIAL_PARAMS_HH +#ifndef DUMUX_TEST_1PNI_SIMPLE_SPATIAL_PARAMS_HH +#define DUMUX_TEST_1PNI_SIMPLE_SPATIAL_PARAMS_HH -#include #include namespace Dumux { @@ -43,7 +42,6 @@ class OnePNISpatialParams using ParentType = FVSpatialParamsOneP>; - static const int dimWorld = GridView::dimensionworld; using Element = typename GridView::template Codim<0>::Entity; using GlobalPosition = typename Element::Geometry::GlobalCoordinate; -- GitLab From a212e64801ba5760215c75d5c4a48c14772614cd Mon Sep 17 00:00:00 2001 From: Bernd Flemisch Date: Wed, 27 Oct 2021 11:27:51 +0200 Subject: [PATCH 11/12] [test][nonisothermal] rename test to something more meaningful --- .../1p/nonisothermal/simple/CMakeLists.txt | 16 ++++++++-------- ...=> 1pni_without_divergence_box-reference.vtu} | 0 ...> 1pni_without_divergence_tpfa-reference.vtu} | 0 3 files changed, 8 insertions(+), 8 deletions(-) rename test/references/{1pni_simple_box-reference.vtu => 1pni_without_divergence_box-reference.vtu} (100%) rename test/references/{1pni_simple_tpfa-reference.vtu => 1pni_without_divergence_tpfa-reference.vtu} (100%) diff --git a/test/porousmediumflow/1p/nonisothermal/simple/CMakeLists.txt b/test/porousmediumflow/1p/nonisothermal/simple/CMakeLists.txt index 665d6b91af..fec48be84b 100644 --- a/test/porousmediumflow/1p/nonisothermal/simple/CMakeLists.txt +++ b/test/porousmediumflow/1p/nonisothermal/simple/CMakeLists.txt @@ -1,21 +1,21 @@ add_input_file_links() -dumux_add_test(NAME test_1pni_simple_tpfa +dumux_add_test(NAME test_1pni_without_divergence_tpfa LABELS porousmediumflow 1p 1pni SOURCES main.cc COMPILE_DEFINITIONS TYPETAG=OnePNISimpleTpfa COMMAND ${CMAKE_SOURCE_DIR}/bin/testing/runtest.py CMD_ARGS --script fuzzy - --files ${CMAKE_SOURCE_DIR}/test/references/1pni_simple_tpfa-reference.vtu - ${CMAKE_CURRENT_BINARY_DIR}/1pni_simple_tpfa-00001.vtu - --command "${CMAKE_CURRENT_BINARY_DIR}/test_1pni_simple_tpfa params.input -Problem.Name 1pni_simple_tpfa") + --files ${CMAKE_SOURCE_DIR}/test/references/1pni_without_divergence_tpfa-reference.vtu + ${CMAKE_CURRENT_BINARY_DIR}/1pni_without_divergence_tpfa-00001.vtu + --command "${CMAKE_CURRENT_BINARY_DIR}/test_1pni_without_divergence_tpfa params.input -Problem.Name 1pni_without_divergence_tpfa") -dumux_add_test(NAME test_1pni_simple_box +dumux_add_test(NAME test_1pni_without_divergence_box LABELS porousmediumflow 1p 1pni SOURCES main.cc COMPILE_DEFINITIONS TYPETAG=OnePNISimpleBox COMMAND ${CMAKE_SOURCE_DIR}/bin/testing/runtest.py CMD_ARGS --script fuzzy - --files ${CMAKE_SOURCE_DIR}/test/references/1pni_simple_box-reference.vtu - ${CMAKE_CURRENT_BINARY_DIR}/1pni_simple_box-00001.vtu - --command "${CMAKE_CURRENT_BINARY_DIR}/test_1pni_simple_box params.input -Problem.Name 1pni_simple_box") + --files ${CMAKE_SOURCE_DIR}/test/references/1pni_without_divergence_box-reference.vtu + ${CMAKE_CURRENT_BINARY_DIR}/1pni_without_divergence_box-00001.vtu + --command "${CMAKE_CURRENT_BINARY_DIR}/test_1pni_without_divergence_box params.input -Problem.Name 1pni_without_divergence_box") diff --git a/test/references/1pni_simple_box-reference.vtu b/test/references/1pni_without_divergence_box-reference.vtu similarity index 100% rename from test/references/1pni_simple_box-reference.vtu rename to test/references/1pni_without_divergence_box-reference.vtu diff --git a/test/references/1pni_simple_tpfa-reference.vtu b/test/references/1pni_without_divergence_tpfa-reference.vtu similarity index 100% rename from test/references/1pni_simple_tpfa-reference.vtu rename to test/references/1pni_without_divergence_tpfa-reference.vtu -- GitLab From 08898eef90cffead71c71e94aeec8c7b1e1c9c9b Mon Sep 17 00:00:00 2001 From: Bernd Flemisch Date: Wed, 24 Nov 2021 11:29:25 +0100 Subject: [PATCH 12/12] [test][nonisothermal] add another test with source term --- .../1p/nonisothermal/simple/CMakeLists.txt | 58 +++++++++++++------ .../1p/nonisothermal/simple/problem.hh | 26 ++++++++- ...u => 1pni_simple_linear_box-reference.vtu} | 0 ... => 1pni_simple_linear_tpfa-reference.vtu} | 0 4 files changed, 64 insertions(+), 20 deletions(-) rename test/references/{1pni_without_divergence_box-reference.vtu => 1pni_simple_linear_box-reference.vtu} (100%) rename test/references/{1pni_without_divergence_tpfa-reference.vtu => 1pni_simple_linear_tpfa-reference.vtu} (100%) diff --git a/test/porousmediumflow/1p/nonisothermal/simple/CMakeLists.txt b/test/porousmediumflow/1p/nonisothermal/simple/CMakeLists.txt index fec48be84b..2e7a95c49f 100644 --- a/test/porousmediumflow/1p/nonisothermal/simple/CMakeLists.txt +++ b/test/porousmediumflow/1p/nonisothermal/simple/CMakeLists.txt @@ -1,21 +1,43 @@ add_input_file_links() -dumux_add_test(NAME test_1pni_without_divergence_tpfa - LABELS porousmediumflow 1p 1pni - SOURCES main.cc - COMPILE_DEFINITIONS TYPETAG=OnePNISimpleTpfa - COMMAND ${CMAKE_SOURCE_DIR}/bin/testing/runtest.py - CMD_ARGS --script fuzzy - --files ${CMAKE_SOURCE_DIR}/test/references/1pni_without_divergence_tpfa-reference.vtu - ${CMAKE_CURRENT_BINARY_DIR}/1pni_without_divergence_tpfa-00001.vtu - --command "${CMAKE_CURRENT_BINARY_DIR}/test_1pni_without_divergence_tpfa params.input -Problem.Name 1pni_without_divergence_tpfa") +add_executable(test_1pni_simple_tpfa EXCLUDE_FROM_ALL main.cc) +target_compile_definitions(test_1pni_simple_tpfa PUBLIC TYPETAG=OnePNISimpleTpfa) -dumux_add_test(NAME test_1pni_without_divergence_box - LABELS porousmediumflow 1p 1pni - SOURCES main.cc - COMPILE_DEFINITIONS TYPETAG=OnePNISimpleBox - COMMAND ${CMAKE_SOURCE_DIR}/bin/testing/runtest.py - CMD_ARGS --script fuzzy - --files ${CMAKE_SOURCE_DIR}/test/references/1pni_without_divergence_box-reference.vtu - ${CMAKE_CURRENT_BINARY_DIR}/1pni_without_divergence_box-00001.vtu - --command "${CMAKE_CURRENT_BINARY_DIR}/test_1pni_without_divergence_box params.input -Problem.Name 1pni_without_divergence_box") +add_executable(test_1pni_simple_box EXCLUDE_FROM_ALL main.cc) +target_compile_definitions(test_1pni_simple_box PUBLIC TYPETAG=OnePNISimpleBox) + +dumux_add_test(NAME test_1pni_simple_linear_tpfa + TARGET test_1pni_simple_tpfa + LABELS porousmediumflow 1p 1pni + COMMAND ${CMAKE_SOURCE_DIR}/bin/testing/runtest.py + CMD_ARGS --script fuzzy + --files ${CMAKE_SOURCE_DIR}/test/references/1pni_simple_linear_tpfa-reference.vtu + ${CMAKE_CURRENT_BINARY_DIR}/1pni_simple_linear_tpfa-00001.vtu + --command "${CMAKE_CURRENT_BINARY_DIR}/test_1pni_simple_tpfa params.input -Problem.Name 1pni_simple_linear_tpfa") + +dumux_add_test(NAME test_1pni_simple_linear_box + TARGET test_1pni_simple_box + LABELS porousmediumflow 1p 1pni + COMMAND ${CMAKE_SOURCE_DIR}/bin/testing/runtest.py + CMD_ARGS --script fuzzy + --files ${CMAKE_SOURCE_DIR}/test/references/1pni_simple_linear_box-reference.vtu + ${CMAKE_CURRENT_BINARY_DIR}/1pni_simple_linear_box-00001.vtu + --command "${CMAKE_CURRENT_BINARY_DIR}/test_1pni_simple_box params.input -Problem.Name 1pni_simple_linear_box") + +dumux_add_test(NAME test_1pni_simple_source_tpfa + TARGET test_1pni_simple_tpfa + LABELS porousmediumflow 1p 1pni + COMMAND ${CMAKE_SOURCE_DIR}/bin/testing/runtest.py + CMD_ARGS --script fuzzy + --files ${CMAKE_SOURCE_DIR}/test/references/1pni_simple_source_tpfa-reference.vtu + ${CMAKE_CURRENT_BINARY_DIR}/1pni_simple_source_tpfa-00001.vtu + --command "${CMAKE_CURRENT_BINARY_DIR}/test_1pni_simple_tpfa params.input -Problem.Name 1pni_simple_source_tpfa") + +dumux_add_test(NAME test_1pni_simple_source_box + TARGET test_1pni_simple_box + LABELS porousmediumflow 1p 1pni + COMMAND ${CMAKE_SOURCE_DIR}/bin/testing/runtest.py + CMD_ARGS --script fuzzy + --files ${CMAKE_SOURCE_DIR}/test/references/1pni_simple_source_box-reference.vtu + ${CMAKE_CURRENT_BINARY_DIR}/1pni_simple_source_box-00001.vtu + --command "${CMAKE_CURRENT_BINARY_DIR}/test_1pni_simple_box params.input -Problem.Name 1pni_simple_source_box") diff --git a/test/porousmediumflow/1p/nonisothermal/simple/problem.hh b/test/porousmediumflow/1p/nonisothermal/simple/problem.hh index 551047ea24..72cd10ad2c 100644 --- a/test/porousmediumflow/1p/nonisothermal/simple/problem.hh +++ b/test/porousmediumflow/1p/nonisothermal/simple/problem.hh @@ -32,8 +32,9 @@ #include #include - #include +#include + #include namespace Dumux { @@ -53,12 +54,17 @@ class OnePNISimpleProblem : public PorousMediumFlowProblem using Element = typename GridView::template Codim<0>::Entity; using GlobalPosition = typename Element::Geometry::GlobalCoordinate; using GridGeometry = GetPropType; + using Indices = typename GetPropType::Indices; + using NumEqVector = Dumux::NumEqVector; public: OnePNISimpleProblem(std::shared_ptr gridGeometry) : ParentType(gridGeometry) { name_ = getParam("Problem.Name"); + rightPressure_ = getParam("Problem.RightPressure", 1e5); + injectionRate_ = getParam("Problem.InjectionRate", 0.0); + multiplier_ = getParam("Problem.Multiplier", 1.0); } const std::string& name() const @@ -82,7 +88,20 @@ public: if (globalPos[0] < this->gridGeometry().bBoxMin()[0] + eps_) return {1e5, 300.0}; else - return {10e5, 300.0}; + return {rightPressure_, 300.0}; + } + + NumEqVector sourceAtPos(const GlobalPosition& globalPos) const + { + NumEqVector values(0.0); + + if (globalPos[0] < 0.6 && globalPos[0] > 0.4 && globalPos[1] < 0.6 && globalPos[1] > 0.4) + { + values[Indices::conti0EqIdx] = injectionRate_; + values[Indices::conti0EqIdx] = injectionRate_*multiplier_; + } + + return values; } PrimaryVariables initialAtPos(const GlobalPosition &globalPos) const @@ -91,6 +110,9 @@ public: private: static constexpr Scalar eps_ = 1e-6; std::string name_; + Scalar rightPressure_; + Scalar injectionRate_; + Scalar multiplier_; }; } // end namespace Dumux diff --git a/test/references/1pni_without_divergence_box-reference.vtu b/test/references/1pni_simple_linear_box-reference.vtu similarity index 100% rename from test/references/1pni_without_divergence_box-reference.vtu rename to test/references/1pni_simple_linear_box-reference.vtu diff --git a/test/references/1pni_without_divergence_tpfa-reference.vtu b/test/references/1pni_simple_linear_tpfa-reference.vtu similarity index 100% rename from test/references/1pni_without_divergence_tpfa-reference.vtu rename to test/references/1pni_simple_linear_tpfa-reference.vtu -- GitLab