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 14669 – NEMO

Changeset 14669


Ignore:
Timestamp:
2021-04-01T11:55:21+02:00 (3 years ago)
Author:
dancopsey
Message:

Add fixes to melt pond lids

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/UKMO/NEMO_4.0.4_fix_topo_ponds/src/ICE/icethd_pnd.F90

    r14659 r14669  
    520520         zfsurf,  &      ! net heat flux, excluding conduction and transmitted radiation (W/m2) 
    521521         zTp,     &      ! pond freezing temperature (C) 
     522         lid_Ttop,&      ! lid top temperature (K) 
    522523         zrhoi_L, &      ! volumetric latent heat of sea ice (J/m^3) 
    523524         zfr_mlt, &      ! fraction and volume of available meltwater retained for melt ponding 
    524525         z1_rhow, &      ! inverse water density 
    525          zv_pnd  , &     ! volume of meltwater contributing to ponds 
    526526         zv_mlt          ! total amount of meltwater produced 
    527527 
     
    530530                                        zvolp_res    !! remaining melt pond water available after drainage 
    531531                                         
    532       REAL(wp), DIMENSION(jpi,jpj,jpl) ::   z1_a_i 
     532      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   z1_a_i, & 
     533                                            zv_pnd       !! volume of meltwater contributing to ponds 
    533534 
    534535      INTEGER  ::   ji, jj, jk, jl                    ! loop indices 
     
    594595                      ! MV -> could move this directly in ice_thd_dh and get an array (ji,jj,jl) for surface melt water volume per grid area 
    595596                  zfr_mlt = rn_apnd_min + ( rn_apnd_max - rn_apnd_min ) * at_i(ji,jj)                  ! fraction of surface meltwater going to ponds 
    596                   zv_pnd  = zfr_mlt * zv_mlt                                                           ! contributing meltwater volume for category jl 
     597                  zv_pnd(ji,jj,jl)  = zfr_mlt * zv_mlt                                                           ! contributing meltwater volume for category jl 
    597598 
    598599                  diag_dvpn_mlt(ji,jj) = diag_dvpn_mlt(ji,jj) + zv_mlt * r1_rdtice                     ! diags 
     
    608609                   
    609610                  !--- Deepen existing ponds with no change in pond fraction, before redistribution and drainage 
    610                   v_ip(ji,jj,jl) = v_ip(ji,jj,jl) +  zv_pnd                                            ! use pond water to increase thickness 
     611                  v_ip(ji,jj,jl) = v_ip(ji,jj,jl) +  zv_pnd(ji,jj,jl)                                            ! use pond water to increase thickness 
    611612                  h_ip(ji,jj,jl) = v_ip(ji,jj,jl) / a_ip(ji,jj,jl) 
    612613                   
     
    652653               DO jl = 1, jpl-1 
    653654             
    654                   IF ( v_il(ji,jj,jl) > epsi10 ) THEN 
    655655                
    656                      !---------------------------------------------------------------- 
    657                      ! Lid melting: floating upper ice layer melts in whole or part 
    658                      !---------------------------------------------------------------- 
    659                      ! Use Tsfc for each category 
    660                      IF ( t_su(ji,jj,jl) > zTp ) THEN 
    661  
    662                         zdvice = MIN( dh_i_sum_2d(ji,jj,jl)*a_ip(ji,jj,jl), v_il(ji,jj,jl) ) 
    663                          
    664                         IF ( zdvice > epsi10 ) THEN 
    665                          
    666                            v_il (ji,jj,jl) = v_il (ji,jj,jl)   - zdvice 
    667                            v_ip(ji,jj,jl)  = v_ip(ji,jj,jl)    + zdvice ! MV: not sure i understand dh_i_sum seems counted twice -  
    668                                                                         ! as it is already counted in surface melt 
    669 !                          zvolp(ji,jj)     = zvolp(ji,jj)     + zdvice ! pointless to calculate total volume (done in icevar) 
    670 !                          zfpond(ji,jj)    = fpond(ji,jj)     + zdvice ! pointless to follow fw budget (ponds have no fw) 
    671                       
    672                            IF ( v_il(ji,jj,jl) < epsi10 .AND. v_ip(ji,jj,jl) > epsi10) THEN 
    673                            ! ice lid melted and category is pond covered 
    674                               v_ip(ji,jj,jl)  = v_ip(ji,jj,jl)  + v_il(ji,jj,jl)  
    675 !                             zfpond(ji,jj)    = zfpond (ji,jj)    + v_il(ji,jj,jl)  
    676                               v_il(ji,jj,jl)   = 0._wp 
    677                            ENDIF 
    678                            h_ip(ji,jj,jl) = v_ip(ji,jj,jl) / a_ip(ji,jj,jl) !!! could get a division by zero here 
    679                             
    680                            diag_dvpn_lid(ji,jj) = diag_dvpn_lid(ji,jj) + zdvice   ! diag 
    681                             
    682                         ENDIF 
    683                          
    684                      !---------------------------------------------------------------- 
    685                      ! Freeze pre-existing lid  
    686                      !---------------------------------------------------------------- 
    687  
    688                      ELSE IF ( v_ip(ji,jj,jl) > epsi10 ) THEN ! Tsfcn(i,j,n) <= Tp 
    689  
    690                         ! differential growth of base of surface floating ice layer 
    691                         ! zdTice = MAX( - t_su(ji,jj,jl) - zTd , 0._wp ) ! > 0  ! line valid for temp in C  
    692                         zdTice = MAX( - ( t_su(ji,jj,jl) - zTd ) , 0._wp ) ! > 0    
    693                         zomega = rcnd_i * zdTice / zrhoi_L 
    694                         zdHui  = SQRT( 2._wp * zomega * rdt_ice + ( v_il(ji,jj,jl) / a_i(ji,jj,jl) )**2 ) & 
    695                                - v_il(ji,jj,jl) / a_i(ji,jj,jl) 
    696                         zdvice = min( zdHui*a_ip(ji,jj,jl) , v_ip(ji,jj,jl) ) 
     656                  !---------------------------------------------------------------- 
     657                  ! Lid melting: floating upper ice layer melts in whole or part 
     658                  !---------------------------------------------------------------- 
     659 
     660                  zdvice = MIN( zv_pnd(ji,jj,jl), v_il(ji,jj,jl) ) 
     661 
     662                  v_il (ji,jj,jl) = v_il (ji,jj,jl)   - zdvice 
     663 
     664                  IF ( v_il(ji,jj,jl) < epsi10 ) THEN 
     665                     ! ice lid melted 
     666                     v_il(ji,jj,jl)   = 0._wp 
     667                  ENDIF 
     668 
     669                  diag_dvpn_lid(ji,jj) = diag_dvpn_lid(ji,jj) + zdvice   ! diag 
     670 
     671                  !---------------------------------------------------------------- 
     672                  ! Freeze lid  
     673                  !---------------------------------------------------------------- 
     674 
     675                  ! The temperature of the lid's top surface is warmer than the ice top temperature 
     676                  ! by about 2 degrees (warmed by the melt pond under the lid) 
     677                  lid_Ttop = t_su(ji,jj,jl) + 2.0_wp 
     678 
     679                  ! differential growth of base of surface floating ice layer 
     680                  zdTice = MAX( - ( lid_Ttop - zTp ) , 0._wp ) ! > 0    
     681                  zomega = rcnd_i * zdTice / zrhoi_L 
     682                  zdvice = SQRT( 2._wp * zomega * rdt_ice * a_ip(ji,jj,jl)**2 + v_il(ji,jj,jl)**2 ) & 
     683                         - v_il(ji,jj,jl) 
     684                  zdvice = min( zdvice , v_ip(ji,jj,jl) ) 
     685 
     686                  IF ( zdvice > epsi10 ) THEN 
     687                     v_il (ji,jj,jl)  = v_il(ji,jj,jl)   + zdvice 
     688                     v_ip(ji,jj,jl)   = v_ip(ji,jj,jl)   - zdvice 
     689 
     690                     ! Possibly this check might not be needed to avoid divide by zero errors as at 
     691                     ! the end of ice_thd_pnd_area all ponds with an area less than epsi10 were zerod anyway 
     692                     IF ( a_ip(ji,jj,jl) > epsi10 ) THEN 
     693                        h_ip(ji,jj,jl)   = v_ip(ji,jj,jl) / a_ip(ji,jj,jl) 
     694                     ENDIF 
     695 
     696                     diag_dvpn_lid(ji,jj) = diag_dvpn_lid(ji,jj) - zdvice    ! diag 
     697 
     698                  ENDIF 
    697699                   
    698                         IF ( zdvice > epsi10 ) THEN 
    699                            v_il (ji,jj,jl)  = v_il(ji,jj,jl)   + zdvice 
    700                            v_ip(ji,jj,jl)   = v_ip(ji,jj,jl)   - zdvice 
    701 !                          zvolp(ji,jj)    = zvolp(ji,jj)     - zdvice 
    702 !                          zfpond(ji,jj)   = zfpond(ji,jj)    - zdvice 
    703                            h_ip(ji,jj,jl)   = v_ip(ji,jj,jl) / a_ip(ji,jj,jl) 
    704                             
    705                            diag_dvpn_lid(ji,jj) = diag_dvpn_lid(ji,jj) - zdvice    ! diag 
    706                             
    707                         ENDIF 
    708                    
    709                      ENDIF ! Tsfcn(i,j,n) 
    710  
    711700                  !---------------------------------------------------------------- 
    712                   ! Freeze new lids 
     701                  ! Remove ponds if lids are much larger than ponds 
    713702                  !---------------------------------------------------------------- 
    714                   !  upper ice layer begins to form 
    715                   ! note: albedo does not change 
    716  
    717                   ELSE ! v_il < epsi10 
    718                      
    719                      ! thickness of newly formed ice 
    720                      ! the surface temperature of a meltpond is the same as that 
    721                      ! of the ice underneath (0C), and the thermodynamic surface  
    722                      ! flux is the same 
    723                       
    724                      !!! we need net surface energy flux, excluding conduction 
    725                      !!! fsurf is summed over categories in CICE 
    726                      !!! we have the category-dependent flux, let us use it ? 
    727                      zfsurf = qns_ice(ji,jj,jl) + qsr_ice(ji,jj,jl)                      
    728                      zdHui  = MAX ( -zfsurf * rdt_ice / zrhoi_L , 0._wp ) 
    729                      zdvice = MIN ( zdHui * a_ip(ji,jj,jl) , v_ip(ji,jj,jl) ) 
    730  
    731                      IF ( zdvice > epsi10 ) THEN 
    732  
    733                         v_il (ji,jj,jl)  = v_il(ji,jj,jl)   + zdvice 
    734                         v_ip(ji,jj,jl)   = v_ip(ji,jj,jl)   - zdvice 
    735                         diag_dvpn_lid(ji,jj) = diag_dvpn_lid(ji,jj) - zdvice      ! diag 
    736  
    737 !                       zvolp(ji,jj)     = zvolp(ji,jj)     - zdvice 
    738 !                       zfpond(ji,jj)    = zfpond(ji,jj)    - zdvice 
    739  
    740                         h_ip(ji,jj,jl)   = v_ip(ji,jj,jl) / a_ip(ji,jj,jl) ! MV - in principle, this is useless as h_ip is computed in icevar 
     703 
     704                  IF ( a_ip(ji,jj,jl) > epsi10) THEN 
     705                     h_il(ji,jj,jl) = v_il(ji,jj,jl) / a_ip(ji,jj,jl) 
     706                     IF ( h_il(ji,jj,jl) > h_ip(ji,jj,jl) * 10._wp ) THEN 
     707                        a_ip(ji,jj,jl)      = 0._wp 
     708                        h_ip(ji,jj,jl)      = 0._wp 
     709                        v_ip(ji,jj,jl)      = 0._wp 
     710                        h_il(ji,jj,jl)      = 0._wp 
     711                        v_il(ji,jj,jl)      = 0._wp 
    741712                     ENDIF 
    742                 
    743                   ENDIF  ! v_il 
     713                  ENDIF 
    744714             
    745715               END DO ! jl 
Note: See TracChangeset for help on using the changeset viewer.