Changeset 13540 for NEMO/branches/2020/r12377_ticket2386/src/OCE/TRA
- Timestamp:
- 2020-09-29T12:41:06+02:00 (4 years ago)
- Location:
- NEMO/branches/2020/r12377_ticket2386
- Files:
-
- 22 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2020/r12377_ticket2386
- Property svn:externals
-
old new 3 3 ^/utils/build/mk@HEAD mk 4 4 ^/utils/tools@HEAD tools 5 ^/vendors/AGRIF/dev @HEADext/AGRIF5 ^/vendors/AGRIF/dev_r12970_AGRIF_CMEMS ext/AGRIF 6 6 ^/vendors/FCM@HEAD ext/FCM 7 7 ^/vendors/IOIPSL@HEAD ext/IOIPSL 8 8 9 9 # SETTE 10 ^/utils/CI/sette@ HEADsette10 ^/utils/CI/sette@13507 sette
-
- Property svn:externals
-
NEMO/branches/2020/r12377_ticket2386/src/OCE/TRA/eosbn2.F90
r12511 r13540 180 180 !! * Substitutions 181 181 # include "do_loop_substitute.h90" 182 # include "domzgr_substitute.h90" 182 183 !!---------------------------------------------------------------------- 183 184 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 237 238 CASE( np_teos10, np_eos80 ) !== polynomial TEOS-10 / EOS-80 ==! 238 239 ! 239 DO_3D _11_11(1, jpkm1 )240 DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 240 241 ! 241 242 zh = pdep(ji,jj,jk) * r1_Z0 ! depth … … 273 274 CASE( np_seos ) !== simplified EOS ==! 274 275 ! 275 DO_3D _11_11(1, jpkm1 )276 DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 276 277 zt = pts (ji,jj,jk,jp_tem) - 10._wp 277 278 zs = pts (ji,jj,jk,jp_sal) - 35._wp … … 337 338 END DO 338 339 ! 339 DO_3D _11_11(1, jpkm1 )340 DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 340 341 ! 341 342 ! compute density (2*nn_sto_eos) times: … … 387 388 ! Non-stochastic equation of state 388 389 ELSE 389 DO_3D _11_11(1, jpkm1 )390 DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 390 391 ! 391 392 zh = pdep(ji,jj,jk) * r1_Z0 ! depth … … 425 426 CASE( np_seos ) !== simplified EOS ==! 426 427 ! 427 DO_3D _11_11(1, jpkm1 )428 DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 428 429 zt = pts (ji,jj,jk,jp_tem) - 10._wp 429 430 zs = pts (ji,jj,jk,jp_sal) - 35._wp … … 479 480 CASE( np_teos10, np_eos80 ) !== polynomial TEOS-10 / EOS-80 ==! 480 481 ! 481 DO_2D _11_11482 DO_2D( 1, 1, 1, 1 ) 482 483 ! 483 484 zh = pdep(ji,jj) * r1_Z0 ! depth … … 514 515 CASE( np_seos ) !== simplified EOS ==! 515 516 ! 516 DO_2D _11_11517 DO_2D( 1, 1, 1, 1 ) 517 518 ! 518 519 zt = pts (ji,jj,jp_tem) - 10._wp … … 562 563 CASE( np_teos10, np_eos80 ) !== polynomial TEOS-10 / EOS-80 ==! 563 564 ! 564 DO_3D _11_11(1, jpkm1 )565 DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 565 566 ! 566 567 zh = gdept(ji,jj,jk,Kmm) * r1_Z0 ! depth … … 615 616 CASE( np_seos ) !== simplified EOS ==! 616 617 ! 617 DO_3D _11_11(1, jpkm1 )618 DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 618 619 zt = pts (ji,jj,jk,jp_tem) - 10._wp ! pot. temperature anomaly (t-T0) 619 620 zs = pts (ji,jj,jk,jp_sal) - 35._wp ! abs. salinity anomaly (s-S0) … … 669 670 CASE( np_teos10, np_eos80 ) !== polynomial TEOS-10 / EOS-80 ==! 670 671 ! 671 DO_2D _11_11672 DO_2D( 1, 1, 1, 1 ) 672 673 ! 673 674 zh = pdep(ji,jj) * r1_Z0 ! depth … … 722 723 CASE( np_seos ) !== simplified EOS ==! 723 724 ! 724 DO_2D _11_11725 DO_2D( 1, 1, 1, 1 ) 725 726 ! 726 727 zt = pts (ji,jj,jp_tem) - 10._wp ! pot. temperature anomaly (t-T0) … … 872 873 IF( ln_timing ) CALL timing_start('bn2') 873 874 ! 874 DO_3D _11_11( 2, jpkm1 )875 DO_3D( 1, 1, 1, 1, 2, jpkm1 ) ! interior points only (2=< jk =< jpkm1 ); surface and bottom value set to zero one for all in istate.F90 875 876 zrw = ( gdepw(ji,jj,jk ,Kmm) - gdept(ji,jj,jk,Kmm) ) & 876 877 & / ( gdept(ji,jj,jk-1,Kmm) - gdept(ji,jj,jk,Kmm) ) … … 920 921 z1_T0 = 1._wp/40._wp 921 922 ! 922 DO_2D _11_11923 DO_2D( 1, 1, 1, 1 ) 923 924 ! 924 925 zt = ctmp (ji,jj) * z1_T0 … … 973 974 ! 974 975 z1_S0 = 1._wp / 35.16504_wp 975 DO_2D _11_11976 DO_2D( 1, 1, 1, 1 ) 976 977 zs= SQRT( ABS( psal(ji,jj) ) * z1_S0 ) ! square root salinity 977 978 ptf(ji,jj) = ((((1.46873e-03_wp*zs-9.64972e-03_wp)*zs+2.28348e-02_wp)*zs & … … 1080 1081 CASE( np_teos10, np_eos80 ) !== polynomial TEOS-10 / EOS-80 ==! 1081 1082 ! 1082 DO_3D _11_11(1, jpkm1 )1083 DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 1083 1084 ! 1084 1085 zh = gdept(ji,jj,jk,Kmm) * r1_Z0 ! depth … … 1139 1140 CASE( np_seos ) !== Vallis (2006) simplified EOS ==! 1140 1141 ! 1141 DO_3D _11_11(1, jpkm1 )1142 DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 1142 1143 zt = pts(ji,jj,jk,jp_tem) - 10._wp ! temperature anomaly (t-T0) 1143 1144 zs = pts (ji,jj,jk,jp_sal) - 35._wp ! abs. salinity anomaly (s-S0) -
NEMO/branches/2020/r12377_ticket2386/src/OCE/TRA/traadv.F90
r12511 r13540 66 66 INTEGER, PARAMETER :: np_QCK = 5 ! QUICK scheme 67 67 68 # include "domzgr_substitute.h90" 68 69 !!---------------------------------------------------------------------- 69 70 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 98 99 IF( ln_wave .AND. ln_sdw ) THEN 99 100 DO jk = 1, jpkm1 ! eulerian transport + Stokes Drift 100 zuu(:,:,jk) = e2u (:,:) * e3u(:,:,jk,Kmm) * ( uu(:,:,jk,Kmm) + usd(:,:,jk) ) 101 zvv(:,:,jk) = e1v (:,:) * e3v(:,:,jk,Kmm) * ( vv(:,:,jk,Kmm) + vsd(:,:,jk) ) 102 zww(:,:,jk) = e1e2t(:,:) * ( ww(:,:,jk) + wsd(:,:,jk) ) 101 zuu(:,:,jk) = & 102 & e2u (:,:) * e3u(:,:,jk,Kmm) * ( uu(:,:,jk,Kmm) + usd(:,:,jk) ) 103 zvv(:,:,jk) = & 104 & e1v (:,:) * e3v(:,:,jk,Kmm) * ( vv(:,:,jk,Kmm) + vsd(:,:,jk) ) 105 zww(:,:,jk) = & 106 & e1e2t(:,:) * ( ww(:,:,jk) + wsd(:,:,jk) ) 103 107 END DO 104 108 ELSE -
NEMO/branches/2020/r12377_ticket2386/src/OCE/TRA/traadv_cen.F90
r12377 r13540 37 37 !! * Substitutions 38 38 # include "do_loop_substitute.h90" 39 # include "domzgr_substitute.h90" 39 40 !!---------------------------------------------------------------------- 40 41 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 103 104 ! 104 105 CASE( 2 ) !* 2nd order centered 105 DO_3D _10_10(1, jpkm1 )106 DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 106 107 zwx(ji,jj,jk) = 0.5_wp * pU(ji,jj,jk) * ( pt(ji,jj,jk,jn,Kmm) + pt(ji+1,jj ,jk,jn,Kmm) ) 107 108 zwy(ji,jj,jk) = 0.5_wp * pV(ji,jj,jk) * ( pt(ji,jj,jk,jn,Kmm) + pt(ji ,jj+1,jk,jn,Kmm) ) … … 111 112 ztu(:,:,jpk) = 0._wp ! Bottom value : flux set to zero 112 113 ztv(:,:,jpk) = 0._wp 113 DO_3D _00_00( 1, jpkm1 )114 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) ! masked gradient 114 115 ztu(ji,jj,jk) = ( pt(ji+1,jj ,jk,jn,Kmm) - pt(ji,jj,jk,jn,Kmm) ) * umask(ji,jj,jk) 115 116 ztv(ji,jj,jk) = ( pt(ji ,jj+1,jk,jn,Kmm) - pt(ji,jj,jk,jn,Kmm) ) * vmask(ji,jj,jk) 116 117 END_3D 117 CALL lbc_lnk_multi( 'traadv_cen', ztu, 'U', -1. , ztv, 'V', -1.) ! Lateral boundary cond.118 CALL lbc_lnk_multi( 'traadv_cen', ztu, 'U', -1.0_wp , ztv, 'V', -1.0_wp ) ! Lateral boundary cond. 118 119 ! 119 DO_3D _00_10( 1, jpkm1 )120 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) ! Horizontal advective fluxes 120 121 zC2t_u = pt(ji,jj,jk,jn,Kmm) + pt(ji+1,jj ,jk,jn,Kmm) ! C2 interpolation of T at u- & v-points (x2) 121 122 zC2t_v = pt(ji,jj,jk,jn,Kmm) + pt(ji ,jj+1,jk,jn,Kmm) … … 127 128 zwy(ji,jj,jk) = 0.5_wp * pV(ji,jj,jk) * zC4t_v 128 129 END_3D 130 CALL lbc_lnk_multi( 'traadv_cen', zwx, 'U', -1. , zwy, 'V', -1. ) 129 131 ! 130 132 CASE DEFAULT 131 CALL ctl_stop( 'traadv_ fct: wrong value for nn_fct' )133 CALL ctl_stop( 'traadv_cen: wrong value for nn_cen' ) 132 134 END SELECT 133 135 ! … … 135 137 ! 136 138 CASE( 2 ) !* 2nd order centered 137 DO_3D _00_00(2, jpk )139 DO_3D( 0, 0, 0, 0, 2, jpk ) 138 140 zwz(ji,jj,jk) = 0.5 * pW(ji,jj,jk) * ( pt(ji,jj,jk,jn,Kmm) + pt(ji,jj,jk-1,jn,Kmm) ) * wmask(ji,jj,jk) 139 141 END_3D … … 141 143 CASE( 4 ) !* 4th order compact 142 144 CALL interp_4th_cpt( pt(:,:,:,jn,Kmm) , ztw ) ! ztw = interpolated value of T at w-point 143 DO_3D _00_00(2, jpkm1 )145 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 144 146 zwz(ji,jj,jk) = pW(ji,jj,jk) * ztw(ji,jj,jk) * wmask(ji,jj,jk) 145 147 END_3D … … 149 151 IF( ln_linssh ) THEN !* top value (linear free surf. only as zwz is multiplied by wmask) 150 152 IF( ln_isfcav ) THEN ! ice-shelf cavities (top of the ocean) 151 DO_2D _11_11153 DO_2D( 1, 1, 1, 1 ) 152 154 zwz(ji,jj, mikt(ji,jj) ) = pW(ji,jj,mikt(ji,jj)) * pt(ji,jj,mikt(ji,jj),jn,Kmm) 153 155 END_2D … … 157 159 ENDIF 158 160 ! 159 DO_3D _00_00( 1, jpkm1 )161 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) !-- Divergence of advective fluxes --! 160 162 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) & 161 163 & - ( zwx(ji,jj,jk) - zwx(ji-1,jj ,jk ) & 162 164 & + zwy(ji,jj,jk) - zwy(ji ,jj-1,jk ) & 163 & + zwz(ji,jj,jk) - zwz(ji ,jj ,jk+1) ) * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 165 & + zwz(ji,jj,jk) - zwz(ji ,jj ,jk+1) ) & 166 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 164 167 END_3D 165 ! ! trend diagnostics168 ! ! trend diagnostics 166 169 IF( l_trd ) THEN 167 170 CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_xad, zwx, pU, pt(:,:,:,jn,Kmm) ) -
NEMO/branches/2020/r12377_ticket2386/src/OCE/TRA/traadv_fct.F90
r12511 r13540 46 46 !! * Substitutions 47 47 # include "do_loop_substitute.h90" 48 # include "domzgr_substitute.h90" 48 49 !!---------------------------------------------------------------------- 49 50 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 96 97 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 97 98 ENDIF 99 !! -- init to 0 100 zwi(:,:,:) = 0._wp 101 zwx(:,:,:) = 0._wp 102 zwy(:,:,:) = 0._wp 103 zwz(:,:,:) = 0._wp 104 ztu(:,:,:) = 0._wp 105 ztv(:,:,:) = 0._wp 106 zltu(:,:,:) = 0._wp 107 zltv(:,:,:) = 0._wp 108 ztw(:,:,:) = 0._wp 98 109 ! 99 110 l_trd = .FALSE. ! set local switches … … 128 139 IF( ll_zAimp ) THEN 129 140 ALLOCATE(zwdia(jpi,jpj,jpk), zwinf(jpi,jpj,jpk),zwsup(jpi,jpj,jpk)) 130 DO_3D_00_00( 1, jpkm1 ) 131 zwdia(ji,jj,jk) = 1._wp + p2dt * ( MAX( wi(ji,jj,jk ) , 0._wp ) - MIN( wi(ji,jj,jk+1) , 0._wp ) ) / e3t(ji,jj,jk,Krhs) 141 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 142 zwdia(ji,jj,jk) = 1._wp + p2dt * ( MAX( wi(ji,jj,jk) , 0._wp ) - MIN( wi(ji,jj,jk+1) , 0._wp ) ) & 143 & / e3t(ji,jj,jk,Krhs) 132 144 zwinf(ji,jj,jk) = p2dt * MIN( wi(ji,jj,jk ) , 0._wp ) / e3t(ji,jj,jk,Krhs) 133 145 zwsup(ji,jj,jk) = -p2dt * MAX( wi(ji,jj,jk+1) , 0._wp ) / e3t(ji,jj,jk,Krhs) … … 139 151 ! !== upstream advection with initial mass fluxes & intermediate update ==! 140 152 ! !* upstream tracer flux in the i and j direction 141 DO_3D _10_10(1, jpkm1 )153 DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 142 154 ! upstream scheme 143 155 zfp_ui = pU(ji,jj,jk) + ABS( pU(ji,jj,jk) ) … … 148 160 zwy(ji,jj,jk) = 0.5 * ( zfp_vj * pt(ji,jj,jk,jn,Kbb) + zfm_vj * pt(ji ,jj+1,jk,jn,Kbb) ) 149 161 END_3D 150 ! !* upstream tracer flux in the k direction *!151 DO_3D _11_11( 2, jpkm1)162 ! !* upstream tracer flux in the k direction *! 163 DO_3D( 1, 1, 1, 1, 2, jpkm1 ) ! Interior value ( multiplied by wmask) 152 164 zfp_wk = pW(ji,jj,jk) + ABS( pW(ji,jj,jk) ) 153 165 zfm_wk = pW(ji,jj,jk) - ABS( pW(ji,jj,jk) ) 154 166 zwz(ji,jj,jk) = 0.5 * ( zfp_wk * pt(ji,jj,jk,jn,Kbb) + zfm_wk * pt(ji,jj,jk-1,jn,Kbb) ) * wmask(ji,jj,jk) 155 167 END_3D 156 IF( ln_linssh ) THEN ! top ocean value (only in linear free surface as zwz has been w-masked)157 IF( ln_isfcav ) THEN ! top of the ice-shelf cavities and at the ocean surface158 DO_2D _11_11168 IF( ln_linssh ) THEN ! top ocean value (only in linear free surface as zwz has been w-masked) 169 IF( ln_isfcav ) THEN ! top of the ice-shelf cavities and at the ocean surface 170 DO_2D( 1, 1, 1, 1 ) 159 171 zwz(ji,jj, mikt(ji,jj) ) = pW(ji,jj,mikt(ji,jj)) * pt(ji,jj,mikt(ji,jj),jn,Kbb) ! linear free surface 160 172 END_2D 161 ELSE ! no cavities: only at the ocean surface 162 zwz(:,:,1) = pW(:,:,1) * pt(:,:,1,jn,Kbb) 173 ELSE ! no cavities: only at the ocean surface 174 DO_2D( 1, 1, 1, 1 ) 175 zwz(ji,jj,1) = pW(ji,jj,1) * pt(ji,jj,1,jn,Kbb) 176 END_2D 163 177 ENDIF 164 178 ENDIF 165 179 ! 166 DO_3D _00_00( 1, jpkm1 )167 ! ! total intermediate advective trends180 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) !* trend and after field with monotonic scheme 181 ! ! total intermediate advective trends 168 182 ztra = - ( zwx(ji,jj,jk) - zwx(ji-1,jj ,jk ) & 169 183 & + zwy(ji,jj,jk) - zwy(ji ,jj-1,jk ) & 170 184 & + zwz(ji,jj,jk) - zwz(ji ,jj ,jk+1) ) * r1_e1e2t(ji,jj) 171 ! ! update and guess with monotonic sheme 172 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) + ztra / e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk) 173 zwi(ji,jj,jk) = ( e3t(ji,jj,jk,Kbb) * pt(ji,jj,jk,jn,Kbb) + p2dt * ztra ) / e3t(ji,jj,jk,Krhs) * tmask(ji,jj,jk) 185 ! ! update and guess with monotonic sheme 186 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) + ztra & 187 & / e3t(ji,jj,jk,Kmm ) * tmask(ji,jj,jk) 188 zwi(ji,jj,jk) = ( e3t(ji,jj,jk,Kbb) * pt(ji,jj,jk,jn,Kbb) + p2dt * ztra ) & 189 & / e3t(ji,jj,jk,Krhs) * tmask(ji,jj,jk) 174 190 END_3D 175 191 … … 178 194 ! 179 195 ztw(:,:,1) = 0._wp ; ztw(:,:,jpk) = 0._wp ; 180 DO_3D _00_00( 2, jpkm1)196 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) ! Interior value ( multiplied by wmask) 181 197 zfp_wk = wi(ji,jj,jk) + ABS( wi(ji,jj,jk) ) 182 198 zfm_wk = wi(ji,jj,jk) - ABS( wi(ji,jj,jk) ) … … 184 200 zwz(ji,jj,jk) = zwz(ji,jj,jk) + ztw(ji,jj,jk) ! update vertical fluxes 185 201 END_3D 186 DO_3D _00_00(1, jpkm1 )202 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 187 203 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - ( ztw(ji,jj,jk) - ztw(ji ,jj ,jk+1) ) & 188 204 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) … … 202 218 ! 203 219 CASE( 2 ) !- 2nd order centered 204 DO_3D _10_10(1, jpkm1 )220 DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 205 221 zwx(ji,jj,jk) = 0.5_wp * pU(ji,jj,jk) * ( pt(ji,jj,jk,jn,Kmm) + pt(ji+1,jj,jk,jn,Kmm) ) - zwx(ji,jj,jk) 206 222 zwy(ji,jj,jk) = 0.5_wp * pV(ji,jj,jk) * ( pt(ji,jj,jk,jn,Kmm) + pt(ji,jj+1,jk,jn,Kmm) ) - zwy(ji,jj,jk) … … 211 227 zltv(:,:,jpk) = 0._wp 212 228 DO jk = 1, jpkm1 ! Laplacian 213 DO_2D _10_10229 DO_2D( 1, 0, 1, 0 ) ! 1st derivative (gradient) 214 230 ztu(ji,jj,jk) = ( pt(ji+1,jj ,jk,jn,Kmm) - pt(ji,jj,jk,jn,Kmm) ) * umask(ji,jj,jk) 215 231 ztv(ji,jj,jk) = ( pt(ji ,jj+1,jk,jn,Kmm) - pt(ji,jj,jk,jn,Kmm) ) * vmask(ji,jj,jk) 216 232 END_2D 217 DO_2D _00_00233 DO_2D( 0, 0, 0, 0 ) ! 2nd derivative * 1/ 6 218 234 zltu(ji,jj,jk) = ( ztu(ji,jj,jk) + ztu(ji-1,jj,jk) ) * r1_6 219 235 zltv(ji,jj,jk) = ( ztv(ji,jj,jk) + ztv(ji,jj-1,jk) ) * r1_6 220 236 END_2D 221 237 END DO 222 CALL lbc_lnk_multi( 'traadv_fct', zltu, 'T', 1. , zltv, 'T', 1.) ! Lateral boundary cond. (unchanged sgn)223 ! 224 DO_3D _10_10( 1, jpkm1 )238 CALL lbc_lnk_multi( 'traadv_fct', zltu, 'T', 1.0_wp , zltv, 'T', 1.0_wp ) ! Lateral boundary cond. (unchanged sgn) 239 ! 240 DO_3D( 1, 0, 1, 0, 1, jpkm1 ) ! Horizontal advective fluxes 225 241 zC2t_u = pt(ji,jj,jk,jn,Kmm) + pt(ji+1,jj ,jk,jn,Kmm) ! 2 x C2 interpolation of T at u- & v-points 226 242 zC2t_v = pt(ji,jj,jk,jn,Kmm) + pt(ji ,jj+1,jk,jn,Kmm) 227 ! ! C4 minus upstream advective fluxes243 ! ! C4 minus upstream advective fluxes 228 244 zwx(ji,jj,jk) = 0.5_wp * pU(ji,jj,jk) * ( zC2t_u + zltu(ji,jj,jk) - zltu(ji+1,jj,jk) ) - zwx(ji,jj,jk) 229 245 zwy(ji,jj,jk) = 0.5_wp * pV(ji,jj,jk) * ( zC2t_v + zltv(ji,jj,jk) - zltv(ji,jj+1,jk) ) - zwy(ji,jj,jk) … … 233 249 ztu(:,:,jpk) = 0._wp ! Bottom value : flux set to zero 234 250 ztv(:,:,jpk) = 0._wp 235 DO_3D _10_10( 1, jpkm1)251 DO_3D( 1, 0, 1, 0, 1, jpkm1 ) ! 1st derivative (gradient) 236 252 ztu(ji,jj,jk) = ( pt(ji+1,jj ,jk,jn,Kmm) - pt(ji,jj,jk,jn,Kmm) ) * umask(ji,jj,jk) 237 253 ztv(ji,jj,jk) = ( pt(ji ,jj+1,jk,jn,Kmm) - pt(ji,jj,jk,jn,Kmm) ) * vmask(ji,jj,jk) 238 254 END_3D 239 CALL lbc_lnk_multi( 'traadv_fct', ztu, 'U', -1. , ztv, 'V', -1.) ! Lateral boundary cond. (unchanged sgn)240 ! 241 DO_3D _00_00( 1, jpkm1 )255 CALL lbc_lnk_multi( 'traadv_fct', ztu, 'U', -1.0_wp , ztv, 'V', -1.0_wp ) ! Lateral boundary cond. (unchanged sgn) 256 ! 257 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) ! Horizontal advective fluxes 242 258 zC2t_u = pt(ji,jj,jk,jn,Kmm) + pt(ji+1,jj ,jk,jn,Kmm) ! 2 x C2 interpolation of T at u- & v-points (x2) 243 259 zC2t_v = pt(ji,jj,jk,jn,Kmm) + pt(ji ,jj+1,jk,jn,Kmm) … … 255 271 ! 256 272 CASE( 2 ) !- 2nd order centered 257 DO_3D _00_00(2, jpkm1 )273 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 258 274 zwz(ji,jj,jk) = ( pW(ji,jj,jk) * 0.5_wp * ( pt(ji,jj,jk,jn,Kmm) + pt(ji,jj,jk-1,jn,Kmm) ) & 259 275 & - zwz(ji,jj,jk) ) * wmask(ji,jj,jk) … … 262 278 CASE( 4 ) !- 4th order COMPACT 263 279 CALL interp_4th_cpt( pt(:,:,:,jn,Kmm) , ztw ) ! zwt = COMPACT interpolation of T at w-point 264 DO_3D _00_00(2, jpkm1 )280 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 265 281 zwz(ji,jj,jk) = ( pW(ji,jj,jk) * ztw(ji,jj,jk) - zwz(ji,jj,jk) ) * wmask(ji,jj,jk) 266 282 END_3D … … 272 288 ! 273 289 IF ( ll_zAimp ) THEN 274 DO_3D _00_00( 1, jpkm1 )275 ! ! total intermediate advective trends290 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) !* trend and after field with monotonic scheme 291 ! ! total intermediate advective trends 276 292 ztra = - ( zwx(ji,jj,jk) - zwx(ji-1,jj ,jk ) & 277 293 & + zwy(ji,jj,jk) - zwy(ji ,jj-1,jk ) & … … 282 298 CALL tridia_solver( zwdia, zwsup, zwinf, ztw, ztw , 0 ) 283 299 ! 284 DO_3D _00_00( 2, jpkm1)300 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) ! Interior value ( multiplied by wmask) 285 301 zfp_wk = wi(ji,jj,jk) + ABS( wi(ji,jj,jk) ) 286 302 zfm_wk = wi(ji,jj,jk) - ABS( wi(ji,jj,jk) ) … … 289 305 END IF 290 306 ! 291 CALL lbc_lnk_multi( 'traadv_fct', zwi, 'T', 1. , zwx, 'U', -1. , zwy, 'V', -1., zwz, 'W', 1.)307 CALL lbc_lnk_multi( 'traadv_fct', zwi, 'T', 1.0_wp, zwx, 'U', -1.0_wp , zwy, 'V', -1.0_wp, zwz, 'W', 1.0_wp ) 292 308 ! 293 309 ! !== monotonicity algorithm ==! … … 297 313 ! !== final trend with corrected fluxes ==! 298 314 ! 299 DO_3D _00_00(1, jpkm1 )315 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 300 316 ztra = - ( zwx(ji,jj,jk) - zwx(ji-1,jj ,jk ) & 301 317 & + zwy(ji,jj,jk) - zwy(ji ,jj-1,jk ) & … … 308 324 ! 309 325 ztw(:,:,1) = 0._wp ; ztw(:,:,jpk) = 0._wp 310 DO_3D _00_00( 2, jpkm1)326 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) ! Interior value ( multiplied by wmask) 311 327 zfp_wk = wi(ji,jj,jk) + ABS( wi(ji,jj,jk) ) 312 328 zfm_wk = wi(ji,jj,jk) - ABS( wi(ji,jj,jk) ) … … 314 330 zwz(ji,jj,jk) = zwz(ji,jj,jk) + ztw(ji,jj,jk) ! Update vertical fluxes for trend diagnostic 315 331 END_3D 316 DO_3D _00_00(1, jpkm1 )332 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 317 333 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - ( ztw(ji,jj,jk) - ztw(ji ,jj ,jk+1) ) & 318 334 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) … … 374 390 INTEGER :: ji, jj, jk ! dummy loop indices 375 391 INTEGER :: ikm1 ! local integer 376 REAL( wp) :: zpos, zneg, zbt, za, zb, zc, zbig, zrtrn ! local scalars377 REAL( wp) :: zau, zbu, zcu, zav, zbv, zcv, zup, zdo ! - -378 REAL( wp), DIMENSION(jpi,jpj,jpk) :: zbetup, zbetdo, zbup, zbdo379 !!---------------------------------------------------------------------- 380 ! 381 zbig = 1.e+40_ wp382 zrtrn = 1.e-15_ wp383 zbetup(:,:,:) = 0._ wp ; zbetdo(:,:,:) = 0._wp392 REAL(dp) :: zpos, zneg, zbt, za, zb, zc, zbig, zrtrn ! local scalars 393 REAL(dp) :: zau, zbu, zcu, zav, zbv, zcv, zup, zdo ! - - 394 REAL(dp), DIMENSION(jpi,jpj,jpk) :: zbetup, zbetdo, zbup, zbdo 395 !!---------------------------------------------------------------------- 396 ! 397 zbig = 1.e+40_dp 398 zrtrn = 1.e-15_dp 399 zbetup(:,:,:) = 0._dp ; zbetdo(:,:,:) = 0._dp 384 400 385 401 ! Search local extrema … … 393 409 DO jk = 1, jpkm1 394 410 ikm1 = MAX(jk-1,1) 395 DO_2D _00_00411 DO_2D( 0, 0, 0, 0 ) 396 412 397 413 ! search maximum in neighbourhood … … 423 439 END_2D 424 440 END DO 425 CALL lbc_lnk_multi( 'traadv_fct', zbetup, 'T', 1. , zbetdo, 'T', 1.) ! lateral boundary cond. (unchanged sign)441 CALL lbc_lnk_multi( 'traadv_fct', zbetup, 'T', 1.0_wp , zbetdo, 'T', 1.0_wp ) ! lateral boundary cond. (unchanged sign) 426 442 427 443 ! 3. monotonic flux in the i & j direction (paa & pbb) 428 444 ! ---------------------------------------- 429 DO_3D _00_00(1, jpkm1 )445 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 430 446 zau = MIN( 1._wp, zbetdo(ji,jj,jk), zbetup(ji+1,jj,jk) ) 431 447 zbu = MIN( 1._wp, zbetup(ji,jj,jk), zbetdo(ji+1,jj,jk) ) 432 zcu = ( 0.5 + SIGN( 0.5 , paa(ji,jj,jk) ) )448 zcu = ( 0.5 + SIGN( 0.5_wp , paa(ji,jj,jk) ) ) 433 449 paa(ji,jj,jk) = paa(ji,jj,jk) * ( zcu * zau + ( 1._wp - zcu) * zbu ) 434 450 435 451 zav = MIN( 1._wp, zbetdo(ji,jj,jk), zbetup(ji,jj+1,jk) ) 436 452 zbv = MIN( 1._wp, zbetup(ji,jj,jk), zbetdo(ji,jj+1,jk) ) 437 zcv = ( 0.5 + SIGN( 0.5 , pbb(ji,jj,jk) ) )453 zcv = ( 0.5 + SIGN( 0.5_wp , pbb(ji,jj,jk) ) ) 438 454 pbb(ji,jj,jk) = pbb(ji,jj,jk) * ( zcv * zav + ( 1._wp - zcv) * zbv ) 439 455 440 ! monotonic flux in the k direction, i.e. pcc441 ! -------------------------------------------456 ! monotonic flux in the k direction, i.e. pcc 457 ! ------------------------------------------- 442 458 za = MIN( 1., zbetdo(ji,jj,jk+1), zbetup(ji,jj,jk) ) 443 459 zb = MIN( 1., zbetup(ji,jj,jk+1), zbetdo(ji,jj,jk) ) 444 zc = ( 0.5 + SIGN( 0.5 , pcc(ji,jj,jk+1) ) )460 zc = ( 0.5 + SIGN( 0.5_wp , pcc(ji,jj,jk+1) ) ) 445 461 pcc(ji,jj,jk+1) = pcc(ji,jj,jk+1) * ( zc * za + ( 1._wp - zc) * zb ) 446 462 END_3D 447 CALL lbc_lnk_multi( 'traadv_fct', paa, 'U', -1. , pbb, 'V', -1.) ! lateral boundary condition (changed sign)463 CALL lbc_lnk_multi( 'traadv_fct', paa, 'U', -1.0_wp , pbb, 'V', -1.0_wp ) ! lateral boundary condition (changed sign) 448 464 ! 449 465 END SUBROUTINE nonosc … … 465 481 !!---------------------------------------------------------------------- 466 482 467 DO_3D _11_11( 3, jpkm1 )483 DO_3D( 1, 1, 1, 1, 3, jpkm1 ) !== build the three diagonal matrix ==! 468 484 zwd (ji,jj,jk) = 4._wp 469 485 zwi (ji,jj,jk) = 1._wp … … 479 495 END_3D 480 496 ! 481 jk = 2 482 DO_2D _11_11497 jk = 2 ! Switch to second order centered at top 498 DO_2D( 1, 1, 1, 1 ) 483 499 zwd (ji,jj,jk) = 1._wp 484 500 zwi (ji,jj,jk) = 0._wp … … 488 504 ! 489 505 ! !== tridiagonal solve ==! 490 DO_2D _11_11506 DO_2D( 1, 1, 1, 1 ) ! first recurrence 491 507 zwt(ji,jj,2) = zwd(ji,jj,2) 492 508 END_2D 493 DO_3D _11_11(3, jpkm1 )509 DO_3D( 1, 1, 1, 1, 3, jpkm1 ) 494 510 zwt(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) /zwt(ji,jj,jk-1) 495 511 END_3D 496 512 ! 497 DO_2D _11_11513 DO_2D( 1, 1, 1, 1 ) ! second recurrence: Zk = Yk - Ik / Tk-1 Zk-1 498 514 pt_out(ji,jj,2) = zwrm(ji,jj,2) 499 515 END_2D 500 DO_3D _11_11(3, jpkm1 )516 DO_3D( 1, 1, 1, 1, 3, jpkm1 ) 501 517 pt_out(ji,jj,jk) = zwrm(ji,jj,jk) - zwi(ji,jj,jk) / zwt(ji,jj,jk-1) *pt_out(ji,jj,jk-1) 502 518 END_3D 503 519 504 DO_2D _11_11520 DO_2D( 1, 1, 1, 1 ) ! third recurrence: Xk = (Zk - Sk Xk+1 ) / Tk 505 521 pt_out(ji,jj,jpkm1) = pt_out(ji,jj,jpkm1) / zwt(ji,jj,jpkm1) 506 522 END_2D 507 DO_3DS _11_11(jpk-2, 2, -1 )523 DO_3DS( 1, 1, 1, 1, jpk-2, 2, -1 ) 508 524 pt_out(ji,jj,jk) = ( pt_out(ji,jj,jk) - zws(ji,jj,jk) * pt_out(ji,jj,jk+1) ) / zwt(ji,jj,jk) 509 525 END_3D … … 530 546 ! !== build the three diagonal matrix & the RHS ==! 531 547 ! 532 DO_3D _00_00( 3, jpkm1)548 DO_3D( 0, 0, 0, 0, 3, jpkm1 ) ! interior (from jk=3 to jpk-1) 533 549 zwd (ji,jj,jk) = 3._wp * wmask(ji,jj,jk) + 1._wp ! diagonal 534 550 zwi (ji,jj,jk) = wmask(ji,jj,jk) ! lower diagonal … … 549 565 END IF 550 566 ! 551 DO_2D _00_00567 DO_2D( 0, 0, 0, 0 ) ! 2nd order centered at top & bottom 552 568 ikt = mikt(ji,jj) + 1 ! w-point below the 1st wet point 553 569 ikb = MAX(mbkt(ji,jj), 2) ! - above the last wet point … … 566 582 ! !== tridiagonal solver ==! 567 583 ! 568 DO_2D _00_00584 DO_2D( 0, 0, 0, 0 ) !* 1st recurrence: Tk = Dk - Ik Sk-1 / Tk-1 569 585 zwt(ji,jj,2) = zwd(ji,jj,2) 570 586 END_2D 571 DO_3D _00_00(3, jpkm1 )587 DO_3D( 0, 0, 0, 0, 3, jpkm1 ) 572 588 zwt(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) /zwt(ji,jj,jk-1) 573 589 END_3D 574 590 ! 575 DO_2D _00_00591 DO_2D( 0, 0, 0, 0 ) !* 2nd recurrence: Zk = Yk - Ik / Tk-1 Zk-1 576 592 pt_out(ji,jj,2) = zwrm(ji,jj,2) 577 593 END_2D 578 DO_3D _00_00(3, jpkm1 )594 DO_3D( 0, 0, 0, 0, 3, jpkm1 ) 579 595 pt_out(ji,jj,jk) = zwrm(ji,jj,jk) - zwi(ji,jj,jk) / zwt(ji,jj,jk-1) *pt_out(ji,jj,jk-1) 580 596 END_3D 581 597 582 DO_2D _00_00598 DO_2D( 0, 0, 0, 0 ) !* 3d recurrence: Xk = (Zk - Sk Xk+1 ) / Tk 583 599 pt_out(ji,jj,jpkm1) = pt_out(ji,jj,jpkm1) / zwt(ji,jj,jpkm1) 584 600 END_2D 585 DO_3DS _00_00(jpk-2, 2, -1 )601 DO_3DS( 0, 0, 0, 0, jpk-2, 2, -1 ) 586 602 pt_out(ji,jj,jk) = ( pt_out(ji,jj,jk) - zws(ji,jj,jk) * pt_out(ji,jj,jk+1) ) / zwt(ji,jj,jk) 587 603 END_3D … … 622 638 kstart = 1 + klev 623 639 ! 624 DO_2D _00_00640 DO_2D( 0, 0, 0, 0 ) !* 1st recurrence: Tk = Dk - Ik Sk-1 / Tk-1 625 641 zwt(ji,jj,kstart) = pD(ji,jj,kstart) 626 642 END_2D 627 DO_3D _00_00(kstart+1, jpkm1 )643 DO_3D( 0, 0, 0, 0, kstart+1, jpkm1 ) 628 644 zwt(ji,jj,jk) = pD(ji,jj,jk) - pL(ji,jj,jk) * pU(ji,jj,jk-1) /zwt(ji,jj,jk-1) 629 645 END_3D 630 646 ! 631 DO_2D _00_00647 DO_2D( 0, 0, 0, 0 ) !* 2nd recurrence: Zk = Yk - Ik / Tk-1 Zk-1 632 648 pt_out(ji,jj,kstart) = pRHS(ji,jj,kstart) 633 649 END_2D 634 DO_3D _00_00(kstart+1, jpkm1 )650 DO_3D( 0, 0, 0, 0, kstart+1, jpkm1 ) 635 651 pt_out(ji,jj,jk) = pRHS(ji,jj,jk) - pL(ji,jj,jk) / zwt(ji,jj,jk-1) *pt_out(ji,jj,jk-1) 636 652 END_3D 637 653 638 DO_2D _00_00654 DO_2D( 0, 0, 0, 0 ) !* 3d recurrence: Xk = (Zk - Sk Xk+1 ) / Tk 639 655 pt_out(ji,jj,jpkm1) = pt_out(ji,jj,jpkm1) / zwt(ji,jj,jpkm1) 640 656 END_2D 641 DO_3DS _00_00(jpk-2, kstart, -1 )657 DO_3DS( 0, 0, 0, 0, jpk-2, kstart, -1 ) 642 658 pt_out(ji,jj,jk) = ( pt_out(ji,jj,jk) - pU(ji,jj,jk) * pt_out(ji,jj,jk+1) ) / zwt(ji,jj,jk) 643 659 END_3D -
NEMO/branches/2020/r12377_ticket2386/src/OCE/TRA/traadv_mus.F90
r12377 r13540 47 47 !! * Substitutions 48 48 # include "do_loop_substitute.h90" 49 # include "domzgr_substitute.h90" 49 50 !!---------------------------------------------------------------------- 50 51 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 131 132 zwx(:,:,jpk) = 0._wp ! bottom values 132 133 zwy(:,:,jpk) = 0._wp 133 DO_3D _10_10(1, jpkm1 )134 DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 134 135 zwx(ji,jj,jk) = umask(ji,jj,jk) * ( pt(ji+1,jj,jk,jn,Kbb) - pt(ji,jj,jk,jn,Kbb) ) 135 136 zwy(ji,jj,jk) = vmask(ji,jj,jk) * ( pt(ji,jj+1,jk,jn,Kbb) - pt(ji,jj,jk,jn,Kbb) ) 136 137 END_3D 137 138 ! lateral boundary conditions (changed sign) 138 CALL lbc_lnk_multi( 'traadv_mus', zwx, 'U', -1. , zwy, 'V', -1.)139 CALL lbc_lnk_multi( 'traadv_mus', zwx, 'U', -1.0_wp , zwy, 'V', -1.0_wp ) 139 140 ! !-- Slopes of tracer 140 141 zslpx(:,:,jpk) = 0._wp ! bottom values 141 142 zslpy(:,:,jpk) = 0._wp 142 DO_3D _01_01(1, jpkm1 )143 zslpx(ji,jj,jk) = ( zwx(ji,jj,jk) + zwx(ji-1,jj ,jk) ) &144 & * ( 0.25 + SIGN( 0.25 , zwx(ji,jj,jk) * zwx(ji-1,jj ,jk) ) )145 zslpy(ji,jj,jk) = ( zwy(ji,jj,jk) + zwy(ji ,jj-1,jk) ) &146 & * ( 0.25 + SIGN( 0.25 , zwy(ji,jj,jk) * zwy(ji ,jj-1,jk) ) )147 END_3D 148 ! 149 DO_3D _01_01( 1, jpkm1 )150 zslpx(ji,jj,jk) = SIGN( 1. , zslpx(ji,jj,jk) ) * MIN( ABS( zslpx(ji ,jj,jk) ), &151 & 2.*ABS( zwx (ji-1,jj,jk) ), &152 & 2.*ABS( zwx (ji ,jj,jk) ) )153 zslpy(ji,jj,jk) = SIGN( 1. , zslpy(ji,jj,jk) ) * MIN( ABS( zslpy(ji,jj ,jk) ), &154 & 2.*ABS( zwy (ji,jj-1,jk) ), &155 & 2.*ABS( zwy (ji,jj ,jk) ) )156 END_3D 157 ! 158 DO_3D _00_00( 1, jpkm1 )143 DO_3D( 0, 1, 0, 1, 1, jpkm1 ) 144 zslpx(ji,jj,jk) = ( zwx(ji,jj,jk) + zwx(ji-1,jj ,jk) ) & 145 & * ( 0.25 + SIGN( 0.25_wp, zwx(ji,jj,jk) * zwx(ji-1,jj ,jk) ) ) 146 zslpy(ji,jj,jk) = ( zwy(ji,jj,jk) + zwy(ji ,jj-1,jk) ) & 147 & * ( 0.25 + SIGN( 0.25_wp, zwy(ji,jj,jk) * zwy(ji ,jj-1,jk) ) ) 148 END_3D 149 ! 150 DO_3D( 0, 1, 0, 1, 1, jpkm1 ) !-- Slopes limitation 151 zslpx(ji,jj,jk) = SIGN( 1.0_wp, zslpx(ji,jj,jk) ) * MIN( ABS( zslpx(ji ,jj,jk) ), & 152 & 2.*ABS( zwx (ji-1,jj,jk) ), & 153 & 2.*ABS( zwx (ji ,jj,jk) ) ) 154 zslpy(ji,jj,jk) = SIGN( 1.0_wp, zslpy(ji,jj,jk) ) * MIN( ABS( zslpy(ji,jj ,jk) ), & 155 & 2.*ABS( zwy (ji,jj-1,jk) ), & 156 & 2.*ABS( zwy (ji,jj ,jk) ) ) 157 END_3D 158 ! 159 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) !-- MUSCL horizontal advective fluxes 159 160 ! MUSCL fluxes 160 z0u = SIGN( 0.5 , pU(ji,jj,jk) )161 z0u = SIGN( 0.5_wp, pU(ji,jj,jk) ) 161 162 zalpha = 0.5 - z0u 162 163 zu = z0u - 0.5 * pU(ji,jj,jk) * p2dt * r1_e1e2u(ji,jj) / e3u(ji,jj,jk,Kmm) … … 165 166 zwx(ji,jj,jk) = pU(ji,jj,jk) * ( zalpha * zzwx + (1.-zalpha) * zzwy ) 166 167 ! 167 z0v = SIGN( 0.5 , pV(ji,jj,jk) )168 z0v = SIGN( 0.5_wp, pV(ji,jj,jk) ) 168 169 zalpha = 0.5 - z0v 169 170 zv = z0v - 0.5 * pV(ji,jj,jk) * p2dt * r1_e1e2v(ji,jj) / e3v(ji,jj,jk,Kmm) … … 172 173 zwy(ji,jj,jk) = pV(ji,jj,jk) * ( zalpha * zzwx + (1.-zalpha) * zzwy ) 173 174 END_3D 174 CALL lbc_lnk_multi( 'traadv_mus', zwx, 'U', -1. , zwy, 'V', -1.) ! lateral boundary conditions (changed sign)175 ! 176 DO_3D _00_00( 1, jpkm1 )175 CALL lbc_lnk_multi( 'traadv_mus', zwx, 'U', -1.0_wp , zwy, 'V', -1.0_wp ) ! lateral boundary conditions (changed sign) 176 ! 177 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) !-- Tracer advective trend 177 178 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - ( zwx(ji,jj,jk) - zwx(ji-1,jj ,jk ) & 178 179 & + zwy(ji,jj,jk) - zwy(ji ,jj-1,jk ) ) & … … 199 200 ! !-- Slopes of tracer 200 201 zslpx(:,:,1) = 0._wp ! surface values 201 DO_3D _11_11(2, jpkm1 )202 zslpx(ji,jj,jk) = ( zwx(ji,jj,jk) + zwx(ji,jj,jk+1) ) &203 & * ( 0.25 + SIGN( 0.25 , zwx(ji,jj,jk) * zwx(ji,jj,jk+1) ) )204 END_3D 205 DO_3D _11_11( 2, jpkm1 )206 zslpx(ji,jj,jk) = SIGN( 1. , zslpx(ji,jj,jk) ) * MIN( ABS( zslpx(ji,jj,jk ) ), &207 & 2.*ABS( zwx (ji,jj,jk+1) ), &208 & 2.*ABS( zwx (ji,jj,jk ) ) )209 END_3D 210 DO_3D _00_00( 1, jpk-2 )211 z0w = SIGN( 0.5 , pW(ji,jj,jk+1) )202 DO_3D( 1, 1, 1, 1, 2, jpkm1 ) 203 zslpx(ji,jj,jk) = ( zwx(ji,jj,jk) + zwx(ji,jj,jk+1) ) & 204 & * ( 0.25 + SIGN( 0.25_wp, zwx(ji,jj,jk) * zwx(ji,jj,jk+1) ) ) 205 END_3D 206 DO_3D( 1, 1, 1, 1, 2, jpkm1 ) !-- Slopes limitation 207 zslpx(ji,jj,jk) = SIGN( 1.0_wp, zslpx(ji,jj,jk) ) * MIN( ABS( zslpx(ji,jj,jk ) ), & 208 & 2.*ABS( zwx (ji,jj,jk+1) ), & 209 & 2.*ABS( zwx (ji,jj,jk ) ) ) 210 END_3D 211 DO_3D( 0, 0, 0, 0, 1, jpk-2 ) !-- vertical advective flux 212 z0w = SIGN( 0.5_wp, pW(ji,jj,jk+1) ) 212 213 zalpha = 0.5 + z0w 213 214 zw = z0w - 0.5 * pW(ji,jj,jk+1) * p2dt * r1_e1e2t(ji,jj) / e3w(ji,jj,jk+1,Kmm) … … 218 219 IF( ln_linssh ) THEN ! top values, linear free surface only 219 220 IF( ln_isfcav ) THEN ! ice-shelf cavities (top of the ocean) 220 DO_2D _11_11221 DO_2D( 1, 1, 1, 1 ) 221 222 zwx(ji,jj, mikt(ji,jj) ) = pW(ji,jj,mikt(ji,jj)) * pt(ji,jj,mikt(ji,jj),jn,Kbb) 222 223 END_2D … … 226 227 ENDIF 227 228 ! 228 DO_3D_00_00( 1, jpkm1 ) 229 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - ( zwx(ji,jj,jk) - zwx(ji,jj,jk+1) ) * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 229 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) !-- vertical advective trend 230 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - ( zwx(ji,jj,jk) - zwx(ji,jj,jk+1) ) & 231 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 230 232 END_3D 231 233 ! ! send trends for diagnostic -
NEMO/branches/2020/r12377_ticket2386/src/OCE/TRA/traadv_qck.F90
r12377 r13540 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) … … 141 142 ! 142 143 !!gm why not using a SHIFT instruction... 143 DO_3D _00_00( 1, jpkm1 )144 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) !--- Computation of the ustream and downstream value of the tracer and the mask 144 145 zfc(ji,jj,jk) = pt(ji-1,jj,jk,jn,Kbb) ! Upstream in the x-direction for the tracer 145 146 zfd(ji,jj,jk) = pt(ji+1,jj,jk,jn,Kbb) ! Downstream in the x-direction for the tracer 146 147 END_3D 147 CALL lbc_lnk_multi( 'traadv_qck', zfc(:,:,:), 'T', 1. , zfd(:,:,:), 'T', 1.) ! Lateral boundary conditions148 CALL lbc_lnk_multi( 'traadv_qck', zfc(:,:,:), 'T', 1.0_wp , zfd(:,:,:), 'T', 1.0_wp ) ! Lateral boundary conditions 148 149 149 150 ! 150 151 ! Horizontal advective fluxes 151 152 ! --------------------------- 152 DO_3D _00_00(1, jpkm1 )153 zdir = 0.5 + SIGN( 0.5 , pU(ji,jj,jk) ) ! if pU > 0 : zdir = 1 otherwise zdir = 0153 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 154 zdir = 0.5 + SIGN( 0.5_wp, pU(ji,jj,jk) ) ! if pU > 0 : zdir = 1 otherwise zdir = 0 154 155 zfu(ji,jj,jk) = zdir * zfc(ji,jj,jk ) + ( 1. - zdir ) * zfd(ji+1,jj,jk) ! FU in the x-direction for T 155 156 END_3D 156 157 ! 157 DO_3D _00_00(1, jpkm1 )158 zdir = 0.5 + SIGN( 0.5 , pU(ji,jj,jk) ) ! if pU > 0 : zdir = 1 otherwise zdir = 0158 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 159 zdir = 0.5 + SIGN( 0.5_wp, pU(ji,jj,jk) ) ! if pU > 0 : zdir = 1 otherwise zdir = 0 159 160 zdx = ( zdir * e1t(ji,jj) + ( 1. - zdir ) * e1t(ji+1,jj) ) * e2u(ji,jj) * e3u(ji,jj,jk,Kmm) 160 161 zwx(ji,jj,jk) = ABS( pU(ji,jj,jk) ) * p2dt / zdx ! (0<zc_cfl<1 : Courant number on x-direction) … … 163 164 END_3D 164 165 !--- Lateral boundary conditions 165 CALL lbc_lnk_multi( 'traadv_qck', zfu(:,:,:), 'T', 1. , zfd(:,:,:), 'T', 1., zfc(:,:,:), 'T', 1., zwx(:,:,:), 'T', 1.)166 CALL lbc_lnk_multi( 'traadv_qck', zfu(:,:,:), 'T', 1.0_wp , zfd(:,:,:), 'T', 1.0_wp, zfc(:,:,:), 'T', 1.0_wp, zwx(:,:,:), 'T', 1.0_wp ) 166 167 167 168 !--- QUICKEST scheme … … 169 170 ! 170 171 ! Mask at the T-points in the x-direction (mask=0 or mask=1) 171 DO_3D _00_00(1, jpkm1 )172 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 172 173 zfu(ji,jj,jk) = tmask(ji-1,jj,jk) + tmask(ji,jj,jk) + tmask(ji+1,jj,jk) - 2. 173 174 END_3D 174 CALL lbc_lnk( 'traadv_qck', zfu(:,:,:), 'T', 1. ) ! Lateral boundary conditions175 CALL lbc_lnk( 'traadv_qck', zfu(:,:,:), 'T', 1.0_wp ) ! Lateral boundary conditions 175 176 176 177 ! … … 178 179 DO jk = 1, jpkm1 179 180 ! 180 DO_2D _00_00181 zdir = 0.5 + SIGN( 0.5 , pU(ji,jj,jk) ) ! if pU > 0 : zdir = 1 otherwise zdir = 0181 DO_2D( 0, 0, 0, 0 ) 182 zdir = 0.5 + SIGN( 0.5_wp, pU(ji,jj,jk) ) ! if pU > 0 : zdir = 1 otherwise zdir = 0 182 183 !--- If the second ustream point is a land point 183 184 !--- the flux is computed by the 1st order UPWIND scheme … … 188 189 END DO 189 190 ! 190 CALL lbc_lnk( 'traadv_qck', zwx(:,:,:), 'T', 1. ) ! Lateral boundary conditions191 CALL lbc_lnk( 'traadv_qck', zwx(:,:,:), 'T', 1.0_wp ) ! Lateral boundary conditions 191 192 ! 192 193 ! Computation of the trend 193 DO_3D _00_00(1, jpkm1 )194 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 194 195 zbtr = r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 195 196 ! horizontal advective trends … … 232 233 ! 233 234 !--- Computation of the ustream and downstream value of the tracer and the mask 234 DO_2D _00_00235 DO_2D( 0, 0, 0, 0 ) 235 236 ! Upstream in the x-direction for the tracer 236 237 zfc(ji,jj,jk) = pt(ji,jj-1,jk,jn,Kbb) … … 239 240 END_2D 240 241 END DO 241 CALL lbc_lnk_multi( 'traadv_qck', zfc(:,:,:), 'T', 1. , zfd(:,:,:), 'T', 1.) ! Lateral boundary conditions242 CALL lbc_lnk_multi( 'traadv_qck', zfc(:,:,:), 'T', 1.0_wp , zfd(:,:,:), 'T', 1.0_wp ) ! Lateral boundary conditions 242 243 243 244 … … 246 247 ! --------------------------- 247 248 ! 248 DO_3D _00_00(1, jpkm1 )249 zdir = 0.5 + SIGN( 0.5 , pV(ji,jj,jk) ) ! if pU > 0 : zdir = 1 otherwise zdir = 0249 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 250 zdir = 0.5 + SIGN( 0.5_wp, pV(ji,jj,jk) ) ! if pU > 0 : zdir = 1 otherwise zdir = 0 250 251 zfu(ji,jj,jk) = zdir * zfc(ji,jj,jk ) + ( 1. - zdir ) * zfd(ji,jj+1,jk) ! FU in the x-direction for T 251 252 END_3D 252 253 ! 253 DO_3D _00_00(1, jpkm1 )254 zdir = 0.5 + SIGN( 0.5 , pV(ji,jj,jk) ) ! if pU > 0 : zdir = 1 otherwise zdir = 0254 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 255 zdir = 0.5 + SIGN( 0.5_wp, pV(ji,jj,jk) ) ! if pU > 0 : zdir = 1 otherwise zdir = 0 255 256 zdx = ( zdir * e2t(ji,jj) + ( 1. - zdir ) * e2t(ji,jj+1) ) * e1v(ji,jj) * e3v(ji,jj,jk,Kmm) 256 257 zwy(ji,jj,jk) = ABS( pV(ji,jj,jk) ) * p2dt / zdx ! (0<zc_cfl<1 : Courant number on x-direction) … … 260 261 261 262 !--- Lateral boundary conditions 262 CALL lbc_lnk_multi( 'traadv_qck', zfu(:,:,:), 'T', 1. , zfd(:,:,:), 'T', 1., zfc(:,:,:), 'T', 1., zwy(:,:,:), 'T', 1.)263 CALL lbc_lnk_multi( 'traadv_qck', zfu(:,:,:), 'T', 1.0_wp , zfd(:,:,:), 'T', 1.0_wp, zfc(:,:,:), 'T', 1.0_wp, zwy(:,:,:), 'T', 1.0_wp ) 263 264 264 265 !--- QUICKEST scheme … … 266 267 ! 267 268 ! Mask at the T-points in the x-direction (mask=0 or mask=1) 268 DO_3D _00_00(1, jpkm1 )269 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 269 270 zfu(ji,jj,jk) = tmask(ji,jj-1,jk) + tmask(ji,jj,jk) + tmask(ji,jj+1,jk) - 2. 270 271 END_3D 271 CALL lbc_lnk( 'traadv_qck', zfu(:,:,:), 'T', 1. ) !--- Lateral boundary conditions272 CALL lbc_lnk( 'traadv_qck', zfu(:,:,:), 'T', 1.0_wp ) !--- Lateral boundary conditions 272 273 ! 273 274 ! Tracer flux on the x-direction 274 275 DO jk = 1, jpkm1 275 276 ! 276 DO_2D _00_00277 zdir = 0.5 + SIGN( 0.5 , pV(ji,jj,jk) ) ! if pU > 0 : zdir = 1 otherwise zdir = 0277 DO_2D( 0, 0, 0, 0 ) 278 zdir = 0.5 + SIGN( 0.5_wp, pV(ji,jj,jk) ) ! if pU > 0 : zdir = 1 otherwise zdir = 0 278 279 !--- If the second ustream point is a land point 279 280 !--- the flux is computed by the 1st order UPWIND scheme … … 284 285 END DO 285 286 ! 286 CALL lbc_lnk( 'traadv_qck', zwy(:,:,:), 'T', 1. ) ! Lateral boundary conditions287 CALL lbc_lnk( 'traadv_qck', zwy(:,:,:), 'T', 1.0_wp ) ! Lateral boundary conditions 287 288 ! 288 289 ! Computation of the trend 289 DO_3D _00_00(1, jpkm1 )290 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 290 291 zbtr = r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 291 292 ! horizontal advective trends … … 326 327 ! ! =========== 327 328 ! 328 DO_3D _00_00( 2, jpkm1)329 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) !* Interior point (w-masked 2nd order centered flux) 329 330 zwz(ji,jj,jk) = 0.5 * pW(ji,jj,jk) * ( pt(ji,jj,jk-1,jn,Kmm) + pt(ji,jj,jk,jn,Kmm) ) * wmask(ji,jj,jk) 330 331 END_3D 331 332 IF( ln_linssh ) THEN !* top value (only in linear free surf. as zwz is multiplied by wmask) 332 333 IF( ln_isfcav ) THEN ! ice-shelf cavities (top of the ocean) 333 DO_2D _11_11334 DO_2D( 1, 1, 1, 1 ) 334 335 zwz(ji,jj, mikt(ji,jj) ) = pW(ji,jj,mikt(ji,jj)) * pt(ji,jj,mikt(ji,jj),jn,Kmm) ! linear free surface 335 336 END_2D … … 339 340 ENDIF 340 341 ! 341 DO_3D _00_00( 1, jpkm1 )342 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) !== Tracer flux divergence added to the general trend ==! 342 343 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - ( zwz(ji,jj,jk) - zwz(ji,jj,jk+1) ) & 343 344 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) … … 368 369 !---------------------------------------------------------------------- 369 370 ! 370 DO_3D _11_11(1, jpkm1 )371 DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 371 372 zc = puc(ji,jj,jk) ! Courant number 372 373 zcurv = pfd(ji,jj,jk) + pfu(ji,jj,jk) - 2. * pfc(ji,jj,jk) -
NEMO/branches/2020/r12377_ticket2386/src/OCE/TRA/traadv_ubs.F90
r12377 r13540 39 39 !! * Substitutions 40 40 # include "do_loop_substitute.h90" 41 # include "domzgr_substitute.h90" 41 42 !!---------------------------------------------------------------------- 42 43 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 82 83 !! 83 84 !! Reference : Shchepetkin, A. F., J. C. McWilliams, 2005, Ocean Modelling, 9, 347-404. 84 !! Farrow, D.E., Stevens, D.P., 1995, J. Phys. Ocean. 25, 1731 Ð1741.85 !! Farrow, D.E., Stevens, D.P., 1995, J. Phys. Ocean. 25, 1731�1741. 85 86 !!---------------------------------------------------------------------- 86 87 INTEGER , INTENT(in ) :: kt ! ocean time-step index … … 123 124 ! ! =========== 124 125 ! 125 DO jk = 1, jpkm1 !== horizontal laplacian of before tracer ==!126 DO_2D _10_10126 DO jk = 1, jpkm1 !== horizontal laplacian of before tracer ==! 127 DO_2D( 1, 0, 1, 0 ) ! First derivative (masked gradient) 127 128 zeeu = e2_e1u(ji,jj) * e3u(ji,jj,jk,Kmm) * umask(ji,jj,jk) 128 129 zeev = e1_e2v(ji,jj) * e3v(ji,jj,jk,Kmm) * vmask(ji,jj,jk) … … 130 131 ztv(ji,jj,jk) = zeev * ( pt(ji ,jj+1,jk,jn,Kbb) - pt(ji,jj,jk,jn,Kbb) ) 131 132 END_2D 132 DO_2D _00_00133 DO_2D( 0, 0, 0, 0 ) ! Second derivative (divergence) 133 134 zcoef = 1._wp / ( 6._wp * e3t(ji,jj,jk,Kmm) ) 134 135 zltu(ji,jj,jk) = ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk) ) * zcoef … … 137 138 ! 138 139 END DO 139 CALL lbc_lnk( 'traadv_ubs', zltu, 'T', 1. ) ; CALL lbc_lnk( 'traadv_ubs', zltv, 'T', 1.) ! Lateral boundary cond. (unchanged sgn)140 CALL lbc_lnk( 'traadv_ubs', zltu, 'T', 1.0_wp ) ; CALL lbc_lnk( 'traadv_ubs', zltv, 'T', 1.0_wp ) ! Lateral boundary cond. (unchanged sgn) 140 141 ! 141 DO_3D _10_10( 1, jpkm1)142 zfp_ui = pU(ji,jj,jk) + ABS( pU(ji,jj,jk) ) ! upstream transport (x2)142 DO_3D( 1, 0, 1, 0, 1, jpkm1 ) !== Horizontal advective fluxes ==! (UBS) 143 zfp_ui = pU(ji,jj,jk) + ABS( pU(ji,jj,jk) ) ! upstream transport (x2) 143 144 zfm_ui = pU(ji,jj,jk) - ABS( pU(ji,jj,jk) ) 144 145 zfp_vj = pV(ji,jj,jk) + ABS( pV(ji,jj,jk) ) … … 155 156 ! 156 157 DO jk = 1, jpkm1 !== add the horizontal advective trend ==! 157 DO_2D _00_00158 DO_2D( 0, 0, 0, 0 ) 158 159 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) & 159 160 & - ( ztu(ji,jj,jk) - ztu(ji-1,jj ,jk) & 160 & + ztv(ji,jj,jk) - ztv(ji ,jj-1,jk) ) * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 161 & + ztv(ji,jj,jk) - ztv(ji ,jj-1,jk) ) & 162 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 161 163 END_2D 162 164 ! … … 164 166 ! 165 167 zltu(:,:,:) = pt(:,:,:,jn,Krhs) - zltu(:,:,:) ! Horizontal advective trend used in vertical 2nd order FCT case 166 ! ! and/or in trend diagnostic (l_trd=T)168 ! ! and/or in trend diagnostic (l_trd=T) 167 169 ! 168 170 IF( l_trd ) THEN ! trend diagnostics … … 185 187 IF( l_trd ) zltv(:,:,:) = pt(:,:,:,jn,Krhs) ! store pt(:,:,:,:,Krhs) if trend diag. 186 188 ! 187 ! !* upstream advection with initial mass fluxes & intermediate update ==!188 DO_3D _11_11(2, jpkm1 )189 ! !* upstream advection with initial mass fluxes & intermediate update ==! 190 DO_3D( 1, 1, 1, 1, 2, jpkm1 ) 189 191 zfp_wk = pW(ji,jj,jk) + ABS( pW(ji,jj,jk) ) 190 192 zfm_wk = pW(ji,jj,jk) - ABS( pW(ji,jj,jk) ) 191 193 ztw(ji,jj,jk) = 0.5_wp * ( zfp_wk * pt(ji,jj,jk,jn,Kbb) + zfm_wk * pt(ji,jj,jk-1,jn,Kbb) ) * wmask(ji,jj,jk) 192 194 END_3D 193 IF( ln_linssh ) THEN ! top ocean value (only in linear free surface as ztw has been w-masked)194 IF( ln_isfcav ) THEN ! top of the ice-shelf cavities and at the ocean surface195 DO_2D _11_11195 IF( ln_linssh ) THEN ! top ocean value (only in linear free surface as ztw has been w-masked) 196 IF( ln_isfcav ) THEN ! top of the ice-shelf cavities and at the ocean surface 197 DO_2D( 1, 1, 1, 1 ) 196 198 ztw(ji,jj, mikt(ji,jj) ) = pW(ji,jj,mikt(ji,jj)) * pt(ji,jj,mikt(ji,jj),jn,Kbb) ! linear free surface 197 199 END_2D 198 ELSE ! no cavities: only at the ocean surface200 ELSE ! no cavities: only at the ocean surface 199 201 ztw(:,:,1) = pW(:,:,1) * pt(:,:,1,jn,Kbb) 200 202 ENDIF 201 203 ENDIF 202 204 ! 203 DO_3D_00_00( 1, jpkm1 ) 204 ztak = - ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) ) * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 205 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) !* trend and after field with monotonic scheme 206 ztak = - ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) ) & 207 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 205 208 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) + ztak 206 209 zti(ji,jj,jk) = ( pt(ji,jj,jk,jn,Kbb) + p2dt * ( ztak + zltu(ji,jj,jk) ) ) * tmask(ji,jj,jk) 207 210 END_3D 208 CALL lbc_lnk( 'traadv_ubs', zti, 'T', 1. ) ! Lateral boundary conditions on zti, zsi (unchanged sign)211 CALL lbc_lnk( 'traadv_ubs', zti, 'T', 1.0_wp ) ! Lateral boundary conditions on zti, zsi (unchanged sign) 209 212 ! 210 213 ! !* anti-diffusive flux : high order minus low order 211 DO_3D _11_11(2, jpkm1 )214 DO_3D( 1, 1, 1, 1, 2, jpkm1 ) 212 215 ztw(ji,jj,jk) = ( 0.5_wp * pW(ji,jj,jk) * ( pt(ji,jj,jk,jn,Kmm) + pt(ji,jj,jk-1,jn,Kmm) ) & 213 216 & - ztw(ji,jj,jk) ) * wmask(ji,jj,jk) … … 220 223 CASE( 4 ) ! 4th order COMPACT 221 224 CALL interp_4th_cpt( pt(:,:,:,jn,Kmm) , ztw ) ! 4th order compact interpolation of T at w-point 222 DO_3D _00_00(2, jpkm1 )225 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 223 226 ztw(ji,jj,jk) = pW(ji,jj,jk) * ztw(ji,jj,jk) * wmask(ji,jj,jk) 224 227 END_3D … … 227 230 END SELECT 228 231 ! 229 DO_3D_00_00( 1, jpkm1 ) 230 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) ) * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 232 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) ! final trend with corrected fluxes 233 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) ) & 234 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 231 235 END_3D 232 236 ! 233 IF( l_trd ) THEN ! vertical advective trend diagnostics234 DO_3D _00_00( 1, jpkm1)237 IF( l_trd ) THEN ! vertical advective trend diagnostics 238 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) ! (compute -w.dk[ptn]= -dk[w.ptn] + ptn.dk[w]) 235 239 zltv(ji,jj,jk) = pt(ji,jj,jk,jn,Krhs) - zltv(ji,jj,jk) & 236 240 & + pt(ji,jj,jk,jn,Kmm) * ( pW(ji,jj,jk) - pW(ji,jj,jk+1) ) & … … 270 274 !!---------------------------------------------------------------------- 271 275 ! 272 zbig = 1.e+ 40_wp276 zbig = 1.e+38_wp 273 277 zrtrn = 1.e-15_wp 274 278 zbetup(:,:,:) = 0._wp ; zbetdo(:,:,:) = 0._wp … … 282 286 DO jk = 1, jpkm1 ! search maximum in neighbourhood 283 287 ikm1 = MAX(jk-1,1) 284 DO_2D _00_00288 DO_2D( 0, 0, 0, 0 ) 285 289 zbetup(ji,jj,jk) = MAX( pbef(ji ,jj ,jk ), paft(ji ,jj ,jk ), & 286 290 & pbef(ji ,jj ,ikm1), pbef(ji ,jj ,jk+1), & … … 294 298 DO jk = 1, jpkm1 ! search minimum in neighbourhood 295 299 ikm1 = MAX(jk-1,1) 296 DO_2D _00_00300 DO_2D( 0, 0, 0, 0 ) 297 301 zbetdo(ji,jj,jk) = MIN( pbef(ji ,jj ,jk ), paft(ji ,jj ,jk ), & 298 302 & pbef(ji ,jj ,ikm1), pbef(ji ,jj ,jk+1), & … … 306 310 ! Positive and negative part of fluxes and beta terms 307 311 ! --------------------------------------------------- 308 DO_3D _00_00(1, jpkm1 )312 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 309 313 ! positive & negative part of the flux 310 314 zpos = MAX( 0., pcc(ji ,jj ,jk+1) ) - MIN( 0., pcc(ji ,jj ,jk ) ) … … 318 322 ! monotonic flux in the k direction, i.e. pcc 319 323 ! ------------------------------------------- 320 DO_3D _00_00(2, jpkm1 )324 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 321 325 za = MIN( 1., zbetdo(ji,jj,jk), zbetup(ji,jj,jk-1) ) 322 326 zb = MIN( 1., zbetup(ji,jj,jk), zbetdo(ji,jj,jk-1) ) 323 zc = 0.5 * ( 1.e0 + SIGN( 1. e0, pcc(ji,jj,jk) ) )327 zc = 0.5 * ( 1.e0 + SIGN( 1.0_wp, pcc(ji,jj,jk) ) ) 324 328 pcc(ji,jj,jk) = pcc(ji,jj,jk) * ( zc * za + ( 1.e0 - zc) * zb ) 325 329 END_3D -
NEMO/branches/2020/r12377_ticket2386/src/OCE/TRA/traatf.F90
r12511 r13540 58 58 !! * Substitutions 59 59 # include "do_loop_substitute.h90" 60 # include "domzgr_substitute.h90" 60 61 !!---------------------------------------------------------------------- 61 62 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 109 110 #endif 110 111 ! ! local domain boundaries (T-point, unchanged sign) 111 CALL lbc_lnk_multi( 'traatf', pts(:,:,:,jp_tem,Kaa), 'T', 1. , pts(:,:,:,jp_sal,Kaa), 'T', 1.)112 CALL lbc_lnk_multi( 'traatf', pts(:,:,:,jp_tem,Kaa), 'T', 1.0_wp, pts(:,:,:,jp_sal,Kaa), 'T', 1.0_wp ) 112 113 ! 113 114 IF( ln_bdy ) CALL bdy_tra( kt, Kbb, pts, Kaa ) ! BDY open boundaries … … 155 156 ENDIF 156 157 ! 157 CALL lbc_lnk_multi( 'traatf', pts(:,:,:,jp_tem,Kbb) , 'T', 1. , pts(:,:,:,jp_sal,Kbb) , 'T', 1., &158 & pts(:,:,:,jp_tem,Kmm) , 'T', 1. , pts(:,:,:,jp_sal,Kmm) , 'T', 1., &159 & pts(:,:,:,jp_tem,Kaa), 'T', 1. , pts(:,:,:,jp_sal,Kaa), 'T', 1.)158 CALL lbc_lnk_multi( 'traatf', pts(:,:,:,jp_tem,Kbb) , 'T', 1.0_wp, pts(:,:,:,jp_sal,Kbb) , 'T', 1.0_wp, & 159 & pts(:,:,:,jp_tem,Kmm) , 'T', 1.0_wp, pts(:,:,:,jp_sal,Kmm) , 'T', 1.0_wp, & 160 & pts(:,:,:,jp_tem,Kaa), 'T', 1.0_wp, pts(:,:,:,jp_sal,Kaa), 'T', 1.0_wp ) 160 161 ! 161 162 ENDIF 162 163 ! 163 164 IF( l_trdtra .AND. ln_linssh ) THEN ! trend of the Asselin filter (tb filtered - tb)/dt 164 zfact = 1._wp / rDt165 165 DO jk = 1, jpkm1 166 ztrdt(:,:,jk) = ( pts(:,:,jk,jp_tem,Kmm) - ztrdt(:,:,jk) ) * zfact167 ztrds(:,:,jk) = ( pts(:,:,jk,jp_sal,Kmm) - ztrds(:,:,jk) ) * zfact166 ztrdt(:,:,jk) = ( pts(:,:,jk,jp_tem,Kmm) - ztrdt(:,:,jk) ) * r1_Dt 167 ztrds(:,:,jk) = ( pts(:,:,jk,jp_sal,Kmm) - ztrds(:,:,jk) ) * r1_Dt 168 168 END DO 169 169 CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_tem, jptra_atf, ztrdt ) … … 210 210 DO jn = 1, kjpt 211 211 ! 212 DO_3D _00_00(1, jpkm1 )212 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 213 213 ztn = pt(ji,jj,jk,jn,Kmm) 214 214 ztd = pt(ji,jj,jk,jn,Kaa) - 2._wp * ztn + pt(ji,jj,jk,jn,Kbb) ! time laplacian on tracers … … 229 229 !! 230 230 !! ** Method : - Apply a thickness weighted Asselin time filter on now fields. 231 !! pt(Kmm) = ( e3t (Kmm)*pt(Kmm) + rn_atfp*[ e3t(Kbb)*pt(Kbb) - 2 e3t(Kmm)*pt(Kmm) + e3t_a*pt(Kaa) ] )232 !! /( e3t (Kmm) + rn_atfp*[ e3t(Kbb) - 2 e3t(Kmm) + e3t(Kaa)] )231 !! pt(Kmm) = ( e3t_Kmm*pt(Kmm) + rn_atfp*[ e3t_Kbb*pt(Kbb) - 2 e3t_Kmm*pt(Kmm) + e3t_Kaa*pt(Kaa) ] ) 232 !! /( e3t_Kmm + rn_atfp*[ e3t_Kbb - 2 e3t_Kmm + e3t_Kaa ] ) 233 233 !! 234 234 !! ** Action : - pt(Kmm) ready for the next time step … … 275 275 zfact2 = zfact1 * r1_rho0 276 276 DO jn = 1, kjpt 277 DO_3D _00_00(1, jpkm1 )277 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 278 278 ze3t_b = e3t(ji,jj,jk,Kbb) 279 279 ze3t_n = e3t(ji,jj,jk,Kmm) -
NEMO/branches/2020/r12377_ticket2386/src/OCE/TRA/trabbc.F90
r12511 r13540 46 46 !! * Substitutions 47 47 # include "do_loop_substitute.h90" 48 # include "domzgr_substitute.h90" 48 49 !!---------------------------------------------------------------------- 49 50 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 90 91 ENDIF 91 92 ! ! Add the geothermal trend on temperature 92 DO_2D_00_00 93 pts(ji,jj,mbkt(ji,jj),jp_tem,Krhs) = pts(ji,jj,mbkt(ji,jj),jp_tem,Krhs) + qgh_trd0(ji,jj) / e3t(ji,jj,mbkt(ji,jj),Kmm) 93 DO_2D( 0, 0, 0, 0 ) 94 pts(ji,jj,mbkt(ji,jj),jp_tem,Krhs) = pts(ji,jj,mbkt(ji,jj),jp_tem,Krhs) & 95 & + qgh_trd0(ji,jj) / e3t(ji,jj,mbkt(ji,jj),Kmm) 94 96 END_2D 95 97 ! 96 CALL lbc_lnk( 'trabbc', pts(:,:,:,jp_tem,Krhs) , 'T', 1. )98 CALL lbc_lnk( 'trabbc', pts(:,:,:,jp_tem,Krhs) , 'T', 1.0_wp ) 97 99 ! 98 100 IF( l_trdtra ) THEN ! Send the trend for diagnostics -
NEMO/branches/2020/r12377_ticket2386/src/OCE/TRA/trabbl.F90
r12377 r13540 68 68 !! * Substitutions 69 69 # include "do_loop_substitute.h90" 70 # include "domzgr_substitute.h90" 70 71 !!---------------------------------------------------------------------- 71 72 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 125 126 & tab3d_2=pts(:,:,:,jp_sal,Krhs), clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 126 127 ! lateral boundary conditions ; just need for outputs 127 CALL lbc_lnk_multi( 'trabbl', ahu_bbl, 'U', 1. , ahv_bbl, 'V', 1.)128 CALL lbc_lnk_multi( 'trabbl', ahu_bbl, 'U', 1.0_wp , ahv_bbl, 'V', 1.0_wp ) 128 129 CALL iom_put( "ahu_bbl", ahu_bbl ) ! bbl diffusive flux i-coef 129 130 CALL iom_put( "ahv_bbl", ahv_bbl ) ! bbl diffusive flux j-coef … … 138 139 & tab3d_2=pts(:,:,:,jp_sal,Krhs), clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 139 140 ! lateral boundary conditions ; just need for outputs 140 CALL lbc_lnk_multi( 'trabbl', utr_bbl, 'U', 1. , vtr_bbl, 'V', 1.)141 CALL lbc_lnk_multi( 'trabbl', utr_bbl, 'U', 1.0_wp , vtr_bbl, 'V', 1.0_wp ) 141 142 CALL iom_put( "uoce_bbl", utr_bbl ) ! bbl i-transport 142 143 CALL iom_put( "voce_bbl", vtr_bbl ) ! bbl j-transport … … 191 192 DO jn = 1, kjpt ! tracer loop 192 193 ! ! =========== 193 DO_2D _11_11194 DO_2D( 1, 1, 1, 1 ) 194 195 ik = mbkt(ji,jj) ! bottom T-level index 195 196 zptb(ji,jj) = pt(ji,jj,ik,jn) ! bottom before T and S 196 197 END_2D 197 198 ! 198 DO_2D _00_00199 DO_2D( 0, 0, 0, 0 ) ! Compute the trend 199 200 ik = mbkt(ji,jj) ! bottom T-level index 200 201 pt_rhs(ji,jj,ik,jn) = pt_rhs(ji,jj,ik,jn) & … … 342 343 ENDIF 343 344 ! !* bottom variables (T, S, alpha, beta, depth, velocity) 344 DO_2D _11_11345 DO_2D( 1, 1, 1, 1 ) 345 346 ik = mbkt(ji,jj) ! bottom T-level index 346 347 zts (ji,jj,jp_tem) = ts(ji,jj,ik,jp_tem,Kbb) ! bottom before T and S … … 357 358 IF( nn_bbl_ldf == 1 ) THEN ! diffusive bbl ! 358 359 ! !-------------------! 359 DO_2D _10_10360 DO_2D( 1, 0, 1, 0 ) ! (criteria for non zero flux: grad(rho).grad(h) < 0 ) 360 361 ! ! i-direction 361 362 za = zab(ji+1,jj,jp_tem) + zab(ji,jj,jp_tem) ! 2*(alpha,beta) at u-point … … 365 366 & - zb * ( zts(ji+1,jj,jp_sal) - zts(ji,jj,jp_sal) ) ) * umask(ji,jj,1) 366 367 ! 367 zsign = SIGN( 0.5 , -zgdrho * REAL( mgrhu(ji,jj) ) ) ! sign of ( i-gradient * i-slope )368 zsign = SIGN( 0.5_wp, -zgdrho * REAL( mgrhu(ji,jj) ) ) ! sign of ( i-gradient * i-slope ) 368 369 ahu_bbl(ji,jj) = ( 0.5 - zsign ) * ahu_bbl_0(ji,jj) ! masked diffusive flux coeff. 369 370 ! … … 375 376 & - zb * ( zts(ji,jj+1,jp_sal) - zts(ji,jj,jp_sal) ) ) * vmask(ji,jj,1) 376 377 ! 377 zsign = SIGN( 0.5 , -zgdrho * REAL( mgrhv(ji,jj) ) ) ! sign of ( j-gradient * j-slope )378 zsign = SIGN( 0.5_wp, -zgdrho * REAL( mgrhv(ji,jj) ) ) ! sign of ( j-gradient * j-slope ) 378 379 ahv_bbl(ji,jj) = ( 0.5 - zsign ) * ahv_bbl_0(ji,jj) 379 380 END_2D … … 387 388 ! 388 389 CASE( 1 ) != use of upper velocity 389 DO_2D _10_10390 DO_2D( 1, 0, 1, 0 ) ! criteria: grad(rho).grad(h)<0 and grad(rho).grad(h)<0 390 391 ! ! i-direction 391 392 za = zab(ji+1,jj,jp_tem) + zab(ji,jj,jp_tem) ! 2*(alpha,beta) at u-point … … 395 396 - zb * ( zts(ji+1,jj,jp_sal) - zts(ji,jj,jp_sal) ) ) * umask(ji,jj,1) 396 397 ! 397 zsign = SIGN( 0.5 , - zgdrho * REAL( mgrhu(ji,jj) ) ) ! sign of i-gradient * i-slope398 zsigna= SIGN( 0.5 , zub(ji,jj) * REAL( mgrhu(ji,jj) ) ) ! sign of u * i-slope398 zsign = SIGN( 0.5_wp, - zgdrho * REAL( mgrhu(ji,jj) ) ) ! sign of i-gradient * i-slope 399 zsigna= SIGN( 0.5_wp, zub(ji,jj) * REAL( mgrhu(ji,jj) ) ) ! sign of u * i-slope 399 400 ! 400 401 ! ! bbl velocity … … 407 408 zgdrho = ( za * ( zts(ji,jj+1,jp_tem) - zts(ji,jj,jp_tem) ) & 408 409 & - zb * ( zts(ji,jj+1,jp_sal) - zts(ji,jj,jp_sal) ) ) * vmask(ji,jj,1) 409 zsign = SIGN( 0.5 , - zgdrho * REAL( mgrhv(ji,jj) ) ) ! sign of j-gradient * j-slope410 zsigna= SIGN( 0.5 , zvb(ji,jj) * REAL( mgrhv(ji,jj) ) ) ! sign of u * i-slope410 zsign = SIGN( 0.5_wp, - zgdrho * REAL( mgrhv(ji,jj) ) ) ! sign of j-gradient * j-slope 411 zsigna= SIGN( 0.5_wp, zvb(ji,jj) * REAL( mgrhv(ji,jj) ) ) ! sign of u * i-slope 411 412 ! 412 413 ! ! bbl transport … … 416 417 CASE( 2 ) != bbl velocity = F( delta rho ) 417 418 zgbbl = grav * rn_gambbl 418 DO_2D _10_10419 DO_2D( 1, 0, 1, 0 ) ! criteria: rho_up > rho_down 419 420 ! ! i-direction 420 421 ! down-slope T-point i/k-index (deep) & up-slope T-point i/k-index (shelf) … … 504 505 IF( tra_bbl_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'tra_bbl_init : unable to allocate arrays' ) 505 506 ! 506 IF( nn_bbl_adv == 1 ) WRITE(numout,*) ' * Advective BBL using upper velocity' 507 IF( nn_bbl_adv == 2 ) WRITE(numout,*) ' * Advective BBL using velocity = F( delta rho)' 507 IF(lwp) THEN 508 IF( nn_bbl_adv == 1 ) WRITE(numout,*) ' * Advective BBL using upper velocity' 509 IF( nn_bbl_adv == 2 ) WRITE(numout,*) ' * Advective BBL using velocity = F( delta rho)' 510 ENDIF 508 511 ! 509 512 ! !* vertical index of "deep" bottom u- and v-points 510 DO_2D _10_10513 DO_2D( 1, 0, 1, 0 ) ! (the "shelf" bottom k-indices are mbku and mbkv) 511 514 mbku_d(ji,jj) = MAX( mbkt(ji+1,jj ) , mbkt(ji,jj) ) ! >= 1 as mbkt=1 over land 512 515 mbkv_d(ji,jj) = MAX( mbkt(ji ,jj+1) , mbkt(ji,jj) ) … … 514 517 ! converte into REAL to use lbc_lnk ; impose a min value of 1 as a zero can be set in lbclnk 515 518 zmbku(:,:) = REAL( mbku_d(:,:), wp ) ; zmbkv(:,:) = REAL( mbkv_d(:,:), wp ) 516 CALL lbc_lnk_multi( 'trabbl', zmbku,'U',1. , zmbkv,'V',1.)519 CALL lbc_lnk_multi( 'trabbl', zmbku,'U',1.0_wp, zmbkv,'V',1.0_wp) 517 520 mbku_d(:,:) = MAX( INT( zmbku(:,:) ), 1 ) ; mbkv_d(:,:) = MAX( NINT( zmbkv(:,:) ), 1 ) 518 521 ! 519 522 ! !* sign of grad(H) at u- and v-points; zero if grad(H) = 0 520 523 mgrhu(:,:) = 0 ; mgrhv(:,:) = 0 521 DO_2D _10_10524 DO_2D( 1, 0, 1, 0 ) 522 525 IF( gdept_0(ji+1,jj,mbkt(ji+1,jj)) - gdept_0(ji,jj,mbkt(ji,jj)) /= 0._wp ) THEN 523 mgrhu(ji,jj) = INT( SIGN( 1. e0, gdept_0(ji+1,jj,mbkt(ji+1,jj)) - gdept_0(ji,jj,mbkt(ji,jj)) ) )526 mgrhu(ji,jj) = INT( SIGN( 1.0_wp, gdept_0(ji+1,jj,mbkt(ji+1,jj)) - gdept_0(ji,jj,mbkt(ji,jj)) ) ) 524 527 ENDIF 525 528 ! 526 529 IF( gdept_0(ji,jj+1,mbkt(ji,jj+1)) - gdept_0(ji,jj,mbkt(ji,jj)) /= 0._wp ) THEN 527 mgrhv(ji,jj) = INT( SIGN( 1. e0, gdept_0(ji,jj+1,mbkt(ji,jj+1)) - gdept_0(ji,jj,mbkt(ji,jj)) ) )530 mgrhv(ji,jj) = INT( SIGN( 1.0_wp, gdept_0(ji,jj+1,mbkt(ji,jj+1)) - gdept_0(ji,jj,mbkt(ji,jj)) ) ) 528 531 ENDIF 529 532 END_2D 530 533 ! 531 DO_2D _10_10534 DO_2D( 1, 0, 1, 0 ) !* bbl thickness at u- (v-) point; minimum of top & bottom e3u_0 (e3v_0) 532 535 e3u_bbl_0(ji,jj) = MIN( e3u_0(ji,jj,mbkt(ji+1,jj )), e3u_0(ji,jj,mbkt(ji,jj)) ) 533 536 e3v_bbl_0(ji,jj) = MIN( e3v_0(ji,jj,mbkt(ji ,jj+1)), e3v_0(ji,jj,mbkt(ji,jj)) ) 534 537 END_2D 535 CALL lbc_lnk_multi( 'trabbl', e3u_bbl_0, 'U', 1. , e3v_bbl_0, 'V', 1.) ! lateral boundary conditions538 CALL lbc_lnk_multi( 'trabbl', e3u_bbl_0, 'U', 1.0_wp , e3v_bbl_0, 'V', 1.0_wp ) ! lateral boundary conditions 536 539 ! 537 540 ! !* masked diffusive flux coefficients -
NEMO/branches/2020/r12377_ticket2386/src/OCE/TRA/tradmp.F90
r12377 r13540 112 112 CASE( 0 ) !* newtonian damping throughout the water column *! 113 113 DO jn = 1, jpts 114 DO_3D _00_00(1, jpkm1 )114 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 115 115 pts(ji,jj,jk,jn,Krhs) = pts(ji,jj,jk,jn,Krhs) & 116 116 & + resto(ji,jj,jk) * ( zts_dta(ji,jj,jk,jn) - pts(ji,jj,jk,jn,Kbb) ) … … 119 119 ! 120 120 CASE ( 1 ) !* no damping in the turbocline (avt > 5 cm2/s) *! 121 DO_3D _00_00(1, jpkm1 )121 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 122 122 IF( avt(ji,jj,jk) <= avt_c ) THEN 123 123 pts(ji,jj,jk,jp_tem,Krhs) = pts(ji,jj,jk,jp_tem,Krhs) & … … 129 129 ! 130 130 CASE ( 2 ) !* no damping in the mixed layer *! 131 DO_3D _00_00(1, jpkm1 )131 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 132 132 IF( gdept(ji,jj,jk,Kmm) >= hmlp (ji,jj) ) THEN 133 133 pts(ji,jj,jk,jp_tem,Krhs) = pts(ji,jj,jk,jp_tem,Krhs) & … … 208 208 ! ! Read in mask from file 209 209 CALL iom_open ( cn_resto, imask) 210 CALL iom_get ( imask, jpdom_auto glo, 'resto', resto )210 CALL iom_get ( imask, jpdom_auto, 'resto', resto ) 211 211 CALL iom_close( imask ) 212 212 ENDIF -
NEMO/branches/2020/r12377_ticket2386/src/OCE/TRA/traisf.F90
r12377 r13540 11 11 !!---------------------------------------------------------------------- 12 12 USE isf_oce ! Ice shelf variables 13 USE dom_oce , ONLY : e3t, r1_e1e2t! ocean space domain variables13 USE dom_oce ! ocean space domain variables 14 14 USE isfutils, ONLY : debug ! debug option 15 15 USE timing , ONLY : timing_start, timing_stop ! Timing … … 23 23 !! * Substitutions 24 24 # include "do_loop_substitute.h90" 25 # include "domzgr_substitute.h90" 25 26 !!---------------------------------------------------------------------- 26 27 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 107 108 ! 108 109 ! update pts(:,:,:,:,Krhs) 109 DO_2D _11_11110 DO_2D( 1, 1, 1, 1 ) 110 111 ! 111 112 ikt = ktop(ji,jj) … … 140 141 ! 141 142 DO jk = 1,jpk 142 ptsa(:,:,jk,jp_tem) = ptsa(:,:,jk,jp_tem) + ptsc(:,:,jk,jp_tem) * r1_e1e2t(:,:) / e3t(:,:,jk,Kmm) 143 ptsa(:,:,jk,jp_sal) = ptsa(:,:,jk,jp_sal) + ptsc(:,:,jk,jp_sal) * r1_e1e2t(:,:) / e3t(:,:,jk,Kmm) 143 ptsa(:,:,jk,jp_tem) = & 144 & ptsa(:,:,jk,jp_tem) + ptsc(:,:,jk,jp_tem) * r1_e1e2t(:,:) / e3t(:,:,jk,Kmm) 145 ptsa(:,:,jk,jp_sal) = & 146 & ptsa(:,:,jk,jp_sal) + ptsc(:,:,jk,jp_sal) * r1_e1e2t(:,:) / e3t(:,:,jk,Kmm) 144 147 END DO 145 148 ! -
NEMO/branches/2020/r12377_ticket2386/src/OCE/TRA/traldf_iso.F90
r12511 r13540 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) … … 140 141 IF( kpass == 1 ) THEN !== first pass only ==! 141 142 ! 142 DO_3D _00_00(2, jpkm1 )143 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 143 144 ! 144 145 zmsku = wmask(ji,jj,jk) / MAX( umask(ji ,jj,jk-1) + umask(ji-1,jj,jk) & … … 157 158 ! 158 159 IF( ln_traldf_msc ) THEN ! stabilizing vertical diffusivity coefficient 159 DO_3D _00_00(2, jpkm1 )160 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 160 161 akz(ji,jj,jk) = 0.25_wp * ( & 161 162 & ( pahu(ji ,jj,jk) + pahu(ji ,jj,jk-1) ) / ( e1u(ji ,jj) * e1u(ji ,jj) ) & … … 166 167 ! 167 168 IF( ln_traldf_blp ) THEN ! bilaplacian operator 168 DO_3D_10_10( 2, jpkm1 ) 169 akz(ji,jj,jk) = 16._wp * ah_wslp2(ji,jj,jk) & 170 & * ( akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ( e3w(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) ) ) 169 DO_3D( 1, 0, 1, 0, 2, jpkm1 ) 170 akz(ji,jj,jk) = 16._wp & 171 & * ah_wslp2 (ji,jj,jk) & 172 & * ( akz (ji,jj,jk) & 173 & + ah_wslp2(ji,jj,jk) & 174 & / ( e3w(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) ) ) 171 175 END_3D 172 176 ELSEIF( ln_traldf_lap ) THEN ! laplacian operator 173 DO_3D _10_10(2, jpkm1 )177 DO_3D( 1, 0, 1, 0, 2, jpkm1 ) 174 178 ze3w_2 = e3w(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) 175 179 zcoef0 = rDt * ( akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ze3w_2 ) … … 196 200 197 201 ! Horizontal tracer gradient 198 DO_3D _10_10(1, jpkm1 )202 DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 199 203 zdit(ji,jj,jk) = ( pt(ji+1,jj ,jk,jn) - pt(ji,jj,jk,jn) ) * umask(ji,jj,jk) 200 204 zdjt(ji,jj,jk) = ( pt(ji ,jj+1,jk,jn) - pt(ji,jj,jk,jn) ) * vmask(ji,jj,jk) 201 205 END_3D 202 206 IF( ln_zps ) THEN ! botton and surface ocean correction of the horizontal gradient 203 DO_2D _10_10207 DO_2D( 1, 0, 1, 0 ) ! bottom correction (partial bottom cell) 204 208 zdit(ji,jj,mbku(ji,jj)) = pgu(ji,jj,jn) 205 209 zdjt(ji,jj,mbkv(ji,jj)) = pgv(ji,jj,jn) 206 210 END_2D 207 211 IF( ln_isfcav ) THEN ! first wet level beneath a cavity 208 DO_2D _10_10212 DO_2D( 1, 0, 1, 0 ) 209 213 IF( miku(ji,jj) > 1 ) zdit(ji,jj,miku(ji,jj)) = pgui(ji,jj,jn) 210 214 IF( mikv(ji,jj) > 1 ) zdjt(ji,jj,mikv(ji,jj)) = pgvi(ji,jj,jn) … … 225 229 ELSE ; zdkt(:,:) = ( pt(:,:,jk-1,jn) - pt(:,:,jk,jn) ) * wmask(:,:,jk) 226 230 ENDIF 227 DO_2D _10_10231 DO_2D( 1, 0, 1, 0 ) !== Horizontal fluxes 228 232 zabe1 = pahu(ji,jj,jk) * e2_e1u(ji,jj) * e3u(ji,jj,jk,Kmm) 229 233 zabe2 = pahv(ji,jj,jk) * e1_e2v(ji,jj) * e3v(ji,jj,jk,Kmm) … … 246 250 END_2D 247 251 ! 248 DO_2D _00_00249 pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + zsign * ( zftu(ji,jj,jk) - zftu(ji-1,jj,jk)&250 & 252 DO_2D( 0, 0, 0, 0 ) !== horizontal divergence and add to pta 253 pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) & 254 & + zsign * ( zftu(ji,jj,jk) - zftu(ji-1,jj,jk) + zftv(ji,jj,jk) - zftv(ji,jj-1,jk) ) & 251 255 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 252 256 END_2D … … 262 266 ztfw(:,:, 1 ) = 0._wp ; ztfw(:,:,jpk) = 0._wp 263 267 264 DO_3D _00_00( 2, jpkm1)268 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) ! interior (2=<jk=<jpk-1) 265 269 ! 266 270 zmsku = wmask(ji,jj,jk) / MAX( umask(ji ,jj,jk-1) + umask(ji-1,jj,jk) & … … 284 288 ! !== add the vertical 33 flux ==! 285 289 IF( ln_traldf_lap ) THEN ! laplacian case: eddy coef = ah_wslp2 - akz 286 DO_3D _00_00(2, jpkm1 )290 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 287 291 ztfw(ji,jj,jk) = ztfw(ji,jj,jk) + e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * wmask(ji,jj,jk) & 288 292 & * ( ah_wslp2(ji,jj,jk) - akz(ji,jj,jk) ) & … … 293 297 SELECT CASE( kpass ) 294 298 CASE( 1 ) ! 1st pass : eddy coef = ah_wslp2 295 DO_3D _00_00(2, jpkm1 )296 ztfw(ji,jj,jk) = ztfw(ji,jj,jk)&297 & + ah_wslp2(ji,jj,jk)* e1e2t(ji,jj) &299 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 300 ztfw(ji,jj,jk) = & 301 & ztfw(ji,jj,jk) + ah_wslp2(ji,jj,jk) * e1e2t(ji,jj) & 298 302 & * ( pt(ji,jj,jk-1,jn) - pt(ji,jj,jk,jn) ) / e3w(ji,jj,jk,Kmm) * wmask(ji,jj,jk) 299 303 END_3D 300 304 CASE( 2 ) ! 2nd pass : eddy flux = ah_wslp2 and akz applied on pt and pt2 gradients, resp. 301 DO_3D _00_00(2, jpkm1 )305 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 302 306 ztfw(ji,jj,jk) = ztfw(ji,jj,jk) + e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * wmask(ji,jj,jk) & 303 307 & * ( ah_wslp2(ji,jj,jk) * ( pt (ji,jj,jk-1,jn) - pt (ji,jj,jk,jn) ) & … … 307 311 ENDIF 308 312 ! 309 DO_3D _00_00( 1, jpkm1 )310 pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + zsign * ( ztfw (ji,jj,jk) - ztfw(ji,jj,jk+1) ) &311 & * r1_e1e2t(ji,jj)/ e3t(ji,jj,jk,Kmm)313 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) !== Divergence of vertical fluxes added to pta ==! 314 pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + zsign * ( ztfw (ji,jj,jk) - ztfw(ji,jj,jk+1) ) * r1_e1e2t(ji,jj) & 315 & / e3t(ji,jj,jk,Kmm) 312 316 END_3D 313 317 ! -
NEMO/branches/2020/r12377_ticket2386/src/OCE/TRA/traldf_lap_blp.F90
r12377 r13540 38 38 !! * Substitutions 39 39 # include "do_loop_substitute.h90" 40 # include "domzgr_substitute.h90" 40 41 !!---------------------------------------------------------------------- 41 42 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 98 99 ELSE ; zsign = -1._wp 99 100 ENDIF 100 DO_3D _10_10(1, jpkm1 )101 DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 101 102 zaheeu(ji,jj,jk) = zsign * pahu(ji,jj,jk) * e2_e1u(ji,jj) * e3u(ji,jj,jk,Kmm) !!gm * umask(ji,jj,jk) pah masked! 102 103 zaheev(ji,jj,jk) = zsign * pahv(ji,jj,jk) * e1_e2v(ji,jj) * e3v(ji,jj,jk,Kmm) !!gm * vmask(ji,jj,jk) … … 107 108 ! ! =========== ! 108 109 ! 109 DO_3D _10_10( 1, jpkm1 )110 DO_3D( 1, 0, 1, 0, 1, jpkm1 ) !== First derivative (gradient) ==! 110 111 ztu(ji,jj,jk) = zaheeu(ji,jj,jk) * ( pt(ji+1,jj ,jk,jn) - pt(ji,jj,jk,jn) ) 111 112 ztv(ji,jj,jk) = zaheev(ji,jj,jk) * ( pt(ji ,jj+1,jk,jn) - pt(ji,jj,jk,jn) ) 112 113 END_3D 113 IF( ln_zps ) THEN ! set gradient at bottom/top ocean level114 DO_2D _10_10114 IF( ln_zps ) THEN ! set gradient at bottom/top ocean level 115 DO_2D( 1, 0, 1, 0 ) ! bottom 115 116 ztu(ji,jj,mbku(ji,jj)) = zaheeu(ji,jj,mbku(ji,jj)) * pgu(ji,jj,jn) 116 117 ztv(ji,jj,mbkv(ji,jj)) = zaheev(ji,jj,mbkv(ji,jj)) * pgv(ji,jj,jn) 117 118 END_2D 118 IF( ln_isfcav ) THEN ! top in ocean cavities only119 DO_2D _10_10119 IF( ln_isfcav ) THEN ! top in ocean cavities only 120 DO_2D( 1, 0, 1, 0 ) 120 121 IF( miku(ji,jj) > 1 ) ztu(ji,jj,miku(ji,jj)) = zaheeu(ji,jj,miku(ji,jj)) * pgui(ji,jj,jn) 121 122 IF( mikv(ji,jj) > 1 ) ztv(ji,jj,mikv(ji,jj)) = zaheev(ji,jj,mikv(ji,jj)) * pgvi(ji,jj,jn) … … 124 125 ENDIF 125 126 ! 126 DO_3D _00_00( 1, jpkm1 )127 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) !== Second derivative (divergence) added to the general tracer trends ==! 127 128 pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk) & 128 129 & + ztv(ji,jj,jk) - ztv(ji,jj-1,jk) ) & … … 199 200 END SELECT 200 201 ! 201 CALL lbc_lnk( 'traldf_lap_blp', zlap(:,:,:,:) , 'T', 1. ) ! Lateral boundary conditions (unchanged sign)202 CALL lbc_lnk( 'traldf_lap_blp', zlap(:,:,:,:) , 'T', 1.0_wp ) ! Lateral boundary conditions (unchanged sign) 202 203 ! ! Partial top/bottom cell: GRADh( zlap ) 203 204 IF( ln_isfcav .AND. ln_zps ) THEN ; CALL zps_hde_isf( kt, Kmm, kjpt, zlap, zglu, zglv, zgui, zgvi ) ! both top & bottom -
NEMO/branches/2020/r12377_ticket2386/src/OCE/TRA/traldf_triad.F90
r12511 r13540 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) … … 136 137 DO ip = 0, 1 ! i-k triads 137 138 DO kp = 0, 1 138 DO_3D _10_10(1, jpkm1 )139 DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 139 140 ze3wr = 1._wp / e3w(ji+ip,jj,jk+kp,Kmm) 140 141 zbu = e1e2u(ji,jj) * e3u(ji,jj,jk,Kmm) … … 156 157 DO jp = 0, 1 ! j-k triads 157 158 DO kp = 0, 1 158 DO_3D _10_10(1, jpkm1 )159 DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 159 160 ze3wr = 1.0_wp / e3w(ji,jj+jp,jk+kp,Kmm) 160 161 zbv = e1e2v(ji,jj) * e3v(ji,jj,jk,Kmm) … … 178 179 ! 179 180 IF( ln_traldf_blp ) THEN ! bilaplacian operator 180 DO_3D_10_10( 2, jpkm1 ) 181 akz(ji,jj,jk) = 16._wp * ah_wslp2(ji,jj,jk) & 182 & * ( akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ( e3w(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) ) ) 181 DO_3D( 1, 0, 1, 0, 2, jpkm1 ) 182 akz(ji,jj,jk) = 16._wp & 183 & * ah_wslp2 (ji,jj,jk) & 184 & * ( akz (ji,jj,jk) & 185 & + ah_wslp2(ji,jj,jk) & 186 & / ( e3w (ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) ) ) 183 187 END_3D 184 188 ELSEIF( ln_traldf_lap ) THEN ! laplacian operator 185 DO_3D _10_10(2, jpkm1 )189 DO_3D( 1, 0, 1, 0, 2, jpkm1 ) 186 190 ze3w_2 = e3w(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) 187 191 zcoef0 = rDt * ( akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ze3w_2 ) … … 207 211 zftv(:,:,:) = 0._wp 208 212 ! 209 DO_3D _10_10( 1, jpkm1 )213 DO_3D( 1, 0, 1, 0, 1, jpkm1 ) !== before lateral T & S gradients at T-level jk ==! 210 214 zdit(ji,jj,jk) = ( pt(ji+1,jj ,jk,jn) - pt(ji,jj,jk,jn) ) * umask(ji,jj,jk) 211 215 zdjt(ji,jj,jk) = ( pt(ji ,jj+1,jk,jn) - pt(ji,jj,jk,jn) ) * vmask(ji,jj,jk) 212 216 END_3D 213 217 IF( ln_zps .AND. l_grad_zps ) THEN ! partial steps: correction at top/bottom ocean level 214 DO_2D _10_10218 DO_2D( 1, 0, 1, 0 ) ! bottom level 215 219 zdit(ji,jj,mbku(ji,jj)) = pgu(ji,jj,jn) 216 220 zdjt(ji,jj,mbkv(ji,jj)) = pgv(ji,jj,jn) 217 221 END_2D 218 222 IF( ln_isfcav ) THEN ! top level (ocean cavities only) 219 DO_2D _10_10223 DO_2D( 1, 0, 1, 0 ) 220 224 IF( miku(ji,jj) > 1 ) zdit(ji,jj,miku(ji,jj) ) = pgui(ji,jj,jn) 221 225 IF( mikv(ji,jj) > 1 ) zdjt(ji,jj,mikv(ji,jj) ) = pgvi(ji,jj,jn) … … 242 246 DO ip = 0, 1 !== Horizontal & vertical fluxes 243 247 DO kp = 0, 1 244 DO_2D _10_10248 DO_2D( 1, 0, 1, 0 ) 245 249 ze1ur = r1_e1u(ji,jj) 246 250 zdxt = zdit(ji,jj,jk) * ze1ur … … 263 267 DO jp = 0, 1 264 268 DO kp = 0, 1 265 DO_2D _10_10269 DO_2D( 1, 0, 1, 0 ) 266 270 ze2vr = r1_e2v(ji,jj) 267 271 zdyt = zdjt(ji,jj,jk) * ze2vr … … 285 289 DO ip = 0, 1 !== Horizontal & vertical fluxes 286 290 DO kp = 0, 1 287 DO_2D _10_10291 DO_2D( 1, 0, 1, 0 ) 288 292 ze1ur = r1_e1u(ji,jj) 289 293 zdxt = zdit(ji,jj,jk) * ze1ur … … 306 310 DO jp = 0, 1 307 311 DO kp = 0, 1 308 DO_2D _10_10312 DO_2D( 1, 0, 1, 0 ) 309 313 ze2vr = r1_e2v(ji,jj) 310 314 zdyt = zdjt(ji,jj,jk) * ze2vr … … 325 329 ENDIF 326 330 ! !== horizontal divergence and add to the general trend ==! 327 DO_2D_00_00 328 pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + zsign * ( zftu(ji-1,jj,jk) - zftu(ji,jj,jk) & 331 DO_2D( 0, 0, 0, 0 ) 332 pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) & 333 & + zsign * ( zftu(ji-1,jj ,jk) - zftu(ji,jj,jk) & 329 334 & + zftv(ji,jj-1,jk) - zftv(ji,jj,jk) ) & 330 335 & / ( e1e2t(ji,jj) * e3t(ji,jj,jk,Kmm) ) … … 335 340 ! !== add the vertical 33 flux ==! 336 341 IF( ln_traldf_lap ) THEN ! laplacian case: eddy coef = ah_wslp2 - akz 337 DO_3D _10_00(2, jpkm1 )342 DO_3D( 1, 0, 0, 0, 2, jpkm1 ) 338 343 ztfw(ji,jj,jk) = ztfw(ji,jj,jk) - e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * tmask(ji,jj,jk) & 339 344 & * ( ah_wslp2(ji,jj,jk) - akz(ji,jj,jk) ) & … … 343 348 SELECT CASE( kpass ) 344 349 CASE( 1 ) ! 1st pass : eddy coef = ah_wslp2 345 DO_3D _10_00(2, jpkm1 )350 DO_3D( 1, 0, 0, 0, 2, jpkm1 ) 346 351 ztfw(ji,jj,jk) = ztfw(ji,jj,jk) - e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * tmask(ji,jj,jk) & 347 352 & * ah_wslp2(ji,jj,jk) * ( pt(ji,jj,jk-1,jn) - pt(ji,jj,jk,jn) ) 348 353 END_3D 349 354 CASE( 2 ) ! 2nd pass : eddy flux = ah_wslp2 and akz applied on pt and pt2 gradients, resp. 350 DO_3D _10_00(2, jpkm1 )355 DO_3D( 1, 0, 0, 0, 2, jpkm1 ) 351 356 ztfw(ji,jj,jk) = ztfw(ji,jj,jk) - e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * tmask(ji,jj,jk) & 352 357 & * ( ah_wslp2(ji,jj,jk) * ( pt (ji,jj,jk-1,jn) - pt (ji,jj,jk,jn) ) & … … 356 361 ENDIF 357 362 ! 358 DO_3D_00_00( 1, jpkm1 ) 359 pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + zsign * ( ztfw(ji,jj,jk+1) - ztfw(ji,jj,jk) ) & 363 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) !== Divergence of vertical fluxes added to pta ==! 364 pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) & 365 & + zsign * ( ztfw(ji,jj,jk+1) - ztfw(ji,jj,jk) ) & 360 366 & / ( e1e2t(ji,jj) * e3t(ji,jj,jk,Kmm) ) 361 367 END_3D -
NEMO/branches/2020/r12377_ticket2386/src/OCE/TRA/tramle.F90
r12511 r13540 49 49 !! * Substitutions 50 50 # include "do_loop_substitute.h90" 51 # include "domzgr_substitute.h90" 51 52 !!---------------------------------------------------------------------- 52 53 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 99 100 inml_mle(:,:) = mbkt(:,:) + 1 ! init. to number of ocean w-level (T-level + 1) 100 101 IF ( nla10 > 0 ) THEN ! avoid case where first level is thicker than 10m 101 DO_3DS _11_11( jpkm1, nlb10, -1)102 DO_3DS( 1, 1, 1, 1, jpkm1, nlb10, -1 ) ! from the bottom to nlb10 (10m) 102 103 IF( rhop(ji,jj,jk) > rhop(ji,jj,nla10) + rn_rho_c_mle ) inml_mle(ji,jj) = jk ! Mixed layer 103 104 END_3D … … 109 110 zbm (:,:) = 0._wp 110 111 zn2 (:,:) = 0._wp 111 DO_3D _11_11( 1, ikmax )112 DO_3D( 1, 1, 1, 1, 1, ikmax ) ! MLD and mean buoyancy and N2 over the mixed layer 112 113 zc = e3t(ji,jj,jk,Kmm) * REAL( MIN( MAX( 0, inml_mle(ji,jj)-jk ) , 1 ) ) ! zc being 0 outside the ML t-points 113 114 zmld(ji,jj) = zmld(ji,jj) + zc … … 118 119 SELECT CASE( nn_mld_uv ) ! MLD at u- & v-pts 119 120 CASE ( 0 ) != min of the 2 neighbour MLDs 120 DO_2D _10_10121 DO_2D( 1, 0, 1, 0 ) 121 122 zhu(ji,jj) = MIN( zmld(ji+1,jj), zmld(ji,jj) ) 122 123 zhv(ji,jj) = MIN( zmld(ji,jj+1), zmld(ji,jj) ) 123 124 END_2D 124 125 CASE ( 1 ) != average of the 2 neighbour MLDs 125 DO_2D _10_10126 DO_2D( 1, 0, 1, 0 ) 126 127 zhu(ji,jj) = ( zmld(ji+1,jj) + zmld(ji,jj) ) * 0.5_wp 127 128 zhv(ji,jj) = ( zmld(ji,jj+1) + zmld(ji,jj) ) * 0.5_wp 128 129 END_2D 129 130 CASE ( 2 ) != max of the 2 neighbour MLDs 130 DO_2D _10_10131 DO_2D( 1, 0, 1, 0 ) 131 132 zhu(ji,jj) = MAX( zmld(ji+1,jj), zmld(ji,jj) ) 132 133 zhv(ji,jj) = MAX( zmld(ji,jj+1), zmld(ji,jj) ) … … 145 146 ! 146 147 IF( nn_mle == 0 ) THEN ! Fox-Kemper et al. 2010 formulation 147 DO_2D _10_10148 DO_2D( 1, 0, 1, 0 ) 148 149 zpsim_u(ji,jj) = rn_ce * zhu(ji,jj) * zhu(ji,jj) * e2_e1u(ji,jj) & 149 150 & * ( zbm(ji+1,jj) - zbm(ji,jj) ) * MIN( 111.e3_wp , e1u(ji,jj) ) & … … 156 157 ! 157 158 ELSEIF( nn_mle == 1 ) THEN ! New formulation (Lf = 5km fo/ff with fo=Coriolis parameter at latitude rn_lat) 158 DO_2D _10_10159 DO_2D( 1, 0, 1, 0 ) 159 160 zpsim_u(ji,jj) = rc_f * zhu(ji,jj) * zhu(ji,jj) * e2_e1u(ji,jj) & 160 161 & * ( zbm(ji+1,jj) - zbm(ji,jj) ) * MIN( 111.e3_wp , e1u(ji,jj) ) … … 166 167 ! 167 168 IF( nn_conv == 1 ) THEN ! No MLE in case of convection 168 DO_2D _10_10169 DO_2D( 1, 0, 1, 0 ) 169 170 IF( MIN( zn2(ji,jj) , zn2(ji+1,jj) ) < 0._wp ) zpsim_u(ji,jj) = 0._wp 170 171 IF( MIN( zn2(ji,jj) , zn2(ji,jj+1) ) < 0._wp ) zpsim_v(ji,jj) = 0._wp … … 173 174 ! 174 175 ! !== structure function value at uw- and vw-points ==! 175 DO_2D _10_10176 DO_2D( 1, 0, 1, 0 ) 176 177 zhu(ji,jj) = 1._wp / zhu(ji,jj) ! hu --> 1/hu 177 178 zhv(ji,jj) = 1._wp / zhv(ji,jj) … … 181 182 zpsi_vw(:,:,:) = 0._wp 182 183 ! 183 DO_3D _10_10( 2, ikmax )184 DO_3D( 1, 0, 1, 0, 2, ikmax ) ! start from 2 : surface value = 0 184 185 zcuw = 1._wp - ( gdepw(ji+1,jj,jk,Kmm) + gdepw(ji,jj,jk,Kmm) ) * zhu(ji,jj) 185 186 zcvw = 1._wp - ( gdepw(ji,jj+1,jk,Kmm) + gdepw(ji,jj,jk,Kmm) ) * zhv(ji,jj) … … 195 196 ! !== transport increased by the MLE induced transport ==! 196 197 DO jk = 1, ikmax 197 DO_2D _10_10198 DO_2D( 1, 0, 1, 0 ) ! CAUTION pu,pv must be defined at row/column i=1 / j=1 198 199 pu(ji,jj,jk) = pu(ji,jj,jk) + ( zpsi_uw(ji,jj,jk) - zpsi_uw(ji,jj,jk+1) ) 199 200 pv(ji,jj,jk) = pv(ji,jj,jk) + ( zpsi_vw(ji,jj,jk) - zpsi_vw(ji,jj,jk+1) ) 200 201 END_2D 201 DO_2D _00_00202 DO_2D( 0, 0, 0, 0 ) 202 203 pw(ji,jj,jk) = pw(ji,jj,jk) - ( zpsi_uw(ji,jj,jk) - zpsi_uw(ji-1,jj,jk) & 203 204 & + zpsi_vw(ji,jj,jk) - zpsi_vw(ji,jj-1,jk) ) … … 282 283 IF( ierr /= 0 ) CALL ctl_stop( 'tra_adv_mle_init: failed to allocate arrays' ) 283 284 z1_t2 = 1._wp / ( rn_time * rn_time ) 284 DO_2D _01_01285 DO_2D( 0, 1, 0, 1 ) ! "coriolis+ time^-1" at u- & v-points 285 286 zfu = ( ff_f(ji,jj) + ff_f(ji,jj-1) ) * 0.5_wp 286 287 zfv = ( ff_f(ji,jj) + ff_f(ji-1,jj) ) * 0.5_wp … … 288 289 rfv(ji,jj) = SQRT( zfv * zfv + z1_t2 ) 289 290 END_2D 290 CALL lbc_lnk_multi( 'tramle', rfu, 'U', 1. , rfv, 'V', 1.)291 CALL lbc_lnk_multi( 'tramle', rfu, 'U', 1.0_wp , rfv, 'V', 1.0_wp ) 291 292 ! 292 293 ELSEIF( nn_mle == 1 ) THEN ! MLE array allocation & initialisation -
NEMO/branches/2020/r12377_ticket2386/src/OCE/TRA/tranpc.F90
r12511 r13540 35 35 !! * Substitutions 36 36 # include "do_loop_substitute.h90" 37 # include "domzgr_substitute.h90" 37 38 !!---------------------------------------------------------------------- 38 39 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 102 103 inpcc = 0 103 104 ! 104 DO_2D _00_00105 DO_2D( 0, 0, 0, 0 ) ! interior column only 105 106 ! 106 107 IF( tmask(ji,jj,2) == 1 ) THEN ! At least 2 ocean points … … 309 310 ENDIF 310 311 ! 311 CALL lbc_lnk_multi( 'tranpc', pts(:,:,:,jp_tem,Kaa), 'T', 1. , pts(:,:,:,jp_sal,Kaa), 'T', 1.)312 CALL lbc_lnk_multi( 'tranpc', pts(:,:,:,jp_tem,Kaa), 'T', 1.0_wp, pts(:,:,:,jp_sal,Kaa), 'T', 1.0_wp ) 312 313 ! 313 314 IF( lwp .AND. l_LB_debug ) THEN -
NEMO/branches/2020/r12377_ticket2386/src/OCE/TRA/traqsr.F90
r12511 r13540 63 63 REAL(wp) :: xsi1r ! inverse of rn_si1 64 64 ! 65 REAL(wp) , DIMENSION(3,61):: rkrgb ! tabulated attenuation coefficients for RGB absorption65 REAL(wp) , PUBLIC, DIMENSION(3,61) :: rkrgb ! tabulated attenuation coefficients for RGB absorption 66 66 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_chl ! structure of input Chl (file informations, fields read) 67 67 68 68 !! * Substitutions 69 69 # include "do_loop_substitute.h90" 70 # include "domzgr_substitute.h90" 70 71 !!---------------------------------------------------------------------- 71 72 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 110 111 REAL(wp) :: zc0 , zc1 , zc2 , zc3 ! - - 111 112 REAL(wp) :: zzc0, zzc1, zzc2, zzc3 ! - - 112 REAL(wp) :: zz0 , zz1 ! - - 113 REAL(wp) :: zCb, zCmax, zze, zpsi, zpsimax, zdelpsi, zCtot, zCze 114 REAL(wp) :: zlogc, zlogc2, zlogc3 115 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zekb, zekg, zekr 116 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ze0, ze1, ze2, ze3, zea, ztrdt 117 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zetot, zchl3d 113 REAL(wp) :: zz0 , zz1 , ze3t, zlui ! - - 114 REAL(wp) :: zCb, zCmax, zpsi, zpsimax, zrdpsi, zCze 115 REAL(wp) :: zlogc, zlogze, zlogCtot, zlogCze 116 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: ze0, ze1, ze2, ze3 117 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdt, zetot, ztmp3d 118 118 !!---------------------------------------------------------------------- 119 119 ! … … 138 138 IF(lwp) WRITE(numout,*) ' nit000-1 qsr tracer content forcing field read in the restart file' 139 139 z1_2 = 0.5_wp 140 CALL iom_get( numror, jpdom_auto glo, 'qsr_hc_b', qsr_hc_b, ldxios = lrxios ) ! before heat content trend due to Qsr flux140 CALL iom_get( numror, jpdom_auto, 'qsr_hc_b', qsr_hc_b, ldxios = lrxios ) ! before heat content trend due to Qsr flux 141 141 ELSE ! No restart or restart not found: Euler forward time stepping 142 142 z1_2 = 1._wp … … 160 160 CASE( np_RGB , np_RGBc ) !== R-G-B fluxes ==! 161 161 ! 162 ALLOCATE( ze kb(jpi,jpj) , zekg(jpi,jpj) , zekr (jpi,jpj) ,&163 & ze 0 (jpi,jpj,jpk) , ze1 (jpi,jpj,jpk) , ze2 (jpi,jpj,jpk) ,&164 & z e3 (jpi,jpj,jpk) , zea (jpi,jpj,jpk) , zchl3d(jpi,jpj,jpk) )162 ALLOCATE( ze0 (jpi,jpj) , ze1 (jpi,jpj) , & 163 & ze2 (jpi,jpj) , ze3 (jpi,jpj) , & 164 & ztmp3d(jpi,jpj,nksr + 1) ) 165 165 ! 166 166 IF( nqsr == np_RGBc ) THEN !* Variable Chlorophyll 167 167 CALL fld_read( kt, 1, sf_chl ) ! Read Chl data and provides it at the current time step 168 ! 169 ! Separation in R-G-B depending on the surface Chl 170 ! perform and store as many of the 2D calculations as possible 171 ! before the 3D loop (use the temporary 2D arrays to replace the 172 ! most expensive calculations) 173 ! 174 DO_2D( 0, 0, 0, 0 ) 175 ! zlogc = log(zchl) 176 zlogc = LOG ( MIN( 10. , MAX( 0.03, sf_chl(1)%fnow(ji,jj,1) ) ) ) 177 ! zc1 : log(zCze) = log (1.12 * zchl**0.803) 178 zc1 = 0.113328685307 + 0.803 * zlogc 179 ! zc2 : log(zCtot) = log(40.6 * zchl**0.459) 180 zc2 = 3.703768066608 + 0.459 * zlogc 181 ! zc3 : log(zze) = log(568.2 * zCtot**(-0.746)) 182 zc3 = 6.34247346942 - 0.746 * zc2 183 ! IF( log(zze) > log(102.) ) log(zze) = log(200.0 * zCtot**(-0.293)) 184 IF( zc3 > 4.62497281328 ) zc3 = 5.298317366548 - 0.293 * zc2 185 ! 186 ze0(ji,jj) = zlogc ! ze0 = log(zchl) 187 ze1(ji,jj) = EXP( zc1 ) ! ze1 = zCze 188 ze2(ji,jj) = 1._wp / ( 0.710 + zlogc * ( 0.159 + zlogc * 0.021 ) ) ! ze2 = 1/zdelpsi 189 ze3(ji,jj) = EXP( - zc3 ) ! ze3 = 1/zze 190 END_2D 191 192 ! 193 DO_3D( 0, 0, 0, 0, 1, nksr + 1 ) 194 ! zchl = ALOG( ze0(ji,jj) ) 195 zlogc = ze0(ji,jj) 196 ! 197 zCb = 0.768 + zlogc * ( 0.087 - zlogc * ( 0.179 + zlogc * 0.025 ) ) 198 zCmax = 0.299 - zlogc * ( 0.289 - zlogc * 0.579 ) 199 zpsimax = 0.6 - zlogc * ( 0.640 - zlogc * ( 0.021 + zlogc * 0.115 ) ) 200 ! zdelpsi = 0.710 + zlogc * ( 0.159 + zlogc * 0.021 ) 201 ! 202 zCze = ze1(ji,jj) 203 zrdpsi = ze2(ji,jj) ! 1/zdelpsi 204 zpsi = ze3(ji,jj) * gdepw(ji,jj,jk,Kmm) ! gdepw/zze 205 ! 206 ! NB. make sure zchl value is such that: zchl = MIN( 10. , MAX( 0.03, zchl ) ) 207 zchl = MIN( 10. , MAX( 0.03, zCze * ( zCb + zCmax * EXP( -( (zpsi - zpsimax) * zrdpsi )**2 ) ) ) ) 208 ! Convert chlorophyll value to attenuation coefficient look-up table index 209 ztmp3d(ji,jj,jk) = 41 + 20.*LOG10(zchl) + 1.e-15 210 END_3D 211 ELSE !* constant chlorophyll 212 zchl = 0.05 213 ! NB. make sure constant value is such that: 214 zchl = MIN( 10. , MAX( 0.03, zchl ) ) 215 ! Convert chlorophyll value to attenuation coefficient look-up table index 216 zlui = 41 + 20.*LOG10(zchl) + 1.e-15 168 217 DO jk = 1, nksr + 1 169 DO jj = 2, jpjm1 ! Separation in R-G-B depending of the surface Chl 170 DO ji = 2, jpim1 171 zchl = MIN( 10. , MAX( 0.03, sf_chl(1)%fnow(ji,jj,1) ) ) 172 zCtot = 40.6 * zchl**0.459 173 zze = 568.2 * zCtot**(-0.746) 174 IF( zze > 102. ) zze = 200.0 * zCtot**(-0.293) 175 zpsi = gdepw(ji,jj,jk,Kmm) / zze 176 ! 177 zlogc = LOG( zchl ) 178 zlogc2 = zlogc * zlogc 179 zlogc3 = zlogc * zlogc * zlogc 180 zCb = 0.768 + 0.087 * zlogc - 0.179 * zlogc2 - 0.025 * zlogc3 181 zCmax = 0.299 - 0.289 * zlogc + 0.579 * zlogc2 182 zpsimax = 0.6 - 0.640 * zlogc + 0.021 * zlogc2 + 0.115 * zlogc3 183 zdelpsi = 0.710 + 0.159 * zlogc + 0.021 * zlogc2 184 zCze = 1.12 * (zchl)**0.803 185 ! 186 zchl3d(ji,jj,jk) = zCze * ( zCb + zCmax * EXP( -( (zpsi - zpsimax) / zdelpsi )**2 ) ) 187 END DO 188 ! 189 END DO 218 ztmp3d(:,:,jk) = zlui 190 219 END DO 191 ELSE !* constant chrlorophyll192 DO jk = 1, nksr + 1193 zchl3d(:,:,jk) = 0.05194 ENDDO195 220 ENDIF 196 221 ! 197 222 zcoef = ( 1. - rn_abs ) / 3._wp !* surface equi-partition in R-G-B 198 DO_2D_00_00 199 ze0(ji,jj,1) = rn_abs * qsr(ji,jj) 200 ze1(ji,jj,1) = zcoef * qsr(ji,jj) 201 ze2(ji,jj,1) = zcoef * qsr(ji,jj) 202 ze3(ji,jj,1) = zcoef * qsr(ji,jj) 203 zea(ji,jj,1) = qsr(ji,jj) 223 DO_2D( 0, 0, 0, 0 ) 224 ze0(ji,jj) = rn_abs * qsr(ji,jj) 225 ze1(ji,jj) = zcoef * qsr(ji,jj) 226 ze2(ji,jj) = zcoef * qsr(ji,jj) 227 ze3(ji,jj) = zcoef * qsr(ji,jj) 228 ! store the surface SW radiation; re-use the surface ztmp3d array 229 ! since the surface attenuation coefficient is not used 230 ztmp3d(ji,jj,1) = qsr(ji,jj) 204 231 END_2D 205 232 ! 206 DO jk = 2, nksr+1 !* interior equi-partition in R-G-B depending of vertical profile of Chl 207 DO_2D_00_00 208 zchl = MIN( 10. , MAX( 0.03, zchl3d(ji,jj,jk) ) ) 209 irgb = NINT( 41 + 20.*LOG10(zchl) + 1.e-15 ) 210 zekb(ji,jj) = rkrgb(1,irgb) 211 zekg(ji,jj) = rkrgb(2,irgb) 212 zekr(ji,jj) = rkrgb(3,irgb) 213 END_2D 214 215 DO_2D_00_00 216 zc0 = ze0(ji,jj,jk-1) * EXP( - e3t(ji,jj,jk-1,Kmm) * xsi0r ) 217 zc1 = ze1(ji,jj,jk-1) * EXP( - e3t(ji,jj,jk-1,Kmm) * zekb(ji,jj) ) 218 zc2 = ze2(ji,jj,jk-1) * EXP( - e3t(ji,jj,jk-1,Kmm) * zekg(ji,jj) ) 219 zc3 = ze3(ji,jj,jk-1) * EXP( - e3t(ji,jj,jk-1,Kmm) * zekr(ji,jj) ) 220 ze0(ji,jj,jk) = zc0 221 ze1(ji,jj,jk) = zc1 222 ze2(ji,jj,jk) = zc2 223 ze3(ji,jj,jk) = zc3 224 zea(ji,jj,jk) = ( zc0 + zc1 + zc2 + zc3 ) * wmask(ji,jj,jk) 225 END_2D 226 END DO 227 ! 228 DO_3D_00_00( 1, nksr ) 229 qsr_hc(ji,jj,jk) = r1_rho0_rcp * ( zea(ji,jj,jk) - zea(ji,jj,jk+1) ) 233 ! !* interior equi-partition in R-G-B depending on vertical profile of Chl 234 DO_3D( 0, 0, 0, 0, 2, nksr + 1 ) 235 ze3t = e3t(ji,jj,jk-1,Kmm) 236 irgb = NINT( ztmp3d(ji,jj,jk) ) 237 zc0 = ze0(ji,jj) * EXP( - ze3t * xsi0r ) 238 zc1 = ze1(ji,jj) * EXP( - ze3t * rkrgb(1,irgb) ) 239 zc2 = ze2(ji,jj) * EXP( - ze3t * rkrgb(2,irgb) ) 240 zc3 = ze3(ji,jj) * EXP( - ze3t * rkrgb(3,irgb) ) 241 ze0(ji,jj) = zc0 242 ze1(ji,jj) = zc1 243 ze2(ji,jj) = zc2 244 ze3(ji,jj) = zc3 245 ztmp3d(ji,jj,jk) = ( zc0 + zc1 + zc2 + zc3 ) * wmask(ji,jj,jk) 230 246 END_3D 231 247 ! 232 DEALLOCATE( zekb , zekg , zekr , ze0 , ze1 , ze2 , ze3 , zea , zchl3d ) 248 DO_3D( 0, 0, 0, 0, 1, nksr ) !* now qsr induced heat content 249 qsr_hc(ji,jj,jk) = r1_rho0_rcp * ( ztmp3d(ji,jj,jk) - ztmp3d(ji,jj,jk+1) ) 250 END_3D 251 ! 252 DEALLOCATE( ze0 , ze1 , ze2 , ze3 , ztmp3d ) 233 253 ! 234 254 CASE( np_2BD ) !== 2-bands fluxes ==! … … 236 256 zz0 = rn_abs * r1_rho0_rcp ! surface equi-partition in 2-bands 237 257 zz1 = ( 1. - rn_abs ) * r1_rho0_rcp 238 DO_3D _00_00( 1, nksr )258 DO_3D( 0, 0, 0, 0, 1, nksr ) ! solar heat absorbed at T-point in the top 400m 239 259 zc0 = zz0 * EXP( -gdepw(ji,jj,jk ,Kmm)*xsi0r ) + zz1 * EXP( -gdepw(ji,jj,jk ,Kmm)*xsi1r ) 240 260 zc1 = zz0 * EXP( -gdepw(ji,jj,jk+1,Kmm)*xsi0r ) + zz1 * EXP( -gdepw(ji,jj,jk+1,Kmm)*xsi1r ) … … 245 265 ! 246 266 ! !-----------------------------! 247 DO_3D_00_00( 1, nksr ) 267 ! ! update to the temp. trend ! 268 ! !-----------------------------! 269 DO_3D( 0, 0, 0, 0, 1, nksr ) 248 270 pts(ji,jj,jk,jp_tem,Krhs) = pts(ji,jj,jk,jp_tem,Krhs) & 249 & + z1_2 * ( qsr_hc_b(ji,jj,jk) + qsr_hc(ji,jj,jk) ) / e3t(ji,jj,jk,Kmm) 271 & + z1_2 * ( qsr_hc_b(ji,jj,jk) + qsr_hc(ji,jj,jk) ) & 272 & / e3t(ji,jj,jk,Kmm) 250 273 END_3D 251 274 ! 252 275 ! sea-ice: store the 1st ocean level attenuation coefficient 253 DO_2D _00_00276 DO_2D( 0, 0, 0, 0 ) 254 277 IF( qsr(ji,jj) /= 0._wp ) THEN ; fraqsr_1lev(ji,jj) = qsr_hc(ji,jj,1) / ( r1_rho0_rcp * qsr(ji,jj) ) 255 278 ELSE ; fraqsr_1lev(ji,jj) = 1._wp … … 396 419 IF( .NOT.lk_top ) CALL ctl_stop( 'No bio model : ln_qsr_bio = true impossible ' ) 397 420 ! 421 CALL trc_oce_rgb( rkrgb ) ! tabulated attenuation coef. 422 ! 423 nksr = trc_oce_ext_lev( r_si2, 33._wp ) ! level of light extinction 424 ! 425 IF(lwp) WRITE(numout,*) ' level of light extinction = ', nksr, ' ref depth = ', gdepw_1d(nksr+1), ' m' 426 ! 398 427 END SELECT 399 428 ! … … 402 431 ! 1st ocean level attenuation coefficient (used in sbcssm) 403 432 IF( iom_varid( numror, 'fraqsr_1lev', ldstop = .FALSE. ) > 0 ) THEN 404 CALL iom_get( numror, jpdom_auto glo, 'fraqsr_1lev' , fraqsr_1lev, ldxios = lrxios )433 CALL iom_get( numror, jpdom_auto, 'fraqsr_1lev' , fraqsr_1lev, ldxios = lrxios ) 405 434 ELSE 406 435 fraqsr_1lev(:,:) = 1._wp ! default : no penetration -
NEMO/branches/2020/r12377_ticket2386/src/OCE/TRA/trasbc.F90
r12511 r13540 43 43 !! * Substitutions 44 44 # include "do_loop_substitute.h90" 45 # include "domzgr_substitute.h90" 45 46 !!---------------------------------------------------------------------- 46 47 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 111 112 zfact = 0.5_wp 112 113 sbc_tsc(:,:,:) = 0._wp 113 CALL iom_get( numror, jpdom_auto glo, 'sbc_hc_b', sbc_tsc_b(:,:,jp_tem), ldxios = lrxios ) ! before heat content sbc trend114 CALL iom_get( numror, jpdom_auto glo, 'sbc_sc_b', sbc_tsc_b(:,:,jp_sal), ldxios = lrxios ) ! before salt content sbc trend114 CALL iom_get( numror, jpdom_auto, 'sbc_hc_b', sbc_tsc_b(:,:,jp_tem), ldxios = lrxios ) ! before heat content sbc trend 115 CALL iom_get( numror, jpdom_auto, 'sbc_sc_b', sbc_tsc_b(:,:,jp_sal), ldxios = lrxios ) ! before salt content sbc trend 115 116 ELSE ! No restart or restart not found: Euler forward time stepping 116 117 zfact = 1._wp … … 123 124 ENDIF 124 125 ! !== Now sbc tracer content fields ==! 125 DO_2D _01_00126 DO_2D( 0, 1, 0, 0 ) 126 127 sbc_tsc(ji,jj,jp_tem) = r1_rho0_rcp * qns(ji,jj) ! non solar heat flux 127 128 sbc_tsc(ji,jj,jp_sal) = r1_rho0 * sfx(ji,jj) ! salt flux due to freezing/melting 128 129 END_2D 129 130 IF( ln_linssh ) THEN !* linear free surface 130 DO_2D _01_00131 DO_2D( 0, 1, 0, 0 ) !==>> add concentration/dilution effect due to constant volume cell 131 132 sbc_tsc(ji,jj,jp_tem) = sbc_tsc(ji,jj,jp_tem) + r1_rho0 * emp(ji,jj) * pts(ji,jj,1,jp_tem,Kmm) 132 133 sbc_tsc(ji,jj,jp_sal) = sbc_tsc(ji,jj,jp_sal) + r1_rho0 * emp(ji,jj) * pts(ji,jj,1,jp_sal,Kmm) 133 END_2D 134 END_2D !==>> output c./d. term 134 135 IF( iom_use('emp_x_sst') ) CALL iom_put( "emp_x_sst", emp (:,:) * pts(:,:,1,jp_tem,Kmm) ) 135 136 IF( iom_use('emp_x_sss') ) CALL iom_put( "emp_x_sss", emp (:,:) * pts(:,:,1,jp_sal,Kmm) ) … … 137 138 ! 138 139 DO jn = 1, jpts !== update tracer trend ==! 139 DO_2D_01_00 140 pts(ji,jj,1,jn,Krhs) = pts(ji,jj,1,jn,Krhs) + zfact * ( sbc_tsc_b(ji,jj,jn) + sbc_tsc(ji,jj,jn) ) / e3t(ji,jj,1,Kmm) 140 DO_2D( 0, 1, 0, 0 ) 141 pts(ji,jj,1,jn,Krhs) = pts(ji,jj,1,jn,Krhs) + zfact * ( sbc_tsc_b(ji,jj,jn) + sbc_tsc(ji,jj,jn) ) & 142 & / e3t(ji,jj,1,Kmm) 141 143 END_2D 142 144 END DO … … 155 157 IF( ln_rnf ) THEN ! input of heat and salt due to river runoff 156 158 zfact = 0.5_wp 157 DO_2D _01_00159 DO_2D( 0, 1, 0, 0 ) 158 160 IF( rnf(ji,jj) /= 0._wp ) THEN 159 161 zdep = zfact / h_rnf(ji,jj) … … 180 182 ! 181 183 IF( ln_linssh ) THEN 182 DO_2D _01_00184 DO_2D( 0, 1, 0, 0 ) 183 185 ztim = ssh_iau(ji,jj) / e3t(ji,jj,1,Kmm) 184 186 pts(ji,jj,1,jp_tem,Krhs) = pts(ji,jj,1,jp_tem,Krhs) + pts(ji,jj,1,jp_tem,Kmm) * ztim … … 186 188 END_2D 187 189 ELSE 188 DO_2D _01_00190 DO_2D( 0, 1, 0, 0 ) 189 191 ztim = ssh_iau(ji,jj) / ( ht(ji,jj) + 1. - ssmask(ji, jj) ) 190 192 pts(ji,jj,:,jp_tem,Krhs) = pts(ji,jj,:,jp_tem,Krhs) + pts(ji,jj,:,jp_tem,Kmm) * ztim -
NEMO/branches/2020/r12377_ticket2386/src/OCE/TRA/trazdf.F90
r12511 r13540 37 37 !! * Substitutions 38 38 # include "do_loop_substitute.h90" 39 # include "domzgr_substitute.h90" 39 40 !!---------------------------------------------------------------------- 40 41 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 84 85 IF( l_trdtra ) THEN ! save the vertical diffusive trends for further diagnostics 85 86 DO jk = 1, jpkm1 86 ztrdt(:,:,jk) = ( ( pts(:,:,jk,jp_tem,Kaa)*e3t(:,:,jk,Kaa) - pts(:,:,jk,jp_tem,Kbb)*e3t(:,:,jk,Kbb) ) & 87 & / (e3t(:,:,jk,Kmm)*rDt) ) - ztrdt(:,:,jk) 88 ztrds(:,:,jk) = ( ( pts(:,:,jk,jp_sal,Kaa)*e3t(:,:,jk,Kaa) - pts(:,:,jk,jp_sal,Kbb)*e3t(:,:,jk,Kbb) ) & 89 & / (e3t(:,:,jk,Kmm)*rDt) ) - ztrds(:,:,jk) 87 ztrdt(:,:,jk) = ( ( pts(:,:,jk,jp_tem,Kaa)*e3t(:,:,jk,Kaa) & 88 & - pts(:,:,jk,jp_tem,Kbb)*e3t(:,:,jk,Kbb) ) & 89 & / ( e3t(:,:,jk,Kmm)*rDt ) ) & 90 & - ztrdt(:,:,jk) 91 ztrds(:,:,jk) = ( ( pts(:,:,jk,jp_sal,Kaa)*e3t(:,:,jk,Kaa) & 92 & - pts(:,:,jk,jp_sal,Kbb)*e3t(:,:,jk,Kbb) ) & 93 & / ( e3t(:,:,jk,Kmm)*rDt ) ) & 94 & - ztrds(:,:,jk) 90 95 END DO 91 96 !!gm this should be moved in trdtra.F90 and done on all trends 92 CALL lbc_lnk_multi( 'trazdf', ztrdt, 'T', 1. , ztrds, 'T', 1.)97 CALL lbc_lnk_multi( 'trazdf', ztrdt, 'T', 1.0_wp , ztrds, 'T', 1.0_wp ) 93 98 !!gm 94 99 CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_tem, jptra_zdf, ztrdt ) … … 156 161 IF( l_ldfslp ) THEN ! isoneutral diffusion: add the contribution 157 162 IF( ln_traldf_msc ) THEN ! MSC iso-neutral operator 158 DO_3D _00_00(2, jpkm1 )163 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 159 164 zwt(ji,jj,jk) = zwt(ji,jj,jk) + akz(ji,jj,jk) 160 165 END_3D 161 166 ELSE ! standard or triad iso-neutral operator 162 DO_3D _00_00(2, jpkm1 )167 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 163 168 zwt(ji,jj,jk) = zwt(ji,jj,jk) + ah_wslp2(ji,jj,jk) 164 169 END_3D … … 168 173 ! Diagonal, lower (i), upper (s) (including the bottom boundary condition since avt is masked) 169 174 IF( ln_zad_Aimp ) THEN ! Adaptive implicit vertical advection 170 DO_3D _00_00(1, jpkm1 )175 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 171 176 zzwi = - p2dt * zwt(ji,jj,jk ) / e3w(ji,jj,jk ,Kmm) 172 177 zzws = - p2dt * zwt(ji,jj,jk+1) / e3w(ji,jj,jk+1,Kmm) … … 177 182 END_3D 178 183 ELSE 179 DO_3D _00_00(1, jpkm1 )184 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 180 185 zwi(ji,jj,jk) = - p2dt * zwt(ji,jj,jk ) / e3w(ji,jj,jk,Kmm) 181 186 zws(ji,jj,jk) = - p2dt * zwt(ji,jj,jk+1) / e3w(ji,jj,jk+1,Kmm) … … 203 208 ! used as a work space array: its value is modified. 204 209 ! 205 DO_2D _00_00210 DO_2D( 0, 0, 0, 0 ) !* 1st recurrence: Tk = Dk - Ik Sk-1 / Tk-1 (increasing k) ! done one for all passive tracers (so included in the IF instruction) 206 211 zwt(ji,jj,1) = zwd(ji,jj,1) 207 212 END_2D 208 DO_3D _00_00(2, jpkm1 )213 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 209 214 zwt(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwt(ji,jj,jk-1) 210 215 END_3D … … 212 217 ENDIF 213 218 ! 214 DO_2D_00_00 215 pt(ji,jj,1,jn,Kaa) = e3t(ji,jj,1,Kbb) * pt(ji,jj,1,jn,Kbb) + p2dt * e3t(ji,jj,1,Kmm) * pt(ji,jj,1,jn,Krhs) 219 DO_2D( 0, 0, 0, 0 ) !* 2nd recurrence: Zk = Yk - Ik / Tk-1 Zk-1 220 pt(ji,jj,1,jn,Kaa) = e3t(ji,jj,1,Kbb) * pt(ji,jj,1,jn,Kbb) & 221 & + p2dt * e3t(ji,jj,1,Kmm) * pt(ji,jj,1,jn,Krhs) 216 222 END_2D 217 DO_3D_00_00( 2, jpkm1 ) 218 zrhs = e3t(ji,jj,jk,Kbb) * pt(ji,jj,jk,jn,Kbb) + p2dt * e3t(ji,jj,jk,Kmm) * pt(ji,jj,jk,jn,Krhs) ! zrhs=right hand side 223 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 224 zrhs = e3t(ji,jj,jk,Kbb) * pt(ji,jj,jk,jn,Kbb) & 225 & + p2dt * e3t(ji,jj,jk,Kmm) * pt(ji,jj,jk,jn,Krhs) ! zrhs=right hand side 219 226 pt(ji,jj,jk,jn,Kaa) = zrhs - zwi(ji,jj,jk) / zwt(ji,jj,jk-1) * pt(ji,jj,jk-1,jn,Kaa) 220 227 END_3D 221 228 ! 222 DO_2D _00_00229 DO_2D( 0, 0, 0, 0 ) !* 3d recurrence: Xk = (Zk - Sk Xk+1 ) / Tk (result is the after tracer) 223 230 pt(ji,jj,jpkm1,jn,Kaa) = pt(ji,jj,jpkm1,jn,Kaa) / zwt(ji,jj,jpkm1) * tmask(ji,jj,jpkm1) 224 231 END_2D 225 DO_3DS _00_00(jpk-2, 1, -1 )232 DO_3DS( 0, 0, 0, 0, jpk-2, 1, -1 ) 226 233 pt(ji,jj,jk,jn,Kaa) = ( pt(ji,jj,jk,jn,Kaa) - zws(ji,jj,jk) * pt(ji,jj,jk+1,jn,Kaa) ) & 227 234 & / zwt(ji,jj,jk) * tmask(ji,jj,jk) -
NEMO/branches/2020/r12377_ticket2386/src/OCE/TRA/zpshde.F90
r12377 r13540 32 32 !! * Substitutions 33 33 # include "do_loop_substitute.h90" 34 # include "domzgr_substitute.h90" 34 35 !!---------------------------------------------------------------------- 35 36 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 65 66 !! ___ | | | ___ | | | 66 67 !! 67 !! case 1-> e3w(i+1 ) >= e3w(i) ( and e3w(j+1) >= e3w(j) ) then68 !! t~ = t(i+1,j ,k) + (e3w(i+1 ) - e3w(i)) * dk(Ti+1)/e3w(i+1)69 !! ( t~ = t(i ,j+1,k) + (e3w( j+1) - e3w(j)) * dk(Tj+1)/e3w(j+1) )68 !! case 1-> e3w(i+1,:,:,Kmm) >= e3w(i,:,:,Kmm) ( and e3w(:,j+1,:,Kmm) >= e3w(:,j,:,Kmm) ) then 69 !! t~ = t(i+1,j ,k) + (e3w(i+1,j,k,Kmm) - e3w(i,j,k,Kmm)) * dk(Ti+1)/e3w(i+1,j,k,Kmm) 70 !! ( t~ = t(i ,j+1,k) + (e3w(i,j+1,k,Kmm) - e3w(i,j,k,Kmm)) * dk(Tj+1)/e3w(i,j+1,k,Kmm) ) 70 71 !! or 71 !! case 2-> e3w(i+1 ) <= e3w(i) ( and e3w(j+1) <= e3w(j) ) then72 !! t~ = t(i,j,k) + (e3w(i ) - e3w(i+1)) * dk(Ti)/e3w(i)73 !! ( t~ = t(i,j,k) + (e3w( j) - e3w(j+1)) * dk(Tj)/e3w(j) )72 !! case 2-> e3w(i+1,:,:,Kmm) <= e3w(i,:,:,Kmm) ( and e3w(:,j+1,:,Kmm) <= e3w(:,j,:,Kmm) ) then 73 !! t~ = t(i,j,k) + (e3w(i,j,k,Kmm) - e3w(i+1,j,k,Kmm)) * dk(Ti)/e3w(i,j,k,Kmm) 74 !! ( t~ = t(i,j,k) + (e3w(i,j,k,Kmm) - e3w(i,j+1,k,Kmm)) * dk(Tj)/e3w(i,j,k,Kmm) ) 74 75 !! Idem for di(s) and dj(s) 75 76 !! … … 106 107 DO jn = 1, kjpt !== Interpolation of tracers at the last ocean level ==! 107 108 ! 108 DO_2D _10_10109 DO_2D( 1, 0, 1, 0 ) 109 110 iku = mbku(ji,jj) ; ikum1 = MAX( iku - 1 , 1 ) ! last and before last ocean level at u- & v-points 110 111 ikv = mbkv(ji,jj) ; ikvm1 = MAX( ikv - 1 , 1 ) ! if level first is a p-step, ik.m1=1 111 !!gm BUG ? when applied to before fields, e3w(:,:, :,Kbb) should be used....112 !!gm BUG ? when applied to before fields, e3w(:,:,k,Kbb) should be used.... 112 113 ze3wu = e3w(ji+1,jj ,iku,Kmm) - e3w(ji,jj,iku,Kmm) 113 114 ze3wv = e3w(ji ,jj+1,ikv,Kmm) - e3w(ji,jj,ikv,Kmm) … … 145 146 END DO 146 147 ! 147 CALL lbc_lnk_multi( 'zpshde', pgtu(:,:,:), 'U', -1. , pgtv(:,:,:), 'V', -1.) ! Lateral boundary cond.148 CALL lbc_lnk_multi( 'zpshde', pgtu(:,:,:), 'U', -1.0_wp , pgtv(:,:,:), 'V', -1.0_wp ) ! Lateral boundary cond. 148 149 ! 149 150 IF( PRESENT( prd ) ) THEN !== horizontal derivative of density anomalies (rd) ==! (optional part) 150 151 pgru(:,:) = 0._wp 151 152 pgrv(:,:) = 0._wp ! depth of the partial step level 152 DO_2D _10_10153 DO_2D( 1, 0, 1, 0 ) 153 154 iku = mbku(ji,jj) 154 155 ikv = mbkv(ji,jj) … … 166 167 CALL eos( ztj, zhj, zrj ) ! at the partial step depth output in zri, zrj 167 168 ! 168 DO_2D _10_10169 DO_2D( 1, 0, 1, 0 ) ! Gradient of density at the last level 169 170 iku = mbku(ji,jj) 170 171 ikv = mbkv(ji,jj) … … 178 179 ENDIF 179 180 END_2D 180 CALL lbc_lnk_multi( 'zpshde', pgru , 'U', -1. , pgrv , 'V', -1.) ! Lateral boundary conditions181 CALL lbc_lnk_multi( 'zpshde', pgru , 'U', -1.0_wp , pgrv , 'V', -1.0_wp ) ! Lateral boundary conditions 181 182 ! 182 183 END IF … … 214 215 !! ___ | | | ___ | | | 215 216 !! 216 !! case 1-> e3w(i+1 ) >= e3w(i) ( and e3w(j+1) >= e3w(j) ) then217 !! t~ = t(i+1,j ,k) + (e3w(i+1 ) - e3w(i)) * dk(Ti+1)/e3w(i+1)218 !! ( t~ = t(i ,j+1,k) + (e3w( j+1) - e3w(j)) * dk(Tj+1)/e3w(j+1) )217 !! case 1-> e3w(i+1,j,k,Kmm) >= e3w(i,j,k,Kmm) ( and e3w(i,j+1,k,Kmm) >= e3w(i,j,k,Kmm) ) then 218 !! t~ = t(i+1,j ,k) + (e3w(i+1,j ,k,Kmm) - e3w(i,j,k,Kmm)) * dk(Ti+1)/e3w(i+1,j ,k,Kmm) 219 !! ( t~ = t(i ,j+1,k) + (e3w(i ,j+1,k,Kmm) - e3w(i,j,k,Kmm)) * dk(Tj+1)/e3w(i ,j+1,k,Kmm) ) 219 220 !! or 220 !! case 2-> e3w(i+1 ) <= e3w(i) ( and e3w(j+1) <= e3w(j) ) then221 !! t~ = t(i,j,k) + (e3w(i ) - e3w(i+1)) * dk(Ti)/e3w(i)222 !! ( t~ = t(i,j,k) + (e3w( j) - e3w(j+1)) * dk(Tj)/e3w(j) )221 !! case 2-> e3w(i+1,j,k,Kmm) <= e3w(i,j,k,Kmm) ( and e3w(i,j+1,k,Kmm) <= e3w(i,j,k,Kmm) ) then 222 !! t~ = t(i,j,k) + (e3w(i,j,k,Kmm) - e3w(i+1,j ,k,Kmm)) * dk(Ti)/e3w(i,j,k,Kmm) 223 !! ( t~ = t(i,j,k) + (e3w(i,j,k,Kmm) - e3w(i ,j+1,k,Kmm)) * dk(Tj)/e3w(i,j,k,Kmm) ) 223 224 !! Idem for di(s) and dj(s) 224 225 !! … … 261 262 DO jn = 1, kjpt !== Interpolation of tracers at the last ocean level ==! 262 263 ! 263 DO_2D _10_10264 DO_2D( 1, 0, 1, 0 ) 264 265 265 266 iku = mbku(ji,jj); ikum1 = MAX( iku - 1 , 1 ) ! last and before last ocean level at u- & v-points … … 301 302 END DO 302 303 ! 303 CALL lbc_lnk_multi( 'zpshde', pgtu(:,:,:), 'U', -1. , pgtv(:,:,:), 'V', -1.) ! Lateral boundary cond.304 CALL lbc_lnk_multi( 'zpshde', pgtu(:,:,:), 'U', -1.0_wp , pgtv(:,:,:), 'V', -1.0_wp ) ! Lateral boundary cond. 304 305 305 306 ! horizontal derivative of density anomalies (rd) … … 307 308 pgru(:,:)=0.0_wp ; pgrv(:,:)=0.0_wp ; 308 309 ! 309 DO_2D _10_10310 DO_2D( 1, 0, 1, 0 ) 310 311 311 312 iku = mbku(ji,jj) … … 328 329 CALL eos( ztj, zhj, zrj ) 329 330 330 DO_2D _10_10331 DO_2D( 1, 0, 1, 0 ) ! Gradient of density at the last level 331 332 iku = mbku(ji,jj) 332 333 ikv = mbkv(ji,jj) … … 343 344 END_2D 344 345 345 CALL lbc_lnk_multi( 'zpshde', pgru , 'U', -1. , pgrv , 'V', -1.) ! Lateral boundary conditions346 CALL lbc_lnk_multi( 'zpshde', pgru , 'U', -1.0_wp , pgrv , 'V', -1.0_wp ) ! Lateral boundary conditions 346 347 ! 347 348 END IF … … 350 351 ! 351 352 DO jn = 1, kjpt !== Interpolation of tracers at the last ocean level ==! ! 352 DO_2D _10_10353 DO_2D( 1, 0, 1, 0 ) 353 354 iku = miku(ji,jj); ikup1 = miku(ji,jj) + 1 354 355 ikv = mikv(ji,jj); ikvp1 = mikv(ji,jj) + 1 … … 356 357 ! (ISF) case partial step top and bottom in adjacent cell in vertical 357 358 ! cannot used e3w because if 2 cell water column, we have ps at top and bottom 358 ! in this case e3w(i,j ) - e3w(i,j+1) is not the distance between Tj~ and Tj359 ! in this case e3w(i,j,k,Kmm) - e3w(i,j+1,k,Kmm) is not the distance between Tj~ and Tj 359 360 ! the only common depth between cells (i,j) and (i,j+1) is gdepw_0 360 361 ze3wu = gdept(ji,jj,iku,Kmm) - gdept(ji+1,jj,iku,Kmm) … … 394 395 ! 395 396 END DO 396 CALL lbc_lnk_multi( 'zpshde', pgtui(:,:,:), 'U', -1. , pgtvi(:,:,:), 'V', -1.) ! Lateral boundary cond.397 CALL lbc_lnk_multi( 'zpshde', pgtui(:,:,:), 'U', -1.0_wp , pgtvi(:,:,:), 'V', -1.0_wp ) ! Lateral boundary cond. 397 398 398 399 IF( PRESENT( prd ) ) THEN !== horizontal derivative of density anomalies (rd) ==! (optional part) 399 400 ! 400 401 pgrui(:,:) =0.0_wp; pgrvi(:,:) =0.0_wp; 401 DO_2D _10_10402 DO_2D( 1, 0, 1, 0 ) 402 403 403 404 iku = miku(ji,jj) … … 419 420 CALL eos( ztj, zhj, zrj ) ! at the partial step depth output in zri, zrj 420 421 ! 421 DO_2D _10_10422 DO_2D( 1, 0, 1, 0 ) ! Gradient of density at the last level 422 423 iku = miku(ji,jj) 423 424 ikv = mikv(ji,jj) … … 433 434 434 435 END_2D 435 CALL lbc_lnk_multi( 'zpshde', pgrui, 'U', -1. , pgrvi, 'V', -1.) ! Lateral boundary conditions436 CALL lbc_lnk_multi( 'zpshde', pgrui, 'U', -1.0_wp , pgrvi, 'V', -1.0_wp ) ! Lateral boundary conditions 436 437 ! 437 438 END IF
Note: See TracChangeset
for help on using the changeset viewer.