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 15574 for NEMO/branches/2021/dev_r14318_RK3_stage1/src/ICE/icethd.F90 – NEMO

Ignore:
Timestamp:
2021-12-03T20:32:50+01:00 (3 years ago)
Author:
techene
Message:

#2605 #2715 trunk merged into dev_r14318_RK3_stage1

Location:
NEMO/branches/2021/dev_r14318_RK3_stage1
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2021/dev_r14318_RK3_stage1

    • Property svn:externals
      •  

        old new  
        99 
        1010# SETTE 
        11 ^/utils/CI/sette@14244        sette 
         11^/utils/CI/sette@HEAD        sette 
         12 
  • NEMO/branches/2021/dev_r14318_RK3_stage1/src/ICE/icethd.F90

    r14072 r15574  
    4848   PUBLIC   ice_thd_init    ! called by ice_init 
    4949 
    50    !!** namelist (namthd) ** 
    51    LOGICAL ::   ln_icedH         ! activate ice thickness change from growing/melting (T) or not (F) 
    52    LOGICAL ::   ln_icedA         ! activate lateral melting param. (T) or not (F) 
    53    LOGICAL ::   ln_icedO         ! activate ice growth in open-water (T) or not (F) 
    54    LOGICAL ::   ln_icedS         ! activate gravity drainage and flushing (T) or not (F) 
    55    LOGICAL ::   ln_leadhfx       ! heat in the leads is used to melt sea-ice before warming the ocean 
    56  
    5750   !! for convergence tests 
    5851   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztice_cvgerr, ztice_cvgstp 
     
    9285      ! 
    9386      INTEGER  :: ji, jj, jk, jl   ! dummy loop indices 
    94       REAL(wp) :: zfric_u, zqld, zqfr, zqfr_neg, zqfr_pos 
    95       REAL(wp), PARAMETER :: zfric_umin = 0._wp       ! lower bound for the friction velocity (cice value=5.e-04) 
    96       REAL(wp), PARAMETER :: zch        = 0.0057_wp   ! heat transfer coefficient 
    97       REAL(wp), DIMENSION(jpi,jpj) ::   zu_io, zv_io, zfric, zvel   ! ice-ocean velocity (m/s) and frictional velocity (m2/s2) 
    98       ! 
    9987      !!------------------------------------------------------------------- 
    10088      ! controls 
     
    114102         ztice_cvgerr = 0._wp ; ztice_cvgstp = 0._wp 
    115103      ENDIF 
    116  
    117       !---------------------------------------------! 
    118       ! computation of friction velocity at T points 
    119       !---------------------------------------------! 
    120       IF( ln_icedyn ) THEN 
    121          zu_io(:,:) = u_ice(:,:) - ssu_m(:,:) 
    122          zv_io(:,:) = v_ice(:,:) - ssv_m(:,:) 
    123          DO_2D( 0, 0, 0, 0 ) 
    124             zfric(ji,jj) = rn_cio * ( 0.5_wp *  & 
    125                &                    (  zu_io(ji,jj) * zu_io(ji,jj) + zu_io(ji-1,jj) * zu_io(ji-1,jj)   & 
    126                &                     + zv_io(ji,jj) * zv_io(ji,jj) + zv_io(ji,jj-1) * zv_io(ji,jj-1) ) ) * tmask(ji,jj,1) 
    127             zvel(ji,jj) = 0.5_wp * SQRT( ( u_ice(ji-1,jj) + u_ice(ji,jj) ) * ( u_ice(ji-1,jj) + u_ice(ji,jj) ) + & 
    128                &                         ( v_ice(ji,jj-1) + v_ice(ji,jj) ) * ( v_ice(ji,jj-1) + v_ice(ji,jj) ) ) 
    129          END_2D 
    130       ELSE      !  if no ice dynamics => transmit directly the atmospheric stress to the ocean 
    131          DO_2D( 0, 0, 0, 0 ) 
    132             zfric(ji,jj) = r1_rho0 * SQRT( 0.5_wp *  & 
    133                &                         (  utau(ji,jj) * utau(ji,jj) + utau(ji-1,jj) * utau(ji-1,jj)   & 
    134                &                          + vtau(ji,jj) * vtau(ji,jj) + vtau(ji,jj-1) * vtau(ji,jj-1) ) ) * tmask(ji,jj,1) 
    135             zvel(ji,jj) = 0._wp 
    136          END_2D 
    137       ENDIF 
    138       CALL lbc_lnk_multi( 'icethd', zfric, 'T',  1.0_wp, zvel, 'T', 1.0_wp ) 
    139       ! 
    140       !--------------------------------------------------------------------! 
    141       ! Partial computation of forcing for the thermodynamic sea ice model 
    142       !--------------------------------------------------------------------! 
    143       DO_2D( 1, 1, 1, 1 ) 
    144          rswitch  = tmask(ji,jj,1) * MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi10 ) ) ! 0 if no ice 
    145          ! 
    146          ! --- Energy received in the lead from atm-oce exchanges, zqld is defined everywhere (J.m-2) --- ! 
    147          zqld =  tmask(ji,jj,1) * rDt_ice *  & 
    148             &    ( ( 1._wp - at_i_b(ji,jj) ) * qsr_oce(ji,jj) * frq_m(ji,jj) +  & 
    149             &      ( 1._wp - at_i_b(ji,jj) ) * qns_oce(ji,jj) + qemp_oce(ji,jj) ) 
    150  
    151          ! --- Energy needed to bring ocean surface layer until its freezing, zqfr is defined everywhere (J.m-2) --- ! 
    152          !     (mostly<0 but >0 if supercooling) 
    153          zqfr     = rho0 * rcp * e3t_m(ji,jj) * ( t_bo(ji,jj) - ( sst_m(ji,jj) + rt0 ) ) * tmask(ji,jj,1)  ! both < 0 (t_bo < sst) and > 0 (t_bo > sst) 
    154          zqfr_neg = MIN( zqfr , 0._wp )                                                                    ! only < 0 
    155          zqfr_pos = MAX( zqfr , 0._wp )                                                                    ! only > 0 
    156  
    157          ! --- Sensible ocean-to-ice heat flux (W/m2) --- ! 
    158          !     (mostly>0 but <0 if supercooling) 
    159          zfric_u            = MAX( SQRT( zfric(ji,jj) ), zfric_umin ) 
    160          qsb_ice_bot(ji,jj) = rswitch * rho0 * rcp * zch * zfric_u * ( ( sst_m(ji,jj) + rt0 ) - t_bo(ji,jj) ) 
    161  
    162          ! upper bound for qsb_ice_bot: the heat retrieved from the ocean must be smaller than the heat necessary to reach 
    163          !                              the freezing point, so that we do not have SST < T_freeze 
    164          !                              This implies: qsb_ice_bot(ji,jj) * at_i(ji,jj) * rtdice <= - zqfr_neg 
    165          !                              The following formulation is ok for both normal conditions and supercooling 
    166          qsb_ice_bot(ji,jj) = rswitch * MIN( qsb_ice_bot(ji,jj), - zqfr_neg * r1_Dt_ice / MAX( at_i(ji,jj), epsi10 ) ) 
    167  
    168          ! If conditions are always supercooled (such as at the mouth of ice-shelves), then ice grows continuously 
    169          ! ==> stop ice formation by artificially setting up the turbulent fluxes to 0 when volume > 20m (arbitrary) 
    170          IF( ( t_bo(ji,jj) - ( sst_m(ji,jj) + rt0 ) ) > 0._wp .AND. vt_i(ji,jj) >= 20._wp ) THEN 
    171             zqfr               = 0._wp 
    172             zqfr_pos           = 0._wp 
    173             qsb_ice_bot(ji,jj) = 0._wp 
    174          ENDIF 
    175          ! 
    176          ! --- Energy Budget of the leads (qlead, J.m-2) --- ! 
    177          !     qlead is the energy received from the atm. in the leads. 
    178          !     If warming (zqld >= 0), then the energy in the leads is used to melt ice (bottom melting) => fhld  (W/m2) 
    179          !     If cooling (zqld <  0), then the energy in the leads is used to grow ice in open water    => qlead (J.m-2) 
    180          IF( zqld >= 0._wp .AND. at_i(ji,jj) > 0._wp ) THEN 
    181             ! upper bound for fhld: fhld should be equal to zqld 
    182             !                        but we have to make sure that this heat will not make the sst drop below the freezing point 
    183             !                        so the max heat that can be pulled out of the ocean is zqld - qsb - zqfr_pos 
    184             !                        The following formulation is ok for both normal conditions and supercooling 
    185             fhld (ji,jj) = rswitch * MAX( 0._wp, ( zqld - zqfr_pos ) * r1_Dt_ice / MAX( at_i(ji,jj), epsi10 ) &  ! divided by at_i since this is (re)multiplied by a_i in icethd_dh.F90 
    186                &                                 - qsb_ice_bot(ji,jj) ) 
    187             qlead(ji,jj) = 0._wp 
    188          ELSE 
    189             fhld (ji,jj) = 0._wp 
    190             ! upper bound for qlead: qlead should be equal to zqld 
    191             !                        but before using this heat for ice formation, we suppose that the ocean cools down till the freezing point. 
    192             !                        The energy for this cooling down is zqfr. Also some heat will be removed from the ocean from turbulent fluxes (qsb) 
    193             !                        and freezing point is reached if zqfr = zqld - qsb*a/dt 
    194             !                        so the max heat that can be pulled out of the ocean is zqld - qsb - zqfr 
    195             !                        The following formulation is ok for both normal conditions and supercooling 
    196             qlead(ji,jj) = MIN( 0._wp , zqld - ( qsb_ice_bot(ji,jj) * at_i(ji,jj) * rDt_ice ) - zqfr ) 
    197          ENDIF 
    198          ! 
    199          ! If ice is landfast and ice concentration reaches its max 
    200          ! => stop ice formation in open water 
    201          IF(  zvel(ji,jj) <= 5.e-04_wp .AND. at_i(ji,jj) >= rn_amax_2d(ji,jj)-epsi06 )   qlead(ji,jj) = 0._wp 
    202          ! 
    203          ! If the grid cell is almost fully covered by ice (no leads) 
    204          ! => stop ice formation in open water 
    205          IF( at_i(ji,jj) >= (1._wp - epsi10) )   qlead(ji,jj) = 0._wp 
    206          ! 
    207          ! If ln_leadhfx is false 
    208          ! => do not use energy of the leads to melt sea-ice 
    209          IF( .NOT.ln_leadhfx )   fhld(ji,jj) = 0._wp 
    210          ! 
    211       END_2D 
    212  
    213       ! In case we bypass open-water ice formation 
    214       IF( .NOT. ln_icedO )  qlead(:,:) = 0._wp 
    215       ! In case we bypass growing/melting from top and bottom 
    216       IF( .NOT. ln_icedH ) THEN 
    217          qsb_ice_bot(:,:) = 0._wp 
    218          fhld       (:,:) = 0._wp 
    219       ENDIF 
    220  
     104      ! 
     105      CALL ice_thd_frazil             !--- frazil ice: collection thickness (ht_i_new) & fraction of frazil (fraz_frac) 
     106      ! 
    221107      !-------------------------------------------------------------------------------------------! 
    222108      ! Thermodynamic computation (only on grid points covered by ice) => loop over ice categories 
     
    226112         ! select ice covered grid points 
    227113         npti = 0 ; nptidx(:) = 0 
    228          DO_2D( 1, 1, 1, 1 ) 
     114         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
    229115            IF ( a_i(ji,jj,jl) > epsi10 ) THEN 
    230116               npti         = npti  + 1 
     
    268154      ! 
    269155      IF ( ln_pnd .AND. ln_icedH ) & 
    270          &                    CALL ice_thd_pnd                      ! --- Melt ponds 
     156         &                    CALL ice_thd_pnd                      ! --- Melt ponds --- ! 
    271157      ! 
    272158      IF( jpl > 1  )          CALL ice_itd_rem( kt )                ! --- Transport ice between thickness categories --- ! 
     
    276162                              CALL ice_cor( kt , 2 )                ! --- Corrections --- ! 
    277163      ! 
    278       oa_i(:,:,:) = oa_i(:,:,:) + a_i(:,:,:) * rDt_ice              ! ice natural aging incrementation 
     164      oa_i(:,:,:) = oa_i(:,:,:) + a_i(:,:,:) * rDt_ice              ! --- Ice natural aging incrementation 
     165      ! 
     166      DO_2D( 0, 0, 0, 0 )                                           ! --- Ice velocity corrections 
     167         IF( at_i(ji,jj) == 0._wp ) THEN   ! if ice has melted 
     168            IF( at_i(ji+1,jj) == 0._wp )   u_ice(ji  ,jj) = 0._wp   ! right side 
     169            IF( at_i(ji-1,jj) == 0._wp )   u_ice(ji-1,jj) = 0._wp   ! left side 
     170            IF( at_i(ji,jj+1) == 0._wp )   v_ice(ji,jj  ) = 0._wp   ! upper side 
     171            IF( at_i(ji,jj-1) == 0._wp )   v_ice(ji,jj-1) = 0._wp   ! bottom side 
     172         ENDIF 
     173      END_2D 
     174      CALL lbc_lnk( 'icethd', u_ice, 'U', -1.0_wp, v_ice, 'V', -1.0_wp ) 
    279175      ! 
    280176      ! convergence tests 
     
    355251   END SUBROUTINE ice_thd_mono 
    356252 
    357  
    358253   SUBROUTINE ice_thd_1d2d( kl, kn ) 
    359254      !!----------------------------------------------------------------------- 
     
    536431         CALL tab_1d_2d( npti, nptidx(1:npti), qcn_ice_bot_1d(1:npti), qcn_ice_bot(:,:,kl) ) 
    537432         CALL tab_1d_2d( npti, nptidx(1:npti), qcn_ice_top_1d(1:npti), qcn_ice_top(:,:,kl) ) 
     433         CALL tab_1d_2d( npti, nptidx(1:npti), qml_ice_1d    (1:npti), qml_ice    (:,:,kl) ) 
    538434         ! extensive variables 
    539435         CALL tab_1d_2d( npti, nptidx(1:npti), v_i_1d (1:npti), v_i (:,:,kl) ) 
Note: See TracChangeset for help on using the changeset viewer.