|
NAMEr.solute.transport - Numerical calculation program for transient, confined and unconfined solute transport in two dimensionsKEYWORDSraster, hydrology, solute transportSYNOPSISr.solute.transportr.solute.transport --help r.solute.transport [-fc] c=name phead=name hc_x=name hc_y=name status=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] [relax=float] [al=float] [at=float] [loops=float] [stab=string] [--overwrite] [--help] [--verbose] [--quiet] [--ui] Flags:
Parameters:
DESCRIPTIONThis 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 region 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.
NOTESThe 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 differential equation is of the following form:(dc/dt)*R = div ( D grad c - uc) + cs -q/nf(c - c_in)
Three different boundary conditions are implemented, the Dirichlet, Transmission and Neumann conditions. The calculation and boundary status of single cells can be set with the status map. The following states are supportet:
Note that all required raster maps are read into main memory. Additionally the linear equation system will be allocated, so the memory consumption 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 quadratic 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 available. 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. EXAMPLEUse 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 ALSOr.gwflowr3.gwflow r.out.vtk AUTHORSören GebbertThis work is based on the Diploma Thesis of Sören Gebbert available here at Technical University Berlin in Germany. SOURCE CODEAvailable at: r.solute.transport source code (history)Main index | Raster index | Topics index | Keywords index | Graphical index | Full index © 2003-2021 GRASS Development Team, GRASS GIS 7.8.6 Reference Manual
Visit the GSP FreeBSD Man Page Interface. |