The aim of this exercise is it to learn how to set up a new model (new system of equations).
As an example, we implement a nonlinear diffusion equation mode and apply it for image denoising.
As an example, we implement a nonlinear diffusion equation model and apply it for image denoising.
In this exercise, we will only consider the bare minimum of classes to successfully assemble
and solve such a problem with DuMux. We also implement the model for a specific discretization method
(the Box method: a vertex-centered finite volume method also known as control-volume finite element method with piece-wise linear basis functions).
...
...
@@ -38,17 +38,17 @@ The diffusion example also derives the discrete equations using the Box method a
:arrow_right: Copy the `model.hh` file from the diffusion example into `dumux-course/exercises/exercise-model` and choose appropriate class names.
In the local residual, you can start with a hard-coded diffusion coefficient of `1.0` (linear diffusion coefficient function).
(Replace `problem.diffusionCoefficient()` by `1.0` because our problem class in `main.cc` does not have a `diffusionCoefficient()` interface.)
The goal is to get the simulation running first and then add improvements. For this, it is important to have a
compiling test such that new changes can continuously be tested.
Do also not forget to change the [include guards](https://en.wikipedia.org/wiki/Include_guard)
at the beginning of header files (`DUMUX_EXAMPLES_DIFFUSION_MODEL_HH`).
Include guards have to be unique in the entire application that you compile. (Otherwise some
code will not be included.) An alternative is using [`#pragma once`](https://en.wikipedia.org/wiki/Pragma_once)
which is widely supported but not specified by the C++ standard.
First, the goal is to get the simulation running and then add improvements. For this, it is important to have a
compiling test such that new changes can continuously be tested.
Thus, in the `computeFlux(...)` function of the local residual, you can start with a hard-coded diffusion coefficient of `1.0` (linear diffusion coefficient function).
(Replace `problem.diffusionCoefficient()` by `1.0` because our problem class in `main.cc` does not have a `diffusionCoefficient()` interface.)
Each model also needs to define a model type tag for setting model-specific properties.
:arrow_right: Rename the one of the diffusion model (`struct DiffusionModel {};`) to `NonlinearDiffusionModel`.
...
...
@@ -81,9 +81,9 @@ const auto imageFileName = getParam<std::string>("ImageFile");