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 13536 for NEMO/branches/2020/SI3-03_VP_rheology/src/ICE/icedyn_rhg_evp.F90 – NEMO

Ignore:
Timestamp:
2020-09-29T11:22:04+02:00 (4 years ago)
Author:
vancop
Message:

VP rheology, first code version finalised

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/SI3-03_VP_rheology/src/ICE/icedyn_rhg_evp.F90

    r13279 r13536  
    137137      ! 
    138138      REAL(wp), DIMENSION(jpi,jpj) ::   zp_delt                         ! P/delta at T points 
     139      REAL(wp), DIMENSION(jpi,jpj) ::   zdeltastar_t                    ! Delta* at T-points 
    139140      REAL(wp), DIMENSION(jpi,jpj) ::   zbeta                           ! beta coef from Kimmritz 2017 
    140141      ! 
     
    168169      REAL(wp), DIMENSION(jpi,jpj) ::   zu_ice, zv_ice 
    169170      !! --- diags 
    170       REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zsig1, zsig2, zsig3 
     171      REAL(wp) ::   zsig1, zsig2, zsig12 
     172      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zsig_I, zsig_II, zsig1_p, zsig2_p, zten_i          
    171173      !! --- SIMIP diags 
    172174      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zdiag_xmtrp_ice ! X-component of ice mass transport (kg/s) 
     
    406408               ! delta at T points 
    407409               zdelta = SQRT( zdiv2 + ( zdt2 + zds2 ) * z1_ecc2 )   
     410                
     411               zdeltastar_t(ji,jj) = zdelta + rn_creepl                     ! store delta* at previous iterate (for ellipse computation) 
    408412 
    409413               ! P/delta at T points 
     
    695699                        &           )   * zmsk00y(ji,jj) 
    696700                  ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 
     701                                     !---> MV : comment above is misleading as EVP is a purely explicit method 
     702                                     !---> MV : I found code below quite unreadable :-) 
     703                                     !---> MV : two maskings + landfast / no landfast options, I think this is a bit too much 
     704                                     !---> MV : I would suggest to split at least the landfast / masking steps if possible 
     705                                     !---> MV : Should also comment why 1% of ocean velocity is assumed - not sure it makes sense btw 
     706                                     !---> MV : I would say 100% of ocean current makes much more sense for free-drift 
     707                                     !---> MV : of very low concentration sea ice.. 
     708                                     !---> MV : but maybe it is a numerical trick... in brief it's n 
    697709                     v_ice(ji,jj) = ( (          rswitch   * ( zmV_t(ji,jj) * v_ice(ji,jj)                                       & ! previous velocity 
    698710                        &                                    + zRHS + zTauO * v_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 
     
    715727 
    716728         ! convergence test 
    717          IF( ln_rhg_chkcvg )   CALL rhg_cvg( kt, jter, nn_nevp, u_ice, v_ice, zu_ice, zv_ice ) 
     729         IF( ln_rhg_chkcvg )   CALL rhg_cvg_evp( kt, jter, nn_nevp, u_ice, v_ice, zu_ice, zv_ice ) 
    718730         ! 
    719731         !                                                ! ==================== ! 
     
    745757            zdt2 = zdt * zdt 
    746758             
     759            zten_i(ji,jj) = zdt 
     760             
    747761            ! shear**2 at T points (doc eq. A16) 
    748762            zds2 = ( zds(ji,jj  ) * zds(ji,jj  ) * e1e2f(ji,jj  ) + zds(ji-1,jj  ) * zds(ji-1,jj  ) * e1e2f(ji-1,jj  )  & 
     
    797811      IF( iom_use('icestr') )   CALL iom_put( 'icestr' , strength * zmsk00 )   ! strength 
    798812 
    799       ! --- stress tensor --- ! 
    800       IF( iom_use('isig1') .OR. iom_use('isig2') .OR. iom_use('isig3') .OR. iom_use('normstr') .OR. iom_use('sheastr') ) THEN 
    801          ! 
    802          ALLOCATE( zsig1(jpi,jpj) , zsig2(jpi,jpj) , zsig3(jpi,jpj) ) 
     813      ! --- Stress tensor invariants (SIMIP diags) --- ! 
     814      IF( iom_use('normstr') .OR. iom_use('sheastr') ) THEN 
     815         ! 
     816         ALLOCATE( zsig_I(jpi,jpj) , zsig_II(jpi,jpj) ) 
    803817         !          
    804          DO jj = 2, jpjm1 
    805             DO ji = 2, jpim1 
    806                zdum1 = ( zmsk00(ji-1,jj) * pstress12_i(ji-1,jj) + zmsk00(ji  ,jj-1) * pstress12_i(ji  ,jj-1) +  &  ! stress12_i at T-point 
    807                   &      zmsk00(ji  ,jj) * pstress12_i(ji  ,jj) + zmsk00(ji-1,jj-1) * pstress12_i(ji-1,jj-1) )  & 
    808                   &    / MAX( 1._wp, zmsk00(ji-1,jj) + zmsk00(ji,jj-1) + zmsk00(ji,jj) + zmsk00(ji-1,jj-1) ) 
    809  
    810                zshear = SQRT( pstress2_i(ji,jj) * pstress2_i(ji,jj) + 4._wp * zdum1 * zdum1 ) ! shear stress   
    811  
    812                zdum2 = zmsk00(ji,jj) / MAX( 1._wp, strength(ji,jj) ) 
    813  
    814 !!               zsig1(ji,jj) = 0.5_wp * zdum2 * ( pstress1_i(ji,jj) + zshear ) ! principal stress (y-direction, see Hunke & Dukowicz 2002) 
    815 !!               zsig2(ji,jj) = 0.5_wp * zdum2 * ( pstress1_i(ji,jj) - zshear ) ! principal stress (x-direction, see Hunke & Dukowicz 2002) 
    816 !!               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 
    817 !!                                                                                                               ! (scheme converges if this value is ~1, see Bouillon et al 2009 (eq. 11)) 
    818                zsig1(ji,jj) = 0.5_wp * zdum2 * ( pstress1_i(ji,jj) )          ! compressive stress, see Bouillon et al. 2015 
    819                zsig2(ji,jj) = 0.5_wp * zdum2 * ( zshear )                     ! shear stress 
    820                zsig3(ji,jj) = zdum2**2 * ( ( pstress1_i(ji,jj) + strength(ji,jj) )**2 + ( rn_ecc * zshear )**2 ) 
    821             END DO 
    822          END DO 
    823          CALL lbc_lnk_multi( 'icedyn_rhg_evp', zsig1, 'T', 1., zsig2, 'T', 1., zsig3, 'T', 1. ) 
    824          ! 
    825          CALL iom_put( 'isig1' , zsig1 ) 
    826          CALL iom_put( 'isig2' , zsig2 ) 
    827          CALL iom_put( 'isig3' , zsig3 ) 
    828          ! 
    829          ! Stress tensor invariants (normal and shear stress N/m) 
    830          IF( iom_use('normstr') )   CALL iom_put( 'normstr' ,       ( zs1(:,:) + zs2(:,:) )                       * zmsk00(:,:) ) ! Normal stress 
    831          IF( iom_use('sheastr') )   CALL iom_put( 'sheastr' , SQRT( ( zs1(:,:) - zs2(:,:) )**2 + 4*zs12(:,:)**2 ) * zmsk00(:,:) ) ! Shear stress 
    832  
    833          DEALLOCATE( zsig1 , zsig2 , zsig3 ) 
    834       ENDIF 
    835  
     818         DO jj = 2, jpj - 1 
     819            DO ji = 2, jpi - 1 
     820             
     821               ! Ice stresses 
     822               ! sigma1, sigma2, sigma12 are some useful recombination of the stresses (Hunke and Dukowicz MWR 2002, Bouillon et al., OM2013) 
     823               ! These are NOT stress tensor components, neither stress invariants, neither stress principal components 
     824               ! I know, this can be confusing... 
     825               zfac             =   strength(ji,jj) / ( pdelta_i(ji,jj) + rn_creepl )  
     826               zsig1            =   zfac * ( pdivu_i(ji,jj) - pdelta_i(ji,jj) ) 
     827               zsig2            =   zfac * z1_ecc2 * zten_i(ji,jj) 
     828               zsig12           =   zfac * z1_ecc2 * pshear_i(ji,jj) 
     829                
     830               ! Stress invariants (sigma_I, sigma_II, Coon 1974, Feltham 2008) 
     831               zsig_I(ji,jj)    =   zsig1 * 0.5_wp                                ! 1st stress invariant, aka average normal stress, aka negative pressure 
     832               zsig_II(ji,jj)   =   - SQRT ( zsig2 * zsig2 * 0.25_wp + zsig12 )   ! 2nd  ''       '', aka maximum shear stress 
     833                
     834            END DO 
     835         END DO 
     836 
     837         CALL lbc_lnk_multi( 'icedyn_rhg_vp', zsig_I, 'T', 1., zsig_II, 'T', 1.) 
     838          
     839         ! 
     840         ! Stress tensor invariants (normal and shear stress N/m) - SIMIP diags - definitions following Coon (1974) and Feltham (2008) 
     841         IF( iom_use('normstr') )   CALL iom_put( 'normstr' ,   zsig_I(:,:)  * zmsk00(:,:) ) ! Normal stress 
     842         IF( iom_use('sheastr') )   CALL iom_put( 'sheastr' ,   zsig_II(:,:) * zmsk00(:,:) ) ! Maximum shear stress 
     843          
     844         DEALLOCATE ( zsig_I, zsig_II ) 
     845          
     846      ENDIF 
     847 
     848      ! --- Normalized stress tensor principal components --- ! 
     849      ! This are used to plot the normalized yield curve, see Lemieux & Dupont, 2020 
     850      ! Recommendation 1 : we use ice strength, not replacement pressure 
     851      ! Recommendation 2 : need to use deformations at PREVIOUS iterate for viscosities 
     852      IF( iom_use('sig1_pnorm') .OR. iom_use('sig2_pnorm') ) THEN 
     853         ! 
     854         ALLOCATE( zsig1_p(jpi,jpj) , zsig2_p(jpi,jpj) )          
     855         !          
     856         DO jj = 2, jpj - 1 
     857            DO ji = 2, jpi - 1 
     858             
     859               ! Ice stresses computed with **viscosities** (delta, p/delta) at **previous** iterates  
     860               !                        and **deformations** at current iterates 
     861               !                        following Lemieux & Dupont (2020) 
     862               zfac             =   zp_delt(ji,jj) 
     863               zsig1            =   zfac * ( pdivu_i(ji,jj) - zdeltastar_t(ji,jj) ) 
     864               zsig2            =   zfac * z1_ecc2 * zten_i(ji,jj) 
     865               zsig12           =   zfac * z1_ecc2 * pshear_i(ji,jj) 
     866                
     867               ! Stress invariants (sigma_I, sigma_II, Coon 1974, Feltham 2008), T-point 
     868               zsig_I(ji,jj)    =   zsig1 * 0.5_wp                                ! 1st stress invariant, aka average normal stress, aka negative pressure 
     869               zsig_II(ji,jj)   =   - SQRT ( zsig2 * zsig2 * 0.25_wp + zsig12 )   ! 2nd  ''       '', aka maximum shear stress 
     870 
     871               ! Normalized  principal stresses (used to display the ellipse) 
     872               z1_strength      =   1._wp / strength(ji,jj) 
     873               zsig1_p(ji,jj)   =   ( zsig_I(ji,jj)  - zsig_II(ji,jj) ) * z1_strength 
     874               zsig2_p(ji,jj)   =   ( zsig_II(ji,jj) + zsig_II(ji,jj) ) * z1_strength 
     875            END DO 
     876         END DO 
     877          
     878         CALL lbc_lnk_multi( 'icedyn_rhg_vp', zsig1_p, 'T', 1., zsig2_p, 'T', 1.) 
     879                
     880         ! 
     881         CALL iom_put( 'sig1_pnorm' , zsig1_p )  
     882         CALL iom_put( 'sig2_pnorm' , zsig2_p )  
     883 
     884         DEALLOCATE( zsig1_p , zsig2_p ) 
     885          
     886      ENDIF 
    836887      ! --- SIMIP --- ! 
    837888      IF(  iom_use('dssh_dx') .OR. iom_use('dssh_dy') .OR. & 
     
    907958 
    908959 
    909    SUBROUTINE rhg_cvg( kt, kiter, kitermax, pu, pv, pub, pvb ) 
     960   SUBROUTINE rhg_cvg_evp( kt, kiter, kitermax, pu, pv, pub, pvb ) 
    910961      !!---------------------------------------------------------------------- 
    911       !!                    ***  ROUTINE rhg_cvg  *** 
     962      !!                    ***  ROUTINE rhg_cvg_evp  *** 
    912963      !!                      
    913       !! ** Purpose :   check convergence of oce rheology 
     964      !! ** Purpose :   check convergence of evp ice rheology 
    914965      !! 
    915966      !! ** Method  :   create a file ice_cvg.nc containing the convergence of ice velocity 
     
    935986         IF( lwp ) THEN 
    936987            WRITE(numout,*) 
    937             WRITE(numout,*) 'rhg_cvg : ice rheology convergence control' 
    938             WRITE(numout,*) '~~~~~~~' 
     988            WRITE(numout,*) 'rhg_cvg_evp : ice rheology convergence control' 
     989            WRITE(numout,*) '~~~~~~~~~~~' 
    939990         ENDIF 
    940991         ! 
     
    9741025      ENDIF 
    9751026       
    976    END SUBROUTINE rhg_cvg 
     1027   END SUBROUTINE rhg_cvg_evp 
    9771028 
    9781029 
Note: See TracChangeset for help on using the changeset viewer.