sedmat.F90 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. MODULE sedmat
  2. #if defined key_sed
  3. !!======================================================================
  4. !! *** MODULE sedmat ***
  5. !! Sediment : linear system of equations
  6. !!=====================================================================
  7. !! * Modules used
  8. !!----------------------------------------------------------------------
  9. USE sed ! sediment global variable
  10. IMPLICIT NONE
  11. PRIVATE
  12. PUBLIC sed_mat
  13. INTERFACE sed_mat
  14. MODULE PROCEDURE sed_mat_dsr, sed_mat_btb
  15. END INTERFACE
  16. INTEGER, PARAMETER :: nmax = 30
  17. !! $Id: sedmat.F90 2355 2015-05-20 07:11:50Z ufla $
  18. CONTAINS
  19. SUBROUTINE sed_mat_dsr( nvar, ndim, nlev, preac, psol )
  20. !!---------------------------------------------------------------------
  21. !! *** ROUTINE sed_mat_dsr ***
  22. !!
  23. !! ** Purpose : solves tridiagonal system of linear equations
  24. !!
  25. !! ** Method :
  26. !! 1 - computes left hand side of linear system of equations
  27. !! for dissolution reaction
  28. !! For mass balance in kbot+sediment :
  29. !! dz3d (:,1) = dz(1) = 0.5 cm
  30. !! volw3d(:,1) = dzkbot ( see sedini.F90 )
  31. !! dz(2) = 0.3 cm
  32. !! dz3d(:,2) = 0.3 + dzdep ( see seddsr.F90 )
  33. !! volw3d(:,2) and vols3d(l,2) are thickened ( see seddsr.F90 )
  34. !!
  35. !! 2 - forward/backward substitution.
  36. !!
  37. !! History :
  38. !! ! 04-10 (N. Emprin, M. Gehlen ) original
  39. !! ! 06-04 (C. Ethe) Module Re-organization
  40. !!----------------------------------------------------------------------
  41. !! * Arguments
  42. INTEGER , INTENT(in) :: nvar ! number of variables
  43. INTEGER , INTENT(in) :: ndim ! number of points
  44. INTEGER , INTENT(in) :: nlev ! number of sediment levels
  45. REAL(wp), DIMENSION(ndim,nlev,nvar), INTENT(in ) :: preac ! reaction rates
  46. REAL(wp), DIMENSION(ndim,nlev,nvar), INTENT(inout) :: psol ! solution ( undersaturation values )
  47. !---Local declarations
  48. INTEGER :: ji, jk, jn
  49. REAL(wp), DIMENSION(ndim,nlev) :: za, zb, zc, zr
  50. REAL(wp), DIMENSION(ndim) :: zbet
  51. REAL(wp), DIMENSION(ndim,nmax) :: zgamm
  52. REAL(wp) :: aplus,aminus
  53. REAL(wp) :: rplus,rminus
  54. REAL(wp) :: dxplus,dxminus
  55. !----------------------------------------------------------------------
  56. ! Computation left hand side of linear system of
  57. ! equations for dissolution reaction
  58. !---------------------------------------------
  59. ! first sediment level
  60. DO ji = 1, ndim
  61. aplus = ( ( volw3d(ji,1) / dz3d(ji,1) ) + &
  62. ( volw3d(ji,2) / dz3d(ji,2) ) ) / 2.
  63. dxplus = ( dz3d(ji,1) + dz3d(ji,2) ) / 2.
  64. rplus = ( dtsed / volw3d(ji,1) ) * diff(1) * aplus / dxplus
  65. za(ji,1) = 0.
  66. zb(ji,1) = 1. + rplus
  67. zc(ji,1) = -rplus
  68. ENDDO
  69. DO jk = 2, nlev - 1
  70. DO ji = 1, ndim
  71. aminus = ( ( volw3d(ji,jk-1) / dz3d(ji,jk-1) ) + &
  72. & ( volw3d(ji,jk ) / dz3d(ji,jk ) ) ) / 2.
  73. dxminus = ( dz3d(ji,jk-1) + dz3d(ji,jk) ) / 2.
  74. aplus = ( ( volw3d(ji,jk ) / dz3d(ji,jk ) ) + &
  75. & ( volw3d(ji,jk+1) / dz3d(ji,jk+1) ) ) / 2.
  76. dxplus = ( dz3d(ji,jk) + dz3d(ji,jk+1) ) / 2
  77. !
  78. rminus = ( dtsed / volw3d(ji,jk) ) * diff(jk-1) * aminus / dxminus
  79. rplus = ( dtsed / volw3d(ji,jk) ) * diff(jk) * aplus / dxplus
  80. !
  81. za(ji,jk) = -rminus
  82. zb(ji,jk) = 1. + rminus + rplus
  83. zc(ji,jk) = -rplus
  84. END DO
  85. END DO
  86. DO ji = 1, ndim
  87. aminus = ( ( volw3d(ji,nlev-1) / dz3d(ji,nlev-1) ) + &
  88. & ( volw3d(ji,nlev) / dz3d(ji,nlev) ) ) / 2.
  89. dxminus = ( dz3d(ji,nlev-1) + dz3d(ji,nlev) ) / 2.
  90. rminus = ( dtsed / volw3d(ji,nlev) ) * diff(nlev-1) * aminus / dxminus
  91. !
  92. za(ji,nlev) = -rminus
  93. zb(ji,nlev) = 1. + rminus
  94. zc(ji,nlev) = 0.
  95. END DO
  96. ! solves tridiagonal system of linear equations
  97. ! -----------------------------------------------
  98. DO jn = 1, nvar
  99. zr (:,:) = psol(:,:,jn)
  100. zbet(: ) = zb(:,1) + preac(:,1,jn)
  101. psol(:,1,jn) = zr(:,1) / zbet(:)
  102. !
  103. DO jk = 2, nlev
  104. DO ji = 1, ndim
  105. zgamm(ji,jk) = zc(ji,jk-1) / zbet(ji)
  106. zbet(ji) = ( zb(ji,jk) + preac(ji,jk,jn) ) - za(ji,jk) * zgamm(ji,jk)
  107. psol(ji,jk,jn) = ( zr(ji,jk) - za(ji,jk) * psol(ji,jk-1,jn) ) / zbet(ji)
  108. END DO
  109. ENDDO
  110. !
  111. DO jk = nlev - 1, 1, -1
  112. DO ji = 1,ndim
  113. psol(ji,jk,jn) = psol(ji,jk,jn) - zgamm(ji,jk+1) * psol(ji,jk+1,jn)
  114. END DO
  115. ENDDO
  116. ENDDO
  117. END SUBROUTINE sed_mat_dsr
  118. SUBROUTINE sed_mat_btb( nvar, ndim, nlev, psol )
  119. !!---------------------------------------------------------------------
  120. !! *** ROUTINE sed_mat_btb ***
  121. !!
  122. !! ** Purpose : solves tridiagonal system of linear equations
  123. !!
  124. !! ** Method :
  125. !! 1 - computes left hand side of linear system of equations
  126. !! for dissolution reaction
  127. !!
  128. !! 2 - forward/backward substitution.
  129. !!
  130. !! History :
  131. !! ! 04-10 (N. Emprin, M. Gehlen ) original
  132. !! ! 06-04 (C. Ethe) Module Re-organization
  133. !!----------------------------------------------------------------------
  134. !! * Arguments
  135. INTEGER , INTENT(in) :: &
  136. nvar , & ! number of variables
  137. ndim , & ! number of points
  138. nlev ! number of sediment levels
  139. REAL(wp), DIMENSION(ndim,nlev,nvar), INTENT(inout) :: &
  140. psol ! solution
  141. !---Local declarations
  142. INTEGER :: &
  143. ji, jk, jn
  144. REAL(wp) :: &
  145. aplus,aminus , &
  146. rplus,rminus , &
  147. dxplus,dxminus
  148. REAL(wp), DIMENSION(nlev) :: za, zb, zc
  149. REAL(wp), DIMENSION(ndim,nlev) :: zr
  150. REAL(wp), DIMENSION(nmax) :: zgamm
  151. REAL(wp) :: zbet
  152. !----------------------------------------------------------------------
  153. ! Computation left hand side of linear system of
  154. ! equations for dissolution reaction
  155. !---------------------------------------------
  156. ! first sediment level
  157. aplus = ( ( vols(2) / dz(2) ) + ( vols(3) / dz(3) ) ) / 2.
  158. dxplus = ( dz(2) + dz(3) ) / 2.
  159. rplus = ( dtsed / vols(2) ) * db * aplus / dxplus
  160. za(1) = 0.
  161. zb(1) = 1. + rplus
  162. zc(1) = -rplus
  163. DO jk = 2, nlev - 1
  164. aminus = ( ( vols(jk) / dz(jk) ) + ( vols(jk+1) / dz(jk+1) ) ) / 2.
  165. dxminus = ( dz(jk) + dz(jk+1) ) / 2.
  166. rminus = ( dtsed / vols(jk+1) ) * db * aminus / dxminus
  167. !
  168. aplus = ( ( vols(jk+1) / dz(jk+1 ) ) + ( vols(jk+2) / dz(jk+2) ) ) / 2.
  169. dxplus = ( dz(jk+1) + dz(jk+2) ) / 2.
  170. rplus = ( dtsed / vols(jk+1) ) * db * aplus / dxplus
  171. !
  172. za(jk) = -rminus
  173. zb(jk) = 1. + rminus + rplus
  174. zc(jk) = -rplus
  175. ENDDO
  176. aminus = ( ( vols(nlev) / dz(nlev) ) + ( vols(nlev+1) / dz(nlev+1) ) ) / 2.
  177. dxminus = ( dz(nlev) + dz(nlev+1) ) / 2.
  178. rminus = ( dtsed / vols(nlev+1) ) * db * aminus / dxminus
  179. !
  180. za(nlev) = -rminus
  181. zb(nlev) = 1. + rminus
  182. zc(nlev) = 0.
  183. ! solves tridiagonal system of linear equations
  184. ! -----------------------------------------------
  185. DO jn = 1, nvar
  186. zr (:,:) = psol(:,:,jn)
  187. zbet = zb(1)
  188. psol(:,1,jn) = zr(:,1) / zbet
  189. !
  190. DO jk = 2, nlev
  191. zgamm(jk) = zc(jk-1) / zbet
  192. zbet = zb(jk) - za(jk) * zgamm(jk)
  193. DO ji = 1, ndim
  194. psol(ji,jk,jn) = ( zr(ji,jk) - za(jk) * psol(ji,jk-1,jn) ) / zbet
  195. END DO
  196. ENDDO
  197. !
  198. DO jk = nlev - 1, 1, -1
  199. DO ji = 1,ndim
  200. psol(ji,jk,jn) = psol(ji,jk,jn) - zgamm(jk+1) * psol(ji,jk+1,jn)
  201. END DO
  202. ENDDO
  203. ENDDO
  204. END SUBROUTINE sed_mat_btb
  205. #else
  206. !!======================================================================
  207. !! MODULE sedmat : Dummy module
  208. !!======================================================================
  209. !! $Id: sedmat.F90 2355 2015-05-20 07:11:50Z ufla $
  210. CONTAINS
  211. SUBROUTINE sed_mat ! Empty routine
  212. END SUBROUTINE sed_mat
  213. !!======================================================================
  214. #endif
  215. END MODULE sedmat