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 8678 for branches/2017 – NEMO

Changeset 8678 for branches/2017


Ignore:
Timestamp:
2017-11-08T19:17:04+01:00 (6 years ago)
Author:
clem
Message:

Adaptive rheology from Kimmritz. It looks ok on short runs but need to be checked on longer runs

Location:
branches/2017/dev_r8183_ICEMODEL/NEMOGCM
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_r8183_ICEMODEL/NEMOGCM/CONFIG/SHARED/namelist_ice_lim3_ref

    r8598 r8678  
    9090!------------------------------------------------------------------------------ 
    9191   ln_rhg_EVP       = .true.          !  EVP rheology 
    92       rn_creepl     =   1.0e-12       !     creep limit [1/s] 
     92      ln_aEVP       = .false.         !     adaptive rheology (Kimmritz et al. 2016 & 2017) 
     93      rn_creepl     =   2.0e-9        !     creep limit [1/s] 
    9394      rn_ecc        =   2.0           !     eccentricity of the elliptical yield curve           
    9495      nn_nevp       = 120             !     number of EVP subcycles                              
  • branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3/ice.F90

    r8597 r8678  
    178178   ! 
    179179   !                                     !!** ice-rheology namelist (namrhg) ** 
     180   LOGICAL , PUBLIC ::   ln_aEVP          !: using adaptive EVP (T or F)  
    180181   REAL(wp), PUBLIC ::   rn_creepl        !: creep limit : has to be under 1.0e-9 
    181182   REAL(wp), PUBLIC ::   rn_ecc           !: eccentricity of the elliptical yield curve 
  • branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3/icedyn_rhg.F90

    r8534 r8678  
    7878      CASE( np_rhgEVP )                ! Elasto-Viscous-Plastic ! 
    7979         !                             !------------------------! 
    80          CALL ice_dyn_rhg_evp( kt, stress1_i, stress2_i, stress12_i, u_ice, v_ice, shear_i, divu_i, delta_i ) 
     80         CALL ice_dyn_rhg_evp( kt, stress1_i, stress2_i, stress12_i, shear_i, divu_i, delta_i ) 
    8181         !          
    8282      END SELECT 
     
    107107      INTEGER ::   ios, ioptio   ! Local integer output status for namelist read 
    108108      !! 
    109       NAMELIST/namdyn_rhg/  ln_rhg_EVP, rn_creepl, rn_ecc , nn_nevp, rn_relast 
     109      NAMELIST/namdyn_rhg/  ln_rhg_EVP, ln_aEVP, rn_creepl, rn_ecc , nn_nevp, rn_relast 
    110110      !!------------------------------------------------------------------- 
    111111      ! 
     
    125125         WRITE(numout,*) '   Namelist namdyn_rhg:' 
    126126         WRITE(numout,*) '      rheology EVP (icedyn_rhg_evp)                        ln_rhg_EVP = ', ln_rhg_EVP 
     127         WRITE(numout,*) '         use adaptive EVP (aEVP)                           ln_aEVP    = ', ln_aEVP 
    127128         WRITE(numout,*) '         creep limit                                       rn_creepl  = ', rn_creepl 
    128129         WRITE(numout,*) '         eccentricity of the elliptical yield curve        rn_ecc     = ', rn_ecc 
  • branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3/icedyn_rhg_evp.F90

    r8578 r8678  
    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  *** 
     
    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      !!------------------------------------------------------------------- 
    105107      INTEGER, INTENT(in) ::   kt      ! time step 
    106108      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   pstress1_i, pstress2_i, pstress12_i 
    107       REAL(wp), DIMENSION(:,:), INTENT(inout) ::   u_ice, v_ice  
    108109      REAL(wp), DIMENSION(:,:), INTENT(  out) ::   pshear_i, pdivu_i, pdelta_i  
    109110      !! 
     
    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 
     
    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 
     
    231234 
    232235      ! 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  
     236      IF( .NOT. ln_aEVP ) THEN 
     237         zalph1 = ( 2._wp * rn_relast * rdt_ice ) * z1_dtevp 
     238         zalph2 = zalph1 * z1_ecc2 
     239 
     240         z1_alph1 = 1._wp / ( zalph1 + 1._wp ) 
     241         z1_alph2 = 1._wp / ( zalph2 + 1._wp ) 
     242      ENDIF 
     243          
    245244      ! Initialise stress tensor  
    246245      zs1 (:,:) = pstress1_i (:,:)  
     
    304303            zmf(ji,jj)      = zm1 * ff_t(ji,jj) 
    305304 
     305            ! dt/m at T points (for alpha and beta coefficients) 
     306            zdt_m(ji,jj)    = zdtevp / MAX( zm1, zmmin ) 
     307             
    306308            ! m/dt 
    307309            zmU_t(ji,jj)    = zmassU * z1_dtevp 
    308310            zmV_t(ji,jj)    = zmassV * z1_dtevp 
    309  
     311             
    310312            ! Drag ice-atm. 
    311313            zTauU_ia(ji,jj) = zaU(ji,jj) * utau_ice(ji,jj) 
     
    326328         END DO 
    327329      END DO 
    328       CALL lbc_lnk( zmf, 'T', 1. ) 
     330      CALL lbc_lnk_multi( zmf, 'T', 1., zdt_m, 'T', 1. ) 
    329331      ! 
    330332      !------------------------------------------------------------------------------! 
     
    380382               ! P/delta at T points 
    381383               zp_delt(ji,jj) = strength(ji,jj) / ( zdelta + rn_creepl ) 
     384 
     385               ! alpha & beta for aEVP 
     386               !   gamma = 0.5*P/(delta+creepl) * (c*pi)**2/Area * dt/m 
     387               !   alpha = beta = sqrt(4*gamma) 
     388               IF( ln_aEVP ) THEN 
     389                  zalph1   = MAX( 50._wp, rpi * SQRT( 0.5_wp * zp_delt(ji,jj) * r1_e1e2t(ji,jj) * zdt_m(ji,jj) ) ) 
     390                  z1_alph1 = 1._wp / ( zalph1 + 1._wp ) 
     391                  zalph2   = zalph1 
     392                  z1_alph2 = z1_alph1 
     393               ENDIF 
    382394                
    383395               ! stress at T points 
     
    392404            DO ji = 1, jpim1 
    393405 
     406               ! alpha & beta for aEVP 
     407               IF( ln_aEVP ) THEN 
     408                  zalph2   = MAX( 50._wp, rpi * SQRT( 0.5_wp * zp_delt(ji,jj) * r1_e1e2t(ji,jj) * zdt_m(ji,jj) ) ) 
     409                  z1_alph2 = 1._wp / ( zalph2 + 1._wp ) 
     410                  zbeta(ji,jj) = zalph2 
     411               ENDIF 
     412                
    394413               ! P/delta at F points 
    395414               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) ) 
     
    411430                  &                    ) * 2._wp * r1_e1u(ji,jj)                                                              & 
    412431                  &                  ) * r1_e1e2u(ji,jj) 
    413                   ! 
    414                   !                !--- V points 
     432               ! 
     433               !                !--- V points 
    415434               zfV(ji,jj) = 0.5_wp * ( ( zs1(ji,jj+1) - zs1(ji,jj) ) * e1v(ji,jj)                                             & 
    416435                  &                  - ( zs2(ji,jj+1) * e1t(ji,jj+1) * e1t(ji,jj+1) - zs2(ji,jj) * e1t(ji,jj) * e1t(ji,jj)    & 
     
    419438                  &                    ) * 2._wp * r1_e2v(ji,jj)                                                              & 
    420439                  &                  ) * r1_e1e2v(ji,jj) 
    421                   ! 
    422                   !                !--- u_ice at V point 
     440               ! 
     441               !                !--- u_ice at V point 
    423442               u_iceV(ji,jj) = 0.5_wp * ( ( u_ice(ji,jj  ) + u_ice(ji-1,jj  ) ) * e2t(ji,jj+1)     & 
    424443                  &                     + ( 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 
     444               ! 
     445               !                !--- v_ice at U point 
    427446               v_iceU(ji,jj) = 0.5_wp * ( ( v_ice(ji  ,jj) + v_ice(ji  ,jj-1) ) * e1t(ji+1,jj)     & 
    428447                  &                     + ( v_ice(ji+1,jj) + v_ice(ji+1,jj-1) ) * e1t(ji  ,jj) ) * z1_e1t0(ji,jj) * umask(ji,jj,1) 
    429                ! 
    430448            END DO 
    431449         END DO 
    432450         ! 
    433451         ! --- Computation of ice velocity --- ! 
    434          !  Bouillon et al. 2013 (eq 47-48) => unstable unless alpha, beta are chosen wisely and large nn_nevp 
     452         !  Bouillon et al. 2013 (eq 47-48) => unstable unless alpha, beta vary as in Kimmritz 2016 & 2017 
    435453         !  Bouillon et al. 2009 (eq 34-35) => stable 
    436454         IF( MOD(jter,2) == 0 ) THEN ! even iterations 
     
    438456            DO jj = 2, jpjm1 
    439457               DO ji = fs_2, fs_jpim1 
    440                      !                 !--- tau_io/(v_oce - v_ice) 
     458                  !                 !--- tau_io/(v_oce - v_ice) 
    441459                  zTauO = zaV(ji,jj) * zrhoco * SQRT( ( v_ice (ji,jj) - v_oce (ji,jj) ) * ( v_ice (ji,jj) - v_oce (ji,jj) )  & 
    442460                     &                              + ( u_iceV(ji,jj) - u_oceV(ji,jj) ) * ( u_iceV(ji,jj) - u_oceV(ji,jj) ) ) 
    443                      !                 !--- Ocean-to-Ice stress 
     461                  !                 !--- Ocean-to-Ice stress 
    444462                  ztauy_oi(ji,jj) = zTauO * ( v_oce(ji,jj) - v_ice(ji,jj) ) 
    445                      ! 
    446                      !                 !--- tau_bottom/v_ice 
     463                  ! 
     464                  !                 !--- tau_bottom/v_ice 
    447465                  zvel  = MAX( zepsi, SQRT( v_ice(ji,jj) * v_ice(ji,jj) + u_iceV(ji,jj) * u_iceV(ji,jj) ) ) 
    448466                  zTauB = - tau_icebfr(ji,jj) / zvel 
    449                      ! 
    450                      !                 !--- Coriolis at V-points (energy conserving formulation) 
     467                  ! 
     468                  !                 !--- Coriolis at V-points (energy conserving formulation) 
    451469                  zCory(ji,jj)  = - 0.25_wp * r1_e2v(ji,jj) *  & 
    452470                     &    ( zmf(ji,jj  ) * ( e2u(ji,jj  ) * u_ice(ji,jj  ) + e2u(ji-1,jj  ) * u_ice(ji-1,jj  ) )  & 
    453471                     &    + 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 
     472                  ! 
     473                  !                 !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io 
    456474                  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 
     475                  ! 
     476                  !                 !--- landfast switch => 0 = static friction ; 1 = sliding friction 
    459477                  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) 
     478                  ! 
     479                  IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 
     480                  v_ice(ji,jj) = ( (          rswitch * ( zmV_t(ji,jj) * ( zbeta(ji,jj) * v_ice(ji,jj) + v_ice_b(ji,jj) )         & ! previous velocity 
     481                     &                                  + zTauE + zTauO * v_ice(ji,jj)                                            & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     482                     &                                  ) / MAX( zepsi, zmV_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 
     483                     &                 + ( 1._wp - rswitch ) * v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )           & ! static friction => slow decrease to v=0 
     484                     &             ) * zswitchV(ji,jj) + v_oce(ji,jj) * ( 1._wp - zswitchV(ji,jj) )                               & ! v_ice = v_oce if mass < zmmin 
     485                     &           ) * zmaskV(ji,jj) 
     486                  ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 
    462487                  v_ice(ji,jj) = ( (           rswitch   * ( zmV_t(ji,jj)  * v_ice(ji,jj)                             &  ! previous velocity 
    463488                     &                                     + zTauE + zTauO * v_ice(ji,jj)                             &  ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     
    466491                     &              ) * zswitchV(ji,jj) + v_oce(ji,jj) * ( 1._wp - zswitchV(ji,jj) )                  &  ! v_ice = v_oce if mass < zmmin 
    467492                     &            ) * 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                   ! 
     493                  ENDIF 
    474494               END DO 
    475495            END DO 
     
    483503            ! 
    484504            DO jj = 2, jpjm1 
    485                DO ji = fs_2, fs_jpim1 
    486                                 
    487                   ! tau_io/(u_oce - u_ice) 
     505               DO ji = fs_2, fs_jpim1           
     506                  !                 !--- tau_io/(u_oce - u_ice) 
    488507                  zTauO = zaU(ji,jj) * zrhoco * SQRT( ( u_ice (ji,jj) - u_oce (ji,jj) ) * ( u_ice (ji,jj) - u_oce (ji,jj) )  & 
    489508                     &                              + ( v_iceU(ji,jj) - v_oceU(ji,jj) ) * ( v_iceU(ji,jj) - v_oceU(ji,jj) ) ) 
    490  
    491                   ! Ocean-to-Ice stress 
     509                  !                 !--- Ocean-to-Ice stress 
    492510                  ztaux_oi(ji,jj) = zTauO * ( u_oce(ji,jj) - u_ice(ji,jj) ) 
    493  
    494                   ! tau_bottom/u_ice 
     511                  ! 
     512                  !                 !--- tau_bottom/u_ice 
    495513                  zvel  = MAX( zepsi, SQRT( v_iceU(ji,jj) * v_iceU(ji,jj) + u_ice(ji,jj) * u_ice(ji,jj) ) ) 
    496514                  zTauB = - tau_icebfr(ji,jj) / zvel 
    497  
    498                   ! Coriolis at U-points (energy conserving formulation) 
     515                  ! 
     516                  !                 !--- Coriolis at U-points (energy conserving formulation) 
    499517                  zCorx(ji,jj)  =   0.25_wp * r1_e1u(ji,jj) *  & 
    500518                     &    ( zmf(ji  ,jj) * ( e1v(ji  ,jj) * v_ice(ji  ,jj) + e1v(ji  ,jj-1) * v_ice(ji  ,jj-1) )  & 
    501519                     &    + 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 
     520                  ! 
     521                  !                 !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io 
    504522                  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 
     523                  ! 
     524                  !                 !--- landfast switch => 0 = static friction ; 1 = sliding friction 
    507525                  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) 
     526                  ! 
     527                  IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 
     528                  u_ice(ji,jj) = ( (          rswitch * ( zmU_t(ji,jj) * ( zbeta(ji,jj) * u_ice(ji,jj) + u_ice_b(ji,jj) )         & ! previous velocity 
     529                     &                                     + zTauE + zTauO * u_ice(ji,jj)                                         & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     530                     &                                  ) / MAX( zepsi, zmU_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 
     531                     &              + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )              & ! static friction => slow decrease to v=0 
     532                     &              ) * zswitchU(ji,jj) + u_oce(ji,jj) * ( 1._wp - zswitchU(ji,jj) )                              & ! v_ice = v_oce if mass < zmmin  
     533                     &            ) * zmaskU(ji,jj) 
     534                  ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 
    510535                  u_ice(ji,jj) = ( (           rswitch   * ( zmU_t(ji,jj)  * u_ice(ji,jj)                             &  ! previous velocity 
    511536                     &                                     + zTauE + zTauO * u_ice(ji,jj)                             &  ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     
    514539                     &              ) * zswitchU(ji,jj) + u_oce(ji,jj) * ( 1._wp - zswitchU(ji,jj) )                  &  ! v_ice = v_oce if mass < zmmin  
    515540                     &            ) * 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) 
     541                  ENDIF 
    520542               END DO 
    521543            END DO 
     
    532554            DO jj = 2, jpjm1 
    533555               DO ji = fs_2, fs_jpim1 
    534  
    535                   ! tau_io/(u_oce - u_ice) 
     556                  !                 !--- tau_io/(u_oce - u_ice) 
    536557                  zTauO = zaU(ji,jj) * zrhoco * SQRT( ( u_ice (ji,jj) - u_oce (ji,jj) ) * ( u_ice (ji,jj) - u_oce (ji,jj) )  & 
    537558                     &                              + ( v_iceU(ji,jj) - v_oceU(ji,jj) ) * ( v_iceU(ji,jj) - v_oceU(ji,jj) ) ) 
    538  
    539                   ! Ocean-to-Ice stress 
     559                  !                 !--- Ocean-to-Ice stress 
    540560                  ztaux_oi(ji,jj) = zTauO * ( u_oce(ji,jj) - u_ice(ji,jj) ) 
    541  
    542                   ! tau_bottom/u_ice 
     561                  ! 
     562                  !                 !--- tau_bottom/u_ice 
    543563                  zvel  = MAX( zepsi, SQRT( v_iceU(ji,jj) * v_iceU(ji,jj) + u_ice(ji,jj) * u_ice(ji,jj) ) ) 
    544564                  zTauB = - tau_icebfr(ji,jj) / zvel 
    545  
    546                   ! Coriolis at U-points (energy conserving formulation) 
     565                  ! 
     566                  !                 !--- Coriolis at U-points (energy conserving formulation) 
    547567                  zCorx(ji,jj)  =   0.25_wp * r1_e1u(ji,jj) *  & 
    548568                     &    ( zmf(ji  ,jj) * ( e1v(ji  ,jj) * v_ice(ji  ,jj) + e1v(ji  ,jj-1) * v_ice(ji  ,jj-1) )  & 
    549569                     &    + 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 
     570                  ! 
     571                  !                 !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io 
    552572                  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 
     573                  ! 
     574                  !                 !--- landfast switch => 0 = static friction ; 1 = sliding friction 
    555575                  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) 
     576                  ! 
     577                  IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 
     578                  u_ice(ji,jj) = ( (          rswitch * ( zmU_t(ji,jj) * ( zbeta(ji,jj) * u_ice(ji,jj) + u_ice_b(ji,jj) )         & ! previous velocity 
     579                     &                                     + zTauE + zTauO * u_ice(ji,jj)                                         & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     580                     &                                  ) / MAX( zepsi, zmU_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 
     581                     &              + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )              & ! static friction => slow decrease to v=0 
     582                     &              ) * zswitchU(ji,jj) + u_oce(ji,jj) * ( 1._wp - zswitchU(ji,jj) )                              & ! v_ice = v_oce if mass < zmmin  
     583                     &            ) * zmaskU(ji,jj) 
     584                  ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 
    558585                  u_ice(ji,jj) = ( (           rswitch   * ( zmU_t(ji,jj)  * u_ice(ji,jj)                             &  ! previous velocity 
    559586                     &                                     + zTauE + zTauO * u_ice(ji,jj)                             &  ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
    560587                     &                                     ) / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB )             &  ! m/dt + tau_io(only ice part) + landfast 
    561588                     &              + ( 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 
     589                     &              ) * zswitchU(ji,jj) + u_oce(ji,jj) * ( 1._wp - zswitchU(ji,jj) )                  &  ! v_ice = v_oce if mass < zmmin  
    563590                     &            ) * 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) 
     591                  ENDIF 
    568592               END DO 
    569593            END DO 
     
    578602            DO jj = 2, jpjm1 
    579603               DO ji = fs_2, fs_jpim1 
    580           
    581                   ! tau_io/(v_oce - v_ice) 
     604                  !                 !--- tau_io/(v_oce - v_ice) 
    582605                  zTauO = zaV(ji,jj) * zrhoco * SQRT( ( v_ice (ji,jj) - v_oce (ji,jj) ) * ( v_ice (ji,jj) - v_oce (ji,jj) )  & 
    583606                     &                              + ( u_iceV(ji,jj) - u_oceV(ji,jj) ) * ( u_iceV(ji,jj) - u_oceV(ji,jj) ) ) 
    584  
    585                   ! Ocean-to-Ice stress 
     607                  !                 !--- Ocean-to-Ice stress 
    586608                  ztauy_oi(ji,jj) = zTauO * ( v_oce(ji,jj) - v_ice(ji,jj) ) 
    587  
    588                   ! tau_bottom/v_ice 
     609                  ! 
     610                  !                 !--- tau_bottom/v_ice 
    589611                  zvel  = MAX( zepsi, SQRT( v_ice(ji,jj) * v_ice(ji,jj) + u_iceV(ji,jj) * u_iceV(ji,jj) ) ) 
    590612                  ztauB = - tau_icebfr(ji,jj) / zvel 
    591                    
    592                   ! Coriolis at V-points (energy conserving formulation) 
     613                  ! 
     614                  !                 !--- Coriolis at v-points (energy conserving formulation) 
    593615                  zCory(ji,jj)  = - 0.25_wp * r1_e2v(ji,jj) *  & 
    594616                     &    ( zmf(ji,jj  ) * ( e2u(ji,jj  ) * u_ice(ji,jj  ) + e2u(ji-1,jj  ) * u_ice(ji-1,jj  ) )  & 
    595617                     &    + 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 
     618                  ! 
     619                  !                 !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io 
    598620                  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 
     621                  ! 
     622                  !                 !--- landfast switch => 0 = static friction ; 1 = sliding friction 
    601623                  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) 
     624                  ! 
     625                  IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 
     626                  v_ice(ji,jj) = ( (          rswitch * ( zmV_t(ji,jj) * ( zbeta(ji,jj) * v_ice(ji,jj) + v_ice_b(ji,jj) )         & ! previous velocity 
     627                     &                                  + zTauE + zTauO * v_ice(ji,jj)                                            & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     628                     &                                  ) / MAX( zepsi, zmV_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + 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                     &             ) * zswitchV(ji,jj) + v_oce(ji,jj) * ( 1._wp - zswitchV(ji,jj) )                               & ! v_ice = v_oce if mass < zmmin 
     631                     &           ) * zmaskV(ji,jj) 
     632                  ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 
    604633                  v_ice(ji,jj) = ( (           rswitch   * ( zmV_t(ji,jj)  * v_ice(ji,jj)                             &  ! previous velocity 
    605634                     &                                     + zTauE + zTauO * v_ice(ji,jj)                             &  ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     
    608637                     &              ) * zswitchV(ji,jj) + v_oce(ji,jj) * ( 1._wp - zswitchV(ji,jj) )                  &  ! v_ice = v_oce if mass < zmmin 
    609638                     &            ) * 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) 
     639                  ENDIF 
    614640               END DO 
    615641            END DO 
Note: See TracChangeset for help on using the changeset viewer.