- Timestamp:
- 2016-11-28T17:04:10+01:00 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2016/dev_INGV_UKMO_2016/NEMOGCM/NEMO/OPA_SRC/TRA/trazdf_imp.F90
r5836 r7351 16 16 !! 3.3 ! 2010-06 (C. Ethe, G. Madec) Merge TRA-TRC 17 17 !! - ! 2011-02 (A. Coward, C. Ethe, G. Madec) improvment of surface boundary condition 18 !! 3.7 ! 2015-11 (G. Madec, A. Coward) non linear free surface by default 18 19 !!---------------------------------------------------------------------- 19 20 20 21 !!---------------------------------------------------------------------- 21 !! tra_zdf_imp : Update the tracer trend with the diagonal vertical part of the mixing tensor.22 !! tra_zdf_imp : Update the tracer trend with vertical mixing, nad compute the after tracer field 22 23 !!---------------------------------------------------------------------- 23 24 USE oce ! ocean dynamics and tracers variables … … 42 43 PUBLIC tra_zdf_imp ! routine called by step.F90 43 44 44 REAL(wp) :: r_vvl ! variable volume indicator, =1 if lk_vvl=T, =0 otherwise45 46 45 !! * Substitutions 47 # include "domzgr_substitute.h90"48 46 # include "zdfddm_substitute.h90" 49 47 # include "vectopt_loop_substitute.h90" … … 64 62 !! it is already computed and add to the general trend in traldf) 65 63 !! 66 !! ** Method : The vertical diffusion of the tracer t is given by: 67 !! difft = dz( avt dz(t) ) = 1/e3t dk+1( avt/e3w dk(t) ) 68 !! It is computed using a backward time scheme (t=ta). 64 !! ** Method : The vertical diffusion of a tracer ,t , is given by: 65 !! difft = dz( avt dz(t) ) = 1/e3t dk+1( avt/e3w dk(t) ) 66 !! It is computed using a backward time scheme (t=after field) 67 !! which provide directly the after tracer field. 69 68 !! If lk_zdfddm=T, use avs for salinity or for passive tracers 70 69 !! Surface and bottom boundary conditions: no diffusive flux on … … 75 74 !!--------------------------------------------------------------------- 76 75 INTEGER , INTENT(in ) :: kt ! ocean time-step index 77 INTEGER , INTENT(in ) :: kit000 76 INTEGER , INTENT(in ) :: kit000 ! first time step index 78 77 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 79 78 INTEGER , INTENT(in ) :: kjpt ! number of tracers 80 REAL(wp) , DIMENSION( jpk ), INTENT(in ) :: p2dt ! vertical profile oftracer time-step79 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 81 80 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 82 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend81 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! in: tracer trend ; out: after tracer field 83 82 ! 84 83 INTEGER :: ji, jj, jk, jn ! dummy loop indices 85 REAL(wp) :: zrhs , ze3tb, ze3tn, ze3ta! local scalars84 REAL(wp) :: zrhs ! local scalars 86 85 REAL(wp), POINTER, DIMENSION(:,:,:) :: zwi, zwt, zwd, zws 87 86 !!--------------------------------------------------------------------- … … 95 94 IF(lwp)WRITE(numout,*) 'tra_zdf_imp : implicit vertical mixing on ', cdtype 96 95 IF(lwp)WRITE(numout,*) '~~~~~~~~~~~ ' 97 !98 IF( lk_vvl ) THEN ; r_vvl = 1._wp ! Variable volume indicator99 ELSE ; r_vvl = 0._wp100 ENDIF101 96 ENDIF 102 !103 97 ! ! ============= ! 104 98 DO jn = 1, kjpt ! tracer loop ! 105 99 ! ! ============= ! 106 !107 100 ! Matrix construction 108 101 ! -------------------- … … 142 135 DO jj = 2, jpjm1 143 136 DO ji = fs_2, fs_jpim1 ! vector opt. 144 ze3ta = ( 1. - r_vvl ) + r_vvl * fse3t_a(ji,jj,jk) ! after scale factor at T-point 145 ze3tn = r_vvl + ( 1. - r_vvl ) * fse3t_n(ji,jj,jk) ! now scale factor at T-point 146 zwi(ji,jj,jk) = - p2dt(jk) * zwt(ji,jj,jk ) / ( ze3tn * fse3w(ji,jj,jk ) ) 147 zws(ji,jj,jk) = - p2dt(jk) * zwt(ji,jj,jk+1) / ( ze3tn * fse3w(ji,jj,jk+1) ) 148 zwd(ji,jj,jk) = ze3ta - zwi(ji,jj,jk) - zws(ji,jj,jk) 137 !!gm BUG I think, use e3w_a instead of e3w_n 138 zwi(ji,jj,jk) = - p2dt * zwt(ji,jj,jk ) / e3w_n(ji,jj,jk ) 139 zws(ji,jj,jk) = - p2dt * zwt(ji,jj,jk+1) / e3w_n(ji,jj,jk+1) 140 zwd(ji,jj,jk) = e3t_a(ji,jj,jk) - zwi(ji,jj,jk) - zws(ji,jj,jk) 149 141 END DO 150 142 END DO … … 170 162 ! used as a work space array: its value is modified. 171 163 ! 172 ! first recurrence: Tk = Dk - Ik Sk-1 / Tk-1 (increasing k) 173 ! done once for all passive tracers (so included in the IF instruction) 174 DO jj = 2, jpjm1 175 DO ji = fs_2, fs_jpim1 164 DO jj = 2, jpjm1 !* 1st recurrence: Tk = Dk - Ik Sk-1 / Tk-1 (increasing k) 165 DO ji = fs_2, fs_jpim1 ! done one for all passive tracers (so included in the IF instruction) 176 166 zwt(ji,jj,1) = zwd(ji,jj,1) 177 167 END DO … … 185 175 END DO 186 176 ! 187 END 177 ENDIF 188 178 ! 189 ! second recurrence: Zk = Yk - Ik / Tk-1 Zk-1 190 DO jj = 2, jpjm1 179 DO jj = 2, jpjm1 !* 2nd recurrence: Zk = Yk - Ik / Tk-1 Zk-1 191 180 DO ji = fs_2, fs_jpim1 192 ze3tb = ( 1. - r_vvl ) + r_vvl * fse3t_b(ji,jj,1) 193 ze3tn = ( 1. - r_vvl ) + r_vvl * fse3t(ji,jj,1) 194 pta(ji,jj,1,jn) = ze3tb * ptb(ji,jj,1,jn) + p2dt(1) * ze3tn * pta(ji,jj,1,jn) 181 pta(ji,jj,1,jn) = e3t_b(ji,jj,1) * ptb(ji,jj,1,jn) + p2dt * e3t_n(ji,jj,1) * pta(ji,jj,1,jn) 195 182 END DO 196 183 END DO … … 198 185 DO jj = 2, jpjm1 199 186 DO ji = fs_2, fs_jpim1 200 ze3tb = ( 1. - r_vvl ) + r_vvl * fse3t_b(ji,jj,jk) 201 ze3tn = ( 1. - r_vvl ) + r_vvl * fse3t (ji,jj,jk) 202 zrhs = ze3tb * ptb(ji,jj,jk,jn) + p2dt(jk) * ze3tn * pta(ji,jj,jk,jn) ! zrhs=right hand side 187 zrhs = e3t_b(ji,jj,jk) * ptb(ji,jj,jk,jn) + p2dt * e3t_n(ji,jj,jk) * pta(ji,jj,jk,jn) ! zrhs=right hand side 203 188 pta(ji,jj,jk,jn) = zrhs - zwi(ji,jj,jk) / zwt(ji,jj,jk-1) * pta(ji,jj,jk-1,jn) 204 189 END DO 205 190 END DO 206 191 END DO 207 208 ! third recurrence: Xk = (Zk - Sk Xk+1 ) / Tk (result is the after tracer) 209 DO jj = 2, jpjm1 192 ! 193 DO jj = 2, jpjm1 !* 3d recurrence: Xk = (Zk - Sk Xk+1 ) / Tk (result is the after tracer) 210 194 DO ji = fs_2, fs_jpim1 211 195 pta(ji,jj,jpkm1,jn) = pta(ji,jj,jpkm1,jn) / zwt(ji,jj,jpkm1) * tmask(ji,jj,jpkm1)
Note: See TracChangeset
for help on using the changeset viewer.