vanGenuchten.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. # These are the van Genuchten (1980) equations
  2. # The input is matric potential, psi and the hydraulic parameters.
  3. # psi must be sent in as a numpy array.
  4. # The pars variable is like a MATLAB structure.
  5. import numpy as np
  6. def thetaFun(psi,pars):
  7. if psi>=0.:
  8. Se = 1.
  9. else:
  10. Se=(1+abs(psi*pars['alpha'])**pars['n'])**(-pars['m'])
  11. return pars['thetaR']+(pars['thetaS']-pars['thetaR'])*Se
  12. thetaFun=np.vectorize(thetaFun)
  13. def CFun(psi,pars):
  14. if psi>=0.:
  15. Se=1.
  16. else:
  17. Se=(1+abs(psi*pars['alpha'])**pars['n'])**(-pars['m'])
  18. dSedh=pars['alpha']*pars['m']/(1-pars['m'])*Se**(1/pars['m'])*(1-Se**(1/pars['m']))**pars['m']
  19. return Se*pars['Ss']+(pars['thetaS']-pars['thetaR'])*dSedh
  20. CFun = np.vectorize(CFun)
  21. def KFun(psi,pars):
  22. if psi>=0.:
  23. Se=1.
  24. else:
  25. Se=(1+abs(psi*pars['alpha'])**pars['n'])**(-pars['m'])
  26. return pars['Ks']*Se**pars['neta']*(1-(1-Se**(1/pars['m']))**pars['m'])**2
  27. KFun = np.vectorize(KFun)
  28. def setpars():
  29. pars={}
  30. pars['thetaR']=float(raw_input("thetaR = "))
  31. pars['thetaS']=float(raw_input("thetaS = "))
  32. pars['alpha']=float(raw_input("alpha = "))
  33. pars['n']=float(raw_input("n = "))
  34. pars['m']=1-1/pars['n']
  35. pars['Ks']=float(raw_input("Ks = "))
  36. pars['neta']=float(raw_input("neta = "))
  37. pars['Ss']=float(raw_input("Ss = "))
  38. return pars
  39. def PlotProps(pars):
  40. import numpy as np
  41. import pylab as pl
  42. import vanGenuchten as vg
  43. psi=np.linspace(-10,2,200)
  44. pl.figure
  45. pl.subplot(3,1,1)
  46. pl.plot(psi,vg.thetaFun(psi,pars))
  47. pl.ylabel(r'$\theta(\psi) [-]$')
  48. pl.subplot(3,1,2)
  49. pl.plot(psi,vg.CFun(psi,pars))
  50. pl.ylabel(r'$C(\psi) [1/m]$')
  51. pl.subplot(3,1,3)
  52. pl.plot(psi,vg.KFun(psi,pars))
  53. pl.xlabel(r'$\psi [m]$')
  54. pl.ylabel(r'$K(\psi) [m/d]$')
  55. #pl.show()
  56. def HygieneSandstone():
  57. pars={}
  58. pars['thetaR']=0.153
  59. pars['thetaS']=0.25
  60. pars['alpha']=0.79
  61. pars['n']=10.4
  62. pars['m']=1-1/pars['n']
  63. pars['Ks']=1.08
  64. pars['neta']=0.5
  65. pars['Ss']=0.000001
  66. return pars
  67. def TouchetSiltLoam():
  68. pars={}
  69. pars['thetaR']=0.19
  70. pars['thetaS']=0.469
  71. pars['alpha']=0.5
  72. pars['n']=7.09
  73. pars['m']=1-1/pars['n']
  74. pars['Ks']=3.03
  75. pars['neta']=0.5
  76. pars['Ss']=0.000001
  77. return pars
  78. def SiltLoamGE3():
  79. pars={}
  80. pars['thetaR']=0.131
  81. pars['thetaS']=0.396
  82. pars['alpha']=0.423
  83. pars['n']=2.06
  84. pars['m']=1-1/pars['n']
  85. pars['Ks']=0.0496
  86. pars['neta']=0.5
  87. pars['Ss']=0.000001
  88. return pars
  89. def GuelphLoamDrying():
  90. pars={}
  91. pars['thetaR']=0.218
  92. pars['thetaS']=0.520
  93. pars['alpha']=1.15
  94. pars['n']=2.03
  95. pars['m']=1-1/pars['n']
  96. pars['Ks']=0.316
  97. pars['neta']=0.5
  98. pars['Ss']=0.000001
  99. return pars
  100. def GuelphLoamWetting():
  101. pars={}
  102. pars['thetaR']=0.218
  103. pars['thetaS']=0.434
  104. pars['alpha']=2.0
  105. pars['n']=2.76
  106. pars['m']=1-1/pars['n']
  107. pars['Ks']=0.316
  108. pars['neta']=0.5
  109. pars['Ss']=0.000001
  110. return pars
  111. def BeitNetofaClay():
  112. pars={}
  113. pars['thetaR']=0.
  114. pars['thetaS']=0.446
  115. pars['alpha']=0.152
  116. pars['n']=1.17
  117. pars['m']=1-1/pars['n']
  118. pars['Ks']=0.00082
  119. pars['neta']=0.5
  120. pars['Ss']=0.000001
  121. return pars