Changeset 14037 for NEMO/branches/2020/dev_r13333_KERNEL-08_techene_gm_HPG_SPG/src/ICE/icedyn_adv_pra.F90
- Timestamp:
- 2020-12-03T12:20:38+01:00 (3 years ago)
- Location:
- NEMO/branches/2020/dev_r13333_KERNEL-08_techene_gm_HPG_SPG
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2020/dev_r13333_KERNEL-08_techene_gm_HPG_SPG
- Property svn:externals
-
old new 8 8 9 9 # SETTE 10 ^/utils/CI/sette @13292sette10 ^/utils/CI/sette_wave@13990 sette
-
- Property svn:externals
-
NEMO/branches/2020/dev_r13333_KERNEL-08_techene_gm_HPG_SPG/src/ICE/icedyn_adv_pra.F90
r13295 r14037 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 … … 55 56 56 57 SUBROUTINE ice_dyn_adv_pra( kt, pu_ice, pv_ice, ph_i, ph_s, ph_ip, & 57 & pato_i, pv_i, pv_s, psv_i, poa_i, pa_i, pa_ip, pv_ip, p e_s, pe_i )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 ** … … 81 82 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pa_ip ! melt pond fraction 82 83 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pv_ip ! melt pond volume 84 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pv_il ! melt pond lid thickness 83 85 REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) :: pe_s ! snw heat content 84 86 REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) :: pe_i ! ice heat content 85 87 ! 86 INTEGER :: ji, jj, jk, jl, jt! dummy loop indices88 INTEGER :: ji, jj, jk, jl, jt ! dummy loop indices 87 89 INTEGER :: icycle ! number of sub-timestep for the advection 88 REAL(wp) :: zdt 90 REAL(wp) :: zdt, z1_dt ! - - 89 91 REAL(wp), DIMENSION(1) :: zcflprv, zcflnow ! for global communication 90 92 REAL(wp), DIMENSION(jpi,jpj) :: zati1, zati2 91 93 REAL(wp), DIMENSION(jpi,jpj) :: zudy, zvdx 92 REAL(wp), DIMENSION(jpi,jpj,jpl) :: zhi_max, zhs_max, zhip_max 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 93 97 REAL(wp), DIMENSION(jpi,jpj,jpl) :: zarea 94 98 REAL(wp), DIMENSION(jpi,jpj,jpl) :: z0ice, z0snw, z0ai, z0smi, z0oi 95 REAL(wp), DIMENSION(jpi,jpj,jpl) :: z0ap , z0vp 99 REAL(wp), DIMENSION(jpi,jpj,jpl) :: z0ap , z0vp, z0vl 96 100 REAL(wp), DIMENSION(jpi,jpj,nlay_s,jpl) :: z0es 97 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 98 104 !!---------------------------------------------------------------------- 99 105 ! 100 106 IF( kt == nit000 .AND. lwp ) WRITE(numout,*) '-- ice_dyn_adv_pra: Prather advection scheme' 101 107 ! 102 ! --- Record max of the surrounding 9-pts ice thick.(for call Hbig) --- !103 DO jl = 1, jpl104 DO_2D( 0, 0, 0, 0)105 zhip_max(ji,jj,jl) = MAX( epsi20, ph_ip(ji,jj,jl), ph_ip(ji+1,jj ,jl), ph_ip(ji ,jj+1,jl), &106 & ph_ip(ji-1,jj ,jl), ph_ip(ji ,jj-1,jl), &107 & ph_ip(ji+1,jj+1,jl), ph_ip(ji-1,jj-1,jl), &108 & ph_ip(ji+1,jj-1,jl), ph_ip(ji-1,jj+1,jl))109 zhi_max (ji,jj,jl) = MAX( epsi20, ph_i (ji,jj,jl), ph_i (ji+1,jj ,jl), ph_i (ji ,jj+1,jl), &110 & ph_i (ji-1,jj ,jl), ph_i (ji ,jj-1,jl), &111 & ph_i (ji+1,jj+1,jl), ph_i (ji-1,jj-1,jl), &112 & ph_i (ji+1,jj-1,jl), ph_i (ji-1,jj+1,jl) )113 zhs_max (ji,jj,jl) = MAX( epsi20, ph_s (ji,jj,jl), ph_s (ji+1,jj ,jl), ph_s (ji ,jj+1,jl), &114 & ph_s (ji-1,jj ,jl), ph_s (ji ,jj-1,jl), &115 & ph_s (ji+1,jj+1,jl), ph_s (ji-1,jj-1,jl), &116 & ph_s (ji+1,jj-1,jl), ph_s (ji-1,jj+1,jl) )117 END _2D108 ! --- 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._wp, zhs_max, 'T', 1._wp, zhip_max, 'T', 1._wp, zsi_max, 'T', 1._wp ) 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 118 124 END DO 119 CALL lbc_lnk_multi( 'icedyn_adv_pra', zhi_max, 'T', 1.0_wp, zhs_max, 'T', 1.0_wp, zhip_max, 'T', 1.0_wp ) 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._wp ) 133 CALL lbc_lnk( 'icedyn_adv_pra', zes_max, 'T', 1._wp ) 134 ! 120 135 ! 121 136 ! --- If ice drift is too fast, use subtime steps for advection (CFL test for stability) --- ! … … 132 147 ENDIF 133 148 zdt = rDt_ice / REAL(icycle) 149 z1_dt = 1._wp / zdt 134 150 135 151 ! --- transport --- ! … … 138 154 139 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 & + SUM( pv_ip(:,:,:) , dim=3 ) * rhow + SUM( pv_il(:,:,:) , dim=3 ) * rhow 160 zdiag_adv_salt(:,:) = SUM( psv_i(:,:,:) , dim=3 ) * rhoi 161 zdiag_adv_heat(:,:) = - SUM(SUM( pe_i(:,:,1:nlay_i,:) , dim=4 ), dim=3 ) & 162 & - SUM(SUM( pe_s(:,:,1:nlay_s,:) , dim=4 ), dim=3 ) 140 163 141 164 ! record at_i before advection (for open water) … … 156 179 z0ei(:,:,jk,jl) = pe_i(:,:,jk,jl) * e1e2t(:,:) ! Ice heat content 157 180 END DO 158 IF ( ln_pnd_H12 ) THEN 159 z0ap(:,:,jl) = pa_ip(:,:,jl) * e1e2t(:,:) ! Melt pond fraction 160 z0vp(:,:,jl) = pv_ip(:,:,jl) * e1e2t(:,:) ! Melt pond volume 181 IF ( ln_pnd_LEV .OR. ln_pnd_TOPO ) THEN 182 z0ap(:,:,jl) = pa_ip(:,:,jl) * e1e2t(:,:) ! Melt pond fraction 183 z0vp(:,:,jl) = pv_ip(:,:,jl) * e1e2t(:,:) ! Melt pond volume 184 IF ( ln_pnd_lids ) THEN 185 z0vl(:,:,jl) = pv_il(:,:,jl) * e1e2t(:,:) ! Melt pond lid volume 186 ENDIF 161 187 ENDIF 162 188 END DO … … 189 215 END DO 190 216 ! 191 IF ( ln_pnd_ H12) THEN217 IF ( ln_pnd_LEV .OR. ln_pnd_TOPO ) THEN 192 218 CALL adv_x( zdt , zudy , 1._wp , zarea , z0ap , sxap , sxxap , syap , syyap , sxyap ) !--- melt pond fraction 193 219 CALL adv_y( zdt , zvdx , 0._wp , zarea , z0ap , sxap , sxxap , syap , syyap , sxyap ) 194 220 CALL adv_x( zdt , zudy , 1._wp , zarea , z0vp , sxvp , sxxvp , syvp , syyvp , sxyvp ) !--- melt pond volume 195 221 CALL adv_y( zdt , zvdx , 0._wp , zarea , z0vp , sxvp , sxxvp , syvp , syyvp , sxyvp ) 222 IF ( ln_pnd_lids ) THEN 223 CALL adv_x( zdt , zudy , 1._wp , zarea , z0vl , sxvl , sxxvl , syvl , syyvl , sxyvl ) !--- melt pond lid volume 224 CALL adv_y( zdt , zvdx , 0._wp , zarea , z0vl , sxvl , sxxvl , syvl , syyvl , sxyvl ) 225 ENDIF 196 226 ENDIF 197 227 ! !--------------------------------------------! … … 220 250 & sxxe(:,:,jk,:), sye(:,:,jk,:), syye(:,:,jk,:), sxye(:,:,jk,:) ) 221 251 END DO 222 IF ( ln_pnd_ H12) THEN252 IF ( ln_pnd_LEV .OR. ln_pnd_TOPO ) THEN 223 253 CALL adv_y( zdt , zvdx , 1._wp , zarea , z0ap , sxap , sxxap , syap , syyap , sxyap ) !--- melt pond fraction 224 254 CALL adv_x( zdt , zudy , 0._wp , zarea , z0ap , sxap , sxxap , syap , syyap , sxyap ) 225 255 CALL adv_y( zdt , zvdx , 1._wp , zarea , z0vp , sxvp , sxxvp , syvp , syyvp , sxyvp ) !--- melt pond volume 226 256 CALL adv_x( zdt , zudy , 0._wp , zarea , z0vp , sxvp , sxxvp , syvp , syyvp , sxyvp ) 257 IF ( ln_pnd_lids ) THEN 258 CALL adv_y( zdt , zvdx , 1._wp , zarea , z0vl , sxvl , sxxvl , syvl , syyvl , sxyvl ) !--- melt pond lid volume 259 CALL adv_x( zdt , zudy , 0._wp , zarea , z0vl , sxvl , sxxvl , syvl , syyvl , sxyvl ) 260 ENDIF 227 261 ENDIF 228 262 ! 263 ENDIF 264 265 ! --- Lateral boundary conditions --- ! 266 ! caution: for gradients (sx and sy) the sign changes 267 CALL lbc_lnk_multi( 'icedyn_adv_pra', z0ice , 'T', 1._wp, sxice , 'T', -1._wp, syice , 'T', -1._wp & ! ice volume 268 & , sxxice, 'T', 1._wp, syyice, 'T', 1._wp, sxyice, 'T', 1._wp & 269 & , z0snw , 'T', 1._wp, sxsn , 'T', -1._wp, sysn , 'T', -1._wp & ! snw volume 270 & , sxxsn , 'T', 1._wp, syysn , 'T', 1._wp, sxysn , 'T', 1._wp ) 271 CALL lbc_lnk_multi( 'icedyn_adv_pra', z0smi , 'T', 1._wp, sxsal , 'T', -1._wp, sysal , 'T', -1._wp & ! ice salinity 272 & , sxxsal, 'T', 1._wp, syysal, 'T', 1._wp, sxysal, 'T', 1._wp & 273 & , z0ai , 'T', 1._wp, sxa , 'T', -1._wp, sya , 'T', -1._wp & ! ice concentration 274 & , sxxa , 'T', 1._wp, syya , 'T', 1._wp, sxya , 'T', 1._wp ) 275 CALL lbc_lnk_multi( 'icedyn_adv_pra', z0oi , 'T', 1._wp, sxage , 'T', -1._wp, syage , 'T', -1._wp & ! ice age 276 & , sxxage, 'T', 1._wp, syyage, 'T', 1._wp, sxyage, 'T', 1._wp ) 277 CALL lbc_lnk_multi( 'icedyn_adv_pra', z0es , 'T', 1._wp, sxc0 , 'T', -1._wp, syc0 , 'T', -1._wp & ! snw enthalpy 278 & , sxxc0 , 'T', 1._wp, syyc0 , 'T', 1._wp, sxyc0 , 'T', 1._wp ) 279 CALL lbc_lnk_multi( 'icedyn_adv_pra', z0ei , 'T', 1._wp, sxe , 'T', -1._wp, sye , 'T', -1._wp & ! ice enthalpy 280 & , sxxe , 'T', 1._wp, syye , 'T', 1._wp, sxye , 'T', 1._wp ) 281 IF ( ln_pnd_LEV .OR. ln_pnd_TOPO ) THEN 282 CALL lbc_lnk_multi( 'icedyn_adv_pra', z0ap , 'T', 1._wp, sxap , 'T', -1._wp, syap , 'T', -1._wp & ! melt pond fraction 283 & , sxxap, 'T', 1._wp, syyap, 'T', 1._wp, sxyap, 'T', 1._wp & 284 & , z0vp , 'T', 1._wp, sxvp , 'T', -1._wp, syvp , 'T', -1._wp & ! melt pond volume 285 & , sxxvp, 'T', 1._wp, syyvp, 'T', 1._wp, sxyvp, 'T', 1._wp ) 286 IF ( ln_pnd_lids ) THEN 287 CALL lbc_lnk_multi( 'icedyn_adv_pra', z0vl ,'T', 1._wp, sxvl ,'T', -1._wp, syvl ,'T', -1._wp & ! melt pond lid volume 288 & , sxxvl,'T', 1._wp, syyvl,'T', 1._wp, sxyvl,'T', 1._wp ) 289 ENDIF 229 290 ENDIF 230 291 … … 242 303 pe_i(:,:,jk,jl) = z0ei(:,:,jk,jl) * r1_e1e2t(:,:) * tmask(:,:,1) 243 304 END DO 244 IF ( ln_pnd_ H12) THEN305 IF ( ln_pnd_LEV .OR. ln_pnd_TOPO ) THEN 245 306 pa_ip(:,:,jl) = z0ap(:,:,jl) * r1_e1e2t(:,:) * tmask(:,:,1) 246 307 pv_ip(:,:,jl) = z0vp(:,:,jl) * r1_e1e2t(:,:) * tmask(:,:,1) 308 IF ( ln_pnd_lids ) THEN 309 pv_il(:,:,jl) = z0vl(:,:,jl) * r1_e1e2t(:,:) * tmask(:,:,1) 310 ENDIF 247 311 ENDIF 248 312 END DO … … 256 320 CALL lbc_lnk( 'icedyn_adv_pra', pato_i, 'T', 1.0_wp ) 257 321 ! 322 ! --- diagnostics --- ! 323 diag_adv_mass(:,:) = diag_adv_mass(:,:) + ( SUM( pv_i (:,:,:) , dim=3 ) * rhoi + SUM( pv_s (:,:,:) , dim=3 ) * rhos & 324 & + SUM( pv_ip(:,:,:) , dim=3 ) * rhow + SUM( pv_il(:,:,:) , dim=3 ) * rhow & 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 ! 258 332 ! --- Ensure non-negative fields --- ! 259 333 ! Remove negative values (conservation is ensured) 260 334 ! (because advected fields are not perfectly bounded and tiny negative values can occur, e.g. -1.e-20) 261 CALL ice_var_zapneg( zdt, pato_i, pv_i, pv_s, psv_i, poa_i, pa_i, pa_ip, pv_ip, p e_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 ) 262 336 ! 263 337 ! --- Make sure ice thickness is not too big --- ! 264 338 ! (because ice thickness can be too large where ice concentration is very small) 265 CALL Hbig( zdt, zhi_max, zhs_max, zhip_max, pv_i, pv_s, pa_i, pa_ip, pv_ip, pe_s ) 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 ) 266 341 ! 267 342 ! --- Ensure snow load is not too big --- ! … … 292 367 !! 293 368 INTEGER :: ji, jj, jl, jcat ! dummy loop indices 369 INTEGER :: jj0 ! dummy loop indices 294 370 REAL(wp) :: zs1max, zslpmax, ztemp ! local scalars 295 371 REAL(wp) :: zs1new, zalf , zalfq , zbt ! - - 296 372 REAL(wp) :: zs2new, zalf1, zalf1q, zbt1 ! - - 373 REAL(wp) :: zpsm, zps0 374 REAL(wp) :: zpsx, zpsy, zpsxx, zpsyy, zpsxy 297 375 REAL(wp), DIMENSION(jpi,jpj) :: zf0 , zfx , zfy , zbet ! 2D workspace 298 376 REAL(wp), DIMENSION(jpi,jpj) :: zfm , zfxx , zfyy , zfxy ! - - 299 377 REAL(wp), DIMENSION(jpi,jpj) :: zalg, zalg1, zalg1q ! - - 300 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 jj0 = NINT(pcrh) 301 383 ! 302 384 jcat = SIZE( ps0 , 3 ) ! size of input arrays … … 305 387 ! 306 388 ! Limitation of moments. 307 DO_2D( 0, 0, 1, 1 ) 308 ! Initialize volumes of boxes (=area if adv_x first called, =psm otherwise) 309 psm (ji,jj,jl) = MAX( pcrh * e1e2t(ji,jj) + ( 1.0 - pcrh ) * psm(ji,jj,jl) , epsi20 ) 310 ! 311 zslpmax = MAX( 0._wp, ps0(ji,jj,jl) ) 312 zs1max = 1.5 * zslpmax 313 zs1new = MIN( zs1max, MAX( -zs1max, psx(ji,jj,jl) ) ) 314 zs2new = MIN( 2.0 * zslpmax - 0.3334 * ABS( zs1new ), & 315 & MAX( ABS( zs1new ) - zslpmax, psxx(ji,jj,jl) ) ) 316 rswitch = ( 1.0 - MAX( 0._wp, SIGN( 1._wp, -zslpmax) ) ) * tmask(ji,jj,1) ! Case of empty boxes & Apply mask 317 318 ps0 (ji,jj,jl) = zslpmax 319 psx (ji,jj,jl) = zs1new * rswitch 320 psxx(ji,jj,jl) = zs2new * rswitch 321 psy (ji,jj,jl) = psy (ji,jj,jl) * rswitch 322 psyy(ji,jj,jl) = psyy(ji,jj,jl) * rswitch 323 psxy(ji,jj,jl) = MIN( zslpmax, MAX( -zslpmax, psxy(ji,jj,jl) ) ) * rswitch 324 END_2D 325 326 ! Calculate fluxes and moments between boxes i<-->i+1 327 DO_2D( 0, 0, 1, 1 ) 328 zbet(ji,jj) = MAX( 0._wp, SIGN( 1._wp, put(ji,jj) ) ) 329 zalf = MAX( 0._wp, put(ji,jj) ) * pdt / psm(ji,jj,jl) 330 zalfq = zalf * zalf 331 zalf1 = 1.0 - zalf 332 zalf1q = zalf1 * zalf1 333 ! 334 zfm (ji,jj) = zalf * psm (ji,jj,jl) 335 zf0 (ji,jj) = zalf * ( ps0 (ji,jj,jl) + zalf1 * ( psx(ji,jj,jl) + (zalf1 - zalf) * psxx(ji,jj,jl) ) ) 336 zfx (ji,jj) = zalfq * ( psx (ji,jj,jl) + 3.0 * zalf1 * psxx(ji,jj,jl) ) 337 zfxx(ji,jj) = zalf * psxx(ji,jj,jl) * zalfq 338 zfy (ji,jj) = zalf * ( psy (ji,jj,jl) + zalf1 * psxy(ji,jj,jl) ) 339 zfxy(ji,jj) = zalfq * psxy(ji,jj,jl) 340 zfyy(ji,jj) = zalf * psyy(ji,jj,jl) 341 342 ! Readjust moments remaining in the box. 343 psm (ji,jj,jl) = psm (ji,jj,jl) - zfm(ji,jj) 344 ps0 (ji,jj,jl) = ps0 (ji,jj,jl) - zf0(ji,jj) 345 psx (ji,jj,jl) = zalf1q * ( psx(ji,jj,jl) - 3.0 * zalf * psxx(ji,jj,jl) ) 346 psxx(ji,jj,jl) = zalf1 * zalf1q * psxx(ji,jj,jl) 347 psy (ji,jj,jl) = psy (ji,jj,jl) - zfy(ji,jj) 348 psyy(ji,jj,jl) = psyy(ji,jj,jl) - zfyy(ji,jj) 349 psxy(ji,jj,jl) = zalf1q * psxy(ji,jj,jl) 350 END_2D 351 352 DO_2D( 0, 0, 1, 0 ) 353 zalf = MAX( 0._wp, -put(ji,jj) ) * pdt / psm(ji+1,jj,jl) 354 zalg (ji,jj) = zalf 355 zalfq = zalf * zalf 356 zalf1 = 1.0 - zalf 357 zalg1 (ji,jj) = zalf1 358 zalf1q = zalf1 * zalf1 359 zalg1q(ji,jj) = zalf1q 360 ! 361 zfm (ji,jj) = zfm (ji,jj) + zalf * psm (ji+1,jj,jl) 362 zf0 (ji,jj) = zf0 (ji,jj) + zalf * ( ps0 (ji+1,jj,jl) & 363 & - zalf1 * ( psx(ji+1,jj,jl) - (zalf1 - zalf ) * psxx(ji+1,jj,jl) ) ) 364 zfx (ji,jj) = zfx (ji,jj) + zalfq * ( psx (ji+1,jj,jl) - 3.0 * zalf1 * psxx(ji+1,jj,jl) ) 365 zfxx (ji,jj) = zfxx(ji,jj) + zalf * psxx(ji+1,jj,jl) * zalfq 366 zfy (ji,jj) = zfy (ji,jj) + zalf * ( psy (ji+1,jj,jl) - zalf1 * psxy(ji+1,jj,jl) ) 367 zfxy (ji,jj) = zfxy(ji,jj) + zalfq * psxy(ji+1,jj,jl) 368 zfyy (ji,jj) = zfyy(ji,jj) + zalf * psyy(ji+1,jj,jl) 369 END_2D 370 371 DO_2D( 0, 0, 0, 0 ) 372 zbt = zbet(ji-1,jj) 373 zbt1 = 1.0 - zbet(ji-1,jj) 374 ! 375 psm (ji,jj,jl) = zbt * psm(ji,jj,jl) + zbt1 * ( psm(ji,jj,jl) - zfm(ji-1,jj) ) 376 ps0 (ji,jj,jl) = zbt * ps0(ji,jj,jl) + zbt1 * ( ps0(ji,jj,jl) - zf0(ji-1,jj) ) 377 psx (ji,jj,jl) = zalg1q(ji-1,jj) * ( psx(ji,jj,jl) + 3.0 * zalg(ji-1,jj) * psxx(ji,jj,jl) ) 378 psxx(ji,jj,jl) = zalg1 (ji-1,jj) * zalg1q(ji-1,jj) * psxx(ji,jj,jl) 379 psy (ji,jj,jl) = zbt * psy (ji,jj,jl) + zbt1 * ( psy (ji,jj,jl) - zfy (ji-1,jj) ) 380 psyy(ji,jj,jl) = zbt * psyy(ji,jj,jl) + zbt1 * ( psyy(ji,jj,jl) - zfyy(ji-1,jj) ) 381 psxy(ji,jj,jl) = zalg1q(ji-1,jj) * psxy(ji,jj,jl) 382 END_2D 383 384 ! Put the temporary moments into appropriate neighboring boxes. 385 DO_2D( 0, 0, 0, 0 ) 386 zbt = zbet(ji-1,jj) 387 zbt1 = 1.0 - zbet(ji-1,jj) 388 psm(ji,jj,jl) = zbt * ( psm(ji,jj,jl) + zfm(ji-1,jj) ) + zbt1 * psm(ji,jj,jl) 389 zalf = zbt * zfm(ji-1,jj) / psm(ji,jj,jl) 390 zalf1 = 1.0 - zalf 391 ztemp = zalf * ps0(ji,jj,jl) - zalf1 * zf0(ji-1,jj) 392 ! 393 ps0 (ji,jj,jl) = zbt * ( ps0(ji,jj,jl) + zf0(ji-1,jj) ) + zbt1 * ps0(ji,jj,jl) 394 psx (ji,jj,jl) = zbt * ( zalf * zfx(ji-1,jj) + zalf1 * psx(ji,jj,jl) + 3.0 * ztemp ) + zbt1 * psx(ji,jj,jl) 395 psxx(ji,jj,jl) = zbt * ( zalf * zalf * zfxx(ji-1,jj) + zalf1 * zalf1 * psxx(ji,jj,jl) & 396 & + 5.0 * ( zalf * zalf1 * ( psx (ji,jj,jl) - zfx(ji-1,jj) ) - ( zalf1 - zalf ) * ztemp ) ) & 397 & + zbt1 * psxx(ji,jj,jl) 398 psxy(ji,jj,jl) = zbt * ( zalf * zfxy(ji-1,jj) + zalf1 * psxy(ji,jj,jl) & 399 & + 3.0 * (- zalf1*zfy(ji-1,jj) + zalf * psy(ji,jj,jl) ) ) & 400 & + zbt1 * psxy(ji,jj,jl) 401 psy (ji,jj,jl) = zbt * ( psy (ji,jj,jl) + zfy (ji-1,jj) ) + zbt1 * psy (ji,jj,jl) 402 psyy(ji,jj,jl) = zbt * ( psyy(ji,jj,jl) + zfyy(ji-1,jj) ) + zbt1 * psyy(ji,jj,jl) 403 END_2D 404 405 DO_2D( 0, 0, 0, 0 ) 406 zbt = zbet(ji,jj) 407 zbt1 = 1.0 - zbet(ji,jj) 408 psm(ji,jj,jl) = zbt * psm(ji,jj,jl) + zbt1 * ( psm(ji,jj,jl) + zfm(ji,jj) ) 409 zalf = zbt1 * zfm(ji,jj) / psm(ji,jj,jl) 410 zalf1 = 1.0 - zalf 411 ztemp = - zalf * ps0(ji,jj,jl) + zalf1 * zf0(ji,jj) 412 ! 413 ps0 (ji,jj,jl) = zbt * ps0 (ji,jj,jl) + zbt1 * ( ps0(ji,jj,jl) + zf0(ji,jj) ) 414 psx (ji,jj,jl) = zbt * psx (ji,jj,jl) + zbt1 * ( zalf * zfx(ji,jj) + zalf1 * psx(ji,jj,jl) + 3.0 * ztemp ) 415 psxx(ji,jj,jl) = zbt * psxx(ji,jj,jl) + zbt1 * ( zalf * zalf * zfxx(ji,jj) + zalf1 * zalf1 * psxx(ji,jj,jl) & 416 & + 5.0 * ( zalf * zalf1 * ( - psx(ji,jj,jl) + zfx(ji,jj) ) & 417 & + ( zalf1 - zalf ) * ztemp ) ) 418 psxy(ji,jj,jl) = zbt * psxy(ji,jj,jl) + zbt1 * ( zalf * zfxy(ji,jj) + zalf1 * psxy(ji,jj,jl) & 419 & + 3.0 * ( zalf1 * zfy(ji,jj) - zalf * psy(ji,jj,jl) ) ) 420 psy (ji,jj,jl) = zbt * psy (ji,jj,jl) + zbt1 * ( psy (ji,jj,jl) + zfy (ji,jj) ) 421 psyy(ji,jj,jl) = zbt * psyy(ji,jj,jl) + zbt1 * ( psyy(ji,jj,jl) + zfyy(ji,jj) ) 422 END_2D 423 389 DO jj = Njs0 - jj0, Nje0 + jj0 390 391 DO ji = Nis0 - 1, Nie0 + 1 392 393 zpsm = psm (ji,jj,jl) ! optimization 394 zps0 = ps0 (ji,jj,jl) 395 zpsx = psx (ji,jj,jl) 396 zpsxx = psxx(ji,jj,jl) 397 zpsy = psy (ji,jj,jl) 398 zpsyy = psyy(ji,jj,jl) 399 zpsxy = psxy(ji,jj,jl) 400 401 ! Initialize volumes of boxes (=area if adv_x first called, =psm otherwise) 402 zpsm = MAX( pcrh * e1e2t(ji,jj) + ( 1.0 - pcrh ) * zpsm , epsi20 ) 403 ! 404 zslpmax = MAX( 0._wp, zps0 ) 405 zs1max = 1.5 * zslpmax 406 zs1new = MIN( zs1max, MAX( -zs1max, zpsx ) ) 407 zs2new = MIN( 2.0 * zslpmax - 0.3334 * ABS( zs1new ), MAX( ABS( zs1new ) - zslpmax, zpsxx ) ) 408 rswitch = ( 1.0 - MAX( 0._wp, SIGN( 1._wp, -zslpmax) ) ) * tmask(ji,jj,1) ! Case of empty boxes & Apply mask 409 410 zps0 = zslpmax 411 zpsx = zs1new * rswitch 412 zpsxx = zs2new * rswitch 413 zpsy = zpsy * rswitch 414 zpsyy = zpsyy * rswitch 415 zpsxy = MIN( zslpmax, MAX( -zslpmax, zpsxy ) ) * rswitch 416 417 ! Calculate fluxes and moments between boxes i<-->i+1 418 ! ! Flux from i to i+1 WHEN u GT 0 419 zbet(ji,jj) = MAX( 0._wp, SIGN( 1._wp, put(ji,jj) ) ) 420 zalf = MAX( 0._wp, put(ji,jj) ) * pdt / zpsm 421 zalfq = zalf * zalf 422 zalf1 = 1.0 - zalf 423 zalf1q = zalf1 * zalf1 424 ! 425 zfm (ji,jj) = zalf * zpsm 426 zf0 (ji,jj) = zalf * ( zps0 + zalf1 * ( zpsx + (zalf1 - zalf) * zpsxx ) ) 427 zfx (ji,jj) = zalfq * ( zpsx + 3.0 * zalf1 * zpsxx ) 428 zfxx(ji,jj) = zalf * zpsxx * zalfq 429 zfy (ji,jj) = zalf * ( zpsy + zalf1 * zpsxy ) 430 zfxy(ji,jj) = zalfq * zpsxy 431 zfyy(ji,jj) = zalf * zpsyy 432 433 ! ! Readjust moments remaining in the box. 434 zpsm = zpsm - zfm(ji,jj) 435 zps0 = zps0 - zf0(ji,jj) 436 zpsx = zalf1q * ( zpsx - 3.0 * zalf * zpsxx ) 437 zpsxx = zalf1 * zalf1q * zpsxx 438 zpsy = zpsy - zfy (ji,jj) 439 zpsyy = zpsyy - zfyy(ji,jj) 440 zpsxy = zalf1q * zpsxy 441 ! 442 psm (ji,jj,jl) = zpsm ! optimization 443 ps0 (ji,jj,jl) = zps0 444 psx (ji,jj,jl) = zpsx 445 psxx(ji,jj,jl) = zpsxx 446 psy (ji,jj,jl) = zpsy 447 psyy(ji,jj,jl) = zpsyy 448 psxy(ji,jj,jl) = zpsxy 449 ! 450 END DO 451 452 DO ji = Nis0 - 1, Nie0 453 ! ! Flux from i+1 to i when u LT 0. 454 zalf = MAX( 0._wp, -put(ji,jj) ) * pdt / psm(ji+1,jj,jl) 455 zalg (ji,jj) = zalf 456 zalfq = zalf * zalf 457 zalf1 = 1.0 - zalf 458 zalg1 (ji,jj) = zalf1 459 zalf1q = zalf1 * zalf1 460 zalg1q(ji,jj) = zalf1q 461 ! 462 zfm (ji,jj) = zfm (ji,jj) + zalf * psm (ji+1,jj,jl) 463 zf0 (ji,jj) = zf0 (ji,jj) + zalf * ( ps0 (ji+1,jj,jl) & 464 & - zalf1 * ( psx(ji+1,jj,jl) - (zalf1 - zalf ) * psxx(ji+1,jj,jl) ) ) 465 zfx (ji,jj) = zfx (ji,jj) + zalfq * ( psx (ji+1,jj,jl) - 3.0 * zalf1 * psxx(ji+1,jj,jl) ) 466 zfxx (ji,jj) = zfxx(ji,jj) + zalf * psxx(ji+1,jj,jl) * zalfq 467 zfy (ji,jj) = zfy (ji,jj) + zalf * ( psy (ji+1,jj,jl) - zalf1 * psxy(ji+1,jj,jl) ) 468 zfxy (ji,jj) = zfxy(ji,jj) + zalfq * psxy(ji+1,jj,jl) 469 zfyy (ji,jj) = zfyy(ji,jj) + zalf * psyy(ji+1,jj,jl) 470 END DO 471 472 DO ji = Nis0, Nie0 473 ! 474 zpsm = psm (ji,jj,jl) ! optimization 475 zps0 = ps0 (ji,jj,jl) 476 zpsx = psx (ji,jj,jl) 477 zpsxx = psxx(ji,jj,jl) 478 zpsy = psy (ji,jj,jl) 479 zpsyy = psyy(ji,jj,jl) 480 zpsxy = psxy(ji,jj,jl) 481 ! ! Readjust moments remaining in the box. 482 zbt = zbet(ji-1,jj) 483 zbt1 = 1.0 - zbet(ji-1,jj) 484 ! 485 zpsm = zbt * zpsm + zbt1 * ( zpsm - zfm(ji-1,jj) ) 486 zps0 = zbt * zps0 + zbt1 * ( zps0 - zf0(ji-1,jj) ) 487 zpsx = zalg1q(ji-1,jj) * ( zpsx + 3.0 * zalg(ji-1,jj) * zpsxx ) 488 zpsxx = zalg1 (ji-1,jj) * zalg1q(ji-1,jj) * zpsxx 489 zpsy = zbt * zpsy + zbt1 * ( zpsy - zfy (ji-1,jj) ) 490 zpsyy = zbt * zpsyy + zbt1 * ( zpsyy - zfyy(ji-1,jj) ) 491 zpsxy = zalg1q(ji-1,jj) * zpsxy 492 493 ! Put the temporary moments into appropriate neighboring boxes. 494 ! ! Flux from i to i+1 IF u GT 0. 495 zbt = zbet(ji-1,jj) 496 zbt1 = 1.0 - zbet(ji-1,jj) 497 zpsm = zbt * ( zpsm + zfm(ji-1,jj) ) + zbt1 * zpsm 498 zalf = zbt * zfm(ji-1,jj) / zpsm 499 zalf1 = 1.0 - zalf 500 ztemp = zalf * zps0 - zalf1 * zf0(ji-1,jj) 501 ! 502 zps0 = zbt * ( zps0 + zf0(ji-1,jj) ) + zbt1 * zps0 503 zpsx = zbt * ( zalf * zfx(ji-1,jj) + zalf1 * zpsx + 3.0 * ztemp ) + zbt1 * zpsx 504 zpsxx = zbt * ( zalf * zalf * zfxx(ji-1,jj) + zalf1 * zalf1 * zpsxx & 505 & + 5.0 * ( zalf * zalf1 * ( zpsx - zfx(ji-1,jj) ) - ( zalf1 - zalf ) * ztemp ) ) & 506 & + zbt1 * zpsxx 507 zpsxy = zbt * ( zalf * zfxy(ji-1,jj) + zalf1 * zpsxy & 508 & + 3.0 * (- zalf1*zfy(ji-1,jj) + zalf * zpsy ) ) & 509 & + zbt1 * zpsxy 510 zpsy = zbt * ( zpsy + zfy (ji-1,jj) ) + zbt1 * zpsy 511 zpsyy = zbt * ( zpsyy + zfyy(ji-1,jj) ) + zbt1 * zpsyy 512 513 ! ! Flux from i+1 to i IF u LT 0. 514 zbt = zbet(ji,jj) 515 zbt1 = 1.0 - zbet(ji,jj) 516 zpsm = zbt * zpsm + zbt1 * ( zpsm + zfm(ji,jj) ) 517 zalf = zbt1 * zfm(ji,jj) / zpsm 518 zalf1 = 1.0 - zalf 519 ztemp = - zalf * zps0 + zalf1 * zf0(ji,jj) 520 ! 521 zps0 = zbt * zps0 + zbt1 * ( zps0 + zf0(ji,jj) ) 522 zpsx = zbt * zpsx + zbt1 * ( zalf * zfx(ji,jj) + zalf1 * zpsx + 3.0 * ztemp ) 523 zpsxx = zbt * zpsxx + zbt1 * ( zalf * zalf * zfxx(ji,jj) + zalf1 * zalf1 * zpsxx & 524 & + 5.0 * ( zalf * zalf1 * ( - zpsx + zfx(ji,jj) ) & 525 & + ( zalf1 - zalf ) * ztemp ) ) 526 zpsxy = zbt * zpsxy + zbt1 * ( zalf * zfxy(ji,jj) + zalf1 * zpsxy & 527 & + 3.0 * ( zalf1 * zfy(ji,jj) - zalf * zpsy ) ) 528 zpsy = zbt * zpsy + zbt1 * ( zpsy + zfy (ji,jj) ) 529 zpsyy = zbt * zpsyy + zbt1 * ( zpsyy + zfyy(ji,jj) ) 530 ! 531 psm (ji,jj,jl) = zpsm ! optimization 532 ps0 (ji,jj,jl) = zps0 533 psx (ji,jj,jl) = zpsx 534 psxx(ji,jj,jl) = zpsxx 535 psy (ji,jj,jl) = zpsy 536 psyy(ji,jj,jl) = zpsyy 537 psxy(ji,jj,jl) = zpsxy 538 END DO 539 ! 540 END DO 541 ! 424 542 END DO 425 426 !-- Lateral boundary conditions 427 CALL lbc_lnk_multi( 'icedyn_adv_pra', psm(:,:,1:jcat) , 'T', 1.0_wp, ps0 , 'T', 1.0_wp & 428 & , psx , 'T', -1.0_wp, psy , 'T', -1.0_wp & ! caution gradient ==> the sign changes 429 & , psxx , 'T', 1.0_wp, psyy, 'T', 1.0_wp , psxy, 'T', 1.0_wp ) 430 ! 543 ! 431 544 END SUBROUTINE adv_x 432 545 … … 449 562 !! 450 563 INTEGER :: ji, jj, jl, jcat ! dummy loop indices 564 INTEGER :: ji0 ! dummy loop indices 451 565 REAL(wp) :: zs1max, zslpmax, ztemp ! temporary scalars 452 566 REAL(wp) :: zs1new, zalf , zalfq , zbt ! - - 453 567 REAL(wp) :: zs2new, zalf1, zalf1q, zbt1 ! - - 568 REAL(wp) :: zpsm, zps0 569 REAL(wp) :: zpsx, zpsy, zpsxx, zpsyy, zpsxy 454 570 REAL(wp), DIMENSION(jpi,jpj) :: zf0, zfx , zfy , zbet ! 2D workspace 455 571 REAL(wp), DIMENSION(jpi,jpj) :: zfm, zfxx, zfyy, zfxy ! - - 456 572 REAL(wp), DIMENSION(jpi,jpj) :: zalg, zalg1, zalg1q ! - - 457 573 !--------------------------------------------------------------------- 574 ! in order to avoid lbc_lnk (communications): 575 ! ji loop must be 1:jpi if adv_y is called first 576 ! and 2:jpi-1 if adv_y is called second 577 ji0 = NINT(pcrh) 458 578 ! 459 579 jcat = SIZE( ps0 , 3 ) ! size of input arrays … … 462 582 ! 463 583 ! Limitation of moments. 464 DO_2D( 1, 1, 0, 0 ) 465 ! Initialize volumes of boxes (=area if adv_x first called, =psm otherwise) 466 psm(ji,jj,jl) = MAX( pcrh * e1e2t(ji,jj) + ( 1.0 - pcrh ) * psm(ji,jj,jl) , epsi20 ) 467 ! 468 zslpmax = MAX( 0._wp, ps0(ji,jj,jl) ) 584 DO_2D( 1, 1, ji0, ji0 ) 585 ! 586 zpsm = psm (ji,jj,jl) ! optimization 587 zps0 = ps0 (ji,jj,jl) 588 zpsx = psx (ji,jj,jl) 589 zpsxx = psxx(ji,jj,jl) 590 zpsy = psy (ji,jj,jl) 591 zpsyy = psyy(ji,jj,jl) 592 zpsxy = psxy(ji,jj,jl) 593 ! 594 ! Initialize volumes of boxes (=area if adv_y first called, =psm otherwise) 595 zpsm = MAX( pcrh * e1e2t(ji,jj) + ( 1.0 - pcrh ) * zpsm , epsi20 ) 596 ! 597 zslpmax = MAX( 0._wp, zps0 ) 469 598 zs1max = 1.5 * zslpmax 470 zs1new = MIN( zs1max, MAX( -zs1max, psy(ji,jj,jl) ) ) 471 zs2new = MIN( ( 2.0 * zslpmax - 0.3334 * ABS( zs1new ) ), & 472 & MAX( ABS( zs1new )-zslpmax, psyy(ji,jj,jl) ) ) 599 zs1new = MIN( zs1max, MAX( -zs1max, zpsy ) ) 600 zs2new = MIN( ( 2.0 * zslpmax - 0.3334 * ABS( zs1new ) ), MAX( ABS( zs1new )-zslpmax, zpsyy ) ) 473 601 rswitch = ( 1.0 - MAX( 0._wp, SIGN( 1._wp, -zslpmax) ) ) * tmask(ji,jj,1) ! Case of empty boxes & Apply mask 474 602 ! 475 ps0 (ji,jj,jl) = zslpmax 476 psx (ji,jj,jl) = psx (ji,jj,jl) * rswitch 477 psxx(ji,jj,jl) = psxx(ji,jj,jl) * rswitch 478 psy (ji,jj,jl) = zs1new * rswitch 479 psyy(ji,jj,jl) = zs2new * rswitch 480 psxy(ji,jj,jl) = MIN( zslpmax, MAX( -zslpmax, psxy(ji,jj,jl) ) ) * rswitch 481 END_2D 482 483 ! Calculate fluxes and moments between boxes j<-->j+1 484 DO_2D( 1, 1, 0, 0 ) 603 zps0 = zslpmax 604 zpsx = zpsx * rswitch 605 zpsxx = zpsxx * rswitch 606 zpsy = zs1new * rswitch 607 zpsyy = zs2new * rswitch 608 zpsxy = MIN( zslpmax, MAX( -zslpmax, zpsxy ) ) * rswitch 609 610 ! Calculate fluxes and moments between boxes j<-->j+1 611 ! ! Flux from j to j+1 WHEN v GT 0 485 612 zbet(ji,jj) = MAX( 0._wp, SIGN( 1._wp, pvt(ji,jj) ) ) 486 zalf = MAX( 0._wp, pvt(ji,jj) ) * pdt / psm(ji,jj,jl)613 zalf = MAX( 0._wp, pvt(ji,jj) ) * pdt / zpsm 487 614 zalfq = zalf * zalf 488 615 zalf1 = 1.0 - zalf 489 616 zalf1q = zalf1 * zalf1 490 617 ! 491 zfm (ji,jj) = zalf * psm(ji,jj,jl) 492 zf0 (ji,jj) = zalf * ( ps0(ji,jj,jl) + zalf1 * ( psy(ji,jj,jl) + (zalf1-zalf) * psyy(ji,jj,jl) ) ) 493 zfy (ji,jj) = zalfq *( psy(ji,jj,jl) + 3.0*zalf1*psyy(ji,jj,jl) ) 494 zfyy(ji,jj) = zalf * zalfq * psyy(ji,jj,jl) 495 zfx (ji,jj) = zalf * ( psx(ji,jj,jl) + zalf1 * psxy(ji,jj,jl) ) 496 zfxy(ji,jj) = zalfq * psxy(ji,jj,jl) 497 zfxx(ji,jj) = zalf * psxx(ji,jj,jl) 498 ! 499 ! Readjust moments remaining in the box. 500 psm (ji,jj,jl) = psm (ji,jj,jl) - zfm(ji,jj) 501 ps0 (ji,jj,jl) = ps0 (ji,jj,jl) - zf0(ji,jj) 502 psy (ji,jj,jl) = zalf1q * ( psy(ji,jj,jl) -3.0 * zalf * psyy(ji,jj,jl) ) 503 psyy(ji,jj,jl) = zalf1 * zalf1q * psyy(ji,jj,jl) 504 psx (ji,jj,jl) = psx (ji,jj,jl) - zfx(ji,jj) 505 psxx(ji,jj,jl) = psxx(ji,jj,jl) - zfxx(ji,jj) 506 psxy(ji,jj,jl) = zalf1q * psxy(ji,jj,jl) 618 zfm (ji,jj) = zalf * zpsm 619 zf0 (ji,jj) = zalf * ( zps0 + zalf1 * ( zpsy + (zalf1-zalf) * zpsyy ) ) 620 zfy (ji,jj) = zalfq *( zpsy + 3.0*zalf1*zpsyy ) 621 zfyy(ji,jj) = zalf * zalfq * zpsyy 622 zfx (ji,jj) = zalf * ( zpsx + zalf1 * zpsxy ) 623 zfxy(ji,jj) = zalfq * zpsxy 624 zfxx(ji,jj) = zalf * zpsxx 625 ! 626 ! ! Readjust moments remaining in the box. 627 zpsm = zpsm - zfm(ji,jj) 628 zps0 = zps0 - zf0(ji,jj) 629 zpsy = zalf1q * ( zpsy -3.0 * zalf * zpsyy ) 630 zpsyy = zalf1 * zalf1q * zpsyy 631 zpsx = zpsx - zfx(ji,jj) 632 zpsxx = zpsxx - zfxx(ji,jj) 633 zpsxy = zalf1q * zpsxy 634 ! 635 psm (ji,jj,jl) = zpsm ! optimization 636 ps0 (ji,jj,jl) = zps0 637 psx (ji,jj,jl) = zpsx 638 psxx(ji,jj,jl) = zpsxx 639 psy (ji,jj,jl) = zpsy 640 psyy(ji,jj,jl) = zpsyy 641 psxy(ji,jj,jl) = zpsxy 507 642 END_2D 508 643 ! 509 DO_2D( 1, 0, 0, 0 ) 644 DO_2D( 1, 0, ji0, ji0 ) 645 ! ! Flux from j+1 to j when v LT 0. 510 646 zalf = MAX( 0._wp, -pvt(ji,jj) ) * pdt / psm(ji,jj+1,jl) 511 647 zalg (ji,jj) = zalf … … 526 662 END_2D 527 663 528 ! Readjust moments remaining in the box.529 DO_2D( 0, 0, 0, 0 )664 DO_2D( 0, 0, ji0, ji0 ) 665 ! ! Readjust moments remaining in the box. 530 666 zbt = zbet(ji,jj-1) 531 667 zbt1 = ( 1.0 - zbet(ji,jj-1) ) 532 668 ! 533 psm (ji,jj,jl) = zbt * psm(ji,jj,jl) + zbt1 * ( psm(ji,jj,jl) - zfm(ji,jj-1) ) 534 ps0 (ji,jj,jl) = zbt * ps0(ji,jj,jl) + zbt1 * ( ps0(ji,jj,jl) - zf0(ji,jj-1) ) 535 psy (ji,jj,jl) = zalg1q(ji,jj-1) * ( psy(ji,jj,jl) + 3.0 * zalg(ji,jj-1) * psyy(ji,jj,jl) ) 536 psyy(ji,jj,jl) = zalg1 (ji,jj-1) * zalg1q(ji,jj-1) * psyy(ji,jj,jl) 537 psx (ji,jj,jl) = zbt * psx (ji,jj,jl) + zbt1 * ( psx (ji,jj,jl) - zfx (ji,jj-1) ) 538 psxx(ji,jj,jl) = zbt * psxx(ji,jj,jl) + zbt1 * ( psxx(ji,jj,jl) - zfxx(ji,jj-1) ) 539 psxy(ji,jj,jl) = zalg1q(ji,jj-1) * psxy(ji,jj,jl) 669 zpsm = psm (ji,jj,jl) ! optimization 670 zps0 = ps0 (ji,jj,jl) 671 zpsx = psx (ji,jj,jl) 672 zpsxx = psxx(ji,jj,jl) 673 zpsy = psy (ji,jj,jl) 674 zpsyy = psyy(ji,jj,jl) 675 zpsxy = psxy(ji,jj,jl) 676 ! 677 zpsm = zbt * zpsm + zbt1 * ( zpsm - zfm(ji,jj-1) ) 678 zps0 = zbt * zps0 + zbt1 * ( zps0 - zf0(ji,jj-1) ) 679 zpsy = zalg1q(ji,jj-1) * ( zpsy + 3.0 * zalg(ji,jj-1) * zpsyy ) 680 zpsyy = zalg1 (ji,jj-1) * zalg1q(ji,jj-1) * zpsyy 681 zpsx = zbt * zpsx + zbt1 * ( zpsx - zfx (ji,jj-1) ) 682 zpsxx = zbt * zpsxx + zbt1 * ( zpsxx - zfxx(ji,jj-1) ) 683 zpsxy = zalg1q(ji,jj-1) * zpsxy 684 685 ! Put the temporary moments into appropriate neighboring boxes. 686 ! ! Flux from j to j+1 IF v GT 0. 687 zbt = zbet(ji,jj-1) 688 zbt1 = 1.0 - zbet(ji,jj-1) 689 zpsm = zbt * ( zpsm + zfm(ji,jj-1) ) + zbt1 * zpsm 690 zalf = zbt * zfm(ji,jj-1) / zpsm 691 zalf1 = 1.0 - zalf 692 ztemp = zalf * zps0 - zalf1 * zf0(ji,jj-1) 693 ! 694 zps0 = zbt * ( zps0 + zf0(ji,jj-1) ) + zbt1 * zps0 695 zpsy = zbt * ( zalf * zfy(ji,jj-1) + zalf1 * zpsy + 3.0 * ztemp ) & 696 & + zbt1 * zpsy 697 zpsyy = zbt * ( zalf * zalf * zfyy(ji,jj-1) + zalf1 * zalf1 * zpsyy & 698 & + 5.0 * ( zalf * zalf1 * ( zpsy - zfy(ji,jj-1) ) - ( zalf1 - zalf ) * ztemp ) ) & 699 & + zbt1 * zpsyy 700 zpsxy = zbt * ( zalf * zfxy(ji,jj-1) + zalf1 * zpsxy & 701 & + 3.0 * (- zalf1 * zfx(ji,jj-1) + zalf * zpsx ) ) & 702 & + zbt1 * zpsxy 703 zpsx = zbt * ( zpsx + zfx (ji,jj-1) ) + zbt1 * zpsx 704 zpsxx = zbt * ( zpsxx + zfxx(ji,jj-1) ) + zbt1 * zpsxx 705 706 ! ! Flux from j+1 to j IF v LT 0. 707 zbt = zbet(ji,jj) 708 zbt1 = 1.0 - zbet(ji,jj) 709 zpsm = zbt * zpsm + zbt1 * ( zpsm + zfm(ji,jj) ) 710 zalf = zbt1 * zfm(ji,jj) / zpsm 711 zalf1 = 1.0 - zalf 712 ztemp = - zalf * zps0 + zalf1 * zf0(ji,jj) 713 ! 714 zps0 = zbt * zps0 + zbt1 * ( zps0 + zf0(ji,jj) ) 715 zpsy = zbt * zpsy + zbt1 * ( zalf * zfy(ji,jj) + zalf1 * zpsy + 3.0 * ztemp ) 716 zpsyy = zbt * zpsyy + zbt1 * ( zalf * zalf * zfyy(ji,jj) + zalf1 * zalf1 * zpsyy & 717 & + 5.0 * ( zalf * zalf1 * ( - zpsy + zfy(ji,jj) ) & 718 & + ( zalf1 - zalf ) * ztemp ) ) 719 zpsxy = zbt * zpsxy + zbt1 * ( zalf * zfxy(ji,jj) + zalf1 * zpsxy & 720 & + 3.0 * ( zalf1 * zfx(ji,jj) - zalf * zpsx ) ) 721 zpsx = zbt * zpsx + zbt1 * ( zpsx + zfx (ji,jj) ) 722 zpsxx = zbt * zpsxx + zbt1 * ( zpsxx + zfxx(ji,jj) ) 723 ! 724 psm (ji,jj,jl) = zpsm ! optimization 725 ps0 (ji,jj,jl) = zps0 726 psx (ji,jj,jl) = zpsx 727 psxx(ji,jj,jl) = zpsxx 728 psy (ji,jj,jl) = zpsy 729 psyy(ji,jj,jl) = zpsyy 730 psxy(ji,jj,jl) = zpsxy 540 731 END_2D 541 542 ! Put the temporary moments into appropriate neighboring boxes. 543 DO_2D( 0, 0, 0, 0 ) 544 zbt = zbet(ji,jj-1) 545 zbt1 = 1.0 - zbet(ji,jj-1) 546 psm(ji,jj,jl) = zbt * ( psm(ji,jj,jl) + zfm(ji,jj-1) ) + zbt1 * psm(ji,jj,jl) 547 zalf = zbt * zfm(ji,jj-1) / psm(ji,jj,jl) 548 zalf1 = 1.0 - zalf 549 ztemp = zalf * ps0(ji,jj,jl) - zalf1 * zf0(ji,jj-1) 550 ! 551 ps0(ji,jj,jl) = zbt * ( ps0(ji,jj,jl) + zf0(ji,jj-1) ) + zbt1 * ps0(ji,jj,jl) 552 psy(ji,jj,jl) = zbt * ( zalf * zfy(ji,jj-1) + zalf1 * psy(ji,jj,jl) + 3.0 * ztemp ) & 553 & + zbt1 * psy(ji,jj,jl) 554 psyy(ji,jj,jl) = zbt * ( zalf * zalf * zfyy(ji,jj-1) + zalf1 * zalf1 * psyy(ji,jj,jl) & 555 & + 5.0 * ( zalf * zalf1 * ( psy(ji,jj,jl) - zfy(ji,jj-1) ) - ( zalf1 - zalf ) * ztemp ) ) & 556 & + zbt1 * psyy(ji,jj,jl) 557 psxy(ji,jj,jl) = zbt * ( zalf * zfxy(ji,jj-1) + zalf1 * psxy(ji,jj,jl) & 558 & + 3.0 * (- zalf1 * zfx(ji,jj-1) + zalf * psx(ji,jj,jl) ) ) & 559 & + zbt1 * psxy(ji,jj,jl) 560 psx (ji,jj,jl) = zbt * ( psx (ji,jj,jl) + zfx (ji,jj-1) ) + zbt1 * psx (ji,jj,jl) 561 psxx(ji,jj,jl) = zbt * ( psxx(ji,jj,jl) + zfxx(ji,jj-1) ) + zbt1 * psxx(ji,jj,jl) 562 END_2D 563 564 DO_2D( 0, 0, 0, 0 ) 565 zbt = zbet(ji,jj) 566 zbt1 = 1.0 - zbet(ji,jj) 567 psm(ji,jj,jl) = zbt * psm(ji,jj,jl) + zbt1 * ( psm(ji,jj,jl) + zfm(ji,jj) ) 568 zalf = zbt1 * zfm(ji,jj) / psm(ji,jj,jl) 569 zalf1 = 1.0 - zalf 570 ztemp = - zalf * ps0(ji,jj,jl) + zalf1 * zf0(ji,jj) 571 ! 572 ps0 (ji,jj,jl) = zbt * ps0 (ji,jj,jl) + zbt1 * ( ps0(ji,jj,jl) + zf0(ji,jj) ) 573 psy (ji,jj,jl) = zbt * psy (ji,jj,jl) + zbt1 * ( zalf * zfy(ji,jj) + zalf1 * psy(ji,jj,jl) + 3.0 * ztemp ) 574 psyy(ji,jj,jl) = zbt * psyy(ji,jj,jl) + zbt1 * ( zalf * zalf * zfyy(ji,jj) + zalf1 * zalf1 * psyy(ji,jj,jl) & 575 & + 5.0 * ( zalf * zalf1 * ( - psy(ji,jj,jl) + zfy(ji,jj) ) & 576 & + ( zalf1 - zalf ) * ztemp ) ) 577 psxy(ji,jj,jl) = zbt * psxy(ji,jj,jl) + zbt1 * ( zalf * zfxy(ji,jj) + zalf1 * psxy(ji,jj,jl) & 578 & + 3.0 * ( zalf1 * zfx(ji,jj) - zalf * psx(ji,jj,jl) ) ) 579 psx (ji,jj,jl) = zbt * psx (ji,jj,jl) + zbt1 * ( psx (ji,jj,jl) + zfx (ji,jj) ) 580 psxx(ji,jj,jl) = zbt * psxx(ji,jj,jl) + zbt1 * ( psxx(ji,jj,jl) + zfxx(ji,jj) ) 581 END_2D 582 732 ! 583 733 END DO 584 585 !-- Lateral boundary conditions586 CALL lbc_lnk_multi( 'icedyn_adv_pra', psm(:,:,1:jcat) , 'T', 1.0_wp, ps0 , 'T', 1.0_wp &587 & , psx , 'T', -1.0_wp, psy , 'T', -1.0_wp & ! caution gradient ==> the sign changes588 & , psxx , 'T', 1.0_wp, psyy, 'T', 1.0_wp , psxy, 'T', 1.0_wp )589 734 ! 590 735 END SUBROUTINE adv_y 591 736 592 737 593 SUBROUTINE Hbig( pdt, phi_max, phs_max, phip_max, pv_i, pv_s, pa_i, pa_ip, pv_ip, pe_s ) 738 SUBROUTINE Hbig( pdt, phi_max, phs_max, phip_max, psi_max, pes_max, pei_max, & 739 & pv_i, pv_s, pa_i, pa_ip, pv_ip, psv_i, pe_s, pe_i ) 594 740 !!------------------------------------------------------------------- 595 741 !! *** ROUTINE Hbig *** … … 605 751 !! ** input : Max thickness of the surrounding 9-points 606 752 !!------------------------------------------------------------------- 607 REAL(wp) , INTENT(in ) :: pdt ! tracer time-step 608 REAL(wp), DIMENSION(:,:,:) , INTENT(in ) :: phi_max, phs_max, phip_max ! max ice thick from surrounding 9-pts 609 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pv_i, pv_s, pa_i, pa_ip, pv_ip 753 REAL(wp) , INTENT(in ) :: pdt ! tracer time-step 754 REAL(wp), DIMENSION(:,:,:) , INTENT(in ) :: phi_max, phs_max, phip_max, psi_max ! max ice thick from surrounding 9-pts 755 REAL(wp), DIMENSION(:,:,:,:), INTENT(in ) :: pes_max 756 REAL(wp), DIMENSION(:,:,:,:), INTENT(in ) :: pei_max 757 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pv_i, pv_s, pa_i, pa_ip, pv_ip, psv_i 610 758 REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) :: pe_s 611 ! 612 INTEGER :: ji, jj, jl ! dummy loop indices 613 REAL(wp) :: z1_dt, zhip, zhi, zhs, zfra 759 REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) :: pe_i 760 ! 761 INTEGER :: ji, jj, jk, jl ! dummy loop indices 762 REAL(wp) :: z1_dt, zhip, zhi, zhs, zsi, zes, zei, zfra 614 763 !!------------------------------------------------------------------- 615 764 ! … … 617 766 ! 618 767 DO jl = 1, jpl 619 620 768 DO_2D( 1, 1, 1, 1 ) 621 769 IF ( pv_i(ji,jj,jl) > 0._wp ) THEN … … 623 771 ! ! -- check h_ip -- ! 624 772 ! if h_ip is larger than the surrounding 9 pts => reduce h_ip and increase a_ip 625 IF( ln_pnd_ H12.AND. pv_ip(ji,jj,jl) > 0._wp ) THEN773 IF( ln_pnd_LEV .OR. ln_pnd_TOPO .AND. pv_ip(ji,jj,jl) > 0._wp ) THEN 626 774 zhip = pv_ip(ji,jj,jl) / MAX( epsi20, pa_ip(ji,jj,jl) ) 627 775 IF( zhip > phip_max(ji,jj,jl) .AND. pa_ip(ji,jj,jl) < 0.15 ) THEN … … 650 798 ENDIF 651 799 ! 800 ! ! -- check s_i -- ! 801 ! if s_i is larger than the surrounding 9 pts => put salt excess in the ocean 802 zsi = psv_i(ji,jj,jl) / pv_i(ji,jj,jl) 803 IF( zsi > psi_max(ji,jj,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN 804 zfra = psi_max(ji,jj,jl) / zsi 805 sfx_res(ji,jj) = sfx_res(ji,jj) + psv_i(ji,jj,jl) * ( 1._wp - zfra ) * rhoi * z1_dt 806 psv_i(ji,jj,jl) = psv_i(ji,jj,jl) * zfra 807 ENDIF 808 ! 652 809 ENDIF 653 810 END_2D 654 811 END DO 812 ! 813 ! ! -- check e_i/v_i -- ! 814 DO jl = 1, jpl 815 DO_3D( 1, 1, 1, 1, 1, nlay_i ) 816 IF ( pv_i(ji,jj,jl) > 0._wp ) THEN 817 ! if e_i/v_i is larger than the surrounding 9 pts => put the heat excess in the ocean 818 zei = pe_i(ji,jj,jk,jl) / pv_i(ji,jj,jl) 819 IF( zei > pei_max(ji,jj,jk,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN 820 zfra = pei_max(ji,jj,jk,jl) / zei 821 hfx_res(ji,jj) = hfx_res(ji,jj) - pe_i(ji,jj,jk,jl) * ( 1._wp - zfra ) * z1_dt ! W.m-2 <0 822 pe_i(ji,jj,jk,jl) = pe_i(ji,jj,jk,jl) * zfra 823 ENDIF 824 ENDIF 825 END_3D 826 END DO 827 ! ! -- check e_s/v_s -- ! 828 DO jl = 1, jpl 829 DO_3D( 1, 1, 1, 1, 1, nlay_s ) 830 IF ( pv_s(ji,jj,jl) > 0._wp ) THEN 831 ! if e_s/v_s is larger than the surrounding 9 pts => put the heat excess in the ocean 832 zes = pe_s(ji,jj,jk,jl) / pv_s(ji,jj,jl) 833 IF( zes > pes_max(ji,jj,jk,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN 834 zfra = pes_max(ji,jj,jk,jl) / zes 835 hfx_res(ji,jj) = hfx_res(ji,jj) - pe_s(ji,jj,jk,jl) * ( 1._wp - zfra ) * z1_dt ! W.m-2 <0 836 pe_s(ji,jj,jk,jl) = pe_s(ji,jj,jk,jl) * zfra 837 ENDIF 838 ENDIF 839 END_3D 840 END DO 655 841 ! 656 842 END SUBROUTINE Hbig … … 724 910 & sxsal(jpi,jpj,jpl) , sysal(jpi,jpj,jpl) , sxxsal(jpi,jpj,jpl) , syysal(jpi,jpj,jpl) , sxysal(jpi,jpj,jpl) , & 725 911 & sxage(jpi,jpj,jpl) , syage(jpi,jpj,jpl) , sxxage(jpi,jpj,jpl) , syyage(jpi,jpj,jpl) , sxyage(jpi,jpj,jpl) , & 726 & sxap(jpi,jpj,jpl) , syap (jpi,jpj,jpl) , sxxap (jpi,jpj,jpl) , syyap (jpi,jpj,jpl) , sxyap (jpi,jpj,jpl) , & 727 & sxvp(jpi,jpj,jpl) , syvp (jpi,jpj,jpl) , sxxvp (jpi,jpj,jpl) , syyvp (jpi,jpj,jpl) , sxyvp (jpi,jpj,jpl) , & 912 & sxap (jpi,jpj,jpl) , syap (jpi,jpj,jpl) , sxxap (jpi,jpj,jpl) , syyap (jpi,jpj,jpl) , sxyap (jpi,jpj,jpl) , & 913 & sxvp (jpi,jpj,jpl) , syvp (jpi,jpj,jpl) , sxxvp (jpi,jpj,jpl) , syyvp (jpi,jpj,jpl) , sxyvp (jpi,jpj,jpl) , & 914 & sxvl (jpi,jpj,jpl) , syvl (jpi,jpj,jpl) , sxxvl (jpi,jpj,jpl) , syyvl (jpi,jpj,jpl) , sxyvl (jpi,jpj,jpl) , & 728 915 ! 729 916 & sxc0 (jpi,jpj,nlay_s,jpl) , syc0 (jpi,jpj,nlay_s,jpl) , sxxc0(jpi,jpj,nlay_s,jpl) , & … … 772 959 ! 773 960 ! ! ice thickness 774 CALL iom_get( numrir, jpdom_auto, 'sxice' , sxice )775 CALL iom_get( numrir, jpdom_auto, 'syice' , syice )961 CALL iom_get( numrir, jpdom_auto, 'sxice' , sxice , psgn = -1._wp ) 962 CALL iom_get( numrir, jpdom_auto, 'syice' , syice , psgn = -1._wp ) 776 963 CALL iom_get( numrir, jpdom_auto, 'sxxice', sxxice ) 777 964 CALL iom_get( numrir, jpdom_auto, 'syyice', syyice ) 778 965 CALL iom_get( numrir, jpdom_auto, 'sxyice', sxyice ) 779 966 ! ! snow thickness 780 CALL iom_get( numrir, jpdom_auto, 'sxsn' , sxsn )781 CALL iom_get( numrir, jpdom_auto, 'sysn' , sysn )967 CALL iom_get( numrir, jpdom_auto, 'sxsn' , sxsn , psgn = -1._wp ) 968 CALL iom_get( numrir, jpdom_auto, 'sysn' , sysn , psgn = -1._wp ) 782 969 CALL iom_get( numrir, jpdom_auto, 'sxxsn' , sxxsn ) 783 970 CALL iom_get( numrir, jpdom_auto, 'syysn' , syysn ) 784 971 CALL iom_get( numrir, jpdom_auto, 'sxysn' , sxysn ) 785 972 ! ! ice concentration 786 CALL iom_get( numrir, jpdom_auto, 'sxa' , sxa )787 CALL iom_get( numrir, jpdom_auto, 'sya' , sya )973 CALL iom_get( numrir, jpdom_auto, 'sxa' , sxa , psgn = -1._wp ) 974 CALL iom_get( numrir, jpdom_auto, 'sya' , sya , psgn = -1._wp ) 788 975 CALL iom_get( numrir, jpdom_auto, 'sxxa' , sxxa ) 789 976 CALL iom_get( numrir, jpdom_auto, 'syya' , syya ) 790 977 CALL iom_get( numrir, jpdom_auto, 'sxya' , sxya ) 791 978 ! ! ice salinity 792 CALL iom_get( numrir, jpdom_auto, 'sxsal' , sxsal )793 CALL iom_get( numrir, jpdom_auto, 'sysal' , sysal )979 CALL iom_get( numrir, jpdom_auto, 'sxsal' , sxsal , psgn = -1._wp ) 980 CALL iom_get( numrir, jpdom_auto, 'sysal' , sysal , psgn = -1._wp ) 794 981 CALL iom_get( numrir, jpdom_auto, 'sxxsal', sxxsal ) 795 982 CALL iom_get( numrir, jpdom_auto, 'syysal', syysal ) 796 983 CALL iom_get( numrir, jpdom_auto, 'sxysal', sxysal ) 797 984 ! ! ice age 798 CALL iom_get( numrir, jpdom_auto, 'sxage' , sxage )799 CALL iom_get( numrir, jpdom_auto, 'syage' , syage )985 CALL iom_get( numrir, jpdom_auto, 'sxage' , sxage , psgn = -1._wp ) 986 CALL iom_get( numrir, jpdom_auto, 'syage' , syage , psgn = -1._wp ) 800 987 CALL iom_get( numrir, jpdom_auto, 'sxxage', sxxage ) 801 988 CALL iom_get( numrir, jpdom_auto, 'syyage', syyage ) … … 804 991 DO jk = 1, nlay_s 805 992 WRITE(zchar1,'(I2.2)') jk 806 znam = 'sxc0'//'_l'//zchar1 ; CALL iom_get( numrir, jpdom_auto, znam , z3d ) ; sxc0 (:,:,jk,:) = z3d(:,:,:) 807 znam = 'syc0'//'_l'//zchar1 ; CALL iom_get( numrir, jpdom_auto, znam , z3d ) ; syc0 (:,:,jk,:) = z3d(:,:,:) 808 znam = 'sxxc0'//'_l'//zchar1 ; CALL iom_get( numrir, jpdom_auto, znam , z3d ) ; sxxc0(:,:,jk,:) = z3d(:,:,:) 809 znam = 'syyc0'//'_l'//zchar1 ; CALL iom_get( numrir, jpdom_auto, znam , z3d ) ; syyc0(:,:,jk,:) = z3d(:,:,:) 810 znam = 'sxyc0'//'_l'//zchar1 ; CALL iom_get( numrir, jpdom_auto, znam , z3d ) ; sxyc0(:,:,jk,:) = z3d(:,:,:) 993 znam = 'sxc0'//'_l'//zchar1 994 CALL iom_get( numrir, jpdom_auto, znam , z3d, psgn = -1._wp ) ; sxc0 (:,:,jk,:) = z3d(:,:,:) 995 znam = 'syc0'//'_l'//zchar1 996 CALL iom_get( numrir, jpdom_auto, znam , z3d, psgn = -1._wp ) ; syc0 (:,:,jk,:) = z3d(:,:,:) 997 znam = 'sxxc0'//'_l'//zchar1 998 CALL iom_get( numrir, jpdom_auto, znam , z3d ) ; sxxc0(:,:,jk,:) = z3d(:,:,:) 999 znam = 'syyc0'//'_l'//zchar1 1000 CALL iom_get( numrir, jpdom_auto, znam , z3d ) ; syyc0(:,:,jk,:) = z3d(:,:,:) 1001 znam = 'sxyc0'//'_l'//zchar1 1002 CALL iom_get( numrir, jpdom_auto, znam , z3d ) ; sxyc0(:,:,jk,:) = z3d(:,:,:) 811 1003 END DO 812 1004 ! ! ice layers heat content 813 1005 DO jk = 1, nlay_i 814 1006 WRITE(zchar1,'(I2.2)') jk 815 znam = 'sxe'//'_l'//zchar1 ; CALL iom_get( numrir, jpdom_auto, znam , z3d ) ; sxe (:,:,jk,:) = z3d(:,:,:) 816 znam = 'sye'//'_l'//zchar1 ; CALL iom_get( numrir, jpdom_auto, znam , z3d ) ; sye (:,:,jk,:) = z3d(:,:,:) 817 znam = 'sxxe'//'_l'//zchar1 ; CALL iom_get( numrir, jpdom_auto, znam , z3d ) ; sxxe(:,:,jk,:) = z3d(:,:,:) 818 znam = 'syye'//'_l'//zchar1 ; CALL iom_get( numrir, jpdom_auto, znam , z3d ) ; syye(:,:,jk,:) = z3d(:,:,:) 819 znam = 'sxye'//'_l'//zchar1 ; CALL iom_get( numrir, jpdom_auto, znam , z3d ) ; sxye(:,:,jk,:) = z3d(:,:,:) 820 END DO 821 ! 822 IF( ln_pnd_H12 ) THEN ! melt pond fraction 823 CALL iom_get( numrir, jpdom_auto, 'sxap' , sxap ) 824 CALL iom_get( numrir, jpdom_auto, 'syap' , syap ) 825 CALL iom_get( numrir, jpdom_auto, 'sxxap', sxxap ) 826 CALL iom_get( numrir, jpdom_auto, 'syyap', syyap ) 827 CALL iom_get( numrir, jpdom_auto, 'sxyap', sxyap ) 828 ! ! melt pond volume 829 CALL iom_get( numrir, jpdom_auto, 'sxvp' , sxvp ) 830 CALL iom_get( numrir, jpdom_auto, 'syvp' , syvp ) 831 CALL iom_get( numrir, jpdom_auto, 'sxxvp', sxxvp ) 832 CALL iom_get( numrir, jpdom_auto, 'syyvp', syyvp ) 833 CALL iom_get( numrir, jpdom_auto, 'sxyvp', sxyvp ) 1007 znam = 'sxe'//'_l'//zchar1 1008 CALL iom_get( numrir, jpdom_auto, znam , z3d, psgn = -1._wp ) ; sxe (:,:,jk,:) = z3d(:,:,:) 1009 znam = 'sye'//'_l'//zchar1 1010 CALL iom_get( numrir, jpdom_auto, znam , z3d, psgn = -1._wp ) ; sye (:,:,jk,:) = z3d(:,:,:) 1011 znam = 'sxxe'//'_l'//zchar1 1012 CALL iom_get( numrir, jpdom_auto, znam , z3d ) ; sxxe(:,:,jk,:) = z3d(:,:,:) 1013 znam = 'syye'//'_l'//zchar1 1014 CALL iom_get( numrir, jpdom_auto, znam , z3d ) ; syye(:,:,jk,:) = z3d(:,:,:) 1015 znam = 'sxye'//'_l'//zchar1 1016 CALL iom_get( numrir, jpdom_auto, znam , z3d ) ; sxye(:,:,jk,:) = z3d(:,:,:) 1017 END DO 1018 ! 1019 IF( ln_pnd_LEV .OR. ln_pnd_TOPO ) THEN ! melt pond fraction 1020 IF( iom_varid( numrir, 'sxap', ldstop = .FALSE. ) > 0 ) THEN 1021 CALL iom_get( numrir, jpdom_auto, 'sxap' , sxap , psgn = -1._wp ) 1022 CALL iom_get( numrir, jpdom_auto, 'syap' , syap , psgn = -1._wp ) 1023 CALL iom_get( numrir, jpdom_auto, 'sxxap', sxxap ) 1024 CALL iom_get( numrir, jpdom_auto, 'syyap', syyap ) 1025 CALL iom_get( numrir, jpdom_auto, 'sxyap', sxyap ) 1026 ! ! melt pond volume 1027 CALL iom_get( numrir, jpdom_auto, 'sxvp' , sxvp , psgn = -1._wp ) 1028 CALL iom_get( numrir, jpdom_auto, 'syvp' , syvp , psgn = -1._wp ) 1029 CALL iom_get( numrir, jpdom_auto, 'sxxvp', sxxvp ) 1030 CALL iom_get( numrir, jpdom_auto, 'syyvp', syyvp ) 1031 CALL iom_get( numrir, jpdom_auto, 'sxyvp', sxyvp ) 1032 ELSE 1033 sxap = 0._wp ; syap = 0._wp ; sxxap = 0._wp ; syyap = 0._wp ; sxyap = 0._wp ! melt pond fraction 1034 sxvp = 0._wp ; syvp = 0._wp ; sxxvp = 0._wp ; syyvp = 0._wp ; sxyvp = 0._wp ! melt pond volume 1035 ENDIF 1036 ! 1037 IF ( ln_pnd_lids ) THEN ! melt pond lid volume 1038 IF( iom_varid( numrir, 'sxvl', ldstop = .FALSE. ) > 0 ) THEN 1039 CALL iom_get( numrir, jpdom_auto, 'sxvl' , sxvl , psgn = -1._wp ) 1040 CALL iom_get( numrir, jpdom_auto, 'syvl' , syvl , psgn = -1._wp ) 1041 CALL iom_get( numrir, jpdom_auto, 'sxxvl', sxxvl ) 1042 CALL iom_get( numrir, jpdom_auto, 'syyvl', syyvl ) 1043 CALL iom_get( numrir, jpdom_auto, 'sxyvl', sxyvl ) 1044 ELSE 1045 sxvl = 0._wp; syvl = 0._wp ; sxxvl = 0._wp ; syyvl = 0._wp ; sxyvl = 0._wp ! melt pond lid volume 1046 ENDIF 1047 ENDIF 834 1048 ENDIF 835 1049 ! … … 845 1059 sxc0 = 0._wp ; syc0 = 0._wp ; sxxc0 = 0._wp ; syyc0 = 0._wp ; sxyc0 = 0._wp ! snow layers heat content 846 1060 sxe = 0._wp ; sye = 0._wp ; sxxe = 0._wp ; syye = 0._wp ; sxye = 0._wp ! ice layers heat content 847 IF( ln_pnd_H12 ) THEN 848 sxap = 0._wp ; syap = 0._wp ; sxxap = 0._wp ; syyap = 0._wp ; sxyap = 0._wp ! melt pond fraction 849 sxvp = 0._wp ; syvp = 0._wp ; sxxvp = 0._wp ; syyvp = 0._wp ; sxyvp = 0._wp ! melt pond volume 1061 IF( ln_pnd_LEV .OR. ln_pnd_TOPO ) THEN 1062 sxap = 0._wp ; syap = 0._wp ; sxxap = 0._wp ; syyap = 0._wp ; sxyap = 0._wp ! melt pond fraction 1063 sxvp = 0._wp ; syvp = 0._wp ; sxxvp = 0._wp ; syyvp = 0._wp ; sxyvp = 0._wp ! melt pond volume 1064 IF ( ln_pnd_lids ) THEN 1065 sxvl = 0._wp; syvl = 0._wp ; sxxvl = 0._wp ; syyvl = 0._wp ; sxyvl = 0._wp ! melt pond lid volume 1066 ENDIF 850 1067 ENDIF 851 1068 ENDIF … … 862 1079 ! 863 1080 ! ! ice thickness 864 CALL iom_rstput( iter, nitrst, numriw, 'sxice' , sxice 865 CALL iom_rstput( iter, nitrst, numriw, 'syice' , syice 866 CALL iom_rstput( iter, nitrst, numriw, 'sxxice', sxxice 867 CALL iom_rstput( iter, nitrst, numriw, 'syyice', syyice 868 CALL iom_rstput( iter, nitrst, numriw, 'sxyice', sxyice 1081 CALL iom_rstput( iter, nitrst, numriw, 'sxice' , sxice) 1082 CALL iom_rstput( iter, nitrst, numriw, 'syice' , syice) 1083 CALL iom_rstput( iter, nitrst, numriw, 'sxxice', sxxice) 1084 CALL iom_rstput( iter, nitrst, numriw, 'syyice', syyice) 1085 CALL iom_rstput( iter, nitrst, numriw, 'sxyice', sxyice) 869 1086 ! ! snow thickness 870 CALL iom_rstput( iter, nitrst, numriw, 'sxsn' , sxsn 871 CALL iom_rstput( iter, nitrst, numriw, 'sysn' , sysn 872 CALL iom_rstput( iter, nitrst, numriw, 'sxxsn' , sxxsn 873 CALL iom_rstput( iter, nitrst, numriw, 'syysn' , syysn 874 CALL iom_rstput( iter, nitrst, numriw, 'sxysn' , sxysn 1087 CALL iom_rstput( iter, nitrst, numriw, 'sxsn' , sxsn ) 1088 CALL iom_rstput( iter, nitrst, numriw, 'sysn' , sysn ) 1089 CALL iom_rstput( iter, nitrst, numriw, 'sxxsn' , sxxsn ) 1090 CALL iom_rstput( iter, nitrst, numriw, 'syysn' , syysn ) 1091 CALL iom_rstput( iter, nitrst, numriw, 'sxysn' , sxysn ) 875 1092 ! ! ice concentration 876 CALL iom_rstput( iter, nitrst, numriw, 'sxa' , sxa 877 CALL iom_rstput( iter, nitrst, numriw, 'sya' , sya 878 CALL iom_rstput( iter, nitrst, numriw, 'sxxa' , sxxa 879 CALL iom_rstput( iter, nitrst, numriw, 'syya' , syya 880 CALL iom_rstput( iter, nitrst, numriw, 'sxya' , sxya 1093 CALL iom_rstput( iter, nitrst, numriw, 'sxa' , sxa ) 1094 CALL iom_rstput( iter, nitrst, numriw, 'sya' , sya ) 1095 CALL iom_rstput( iter, nitrst, numriw, 'sxxa' , sxxa ) 1096 CALL iom_rstput( iter, nitrst, numriw, 'syya' , syya ) 1097 CALL iom_rstput( iter, nitrst, numriw, 'sxya' , sxya ) 881 1098 ! ! ice salinity 882 CALL iom_rstput( iter, nitrst, numriw, 'sxsal' , sxsal 883 CALL iom_rstput( iter, nitrst, numriw, 'sysal' , sysal 884 CALL iom_rstput( iter, nitrst, numriw, 'sxxsal', sxxsal 885 CALL iom_rstput( iter, nitrst, numriw, 'syysal', syysal 886 CALL iom_rstput( iter, nitrst, numriw, 'sxysal', sxysal 1099 CALL iom_rstput( iter, nitrst, numriw, 'sxsal' , sxsal) 1100 CALL iom_rstput( iter, nitrst, numriw, 'sysal' , sysal) 1101 CALL iom_rstput( iter, nitrst, numriw, 'sxxsal', sxxsal) 1102 CALL iom_rstput( iter, nitrst, numriw, 'syysal', syysal) 1103 CALL iom_rstput( iter, nitrst, numriw, 'sxysal', sxysal) 887 1104 ! ! ice age 888 CALL iom_rstput( iter, nitrst, numriw, 'sxage' , sxage 889 CALL iom_rstput( iter, nitrst, numriw, 'syage' , syage 890 CALL iom_rstput( iter, nitrst, numriw, 'sxxage', sxxage 891 CALL iom_rstput( iter, nitrst, numriw, 'syyage', syyage 892 CALL iom_rstput( iter, nitrst, numriw, 'sxyage', sxyage 1105 CALL iom_rstput( iter, nitrst, numriw, 'sxage' , sxage) 1106 CALL iom_rstput( iter, nitrst, numriw, 'syage' , syage) 1107 CALL iom_rstput( iter, nitrst, numriw, 'sxxage', sxxage) 1108 CALL iom_rstput( iter, nitrst, numriw, 'syyage', syyage) 1109 CALL iom_rstput( iter, nitrst, numriw, 'sxyage', sxyage) 893 1110 ! ! snow layers heat content 894 1111 DO jk = 1, nlay_s 895 1112 WRITE(zchar1,'(I2.2)') jk 896 znam = 'sxc0'//'_l'//zchar1 ; z3d(:,:,:) = sxc0 (:,:,jk,:) ; CALL iom_rstput( iter, nitrst, numriw, znam , z3d ) 897 znam = 'syc0'//'_l'//zchar1 ; z3d(:,:,:) = syc0 (:,:,jk,:) ; CALL iom_rstput( iter, nitrst, numriw, znam , z3d ) 898 znam = 'sxxc0'//'_l'//zchar1 ; z3d(:,:,:) = sxxc0(:,:,jk,:) ; CALL iom_rstput( iter, nitrst, numriw, znam , z3d ) 899 znam = 'syyc0'//'_l'//zchar1 ; z3d(:,:,:) = syyc0(:,:,jk,:) ; CALL iom_rstput( iter, nitrst, numriw, znam , z3d ) 900 znam = 'sxyc0'//'_l'//zchar1 ; z3d(:,:,:) = sxyc0(:,:,jk,:) ; CALL iom_rstput( iter, nitrst, numriw, znam , z3d ) 1113 znam = 'sxc0'//'_l'//zchar1 ; z3d(:,:,:) = sxc0 (:,:,jk,:) 1114 CALL iom_rstput( iter, nitrst, numriw, znam , z3d) 1115 znam = 'syc0'//'_l'//zchar1 ; z3d(:,:,:) = syc0 (:,:,jk,:) 1116 CALL iom_rstput( iter, nitrst, numriw, znam , z3d) 1117 znam = 'sxxc0'//'_l'//zchar1 ; z3d(:,:,:) = sxxc0(:,:,jk,:) 1118 CALL iom_rstput( iter, nitrst, numriw, znam , z3d) 1119 znam = 'syyc0'//'_l'//zchar1 ; z3d(:,:,:) = syyc0(:,:,jk,:) 1120 CALL iom_rstput( iter, nitrst, numriw, znam , z3d) 1121 znam = 'sxyc0'//'_l'//zchar1 ; z3d(:,:,:) = sxyc0(:,:,jk,:) 1122 CALL iom_rstput( iter, nitrst, numriw, znam , z3d) 901 1123 END DO 902 1124 ! ! ice layers heat content 903 1125 DO jk = 1, nlay_i 904 1126 WRITE(zchar1,'(I2.2)') jk 905 znam = 'sxe'//'_l'//zchar1 ; z3d(:,:,:) = sxe (:,:,jk,:) ; CALL iom_rstput( iter, nitrst, numriw, znam , z3d ) 906 znam = 'sye'//'_l'//zchar1 ; z3d(:,:,:) = sye (:,:,jk,:) ; CALL iom_rstput( iter, nitrst, numriw, znam , z3d ) 907 znam = 'sxxe'//'_l'//zchar1 ; z3d(:,:,:) = sxxe(:,:,jk,:) ; CALL iom_rstput( iter, nitrst, numriw, znam , z3d ) 908 znam = 'syye'//'_l'//zchar1 ; z3d(:,:,:) = syye(:,:,jk,:) ; CALL iom_rstput( iter, nitrst, numriw, znam , z3d ) 909 znam = 'sxye'//'_l'//zchar1 ; z3d(:,:,:) = sxye(:,:,jk,:) ; CALL iom_rstput( iter, nitrst, numriw, znam , z3d ) 1127 znam = 'sxe'//'_l'//zchar1 ; z3d(:,:,:) = sxe (:,:,jk,:) 1128 CALL iom_rstput( iter, nitrst, numriw, znam , z3d) 1129 znam = 'sye'//'_l'//zchar1 ; z3d(:,:,:) = sye (:,:,jk,:) 1130 CALL iom_rstput( iter, nitrst, numriw, znam , z3d) 1131 znam = 'sxxe'//'_l'//zchar1 ; z3d(:,:,:) = sxxe(:,:,jk,:) 1132 CALL iom_rstput( iter, nitrst, numriw, znam , z3d) 1133 znam = 'syye'//'_l'//zchar1 ; z3d(:,:,:) = syye(:,:,jk,:) 1134 CALL iom_rstput( iter, nitrst, numriw, znam , z3d) 1135 znam = 'sxye'//'_l'//zchar1 ; z3d(:,:,:) = sxye(:,:,jk,:) 1136 CALL iom_rstput( iter, nitrst, numriw, znam , z3d) 910 1137 END DO 911 1138 ! 912 IF( ln_pnd_ H12) THEN ! melt pond fraction1139 IF( ln_pnd_LEV .OR. ln_pnd_TOPO ) THEN ! melt pond fraction 913 1140 CALL iom_rstput( iter, nitrst, numriw, 'sxap' , sxap ) 914 1141 CALL iom_rstput( iter, nitrst, numriw, 'syap' , syap ) … … 922 1149 CALL iom_rstput( iter, nitrst, numriw, 'syyvp', syyvp ) 923 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 924 1159 ENDIF 925 1160 ! … … 927 1162 ! 928 1163 END SUBROUTINE adv_pra_rst 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 = Njs0-1, Nje0+1 1177 DO ji = Nis0, Nie0 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 = Njs0, Nje0 1182 DO ji = Nis0, Nie0 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 = Njs0-1, Nje0+1 1203 DO ji = Nis0, Nie0 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 = Njs0, Nje0 1208 DO ji = Nis0, Nie0 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 929 1215 930 1216 #else
Note: See TracChangeset
for help on using the changeset viewer.