- Timestamp:
- 2020-10-22T20:49:56+02:00 (4 years ago)
- Location:
- NEMO/branches/2019/dev_r11842_SI3-10_EAP
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/dev_r11842_SI3-10_EAP
- Property svn:externals
-
old new 1 ^/utils/build/arch@HEAD arch 2 ^/utils/build/makenemo@HEAD makenemo 3 ^/utils/build/mk@HEAD mk 4 ^/utils/tools@HEAD tools 5 ^/vendors/AGRIF/dev@HEAD ext/AGRIF 6 ^/vendors/FCM@HEAD ext/FCM 7 ^/vendors/IOIPSL@HEAD ext/IOIPSL 1 ^/utils/build/arch@12130 arch 2 ^/utils/build/makenemo@12191 makenemo 3 ^/utils/build/mk@11662 mk 4 ^/utils/tools_r4.0-HEAD@12672 tools 5 ^/vendors/AGRIF/dev@10586 ext/AGRIF 6 ^/vendors/FCM@10134 ext/FCM 7 ^/vendors/IOIPSL@9655 ext/IOIPSL 8 9 # SETTE mapping (inactive) 10 #^/utils/CI/sette@12135 sette
-
- Property svn:externals
-
NEMO/branches/2019/dev_r11842_SI3-10_EAP/src/ICE/icedyn_adv_pra.F90
r11812 r13662 44 44 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sxap , syap , sxxap , syyap , sxyap ! melt pond fraction 45 45 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sxvp , syvp , sxxvp , syyvp , sxyvp ! melt pond volume 46 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sxvl , syvl , sxxvl , syyvl , sxyvl ! melt pond lid volume 46 47 47 48 !! * Substitutions … … 54 55 CONTAINS 55 56 56 SUBROUTINE ice_dyn_adv_pra( kt, pu_ice, pv_ice, &57 & pato_i, pv_i, pv_s, psv_i, poa_i, pa_i, pa_ip, pv_ip, p e_s, pe_i )57 SUBROUTINE ice_dyn_adv_pra( kt, pu_ice, pv_ice, ph_i, ph_s, ph_ip, & 58 & pato_i, pv_i, pv_s, psv_i, poa_i, pa_i, pa_ip, pv_ip, pv_il, pe_s, pe_i ) 58 59 !!---------------------------------------------------------------------- 59 60 !! ** routine ice_dyn_adv_pra ** … … 70 71 REAL(wp), DIMENSION(:,:) , INTENT(in ) :: pu_ice ! ice i-velocity 71 72 REAL(wp), DIMENSION(:,:) , INTENT(in ) :: pv_ice ! ice j-velocity 73 REAL(wp), DIMENSION(:,:,:) , INTENT(in ) :: ph_i ! ice thickness 74 REAL(wp), DIMENSION(:,:,:) , INTENT(in ) :: ph_s ! snw thickness 75 REAL(wp), DIMENSION(:,:,:) , INTENT(in ) :: ph_ip ! ice pond thickness 72 76 REAL(wp), DIMENSION(:,:) , INTENT(inout) :: pato_i ! open water area 73 77 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pv_i ! ice volume … … 78 82 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pa_ip ! melt pond fraction 79 83 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pv_ip ! melt pond volume 84 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pv_il ! melt pond lid thickness 80 85 REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) :: pe_s ! snw heat content 81 86 REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) :: pe_i ! ice heat content 82 87 ! 83 INTEGER :: ji, jj, jk, jl, jt! dummy loop indices88 INTEGER :: ji, jj, jk, jl, jt ! dummy loop indices 84 89 INTEGER :: icycle ! number of sub-timestep for the advection 85 REAL(wp) :: zdt 90 REAL(wp) :: zdt, z1_dt ! - - 86 91 REAL(wp), DIMENSION(1) :: zcflprv, zcflnow ! for global communication 87 92 REAL(wp), DIMENSION(jpi,jpj) :: zati1, zati2 88 93 REAL(wp), DIMENSION(jpi,jpj) :: zudy, zvdx 94 REAL(wp), DIMENSION(jpi,jpj,jpl) :: zhi_max, zhs_max, zhip_max, zs_i, zsi_max 95 REAL(wp), DIMENSION(jpi,jpj,nlay_i,jpl) :: ze_i, zei_max 96 REAL(wp), DIMENSION(jpi,jpj,nlay_s,jpl) :: ze_s, zes_max 89 97 REAL(wp), DIMENSION(jpi,jpj,jpl) :: zarea 90 98 REAL(wp), DIMENSION(jpi,jpj,jpl) :: z0ice, z0snw, z0ai, z0smi, z0oi 91 REAL(wp), DIMENSION(jpi,jpj,jpl) :: z0ap , z0vp 99 REAL(wp), DIMENSION(jpi,jpj,jpl) :: z0ap , z0vp, z0vl 92 100 REAL(wp), DIMENSION(jpi,jpj,nlay_s,jpl) :: z0es 93 101 REAL(wp), DIMENSION(jpi,jpj,nlay_i,jpl) :: z0ei 102 !! diagnostics 103 REAL(wp), DIMENSION(jpi,jpj) :: zdiag_adv_mass, zdiag_adv_salt, zdiag_adv_heat 94 104 !!---------------------------------------------------------------------- 95 105 ! 96 106 IF( kt == nit000 .AND. lwp ) WRITE(numout,*) '-- ice_dyn_adv_pra: Prather advection scheme' 107 ! 108 ! --- Record max of the surrounding 9-pts (for call Hbig) --- ! 109 ! thickness and salinity 110 WHERE( pv_i(:,:,:) >= epsi10 ) ; zs_i(:,:,:) = psv_i(:,:,:) / pv_i(:,:,:) 111 ELSEWHERE ; zs_i(:,:,:) = 0._wp 112 END WHERE 113 CALL icemax3D( ph_i , zhi_max ) 114 CALL icemax3D( ph_s , zhs_max ) 115 CALL icemax3D( ph_ip, zhip_max) 116 CALL icemax3D( zs_i , zsi_max ) 117 CALL lbc_lnk_multi( 'icedyn_adv_pra', zhi_max, 'T', 1., zhs_max, 'T', 1., zhip_max, 'T', 1., zsi_max, 'T', 1. ) 118 119 ! enthalpies 120 DO jk = 1, nlay_i 121 WHERE( pv_i(:,:,:) >= epsi10 ) ; ze_i(:,:,jk,:) = pe_i(:,:,jk,:) / pv_i(:,:,:) 122 ELSEWHERE ; ze_i(:,:,jk,:) = 0._wp 123 END WHERE 124 END DO 125 DO jk = 1, nlay_s 126 WHERE( pv_s(:,:,:) >= epsi10 ) ; ze_s(:,:,jk,:) = pe_s(:,:,jk,:) / pv_s(:,:,:) 127 ELSEWHERE ; ze_s(:,:,jk,:) = 0._wp 128 END WHERE 129 END DO 130 CALL icemax4D( ze_i , zei_max ) 131 CALL icemax4D( ze_s , zes_max ) 132 CALL lbc_lnk( 'icedyn_adv_pra', zei_max, 'T', 1. ) 133 CALL lbc_lnk( 'icedyn_adv_pra', zes_max, 'T', 1. ) 134 ! 97 135 ! 98 136 ! --- If ice drift is too fast, use subtime steps for advection (CFL test for stability) --- ! … … 109 147 ENDIF 110 148 zdt = rdt_ice / REAL(icycle) 149 z1_dt = 1._wp / zdt 111 150 112 151 ! --- transport --- ! … … 115 154 116 155 DO jt = 1, icycle 156 157 ! diagnostics 158 zdiag_adv_mass(:,:) = SUM( pv_i(:,:,:) , dim=3 ) * rhoi + SUM( pv_s(:,:,:) , dim=3 ) * rhos 159 zdiag_adv_salt(:,:) = SUM( psv_i(:,:,:) , dim=3 ) * rhoi 160 zdiag_adv_heat(:,:) = - SUM(SUM( pe_i(:,:,1:nlay_i,:) , dim=4 ), dim=3 ) & 161 & - SUM(SUM( pe_s(:,:,1:nlay_s,:) , dim=4 ), dim=3 ) 117 162 118 163 ! record at_i before advection (for open water) … … 133 178 z0ei(:,:,jk,jl) = pe_i(:,:,jk,jl) * e1e2t(:,:) ! Ice heat content 134 179 END DO 135 IF ( ln_pnd_H12 ) THEN 136 z0ap(:,:,jl) = pa_ip(:,:,jl) * e1e2t(:,:) ! Melt pond fraction 137 z0vp(:,:,jl) = pv_ip(:,:,jl) * e1e2t(:,:) ! Melt pond volume 180 IF ( ln_pnd_LEV ) THEN 181 z0ap(:,:,jl) = pa_ip(:,:,jl) * e1e2t(:,:) ! Melt pond fraction 182 z0vp(:,:,jl) = pv_ip(:,:,jl) * e1e2t(:,:) ! Melt pond volume 183 IF ( ln_pnd_lids ) THEN 184 z0vl(:,:,jl) = pv_il(:,:,jl) * e1e2t(:,:) ! Melt pond lid volume 185 ENDIF 138 186 ENDIF 139 187 END DO … … 166 214 END DO 167 215 ! 168 IF ( ln_pnd_ H12) THEN216 IF ( ln_pnd_LEV ) THEN 169 217 CALL adv_x( zdt , zudy , 1._wp , zarea , z0ap , sxap , sxxap , syap , syyap , sxyap ) !--- melt pond fraction 170 218 CALL adv_y( zdt , zvdx , 0._wp , zarea , z0ap , sxap , sxxap , syap , syyap , sxyap ) 171 219 CALL adv_x( zdt , zudy , 1._wp , zarea , z0vp , sxvp , sxxvp , syvp , syyvp , sxyvp ) !--- melt pond volume 172 220 CALL adv_y( zdt , zvdx , 0._wp , zarea , z0vp , sxvp , sxxvp , syvp , syyvp , sxyvp ) 221 IF ( ln_pnd_lids ) THEN 222 CALL adv_x( zdt , zudy , 1._wp , zarea , z0vl , sxvl , sxxvl , syvl , syyvl , sxyvl ) !--- melt pond lid volume 223 CALL adv_y( zdt , zvdx , 0._wp , zarea , z0vl , sxvl , sxxvl , syvl , syyvl , sxyvl ) 224 ENDIF 173 225 ENDIF 174 226 ! !--------------------------------------------! … … 197 249 & sxxe(:,:,jk,:), sye(:,:,jk,:), syye(:,:,jk,:), sxye(:,:,jk,:) ) 198 250 END DO 199 IF ( ln_pnd_ H12) THEN251 IF ( ln_pnd_LEV ) THEN 200 252 CALL adv_y( zdt , zvdx , 1._wp , zarea , z0ap , sxap , sxxap , syap , syyap , sxyap ) !--- melt pond fraction 201 253 CALL adv_x( zdt , zudy , 0._wp , zarea , z0ap , sxap , sxxap , syap , syyap , sxyap ) 202 254 CALL adv_y( zdt , zvdx , 1._wp , zarea , z0vp , sxvp , sxxvp , syvp , syyvp , sxyvp ) !--- melt pond volume 203 255 CALL adv_x( zdt , zudy , 0._wp , zarea , z0vp , sxvp , sxxvp , syvp , syyvp , sxyvp ) 256 IF ( ln_pnd_lids ) THEN 257 CALL adv_y( zdt , zvdx , 1._wp , zarea , z0vl , sxvl , sxxvl , syvl , syyvl , sxyvl ) !--- melt pond lid volume 258 CALL adv_x( zdt , zudy , 0._wp , zarea , z0vl , sxvl , sxxvl , syvl , syyvl , sxyvl ) 259 ENDIF 204 260 ENDIF 205 261 ! 206 262 ENDIF 207 263 264 ! --- Lateral boundary conditions --- ! 265 ! caution: for gradients (sx and sy) the sign changes 266 CALL lbc_lnk_multi( 'icedyn_adv_pra', z0ice , 'T', 1._wp, sxice , 'T', -1._wp, syice , 'T', -1._wp & ! ice volume 267 & , sxxice, 'T', 1._wp, syyice, 'T', 1._wp, sxyice, 'T', 1._wp & 268 & , z0snw , 'T', 1._wp, sxsn , 'T', -1._wp, sysn , 'T', -1._wp & ! snw volume 269 & , sxxsn , 'T', 1._wp, syysn , 'T', 1._wp, sxysn , 'T', 1._wp ) 270 CALL lbc_lnk_multi( 'icedyn_adv_pra', z0smi , 'T', 1._wp, sxsal , 'T', -1._wp, sysal , 'T', -1._wp & ! ice salinity 271 & , sxxsal, 'T', 1._wp, syysal, 'T', 1._wp, sxysal, 'T', 1._wp & 272 & , z0ai , 'T', 1._wp, sxa , 'T', -1._wp, sya , 'T', -1._wp & ! ice concentration 273 & , sxxa , 'T', 1._wp, syya , 'T', 1._wp, sxya , 'T', 1._wp ) 274 CALL lbc_lnk_multi( 'icedyn_adv_pra', z0oi , 'T', 1._wp, sxage , 'T', -1._wp, syage , 'T', -1._wp & ! ice age 275 & , sxxage, 'T', 1._wp, syyage, 'T', 1._wp, sxyage, 'T', 1._wp ) 276 CALL lbc_lnk_multi( 'icedyn_adv_pra', z0es , 'T', 1._wp, sxc0 , 'T', -1._wp, syc0 , 'T', -1._wp & ! snw enthalpy 277 & , sxxc0 , 'T', 1._wp, syyc0 , 'T', 1._wp, sxyc0 , 'T', 1._wp ) 278 CALL lbc_lnk_multi( 'icedyn_adv_pra', z0ei , 'T', 1._wp, sxe , 'T', -1._wp, sye , 'T', -1._wp & ! ice enthalpy 279 & , sxxe , 'T', 1._wp, syye , 'T', 1._wp, sxye , 'T', 1._wp ) 280 IF ( ln_pnd_LEV ) THEN 281 CALL lbc_lnk_multi( 'icedyn_adv_pra', z0ap , 'T', 1._wp, sxap , 'T', -1._wp, syap , 'T', -1._wp & ! melt pond fraction 282 & , sxxap, 'T', 1._wp, syyap, 'T', 1._wp, sxyap, 'T', 1._wp & 283 & , z0vp , 'T', 1._wp, sxvp , 'T', -1._wp, syvp , 'T', -1._wp & ! melt pond volume 284 & , sxxvp, 'T', 1._wp, syyvp, 'T', 1._wp, sxyvp, 'T', 1._wp ) 285 IF ( ln_pnd_lids ) THEN 286 CALL lbc_lnk_multi( 'icedyn_adv_pra', z0vl ,'T', 1._wp, sxvl ,'T', -1._wp, syvl ,'T', -1._wp & ! melt pond lid volume 287 & , sxxvl,'T', 1._wp, syyvl,'T', 1._wp, sxyvl,'T', 1._wp ) 288 ENDIF 289 ENDIF 290 208 291 ! --- Recover the properties from their contents --- ! 209 292 DO jl = 1, jpl … … 219 302 pe_i(:,:,jk,jl) = z0ei(:,:,jk,jl) * r1_e1e2t(:,:) * tmask(:,:,1) 220 303 END DO 221 IF ( ln_pnd_ H12) THEN304 IF ( ln_pnd_LEV ) THEN 222 305 pa_ip(:,:,jl) = z0ap(:,:,jl) * r1_e1e2t(:,:) * tmask(:,:,1) 223 306 pv_ip(:,:,jl) = z0vp(:,:,jl) * r1_e1e2t(:,:) * tmask(:,:,1) 307 IF ( ln_pnd_lids ) THEN 308 pv_il(:,:,jl) = z0vl(:,:,jl) * r1_e1e2t(:,:) * tmask(:,:,1) 309 ENDIF 224 310 ENDIF 225 311 END DO … … 235 321 CALL lbc_lnk( 'icedyn_adv_pra', pato_i, 'T', 1. ) 236 322 ! 323 ! --- diagnostics --- ! 324 diag_adv_mass(:,:) = diag_adv_mass(:,:) + ( SUM( pv_i(:,:,:) , dim=3 ) * rhoi + SUM( pv_s(:,:,:) , dim=3 ) * rhos & 325 & - zdiag_adv_mass(:,:) ) * z1_dt 326 diag_adv_salt(:,:) = diag_adv_salt(:,:) + ( SUM( psv_i(:,:,:) , dim=3 ) * rhoi & 327 & - zdiag_adv_salt(:,:) ) * z1_dt 328 diag_adv_heat(:,:) = diag_adv_heat(:,:) + ( - SUM(SUM( pe_i(:,:,1:nlay_i,:) , dim=4 ), dim=3 ) & 329 & - SUM(SUM( pe_s(:,:,1:nlay_s,:) , dim=4 ), dim=3 ) & 330 & - zdiag_adv_heat(:,:) ) * z1_dt 331 ! 237 332 ! --- Ensure non-negative fields --- ! 238 333 ! Remove negative values (conservation is ensured) 239 334 ! (because advected fields are not perfectly bounded and tiny negative values can occur, e.g. -1.e-20) 240 CALL ice_var_zapneg( zdt, pato_i, pv_i, pv_s, psv_i, poa_i, pa_i, pa_ip, pv_ip, pe_s, pe_i ) 335 CALL ice_var_zapneg( zdt, pato_i, pv_i, pv_s, psv_i, poa_i, pa_i, pa_ip, pv_ip, pv_il, pe_s, pe_i ) 336 ! 337 ! --- Make sure ice thickness is not too big --- ! 338 ! (because ice thickness can be too large where ice concentration is very small) 339 CALL Hbig( zdt, zhi_max, zhs_max, zhip_max, zsi_max, zes_max, zei_max, & 340 & pv_i, pv_s, pa_i, pa_ip, pv_ip, psv_i, pe_s, pe_i ) 241 341 ! 242 342 ! --- Ensure snow load is not too big --- ! … … 267 367 !! 268 368 INTEGER :: ji, jj, jl, jcat ! dummy loop indices 369 INTEGER :: jjmin, jjmax ! dummy loop indices 269 370 REAL(wp) :: zs1max, zslpmax, ztemp ! local scalars 270 371 REAL(wp) :: zs1new, zalf , zalfq , zbt ! - - 271 372 REAL(wp) :: zs2new, zalf1, zalf1q, zbt1 ! - - 373 REAL(wp) :: zpsm, zps0 374 REAL(wp) :: zpsx, zpsy, zpsxx, zpsyy, zpsxy 272 375 REAL(wp), DIMENSION(jpi,jpj) :: zf0 , zfx , zfy , zbet ! 2D workspace 273 376 REAL(wp), DIMENSION(jpi,jpj) :: zfm , zfxx , zfyy , zfxy ! - - 274 377 REAL(wp), DIMENSION(jpi,jpj) :: zalg, zalg1, zalg1q ! - - 275 378 !----------------------------------------------------------------------- 379 ! in order to avoid lbc_lnk (communications): 380 ! jj loop must be 1:jpj if adv_x is called first 381 ! and 2:jpj-1 if adv_x is called second 382 jjmin = 2 - NINT(pcrh) ! 1 or 2 383 jjmax = jpjm1 + NINT(pcrh) ! jpj or jpj-1 276 384 ! 277 385 jcat = SIZE( ps0 , 3 ) ! size of input arrays … … 280 388 ! 281 389 ! Limitation of moments. 282 DO jj = 2, jpjm1 390 DO jj = jjmin, jjmax 391 283 392 DO ji = 1, jpi 393 394 zpsm = psm (ji,jj,jl) ! optimization 395 zps0 = ps0 (ji,jj,jl) 396 zpsx = psx (ji,jj,jl) 397 zpsxx = psxx(ji,jj,jl) 398 zpsy = psy (ji,jj,jl) 399 zpsyy = psyy(ji,jj,jl) 400 zpsxy = psxy(ji,jj,jl) 401 284 402 ! Initialize volumes of boxes (=area if adv_x first called, =psm otherwise) 285 psm (ji,jj,jl) = MAX( pcrh * e1e2t(ji,jj) + ( 1.0 - pcrh ) * psm(ji,jj,jl), epsi20 )286 ! 287 zslpmax = MAX( 0._wp, ps0(ji,jj,jl))403 zpsm = MAX( pcrh * e1e2t(ji,jj) + ( 1.0 - pcrh ) * zpsm , epsi20 ) 404 ! 405 zslpmax = MAX( 0._wp, zps0 ) 288 406 zs1max = 1.5 * zslpmax 289 zs1new = MIN( zs1max, MAX( -zs1max, psx(ji,jj,jl) ) ) 290 zs2new = MIN( 2.0 * zslpmax - 0.3334 * ABS( zs1new ), & 291 & MAX( ABS( zs1new ) - zslpmax, psxx(ji,jj,jl) ) ) 407 zs1new = MIN( zs1max, MAX( -zs1max, zpsx ) ) 408 zs2new = MIN( 2.0 * zslpmax - 0.3334 * ABS( zs1new ), MAX( ABS( zs1new ) - zslpmax, zpsxx ) ) 292 409 rswitch = ( 1.0 - MAX( 0._wp, SIGN( 1._wp, -zslpmax) ) ) * tmask(ji,jj,1) ! Case of empty boxes & Apply mask 293 410 294 ps0 (ji,jj,jl) = zslpmax 295 psx (ji,jj,jl) = zs1new * rswitch 296 psxx(ji,jj,jl) = zs2new * rswitch 297 psy (ji,jj,jl) = psy (ji,jj,jl) * rswitch 298 psyy(ji,jj,jl) = psyy(ji,jj,jl) * rswitch 299 psxy(ji,jj,jl) = MIN( zslpmax, MAX( -zslpmax, psxy(ji,jj,jl) ) ) * rswitch 300 END DO 301 END DO 302 303 ! Calculate fluxes and moments between boxes i<-->i+1 304 DO jj = 2, jpjm1 ! Flux from i to i+1 WHEN u GT 0 305 DO ji = 1, jpi 411 zps0 = zslpmax 412 zpsx = zs1new * rswitch 413 zpsxx = zs2new * rswitch 414 zpsy = zpsy * rswitch 415 zpsyy = zpsyy * rswitch 416 zpsxy = MIN( zslpmax, MAX( -zslpmax, zpsxy ) ) * rswitch 417 418 ! Calculate fluxes and moments between boxes i<-->i+1 419 ! ! Flux from i to i+1 WHEN u GT 0 306 420 zbet(ji,jj) = MAX( 0._wp, SIGN( 1._wp, put(ji,jj) ) ) 307 zalf = MAX( 0._wp, put(ji,jj) ) * pdt / psm(ji,jj,jl)421 zalf = MAX( 0._wp, put(ji,jj) ) * pdt / zpsm 308 422 zalfq = zalf * zalf 309 423 zalf1 = 1.0 - zalf 310 424 zalf1q = zalf1 * zalf1 311 425 ! 312 zfm (ji,jj) = zalf * psm (ji,jj,jl) 313 zf0 (ji,jj) = zalf * ( ps0 (ji,jj,jl) + zalf1 * ( psx(ji,jj,jl) + (zalf1 - zalf) * psxx(ji,jj,jl) ) ) 314 zfx (ji,jj) = zalfq * ( psx (ji,jj,jl) + 3.0 * zalf1 * psxx(ji,jj,jl) ) 315 zfxx(ji,jj) = zalf * psxx(ji,jj,jl) * zalfq 316 zfy (ji,jj) = zalf * ( psy (ji,jj,jl) + zalf1 * psxy(ji,jj,jl) ) 317 zfxy(ji,jj) = zalfq * psxy(ji,jj,jl) 318 zfyy(ji,jj) = zalf * psyy(ji,jj,jl) 319 320 ! Readjust moments remaining in the box. 321 psm (ji,jj,jl) = psm (ji,jj,jl) - zfm(ji,jj) 322 ps0 (ji,jj,jl) = ps0 (ji,jj,jl) - zf0(ji,jj) 323 psx (ji,jj,jl) = zalf1q * ( psx(ji,jj,jl) - 3.0 * zalf * psxx(ji,jj,jl) ) 324 psxx(ji,jj,jl) = zalf1 * zalf1q * psxx(ji,jj,jl) 325 psy (ji,jj,jl) = psy (ji,jj,jl) - zfy(ji,jj) 326 psyy(ji,jj,jl) = psyy(ji,jj,jl) - zfyy(ji,jj) 327 psxy(ji,jj,jl) = zalf1q * psxy(ji,jj,jl) 328 END DO 329 END DO 330 331 DO jj = 2, jpjm1 ! Flux from i+1 to i when u LT 0. 426 zfm (ji,jj) = zalf * zpsm 427 zf0 (ji,jj) = zalf * ( zps0 + zalf1 * ( zpsx + (zalf1 - zalf) * zpsxx ) ) 428 zfx (ji,jj) = zalfq * ( zpsx + 3.0 * zalf1 * zpsxx ) 429 zfxx(ji,jj) = zalf * zpsxx * zalfq 430 zfy (ji,jj) = zalf * ( zpsy + zalf1 * zpsxy ) 431 zfxy(ji,jj) = zalfq * zpsxy 432 zfyy(ji,jj) = zalf * zpsyy 433 434 ! ! Readjust moments remaining in the box. 435 zpsm = zpsm - zfm(ji,jj) 436 zps0 = zps0 - zf0(ji,jj) 437 zpsx = zalf1q * ( zpsx - 3.0 * zalf * zpsxx ) 438 zpsxx = zalf1 * zalf1q * zpsxx 439 zpsy = zpsy - zfy (ji,jj) 440 zpsyy = zpsyy - zfyy(ji,jj) 441 zpsxy = zalf1q * zpsxy 442 ! 443 psm (ji,jj,jl) = zpsm ! optimization 444 ps0 (ji,jj,jl) = zps0 445 psx (ji,jj,jl) = zpsx 446 psxx(ji,jj,jl) = zpsxx 447 psy (ji,jj,jl) = zpsy 448 psyy(ji,jj,jl) = zpsyy 449 psxy(ji,jj,jl) = zpsxy 450 ! 451 END DO 452 332 453 DO ji = 1, fs_jpim1 454 ! ! Flux from i+1 to i when u LT 0. 333 455 zalf = MAX( 0._wp, -put(ji,jj) ) * pdt / psm(ji+1,jj,jl) 334 456 zalg (ji,jj) = zalf … … 348 470 zfyy (ji,jj) = zfyy(ji,jj) + zalf * psyy(ji+1,jj,jl) 349 471 END DO 350 END DO 351 352 DO jj = 2, jpjm1 ! Readjust moments remaining in the box. 353 DO ji = fs_2, fs_jpim1 472 473 DO ji = fs_2, fs_jpim1 474 ! 475 zpsm = psm (ji,jj,jl) ! optimization 476 zps0 = ps0 (ji,jj,jl) 477 zpsx = psx (ji,jj,jl) 478 zpsxx = psxx(ji,jj,jl) 479 zpsy = psy (ji,jj,jl) 480 zpsyy = psyy(ji,jj,jl) 481 zpsxy = psxy(ji,jj,jl) 482 ! ! Readjust moments remaining in the box. 354 483 zbt = zbet(ji-1,jj) 355 484 zbt1 = 1.0 - zbet(ji-1,jj) 356 485 ! 357 psm (ji,jj,jl) = zbt * psm(ji,jj,jl) + zbt1 * ( psm(ji,jj,jl) - zfm(ji-1,jj) ) 358 ps0 (ji,jj,jl) = zbt * ps0(ji,jj,jl) + zbt1 * ( ps0(ji,jj,jl) - zf0(ji-1,jj) ) 359 psx (ji,jj,jl) = zalg1q(ji-1,jj) * ( psx(ji,jj,jl) + 3.0 * zalg(ji-1,jj) * psxx(ji,jj,jl) ) 360 psxx(ji,jj,jl) = zalg1 (ji-1,jj) * zalg1q(ji-1,jj) * psxx(ji,jj,jl) 361 psy (ji,jj,jl) = zbt * psy (ji,jj,jl) + zbt1 * ( psy (ji,jj,jl) - zfy (ji-1,jj) ) 362 psyy(ji,jj,jl) = zbt * psyy(ji,jj,jl) + zbt1 * ( psyy(ji,jj,jl) - zfyy(ji-1,jj) ) 363 psxy(ji,jj,jl) = zalg1q(ji-1,jj) * psxy(ji,jj,jl) 364 END DO 365 END DO 366 367 ! Put the temporary moments into appropriate neighboring boxes. 368 DO jj = 2, jpjm1 ! Flux from i to i+1 IF u GT 0. 369 DO ji = fs_2, fs_jpim1 370 zbt = zbet(ji-1,jj) 371 zbt1 = 1.0 - zbet(ji-1,jj) 372 psm(ji,jj,jl) = zbt * ( psm(ji,jj,jl) + zfm(ji-1,jj) ) + zbt1 * psm(ji,jj,jl) 373 zalf = zbt * zfm(ji-1,jj) / psm(ji,jj,jl) 374 zalf1 = 1.0 - zalf 375 ztemp = zalf * ps0(ji,jj,jl) - zalf1 * zf0(ji-1,jj) 376 ! 377 ps0 (ji,jj,jl) = zbt * ( ps0(ji,jj,jl) + zf0(ji-1,jj) ) + zbt1 * ps0(ji,jj,jl) 378 psx (ji,jj,jl) = zbt * ( zalf * zfx(ji-1,jj) + zalf1 * psx(ji,jj,jl) + 3.0 * ztemp ) + zbt1 * psx(ji,jj,jl) 379 psxx(ji,jj,jl) = zbt * ( zalf * zalf * zfxx(ji-1,jj) + zalf1 * zalf1 * psxx(ji,jj,jl) & 380 & + 5.0 * ( zalf * zalf1 * ( psx (ji,jj,jl) - zfx(ji-1,jj) ) - ( zalf1 - zalf ) * ztemp ) ) & 381 & + zbt1 * psxx(ji,jj,jl) 382 psxy(ji,jj,jl) = zbt * ( zalf * zfxy(ji-1,jj) + zalf1 * psxy(ji,jj,jl) & 383 & + 3.0 * (- zalf1*zfy(ji-1,jj) + zalf * psy(ji,jj,jl) ) ) & 384 & + zbt1 * psxy(ji,jj,jl) 385 psy (ji,jj,jl) = zbt * ( psy (ji,jj,jl) + zfy (ji-1,jj) ) + zbt1 * psy (ji,jj,jl) 386 psyy(ji,jj,jl) = zbt * ( psyy(ji,jj,jl) + zfyy(ji-1,jj) ) + zbt1 * psyy(ji,jj,jl) 387 END DO 388 END DO 389 390 DO jj = 2, jpjm1 ! Flux from i+1 to i IF u LT 0. 391 DO ji = fs_2, fs_jpim1 392 zbt = zbet(ji,jj) 393 zbt1 = 1.0 - zbet(ji,jj) 394 psm(ji,jj,jl) = zbt * psm(ji,jj,jl) + zbt1 * ( psm(ji,jj,jl) + zfm(ji,jj) ) 395 zalf = zbt1 * zfm(ji,jj) / psm(ji,jj,jl) 396 zalf1 = 1.0 - zalf 397 ztemp = - zalf * ps0(ji,jj,jl) + zalf1 * zf0(ji,jj) 398 ! 399 ps0 (ji,jj,jl) = zbt * ps0 (ji,jj,jl) + zbt1 * ( ps0(ji,jj,jl) + zf0(ji,jj) ) 400 psx (ji,jj,jl) = zbt * psx (ji,jj,jl) + zbt1 * ( zalf * zfx(ji,jj) + zalf1 * psx(ji,jj,jl) + 3.0 * ztemp ) 401 psxx(ji,jj,jl) = zbt * psxx(ji,jj,jl) + zbt1 * ( zalf * zalf * zfxx(ji,jj) + zalf1 * zalf1 * psxx(ji,jj,jl) & 402 & + 5.0 * ( zalf * zalf1 * ( - psx(ji,jj,jl) + zfx(ji,jj) ) & 403 & + ( zalf1 - zalf ) * ztemp ) ) 404 psxy(ji,jj,jl) = zbt * psxy(ji,jj,jl) + zbt1 * ( zalf * zfxy(ji,jj) + zalf1 * psxy(ji,jj,jl) & 405 & + 3.0 * ( zalf1 * zfy(ji,jj) - zalf * psy(ji,jj,jl) ) ) 406 psy (ji,jj,jl) = zbt * psy (ji,jj,jl) + zbt1 * ( psy (ji,jj,jl) + zfy (ji,jj) ) 407 psyy(ji,jj,jl) = zbt * psyy(ji,jj,jl) + zbt1 * ( psyy(ji,jj,jl) + zfyy(ji,jj) ) 408 END DO 486 zpsm = zbt * zpsm + zbt1 * ( zpsm - zfm(ji-1,jj) ) 487 zps0 = zbt * zps0 + zbt1 * ( zps0 - zf0(ji-1,jj) ) 488 zpsx = zalg1q(ji-1,jj) * ( zpsx + 3.0 * zalg(ji-1,jj) * zpsxx ) 489 zpsxx = zalg1 (ji-1,jj) * zalg1q(ji-1,jj) * zpsxx 490 zpsy = zbt * zpsy + zbt1 * ( zpsy - zfy (ji-1,jj) ) 491 zpsyy = zbt * zpsyy + zbt1 * ( zpsyy - zfyy(ji-1,jj) ) 492 zpsxy = zalg1q(ji-1,jj) * zpsxy 493 494 ! Put the temporary moments into appropriate neighboring boxes. 495 ! ! Flux from i to i+1 IF u GT 0. 496 zbt = zbet(ji-1,jj) 497 zbt1 = 1.0 - zbet(ji-1,jj) 498 zpsm = zbt * ( zpsm + zfm(ji-1,jj) ) + zbt1 * zpsm 499 zalf = zbt * zfm(ji-1,jj) / zpsm 500 zalf1 = 1.0 - zalf 501 ztemp = zalf * zps0 - zalf1 * zf0(ji-1,jj) 502 ! 503 zps0 = zbt * ( zps0 + zf0(ji-1,jj) ) + zbt1 * zps0 504 zpsx = zbt * ( zalf * zfx(ji-1,jj) + zalf1 * zpsx + 3.0 * ztemp ) + zbt1 * zpsx 505 zpsxx = zbt * ( zalf * zalf * zfxx(ji-1,jj) + zalf1 * zalf1 * zpsxx & 506 & + 5.0 * ( zalf * zalf1 * ( zpsx - zfx(ji-1,jj) ) - ( zalf1 - zalf ) * ztemp ) ) & 507 & + zbt1 * zpsxx 508 zpsxy = zbt * ( zalf * zfxy(ji-1,jj) + zalf1 * zpsxy & 509 & + 3.0 * (- zalf1*zfy(ji-1,jj) + zalf * zpsy ) ) & 510 & + zbt1 * zpsxy 511 zpsy = zbt * ( zpsy + zfy (ji-1,jj) ) + zbt1 * zpsy 512 zpsyy = zbt * ( zpsyy + zfyy(ji-1,jj) ) + zbt1 * zpsyy 513 514 ! ! Flux from i+1 to i IF u LT 0. 515 zbt = zbet(ji,jj) 516 zbt1 = 1.0 - zbet(ji,jj) 517 zpsm = zbt * zpsm + zbt1 * ( zpsm + zfm(ji,jj) ) 518 zalf = zbt1 * zfm(ji,jj) / zpsm 519 zalf1 = 1.0 - zalf 520 ztemp = - zalf * zps0 + zalf1 * zf0(ji,jj) 521 ! 522 zps0 = zbt * zps0 + zbt1 * ( zps0 + zf0(ji,jj) ) 523 zpsx = zbt * zpsx + zbt1 * ( zalf * zfx(ji,jj) + zalf1 * zpsx + 3.0 * ztemp ) 524 zpsxx = zbt * zpsxx + zbt1 * ( zalf * zalf * zfxx(ji,jj) + zalf1 * zalf1 * zpsxx & 525 & + 5.0 * ( zalf * zalf1 * ( - zpsx + zfx(ji,jj) ) & 526 & + ( zalf1 - zalf ) * ztemp ) ) 527 zpsxy = zbt * zpsxy + zbt1 * ( zalf * zfxy(ji,jj) + zalf1 * zpsxy & 528 & + 3.0 * ( zalf1 * zfy(ji,jj) - zalf * zpsy ) ) 529 zpsy = zbt * zpsy + zbt1 * ( zpsy + zfy (ji,jj) ) 530 zpsyy = zbt * zpsyy + zbt1 * ( zpsyy + zfyy(ji,jj) ) 531 ! 532 psm (ji,jj,jl) = zpsm ! optimization 533 ps0 (ji,jj,jl) = zps0 534 psx (ji,jj,jl) = zpsx 535 psxx(ji,jj,jl) = zpsxx 536 psy (ji,jj,jl) = zpsy 537 psyy(ji,jj,jl) = zpsyy 538 psxy(ji,jj,jl) = zpsxy 539 END DO 540 409 541 END DO 410 542 411 543 END DO 412 413 !-- Lateral boundary conditions414 CALL lbc_lnk_multi( 'icedyn_adv_pra', psm(:,:,1:jcat) , 'T', 1., ps0 , 'T', 1. &415 & , psx , 'T', -1., psy , 'T', -1. & ! caution gradient ==> the sign changes416 & , psxx , 'T', 1., psyy, 'T', 1. , psxy, 'T', 1. )417 544 ! 418 545 END SUBROUTINE adv_x … … 436 563 !! 437 564 INTEGER :: ji, jj, jl, jcat ! dummy loop indices 565 INTEGER :: jimin, jimax ! dummy loop indices 438 566 REAL(wp) :: zs1max, zslpmax, ztemp ! temporary scalars 439 567 REAL(wp) :: zs1new, zalf , zalfq , zbt ! - - 440 568 REAL(wp) :: zs2new, zalf1, zalf1q, zbt1 ! - - 569 REAL(wp) :: zpsm, zps0 570 REAL(wp) :: zpsx, zpsy, zpsxx, zpsyy, zpsxy 441 571 REAL(wp), DIMENSION(jpi,jpj) :: zf0, zfx , zfy , zbet ! 2D workspace 442 572 REAL(wp), DIMENSION(jpi,jpj) :: zfm, zfxx, zfyy, zfxy ! - - 443 573 REAL(wp), DIMENSION(jpi,jpj) :: zalg, zalg1, zalg1q ! - - 444 574 !--------------------------------------------------------------------- 575 ! in order to avoid lbc_lnk (communications): 576 ! ji loop must be 1:jpi if adv_y is called first 577 ! and 2:jpi-1 if adv_y is called second 578 jimin = 2 - NINT(pcrh) ! 1 or 2 579 jimax = jpim1 + NINT(pcrh) ! jpi or jpi-1 445 580 ! 446 581 jcat = SIZE( ps0 , 3 ) ! size of input arrays … … 450 585 ! Limitation of moments. 451 586 DO jj = 1, jpj 452 DO ji = fs_2, fs_jpim1 453 ! Initialize volumes of boxes (=area if adv_x first called, =psm otherwise) 454 psm(ji,jj,jl) = MAX( pcrh * e1e2t(ji,jj) + ( 1.0 - pcrh ) * psm(ji,jj,jl) , epsi20 ) 455 ! 456 zslpmax = MAX( 0._wp, ps0(ji,jj,jl) ) 587 DO ji = jimin, jimax 588 ! 589 zpsm = psm (ji,jj,jl) ! optimization 590 zps0 = ps0 (ji,jj,jl) 591 zpsx = psx (ji,jj,jl) 592 zpsxx = psxx(ji,jj,jl) 593 zpsy = psy (ji,jj,jl) 594 zpsyy = psyy(ji,jj,jl) 595 zpsxy = psxy(ji,jj,jl) 596 ! 597 ! Initialize volumes of boxes (=area if adv_y first called, =psm otherwise) 598 zpsm = MAX( pcrh * e1e2t(ji,jj) + ( 1.0 - pcrh ) * zpsm , epsi20 ) 599 ! 600 zslpmax = MAX( 0._wp, zps0 ) 457 601 zs1max = 1.5 * zslpmax 458 zs1new = MIN( zs1max, MAX( -zs1max, psy(ji,jj,jl) ) ) 459 zs2new = MIN( ( 2.0 * zslpmax - 0.3334 * ABS( zs1new ) ), & 460 & MAX( ABS( zs1new )-zslpmax, psyy(ji,jj,jl) ) ) 602 zs1new = MIN( zs1max, MAX( -zs1max, zpsy ) ) 603 zs2new = MIN( ( 2.0 * zslpmax - 0.3334 * ABS( zs1new ) ), MAX( ABS( zs1new )-zslpmax, zpsyy ) ) 461 604 rswitch = ( 1.0 - MAX( 0._wp, SIGN( 1._wp, -zslpmax) ) ) * tmask(ji,jj,1) ! Case of empty boxes & Apply mask 462 605 ! 463 ps0 (ji,jj,jl) = zslpmax 464 psx (ji,jj,jl) = psx (ji,jj,jl) * rswitch 465 psxx(ji,jj,jl) = psxx(ji,jj,jl) * rswitch 466 psy (ji,jj,jl) = zs1new * rswitch 467 psyy(ji,jj,jl) = zs2new * rswitch 468 psxy(ji,jj,jl) = MIN( zslpmax, MAX( -zslpmax, psxy(ji,jj,jl) ) ) * rswitch 469 END DO 470 END DO 606 zps0 = zslpmax 607 zpsx = zpsx * rswitch 608 zpsxx = zpsxx * rswitch 609 zpsy = zs1new * rswitch 610 zpsyy = zs2new * rswitch 611 zpsxy = MIN( zslpmax, MAX( -zslpmax, zpsxy ) ) * rswitch 471 612 472 ! Calculate fluxes and moments between boxes j<-->j+1 473 DO jj = 1, jpj ! Flux from j to j+1 WHEN v GT 0 474 DO ji = fs_2, fs_jpim1 613 ! Calculate fluxes and moments between boxes j<-->j+1 614 ! ! Flux from j to j+1 WHEN v GT 0 475 615 zbet(ji,jj) = MAX( 0._wp, SIGN( 1._wp, pvt(ji,jj) ) ) 476 zalf = MAX( 0._wp, pvt(ji,jj) ) * pdt / psm(ji,jj,jl)616 zalf = MAX( 0._wp, pvt(ji,jj) ) * pdt / zpsm 477 617 zalfq = zalf * zalf 478 618 zalf1 = 1.0 - zalf 479 619 zalf1q = zalf1 * zalf1 480 620 ! 481 zfm (ji,jj) = zalf * psm(ji,jj,jl) 482 zf0 (ji,jj) = zalf * ( ps0(ji,jj,jl) + zalf1 * ( psy(ji,jj,jl) + (zalf1-zalf) * psyy(ji,jj,jl) ) ) 483 zfy (ji,jj) = zalfq *( psy(ji,jj,jl) + 3.0*zalf1*psyy(ji,jj,jl) ) 484 zfyy(ji,jj) = zalf * zalfq * psyy(ji,jj,jl) 485 zfx (ji,jj) = zalf * ( psx(ji,jj,jl) + zalf1 * psxy(ji,jj,jl) ) 486 zfxy(ji,jj) = zalfq * psxy(ji,jj,jl) 487 zfxx(ji,jj) = zalf * psxx(ji,jj,jl) 488 ! 489 ! Readjust moments remaining in the box. 490 psm (ji,jj,jl) = psm (ji,jj,jl) - zfm(ji,jj) 491 ps0 (ji,jj,jl) = ps0 (ji,jj,jl) - zf0(ji,jj) 492 psy (ji,jj,jl) = zalf1q * ( psy(ji,jj,jl) -3.0 * zalf * psyy(ji,jj,jl) ) 493 psyy(ji,jj,jl) = zalf1 * zalf1q * psyy(ji,jj,jl) 494 psx (ji,jj,jl) = psx (ji,jj,jl) - zfx(ji,jj) 495 psxx(ji,jj,jl) = psxx(ji,jj,jl) - zfxx(ji,jj) 496 psxy(ji,jj,jl) = zalf1q * psxy(ji,jj,jl) 497 END DO 498 END DO 499 ! 500 DO jj = 1, jpjm1 ! Flux from j+1 to j when v LT 0. 501 DO ji = fs_2, fs_jpim1 621 zfm (ji,jj) = zalf * zpsm 622 zf0 (ji,jj) = zalf * ( zps0 + zalf1 * ( zpsy + (zalf1-zalf) * zpsyy ) ) 623 zfy (ji,jj) = zalfq *( zpsy + 3.0*zalf1*zpsyy ) 624 zfyy(ji,jj) = zalf * zalfq * zpsyy 625 zfx (ji,jj) = zalf * ( zpsx + zalf1 * zpsxy ) 626 zfxy(ji,jj) = zalfq * zpsxy 627 zfxx(ji,jj) = zalf * zpsxx 628 ! 629 ! ! Readjust moments remaining in the box. 630 zpsm = zpsm - zfm(ji,jj) 631 zps0 = zps0 - zf0(ji,jj) 632 zpsy = zalf1q * ( zpsy -3.0 * zalf * zpsyy ) 633 zpsyy = zalf1 * zalf1q * zpsyy 634 zpsx = zpsx - zfx(ji,jj) 635 zpsxx = zpsxx - zfxx(ji,jj) 636 zpsxy = zalf1q * zpsxy 637 ! 638 psm (ji,jj,jl) = zpsm ! optimization 639 ps0 (ji,jj,jl) = zps0 640 psx (ji,jj,jl) = zpsx 641 psxx(ji,jj,jl) = zpsxx 642 psy (ji,jj,jl) = zpsy 643 psyy(ji,jj,jl) = zpsyy 644 psxy(ji,jj,jl) = zpsxy 645 END DO 646 END DO 647 ! 648 DO jj = 1, jpjm1 649 DO ji = jimin, jimax 650 ! ! Flux from j+1 to j when v LT 0. 502 651 zalf = MAX( 0._wp, -pvt(ji,jj) ) * pdt / psm(ji,jj+1,jl) 503 652 zalg (ji,jj) = zalf … … 519 668 END DO 520 669 521 ! Readjust moments remaining in the box.522 670 DO jj = 2, jpjm1 523 DO ji = fs_2, fs_jpim1 671 DO ji = jimin, jimax 672 ! ! Readjust moments remaining in the box. 524 673 zbt = zbet(ji,jj-1) 525 674 zbt1 = ( 1.0 - zbet(ji,jj-1) ) 526 675 ! 527 psm (ji,jj,jl) = zbt * psm(ji,jj,jl) + zbt1 * ( psm(ji,jj,jl) - zfm(ji,jj-1) ) 528 ps0 (ji,jj,jl) = zbt * ps0(ji,jj,jl) + zbt1 * ( ps0(ji,jj,jl) - zf0(ji,jj-1) ) 529 psy (ji,jj,jl) = zalg1q(ji,jj-1) * ( psy(ji,jj,jl) + 3.0 * zalg(ji,jj-1) * psyy(ji,jj,jl) ) 530 psyy(ji,jj,jl) = zalg1 (ji,jj-1) * zalg1q(ji,jj-1) * psyy(ji,jj,jl) 531 psx (ji,jj,jl) = zbt * psx (ji,jj,jl) + zbt1 * ( psx (ji,jj,jl) - zfx (ji,jj-1) ) 532 psxx(ji,jj,jl) = zbt * psxx(ji,jj,jl) + zbt1 * ( psxx(ji,jj,jl) - zfxx(ji,jj-1) ) 533 psxy(ji,jj,jl) = zalg1q(ji,jj-1) * psxy(ji,jj,jl) 534 END DO 535 END DO 536 537 ! Put the temporary moments into appropriate neighboring boxes. 538 DO jj = 2, jpjm1 ! Flux from j to j+1 IF v GT 0. 539 DO ji = fs_2, fs_jpim1 540 zbt = zbet(ji,jj-1) 541 zbt1 = 1.0 - zbet(ji,jj-1) 542 psm(ji,jj,jl) = zbt * ( psm(ji,jj,jl) + zfm(ji,jj-1) ) + zbt1 * psm(ji,jj,jl) 543 zalf = zbt * zfm(ji,jj-1) / psm(ji,jj,jl) 544 zalf1 = 1.0 - zalf 545 ztemp = zalf * ps0(ji,jj,jl) - zalf1 * zf0(ji,jj-1) 546 ! 547 ps0(ji,jj,jl) = zbt * ( ps0(ji,jj,jl) + zf0(ji,jj-1) ) + zbt1 * ps0(ji,jj,jl) 548 psy(ji,jj,jl) = zbt * ( zalf * zfy(ji,jj-1) + zalf1 * psy(ji,jj,jl) + 3.0 * ztemp ) & 549 & + zbt1 * psy(ji,jj,jl) 550 psyy(ji,jj,jl) = zbt * ( zalf * zalf * zfyy(ji,jj-1) + zalf1 * zalf1 * psyy(ji,jj,jl) & 551 & + 5.0 * ( zalf * zalf1 * ( psy(ji,jj,jl) - zfy(ji,jj-1) ) - ( zalf1 - zalf ) * ztemp ) ) & 552 & + zbt1 * psyy(ji,jj,jl) 553 psxy(ji,jj,jl) = zbt * ( zalf * zfxy(ji,jj-1) + zalf1 * psxy(ji,jj,jl) & 554 & + 3.0 * (- zalf1 * zfx(ji,jj-1) + zalf * psx(ji,jj,jl) ) ) & 555 & + zbt1 * psxy(ji,jj,jl) 556 psx (ji,jj,jl) = zbt * ( psx (ji,jj,jl) + zfx (ji,jj-1) ) + zbt1 * psx (ji,jj,jl) 557 psxx(ji,jj,jl) = zbt * ( psxx(ji,jj,jl) + zfxx(ji,jj-1) ) + zbt1 * psxx(ji,jj,jl) 558 END DO 559 END DO 560 561 DO jj = 2, jpjm1 ! Flux from j+1 to j IF v LT 0. 562 DO ji = fs_2, fs_jpim1 563 zbt = zbet(ji,jj) 564 zbt1 = 1.0 - zbet(ji,jj) 565 psm(ji,jj,jl) = zbt * psm(ji,jj,jl) + zbt1 * ( psm(ji,jj,jl) + zfm(ji,jj) ) 566 zalf = zbt1 * zfm(ji,jj) / psm(ji,jj,jl) 567 zalf1 = 1.0 - zalf 568 ztemp = - zalf * ps0(ji,jj,jl) + zalf1 * zf0(ji,jj) 569 ! 570 ps0 (ji,jj,jl) = zbt * ps0 (ji,jj,jl) + zbt1 * ( ps0(ji,jj,jl) + zf0(ji,jj) ) 571 psy (ji,jj,jl) = zbt * psy (ji,jj,jl) + zbt1 * ( zalf * zfy(ji,jj) + zalf1 * psy(ji,jj,jl) + 3.0 * ztemp ) 572 psyy(ji,jj,jl) = zbt * psyy(ji,jj,jl) + zbt1 * ( zalf * zalf * zfyy(ji,jj) + zalf1 * zalf1 * psyy(ji,jj,jl) & 573 & + 5.0 * ( zalf * zalf1 * ( - psy(ji,jj,jl) + zfy(ji,jj) ) & 574 & + ( zalf1 - zalf ) * ztemp ) ) 575 psxy(ji,jj,jl) = zbt * psxy(ji,jj,jl) + zbt1 * ( zalf * zfxy(ji,jj) + zalf1 * psxy(ji,jj,jl) & 576 & + 3.0 * ( zalf1 * zfx(ji,jj) - zalf * psx(ji,jj,jl) ) ) 577 psx (ji,jj,jl) = zbt * psx (ji,jj,jl) + zbt1 * ( psx (ji,jj,jl) + zfx (ji,jj) ) 578 psxx(ji,jj,jl) = zbt * psxx(ji,jj,jl) + zbt1 * ( psxx(ji,jj,jl) + zfxx(ji,jj) ) 676 zpsm = psm (ji,jj,jl) ! optimization 677 zps0 = ps0 (ji,jj,jl) 678 zpsx = psx (ji,jj,jl) 679 zpsxx = psxx(ji,jj,jl) 680 zpsy = psy (ji,jj,jl) 681 zpsyy = psyy(ji,jj,jl) 682 zpsxy = psxy(ji,jj,jl) 683 ! 684 zpsm = zbt * zpsm + zbt1 * ( zpsm - zfm(ji,jj-1) ) 685 zps0 = zbt * zps0 + zbt1 * ( zps0 - zf0(ji,jj-1) ) 686 zpsy = zalg1q(ji,jj-1) * ( zpsy + 3.0 * zalg(ji,jj-1) * zpsyy ) 687 zpsyy = zalg1 (ji,jj-1) * zalg1q(ji,jj-1) * zpsyy 688 zpsx = zbt * zpsx + zbt1 * ( zpsx - zfx (ji,jj-1) ) 689 zpsxx = zbt * zpsxx + zbt1 * ( zpsxx - zfxx(ji,jj-1) ) 690 zpsxy = zalg1q(ji,jj-1) * zpsxy 691 692 ! Put the temporary moments into appropriate neighboring boxes. 693 ! ! Flux from j to j+1 IF v GT 0. 694 zbt = zbet(ji,jj-1) 695 zbt1 = 1.0 - zbet(ji,jj-1) 696 zpsm = zbt * ( zpsm + zfm(ji,jj-1) ) + zbt1 * zpsm 697 zalf = zbt * zfm(ji,jj-1) / zpsm 698 zalf1 = 1.0 - zalf 699 ztemp = zalf * zps0 - zalf1 * zf0(ji,jj-1) 700 ! 701 zps0 = zbt * ( zps0 + zf0(ji,jj-1) ) + zbt1 * zps0 702 zpsy = zbt * ( zalf * zfy(ji,jj-1) + zalf1 * zpsy + 3.0 * ztemp ) & 703 & + zbt1 * zpsy 704 zpsyy = zbt * ( zalf * zalf * zfyy(ji,jj-1) + zalf1 * zalf1 * zpsyy & 705 & + 5.0 * ( zalf * zalf1 * ( zpsy - zfy(ji,jj-1) ) - ( zalf1 - zalf ) * ztemp ) ) & 706 & + zbt1 * zpsyy 707 zpsxy = zbt * ( zalf * zfxy(ji,jj-1) + zalf1 * zpsxy & 708 & + 3.0 * (- zalf1 * zfx(ji,jj-1) + zalf * zpsx ) ) & 709 & + zbt1 * zpsxy 710 zpsx = zbt * ( zpsx + zfx (ji,jj-1) ) + zbt1 * zpsx 711 zpsxx = zbt * ( zpsxx + zfxx(ji,jj-1) ) + zbt1 * zpsxx 712 713 ! ! Flux from j+1 to j IF v LT 0. 714 zbt = zbet(ji,jj) 715 zbt1 = 1.0 - zbet(ji,jj) 716 zpsm = zbt * zpsm + zbt1 * ( zpsm + zfm(ji,jj) ) 717 zalf = zbt1 * zfm(ji,jj) / zpsm 718 zalf1 = 1.0 - zalf 719 ztemp = - zalf * zps0 + zalf1 * zf0(ji,jj) 720 ! 721 zps0 = zbt * zps0 + zbt1 * ( zps0 + zf0(ji,jj) ) 722 zpsy = zbt * zpsy + zbt1 * ( zalf * zfy(ji,jj) + zalf1 * zpsy + 3.0 * ztemp ) 723 zpsyy = zbt * zpsyy + zbt1 * ( zalf * zalf * zfyy(ji,jj) + zalf1 * zalf1 * zpsyy & 724 & + 5.0 * ( zalf * zalf1 * ( - zpsy + zfy(ji,jj) ) & 725 & + ( zalf1 - zalf ) * ztemp ) ) 726 zpsxy = zbt * zpsxy + zbt1 * ( zalf * zfxy(ji,jj) + zalf1 * zpsxy & 727 & + 3.0 * ( zalf1 * zfx(ji,jj) - zalf * zpsx ) ) 728 zpsx = zbt * zpsx + zbt1 * ( zpsx + zfx (ji,jj) ) 729 zpsxx = zbt * zpsxx + zbt1 * ( zpsxx + zfxx(ji,jj) ) 730 ! 731 psm (ji,jj,jl) = zpsm ! optimization 732 ps0 (ji,jj,jl) = zps0 733 psx (ji,jj,jl) = zpsx 734 psxx(ji,jj,jl) = zpsxx 735 psy (ji,jj,jl) = zpsy 736 psyy(ji,jj,jl) = zpsyy 737 psxy(ji,jj,jl) = zpsxy 579 738 END DO 580 739 END DO 581 740 582 741 END DO 583 584 !-- Lateral boundary conditions585 CALL lbc_lnk_multi( 'icedyn_adv_pra', psm(:,:,1:jcat) , 'T', 1., ps0 , 'T', 1. &586 & , psx , 'T', -1., psy , 'T', -1. & ! caution gradient ==> the sign changes587 & , psxx , 'T', 1., psyy, 'T', 1. , psxy, 'T', 1. )588 742 ! 589 743 END SUBROUTINE adv_y 744 745 746 SUBROUTINE Hbig( pdt, phi_max, phs_max, phip_max, psi_max, pes_max, pei_max, & 747 & pv_i, pv_s, pa_i, pa_ip, pv_ip, psv_i, pe_s, pe_i ) 748 !!------------------------------------------------------------------- 749 !! *** ROUTINE Hbig *** 750 !! 751 !! ** Purpose : Thickness correction in case advection scheme creates 752 !! abnormally tick ice or snow 753 !! 754 !! ** Method : 1- check whether ice thickness is larger than the surrounding 9-points 755 !! (before advection) and reduce it by adapting ice concentration 756 !! 2- check whether snow thickness is larger than the surrounding 9-points 757 !! (before advection) and reduce it by sending the excess in the ocean 758 !! 759 !! ** input : Max thickness of the surrounding 9-points 760 !!------------------------------------------------------------------- 761 REAL(wp) , INTENT(in ) :: pdt ! tracer time-step 762 REAL(wp), DIMENSION(:,:,:) , INTENT(in ) :: phi_max, phs_max, phip_max, psi_max ! max ice thick from surrounding 9-pts 763 REAL(wp), DIMENSION(:,:,:,:), INTENT(in ) :: pes_max 764 REAL(wp), DIMENSION(:,:,:,:), INTENT(in ) :: pei_max 765 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pv_i, pv_s, pa_i, pa_ip, pv_ip, psv_i 766 REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) :: pe_s 767 REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) :: pe_i 768 ! 769 INTEGER :: ji, jj, jk, jl ! dummy loop indices 770 REAL(wp) :: z1_dt, zhip, zhi, zhs, zsi, zes, zei, zfra 771 !!------------------------------------------------------------------- 772 ! 773 z1_dt = 1._wp / pdt 774 ! 775 DO jl = 1, jpl 776 DO jj = 1, jpj 777 DO ji = 1, jpi 778 IF ( pv_i(ji,jj,jl) > 0._wp ) THEN 779 ! 780 ! ! -- check h_ip -- ! 781 ! if h_ip is larger than the surrounding 9 pts => reduce h_ip and increase a_ip 782 IF( ln_pnd_LEV .AND. pv_ip(ji,jj,jl) > 0._wp ) THEN 783 zhip = pv_ip(ji,jj,jl) / MAX( epsi20, pa_ip(ji,jj,jl) ) 784 IF( zhip > phip_max(ji,jj,jl) .AND. pa_ip(ji,jj,jl) < 0.15 ) THEN 785 pa_ip(ji,jj,jl) = pv_ip(ji,jj,jl) / phip_max(ji,jj,jl) 786 ENDIF 787 ENDIF 788 ! 789 ! ! -- check h_i -- ! 790 ! if h_i is larger than the surrounding 9 pts => reduce h_i and increase a_i 791 zhi = pv_i(ji,jj,jl) / pa_i(ji,jj,jl) 792 IF( zhi > phi_max(ji,jj,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN 793 pa_i(ji,jj,jl) = pv_i(ji,jj,jl) / MIN( phi_max(ji,jj,jl), hi_max(jpl) ) !-- bound h_i to hi_max (99 m) 794 ENDIF 795 ! 796 ! ! -- check h_s -- ! 797 ! if h_s is larger than the surrounding 9 pts => put the snow excess in the ocean 798 zhs = pv_s(ji,jj,jl) / pa_i(ji,jj,jl) 799 IF( pv_s(ji,jj,jl) > 0._wp .AND. zhs > phs_max(ji,jj,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN 800 zfra = phs_max(ji,jj,jl) / MAX( zhs, epsi20 ) 801 ! 802 wfx_res(ji,jj) = wfx_res(ji,jj) + ( pv_s(ji,jj,jl) - pa_i(ji,jj,jl) * phs_max(ji,jj,jl) ) * rhos * z1_dt 803 hfx_res(ji,jj) = hfx_res(ji,jj) - SUM( pe_s(ji,jj,1:nlay_s,jl) ) * ( 1._wp - zfra ) * z1_dt ! W.m-2 <0 804 ! 805 pe_s(ji,jj,1:nlay_s,jl) = pe_s(ji,jj,1:nlay_s,jl) * zfra 806 pv_s(ji,jj,jl) = pa_i(ji,jj,jl) * phs_max(ji,jj,jl) 807 ENDIF 808 ! 809 ! ! -- check s_i -- ! 810 ! if s_i is larger than the surrounding 9 pts => put salt excess in the ocean 811 zsi = psv_i(ji,jj,jl) / pv_i(ji,jj,jl) 812 IF( zsi > psi_max(ji,jj,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN 813 zfra = psi_max(ji,jj,jl) / zsi 814 sfx_res(ji,jj) = sfx_res(ji,jj) + psv_i(ji,jj,jl) * ( 1._wp - zfra ) * rhoi * z1_dt 815 psv_i(ji,jj,jl) = psv_i(ji,jj,jl) * zfra 816 ENDIF 817 ! 818 ENDIF 819 END DO 820 END DO 821 END DO 822 ! 823 ! ! -- check e_i/v_i -- ! 824 DO jl = 1, jpl 825 DO jk = 1, nlay_i 826 DO jj = 1, jpj 827 DO ji = 1, jpi 828 IF ( pv_i(ji,jj,jl) > 0._wp ) THEN 829 ! if e_i/v_i is larger than the surrounding 9 pts => put the heat excess in the ocean 830 zei = pe_i(ji,jj,jk,jl) / pv_i(ji,jj,jl) 831 IF( zei > pei_max(ji,jj,jk,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN 832 zfra = pei_max(ji,jj,jk,jl) / zei 833 hfx_res(ji,jj) = hfx_res(ji,jj) - pe_i(ji,jj,jk,jl) * ( 1._wp - zfra ) * z1_dt ! W.m-2 <0 834 pe_i(ji,jj,jk,jl) = pe_i(ji,jj,jk,jl) * zfra 835 ENDIF 836 ENDIF 837 END DO 838 END DO 839 END DO 840 END DO 841 ! ! -- check e_s/v_s -- ! 842 DO jl = 1, jpl 843 DO jk = 1, nlay_s 844 DO jj = 1, jpj 845 DO ji = 1, jpi 846 IF ( pv_s(ji,jj,jl) > 0._wp ) THEN 847 ! if e_s/v_s is larger than the surrounding 9 pts => put the heat excess in the ocean 848 zes = pe_s(ji,jj,jk,jl) / pv_s(ji,jj,jl) 849 IF( zes > pes_max(ji,jj,jk,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN 850 zfra = pes_max(ji,jj,jk,jl) / zes 851 hfx_res(ji,jj) = hfx_res(ji,jj) - pe_s(ji,jj,jk,jl) * ( 1._wp - zfra ) * z1_dt ! W.m-2 <0 852 pe_s(ji,jj,jk,jl) = pe_s(ji,jj,jk,jl) * zfra 853 ENDIF 854 ENDIF 855 END DO 856 END DO 857 END DO 858 END DO 859 ! 860 END SUBROUTINE Hbig 590 861 591 862 … … 659 930 & sxsal(jpi,jpj,jpl) , sysal(jpi,jpj,jpl) , sxxsal(jpi,jpj,jpl) , syysal(jpi,jpj,jpl) , sxysal(jpi,jpj,jpl) , & 660 931 & sxage(jpi,jpj,jpl) , syage(jpi,jpj,jpl) , sxxage(jpi,jpj,jpl) , syyage(jpi,jpj,jpl) , sxyage(jpi,jpj,jpl) , & 661 & sxap(jpi,jpj,jpl) , syap (jpi,jpj,jpl) , sxxap (jpi,jpj,jpl) , syyap (jpi,jpj,jpl) , sxyap (jpi,jpj,jpl) , & 662 & sxvp(jpi,jpj,jpl) , syvp (jpi,jpj,jpl) , sxxvp (jpi,jpj,jpl) , syyvp (jpi,jpj,jpl) , sxyvp (jpi,jpj,jpl) , & 932 & sxap (jpi,jpj,jpl) , syap (jpi,jpj,jpl) , sxxap (jpi,jpj,jpl) , syyap (jpi,jpj,jpl) , sxyap (jpi,jpj,jpl) , & 933 & sxvp (jpi,jpj,jpl) , syvp (jpi,jpj,jpl) , sxxvp (jpi,jpj,jpl) , syyvp (jpi,jpj,jpl) , sxyvp (jpi,jpj,jpl) , & 934 & sxvl (jpi,jpj,jpl) , syvl (jpi,jpj,jpl) , sxxvl (jpi,jpj,jpl) , syyvl (jpi,jpj,jpl) , sxyvl (jpi,jpj,jpl) , & 663 935 ! 664 936 & sxc0 (jpi,jpj,nlay_s,jpl) , syc0 (jpi,jpj,nlay_s,jpl) , sxxc0(jpi,jpj,nlay_s,jpl) , & … … 755 1027 END DO 756 1028 ! 757 IF( ln_pnd_H12 ) THEN ! melt pond fraction 758 CALL iom_get( numrir, jpdom_autoglo, 'sxap' , sxap ) 759 CALL iom_get( numrir, jpdom_autoglo, 'syap' , syap ) 760 CALL iom_get( numrir, jpdom_autoglo, 'sxxap', sxxap ) 761 CALL iom_get( numrir, jpdom_autoglo, 'syyap', syyap ) 762 CALL iom_get( numrir, jpdom_autoglo, 'sxyap', sxyap ) 763 ! ! melt pond volume 764 CALL iom_get( numrir, jpdom_autoglo, 'sxvp' , sxvp ) 765 CALL iom_get( numrir, jpdom_autoglo, 'syvp' , syvp ) 766 CALL iom_get( numrir, jpdom_autoglo, 'sxxvp', sxxvp ) 767 CALL iom_get( numrir, jpdom_autoglo, 'syyvp', syyvp ) 768 CALL iom_get( numrir, jpdom_autoglo, 'sxyvp', sxyvp ) 1029 IF( ln_pnd_LEV ) THEN ! melt pond fraction 1030 IF( iom_varid( numrir, 'sxap', ldstop = .FALSE. ) > 0 ) THEN 1031 CALL iom_get( numrir, jpdom_autoglo, 'sxap' , sxap ) 1032 CALL iom_get( numrir, jpdom_autoglo, 'syap' , syap ) 1033 CALL iom_get( numrir, jpdom_autoglo, 'sxxap', sxxap ) 1034 CALL iom_get( numrir, jpdom_autoglo, 'syyap', syyap ) 1035 CALL iom_get( numrir, jpdom_autoglo, 'sxyap', sxyap ) 1036 ! ! melt pond volume 1037 CALL iom_get( numrir, jpdom_autoglo, 'sxvp' , sxvp ) 1038 CALL iom_get( numrir, jpdom_autoglo, 'syvp' , syvp ) 1039 CALL iom_get( numrir, jpdom_autoglo, 'sxxvp', sxxvp ) 1040 CALL iom_get( numrir, jpdom_autoglo, 'syyvp', syyvp ) 1041 CALL iom_get( numrir, jpdom_autoglo, 'sxyvp', sxyvp ) 1042 ELSE 1043 sxap = 0._wp ; syap = 0._wp ; sxxap = 0._wp ; syyap = 0._wp ; sxyap = 0._wp ! melt pond fraction 1044 sxvp = 0._wp ; syvp = 0._wp ; sxxvp = 0._wp ; syyvp = 0._wp ; sxyvp = 0._wp ! melt pond volume 1045 ENDIF 1046 ! 1047 IF ( ln_pnd_lids ) THEN ! melt pond lid volume 1048 IF( iom_varid( numrir, 'sxvl', ldstop = .FALSE. ) > 0 ) THEN 1049 CALL iom_get( numrir, jpdom_autoglo, 'sxvl' , sxvl ) 1050 CALL iom_get( numrir, jpdom_autoglo, 'syvl' , syvl ) 1051 CALL iom_get( numrir, jpdom_autoglo, 'sxxvl', sxxvl ) 1052 CALL iom_get( numrir, jpdom_autoglo, 'syyvl', syyvl ) 1053 CALL iom_get( numrir, jpdom_autoglo, 'sxyvl', sxyvl ) 1054 ELSE 1055 sxvl = 0._wp; syvl = 0._wp ; sxxvl = 0._wp ; syyvl = 0._wp ; sxyvl = 0._wp ! melt pond lid volume 1056 ENDIF 1057 ENDIF 769 1058 ENDIF 770 1059 ! … … 780 1069 sxc0 = 0._wp ; syc0 = 0._wp ; sxxc0 = 0._wp ; syyc0 = 0._wp ; sxyc0 = 0._wp ! snow layers heat content 781 1070 sxe = 0._wp ; sye = 0._wp ; sxxe = 0._wp ; syye = 0._wp ; sxye = 0._wp ! ice layers heat content 782 IF( ln_pnd_H12 ) THEN 783 sxap = 0._wp ; syap = 0._wp ; sxxap = 0._wp ; syyap = 0._wp ; sxyap = 0._wp ! melt pond fraction 784 sxvp = 0._wp ; syvp = 0._wp ; sxxvp = 0._wp ; syyvp = 0._wp ; sxyvp = 0._wp ! melt pond volume 1071 IF( ln_pnd_LEV ) THEN 1072 sxap = 0._wp ; syap = 0._wp ; sxxap = 0._wp ; syyap = 0._wp ; sxyap = 0._wp ! melt pond fraction 1073 sxvp = 0._wp ; syvp = 0._wp ; sxxvp = 0._wp ; syyvp = 0._wp ; sxyvp = 0._wp ! melt pond volume 1074 IF ( ln_pnd_lids ) THEN 1075 sxvl = 0._wp; syvl = 0._wp ; sxxvl = 0._wp ; syyvl = 0._wp ; sxyvl = 0._wp ! melt pond lid volume 1076 ENDIF 785 1077 ENDIF 786 1078 ENDIF … … 845 1137 END DO 846 1138 ! 847 IF( ln_pnd_ H12) THEN ! melt pond fraction1139 IF( ln_pnd_LEV ) THEN ! melt pond fraction 848 1140 CALL iom_rstput( iter, nitrst, numriw, 'sxap' , sxap ) 849 1141 CALL iom_rstput( iter, nitrst, numriw, 'syap' , syap ) … … 857 1149 CALL iom_rstput( iter, nitrst, numriw, 'syyvp', syyvp ) 858 1150 CALL iom_rstput( iter, nitrst, numriw, 'sxyvp', sxyvp ) 1151 ! 1152 IF ( ln_pnd_lids ) THEN ! melt pond lid volume 1153 CALL iom_rstput( iter, nitrst, numriw, 'sxvl' , sxvl ) 1154 CALL iom_rstput( iter, nitrst, numriw, 'syvl' , syvl ) 1155 CALL iom_rstput( iter, nitrst, numriw, 'sxxvl', sxxvl ) 1156 CALL iom_rstput( iter, nitrst, numriw, 'syyvl', syyvl ) 1157 CALL iom_rstput( iter, nitrst, numriw, 'sxyvl', sxyvl ) 1158 ENDIF 859 1159 ENDIF 860 1160 ! … … 863 1163 END SUBROUTINE adv_pra_rst 864 1164 1165 SUBROUTINE icemax3D( pice , pmax ) 1166 !!--------------------------------------------------------------------- 1167 !! *** ROUTINE icemax3D *** 1168 !! ** Purpose : compute the max of the 9 points around 1169 !!---------------------------------------------------------------------- 1170 REAL(wp), DIMENSION(:,:,:) , INTENT(in ) :: pice ! input 1171 REAL(wp), DIMENSION(:,:,:) , INTENT(out) :: pmax ! output 1172 REAL(wp), DIMENSION(2:jpim1,jpj) :: zmax ! temporary array 1173 INTEGER :: ji, jj, jl ! dummy loop indices 1174 !!---------------------------------------------------------------------- 1175 DO jl = 1, jpl 1176 DO jj = 1, jpj 1177 DO ji = 2, jpim1 1178 zmax(ji,jj) = MAX( epsi20, pice(ji,jj,jl), pice(ji-1,jj,jl), pice(ji+1,jj,jl) ) 1179 END DO 1180 END DO 1181 DO jj = 2, jpjm1 1182 DO ji = 2, jpim1 1183 pmax(ji,jj,jl) = MAX( epsi20, zmax(ji,jj), zmax(ji,jj-1), zmax(ji,jj+1) ) 1184 END DO 1185 END DO 1186 END DO 1187 END SUBROUTINE icemax3D 1188 1189 SUBROUTINE icemax4D( pice , pmax ) 1190 !!--------------------------------------------------------------------- 1191 !! *** ROUTINE icemax4D *** 1192 !! ** Purpose : compute the max of the 9 points around 1193 !!---------------------------------------------------------------------- 1194 REAL(wp), DIMENSION(:,:,:,:) , INTENT(in ) :: pice ! input 1195 REAL(wp), DIMENSION(:,:,:,:) , INTENT(out) :: pmax ! output 1196 REAL(wp), DIMENSION(2:jpim1,jpj) :: zmax ! temporary array 1197 INTEGER :: jlay, ji, jj, jk, jl ! dummy loop indices 1198 !!---------------------------------------------------------------------- 1199 jlay = SIZE( pice , 3 ) ! size of input arrays 1200 DO jl = 1, jpl 1201 DO jk = 1, jlay 1202 DO jj = 1, jpj 1203 DO ji = 2, jpim1 1204 zmax(ji,jj) = MAX( epsi20, pice(ji,jj,jk,jl), pice(ji-1,jj,jk,jl), pice(ji+1,jj,jk,jl) ) 1205 END DO 1206 END DO 1207 DO jj = 2, jpjm1 1208 DO ji = 2, jpim1 1209 pmax(ji,jj,jk,jl) = MAX( epsi20, zmax(ji,jj), zmax(ji,jj-1), zmax(ji,jj+1) ) 1210 END DO 1211 END DO 1212 END DO 1213 END DO 1214 END SUBROUTINE icemax4D 1215 865 1216 #else 866 1217 !!----------------------------------------------------------------------
Note: See TracChangeset
for help on using the changeset viewer.