- Timestamp:
- 2020-09-14T17:40:34+02:00 (4 years ago)
- Location:
- NEMO/branches/2019/dev_r11351_fldread_with_XIOS
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/dev_r11351_fldread_with_XIOS
- 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 9 # SETTE 10 ^/utils/CI/sette@13382 sette
-
- Property svn:externals
-
NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/TRA/traadv_ubs.F90
r10425 r13463 38 38 39 39 !! * Substitutions 40 # include "vectopt_loop_substitute.h90" 40 # include "do_loop_substitute.h90" 41 # include "domzgr_substitute.h90" 41 42 !!---------------------------------------------------------------------- 42 43 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 46 47 CONTAINS 47 48 48 SUBROUTINE tra_adv_ubs( kt, kit000, cdtype, p2dt, p un, pvn, pwn, &49 & ptb, ptn, pta, kjpt, kn_ubs_v )49 SUBROUTINE tra_adv_ubs( kt, kit000, cdtype, p2dt, pU, pV, pW, & 50 & Kbb, Kmm, pt, kjpt, Krhs, kn_ubs_v ) 50 51 !!---------------------------------------------------------------------- 51 52 !! *** ROUTINE tra_adv_ubs *** … … 77 78 !! scheme (kn_ubs_v=4). 78 79 !! 79 !! ** Action : - update pt awith the now advective tracer trends80 !! ** Action : - update pt(:,:,:,:,Krhs) with the now advective tracer trends 80 81 !! - send trends to trdtra module for further diagnostcs (l_trdtra=T) 81 !! - htr_adv, str_adv :poleward advective heat and salt transport (ln_diaptr=T)82 !! - poleward advective heat and salt transport (ln_diaptr=T) 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 !!---------------------------------------------------------------------- 86 INTEGER , INTENT(in ) :: kt ! ocean time-step index87 INTEGER , INTENT(in ) :: kit000 ! first time step index88 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator)89 INTEGER , INTENT(in ) :: kjpt ! number of tracers90 INTEGER , INTENT(in ) :: kn_ubs_v! number of tracers91 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step92 REAL(wp) , DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean transport components93 REAL(wp), DIMENSION(jpi,jpj,jpk ,kjpt), INTENT(in ) :: ptb, ptn ! before and now tracer fields94 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt ), INTENT(inout) :: pta ! tracer trend85 !! Farrow, D.E., Stevens, D.P., 1995, J. Phys. Ocean. 25, 1731�1741. 86 !!---------------------------------------------------------------------- 87 INTEGER , INTENT(in ) :: kt ! ocean time-step index 88 INTEGER , INTENT(in ) :: Kbb, Kmm, Krhs ! ocean time level indices 89 INTEGER , INTENT(in ) :: kit000 ! first time step index 90 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 91 INTEGER , INTENT(in ) :: kjpt ! number of tracers 92 INTEGER , INTENT(in ) :: kn_ubs_v ! number of tracers 93 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 94 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pU, pV, pW ! 3 ocean volume transport components 95 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) :: pt ! tracers and RHS of tracer equation 95 96 ! 96 97 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 111 112 l_ptr = .FALSE. 112 113 IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) ) l_trd = .TRUE. 113 IF( cdtype == 'TRA' .AND. ln_diaptr )l_ptr = .TRUE.114 IF( cdtype == 'TRA' .AND. ( iom_use( 'sophtadv' ) .OR. iom_use( 'sophtadv' ) ) ) l_ptr = .TRUE. 114 115 IF( cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. & 115 116 & iom_use("uadv_salttr") .OR. iom_use("vadv_salttr") ) ) l_hst = .TRUE. … … 124 125 ! 125 126 DO jk = 1, jpkm1 !== horizontal laplacian of before tracer ==! 126 DO jj = 1, jpjm1 ! First derivative (masked gradient) 127 DO ji = 1, fs_jpim1 ! vector opt. 128 zeeu = e2_e1u(ji,jj) * e3u_n(ji,jj,jk) * umask(ji,jj,jk) 129 zeev = e1_e2v(ji,jj) * e3v_n(ji,jj,jk) * vmask(ji,jj,jk) 130 ztu(ji,jj,jk) = zeeu * ( ptb(ji+1,jj ,jk,jn) - ptb(ji,jj,jk,jn) ) 131 ztv(ji,jj,jk) = zeev * ( ptb(ji ,jj+1,jk,jn) - ptb(ji,jj,jk,jn) ) 132 END DO 133 END DO 134 DO jj = 2, jpjm1 ! Second derivative (divergence) 135 DO ji = fs_2, fs_jpim1 ! vector opt. 136 zcoef = 1._wp / ( 6._wp * e3t_n(ji,jj,jk) ) 137 zltu(ji,jj,jk) = ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk) ) * zcoef 138 zltv(ji,jj,jk) = ( ztv(ji,jj,jk) - ztv(ji,jj-1,jk) ) * zcoef 139 END DO 140 END DO 127 DO_2D( 1, 0, 1, 0 ) 128 zeeu = e2_e1u(ji,jj) * e3u(ji,jj,jk,Kmm) * umask(ji,jj,jk) 129 zeev = e1_e2v(ji,jj) * e3v(ji,jj,jk,Kmm) * vmask(ji,jj,jk) 130 ztu(ji,jj,jk) = zeeu * ( pt(ji+1,jj ,jk,jn,Kbb) - pt(ji,jj,jk,jn,Kbb) ) 131 ztv(ji,jj,jk) = zeev * ( pt(ji ,jj+1,jk,jn,Kbb) - pt(ji,jj,jk,jn,Kbb) ) 132 END_2D 133 DO_2D( 0, 0, 0, 0 ) 134 zcoef = 1._wp / ( 6._wp * e3t(ji,jj,jk,Kmm) ) 135 zltu(ji,jj,jk) = ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk) ) * zcoef 136 zltv(ji,jj,jk) = ( ztv(ji,jj,jk) - ztv(ji,jj-1,jk) ) * zcoef 137 END_2D 141 138 ! 142 139 END DO 143 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) 144 141 ! 145 DO jk = 1, jpkm1 !== Horizontal advective fluxes ==! (UBS) 146 DO jj = 1, jpjm1 147 DO ji = 1, fs_jpim1 ! vector opt. 148 zfp_ui = pun(ji,jj,jk) + ABS( pun(ji,jj,jk) ) ! upstream transport (x2) 149 zfm_ui = pun(ji,jj,jk) - ABS( pun(ji,jj,jk) ) 150 zfp_vj = pvn(ji,jj,jk) + ABS( pvn(ji,jj,jk) ) 151 zfm_vj = pvn(ji,jj,jk) - ABS( pvn(ji,jj,jk) ) 152 ! ! 2nd order centered advective fluxes (x2) 153 zcenut = pun(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji+1,jj ,jk,jn) ) 154 zcenvt = pvn(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji ,jj+1,jk,jn) ) 155 ! ! UBS advective fluxes 156 ztu(ji,jj,jk) = 0.5 * ( zcenut - zfp_ui * zltu(ji,jj,jk) - zfm_ui * zltu(ji+1,jj,jk) ) 157 ztv(ji,jj,jk) = 0.5 * ( zcenvt - zfp_vj * zltv(ji,jj,jk) - zfm_vj * zltv(ji,jj+1,jk) ) 158 END DO 159 END DO 160 END DO 161 ! 162 zltu(:,:,:) = pta(:,:,:,jn) ! store the initial trends before its update 142 DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 143 zfp_ui = pU(ji,jj,jk) + ABS( pU(ji,jj,jk) ) ! upstream transport (x2) 144 zfm_ui = pU(ji,jj,jk) - ABS( pU(ji,jj,jk) ) 145 zfp_vj = pV(ji,jj,jk) + ABS( pV(ji,jj,jk) ) 146 zfm_vj = pV(ji,jj,jk) - ABS( pV(ji,jj,jk) ) 147 ! ! 2nd order centered advective fluxes (x2) 148 zcenut = pU(ji,jj,jk) * ( pt(ji,jj,jk,jn,Kmm) + pt(ji+1,jj ,jk,jn,Kmm) ) 149 zcenvt = pV(ji,jj,jk) * ( pt(ji,jj,jk,jn,Kmm) + pt(ji ,jj+1,jk,jn,Kmm) ) 150 ! ! UBS advective fluxes 151 ztu(ji,jj,jk) = 0.5 * ( zcenut - zfp_ui * zltu(ji,jj,jk) - zfm_ui * zltu(ji+1,jj,jk) ) 152 ztv(ji,jj,jk) = 0.5 * ( zcenvt - zfp_vj * zltv(ji,jj,jk) - zfm_vj * zltv(ji,jj+1,jk) ) 153 END_3D 154 ! 155 zltu(:,:,:) = pt(:,:,:,jn,Krhs) ! store the initial trends before its update 163 156 ! 164 157 DO jk = 1, jpkm1 !== add the horizontal advective trend ==! 165 DO jj = 2, jpjm1 166 DO ji = fs_2, fs_jpim1 ! vector opt. 167 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) & 168 & - ( ztu(ji,jj,jk) - ztu(ji-1,jj ,jk) & 169 & + ztv(ji,jj,jk) - ztv(ji ,jj-1,jk) ) * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 170 END DO 171 END DO 158 DO_2D( 0, 0, 0, 0 ) 159 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) & 160 & - ( ztu(ji,jj,jk) - ztu(ji-1,jj ,jk) & 161 & + ztv(ji,jj,jk) - ztv(ji ,jj-1,jk) ) & 162 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 163 END_2D 172 164 ! 173 165 END DO 174 166 ! 175 zltu(:,:,:) = pt a(:,:,:,jn) - zltu(:,:,:) ! Horizontal advective trend used in vertical 2nd order FCT case167 zltu(:,:,:) = pt(:,:,:,jn,Krhs) - zltu(:,:,:) ! Horizontal advective trend used in vertical 2nd order FCT case 176 168 ! ! and/or in trend diagnostic (l_trd=T) 177 169 ! 178 170 IF( l_trd ) THEN ! trend diagnostics 179 CALL trd_tra( kt, cdtype, jn, jptra_xad, ztu, pun, ptn(:,:,:,jn) )180 CALL trd_tra( kt, cdtype, jn, jptra_yad, ztv, pvn, ptn(:,:,:,jn) )171 CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_xad, ztu, pU, pt(:,:,:,jn,Kmm) ) 172 CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_yad, ztv, pV, pt(:,:,:,jn,Kmm) ) 181 173 END IF 182 174 ! … … 193 185 CASE( 2 ) ! 2nd order FCT 194 186 ! 195 IF( l_trd ) zltv(:,:,:) = pt a(:,:,:,jn) ! store ptaif trend diag.187 IF( l_trd ) zltv(:,:,:) = pt(:,:,:,jn,Krhs) ! store pt(:,:,:,:,Krhs) if trend diag. 196 188 ! 197 189 ! !* upstream advection with initial mass fluxes & intermediate update ==! 198 DO jk = 2, jpkm1 ! Interior value (w-masked) 199 DO jj = 1, jpj 200 DO ji = 1, jpi 201 zfp_wk = pwn(ji,jj,jk) + ABS( pwn(ji,jj,jk) ) 202 zfm_wk = pwn(ji,jj,jk) - ABS( pwn(ji,jj,jk) ) 203 ztw(ji,jj,jk) = 0.5_wp * ( zfp_wk * ptb(ji,jj,jk,jn) + zfm_wk * ptb(ji,jj,jk-1,jn) ) * wmask(ji,jj,jk) 204 END DO 205 END DO 206 END DO 190 DO_3D( 1, 1, 1, 1, 2, jpkm1 ) 191 zfp_wk = pW(ji,jj,jk) + ABS( pW(ji,jj,jk) ) 192 zfm_wk = pW(ji,jj,jk) - ABS( pW(ji,jj,jk) ) 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) 194 END_3D 207 195 IF( ln_linssh ) THEN ! top ocean value (only in linear free surface as ztw has been w-masked) 208 196 IF( ln_isfcav ) THEN ! top of the ice-shelf cavities and at the ocean surface 209 DO jj = 1, jpj 210 DO ji = 1, jpi 211 ztw(ji,jj, mikt(ji,jj) ) = pwn(ji,jj,mikt(ji,jj)) * ptb(ji,jj,mikt(ji,jj),jn) ! linear free surface 212 END DO 213 END DO 197 DO_2D( 1, 1, 1, 1 ) 198 ztw(ji,jj, mikt(ji,jj) ) = pW(ji,jj,mikt(ji,jj)) * pt(ji,jj,mikt(ji,jj),jn,Kbb) ! linear free surface 199 END_2D 214 200 ELSE ! no cavities: only at the ocean surface 215 ztw(:,:,1) = p wn(:,:,1) * ptb(:,:,1,jn)201 ztw(:,:,1) = pW(:,:,1) * pt(:,:,1,jn,Kbb) 216 202 ENDIF 217 203 ENDIF 218 204 ! 219 DO jk = 1, jpkm1 !* trend and after field with monotonic scheme 220 DO jj = 2, jpjm1 221 DO ji = fs_2, fs_jpim1 ! vector opt. 222 ztak = - ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) ) * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 223 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ztak 224 zti(ji,jj,jk) = ( ptb(ji,jj,jk,jn) + p2dt * ( ztak + zltu(ji,jj,jk) ) ) * tmask(ji,jj,jk) 225 END DO 226 END DO 227 END DO 228 CALL lbc_lnk( 'traadv_ubs', zti, 'T', 1. ) ! Lateral boundary conditions on zti, zsi (unchanged sign) 205 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 206 ztak = - ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) ) & 207 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 208 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) + ztak 209 zti(ji,jj,jk) = ( pt(ji,jj,jk,jn,Kbb) + p2dt * ( ztak + zltu(ji,jj,jk) ) ) * tmask(ji,jj,jk) 210 END_3D 211 CALL lbc_lnk( 'traadv_ubs', zti, 'T', 1.0_wp ) ! Lateral boundary conditions on zti, zsi (unchanged sign) 229 212 ! 230 213 ! !* anti-diffusive flux : high order minus low order 231 DO jk = 2, jpkm1 ! Interior value (w-masked) 232 DO jj = 1, jpj 233 DO ji = 1, jpi 234 ztw(ji,jj,jk) = ( 0.5_wp * pwn(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji,jj,jk-1,jn) ) & 235 & - ztw(ji,jj,jk) ) * wmask(ji,jj,jk) 236 END DO 237 END DO 238 END DO 214 DO_3D( 1, 1, 1, 1, 2, jpkm1 ) 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) ) & 216 & - ztw(ji,jj,jk) ) * wmask(ji,jj,jk) 217 END_3D 239 218 ! ! top ocean value: high order == upstream ==>> zwz=0 240 219 IF( ln_linssh ) ztw(:,:, 1 ) = 0._wp ! only ocean surface as interior zwz values have been w-masked 241 220 ! 242 CALL nonosc_z( ptb(:,:,:,jn), ztw, zti, p2dt ) ! monotonicity algorithm221 CALL nonosc_z( Kmm, pt(:,:,:,jn,Kbb), ztw, zti, p2dt ) ! monotonicity algorithm 243 222 ! 244 223 CASE( 4 ) ! 4th order COMPACT 245 CALL interp_4th_cpt( ptn(:,:,:,jn) , ztw ) ! 4th order compact interpolation of T at w-point 246 DO jk = 2, jpkm1 247 DO jj = 2, jpjm1 248 DO ji = fs_2, fs_jpim1 249 ztw(ji,jj,jk) = pwn(ji,jj,jk) * ztw(ji,jj,jk) * wmask(ji,jj,jk) 250 END DO 251 END DO 252 END DO 253 IF( ln_linssh ) ztw(:,:, 1 ) = pwn(:,:,1) * ptn(:,:,1,jn) !!gm ISF & 4th COMPACT doesn't work 224 CALL interp_4th_cpt( pt(:,:,:,jn,Kmm) , ztw ) ! 4th order compact interpolation of T at w-point 225 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 226 ztw(ji,jj,jk) = pW(ji,jj,jk) * ztw(ji,jj,jk) * wmask(ji,jj,jk) 227 END_3D 228 IF( ln_linssh ) ztw(:,:, 1 ) = pW(:,:,1) * pt(:,:,1,jn,Kmm) !!gm ISF & 4th COMPACT doesn't work 254 229 ! 255 230 END SELECT 256 231 ! 257 DO jk = 1, jpkm1 ! final trend with corrected fluxes 258 DO jj = 2, jpjm1 259 DO ji = fs_2, fs_jpim1 ! vector opt. 260 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) - ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) ) * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 261 END DO 262 END DO 263 END DO 232 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 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) 235 END_3D 264 236 ! 265 237 IF( l_trd ) THEN ! vertical advective trend diagnostics 266 DO jk = 1, jpkm1 ! (compute -w.dk[ptn]= -dk[w.ptn] + ptn.dk[w]) 267 DO jj = 2, jpjm1 268 DO ji = fs_2, fs_jpim1 ! vector opt. 269 zltv(ji,jj,jk) = pta(ji,jj,jk,jn) - zltv(ji,jj,jk) & 270 & + ptn(ji,jj,jk,jn) * ( pwn(ji,jj,jk) - pwn(ji,jj,jk+1) ) & 271 & * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 272 END DO 273 END DO 274 END DO 275 CALL trd_tra( kt, cdtype, jn, jptra_zad, zltv ) 238 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 239 zltv(ji,jj,jk) = pt(ji,jj,jk,jn,Krhs) - zltv(ji,jj,jk) & 240 & + pt(ji,jj,jk,jn,Kmm) * ( pW(ji,jj,jk) - pW(ji,jj,jk+1) ) & 241 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 242 END_3D 243 CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_zad, zltv ) 276 244 ENDIF 277 245 ! … … 281 249 282 250 283 SUBROUTINE nonosc_z( pbef, pcc, paft, p2dt )251 SUBROUTINE nonosc_z( Kmm, pbef, pcc, paft, p2dt ) 284 252 !!--------------------------------------------------------------------- 285 253 !! *** ROUTINE nonosc_z *** … … 294 262 !! in-space based differencing for fluid 295 263 !!---------------------------------------------------------------------- 264 INTEGER , INTENT(in ) :: Kmm ! time level index 296 265 REAL(wp), INTENT(in ) :: p2dt ! tracer time-step 297 266 REAL(wp), DIMENSION (jpi,jpj,jpk) :: pbef ! before field … … 305 274 !!---------------------------------------------------------------------- 306 275 ! 307 zbig = 1.e+ 40_wp276 zbig = 1.e+38_wp 308 277 zrtrn = 1.e-15_wp 309 278 zbetup(:,:,:) = 0._wp ; zbetdo(:,:,:) = 0._wp … … 317 286 DO jk = 1, jpkm1 ! search maximum in neighbourhood 318 287 ikm1 = MAX(jk-1,1) 319 DO jj = 2, jpjm1 320 DO ji = fs_2, fs_jpim1 ! vector opt. 321 zbetup(ji,jj,jk) = MAX( pbef(ji ,jj ,jk ), paft(ji ,jj ,jk ), & 322 & pbef(ji ,jj ,ikm1), pbef(ji ,jj ,jk+1), & 323 & paft(ji ,jj ,ikm1), paft(ji ,jj ,jk+1) ) 324 END DO 325 END DO 288 DO_2D( 0, 0, 0, 0 ) 289 zbetup(ji,jj,jk) = MAX( pbef(ji ,jj ,jk ), paft(ji ,jj ,jk ), & 290 & pbef(ji ,jj ,ikm1), pbef(ji ,jj ,jk+1), & 291 & paft(ji ,jj ,ikm1), paft(ji ,jj ,jk+1) ) 292 END_2D 326 293 END DO 327 294 ! ! large positive value (+zbig) inside land … … 331 298 DO jk = 1, jpkm1 ! search minimum in neighbourhood 332 299 ikm1 = MAX(jk-1,1) 333 DO jj = 2, jpjm1 334 DO ji = fs_2, fs_jpim1 ! vector opt. 335 zbetdo(ji,jj,jk) = MIN( pbef(ji ,jj ,jk ), paft(ji ,jj ,jk ), & 336 & pbef(ji ,jj ,ikm1), pbef(ji ,jj ,jk+1), & 337 & paft(ji ,jj ,ikm1), paft(ji ,jj ,jk+1) ) 338 END DO 339 END DO 300 DO_2D( 0, 0, 0, 0 ) 301 zbetdo(ji,jj,jk) = MIN( pbef(ji ,jj ,jk ), paft(ji ,jj ,jk ), & 302 & pbef(ji ,jj ,ikm1), pbef(ji ,jj ,jk+1), & 303 & paft(ji ,jj ,ikm1), paft(ji ,jj ,jk+1) ) 304 END_2D 340 305 END DO 341 306 ! ! restore masked values to zero … … 345 310 ! Positive and negative part of fluxes and beta terms 346 311 ! --------------------------------------------------- 347 DO jk = 1, jpkm1 348 DO jj = 2, jpjm1 349 DO ji = fs_2, fs_jpim1 ! vector opt. 350 ! positive & negative part of the flux 351 zpos = MAX( 0., pcc(ji ,jj ,jk+1) ) - MIN( 0., pcc(ji ,jj ,jk ) ) 352 zneg = MAX( 0., pcc(ji ,jj ,jk ) ) - MIN( 0., pcc(ji ,jj ,jk+1) ) 353 ! up & down beta terms 354 zbt = e1e2t(ji,jj) * e3t_n(ji,jj,jk) / p2dt 355 zbetup(ji,jj,jk) = ( zbetup(ji,jj,jk) - paft(ji,jj,jk) ) / (zpos+zrtrn) * zbt 356 zbetdo(ji,jj,jk) = ( paft(ji,jj,jk) - zbetdo(ji,jj,jk) ) / (zneg+zrtrn) * zbt 357 END DO 358 END DO 359 END DO 312 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 313 ! positive & negative part of the flux 314 zpos = MAX( 0., pcc(ji ,jj ,jk+1) ) - MIN( 0., pcc(ji ,jj ,jk ) ) 315 zneg = MAX( 0., pcc(ji ,jj ,jk ) ) - MIN( 0., pcc(ji ,jj ,jk+1) ) 316 ! up & down beta terms 317 zbt = e1e2t(ji,jj) * e3t(ji,jj,jk,Kmm) / p2dt 318 zbetup(ji,jj,jk) = ( zbetup(ji,jj,jk) - paft(ji,jj,jk) ) / (zpos+zrtrn) * zbt 319 zbetdo(ji,jj,jk) = ( paft(ji,jj,jk) - zbetdo(ji,jj,jk) ) / (zneg+zrtrn) * zbt 320 END_3D 360 321 ! 361 322 ! monotonic flux in the k direction, i.e. pcc 362 323 ! ------------------------------------------- 363 DO jk = 2, jpkm1 364 DO jj = 2, jpjm1 365 DO ji = fs_2, fs_jpim1 ! vector opt. 366 za = MIN( 1., zbetdo(ji,jj,jk), zbetup(ji,jj,jk-1) ) 367 zb = MIN( 1., zbetup(ji,jj,jk), zbetdo(ji,jj,jk-1) ) 368 zc = 0.5 * ( 1.e0 + SIGN( 1.e0, pcc(ji,jj,jk) ) ) 369 pcc(ji,jj,jk) = pcc(ji,jj,jk) * ( zc * za + ( 1.e0 - zc) * zb ) 370 END DO 371 END DO 372 END DO 324 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 325 za = MIN( 1., zbetdo(ji,jj,jk), zbetup(ji,jj,jk-1) ) 326 zb = MIN( 1., zbetup(ji,jj,jk), zbetdo(ji,jj,jk-1) ) 327 zc = 0.5 * ( 1.e0 + SIGN( 1.0_wp, pcc(ji,jj,jk) ) ) 328 pcc(ji,jj,jk) = pcc(ji,jj,jk) * ( zc * za + ( 1.e0 - zc) * zb ) 329 END_3D 373 330 ! 374 331 END SUBROUTINE nonosc_z
Note: See TracChangeset
for help on using the changeset viewer.