New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
sedmat.F90 in branches/nemo_v3_3_beta/NEMOGCM/NEMO/TOP_SRC/SED – NEMO

source: branches/nemo_v3_3_beta/NEMOGCM/NEMO/TOP_SRC/SED/sedmat.F90 @ 2281

Last change on this file since 2281 was 2281, checked in by smasson, 14 years ago

set proper svn properties to all files...

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