r.solute.transport(1grass) GRASS GIS User's Manual r.solute.transport(1grass)
NAME
r.solute.transport - Numerical calculation program for transient, con-
fined and unconfined solute transport in two dimensions
KEYWORDS
raster, hydrology, solute transport
SYNOPSIS
r.solute.transport
r.solute.transport --help
r.solute.transport [-fc] c=name phead=name hc_x=name hc_y=name sta-
tus=name diff_x=name diff_y=name [q=name] [cin=name] cs=name
rd=name nf=name top=name bottom=name output=name [vx=name] [vy=name]
dtime=float [maxit=integer] [error=float] [solver=name] [re-
lax=float] [al=float] [at=float] [loops=float] [stab=string]
[--overwrite] [--help] [--verbose] [--quiet] [--ui]
Flags:
-f
Use a full filled quadratic linear equation system, default is a
sparse linear equation system.
-c
Use the Courant-Friedrichs-Lewy criteria for time step calculation
--overwrite
Allow output files to overwrite existing files
--help
Print usage summary
--verbose
Verbose module output
--quiet
Quiet module output
--ui
Force launching GUI dialog
Parameters:
c=name [required]
The initial concentration in [kg/m^3]
phead=name [required]
The piezometric head in [m]
hc_x=name [required]
The x-part of the hydraulic conductivity tensor in [m/s]
hc_y=name [required]
The y-part of the hydraulic conductivity tensor in [m/s]
status=name [required]
The status for each cell, = 0 - inactive cell, 1 - active cell, 2 -
dirichlet- and 3 - transfer boundary condition
diff_x=name [required]
The x-part of the diffusion tensor in [m^2/s]
diff_y=name [required]
The y-part of the diffusion tensor in [m^2/s]
q=name
Groundwater sources and sinks in [m^3/s]
cin=name
Concentration sources and sinks bounded to a water source or sink
in [kg/s]
cs=name [required]
Concentration of inner sources and inner sinks in [kg/s] (i.e. a
chemical reaction)
rd=name [required]
Retardation factor [-]
nf=name [required]
Effective porosity [-]
top=name [required]
Top surface of the aquifer in [m]
bottom=name [required]
Bottom surface of the aquifer in [m]
output=name [required]
The resulting concentration of the numerical solute transport cal-
culation will be written to this map. [kg/m^3]
vx=name
Calculate and store the groundwater filter velocity vector part in
x direction [m/s]
vy=name
Calculate and store the groundwater filter velocity vector part in
y direction [m/s]
dtime=float [required]
The calculation time in seconds
Default: 86400
maxit=integer
Maximum number of iteration used to solve the linear equation sys-
tem
Default: 10000
error=float
Error break criteria for iterative solver
Default: 0.000001
solver=name
The type of solver which should solve the linear equation system
Options: gauss, lu, jacobi, sor, bicgstab
Default: bicgstab
relax=float
The relaxation parameter used by the jacobi and sor solver for
speedup or stabilizing
Default: 1
al=float
The longditudinal dispersivity length. [m]
Default: 0.0
at=float
The transversal dispersivity length. [m]
Default: 0.0
loops=float
Use this number of time loops if the CFL flag is off. The timestep
will become dt/loops.
Default: 1
stab=string
Set the flow stabilizing scheme (full or exponential upwinding).
Options: full, exp
Default: full
DESCRIPTION
This numerical program calculates numerical implicit transient and
steady state solute transport in porous media in the saturated zone of
an aquifer. The computation is based on raster maps and the current re-
gion settings. All initial- and boundary-conditions must be provided as
raster maps. The unit in the location must be meters.
This module is sensitive to mask settings. All cells which are outside
the mask are ignored and handled as no flow boundaries.
This module calculates the concentration of the solution and optional
the velocity field, based on the hydraulic conductivity, the effective
porosity and the initial piecometric heads. The vector components can
be visualized with paraview if they are exported with r.out.vtk.
Use r.gwflow to compute the piezometric heights of the aquifer. The
piezometric heights and the hydraulic conductivity are used to compute
the flow direction and the mean velocity of the groundwater. This is
the base of the solute transport computation.
The solute transport will always be calculated transient. For stady
state computation set the timestep to a large number (billions of sec-
onds).
To reduce the numerical dispersion, which is a consequence of the con-
vection term and the finite volume discretization, you can use small
time steps and choose between full and exponential upwinding.
NOTES
The solute transport calculation is based on a diffusion/convection
partial differential equation and a numerical implicit finite volume
discretization. Specific for this kind of differential equation is the
combination of a diffusion/dispersion term and a convection term. The
discretization results in an unsymmetric linear equation system in form
of Ax = b, which must be solved. The solute transport partial differen-
tial equation is of the following form:
(dc/dt)*R = div ( D grad c - uc) + cs -q/nf(c - c_in)
• c -- the concentration [kg/m^3]
• u -- vector of mean groundwater flow velocity
• dt -- the time step for transient calculation in seconds [s]
• R -- the linear retardation coefficient [-]
• D -- the diffusion and dispersion tensor [m^2/s]
• cs -- inner concentration sources/sinks [kg/m^3]
• c_in -- the solute concentration of influent water [kg/m^3]
• q -- inner well sources/sinks [m^3/s]
• nf -- the effective porosity [-]
Three different boundary conditions are implemented, the Dirichlet,
Transmission and Neumann conditions. The calculation and boundary sta-
tus of single cells can be set with the status map. The following
states are supportet:
• 0 == inactive - the cell with status 0 will not be calculated,
active cells will have a no flow boundary to an inactive cell
• 1 == active - this cell is used for sloute transport calcula-
tion, inner sources can be defined for those cells
• 2 == Dirichlet - cells of this type will have a fixed concen-
tration value which do not change over time
• 3 == Transmission - cells of this type should be placed on
out-flow boundaries to assure the flow of the solute stream out
Note that all required raster maps are read into main memory. Addition-
ally the linear equation system will be allocated, so the memory con-
sumption of this module rapidely grow with the size of the input maps.
The resulting linear equation system Ax = b can be solved with several
solvers. Several iterative solvers with unsymmetric sparse and qua-
dratic matrices support are implemented. The jacobi method, the
Gauss-Seidel method and the biconjugate gradients-stabilized (bicgstab)
method. Additionally a direct Gauss solver and LU solver are avail-
able. Those direct solvers only work with quadratic matrices, so be
careful using them with large maps (maps of size 10.000 cells will need
more than one gigabyte of ram). Always prefer a sparse matrix solver.
EXAMPLE
Use this small python script to create a working groundwater flow /
solute transport area and data. Make sure you are not in a lat/lon
projection.
#!/usr/bin/env python3
# This is an example script how groundwater flow and solute transport are
# computed within grass
import sys
import os
import grass.script as grass
# Overwrite existing maps
grass.run_command("g.gisenv", set="OVERWRITE=1")
grass.message(_("Set the region"))
# The area is 200m x 100m with a cell size of 1m x 1m
grass.run_command("g.region", res=1, res3=1, t=10, b=0, n=100, s=0, w=0, e=200)
grass.run_command("r.mapcalc", expression="phead = if(col() == 1 , 50, 40)")
grass.run_command("r.mapcalc", expression="phead = if(col() ==200 , 45 + row()/40, phead)")
grass.run_command("r.mapcalc", expression="status = if(col() == 1 || col() == 200 , 2, 1)")
grass.run_command("r.mapcalc", expression="well = if((row() == 50 && col() == 175) || (row() == 10 && col() == 135) , -0.001, 0)")
grass.run_command("r.mapcalc", expression="hydcond = 0.00005")
grass.run_command("r.mapcalc", expression="recharge = 0")
grass.run_command("r.mapcalc", expression="top_conf = 20")
grass.run_command("r.mapcalc", expression="bottom = 0")
grass.run_command("r.mapcalc", expression="poros = 0.17")
grass.run_command("r.mapcalc", expression="syield = 0.0001")
grass.run_command("r.mapcalc", expression="null = 0.0")
grass.message(_("Compute a steady state groundwater flow"))
grass.run_command("r.gwflow", solver="cg", top="top_conf", bottom="bottom", phead="phead",\
status="status", hc_x="hydcond", hc_y="hydcond", q="well", s="syield",\
recharge="recharge", output="gwresult_conf", dt=8640000000000, type="confined")
grass.message(_("generate the transport data"))
grass.run_command("r.mapcalc", expression="c = if(col() == 15 && row() == 75 , 500.0, 0.0)")
grass.run_command("r.mapcalc", expression="cs = if(col() == 15 && row() == 75 , 0.0, 0.0)")
grass.run_command("r.mapcalc", expression="tstatus = if(col() == 1 || col() == 200 , 3, 1)")
grass.run_command("r.mapcalc", expression="diff = 0.0000001")
grass.run_command("r.mapcalc", expression="R = 1.0")
# Compute the initial state
grass.run_command("r.solute.transport", solver="bicgstab", top="top_conf",\
bottom="bottom", phead="gwresult_conf", status="tstatus", hc_x="hydcond", hc_y="hydcond",\
rd="R", cs="cs", q="well", nf="poros", output="stresult_conf_0", dt=3600, diff_x="diff",\
diff_y="diff", c="c", al=0.1, at=0.01)
# Compute the solute transport for 300 days in 10 day steps
for dt in range(30):
grass.run_command("r.solute.transport", solver="bicgstab", top="top_conf",\
bottom="bottom", phead="gwresult_conf", status="tstatus", hc_x="hydcond", hc_y="hydcond",\
rd="R", cs="cs", q="well", nf="poros", output="stresult_conf_" + str(dt + 1), dt=864000, diff_x="diff",\
diff_y="diff", c="stresult_conf_" + str(dt), al=0.1, at=0.01)
SEE ALSO
r.gwflow
r3.gwflow
r.out.vtk
AUTHOR
Sören Gebbert
This work is based on the Diploma Thesis of Sören Gebbert available
here at Technical University Berlin in Germany.
SOURCE CODE
Available at: r.solute.transport source code (history)
Accessed: unknown
Main index | Raster index | Topics index | Keywords index | Graphical
index | Full index
© 2003-2022 GRASS Development Team, GRASS GIS 7.8.7 Reference Manual
GRASS 7.8.7 r.solute.transport(1grass)
Generated by dwww version 1.14 on Sat Jun 13 11:25:39 CEST 2026.