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 8813 for branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/LIM_SRC_3/icedyn_rhg_evp.F90 – NEMO

Ignore:
Timestamp:
2017-11-24T17:56:51+01:00 (6 years ago)
Author:
gm
Message:

#1911 (ENHANCE-09): PART I.3 - phasing with updated branch dev_r8183_ICEMODEL revision 8787

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/LIM_SRC_3/icedyn_rhg_evp.F90

    r8637 r8813  
    1616   !!   'key_lim3'                                       ESIM sea-ice model 
    1717   !!---------------------------------------------------------------------- 
    18    !!   ice_dyn_rhg_evp       : computes ice velocities from EVP rheology 
     18   !!   ice_dyn_rhg_evp : computes ice velocities from EVP rheology 
     19   !!   rhg_evp_rst     : read/write EVP fields in ice restart 
    1920   !!---------------------------------------------------------------------- 
    2021   USE phycst         ! Physical constant 
     
    2425   USE ice            ! sea-ice: ice variables 
    2526   USE icedyn_rdgrft  ! sea-ice: ice strength 
     27   USE bdy_oce , ONLY : ln_bdy  
     28   USE bdyice  
     29#if defined key_agrif 
     30   USE agrif_lim3_interp 
     31#endif 
    2632   ! 
    2733   USE in_out_manager ! I/O manager 
     
    3137   USE lbclnk         ! lateral boundary conditions (or mpp links) 
    3238   USE prtctl         ! Print control 
    33    ! 
    34 #if defined key_agrif 
    35    USE agrif_lim3_interp 
    36 #endif 
    37    USE bdy_oce   , ONLY: ln_bdy  
    38    USE bdyice  
    3939 
    4040   IMPLICIT NONE 
     
    5353CONTAINS 
    5454 
    55    SUBROUTINE ice_dyn_rhg_evp( kt, pstress1_i, pstress2_i, pstress12_i, u_ice, v_ice, pshear_i, pdivu_i, pdelta_i ) 
     55   SUBROUTINE ice_dyn_rhg_evp( kt, pstress1_i, pstress2_i, pstress12_i, pshear_i, pdivu_i, pdelta_i ) 
    5656      !!------------------------------------------------------------------- 
    5757      !!                 ***  SUBROUTINE ice_dyn_rhg_evp  *** 
    58       !!                          EVP-C-grid 
     58      !!                             EVP-C-grid 
    5959      !! 
    6060      !! ** purpose : determines sea ice drift from wind stress, ice-ocean 
     
    9595      !!              5) Diagnostics including charge ellipse 
    9696      !! 
    97       !! ** Notes   : There is the possibility to use mEVP from Bouillon 2013 
    98       !!              (by uncommenting some lines in part 3 and changing alpha and beta parameters) 
    99       !!              but this solution appears very unstable (see Kimmritz et al 2016) 
     97      !! ** Notes   : There is the possibility to use aEVP from the nice work of Kimmritz et al. (2016 & 2017) 
     98      !!              by setting up ln_aEVP=T (i.e. changing alpha and beta parameters). 
     99      !!              This is an upgraded version of mEVP from Bouillon et al. 2013 
     100      !!              (i.e. more stable and better convergence) 
    100101      !! 
    101102      !! References : Hunke and Dukowicz, JPO97 
    102103      !!              Bouillon et al., Ocean Modelling 2009 
    103104      !!              Bouillon et al., Ocean Modelling 2013 
     105      !!              Kimmritz et al., Ocean Modelling 2016 & 2017 
    104106      !!------------------------------------------------------------------- 
    105       INTEGER, INTENT(in) ::   kt      ! time step 
    106       REAL(wp), DIMENSION(:,:), INTENT(inout) ::   pstress1_i, pstress2_i, pstress12_i 
    107       REAL(wp), DIMENSION(:,:), INTENT(inout) ::   u_ice, v_ice  
    108       REAL(wp), DIMENSION(:,:), INTENT(  out) ::   pshear_i, pdivu_i, pdelta_i  
     107      INTEGER                 , INTENT(in   ) ::   kt                                    ! time step 
     108      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   pstress1_i, pstress2_i, pstress12_i   ! 
     109      REAL(wp), DIMENSION(:,:), INTENT(  out) ::   pshear_i  , pdivu_i   , pdelta_i      ! 
    109110      !! 
    110111      INTEGER ::   ji, jj       ! dummy loop indices 
    111112      INTEGER ::   jter         ! local integers 
    112  
     113      ! 
    113114      REAL(wp) ::   zrhoco                                                   ! rau0 * rn_cio 
    114115      REAL(wp) ::   zdtevp, z1_dtevp                                         ! time step for subcycling 
    115116      REAL(wp) ::   ecc2, z1_ecc2                                            ! square of yield ellipse eccenticity 
    116       REAL(wp) ::   zbeta, zalph1, z1_alph1, zalph2, z1_alph2                ! alpha and beta from Bouillon 2009 and 2013 
     117      REAL(wp) ::   zalph1, z1_alph1, zalph2, z1_alph2                       ! alpha coef from Bouillon 2009 or Kimmritz 2017 
    117118      REAL(wp) ::   zm1, zm2, zm3, zmassU, zmassV                            ! ice/snow mass 
    118119      REAL(wp) ::   zdelta, zp_delf, zds2, zdt, zdt2, zdiv, zdiv2            ! temporary scalars 
    119120      REAL(wp) ::   zTauO, zTauB, zTauE, zvel                                ! temporary scalars 
    120  
     121      ! 
    121122      REAL(wp) ::   zresm                                                    ! Maximal error on ice velocity 
    122123      REAL(wp) ::   zintb, zintn                                             ! dummy argument 
    123124      REAL(wp) ::   zfac_x, zfac_y 
    124125      REAL(wp) ::   zshear, zdum1, zdum2 
    125        
     126      ! 
    126127      REAL(wp), DIMENSION(jpi,jpj) ::   z1_e1t0, z1_e2t0                ! scale factors 
    127128      REAL(wp), DIMENSION(jpi,jpj) ::   zp_delt                         ! P/delta at T points 
    128       ! 
     129      REAL(wp), DIMENSION(jpi,jpj) ::   zbeta                           ! beta coef from Kimmritz 2017 
     130      ! 
     131      REAL(wp), DIMENSION(jpi,jpj) ::   zdt_m                           ! (dt / ice-snow_mass) on T points 
    129132      REAL(wp), DIMENSION(jpi,jpj) ::   zaU   , zaV                     ! ice fraction on U/V points 
    130       REAL(wp), DIMENSION(jpi,jpj) ::   zmU_t, zmV_t                    ! ice/snow mass/dt on U/V points 
     133      REAL(wp), DIMENSION(jpi,jpj) ::   zmU_t, zmV_t                    ! (ice-snow_mass / dt) on U/V points 
    131134      REAL(wp), DIMENSION(jpi,jpj) ::   zmf                             ! coriolis parameter at T points 
    132135      REAL(wp), DIMENSION(jpi,jpj) ::   zTauU_ia , ztauV_ia             ! ice-atm. stress at U-V points 
     
    134137      REAL(wp), DIMENSION(jpi,jpj) ::   v_oceU, u_oceV, v_iceU, u_iceV  ! ocean/ice u/v component on V/U points                            
    135138      REAL(wp), DIMENSION(jpi,jpj) ::   zfU   , zfV                     ! internal stresses 
    136        
     139      ! 
    137140      REAL(wp), DIMENSION(jpi,jpj) ::   zds                             ! shear 
    138141      REAL(wp), DIMENSION(jpi,jpj) ::   zs1, zs2, zs12                  ! stress tensor components 
    139142      REAL(wp), DIMENSION(jpi,jpj) ::   zu_ice, zv_ice, zresr           ! check convergence 
    140143      REAL(wp), DIMENSION(jpi,jpj) ::   zpice                           ! array used for the calculation of ice surface slope: 
    141                                                                              !   ocean surface (ssh_m) if ice is not embedded 
    142                                                                              !   ice top surface if ice is embedded    
     144      !                                                                      !   ocean surface (ssh_m) if ice is not embedded 
     145      !                                                                       !   ice top surface if ice is embedded    
    143146      REAL(wp), DIMENSION(jpi,jpj) ::   zCorx, zCory                    ! Coriolis stress array 
    144147      REAL(wp), DIMENSION(jpi,jpj) ::   ztaux_oi, ztauy_oi              ! Ocean-to-ice stress array 
    145  
     148      ! 
    146149      REAL(wp), DIMENSION(jpi,jpj) ::   zswitchU, zswitchV              ! dummy arrays 
    147150      REAL(wp), DIMENSION(jpi,jpj) ::   zmaskU, zmaskV                  ! mask for ice presence 
     
    179182#endif 
    180183      ! 
     184!!gm for Clem:  OPTIMIZATION:  I think zfmask can be computed one for all at the initialization.... 
    181185      !------------------------------------------------------------------------------! 
    182186      ! 0) mask at F points for the ice 
     
    231235 
    232236      ! alpha parameters (Bouillon 2009) 
    233       zalph1 = ( 2._wp * rn_relast * rdt_ice ) * z1_dtevp 
    234       zalph2 = zalph1 * z1_ecc2 
    235  
    236       ! alpha and beta parameters (Bouillon 2013) 
    237       !!zalph1 = 40. 
    238       !!zalph2 = 40. 
    239       !!zbeta  = 3000. 
    240       !!zbeta = REAL( nn_nevp )   ! close to classical EVP of Hunke (2001) 
    241  
    242       z1_alph1 = 1._wp / ( zalph1 + 1._wp ) 
    243       z1_alph2 = 1._wp / ( zalph2 + 1._wp ) 
    244  
     237      IF( .NOT. ln_aEVP ) THEN 
     238         zalph1 = ( 2._wp * rn_relast * rdt_ice ) * z1_dtevp 
     239         zalph2 = zalph1 * z1_ecc2 
     240 
     241         z1_alph1 = 1._wp / ( zalph1 + 1._wp ) 
     242         z1_alph2 = 1._wp / ( zalph2 + 1._wp ) 
     243      ENDIF 
     244          
    245245      ! Initialise stress tensor  
    246246      zs1 (:,:) = pstress1_i (:,:)  
     
    266266      IF( ln_ice_embd ) THEN             !== embedded sea ice: compute representative ice top surface ==! 
    267267         !                                             
    268          ! average interpolation coeff as used in dynspg = (1/nn_fsbc) * {SUM[n/nn_fsbc], n=0,nn_fsbc-1} 
    269          !                                               = (1/nn_fsbc)^2 * {SUM[n], n=0,nn_fsbc-1} 
     268         ! average interpolation coeff as used in dynspg = (1/nn_fsbc)   * {SUM[n/nn_fsbc], n=0,nn_fsbc-1} 
     269         !                                               = (1/nn_fsbc)^2 * {SUM[n]        , n=0,nn_fsbc-1} 
    270270         zintn = REAL( nn_fsbc - 1 ) / REAL( nn_fsbc ) * 0.5_wp      
    271271         ! 
    272          ! average interpolation coeff as used in dynspg = (1/nn_fsbc) * {SUM[1-n/nn_fsbc], n=0,nn_fsbc-1} 
     272         ! average interpolation coeff as used in dynspg = (1/nn_fsbc)   *    {SUM[1-n/nn_fsbc], n=0,nn_fsbc-1} 
    273273         !                                               = (1/nn_fsbc)^2 * (nn_fsbc^2 - {SUM[n], n=0,nn_fsbc-1}) 
    274274         zintb = REAL( nn_fsbc + 1 ) / REAL( nn_fsbc ) * 0.5_wp 
     
    304304            zmf(ji,jj)      = zm1 * ff_t(ji,jj) 
    305305 
     306            ! dt/m at T points (for alpha and beta coefficients) 
     307            zdt_m(ji,jj)    = zdtevp / MAX( zm1, zmmin ) 
     308             
    306309            ! m/dt 
    307310            zmU_t(ji,jj)    = zmassU * z1_dtevp 
    308311            zmV_t(ji,jj)    = zmassV * z1_dtevp 
    309  
     312             
    310313            ! Drag ice-atm. 
    311314            zTauU_ia(ji,jj) = zaU(ji,jj) * utau_ice(ji,jj) 
     
    326329         END DO 
    327330      END DO 
    328       CALL lbc_lnk( zmf, 'T', 1. ) 
     331      CALL lbc_lnk_multi( zmf, 'T', 1., zdt_m, 'T', 1. ) 
    329332      ! 
    330333      !------------------------------------------------------------------------------! 
     
    380383               ! P/delta at T points 
    381384               zp_delt(ji,jj) = strength(ji,jj) / ( zdelta + rn_creepl ) 
     385 
     386               ! alpha & beta for aEVP 
     387               !   gamma = 0.5*P/(delta+creepl) * (c*pi)**2/Area * dt/m 
     388               !   alpha = beta = sqrt(4*gamma) 
     389               IF( ln_aEVP ) THEN 
     390                  zalph1   = MAX( 50._wp, rpi * SQRT( 0.5_wp * zp_delt(ji,jj) * r1_e1e2t(ji,jj) * zdt_m(ji,jj) ) ) 
     391                  z1_alph1 = 1._wp / ( zalph1 + 1._wp ) 
     392                  zalph2   = zalph1 
     393                  z1_alph2 = z1_alph1 
     394               ENDIF 
    382395                
    383396               ! stress at T points 
     
    392405            DO ji = 1, jpim1 
    393406 
     407               ! alpha & beta for aEVP 
     408               IF( ln_aEVP ) THEN 
     409                  zalph2   = MAX( 50._wp, rpi * SQRT( 0.5_wp * zp_delt(ji,jj) * r1_e1e2t(ji,jj) * zdt_m(ji,jj) ) ) 
     410                  z1_alph2 = 1._wp / ( zalph2 + 1._wp ) 
     411                  zbeta(ji,jj) = zalph2 
     412               ENDIF 
     413                
    394414               ! P/delta at F points 
    395415               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) ) 
     
    411431                  &                    ) * 2._wp * r1_e1u(ji,jj)                                                              & 
    412432                  &                  ) * r1_e1e2u(ji,jj) 
    413                   ! 
    414                   !                !--- V points 
     433               ! 
     434               !                !--- V points 
    415435               zfV(ji,jj) = 0.5_wp * ( ( zs1(ji,jj+1) - zs1(ji,jj) ) * e1v(ji,jj)                                             & 
    416436                  &                  - ( zs2(ji,jj+1) * e1t(ji,jj+1) * e1t(ji,jj+1) - zs2(ji,jj) * e1t(ji,jj) * e1t(ji,jj)    & 
     
    419439                  &                    ) * 2._wp * r1_e2v(ji,jj)                                                              & 
    420440                  &                  ) * r1_e1e2v(ji,jj) 
    421                   ! 
    422                   !                !--- u_ice at V point 
     441               ! 
     442               !                !--- u_ice at V point 
    423443               u_iceV(ji,jj) = 0.5_wp * ( ( u_ice(ji,jj  ) + u_ice(ji-1,jj  ) ) * e2t(ji,jj+1)     & 
    424444                  &                     + ( u_ice(ji,jj+1) + u_ice(ji-1,jj+1) ) * e2t(ji,jj  ) ) * z1_e2t0(ji,jj) * vmask(ji,jj,1) 
    425                   ! 
    426                   !                !--- v_ice at U point 
     445               ! 
     446               !                !--- v_ice at U point 
    427447               v_iceU(ji,jj) = 0.5_wp * ( ( v_ice(ji  ,jj) + v_ice(ji  ,jj-1) ) * e1t(ji+1,jj)     & 
    428448                  &                     + ( v_ice(ji+1,jj) + v_ice(ji+1,jj-1) ) * e1t(ji  ,jj) ) * z1_e1t0(ji,jj) * umask(ji,jj,1) 
    429                ! 
    430449            END DO 
    431450         END DO 
    432451         ! 
    433452         ! --- Computation of ice velocity --- ! 
    434          !  Bouillon et al. 2013 (eq 47-48) => unstable unless alpha, beta are chosen wisely and large nn_nevp 
     453         !  Bouillon et al. 2013 (eq 47-48) => unstable unless alpha, beta vary as in Kimmritz 2016 & 2017 
    435454         !  Bouillon et al. 2009 (eq 34-35) => stable 
    436455         IF( MOD(jter,2) == 0 ) THEN ! even iterations 
     
    438457            DO jj = 2, jpjm1 
    439458               DO ji = fs_2, fs_jpim1 
    440                      !                 !--- tau_io/(v_oce - v_ice) 
     459                  !                 !--- tau_io/(v_oce - v_ice) 
    441460                  zTauO = zaV(ji,jj) * zrhoco * SQRT( ( v_ice (ji,jj) - v_oce (ji,jj) ) * ( v_ice (ji,jj) - v_oce (ji,jj) )  & 
    442461                     &                              + ( u_iceV(ji,jj) - u_oceV(ji,jj) ) * ( u_iceV(ji,jj) - u_oceV(ji,jj) ) ) 
    443                      !                 !--- Ocean-to-Ice stress 
     462                  !                 !--- Ocean-to-Ice stress 
    444463                  ztauy_oi(ji,jj) = zTauO * ( v_oce(ji,jj) - v_ice(ji,jj) ) 
    445                      ! 
    446                      !                 !--- tau_bottom/v_ice 
     464                  ! 
     465                  !                 !--- tau_bottom/v_ice 
    447466                  zvel  = MAX( zepsi, SQRT( v_ice(ji,jj) * v_ice(ji,jj) + u_iceV(ji,jj) * u_iceV(ji,jj) ) ) 
    448467                  zTauB = - tau_icebfr(ji,jj) / zvel 
    449                      ! 
    450                      !                 !--- Coriolis at V-points (energy conserving formulation) 
     468                  ! 
     469                  !                 !--- Coriolis at V-points (energy conserving formulation) 
    451470                  zCory(ji,jj)  = - 0.25_wp * r1_e2v(ji,jj) *  & 
    452471                     &    ( zmf(ji,jj  ) * ( e2u(ji,jj  ) * u_ice(ji,jj  ) + e2u(ji-1,jj  ) * u_ice(ji-1,jj  ) )  & 
    453472                     &    + zmf(ji,jj+1) * ( e2u(ji,jj+1) * u_ice(ji,jj+1) + e2u(ji-1,jj+1) * u_ice(ji-1,jj+1) ) ) 
    454                      ! 
    455                      !                 !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io 
     473                  ! 
     474                  !                 !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io 
    456475                  zTauE = zfV(ji,jj) + zTauV_ia(ji,jj) + zCory(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj) 
    457                      ! 
    458                      !                 !--- landfast switch => 0 = static friction ; 1 = sliding friction 
     476                  ! 
     477                  !                 !--- landfast switch => 0 = static friction ; 1 = sliding friction 
    459478                  rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, ztauE - tau_icebfr(ji,jj) ) - SIGN( 1._wp, zTauE ) ) ) 
    460                      ! 
    461                      !                 !--- ice velocity using implicit formulation (cf Madec doc & Bouillon 2009) 
     479                  ! 
     480                  IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 
     481                  v_ice(ji,jj) = ( (          rswitch * ( zmV_t(ji,jj) * ( zbeta(ji,jj) * v_ice(ji,jj) + v_ice_b(ji,jj) )         & ! previous velocity 
     482                     &                                  + zTauE + zTauO * v_ice(ji,jj)                                            & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     483                     &                                  ) / MAX( zepsi, zmV_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 
     484                     &                 + ( 1._wp - rswitch ) * v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )           & ! static friction => slow decrease to v=0 
     485                     &             ) * zswitchV(ji,jj) + v_oce(ji,jj) * ( 1._wp - zswitchV(ji,jj) )                               & ! v_ice = v_oce if mass < zmmin 
     486                     &           ) * zmaskV(ji,jj) 
     487                  ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 
    462488                  v_ice(ji,jj) = ( (           rswitch   * ( zmV_t(ji,jj)  * v_ice(ji,jj)                             &  ! previous velocity 
    463489                     &                                     + zTauE + zTauO * v_ice(ji,jj)                             &  ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     
    466492                     &              ) * zswitchV(ji,jj) + v_oce(ji,jj) * ( 1._wp - zswitchV(ji,jj) )                  &  ! v_ice = v_oce if mass < zmmin 
    467493                     &            ) * zmaskV(ji,jj) 
    468                      ! 
    469                   ! Bouillon 2013 
    470                   !!v_ice(ji,jj) = ( zmV_t(ji,jj) * ( zbeta * v_ice(ji,jj) + v_ice_b(ji,jj) )                  & 
    471                   !!   &           + zfV(ji,jj) + zCory(ji,jj) + zTauV_ia(ji,jj) + zTauO * v_oce(ji,jj) + zspgV(ji,jj)  & 
    472                   !!   &           ) / MAX( zmV_t(ji,jj) * ( zbeta + 1._wp ) + zTauO - zTauB, zepsi ) * zswitchV(ji,jj) 
    473                   ! 
     494                  ENDIF 
    474495               END DO 
    475496            END DO 
     
    483504            ! 
    484505            DO jj = 2, jpjm1 
    485                DO ji = fs_2, fs_jpim1 
    486                                 
    487                   ! tau_io/(u_oce - u_ice) 
     506               DO ji = fs_2, fs_jpim1           
     507                  !                 !--- tau_io/(u_oce - u_ice) 
    488508                  zTauO = zaU(ji,jj) * zrhoco * SQRT( ( u_ice (ji,jj) - u_oce (ji,jj) ) * ( u_ice (ji,jj) - u_oce (ji,jj) )  & 
    489509                     &                              + ( v_iceU(ji,jj) - v_oceU(ji,jj) ) * ( v_iceU(ji,jj) - v_oceU(ji,jj) ) ) 
    490  
    491                   ! Ocean-to-Ice stress 
     510                  !                 !--- Ocean-to-Ice stress 
    492511                  ztaux_oi(ji,jj) = zTauO * ( u_oce(ji,jj) - u_ice(ji,jj) ) 
    493  
    494                   ! tau_bottom/u_ice 
     512                  ! 
     513                  !                 !--- tau_bottom/u_ice 
    495514                  zvel  = MAX( zepsi, SQRT( v_iceU(ji,jj) * v_iceU(ji,jj) + u_ice(ji,jj) * u_ice(ji,jj) ) ) 
    496515                  zTauB = - tau_icebfr(ji,jj) / zvel 
    497  
    498                   ! Coriolis at U-points (energy conserving formulation) 
     516                  ! 
     517                  !                 !--- Coriolis at U-points (energy conserving formulation) 
    499518                  zCorx(ji,jj)  =   0.25_wp * r1_e1u(ji,jj) *  & 
    500519                     &    ( zmf(ji  ,jj) * ( e1v(ji  ,jj) * v_ice(ji  ,jj) + e1v(ji  ,jj-1) * v_ice(ji  ,jj-1) )  & 
    501520                     &    + zmf(ji+1,jj) * ( e1v(ji+1,jj) * v_ice(ji+1,jj) + e1v(ji+1,jj-1) * v_ice(ji+1,jj-1) ) ) 
    502                    
    503                   ! Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io 
     521                  ! 
     522                  !                 !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io 
    504523                  zTauE = zfU(ji,jj) + zTauU_ia(ji,jj) + zCorx(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj) 
    505  
    506                   ! landfast switch => 0 = static friction ; 1 = sliding friction 
     524                  ! 
     525                  !                 !--- landfast switch => 0 = static friction ; 1 = sliding friction 
    507526                  rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, ztauE - tau_icebfr(ji,jj) ) - SIGN( 1._wp, zTauE ) ) ) 
    508  
    509                   ! ice velocity using implicit formulation (cf Madec doc & Bouillon 2009) 
     527                  ! 
     528                  IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 
     529                  u_ice(ji,jj) = ( (          rswitch * ( zmU_t(ji,jj) * ( zbeta(ji,jj) * u_ice(ji,jj) + u_ice_b(ji,jj) )         & ! previous velocity 
     530                     &                                     + zTauE + zTauO * u_ice(ji,jj)                                         & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     531                     &                                  ) / MAX( zepsi, zmU_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 
     532                     &              + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )              & ! static friction => slow decrease to v=0 
     533                     &              ) * zswitchU(ji,jj) + u_oce(ji,jj) * ( 1._wp - zswitchU(ji,jj) )                              & ! v_ice = v_oce if mass < zmmin  
     534                     &            ) * zmaskU(ji,jj) 
     535                  ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 
    510536                  u_ice(ji,jj) = ( (           rswitch   * ( zmU_t(ji,jj)  * u_ice(ji,jj)                             &  ! previous velocity 
    511537                     &                                     + zTauE + zTauO * u_ice(ji,jj)                             &  ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     
    514540                     &              ) * zswitchU(ji,jj) + u_oce(ji,jj) * ( 1._wp - zswitchU(ji,jj) )                  &  ! v_ice = v_oce if mass < zmmin  
    515541                     &            ) * zmaskU(ji,jj) 
    516                   ! Bouillon 2013 
    517                   !!u_ice(ji,jj) = ( zmU_t(ji,jj) * ( zbeta * u_ice(ji,jj) + u_ice_b(ji,jj) )                  & 
    518                   !!   &           + zfU(ji,jj) + zCorx(ji,jj) + zTauU_ia(ji,jj) + zTauO * u_oce(ji,jj) + zspgU(ji,jj)  & 
    519                   !!   &           ) / MAX( zmU_t(ji,jj) * ( zbeta + 1._wp ) + zTauO - zTauB, zepsi ) * zswitchU(ji,jj) 
     542                  ENDIF 
    520543               END DO 
    521544            END DO 
     
    532555            DO jj = 2, jpjm1 
    533556               DO ji = fs_2, fs_jpim1 
    534  
    535                   ! tau_io/(u_oce - u_ice) 
     557                  !                 !--- tau_io/(u_oce - u_ice) 
    536558                  zTauO = zaU(ji,jj) * zrhoco * SQRT( ( u_ice (ji,jj) - u_oce (ji,jj) ) * ( u_ice (ji,jj) - u_oce (ji,jj) )  & 
    537559                     &                              + ( v_iceU(ji,jj) - v_oceU(ji,jj) ) * ( v_iceU(ji,jj) - v_oceU(ji,jj) ) ) 
    538  
    539                   ! Ocean-to-Ice stress 
     560                  !                 !--- Ocean-to-Ice stress 
    540561                  ztaux_oi(ji,jj) = zTauO * ( u_oce(ji,jj) - u_ice(ji,jj) ) 
    541  
    542                   ! tau_bottom/u_ice 
     562                  ! 
     563                  !                 !--- tau_bottom/u_ice 
    543564                  zvel  = MAX( zepsi, SQRT( v_iceU(ji,jj) * v_iceU(ji,jj) + u_ice(ji,jj) * u_ice(ji,jj) ) ) 
    544565                  zTauB = - tau_icebfr(ji,jj) / zvel 
    545  
    546                   ! Coriolis at U-points (energy conserving formulation) 
     566                  ! 
     567                  !                 !--- Coriolis at U-points (energy conserving formulation) 
    547568                  zCorx(ji,jj)  =   0.25_wp * r1_e1u(ji,jj) *  & 
    548569                     &    ( zmf(ji  ,jj) * ( e1v(ji  ,jj) * v_ice(ji  ,jj) + e1v(ji  ,jj-1) * v_ice(ji  ,jj-1) )  & 
    549570                     &    + zmf(ji+1,jj) * ( e1v(ji+1,jj) * v_ice(ji+1,jj) + e1v(ji+1,jj-1) * v_ice(ji+1,jj-1) ) ) 
    550  
    551                   ! Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io 
     571                  ! 
     572                  !                 !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io 
    552573                  zTauE = zfU(ji,jj) + zTauU_ia(ji,jj) + zCorx(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj) 
    553  
    554                   ! landfast switch => 0 = static friction ; 1 = sliding friction 
     574                  ! 
     575                  !                 !--- landfast switch => 0 = static friction ; 1 = sliding friction 
    555576                  rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, ztauE - tau_icebfr(ji,jj) ) - SIGN( 1._wp, zTauE ) ) ) 
    556  
    557                   ! ice velocity using implicit formulation (cf Madec doc & Bouillon 2009) 
     577                  ! 
     578                  IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 
     579                  u_ice(ji,jj) = ( (          rswitch * ( zmU_t(ji,jj) * ( zbeta(ji,jj) * u_ice(ji,jj) + u_ice_b(ji,jj) )         & ! previous velocity 
     580                     &                                     + zTauE + zTauO * u_ice(ji,jj)                                         & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     581                     &                                  ) / MAX( zepsi, zmU_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 
     582                     &              + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )              & ! static friction => slow decrease to v=0 
     583                     &              ) * zswitchU(ji,jj) + u_oce(ji,jj) * ( 1._wp - zswitchU(ji,jj) )                              & ! v_ice = v_oce if mass < zmmin  
     584                     &            ) * zmaskU(ji,jj) 
     585                  ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 
    558586                  u_ice(ji,jj) = ( (           rswitch   * ( zmU_t(ji,jj)  * u_ice(ji,jj)                             &  ! previous velocity 
    559587                     &                                     + zTauE + zTauO * u_ice(ji,jj)                             &  ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
    560588                     &                                     ) / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB )             &  ! m/dt + tau_io(only ice part) + landfast 
    561589                     &              + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )  &  ! static friction => slow decrease to v=0 
    562                      &              ) * zswitchU(ji,jj) + u_oce(ji,jj) * ( 1._wp - zswitchU(ji,jj) )                  &  ! v_ice = v_oce if mass < zmmin 
     590                     &              ) * zswitchU(ji,jj) + u_oce(ji,jj) * ( 1._wp - zswitchU(ji,jj) )                  &  ! v_ice = v_oce if mass < zmmin  
    563591                     &            ) * zmaskU(ji,jj) 
    564                   ! Bouillon 2013 
    565                   !!u_ice(ji,jj) = ( zmU_t(ji,jj) * ( zbeta * u_ice(ji,jj) + u_ice_b(ji,jj) )                  & 
    566                   !!   &           + zfU(ji,jj) + zCorx(ji,jj) + zTauU_ia(ji,jj) + zTauO * u_oce(ji,jj) + zspgU(ji,jj)  & 
    567                   !!   &           ) / MAX( zmU_t(ji,jj) * ( zbeta + 1._wp ) + zTauO - zTauB, zepsi ) * zswitchU(ji,jj) 
     592                  ENDIF 
    568593               END DO 
    569594            END DO 
     
    578603            DO jj = 2, jpjm1 
    579604               DO ji = fs_2, fs_jpim1 
    580           
    581                   ! tau_io/(v_oce - v_ice) 
     605                  !                 !--- tau_io/(v_oce - v_ice) 
    582606                  zTauO = zaV(ji,jj) * zrhoco * SQRT( ( v_ice (ji,jj) - v_oce (ji,jj) ) * ( v_ice (ji,jj) - v_oce (ji,jj) )  & 
    583607                     &                              + ( u_iceV(ji,jj) - u_oceV(ji,jj) ) * ( u_iceV(ji,jj) - u_oceV(ji,jj) ) ) 
    584  
    585                   ! Ocean-to-Ice stress 
     608                  !                 !--- Ocean-to-Ice stress 
    586609                  ztauy_oi(ji,jj) = zTauO * ( v_oce(ji,jj) - v_ice(ji,jj) ) 
    587  
    588                   ! tau_bottom/v_ice 
     610                  ! 
     611                  !                 !--- tau_bottom/v_ice 
    589612                  zvel  = MAX( zepsi, SQRT( v_ice(ji,jj) * v_ice(ji,jj) + u_iceV(ji,jj) * u_iceV(ji,jj) ) ) 
    590613                  ztauB = - tau_icebfr(ji,jj) / zvel 
    591                    
    592                   ! Coriolis at V-points (energy conserving formulation) 
     614                  ! 
     615                  !                 !--- Coriolis at v-points (energy conserving formulation) 
    593616                  zCory(ji,jj)  = - 0.25_wp * r1_e2v(ji,jj) *  & 
    594617                     &    ( zmf(ji,jj  ) * ( e2u(ji,jj  ) * u_ice(ji,jj  ) + e2u(ji-1,jj  ) * u_ice(ji-1,jj  ) )  & 
    595618                     &    + zmf(ji,jj+1) * ( e2u(ji,jj+1) * u_ice(ji,jj+1) + e2u(ji-1,jj+1) * u_ice(ji-1,jj+1) ) ) 
    596  
    597                   ! Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io 
     619                  ! 
     620                  !                 !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io 
    598621                  zTauE = zfV(ji,jj) + zTauV_ia(ji,jj) + zCory(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj) 
    599  
    600                   ! landfast switch => 0 = static friction (tau_icebfr > zTauE); 1 = sliding friction 
     622                  ! 
     623                  !                 !--- landfast switch => 0 = static friction ; 1 = sliding friction 
    601624                  rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zTauE - tau_icebfr(ji,jj) ) - SIGN( 1._wp, zTauE ) ) ) 
    602                    
    603                   ! ice velocity using implicit formulation (cf Madec doc & Bouillon 2009) 
     625                  ! 
     626                  IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 
     627                  v_ice(ji,jj) = ( (          rswitch * ( zmV_t(ji,jj) * ( zbeta(ji,jj) * v_ice(ji,jj) + v_ice_b(ji,jj) )         & ! previous velocity 
     628                     &                                  + zTauE + zTauO * v_ice(ji,jj)                                            & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     629                     &                                  ) / MAX( zepsi, zmV_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 
     630                     &                 + ( 1._wp - rswitch ) * v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )           & ! static friction => slow decrease to v=0 
     631                     &             ) * zswitchV(ji,jj) + v_oce(ji,jj) * ( 1._wp - zswitchV(ji,jj) )                               & ! v_ice = v_oce if mass < zmmin 
     632                     &           ) * zmaskV(ji,jj) 
     633                  ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 
    604634                  v_ice(ji,jj) = ( (           rswitch   * ( zmV_t(ji,jj)  * v_ice(ji,jj)                             &  ! previous velocity 
    605635                     &                                     + zTauE + zTauO * v_ice(ji,jj)                             &  ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     
    608638                     &              ) * zswitchV(ji,jj) + v_oce(ji,jj) * ( 1._wp - zswitchV(ji,jj) )                  &  ! v_ice = v_oce if mass < zmmin 
    609639                     &            ) * zmaskV(ji,jj) 
    610                   ! Bouillon 2013 
    611                   !!v_ice(ji,jj) = ( zmV_t(ji,jj) * ( zbeta * v_ice(ji,jj) + v_ice_b(ji,jj) )                  & 
    612                   !!   &           + zfV(ji,jj) + zCory(ji,jj) + zTauV_ia(ji,jj) + zTauO * v_oce(ji,jj) + zspgV(ji,jj)  & 
    613                   !!   &           ) / MAX( zmV_t(ji,jj) * ( zbeta + 1._wp ) + zTauO - zTauB, zepsi ) * zswitchV(ji,jj) 
     640                  ENDIF 
    614641               END DO 
    615642            END DO 
     
    820847   END SUBROUTINE ice_dyn_rhg_evp 
    821848 
     849 
    822850   SUBROUTINE rhg_evp_rst( cdrw, kt ) 
    823851      !!--------------------------------------------------------------------- 
Note: See TracChangeset for help on using the changeset viewer.