Changeset 12377 for NEMO/trunk/src/ICE
- Timestamp:
- 2020-02-12T15:39:06+01:00 (4 years ago)
- Location:
- NEMO/trunk
- Files:
-
- 26 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/trunk
- Property svn:externals
-
old new 3 3 ^/utils/build/mk@HEAD mk 4 4 ^/utils/tools@HEAD tools 5 ^/vendors/AGRIF/dev @HEAD ext/AGRIF5 ^/vendors/AGRIF/dev_r11615_ENHANCE-04_namelists_as_internalfiles_agrif@HEAD ext/AGRIF 6 6 ^/vendors/FCM@HEAD ext/FCM 7 7 ^/vendors/IOIPSL@HEAD ext/IOIPSL
-
- Property svn:externals
-
NEMO/trunk/src/ICE/icealb.F90
r11536 r12377 38 38 REAL(wp) :: rn_alb_dpnd ! ponded ice albedo 39 39 40 !! * Substitutions 41 # include "do_loop_substitute.h90" 40 42 !!---------------------------------------------------------------------- 41 43 !! NEMO/ICE 4.0 , NEMO Consortium (2018) … … 117 119 ! 118 120 DO jl = 1, jpl 119 DO jj = 1, jpj 120 DO ji = 1, jpi 121 ! !--- Specific snow, ice and pond fractions (for now, we prevent melt ponds and snow at the same time) 122 IF( ph_snw(ji,jj,jl) == 0._wp ) THEN 123 zafrac_snw = 0._wp 124 IF( ld_pnd_alb ) THEN 125 zafrac_pnd = pafrac_pnd(ji,jj,jl) 126 ELSE 127 zafrac_pnd = 0._wp 128 ENDIF 129 zafrac_ice = 1._wp - zafrac_pnd 121 DO_2D_11_11 122 ! !--- Specific snow, ice and pond fractions (for now, we prevent melt ponds and snow at the same time) 123 IF( ph_snw(ji,jj,jl) == 0._wp ) THEN 124 zafrac_snw = 0._wp 125 IF( ld_pnd_alb ) THEN 126 zafrac_pnd = pafrac_pnd(ji,jj,jl) 130 127 ELSE 131 zafrac_snw = 1._wp ! Snow fully "shades" melt ponds and ice132 128 zafrac_pnd = 0._wp 133 zafrac_ice = 0._wp134 129 ENDIF 135 ! 136 ! !--- Bare ice albedo (for hi > 150cm) 137 IF( ld_pnd_alb ) THEN 138 zalb_ice = rn_alb_idry 139 ELSE 140 IF( ph_snw(ji,jj,jl) == 0._wp .AND. pt_su(ji,jj,jl) >= rt0 ) THEN ; zalb_ice = rn_alb_imlt 141 ELSE ; zalb_ice = rn_alb_idry ; ENDIF 142 ENDIF 143 ! !--- Bare ice albedo (for hi < 150cm) 144 IF( 0.05 < ph_ice(ji,jj,jl) .AND. ph_ice(ji,jj,jl) <= 1.5 ) THEN ! 5cm < hi < 150cm 145 zalb_ice = zalb_ice + ( 0.18 - zalb_ice ) * z1_c1 * ( LOG(1.5) - LOG(ph_ice(ji,jj,jl)) ) 146 ELSEIF( ph_ice(ji,jj,jl) <= 0.05 ) THEN ! 0cm < hi < 5cm 147 zalb_ice = rn_alb_oce + ( 0.18 - rn_alb_oce ) * z1_c2 * ph_ice(ji,jj,jl) 148 ENDIF 149 ! 150 ! !--- Snow-covered ice albedo (freezing, melting cases) 151 IF( pt_su(ji,jj,jl) < rt0 ) THEN 152 zalb_snw = rn_alb_sdry - ( rn_alb_sdry - zalb_ice ) * EXP( - ph_snw(ji,jj,jl) * z1_c3 ) 153 ELSE 154 zalb_snw = rn_alb_smlt - ( rn_alb_smlt - zalb_ice ) * EXP( - ph_snw(ji,jj,jl) * z1_c4 ) 155 ENDIF 156 ! !--- Ponded ice albedo 157 IF( ld_pnd_alb ) THEN 158 zalb_pnd = rn_alb_dpnd - ( rn_alb_dpnd - zalb_ice ) * EXP( - ph_pnd(ji,jj,jl) * z1_href_pnd ) 159 ELSE 160 zalb_pnd = rn_alb_dpnd 161 ENDIF 162 ! !--- Surface albedo is weighted mean of snow, ponds and bare ice contributions 163 palb_os(ji,jj,jl) = ( zafrac_snw * zalb_snw + zafrac_pnd * zalb_pnd + zafrac_ice * zalb_ice ) * tmask(ji,jj,1) 164 ! 165 palb_cs(ji,jj,jl) = palb_os(ji,jj,jl) & 166 & - ( - 0.1010 * palb_os(ji,jj,jl) * palb_os(ji,jj,jl) & 167 & + 0.1933 * palb_os(ji,jj,jl) - 0.0148 ) * tmask(ji,jj,1) 168 ! 169 END DO 170 END DO 130 zafrac_ice = 1._wp - zafrac_pnd 131 ELSE 132 zafrac_snw = 1._wp ! Snow fully "shades" melt ponds and ice 133 zafrac_pnd = 0._wp 134 zafrac_ice = 0._wp 135 ENDIF 136 ! 137 ! !--- Bare ice albedo (for hi > 150cm) 138 IF( ld_pnd_alb ) THEN 139 zalb_ice = rn_alb_idry 140 ELSE 141 IF( ph_snw(ji,jj,jl) == 0._wp .AND. pt_su(ji,jj,jl) >= rt0 ) THEN ; zalb_ice = rn_alb_imlt 142 ELSE ; zalb_ice = rn_alb_idry ; ENDIF 143 ENDIF 144 ! !--- Bare ice albedo (for hi < 150cm) 145 IF( 0.05 < ph_ice(ji,jj,jl) .AND. ph_ice(ji,jj,jl) <= 1.5 ) THEN ! 5cm < hi < 150cm 146 zalb_ice = zalb_ice + ( 0.18 - zalb_ice ) * z1_c1 * ( LOG(1.5) - LOG(ph_ice(ji,jj,jl)) ) 147 ELSEIF( ph_ice(ji,jj,jl) <= 0.05 ) THEN ! 0cm < hi < 5cm 148 zalb_ice = rn_alb_oce + ( 0.18 - rn_alb_oce ) * z1_c2 * ph_ice(ji,jj,jl) 149 ENDIF 150 ! 151 ! !--- Snow-covered ice albedo (freezing, melting cases) 152 IF( pt_su(ji,jj,jl) < rt0 ) THEN 153 zalb_snw = rn_alb_sdry - ( rn_alb_sdry - zalb_ice ) * EXP( - ph_snw(ji,jj,jl) * z1_c3 ) 154 ELSE 155 zalb_snw = rn_alb_smlt - ( rn_alb_smlt - zalb_ice ) * EXP( - ph_snw(ji,jj,jl) * z1_c4 ) 156 ENDIF 157 ! !--- Ponded ice albedo 158 IF( ld_pnd_alb ) THEN 159 zalb_pnd = rn_alb_dpnd - ( rn_alb_dpnd - zalb_ice ) * EXP( - ph_pnd(ji,jj,jl) * z1_href_pnd ) 160 ELSE 161 zalb_pnd = rn_alb_dpnd 162 ENDIF 163 ! !--- Surface albedo is weighted mean of snow, ponds and bare ice contributions 164 palb_os(ji,jj,jl) = ( zafrac_snw * zalb_snw + zafrac_pnd * zalb_pnd + zafrac_ice * zalb_ice ) * tmask(ji,jj,1) 165 ! 166 palb_cs(ji,jj,jl) = palb_os(ji,jj,jl) & 167 & - ( - 0.1010 * palb_os(ji,jj,jl) * palb_os(ji,jj,jl) & 168 & + 0.1933 * palb_os(ji,jj,jl) - 0.0148 ) * tmask(ji,jj,1) 169 ! 170 END_2D 171 171 END DO 172 172 ! … … 190 190 !!---------------------------------------------------------------------- 191 191 ! 192 REWIND( numnam_ice_ref ) ! Namelist namalb in reference namelist : Albedo parameters193 192 READ ( numnam_ice_ref, namalb, IOSTAT = ios, ERR = 901) 194 193 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namalb in reference namelist' ) 195 REWIND( numnam_ice_cfg ) ! Namelist namalb in configuration namelist : Albedo parameters196 194 READ ( numnam_ice_cfg, namalb, IOSTAT = ios, ERR = 902 ) 197 195 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namalb in configuration namelist' ) -
NEMO/trunk/src/ICE/icecor.F90
r11536 r12377 35 35 36 36 !! * Substitutions 37 # include " vectopt_loop_substitute.h90"37 # include "do_loop_substitute.h90" 38 38 !!---------------------------------------------------------------------- 39 39 !! NEMO/ICE 4.0 , NEMO Consortium (2018) … … 88 88 zzc = rhoi * r1_rdtice 89 89 DO jl = 1, jpl 90 DO jj = 1, jpj 91 DO ji = 1, jpi 92 zsal = sv_i(ji,jj,jl) 93 sv_i(ji,jj,jl) = MIN( MAX( rn_simin*v_i(ji,jj,jl) , sv_i(ji,jj,jl) ) , rn_simax*v_i(ji,jj,jl) ) 94 sfx_res(ji,jj) = sfx_res(ji,jj) - ( sv_i(ji,jj,jl) - zsal ) * zzc ! associated salt flux 95 END DO 96 END DO 90 DO_2D_11_11 91 zsal = sv_i(ji,jj,jl) 92 sv_i(ji,jj,jl) = MIN( MAX( rn_simin*v_i(ji,jj,jl) , sv_i(ji,jj,jl) ) , rn_simax*v_i(ji,jj,jl) ) 93 sfx_res(ji,jj) = sfx_res(ji,jj) - ( sv_i(ji,jj,jl) - zsal ) * zzc ! associated salt flux 94 END_2D 97 95 END DO 98 96 ENDIF … … 108 106 ! !----------------------------------------------------- 109 107 IF( kn == 2 ) THEN ! Ice drift case: Corrections to avoid wrong values ! 110 DO jj = 2, jpjm1 !----------------------------------------------------- 111 DO ji = 2, jpim1 112 IF ( at_i(ji,jj) == 0._wp ) THEN ! what to do if there is no ice 113 IF ( at_i(ji+1,jj) == 0._wp ) u_ice(ji ,jj) = 0._wp ! right side 114 IF ( at_i(ji-1,jj) == 0._wp ) u_ice(ji-1,jj) = 0._wp ! left side 115 IF ( at_i(ji,jj+1) == 0._wp ) v_ice(ji,jj ) = 0._wp ! upper side 116 IF ( at_i(ji,jj-1) == 0._wp ) v_ice(ji,jj-1) = 0._wp ! bottom side 117 ENDIF 118 END DO 119 END DO 108 DO_2D_00_00 109 IF ( at_i(ji,jj) == 0._wp ) THEN ! what to do if there is no ice 110 IF ( at_i(ji+1,jj) == 0._wp ) u_ice(ji ,jj) = 0._wp ! right side 111 IF ( at_i(ji-1,jj) == 0._wp ) u_ice(ji-1,jj) = 0._wp ! left side 112 IF ( at_i(ji,jj+1) == 0._wp ) v_ice(ji,jj ) = 0._wp ! upper side 113 IF ( at_i(ji,jj-1) == 0._wp ) v_ice(ji,jj-1) = 0._wp ! bottom side 114 ENDIF 115 END_2D 120 116 CALL lbc_lnk_multi( 'icecor', u_ice, 'U', -1., v_ice, 'V', -1. ) 121 117 ENDIF … … 165 161 ! 166 162 ! controls 167 IF( ln_ctl ) CALL ice_prt3D ('icecor') ! prints 163 IF( sn_cfctl%l_prtctl ) & 164 & CALL ice_prt3D ('icecor') ! prints 168 165 IF( ln_icectl .AND. kn == 2 ) & 169 166 & CALL ice_prt ( kt, iiceprt, jiceprt, 2, ' - Final state - ' ) ! prints -
NEMO/trunk/src/ICE/icectl.F90
r11612 r12377 51 51 52 52 !! * Substitutions 53 # include " vectopt_loop_substitute.h90"53 # include "do_loop_substitute.h90" 54 54 !!---------------------------------------------------------------------- 55 55 !! NEMO/ICE 4.0 , NEMO Consortium (2018) … … 368 368 cl_alname(ialert_id) = ' Incompat vol and con ' ! name of the alert 369 369 DO jl = 1, jpl 370 DO jj = 1, jpj 371 DO ji = 1, jpi 372 IF( v_i(ji,jj,jl) /= 0._wp .AND. a_i(ji,jj,jl) == 0._wp ) THEN 373 WRITE(numout,*) ' ALERTE 2 : Incompatible volume and concentration ' 374 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 375 ENDIF 376 END DO 377 END DO 370 DO_2D_11_11 371 IF( v_i(ji,jj,jl) /= 0._wp .AND. a_i(ji,jj,jl) == 0._wp ) THEN 372 WRITE(numout,*) ' ALERTE 2 : Incompatible volume and concentration ' 373 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 374 ENDIF 375 END_2D 378 376 END DO 379 377 … … 382 380 cl_alname(ialert_id) = ' Very thick ice ' ! name of the alert 383 381 jl = jpl 384 DO jj = 1, jpj 385 DO ji = 1, jpi 386 IF( h_i(ji,jj,jl) > 50._wp ) THEN 387 WRITE(numout,*) ' ALERTE 3 : Very thick ice' 388 !CALL ice_prt( kt, ji, jj, 2, ' ALERTE 3 : Very thick ice ' ) 389 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 390 ENDIF 391 END DO 392 END DO 382 DO_2D_11_11 383 IF( h_i(ji,jj,jl) > 50._wp ) THEN 384 WRITE(numout,*) ' ALERTE 3 : Very thick ice' 385 !CALL ice_prt( kt, ji, jj, 2, ' ALERTE 3 : Very thick ice ' ) 386 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 387 ENDIF 388 END_2D 393 389 394 390 ! Alert if very fast ice 395 391 ialert_id = 4 ! reference number of this alert 396 392 cl_alname(ialert_id) = ' Very fast ice ' ! name of the alert 397 DO jj = 1, jpj 398 DO ji = 1, jpi 399 IF( MAX( ABS( u_ice(ji,jj) ), ABS( v_ice(ji,jj) ) ) > 2. .AND. & 400 & at_i(ji,jj) > 0._wp ) THEN 401 WRITE(numout,*) ' ALERTE 4 : Very fast ice' 402 !CALL ice_prt( kt, ji, jj, 1, ' ALERTE 4 : Very fast ice ' ) 403 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 404 ENDIF 405 END DO 406 END DO 393 DO_2D_11_11 394 IF( MAX( ABS( u_ice(ji,jj) ), ABS( v_ice(ji,jj) ) ) > 2. .AND. & 395 & at_i(ji,jj) > 0._wp ) THEN 396 WRITE(numout,*) ' ALERTE 4 : Very fast ice' 397 !CALL ice_prt( kt, ji, jj, 1, ' ALERTE 4 : Very fast ice ' ) 398 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 399 ENDIF 400 END_2D 407 401 408 402 ! Alert on salt flux 409 403 ialert_id = 5 ! reference number of this alert 410 404 cl_alname(ialert_id) = ' High salt flux ' ! name of the alert 411 DO jj = 1, jpj 412 DO ji = 1, jpi 413 IF( ABS( sfx (ji,jj) ) > 1.0e-2 ) THEN ! = 1 psu/day for 1m ocean depth 414 WRITE(numout,*) ' ALERTE 5 : High salt flux' 415 !CALL ice_prt( kt, ji, jj, 3, ' ALERTE 5 : High salt flux ' ) 416 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 417 ENDIF 418 END DO 419 END DO 405 DO_2D_11_11 406 IF( ABS( sfx (ji,jj) ) > 1.0e-2 ) THEN ! = 1 psu/day for 1m ocean depth 407 WRITE(numout,*) ' ALERTE 5 : High salt flux' 408 !CALL ice_prt( kt, ji, jj, 3, ' ALERTE 5 : High salt flux ' ) 409 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 410 ENDIF 411 END_2D 420 412 421 413 ! Alert if there is ice on continents 422 414 ialert_id = 6 ! reference number of this alert 423 415 cl_alname(ialert_id) = ' Ice on continents ' ! name of the alert 424 DO jj = 1, jpj 425 DO ji = 1, jpi 426 IF( tmask(ji,jj,1) <= 0._wp .AND. at_i(ji,jj) > 0._wp ) THEN 427 WRITE(numout,*) ' ALERTE 6 : Ice on continents' 428 !CALL ice_prt( kt, ji, jj, 1, ' ALERTE 6 : Ice on continents ' ) 429 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 430 ENDIF 431 END DO 432 END DO 416 DO_2D_11_11 417 IF( tmask(ji,jj,1) <= 0._wp .AND. at_i(ji,jj) > 0._wp ) THEN 418 WRITE(numout,*) ' ALERTE 6 : Ice on continents' 419 !CALL ice_prt( kt, ji, jj, 1, ' ALERTE 6 : Ice on continents ' ) 420 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 421 ENDIF 422 END_2D 433 423 434 424 ! … … 437 427 cl_alname(ialert_id) = ' Very fresh ice ' ! name of the alert 438 428 DO jl = 1, jpl 439 DO jj = 1, jpj 440 DO ji = 1, jpi 441 IF( s_i(ji,jj,jl) < 0.1 .AND. a_i(ji,jj,jl) > 0._wp ) THEN 442 WRITE(numout,*) ' ALERTE 7 : Very fresh ice' 429 DO_2D_11_11 430 IF( s_i(ji,jj,jl) < 0.1 .AND. a_i(ji,jj,jl) > 0._wp ) THEN 431 WRITE(numout,*) ' ALERTE 7 : Very fresh ice' 443 432 ! CALL ice_prt(kt,ji,jj,1, ' ALERTE 7 : Very fresh ice ' ) 444 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 445 ENDIF 446 END DO 447 END DO 433 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 434 ENDIF 435 END_2D 448 436 END DO 449 437 ! … … 451 439 ialert_id = 8 ! reference number of this alert 452 440 cl_alname(ialert_id) = ' fnsolar very big ' ! name of the alert 453 DO jj = 1, jpj 454 DO ji = 1, jpi 455 IF( ABS( qns(ji,jj) ) > 1500._wp .AND. at_i(ji,jj) > 0._wp ) THEN 456 ! 457 WRITE(numout,*) ' ALERTE 8 : Very high non-solar heat flux' 458 !CALL ice_prt( kt, ji, jj, 2, ' ') 459 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 460 ! 461 ENDIF 462 END DO 463 END DO 441 DO_2D_11_11 442 IF( ABS( qns(ji,jj) ) > 1500._wp .AND. at_i(ji,jj) > 0._wp ) THEN 443 ! 444 WRITE(numout,*) ' ALERTE 8 : Very high non-solar heat flux' 445 !CALL ice_prt( kt, ji, jj, 2, ' ') 446 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 447 ! 448 ENDIF 449 END_2D 464 450 !+++++ 465 451 … … 468 454 cl_alname(ialert_id) = ' Very old ice ' ! name of the alert 469 455 DO jl = 1, jpl 470 DO jj = 1, jpj 471 DO ji = 1, jpi 472 IF ( ( ( ABS( o_i(ji,jj,jl) ) > rdt_ice ) .OR. & 473 ( ABS( o_i(ji,jj,jl) ) < 0._wp) ) .AND. & 474 ( a_i(ji,jj,jl) > 0._wp ) ) THEN 475 WRITE(numout,*) ' ALERTE 9 : Wrong ice age' 476 !CALL ice_prt( kt, ji, jj, 1, ' ALERTE 9 : Wrong ice age ') 477 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 478 ENDIF 479 END DO 480 END DO 456 DO_2D_11_11 457 IF ( ( ( ABS( o_i(ji,jj,jl) ) > rdt_ice ) .OR. & 458 ( ABS( o_i(ji,jj,jl) ) < 0._wp) ) .AND. & 459 ( a_i(ji,jj,jl) > 0._wp ) ) THEN 460 WRITE(numout,*) ' ALERTE 9 : Wrong ice age' 461 !CALL ice_prt( kt, ji, jj, 1, ' ALERTE 9 : Wrong ice age ') 462 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 463 ENDIF 464 END_2D 481 465 END DO 482 466 … … 486 470 inb_alp(ialert_id) = 0 487 471 DO jl = 1, jpl 488 DO jk = 1, nlay_i 489 DO jj = 1, jpj 490 DO ji = 1, jpi 491 ztmelts = -rTmlt * sz_i(ji,jj,jk,jl) + rt0 492 IF( t_i(ji,jj,jk,jl) > ztmelts .AND. v_i(ji,jj,jl) > 1.e-10 & 493 & .AND. a_i(ji,jj,jl) > 0._wp ) THEN 494 WRITE(numout,*) ' ALERTE 10 : Very warm ice' 495 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 496 ENDIF 497 END DO 498 END DO 499 END DO 472 DO_3D_11_11( 1, nlay_i ) 473 ztmelts = -rTmlt * sz_i(ji,jj,jk,jl) + rt0 474 IF( t_i(ji,jj,jk,jl) > ztmelts .AND. v_i(ji,jj,jl) > 1.e-10 & 475 & .AND. a_i(ji,jj,jl) > 0._wp ) THEN 476 WRITE(numout,*) ' ALERTE 10 : Very warm ice' 477 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 478 ENDIF 479 END_3D 500 480 END DO 501 481 … … 695 675 !! *** ROUTINE ice_prt3D *** 696 676 !! 697 !! ** Purpose : CTL prints of ice arrays in case ln_ctl is activated677 !! ** Purpose : CTL prints of ice arrays in case sn_cfctl%prtctl is activated 698 678 !! 699 679 !!------------------------------------------------------------------- -
NEMO/trunk/src/ICE/icedia.F90
r11536 r12377 38 38 REAL(wp) :: frc_sal, frc_voltop, frc_volbot, frc_temtop, frc_tembot ! global forcing trends 39 39 40 !! * Substitutions41 # include "vectopt_loop_substitute.h90"42 40 !!---------------------------------------------------------------------- 43 41 !! NEMO/ICE 4.0 , NEMO Consortium (2018) … … 178 176 !!---------------------------------------------------------------------- 179 177 ! 180 REWIND( numnam_ice_ref ) ! Namelist namdia in reference namelist : Parameters for ice181 178 READ ( numnam_ice_ref, namdia, IOSTAT = ios, ERR = 901) 182 179 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namdia in reference namelist' ) 183 REWIND( numnam_ice_cfg ) ! Namelist namdia in configuration namelist : Parameters for ice184 180 READ ( numnam_ice_cfg, namdia, IOSTAT = ios, ERR = 902 ) 185 181 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namdia in configuration namelist' ) -
NEMO/trunk/src/ICE/icedyn.F90
r11536 r12377 52 52 53 53 !! * Substitutions 54 # include " vectopt_loop_substitute.h90"54 # include "do_loop_substitute.h90" 55 55 !!---------------------------------------------------------------------- 56 56 !! NEMO/ICE 4.0 , NEMO Consortium (2018) … … 60 60 CONTAINS 61 61 62 SUBROUTINE ice_dyn( kt )62 SUBROUTINE ice_dyn( kt, Kmm ) 63 63 !!------------------------------------------------------------------- 64 64 !! *** ROUTINE ice_dyn *** … … 73 73 !!-------------------------------------------------------------------- 74 74 INTEGER, INTENT(in) :: kt ! ice time step 75 INTEGER, INTENT(in) :: Kmm ! ocean time level index 75 76 !! 76 77 INTEGER :: ji, jj ! dummy loop indices … … 108 109 CASE ( np_dynALL ) !== all dynamical processes ==! 109 110 ! 110 CALL ice_dyn_rhg ( kt )! -- rheology111 CALL ice_dyn_rhg ( kt, Kmm ) ! -- rheology 111 112 CALL ice_dyn_adv ( kt ) ! -- advection of ice 112 113 CALL ice_dyn_rdgrft( kt ) ! -- ridging/rafting … … 115 116 CASE ( np_dynRHGADV ) !== no ridge/raft & no corrections ==! 116 117 ! 117 CALL ice_dyn_rhg ( kt )! -- rheology118 CALL ice_dyn_rhg ( kt, Kmm ) ! -- rheology 118 119 CALL ice_dyn_adv ( kt ) ! -- advection of ice 119 120 CALL Hpiling ! -- simple pile-up (replaces ridging/rafting) … … 125 126 ! CFL = 0.5 at a distance from the bound of 1/6 of the basin length 126 127 ! Then for dx = 2m and dt = 1s => rn_uice = u (1/6th) = 1m/s 127 DO jj = 1, jpj 128 DO ji = 1, jpi 129 zcoefu = ( REAL(jpiglo+1)*0.5 - REAL(ji+nimpp-1) ) / ( REAL(jpiglo+1)*0.5 - 1. ) 130 zcoefv = ( REAL(jpjglo+1)*0.5 - REAL(jj+njmpp-1) ) / ( REAL(jpjglo+1)*0.5 - 1. ) 131 u_ice(ji,jj) = rn_uice * 1.5 * SIGN( 1., zcoefu ) * ABS( zcoefu ) * umask(ji,jj,1) 132 v_ice(ji,jj) = rn_vice * 1.5 * SIGN( 1., zcoefv ) * ABS( zcoefv ) * vmask(ji,jj,1) 133 END DO 134 END DO 128 DO_2D_11_11 129 zcoefu = ( REAL(jpiglo+1)*0.5 - REAL(ji+nimpp-1) ) / ( REAL(jpiglo+1)*0.5 - 1. ) 130 zcoefv = ( REAL(jpjglo+1)*0.5 - REAL(jj+njmpp-1) ) / ( REAL(jpjglo+1)*0.5 - 1. ) 131 u_ice(ji,jj) = rn_uice * 1.5 * SIGN( 1., zcoefu ) * ABS( zcoefu ) * umask(ji,jj,1) 132 v_ice(ji,jj) = rn_vice * 1.5 * SIGN( 1., zcoefv ) * ABS( zcoefv ) * vmask(ji,jj,1) 133 END_2D 135 134 ! --- 136 135 CALL ice_dyn_adv ( kt ) ! -- advection of ice … … 156 155 157 156 ALLOCATE( zdivu_i(jpi,jpj) ) 158 DO jj = 2, jpjm1 159 DO ji = 2, jpim1 160 zdivu_i(ji,jj) = ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj) & 161 & + e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1) ) * r1_e1e2t(ji,jj) 162 END DO 163 END DO 157 DO_2D_00_00 158 zdivu_i(ji,jj) = ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj) & 159 & + e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1) ) * r1_e1e2t(ji,jj) 160 END_2D 164 161 CALL lbc_lnk( 'icedyn', zdivu_i, 'T', 1. ) 165 162 ! output … … 224 221 !!------------------------------------------------------------------- 225 222 ! 226 REWIND( numnam_ice_ref ) ! Namelist namdyn in reference namelist : Ice dynamics227 223 READ ( numnam_ice_ref, namdyn, IOSTAT = ios, ERR = 901) 228 224 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namdyn in reference namelist' ) 229 REWIND( numnam_ice_cfg ) ! Namelist namdyn in configuration namelist : Ice dynamics230 225 READ ( numnam_ice_cfg, namdyn, IOSTAT = ios, ERR = 902 ) 231 226 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namdyn in configuration namelist' ) -
NEMO/trunk/src/ICE/icedyn_adv.F90
r12197 r12377 42 42 INTEGER :: nn_UMx ! order of the UMx advection scheme 43 43 ! 44 !! * Substitution45 # include "vectopt_loop_substitute.h90"46 44 !!---------------------------------------------------------------------- 47 45 !! NEMO/ICE 4.0 , NEMO Consortium (2018) … … 131 129 !!------------------------------------------------------------------- 132 130 ! 133 REWIND( numnam_ice_ref ) ! Namelist namdyn_adv in reference namelist : Ice dynamics134 131 READ ( numnam_ice_ref, namdyn_adv, IOSTAT = ios, ERR = 901) 135 132 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namdyn_adv in reference namelist' ) 136 REWIND( numnam_ice_cfg ) ! Namelist namdyn_adv in configuration namelist : Ice dynamics137 133 READ ( numnam_ice_cfg, namdyn_adv, IOSTAT = ios, ERR = 902 ) 138 134 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namdyn_adv in configuration namelist' ) -
NEMO/trunk/src/ICE/icedyn_adv_pra.F90
r12197 r12377 46 46 47 47 !! * Substitutions 48 # include " vectopt_loop_substitute.h90"48 # include "do_loop_substitute.h90" 49 49 !!---------------------------------------------------------------------- 50 50 !! NEMO/ICE 4.0 , NEMO Consortium (2018) … … 102 102 ! --- Record max of the surrounding 9-pts ice thick. (for call Hbig) --- ! 103 103 DO jl = 1, jpl 104 DO jj = 2, jpjm1 105 DO ji = fs_2, fs_jpim1 106 zhip_max(ji,jj,jl) = MAX( epsi20, ph_ip(ji,jj,jl), ph_ip(ji+1,jj ,jl), ph_ip(ji ,jj+1,jl), & 107 & ph_ip(ji-1,jj ,jl), ph_ip(ji ,jj-1,jl), & 108 & ph_ip(ji+1,jj+1,jl), ph_ip(ji-1,jj-1,jl), & 109 & ph_ip(ji+1,jj-1,jl), ph_ip(ji-1,jj+1,jl) ) 110 zhi_max (ji,jj,jl) = MAX( epsi20, ph_i (ji,jj,jl), ph_i (ji+1,jj ,jl), ph_i (ji ,jj+1,jl), & 111 & ph_i (ji-1,jj ,jl), ph_i (ji ,jj-1,jl), & 112 & ph_i (ji+1,jj+1,jl), ph_i (ji-1,jj-1,jl), & 113 & ph_i (ji+1,jj-1,jl), ph_i (ji-1,jj+1,jl) ) 114 zhs_max (ji,jj,jl) = MAX( epsi20, ph_s (ji,jj,jl), ph_s (ji+1,jj ,jl), ph_s (ji ,jj+1,jl), & 115 & ph_s (ji-1,jj ,jl), ph_s (ji ,jj-1,jl), & 116 & ph_s (ji+1,jj+1,jl), ph_s (ji-1,jj-1,jl), & 117 & ph_s (ji+1,jj-1,jl), ph_s (ji-1,jj+1,jl) ) 118 END DO 119 END DO 104 DO_2D_00_00 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_2D 120 118 END DO 121 119 CALL lbc_lnk_multi( 'icedyn_adv_pra', zhi_max, 'T', 1., zhs_max, 'T', 1., zhip_max, 'T', 1. ) … … 252 250 ! derive open water from ice concentration 253 251 zati2(:,:) = SUM( pa_i(:,:,:), dim=3 ) 254 DO jj = 2, jpjm1 255 DO ji = fs_2, fs_jpim1 256 pato_i(ji,jj) = pato_i(ji,jj) - ( zati2(ji,jj) - zati1(ji,jj) ) & !--- open water 257 & - ( zudy(ji,jj) - zudy(ji-1,jj) + zvdx(ji,jj) - zvdx(ji,jj-1) ) * r1_e1e2t(ji,jj) * zdt 258 END DO 259 END DO 252 DO_2D_00_00 253 pato_i(ji,jj) = pato_i(ji,jj) - ( zati2(ji,jj) - zati1(ji,jj) ) & !--- open water 254 & - ( zudy(ji,jj) - zudy(ji-1,jj) + zvdx(ji,jj) - zvdx(ji,jj-1) ) * r1_e1e2t(ji,jj) * zdt 255 END_2D 260 256 CALL lbc_lnk( 'icedyn_adv_pra', pato_i, 'T', 1. ) 261 257 ! … … 309 305 ! 310 306 ! Limitation of moments. 311 DO jj = 2, jpjm1 312 DO ji = 1, jpi 313 ! Initialize volumes of boxes (=area if adv_x first called, =psm otherwise) 314 psm (ji,jj,jl) = MAX( pcrh * e1e2t(ji,jj) + ( 1.0 - pcrh ) * psm(ji,jj,jl) , epsi20 ) 315 ! 316 zslpmax = MAX( 0._wp, ps0(ji,jj,jl) ) 317 zs1max = 1.5 * zslpmax 318 zs1new = MIN( zs1max, MAX( -zs1max, psx(ji,jj,jl) ) ) 319 zs2new = MIN( 2.0 * zslpmax - 0.3334 * ABS( zs1new ), & 320 & MAX( ABS( zs1new ) - zslpmax, psxx(ji,jj,jl) ) ) 321 rswitch = ( 1.0 - MAX( 0._wp, SIGN( 1._wp, -zslpmax) ) ) * tmask(ji,jj,1) ! Case of empty boxes & Apply mask 322 323 ps0 (ji,jj,jl) = zslpmax 324 psx (ji,jj,jl) = zs1new * rswitch 325 psxx(ji,jj,jl) = zs2new * rswitch 326 psy (ji,jj,jl) = psy (ji,jj,jl) * rswitch 327 psyy(ji,jj,jl) = psyy(ji,jj,jl) * rswitch 328 psxy(ji,jj,jl) = MIN( zslpmax, MAX( -zslpmax, psxy(ji,jj,jl) ) ) * rswitch 329 END DO 330 END DO 307 DO_2D_00_11 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 331 325 332 326 ! Calculate fluxes and moments between boxes i<-->i+1 333 DO jj = 2, jpjm1 ! Flux from i to i+1 WHEN u GT 0 334 DO ji = 1, jpi 335 zbet(ji,jj) = MAX( 0._wp, SIGN( 1._wp, put(ji,jj) ) ) 336 zalf = MAX( 0._wp, put(ji,jj) ) * pdt / psm(ji,jj,jl) 337 zalfq = zalf * zalf 338 zalf1 = 1.0 - zalf 339 zalf1q = zalf1 * zalf1 340 ! 341 zfm (ji,jj) = zalf * psm (ji,jj,jl) 342 zf0 (ji,jj) = zalf * ( ps0 (ji,jj,jl) + zalf1 * ( psx(ji,jj,jl) + (zalf1 - zalf) * psxx(ji,jj,jl) ) ) 343 zfx (ji,jj) = zalfq * ( psx (ji,jj,jl) + 3.0 * zalf1 * psxx(ji,jj,jl) ) 344 zfxx(ji,jj) = zalf * psxx(ji,jj,jl) * zalfq 345 zfy (ji,jj) = zalf * ( psy (ji,jj,jl) + zalf1 * psxy(ji,jj,jl) ) 346 zfxy(ji,jj) = zalfq * psxy(ji,jj,jl) 347 zfyy(ji,jj) = zalf * psyy(ji,jj,jl) 348 349 ! Readjust moments remaining in the box. 350 psm (ji,jj,jl) = psm (ji,jj,jl) - zfm(ji,jj) 351 ps0 (ji,jj,jl) = ps0 (ji,jj,jl) - zf0(ji,jj) 352 psx (ji,jj,jl) = zalf1q * ( psx(ji,jj,jl) - 3.0 * zalf * psxx(ji,jj,jl) ) 353 psxx(ji,jj,jl) = zalf1 * zalf1q * psxx(ji,jj,jl) 354 psy (ji,jj,jl) = psy (ji,jj,jl) - zfy(ji,jj) 355 psyy(ji,jj,jl) = psyy(ji,jj,jl) - zfyy(ji,jj) 356 psxy(ji,jj,jl) = zalf1q * psxy(ji,jj,jl) 357 END DO 358 END DO 359 360 DO jj = 2, jpjm1 ! Flux from i+1 to i when u LT 0. 361 DO ji = 1, fs_jpim1 362 zalf = MAX( 0._wp, -put(ji,jj) ) * pdt / psm(ji+1,jj,jl) 363 zalg (ji,jj) = zalf 364 zalfq = zalf * zalf 365 zalf1 = 1.0 - zalf 366 zalg1 (ji,jj) = zalf1 367 zalf1q = zalf1 * zalf1 368 zalg1q(ji,jj) = zalf1q 369 ! 370 zfm (ji,jj) = zfm (ji,jj) + zalf * psm (ji+1,jj,jl) 371 zf0 (ji,jj) = zf0 (ji,jj) + zalf * ( ps0 (ji+1,jj,jl) & 372 & - zalf1 * ( psx(ji+1,jj,jl) - (zalf1 - zalf ) * psxx(ji+1,jj,jl) ) ) 373 zfx (ji,jj) = zfx (ji,jj) + zalfq * ( psx (ji+1,jj,jl) - 3.0 * zalf1 * psxx(ji+1,jj,jl) ) 374 zfxx (ji,jj) = zfxx(ji,jj) + zalf * psxx(ji+1,jj,jl) * zalfq 375 zfy (ji,jj) = zfy (ji,jj) + zalf * ( psy (ji+1,jj,jl) - zalf1 * psxy(ji+1,jj,jl) ) 376 zfxy (ji,jj) = zfxy(ji,jj) + zalfq * psxy(ji+1,jj,jl) 377 zfyy (ji,jj) = zfyy(ji,jj) + zalf * psyy(ji+1,jj,jl) 378 END DO 379 END DO 380 381 DO jj = 2, jpjm1 ! Readjust moments remaining in the box. 382 DO ji = fs_2, fs_jpim1 383 zbt = zbet(ji-1,jj) 384 zbt1 = 1.0 - zbet(ji-1,jj) 385 ! 386 psm (ji,jj,jl) = zbt * psm(ji,jj,jl) + zbt1 * ( psm(ji,jj,jl) - zfm(ji-1,jj) ) 387 ps0 (ji,jj,jl) = zbt * ps0(ji,jj,jl) + zbt1 * ( ps0(ji,jj,jl) - zf0(ji-1,jj) ) 388 psx (ji,jj,jl) = zalg1q(ji-1,jj) * ( psx(ji,jj,jl) + 3.0 * zalg(ji-1,jj) * psxx(ji,jj,jl) ) 389 psxx(ji,jj,jl) = zalg1 (ji-1,jj) * zalg1q(ji-1,jj) * psxx(ji,jj,jl) 390 psy (ji,jj,jl) = zbt * psy (ji,jj,jl) + zbt1 * ( psy (ji,jj,jl) - zfy (ji-1,jj) ) 391 psyy(ji,jj,jl) = zbt * psyy(ji,jj,jl) + zbt1 * ( psyy(ji,jj,jl) - zfyy(ji-1,jj) ) 392 psxy(ji,jj,jl) = zalg1q(ji-1,jj) * psxy(ji,jj,jl) 393 END DO 394 END DO 327 DO_2D_00_11 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_00_10 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_00_00 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 395 383 396 384 ! Put the temporary moments into appropriate neighboring boxes. 397 DO jj = 2, jpjm1 ! Flux from i to i+1 IF u GT 0. 398 DO ji = fs_2, fs_jpim1 399 zbt = zbet(ji-1,jj) 400 zbt1 = 1.0 - zbet(ji-1,jj) 401 psm(ji,jj,jl) = zbt * ( psm(ji,jj,jl) + zfm(ji-1,jj) ) + zbt1 * psm(ji,jj,jl) 402 zalf = zbt * zfm(ji-1,jj) / psm(ji,jj,jl) 403 zalf1 = 1.0 - zalf 404 ztemp = zalf * ps0(ji,jj,jl) - zalf1 * zf0(ji-1,jj) 405 ! 406 ps0 (ji,jj,jl) = zbt * ( ps0(ji,jj,jl) + zf0(ji-1,jj) ) + zbt1 * ps0(ji,jj,jl) 407 psx (ji,jj,jl) = zbt * ( zalf * zfx(ji-1,jj) + zalf1 * psx(ji,jj,jl) + 3.0 * ztemp ) + zbt1 * psx(ji,jj,jl) 408 psxx(ji,jj,jl) = zbt * ( zalf * zalf * zfxx(ji-1,jj) + zalf1 * zalf1 * psxx(ji,jj,jl) & 409 & + 5.0 * ( zalf * zalf1 * ( psx (ji,jj,jl) - zfx(ji-1,jj) ) - ( zalf1 - zalf ) * ztemp ) ) & 410 & + zbt1 * psxx(ji,jj,jl) 411 psxy(ji,jj,jl) = zbt * ( zalf * zfxy(ji-1,jj) + zalf1 * psxy(ji,jj,jl) & 412 & + 3.0 * (- zalf1*zfy(ji-1,jj) + zalf * psy(ji,jj,jl) ) ) & 413 & + zbt1 * psxy(ji,jj,jl) 414 psy (ji,jj,jl) = zbt * ( psy (ji,jj,jl) + zfy (ji-1,jj) ) + zbt1 * psy (ji,jj,jl) 415 psyy(ji,jj,jl) = zbt * ( psyy(ji,jj,jl) + zfyy(ji-1,jj) ) + zbt1 * psyy(ji,jj,jl) 416 END DO 417 END DO 418 419 DO jj = 2, jpjm1 ! Flux from i+1 to i IF u LT 0. 420 DO ji = fs_2, fs_jpim1 421 zbt = zbet(ji,jj) 422 zbt1 = 1.0 - zbet(ji,jj) 423 psm(ji,jj,jl) = zbt * psm(ji,jj,jl) + zbt1 * ( psm(ji,jj,jl) + zfm(ji,jj) ) 424 zalf = zbt1 * zfm(ji,jj) / psm(ji,jj,jl) 425 zalf1 = 1.0 - zalf 426 ztemp = - zalf * ps0(ji,jj,jl) + zalf1 * zf0(ji,jj) 427 ! 428 ps0 (ji,jj,jl) = zbt * ps0 (ji,jj,jl) + zbt1 * ( ps0(ji,jj,jl) + zf0(ji,jj) ) 429 psx (ji,jj,jl) = zbt * psx (ji,jj,jl) + zbt1 * ( zalf * zfx(ji,jj) + zalf1 * psx(ji,jj,jl) + 3.0 * ztemp ) 430 psxx(ji,jj,jl) = zbt * psxx(ji,jj,jl) + zbt1 * ( zalf * zalf * zfxx(ji,jj) + zalf1 * zalf1 * psxx(ji,jj,jl) & 431 & + 5.0 * ( zalf * zalf1 * ( - psx(ji,jj,jl) + zfx(ji,jj) ) & 432 & + ( zalf1 - zalf ) * ztemp ) ) 433 psxy(ji,jj,jl) = zbt * psxy(ji,jj,jl) + zbt1 * ( zalf * zfxy(ji,jj) + zalf1 * psxy(ji,jj,jl) & 434 & + 3.0 * ( zalf1 * zfy(ji,jj) - zalf * psy(ji,jj,jl) ) ) 435 psy (ji,jj,jl) = zbt * psy (ji,jj,jl) + zbt1 * ( psy (ji,jj,jl) + zfy (ji,jj) ) 436 psyy(ji,jj,jl) = zbt * psyy(ji,jj,jl) + zbt1 * ( psyy(ji,jj,jl) + zfyy(ji,jj) ) 437 END DO 438 END DO 385 DO_2D_00_00 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_00_00 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 439 423 440 424 END DO … … 478 462 ! 479 463 ! Limitation of moments. 480 DO jj = 1, jpj 481 DO ji = fs_2, fs_jpim1 482 ! Initialize volumes of boxes (=area if adv_x first called, =psm otherwise) 483 psm(ji,jj,jl) = MAX( pcrh * e1e2t(ji,jj) + ( 1.0 - pcrh ) * psm(ji,jj,jl) , epsi20 ) 484 ! 485 zslpmax = MAX( 0._wp, ps0(ji,jj,jl) ) 486 zs1max = 1.5 * zslpmax 487 zs1new = MIN( zs1max, MAX( -zs1max, psy(ji,jj,jl) ) ) 488 zs2new = MIN( ( 2.0 * zslpmax - 0.3334 * ABS( zs1new ) ), & 489 & MAX( ABS( zs1new )-zslpmax, psyy(ji,jj,jl) ) ) 490 rswitch = ( 1.0 - MAX( 0._wp, SIGN( 1._wp, -zslpmax) ) ) * tmask(ji,jj,1) ! Case of empty boxes & Apply mask 491 ! 492 ps0 (ji,jj,jl) = zslpmax 493 psx (ji,jj,jl) = psx (ji,jj,jl) * rswitch 494 psxx(ji,jj,jl) = psxx(ji,jj,jl) * rswitch 495 psy (ji,jj,jl) = zs1new * rswitch 496 psyy(ji,jj,jl) = zs2new * rswitch 497 psxy(ji,jj,jl) = MIN( zslpmax, MAX( -zslpmax, psxy(ji,jj,jl) ) ) * rswitch 498 END DO 499 END DO 464 DO_2D_11_00 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) ) 469 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) ) ) 473 rswitch = ( 1.0 - MAX( 0._wp, SIGN( 1._wp, -zslpmax) ) ) * tmask(ji,jj,1) ! Case of empty boxes & Apply mask 474 ! 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 500 482 501 483 ! Calculate fluxes and moments between boxes j<-->j+1 502 DO jj = 1, jpj ! Flux from j to j+1 WHEN v GT 0 503 DO ji = fs_2, fs_jpim1 504 zbet(ji,jj) = MAX( 0._wp, SIGN( 1._wp, pvt(ji,jj) ) ) 505 zalf = MAX( 0._wp, pvt(ji,jj) ) * pdt / psm(ji,jj,jl) 506 zalfq = zalf * zalf 507 zalf1 = 1.0 - zalf 508 zalf1q = zalf1 * zalf1 509 ! 510 zfm (ji,jj) = zalf * psm(ji,jj,jl) 511 zf0 (ji,jj) = zalf * ( ps0(ji,jj,jl) + zalf1 * ( psy(ji,jj,jl) + (zalf1-zalf) * psyy(ji,jj,jl) ) ) 512 zfy (ji,jj) = zalfq *( psy(ji,jj,jl) + 3.0*zalf1*psyy(ji,jj,jl) ) 513 zfyy(ji,jj) = zalf * zalfq * psyy(ji,jj,jl) 514 zfx (ji,jj) = zalf * ( psx(ji,jj,jl) + zalf1 * psxy(ji,jj,jl) ) 515 zfxy(ji,jj) = zalfq * psxy(ji,jj,jl) 516 zfxx(ji,jj) = zalf * psxx(ji,jj,jl) 517 ! 518 ! Readjust moments remaining in the box. 519 psm (ji,jj,jl) = psm (ji,jj,jl) - zfm(ji,jj) 520 ps0 (ji,jj,jl) = ps0 (ji,jj,jl) - zf0(ji,jj) 521 psy (ji,jj,jl) = zalf1q * ( psy(ji,jj,jl) -3.0 * zalf * psyy(ji,jj,jl) ) 522 psyy(ji,jj,jl) = zalf1 * zalf1q * psyy(ji,jj,jl) 523 psx (ji,jj,jl) = psx (ji,jj,jl) - zfx(ji,jj) 524 psxx(ji,jj,jl) = psxx(ji,jj,jl) - zfxx(ji,jj) 525 psxy(ji,jj,jl) = zalf1q * psxy(ji,jj,jl) 526 END DO 527 END DO 528 ! 529 DO jj = 1, jpjm1 ! Flux from j+1 to j when v LT 0. 530 DO ji = fs_2, fs_jpim1 531 zalf = MAX( 0._wp, -pvt(ji,jj) ) * pdt / psm(ji,jj+1,jl) 532 zalg (ji,jj) = zalf 533 zalfq = zalf * zalf 534 zalf1 = 1.0 - zalf 535 zalg1 (ji,jj) = zalf1 536 zalf1q = zalf1 * zalf1 537 zalg1q(ji,jj) = zalf1q 538 ! 539 zfm (ji,jj) = zfm (ji,jj) + zalf * psm (ji,jj+1,jl) 540 zf0 (ji,jj) = zf0 (ji,jj) + zalf * ( ps0 (ji,jj+1,jl) & 541 & - zalf1 * (psy(ji,jj+1,jl) - (zalf1 - zalf ) * psyy(ji,jj+1,jl) ) ) 542 zfy (ji,jj) = zfy (ji,jj) + zalfq * ( psy (ji,jj+1,jl) - 3.0 * zalf1 * psyy(ji,jj+1,jl) ) 543 zfyy (ji,jj) = zfyy(ji,jj) + zalf * psyy(ji,jj+1,jl) * zalfq 544 zfx (ji,jj) = zfx (ji,jj) + zalf * ( psx (ji,jj+1,jl) - zalf1 * psxy(ji,jj+1,jl) ) 545 zfxy (ji,jj) = zfxy(ji,jj) + zalfq * psxy(ji,jj+1,jl) 546 zfxx (ji,jj) = zfxx(ji,jj) + zalf * psxx(ji,jj+1,jl) 547 END DO 548 END DO 484 DO_2D_11_00 485 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) 487 zalfq = zalf * zalf 488 zalf1 = 1.0 - zalf 489 zalf1q = zalf1 * zalf1 490 ! 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) 507 END_2D 508 ! 509 DO_2D_10_00 510 zalf = MAX( 0._wp, -pvt(ji,jj) ) * pdt / psm(ji,jj+1,jl) 511 zalg (ji,jj) = zalf 512 zalfq = zalf * zalf 513 zalf1 = 1.0 - zalf 514 zalg1 (ji,jj) = zalf1 515 zalf1q = zalf1 * zalf1 516 zalg1q(ji,jj) = zalf1q 517 ! 518 zfm (ji,jj) = zfm (ji,jj) + zalf * psm (ji,jj+1,jl) 519 zf0 (ji,jj) = zf0 (ji,jj) + zalf * ( ps0 (ji,jj+1,jl) & 520 & - zalf1 * (psy(ji,jj+1,jl) - (zalf1 - zalf ) * psyy(ji,jj+1,jl) ) ) 521 zfy (ji,jj) = zfy (ji,jj) + zalfq * ( psy (ji,jj+1,jl) - 3.0 * zalf1 * psyy(ji,jj+1,jl) ) 522 zfyy (ji,jj) = zfyy(ji,jj) + zalf * psyy(ji,jj+1,jl) * zalfq 523 zfx (ji,jj) = zfx (ji,jj) + zalf * ( psx (ji,jj+1,jl) - zalf1 * psxy(ji,jj+1,jl) ) 524 zfxy (ji,jj) = zfxy(ji,jj) + zalfq * psxy(ji,jj+1,jl) 525 zfxx (ji,jj) = zfxx(ji,jj) + zalf * psxx(ji,jj+1,jl) 526 END_2D 549 527 550 528 ! Readjust moments remaining in the box. 551 DO jj = 2, jpjm1 552 DO ji = fs_2, fs_jpim1 553 zbt = zbet(ji,jj-1) 554 zbt1 = ( 1.0 - zbet(ji,jj-1) ) 555 ! 556 psm (ji,jj,jl) = zbt * psm(ji,jj,jl) + zbt1 * ( psm(ji,jj,jl) - zfm(ji,jj-1) ) 557 ps0 (ji,jj,jl) = zbt * ps0(ji,jj,jl) + zbt1 * ( ps0(ji,jj,jl) - zf0(ji,jj-1) ) 558 psy (ji,jj,jl) = zalg1q(ji,jj-1) * ( psy(ji,jj,jl) + 3.0 * zalg(ji,jj-1) * psyy(ji,jj,jl) ) 559 psyy(ji,jj,jl) = zalg1 (ji,jj-1) * zalg1q(ji,jj-1) * psyy(ji,jj,jl) 560 psx (ji,jj,jl) = zbt * psx (ji,jj,jl) + zbt1 * ( psx (ji,jj,jl) - zfx (ji,jj-1) ) 561 psxx(ji,jj,jl) = zbt * psxx(ji,jj,jl) + zbt1 * ( psxx(ji,jj,jl) - zfxx(ji,jj-1) ) 562 psxy(ji,jj,jl) = zalg1q(ji,jj-1) * psxy(ji,jj,jl) 563 END DO 564 END DO 529 DO_2D_00_00 530 zbt = zbet(ji,jj-1) 531 zbt1 = ( 1.0 - zbet(ji,jj-1) ) 532 ! 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) 540 END_2D 565 541 566 542 ! Put the temporary moments into appropriate neighboring boxes. 567 DO jj = 2, jpjm1 ! Flux from j to j+1 IF v GT 0. 568 DO ji = fs_2, fs_jpim1 569 zbt = zbet(ji,jj-1) 570 zbt1 = 1.0 - zbet(ji,jj-1) 571 psm(ji,jj,jl) = zbt * ( psm(ji,jj,jl) + zfm(ji,jj-1) ) + zbt1 * psm(ji,jj,jl) 572 zalf = zbt * zfm(ji,jj-1) / psm(ji,jj,jl) 573 zalf1 = 1.0 - zalf 574 ztemp = zalf * ps0(ji,jj,jl) - zalf1 * zf0(ji,jj-1) 575 ! 576 ps0(ji,jj,jl) = zbt * ( ps0(ji,jj,jl) + zf0(ji,jj-1) ) + zbt1 * ps0(ji,jj,jl) 577 psy(ji,jj,jl) = zbt * ( zalf * zfy(ji,jj-1) + zalf1 * psy(ji,jj,jl) + 3.0 * ztemp ) & 578 & + zbt1 * psy(ji,jj,jl) 579 psyy(ji,jj,jl) = zbt * ( zalf * zalf * zfyy(ji,jj-1) + zalf1 * zalf1 * psyy(ji,jj,jl) & 580 & + 5.0 * ( zalf * zalf1 * ( psy(ji,jj,jl) - zfy(ji,jj-1) ) - ( zalf1 - zalf ) * ztemp ) ) & 581 & + zbt1 * psyy(ji,jj,jl) 582 psxy(ji,jj,jl) = zbt * ( zalf * zfxy(ji,jj-1) + zalf1 * psxy(ji,jj,jl) & 583 & + 3.0 * (- zalf1 * zfx(ji,jj-1) + zalf * psx(ji,jj,jl) ) ) & 584 & + zbt1 * psxy(ji,jj,jl) 585 psx (ji,jj,jl) = zbt * ( psx (ji,jj,jl) + zfx (ji,jj-1) ) + zbt1 * psx (ji,jj,jl) 586 psxx(ji,jj,jl) = zbt * ( psxx(ji,jj,jl) + zfxx(ji,jj-1) ) + zbt1 * psxx(ji,jj,jl) 587 END DO 588 END DO 589 590 DO jj = 2, jpjm1 ! Flux from j+1 to j IF v LT 0. 591 DO ji = fs_2, fs_jpim1 592 zbt = zbet(ji,jj) 593 zbt1 = 1.0 - zbet(ji,jj) 594 psm(ji,jj,jl) = zbt * psm(ji,jj,jl) + zbt1 * ( psm(ji,jj,jl) + zfm(ji,jj) ) 595 zalf = zbt1 * zfm(ji,jj) / psm(ji,jj,jl) 596 zalf1 = 1.0 - zalf 597 ztemp = - zalf * ps0(ji,jj,jl) + zalf1 * zf0(ji,jj) 598 ! 599 ps0 (ji,jj,jl) = zbt * ps0 (ji,jj,jl) + zbt1 * ( ps0(ji,jj,jl) + zf0(ji,jj) ) 600 psy (ji,jj,jl) = zbt * psy (ji,jj,jl) + zbt1 * ( zalf * zfy(ji,jj) + zalf1 * psy(ji,jj,jl) + 3.0 * ztemp ) 601 psyy(ji,jj,jl) = zbt * psyy(ji,jj,jl) + zbt1 * ( zalf * zalf * zfyy(ji,jj) + zalf1 * zalf1 * psyy(ji,jj,jl) & 602 & + 5.0 * ( zalf * zalf1 * ( - psy(ji,jj,jl) + zfy(ji,jj) ) & 603 & + ( zalf1 - zalf ) * ztemp ) ) 604 psxy(ji,jj,jl) = zbt * psxy(ji,jj,jl) + zbt1 * ( zalf * zfxy(ji,jj) + zalf1 * psxy(ji,jj,jl) & 605 & + 3.0 * ( zalf1 * zfx(ji,jj) - zalf * psx(ji,jj,jl) ) ) 606 psx (ji,jj,jl) = zbt * psx (ji,jj,jl) + zbt1 * ( psx (ji,jj,jl) + zfx (ji,jj) ) 607 psxx(ji,jj,jl) = zbt * psxx(ji,jj,jl) + zbt1 * ( psxx(ji,jj,jl) + zfxx(ji,jj) ) 608 END DO 609 END DO 543 DO_2D_00_00 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_00_00 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 610 582 611 583 END DO … … 646 618 DO jl = 1, jpl 647 619 648 DO jj = 1, jpj 649 DO ji = 1, jpi 650 IF ( pv_i(ji,jj,jl) > 0._wp ) THEN 620 DO_2D_11_11 621 IF ( pv_i(ji,jj,jl) > 0._wp ) THEN 622 ! 623 ! ! -- check h_ip -- ! 624 ! 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 ) THEN 626 zhip = pv_ip(ji,jj,jl) / MAX( epsi20, pa_ip(ji,jj,jl) ) 627 IF( zhip > phip_max(ji,jj,jl) .AND. pa_ip(ji,jj,jl) < 0.15 ) THEN 628 pa_ip(ji,jj,jl) = pv_ip(ji,jj,jl) / phip_max(ji,jj,jl) 629 ENDIF 630 ENDIF 631 ! 632 ! ! -- check h_i -- ! 633 ! if h_i is larger than the surrounding 9 pts => reduce h_i and increase a_i 634 zhi = pv_i(ji,jj,jl) / pa_i(ji,jj,jl) 635 IF( zhi > phi_max(ji,jj,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN 636 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) 637 ENDIF 638 ! 639 ! ! -- check h_s -- ! 640 ! if h_s is larger than the surrounding 9 pts => put the snow excess in the ocean 641 zhs = pv_s(ji,jj,jl) / pa_i(ji,jj,jl) 642 IF( pv_s(ji,jj,jl) > 0._wp .AND. zhs > phs_max(ji,jj,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN 643 zfra = phs_max(ji,jj,jl) / MAX( zhs, epsi20 ) 651 644 ! 652 ! ! -- check h_ip -- ! 653 ! if h_ip is larger than the surrounding 9 pts => reduce h_ip and increase a_ip 654 IF( ln_pnd_H12 .AND. pv_ip(ji,jj,jl) > 0._wp ) THEN 655 zhip = pv_ip(ji,jj,jl) / MAX( epsi20, pa_ip(ji,jj,jl) ) 656 IF( zhip > phip_max(ji,jj,jl) .AND. pa_ip(ji,jj,jl) < 0.15 ) THEN 657 pa_ip(ji,jj,jl) = pv_ip(ji,jj,jl) / phip_max(ji,jj,jl) 658 ENDIF 659 ENDIF 645 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 646 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 660 647 ! 661 ! ! -- check h_i -- ! 662 ! if h_i is larger than the surrounding 9 pts => reduce h_i and increase a_i 663 zhi = pv_i(ji,jj,jl) / pa_i(ji,jj,jl) 664 IF( zhi > phi_max(ji,jj,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN 665 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) 666 ENDIF 667 ! 668 ! ! -- check h_s -- ! 669 ! if h_s is larger than the surrounding 9 pts => put the snow excess in the ocean 670 zhs = pv_s(ji,jj,jl) / pa_i(ji,jj,jl) 671 IF( pv_s(ji,jj,jl) > 0._wp .AND. zhs > phs_max(ji,jj,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN 672 zfra = phs_max(ji,jj,jl) / MAX( zhs, epsi20 ) 673 ! 674 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 675 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 676 ! 677 pe_s(ji,jj,1:nlay_s,jl) = pe_s(ji,jj,1:nlay_s,jl) * zfra 678 pv_s(ji,jj,jl) = pa_i(ji,jj,jl) * phs_max(ji,jj,jl) 679 ENDIF 680 ! 681 ENDIF 682 END DO 683 END DO 648 pe_s(ji,jj,1:nlay_s,jl) = pe_s(ji,jj,1:nlay_s,jl) * zfra 649 pv_s(ji,jj,jl) = pa_i(ji,jj,jl) * phs_max(ji,jj,jl) 650 ENDIF 651 ! 652 ENDIF 653 END_2D 684 654 END DO 685 655 ! … … 714 684 ! -- check snow load -- ! 715 685 DO jl = 1, jpl 716 DO jj = 1, jpj 717 DO ji = 1, jpi 718 IF ( pv_i(ji,jj,jl) > 0._wp ) THEN 719 ! 720 zvs_excess = MAX( 0._wp, pv_s(ji,jj,jl) - pv_i(ji,jj,jl) * (rau0-rhoi) * r1_rhos ) 721 ! 722 IF( zvs_excess > 0._wp ) THEN ! snow-ice interface deplets below the ocean surface 723 ! put snow excess in the ocean 724 zfra = ( pv_s(ji,jj,jl) - zvs_excess ) / MAX( pv_s(ji,jj,jl), epsi20 ) 725 wfx_res(ji,jj) = wfx_res(ji,jj) + zvs_excess * rhos * z1_dt 726 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 727 ! correct snow volume and heat content 728 pe_s(ji,jj,1:nlay_s,jl) = pe_s(ji,jj,1:nlay_s,jl) * zfra 729 pv_s(ji,jj,jl) = pv_s(ji,jj,jl) - zvs_excess 730 ENDIF 731 ! 686 DO_2D_11_11 687 IF ( pv_i(ji,jj,jl) > 0._wp ) THEN 688 ! 689 zvs_excess = MAX( 0._wp, pv_s(ji,jj,jl) - pv_i(ji,jj,jl) * (rau0-rhoi) * r1_rhos ) 690 ! 691 IF( zvs_excess > 0._wp ) THEN ! snow-ice interface deplets below the ocean surface 692 ! put snow excess in the ocean 693 zfra = ( pv_s(ji,jj,jl) - zvs_excess ) / MAX( pv_s(ji,jj,jl), epsi20 ) 694 wfx_res(ji,jj) = wfx_res(ji,jj) + zvs_excess * rhos * z1_dt 695 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 696 ! correct snow volume and heat content 697 pe_s(ji,jj,1:nlay_s,jl) = pe_s(ji,jj,1:nlay_s,jl) * zfra 698 pv_s(ji,jj,jl) = pv_s(ji,jj,jl) - zvs_excess 732 699 ENDIF 733 END DO 734 END DO 700 ! 701 ENDIF 702 END_2D 735 703 END DO 736 704 ! -
NEMO/trunk/src/ICE/icedyn_adv_umx.F90
r12197 r12377 51 51 ! 52 52 !! * Substitutions 53 # include " vectopt_loop_substitute.h90"53 # include "do_loop_substitute.h90" 54 54 !!---------------------------------------------------------------------- 55 55 !! NEMO/ICE 4.0 , NEMO Consortium (2018) … … 107 107 ! --- Record max of the surrounding 9-pts ice thick. (for call Hbig) --- ! 108 108 DO jl = 1, jpl 109 DO jj = 2, jpjm1 110 DO ji = fs_2, fs_jpim1 111 zhip_max(ji,jj,jl) = MAX( epsi20, ph_ip(ji,jj,jl), ph_ip(ji+1,jj ,jl), ph_ip(ji ,jj+1,jl), & 112 & ph_ip(ji-1,jj ,jl), ph_ip(ji ,jj-1,jl), & 113 & ph_ip(ji+1,jj+1,jl), ph_ip(ji-1,jj-1,jl), & 114 & ph_ip(ji+1,jj-1,jl), ph_ip(ji-1,jj+1,jl) ) 115 zhi_max (ji,jj,jl) = MAX( epsi20, ph_i (ji,jj,jl), ph_i (ji+1,jj ,jl), ph_i (ji ,jj+1,jl), & 116 & ph_i (ji-1,jj ,jl), ph_i (ji ,jj-1,jl), & 117 & ph_i (ji+1,jj+1,jl), ph_i (ji-1,jj-1,jl), & 118 & ph_i (ji+1,jj-1,jl), ph_i (ji-1,jj+1,jl) ) 119 zhs_max (ji,jj,jl) = MAX( epsi20, ph_s (ji,jj,jl), ph_s (ji+1,jj ,jl), ph_s (ji ,jj+1,jl), & 120 & ph_s (ji-1,jj ,jl), ph_s (ji ,jj-1,jl), & 121 & ph_s (ji+1,jj+1,jl), ph_s (ji-1,jj-1,jl), & 122 & ph_s (ji+1,jj-1,jl), ph_s (ji-1,jj+1,jl) ) 123 END DO 124 END DO 109 DO_2D_00_00 110 zhip_max(ji,jj,jl) = MAX( epsi20, ph_ip(ji,jj,jl), ph_ip(ji+1,jj ,jl), ph_ip(ji ,jj+1,jl), & 111 & ph_ip(ji-1,jj ,jl), ph_ip(ji ,jj-1,jl), & 112 & ph_ip(ji+1,jj+1,jl), ph_ip(ji-1,jj-1,jl), & 113 & ph_ip(ji+1,jj-1,jl), ph_ip(ji-1,jj+1,jl) ) 114 zhi_max (ji,jj,jl) = MAX( epsi20, ph_i (ji,jj,jl), ph_i (ji+1,jj ,jl), ph_i (ji ,jj+1,jl), & 115 & ph_i (ji-1,jj ,jl), ph_i (ji ,jj-1,jl), & 116 & ph_i (ji+1,jj+1,jl), ph_i (ji-1,jj-1,jl), & 117 & ph_i (ji+1,jj-1,jl), ph_i (ji-1,jj+1,jl) ) 118 zhs_max (ji,jj,jl) = MAX( epsi20, ph_s (ji,jj,jl), ph_s (ji+1,jj ,jl), ph_s (ji ,jj+1,jl), & 119 & ph_s (ji-1,jj ,jl), ph_s (ji ,jj-1,jl), & 120 & ph_s (ji+1,jj+1,jl), ph_s (ji-1,jj-1,jl), & 121 & ph_s (ji+1,jj-1,jl), ph_s (ji-1,jj+1,jl) ) 122 END_2D 125 123 END DO 126 124 CALL lbc_lnk_multi( 'icedyn_adv_umx', zhi_max, 'T', 1., zhs_max, 'T', 1., zhip_max, 'T', 1. ) … … 152 150 ! 153 151 ! --- define velocity for advection: u*grad(H) --- ! 154 DO jj = 2, jpjm1 155 DO ji = fs_2, fs_jpim1 156 IF ( pu_ice(ji,jj) * pu_ice(ji-1,jj) <= 0._wp ) THEN ; zcu_box(ji,jj) = 0._wp 157 ELSEIF( pu_ice(ji,jj) > 0._wp ) THEN ; zcu_box(ji,jj) = pu_ice(ji-1,jj) 158 ELSE ; zcu_box(ji,jj) = pu_ice(ji ,jj) 159 ENDIF 160 161 IF ( pv_ice(ji,jj) * pv_ice(ji,jj-1) <= 0._wp ) THEN ; zcv_box(ji,jj) = 0._wp 162 ELSEIF( pv_ice(ji,jj) > 0._wp ) THEN ; zcv_box(ji,jj) = pv_ice(ji,jj-1) 163 ELSE ; zcv_box(ji,jj) = pv_ice(ji,jj ) 164 ENDIF 165 END DO 166 END DO 152 DO_2D_00_00 153 IF ( pu_ice(ji,jj) * pu_ice(ji-1,jj) <= 0._wp ) THEN ; zcu_box(ji,jj) = 0._wp 154 ELSEIF( pu_ice(ji,jj) > 0._wp ) THEN ; zcu_box(ji,jj) = pu_ice(ji-1,jj) 155 ELSE ; zcu_box(ji,jj) = pu_ice(ji ,jj) 156 ENDIF 157 158 IF ( pv_ice(ji,jj) * pv_ice(ji,jj-1) <= 0._wp ) THEN ; zcv_box(ji,jj) = 0._wp 159 ELSEIF( pv_ice(ji,jj) > 0._wp ) THEN ; zcv_box(ji,jj) = pv_ice(ji,jj-1) 160 ELSE ; zcv_box(ji,jj) = pv_ice(ji,jj ) 161 ENDIF 162 END_2D 167 163 168 164 !---------------! … … 187 183 IF( .NOT. ALLOCATED(jmsk_small) ) ALLOCATE( jmsk_small(jpi,jpj,jpl) ) 188 184 DO jl = 1, jpl 189 DO jj = 1, jpjm1 190 DO ji = 1, jpim1 191 zvi_cen = 0.5_wp * ( pv_i(ji+1,jj,jl) + pv_i(ji,jj,jl) ) 192 IF( zvi_cen < epsi06) THEN ; imsk_small(ji,jj,jl) = 0 193 ELSE ; imsk_small(ji,jj,jl) = 1 ; ENDIF 194 zvi_cen = 0.5_wp * ( pv_i(ji,jj+1,jl) + pv_i(ji,jj,jl) ) 195 IF( zvi_cen < epsi06) THEN ; jmsk_small(ji,jj,jl) = 0 196 ELSE ; jmsk_small(ji,jj,jl) = 1 ; ENDIF 197 END DO 198 END DO 185 DO_2D_10_10 186 zvi_cen = 0.5_wp * ( pv_i(ji+1,jj,jl) + pv_i(ji,jj,jl) ) 187 IF( zvi_cen < epsi06) THEN ; imsk_small(ji,jj,jl) = 0 188 ELSE ; imsk_small(ji,jj,jl) = 1 ; ENDIF 189 zvi_cen = 0.5_wp * ( pv_i(ji,jj+1,jl) + pv_i(ji,jj,jl) ) 190 IF( zvi_cen < epsi06) THEN ; jmsk_small(ji,jj,jl) = 0 191 ELSE ; jmsk_small(ji,jj,jl) = 1 ; ENDIF 192 END_2D 199 193 END DO 200 194 ENDIF … … 338 332 !== Open water area ==! 339 333 zati2(:,:) = SUM( pa_i(:,:,:), dim=3 ) 340 DO jj = 2, jpjm1 341 DO ji = fs_2, fs_jpim1 342 pato_i(ji,jj) = pato_i(ji,jj) - ( zati2(ji,jj) - zati1(ji,jj) ) & 343 & - ( zudy(ji,jj) - zudy(ji-1,jj) + zvdx(ji,jj) - zvdx(ji,jj-1) ) * r1_e1e2t(ji,jj) * zdt 344 END DO 345 END DO 334 DO_2D_00_00 335 pato_i(ji,jj) = pato_i(ji,jj) - ( zati2(ji,jj) - zati1(ji,jj) ) & 336 & - ( zudy(ji,jj) - zudy(ji-1,jj) + zvdx(ji,jj) - zvdx(ji,jj-1) ) * r1_e1e2t(ji,jj) * zdt 337 END_2D 346 338 CALL lbc_lnk( 'icedyn_adv_umx', pato_i, 'T', 1. ) 347 339 ! … … 449 441 IF( pamsk == 0._wp ) THEN 450 442 DO jl = 1, jpl 451 DO jj = 1, jpjm1 452 DO ji = 1, fs_jpim1 453 IF( ABS( pu(ji,jj) ) > epsi10 ) THEN 454 zfu_ho (ji,jj,jl) = zfu_ho (ji,jj,jl) * puc (ji,jj,jl) / pu(ji,jj) 455 zfu_ups(ji,jj,jl) = zfu_ups(ji,jj,jl) * pua_ups(ji,jj,jl) / pu(ji,jj) 456 ELSE 457 zfu_ho (ji,jj,jl) = 0._wp 458 zfu_ups(ji,jj,jl) = 0._wp 459 ENDIF 460 ! 461 IF( ABS( pv(ji,jj) ) > epsi10 ) THEN 462 zfv_ho (ji,jj,jl) = zfv_ho (ji,jj,jl) * pvc (ji,jj,jl) / pv(ji,jj) 463 zfv_ups(ji,jj,jl) = zfv_ups(ji,jj,jl) * pva_ups(ji,jj,jl) / pv(ji,jj) 464 ELSE 465 zfv_ho (ji,jj,jl) = 0._wp 466 zfv_ups(ji,jj,jl) = 0._wp 467 ENDIF 468 END DO 469 END DO 443 DO_2D_10_10 444 IF( ABS( pu(ji,jj) ) > epsi10 ) THEN 445 zfu_ho (ji,jj,jl) = zfu_ho (ji,jj,jl) * puc (ji,jj,jl) / pu(ji,jj) 446 zfu_ups(ji,jj,jl) = zfu_ups(ji,jj,jl) * pua_ups(ji,jj,jl) / pu(ji,jj) 447 ELSE 448 zfu_ho (ji,jj,jl) = 0._wp 449 zfu_ups(ji,jj,jl) = 0._wp 450 ENDIF 451 ! 452 IF( ABS( pv(ji,jj) ) > epsi10 ) THEN 453 zfv_ho (ji,jj,jl) = zfv_ho (ji,jj,jl) * pvc (ji,jj,jl) / pv(ji,jj) 454 zfv_ups(ji,jj,jl) = zfv_ups(ji,jj,jl) * pva_ups(ji,jj,jl) / pv(ji,jj) 455 ELSE 456 zfv_ho (ji,jj,jl) = 0._wp 457 zfv_ups(ji,jj,jl) = 0._wp 458 ENDIF 459 END_2D 470 460 END DO 471 461 … … 473 463 ! thus we calculate the upstream solution and apply a limiter again 474 464 DO jl = 1, jpl 475 DO jj = 2, jpjm1 476 DO ji = fs_2, fs_jpim1 477 ztra = - ( zfu_ups(ji,jj,jl) - zfu_ups(ji-1,jj,jl) + zfv_ups(ji,jj,jl) - zfv_ups(ji,jj-1,jl) ) 478 ! 479 zt_ups(ji,jj,jl) = ( ptc(ji,jj,jl) + ztra * r1_e1e2t(ji,jj) * pdt ) * tmask(ji,jj,1) 480 END DO 481 END DO 465 DO_2D_00_00 466 ztra = - ( zfu_ups(ji,jj,jl) - zfu_ups(ji-1,jj,jl) + zfv_ups(ji,jj,jl) - zfv_ups(ji,jj-1,jl) ) 467 ! 468 zt_ups(ji,jj,jl) = ( ptc(ji,jj,jl) + ztra * r1_e1e2t(ji,jj) * pdt ) * tmask(ji,jj,1) 469 END_2D 482 470 END DO 483 471 CALL lbc_lnk( 'icedyn_adv_umx', zt_ups, 'T', 1. ) … … 496 484 IF( PRESENT( pua_ho ) ) THEN 497 485 DO jl = 1, jpl 498 DO jj = 1, jpjm1 499 DO ji = 1, fs_jpim1 500 pua_ho (ji,jj,jl) = zfu_ho (ji,jj,jl) ; pva_ho (ji,jj,jl) = zfv_ho (ji,jj,jl) 501 pua_ups(ji,jj,jl) = zfu_ups(ji,jj,jl) ; pva_ups(ji,jj,jl) = zfv_ups(ji,jj,jl) 502 END DO 503 END DO 486 DO_2D_10_10 487 pua_ho (ji,jj,jl) = zfu_ho (ji,jj,jl) ; pva_ho (ji,jj,jl) = zfv_ho (ji,jj,jl) 488 pua_ups(ji,jj,jl) = zfu_ups(ji,jj,jl) ; pva_ups(ji,jj,jl) = zfv_ups(ji,jj,jl) 489 END_2D 504 490 END DO 505 491 ENDIF … … 508 494 ! --------------------------------- 509 495 DO jl = 1, jpl 510 DO jj = 2, jpjm1 511 DO ji = fs_2, fs_jpim1 512 ztra = - ( zfu_ho(ji,jj,jl) - zfu_ho(ji-1,jj,jl) + zfv_ho(ji,jj,jl) - zfv_ho(ji,jj-1,jl) ) 513 ! 514 ptc(ji,jj,jl) = ( ptc(ji,jj,jl) + ztra * r1_e1e2t(ji,jj) * pdt ) * tmask(ji,jj,1) 515 END DO 516 END DO 496 DO_2D_00_00 497 ztra = - ( zfu_ho(ji,jj,jl) - zfu_ho(ji-1,jj,jl) + zfv_ho(ji,jj,jl) - zfv_ho(ji,jj-1,jl) ) 498 ! 499 ptc(ji,jj,jl) = ( ptc(ji,jj,jl) + ztra * r1_e1e2t(ji,jj) * pdt ) * tmask(ji,jj,1) 500 END_2D 517 501 END DO 518 502 CALL lbc_lnk( 'icedyn_adv_umx', ptc, 'T', 1. ) … … 544 528 ! 545 529 DO jl = 1, jpl 546 DO jj = 1, jpjm1 547 DO ji = 1, fs_jpim1 530 DO_2D_10_10 531 pfu_ups(ji,jj,jl) = MAX( pu(ji,jj), 0._wp ) * pt(ji,jj,jl) + MIN( pu(ji,jj), 0._wp ) * pt(ji+1,jj,jl) 532 pfv_ups(ji,jj,jl) = MAX( pv(ji,jj), 0._wp ) * pt(ji,jj,jl) + MIN( pv(ji,jj), 0._wp ) * pt(ji,jj+1,jl) 533 END_2D 534 END DO 535 ! 536 ELSE !** alternate directions **! 537 ! 538 IF( MOD( (kt - 1) / nn_fsbc , 2 ) == MOD( (jt - 1) , 2 ) ) THEN !== odd ice time step: adv_x then adv_y ==! 539 ! 540 DO jl = 1, jpl !-- flux in x-direction 541 DO_2D_10_10 548 542 pfu_ups(ji,jj,jl) = MAX( pu(ji,jj), 0._wp ) * pt(ji,jj,jl) + MIN( pu(ji,jj), 0._wp ) * pt(ji+1,jj,jl) 543 END_2D 544 END DO 545 ! 546 DO jl = 1, jpl !-- first guess of tracer from u-flux 547 DO_2D_00_00 548 ztra = - ( pfu_ups(ji,jj,jl) - pfu_ups(ji-1,jj,jl) ) & 549 & + ( pu (ji,jj ) - pu (ji-1,jj ) ) * pt(ji,jj,jl) * (1.-pamsk) 550 ! 551 zpt(ji,jj,jl) = ( pt(ji,jj,jl) + ztra * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 552 END_2D 553 END DO 554 CALL lbc_lnk( 'icedyn_adv_umx', zpt, 'T', 1. ) 555 ! 556 DO jl = 1, jpl !-- flux in y-direction 557 DO_2D_10_10 558 pfv_ups(ji,jj,jl) = MAX( pv(ji,jj), 0._wp ) * zpt(ji,jj,jl) + MIN( pv(ji,jj), 0._wp ) * zpt(ji,jj+1,jl) 559 END_2D 560 END DO 561 ! 562 ELSE !== even ice time step: adv_y then adv_x ==! 563 ! 564 DO jl = 1, jpl !-- flux in y-direction 565 DO_2D_10_10 549 566 pfv_ups(ji,jj,jl) = MAX( pv(ji,jj), 0._wp ) * pt(ji,jj,jl) + MIN( pv(ji,jj), 0._wp ) * pt(ji,jj+1,jl) 550 END DO 551 END DO 552 END DO 553 ! 554 ELSE !** alternate directions **! 555 ! 556 IF( MOD( (kt - 1) / nn_fsbc , 2 ) == MOD( (jt - 1) , 2 ) ) THEN !== odd ice time step: adv_x then adv_y ==! 567 END_2D 568 END DO 569 ! 570 DO jl = 1, jpl !-- first guess of tracer from v-flux 571 DO_2D_00_00 572 ztra = - ( pfv_ups(ji,jj,jl) - pfv_ups(ji,jj-1,jl) ) & 573 & + ( pv (ji,jj ) - pv (ji,jj-1 ) ) * pt(ji,jj,jl) * (1.-pamsk) 574 ! 575 zpt(ji,jj,jl) = ( pt(ji,jj,jl) + ztra * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 576 END_2D 577 END DO 578 CALL lbc_lnk( 'icedyn_adv_umx', zpt, 'T', 1. ) 557 579 ! 558 580 DO jl = 1, jpl !-- flux in x-direction 559 DO jj = 1, jpjm1 560 DO ji = 1, fs_jpim1 561 pfu_ups(ji,jj,jl) = MAX( pu(ji,jj), 0._wp ) * pt(ji,jj,jl) + MIN( pu(ji,jj), 0._wp ) * pt(ji+1,jj,jl) 562 END DO 563 END DO 564 END DO 565 ! 566 DO jl = 1, jpl !-- first guess of tracer from u-flux 567 DO jj = 2, jpjm1 568 DO ji = fs_2, fs_jpim1 569 ztra = - ( pfu_ups(ji,jj,jl) - pfu_ups(ji-1,jj,jl) ) & 570 & + ( pu (ji,jj ) - pu (ji-1,jj ) ) * pt(ji,jj,jl) * (1.-pamsk) 571 ! 572 zpt(ji,jj,jl) = ( pt(ji,jj,jl) + ztra * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 573 END DO 574 END DO 575 END DO 576 CALL lbc_lnk( 'icedyn_adv_umx', zpt, 'T', 1. ) 577 ! 578 DO jl = 1, jpl !-- flux in y-direction 579 DO jj = 1, jpjm1 580 DO ji = 1, fs_jpim1 581 pfv_ups(ji,jj,jl) = MAX( pv(ji,jj), 0._wp ) * zpt(ji,jj,jl) + MIN( pv(ji,jj), 0._wp ) * zpt(ji,jj+1,jl) 582 END DO 583 END DO 584 END DO 585 ! 586 ELSE !== even ice time step: adv_y then adv_x ==! 587 ! 588 DO jl = 1, jpl !-- flux in y-direction 589 DO jj = 1, jpjm1 590 DO ji = 1, fs_jpim1 591 pfv_ups(ji,jj,jl) = MAX( pv(ji,jj), 0._wp ) * pt(ji,jj,jl) + MIN( pv(ji,jj), 0._wp ) * pt(ji,jj+1,jl) 592 END DO 593 END DO 594 END DO 595 ! 596 DO jl = 1, jpl !-- first guess of tracer from v-flux 597 DO jj = 2, jpjm1 598 DO ji = fs_2, fs_jpim1 599 ztra = - ( pfv_ups(ji,jj,jl) - pfv_ups(ji,jj-1,jl) ) & 600 & + ( pv (ji,jj ) - pv (ji,jj-1 ) ) * pt(ji,jj,jl) * (1.-pamsk) 601 ! 602 zpt(ji,jj,jl) = ( pt(ji,jj,jl) + ztra * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 603 END DO 604 END DO 605 END DO 606 CALL lbc_lnk( 'icedyn_adv_umx', zpt, 'T', 1. ) 607 ! 608 DO jl = 1, jpl !-- flux in x-direction 609 DO jj = 1, jpjm1 610 DO ji = 1, fs_jpim1 611 pfu_ups(ji,jj,jl) = MAX( pu(ji,jj), 0._wp ) * zpt(ji,jj,jl) + MIN( pu(ji,jj), 0._wp ) * zpt(ji+1,jj,jl) 612 END DO 613 END DO 581 DO_2D_10_10 582 pfu_ups(ji,jj,jl) = MAX( pu(ji,jj), 0._wp ) * zpt(ji,jj,jl) + MIN( pu(ji,jj), 0._wp ) * zpt(ji+1,jj,jl) 583 END_2D 614 584 END DO 615 585 ! … … 619 589 ! 620 590 DO jl = 1, jpl !-- after tracer with upstream scheme 621 DO jj = 2, jpjm1 622 DO ji = fs_2, fs_jpim1 623 ztra = - ( pfu_ups(ji,jj,jl) - pfu_ups(ji-1,jj ,jl) & 624 & + pfv_ups(ji,jj,jl) - pfv_ups(ji ,jj-1,jl) ) & 625 & + ( pu (ji,jj ) - pu (ji-1,jj ) & 626 & + pv (ji,jj ) - pv (ji ,jj-1 ) ) * pt(ji,jj,jl) * (1.-pamsk) 627 ! 628 pt_ups(ji,jj,jl) = ( pt(ji,jj,jl) + ztra * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 629 END DO 630 END DO 591 DO_2D_00_00 592 ztra = - ( pfu_ups(ji,jj,jl) - pfu_ups(ji-1,jj ,jl) & 593 & + pfv_ups(ji,jj,jl) - pfv_ups(ji ,jj-1,jl) ) & 594 & + ( pu (ji,jj ) - pu (ji-1,jj ) & 595 & + pv (ji,jj ) - pv (ji ,jj-1 ) ) * pt(ji,jj,jl) * (1.-pamsk) 596 ! 597 pt_ups(ji,jj,jl) = ( pt(ji,jj,jl) + ztra * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 598 END_2D 631 599 END DO 632 600 CALL lbc_lnk( 'icedyn_adv_umx', pt_ups, 'T', 1. ) … … 660 628 ! 661 629 DO jl = 1, jpl 662 DO jj = 1, jpjm1 663 DO ji = 1, fs_jpim1 664 pfu_ho(ji,jj,jl) = 0.5_wp * pu(ji,jj) * ( pt(ji,jj,jl) + pt(ji+1,jj ,jl) ) 665 pfv_ho(ji,jj,jl) = 0.5_wp * pv(ji,jj) * ( pt(ji,jj,jl) + pt(ji ,jj+1,jl) ) 666 END DO 667 END DO 630 DO_2D_10_10 631 pfu_ho(ji,jj,jl) = 0.5_wp * pu(ji,jj) * ( pt(ji,jj,jl) + pt(ji+1,jj ,jl) ) 632 pfv_ho(ji,jj,jl) = 0.5_wp * pv(ji,jj) * ( pt(ji,jj,jl) + pt(ji ,jj+1,jl) ) 633 END_2D 668 634 END DO 669 635 ! … … 680 646 ! 681 647 DO jl = 1, jpl !-- flux in x-direction 682 DO jj = 1, jpjm1 683 DO ji = 1, fs_jpim1 684 pfu_ho(ji,jj,jl) = 0.5_wp * pu(ji,jj) * ( pt(ji,jj,jl) + pt(ji+1,jj,jl) ) 685 END DO 686 END DO 648 DO_2D_10_10 649 pfu_ho(ji,jj,jl) = 0.5_wp * pu(ji,jj) * ( pt(ji,jj,jl) + pt(ji+1,jj,jl) ) 650 END_2D 687 651 END DO 688 652 IF( np_limiter == 2 .OR. np_limiter == 3 ) CALL limiter_x( pdt, pu, pt, pfu_ups, pfu_ho ) 689 653 690 654 DO jl = 1, jpl !-- first guess of tracer from u-flux 691 DO jj = 2, jpjm1 692 DO ji = fs_2, fs_jpim1 693 ztra = - ( pfu_ho(ji,jj,jl) - pfu_ho(ji-1,jj,jl) ) & 694 & + ( pu (ji,jj ) - pu (ji-1,jj ) ) * pt(ji,jj,jl) * (1.-pamsk) 695 ! 696 zpt(ji,jj,jl) = ( pt(ji,jj,jl) + ztra * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 697 END DO 698 END DO 655 DO_2D_00_00 656 ztra = - ( pfu_ho(ji,jj,jl) - pfu_ho(ji-1,jj,jl) ) & 657 & + ( pu (ji,jj ) - pu (ji-1,jj ) ) * pt(ji,jj,jl) * (1.-pamsk) 658 ! 659 zpt(ji,jj,jl) = ( pt(ji,jj,jl) + ztra * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 660 END_2D 699 661 END DO 700 662 CALL lbc_lnk( 'icedyn_adv_umx', zpt, 'T', 1. ) 701 663 702 664 DO jl = 1, jpl !-- flux in y-direction 703 DO jj = 1, jpjm1 704 DO ji = 1, fs_jpim1 705 pfv_ho(ji,jj,jl) = 0.5_wp * pv(ji,jj) * ( zpt(ji,jj,jl) + zpt(ji,jj+1,jl) ) 706 END DO 707 END DO 665 DO_2D_10_10 666 pfv_ho(ji,jj,jl) = 0.5_wp * pv(ji,jj) * ( zpt(ji,jj,jl) + zpt(ji,jj+1,jl) ) 667 END_2D 708 668 END DO 709 669 IF( np_limiter == 2 .OR. np_limiter == 3 ) CALL limiter_y( pdt, pv, pt, pfv_ups, pfv_ho ) … … 712 672 ! 713 673 DO jl = 1, jpl !-- flux in y-direction 714 DO jj = 1, jpjm1 715 DO ji = 1, fs_jpim1 716 pfv_ho(ji,jj,jl) = 0.5_wp * pv(ji,jj) * ( pt(ji,jj,jl) + pt(ji,jj+1,jl) ) 717 END DO 718 END DO 674 DO_2D_10_10 675 pfv_ho(ji,jj,jl) = 0.5_wp * pv(ji,jj) * ( pt(ji,jj,jl) + pt(ji,jj+1,jl) ) 676 END_2D 719 677 END DO 720 678 IF( np_limiter == 2 .OR. np_limiter == 3 ) CALL limiter_y( pdt, pv, pt, pfv_ups, pfv_ho ) 721 679 ! 722 680 DO jl = 1, jpl !-- first guess of tracer from v-flux 723 DO jj = 2, jpjm1 724 DO ji = fs_2, fs_jpim1 725 ztra = - ( pfv_ho(ji,jj,jl) - pfv_ho(ji,jj-1,jl) ) & 726 & + ( pv (ji,jj ) - pv (ji,jj-1 ) ) * pt(ji,jj,jl) * (1.-pamsk) 727 ! 728 zpt(ji,jj,jl) = ( pt(ji,jj,jl) + ztra * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 729 END DO 730 END DO 681 DO_2D_00_00 682 ztra = - ( pfv_ho(ji,jj,jl) - pfv_ho(ji,jj-1,jl) ) & 683 & + ( pv (ji,jj ) - pv (ji,jj-1 ) ) * pt(ji,jj,jl) * (1.-pamsk) 684 ! 685 zpt(ji,jj,jl) = ( pt(ji,jj,jl) + ztra * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1) 686 END_2D 731 687 END DO 732 688 CALL lbc_lnk( 'icedyn_adv_umx', zpt, 'T', 1. ) 733 689 ! 734 690 DO jl = 1, jpl !-- flux in x-direction 735 DO jj = 1, jpjm1 736 DO ji = 1, fs_jpim1 737 pfu_ho(ji,jj,jl) = 0.5_wp * pu(ji,jj) * ( zpt(ji,jj,jl) + zpt(ji+1,jj,jl) ) 738 END DO 739 END DO 691 DO_2D_10_10 692 pfu_ho(ji,jj,jl) = 0.5_wp * pu(ji,jj) * ( zpt(ji,jj,jl) + zpt(ji+1,jj,jl) ) 693 END_2D 740 694 END DO 741 695 IF( np_limiter == 2 .OR. np_limiter == 3 ) CALL limiter_x( pdt, pu, pt, pfu_ups, pfu_ho ) … … 783 737 ! !-- advective form update in zpt --! 784 738 DO jl = 1, jpl 785 DO jj = 2, jpjm1 786 DO ji = fs_2, fs_jpim1 787 zpt(ji,jj,jl) = ( pt(ji,jj,jl) - ( pubox(ji,jj ) * ( zt_u(ji,jj,jl) - zt_u(ji-1,jj,jl) ) * r1_e1t (ji,jj) & 788 & + pt (ji,jj,jl) * ( pu (ji,jj ) - pu (ji-1,jj ) ) * r1_e1e2t(ji,jj) & 789 & * pamsk & 790 & ) * pdt ) * tmask(ji,jj,1) 791 END DO 792 END DO 739 DO_2D_00_00 740 zpt(ji,jj,jl) = ( pt(ji,jj,jl) - ( pubox(ji,jj ) * ( zt_u(ji,jj,jl) - zt_u(ji-1,jj,jl) ) * r1_e1t (ji,jj) & 741 & + pt (ji,jj,jl) * ( pu (ji,jj ) - pu (ji-1,jj ) ) * r1_e1e2t(ji,jj) & 742 & * pamsk & 743 & ) * pdt ) * tmask(ji,jj,1) 744 END_2D 793 745 END DO 794 746 CALL lbc_lnk( 'icedyn_adv_umx', zpt, 'T', 1. ) … … 812 764 ! !-- advective form update in zpt --! 813 765 DO jl = 1, jpl 814 DO jj = 2, jpjm1 815 DO ji = fs_2, fs_jpim1 816 zpt(ji,jj,jl) = ( pt(ji,jj,jl) - ( pvbox(ji,jj ) * ( zt_v(ji,jj,jl) - zt_v(ji,jj-1,jl) ) * r1_e2t (ji,jj) & 817 & + pt (ji,jj,jl) * ( pv (ji,jj ) - pv (ji,jj-1 ) ) * r1_e1e2t(ji,jj) & 818 & * pamsk & 819 & ) * pdt ) * tmask(ji,jj,1) 820 END DO 821 END DO 766 DO_2D_00_00 767 zpt(ji,jj,jl) = ( pt(ji,jj,jl) - ( pvbox(ji,jj ) * ( zt_v(ji,jj,jl) - zt_v(ji,jj-1,jl) ) * r1_e2t (ji,jj) & 768 & + pt (ji,jj,jl) * ( pv (ji,jj ) - pv (ji,jj-1 ) ) * r1_e1e2t(ji,jj) & 769 & * pamsk & 770 & ) * pdt ) * tmask(ji,jj,1) 771 END_2D 822 772 END DO 823 773 CALL lbc_lnk( 'icedyn_adv_umx', zpt, 'T', 1. ) … … 865 815 DO jl = 1, jpl 866 816 DO jj = 2, jpjm1 ! First derivative (gradient) 867 DO ji = 1, fs_jpim1817 DO ji = 1, jpim1 868 818 ztu1(ji,jj,jl) = ( pt(ji+1,jj,jl) - pt(ji,jj,jl) ) * r1_e1u(ji,jj) * umask(ji,jj,1) 869 819 END DO 870 820 ! ! Second derivative (Laplacian) 871 DO ji = fs_2, fs_jpim1821 DO ji = 2, jpim1 872 822 ztu2(ji,jj,jl) = ( ztu1(ji,jj,jl) - ztu1(ji-1,jj,jl) ) * r1_e1t(ji,jj) 873 823 END DO … … 879 829 DO jl = 1, jpl 880 830 DO jj = 2, jpjm1 ! Third derivative 881 DO ji = 1, fs_jpim1831 DO ji = 1, jpim1 882 832 ztu3(ji,jj,jl) = ( ztu2(ji+1,jj,jl) - ztu2(ji,jj,jl) ) * r1_e1u(ji,jj) * umask(ji,jj,1) 883 833 END DO 884 834 ! ! Fourth derivative 885 DO ji = fs_2, fs_jpim1835 DO ji = 2, jpim1 886 836 ztu4(ji,jj,jl) = ( ztu3(ji,jj,jl) - ztu3(ji-1,jj,jl) ) * r1_e1t(ji,jj) 887 837 END DO … … 896 846 ! 897 847 DO jl = 1, jpl 898 DO jj = 1, jpjm1 899 DO ji = 1, fs_jpim1 ! vector opt. 900 pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * ( pt(ji+1,jj,jl) + pt(ji,jj,jl) & 901 & - SIGN( 1._wp, pu(ji,jj) ) * ( pt(ji+1,jj,jl) - pt(ji,jj,jl) ) ) 902 END DO 903 END DO 848 DO_2D_10_10 849 pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * ( pt(ji+1,jj,jl) + pt(ji,jj,jl) & 850 & - SIGN( 1._wp, pu(ji,jj) ) * ( pt(ji+1,jj,jl) - pt(ji,jj,jl) ) ) 851 END_2D 904 852 END DO 905 853 ! … … 907 855 ! 908 856 DO jl = 1, jpl 909 DO jj = 1, jpjm1 910 DO ji = 1, fs_jpim1 ! vector opt. 911 zcu = pu(ji,jj) * r1_e2u(ji,jj) * pdt * r1_e1u(ji,jj) 912 pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * ( pt(ji+1,jj,jl) + pt(ji,jj,jl) & 913 & - zcu * ( pt(ji+1,jj,jl) - pt(ji,jj,jl) ) ) 914 END DO 915 END DO 857 DO_2D_10_10 858 zcu = pu(ji,jj) * r1_e2u(ji,jj) * pdt * r1_e1u(ji,jj) 859 pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * ( pt(ji+1,jj,jl) + pt(ji,jj,jl) & 860 & - zcu * ( pt(ji+1,jj,jl) - pt(ji,jj,jl) ) ) 861 END_2D 916 862 END DO 917 863 ! … … 919 865 ! 920 866 DO jl = 1, jpl 921 DO jj = 1, jpjm1 922 DO ji = 1, fs_jpim1 ! vector opt. 923 zcu = pu(ji,jj) * r1_e2u(ji,jj) * pdt * r1_e1u(ji,jj) 924 zdx2 = e1u(ji,jj) * e1u(ji,jj) 867 DO_2D_10_10 868 zcu = pu(ji,jj) * r1_e2u(ji,jj) * pdt * r1_e1u(ji,jj) 869 zdx2 = e1u(ji,jj) * e1u(ji,jj) 925 870 !!rachid zdx2 = e1u(ji,jj) * e1t(ji,jj) 926 pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * ( ( pt (ji+1,jj,jl) + pt (ji,jj,jl) & 927 & - zcu * ( pt (ji+1,jj,jl) - pt (ji,jj,jl) ) ) & 928 & + z1_6 * zdx2 * ( zcu*zcu - 1._wp ) * ( ztu2(ji+1,jj,jl) + ztu2(ji,jj,jl) & 929 & - SIGN( 1._wp, zcu ) * ( ztu2(ji+1,jj,jl) - ztu2(ji,jj,jl) ) ) ) 930 END DO 931 END DO 871 pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * ( ( pt (ji+1,jj,jl) + pt (ji,jj,jl) & 872 & - zcu * ( pt (ji+1,jj,jl) - pt (ji,jj,jl) ) ) & 873 & + z1_6 * zdx2 * ( zcu*zcu - 1._wp ) * ( ztu2(ji+1,jj,jl) + ztu2(ji,jj,jl) & 874 & - SIGN( 1._wp, zcu ) * ( ztu2(ji+1,jj,jl) - ztu2(ji,jj,jl) ) ) ) 875 END_2D 932 876 END DO 933 877 ! … … 935 879 ! 936 880 DO jl = 1, jpl 937 DO jj = 1, jpjm1 938 DO ji = 1, fs_jpim1 ! vector opt. 939 zcu = pu(ji,jj) * r1_e2u(ji,jj) * pdt * r1_e1u(ji,jj) 940 zdx2 = e1u(ji,jj) * e1u(ji,jj) 881 DO_2D_10_10 882 zcu = pu(ji,jj) * r1_e2u(ji,jj) * pdt * r1_e1u(ji,jj) 883 zdx2 = e1u(ji,jj) * e1u(ji,jj) 941 884 !!rachid zdx2 = e1u(ji,jj) * e1t(ji,jj) 942 pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * ( ( pt (ji+1,jj,jl) + pt (ji,jj,jl) & 943 & - zcu * ( pt (ji+1,jj,jl) - pt (ji,jj,jl) ) ) & 944 & + z1_6 * zdx2 * ( zcu*zcu - 1._wp ) * ( ztu2(ji+1,jj,jl) + ztu2(ji,jj,jl) & 945 & - 0.5_wp * zcu * ( ztu2(ji+1,jj,jl) - ztu2(ji,jj,jl) ) ) ) 946 END DO 947 END DO 885 pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * ( ( pt (ji+1,jj,jl) + pt (ji,jj,jl) & 886 & - zcu * ( pt (ji+1,jj,jl) - pt (ji,jj,jl) ) ) & 887 & + z1_6 * zdx2 * ( zcu*zcu - 1._wp ) * ( ztu2(ji+1,jj,jl) + ztu2(ji,jj,jl) & 888 & - 0.5_wp * zcu * ( ztu2(ji+1,jj,jl) - ztu2(ji,jj,jl) ) ) ) 889 END_2D 948 890 END DO 949 891 ! … … 951 893 ! 952 894 DO jl = 1, jpl 953 DO jj = 1, jpjm1 954 DO ji = 1, fs_jpim1 ! vector opt. 955 zcu = pu(ji,jj) * r1_e2u(ji,jj) * pdt * r1_e1u(ji,jj) 956 zdx2 = e1u(ji,jj) * e1u(ji,jj) 895 DO_2D_10_10 896 zcu = pu(ji,jj) * r1_e2u(ji,jj) * pdt * r1_e1u(ji,jj) 897 zdx2 = e1u(ji,jj) * e1u(ji,jj) 957 898 !!rachid zdx2 = e1u(ji,jj) * e1t(ji,jj) 958 zdx4 = zdx2 * zdx2 959 pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * ( ( pt (ji+1,jj,jl) + pt (ji,jj,jl) & 960 & - zcu * ( pt (ji+1,jj,jl) - pt (ji,jj,jl) ) ) & 961 & + z1_6 * zdx2 * ( zcu*zcu - 1._wp ) * ( ztu2(ji+1,jj,jl) + ztu2(ji,jj,jl) & 962 & - 0.5_wp * zcu * ( ztu2(ji+1,jj,jl) - ztu2(ji,jj,jl) ) ) & 963 & + z1_120 * zdx4 * ( zcu*zcu - 1._wp ) * ( zcu*zcu - 4._wp ) * ( ztu4(ji+1,jj,jl) + ztu4(ji,jj,jl) & 964 & - SIGN( 1._wp, zcu ) * ( ztu4(ji+1,jj,jl) - ztu4(ji,jj,jl) ) ) ) 965 END DO 966 END DO 899 zdx4 = zdx2 * zdx2 900 pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * ( ( pt (ji+1,jj,jl) + pt (ji,jj,jl) & 901 & - zcu * ( pt (ji+1,jj,jl) - pt (ji,jj,jl) ) ) & 902 & + z1_6 * zdx2 * ( zcu*zcu - 1._wp ) * ( ztu2(ji+1,jj,jl) + ztu2(ji,jj,jl) & 903 & - 0.5_wp * zcu * ( ztu2(ji+1,jj,jl) - ztu2(ji,jj,jl) ) ) & 904 & + z1_120 * zdx4 * ( zcu*zcu - 1._wp ) * ( zcu*zcu - 4._wp ) * ( ztu4(ji+1,jj,jl) + ztu4(ji,jj,jl) & 905 & - SIGN( 1._wp, zcu ) * ( ztu4(ji+1,jj,jl) - ztu4(ji,jj,jl) ) ) ) 906 END_2D 967 907 END DO 968 908 ! … … 974 914 IF( ll_neg ) THEN 975 915 DO jl = 1, jpl 976 DO jj = 1, jpjm1 977 DO ji = 1, fs_jpim1 978 IF( pt_u(ji,jj,jl) < 0._wp .OR. ( imsk_small(ji,jj,jl) == 0 .AND. pamsk == 0. ) ) THEN 979 pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * ( pt(ji+1,jj,jl) + pt(ji,jj,jl) & 980 & - SIGN( 1._wp, pu(ji,jj) ) * ( pt(ji+1,jj,jl) - pt(ji,jj,jl) ) ) 981 ENDIF 982 END DO 983 END DO 916 DO_2D_10_10 917 IF( pt_u(ji,jj,jl) < 0._wp .OR. ( imsk_small(ji,jj,jl) == 0 .AND. pamsk == 0. ) ) THEN 918 pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * ( pt(ji+1,jj,jl) + pt(ji,jj,jl) & 919 & - SIGN( 1._wp, pu(ji,jj) ) * ( pt(ji+1,jj,jl) - pt(ji,jj,jl) ) ) 920 ENDIF 921 END_2D 984 922 END DO 985 923 ENDIF 986 924 ! !-- High order flux in i-direction --! 987 925 DO jl = 1, jpl 988 DO jj = 1, jpjm1 989 DO ji = 1, fs_jpim1 ! vector opt. 990 pfu_ho(ji,jj,jl) = pu(ji,jj) * pt_u(ji,jj,jl) 991 END DO 992 END DO 926 DO_2D_10_10 927 pfu_ho(ji,jj,jl) = pu(ji,jj) * pt_u(ji,jj,jl) 928 END_2D 993 929 END DO 994 930 ! … … 1021 957 ! !-- Laplacian in j-direction --! 1022 958 DO jl = 1, jpl 1023 DO jj = 1, jpjm1 ! First derivative (gradient) 1024 DO ji = fs_2, fs_jpim1 1025 ztv1(ji,jj,jl) = ( pt(ji,jj+1,jl) - pt(ji,jj,jl) ) * r1_e2v(ji,jj) * vmask(ji,jj,1) 1026 END DO 1027 END DO 1028 DO jj = 2, jpjm1 ! Second derivative (Laplacian) 1029 DO ji = fs_2, fs_jpim1 1030 ztv2(ji,jj,jl) = ( ztv1(ji,jj,jl) - ztv1(ji,jj-1,jl) ) * r1_e2t(ji,jj) 1031 END DO 1032 END DO 959 DO_2D_10_00 960 ztv1(ji,jj,jl) = ( pt(ji,jj+1,jl) - pt(ji,jj,jl) ) * r1_e2v(ji,jj) * vmask(ji,jj,1) 961 END_2D 962 DO_2D_00_00 963 ztv2(ji,jj,jl) = ( ztv1(ji,jj,jl) - ztv1(ji,jj-1,jl) ) * r1_e2t(ji,jj) 964 END_2D 1033 965 END DO 1034 966 CALL lbc_lnk( 'icedyn_adv_umx', ztv2, 'T', 1. ) … … 1036 968 ! !-- BiLaplacian in j-direction --! 1037 969 DO jl = 1, jpl 1038 DO jj = 1, jpjm1 ! First derivative 1039 DO ji = fs_2, fs_jpim1 1040 ztv3(ji,jj,jl) = ( ztv2(ji,jj+1,jl) - ztv2(ji,jj,jl) ) * r1_e2v(ji,jj) * vmask(ji,jj,1) 1041 END DO 1042 END DO 1043 DO jj = 2, jpjm1 ! Second derivative 1044 DO ji = fs_2, fs_jpim1 1045 ztv4(ji,jj,jl) = ( ztv3(ji,jj,jl) - ztv3(ji,jj-1,jl) ) * r1_e2t(ji,jj) 1046 END DO 1047 END DO 970 DO_2D_10_00 971 ztv3(ji,jj,jl) = ( ztv2(ji,jj+1,jl) - ztv2(ji,jj,jl) ) * r1_e2v(ji,jj) * vmask(ji,jj,1) 972 END_2D 973 DO_2D_00_00 974 ztv4(ji,jj,jl) = ( ztv3(ji,jj,jl) - ztv3(ji,jj-1,jl) ) * r1_e2t(ji,jj) 975 END_2D 1048 976 END DO 1049 977 CALL lbc_lnk( 'icedyn_adv_umx', ztv4, 'T', 1. ) … … 1054 982 CASE( 1 ) !== 1st order central TIM ==! (Eq. 21) 1055 983 DO jl = 1, jpl 1056 DO jj = 1, jpjm1 1057 DO ji = 1, fs_jpim1 1058 pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * ( pt(ji,jj+1,jl) + pt(ji,jj,jl) & 1059 & - SIGN( 1._wp, pv(ji,jj) ) * ( pt(ji,jj+1,jl) - pt(ji,jj,jl) ) ) 1060 END DO 1061 END DO 984 DO_2D_10_10 985 pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * ( pt(ji,jj+1,jl) + pt(ji,jj,jl) & 986 & - SIGN( 1._wp, pv(ji,jj) ) * ( pt(ji,jj+1,jl) - pt(ji,jj,jl) ) ) 987 END_2D 1062 988 END DO 1063 989 ! 1064 990 CASE( 2 ) !== 2nd order central TIM ==! (Eq. 23) 1065 991 DO jl = 1, jpl 1066 DO jj = 1, jpjm1 1067 DO ji = 1, fs_jpim1 1068 zcv = pv(ji,jj) * r1_e1v(ji,jj) * pdt * r1_e2v(ji,jj) 1069 pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * ( pt(ji,jj+1,jl) + pt(ji,jj,jl) & 1070 & - zcv * ( pt(ji,jj+1,jl) - pt(ji,jj,jl) ) ) 1071 END DO 1072 END DO 992 DO_2D_10_10 993 zcv = pv(ji,jj) * r1_e1v(ji,jj) * pdt * r1_e2v(ji,jj) 994 pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * ( pt(ji,jj+1,jl) + pt(ji,jj,jl) & 995 & - zcv * ( pt(ji,jj+1,jl) - pt(ji,jj,jl) ) ) 996 END_2D 1073 997 END DO 1074 998 ! 1075 999 CASE( 3 ) !== 3rd order central TIM ==! (Eq. 24) 1076 1000 DO jl = 1, jpl 1077 DO jj = 1, jpjm1 1078 DO ji = 1, fs_jpim1 1079 zcv = pv(ji,jj) * r1_e1v(ji,jj) * pdt * r1_e2v(ji,jj) 1080 zdy2 = e2v(ji,jj) * e2v(ji,jj) 1001 DO_2D_10_10 1002 zcv = pv(ji,jj) * r1_e1v(ji,jj) * pdt * r1_e2v(ji,jj) 1003 zdy2 = e2v(ji,jj) * e2v(ji,jj) 1081 1004 !!rachid zdy2 = e2v(ji,jj) * e2t(ji,jj) 1082 pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * ( ( pt (ji,jj+1,jl) + pt (ji,jj,jl) & 1083 & - zcv * ( pt (ji,jj+1,jl) - pt (ji,jj,jl) ) ) & 1084 & + z1_6 * zdy2 * ( zcv*zcv - 1._wp ) * ( ztv2(ji,jj+1,jl) + ztv2(ji,jj,jl) & 1085 & - SIGN( 1._wp, zcv ) * ( ztv2(ji,jj+1,jl) - ztv2(ji,jj,jl) ) ) ) 1086 END DO 1087 END DO 1005 pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * ( ( pt (ji,jj+1,jl) + pt (ji,jj,jl) & 1006 & - zcv * ( pt (ji,jj+1,jl) - pt (ji,jj,jl) ) ) & 1007 & + z1_6 * zdy2 * ( zcv*zcv - 1._wp ) * ( ztv2(ji,jj+1,jl) + ztv2(ji,jj,jl) & 1008 & - SIGN( 1._wp, zcv ) * ( ztv2(ji,jj+1,jl) - ztv2(ji,jj,jl) ) ) ) 1009 END_2D 1088 1010 END DO 1089 1011 ! 1090 1012 CASE( 4 ) !== 4th order central TIM ==! (Eq. 27) 1091 1013 DO jl = 1, jpl 1092 DO jj = 1, jpjm1 1093 DO ji = 1, fs_jpim1 1094 zcv = pv(ji,jj) * r1_e1v(ji,jj) * pdt * r1_e2v(ji,jj) 1095 zdy2 = e2v(ji,jj) * e2v(ji,jj) 1014 DO_2D_10_10 1015 zcv = pv(ji,jj) * r1_e1v(ji,jj) * pdt * r1_e2v(ji,jj) 1016 zdy2 = e2v(ji,jj) * e2v(ji,jj) 1096 1017 !!rachid zdy2 = e2v(ji,jj) * e2t(ji,jj) 1097 pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * ( ( pt (ji,jj+1,jl) + pt (ji,jj,jl) & 1098 & - zcv * ( pt (ji,jj+1,jl) - pt (ji,jj,jl) ) ) & 1099 & + z1_6 * zdy2 * ( zcv*zcv - 1._wp ) * ( ztv2(ji,jj+1,jl) + ztv2(ji,jj,jl) & 1100 & - 0.5_wp * zcv * ( ztv2(ji,jj+1,jl) - ztv2(ji,jj,jl) ) ) ) 1101 END DO 1102 END DO 1018 pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * ( ( pt (ji,jj+1,jl) + pt (ji,jj,jl) & 1019 & - zcv * ( pt (ji,jj+1,jl) - pt (ji,jj,jl) ) ) & 1020 & + z1_6 * zdy2 * ( zcv*zcv - 1._wp ) * ( ztv2(ji,jj+1,jl) + ztv2(ji,jj,jl) & 1021 & - 0.5_wp * zcv * ( ztv2(ji,jj+1,jl) - ztv2(ji,jj,jl) ) ) ) 1022 END_2D 1103 1023 END DO 1104 1024 ! 1105 1025 CASE( 5 ) !== 5th order central TIM ==! (Eq. 29) 1106 1026 DO jl = 1, jpl 1107 DO jj = 1, jpjm1 1108 DO ji = 1, fs_jpim1 1109 zcv = pv(ji,jj) * r1_e1v(ji,jj) * pdt * r1_e2v(ji,jj) 1110 zdy2 = e2v(ji,jj) * e2v(ji,jj) 1027 DO_2D_10_10 1028 zcv = pv(ji,jj) * r1_e1v(ji,jj) * pdt * r1_e2v(ji,jj) 1029 zdy2 = e2v(ji,jj) * e2v(ji,jj) 1111 1030 !!rachid zdy2 = e2v(ji,jj) * e2t(ji,jj) 1112 zdy4 = zdy2 * zdy2 1113 pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * ( ( pt (ji,jj+1,jl) + pt (ji,jj,jl) & 1114 & - zcv * ( pt (ji,jj+1,jl) - pt (ji,jj,jl) ) ) & 1115 & + z1_6 * zdy2 * ( zcv*zcv - 1._wp ) * ( ztv2(ji,jj+1,jl) + ztv2(ji,jj,jl) & 1116 & - 0.5_wp * zcv * ( ztv2(ji,jj+1,jl) - ztv2(ji,jj,jl) ) ) & 1117 & + z1_120 * zdy4 * ( zcv*zcv - 1._wp ) * ( zcv*zcv - 4._wp ) * ( ztv4(ji,jj+1,jl) + ztv4(ji,jj,jl) & 1118 & - SIGN( 1._wp, zcv ) * ( ztv4(ji,jj+1,jl) - ztv4(ji,jj,jl) ) ) ) 1119 END DO 1120 END DO 1031 zdy4 = zdy2 * zdy2 1032 pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * ( ( pt (ji,jj+1,jl) + pt (ji,jj,jl) & 1033 & - zcv * ( pt (ji,jj+1,jl) - pt (ji,jj,jl) ) ) & 1034 & + z1_6 * zdy2 * ( zcv*zcv - 1._wp ) * ( ztv2(ji,jj+1,jl) + ztv2(ji,jj,jl) & 1035 & - 0.5_wp * zcv * ( ztv2(ji,jj+1,jl) - ztv2(ji,jj,jl) ) ) & 1036 & + z1_120 * zdy4 * ( zcv*zcv - 1._wp ) * ( zcv*zcv - 4._wp ) * ( ztv4(ji,jj+1,jl) + ztv4(ji,jj,jl) & 1037 & - SIGN( 1._wp, zcv ) * ( ztv4(ji,jj+1,jl) - ztv4(ji,jj,jl) ) ) ) 1038 END_2D 1121 1039 END DO 1122 1040 ! … … 1128 1046 IF( ll_neg ) THEN 1129 1047 DO jl = 1, jpl 1130 DO jj = 1, jpjm1 1131 DO ji = 1, fs_jpim1 1132 IF( pt_v(ji,jj,jl) < 0._wp .OR. ( jmsk_small(ji,jj,jl) == 0 .AND. pamsk == 0. ) ) THEN 1133 pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * ( ( pt(ji,jj+1,jl) + pt(ji,jj,jl) ) & 1134 & - SIGN( 1._wp, pv(ji,jj) ) * ( pt(ji,jj+1,jl) - pt(ji,jj,jl) ) ) 1135 ENDIF 1136 END DO 1137 END DO 1048 DO_2D_10_10 1049 IF( pt_v(ji,jj,jl) < 0._wp .OR. ( jmsk_small(ji,jj,jl) == 0 .AND. pamsk == 0. ) ) THEN 1050 pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * ( ( pt(ji,jj+1,jl) + pt(ji,jj,jl) ) & 1051 & - SIGN( 1._wp, pv(ji,jj) ) * ( pt(ji,jj+1,jl) - pt(ji,jj,jl) ) ) 1052 ENDIF 1053 END_2D 1138 1054 END DO 1139 1055 ENDIF 1140 1056 ! !-- High order flux in j-direction --! 1141 1057 DO jl = 1, jpl 1142 DO jj = 1, jpjm1 1143 DO ji = 1, fs_jpim1 ! vector opt. 1144 pfv_ho(ji,jj,jl) = pv(ji,jj) * pt_v(ji,jj,jl) 1145 END DO 1146 END DO 1058 DO_2D_10_10 1059 pfv_ho(ji,jj,jl) = pv(ji,jj) * pt_v(ji,jj,jl) 1060 END_2D 1147 1061 END DO 1148 1062 ! … … 1178 1092 ! -------------------------------------------------- 1179 1093 DO jl = 1, jpl 1180 DO jj = 1, jpjm1 1181 DO ji = 1, fs_jpim1 ! vector opt. 1182 pfu_ho(ji,jj,jl) = pfu_ho(ji,jj,jl) - pfu_ups(ji,jj,jl) 1183 pfv_ho(ji,jj,jl) = pfv_ho(ji,jj,jl) - pfv_ups(ji,jj,jl) 1184 END DO 1185 END DO 1094 DO_2D_10_10 1095 pfu_ho(ji,jj,jl) = pfu_ho(ji,jj,jl) - pfu_ups(ji,jj,jl) 1096 pfv_ho(ji,jj,jl) = pfv_ho(ji,jj,jl) - pfv_ups(ji,jj,jl) 1097 END_2D 1186 1098 END DO 1187 1099 … … 1197 1109 1198 1110 DO jl = 1, jpl 1199 DO jj = 2, jpjm1 1200 DO ji = fs_2, fs_jpim1 1201 zti_ups(ji,jj,jl)= pt_ups(ji+1,jj ,jl) 1202 ztj_ups(ji,jj,jl)= pt_ups(ji ,jj+1,jl) 1203 END DO 1204 END DO 1111 DO_2D_00_00 1112 zti_ups(ji,jj,jl)= pt_ups(ji+1,jj ,jl) 1113 ztj_ups(ji,jj,jl)= pt_ups(ji ,jj+1,jl) 1114 END_2D 1205 1115 END DO 1206 1116 CALL lbc_lnk_multi( 'icedyn_adv_umx', zti_ups, 'T', 1., ztj_ups, 'T', 1. ) 1207 1117 1208 1118 DO jl = 1, jpl 1209 DO jj = 2, jpjm1 1210 DO ji = fs_2, fs_jpim1 1211 IF ( pfu_ho(ji,jj,jl) * ( pt_ups(ji+1,jj ,jl) - pt_ups(ji,jj,jl) ) <= 0._wp .AND. & 1212 & pfv_ho(ji,jj,jl) * ( pt_ups(ji ,jj+1,jl) - pt_ups(ji,jj,jl) ) <= 0._wp ) THEN 1213 ! 1214 IF( pfu_ho(ji,jj,jl) * ( zti_ups(ji+1,jj ,jl) - zti_ups(ji,jj,jl) ) <= 0._wp .AND. & 1215 & pfv_ho(ji,jj,jl) * ( ztj_ups(ji ,jj+1,jl) - ztj_ups(ji,jj,jl) ) <= 0._wp ) THEN 1216 pfu_ho(ji,jj,jl)=0._wp 1217 pfv_ho(ji,jj,jl)=0._wp 1218 ENDIF 1219 ! 1220 IF( pfu_ho(ji,jj,jl) * ( pt_ups(ji,jj,jl) - pt_ups(ji-1,jj ,jl) ) <= 0._wp .AND. & 1221 & pfv_ho(ji,jj,jl) * ( pt_ups(ji,jj,jl) - pt_ups(ji ,jj-1,jl) ) <= 0._wp ) THEN 1222 pfu_ho(ji,jj,jl)=0._wp 1223 pfv_ho(ji,jj,jl)=0._wp 1224 ENDIF 1225 ! 1119 DO_2D_00_00 1120 IF ( pfu_ho(ji,jj,jl) * ( pt_ups(ji+1,jj ,jl) - pt_ups(ji,jj,jl) ) <= 0._wp .AND. & 1121 & pfv_ho(ji,jj,jl) * ( pt_ups(ji ,jj+1,jl) - pt_ups(ji,jj,jl) ) <= 0._wp ) THEN 1122 ! 1123 IF( pfu_ho(ji,jj,jl) * ( zti_ups(ji+1,jj ,jl) - zti_ups(ji,jj,jl) ) <= 0._wp .AND. & 1124 & pfv_ho(ji,jj,jl) * ( ztj_ups(ji ,jj+1,jl) - ztj_ups(ji,jj,jl) ) <= 0._wp ) THEN 1125 pfu_ho(ji,jj,jl)=0._wp 1126 pfv_ho(ji,jj,jl)=0._wp 1226 1127 ENDIF 1227 END DO 1228 END DO 1128 ! 1129 IF( pfu_ho(ji,jj,jl) * ( pt_ups(ji,jj,jl) - pt_ups(ji-1,jj ,jl) ) <= 0._wp .AND. & 1130 & pfv_ho(ji,jj,jl) * ( pt_ups(ji,jj,jl) - pt_ups(ji ,jj-1,jl) ) <= 0._wp ) THEN 1131 pfu_ho(ji,jj,jl)=0._wp 1132 pfv_ho(ji,jj,jl)=0._wp 1133 ENDIF 1134 ! 1135 ENDIF 1136 END_2D 1229 1137 END DO 1230 1138 CALL lbc_lnk_multi( 'icedyn_adv_umx', pfu_ho, 'U', -1., pfv_ho, 'V', -1. ) ! lateral boundary cond. … … 1238 1146 DO jl = 1, jpl 1239 1147 1240 DO jj = 1, jpj 1241 DO ji = 1, jpi 1242 IF ( pt(ji,jj,jl) <= 0._wp .AND. pt_ups(ji,jj,jl) <= 0._wp ) THEN 1243 zbup(ji,jj) = -zbig 1244 zbdo(ji,jj) = zbig 1245 ELSEIF( pt(ji,jj,jl) <= 0._wp .AND. pt_ups(ji,jj,jl) > 0._wp ) THEN 1246 zbup(ji,jj) = pt_ups(ji,jj,jl) 1247 zbdo(ji,jj) = pt_ups(ji,jj,jl) 1248 ELSEIF( pt(ji,jj,jl) > 0._wp .AND. pt_ups(ji,jj,jl) <= 0._wp ) THEN 1249 zbup(ji,jj) = pt(ji,jj,jl) 1250 zbdo(ji,jj) = pt(ji,jj,jl) 1251 ELSE 1252 zbup(ji,jj) = MAX( pt(ji,jj,jl) , pt_ups(ji,jj,jl) ) 1253 zbdo(ji,jj) = MIN( pt(ji,jj,jl) , pt_ups(ji,jj,jl) ) 1254 ENDIF 1255 END DO 1256 END DO 1257 1258 DO jj = 2, jpjm1 1259 DO ji = fs_2, fs_jpim1 ! vector opt. 1260 ! 1261 zup = MAX( zbup(ji,jj), zbup(ji-1,jj), zbup(ji+1,jj), zbup(ji,jj-1), zbup(ji,jj+1) ) ! search max/min in neighbourhood 1262 zdo = MIN( zbdo(ji,jj), zbdo(ji-1,jj), zbdo(ji+1,jj), zbdo(ji,jj-1), zbdo(ji,jj+1) ) 1263 ! 1264 zpos = MAX( 0._wp, pfu_ho(ji-1,jj ,jl) ) - MIN( 0._wp, pfu_ho(ji ,jj ,jl) ) & ! positive/negative part of the flux 1265 & + MAX( 0._wp, pfv_ho(ji ,jj-1,jl) ) - MIN( 0._wp, pfv_ho(ji ,jj ,jl) ) 1266 zneg = MAX( 0._wp, pfu_ho(ji ,jj ,jl) ) - MIN( 0._wp, pfu_ho(ji-1,jj ,jl) ) & 1267 & + MAX( 0._wp, pfv_ho(ji ,jj ,jl) ) - MIN( 0._wp, pfv_ho(ji ,jj-1,jl) ) 1268 ! 1269 zpos = zpos - (pt(ji,jj,jl) * MIN( 0., pu(ji,jj) - pu(ji-1,jj) ) + pt(ji,jj,jl) * MIN( 0., pv(ji,jj) - pv(ji,jj-1) ) & 1270 & ) * ( 1. - pamsk ) 1271 zneg = zneg + (pt(ji,jj,jl) * MAX( 0., pu(ji,jj) - pu(ji-1,jj) ) + pt(ji,jj,jl) * MAX( 0., pv(ji,jj) - pv(ji,jj-1) ) & 1272 & ) * ( 1. - pamsk ) 1273 ! 1274 ! ! up & down beta terms 1275 ! clem: zbetup and zbetdo must be 0 for zpos>1.e-10 & zneg>1.e-10 (do not put 0 instead of 1.e-10 !!!) 1276 IF( zpos > epsi10 ) THEN ; zbetup(ji,jj,jl) = MAX( 0._wp, zup - pt_ups(ji,jj,jl) ) / zpos * e1e2t(ji,jj) * z1_dt 1277 ELSE ; zbetup(ji,jj,jl) = 0._wp ! zbig 1278 ENDIF 1279 ! 1280 IF( zneg > epsi10 ) THEN ; zbetdo(ji,jj,jl) = MAX( 0._wp, pt_ups(ji,jj,jl) - zdo ) / zneg * e1e2t(ji,jj) * z1_dt 1281 ELSE ; zbetdo(ji,jj,jl) = 0._wp ! zbig 1282 ENDIF 1283 ! 1284 ! if all the points are outside ice cover 1285 IF( zup == -zbig ) zbetup(ji,jj,jl) = 0._wp ! zbig 1286 IF( zdo == zbig ) zbetdo(ji,jj,jl) = 0._wp ! zbig 1287 ! 1288 END DO 1289 END DO 1148 DO_2D_11_11 1149 IF ( pt(ji,jj,jl) <= 0._wp .AND. pt_ups(ji,jj,jl) <= 0._wp ) THEN 1150 zbup(ji,jj) = -zbig 1151 zbdo(ji,jj) = zbig 1152 ELSEIF( pt(ji,jj,jl) <= 0._wp .AND. pt_ups(ji,jj,jl) > 0._wp ) THEN 1153 zbup(ji,jj) = pt_ups(ji,jj,jl) 1154 zbdo(ji,jj) = pt_ups(ji,jj,jl) 1155 ELSEIF( pt(ji,jj,jl) > 0._wp .AND. pt_ups(ji,jj,jl) <= 0._wp ) THEN 1156 zbup(ji,jj) = pt(ji,jj,jl) 1157 zbdo(ji,jj) = pt(ji,jj,jl) 1158 ELSE 1159 zbup(ji,jj) = MAX( pt(ji,jj,jl) , pt_ups(ji,jj,jl) ) 1160 zbdo(ji,jj) = MIN( pt(ji,jj,jl) , pt_ups(ji,jj,jl) ) 1161 ENDIF 1162 END_2D 1163 1164 DO_2D_00_00 1165 ! 1166 zup = MAX( zbup(ji,jj), zbup(ji-1,jj), zbup(ji+1,jj), zbup(ji,jj-1), zbup(ji,jj+1) ) ! search max/min in neighbourhood 1167 zdo = MIN( zbdo(ji,jj), zbdo(ji-1,jj), zbdo(ji+1,jj), zbdo(ji,jj-1), zbdo(ji,jj+1) ) 1168 ! 1169 zpos = MAX( 0._wp, pfu_ho(ji-1,jj ,jl) ) - MIN( 0._wp, pfu_ho(ji ,jj ,jl) ) & ! positive/negative part of the flux 1170 & + MAX( 0._wp, pfv_ho(ji ,jj-1,jl) ) - MIN( 0._wp, pfv_ho(ji ,jj ,jl) ) 1171 zneg = MAX( 0._wp, pfu_ho(ji ,jj ,jl) ) - MIN( 0._wp, pfu_ho(ji-1,jj ,jl) ) & 1172 & + MAX( 0._wp, pfv_ho(ji ,jj ,jl) ) - MIN( 0._wp, pfv_ho(ji ,jj-1,jl) ) 1173 ! 1174 zpos = zpos - (pt(ji,jj,jl) * MIN( 0., pu(ji,jj) - pu(ji-1,jj) ) + pt(ji,jj,jl) * MIN( 0., pv(ji,jj) - pv(ji,jj-1) ) & 1175 & ) * ( 1. - pamsk ) 1176 zneg = zneg + (pt(ji,jj,jl) * MAX( 0., pu(ji,jj) - pu(ji-1,jj) ) + pt(ji,jj,jl) * MAX( 0., pv(ji,jj) - pv(ji,jj-1) ) & 1177 & ) * ( 1. - pamsk ) 1178 ! 1179 ! ! up & down beta terms 1180 ! clem: zbetup and zbetdo must be 0 for zpos>1.e-10 & zneg>1.e-10 (do not put 0 instead of 1.e-10 !!!) 1181 IF( zpos > epsi10 ) THEN ; zbetup(ji,jj,jl) = MAX( 0._wp, zup - pt_ups(ji,jj,jl) ) / zpos * e1e2t(ji,jj) * z1_dt 1182 ELSE ; zbetup(ji,jj,jl) = 0._wp ! zbig 1183 ENDIF 1184 ! 1185 IF( zneg > epsi10 ) THEN ; zbetdo(ji,jj,jl) = MAX( 0._wp, pt_ups(ji,jj,jl) - zdo ) / zneg * e1e2t(ji,jj) * z1_dt 1186 ELSE ; zbetdo(ji,jj,jl) = 0._wp ! zbig 1187 ENDIF 1188 ! 1189 ! if all the points are outside ice cover 1190 IF( zup == -zbig ) zbetup(ji,jj,jl) = 0._wp ! zbig 1191 IF( zdo == zbig ) zbetdo(ji,jj,jl) = 0._wp ! zbig 1192 ! 1193 END_2D 1290 1194 END DO 1291 1195 CALL lbc_lnk_multi( 'icedyn_adv_umx', zbetup, 'T', 1., zbetdo, 'T', 1. ) ! lateral boundary cond. (unchanged sign) … … 1295 1199 ! --------------------------------- 1296 1200 DO jl = 1, jpl 1297 DO jj = 1, jpjm1 1298 DO ji = 1, fs_jpim1 ! vector opt. 1299 zau = MIN( 1._wp , zbetdo(ji,jj,jl) , zbetup(ji+1,jj,jl) ) 1300 zbu = MIN( 1._wp , zbetup(ji,jj,jl) , zbetdo(ji+1,jj,jl) ) 1301 zcu = 0.5_wp + SIGN( 0.5_wp , pfu_ho(ji,jj,jl) ) 1302 ! 1303 zcoef = ( zcu * zau + ( 1._wp - zcu ) * zbu ) 1304 ! 1305 pfu_ho(ji,jj,jl) = pfu_ho(ji,jj,jl) * zcoef + pfu_ups(ji,jj,jl) 1306 ! 1307 END DO 1308 END DO 1309 1310 DO jj = 1, jpjm1 1311 DO ji = 1, fs_jpim1 ! vector opt. 1312 zav = MIN( 1._wp , zbetdo(ji,jj,jl) , zbetup(ji,jj+1,jl) ) 1313 zbv = MIN( 1._wp , zbetup(ji,jj,jl) , zbetdo(ji,jj+1,jl) ) 1314 zcv = 0.5_wp + SIGN( 0.5_wp , pfv_ho(ji,jj,jl) ) 1315 ! 1316 zcoef = ( zcv * zav + ( 1._wp - zcv ) * zbv ) 1317 ! 1318 pfv_ho(ji,jj,jl) = pfv_ho(ji,jj,jl) * zcoef + pfv_ups(ji,jj,jl) 1319 ! 1320 END DO 1321 END DO 1201 DO_2D_10_10 1202 zau = MIN( 1._wp , zbetdo(ji,jj,jl) , zbetup(ji+1,jj,jl) ) 1203 zbu = MIN( 1._wp , zbetup(ji,jj,jl) , zbetdo(ji+1,jj,jl) ) 1204 zcu = 0.5_wp + SIGN( 0.5_wp , pfu_ho(ji,jj,jl) ) 1205 ! 1206 zcoef = ( zcu * zau + ( 1._wp - zcu ) * zbu ) 1207 ! 1208 pfu_ho(ji,jj,jl) = pfu_ho(ji,jj,jl) * zcoef + pfu_ups(ji,jj,jl) 1209 ! 1210 END_2D 1211 1212 DO_2D_10_10 1213 zav = MIN( 1._wp , zbetdo(ji,jj,jl) , zbetup(ji,jj+1,jl) ) 1214 zbv = MIN( 1._wp , zbetup(ji,jj,jl) , zbetdo(ji,jj+1,jl) ) 1215 zcv = 0.5_wp + SIGN( 0.5_wp , pfv_ho(ji,jj,jl) ) 1216 ! 1217 zcoef = ( zcv * zav + ( 1._wp - zcv ) * zbv ) 1218 ! 1219 pfv_ho(ji,jj,jl) = pfv_ho(ji,jj,jl) * zcoef + pfv_ups(ji,jj,jl) 1220 ! 1221 END_2D 1322 1222 1323 1223 END DO … … 1344 1244 ! 1345 1245 DO jl = 1, jpl 1346 DO jj = 2, jpjm1 1347 DO ji = fs_2, fs_jpim1 ! vector opt. 1348 zslpx(ji,jj,jl) = ( pt(ji+1,jj,jl) - pt(ji,jj,jl) ) * umask(ji,jj,1) 1349 END DO 1350 END DO 1246 DO_2D_00_00 1247 zslpx(ji,jj,jl) = ( pt(ji+1,jj,jl) - pt(ji,jj,jl) ) * umask(ji,jj,1) 1248 END_2D 1351 1249 END DO 1352 1250 CALL lbc_lnk( 'icedyn_adv_umx', zslpx, 'U', -1.) ! lateral boundary cond. 1353 1251 1354 1252 DO jl = 1, jpl 1355 DO jj = 2, jpjm1 1356 DO ji = fs_2, fs_jpim1 ! vector opt. 1357 uCFL = pdt * ABS( pu(ji,jj) ) * r1_e1e2t(ji,jj) 1358 1359 Rjm = zslpx(ji-1,jj,jl) 1360 Rj = zslpx(ji ,jj,jl) 1361 Rjp = zslpx(ji+1,jj,jl) 1362 1363 IF( np_limiter == 3 ) THEN 1364 1365 IF( pu(ji,jj) > 0. ) THEN ; Rr = Rjm 1366 ELSE ; Rr = Rjp 1253 DO_2D_00_00 1254 uCFL = pdt * ABS( pu(ji,jj) ) * r1_e1e2t(ji,jj) 1255 1256 Rjm = zslpx(ji-1,jj,jl) 1257 Rj = zslpx(ji ,jj,jl) 1258 Rjp = zslpx(ji+1,jj,jl) 1259 1260 IF( np_limiter == 3 ) THEN 1261 1262 IF( pu(ji,jj) > 0. ) THEN ; Rr = Rjm 1263 ELSE ; Rr = Rjp 1264 ENDIF 1265 1266 zh3 = pfu_ho(ji,jj,jl) - pfu_ups(ji,jj,jl) 1267 IF( Rj > 0. ) THEN 1268 zlimiter = MAX( 0., MIN( zh3, MAX(-Rr * 0.5 * ABS(pu(ji,jj)), & 1269 & MIN( 2. * Rr * 0.5 * ABS(pu(ji,jj)), zh3, 1.5 * Rj * 0.5 * ABS(pu(ji,jj)) ) ) ) ) 1270 ELSE 1271 zlimiter = -MAX( 0., MIN(-zh3, MAX( Rr * 0.5 * ABS(pu(ji,jj)), & 1272 & MIN(-2. * Rr * 0.5 * ABS(pu(ji,jj)), -zh3, -1.5 * Rj * 0.5 * ABS(pu(ji,jj)) ) ) ) ) 1273 ENDIF 1274 pfu_ho(ji,jj,jl) = pfu_ups(ji,jj,jl) + zlimiter 1275 1276 ELSEIF( np_limiter == 2 ) THEN 1277 IF( Rj /= 0. ) THEN 1278 IF( pu(ji,jj) > 0. ) THEN ; Cr = Rjm / Rj 1279 ELSE ; Cr = Rjp / Rj 1367 1280 ENDIF 1368 1369 zh3 = pfu_ho(ji,jj,jl) - pfu_ups(ji,jj,jl) 1370 IF( Rj > 0. ) THEN 1371 zlimiter = MAX( 0., MIN( zh3, MAX(-Rr * 0.5 * ABS(pu(ji,jj)), & 1372 & MIN( 2. * Rr * 0.5 * ABS(pu(ji,jj)), zh3, 1.5 * Rj * 0.5 * ABS(pu(ji,jj)) ) ) ) ) 1373 ELSE 1374 zlimiter = -MAX( 0., MIN(-zh3, MAX( Rr * 0.5 * ABS(pu(ji,jj)), & 1375 & MIN(-2. * Rr * 0.5 * ABS(pu(ji,jj)), -zh3, -1.5 * Rj * 0.5 * ABS(pu(ji,jj)) ) ) ) ) 1376 ENDIF 1377 pfu_ho(ji,jj,jl) = pfu_ups(ji,jj,jl) + zlimiter 1378 1379 ELSEIF( np_limiter == 2 ) THEN 1380 IF( Rj /= 0. ) THEN 1381 IF( pu(ji,jj) > 0. ) THEN ; Cr = Rjm / Rj 1382 ELSE ; Cr = Rjp / Rj 1383 ENDIF 1384 ELSE 1385 Cr = 0. 1386 ENDIF 1387 1388 ! -- superbee -- 1389 zpsi = MAX( 0., MAX( MIN(1.,2.*Cr), MIN(2.,Cr) ) ) 1390 ! -- van albada 2 -- 1391 !!zpsi = 2.*Cr / (Cr*Cr+1.) 1392 ! -- sweby (with beta=1) -- 1393 !!zpsi = MAX( 0., MAX( MIN(1.,1.*Cr), MIN(1.,Cr) ) ) 1394 ! -- van Leer -- 1395 !!zpsi = ( Cr + ABS(Cr) ) / ( 1. + ABS(Cr) ) 1396 ! -- ospre -- 1397 !!zpsi = 1.5 * ( Cr*Cr + Cr ) / ( Cr*Cr + Cr + 1. ) 1398 ! -- koren -- 1399 !!zpsi = MAX( 0., MIN( 2.*Cr, MIN( (1.+2*Cr)/3., 2. ) ) ) 1400 ! -- charm -- 1401 !IF( Cr > 0. ) THEN ; zpsi = Cr * (3.*Cr + 1.) / ( (Cr + 1.) * (Cr + 1.) ) 1402 !ELSE ; zpsi = 0. 1403 !ENDIF 1404 ! -- van albada 1 -- 1405 !!zpsi = (Cr*Cr + Cr) / (Cr*Cr +1) 1406 ! -- smart -- 1407 !!zpsi = MAX( 0., MIN( 2.*Cr, MIN( 0.25+0.75*Cr, 4. ) ) ) 1408 ! -- umist -- 1409 !!zpsi = MAX( 0., MIN( 2.*Cr, MIN( 0.25+0.75*Cr, MIN(0.75+0.25*Cr, 2. ) ) ) ) 1410 1411 ! high order flux corrected by the limiter 1412 pfu_ho(ji,jj,jl) = pfu_ho(ji,jj,jl) - ABS( pu(ji,jj) ) * ( (1.-zpsi) + uCFL*zpsi ) * Rj * 0.5 1413 1281 ELSE 1282 Cr = 0. 1414 1283 ENDIF 1415 END DO 1416 END DO 1284 1285 ! -- superbee -- 1286 zpsi = MAX( 0., MAX( MIN(1.,2.*Cr), MIN(2.,Cr) ) ) 1287 ! -- van albada 2 -- 1288 !!zpsi = 2.*Cr / (Cr*Cr+1.) 1289 ! -- sweby (with beta=1) -- 1290 !!zpsi = MAX( 0., MAX( MIN(1.,1.*Cr), MIN(1.,Cr) ) ) 1291 ! -- van Leer -- 1292 !!zpsi = ( Cr + ABS(Cr) ) / ( 1. + ABS(Cr) ) 1293 ! -- ospre -- 1294 !!zpsi = 1.5 * ( Cr*Cr + Cr ) / ( Cr*Cr + Cr + 1. ) 1295 ! -- koren -- 1296 !!zpsi = MAX( 0., MIN( 2.*Cr, MIN( (1.+2*Cr)/3., 2. ) ) ) 1297 ! -- charm -- 1298 !IF( Cr > 0. ) THEN ; zpsi = Cr * (3.*Cr + 1.) / ( (Cr + 1.) * (Cr + 1.) ) 1299 !ELSE ; zpsi = 0. 1300 !ENDIF 1301 ! -- van albada 1 -- 1302 !!zpsi = (Cr*Cr + Cr) / (Cr*Cr +1) 1303 ! -- smart -- 1304 !!zpsi = MAX( 0., MIN( 2.*Cr, MIN( 0.25+0.75*Cr, 4. ) ) ) 1305 ! -- umist -- 1306 !!zpsi = MAX( 0., MIN( 2.*Cr, MIN( 0.25+0.75*Cr, MIN(0.75+0.25*Cr, 2. ) ) ) ) 1307 1308 ! high order flux corrected by the limiter 1309 pfu_ho(ji,jj,jl) = pfu_ho(ji,jj,jl) - ABS( pu(ji,jj) ) * ( (1.-zpsi) + uCFL*zpsi ) * Rj * 0.5 1310 1311 ENDIF 1312 END_2D 1417 1313 END DO 1418 1314 CALL lbc_lnk( 'icedyn_adv_umx', pfu_ho, 'U', -1.) ! lateral boundary cond. … … 1439 1335 ! 1440 1336 DO jl = 1, jpl 1441 DO jj = 2, jpjm1 1442 DO ji = fs_2, fs_jpim1 ! vector opt. 1443 zslpy(ji,jj,jl) = ( pt(ji,jj+1,jl) - pt(ji,jj,jl) ) * vmask(ji,jj,1) 1444 END DO 1445 END DO 1337 DO_2D_00_00 1338 zslpy(ji,jj,jl) = ( pt(ji,jj+1,jl) - pt(ji,jj,jl) ) * vmask(ji,jj,1) 1339 END_2D 1446 1340 END DO 1447 1341 CALL lbc_lnk( 'icedyn_adv_umx', zslpy, 'V', -1.) ! lateral boundary cond. 1448 1342 1449 1343 DO jl = 1, jpl 1450 DO jj = 2, jpjm1 1451 DO ji = fs_2, fs_jpim1 ! vector opt. 1452 vCFL = pdt * ABS( pv(ji,jj) ) * r1_e1e2t(ji,jj) 1453 1454 Rjm = zslpy(ji,jj-1,jl) 1455 Rj = zslpy(ji,jj ,jl) 1456 Rjp = zslpy(ji,jj+1,jl) 1457 1458 IF( np_limiter == 3 ) THEN 1459 1460 IF( pv(ji,jj) > 0. ) THEN ; Rr = Rjm 1461 ELSE ; Rr = Rjp 1344 DO_2D_00_00 1345 vCFL = pdt * ABS( pv(ji,jj) ) * r1_e1e2t(ji,jj) 1346 1347 Rjm = zslpy(ji,jj-1,jl) 1348 Rj = zslpy(ji,jj ,jl) 1349 Rjp = zslpy(ji,jj+1,jl) 1350 1351 IF( np_limiter == 3 ) THEN 1352 1353 IF( pv(ji,jj) > 0. ) THEN ; Rr = Rjm 1354 ELSE ; Rr = Rjp 1355 ENDIF 1356 1357 zh3 = pfv_ho(ji,jj,jl) - pfv_ups(ji,jj,jl) 1358 IF( Rj > 0. ) THEN 1359 zlimiter = MAX( 0., MIN( zh3, MAX(-Rr * 0.5 * ABS(pv(ji,jj)), & 1360 & MIN( 2. * Rr * 0.5 * ABS(pv(ji,jj)), zh3, 1.5 * Rj * 0.5 * ABS(pv(ji,jj)) ) ) ) ) 1361 ELSE 1362 zlimiter = -MAX( 0., MIN(-zh3, MAX( Rr * 0.5 * ABS(pv(ji,jj)), & 1363 & MIN(-2. * Rr * 0.5 * ABS(pv(ji,jj)), -zh3, -1.5 * Rj * 0.5 * ABS(pv(ji,jj)) ) ) ) ) 1364 ENDIF 1365 pfv_ho(ji,jj,jl) = pfv_ups(ji,jj,jl) + zlimiter 1366 1367 ELSEIF( np_limiter == 2 ) THEN 1368 1369 IF( Rj /= 0. ) THEN 1370 IF( pv(ji,jj) > 0. ) THEN ; Cr = Rjm / Rj 1371 ELSE ; Cr = Rjp / Rj 1462 1372 ENDIF 1463 1464 zh3 = pfv_ho(ji,jj,jl) - pfv_ups(ji,jj,jl) 1465 IF( Rj > 0. ) THEN 1466 zlimiter = MAX( 0., MIN( zh3, MAX(-Rr * 0.5 * ABS(pv(ji,jj)), & 1467 & MIN( 2. * Rr * 0.5 * ABS(pv(ji,jj)), zh3, 1.5 * Rj * 0.5 * ABS(pv(ji,jj)) ) ) ) ) 1468 ELSE 1469 zlimiter = -MAX( 0., MIN(-zh3, MAX( Rr * 0.5 * ABS(pv(ji,jj)), & 1470 & MIN(-2. * Rr * 0.5 * ABS(pv(ji,jj)), -zh3, -1.5 * Rj * 0.5 * ABS(pv(ji,jj)) ) ) ) ) 1471 ENDIF 1472 pfv_ho(ji,jj,jl) = pfv_ups(ji,jj,jl) + zlimiter 1473 1474 ELSEIF( np_limiter == 2 ) THEN 1475 1476 IF( Rj /= 0. ) THEN 1477 IF( pv(ji,jj) > 0. ) THEN ; Cr = Rjm / Rj 1478 ELSE ; Cr = Rjp / Rj 1479 ENDIF 1480 ELSE 1481 Cr = 0. 1482 ENDIF 1483 1484 ! -- superbee -- 1485 zpsi = MAX( 0., MAX( MIN(1.,2.*Cr), MIN(2.,Cr) ) ) 1486 ! -- van albada 2 -- 1487 !!zpsi = 2.*Cr / (Cr*Cr+1.) 1488 ! -- sweby (with beta=1) -- 1489 !!zpsi = MAX( 0., MAX( MIN(1.,1.*Cr), MIN(1.,Cr) ) ) 1490 ! -- van Leer -- 1491 !!zpsi = ( Cr + ABS(Cr) ) / ( 1. + ABS(Cr) ) 1492 ! -- ospre -- 1493 !!zpsi = 1.5 * ( Cr*Cr + Cr ) / ( Cr*Cr + Cr + 1. ) 1494 ! -- koren -- 1495 !!zpsi = MAX( 0., MIN( 2.*Cr, MIN( (1.+2*Cr)/3., 2. ) ) ) 1496 ! -- charm -- 1497 !IF( Cr > 0. ) THEN ; zpsi = Cr * (3.*Cr + 1.) / ( (Cr + 1.) * (Cr + 1.) ) 1498 !ELSE ; zpsi = 0. 1499 !ENDIF 1500 ! -- van albada 1 -- 1501 !!zpsi = (Cr*Cr + Cr) / (Cr*Cr +1) 1502 ! -- smart -- 1503 !!zpsi = MAX( 0., MIN( 2.*Cr, MIN( 0.25+0.75*Cr, 4. ) ) ) 1504 ! -- umist -- 1505 !!zpsi = MAX( 0., MIN( 2.*Cr, MIN( 0.25+0.75*Cr, MIN(0.75+0.25*Cr, 2. ) ) ) ) 1506 1507 ! high order flux corrected by the limiter 1508 pfv_ho(ji,jj,jl) = pfv_ho(ji,jj,jl) - ABS( pv(ji,jj) ) * ( (1.-zpsi) + vCFL*zpsi ) * Rj * 0.5 1509 1373 ELSE 1374 Cr = 0. 1510 1375 ENDIF 1511 END DO 1512 END DO 1376 1377 ! -- superbee -- 1378 zpsi = MAX( 0., MAX( MIN(1.,2.*Cr), MIN(2.,Cr) ) ) 1379 ! -- van albada 2 -- 1380 !!zpsi = 2.*Cr / (Cr*Cr+1.) 1381 ! -- sweby (with beta=1) -- 1382 !!zpsi = MAX( 0., MAX( MIN(1.,1.*Cr), MIN(1.,Cr) ) ) 1383 ! -- van Leer -- 1384 !!zpsi = ( Cr + ABS(Cr) ) / ( 1. + ABS(Cr) ) 1385 ! -- ospre -- 1386 !!zpsi = 1.5 * ( Cr*Cr + Cr ) / ( Cr*Cr + Cr + 1. ) 1387 ! -- koren -- 1388 !!zpsi = MAX( 0., MIN( 2.*Cr, MIN( (1.+2*Cr)/3., 2. ) ) ) 1389 ! -- charm -- 1390 !IF( Cr > 0. ) THEN ; zpsi = Cr * (3.*Cr + 1.) / ( (Cr + 1.) * (Cr + 1.) ) 1391 !ELSE ; zpsi = 0. 1392 !ENDIF 1393 ! -- van albada 1 -- 1394 !!zpsi = (Cr*Cr + Cr) / (Cr*Cr +1) 1395 ! -- smart -- 1396 !!zpsi = MAX( 0., MIN( 2.*Cr, MIN( 0.25+0.75*Cr, 4. ) ) ) 1397 ! -- umist -- 1398 !!zpsi = MAX( 0., MIN( 2.*Cr, MIN( 0.25+0.75*Cr, MIN(0.75+0.25*Cr, 2. ) ) ) ) 1399 1400 ! high order flux corrected by the limiter 1401 pfv_ho(ji,jj,jl) = pfv_ho(ji,jj,jl) - ABS( pv(ji,jj) ) * ( (1.-zpsi) + vCFL*zpsi ) * Rj * 0.5 1402 1403 ENDIF 1404 END_2D 1513 1405 END DO 1514 1406 CALL lbc_lnk( 'icedyn_adv_umx', pfv_ho, 'V', -1.) ! lateral boundary cond. … … 1544 1436 DO jl = 1, jpl 1545 1437 1546 DO jj = 1, jpj 1547 DO ji = 1, jpi 1548 IF ( pv_i(ji,jj,jl) > 0._wp ) THEN 1438 DO_2D_11_11 1439 IF ( pv_i(ji,jj,jl) > 0._wp ) THEN 1440 ! 1441 ! ! -- check h_ip -- ! 1442 ! if h_ip is larger than the surrounding 9 pts => reduce h_ip and increase a_ip 1443 IF( ln_pnd_H12 .AND. pv_ip(ji,jj,jl) > 0._wp ) THEN 1444 zhip = pv_ip(ji,jj,jl) / MAX( epsi20, pa_ip(ji,jj,jl) ) 1445 IF( zhip > phip_max(ji,jj,jl) .AND. pa_ip(ji,jj,jl) < 0.15 ) THEN 1446 pa_ip(ji,jj,jl) = pv_ip(ji,jj,jl) / phip_max(ji,jj,jl) 1447 ENDIF 1448 ENDIF 1449 ! 1450 ! ! -- check h_i -- ! 1451 ! if h_i is larger than the surrounding 9 pts => reduce h_i and increase a_i 1452 zhi = pv_i(ji,jj,jl) / pa_i(ji,jj,jl) 1453 IF( zhi > phi_max(ji,jj,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN 1454 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) 1455 ENDIF 1456 ! 1457 ! ! -- check h_s -- ! 1458 ! if h_s is larger than the surrounding 9 pts => put the snow excess in the ocean 1459 zhs = pv_s(ji,jj,jl) / pa_i(ji,jj,jl) 1460 IF( pv_s(ji,jj,jl) > 0._wp .AND. zhs > phs_max(ji,jj,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN 1461 zfra = phs_max(ji,jj,jl) / MAX( zhs, epsi20 ) 1549 1462 ! 1550 ! ! -- check h_ip -- ! 1551 ! if h_ip is larger than the surrounding 9 pts => reduce h_ip and increase a_ip 1552 IF( ln_pnd_H12 .AND. pv_ip(ji,jj,jl) > 0._wp ) THEN 1553 zhip = pv_ip(ji,jj,jl) / MAX( epsi20, pa_ip(ji,jj,jl) ) 1554 IF( zhip > phip_max(ji,jj,jl) .AND. pa_ip(ji,jj,jl) < 0.15 ) THEN 1555 pa_ip(ji,jj,jl) = pv_ip(ji,jj,jl) / phip_max(ji,jj,jl) 1556 ENDIF 1557 ENDIF 1463 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 1464 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 1558 1465 ! 1559 ! ! -- check h_i -- ! 1560 ! if h_i is larger than the surrounding 9 pts => reduce h_i and increase a_i 1561 zhi = pv_i(ji,jj,jl) / pa_i(ji,jj,jl) 1562 IF( zhi > phi_max(ji,jj,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN 1563 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) 1564 ENDIF 1565 ! 1566 ! ! -- check h_s -- ! 1567 ! if h_s is larger than the surrounding 9 pts => put the snow excess in the ocean 1568 zhs = pv_s(ji,jj,jl) / pa_i(ji,jj,jl) 1569 IF( pv_s(ji,jj,jl) > 0._wp .AND. zhs > phs_max(ji,jj,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN 1570 zfra = phs_max(ji,jj,jl) / MAX( zhs, epsi20 ) 1571 ! 1572 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 1573 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 1574 ! 1575 pe_s(ji,jj,1:nlay_s,jl) = pe_s(ji,jj,1:nlay_s,jl) * zfra 1576 pv_s(ji,jj,jl) = pa_i(ji,jj,jl) * phs_max(ji,jj,jl) 1577 ENDIF 1578 ! 1579 ENDIF 1580 END DO 1581 END DO 1466 pe_s(ji,jj,1:nlay_s,jl) = pe_s(ji,jj,1:nlay_s,jl) * zfra 1467 pv_s(ji,jj,jl) = pa_i(ji,jj,jl) * phs_max(ji,jj,jl) 1468 ENDIF 1469 ! 1470 ENDIF 1471 END_2D 1582 1472 END DO 1583 1473 ! … … 1612 1502 ! -- check snow load -- ! 1613 1503 DO jl = 1, jpl 1614 DO jj = 1, jpj 1615 DO ji = 1, jpi 1616 IF ( pv_i(ji,jj,jl) > 0._wp ) THEN 1617 ! 1618 zvs_excess = MAX( 0._wp, pv_s(ji,jj,jl) - pv_i(ji,jj,jl) * (rau0-rhoi) * r1_rhos ) 1619 ! 1620 IF( zvs_excess > 0._wp ) THEN ! snow-ice interface deplets below the ocean surface 1621 ! put snow excess in the ocean 1622 zfra = ( pv_s(ji,jj,jl) - zvs_excess ) / MAX( pv_s(ji,jj,jl), epsi20 ) 1623 wfx_res(ji,jj) = wfx_res(ji,jj) + zvs_excess * rhos * z1_dt 1624 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 1625 ! correct snow volume and heat content 1626 pe_s(ji,jj,1:nlay_s,jl) = pe_s(ji,jj,1:nlay_s,jl) * zfra 1627 pv_s(ji,jj,jl) = pv_s(ji,jj,jl) - zvs_excess 1628 ENDIF 1629 ! 1504 DO_2D_11_11 1505 IF ( pv_i(ji,jj,jl) > 0._wp ) THEN 1506 ! 1507 zvs_excess = MAX( 0._wp, pv_s(ji,jj,jl) - pv_i(ji,jj,jl) * (rau0-rhoi) * r1_rhos ) 1508 ! 1509 IF( zvs_excess > 0._wp ) THEN ! snow-ice interface deplets below the ocean surface 1510 ! put snow excess in the ocean 1511 zfra = ( pv_s(ji,jj,jl) - zvs_excess ) / MAX( pv_s(ji,jj,jl), epsi20 ) 1512 wfx_res(ji,jj) = wfx_res(ji,jj) + zvs_excess * rhos * z1_dt 1513 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 1514 ! correct snow volume and heat content 1515 pe_s(ji,jj,1:nlay_s,jl) = pe_s(ji,jj,1:nlay_s,jl) * zfra 1516 pv_s(ji,jj,jl) = pv_s(ji,jj,jl) - zvs_excess 1630 1517 ENDIF 1631 END DO 1632 END DO 1518 ! 1519 ENDIF 1520 END_2D 1633 1521 END DO 1634 1522 ! -
NEMO/trunk/src/ICE/icedyn_rdgrft.F90
r11732 r12377 75 75 REAL(wp) :: rn_fpndrft ! fractional pond loss to the ocean during rafting 76 76 ! 77 !! * Substitutions 78 # include "do_loop_substitute.h90" 77 79 !!---------------------------------------------------------------------- 78 80 !! NEMO/ICE 4.0 , NEMO Consortium (2018) … … 159 161 npti = 0 ; nptidx(:) = 0 160 162 ipti = 0 ; iptidx(:) = 0 161 DO jj = 1, jpj 162 DO ji = 1, jpi 163 IF ( at_i(ji,jj) > epsi10 ) THEN 164 npti = npti + 1 165 nptidx( npti ) = (jj - 1) * jpi + ji 166 ENDIF 167 END DO 168 END DO 163 DO_2D_11_11 164 IF ( at_i(ji,jj) > epsi10 ) THEN 165 npti = npti + 1 166 nptidx( npti ) = (jj - 1) * jpi + ji 167 ENDIF 168 END_2D 169 169 170 170 !-------------------------------------------------------- … … 268 268 269 269 ! controls 270 IF( ln_ctl ) CALL ice_prt3D ('icedyn_rdgrft')! prints270 IF( sn_cfctl%l_prtctl ) CALL ice_prt3D ('icedyn_rdgrft') ! prints 271 271 IF( ln_icectl ) CALL ice_prt (kt, iiceprt, jiceprt,-1, ' - ice dyn rdgrft - ') ! prints 272 272 IF( ln_icediachk ) CALL ice_cons_hsm(1, 'icedyn_rdgrft', rdiag_v, rdiag_s, rdiag_t, rdiag_fv, rdiag_fs, rdiag_ft) ! conservation … … 766 766 ! !--------------------------------------------------! 767 767 CASE( 1 ) !--- Spatial smoothing 768 DO jj = 2, jpjm1 769 DO ji = 2, jpim1 770 IF ( SUM( a_i(ji,jj,:) ) > 0._wp ) THEN 771 zworka(ji,jj) = ( 4.0 * strength(ji,jj) & 772 & + strength(ji-1,jj) * tmask(ji-1,jj,1) + strength(ji+1,jj) * tmask(ji+1,jj,1) & 773 & + strength(ji,jj-1) * tmask(ji,jj-1,1) + strength(ji,jj+1) * tmask(ji,jj+1,1) & 774 & ) / ( 4.0 + tmask(ji-1,jj,1) + tmask(ji+1,jj,1) + tmask(ji,jj-1,1) + tmask(ji,jj+1,1) ) 775 ELSE 776 zworka(ji,jj) = 0._wp 777 ENDIF 778 END DO 779 END DO 768 DO_2D_00_00 769 IF ( SUM( a_i(ji,jj,:) ) > 0._wp ) THEN 770 zworka(ji,jj) = ( 4.0 * strength(ji,jj) & 771 & + strength(ji-1,jj) * tmask(ji-1,jj,1) + strength(ji+1,jj) * tmask(ji+1,jj,1) & 772 & + strength(ji,jj-1) * tmask(ji,jj-1,1) + strength(ji,jj+1) * tmask(ji,jj+1,1) & 773 & ) / ( 4.0 + tmask(ji-1,jj,1) + tmask(ji+1,jj,1) + tmask(ji,jj-1,1) + tmask(ji,jj+1,1) ) 774 ELSE 775 zworka(ji,jj) = 0._wp 776 ENDIF 777 END_2D 780 778 781 DO jj = 2, jpjm1 782 DO ji = 2, jpim1 783 strength(ji,jj) = zworka(ji,jj) 784 END DO 785 END DO 779 DO_2D_00_00 780 strength(ji,jj) = zworka(ji,jj) 781 END_2D 786 782 CALL lbc_lnk( 'icedyn_rdgrft', strength, 'T', 1. ) 787 783 ! … … 792 788 ENDIF 793 789 ! 794 DO jj = 2, jpjm1 795 DO ji = 2, jpim1 796 IF ( SUM( a_i(ji,jj,:) ) > 0._wp ) THEN 797 itframe = 1 ! number of time steps for the running mean 798 IF ( zstrp1(ji,jj) > 0._wp ) itframe = itframe + 1 799 IF ( zstrp2(ji,jj) > 0._wp ) itframe = itframe + 1 800 zp = ( strength(ji,jj) + zstrp1(ji,jj) + zstrp2(ji,jj) ) / itframe 801 zstrp2 (ji,jj) = zstrp1 (ji,jj) 802 zstrp1 (ji,jj) = strength(ji,jj) 803 strength(ji,jj) = zp 804 ENDIF 805 END DO 806 END DO 790 DO_2D_00_00 791 IF ( SUM( a_i(ji,jj,:) ) > 0._wp ) THEN 792 itframe = 1 ! number of time steps for the running mean 793 IF ( zstrp1(ji,jj) > 0._wp ) itframe = itframe + 1 794 IF ( zstrp2(ji,jj) > 0._wp ) itframe = itframe + 1 795 zp = ( strength(ji,jj) + zstrp1(ji,jj) + zstrp2(ji,jj) ) / itframe 796 zstrp2 (ji,jj) = zstrp1 (ji,jj) 797 zstrp1 (ji,jj) = strength(ji,jj) 798 strength(ji,jj) = zp 799 ENDIF 800 END_2D 807 801 CALL lbc_lnk( 'icedyn_rdgrft', strength, 'T', 1. ) 808 802 ! … … 908 902 !!------------------------------------------------------------------- 909 903 ! 910 REWIND( numnam_ice_ref ) ! Namelist namicetdme in reference namelist : Ice mechanical ice redistribution911 904 READ ( numnam_ice_ref, namdyn_rdgrft, IOSTAT = ios, ERR = 901) 912 905 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namdyn_rdgrft in reference namelist' ) 913 REWIND( numnam_ice_cfg ) ! Namelist namdyn_rdgrft in configuration namelist : Ice mechanical ice redistribution914 906 READ ( numnam_ice_cfg, namdyn_rdgrft, IOSTAT = ios, ERR = 902 ) 915 907 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namdyn_rdgrft in configuration namelist' ) -
NEMO/trunk/src/ICE/icedyn_rhg.F90
r11536 r12377 38 38 LOGICAL :: ln_rhg_EVP ! EVP rheology 39 39 ! 40 !! * Substitutions41 # include "vectopt_loop_substitute.h90"42 40 !!---------------------------------------------------------------------- 43 41 !! NEMO/ICE 4.0 , NEMO Consortium (2018) … … 47 45 CONTAINS 48 46 49 SUBROUTINE ice_dyn_rhg( kt )47 SUBROUTINE ice_dyn_rhg( kt, Kmm ) 50 48 !!------------------------------------------------------------------- 51 49 !! *** ROUTINE ice_dyn_rhg *** … … 58 56 !!-------------------------------------------------------------------- 59 57 INTEGER, INTENT(in) :: kt ! ice time step 60 ! 61 INTEGER :: jl ! dummy loop indices 58 INTEGER, INTENT(in) :: Kmm ! ocean time level index 62 59 !!-------------------------------------------------------------------- 63 60 ! controls … … 79 76 CASE( np_rhgEVP ) ! Elasto-Viscous-Plastic ! 80 77 ! !------------------------! 81 CALL ice_dyn_rhg_evp( kt, stress1_i, stress2_i, stress12_i, shear_i, divu_i, delta_i )78 CALL ice_dyn_rhg_evp( kt, Kmm, stress1_i, stress2_i, stress12_i, shear_i, divu_i, delta_i ) 82 79 ! 83 80 END SELECT … … 88 85 ! 89 86 ! controls 90 IF( ln_ctl ) CALL ice_prt3D ('icedyn_rhg') ! prints 87 IF( sn_cfctl%l_prtctl ) & 88 & CALL ice_prt3D ('icedyn_rhg') ! prints 91 89 IF( ln_icediachk ) CALL ice_cons_hsm(1, 'icedyn_rhg', rdiag_v, rdiag_s, rdiag_t, rdiag_fv, rdiag_fs, rdiag_ft) ! conservation 92 90 IF( ln_icediachk ) CALL ice_cons2D (1, 'icedyn_rhg', diag_v, diag_s, diag_t, diag_fv, diag_fs, diag_ft) ! conservation … … 113 111 !!------------------------------------------------------------------- 114 112 ! 115 REWIND( numnam_ice_ref ) ! Namelist namdyn_rhg in reference namelist : Ice dynamics116 113 READ ( numnam_ice_ref, namdyn_rhg, IOSTAT = ios, ERR = 901) 117 114 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namdyn_rhg in reference namelist' ) 118 REWIND( numnam_ice_cfg ) ! Namelist namdyn_rhg in configuration namelist : Ice dynamics119 115 READ ( numnam_ice_cfg, namdyn_rhg, IOSTAT = ios, ERR = 902 ) 120 116 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namdyn_rhg in configuration namelist' ) -
NEMO/trunk/src/ICE/icedyn_rhg_evp.F90
r11536 r12377 48 48 49 49 !! * Substitutions 50 # include " vectopt_loop_substitute.h90"50 # include "do_loop_substitute.h90" 51 51 !!---------------------------------------------------------------------- 52 52 !! NEMO/ICE 4.0 , NEMO Consortium (2018) … … 56 56 CONTAINS 57 57 58 SUBROUTINE ice_dyn_rhg_evp( kt, pstress1_i, pstress2_i, pstress12_i, pshear_i, pdivu_i, pdelta_i )58 SUBROUTINE ice_dyn_rhg_evp( kt, Kmm, pstress1_i, pstress2_i, pstress12_i, pshear_i, pdivu_i, pdelta_i ) 59 59 !!------------------------------------------------------------------- 60 60 !! *** SUBROUTINE ice_dyn_rhg_evp *** … … 109 109 !!------------------------------------------------------------------- 110 110 INTEGER , INTENT(in ) :: kt ! time step 111 INTEGER , INTENT(in ) :: Kmm ! ocean time level index 111 112 REAL(wp), DIMENSION(:,:), INTENT(inout) :: pstress1_i, pstress2_i, pstress12_i ! 112 113 REAL(wp), DIMENSION(:,:), INTENT( out) :: pshear_i , pdivu_i , pdelta_i ! … … 179 180 !------------------------------------------------------------------------------! 180 181 ! ocean/land mask 181 DO jj = 1, jpjm1 182 DO ji = 1, jpim1 ! NO vector opt. 183 zfmask(ji,jj) = tmask(ji,jj,1) * tmask(ji+1,jj,1) * tmask(ji,jj+1,1) * tmask(ji+1,jj+1,1) 184 END DO 185 END DO 182 DO_2D_10_10 183 zfmask(ji,jj) = tmask(ji,jj,1) * tmask(ji+1,jj,1) * tmask(ji,jj+1,1) * tmask(ji+1,jj+1,1) 184 END_2D 186 185 CALL lbc_lnk( 'icedyn_rhg_evp', zfmask, 'F', 1._wp ) 187 186 188 187 ! Lateral boundary conditions on velocity (modify zfmask) 189 188 zwf(:,:) = zfmask(:,:) 190 DO jj = 2, jpjm1 191 DO ji = fs_2, fs_jpim1 ! vector opt. 192 IF( zfmask(ji,jj) == 0._wp ) THEN 193 zfmask(ji,jj) = rn_ishlat * MIN( 1._wp , MAX( zwf(ji+1,jj), zwf(ji,jj+1), zwf(ji-1,jj), zwf(ji,jj-1) ) ) 194 ENDIF 195 END DO 196 END DO 189 DO_2D_00_00 190 IF( zfmask(ji,jj) == 0._wp ) THEN 191 zfmask(ji,jj) = rn_ishlat * MIN( 1._wp , MAX( zwf(ji+1,jj), zwf(ji,jj+1), zwf(ji-1,jj), zwf(ji,jj-1) ) ) 192 ENDIF 193 END_2D 197 194 DO jj = 2, jpjm1 198 195 IF( zfmask(1,jj) == 0._wp ) THEN … … 256 253 zsshdyn(:,:) = ice_var_sshdyn( ssh_m, snwice_mass, snwice_mass_b) 257 254 258 DO jj = 2, jpjm1 259 DO ji = fs_2, fs_jpim1 260 261 ! ice fraction at U-V points 262 zaU(ji,jj) = 0.5_wp * ( at_i(ji,jj) * e1e2t(ji,jj) + at_i(ji+1,jj) * e1e2t(ji+1,jj) ) * r1_e1e2u(ji,jj) * umask(ji,jj,1) 263 zaV(ji,jj) = 0.5_wp * ( at_i(ji,jj) * e1e2t(ji,jj) + at_i(ji,jj+1) * e1e2t(ji,jj+1) ) * r1_e1e2v(ji,jj) * vmask(ji,jj,1) 264 265 ! Ice/snow mass at U-V points 266 zm1 = ( rhos * vt_s(ji ,jj ) + rhoi * vt_i(ji ,jj ) ) 267 zm2 = ( rhos * vt_s(ji+1,jj ) + rhoi * vt_i(ji+1,jj ) ) 268 zm3 = ( rhos * vt_s(ji ,jj+1) + rhoi * vt_i(ji ,jj+1) ) 269 zmassU = 0.5_wp * ( zm1 * e1e2t(ji,jj) + zm2 * e1e2t(ji+1,jj) ) * r1_e1e2u(ji,jj) * umask(ji,jj,1) 270 zmassV = 0.5_wp * ( zm1 * e1e2t(ji,jj) + zm3 * e1e2t(ji,jj+1) ) * r1_e1e2v(ji,jj) * vmask(ji,jj,1) 271 272 ! Ocean currents at U-V points 273 v_oceU(ji,jj) = 0.25_wp * ( v_oce(ji,jj) + v_oce(ji,jj-1) + v_oce(ji+1,jj) + v_oce(ji+1,jj-1) ) * umask(ji,jj,1) 274 u_oceV(ji,jj) = 0.25_wp * ( u_oce(ji,jj) + u_oce(ji-1,jj) + u_oce(ji,jj+1) + u_oce(ji-1,jj+1) ) * vmask(ji,jj,1) 275 276 ! Coriolis at T points (m*f) 277 zmf(ji,jj) = zm1 * ff_t(ji,jj) 278 279 ! dt/m at T points (for alpha and beta coefficients) 280 zdt_m(ji,jj) = zdtevp / MAX( zm1, zmmin ) 281 282 ! m/dt 283 zmU_t(ji,jj) = zmassU * z1_dtevp 284 zmV_t(ji,jj) = zmassV * z1_dtevp 285 286 ! Drag ice-atm. 287 ztaux_ai(ji,jj) = zaU(ji,jj) * utau_ice(ji,jj) 288 ztauy_ai(ji,jj) = zaV(ji,jj) * vtau_ice(ji,jj) 289 290 ! Surface pressure gradient (- m*g*GRAD(ssh)) at U-V points 291 zspgU(ji,jj) = - zmassU * grav * ( zsshdyn(ji+1,jj) - zsshdyn(ji,jj) ) * r1_e1u(ji,jj) 292 zspgV(ji,jj) = - zmassV * grav * ( zsshdyn(ji,jj+1) - zsshdyn(ji,jj) ) * r1_e2v(ji,jj) 293 294 ! masks 295 zmsk00x(ji,jj) = 1._wp - MAX( 0._wp, SIGN( 1._wp, -zmassU ) ) ! 0 if no ice 296 zmsk00y(ji,jj) = 1._wp - MAX( 0._wp, SIGN( 1._wp, -zmassV ) ) ! 0 if no ice 297 298 ! switches 299 IF( zmassU <= zmmin .AND. zaU(ji,jj) <= zamin ) THEN ; zmsk01x(ji,jj) = 0._wp 300 ELSE ; zmsk01x(ji,jj) = 1._wp ; ENDIF 301 IF( zmassV <= zmmin .AND. zaV(ji,jj) <= zamin ) THEN ; zmsk01y(ji,jj) = 0._wp 302 ELSE ; zmsk01y(ji,jj) = 1._wp ; ENDIF 303 304 END DO 305 END DO 255 DO_2D_00_00 256 257 ! ice fraction at U-V points 258 zaU(ji,jj) = 0.5_wp * ( at_i(ji,jj) * e1e2t(ji,jj) + at_i(ji+1,jj) * e1e2t(ji+1,jj) ) * r1_e1e2u(ji,jj) * umask(ji,jj,1) 259 zaV(ji,jj) = 0.5_wp * ( at_i(ji,jj) * e1e2t(ji,jj) + at_i(ji,jj+1) * e1e2t(ji,jj+1) ) * r1_e1e2v(ji,jj) * vmask(ji,jj,1) 260 261 ! Ice/snow mass at U-V points 262 zm1 = ( rhos * vt_s(ji ,jj ) + rhoi * vt_i(ji ,jj ) ) 263 zm2 = ( rhos * vt_s(ji+1,jj ) + rhoi * vt_i(ji+1,jj ) ) 264 zm3 = ( rhos * vt_s(ji ,jj+1) + rhoi * vt_i(ji ,jj+1) ) 265 zmassU = 0.5_wp * ( zm1 * e1e2t(ji,jj) + zm2 * e1e2t(ji+1,jj) ) * r1_e1e2u(ji,jj) * umask(ji,jj,1) 266 zmassV = 0.5_wp * ( zm1 * e1e2t(ji,jj) + zm3 * e1e2t(ji,jj+1) ) * r1_e1e2v(ji,jj) * vmask(ji,jj,1) 267 268 ! Ocean currents at U-V points 269 v_oceU(ji,jj) = 0.25_wp * ( v_oce(ji,jj) + v_oce(ji,jj-1) + v_oce(ji+1,jj) + v_oce(ji+1,jj-1) ) * umask(ji,jj,1) 270 u_oceV(ji,jj) = 0.25_wp * ( u_oce(ji,jj) + u_oce(ji-1,jj) + u_oce(ji,jj+1) + u_oce(ji-1,jj+1) ) * vmask(ji,jj,1) 271 272 ! Coriolis at T points (m*f) 273 zmf(ji,jj) = zm1 * ff_t(ji,jj) 274 275 ! dt/m at T points (for alpha and beta coefficients) 276 zdt_m(ji,jj) = zdtevp / MAX( zm1, zmmin ) 277 278 ! m/dt 279 zmU_t(ji,jj) = zmassU * z1_dtevp 280 zmV_t(ji,jj) = zmassV * z1_dtevp 281 282 ! Drag ice-atm. 283 ztaux_ai(ji,jj) = zaU(ji,jj) * utau_ice(ji,jj) 284 ztauy_ai(ji,jj) = zaV(ji,jj) * vtau_ice(ji,jj) 285 286 ! Surface pressure gradient (- m*g*GRAD(ssh)) at U-V points 287 zspgU(ji,jj) = - zmassU * grav * ( zsshdyn(ji+1,jj) - zsshdyn(ji,jj) ) * r1_e1u(ji,jj) 288 zspgV(ji,jj) = - zmassV * grav * ( zsshdyn(ji,jj+1) - zsshdyn(ji,jj) ) * r1_e2v(ji,jj) 289 290 ! masks 291 zmsk00x(ji,jj) = 1._wp - MAX( 0._wp, SIGN( 1._wp, -zmassU ) ) ! 0 if no ice 292 zmsk00y(ji,jj) = 1._wp - MAX( 0._wp, SIGN( 1._wp, -zmassV ) ) ! 0 if no ice 293 294 ! switches 295 IF( zmassU <= zmmin .AND. zaU(ji,jj) <= zamin ) THEN ; zmsk01x(ji,jj) = 0._wp 296 ELSE ; zmsk01x(ji,jj) = 1._wp ; ENDIF 297 IF( zmassV <= zmmin .AND. zaV(ji,jj) <= zamin ) THEN ; zmsk01y(ji,jj) = 0._wp 298 ELSE ; zmsk01y(ji,jj) = 1._wp ; ENDIF 299 300 END_2D 306 301 CALL lbc_lnk_multi( 'icedyn_rhg_evp', zmf, 'T', 1., zdt_m, 'T', 1. ) 307 302 ! … … 309 304 ! 310 305 IF( ln_landfast_L16 ) THEN !-- Lemieux 2016 311 DO jj = 2, jpjm1 312 DO ji = fs_2, fs_jpim1 313 ! ice thickness at U-V points 314 zvU = 0.5_wp * ( vt_i(ji,jj) * e1e2t(ji,jj) + vt_i(ji+1,jj) * e1e2t(ji+1,jj) ) * r1_e1e2u(ji,jj) * umask(ji,jj,1) 315 zvV = 0.5_wp * ( vt_i(ji,jj) * e1e2t(ji,jj) + vt_i(ji,jj+1) * e1e2t(ji,jj+1) ) * r1_e1e2v(ji,jj) * vmask(ji,jj,1) 316 ! ice-bottom stress at U points 317 zvCr = zaU(ji,jj) * rn_depfra * hu_n(ji,jj) 318 ztaux_base(ji,jj) = - rn_icebfr * MAX( 0._wp, zvU - zvCr ) * EXP( -rn_crhg * ( 1._wp - zaU(ji,jj) ) ) 319 ! ice-bottom stress at V points 320 zvCr = zaV(ji,jj) * rn_depfra * hv_n(ji,jj) 321 ztauy_base(ji,jj) = - rn_icebfr * MAX( 0._wp, zvV - zvCr ) * EXP( -rn_crhg * ( 1._wp - zaV(ji,jj) ) ) 322 ! ice_bottom stress at T points 323 zvCr = at_i(ji,jj) * rn_depfra * ht_n(ji,jj) 324 tau_icebfr(ji,jj) = - rn_icebfr * MAX( 0._wp, vt_i(ji,jj) - zvCr ) * EXP( -rn_crhg * ( 1._wp - at_i(ji,jj) ) ) 325 END DO 326 END DO 306 DO_2D_00_00 307 ! ice thickness at U-V points 308 zvU = 0.5_wp * ( vt_i(ji,jj) * e1e2t(ji,jj) + vt_i(ji+1,jj) * e1e2t(ji+1,jj) ) * r1_e1e2u(ji,jj) * umask(ji,jj,1) 309 zvV = 0.5_wp * ( vt_i(ji,jj) * e1e2t(ji,jj) + vt_i(ji,jj+1) * e1e2t(ji,jj+1) ) * r1_e1e2v(ji,jj) * vmask(ji,jj,1) 310 ! ice-bottom stress at U points 311 zvCr = zaU(ji,jj) * rn_depfra * hu(ji,jj,Kmm) 312 ztaux_base(ji,jj) = - rn_icebfr * MAX( 0._wp, zvU - zvCr ) * EXP( -rn_crhg * ( 1._wp - zaU(ji,jj) ) ) 313 ! ice-bottom stress at V points 314 zvCr = zaV(ji,jj) * rn_depfra * hv(ji,jj,Kmm) 315 ztauy_base(ji,jj) = - rn_icebfr * MAX( 0._wp, zvV - zvCr ) * EXP( -rn_crhg * ( 1._wp - zaV(ji,jj) ) ) 316 ! ice_bottom stress at T points 317 zvCr = at_i(ji,jj) * rn_depfra * ht(ji,jj) 318 tau_icebfr(ji,jj) = - rn_icebfr * MAX( 0._wp, vt_i(ji,jj) - zvCr ) * EXP( -rn_crhg * ( 1._wp - at_i(ji,jj) ) ) 319 END_2D 327 320 CALL lbc_lnk( 'icedyn_rhg_evp', tau_icebfr(:,:), 'T', 1. ) 328 321 ! 329 322 ELSE !-- no landfast 330 DO jj = 2, jpjm1 331 DO ji = fs_2, fs_jpim1 332 ztaux_base(ji,jj) = 0._wp 333 ztauy_base(ji,jj) = 0._wp 334 END DO 335 END DO 323 DO_2D_00_00 324 ztaux_base(ji,jj) = 0._wp 325 ztauy_base(ji,jj) = 0._wp 326 END_2D 336 327 ENDIF 337 328 … … 345 336 l_full_nf_update = jter == nn_nevp ! false: disable full North fold update (performances) for iter = 1 to nn_nevp-1 346 337 ! 347 !!$ IF( ln_ctl) THEN ! Convergence test338 !!$ IF(sn_cfctl%l_prtctl) THEN ! Convergence test 348 339 !!$ DO jj = 1, jpjm1 349 340 !!$ zu_ice(:,jj) = u_ice(:,jj) ! velocity at previous time step … … 353 344 354 345 ! --- divergence, tension & shear (Appendix B of Hunke & Dukowicz, 2002) --- ! 355 DO jj = 1, jpjm1 ! loops start at 1 since there is no boundary condition (lbc_lnk) at i=1 and j=1 for F points 356 DO ji = 1, jpim1 357 358 ! shear at F points 359 zds(ji,jj) = ( ( u_ice(ji,jj+1) * r1_e1u(ji,jj+1) - u_ice(ji,jj) * r1_e1u(ji,jj) ) * e1f(ji,jj) * e1f(ji,jj) & 360 & + ( v_ice(ji+1,jj) * r1_e2v(ji+1,jj) - v_ice(ji,jj) * r1_e2v(ji,jj) ) * e2f(ji,jj) * e2f(ji,jj) & 361 & ) * r1_e1e2f(ji,jj) * zfmask(ji,jj) 362 363 END DO 364 END DO 346 DO_2D_10_10 347 348 ! shear at F points 349 zds(ji,jj) = ( ( u_ice(ji,jj+1) * r1_e1u(ji,jj+1) - u_ice(ji,jj) * r1_e1u(ji,jj) ) * e1f(ji,jj) * e1f(ji,jj) & 350 & + ( v_ice(ji+1,jj) * r1_e2v(ji+1,jj) - v_ice(ji,jj) * r1_e2v(ji,jj) ) * e2f(ji,jj) * e2f(ji,jj) & 351 & ) * r1_e1e2f(ji,jj) * zfmask(ji,jj) 352 353 END_2D 365 354 CALL lbc_lnk( 'icedyn_rhg_evp', zds, 'F', 1. ) 366 355 367 DO jj = 2, jpj ! loop to jpi,jpj to avoid making a communication for zs1,zs2,zs12 368 DO ji = 2, jpi ! no vector loop 369 370 ! shear**2 at T points (doc eq. A16) 371 zds2 = ( zds(ji,jj ) * zds(ji,jj ) * e1e2f(ji,jj ) + zds(ji-1,jj ) * zds(ji-1,jj ) * e1e2f(ji-1,jj ) & 372 & + zds(ji,jj-1) * zds(ji,jj-1) * e1e2f(ji,jj-1) + zds(ji-1,jj-1) * zds(ji-1,jj-1) * e1e2f(ji-1,jj-1) & 373 & ) * 0.25_wp * r1_e1e2t(ji,jj) 374 375 ! divergence at T points 376 zdiv = ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj) & 377 & + e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1) & 378 & ) * r1_e1e2t(ji,jj) 379 zdiv2 = zdiv * zdiv 380 381 ! tension at T points 382 zdt = ( ( u_ice(ji,jj) * r1_e2u(ji,jj) - u_ice(ji-1,jj) * r1_e2u(ji-1,jj) ) * e2t(ji,jj) * e2t(ji,jj) & 383 & - ( v_ice(ji,jj) * r1_e1v(ji,jj) - v_ice(ji,jj-1) * r1_e1v(ji,jj-1) ) * e1t(ji,jj) * e1t(ji,jj) & 384 & ) * r1_e1e2t(ji,jj) 385 zdt2 = zdt * zdt 386 387 ! delta at T points 388 zdelta = SQRT( zdiv2 + ( zdt2 + zds2 ) * z1_ecc2 ) 389 390 ! P/delta at T points 391 zp_delt(ji,jj) = strength(ji,jj) / ( zdelta + rn_creepl ) 392 393 ! alpha & beta for aEVP 394 ! gamma = 0.5*P/(delta+creepl) * (c*pi)**2/Area * dt/m 395 ! alpha = beta = sqrt(4*gamma) 396 IF( ln_aEVP ) THEN 397 zalph1 = MAX( 50._wp, rpi * SQRT( 0.5_wp * zp_delt(ji,jj) * r1_e1e2t(ji,jj) * zdt_m(ji,jj) ) ) 398 z1_alph1 = 1._wp / ( zalph1 + 1._wp ) 399 zalph2 = zalph1 400 z1_alph2 = z1_alph1 401 ENDIF 402 403 ! stress at T points (zkt/=0 if landfast) 404 zs1(ji,jj) = ( zs1(ji,jj) * zalph1 + zp_delt(ji,jj) * ( zdiv * (1._wp + zkt) - zdelta * (1._wp - zkt) ) ) * z1_alph1 405 zs2(ji,jj) = ( zs2(ji,jj) * zalph2 + zp_delt(ji,jj) * ( zdt * z1_ecc2 * (1._wp + zkt) ) ) * z1_alph2 406 407 END DO 408 END DO 356 DO_2D_01_01 357 358 ! shear**2 at T points (doc eq. A16) 359 zds2 = ( zds(ji,jj ) * zds(ji,jj ) * e1e2f(ji,jj ) + zds(ji-1,jj ) * zds(ji-1,jj ) * e1e2f(ji-1,jj ) & 360 & + zds(ji,jj-1) * zds(ji,jj-1) * e1e2f(ji,jj-1) + zds(ji-1,jj-1) * zds(ji-1,jj-1) * e1e2f(ji-1,jj-1) & 361 & ) * 0.25_wp * r1_e1e2t(ji,jj) 362 363 ! divergence at T points 364 zdiv = ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj) & 365 & + e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1) & 366 & ) * r1_e1e2t(ji,jj) 367 zdiv2 = zdiv * zdiv 368 369 ! tension at T points 370 zdt = ( ( u_ice(ji,jj) * r1_e2u(ji,jj) - u_ice(ji-1,jj) * r1_e2u(ji-1,jj) ) * e2t(ji,jj) * e2t(ji,jj) & 371 & - ( v_ice(ji,jj) * r1_e1v(ji,jj) - v_ice(ji,jj-1) * r1_e1v(ji,jj-1) ) * e1t(ji,jj) * e1t(ji,jj) & 372 & ) * r1_e1e2t(ji,jj) 373 zdt2 = zdt * zdt 374 375 ! delta at T points 376 zdelta = SQRT( zdiv2 + ( zdt2 + zds2 ) * z1_ecc2 ) 377 378 ! P/delta at T points 379 zp_delt(ji,jj) = strength(ji,jj) / ( zdelta + rn_creepl ) 380 381 ! alpha & beta for aEVP 382 ! gamma = 0.5*P/(delta+creepl) * (c*pi)**2/Area * dt/m 383 ! alpha = beta = sqrt(4*gamma) 384 IF( ln_aEVP ) THEN 385 zalph1 = MAX( 50._wp, rpi * SQRT( 0.5_wp * zp_delt(ji,jj) * r1_e1e2t(ji,jj) * zdt_m(ji,jj) ) ) 386 z1_alph1 = 1._wp / ( zalph1 + 1._wp ) 387 zalph2 = zalph1 388 z1_alph2 = z1_alph1 389 ENDIF 390 391 ! stress at T points (zkt/=0 if landfast) 392 zs1(ji,jj) = ( zs1(ji,jj) * zalph1 + zp_delt(ji,jj) * ( zdiv * (1._wp + zkt) - zdelta * (1._wp - zkt) ) ) * z1_alph1 393 zs2(ji,jj) = ( zs2(ji,jj) * zalph2 + zp_delt(ji,jj) * ( zdt * z1_ecc2 * (1._wp + zkt) ) ) * z1_alph2 394 395 END_2D 409 396 CALL lbc_lnk( 'icedyn_rhg_evp', zp_delt, 'T', 1. ) 410 397 411 DO jj = 1, jpjm1 412 DO ji = 1, jpim1 413 414 ! alpha & beta for aEVP 415 IF( ln_aEVP ) THEN 416 zalph2 = MAX( 50._wp, rpi * SQRT( 0.5_wp * zp_delt(ji,jj) * r1_e1e2t(ji,jj) * zdt_m(ji,jj) ) ) 417 z1_alph2 = 1._wp / ( zalph2 + 1._wp ) 418 zbeta(ji,jj) = zalph2 419 ENDIF 420 421 ! P/delta at F points 422 zp_delf = 0.25_wp * ( zp_delt(ji,jj) + zp_delt(ji+1,jj) + zp_delt(ji,jj+1) + zp_delt(ji+1,jj+1) ) 423 424 ! stress at F points (zkt/=0 if landfast) 425 zs12(ji,jj)= ( zs12(ji,jj) * zalph2 + zp_delf * ( zds(ji,jj) * z1_ecc2 * (1._wp + zkt) ) * 0.5_wp ) * z1_alph2 426 427 END DO 428 END DO 398 DO_2D_10_10 399 400 ! alpha & beta for aEVP 401 IF( ln_aEVP ) THEN 402 zalph2 = MAX( 50._wp, rpi * SQRT( 0.5_wp * zp_delt(ji,jj) * r1_e1e2t(ji,jj) * zdt_m(ji,jj) ) ) 403 z1_alph2 = 1._wp / ( zalph2 + 1._wp ) 404 zbeta(ji,jj) = zalph2 405 ENDIF 406 407 ! P/delta at F points 408 zp_delf = 0.25_wp * ( zp_delt(ji,jj) + zp_delt(ji+1,jj) + zp_delt(ji,jj+1) + zp_delt(ji+1,jj+1) ) 409 410 ! stress at F points (zkt/=0 if landfast) 411 zs12(ji,jj)= ( zs12(ji,jj) * zalph2 + zp_delf * ( zds(ji,jj) * z1_ecc2 * (1._wp + zkt) ) * 0.5_wp ) * z1_alph2 412 413 END_2D 429 414 430 415 ! --- Ice internal stresses (Appendix C of Hunke and Dukowicz, 2002) --- ! 431 DO jj = 2, jpjm1 432 DO ji = fs_2, fs_jpim1 433 ! !--- U points 434 zfU(ji,jj) = 0.5_wp * ( ( zs1(ji+1,jj) - zs1(ji,jj) ) * e2u(ji,jj) & 435 & + ( zs2(ji+1,jj) * e2t(ji+1,jj) * e2t(ji+1,jj) - zs2(ji,jj) * e2t(ji,jj) * e2t(ji,jj) & 436 & ) * r1_e2u(ji,jj) & 437 & + ( zs12(ji,jj) * e1f(ji,jj) * e1f(ji,jj) - zs12(ji,jj-1) * e1f(ji,jj-1) * e1f(ji,jj-1) & 438 & ) * 2._wp * r1_e1u(ji,jj) & 439 & ) * r1_e1e2u(ji,jj) 440 ! 441 ! !--- V points 442 zfV(ji,jj) = 0.5_wp * ( ( zs1(ji,jj+1) - zs1(ji,jj) ) * e1v(ji,jj) & 443 & - ( zs2(ji,jj+1) * e1t(ji,jj+1) * e1t(ji,jj+1) - zs2(ji,jj) * e1t(ji,jj) * e1t(ji,jj) & 444 & ) * r1_e1v(ji,jj) & 445 & + ( zs12(ji,jj) * e2f(ji,jj) * e2f(ji,jj) - zs12(ji-1,jj) * e2f(ji-1,jj) * e2f(ji-1,jj) & 446 & ) * 2._wp * r1_e2v(ji,jj) & 447 & ) * r1_e1e2v(ji,jj) 448 ! 449 ! !--- ice currents at U-V point 450 v_iceU(ji,jj) = 0.25_wp * ( v_ice(ji,jj) + v_ice(ji,jj-1) + v_ice(ji+1,jj) + v_ice(ji+1,jj-1) ) * umask(ji,jj,1) 451 u_iceV(ji,jj) = 0.25_wp * ( u_ice(ji,jj) + u_ice(ji-1,jj) + u_ice(ji,jj+1) + u_ice(ji-1,jj+1) ) * vmask(ji,jj,1) 452 ! 453 END DO 454 END DO 416 DO_2D_00_00 417 ! !--- U points 418 zfU(ji,jj) = 0.5_wp * ( ( zs1(ji+1,jj) - zs1(ji,jj) ) * e2u(ji,jj) & 419 & + ( zs2(ji+1,jj) * e2t(ji+1,jj) * e2t(ji+1,jj) - zs2(ji,jj) * e2t(ji,jj) * e2t(ji,jj) & 420 & ) * r1_e2u(ji,jj) & 421 & + ( zs12(ji,jj) * e1f(ji,jj) * e1f(ji,jj) - zs12(ji,jj-1) * e1f(ji,jj-1) * e1f(ji,jj-1) & 422 & ) * 2._wp * r1_e1u(ji,jj) & 423 & ) * r1_e1e2u(ji,jj) 424 ! 425 ! !--- V points 426 zfV(ji,jj) = 0.5_wp * ( ( zs1(ji,jj+1) - zs1(ji,jj) ) * e1v(ji,jj) & 427 & - ( zs2(ji,jj+1) * e1t(ji,jj+1) * e1t(ji,jj+1) - zs2(ji,jj) * e1t(ji,jj) * e1t(ji,jj) & 428 & ) * r1_e1v(ji,jj) & 429 & + ( zs12(ji,jj) * e2f(ji,jj) * e2f(ji,jj) - zs12(ji-1,jj) * e2f(ji-1,jj) * e2f(ji-1,jj) & 430 & ) * 2._wp * r1_e2v(ji,jj) & 431 & ) * r1_e1e2v(ji,jj) 432 ! 433 ! !--- ice currents at U-V point 434 v_iceU(ji,jj) = 0.25_wp * ( v_ice(ji,jj) + v_ice(ji,jj-1) + v_ice(ji+1,jj) + v_ice(ji+1,jj-1) ) * umask(ji,jj,1) 435 u_iceV(ji,jj) = 0.25_wp * ( u_ice(ji,jj) + u_ice(ji-1,jj) + u_ice(ji,jj+1) + u_ice(ji-1,jj+1) ) * vmask(ji,jj,1) 436 ! 437 END_2D 455 438 ! 456 439 ! --- Computation of ice velocity --- ! … … 459 442 IF( MOD(jter,2) == 0 ) THEN ! even iterations 460 443 ! 461 DO jj = 2, jpjm1 462 DO ji = fs_2, fs_jpim1 463 ! !--- tau_io/(v_oce - v_ice) 464 zTauO = zaV(ji,jj) * zrhoco * SQRT( ( v_ice (ji,jj) - v_oce (ji,jj) ) * ( v_ice (ji,jj) - v_oce (ji,jj) ) & 465 & + ( u_iceV(ji,jj) - u_oceV(ji,jj) ) * ( u_iceV(ji,jj) - u_oceV(ji,jj) ) ) 466 ! !--- Ocean-to-Ice stress 467 ztauy_oi(ji,jj) = zTauO * ( v_oce(ji,jj) - v_ice(ji,jj) ) 468 ! 469 ! !--- tau_bottom/v_ice 470 zvel = 5.e-05_wp + SQRT( v_ice(ji,jj) * v_ice(ji,jj) + u_iceV(ji,jj) * u_iceV(ji,jj) ) 471 zTauB = ztauy_base(ji,jj) / zvel 472 ! !--- OceanBottom-to-Ice stress 473 ztauy_bi(ji,jj) = zTauB * v_ice(ji,jj) 474 ! 475 ! !--- Coriolis at V-points (energy conserving formulation) 476 zCorV(ji,jj) = - 0.25_wp * r1_e2v(ji,jj) * & 477 & ( zmf(ji,jj ) * ( e2u(ji,jj ) * u_ice(ji,jj ) + e2u(ji-1,jj ) * u_ice(ji-1,jj ) ) & 478 & + zmf(ji,jj+1) * ( e2u(ji,jj+1) * u_ice(ji,jj+1) + e2u(ji-1,jj+1) * u_ice(ji-1,jj+1) ) ) 479 ! 480 ! !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io 481 zRHS = zfV(ji,jj) + ztauy_ai(ji,jj) + zCorV(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj) 482 ! 483 ! !--- landfast switch => 0 = static friction : TauB > RHS & sign(TauB) /= sign(RHS) 484 ! 1 = sliding friction : TauB < RHS 485 rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztauy_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) ) 486 ! 487 IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 488 v_ice(ji,jj) = ( ( rswitch * ( zmV_t(ji,jj) * ( zbeta(ji,jj) * v_ice(ji,jj) + v_ice_b(ji,jj) ) & ! previous velocity 489 & + zRHS + zTauO * v_ice(ji,jj) ) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 490 & / MAX( zepsi, zmV_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 491 & + ( 1._wp - rswitch ) * v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax ) & ! static friction => slow decrease to v=0 492 & ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 493 & ) * zmsk00y(ji,jj) 494 ELSE !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 495 v_ice(ji,jj) = ( ( rswitch * ( zmV_t(ji,jj) * v_ice(ji,jj) & ! previous velocity 496 & + zRHS + zTauO * v_ice(ji,jj) ) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 497 & / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 498 & + ( 1._wp - rswitch ) * v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax ) & ! static friction => slow decrease to v=0 499 & ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 500 & ) * zmsk00y(ji,jj) 501 ENDIF 502 END DO 503 END DO 444 DO_2D_00_00 445 ! !--- tau_io/(v_oce - v_ice) 446 zTauO = zaV(ji,jj) * zrhoco * SQRT( ( v_ice (ji,jj) - v_oce (ji,jj) ) * ( v_ice (ji,jj) - v_oce (ji,jj) ) & 447 & + ( u_iceV(ji,jj) - u_oceV(ji,jj) ) * ( u_iceV(ji,jj) - u_oceV(ji,jj) ) ) 448 ! !--- Ocean-to-Ice stress 449 ztauy_oi(ji,jj) = zTauO * ( v_oce(ji,jj) - v_ice(ji,jj) ) 450 ! 451 ! !--- tau_bottom/v_ice 452 zvel = 5.e-05_wp + SQRT( v_ice(ji,jj) * v_ice(ji,jj) + u_iceV(ji,jj) * u_iceV(ji,jj) ) 453 zTauB = ztauy_base(ji,jj) / zvel 454 ! !--- OceanBottom-to-Ice stress 455 ztauy_bi(ji,jj) = zTauB * v_ice(ji,jj) 456 ! 457 ! !--- Coriolis at V-points (energy conserving formulation) 458 zCorV(ji,jj) = - 0.25_wp * r1_e2v(ji,jj) * & 459 & ( zmf(ji,jj ) * ( e2u(ji,jj ) * u_ice(ji,jj ) + e2u(ji-1,jj ) * u_ice(ji-1,jj ) ) & 460 & + zmf(ji,jj+1) * ( e2u(ji,jj+1) * u_ice(ji,jj+1) + e2u(ji-1,jj+1) * u_ice(ji-1,jj+1) ) ) 461 ! 462 ! !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io 463 zRHS = zfV(ji,jj) + ztauy_ai(ji,jj) + zCorV(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj) 464 ! 465 ! !--- landfast switch => 0 = static friction : TauB > RHS & sign(TauB) /= sign(RHS) 466 ! 1 = sliding friction : TauB < RHS 467 rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztauy_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) ) 468 ! 469 IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 470 v_ice(ji,jj) = ( ( rswitch * ( zmV_t(ji,jj) * ( zbeta(ji,jj) * v_ice(ji,jj) + v_ice_b(ji,jj) ) & ! previous velocity 471 & + zRHS + zTauO * v_ice(ji,jj) ) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 472 & / MAX( zepsi, zmV_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 473 & + ( 1._wp - rswitch ) * v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax ) & ! static friction => slow decrease to v=0 474 & ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 475 & ) * zmsk00y(ji,jj) 476 ELSE !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 477 v_ice(ji,jj) = ( ( rswitch * ( zmV_t(ji,jj) * v_ice(ji,jj) & ! previous velocity 478 & + zRHS + zTauO * v_ice(ji,jj) ) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 479 & / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 480 & + ( 1._wp - rswitch ) * v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax ) & ! static friction => slow decrease to v=0 481 & ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 482 & ) * zmsk00y(ji,jj) 483 ENDIF 484 END_2D 504 485 CALL lbc_lnk( 'icedyn_rhg_evp', v_ice, 'V', -1. ) 505 486 ! … … 510 491 IF( ln_bdy ) CALL bdy_ice_dyn( 'V' ) 511 492 ! 512 DO jj = 2, jpjm1 513 DO ji = fs_2, fs_jpim1 514 ! !--- tau_io/(u_oce - u_ice) 515 zTauO = zaU(ji,jj) * zrhoco * SQRT( ( u_ice (ji,jj) - u_oce (ji,jj) ) * ( u_ice (ji,jj) - u_oce (ji,jj) ) & 516 & + ( v_iceU(ji,jj) - v_oceU(ji,jj) ) * ( v_iceU(ji,jj) - v_oceU(ji,jj) ) ) 517 ! !--- Ocean-to-Ice stress 518 ztaux_oi(ji,jj) = zTauO * ( u_oce(ji,jj) - u_ice(ji,jj) ) 519 ! 520 ! !--- tau_bottom/u_ice 521 zvel = 5.e-05_wp + SQRT( v_iceU(ji,jj) * v_iceU(ji,jj) + u_ice(ji,jj) * u_ice(ji,jj) ) 522 zTauB = ztaux_base(ji,jj) / zvel 523 ! !--- OceanBottom-to-Ice stress 524 ztaux_bi(ji,jj) = zTauB * u_ice(ji,jj) 525 ! 526 ! !--- Coriolis at U-points (energy conserving formulation) 527 zCorU(ji,jj) = 0.25_wp * r1_e1u(ji,jj) * & 528 & ( zmf(ji ,jj) * ( e1v(ji ,jj) * v_ice(ji ,jj) + e1v(ji ,jj-1) * v_ice(ji ,jj-1) ) & 529 & + zmf(ji+1,jj) * ( e1v(ji+1,jj) * v_ice(ji+1,jj) + e1v(ji+1,jj-1) * v_ice(ji+1,jj-1) ) ) 530 ! 531 ! !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io 532 zRHS = zfU(ji,jj) + ztaux_ai(ji,jj) + zCorU(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj) 533 ! 534 ! !--- landfast switch => 0 = static friction : TauB > RHS & sign(TauB) /= sign(RHS) 535 ! 1 = sliding friction : TauB < RHS 536 rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztaux_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) ) 537 ! 538 IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 539 u_ice(ji,jj) = ( ( rswitch * ( zmU_t(ji,jj) * ( zbeta(ji,jj) * u_ice(ji,jj) + u_ice_b(ji,jj) ) & ! previous velocity 540 & + zRHS + zTauO * u_ice(ji,jj) ) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 541 & / MAX( zepsi, zmU_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 542 & + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax ) & ! static friction => slow decrease to v=0 543 & ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 544 & ) * zmsk00x(ji,jj) 545 ELSE !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 546 u_ice(ji,jj) = ( ( rswitch * ( zmU_t(ji,jj) * u_ice(ji,jj) & ! previous velocity 547 & + zRHS + zTauO * u_ice(ji,jj) ) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 548 & / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 549 & + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax ) & ! static friction => slow decrease to v=0 550 & ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 551 & ) * zmsk00x(ji,jj) 552 ENDIF 553 END DO 554 END DO 493 DO_2D_00_00 494 ! !--- tau_io/(u_oce - u_ice) 495 zTauO = zaU(ji,jj) * zrhoco * SQRT( ( u_ice (ji,jj) - u_oce (ji,jj) ) * ( u_ice (ji,jj) - u_oce (ji,jj) ) & 496 & + ( v_iceU(ji,jj) - v_oceU(ji,jj) ) * ( v_iceU(ji,jj) - v_oceU(ji,jj) ) ) 497 ! !--- Ocean-to-Ice stress 498 ztaux_oi(ji,jj) = zTauO * ( u_oce(ji,jj) - u_ice(ji,jj) ) 499 ! 500 ! !--- tau_bottom/u_ice 501 zvel = 5.e-05_wp + SQRT( v_iceU(ji,jj) * v_iceU(ji,jj) + u_ice(ji,jj) * u_ice(ji,jj) ) 502 zTauB = ztaux_base(ji,jj) / zvel 503 ! !--- OceanBottom-to-Ice stress 504 ztaux_bi(ji,jj) = zTauB * u_ice(ji,jj) 505 ! 506 ! !--- Coriolis at U-points (energy conserving formulation) 507 zCorU(ji,jj) = 0.25_wp * r1_e1u(ji,jj) * & 508 & ( zmf(ji ,jj) * ( e1v(ji ,jj) * v_ice(ji ,jj) + e1v(ji ,jj-1) * v_ice(ji ,jj-1) ) & 509 & + zmf(ji+1,jj) * ( e1v(ji+1,jj) * v_ice(ji+1,jj) + e1v(ji+1,jj-1) * v_ice(ji+1,jj-1) ) ) 510 ! 511 ! !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io 512 zRHS = zfU(ji,jj) + ztaux_ai(ji,jj) + zCorU(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj) 513 ! 514 ! !--- landfast switch => 0 = static friction : TauB > RHS & sign(TauB) /= sign(RHS) 515 ! 1 = sliding friction : TauB < RHS 516 rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztaux_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) ) 517 ! 518 IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 519 u_ice(ji,jj) = ( ( rswitch * ( zmU_t(ji,jj) * ( zbeta(ji,jj) * u_ice(ji,jj) + u_ice_b(ji,jj) ) & ! previous velocity 520 & + zRHS + zTauO * u_ice(ji,jj) ) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 521 & / MAX( zepsi, zmU_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 522 & + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax ) & ! static friction => slow decrease to v=0 523 & ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 524 & ) * zmsk00x(ji,jj) 525 ELSE !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 526 u_ice(ji,jj) = ( ( rswitch * ( zmU_t(ji,jj) * u_ice(ji,jj) & ! previous velocity 527 & + zRHS + zTauO * u_ice(ji,jj) ) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 528 & / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 529 & + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax ) & ! static friction => slow decrease to v=0 530 & ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 531 & ) * zmsk00x(ji,jj) 532 ENDIF 533 END_2D 555 534 CALL lbc_lnk( 'icedyn_rhg_evp', u_ice, 'U', -1. ) 556 535 ! … … 563 542 ELSE ! odd iterations 564 543 ! 565 DO jj = 2, jpjm1 566 DO ji = fs_2, fs_jpim1 567 ! !--- tau_io/(u_oce - u_ice) 568 zTauO = zaU(ji,jj) * zrhoco * SQRT( ( u_ice (ji,jj) - u_oce (ji,jj) ) * ( u_ice (ji,jj) - u_oce (ji,jj) ) & 569 & + ( v_iceU(ji,jj) - v_oceU(ji,jj) ) * ( v_iceU(ji,jj) - v_oceU(ji,jj) ) ) 570 ! !--- Ocean-to-Ice stress 571 ztaux_oi(ji,jj) = zTauO * ( u_oce(ji,jj) - u_ice(ji,jj) ) 572 ! 573 ! !--- tau_bottom/u_ice 574 zvel = 5.e-05_wp + SQRT( v_iceU(ji,jj) * v_iceU(ji,jj) + u_ice(ji,jj) * u_ice(ji,jj) ) 575 zTauB = ztaux_base(ji,jj) / zvel 576 ! !--- OceanBottom-to-Ice stress 577 ztaux_bi(ji,jj) = zTauB * u_ice(ji,jj) 578 ! 579 ! !--- Coriolis at U-points (energy conserving formulation) 580 zCorU(ji,jj) = 0.25_wp * r1_e1u(ji,jj) * & 581 & ( zmf(ji ,jj) * ( e1v(ji ,jj) * v_ice(ji ,jj) + e1v(ji ,jj-1) * v_ice(ji ,jj-1) ) & 582 & + zmf(ji+1,jj) * ( e1v(ji+1,jj) * v_ice(ji+1,jj) + e1v(ji+1,jj-1) * v_ice(ji+1,jj-1) ) ) 583 ! 584 ! !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io 585 zRHS = zfU(ji,jj) + ztaux_ai(ji,jj) + zCorU(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj) 586 ! 587 ! !--- landfast switch => 0 = static friction : TauB > RHS & sign(TauB) /= sign(RHS) 588 ! 1 = sliding friction : TauB < RHS 589 rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztaux_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) ) 590 ! 591 IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 592 u_ice(ji,jj) = ( ( rswitch * ( zmU_t(ji,jj) * ( zbeta(ji,jj) * u_ice(ji,jj) + u_ice_b(ji,jj) ) & ! previous velocity 593 & + zRHS + zTauO * u_ice(ji,jj) ) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 594 & / MAX( zepsi, zmU_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 595 & + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax ) & ! static friction => slow decrease to v=0 596 & ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 597 & ) * zmsk00x(ji,jj) 598 ELSE !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 599 u_ice(ji,jj) = ( ( rswitch * ( zmU_t(ji,jj) * u_ice(ji,jj) & ! previous velocity 600 & + zRHS + zTauO * u_ice(ji,jj) ) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 601 & / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 602 & + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax ) & ! static friction => slow decrease to v=0 603 & ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 604 & ) * zmsk00x(ji,jj) 605 ENDIF 606 END DO 607 END DO 544 DO_2D_00_00 545 ! !--- tau_io/(u_oce - u_ice) 546 zTauO = zaU(ji,jj) * zrhoco * SQRT( ( u_ice (ji,jj) - u_oce (ji,jj) ) * ( u_ice (ji,jj) - u_oce (ji,jj) ) & 547 & + ( v_iceU(ji,jj) - v_oceU(ji,jj) ) * ( v_iceU(ji,jj) - v_oceU(ji,jj) ) ) 548 ! !--- Ocean-to-Ice stress 549 ztaux_oi(ji,jj) = zTauO * ( u_oce(ji,jj) - u_ice(ji,jj) ) 550 ! 551 ! !--- tau_bottom/u_ice 552 zvel = 5.e-05_wp + SQRT( v_iceU(ji,jj) * v_iceU(ji,jj) + u_ice(ji,jj) * u_ice(ji,jj) ) 553 zTauB = ztaux_base(ji,jj) / zvel 554 ! !--- OceanBottom-to-Ice stress 555 ztaux_bi(ji,jj) = zTauB * u_ice(ji,jj) 556 ! 557 ! !--- Coriolis at U-points (energy conserving formulation) 558 zCorU(ji,jj) = 0.25_wp * r1_e1u(ji,jj) * & 559 & ( zmf(ji ,jj) * ( e1v(ji ,jj) * v_ice(ji ,jj) + e1v(ji ,jj-1) * v_ice(ji ,jj-1) ) & 560 & + zmf(ji+1,jj) * ( e1v(ji+1,jj) * v_ice(ji+1,jj) + e1v(ji+1,jj-1) * v_ice(ji+1,jj-1) ) ) 561 ! 562 ! !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io 563 zRHS = zfU(ji,jj) + ztaux_ai(ji,jj) + zCorU(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj) 564 ! 565 ! !--- landfast switch => 0 = static friction : TauB > RHS & sign(TauB) /= sign(RHS) 566 ! 1 = sliding friction : TauB < RHS 567 rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztaux_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) ) 568 ! 569 IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 570 u_ice(ji,jj) = ( ( rswitch * ( zmU_t(ji,jj) * ( zbeta(ji,jj) * u_ice(ji,jj) + u_ice_b(ji,jj) ) & ! previous velocity 571 & + zRHS + zTauO * u_ice(ji,jj) ) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 572 & / MAX( zepsi, zmU_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 573 & + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax ) & ! static friction => slow decrease to v=0 574 & ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 575 & ) * zmsk00x(ji,jj) 576 ELSE !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 577 u_ice(ji,jj) = ( ( rswitch * ( zmU_t(ji,jj) * u_ice(ji,jj) & ! previous velocity 578 & + zRHS + zTauO * u_ice(ji,jj) ) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 579 & / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 580 & + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax ) & ! static friction => slow decrease to v=0 581 & ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 582 & ) * zmsk00x(ji,jj) 583 ENDIF 584 END_2D 608 585 CALL lbc_lnk( 'icedyn_rhg_evp', u_ice, 'U', -1. ) 609 586 ! … … 614 591 IF( ln_bdy ) CALL bdy_ice_dyn( 'U' ) 615 592 ! 616 DO jj = 2, jpjm1 617 DO ji = fs_2, fs_jpim1 618 ! !--- tau_io/(v_oce - v_ice) 619 zTauO = zaV(ji,jj) * zrhoco * SQRT( ( v_ice (ji,jj) - v_oce (ji,jj) ) * ( v_ice (ji,jj) - v_oce (ji,jj) ) & 620 & + ( u_iceV(ji,jj) - u_oceV(ji,jj) ) * ( u_iceV(ji,jj) - u_oceV(ji,jj) ) ) 621 ! !--- Ocean-to-Ice stress 622 ztauy_oi(ji,jj) = zTauO * ( v_oce(ji,jj) - v_ice(ji,jj) ) 623 ! 624 ! !--- tau_bottom/v_ice 625 zvel = 5.e-05_wp + SQRT( v_ice(ji,jj) * v_ice(ji,jj) + u_iceV(ji,jj) * u_iceV(ji,jj) ) 626 zTauB = ztauy_base(ji,jj) / zvel 627 ! !--- OceanBottom-to-Ice stress 628 ztauy_bi(ji,jj) = zTauB * v_ice(ji,jj) 629 ! 630 ! !--- Coriolis at v-points (energy conserving formulation) 631 zCorV(ji,jj) = - 0.25_wp * r1_e2v(ji,jj) * & 632 & ( zmf(ji,jj ) * ( e2u(ji,jj ) * u_ice(ji,jj ) + e2u(ji-1,jj ) * u_ice(ji-1,jj ) ) & 633 & + zmf(ji,jj+1) * ( e2u(ji,jj+1) * u_ice(ji,jj+1) + e2u(ji-1,jj+1) * u_ice(ji-1,jj+1) ) ) 634 ! 635 ! !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io 636 zRHS = zfV(ji,jj) + ztauy_ai(ji,jj) + zCorV(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj) 637 ! 638 ! !--- landfast switch => 0 = static friction : TauB > RHS & sign(TauB) /= sign(RHS) 639 ! 1 = sliding friction : TauB < RHS 640 rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztauy_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) ) 641 ! 642 IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 643 v_ice(ji,jj) = ( ( rswitch * ( zmV_t(ji,jj) * ( zbeta(ji,jj) * v_ice(ji,jj) + v_ice_b(ji,jj) ) & ! previous velocity 644 & + zRHS + zTauO * v_ice(ji,jj) ) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 645 & / MAX( zepsi, zmV_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 646 & + ( 1._wp - rswitch ) * v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax ) & ! static friction => slow decrease to v=0 647 & ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 648 & ) * zmsk00y(ji,jj) 649 ELSE !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 650 v_ice(ji,jj) = ( ( rswitch * ( zmV_t(ji,jj) * v_ice(ji,jj) & ! previous velocity 651 & + zRHS + zTauO * v_ice(ji,jj) ) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 652 & / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 653 & + ( 1._wp - rswitch ) * v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax ) & ! static friction => slow decrease to v=0 654 & ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 655 & ) * zmsk00y(ji,jj) 656 ENDIF 657 END DO 658 END DO 593 DO_2D_00_00 594 ! !--- tau_io/(v_oce - v_ice) 595 zTauO = zaV(ji,jj) * zrhoco * SQRT( ( v_ice (ji,jj) - v_oce (ji,jj) ) * ( v_ice (ji,jj) - v_oce (ji,jj) ) & 596 & + ( u_iceV(ji,jj) - u_oceV(ji,jj) ) * ( u_iceV(ji,jj) - u_oceV(ji,jj) ) ) 597 ! !--- Ocean-to-Ice stress 598 ztauy_oi(ji,jj) = zTauO * ( v_oce(ji,jj) - v_ice(ji,jj) ) 599 ! 600 ! !--- tau_bottom/v_ice 601 zvel = 5.e-05_wp + SQRT( v_ice(ji,jj) * v_ice(ji,jj) + u_iceV(ji,jj) * u_iceV(ji,jj) ) 602 zTauB = ztauy_base(ji,jj) / zvel 603 ! !--- OceanBottom-to-Ice stress 604 ztauy_bi(ji,jj) = zTauB * v_ice(ji,jj) 605 ! 606 ! !--- Coriolis at v-points (energy conserving formulation) 607 zCorV(ji,jj) = - 0.25_wp * r1_e2v(ji,jj) * & 608 & ( zmf(ji,jj ) * ( e2u(ji,jj ) * u_ice(ji,jj ) + e2u(ji-1,jj ) * u_ice(ji-1,jj ) ) & 609 & + zmf(ji,jj+1) * ( e2u(ji,jj+1) * u_ice(ji,jj+1) + e2u(ji-1,jj+1) * u_ice(ji-1,jj+1) ) ) 610 ! 611 ! !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io 612 zRHS = zfV(ji,jj) + ztauy_ai(ji,jj) + zCorV(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj) 613 ! 614 ! !--- landfast switch => 0 = static friction : TauB > RHS & sign(TauB) /= sign(RHS) 615 ! 1 = sliding friction : TauB < RHS 616 rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztauy_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) ) 617 ! 618 IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 619 v_ice(ji,jj) = ( ( rswitch * ( zmV_t(ji,jj) * ( zbeta(ji,jj) * v_ice(ji,jj) + v_ice_b(ji,jj) ) & ! previous velocity 620 & + zRHS + zTauO * v_ice(ji,jj) ) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 621 & / MAX( zepsi, zmV_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 622 & + ( 1._wp - rswitch ) * v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax ) & ! static friction => slow decrease to v=0 623 & ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 624 & ) * zmsk00y(ji,jj) 625 ELSE !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 626 v_ice(ji,jj) = ( ( rswitch * ( zmV_t(ji,jj) * v_ice(ji,jj) & ! previous velocity 627 & + zRHS + zTauO * v_ice(ji,jj) ) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 628 & / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 629 & + ( 1._wp - rswitch ) * v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax ) & ! static friction => slow decrease to v=0 630 & ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 631 & ) * zmsk00y(ji,jj) 632 ENDIF 633 END_2D 659 634 CALL lbc_lnk( 'icedyn_rhg_evp', v_ice, 'V', -1. ) 660 635 ! … … 667 642 ENDIF 668 643 669 !!$ IF( ln_ctl) THEN ! Convergence test644 !!$ IF(sn_cfctl%l_prtctl) THEN ! Convergence test 670 645 !!$ DO jj = 2 , jpjm1 671 646 !!$ zresr(:,jj) = MAX( ABS( u_ice(:,jj) - zu_ice(:,jj) ), ABS( v_ice(:,jj) - zv_ice(:,jj) ) ) … … 682 657 ! 4) Recompute delta, shear and div (inputs for mechanical redistribution) 683 658 !------------------------------------------------------------------------------! 684 DO jj = 1, jpjm1 685 DO ji = 1, jpim1 686 687 ! shear at F points 688 zds(ji,jj) = ( ( u_ice(ji,jj+1) * r1_e1u(ji,jj+1) - u_ice(ji,jj) * r1_e1u(ji,jj) ) * e1f(ji,jj) * e1f(ji,jj) & 689 & + ( v_ice(ji+1,jj) * r1_e2v(ji+1,jj) - v_ice(ji,jj) * r1_e2v(ji,jj) ) * e2f(ji,jj) * e2f(ji,jj) & 690 & ) * r1_e1e2f(ji,jj) * zfmask(ji,jj) 691 692 END DO 693 END DO 659 DO_2D_10_10 660 661 ! shear at F points 662 zds(ji,jj) = ( ( u_ice(ji,jj+1) * r1_e1u(ji,jj+1) - u_ice(ji,jj) * r1_e1u(ji,jj) ) * e1f(ji,jj) * e1f(ji,jj) & 663 & + ( v_ice(ji+1,jj) * r1_e2v(ji+1,jj) - v_ice(ji,jj) * r1_e2v(ji,jj) ) * e2f(ji,jj) * e2f(ji,jj) & 664 & ) * r1_e1e2f(ji,jj) * zfmask(ji,jj) 665 666 END_2D 694 667 695 DO jj = 2, jpjm1 696 DO ji = 2, jpim1 ! no vector loop 697 698 ! tension**2 at T points 699 zdt = ( ( u_ice(ji,jj) * r1_e2u(ji,jj) - u_ice(ji-1,jj) * r1_e2u(ji-1,jj) ) * e2t(ji,jj) * e2t(ji,jj) & 700 & - ( v_ice(ji,jj) * r1_e1v(ji,jj) - v_ice(ji,jj-1) * r1_e1v(ji,jj-1) ) * e1t(ji,jj) * e1t(ji,jj) & 701 & ) * r1_e1e2t(ji,jj) 702 zdt2 = zdt * zdt 703 704 ! shear**2 at T points (doc eq. A16) 705 zds2 = ( zds(ji,jj ) * zds(ji,jj ) * e1e2f(ji,jj ) + zds(ji-1,jj ) * zds(ji-1,jj ) * e1e2f(ji-1,jj ) & 706 & + zds(ji,jj-1) * zds(ji,jj-1) * e1e2f(ji,jj-1) + zds(ji-1,jj-1) * zds(ji-1,jj-1) * e1e2f(ji-1,jj-1) & 707 & ) * 0.25_wp * r1_e1e2t(ji,jj) 708 709 ! shear at T points 710 pshear_i(ji,jj) = SQRT( zdt2 + zds2 ) 711 712 ! divergence at T points 713 pdivu_i(ji,jj) = ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj) & 714 & + e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1) & 715 & ) * r1_e1e2t(ji,jj) 716 717 ! delta at T points 718 zdelta = SQRT( pdivu_i(ji,jj) * pdivu_i(ji,jj) + ( zdt2 + zds2 ) * z1_ecc2 ) 719 rswitch = 1._wp - MAX( 0._wp, SIGN( 1._wp, -zdelta ) ) ! 0 if delta=0 720 pdelta_i(ji,jj) = zdelta + rn_creepl * rswitch 721 722 END DO 723 END DO 668 DO_2D_00_00 669 670 ! tension**2 at T points 671 zdt = ( ( u_ice(ji,jj) * r1_e2u(ji,jj) - u_ice(ji-1,jj) * r1_e2u(ji-1,jj) ) * e2t(ji,jj) * e2t(ji,jj) & 672 & - ( v_ice(ji,jj) * r1_e1v(ji,jj) - v_ice(ji,jj-1) * r1_e1v(ji,jj-1) ) * e1t(ji,jj) * e1t(ji,jj) & 673 & ) * r1_e1e2t(ji,jj) 674 zdt2 = zdt * zdt 675 676 ! shear**2 at T points (doc eq. A16) 677 zds2 = ( zds(ji,jj ) * zds(ji,jj ) * e1e2f(ji,jj ) + zds(ji-1,jj ) * zds(ji-1,jj ) * e1e2f(ji-1,jj ) & 678 & + zds(ji,jj-1) * zds(ji,jj-1) * e1e2f(ji,jj-1) + zds(ji-1,jj-1) * zds(ji-1,jj-1) * e1e2f(ji-1,jj-1) & 679 & ) * 0.25_wp * r1_e1e2t(ji,jj) 680 681 ! shear at T points 682 pshear_i(ji,jj) = SQRT( zdt2 + zds2 ) 683 684 ! divergence at T points 685 pdivu_i(ji,jj) = ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj) & 686 & + e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1) & 687 & ) * r1_e1e2t(ji,jj) 688 689 ! delta at T points 690 zdelta = SQRT( pdivu_i(ji,jj) * pdivu_i(ji,jj) + ( zdt2 + zds2 ) * z1_ecc2 ) 691 rswitch = 1._wp - MAX( 0._wp, SIGN( 1._wp, -zdelta ) ) ! 0 if delta=0 692 pdelta_i(ji,jj) = zdelta + rn_creepl * rswitch 693 694 END_2D 724 695 CALL lbc_lnk_multi( 'icedyn_rhg_evp', pshear_i, 'T', 1., pdivu_i, 'T', 1., pdelta_i, 'T', 1. ) 725 696 … … 734 705 ! 5) diagnostics 735 706 !------------------------------------------------------------------------------! 736 DO jj = 1, jpj 737 DO ji = 1, jpi 738 zmsk00(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi06 ) ) ! 1 if ice, 0 if no ice 739 END DO 740 END DO 707 DO_2D_11_11 708 zmsk00(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi06 ) ) ! 1 if ice, 0 if no ice 709 END_2D 741 710 742 711 ! --- ice-ocean, ice-atm. & ice-oceanbottom(landfast) stresses --- ! … … 765 734 ALLOCATE( zsig1(jpi,jpj) , zsig2(jpi,jpj) , zsig3(jpi,jpj) ) 766 735 ! 767 DO jj = 2, jpjm1 768 DO ji = 2, jpim1 769 zdum1 = ( zmsk00(ji-1,jj) * pstress12_i(ji-1,jj) + zmsk00(ji ,jj-1) * pstress12_i(ji ,jj-1) + & ! stress12_i at T-point 770 & zmsk00(ji ,jj) * pstress12_i(ji ,jj) + zmsk00(ji-1,jj-1) * pstress12_i(ji-1,jj-1) ) & 771 & / MAX( 1._wp, zmsk00(ji-1,jj) + zmsk00(ji,jj-1) + zmsk00(ji,jj) + zmsk00(ji-1,jj-1) ) 772 773 zshear = SQRT( pstress2_i(ji,jj) * pstress2_i(ji,jj) + 4._wp * zdum1 * zdum1 ) ! shear stress 774 775 zdum2 = zmsk00(ji,jj) / MAX( 1._wp, strength(ji,jj) ) 736 DO_2D_00_00 737 zdum1 = ( zmsk00(ji-1,jj) * pstress12_i(ji-1,jj) + zmsk00(ji ,jj-1) * pstress12_i(ji ,jj-1) + & ! stress12_i at T-point 738 & zmsk00(ji ,jj) * pstress12_i(ji ,jj) + zmsk00(ji-1,jj-1) * pstress12_i(ji-1,jj-1) ) & 739 & / MAX( 1._wp, zmsk00(ji-1,jj) + zmsk00(ji,jj-1) + zmsk00(ji,jj) + zmsk00(ji-1,jj-1) ) 740 741 zshear = SQRT( pstress2_i(ji,jj) * pstress2_i(ji,jj) + 4._wp * zdum1 * zdum1 ) ! shear stress 742 743 zdum2 = zmsk00(ji,jj) / MAX( 1._wp, strength(ji,jj) ) 776 744 777 745 !! zsig1(ji,jj) = 0.5_wp * zdum2 * ( pstress1_i(ji,jj) + zshear ) ! principal stress (y-direction, see Hunke & Dukowicz 2002) … … 779 747 !! zsig3(ji,jj) = zdum2**2 * ( ( pstress1_i(ji,jj) + strength(ji,jj) )**2 + ( rn_ecc * zshear )**2 ) ! quadratic relation linking compressive stress to shear stress 780 748 !! ! (scheme converges if this value is ~1, see Bouillon et al 2009 (eq. 11)) 781 zsig1(ji,jj) = 0.5_wp * zdum2 * ( pstress1_i(ji,jj) ) ! compressive stress, see Bouillon et al. 2015 782 zsig2(ji,jj) = 0.5_wp * zdum2 * ( zshear ) ! shear stress 783 zsig3(ji,jj) = zdum2**2 * ( ( pstress1_i(ji,jj) + strength(ji,jj) )**2 + ( rn_ecc * zshear )**2 ) 784 END DO 785 END DO 749 zsig1(ji,jj) = 0.5_wp * zdum2 * ( pstress1_i(ji,jj) ) ! compressive stress, see Bouillon et al. 2015 750 zsig2(ji,jj) = 0.5_wp * zdum2 * ( zshear ) ! shear stress 751 zsig3(ji,jj) = zdum2**2 * ( ( pstress1_i(ji,jj) + strength(ji,jj) )**2 + ( rn_ecc * zshear )**2 ) 752 END_2D 786 753 CALL lbc_lnk_multi( 'icedyn_rhg_evp', zsig1, 'T', 1., zsig2, 'T', 1., zsig3, 'T', 1. ) 787 754 ! … … 818 785 & zdiag_xmtrp_snw(jpi,jpj) , zdiag_ymtrp_snw(jpi,jpj) , zdiag_xatrp(jpi,jpj) , zdiag_yatrp(jpi,jpj) ) 819 786 ! 820 DO jj = 2, jpjm1 821 DO ji = 2, jpim1 822 ! 2D ice mass, snow mass, area transport arrays (X, Y) 823 zfac_x = 0.5 * u_ice(ji,jj) * e2u(ji,jj) * zmsk00(ji,jj) 824 zfac_y = 0.5 * v_ice(ji,jj) * e1v(ji,jj) * zmsk00(ji,jj) 825 826 zdiag_xmtrp_ice(ji,jj) = rhoi * zfac_x * ( vt_i(ji+1,jj) + vt_i(ji,jj) ) ! ice mass transport, X-component 827 zdiag_ymtrp_ice(ji,jj) = rhoi * zfac_y * ( vt_i(ji,jj+1) + vt_i(ji,jj) ) ! '' Y- '' 828 829 zdiag_xmtrp_snw(ji,jj) = rhos * zfac_x * ( vt_s(ji+1,jj) + vt_s(ji,jj) ) ! snow mass transport, X-component 830 zdiag_ymtrp_snw(ji,jj) = rhos * zfac_y * ( vt_s(ji,jj+1) + vt_s(ji,jj) ) ! '' Y- '' 831 832 zdiag_xatrp(ji,jj) = zfac_x * ( at_i(ji+1,jj) + at_i(ji,jj) ) ! area transport, X-component 833 zdiag_yatrp(ji,jj) = zfac_y * ( at_i(ji,jj+1) + at_i(ji,jj) ) ! '' Y- '' 834 835 END DO 836 END DO 787 DO_2D_00_00 788 ! 2D ice mass, snow mass, area transport arrays (X, Y) 789 zfac_x = 0.5 * u_ice(ji,jj) * e2u(ji,jj) * zmsk00(ji,jj) 790 zfac_y = 0.5 * v_ice(ji,jj) * e1v(ji,jj) * zmsk00(ji,jj) 791 792 zdiag_xmtrp_ice(ji,jj) = rhoi * zfac_x * ( vt_i(ji+1,jj) + vt_i(ji,jj) ) ! ice mass transport, X-component 793 zdiag_ymtrp_ice(ji,jj) = rhoi * zfac_y * ( vt_i(ji,jj+1) + vt_i(ji,jj) ) ! '' Y- '' 794 795 zdiag_xmtrp_snw(ji,jj) = rhos * zfac_x * ( vt_s(ji+1,jj) + vt_s(ji,jj) ) ! snow mass transport, X-component 796 zdiag_ymtrp_snw(ji,jj) = rhos * zfac_y * ( vt_s(ji,jj+1) + vt_s(ji,jj) ) ! '' Y- '' 797 798 zdiag_xatrp(ji,jj) = zfac_x * ( at_i(ji+1,jj) + at_i(ji,jj) ) ! area transport, X-component 799 zdiag_yatrp(ji,jj) = zfac_y * ( at_i(ji,jj+1) + at_i(ji,jj) ) ! '' Y- '' 800 801 END_2D 837 802 838 803 CALL lbc_lnk_multi( 'icedyn_rhg_evp', zdiag_xmtrp_ice, 'U', -1., zdiag_ymtrp_ice, 'V', -1., & -
NEMO/trunk/src/ICE/iceistate.F90
r11536 r12377 61 61 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: si ! structure of input fields (file informations, fields read) 62 62 ! 63 !! * Substitutions 64 # include "do_loop_substitute.h90" 63 65 !!---------------------------------------------------------------------- 64 66 !! NEMO/ICE 4.0 , NEMO Consortium (2018) … … 68 70 CONTAINS 69 71 70 SUBROUTINE ice_istate( kt )72 SUBROUTINE ice_istate( kt, Kbb, Kmm, Kaa ) 71 73 !!------------------------------------------------------------------- 72 74 !! *** ROUTINE ice_istate *** … … 89 91 !! where there is no ice 90 92 !!-------------------------------------------------------------------- 91 INTEGER, INTENT(in) :: kt ! time step 92 !! 93 INTEGER, INTENT(in) :: kt ! time step 94 INTEGER, INTENT(in) :: Kbb, Kmm, Kaa ! ocean time level indices 95 ! 93 96 INTEGER :: ji, jj, jk, jl ! dummy loop indices 94 97 REAL(wp) :: ztmelts … … 268 271 ! select ice covered grid points 269 272 npti = 0 ; nptidx(:) = 0 270 DO jj = 1, jpj 271 DO ji = 1, jpi 272 IF ( zht_i_ini(ji,jj) > 0._wp ) THEN 273 npti = npti + 1 274 nptidx(npti) = (jj - 1) * jpi + ji 275 ENDIF 276 END DO 277 END DO 273 DO_2D_11_11 274 IF ( zht_i_ini(ji,jj) > 0._wp ) THEN 275 npti = npti + 1 276 nptidx(npti) = (jj - 1) * jpi + ji 277 ENDIF 278 END_2D 278 279 279 280 ! move to 1D arrays: (jpi,jpj) -> (jpi*jpj) … … 320 321 CALL ice_var_salprof ! for sz_i 321 322 DO jl = 1, jpl 322 DO jj = 1, jpj 323 DO ji = 1, jpi 324 v_i (ji,jj,jl) = h_i(ji,jj,jl) * a_i(ji,jj,jl) 325 v_s (ji,jj,jl) = h_s(ji,jj,jl) * a_i(ji,jj,jl) 326 sv_i(ji,jj,jl) = MIN( MAX( rn_simin , s_i(ji,jj,jl) ) , rn_simax ) * v_i(ji,jj,jl) 327 END DO 328 END DO 323 DO_2D_11_11 324 v_i (ji,jj,jl) = h_i(ji,jj,jl) * a_i(ji,jj,jl) 325 v_s (ji,jj,jl) = h_s(ji,jj,jl) * a_i(ji,jj,jl) 326 sv_i(ji,jj,jl) = MIN( MAX( rn_simin , s_i(ji,jj,jl) ) , rn_simax ) * v_i(ji,jj,jl) 327 END_2D 329 328 END DO 330 329 ! 331 330 DO jl = 1, jpl 332 DO jk = 1, nlay_s 333 DO jj = 1, jpj 334 DO ji = 1, jpi 335 t_s(ji,jj,jk,jl) = zts_3d(ji,jj,jl) 336 e_s(ji,jj,jk,jl) = zswitch(ji,jj) * v_s(ji,jj,jl) * r1_nlay_s * & 337 & rhos * ( rcpi * ( rt0 - t_s(ji,jj,jk,jl) ) + rLfus ) 338 END DO 339 END DO 340 END DO 331 DO_3D_11_11( 1, nlay_s ) 332 t_s(ji,jj,jk,jl) = zts_3d(ji,jj,jl) 333 e_s(ji,jj,jk,jl) = zswitch(ji,jj) * v_s(ji,jj,jl) * r1_nlay_s * & 334 & rhos * ( rcpi * ( rt0 - t_s(ji,jj,jk,jl) ) + rLfus ) 335 END_3D 341 336 END DO 342 337 ! 343 338 DO jl = 1, jpl 344 DO jk = 1, nlay_i 345 DO jj = 1, jpj 346 DO ji = 1, jpi 347 t_i (ji,jj,jk,jl) = zti_3d(ji,jj,jl) 348 ztmelts = - rTmlt * sz_i(ji,jj,jk,jl) + rt0 ! melting temperature in K 349 e_i(ji,jj,jk,jl) = zswitch(ji,jj) * v_i(ji,jj,jl) * r1_nlay_i * & 350 & rhoi * ( rcpi * ( ztmelts - t_i(ji,jj,jk,jl) ) + & 351 & rLfus * ( 1._wp - (ztmelts-rt0) / MIN( (t_i(ji,jj,jk,jl)-rt0), -epsi20 ) ) & 352 & - rcp * ( ztmelts - rt0 ) ) 353 END DO 354 END DO 355 END DO 339 DO_3D_11_11( 1, nlay_i ) 340 t_i (ji,jj,jk,jl) = zti_3d(ji,jj,jl) 341 ztmelts = - rTmlt * sz_i(ji,jj,jk,jl) + rt0 ! melting temperature in K 342 e_i(ji,jj,jk,jl) = zswitch(ji,jj) * v_i(ji,jj,jl) * r1_nlay_i * & 343 & rhoi * ( rcpi * ( ztmelts - t_i(ji,jj,jk,jl) ) + & 344 & rLfus * ( 1._wp - (ztmelts-rt0) / MIN( (t_i(ji,jj,jk,jl)-rt0), -epsi20 ) ) & 345 & - rcp * ( ztmelts - rt0 ) ) 346 END_3D 356 347 END DO 357 348 … … 380 371 IF( ln_ice_embd ) THEN ! embedded sea-ice: deplete the initial ssh below sea-ice area 381 372 ! 382 ssh n(:,:) = sshn(:,:) - snwice_mass(:,:) * r1_rau0383 ssh b(:,:) = sshb(:,:) - snwice_mass(:,:) * r1_rau0373 ssh(:,:,Kmm) = ssh(:,:,Kmm) - snwice_mass(:,:) * r1_rau0 374 ssh(:,:,Kbb) = ssh(:,:,Kbb) - snwice_mass(:,:) * r1_rau0 384 375 ! 385 376 IF( .NOT.ln_linssh ) THEN 386 377 ! 387 WHERE( ht_0(:,:) > 0 ) ; z2d(:,:) = 1._wp + ssh n(:,:)*tmask(:,:,1) / ht_0(:,:)378 WHERE( ht_0(:,:) > 0 ) ; z2d(:,:) = 1._wp + ssh(:,:,Kmm)*tmask(:,:,1) / ht_0(:,:) 388 379 ELSEWHERE ; z2d(:,:) = 1._wp ; END WHERE 389 380 ! 390 381 DO jk = 1,jpkm1 ! adjust initial vertical scale factors 391 e3t _n(:,:,jk) = e3t_0(:,:,jk) * z2d(:,:)392 e3t _b(:,:,jk) = e3t_n(:,:,jk)393 e3t _a(:,:,jk) = e3t_n(:,:,jk)382 e3t(:,:,jk,Kmm) = e3t_0(:,:,jk) * z2d(:,:) 383 e3t(:,:,jk,Kbb) = e3t(:,:,jk,Kmm) 384 e3t(:,:,jk,Kaa) = e3t(:,:,jk,Kmm) 394 385 END DO 395 386 ! … … 398 389 ! Horizontal scale factor interpolations 399 390 ! -------------------------------------- 400 CALL dom_vvl_interpol( e3t _b(:,:,:), e3u_b(:,:,:), 'U' )401 CALL dom_vvl_interpol( e3t _b(:,:,:), e3v_b(:,:,:), 'V' )402 CALL dom_vvl_interpol( e3t _n(:,:,:), e3u_n(:,:,:), 'U' )403 CALL dom_vvl_interpol( e3t _n(:,:,:), e3v_n(:,:,:), 'V' )404 CALL dom_vvl_interpol( e3u _n(:,:,:), e3f_n(:,:,:), 'F' )391 CALL dom_vvl_interpol( e3t(:,:,:,Kbb), e3u(:,:,:,Kbb), 'U' ) 392 CALL dom_vvl_interpol( e3t(:,:,:,Kbb), e3v(:,:,:,Kbb), 'V' ) 393 CALL dom_vvl_interpol( e3t(:,:,:,Kmm), e3u(:,:,:,Kmm), 'U' ) 394 CALL dom_vvl_interpol( e3t(:,:,:,Kmm), e3v(:,:,:,Kmm), 'V' ) 395 CALL dom_vvl_interpol( e3u(:,:,:,Kmm), e3f(:,:,:), 'F' ) 405 396 ! Vertical scale factor interpolations 406 397 ! ------------------------------------ 407 CALL dom_vvl_interpol( e3t _n(:,:,:), e3w_n (:,:,:), 'W' )408 CALL dom_vvl_interpol( e3u _n(:,:,:), e3uw_n(:,:,:), 'UW' )409 CALL dom_vvl_interpol( e3v _n(:,:,:), e3vw_n(:,:,:), 'VW' )410 CALL dom_vvl_interpol( e3u _b(:,:,:), e3uw_b(:,:,:), 'UW' )411 CALL dom_vvl_interpol( e3v _b(:,:,:), e3vw_b(:,:,:), 'VW' )398 CALL dom_vvl_interpol( e3t(:,:,:,Kmm), e3w (:,:,:,Kmm), 'W' ) 399 CALL dom_vvl_interpol( e3u(:,:,:,Kmm), e3uw(:,:,:,Kmm), 'UW' ) 400 CALL dom_vvl_interpol( e3v(:,:,:,Kmm), e3vw(:,:,:,Kmm), 'VW' ) 401 CALL dom_vvl_interpol( e3u(:,:,:,Kbb), e3uw(:,:,:,Kbb), 'UW' ) 402 CALL dom_vvl_interpol( e3v(:,:,:,Kbb), e3vw(:,:,:,Kbb), 'VW' ) 412 403 ! t- and w- points depth 413 404 ! ---------------------- 414 405 !!gm not sure of that.... 415 gdept _n(:,:,1) = 0.5_wp * e3w_n(:,:,1)416 gdepw _n(:,:,1) = 0.0_wp417 gde3w _n(:,:,1) = gdept_n(:,:,1) - sshn(:,:)406 gdept(:,:,1,Kmm) = 0.5_wp * e3w(:,:,1,Kmm) 407 gdepw(:,:,1,Kmm) = 0.0_wp 408 gde3w(:,:,1) = gdept(:,:,1,Kmm) - ssh(:,:,Kmm) 418 409 DO jk = 2, jpk 419 gdept _n(:,:,jk) = gdept_n(:,:,jk-1) + e3w_n(:,:,jk)420 gdepw _n(:,:,jk) = gdepw_n(:,:,jk-1) + e3t_n(:,:,jk-1)421 gde3w _n(:,:,jk) = gdept_n(:,:,jk ) - sshn (:,:)410 gdept(:,:,jk,Kmm) = gdept(:,:,jk-1,Kmm) + e3w(:,:,jk ,Kmm) 411 gdepw(:,:,jk,Kmm) = gdepw(:,:,jk-1,Kmm) + e3t(:,:,jk-1,Kmm) 412 gde3w(:,:,jk) = gdept(:,:,jk ,Kmm) - ssh (:,:,Kmm) 422 413 END DO 423 414 ENDIF … … 474 465 !!----------------------------------------------------------------------------- 475 466 ! 476 REWIND( numnam_ice_ref ) ! Namelist namini in reference namelist : Ice initial state477 467 READ ( numnam_ice_ref, namini, IOSTAT = ios, ERR = 901) 478 468 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namini in reference namelist' ) 479 REWIND( numnam_ice_cfg ) ! Namelist namini in configuration namelist : Ice initial state480 469 READ ( numnam_ice_cfg, namini, IOSTAT = ios, ERR = 902 ) 481 470 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namini in configuration namelist' ) -
NEMO/trunk/src/ICE/iceitd.F90
r11732 r12377 48 48 REAL(wp), DIMENSION(0:100) :: rn_catbnd ! ice categories bounds 49 49 ! 50 !! * Substitutions 51 # include "do_loop_substitute.h90" 50 52 !!---------------------------------------------------------------------- 51 53 !! NEMO/ICE 4.0 , NEMO Consortium (2018) … … 96 98 ! 97 99 npti = 0 ; nptidx(:) = 0 98 DO jj = 1, jpj 99 DO ji = 1, jpi 100 IF ( at_i(ji,jj) > epsi10 ) THEN 101 npti = npti + 1 102 nptidx( npti ) = (jj - 1) * jpi + ji 103 ENDIF 104 END DO 105 END DO 100 DO_2D_11_11 101 IF ( at_i(ji,jj) > epsi10 ) THEN 102 npti = npti + 1 103 nptidx( npti ) = (jj - 1) * jpi + ji 104 ENDIF 105 END_2D 106 106 107 107 !----------------------------------------------------------------------------------------------- … … 597 597 ! !--------------------------------------- 598 598 npti = 0 ; nptidx(:) = 0 599 DO jj = 1, jpj 600 DO ji = 1, jpi 601 IF( a_i(ji,jj,jl) > 0._wp .AND. v_i(ji,jj,jl) > (a_i(ji,jj,jl) * hi_max(jl)) ) THEN 602 npti = npti + 1 603 nptidx( npti ) = (jj - 1) * jpi + ji 604 ENDIF 605 END DO 606 END DO 599 DO_2D_11_11 600 IF( a_i(ji,jj,jl) > 0._wp .AND. v_i(ji,jj,jl) > (a_i(ji,jj,jl) * hi_max(jl)) ) THEN 601 npti = npti + 1 602 nptidx( npti ) = (jj - 1) * jpi + ji 603 ENDIF 604 END_2D 607 605 ! 608 606 !!clem CALL tab_2d_1d( npti, nptidx(1:npti), h_i_1d(1:npti), h_i(:,:,jl) ) … … 638 636 ! !----------------------------------------- 639 637 npti = 0 ; nptidx(:) = 0 640 DO jj = 1, jpj 641 DO ji = 1, jpi 642 IF( a_i(ji,jj,jl+1) > 0._wp .AND. v_i(ji,jj,jl+1) <= (a_i(ji,jj,jl+1) * hi_max(jl)) ) THEN 643 npti = npti + 1 644 nptidx( npti ) = (jj - 1) * jpi + ji 645 ENDIF 646 END DO 647 END DO 638 DO_2D_11_11 639 IF( a_i(ji,jj,jl+1) > 0._wp .AND. v_i(ji,jj,jl+1) <= (a_i(ji,jj,jl+1) * hi_max(jl)) ) THEN 640 npti = npti + 1 641 nptidx( npti ) = (jj - 1) * jpi + ji 642 ENDIF 643 END_2D 648 644 ! 649 645 CALL tab_2d_1d( npti, nptidx(1:npti), a_i_1d(1:npti), a_i(:,:,jl+1) ) ! jl+1 is ok … … 686 682 !!------------------------------------------------------------------ 687 683 ! 688 REWIND( numnam_ice_ref ) ! Namelist namitd in reference namelist : Parameters for ice689 684 READ ( numnam_ice_ref, namitd, IOSTAT = ios, ERR = 901) 690 685 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namitd in reference namelist' ) 691 REWIND( numnam_ice_cfg ) ! Namelist namitd in configuration namelist : Parameters for ice692 686 READ ( numnam_ice_cfg, namitd, IOSTAT = ios, ERR = 902 ) 693 687 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namitd in configuration namelist' ) -
NEMO/trunk/src/ICE/icerst.F90
r11536 r12377 163 163 164 164 165 SUBROUTINE ice_rst_read 165 SUBROUTINE ice_rst_read( Kbb, Kmm, Kaa ) 166 166 !!---------------------------------------------------------------------- 167 167 !! *** ice_rst_read *** … … 169 169 !! ** purpose : read restart file 170 170 !!---------------------------------------------------------------------- 171 INTEGER, INTENT(in) :: Kbb, Kmm, Kaa ! ocean time level indices 171 172 INTEGER :: jk 172 173 LOGICAL :: llok … … 272 273 ! 273 274 CALL ice_istate_init 274 CALL ice_istate( nit000 )275 CALL ice_istate( nit000, Kbb, Kmm, Kaa ) 275 276 ! 276 277 IF( .NOT.ln_iceini .OR. .NOT.ln_iceini_file ) & -
NEMO/trunk/src/ICE/icesbc.F90
r11575 r12377 27 27 USE lbclnk ! lateral boundary conditions (or mpp links) 28 28 USE timing ! Timing 29 USE fldread !!GS: needed by agrif 29 30 30 31 IMPLICIT NONE … … 36 37 37 38 !! * Substitutions 38 # include " vectopt_loop_substitute.h90"39 # include "do_loop_substitute.h90" 39 40 !!---------------------------------------------------------------------- 40 41 !! NEMO/ICE 4.0 , NEMO Consortium (2018) … … 71 72 SELECT CASE( ksbc ) 72 73 CASE( jp_usr ) ; CALL usrdef_sbc_ice_tau( kt ) ! user defined formulation 73 CASE( jp_blk ) ; CALL blk_ice_tau ! Bulk formulation 74 CASE( jp_blk ) ; CALL blk_ice_1( sf(jp_wndi)%fnow(:,:,1), sf(jp_wndj)%fnow(:,:,1), & 75 & sf(jp_tair)%fnow(:,:,1), sf(jp_humi)%fnow(:,:,1), & 76 & sf(jp_slp )%fnow(:,:,1), u_ice, v_ice, tm_su , & ! inputs 77 & putaui = utau_ice, pvtaui = vtau_ice ) ! outputs 78 ! CASE( jp_abl ) utau_ice & vtau_ice are computed in ablmod 74 79 CASE( jp_purecpl ) ; CALL sbc_cpl_ice_tau( utau_ice , vtau_ice ) ! Coupled formulation 75 80 END SELECT … … 77 82 IF( ln_mixcpl) THEN ! Case of a mixed Bulk/Coupled formulation 78 83 CALL sbc_cpl_ice_tau( zutau_ice , zvtau_ice ) 79 DO jj = 2, jpjm1 80 DO ji = 2, jpim1 81 utau_ice(ji,jj) = utau_ice(ji,jj) * xcplmask(ji,jj,0) + zutau_ice(ji,jj) * ( 1. - xcplmask(ji,jj,0) ) 82 vtau_ice(ji,jj) = vtau_ice(ji,jj) * xcplmask(ji,jj,0) + zvtau_ice(ji,jj) * ( 1. - xcplmask(ji,jj,0) ) 83 END DO 84 END DO 84 DO_2D_00_00 85 utau_ice(ji,jj) = utau_ice(ji,jj) * xcplmask(ji,jj,0) + zutau_ice(ji,jj) * ( 1. - xcplmask(ji,jj,0) ) 86 vtau_ice(ji,jj) = vtau_ice(ji,jj) * xcplmask(ji,jj,0) + zvtau_ice(ji,jj) * ( 1. - xcplmask(ji,jj,0) ) 87 END_2D 85 88 CALL lbc_lnk_multi( 'icesbc', utau_ice, 'U', -1., vtau_ice, 'V', -1. ) 86 89 ENDIF … … 143 146 CASE( jp_usr ) !--- user defined formulation 144 147 CALL usrdef_sbc_ice_flx( kt, h_s, h_i ) 145 CASE( jp_blk ) !--- bulk formulation 146 CALL blk_ice_flx ( t_su, h_s, h_i, alb_ice ) ! 148 CASE( jp_blk, jp_abl ) !--- bulk formulation & ABL formulation 149 CALL blk_ice_2 ( t_su, h_s, h_i, alb_ice, sf(jp_tair)%fnow(:,:,1), sf(jp_humi)%fnow(:,:,1), & 150 & sf(jp_slp)%fnow(:,:,1), sf(jp_qlw)%fnow(:,:,1), sf(jp_prec)%fnow(:,:,1), sf(jp_snow)%fnow(:,:,1) ) ! 147 151 IF( ln_mixcpl ) CALL sbc_cpl_ice_flx( picefr=at_i_b, palbi=alb_ice, psst=sst_m, pist=t_su, phs=h_s, phi=h_i ) 148 152 IF( nn_flxdist /= -1 ) CALL ice_flx_dist ( t_su, alb_ice, qns_ice, qsr_ice, dqns_ice, evap_ice, devap_ice, nn_flxdist ) … … 284 288 !!------------------------------------------------------------------- 285 289 ! 286 REWIND( numnam_ice_ref ) ! Namelist namsbc in reference namelist : Ice dynamics287 290 READ ( numnam_ice_ref, namsbc, IOSTAT = ios, ERR = 901) 288 291 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsbc in reference namelist' ) 289 REWIND( numnam_ice_cfg ) ! Namelist namsbc in configuration namelist : Ice dynamics290 292 READ ( numnam_ice_cfg, namsbc, IOSTAT = ios, ERR = 902 ) 291 293 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namsbc in configuration namelist' ) -
NEMO/trunk/src/ICE/icestp.F90
r11536 r12377 86 86 PUBLIC ice_init ! called by sbcmod.F90 87 87 88 !! * Substitutions89 # include "vectopt_loop_substitute.h90"90 88 !!---------------------------------------------------------------------- 91 89 !! NEMO/ICE 4.0 , NEMO Consortium (2018) … … 95 93 CONTAINS 96 94 97 SUBROUTINE ice_stp( kt, ksbc )95 SUBROUTINE ice_stp( kt, Kbb, Kmm, ksbc ) 98 96 !!--------------------------------------------------------------------- 99 97 !! *** ROUTINE ice_stp *** … … 115 113 !! utau, vtau, taum, wndm, qns , qsr, emp , sfx 116 114 !!--------------------------------------------------------------------- 117 INTEGER, INTENT(in) :: kt ! ocean time step 118 INTEGER, INTENT(in) :: ksbc ! flux formulation (user defined, bulk, or Pure Coupled) 115 INTEGER, INTENT(in) :: kt ! ocean time step 116 INTEGER, INTENT(in) :: Kbb, Kmm ! ocean time level indices 117 INTEGER, INTENT(in) :: ksbc ! flux formulation (user defined, bulk, or Pure Coupled) 119 118 ! 120 119 INTEGER :: jl ! dummy loop index … … 160 159 ! 161 160 IF( ln_icedyn .AND. .NOT.lk_c1d ) & 162 & CALL ice_dyn( kt )! -- Ice dynamics161 & CALL ice_dyn( kt, Kmm ) ! -- Ice dynamics 163 162 ! 164 163 ! !== lateral boundary conditions ==! … … 209 208 ! --- Ocean time step --- ! 210 209 !-------------------------! 211 IF( ln_icedyn ) CALL ice_update_tau( kt, u b(:,:,1), vb(:,:,1) ) ! -- update surface ocean stresses210 IF( ln_icedyn ) CALL ice_update_tau( kt, uu(:,:,1,Kbb), vv(:,:,1,Kbb) ) ! -- update surface ocean stresses 212 211 !!gm remark, the ocean-ice stress is not saved in ice diag call above ..... find a solution!!! 213 212 ! … … 217 216 218 217 219 SUBROUTINE ice_init 218 SUBROUTINE ice_init( Kbb, Kmm, Kaa ) 220 219 !!---------------------------------------------------------------------- 221 220 !! *** ROUTINE ice_init *** … … 223 222 !! ** purpose : Initialize sea-ice parameters 224 223 !!---------------------------------------------------------------------- 224 INTEGER, INTENT(in) :: Kbb, Kmm, Kaa 225 ! 225 226 INTEGER :: ji, jj, ierr 226 227 !!---------------------------------------------------------------------- … … 232 233 IF(lwp) WRITE(numout,*) '~~~~~~~~' 233 234 ! 234 ! ! Open the reference and configuration namelist files andnamelist output file235 CALL ctl_opn( numnam_ice_ref, 'namelist_ice_ref', 'OLD', 'FORMATTED', 'SEQUENTIAL', -1, numout, lwp)236 CALL ctl_opn( numnam_ice_cfg, 'namelist_ice_cfg', 'OLD', 'FORMATTED', 'SEQUENTIAL', -1, numout, lwp)237 IF(lwm) CALL ctl_opn( numoni , 'output.namelist.ice', 'UNKNOWN', 'FORMATTED', 'SEQUENTIAL', -1, numout, lwp, 1 )235 ! ! Load the reference and configuration namelist files and open namelist output file 236 CALL load_nml( numnam_ice_ref, 'namelist_ice_ref', numout, lwm ) 237 CALL load_nml( numnam_ice_cfg, 'namelist_ice_cfg', numout, lwm ) 238 IF(lwm) CALL ctl_opn( numoni , 'output.namelist.ice', 'UNKNOWN', 'FORMATTED', 'SEQUENTIAL', -1, numout, lwp, 1 ) 238 239 ! 239 240 CALL par_init ! set some ice run parameters … … 254 255 IF( .NOT. ln_rstart ) THEN ! start from rest: sea-ice deduced from sst 255 256 CALL ice_istate_init 256 CALL ice_istate( nit000 )257 CALL ice_istate( nit000, Kbb, Kmm, Kaa ) 257 258 ELSE ! start from a restart file 258 CALL ice_rst_read 259 CALL ice_rst_read( Kbb, Kmm, Kaa ) 259 260 ENDIF 260 261 CALL ice_var_glo2eqv … … 301 302 !!------------------------------------------------------------------- 302 303 ! 303 REWIND( numnam_ice_ref ) ! Namelist nampar in reference namelist : Parameters for ice304 304 READ ( numnam_ice_ref, nampar, IOSTAT = ios, ERR = 901) 305 305 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampar in reference namelist' ) 306 REWIND( numnam_ice_cfg ) ! Namelist nampar in configuration namelist : Parameters for ice307 306 READ ( numnam_ice_cfg, nampar, IOSTAT = ios, ERR = 902 ) 308 307 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'nampar in configuration namelist' ) -
NEMO/trunk/src/ICE/icethd.F90
r11536 r12377 53 53 54 54 !! * Substitutions 55 # include " vectopt_loop_substitute.h90"55 # include "do_loop_substitute.h90" 56 56 !!---------------------------------------------------------------------- 57 57 !! NEMO/ICE 4.0 , NEMO Consortium (2018) … … 109 109 zu_io(:,:) = u_ice(:,:) - ssu_m(:,:) 110 110 zv_io(:,:) = v_ice(:,:) - ssv_m(:,:) 111 DO jj = 2, jpjm1 112 DO ji = fs_2, fs_jpim1 113 zfric(ji,jj) = rn_cio * ( 0.5_wp * & 114 & ( zu_io(ji,jj) * zu_io(ji,jj) + zu_io(ji-1,jj) * zu_io(ji-1,jj) & 115 & + zv_io(ji,jj) * zv_io(ji,jj) + zv_io(ji,jj-1) * zv_io(ji,jj-1) ) ) * tmask(ji,jj,1) 116 END DO 117 END DO 111 DO_2D_00_00 112 zfric(ji,jj) = rn_cio * ( 0.5_wp * & 113 & ( zu_io(ji,jj) * zu_io(ji,jj) + zu_io(ji-1,jj) * zu_io(ji-1,jj) & 114 & + zv_io(ji,jj) * zv_io(ji,jj) + zv_io(ji,jj-1) * zv_io(ji,jj-1) ) ) * tmask(ji,jj,1) 115 END_2D 118 116 ELSE ! if no ice dynamics => transmit directly the atmospheric stress to the ocean 119 DO jj = 2, jpjm1 120 DO ji = fs_2, fs_jpim1 121 zfric(ji,jj) = r1_rau0 * SQRT( 0.5_wp * & 122 & ( utau(ji,jj) * utau(ji,jj) + utau(ji-1,jj) * utau(ji-1,jj) & 123 & + vtau(ji,jj) * vtau(ji,jj) + vtau(ji,jj-1) * vtau(ji,jj-1) ) ) * tmask(ji,jj,1) 124 END DO 125 END DO 117 DO_2D_00_00 118 zfric(ji,jj) = r1_rau0 * SQRT( 0.5_wp * & 119 & ( utau(ji,jj) * utau(ji,jj) + utau(ji-1,jj) * utau(ji-1,jj) & 120 & + vtau(ji,jj) * vtau(ji,jj) + vtau(ji,jj-1) * vtau(ji,jj-1) ) ) * tmask(ji,jj,1) 121 END_2D 126 122 ENDIF 127 123 CALL lbc_lnk( 'icethd', zfric, 'T', 1. ) … … 130 126 ! Partial computation of forcing for the thermodynamic sea ice model 131 127 !--------------------------------------------------------------------! 132 DO jj = 1, jpj 133 DO ji = 1, jpi 134 rswitch = tmask(ji,jj,1) * MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi10 ) ) ! 0 if no ice 135 ! 136 ! ! solar irradiance transmission at the mixed layer bottom and used in the lead heat budget 137 ! ! practically no "direct lateral ablation" 138 ! 139 ! ! net downward heat flux from the ice to the ocean, expressed as a function of ocean 140 ! ! temperature and turbulent mixing (McPhee, 1992) 141 ! 142 ! --- Energy received in the lead from atm-oce exchanges, zqld is defined everywhere (J.m-2) --- ! 143 zqld = tmask(ji,jj,1) * rdt_ice * & 144 & ( ( 1._wp - at_i_b(ji,jj) ) * qsr_oce(ji,jj) * frq_m(ji,jj) + & 145 & ( 1._wp - at_i_b(ji,jj) ) * qns_oce(ji,jj) + qemp_oce(ji,jj) ) 146 147 ! --- Energy needed to bring ocean surface layer until its freezing (mostly<0 but >0 if supercooling, J.m-2) --- ! 148 zqfr = rau0 * rcp * e3t_m(ji,jj) * ( t_bo(ji,jj) - ( sst_m(ji,jj) + rt0 ) ) * tmask(ji,jj,1) ! both < 0 (t_bo < sst) and > 0 (t_bo > sst) 149 zqfr_neg = MIN( zqfr , 0._wp ) ! only < 0 150 151 ! --- Sensible ocean-to-ice heat flux (mostly>0 but <0 if supercooling, W/m2) 152 zfric_u = MAX( SQRT( zfric(ji,jj) ), zfric_umin ) 153 qsb_ice_bot(ji,jj) = rswitch * rau0 * rcp * zch * zfric_u * ( ( sst_m(ji,jj) + rt0 ) - t_bo(ji,jj) ) ! W.m-2 154 155 qsb_ice_bot(ji,jj) = rswitch * MIN( qsb_ice_bot(ji,jj), - zqfr_neg * r1_rdtice / MAX( at_i(ji,jj), epsi10 ) ) 156 ! upper bound for qsb_ice_bot: the heat retrieved from the ocean must be smaller than the heat necessary to reach 157 ! the freezing point, so that we do not have SST < T_freeze 158 ! This implies: - ( qsb_ice_bot(ji,jj) * at_i(ji,jj) * rtdice ) - zqfr >= 0 159 160 !-- Energy Budget of the leads (J.m-2), source of ice growth in open water. Must be < 0 to form ice 161 qlead(ji,jj) = MIN( 0._wp , zqld - ( qsb_ice_bot(ji,jj) * at_i(ji,jj) * rdt_ice ) - zqfr ) 162 163 ! If there is ice and leads are warming => transfer energy from the lead budget and use it for bottom melting 164 ! If the grid cell is fully covered by ice (no leads) => transfer energy from the lead budget to the ice bottom budget 165 IF( ( zqld >= 0._wp .AND. at_i(ji,jj) > 0._wp ) .OR. at_i(ji,jj) >= (1._wp - epsi10) ) THEN 166 fhld (ji,jj) = rswitch * zqld * r1_rdtice / MAX( at_i(ji,jj), epsi10 ) ! divided by at_i since this is (re)multiplied by a_i in icethd_dh.F90 167 qlead(ji,jj) = 0._wp 168 ELSE 169 fhld (ji,jj) = 0._wp 170 ENDIF 171 ! 172 ! Net heat flux on top of the ice-ocean [W.m-2] 173 ! --------------------------------------------- 174 qt_atm_oi(ji,jj) = qns_tot(ji,jj) + qsr_tot(ji,jj) 175 END DO 176 END DO 128 DO_2D_11_11 129 rswitch = tmask(ji,jj,1) * MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi10 ) ) ! 0 if no ice 130 ! 131 ! ! solar irradiance transmission at the mixed layer bottom and used in the lead heat budget 132 ! ! practically no "direct lateral ablation" 133 ! 134 ! ! net downward heat flux from the ice to the ocean, expressed as a function of ocean 135 ! ! temperature and turbulent mixing (McPhee, 1992) 136 ! 137 ! --- Energy received in the lead from atm-oce exchanges, zqld is defined everywhere (J.m-2) --- ! 138 zqld = tmask(ji,jj,1) * rdt_ice * & 139 & ( ( 1._wp - at_i_b(ji,jj) ) * qsr_oce(ji,jj) * frq_m(ji,jj) + & 140 & ( 1._wp - at_i_b(ji,jj) ) * qns_oce(ji,jj) + qemp_oce(ji,jj) ) 141 142 ! --- Energy needed to bring ocean surface layer until its freezing (mostly<0 but >0 if supercooling, J.m-2) --- ! 143 zqfr = rau0 * rcp * e3t_m(ji,jj) * ( t_bo(ji,jj) - ( sst_m(ji,jj) + rt0 ) ) * tmask(ji,jj,1) ! both < 0 (t_bo < sst) and > 0 (t_bo > sst) 144 zqfr_neg = MIN( zqfr , 0._wp ) ! only < 0 145 146 ! --- Sensible ocean-to-ice heat flux (mostly>0 but <0 if supercooling, W/m2) 147 zfric_u = MAX( SQRT( zfric(ji,jj) ), zfric_umin ) 148 qsb_ice_bot(ji,jj) = rswitch * rau0 * rcp * zch * zfric_u * ( ( sst_m(ji,jj) + rt0 ) - t_bo(ji,jj) ) ! W.m-2 149 150 qsb_ice_bot(ji,jj) = rswitch * MIN( qsb_ice_bot(ji,jj), - zqfr_neg * r1_rdtice / MAX( at_i(ji,jj), epsi10 ) ) 151 ! upper bound for qsb_ice_bot: the heat retrieved from the ocean must be smaller than the heat necessary to reach 152 ! the freezing point, so that we do not have SST < T_freeze 153 ! This implies: - ( qsb_ice_bot(ji,jj) * at_i(ji,jj) * rtdice ) - zqfr >= 0 154 155 !-- Energy Budget of the leads (J.m-2), source of ice growth in open water. Must be < 0 to form ice 156 qlead(ji,jj) = MIN( 0._wp , zqld - ( qsb_ice_bot(ji,jj) * at_i(ji,jj) * rdt_ice ) - zqfr ) 157 158 ! If there is ice and leads are warming => transfer energy from the lead budget and use it for bottom melting 159 ! If the grid cell is fully covered by ice (no leads) => transfer energy from the lead budget to the ice bottom budget 160 IF( ( zqld >= 0._wp .AND. at_i(ji,jj) > 0._wp ) .OR. at_i(ji,jj) >= (1._wp - epsi10) ) THEN 161 fhld (ji,jj) = rswitch * zqld * r1_rdtice / MAX( at_i(ji,jj), epsi10 ) ! divided by at_i since this is (re)multiplied by a_i in icethd_dh.F90 162 qlead(ji,jj) = 0._wp 163 ELSE 164 fhld (ji,jj) = 0._wp 165 ENDIF 166 ! 167 ! Net heat flux on top of the ice-ocean [W.m-2] 168 ! --------------------------------------------- 169 qt_atm_oi(ji,jj) = qns_tot(ji,jj) + qsr_tot(ji,jj) 170 END_2D 177 171 178 172 ! In case we bypass open-water ice formation … … 202 196 ! select ice covered grid points 203 197 npti = 0 ; nptidx(:) = 0 204 DO jj = 1, jpj 205 DO ji = 1, jpi 206 IF ( a_i(ji,jj,jl) > epsi10 ) THEN 207 npti = npti + 1 208 nptidx(npti) = (jj - 1) * jpi + ji 209 ENDIF 210 END DO 211 END DO 198 DO_2D_11_11 199 IF ( a_i(ji,jj,jl) > epsi10 ) THEN 200 npti = npti + 1 201 nptidx(npti) = (jj - 1) * jpi + ji 202 ENDIF 203 END_2D 212 204 213 205 IF( npti > 0 ) THEN ! If there is no ice, do nothing. … … 252 244 ! controls 253 245 IF( ln_icectl ) CALL ice_prt (kt, iiceprt, jiceprt, 1, ' - ice thermodyn. - ') ! prints 254 IF( ln_ctl ) CALL ice_prt3D ('icethd') ! prints 246 IF( sn_cfctl%l_prtctl ) & 247 & CALL ice_prt3D ('icethd') ! prints 255 248 IF( ln_timing ) CALL timing_stop('icethd') ! timing 256 249 ! … … 539 532 !!------------------------------------------------------------------- 540 533 ! 541 REWIND( numnam_ice_ref ) ! Namelist namthd in reference namelist : Ice thermodynamics542 534 READ ( numnam_ice_ref, namthd, IOSTAT = ios, ERR = 901) 543 535 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namthd in reference namelist' ) 544 REWIND( numnam_ice_cfg ) ! Namelist namthd in configuration namelist : Ice thermodynamics545 536 READ ( numnam_ice_cfg, namthd, IOSTAT = ios, ERR = 902 ) 546 537 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namthd in configuration namelist' ) -
NEMO/trunk/src/ICE/icethd_da.F90
r11536 r12377 177 177 !!------------------------------------------------------------------- 178 178 ! 179 REWIND( numnam_ice_ref ) ! Namelist namthd_da in reference namelist : Ice thermodynamics180 179 READ ( numnam_ice_ref, namthd_da, IOSTAT = ios, ERR = 901) 181 180 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namthd_da in reference namelist' ) 182 REWIND( numnam_ice_cfg ) ! Namelist namthd_da in configuration namelist : Ice thermodynamics183 181 READ ( numnam_ice_cfg, namthd_da, IOSTAT = ios, ERR = 902 ) 184 182 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namthd_da in configuration namelist' ) -
NEMO/trunk/src/ICE/icethd_do.F90
r11536 r12377 44 44 REAL(wp) :: rn_Cfraz ! squeezing coefficient for collection of bottom frazil ice 45 45 46 !! * Substitutions 47 # include "do_loop_substitute.h90" 46 48 !!---------------------------------------------------------------------- 47 49 !! NEMO/ICE 4.0 , NEMO Consortium (2018) … … 143 145 zgamafr = 0.03 144 146 ! 145 DO jj = 2, jpjm1 146 DO ji = 2, jpim1 147 IF ( qlead(ji,jj) < 0._wp .AND. tau_icebfr(ji,jj) == 0._wp ) THEN ! activated if cooling and no landfast 148 ! -- Wind stress -- ! 149 ztaux = ( utau_ice(ji-1,jj ) * umask(ji-1,jj ,1) & 150 & + utau_ice(ji ,jj ) * umask(ji ,jj ,1) ) * 0.5_wp 151 ztauy = ( vtau_ice(ji ,jj-1) * vmask(ji ,jj-1,1) & 152 & + vtau_ice(ji ,jj ) * vmask(ji ,jj ,1) ) * 0.5_wp 153 ! Square root of wind stress 154 ztenagm = SQRT( SQRT( ztaux * ztaux + ztauy * ztauy ) ) 155 156 ! -- Frazil ice velocity -- ! 157 rswitch = MAX( 0._wp, SIGN( 1._wp , ztenagm - epsi10 ) ) 158 zvfrx = rswitch * zgamafr * zsqcd * ztaux / MAX( ztenagm, epsi10 ) 159 zvfry = rswitch * zgamafr * zsqcd * ztauy / MAX( ztenagm, epsi10 ) 160 161 ! -- Pack ice velocity -- ! 162 zvgx = ( u_ice(ji-1,jj ) * umask(ji-1,jj ,1) + u_ice(ji,jj) * umask(ji,jj,1) ) * 0.5_wp 163 zvgy = ( v_ice(ji ,jj-1) * vmask(ji ,jj-1,1) + v_ice(ji,jj) * vmask(ji,jj,1) ) * 0.5_wp 164 165 ! -- Relative frazil/pack ice velocity -- ! 166 rswitch = MAX( 0._wp, SIGN( 1._wp , at_i(ji,jj) - epsi10 ) ) 167 zvrel2 = MAX( ( zvfrx - zvgx ) * ( zvfrx - zvgx ) & 168 & + ( zvfry - zvgy ) * ( zvfry - zvgy ) , 0.15 * 0.15 ) * rswitch 169 zvrel(ji,jj) = SQRT( zvrel2 ) 170 171 ! -- new ice thickness (iterative loop) -- ! 172 ht_i_new(ji,jj) = zhicrit + ( zhicrit + 0.1 ) & 173 & / ( ( zhicrit + 0.1 ) * ( zhicrit + 0.1 ) - zhicrit * zhicrit ) * ztwogp * zvrel2 174 175 iter = 1 176 DO WHILE ( iter < 20 ) 177 zf = ( ht_i_new(ji,jj) - zhicrit ) * ( ht_i_new(ji,jj) * ht_i_new(ji,jj) - zhicrit * zhicrit ) - & 178 & ht_i_new(ji,jj) * zhicrit * ztwogp * zvrel2 179 zfp = ( ht_i_new(ji,jj) - zhicrit ) * ( 3.0 * ht_i_new(ji,jj) + zhicrit ) - zhicrit * ztwogp * zvrel2 180 181 ht_i_new(ji,jj) = ht_i_new(ji,jj) - zf / MAX( zfp, epsi20 ) 182 iter = iter + 1 183 END DO 184 ! 185 ! bound ht_i_new (though I don't see why it should be necessary) 186 ht_i_new(ji,jj) = MAX( 0.01_wp, MIN( ht_i_new(ji,jj), hi_max(jpl) ) ) 187 ! 188 ENDIF 147 DO_2D_00_00 148 IF ( qlead(ji,jj) < 0._wp .AND. tau_icebfr(ji,jj) == 0._wp ) THEN ! activated if cooling and no landfast 149 ! -- Wind stress -- ! 150 ztaux = ( utau_ice(ji-1,jj ) * umask(ji-1,jj ,1) & 151 & + utau_ice(ji ,jj ) * umask(ji ,jj ,1) ) * 0.5_wp 152 ztauy = ( vtau_ice(ji ,jj-1) * vmask(ji ,jj-1,1) & 153 & + vtau_ice(ji ,jj ) * vmask(ji ,jj ,1) ) * 0.5_wp 154 ! Square root of wind stress 155 ztenagm = SQRT( SQRT( ztaux * ztaux + ztauy * ztauy ) ) 156 157 ! -- Frazil ice velocity -- ! 158 rswitch = MAX( 0._wp, SIGN( 1._wp , ztenagm - epsi10 ) ) 159 zvfrx = rswitch * zgamafr * zsqcd * ztaux / MAX( ztenagm, epsi10 ) 160 zvfry = rswitch * zgamafr * zsqcd * ztauy / MAX( ztenagm, epsi10 ) 161 162 ! -- Pack ice velocity -- ! 163 zvgx = ( u_ice(ji-1,jj ) * umask(ji-1,jj ,1) + u_ice(ji,jj) * umask(ji,jj,1) ) * 0.5_wp 164 zvgy = ( v_ice(ji ,jj-1) * vmask(ji ,jj-1,1) + v_ice(ji,jj) * vmask(ji,jj,1) ) * 0.5_wp 165 166 ! -- Relative frazil/pack ice velocity -- ! 167 rswitch = MAX( 0._wp, SIGN( 1._wp , at_i(ji,jj) - epsi10 ) ) 168 zvrel2 = MAX( ( zvfrx - zvgx ) * ( zvfrx - zvgx ) & 169 & + ( zvfry - zvgy ) * ( zvfry - zvgy ) , 0.15 * 0.15 ) * rswitch 170 zvrel(ji,jj) = SQRT( zvrel2 ) 171 172 ! -- new ice thickness (iterative loop) -- ! 173 ht_i_new(ji,jj) = zhicrit + ( zhicrit + 0.1 ) & 174 & / ( ( zhicrit + 0.1 ) * ( zhicrit + 0.1 ) - zhicrit * zhicrit ) * ztwogp * zvrel2 175 176 iter = 1 177 DO WHILE ( iter < 20 ) 178 zf = ( ht_i_new(ji,jj) - zhicrit ) * ( ht_i_new(ji,jj) * ht_i_new(ji,jj) - zhicrit * zhicrit ) - & 179 & ht_i_new(ji,jj) * zhicrit * ztwogp * zvrel2 180 zfp = ( ht_i_new(ji,jj) - zhicrit ) * ( 3.0 * ht_i_new(ji,jj) + zhicrit ) - zhicrit * ztwogp * zvrel2 181 182 ht_i_new(ji,jj) = ht_i_new(ji,jj) - zf / MAX( zfp, epsi20 ) 183 iter = iter + 1 184 END DO 189 185 ! 190 END DO 191 END DO 186 ! bound ht_i_new (though I don't see why it should be necessary) 187 ht_i_new(ji,jj) = MAX( 0.01_wp, MIN( ht_i_new(ji,jj), hi_max(jpl) ) ) 188 ! 189 ENDIF 190 ! 191 END_2D 192 192 ! 193 193 CALL lbc_lnk_multi( 'icethd_do', zvrel, 'T', 1., ht_i_new, 'T', 1. ) … … 202 202 ! Identify grid points where new ice forms 203 203 npti = 0 ; nptidx(:) = 0 204 DO jj = 1, jpj 205 DO ji = 1, jpi 206 IF ( qlead(ji,jj) < 0._wp .AND. tau_icebfr(ji,jj) == 0._wp ) THEN 207 npti = npti + 1 208 nptidx( npti ) = (jj - 1) * jpi + ji 209 ENDIF 210 END DO 211 END DO 204 DO_2D_11_11 205 IF ( qlead(ji,jj) < 0._wp .AND. tau_icebfr(ji,jj) == 0._wp ) THEN 206 npti = npti + 1 207 nptidx( npti ) = (jj - 1) * jpi + ji 208 ENDIF 209 END_2D 212 210 213 211 ! Move from 2-D to 1-D vectors … … 443 441 !!------------------------------------------------------------------- 444 442 ! 445 REWIND( numnam_ice_ref ) ! Namelist namthd_do in reference namelist : Ice thermodynamics446 443 READ ( numnam_ice_ref, namthd_do, IOSTAT = ios, ERR = 901) 447 444 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namthd_do in reference namelist' ) 448 REWIND( numnam_ice_cfg ) ! Namelist namthd_do in configuration namelist : Ice thermodynamics449 445 READ ( numnam_ice_cfg, namthd_do, IOSTAT = ios, ERR = 902 ) 450 446 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namthd_do in configuration namelist' ) -
NEMO/trunk/src/ICE/icethd_pnd.F90
r11536 r12377 38 38 INTEGER, PARAMETER :: np_pndH12 = 2 ! Evolutive pond scheme (Holland et al. 2012) 39 39 40 !! * Substitutions41 # include "vectopt_loop_substitute.h90"42 40 !!---------------------------------------------------------------------- 43 41 !! NEMO/ICE 4.0 , NEMO Consortium (2018) … … 208 206 !!------------------------------------------------------------------- 209 207 ! 210 REWIND( numnam_ice_ref ) ! Namelist namthd_pnd in reference namelist : Melt Ponds211 208 READ ( numnam_ice_ref, namthd_pnd, IOSTAT = ios, ERR = 901) 212 209 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namthd_pnd in reference namelist' ) 213 REWIND( numnam_ice_cfg ) ! Namelist namthd_pnd in configuration namelist : Melt Ponds214 210 READ ( numnam_ice_cfg, namthd_pnd, IOSTAT = ios, ERR = 902 ) 215 211 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namthd_pnd in configuration namelist' ) -
NEMO/trunk/src/ICE/icethd_sal.F90
r11536 r12377 132 132 !!------------------------------------------------------------------- 133 133 ! 134 REWIND( numnam_ice_ref ) ! Namelist namthd_sal in reference namelist : Ice salinity135 134 READ ( numnam_ice_ref, namthd_sal, IOSTAT = ios, ERR = 901) 136 135 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namthd_sal in reference namelist' ) 137 REWIND( numnam_ice_cfg ) ! Namelist namthd_sal in configuration namelist : Ice salinity138 136 READ ( numnam_ice_cfg, namthd_sal, IOSTAT = ios, ERR = 902 ) 139 137 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namthd_sal in configuration namelist' ) -
NEMO/trunk/src/ICE/icethd_zdf.F90
r11536 r12377 88 88 !!------------------------------------------------------------------- 89 89 ! 90 REWIND( numnam_ice_ref ) ! Namelist namthd_zdf in reference namelist : Ice thermodynamics91 90 READ ( numnam_ice_ref, namthd_zdf, IOSTAT = ios, ERR = 901) 92 91 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namthd_zdf in reference namelist' ) 93 REWIND( numnam_ice_cfg ) ! Namelist namthd_zdf in configuration namelist : Ice thermodynamics94 92 READ ( numnam_ice_cfg, namthd_zdf, IOSTAT = ios, ERR = 902 ) 95 93 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namthd_zdf in configuration namelist' ) -
NEMO/trunk/src/ICE/iceupdate.F90
r11536 r12377 15 15 !! ice_update_tau : update i- and j-stresses, and its modulus at the ocean surface 16 16 !!---------------------------------------------------------------------- 17 USE oce , ONLY : sshn, sshb18 17 USE phycst ! physical constants 19 18 USE dom_oce ! ocean domain … … 45 44 46 45 !! * Substitutions 47 # include " vectopt_loop_substitute.h90"46 # include "do_loop_substitute.h90" 48 47 !!---------------------------------------------------------------------- 49 48 !! NEMO/ICE 4.0 , NEMO Consortium (2018) … … 114 113 ENDIF 115 114 116 DO jj = 1, jpj 117 DO ji = 1, jpi 118 119 ! Solar heat flux reaching the ocean = zqsr (W.m-2) 120 !--------------------------------------------------- 121 zqsr = qsr_tot(ji,jj) - SUM( a_i_b(ji,jj,:) * ( qsr_ice(ji,jj,:) - qtr_ice_bot(ji,jj,:) ) ) 122 123 ! Total heat flux reaching the ocean = qt_oce_ai (W.m-2) 124 !--------------------------------------------------- 125 zqmass = hfx_thd(ji,jj) + hfx_dyn(ji,jj) + hfx_res(ji,jj) ! heat flux from snow is 0 (T=0 degC) 126 qt_oce_ai(ji,jj) = qt_oce_ai(ji,jj) + zqmass + zqsr 127 128 ! Add the residual from heat diffusion equation and sublimation (W.m-2) 129 !---------------------------------------------------------------------- 130 qt_oce_ai(ji,jj) = qt_oce_ai(ji,jj) + hfx_err_dif(ji,jj) + & 131 & ( hfx_sub(ji,jj) - SUM( qevap_ice(ji,jj,:) * a_i_b(ji,jj,:) ) ) 132 133 ! New qsr and qns used to compute the oceanic heat flux at the next time step 134 !---------------------------------------------------------------------------- 135 qsr(ji,jj) = zqsr 136 qns(ji,jj) = qt_oce_ai(ji,jj) - zqsr 137 138 ! Mass flux at the atm. surface 139 !----------------------------------- 140 wfx_sub(ji,jj) = wfx_snw_sub(ji,jj) + wfx_ice_sub(ji,jj) 141 142 ! Mass flux at the ocean surface 143 !------------------------------------ 144 ! case of realistic freshwater flux (Tartinville et al., 2001) (presently ACTIVATED) 145 ! ------------------------------------------------------------------------------------- 146 ! The idea of this approach is that the system that we consider is the ICE-OCEAN system 147 ! Thus FW flux = External ( E-P+snow melt) 148 ! Salt flux = Exchanges in the ice-ocean system then converted into FW 149 ! Associated to Ice formation AND Ice melting 150 ! Even if i see Ice melting as a FW and SALT flux 151 ! 152 ! mass flux from ice/ocean 153 wfx_ice(ji,jj) = wfx_bog(ji,jj) + wfx_bom(ji,jj) + wfx_sum(ji,jj) + wfx_sni(ji,jj) & 154 & + wfx_opw(ji,jj) + wfx_dyn(ji,jj) + wfx_res(ji,jj) + wfx_lam(ji,jj) + wfx_pnd(ji,jj) 155 156 ! add the snow melt water to snow mass flux to the ocean 157 wfx_snw(ji,jj) = wfx_snw_sni(ji,jj) + wfx_snw_dyn(ji,jj) + wfx_snw_sum(ji,jj) 158 159 ! mass flux at the ocean/ice interface 160 fmmflx(ji,jj) = - ( wfx_ice(ji,jj) + wfx_snw(ji,jj) + wfx_err_sub(ji,jj) ) ! F/M mass flux save at least for biogeochemical model 161 emp(ji,jj) = emp_oce(ji,jj) - wfx_ice(ji,jj) - wfx_snw(ji,jj) - wfx_err_sub(ji,jj) ! mass flux + F/M mass flux (always ice/ocean mass exchange) 162 163 164 ! Salt flux at the ocean surface 165 !------------------------------------------ 166 sfx(ji,jj) = sfx_bog(ji,jj) + sfx_bom(ji,jj) + sfx_sum(ji,jj) + sfx_sni(ji,jj) + sfx_opw(ji,jj) & 167 & + sfx_res(ji,jj) + sfx_dyn(ji,jj) + sfx_bri(ji,jj) + sfx_sub(ji,jj) + sfx_lam(ji,jj) 168 169 ! Mass of snow and ice per unit area 170 !---------------------------------------- 171 snwice_mass_b(ji,jj) = snwice_mass(ji,jj) ! save mass from the previous ice time step 172 ! ! new mass per unit area 173 snwice_mass (ji,jj) = tmask(ji,jj,1) * ( rhos * vt_s(ji,jj) + rhoi * vt_i(ji,jj) ) 174 ! ! time evolution of snow+ice mass 175 snwice_fmass (ji,jj) = ( snwice_mass(ji,jj) - snwice_mass_b(ji,jj) ) * r1_rdtice 176 177 END DO 178 END DO 115 DO_2D_11_11 116 117 ! Solar heat flux reaching the ocean = zqsr (W.m-2) 118 !--------------------------------------------------- 119 zqsr = qsr_tot(ji,jj) - SUM( a_i_b(ji,jj,:) * ( qsr_ice(ji,jj,:) - qtr_ice_bot(ji,jj,:) ) ) 120 121 ! Total heat flux reaching the ocean = qt_oce_ai (W.m-2) 122 !--------------------------------------------------- 123 zqmass = hfx_thd(ji,jj) + hfx_dyn(ji,jj) + hfx_res(ji,jj) ! heat flux from snow is 0 (T=0 degC) 124 qt_oce_ai(ji,jj) = qt_oce_ai(ji,jj) + zqmass + zqsr 125 126 ! Add the residual from heat diffusion equation and sublimation (W.m-2) 127 !---------------------------------------------------------------------- 128 qt_oce_ai(ji,jj) = qt_oce_ai(ji,jj) + hfx_err_dif(ji,jj) + & 129 & ( hfx_sub(ji,jj) - SUM( qevap_ice(ji,jj,:) * a_i_b(ji,jj,:) ) ) 130 131 ! New qsr and qns used to compute the oceanic heat flux at the next time step 132 !---------------------------------------------------------------------------- 133 qsr(ji,jj) = zqsr 134 qns(ji,jj) = qt_oce_ai(ji,jj) - zqsr 135 136 ! Mass flux at the atm. surface 137 !----------------------------------- 138 wfx_sub(ji,jj) = wfx_snw_sub(ji,jj) + wfx_ice_sub(ji,jj) 139 140 ! Mass flux at the ocean surface 141 !------------------------------------ 142 ! case of realistic freshwater flux (Tartinville et al., 2001) (presently ACTIVATED) 143 ! ------------------------------------------------------------------------------------- 144 ! The idea of this approach is that the system that we consider is the ICE-OCEAN system 145 ! Thus FW flux = External ( E-P+snow melt) 146 ! Salt flux = Exchanges in the ice-ocean system then converted into FW 147 ! Associated to Ice formation AND Ice melting 148 ! Even if i see Ice melting as a FW and SALT flux 149 ! 150 ! mass flux from ice/ocean 151 wfx_ice(ji,jj) = wfx_bog(ji,jj) + wfx_bom(ji,jj) + wfx_sum(ji,jj) + wfx_sni(ji,jj) & 152 & + wfx_opw(ji,jj) + wfx_dyn(ji,jj) + wfx_res(ji,jj) + wfx_lam(ji,jj) + wfx_pnd(ji,jj) 153 154 ! add the snow melt water to snow mass flux to the ocean 155 wfx_snw(ji,jj) = wfx_snw_sni(ji,jj) + wfx_snw_dyn(ji,jj) + wfx_snw_sum(ji,jj) 156 157 ! mass flux at the ocean/ice interface 158 fmmflx(ji,jj) = - ( wfx_ice(ji,jj) + wfx_snw(ji,jj) + wfx_err_sub(ji,jj) ) ! F/M mass flux save at least for biogeochemical model 159 emp(ji,jj) = emp_oce(ji,jj) - wfx_ice(ji,jj) - wfx_snw(ji,jj) - wfx_err_sub(ji,jj) ! mass flux + F/M mass flux (always ice/ocean mass exchange) 160 161 162 ! Salt flux at the ocean surface 163 !------------------------------------------ 164 sfx(ji,jj) = sfx_bog(ji,jj) + sfx_bom(ji,jj) + sfx_sum(ji,jj) + sfx_sni(ji,jj) + sfx_opw(ji,jj) & 165 & + sfx_res(ji,jj) + sfx_dyn(ji,jj) + sfx_bri(ji,jj) + sfx_sub(ji,jj) + sfx_lam(ji,jj) 166 167 ! Mass of snow and ice per unit area 168 !---------------------------------------- 169 snwice_mass_b(ji,jj) = snwice_mass(ji,jj) ! save mass from the previous ice time step 170 ! ! new mass per unit area 171 snwice_mass (ji,jj) = tmask(ji,jj,1) * ( rhos * vt_s(ji,jj) + rhoi * vt_i(ji,jj) ) 172 ! ! time evolution of snow+ice mass 173 snwice_fmass (ji,jj) = ( snwice_mass(ji,jj) - snwice_mass_b(ji,jj) ) * r1_rdtice 174 175 END_2D 179 176 180 177 ! Storing the transmitted variables … … 286 283 #endif 287 284 IF( ln_icectl ) CALL ice_prt (kt, iiceprt, jiceprt, 3, 'Final state ice_update') ! prints 288 IF( ln_ctl) CALL ice_prt3D ('iceupdate') ! prints285 IF( sn_cfctl%l_prtctl ) CALL ice_prt3D ('iceupdate') ! prints 289 286 IF( ln_timing ) CALL timing_stop ('ice_update') ! timing 290 287 ! … … 335 332 ! 336 333 IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN !== Ice time-step only ==! (i.e. surface module time-step) 337 DO jj = 2, jpjm1 !* update the modulus of stress at ocean surface (T-point) 338 DO ji = fs_2, fs_jpim1 339 ! ! 2*(U_ice-U_oce) at T-point 340 zu_t = u_ice(ji,jj) + u_ice(ji-1,jj) - u_oce(ji,jj) - u_oce(ji-1,jj) 341 zv_t = v_ice(ji,jj) + v_ice(ji,jj-1) - v_oce(ji,jj) - v_oce(ji,jj-1) 342 ! ! |U_ice-U_oce|^2 343 zmodt = 0.25_wp * ( zu_t * zu_t + zv_t * zv_t ) 344 ! ! update the ocean stress modulus 345 taum(ji,jj) = ( 1._wp - at_i(ji,jj) ) * taum(ji,jj) + at_i(ji,jj) * zrhoco * zmodt 346 tmod_io(ji,jj) = zrhoco * SQRT( zmodt ) ! rhoco * |U_ice-U_oce| at T-point 347 END DO 348 END DO 334 DO_2D_00_00 335 ! ! 2*(U_ice-U_oce) at T-point 336 zu_t = u_ice(ji,jj) + u_ice(ji-1,jj) - u_oce(ji,jj) - u_oce(ji-1,jj) 337 zv_t = v_ice(ji,jj) + v_ice(ji,jj-1) - v_oce(ji,jj) - v_oce(ji,jj-1) 338 ! ! |U_ice-U_oce|^2 339 zmodt = 0.25_wp * ( zu_t * zu_t + zv_t * zv_t ) 340 ! ! update the ocean stress modulus 341 taum(ji,jj) = ( 1._wp - at_i(ji,jj) ) * taum(ji,jj) + at_i(ji,jj) * zrhoco * zmodt 342 tmod_io(ji,jj) = zrhoco * SQRT( zmodt ) ! rhoco * |U_ice-U_oce| at T-point 343 END_2D 349 344 CALL lbc_lnk_multi( 'iceupdate', taum, 'T', 1., tmod_io, 'T', 1. ) 350 345 ! … … 356 351 ! !== every ocean time-step ==! 357 352 ! 358 DO jj = 2, jpjm1 !* update the stress WITHOUT an ice-ocean rotation angle 359 DO ji = fs_2, fs_jpim1 ! Vect. Opt. 360 ! ice area at u and v-points 361 zat_u = ( at_i(ji,jj) * tmask(ji,jj,1) + at_i (ji+1,jj ) * tmask(ji+1,jj ,1) ) & 362 & / MAX( 1.0_wp , tmask(ji,jj,1) + tmask(ji+1,jj ,1) ) 363 zat_v = ( at_i(ji,jj) * tmask(ji,jj,1) + at_i (ji ,jj+1 ) * tmask(ji ,jj+1,1) ) & 364 & / MAX( 1.0_wp , tmask(ji,jj,1) + tmask(ji ,jj+1,1) ) 365 ! ! linearized quadratic drag formulation 366 zutau_ice = 0.5_wp * ( tmod_io(ji,jj) + tmod_io(ji+1,jj) ) * ( u_ice(ji,jj) - pu_oce(ji,jj) ) 367 zvtau_ice = 0.5_wp * ( tmod_io(ji,jj) + tmod_io(ji,jj+1) ) * ( v_ice(ji,jj) - pv_oce(ji,jj) ) 368 ! ! stresses at the ocean surface 369 utau(ji,jj) = ( 1._wp - zat_u ) * utau_oce(ji,jj) + zat_u * zutau_ice 370 vtau(ji,jj) = ( 1._wp - zat_v ) * vtau_oce(ji,jj) + zat_v * zvtau_ice 371 END DO 372 END DO 353 DO_2D_00_00 354 ! ice area at u and v-points 355 zat_u = ( at_i(ji,jj) * tmask(ji,jj,1) + at_i (ji+1,jj ) * tmask(ji+1,jj ,1) ) & 356 & / MAX( 1.0_wp , tmask(ji,jj,1) + tmask(ji+1,jj ,1) ) 357 zat_v = ( at_i(ji,jj) * tmask(ji,jj,1) + at_i (ji ,jj+1 ) * tmask(ji ,jj+1,1) ) & 358 & / MAX( 1.0_wp , tmask(ji,jj,1) + tmask(ji ,jj+1,1) ) 359 ! ! linearized quadratic drag formulation 360 zutau_ice = 0.5_wp * ( tmod_io(ji,jj) + tmod_io(ji+1,jj) ) * ( u_ice(ji,jj) - pu_oce(ji,jj) ) 361 zvtau_ice = 0.5_wp * ( tmod_io(ji,jj) + tmod_io(ji,jj+1) ) * ( v_ice(ji,jj) - pv_oce(ji,jj) ) 362 ! ! stresses at the ocean surface 363 utau(ji,jj) = ( 1._wp - zat_u ) * utau_oce(ji,jj) + zat_u * zutau_ice 364 vtau(ji,jj) = ( 1._wp - zat_v ) * vtau_oce(ji,jj) + zat_v * zvtau_ice 365 END_2D 373 366 CALL lbc_lnk_multi( 'iceupdate', utau, 'U', -1., vtau, 'V', -1. ) ! lateral boundary condition 374 367 ! -
NEMO/trunk/src/ICE/icevar.F90
r11732 r12377 82 82 END INTERFACE 83 83 84 !! * Substitutions 85 # include "do_loop_substitute.h90" 84 86 !!---------------------------------------------------------------------- 85 87 !! NEMO/ICE 4.0 , NEMO Consortium (2018) … … 115 117 ! 116 118 ato_i(:,:) = 1._wp - at_i(:,:) ! open water fraction 117 119 ! 120 !!GS: tm_su always needed by ABL over sea-ice 121 ALLOCATE( z1_at_i(jpi,jpj) ) 122 WHERE( at_i(:,:) > epsi20 ) ; z1_at_i(:,:) = 1._wp / at_i(:,:) 123 ELSEWHERE ; z1_at_i(:,:) = 0._wp 124 END WHERE 125 tm_su(:,:) = SUM( t_su(:,:,:) * a_i(:,:,:) , dim=3 ) * z1_at_i(:,:) 126 WHERE( at_i(:,:)<=epsi20 ) tm_su(:,:) = rt0 127 ! 118 128 ! The following fields are calculated for diagnostics and outputs only 119 129 ! ==> Do not use them for other purposes 120 130 IF( kn > 1 ) THEN 121 131 ! 122 ALLOCATE( z1_at_i(jpi,jpj) , z1_vt_i(jpi,jpj) , z1_vt_s(jpi,jpj) ) 123 WHERE( at_i(:,:) > epsi20 ) ; z1_at_i(:,:) = 1._wp / at_i(:,:) 124 ELSEWHERE ; z1_at_i(:,:) = 0._wp 125 END WHERE 132 ALLOCATE( z1_vt_i(jpi,jpj) , z1_vt_s(jpi,jpj) ) 126 133 WHERE( vt_i(:,:) > epsi20 ) ; z1_vt_i(:,:) = 1._wp / vt_i(:,:) 127 134 ELSEWHERE ; z1_vt_i(:,:) = 0._wp … … 136 143 ! 137 144 ! ! mean temperature (K), salinity and age 138 tm_su(:,:) = SUM( t_su(:,:,:) * a_i(:,:,:) , dim=3 ) * z1_at_i(:,:)139 145 tm_si(:,:) = SUM( t_si(:,:,:) * a_i(:,:,:) , dim=3 ) * z1_at_i(:,:) 140 146 om_i (:,:) = SUM( oa_i(:,:,:) , dim=3 ) * z1_at_i(:,:) … … 154 160 ! ! put rt0 where there is no ice 155 161 WHERE( at_i(:,:)<=epsi20 ) 156 tm_su(:,:) = rt0157 162 tm_si(:,:) = rt0 158 163 tm_i (:,:) = rt0 … … 165 170 END WHERE 166 171 ! 167 DEALLOCATE( z1_ at_i , z1_vt_i , z1_vt_s )172 DEALLOCATE( z1_vt_i , z1_vt_s ) 168 173 ! 169 174 ENDIF 175 ! 176 DEALLOCATE( z1_at_i ) 170 177 ! 171 178 END SUBROUTINE ice_var_agg … … 236 243 zlay_i = REAL( nlay_i , wp ) ! number of layers 237 244 DO jl = 1, jpl 238 DO jk = 1, nlay_i 239 DO jj = 1, jpj 240 DO ji = 1, jpi 241 IF ( v_i(ji,jj,jl) > epsi20 ) THEN !--- icy area 242 ! 243 ze_i = e_i (ji,jj,jk,jl) * z1_v_i(ji,jj,jl) * zlay_i ! Energy of melting e(S,T) [J.m-3] 244 ztmelts = - sz_i(ji,jj,jk,jl) * rTmlt ! Ice layer melt temperature [C] 245 ! Conversion q(S,T) -> T (second order equation) 246 zbbb = ( rcp - rcpi ) * ztmelts + ze_i * r1_rhoi - rLfus 247 zccc = SQRT( MAX( zbbb * zbbb - 4._wp * rcpi * rLfus * ztmelts , 0._wp) ) 248 t_i(ji,jj,jk,jl) = MAX( -100._wp , MIN( -( zbbb + zccc ) * 0.5_wp * r1_rcpi , ztmelts ) ) + rt0 ! [K] with bounds: -100 < t_i < ztmelts 249 ! 250 ELSE !--- no ice 251 t_i(ji,jj,jk,jl) = rt0 252 ENDIF 253 END DO 254 END DO 255 END DO 245 DO_3D_11_11( 1, nlay_i ) 246 IF ( v_i(ji,jj,jl) > epsi20 ) THEN !--- icy area 247 ! 248 ze_i = e_i (ji,jj,jk,jl) * z1_v_i(ji,jj,jl) * zlay_i ! Energy of melting e(S,T) [J.m-3] 249 ztmelts = - sz_i(ji,jj,jk,jl) * rTmlt ! Ice layer melt temperature [C] 250 ! Conversion q(S,T) -> T (second order equation) 251 zbbb = ( rcp - rcpi ) * ztmelts + ze_i * r1_rhoi - rLfus 252 zccc = SQRT( MAX( zbbb * zbbb - 4._wp * rcpi * rLfus * ztmelts , 0._wp) ) 253 t_i(ji,jj,jk,jl) = MAX( -100._wp , MIN( -( zbbb + zccc ) * 0.5_wp * r1_rcpi , ztmelts ) ) + rt0 ! [K] with bounds: -100 < t_i < ztmelts 254 ! 255 ELSE !--- no ice 256 t_i(ji,jj,jk,jl) = rt0 257 ENDIF 258 END_3D 256 259 END DO 257 260 … … 344 347 z1_dS = 1._wp / ( zsi1 - zsi0 ) 345 348 DO jl = 1, jpl 346 DO jj = 1, jpj 347 DO ji = 1, jpi 348 zalpha(ji,jj,jl) = MAX( 0._wp , MIN( ( zsi1 - s_i(ji,jj,jl) ) * z1_dS , 1._wp ) ) 349 ! ! force a constant profile when SSS too low (Baltic Sea) 350 IF( 2._wp * s_i(ji,jj,jl) >= sss_m(ji,jj) ) zalpha(ji,jj,jl) = 0._wp 351 END DO 352 END DO 349 DO_2D_11_11 350 zalpha(ji,jj,jl) = MAX( 0._wp , MIN( ( zsi1 - s_i(ji,jj,jl) ) * z1_dS , 1._wp ) ) 351 ! ! force a constant profile when SSS too low (Baltic Sea) 352 IF( 2._wp * s_i(ji,jj,jl) >= sss_m(ji,jj) ) zalpha(ji,jj,jl) = 0._wp 353 END_2D 353 354 END DO 354 355 ! 355 356 ! Computation of the profile 356 357 DO jl = 1, jpl 357 DO jk = 1, nlay_i 358 DO jj = 1, jpj 359 DO ji = 1, jpi 360 ! ! linear profile with 0 surface value 361 zs0 = z_slope_s(ji,jj,jl) * ( REAL(jk,wp) - 0.5_wp ) * h_i(ji,jj,jl) * r1_nlay_i 362 zs = zalpha(ji,jj,jl) * zs0 + ( 1._wp - zalpha(ji,jj,jl) ) * s_i(ji,jj,jl) ! weighting the profile 363 sz_i(ji,jj,jk,jl) = MIN( rn_simax, MAX( zs, rn_simin ) ) 364 END DO 365 END DO 366 END DO 358 DO_3D_11_11( 1, nlay_i ) 359 ! ! linear profile with 0 surface value 360 zs0 = z_slope_s(ji,jj,jl) * ( REAL(jk,wp) - 0.5_wp ) * h_i(ji,jj,jl) * r1_nlay_i 361 zs = zalpha(ji,jj,jl) * zs0 + ( 1._wp - zalpha(ji,jj,jl) ) * s_i(ji,jj,jl) ! weighting the profile 362 sz_i(ji,jj,jk,jl) = MIN( rn_simax, MAX( zs, rn_simin ) ) 363 END_3D 367 364 END DO 368 365 ! … … 489 486 ! Zap ice energy and use ocean heat to melt ice 490 487 !----------------------------------------------------------------- 491 DO jk = 1, nlay_i 492 DO jj = 1 , jpj 493 DO ji = 1 , jpi 494 ! update exchanges with ocean 495 hfx_res(ji,jj) = hfx_res(ji,jj) - (1._wp - zswitch(ji,jj) ) * e_i(ji,jj,jk,jl) * r1_rdtice ! W.m-2 <0 496 e_i(ji,jj,jk,jl) = e_i(ji,jj,jk,jl) * zswitch(ji,jj) 497 t_i(ji,jj,jk,jl) = t_i(ji,jj,jk,jl) * zswitch(ji,jj) + rt0 * ( 1._wp - zswitch(ji,jj) ) 498 END DO 499 END DO 500 END DO 501 ! 502 DO jk = 1, nlay_s 503 DO jj = 1 , jpj 504 DO ji = 1 , jpi 505 ! update exchanges with ocean 506 hfx_res(ji,jj) = hfx_res(ji,jj) - (1._wp - zswitch(ji,jj) ) * e_s(ji,jj,jk,jl) * r1_rdtice ! W.m-2 <0 507 e_s(ji,jj,jk,jl) = e_s(ji,jj,jk,jl) * zswitch(ji,jj) 508 t_s(ji,jj,jk,jl) = t_s(ji,jj,jk,jl) * zswitch(ji,jj) + rt0 * ( 1._wp - zswitch(ji,jj) ) 509 END DO 510 END DO 511 END DO 488 DO_3D_11_11( 1, nlay_i ) 489 ! update exchanges with ocean 490 hfx_res(ji,jj) = hfx_res(ji,jj) - (1._wp - zswitch(ji,jj) ) * e_i(ji,jj,jk,jl) * r1_rdtice ! W.m-2 <0 491 e_i(ji,jj,jk,jl) = e_i(ji,jj,jk,jl) * zswitch(ji,jj) 492 t_i(ji,jj,jk,jl) = t_i(ji,jj,jk,jl) * zswitch(ji,jj) + rt0 * ( 1._wp - zswitch(ji,jj) ) 493 END_3D 494 ! 495 DO_3D_11_11( 1, nlay_s ) 496 ! update exchanges with ocean 497 hfx_res(ji,jj) = hfx_res(ji,jj) - (1._wp - zswitch(ji,jj) ) * e_s(ji,jj,jk,jl) * r1_rdtice ! W.m-2 <0 498 e_s(ji,jj,jk,jl) = e_s(ji,jj,jk,jl) * zswitch(ji,jj) 499 t_s(ji,jj,jk,jl) = t_s(ji,jj,jk,jl) * zswitch(ji,jj) + rt0 * ( 1._wp - zswitch(ji,jj) ) 500 END_3D 512 501 ! 513 502 !----------------------------------------------------------------- 514 503 ! zap ice and snow volume, add water and salt to ocean 515 504 !----------------------------------------------------------------- 516 DO jj = 1 , jpj 517 DO ji = 1 , jpi 518 ! update exchanges with ocean 519 sfx_res(ji,jj) = sfx_res(ji,jj) + (1._wp - zswitch(ji,jj) ) * sv_i(ji,jj,jl) * rhoi * r1_rdtice 520 wfx_res(ji,jj) = wfx_res(ji,jj) + (1._wp - zswitch(ji,jj) ) * v_i (ji,jj,jl) * rhoi * r1_rdtice 521 wfx_res(ji,jj) = wfx_res(ji,jj) + (1._wp - zswitch(ji,jj) ) * v_s (ji,jj,jl) * rhos * r1_rdtice 522 ! 523 a_i (ji,jj,jl) = a_i (ji,jj,jl) * zswitch(ji,jj) 524 v_i (ji,jj,jl) = v_i (ji,jj,jl) * zswitch(ji,jj) 525 v_s (ji,jj,jl) = v_s (ji,jj,jl) * zswitch(ji,jj) 526 t_su (ji,jj,jl) = t_su(ji,jj,jl) * zswitch(ji,jj) + t_bo(ji,jj) * ( 1._wp - zswitch(ji,jj) ) 527 oa_i (ji,jj,jl) = oa_i(ji,jj,jl) * zswitch(ji,jj) 528 sv_i (ji,jj,jl) = sv_i(ji,jj,jl) * zswitch(ji,jj) 529 ! 530 h_i (ji,jj,jl) = h_i (ji,jj,jl) * zswitch(ji,jj) 531 h_s (ji,jj,jl) = h_s (ji,jj,jl) * zswitch(ji,jj) 532 ! 533 a_ip (ji,jj,jl) = a_ip (ji,jj,jl) * zswitch(ji,jj) 534 v_ip (ji,jj,jl) = v_ip (ji,jj,jl) * zswitch(ji,jj) 535 ! 536 END DO 537 END DO 505 DO_2D_11_11 506 ! update exchanges with ocean 507 sfx_res(ji,jj) = sfx_res(ji,jj) + (1._wp - zswitch(ji,jj) ) * sv_i(ji,jj,jl) * rhoi * r1_rdtice 508 wfx_res(ji,jj) = wfx_res(ji,jj) + (1._wp - zswitch(ji,jj) ) * v_i (ji,jj,jl) * rhoi * r1_rdtice 509 wfx_res(ji,jj) = wfx_res(ji,jj) + (1._wp - zswitch(ji,jj) ) * v_s (ji,jj,jl) * rhos * r1_rdtice 510 ! 511 a_i (ji,jj,jl) = a_i (ji,jj,jl) * zswitch(ji,jj) 512 v_i (ji,jj,jl) = v_i (ji,jj,jl) * zswitch(ji,jj) 513 v_s (ji,jj,jl) = v_s (ji,jj,jl) * zswitch(ji,jj) 514 t_su (ji,jj,jl) = t_su(ji,jj,jl) * zswitch(ji,jj) + t_bo(ji,jj) * ( 1._wp - zswitch(ji,jj) ) 515 oa_i (ji,jj,jl) = oa_i(ji,jj,jl) * zswitch(ji,jj) 516 sv_i (ji,jj,jl) = sv_i(ji,jj,jl) * zswitch(ji,jj) 517 ! 518 h_i (ji,jj,jl) = h_i (ji,jj,jl) * zswitch(ji,jj) 519 h_s (ji,jj,jl) = h_s (ji,jj,jl) * zswitch(ji,jj) 520 ! 521 a_ip (ji,jj,jl) = a_ip (ji,jj,jl) * zswitch(ji,jj) 522 v_ip (ji,jj,jl) = v_ip (ji,jj,jl) * zswitch(ji,jj) 523 ! 524 END_2D 538 525 ! 539 526 END DO … … 587 574 ! zap ice energy and send it to the ocean 588 575 !---------------------------------------- 589 DO jk = 1, nlay_i 590 DO jj = 1 , jpj 591 DO ji = 1 , jpi 592 IF( pe_i(ji,jj,jk,jl) < 0._wp .OR. pa_i(ji,jj,jl) <= 0._wp ) THEN 593 hfx_res(ji,jj) = hfx_res(ji,jj) - pe_i(ji,jj,jk,jl) * z1_dt ! W.m-2 >0 594 pe_i(ji,jj,jk,jl) = 0._wp 595 ENDIF 596 END DO 597 END DO 598 END DO 599 ! 600 DO jk = 1, nlay_s 601 DO jj = 1 , jpj 602 DO ji = 1 , jpi 603 IF( pe_s(ji,jj,jk,jl) < 0._wp .OR. pa_i(ji,jj,jl) <= 0._wp ) THEN 604 hfx_res(ji,jj) = hfx_res(ji,jj) - pe_s(ji,jj,jk,jl) * z1_dt ! W.m-2 <0 605 pe_s(ji,jj,jk,jl) = 0._wp 606 ENDIF 607 END DO 608 END DO 609 END DO 576 DO_3D_11_11( 1, nlay_i ) 577 IF( pe_i(ji,jj,jk,jl) < 0._wp .OR. pa_i(ji,jj,jl) <= 0._wp ) THEN 578 hfx_res(ji,jj) = hfx_res(ji,jj) - pe_i(ji,jj,jk,jl) * z1_dt ! W.m-2 >0 579 pe_i(ji,jj,jk,jl) = 0._wp 580 ENDIF 581 END_3D 582 ! 583 DO_3D_11_11( 1, nlay_s ) 584 IF( pe_s(ji,jj,jk,jl) < 0._wp .OR. pa_i(ji,jj,jl) <= 0._wp ) THEN 585 hfx_res(ji,jj) = hfx_res(ji,jj) - pe_s(ji,jj,jk,jl) * z1_dt ! W.m-2 <0 586 pe_s(ji,jj,jk,jl) = 0._wp 587 ENDIF 588 END_3D 610 589 ! 611 590 !----------------------------------------------------- 612 591 ! zap ice and snow volume, add water and salt to ocean 613 592 !----------------------------------------------------- 614 DO jj = 1 , jpj 615 DO ji = 1 , jpi 616 IF( pv_i(ji,jj,jl) < 0._wp .OR. pa_i(ji,jj,jl) <= 0._wp ) THEN 617 wfx_res(ji,jj) = wfx_res(ji,jj) + pv_i (ji,jj,jl) * rhoi * z1_dt 618 pv_i (ji,jj,jl) = 0._wp 619 ENDIF 620 IF( pv_s(ji,jj,jl) < 0._wp .OR. pa_i(ji,jj,jl) <= 0._wp ) THEN 621 wfx_res(ji,jj) = wfx_res(ji,jj) + pv_s (ji,jj,jl) * rhos * z1_dt 622 pv_s (ji,jj,jl) = 0._wp 623 ENDIF 624 IF( psv_i(ji,jj,jl) < 0._wp .OR. pa_i(ji,jj,jl) <= 0._wp .OR. pv_i(ji,jj,jl) <= 0._wp ) THEN 625 sfx_res(ji,jj) = sfx_res(ji,jj) + psv_i(ji,jj,jl) * rhoi * z1_dt 626 psv_i (ji,jj,jl) = 0._wp 627 ENDIF 628 END DO 629 END DO 593 DO_2D_11_11 594 IF( pv_i(ji,jj,jl) < 0._wp .OR. pa_i(ji,jj,jl) <= 0._wp ) THEN 595 wfx_res(ji,jj) = wfx_res(ji,jj) + pv_i (ji,jj,jl) * rhoi * z1_dt 596 pv_i (ji,jj,jl) = 0._wp 597 ENDIF 598 IF( pv_s(ji,jj,jl) < 0._wp .OR. pa_i(ji,jj,jl) <= 0._wp ) THEN 599 wfx_res(ji,jj) = wfx_res(ji,jj) + pv_s (ji,jj,jl) * rhos * z1_dt 600 pv_s (ji,jj,jl) = 0._wp 601 ENDIF 602 IF( psv_i(ji,jj,jl) < 0._wp .OR. pa_i(ji,jj,jl) <= 0._wp .OR. pv_i(ji,jj,jl) <= 0._wp ) THEN 603 sfx_res(ji,jj) = sfx_res(ji,jj) + psv_i(ji,jj,jl) * rhoi * z1_dt 604 psv_i (ji,jj,jl) = 0._wp 605 ENDIF 606 END_2D 630 607 ! 631 608 END DO -
NEMO/trunk/src/ICE/icewri.F90
r11575 r12377 35 35 PUBLIC ice_wri_state ! called by dia_wri_state 36 36 37 !! * Substitutions 38 # include "do_loop_substitute.h90" 37 39 !!---------------------------------------------------------------------- 38 40 !! NEMO/ICE 4.0 , NEMO Consortium (2018) … … 69 71 70 72 ! tresholds for outputs 71 DO jj = 1, jpj 72 DO ji = 1, jpi 73 zmsk00(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi06 ) ) ! 1 if ice , 0 if no ice 74 zmsk05(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - 0.05_wp ) ) ! 1 if 5% ice , 0 if less 75 zmsk15(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - 0.15_wp ) ) ! 1 if 15% ice, 0 if less 76 zmsksn(ji,jj) = MAX( 0._wp , SIGN( 1._wp , vt_s(ji,jj) - epsi06 ) ) ! 1 if snow , 0 if no snow 77 END DO 78 END DO 73 DO_2D_11_11 74 zmsk00(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi06 ) ) ! 1 if ice , 0 if no ice 75 zmsk05(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - 0.05_wp ) ) ! 1 if 5% ice , 0 if less 76 zmsk15(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - 0.15_wp ) ) ! 1 if 15% ice, 0 if less 77 zmsksn(ji,jj) = MAX( 0._wp , SIGN( 1._wp , vt_s(ji,jj) - epsi06 ) ) ! 1 if snow , 0 if no snow 78 END_2D 79 79 DO jl = 1, jpl 80 DO jj = 1, jpj 81 DO ji = 1, jpi 82 zmsk00l(ji,jj,jl) = MAX( 0._wp , SIGN( 1._wp , a_i(ji,jj,jl) - epsi06 ) ) 83 zmsksnl(ji,jj,jl) = MAX( 0._wp , SIGN( 1._wp , v_s(ji,jj,jl) - epsi06 ) ) 84 END DO 85 END DO 80 DO_2D_11_11 81 zmsk00l(ji,jj,jl) = MAX( 0._wp , SIGN( 1._wp , a_i(ji,jj,jl) - epsi06 ) ) 82 zmsksnl(ji,jj,jl) = MAX( 0._wp , SIGN( 1._wp , v_s(ji,jj,jl) - epsi06 ) ) 83 END_2D 86 84 END DO 87 85 … … 132 130 ! 133 131 IF( iom_use('icevel') .OR. iom_use('fasticepres') ) THEN ! module of ice velocity 134 DO jj = 2 , jpjm1 135 DO ji = 2 , jpim1 136 z2da = u_ice(ji,jj) + u_ice(ji-1,jj) 137 z2db = v_ice(ji,jj) + v_ice(ji,jj-1) 138 z2d(ji,jj) = 0.5_wp * SQRT( z2da * z2da + z2db * z2db ) 139 END DO 140 END DO 132 DO_2D_00_00 133 z2da = u_ice(ji,jj) + u_ice(ji-1,jj) 134 z2db = v_ice(ji,jj) + v_ice(ji,jj-1) 135 z2d(ji,jj) = 0.5_wp * SQRT( z2da * z2da + z2db * z2db ) 136 END_2D 141 137 CALL lbc_lnk( 'icewri', z2d, 'T', 1. ) 142 138 CALL iom_put( 'icevel', z2d )
Note: See TracChangeset
for help on using the changeset viewer.