mirror of
https://github.com/wassname/simpeg.git
synced 2026-06-30 15:36:14 +08:00
93 lines
2.8 KiB
ReStructuredText
93 lines
2.8 KiB
ReStructuredText
.. _api_Richards:
|
|
|
|
|
|
Richards Equation
|
|
*****************
|
|
|
|
There are two different forms of Richards equation that differ
|
|
on how they deal with the non-linearity in the time-stepping term.
|
|
|
|
The most fundamental form, referred to as the
|
|
'mixed'-form of Richards Equation [Celia et al., 1990]
|
|
|
|
.. math::
|
|
|
|
\frac{\partial \theta(\psi)}{\partial t} - \nabla \cdot k(\psi) \nabla \psi - \frac{\partial k(\psi)}{\partial z} = 0
|
|
\quad \psi \in \Omega
|
|
|
|
where theta is water content, and psi is pressure head.
|
|
This formulation of Richards equation is called the
|
|
'mixed'-form because the equation is parameterized in psi
|
|
but the time-stepping is in terms of theta.
|
|
|
|
As noted in [Celia et al., 1990] the 'head'-based form of Richards
|
|
equation can be written in the continuous form as:
|
|
|
|
.. math::
|
|
|
|
\frac{\partial \theta}{\partial \psi}\frac{\partial \psi}{\partial t} - \nabla \cdot k(\psi) \nabla \psi - \frac{\partial k(\psi)}{\partial z} = 0
|
|
\quad \psi \in \Omega
|
|
|
|
However, it can be shown that this does not conserve mass in the discrete formulation.
|
|
|
|
|
|
Here we reproduce the results from Ceilia et al. (1990):
|
|
|
|
.. plot::
|
|
|
|
from SimPEG import *
|
|
from simpegFLOW import Richards
|
|
import matplotlib.pyplot as plt
|
|
|
|
M = Mesh.TensorMesh([np.ones(40)])
|
|
M.setCellGradBC('dirichlet')
|
|
params = Richards.Empirical.HaverkampParams().celia1990
|
|
model = Richards.Empirical.Haverkamp(M, **params)
|
|
|
|
bc = np.array([-61.5,-20.7])
|
|
h = np.zeros(M.nC) + bc[0]
|
|
|
|
|
|
def getFields(timeStep,method):
|
|
prob = Richards.RichardsProblem(M,model, timeStep=timeStep, timeEnd=360,
|
|
boundaryConditions=bc, initialConditions=h,
|
|
doNewton=False, method=method)
|
|
return prob.fields(params['Ks'])
|
|
|
|
Hs_M10 = getFields(10., 'mixed')
|
|
Hs_M30 = getFields(30., 'mixed')
|
|
Hs_M120= getFields(120.,'mixed')
|
|
Hs_H10 = getFields(10., 'head')
|
|
Hs_H30 = getFields(30., 'head')
|
|
Hs_H120= getFields(120.,'head')
|
|
|
|
plt.figure(figsize=(13,5))
|
|
plt.subplot(121)
|
|
plt.plot(40-M.gridCC, Hs_M10[-1],'b-')
|
|
plt.plot(40-M.gridCC, Hs_M30[-1],'r-')
|
|
plt.plot(40-M.gridCC, Hs_M120[-1],'k-')
|
|
plt.ylim([-70,-10])
|
|
plt.title('Mixed Method')
|
|
plt.xlabel('Depth, cm')
|
|
plt.ylabel('Pressure Head, cm')
|
|
plt.legend(('$\Delta t$ = 10 sec','$\Delta t$ = 30 sec','$\Delta t$ = 120 sec'))
|
|
plt.subplot(122)
|
|
plt.plot(40-M.gridCC, Hs_H10[-1],'b-')
|
|
plt.plot(40-M.gridCC, Hs_H30[-1],'r-')
|
|
plt.plot(40-M.gridCC, Hs_H120[-1],'k-')
|
|
plt.ylim([-70,-10])
|
|
plt.title('Head-Based Method')
|
|
plt.xlabel('Depth, cm')
|
|
plt.ylabel('Pressure Head, cm')
|
|
plt.legend(('$\Delta t$ = 10 sec','$\Delta t$ = 30 sec','$\Delta t$ = 120 sec'))
|
|
plt.show()
|
|
|
|
|
|
Richards
|
|
========
|
|
|
|
.. automodule:: simpegFLOW.Richards.Empirical
|
|
:show-inheritance:
|
|
:members:
|
|
:undoc-members:
|