diff --git a/exercises/exercise-mainfile/1pproblem.hh b/exercises/exercise-mainfile/1pproblem.hh index 1b7133376bc2ddbf248bf4bdf78978ccc34417ad..5f96bf112412d95ad2fae9639a0e1a348ded48e6 100644 --- a/exercises/exercise-mainfile/1pproblem.hh +++ b/exercises/exercise-mainfile/1pproblem.hh @@ -24,91 +24,11 @@ #ifndef DUMUX_EX_MAINFILE_ONEP_TEST_PROBLEM_HH #define DUMUX_EX_MAINFILE_ONEP_TEST_PROBLEM_HH -#include - -#include -#include -#include -#include - -#include -#include -#include - - -// TODO: dumux-course-task 3 -// uncomment the incompressiblelocalresidual which is a specialization of the standard immisible localresidual for one phase incompressible cases and provides an analytic jacobian. -// #include - +#include #include -#include - -#include "1pspatialparams.hh" - -namespace Dumux -{ -// forward declarations -template class OnePTestProblem; - -namespace Properties -{ -// create the type tag nodes. Here we define the incompressible type tag as well as the compressible type tag. The incompressible uses a different fluidsystem than the compressible -// Create new type tags -namespace TTag { -struct OnePBase { using InheritsFrom = std::tuple; }; -struct OnePIncompressible { using InheritsFrom = std::tuple; }; -struct OnePCompressible { using InheritsFrom = std::tuple; }; -} // end namespace TTag - -// Set the grid type -template -struct Grid { using type = Dune::YaspGrid<2>; }; - -// Set the problem type -template -struct Problem { using type = OnePTestProblem; }; - -// set the spatial params -template -struct SpatialParams { - using type = OnePTestSpatialParams, GetPropType>; -}; -// the fluid system for incompressible tests -template -struct FluidSystem -{ -private: - using Scalar = GetPropType; -public: - using type = FluidSystems::OnePLiquid >; -}; - -// TODO: dumux-course-task 3 -// set the OneP Incompressible local residual for the OnePIncompressible type tag. This provides an analytic jacobian to be used for the analytic solution. Change that by setting: -// template -// struct LocalResidual { using type = OnePIncompressibleLocalResidual; }; - - -// the fluid system for compressible tests -template -struct FluidSystem -{ -private: - using Scalar = GetPropType; -public: - using type = FluidSystems::OnePLiquid>>; -}; - -// Disable caching (for testing purposes) -template -struct EnableGridVolumeVariablesCache { static constexpr bool value = false; }; -template -struct EnableGridFluxVariablesCache { static constexpr bool value = false; }; -template -struct EnableGridGeometryCache { static constexpr bool value = false; }; +namespace Dumux { -} // end namespace Properties /*! * \ingroup OnePTests * \brief Test problem for the compressible one-phase model: diff --git a/exercises/exercise-mainfile/README.md b/exercises/exercise-mainfile/README.md index 8119e960db3738378a35581f6fbb759b4a99a8b7..68257ed9c9b549afa3069f4bc79eeb2e0c1d0ad2 100644 --- a/exercises/exercise-mainfile/README.md +++ b/exercises/exercise-mainfile/README.md @@ -33,12 +33,17 @@ Locate all the files you will need for this exercise * The __main file__ for the __compressible, stationary__ problem : exercise1pbmain.cc * The __main file__ for the __compressible, instationary__ problem : exercise1pcmain.cc * The shared __problem file__: 1pproblem.hh +* The shared __properties file__: properties.hh * The shared __spatial parameters file__: 1pspatialparams.hh * The __input file__ for the __incompressible, stationary__ problem: exercise_mainfile_a.input * The __input file__ for the __compressible, stationary__ problem: exercise_mainfile_b.input * The __input file__ for the __compressible, instationary__ problem: exercise_mainfile_c.input -Please pay special attention to the similarities and differences in the three main files. The first main file is solved linearly and does not need a newton solver or any other nonlinear solver method. The second problem is a nonlinear problem and uses newton's method to solve the system. The third problem is nonlinear and additionally instationary. Therefore, a time loop needs to be included in the main file. +Please pay special attention to the similarities and differences in the three main files. +The first main file is solved linearly and does not need a newton solver or any other nonlinear solver method. +The second problem is a nonlinear problem and uses newton's method to solve the system. +The third problem is nonlinear and additionally instationary. +Therefore, a time loop needs to be included in the main file. The general structure of any main file in DuMuX is: @@ -48,7 +53,8 @@ The general structure of any main file in DuMuX is: // define the type tag for this problem using TypeTag = Properties::TTag::OnePCompressible;  -The TypeTag is created in the 1pproblem.hh. There, you can see that it inherits from the __OneP__ and additionally from the __CCTpfaModel__. The latter defines the discretization method, which is in this case the cell-centered tpfa method. +The TypeTag is created in the properties.hh. There, you can see that it inherits from the __OneP__ and additionally from the __CCTpfaModel__. +The latter defines the discretization method, which is in this case the cell-centered tpfa method. * A gridmanager tries to create the grid either from a grid file or the input file: @@ -56,7 +62,8 @@ The TypeTag is created in the 1pproblem.hh. There, you can see that it inher GridManager> gridManager; gridManager.init();  -* We create the finite volume grid geometry, the problem, solution vector and the grid variables and initialize them. Additionally, we initialize the vtk output. Each model has a predefined model specific output with relevant parameters for that model: +* We create the finite volume grid geometry, the problem, solution vector and the grid variables and initialize them. +Additionally, we initialize the vtk output. Each model has a predefined model specific output with relevant parameters for that model: c++ // create the finite volume grid geometry @@ -86,7 +93,8 @@ IOFields::initOutputModule(vtkWriter); //!< Add model specific output fields vtkWriter.write(0.0);  -* Then, we need to assemble and solve the system. Depending on the problem, this can be done with a linear solver or a nonlinear solver. If the problem is time dependent, we additionally need a time loop. An example for that is given in exercise1pcmain.cc: +* Then, we need to assemble and solve the system. Depending on the problem, this can be done with a linear solver or a nonlinear solver. +If the problem is time dependent, we additionally need a time loop. An example for that is given in exercise1pcmain.cc: c++ // get some time loop parameters @@ -179,13 +187,21 @@ paraview 1p_incompressible_stationary.pvd ### Task 3: Analytical differentiation
-In the input file exercise_1p_a.input, you will see that there is a variable BaseEpsilon. This defines the base for the epsilon used in the numeric differentiation. If that value is too small, you will see that the solution of the numeric differentiation is not correct. Change that value to $1 \cdot 10^{-15}$ and have a look at the solution. +In the input file exercise_1p_a.input, you will see that there is a variable BaseEpsilon. +This defines the base for the epsilon used in the numeric differentiation. +If that value is too small, you will see that the solution of the numeric differentiation is not correct. +Change that value to $1 \cdot 10^{-15}$ and have a look at the solution. -For the incompressible one phase problem, it is also possible to have an analytic solution method. In this case, the epsilon does not play a role anymore, since the derivatives are calculated analytically. To implement that, follow the tips in the exercise1pamain.cc and the 1pproblem.hh marked by: +For the incompressible one phase problem, it is also possible to have an analytic solution method. +In this case, the epsilon does not play a role anymore, since the derivatives are calculated analytically. +To implement that, follow the tips in the exercise1pamain.cc and the properties.hh marked by: c++ // TODO: dumux-course-task 3  -For the analytic solution of your immiscible problem, you need analytic solutions for the derivatives of the jacobian. For that, we have a special local residual, the OnePIncompressibleLocalResidual which provides that. You just need to include incompressiblelocalresidual.hh in your 1pproblem.hh and use that instead of the immisciblelocalresidual.hh which is used as a default for all immiscible models. +For the analytic solution of your immiscible problem, you need analytic solutions for the derivatives of the jacobian. +For that, we have a special local residual, the OnePIncompressibleLocalResidual which provides that. +You just need to include incompressiblelocalresidual.hh in your properties.hh +and use that instead of the immisciblelocalresidual.hh which is used as a default for all immiscible models. Additionally, you need to set the differentiation method in the main file exercise1pamain.cc` to analytic. diff --git a/exercises/exercise-mainfile/exercise1pamain.cc b/exercises/exercise-mainfile/exercise1pamain.cc index 208ffef7611493470f2741cb9e1a68cd2aeab1c4..4888813a6b68e0dd1719afb90605e007d67b1982 100644 --- a/exercises/exercise-mainfile/exercise1pamain.cc +++ b/exercises/exercise-mainfile/exercise1pamain.cc @@ -23,7 +23,7 @@ */ #include -#include "1pproblem.hh" +#include "properties.hh" #include #include diff --git a/exercises/exercise-mainfile/exercise1pbmain.cc b/exercises/exercise-mainfile/exercise1pbmain.cc index b5091b33c9d64278f2727ac915cdb44d9e8ad85c..79f965d7c4c742b35120ca912ce5b44add8ad062 100644 --- a/exercises/exercise-mainfile/exercise1pbmain.cc +++ b/exercises/exercise-mainfile/exercise1pbmain.cc @@ -23,7 +23,7 @@ */ #include -#include "1pproblem.hh" +#include "properties.hh" #include #include diff --git a/exercises/exercise-mainfile/exercise1pcmain.cc b/exercises/exercise-mainfile/exercise1pcmain.cc index 64a7f2adaeb421efab6a669097802c4838146e42..8f89de6e0532ba746e8434242dac5a2fe65d2b76 100644 --- a/exercises/exercise-mainfile/exercise1pcmain.cc +++ b/exercises/exercise-mainfile/exercise1pcmain.cc @@ -23,7 +23,7 @@ */ #include -#include "1pproblem.hh" +#include "properties.hh" #include #include diff --git a/exercises/exercise-mainfile/properties.hh b/exercises/exercise-mainfile/properties.hh new file mode 100644 index 0000000000000000000000000000000000000000..512c16fd4cbe19b8987046238d9f46d79f8e9b6c --- /dev/null +++ b/exercises/exercise-mainfile/properties.hh @@ -0,0 +1,108 @@ +// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- +// vi: set et ts=4 sw=4 sts=4: +/***************************************************************************** + * See the file COPYING for full copying permissions. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + *****************************************************************************/ +/*! + * \file + * + * \brief The one-phase porousmediumflow problem for exercise mainfile + */ +#ifndef DUMUX_EX_MAINFILE_PROPERTIES_HH +#define DUMUX_EX_MAINFILE_PROPERTIES_HH + +#include + +#include +#include +#include +#include + +#include +#include +#include + + +#include +// TODO: dumux-course-task 3 +// uncomment the incompressiblelocalresidual which is a specialization of the standard immisible localresidual for one phase incompressible cases and provides an analytic jacobian. +// #include + +#include "1pspatialparams.hh" +#include "1pproblem.hh" + +namespace Dumux::Properties { + +// Create the new type tag nodes: +// Here we define the incompressible type tag as well as the compressible type tag. +// The incompressible uses a different fluidsystem than the compressible +namespace TTag { +struct OnePBase { using InheritsFrom = std::tuple; }; +struct OnePIncompressible { using InheritsFrom = std::tuple; }; +struct OnePCompressible { using InheritsFrom = std::tuple; }; +} // end namespace TTag + +// Set the grid type +template +struct Grid { using type = Dune::YaspGrid<2>; }; + +// Set the problem type +template +struct Problem { using type = OnePTestProblem; }; + +// set the spatial params +template +struct SpatialParams { + using type = OnePTestSpatialParams, GetPropType>; +}; + +// the fluid system for incompressible tests +template +struct FluidSystem +{ +private: + using Scalar = GetPropType; +public: + using type = FluidSystems::OnePLiquid >; +}; + +// TODO: dumux-course-task 3 +// set the OneP Incompressible local residual for the OnePIncompressible type tag. This provides an analytic jacobian to be used for the analytic solution. Change that by setting: +// template +// struct LocalResidual { using type = OnePIncompressibleLocalResidual; }; + + +// the fluid system for compressible tests +template +struct FluidSystem +{ +private: + using Scalar = GetPropType; +public: + using type = FluidSystems::OnePLiquid>>; +}; + +// Disable caching (for testing purposes) +template +struct EnableGridVolumeVariablesCache { static constexpr bool value = false; }; +template +struct EnableGridFluxVariablesCache { static constexpr bool value = false; }; +template +struct EnableGridGeometryCache { static constexpr bool value = false; }; + +} // end namespace Dumux::Properties + +#endif diff --git a/exercises/solution/exercise-mainfile/1pproblem.hh b/exercises/solution/exercise-mainfile/1pproblem.hh index 4572dfa2a00b9e9cf46b73f37aeb333f89470806..fb4bdedb50c92650b93c38351c1e0e41ab773e40 100644 --- a/exercises/solution/exercise-mainfile/1pproblem.hh +++ b/exercises/solution/exercise-mainfile/1pproblem.hh @@ -24,91 +24,11 @@ #ifndef DUMUX_EX_MAINFILE_ONEP_TEST_PROBLEM_HH #define DUMUX_EX_MAINFILE_ONEP_TEST_PROBLEM_HH -#include - -#include -#include -#include -#include - -#include -#include -#include - - -// TODO: dumux-course-task -// uncomment the incompressiblelocalresidual which is a specialization of the standard immisible localresidual for one phase incompressible cases and provides an analytic jacobian. -#include - #include -#include - -#include "1pspatialparams.hh" - -namespace Dumux -{ -// forward declarations -template class OnePTestProblem; - -namespace Properties -{ -// create the type tag nodes. Here we define the incompressible type tag as well as the compressible type tag. The incompressible uses a different fluidsystem than the compressible -// Create new type tags -namespace TTag { -struct OnePBase { using InheritsFrom = std::tuple; }; -struct OnePIncompressible { using InheritsFrom = std::tuple; }; -struct OnePCompressible { using InheritsFrom = std::tuple; }; -} // end namespace TTag - -// Set the grid type -template -struct Grid { using type = Dune::YaspGrid<2>; }; - -// Set the problem type -template -struct Problem { using type = OnePTestProblem; }; +#include -// set the spatial params -template -struct SpatialParams { - using type = OnePTestSpatialParams, GetPropType>; -}; - -// the fluid system for incompressible tests -template -struct FluidSystem -{ -private: - using Scalar = GetPropType; -public: - using type = FluidSystems::OnePLiquid >; -}; - -// TODO: dumux-course-task -// set the OneP Incompressible local residual for the OnePIncompressible type tag. This provides an analytic jacobian to be used for the analytic solution. Change that by setting: -template -struct LocalResidual { using type = OnePIncompressibleLocalResidual; }; - - -// the fluid system for compressible tests -template -struct FluidSystem -{ -private: - using Scalar = GetPropType; -public: - using type = FluidSystems::OnePLiquid>>; -}; - -// Disable caching (for testing purposes) -template -struct EnableGridVolumeVariablesCache { static constexpr bool value = false; }; -template -struct EnableGridFluxVariablesCache { static constexpr bool value = false; }; -template -struct EnableGridGeometryCache { static constexpr bool value = false; }; +namespace Dumux { -} // end namespace Properties /*! * \ingroup OnePTests * \brief Test problem for the compressible one-phase model: diff --git a/exercises/solution/exercise-mainfile/exercise1pa_solution_main.cc b/exercises/solution/exercise-mainfile/exercise1pa_solution_main.cc index 105fff588603de1f4b33f46e7bb76511581bd58f..5959079d97bce58d9ae7c594ba49c7ea4970b61c 100644 --- a/exercises/solution/exercise-mainfile/exercise1pa_solution_main.cc +++ b/exercises/solution/exercise-mainfile/exercise1pa_solution_main.cc @@ -46,6 +46,8 @@ #include #include +#include "properties.hh" + int main(int argc, char** argv) try { using namespace Dumux; @@ -105,7 +107,7 @@ int main(int argc, char** argv) try using IOFields = GetPropType; IOFields::initOutputModule(vtkWriter); //!< Add model specific output fields vtkWriter.write(0.0); - + Dune::Timer timer; // TODO: dumux-course-task diff --git a/exercises/solution/exercise-mainfile/properties.hh b/exercises/solution/exercise-mainfile/properties.hh new file mode 100644 index 0000000000000000000000000000000000000000..eac29a3feb68fe4fc418731d66bf80208688c0db --- /dev/null +++ b/exercises/solution/exercise-mainfile/properties.hh @@ -0,0 +1,107 @@ +// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- +// vi: set et ts=4 sw=4 sts=4: +/***************************************************************************** + * See the file COPYING for full copying permissions. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + *****************************************************************************/ +/*! + * \file + * + * \brief The one-phase porousmediumflow problem for exercise mainfile + */ +#ifndef DUMUX_EX_MAINFILE_PROPERTIES_HH +#define DUMUX_EX_MAINFILE_PROPERTIES_HH + +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include +// TODO: dumux-course-task +// uncomment the incompressiblelocalresidual which is a specialization of the standard immisible localresidual for one phase incompressible cases and provides an analytic jacobian. +#include + +#include "1pspatialparams.hh" +#include "1pproblem.hh" + +namespace Dumux::Properties { + +// Create the new type tag nodes. +// Here we define the incompressible type tag as well as the compressible type tag. +// The incompressible uses a different fluidsystem than the compressible. +namespace TTag { +struct OnePBase { using InheritsFrom = std::tuple; }; +struct OnePIncompressible { using InheritsFrom = std::tuple; }; +struct OnePCompressible { using InheritsFrom = std::tuple; }; +} // end namespace TTag + +// Set the grid type +template +struct Grid { using type = Dune::YaspGrid<2>; }; + +// Set the problem type +template +struct Problem { using type = OnePTestProblem; }; + +// set the spatial params +template +struct SpatialParams { + using type = OnePTestSpatialParams, GetPropType>; +}; + +// the fluid system for incompressible tests +template +struct FluidSystem +{ +private: + using Scalar = GetPropType; +public: + using type = FluidSystems::OnePLiquid >; +}; + +// TODO: dumux-course-task +// set the OneP Incompressible local residual for the OnePIncompressible type tag. This provides an analytic jacobian to be used for the analytic solution. Change that by setting: +template +struct LocalResidual { using type = OnePIncompressibleLocalResidual; }; + + +// the fluid system for compressible tests +template +struct FluidSystem +{ +private: + using Scalar = GetPropType; +public: + using type = FluidSystems::OnePLiquid>>; +}; + +// Disable caching (for testing purposes) +template +struct EnableGridVolumeVariablesCache { static constexpr bool value = false; }; +template +struct EnableGridFluxVariablesCache { static constexpr bool value = false; }; +template +struct EnableGridGeometryCache { static constexpr bool value = false; }; + +} // end namespace Dumux::Properties + +#endif