New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 10419 for NEMO/branches/2018/dev_r10164_HPC09_ESIWACE_PREP_MERGE/src/ICE/icedyn_rhg_evp.F90 – NEMO

Ignore:
Timestamp:
2018-12-19T20:46:30+01:00 (5 years ago)
Author:
smasson
Message:

dev_r10164_HPC09_ESIWACE_PREP_MERGE: merge with trunk@10418, see #2133

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2018/dev_r10164_HPC09_ESIWACE_PREP_MERGE/src/ICE/icedyn_rhg_evp.F90

    r10402 r10419  
    119119      REAL(wp) ::   ecc2, z1_ecc2                                       ! square of yield ellipse eccenticity 
    120120      REAL(wp) ::   zalph1, z1_alph1, zalph2, z1_alph2                  ! alpha coef from Bouillon 2009 or Kimmritz 2017 
    121       REAL(wp) ::   zm1, zm2, zm3, zmassU, zmassV                       ! ice/snow mass 
     121      REAL(wp) ::   zm1, zm2, zm3, zmassU, zmassV, zvU, zvV             ! ice/snow mass and volume 
    122122      REAL(wp) ::   zdelta, zp_delf, zds2, zdt, zdt2, zdiv, zdiv2       ! temporary scalars 
    123123      REAL(wp) ::   zTauO, zTauB, zTauE, zvel                           ! temporary scalars 
     124      REAL(wp) ::   zkt                                                 ! isotropic tensile strength for landfast ice 
     125      REAL(wp) ::   zvCr                                                ! critical ice volume above which ice is landfast 
    124126      ! 
    125127      REAL(wp) ::   zresm                                               ! Maximal error on ice velocity 
     
    137139      REAL(wp), DIMENSION(jpi,jpj) ::   zmf                             ! coriolis parameter at T points 
    138140      REAL(wp), DIMENSION(jpi,jpj) ::   zTauU_ia , ztauV_ia             ! ice-atm. stress at U-V points 
     141      REAL(wp), DIMENSION(jpi,jpj) ::   zTauU_ib , ztauV_ib             ! ice-bottom stress at U-V points (landfast param) 
    139142      REAL(wp), DIMENSION(jpi,jpj) ::   zspgU , zspgV                   ! surface pressure gradient at U/V points 
    140143      REAL(wp), DIMENSION(jpi,jpj) ::   v_oceU, u_oceV, v_iceU, u_iceV  ! ocean/ice u/v component on V/U points                            
     
    144147      REAL(wp), DIMENSION(jpi,jpj) ::   zs1, zs2, zs12                  ! stress tensor components 
    145148!!$      REAL(wp), DIMENSION(jpi,jpj) ::   zu_ice, zv_ice, zresr           ! check convergence 
    146       REAL(wp), DIMENSION(jpi,jpj) ::   zssh_lead_m                     ! array used for the calculation of ice surface slope: 
     149      REAL(wp), DIMENSION(jpi,jpj) ::   zsshdyn                         ! array used for the calculation of ice surface slope: 
    147150      !                                                                 !    ocean surface (ssh_m) if ice is not embedded 
    148       !                                                                 !    ice top surface if ice is embedded    
     151      !                                                                 !    ice bottom surface if ice is embedded    
    149152      REAL(wp), DIMENSION(jpi,jpj) ::   zCorx, zCory                    ! Coriolis stress array 
    150153      REAL(wp), DIMENSION(jpi,jpj) ::   ztaux_oi, ztauy_oi              ! Ocean-to-ice stress array 
     
    256259         END DO 
    257260      END DO 
    258              
     261 
     262      ! landfast param from Lemieux(2016): add isotropic tensile strength (following Konig Beatty and Holland, 2010) 
     263      IF( ln_landfast_L16 .OR. ln_landfast_home ) THEN   ;   zkt = rn_tensile 
     264      ELSE                                               ;   zkt = 0._wp 
     265      ENDIF 
    259266      ! 
    260267      !------------------------------------------------------------------------------! 
    261268      ! 2) Wind / ocean stress, mass terms, coriolis terms 
    262269      !------------------------------------------------------------------------------! 
    263  
    264       !== embedded sea ice: compute representative ice top surface      ==! 
    265       !== non-embedded sea ice: use ocean surface for slope calculation ==! 
    266       zssh_lead_m(:,:) = ice_var_sshdyn( ssh_m, snwice_mass, snwice_mass_b) 
     270      ! sea surface height 
     271      !    embedded sea ice: compute representative ice top surface 
     272      !    non-embedded sea ice: use ocean surface for slope calculation 
     273      zsshdyn(:,:) = ice_var_sshdyn( ssh_m, snwice_mass, snwice_mass_b) 
    267274 
    268275      DO jj = 2, jpjm1 
     
    302309 
    303310            ! Surface pressure gradient (- m*g*GRAD(ssh)) at U-V points 
    304             zspgU(ji,jj)    = - zmassU * grav * ( zssh_lead_m(ji+1,jj) - zssh_lead_m(ji,jj) ) * r1_e1u(ji,jj) 
    305             zspgV(ji,jj)    = - zmassV * grav * ( zssh_lead_m(ji,jj+1) - zssh_lead_m(ji,jj) ) * r1_e2v(ji,jj) 
     311            zspgU(ji,jj)    = - zmassU * grav * ( zsshdyn(ji+1,jj) - zsshdyn(ji,jj) ) * r1_e1u(ji,jj) 
     312            zspgV(ji,jj)    = - zmassV * grav * ( zsshdyn(ji,jj+1) - zsshdyn(ji,jj) ) * r1_e2v(ji,jj) 
    306313 
    307314            ! masks 
     
    317324      CALL lbc_lnk_multi( 'icedyn_rhg_evp', zmf, 'T', 1., zdt_m, 'T', 1. ) 
    318325      ! 
     326      !                                  !== Landfast ice parameterization ==! 
     327      ! 
     328      IF( ln_landfast_L16 ) THEN         !-- Lemieux 2016 
     329         DO jj = 2, jpjm1 
     330            DO ji = fs_2, fs_jpim1 
     331               ! ice thickness at U-V points 
     332               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) 
     333               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) 
     334               ! ice-bottom stress at U points 
     335               zvCr = zaU(ji,jj) * rn_depfra * hu_n(ji,jj) 
     336               zTauU_ib(ji,jj)   = rn_icebfr * MAX( 0._wp, zvU - zvCr ) * EXP( -rn_crhg * ( 1._wp - zaU(ji,jj) ) ) 
     337               ! ice-bottom stress at V points 
     338               zvCr = zaV(ji,jj) * rn_depfra * hv_n(ji,jj) 
     339               zTauV_ib(ji,jj)   = rn_icebfr * MAX( 0._wp, zvV - zvCr ) * EXP( -rn_crhg * ( 1._wp - zaV(ji,jj) ) ) 
     340               ! ice_bottom stress at T points 
     341               zvCr = at_i(ji,jj) * rn_depfra * ht_n(ji,jj) 
     342               tau_icebfr(ji,jj) = rn_icebfr * MAX( 0._wp, vt_i(ji,jj) - zvCr ) * EXP( -rn_crhg * ( 1._wp - at_i(ji,jj) ) ) 
     343            END DO 
     344         END DO 
     345         CALL lbc_lnk( 'icedyn_rhg_evp', tau_icebfr(:,:), 'T', 1. ) 
     346         ! 
     347      ELSEIF( ln_landfast_home ) THEN          !-- Home made 
     348         DO jj = 2, jpjm1 
     349            DO ji = fs_2, fs_jpim1 
     350               zTauU_ib(ji,jj) = tau_icebfr(ji,jj) 
     351               zTauV_ib(ji,jj) = tau_icebfr(ji,jj) 
     352            END DO 
     353         END DO 
     354         ! 
     355      ELSE                                     !-- no landfast 
     356         DO jj = 2, jpjm1 
     357            DO ji = fs_2, fs_jpim1 
     358               zTauU_ib(ji,jj) = 0._wp 
     359               zTauV_ib(ji,jj) = 0._wp 
     360            END DO 
     361         END DO 
     362      ENDIF 
     363      IF( iom_use('tau_icebfr') )   CALL iom_put( 'tau_icebfr', tau_icebfr(:,:) ) 
     364 
    319365      !------------------------------------------------------------------------------! 
    320366      ! 3) Solution of the momentum equation, iterative procedure 
     
    382428               ENDIF 
    383429                
    384                ! stress at T points 
    385                zs1(ji,jj) = ( zs1(ji,jj) * zalph1 + zp_delt(ji,jj) * ( zdiv - zdelta ) ) * z1_alph1 
    386                zs2(ji,jj) = ( zs2(ji,jj) * zalph2 + zp_delt(ji,jj) * ( zdt * z1_ecc2 ) ) * z1_alph2 
     430               ! stress at T points (zkt/=0 if landfast) 
     431               zs1(ji,jj) = ( zs1(ji,jj) * zalph1 + zp_delt(ji,jj) * ( zdiv * (1._wp + zkt) - zdelta * (1._wp - zkt) ) ) * z1_alph1 
     432               zs2(ji,jj) = ( zs2(ji,jj) * zalph2 + zp_delt(ji,jj) * ( zdt * z1_ecc2 * (1._wp + zkt) ) ) * z1_alph2 
    387433              
    388434            END DO 
     
    403449               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) ) 
    404450                
    405                ! stress at F points 
    406                zs12(ji,jj)= ( zs12(ji,jj) * zalph2 + zp_delf * ( zds(ji,jj) * z1_ecc2 ) * 0.5_wp ) * z1_alph2 
     451               ! stress at F points (zkt/=0 if landfast) 
     452               zs12(ji,jj)= ( zs12(ji,jj) * zalph2 + zp_delf * ( zds(ji,jj) * z1_ecc2 * (1._wp + zkt) ) * 0.5_wp ) * z1_alph2 
    407453 
    408454            END DO 
     
    452498                  ! 
    453499                  !                 !--- tau_bottom/v_ice 
    454                   zvel  = MAX( zepsi, SQRT( v_ice(ji,jj) * v_ice(ji,jj) + u_iceV(ji,jj) * u_iceV(ji,jj) ) ) 
    455                   zTauB = - tau_icebfr(ji,jj) / zvel 
     500                  zvel  = 5.e-05_wp + SQRT( v_ice(ji,jj) * v_ice(ji,jj) + u_iceV(ji,jj) * u_iceV(ji,jj) ) 
     501                  zTauB = - zTauV_ib(ji,jj) / zvel 
    456502                  ! 
    457503                  !                 !--- Coriolis at V-points (energy conserving formulation) 
     
    464510                  ! 
    465511                  !                 !--- landfast switch => 0 = static friction ; 1 = sliding friction 
    466                   rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, ztauE - tau_icebfr(ji,jj) ) - SIGN( 1._wp, zTauE ) ) ) 
     512                  rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, ztauE - zTauV_ib(ji,jj) ) - SIGN( 1._wp, zTauE ) ) ) 
    467513                  ! 
    468514                  IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 
     
    500546                  ! 
    501547                  !                 !--- tau_bottom/u_ice 
    502                   zvel  = MAX( zepsi, SQRT( v_iceU(ji,jj) * v_iceU(ji,jj) + u_ice(ji,jj) * u_ice(ji,jj) ) ) 
    503                   zTauB = - tau_icebfr(ji,jj) / zvel 
     548                  zvel  = 5.e-05_wp + SQRT( v_iceU(ji,jj) * v_iceU(ji,jj) + u_ice(ji,jj) * u_ice(ji,jj) ) 
     549                  zTauB = - zTauU_ib(ji,jj) / zvel 
    504550                  ! 
    505551                  !                 !--- Coriolis at U-points (energy conserving formulation) 
     
    512558                  ! 
    513559                  !                 !--- landfast switch => 0 = static friction ; 1 = sliding friction 
    514                   rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, ztauE - tau_icebfr(ji,jj) ) - SIGN( 1._wp, zTauE ) ) ) 
     560                  rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, ztauE - zTauU_ib(ji,jj) ) - SIGN( 1._wp, zTauE ) ) ) 
    515561                  ! 
    516562                  IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 
     
    550596                  ! 
    551597                  !                 !--- tau_bottom/u_ice 
    552                   zvel  = MAX( zepsi, SQRT( v_iceU(ji,jj) * v_iceU(ji,jj) + u_ice(ji,jj) * u_ice(ji,jj) ) ) 
    553                   zTauB = - tau_icebfr(ji,jj) / zvel 
     598                  zvel  = 5.e-05_wp + SQRT( v_iceU(ji,jj) * v_iceU(ji,jj) + u_ice(ji,jj) * u_ice(ji,jj) ) 
     599                  zTauB = - zTauU_ib(ji,jj) / zvel 
    554600                  ! 
    555601                  !                 !--- Coriolis at U-points (energy conserving formulation) 
     
    562608                  ! 
    563609                  !                 !--- landfast switch => 0 = static friction ; 1 = sliding friction 
    564                   rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, ztauE - tau_icebfr(ji,jj) ) - SIGN( 1._wp, zTauE ) ) ) 
     610                  rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, ztauE - zTauU_ib(ji,jj) ) - SIGN( 1._wp, zTauE ) ) ) 
    565611                  ! 
    566612                  IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 
     
    598644                  ! 
    599645                  !                 !--- tau_bottom/v_ice 
    600                   zvel  = MAX( zepsi, SQRT( v_ice(ji,jj) * v_ice(ji,jj) + u_iceV(ji,jj) * u_iceV(ji,jj) ) ) 
    601                   ztauB = - tau_icebfr(ji,jj) / zvel 
     646                  zvel  = 5.e-05_wp + SQRT( v_ice(ji,jj) * v_ice(ji,jj) + u_iceV(ji,jj) * u_iceV(ji,jj) ) 
     647                  zTauB = - zTauV_ib(ji,jj) / zvel 
    602648                  ! 
    603649                  !                 !--- Coriolis at v-points (energy conserving formulation) 
     
    610656                  ! 
    611657                  !                 !--- landfast switch => 0 = static friction ; 1 = sliding friction 
    612                   rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zTauE - tau_icebfr(ji,jj) ) - SIGN( 1._wp, zTauE ) ) ) 
     658                  rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zTauE - zTauV_ib(ji,jj) ) - SIGN( 1._wp, zTauE ) ) ) 
    613659                  ! 
    614660                  IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 
Note: See TracChangeset for help on using the changeset viewer.