- Timestamp:
- 2020-03-23T22:16:19+01:00 (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/traldf_iso.F90
r12377 r12590 15 15 !!---------------------------------------------------------------------- 16 16 !! tra_ldf_iso : update the tracer trend with the horizontal component of a iso-neutral laplacian operator 17 !! and with the vertical part of the isopycnal or geopotential s-coord. operator 17 !! and with the vertical part of the isopycnal or geopotential s-coord. operator 18 18 !!---------------------------------------------------------------------- 19 19 USE oce ! ocean dynamics and active tracers … … 41 41 !! * Substitutions 42 42 # include "do_loop_substitute.h90" 43 # include "domzgr_substitute.h90" 43 44 !!---------------------------------------------------------------------- 44 45 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 54 55 !! *** ROUTINE tra_ldf_iso *** 55 56 !! 56 !! ** Purpose : Compute the before horizontal tracer (t & s) diffusive 57 !! trend for a laplacian tensor (ezxcept the dz[ dz[.] ] term) and 57 !! ** Purpose : Compute the before horizontal tracer (t & s) diffusive 58 !! trend for a laplacian tensor (ezxcept the dz[ dz[.] ] term) and 58 59 !! add it to the general trend of tracer equation. 59 60 !! 60 !! ** Method : The horizontal component of the lateral diffusive trends 61 !! ** Method : The horizontal component of the lateral diffusive trends 61 62 !! is provided by a 2nd order operator rotated along neural or geopo- 62 63 !! tential surfaces to which an eddy induced advection can be added … … 69 70 !! 70 71 !! 2nd part : horizontal fluxes of the lateral mixing operator 71 !! ======== 72 !! ======== 72 73 !! zftu = pahu e2u*e3u/e1u di[ tb ] 73 74 !! - pahu e2u*uslp dk[ mi(mk(tb)) ] … … 111 112 REAL(wp) :: zcoef0, ze3w_2, zsign, z2dt, z1_2dt ! - - 112 113 REAL(wp), DIMENSION(jpi,jpj) :: zdkt, zdk1t, z2d 113 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdit, zdjt, zftu, zftv, ztfw 114 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdit, zdjt, zftu, zftv, ztfw 114 115 !!---------------------------------------------------------------------- 115 116 ! … … 119 120 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 120 121 ! 121 akz (:,:,:) = 0._wp 122 akz (:,:,:) = 0._wp 122 123 ah_wslp2(:,:,:) = 0._wp 123 124 ENDIF 124 ! 125 ! 125 126 l_hst = .FALSE. 126 127 l_ptr = .FALSE. 127 IF( cdtype == 'TRA' .AND. ( iom_use( 'sophtldf' ) .OR. iom_use( 'sopstldf' ) ) ) l_ptr = .TRUE. 128 IF( cdtype == 'TRA' .AND. ( iom_use( 'sophtldf' ) .OR. iom_use( 'sopstldf' ) ) ) l_ptr = .TRUE. 128 129 IF( cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. & 129 130 & iom_use("uadv_salttr") .OR. iom_use("vadv_salttr") ) ) l_hst = .TRUE. … … 138 139 ELSE ; zsign = -1._wp 139 140 ENDIF 140 141 141 142 !!---------------------------------------------------------------------- 142 143 !! 0 - calculate ah_wslp2 and akz … … 173 174 DO_3D_10_10( 2, jpkm1 ) 174 175 akz(ji,jj,jk) = 16._wp * ah_wslp2(ji,jj,jk) & 175 & * ( akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ( e3w(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) ) ) 176 & * ( akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) & 177 & / ( e3w(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) ) ) 176 178 END_3D 177 179 ELSEIF( ln_traldf_lap ) THEN ! laplacian operator … … 184 186 ! 185 187 ELSE ! 33 flux set to zero with akz=ah_wslp2 ==>> computed in full implicit 186 akz(:,:,:) = ah_wslp2(:,:,:) 188 akz(:,:,:) = ah_wslp2(:,:,:) 187 189 ENDIF 188 190 ENDIF … … 191 193 DO jn = 1, kjpt ! tracer loop 192 194 ! ! =========== 193 ! 194 !!---------------------------------------------------------------------- 195 !! I - masked horizontal derivative 195 ! 196 !!---------------------------------------------------------------------- 197 !! I - masked horizontal derivative 196 198 !!---------------------------------------------------------------------- 197 199 !!gm : bug.... why (x,:,:)? (1,jpj,:) and (jpi,1,:) should be sufficient.... … … 200 202 !!end 201 203 202 ! Horizontal tracer gradient 204 ! Horizontal tracer gradient 203 205 DO_3D_10_10( 1, jpkm1 ) 204 206 zdit(ji,jj,jk) = ( pt(ji+1,jj ,jk,jn) - pt(ji,jj,jk,jn) ) * umask(ji,jj,jk) … … 207 209 IF( ln_zps ) THEN ! botton and surface ocean correction of the horizontal gradient 208 210 DO_2D_10_10 209 zdit(ji,jj,mbku(ji,jj)) = pgu(ji,jj,jn) 211 zdit(ji,jj,mbku(ji,jj)) = pgu(ji,jj,jn) 210 212 zdjt(ji,jj,mbkv(ji,jj)) = pgv(ji,jj,jn) 211 213 END_2D 212 214 IF( ln_isfcav ) THEN ! first wet level beneath a cavity 213 215 DO_2D_10_10 214 IF( miku(ji,jj) > 1 ) zdit(ji,jj,miku(ji,jj)) = pgui(ji,jj,jn) 215 IF( mikv(ji,jj) > 1 ) zdjt(ji,jj,mikv(ji,jj)) = pgvi(ji,jj,jn) 216 IF( miku(ji,jj) > 1 ) zdit(ji,jj,miku(ji,jj)) = pgui(ji,jj,jn) 217 IF( mikv(ji,jj) > 1 ) zdjt(ji,jj,mikv(ji,jj)) = pgvi(ji,jj,jn) 216 218 END_2D 217 219 ENDIF … … 248 250 zftv(ji,jj,jk) = ( zabe2 * zdjt(ji,jj,jk) & 249 251 & + zcof2 * ( zdkt (ji,jj+1) + zdk1t(ji,jj) & 250 & + zdk1t(ji,jj+1) + zdkt (ji,jj) ) ) * vmask(ji,jj,jk) 252 & + zdk1t(ji,jj+1) + zdkt (ji,jj) ) ) * vmask(ji,jj,jk) 251 253 END_2D 252 254 ! … … 254 256 pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + zsign * ( zftu(ji,jj,jk) - zftu(ji-1,jj,jk) & 255 257 & + zftv(ji,jj,jk) - zftv(ji,jj-1,jk) ) & 256 & 258 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 257 259 END_2D 258 END DO ! End of slab 260 END DO ! End of slab 259 261 260 262 !!---------------------------------------------------------------------- … … 266 268 ! ! Surface and bottom vertical fluxes set to zero 267 269 ztfw(:,:, 1 ) = 0._wp ; ztfw(:,:,jpk) = 0._wp 268 270 269 271 DO_3D_00_00( 2, jpkm1 ) 270 272 ! … … 295 297 END_3D 296 298 ! 297 ELSE ! bilaplacian 299 ELSE ! bilaplacian 298 300 SELECT CASE( kpass ) 299 301 CASE( 1 ) ! 1st pass : eddy coef = ah_wslp2 … … 311 313 END SELECT 312 314 ENDIF 313 ! 315 ! 314 316 DO_3D_00_00( 1, jpkm1 ) 315 317 pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + zsign * ( ztfw (ji,jj,jk) - ztfw(ji,jj,jk+1) ) &
Note: See TracChangeset
for help on using the changeset viewer.