From 43ec37998a374b0098e41b0e045f0f76656691e0 Mon Sep 17 00:00:00 2001 From: Timo Koch <timo.koch@iws.uni-stuttgart.de> Date: Tue, 31 Mar 2020 21:48:39 +0200 Subject: [PATCH] [examples][ff] Reorganise introduction --- examples/freeflowchannel/.doc_config | 3 +- examples/freeflowchannel/README.md | 43 ++++++++++++++-------- examples/freeflowchannel/doc/intro.md | 35 ++++++++++++++---- examples/freeflowchannel/doc/results.md | 8 ---- examples/freeflowchannel/img/pressure.png | Bin 11860 -> 0 bytes 5 files changed, 55 insertions(+), 34 deletions(-) delete mode 100644 examples/freeflowchannel/doc/results.md delete mode 100644 examples/freeflowchannel/img/pressure.png diff --git a/examples/freeflowchannel/.doc_config b/examples/freeflowchannel/.doc_config index 09ab5781d7..317393ee81 100644 --- a/examples/freeflowchannel/.doc_config +++ b/examples/freeflowchannel/.doc_config @@ -2,7 +2,6 @@ "README.md" : [ "doc/intro.md", "problem.hh", - "main.cc", - "doc/results.md" + "main.cc" ] } diff --git a/examples/freeflowchannel/README.md b/examples/freeflowchannel/README.md index 7f4303b446..553a2ad7b2 100644 --- a/examples/freeflowchannel/README.md +++ b/examples/freeflowchannel/README.md @@ -1,15 +1,27 @@ <!-- Important: This file has been automatically generated by generate_example_docs.py. Do not edit this file directly! --> -This example is based on dumux/test/freeflow/navierstokes/channel/2d. - # Freeflow through a channel -## Problem set-up -This example contains a stationary free flow of a fluid through two parallel solid plates in two dimensions from left to right. The figure below shows the simulation set-up. The fluid flows into the system at the left with a constant velocity of $` v = 1~\frac{\text{m}}{\text{s}} `$. The inflow velocity profile is a block profile. Due to the no-slip, no-flow boundary conditions at the top and bottom plate, the velocity profile gradually assumes a parabolic shape along the channel. At the outlet, the pressure is fixed and a zero velocity gradient in x-direction is assumed. The physical domain, which is modeled is the rectangular domain $`x\in[0,10],~y\in[0,1]`$. +You learn how to: +* solve a free flow channel problem +* set outflow boundary conditions in the free-flow context - +__Results:__ In this example we will obtain the following stationary velocity profile: + + + +## Folder layout and files + +``` +└── freeflowchannel/ + ├── CMakeLists.txt -> build system file + ├── main.cc -> main program flow + ├── params.input -> runtime parameters + ├── properties.hh -> compile time configuration + └── problem.hh -> boundary & initial conditions +``` -## Model description +## Mathematical model The Stokes model without gravitation and without sources or sinks for a stationary, incompressible, laminar, single phase, one-component, isothermal ($`T=10^\circ C`$) flow is considered assuming a Newtonian fluid of constant density $` \varrho = 1~\frac{\text{kg}}{\text{m}^3} `$ and constant kinematic viscosity $` \nu = 1~\frac{\text{m}^2}{\text{s}} `$. The momentum balance ```math - \nabla\cdot\left(\mu\left(\nabla\boldsymbol{u}+\nabla\boldsymbol{u}^{\text{T}}\right)\right)+ \nabla p = 0 @@ -18,9 +30,16 @@ with density $`\varrho`$, velocity $`\boldsymbol{u}`$, dynamic viscosity $`\mu ```math \nabla \cdot \left(\varrho\boldsymbol{u}\right) =0 ``` -are discretized using a staggered-grid finite-volume scheme as spatial discretization with pressures and velocity components as primary variables. For details on the discretization scheme, have a look at the dumux [handbook](https://dumux.org/handbook). +are discretized using a staggered-grid finite-volume scheme as spatial discretization with pressures and velocity components as primary variables. For details on the discretization scheme, have a look at the Dumux [handbook](https://dumux.org/handbook). -In the following, we take a close look at the files containing the set-up: At first, boundary conditions are set in `problem.hh` for the Navier-Stokes model. Afterwards, we show the different steps for solving the model in the source file `main.cc`. At the end, we show some simulation results. +## Problem set-up +This example contains a stationary free flow of a fluid through two parallel solid plates in two dimensions from left to right. The figure below shows the simulation set-up. The fluid flows into the system at the left with a constant velocity of $` v = 1~\frac{\text{m}}{\text{s}} `$. The inflow velocity profile is a block profile. Due to the no-slip, no-flow boundary conditions at the top and bottom plate, the velocity profile gradually assumes a parabolic shape along the channel. At the outlet, the pressure is fixed and a zero velocity gradient in x-direction is assumed. The physical domain, which is modeled is the rectangular domain $`x\in[0,10],~y\in[0,1]`$. + + + +In the following, we take a close look at the files containing the set-up: At first, boundary conditions are set in `problem.hh` for the Navier-Stokes model. Afterwards, we show the different steps for solving the model in the source file `main.cc`. + +# Implementation ## The file `problem.hh` @@ -570,11 +589,3 @@ catch (...) </details> -## Results -This example computes the following stationary velocity profile: - - - -and stationary pressure profile: - - diff --git a/examples/freeflowchannel/doc/intro.md b/examples/freeflowchannel/doc/intro.md index 682e9dab3d..e4ded11d10 100644 --- a/examples/freeflowchannel/doc/intro.md +++ b/examples/freeflowchannel/doc/intro.md @@ -1,13 +1,25 @@ -This example is based on dumux/test/freeflow/navierstokes/channel/2d. - # Freeflow through a channel -## Problem set-up -This example contains a stationary free flow of a fluid through two parallel solid plates in two dimensions from left to right. The figure below shows the simulation set-up. The fluid flows into the system at the left with a constant velocity of $` v = 1~\frac{\text{m}}{\text{s}} `$. The inflow velocity profile is a block profile. Due to the no-slip, no-flow boundary conditions at the top and bottom plate, the velocity profile gradually assumes a parabolic shape along the channel. At the outlet, the pressure is fixed and a zero velocity gradient in x-direction is assumed. The physical domain, which is modeled is the rectangular domain $`x\in[0,10],~y\in[0,1]`$. +You learn how to: +* solve a free flow channel problem +* set outflow boundary conditions in the free-flow context - +__Results:__ In this example we will obtain the following stationary velocity profile: -## Model description + + +## Folder layout and files + +``` +└── freeflowchannel/ + ├── CMakeLists.txt -> build system file + ├── main.cc -> main program flow + ├── params.input -> runtime parameters + ├── properties.hh -> compile time configuration + └── problem.hh -> boundary & initial conditions +``` + +## Mathematical model The Stokes model without gravitation and without sources or sinks for a stationary, incompressible, laminar, single phase, one-component, isothermal ($`T=10^\circ C`$) flow is considered assuming a Newtonian fluid of constant density $` \varrho = 1~\frac{\text{kg}}{\text{m}^3} `$ and constant kinematic viscosity $` \nu = 1~\frac{\text{m}^2}{\text{s}} `$. The momentum balance ```math - \nabla\cdot\left(\mu\left(\nabla\boldsymbol{u}+\nabla\boldsymbol{u}^{\text{T}}\right)\right)+ \nabla p = 0 @@ -16,6 +28,13 @@ with density $`\varrho`$, velocity $`\boldsymbol{u}`$, dynamic viscosity $`\mu ```math \nabla \cdot \left(\varrho\boldsymbol{u}\right) =0 ``` -are discretized using a staggered-grid finite-volume scheme as spatial discretization with pressures and velocity components as primary variables. For details on the discretization scheme, have a look at the dumux [handbook](https://dumux.org/handbook). +are discretized using a staggered-grid finite-volume scheme as spatial discretization with pressures and velocity components as primary variables. For details on the discretization scheme, have a look at the Dumux [handbook](https://dumux.org/handbook). + +## Problem set-up +This example contains a stationary free flow of a fluid through two parallel solid plates in two dimensions from left to right. The figure below shows the simulation set-up. The fluid flows into the system at the left with a constant velocity of $` v = 1~\frac{\text{m}}{\text{s}} `$. The inflow velocity profile is a block profile. Due to the no-slip, no-flow boundary conditions at the top and bottom plate, the velocity profile gradually assumes a parabolic shape along the channel. At the outlet, the pressure is fixed and a zero velocity gradient in x-direction is assumed. The physical domain, which is modeled is the rectangular domain $`x\in[0,10],~y\in[0,1]`$. + + + +In the following, we take a close look at the files containing the set-up: At first, boundary conditions are set in `problem.hh` for the Navier-Stokes model. Afterwards, we show the different steps for solving the model in the source file `main.cc`. -In the following, we take a close look at the files containing the set-up: At first, boundary conditions are set in `problem.hh` for the Navier-Stokes model. Afterwards, we show the different steps for solving the model in the source file `main.cc`. At the end, we show some simulation results. +# Implementation diff --git a/examples/freeflowchannel/doc/results.md b/examples/freeflowchannel/doc/results.md deleted file mode 100644 index 5fa9feff90..0000000000 --- a/examples/freeflowchannel/doc/results.md +++ /dev/null @@ -1,8 +0,0 @@ -## Results -This example computes the following stationary velocity profile: - - - -and stationary pressure profile: - - diff --git a/examples/freeflowchannel/img/pressure.png b/examples/freeflowchannel/img/pressure.png deleted file mode 100644 index b2477eefe612c457c384687ba730b4a03f6c2f27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11860 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 GJpV6ln%uAe -- GitLab