Changeset 10874 for NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/TRA/trazdf.F90
- Timestamp:
- 2019-04-15T15:57:37+02:00 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/TRA/trazdf.F90
r10825 r10874 44 44 CONTAINS 45 45 46 SUBROUTINE tra_zdf( kt , ktlev1, ktlev2, ktlev3, kt2lev, pts_rhs)46 SUBROUTINE tra_zdf( kt ) 47 47 !!---------------------------------------------------------------------- 48 48 !! *** ROUTINE tra_zdf *** … … 51 51 !!--------------------------------------------------------------------- 52 52 INTEGER, INTENT(in) :: kt ! ocean time-step index 53 INTEGER, INTENT(in) :: ktlev1, ktlev2, ktlev3 ! time level indices for 3-time-level source terms54 INTEGER, INTENT(in) :: kt2lev ! time level index for 2-time-level source terms55 REAL(wp), INTENT( inout), DIMENSION(jpi,jpj,jpk,jpts) :: pts_rhs ! temperature and salinity trends56 53 ! 57 54 INTEGER :: jk ! Dummy loop indices … … 73 70 IF( l_trdtra ) THEN !* Save ta and sa trends 74 71 ALLOCATE( ztrdt(jpi,jpj,jpk) , ztrds(jpi,jpj,jpk) ) 75 ztrdt(:,:,:) = pts_rhs(:,:,:,jp_tem)76 ztrds(:,:,:) = pts_rhs(:,:,:,jp_sal)72 ztrdt(:,:,:) = tsa(:,:,:,jp_tem) 73 ztrds(:,:,:) = tsa(:,:,:,jp_sal) 77 74 ENDIF 78 75 ! 79 76 ! !* compute lateral mixing trend and add it to the general trend 80 CALL tra_zdf_imp( kt, nit000, ktlev1, ktlev2, ktlev3, kt2lev, 'TRA', r2dt, ts(:,:,:,:,ktlev1), pts_rhs, jpts )77 CALL tra_zdf_imp( kt, nit000, 'TRA', r2dt, tsb, tsa, jpts ) 81 78 82 79 !!gm WHY here ! and I don't like that ! … … 84 81 ! JMM avoid negative salinities near river outlet ! Ugly fix 85 82 ! JMM : restore negative salinities to small salinities: 86 WHERE( pts_rhs(:,:,:,jp_sal) < 0._wp ) pts_rhs(:,:,:,jp_sal) = 0.1_wp83 WHERE( tsa(:,:,:,jp_sal) < 0._wp ) tsa(:,:,:,jp_sal) = 0.1_wp 87 84 !!gm 88 85 89 86 IF( l_trdtra ) THEN ! save the vertical diffusive trends for further diagnostics 90 87 DO jk = 1, jpkm1 91 ztrdt(:,:,jk) = ( ( pts_rhs(:,:,jk,jp_tem)*e3t(:,:,jk,ktlev3) - ts(:,:,jk,jp_tem,ktlev1)*e3t(:,:,jk,ktlev1) ) &92 & / (e3t (:,:,jk,ktlev2)*r2dt) ) - ztrdt(:,:,jk)93 ztrds(:,:,jk) = ( ( pts_rhs(:,:,jk,jp_sal)*e3t(:,:,jk,ktlev3) - ts(:,:,jk,jp_sal,ktlev1)*e3t(:,:,jk,ktlev1) ) &94 & / (e3t (:,:,jk,ktlev2)*r2dt) ) - ztrds(:,:,jk)88 ztrdt(:,:,jk) = ( ( tsa(:,:,jk,jp_tem)*e3t_a(:,:,jk) - tsb(:,:,jk,jp_tem)*e3t_b(:,:,jk) ) & 89 & / (e3t_n(:,:,jk)*r2dt) ) - ztrdt(:,:,jk) 90 ztrds(:,:,jk) = ( ( tsa(:,:,jk,jp_sal)*e3t_a(:,:,jk) - tsb(:,:,jk,jp_sal)*e3t_b(:,:,jk) ) & 91 & / (e3t_n(:,:,jk)*r2dt) ) - ztrds(:,:,jk) 95 92 END DO 96 93 !!gm this should be moved in trdtra.F90 and done on all trends … … 110 107 111 108 112 SUBROUTINE tra_zdf_imp( kt, kit000, ktlev1, ktlev2, ktlev3, kt2lev, cdtype, p2dt, pt, pt_rhs, kjpt )109 SUBROUTINE tra_zdf_imp( kt, kit000, cdtype, p2dt, ptb, pta, kjpt ) 113 110 !!---------------------------------------------------------------------- 114 111 !! *** ROUTINE tra_zdf_imp *** … … 128 125 !! If iso-neutral mixing, add to avt the contribution due to lateral mixing. 129 126 !! 130 !! ** Action : - pt _rhsbecomes the after tracer127 !! ** Action : - pta becomes the after tracer 131 128 !!--------------------------------------------------------------------- 132 129 INTEGER , INTENT(in ) :: kt ! ocean time-step index 133 130 INTEGER , INTENT(in ) :: kit000 ! first time step index 134 INTEGER , INTENT(in ) :: ktlev1, ktlev2, ktlev3 ! time level indices for 3-time-level source terms135 INTEGER , INTENT(in ) :: kt2lev ! time level index for 2-time-level source terms136 131 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 137 132 INTEGER , INTENT(in ) :: kjpt ! number of tracers 138 133 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 139 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pt ! before and now tracer fields140 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pt _rhs! in: tracer trend ; out: after tracer field134 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 135 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! in: tracer trend ; out: after tracer field 141 136 ! 142 137 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 186 181 DO jj = 2, jpjm1 187 182 DO ji = fs_2, fs_jpim1 ! vector opt. (ensure same order of calculation as below if wi=0.) 188 zzwi = - p2dt * zwt(ji,jj,jk ) / e3w (ji,jj,jk ,kt2lev)189 zzws = - p2dt * zwt(ji,jj,jk+1) / e3w (ji,jj,jk+1,kt2lev)190 zwd(ji,jj,jk) = e3t (ji,jj,jk,ktlev3) - zzwi - zzws &183 zzwi = - p2dt * zwt(ji,jj,jk ) / e3w_n(ji,jj,jk ) 184 zzws = - p2dt * zwt(ji,jj,jk+1) / e3w_n(ji,jj,jk+1) 185 zwd(ji,jj,jk) = e3t_a(ji,jj,jk) - zzwi - zzws & 191 186 & + p2dt * ( MAX( wi(ji,jj,jk ) , 0._wp ) - MIN( wi(ji,jj,jk+1) , 0._wp ) ) 192 187 zwi(ji,jj,jk) = zzwi + p2dt * MIN( wi(ji,jj,jk ) , 0._wp ) … … 199 194 DO jj = 2, jpjm1 200 195 DO ji = fs_2, fs_jpim1 ! vector opt. 201 zwi(ji,jj,jk) = - p2dt * zwt(ji,jj,jk ) / e3w (ji,jj,jk,kt2lev)202 zws(ji,jj,jk) = - p2dt * zwt(ji,jj,jk+1) / e3w (ji,jj,jk+1,kt2lev)203 zwd(ji,jj,jk) = e3t (ji,jj,jk,ktlev3) - zwi(ji,jj,jk) - zws(ji,jj,jk)196 zwi(ji,jj,jk) = - p2dt * zwt(ji,jj,jk ) / e3w_n(ji,jj,jk) 197 zws(ji,jj,jk) = - p2dt * zwt(ji,jj,jk+1) / e3w_n(ji,jj,jk+1) 198 zwd(ji,jj,jk) = e3t_a(ji,jj,jk) - zwi(ji,jj,jk) - zws(ji,jj,jk) 204 199 END DO 205 200 END DO … … 221 216 ! Suffices i,s and d indicate "inferior" (below diagonal), diagonal 222 217 ! and "superior" (above diagonal) components of the tridiagonal system. 223 ! The solution will be in the 4d array pt _rhs.218 ! The solution will be in the 4d array pta. 224 219 ! The 3d array zwt is used as a work space array. 225 ! En route to the solution pt _rhsis used a to evaluate the rhs and then220 ! En route to the solution pta is used a to evaluate the rhs and then 226 221 ! used as a work space array: its value is modified. 227 222 ! … … 243 238 DO jj = 2, jpjm1 !* 2nd recurrence: Zk = Yk - Ik / Tk-1 Zk-1 244 239 DO ji = fs_2, fs_jpim1 245 pt _rhs(ji,jj,1,jn) = e3t(ji,jj,1,ktlev1) * pt(ji,jj,1,jn) + p2dt * e3t(ji,jj,1,ktlev2) * pt_rhs(ji,jj,1,jn)240 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) 246 241 END DO 247 242 END DO … … 249 244 DO jj = 2, jpjm1 250 245 DO ji = fs_2, fs_jpim1 251 zrhs = e3t (ji,jj,jk,ktlev1) * pt(ji,jj,jk,jn) + p2dt * e3t(ji,jj,jk,ktlev2) * pt_rhs(ji,jj,jk,jn) ! zrhs=right hand side252 pt _rhs(ji,jj,jk,jn) = zrhs - zwi(ji,jj,jk) / zwt(ji,jj,jk-1) * pt_rhs(ji,jj,jk-1,jn)246 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 247 pta(ji,jj,jk,jn) = zrhs - zwi(ji,jj,jk) / zwt(ji,jj,jk-1) * pta(ji,jj,jk-1,jn) 253 248 END DO 254 249 END DO … … 257 252 DO jj = 2, jpjm1 !* 3d recurrence: Xk = (Zk - Sk Xk+1 ) / Tk (result is the after tracer) 258 253 DO ji = fs_2, fs_jpim1 259 pt _rhs(ji,jj,jpkm1,jn) = pt_rhs(ji,jj,jpkm1,jn) / zwt(ji,jj,jpkm1) * tmask(ji,jj,jpkm1)254 pta(ji,jj,jpkm1,jn) = pta(ji,jj,jpkm1,jn) / zwt(ji,jj,jpkm1) * tmask(ji,jj,jpkm1) 260 255 END DO 261 256 END DO … … 263 258 DO jj = 2, jpjm1 264 259 DO ji = fs_2, fs_jpim1 265 pt _rhs(ji,jj,jk,jn) = ( pt_rhs(ji,jj,jk,jn) - zws(ji,jj,jk) * pt_rhs(ji,jj,jk+1,jn) ) &260 pta(ji,jj,jk,jn) = ( pta(ji,jj,jk,jn) - zws(ji,jj,jk) * pta(ji,jj,jk+1,jn) ) & 266 261 & / zwt(ji,jj,jk) * tmask(ji,jj,jk) 267 262 END DO
Note: See TracChangeset
for help on using the changeset viewer.