diff --git a/applications/solvers/incompressible/RichardsFoam/Make/files b/applications/solvers/incompressible/RichardsFoam/Make/files
new file mode 100755
index 000000000..f2b8d52a1
--- /dev/null
+++ b/applications/solvers/incompressible/RichardsFoam/Make/files
@@ -0,0 +1,3 @@
+RichardsFoam.C
+
+EXE = $(FOAM_USER_APPBIN)/RichardsFoam
diff --git a/applications/solvers/incompressible/RichardsFoam/Make/options b/applications/solvers/incompressible/RichardsFoam/Make/options
new file mode 100755
index 000000000..fa15f1245
--- /dev/null
+++ b/applications/solvers/incompressible/RichardsFoam/Make/options
@@ -0,0 +1,5 @@
+EXE_INC = \
+ -I$(LIB_SRC)/finiteVolume/lnInclude
+
+EXE_LIBS = \
+ -lfiniteVolume
diff --git a/applications/solvers/incompressible/RichardsFoam/RichardsFoam.C b/applications/solvers/incompressible/RichardsFoam/RichardsFoam.C
new file mode 100644
index 000000000..7c8ed800e
--- /dev/null
+++ b/applications/solvers/incompressible/RichardsFoam/RichardsFoam.C
@@ -0,0 +1,145 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd.
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+License
+ This file is part of OpenFOAM.
+
+ OpenFOAM 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.
+
+ OpenFOAM 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 OpenFOAM. If not, see .
+
+Application
+ RichardsFoam
+
+Description
+ Transient solver for flow in unsaturated porous media
+ With chord slope formulation of the Richards equation.
+ van Genuchten laws for unsaturated hydraulic properties parametrisation
+ Global computation of the convergence criterium
+ Adaptative time stepping with a stabilisation procedure
+ NB 1: use backward scheme for time discretisation
+ NB 2: use only mesh with constant cell volumes
+
+References
+ version 0.0 (develloped with OpenFOAM 2.0.1)
+ Details may be found in:
+ Orgogozo, L., Renon, N., Soulaine, C., Hénon, F., Tomer, S.K., Labat, D.,
+ Pokrovsky, O.S., Sekhar, M., Ababou, R., Quintard, M., Submitted.
+ Mechanistic modelling of water fluxes at the watershed scale: An open source
+ massively parallel solver for Richards equation.
+ Submitted to Computer Physics Communications.
+
+
+\*---------------------------------------------------------------------------*/
+
+#include "fvCFD.H"
+#include "pimpleControl.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+int main(int argc, char *argv[])
+{
+# include "setRootCase.H"
+# include "createTime.H"
+# include "createMesh.H"
+
+// pimpleControl pimple(mesh);
+
+# include "readPicardControls.H"
+# include "createFields.H"
+# include "initContinuityErrs.H"
+# include "createTimeControls.H"
+
+ Info<< "\nStarting time loop\n" << endl;
+
+ // starting of the time loop.
+ while (runTime.loop())
+ {
+ // time step control operations.
+# include "readTimeControls.H"
+# include "setDeltaT.H"
+
+// runTime++;
+
+ Info<< "Time = " << runTime.timeName() << nl << endl;
+
+ // Beginning of the stabilisation loop for the stabilised adaptive time
+ // step procedure.
+ for (int cyc = 0; cyc < nMaxCycle; cyc++)
+ {
+ // Beginning of the Picard loop.
+ for (int pic = 0; pic < nIterPicard; pic++)
+ {
+# include "psiEqn.H"
+ }
+
+ // Exit test for the loop associated with the stabilisation cycles
+ // for the adaptive time step procedure.
+ if (crit < precPicard)
+ {
+ break;
+ }
+ else
+ {
+ Info << "Criterion not reached, restart time loop iteration"
+ << "with a smaller time step / Error = " << crit
+ << nl << endl;
+
+ runTime.setDeltaT((1/tFact)*runTime.deltaTValue());
+
+ Info<< "deltaT = " << runTime.deltaTValue() << endl;
+ }
+ // End of the stabilisation cycles loop.
+ }
+
+ // Warning test in case of convergence failure of the Picard loop.
+ if (crit >= precPicard)
+ {
+ Info<< "Convergence failure / Error = " << crit << nl << endl;
+ currentPicard = nIterPicard;
+ }
+
+ // Final updating of the result fields before going to the next time
+ // iteration.
+ psi_tmp = psi;
+
+ thtil_tmp = 0.5*
+ (
+ (1 + sign(psi_tmp)) + (1 - sign(psi_tmp))*
+ pow((1 + pow(mag(alpha*psi_tmp),n)), - (1 - (1/n)))
+ );
+
+ theta = (thetas - thetar)*thtil + thetar;
+
+ U = - Krel*((fvc::grad(psi)) + vuz);
+
+ // Writting of the result.
+ runTime.write();
+
+ Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
+ << " ClockTime = " << runTime.elapsedClockTime() << " s"
+ << nl << endl;
+
+ // end of the time loop.
+ }
+
+ Info<< "End\n" << endl;
+
+ return 0;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/incompressible/RichardsFoam/createFields.H b/applications/solvers/incompressible/RichardsFoam/createFields.H
new file mode 100644
index 000000000..246cc0476
--- /dev/null
+++ b/applications/solvers/incompressible/RichardsFoam/createFields.H
@@ -0,0 +1,209 @@
+Info<< "Reading transportProperties\n" << endl;
+
+// reading of the physical constant associated with the considered problem.
+// Localisation of the data within the considered case:
+// constant/transportProperties
+IOdictionary transportProperties
+(
+ IOobject
+ (
+ "transportProperties",
+ runTime.constant(),
+ mesh,
+ IOobject::MUST_READ,
+ IOobject::NO_WRITE
+ )
+);
+
+dimensionedScalar K
+(
+ transportProperties.lookup("K")
+);
+
+dimensionedScalar alpha
+(
+ transportProperties.lookup("alpha")
+);
+
+dimensionedScalar thetas
+(
+ transportProperties.lookup("thetas")
+);
+
+dimensionedScalar thetar
+(
+ transportProperties.lookup("thetar")
+);
+
+dimensionedScalar n
+(
+ transportProperties.lookup("n")
+);
+
+dimensionedScalar C
+(
+ transportProperties.lookup("C")
+);
+
+dimensionedScalar S
+(
+ transportProperties.lookup("S")
+);
+
+// declaration of the variable and results fields
+
+// Water velocity field [m/s]
+Info<< "Reading field U\n" << endl;
+volVectorField U
+(
+ IOobject
+ (
+ "U",
+ runTime.timeName(),
+ mesh,
+ IOobject::MUST_READ,
+ IOobject::AUTO_WRITE
+ ),
+ mesh
+);
+
+// Water saturation field [-]
+Info<< "Reading field theta\n" << endl;
+volScalarField theta
+(
+ IOobject
+ (
+ "theta",
+ runTime.timeName(),
+ mesh,
+ IOobject::MUST_READ,
+ IOobject::AUTO_WRITE
+ ),
+ mesh
+);
+
+// Water pressure field [m] - field of resolution.
+Info<< "Reading field psi\n" << endl;
+volScalarField psi
+(
+ IOobject
+ (
+ "psi",
+ runTime.timeName(),
+ mesh,
+ IOobject::MUST_READ,
+ IOobject::AUTO_WRITE
+ ),
+ mesh
+);
+
+// Field of residuals for the Picard loop [m].
+Info<< "Reading field err\n" << endl;
+volScalarField err
+(
+ IOobject
+ (
+ "err",
+ runTime.timeName(),
+ mesh,
+ IOobject::MUST_READ,
+ IOobject::AUTO_WRITE
+ ),
+ mesh
+);
+
+// Dimensionned unit scalar field [m].
+Info<< "Reading field vuz\n" << endl;
+volVectorField vuz
+(
+ IOobject
+ (
+ "vuz",
+ runTime.timeName(),
+ mesh,
+ IOobject::MUST_READ,
+ IOobject::AUTO_WRITE
+ ),
+ mesh
+);
+
+// Dimensionless unit vertical upward vector field.
+Info<< "Reading field usf\n" << endl;
+volScalarField usf
+(
+ IOobject
+ (
+ "usf",
+ runTime.timeName(),
+ mesh,
+ IOobject::MUST_READ,
+ IOobject::AUTO_WRITE
+ ),
+ mesh
+);
+
+# include "createPhi.H"
+
+// Initialisation of the scalar containing the number of mesh cells. Note the
+// use of gSum instead of sum.
+double nbMesh;
+nbMesh = gSum(usf);
+
+// Initialisation of the scalar containing the residual for the exit test of the
+// Picard loop.
+double crit;
+crit=0.;
+
+// Initialisation of the token which counts the number of Picard iteraion for
+// the adaptive time step procedure.
+int currentPicard;
+currentPicard = nIterPicard-3;
+
+// Initialisation of the token which counts the number of Stabilisation cycle
+// for the stabilisation of the adaptive time step procedure.
+int sc;
+sc = 0;
+
+// Initialisation of the field of altitudes.
+volVectorField positionVector = mesh.C();
+volScalarField z = positionVector.component(vector::Z);
+
+// Initialisation of the intermediate fields for the Picard loop.
+volScalarField psi_tmp = psi;
+volScalarField psim1 = psi;
+
+// Initialisation of the varying transport properties for the Picard loop.
+volScalarField thtil =
+ 0.5*
+ (
+ (1 + sign(psi)) + (1 - sign(psi))*
+ pow((1 + pow(mag(alpha*psi),n)), - (1 - (1/n)))
+ );
+
+volScalarField thtil_tmp =
+ 0.5*
+ (
+ (1 + sign(psi_tmp)) + (1-sign(psi_tmp))*
+ pow((1 + pow(mag(alpha*psi_tmp),n)), - (1 - (1/n)))
+ );
+
+volScalarField Krel =
+ 0.5*
+ (
+ (1 + sign(psi))*K + (1 - sign(psi))*K*pow(thtil,0.5)*
+ pow((1 - pow((1 - pow(thtil,(n/(n - 1)))),(1 - (1/n)))),2)
+ );
+
+volScalarField Crel =
+ S + 0.5*
+ (
+ (1 - sign(psi))*((thetas - thetar)*(thtil - thtil_tmp)*
+ (1./((usf*pos(psi - psi_tmp)*pos(psi_tmp - psi)) + psi - psi_tmp)))
+ );
+
+// Initialisation of the gravity term.
+volVectorField gradk = fvc::grad(Krel);
+volScalarField gradkz = gradk.component(vector::Z);
+
+// Initialisation of the velocity field.
+U = - Krel*((fvc::grad(psi)) + vuz);
diff --git a/applications/solvers/incompressible/RichardsFoam/psiEqn.H b/applications/solvers/incompressible/RichardsFoam/psiEqn.H
new file mode 100644
index 000000000..a7f03a9d1
--- /dev/null
+++ b/applications/solvers/incompressible/RichardsFoam/psiEqn.H
@@ -0,0 +1,60 @@
+psim1 = psi;
+psi = psi_tmp;
+
+// Resolution of the linear system.
+fvScalarMatrix psiEqn
+(
+ Crel*fvm::ddt(psi)
+ ==
+ fvm::laplacian(Krel, psi, "laplacian(Krel,psi)")
+ + gradkz
+);
+psiEqn.relax();
+psiEqn.solve();
+
+// Update of the varying transport properties.
+thtil = 0.5*
+(
+ (1 + sign(psi)) + (1 - sign(psi))*
+ pow((1+pow(mag(alpha*psi),n)),-(1-(1/n)))
+);
+Krel = 0.5*
+(
+ (1 + sign(psi))*K + (1 - sign(psi))*K*pow(thtil, 0.5)*
+ pow((1 - pow((1 - pow(thtil, (n/(n - 1)))),(1 - (1/n)))), 2)
+);
+Crel= S + 0.5*
+(
+ (1 - sign(psi))*
+ (
+ (thetas - thetar)*(thtil - thtil_tmp)*
+ (
+ 1./((usf*pos(psi - psi_tmp)*pos(psi_tmp - psi))
+ + psi - psi_tmp)
+ )
+ )
+);
+
+// Update of the gravity term.
+gradk = fvc::grad(Krel);
+gradkz = gradk.component(2);
+
+// Computation of the field of residuals for the exit test of
+// the Picard loop.
+err = psi - psim1;
+
+// Computation of the residual for the exit test of the Picard
+// loop. Note the use of gSum instead of sum.
+crit = gSumMag(err)/nbMesh;
+
+// exit test for the Picard loop.
+if (crit < precPicard)
+{
+ Info << " Erreur = " << crit
+ << " Picard = " << pic
+ << nl << endl;
+
+ currentPicard=pic;
+
+ break;
+}
diff --git a/applications/solvers/incompressible/RichardsFoam/readPicardControls.H b/applications/solvers/incompressible/RichardsFoam/readPicardControls.H
new file mode 100644
index 000000000..68735fad5
--- /dev/null
+++ b/applications/solvers/incompressible/RichardsFoam/readPicardControls.H
@@ -0,0 +1,25 @@
+// Reading of the controling parameters of the Picard loop and of the
+// Stabilisation cycles loop for the adaptive time step procedure.
+// Localisation of the data within the considered case: system/fvSolution
+const dictionary& picardDict = mesh.solutionDict().subDict("Picard");
+
+// Maximum number of Picard iterations.
+const int nIterPicard =
+ picardDict.lookupOrDefault("nIterPicard", 1);
+
+// Maximum number of stabilisation cycles.
+const int nMaxCycle =
+ picardDict.lookupOrDefault("nMaxCycle", 1);
+
+// Number of time iterations with low number of Picard iteration beyond which
+// the time step is increased.
+const int stabilisationThreshold =
+ picardDict.lookupOrDefault("stabilisationThreshold", 1);
+
+// Exit criterion for the Picard loop.
+const double precPicard =
+ picardDict.lookupOrDefault("precPicard", 1.);
+
+// Factor of increase/decrease of the time step.
+const double tFact =
+ picardDict.lookupOrDefault("tFact", 1.);
diff --git a/applications/solvers/incompressible/RichardsFoam/setDeltaT.H b/applications/solvers/incompressible/RichardsFoam/setDeltaT.H
new file mode 100644
index 000000000..c597cda93
--- /dev/null
+++ b/applications/solvers/incompressible/RichardsFoam/setDeltaT.H
@@ -0,0 +1,82 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2004-2010 OpenCFD Ltd.
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+License
+ This file is part of OpenFOAM.
+
+ OpenFOAM 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.
+
+ OpenFOAM 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 OpenFOAM. If not, see .
+
+Global
+ setDeltaT
+
+Description
+ Reset the timestep to maintain a low number of Picard iteration and a good
+ convergence. Reduction of time-step is immediate, but increase is damped to
+ avoid unstable oscillations.
+
+\*---------------------------------------------------------------------------*/
+
+scalar deltaTFact = 1.;
+
+if (adjustTimeStep)
+{
+ deltaTFact = 1.;
+
+ // If There is a too high number of Picard iteration, decrease of the time
+ // step.
+ if (currentPicard > nIterPicard-2)
+ {
+ deltaTFact = 1./tFact;
+ }
+
+ if (currentPicard >= 3)
+ {
+ sc = 0;
+ }
+
+ if ((currentPicard < 3) && (sc < stabilisationThreshold))
+ {
+ sc = sc+1;
+ }
+
+ // If there is more than 'stabilisationThreshold' iteration that the number
+ // of Picard iteration is low, increase of the time step.
+ if ((currentPicard < 3) && (sc == stabilisationThreshold))
+ {
+ deltaTFact = tFact;
+ sc = 0;
+ }
+
+ // Reset of the time step if needed (time step is always lower than
+ // 'maxDeltaT').
+ if (deltaTFact != 1.)
+ {
+ runTime.setDeltaT
+ (
+ min
+ (
+ deltaTFact*runTime.deltaTValue(),
+ maxDeltaT
+ )
+ );
+ }
+
+ Info<< "deltaT = " << runTime.deltaTValue() << endl;
+}
+
+// ************************************************************************* //
diff --git a/applications/solvers/incompressible/RichardsFoam/spatialMeanValueRichardsonFoam/Make/files b/applications/solvers/incompressible/RichardsFoam/spatialMeanValueRichardsonFoam/Make/files
new file mode 100755
index 000000000..32c9117fd
--- /dev/null
+++ b/applications/solvers/incompressible/RichardsFoam/spatialMeanValueRichardsonFoam/Make/files
@@ -0,0 +1,3 @@
+spatialMeanValueRichardsonFoam.C
+
+EXE = $(FOAM_USER_APPBIN)/spatialMeanValueRichardsonFoam
diff --git a/applications/solvers/incompressible/RichardsFoam/spatialMeanValueRichardsonFoam/Make/options b/applications/solvers/incompressible/RichardsFoam/spatialMeanValueRichardsonFoam/Make/options
new file mode 100755
index 000000000..fa15f1245
--- /dev/null
+++ b/applications/solvers/incompressible/RichardsFoam/spatialMeanValueRichardsonFoam/Make/options
@@ -0,0 +1,5 @@
+EXE_INC = \
+ -I$(LIB_SRC)/finiteVolume/lnInclude
+
+EXE_LIBS = \
+ -lfiniteVolume
diff --git a/applications/solvers/incompressible/RichardsFoam/spatialMeanValueRichardsonFoam/spatialMeanValueRichardsonFoam.C b/applications/solvers/incompressible/RichardsFoam/spatialMeanValueRichardsonFoam/spatialMeanValueRichardsonFoam.C
new file mode 100644
index 000000000..298304b98
--- /dev/null
+++ b/applications/solvers/incompressible/RichardsFoam/spatialMeanValueRichardsonFoam/spatialMeanValueRichardsonFoam.C
@@ -0,0 +1,110 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd.
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+License
+ This file is part of OpenFOAM.
+
+ OpenFOAM 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.
+
+ OpenFOAM 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 OpenFOAM. If not, see .
+
+Application
+ spatialMeanValue
+
+Description
+ Calculates the spatial mean of the specified volScalarField over the
+ whole domain (for regular grid).
+
+\*---------------------------------------------------------------------------*/
+
+#include "fvCFD.H"
+#include "cyclicPolyPatch.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+// Main program:
+
+int main(int argc, char *argv[])
+{
+# include "addRegionOption.H"
+
+ timeSelector::addOptions();
+ argList::validArgs.append("fieldName");
+
+# include "setRootCase.H"
+# include "createTime.H"
+
+ instantList timeDirs = timeSelector::select0(runTime, args);
+
+# include "createNamedMesh.H"
+
+ word fieldName(args.additionalArgs()[0]);
+
+ Info << "Calculating avarage pressure heads:" << endl;
+
+ forAll(timeDirs, timeI)
+ {
+ runTime.setTime(timeDirs[timeI], timeI);
+
+ IOobject fieldHeader
+ (
+ fieldName,
+ runTime.timeName(),
+ mesh,
+ IOobject::MUST_READ
+ );
+
+ // Check field exists
+ if (fieldHeader.headerOk())
+ {
+ mesh.readUpdate();
+
+ // Read field and calc mean, for regular grid
+ if (fieldHeader.headerClassName() == volScalarField::typeName)
+ {
+ volScalarField field(fieldHeader, mesh);
+
+ int nbMesh;
+ nbMesh = 0;
+
+ forAll(field, cellI)
+ {
+ nbMesh++;
+ }
+
+ Info<< runTime.timeName()<< " "
+ << sum(field).value()/nbMesh<< " "
+ << endl;
+ }
+ else
+ {
+ FatalError
+ << "Only possible for volScalarField "<< "s "
+ << nl << exit(FatalError);
+ }
+ }
+ else
+ {
+ Info<< " No field " << fieldName << endl;
+ }
+ }
+
+ Info<< "End\n" << endl;
+
+ return 0;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/0/U b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/0/U
new file mode 100755
index 000000000..48e65a924
--- /dev/null
+++ b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/0/U
@@ -0,0 +1,39 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: 1.7.x |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volVectorField;
+ location "0";
+ object U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 -1 0 0 0 0];
+
+internalField uniform (0 0 0);
+
+boundaryField
+{
+ top
+ {
+ type zeroGradient;
+ }
+ bottom
+ {
+ type zeroGradient;
+ }
+ sides
+ {
+ type empty;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/0/err b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/0/err
new file mode 100755
index 000000000..9dc130b23
--- /dev/null
+++ b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/0/err
@@ -0,0 +1,39 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: 1.7.x |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ location "0";
+ object err;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 0 0 0 0 0];
+
+internalField uniform 1;
+
+boundaryField
+{
+ top
+ {
+ type zeroGradient;
+ }
+ bottom
+ {
+ type zeroGradient;
+ }
+ sides
+ {
+ type empty;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/0/psi b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/0/psi
new file mode 100755
index 000000000..626b7fe7d
--- /dev/null
+++ b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/0/psi
@@ -0,0 +1,43 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: 1.7.x |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ location "0";
+ object psi;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 0 0 0 0 0];
+
+internalField uniform -1;
+
+boundaryField
+{
+ top
+ {
+ type fixedValue;
+ value uniform 0.01;
+ }
+
+ bottom
+ {
+ type fixedGradient;
+ gradient uniform 0;
+ }
+
+ sides
+ {
+ type empty;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/0/theta b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/0/theta
new file mode 100755
index 000000000..ce23341e4
--- /dev/null
+++ b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/0/theta
@@ -0,0 +1,39 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: 1.7.x |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ location "0";
+ object theta;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 0 0 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ top
+ {
+ type zeroGradient;
+ }
+ bottom
+ {
+ type zeroGradient;
+ }
+ sides
+ {
+ type empty;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/0/usf b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/0/usf
new file mode 100755
index 000000000..fd1f12cb9
--- /dev/null
+++ b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/0/usf
@@ -0,0 +1,39 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: 1.7.x |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ location "0";
+ object usf;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 0 0 0 0 0];
+
+internalField uniform 1.;
+
+boundaryField
+{
+ top
+ {
+ type zeroGradient;
+ }
+ bottom
+ {
+ type zeroGradient;
+ }
+ sides
+ {
+ type empty;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/0/vuz b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/0/vuz
new file mode 100755
index 000000000..6601b9577
--- /dev/null
+++ b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/0/vuz
@@ -0,0 +1,39 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: 1.7.x |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volVectorField;
+ location "0";
+ object vuz;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 0 0 0 0 0 0];
+
+internalField uniform (0 0 1);
+
+boundaryField
+{
+ top
+ {
+ type zeroGradient;
+ }
+ bottom
+ {
+ type zeroGradient;
+ }
+ sides
+ {
+ type empty;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/Allclean b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/Allclean
new file mode 100755
index 000000000..6ec3cc203
--- /dev/null
+++ b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/Allclean
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+# Source tutorial clean functions
+. $WM_PROJECT_DIR/bin/tools/CleanFunctions
+
+cleanCase
diff --git a/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/Allrun b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/Allrun
new file mode 100755
index 000000000..cfb31d809
--- /dev/null
+++ b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/Allrun
@@ -0,0 +1,7 @@
+#!/bin/sh
+# Source tutorial run functions
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+runApplication blockMesh
+runApplication RichardsFoam
+runApplication spatialMeanValueRichardsonFoam psi
diff --git a/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/constant/polyMesh/blockMeshDict b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/constant/polyMesh/blockMeshDict
new file mode 100644
index 000000000..b9bca307d
--- /dev/null
+++ b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/constant/polyMesh/blockMeshDict
@@ -0,0 +1,68 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: 1.7.1 |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+convertToMeters 1;
+
+vertices
+(
+ (0 0 0)
+ (1 0 0)
+ (1 1 0)
+ (0 1 0)
+
+ (0 0 1)
+ (1 0 1)
+ (1 1 1)
+ (0 1 1)
+);
+
+blocks
+(
+ hex (0 1 2 3 4 5 6 7) (1 1 100) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+patches
+
+(
+
+ patch top
+ (
+ (4 5 6 7)
+ )
+
+ patch bottom
+ (
+ (0 1 2 3)
+ )
+
+ empty sides
+ (
+ (1 2 6 5)
+ (3 2 6 7)
+ (0 3 7 4)
+ (0 1 5 4)
+ )
+);
+
+mergePatchPairs
+(
+);
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/constant/polyMesh/boundary b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/constant/polyMesh/boundary
new file mode 100644
index 000000000..340034118
--- /dev/null
+++ b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/constant/polyMesh/boundary
@@ -0,0 +1,41 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | foam-extend: Open Source CFD |
+| \\ / O peration | Version: 4.0 |
+| \\ / A nd | Web: http://www.foam-extend.org |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class polyBoundaryMesh;
+ location "constant/polyMesh";
+ object boundary;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+3
+(
+ top
+ {
+ type patch;
+ nFaces 1;
+ startFace 99;
+ }
+ bottom
+ {
+ type patch;
+ nFaces 1;
+ startFace 100;
+ }
+ sides
+ {
+ type empty;
+ nFaces 400;
+ startFace 101;
+ }
+)
+
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/constant/transportProperties b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/constant/transportProperties
new file mode 100755
index 000000000..ddeca6530
--- /dev/null
+++ b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/constant/transportProperties
@@ -0,0 +1,32 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: 1.7.1 |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "constant";
+ object transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+
+
+K K [ 0 1 -1 0 0 0 0 ] 0.00000288889;
+alpha alpha [ 0 -1 0 0 0 0 0 ] 3.6;
+n n [ 0 0 0 0 0 0 0 ] 1.56;
+thetas thetas [ 0 0 0 0 0 0 0 ] 0.43;
+thetar thetar [ 0 0 0 0 0 0 0 ] 0.078;
+S S [ 0 -1 0 0 0 0 0 ] 0.00001;
+C C [ 0 -1 0 0 0 0 0 ] 1;
+
+
+
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/system/controlDict b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/system/controlDict
new file mode 100644
index 000000000..f929d861d
--- /dev/null
+++ b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/system/controlDict
@@ -0,0 +1,78 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: 1.7.1 |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "system";
+ object controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application porousUnsaturatedFoam;
+
+startFrom startTime;
+
+startTime 0;
+
+stopAt endTime;
+
+endTime 86400;
+
+deltaT 300;
+
+writeControl adjustableRunTime;
+
+writeInterval 7200;
+
+purgeWrite 0;
+
+writeFormat ascii;
+
+writePrecision 6;
+
+writeCompression uncompressed;
+
+timeFormat general;
+
+timePrecision 6;
+
+runTimeModifiable yes;
+
+adjustTimeStep yes;
+
+maxDeltaT 3600;
+
+functions
+ (
+ probes1
+ {
+ type probes; // Type of functionObject
+ // Where to load it from (if not already in solver)
+ functionObjectLibs ("libsampling.so");
+ probeLocations // Locations to be probed. runTime modifiable!
+ (
+ (0.5 0.5 1.)
+ );
+ // Fields to be probed. runTime modifiable!
+ fields
+ (
+ U
+ );
+
+ outputControl timeStep;
+ outputInterval 1;
+ }
+ );
+
+
+//libs ( "libOpenFOAM.so" );
+//libs ("libuserBCs.so");
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/system/fvSchemes b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/system/fvSchemes
new file mode 100755
index 000000000..74173cf7e
--- /dev/null
+++ b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/system/fvSchemes
@@ -0,0 +1,58 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: 1.7.1 |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "system";
+ object fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+ default backward;
+}
+
+gradSchemes
+{
+ default Gauss linear;
+
+}
+
+divSchemes
+{
+ default none;
+}
+
+laplacianSchemes
+{
+ default none;
+
+laplacian(Krel,psi) Gauss linear corrected;
+}
+
+interpolationSchemes
+{
+ default Gauss vanLeer;
+}
+
+snGradSchemes
+{
+ default Gauss vanLeer;
+}
+
+fluxRequired
+{
+ default yes;
+ U;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/system/fvSolution b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/system/fvSolution
new file mode 100755
index 000000000..6b4a77193
--- /dev/null
+++ b/tutorials/incompressible/RichardsonFoam/oneDimensionalSoilTransport/system/fvSolution
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: 1.7.1 |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "system";
+ object fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+
+ psi
+ {
+ solver PCG;
+ preconditioner DIC;
+ tolerance 1e-6;
+ relTol 0;
+ }
+}
+
+Picard
+{
+ nIterPicard 10; //must be strictly higher than 5 ; 10 should be the best value//
+ nMaxCycle 10;
+ stabilisationThreshold 10;
+ precPicard 1e-4;
+ tFact 1.3; //1 means fixed time step ; should be lower than 1.5//
+}
+
+relaxationFactor
+{
+// psi 0.3;
+};
+
+// ************************************************************************* //