From ffc55cbde9f23c1d77c27e346e94ff266ce59703 Mon Sep 17 00:00:00 2001 From: Timo Koch <timo.koch@iws.uni-stuttgart.de> Date: Tue, 31 Mar 2020 20:48:36 +0200 Subject: [PATCH] [examples][2p] Improve introduction --- examples/2pinfiltration/.doc_config | 3 +- examples/2pinfiltration/README.md | 51 ++++++++++++------ examples/2pinfiltration/doc/intro.md | 47 +++++++++++----- examples/2pinfiltration/doc/results.md | 4 -- .../img/test_2p_pointsource_initial.png | Bin 8809 -> 0 bytes 5 files changed, 69 insertions(+), 36 deletions(-) delete mode 100644 examples/2pinfiltration/doc/results.md delete mode 100644 examples/2pinfiltration/img/test_2p_pointsource_initial.png diff --git a/examples/2pinfiltration/.doc_config b/examples/2pinfiltration/.doc_config index 4151fcbee0..a8f7fb29c6 100644 --- a/examples/2pinfiltration/.doc_config +++ b/examples/2pinfiltration/.doc_config @@ -4,7 +4,6 @@ "spatialparams.hh", "problem.hh", "properties.hh", - "main.cc", - "doc/results.md" + "main.cc" ] } diff --git a/examples/2pinfiltration/README.md b/examples/2pinfiltration/README.md index 724c139acf..a4d4e86bab 100644 --- a/examples/2pinfiltration/README.md +++ b/examples/2pinfiltration/README.md @@ -1,13 +1,38 @@ <!-- Important: This file has been automatically generated by generate_example_docs.py. Do not edit this file directly! --> -This tutorial is similar to tests/porousmediumflow/2p/adaptive and restricted to the cell-centered finite volume TPFA discretization scheme. -You need [ALUGrid][0] in order to compile and run it. +# Two-phase flow infiltration problem with adaptive grid -# Two-phase flow with infiltration and adaptive grid +In this example, you will learn how to +* solve a two-phase flow in porous media problem with two immiscible phases +* set boundary conditions and a simple injection well +* specify a lens with different porous material parameters +* use adaptive grid refinement around the saturation front +* specify a point source +* read the initial solution from a text file -## Problem set-up -In this example we model a soil contamination problem where DNAPL infiltrates a porous medium. The initial distribution of DNAPL is known and we can read it from a txt-file. +__Prerequisites:__ You need [dune-alugrid](https://gitlab.dune-project.org/extensions/dune-alugrid) in order to compile and run this example. +__Result:__ The resulting saturation distribution in this example will look like this: + + + + +## Folder layout and files + +``` +└── 2pinfiltration/ + ├── CMakeLists.txt -> build system file + ├── main.cc -> main program flow + ├── params.input -> runtime parameters + ├── properties.hh -> compile time configuration + ├── problem.hh -> boundary & initial conditions + ├── spatialparams.hh -> spatial parameter fields + └── initialsolutioncc.txt -> text file with initial solution +``` + +## Scenario and mathematical model + +We model a soil contamination problem where DNAPL infiltrates a porous medium. The initial distribution of DNAPL is known and we can read it from a txt-file. To describe that problem we use a two phase model of two immiscible fluids with the multiphase Darcy's law as the description of momentum, i.e.: ```math @@ -33,19 +58,15 @@ The lens and the initial saturation can be seen in Figures 1 and 2.  - - At the left and the right boundary of the domain we set a linear pressure gradient as a Dirichlet boundary condition. On the upper and lower boundary we set Neumann boundary conditions. DNAPL enters the model domain at the upper boundary between 1.75m ≤ x ≤ 2m with a rate of 0.04 kg/ms. That means that we set the value for the Neumann boundary flux to that rate in between 1.75m and 2m. On the rest of the Neumann boundary we set the flux to zero, which means we define it as a no-flow boundary. -In addition, the DNAPL is injected at a point source at x = 0.502 and y = 3.02 with a rate of 0.1 kg/s. +In addition, the DNAPL is injected at a point source at x = 0.502m and y = 3.02m with a rate of 0.1 kg/s. -## Discretization -We discretize the equations with a cell-centered finite volume TPFA scheme in space and an implicit Euler scheme in time. We use Newton's method to solve the system of nonlinear equations. For more information about the discretization please have a look at the [handbook](https://dumux.org/handbook). - -## Adaptive grid +We discretize the equations with a cell-centered finite volume TPFA scheme in space and an implicit Euler scheme in time. We use Newton's method to solve the system of nonlinear equations. The grid is adapitvely refined around the injection. The adaptive behaviour can be changed with input parameters in the `params.input` file. +For more information about the discretization please have a look at the [handbook](https://dumux.org/handbook). -[0]: https://gitlab.dune-project.org/extensions/dune-alugrid +# Implementation ## The file `spatialparams.hh` @@ -1060,7 +1081,3 @@ catch (...) ``` -## Results -The 2p-infiltration model computes the water saturation distribution after 500 seconds according tthe following figure: - - diff --git a/examples/2pinfiltration/doc/intro.md b/examples/2pinfiltration/doc/intro.md index 6829a1eebb..cd6657b35a 100644 --- a/examples/2pinfiltration/doc/intro.md +++ b/examples/2pinfiltration/doc/intro.md @@ -1,11 +1,36 @@ -This tutorial is similar to tests/porousmediumflow/2p/adaptive and restricted to the cell-centered finite volume TPFA discretization scheme. -You need [ALUGrid][0] in order to compile and run it. +# Two-phase flow infiltration problem with adaptive grid -# Two-phase flow with infiltration and adaptive grid +In this example, you will learn how to +* solve a two-phase flow in porous media problem with two immiscible phases +* set boundary conditions and a simple injection well +* specify a lens with different porous material parameters +* use adaptive grid refinement around the saturation front +* specify a point source +* read the initial solution from a text file -## Problem set-up -In this example we model a soil contamination problem where DNAPL infiltrates a porous medium. The initial distribution of DNAPL is known and we can read it from a txt-file. +__Prerequisites:__ You need [dune-alugrid](https://gitlab.dune-project.org/extensions/dune-alugrid) in order to compile and run this example. +__Result:__ The resulting saturation distribution in this example will look like this: + + + + +## Folder layout and files + +``` +└── 2pinfiltration/ + ├── CMakeLists.txt -> build system file + ├── main.cc -> main program flow + ├── params.input -> runtime parameters + ├── properties.hh -> compile time configuration + ├── problem.hh -> boundary & initial conditions + ├── spatialparams.hh -> spatial parameter fields + └── initialsolutioncc.txt -> text file with initial solution +``` + +## Scenario and mathematical model + +We model a soil contamination problem where DNAPL infiltrates a porous medium. The initial distribution of DNAPL is known and we can read it from a txt-file. To describe that problem we use a two phase model of two immiscible fluids with the multiphase Darcy's law as the description of momentum, i.e.: ```math @@ -31,16 +56,12 @@ The lens and the initial saturation can be seen in Figures 1 and 2.  - - At the left and the right boundary of the domain we set a linear pressure gradient as a Dirichlet boundary condition. On the upper and lower boundary we set Neumann boundary conditions. DNAPL enters the model domain at the upper boundary between 1.75m ≤ x ≤ 2m with a rate of 0.04 kg/ms. That means that we set the value for the Neumann boundary flux to that rate in between 1.75m and 2m. On the rest of the Neumann boundary we set the flux to zero, which means we define it as a no-flow boundary. -In addition, the DNAPL is injected at a point source at x = 0.502 and y = 3.02 with a rate of 0.1 kg/s. - -## Discretization -We discretize the equations with a cell-centered finite volume TPFA scheme in space and an implicit Euler scheme in time. We use Newton's method to solve the system of nonlinear equations. For more information about the discretization please have a look at the [handbook](https://dumux.org/handbook). +In addition, the DNAPL is injected at a point source at x = 0.502m and y = 3.02m with a rate of 0.1 kg/s. -## Adaptive grid +We discretize the equations with a cell-centered finite volume TPFA scheme in space and an implicit Euler scheme in time. We use Newton's method to solve the system of nonlinear equations. The grid is adapitvely refined around the injection. The adaptive behaviour can be changed with input parameters in the `params.input` file. +For more information about the discretization please have a look at the [handbook](https://dumux.org/handbook). -[0]: https://gitlab.dune-project.org/extensions/dune-alugrid +# Implementation diff --git a/examples/2pinfiltration/doc/results.md b/examples/2pinfiltration/doc/results.md deleted file mode 100644 index 0429a0d52e..0000000000 --- a/examples/2pinfiltration/doc/results.md +++ /dev/null @@ -1,4 +0,0 @@ -## Results -The 2p-infiltration model computes the water saturation distribution after 500 seconds according tthe following figure: - - diff --git a/examples/2pinfiltration/img/test_2p_pointsource_initial.png b/examples/2pinfiltration/img/test_2p_pointsource_initial.png deleted file mode 100644 index e9bb688c32dc26ef851a5887aa390c50c971971c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8809 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 ZpguGb$|^MdErB*euId?GEY`7q_&?Gvg3tf} -- GitLab