Changeset 12439
- Timestamp:
- 2020-02-21T15:43:59+01:00 (5 years ago)
- Location:
- NEMO/branches/UKMO/NEMO_4.0_add_pond_lids_prints
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/UKMO/NEMO_4.0_add_pond_lids_prints/cfgs/SHARED/field_def_nemo-ice.xml
r12394 r12439 224 224 <field id="dmisub" long_name="snow mass change through evaporation or sublimation" standard_name="surface_snow_sublimation_flux" unit="kg/m2/s" /> 225 225 <field id="dmisum" long_name="sea-ice mass change through surface melting" standard_name="tendency_of_sea_ice_amount_due_to_surface_melting" unit="kg/m2/s" /> 226 <field id="dmipnd" long_name="sea-ice mass change through pond overflow" standard_name="tendency_of_sea_ice_amount_due_to_pond_overflow" unit="kg/m2/s" /> 226 227 <field id="dmibom" long_name="sea-ice mass change through bottom melting" standard_name="tendency_of_sea_ice_amount_due_to_basal_melting" unit="kg/m2/s" /> 227 228 <field id="dmsspr" long_name="snow mass change through snow fall" standard_name="snowfall_flux" unit="kg/m2/s" /> … … 396 397 <field field_ref="dmisub" name="sidmassevapsubl" /> 397 398 <field field_ref="dmisum" name="sidmassmelttop" /> 399 <field field_ref="dmipnd" name="sidmasspondleak" /> 398 400 <field field_ref="dmibom" name="sidmassmeltbot" /> 399 401 <field field_ref="dmsspr" name="sndmasssnf" /> -
NEMO/branches/UKMO/NEMO_4.0_add_pond_lids_prints/src/ICE/ice.F90
r12379 r12439 414 414 & wfx_bog (jpi,jpj) , wfx_dyn (jpi,jpj) , wfx_bom(jpi,jpj) , wfx_sum(jpi,jpj) , & 415 415 & wfx_res (jpi,jpj) , wfx_sni (jpi,jpj) , wfx_opw(jpi,jpj) , wfx_spr(jpi,jpj) , & 416 & afx_tot (jpi,jpj) , rn_amax_2d(jpi,jpj) ,&416 & afx_tot (jpi,jpj) , rn_amax_2d(jpi,jpj) , & 417 417 & qsb_ice_bot(jpi,jpj) , qlead (jpi,jpj) , & 418 418 & sfx_res (jpi,jpj) , sfx_bri (jpi,jpj) , sfx_dyn(jpi,jpj) , sfx_sub(jpi,jpj) , sfx_lam(jpi,jpj) , & -
NEMO/branches/UKMO/NEMO_4.0_add_pond_lids_prints/src/ICE/ice1d.F90
r12379 r12439 111 111 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: h_s_1d 112 112 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: dh_s_tot !: Snow accretion/ablation [m] 113 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: dh_i_sum !: Ice surface ablation [m] 113 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: dh_i_sum !: Ice surface ablation into ocean [m] 114 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: dh_i_pnd !: Ice surface adlation into ponds [m] 115 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: dh_s_pnd !: Snow surface adlation into ponds [m] 114 116 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: dh_i_itm !: Ice internal ablation [m] 115 117 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: dh_i_bom !: Ice bottom ablation [m] … … 130 132 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: a_ip_frac_1d !: 131 133 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: lh_ip_1d !: Ice pond lid thickness [m] 134 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: a_pnd_avail_1d !: Fraction of sea ice available for melt ponding 132 135 133 136 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: t_s_1d !: corresponding to the 2D var t_s … … 212 215 & dh_i_sub(jpij) , dh_s_mlt(jpij) , dh_snowice(jpij) , s_i_1d (jpij) , s_i_new (jpij) , & 213 216 & a_ip_1d (jpij) , v_ip_1d (jpij) , v_i_1d (jpij) , v_s_1d (jpij) , lh_ip_1d(jpij) , & 214 & h_ip_1d (jpij) , a_ip_frac_1d(jpij) , 217 & h_ip_1d (jpij) , a_ip_frac_1d(jpij) , dh_i_pnd(jpij) , a_pnd_avail_1d(jpij) , & 215 218 & sv_i_1d (jpij) , oa_i_1d (jpij) , o_i_1d (jpij) , STAT=ierr(ii) ) 216 219 ! -
NEMO/branches/UKMO/NEMO_4.0_add_pond_lids_prints/src/ICE/icealb.F90
r12382 r12439 17 17 USE phycst ! physical constants 18 18 USE dom_oce ! domain: ocean 19 USE icethd_pnd, only: pnd_lid_max, pnd_lid_min 19 20 ! 20 21 USE in_out_manager ! I/O manager … … 100 101 REAL(wp), INTENT( out), DIMENSION(:,:,:) :: palb_cs ! albedo of ice under clear sky 101 102 REAL(wp), INTENT( out), DIMENSION(:,:,:) :: palb_os ! albedo of ice under overcast sky 102 !103 REAL(wp), PARAMETER :: pnd_lid_max = 0.015 ! pond lid thickness above which the ponds disappear from the albedo calculation104 REAL(wp), PARAMETER :: pnd_lid_min = 0.005 ! pond lid thickness below which the full pond area is used in the albedo calculation105 ! Note: these two variables are mirrored in sbccpl.F90 (maybe put them in one place...)106 103 ! 107 104 INTEGER :: ji, jj, jl ! dummy loop indices -
NEMO/branches/UKMO/NEMO_4.0_add_pond_lids_prints/src/ICE/icethd.F90
r12379 r12439 275 275 dh_i_sub (1:npti) = 0._wp ; dh_i_bog(1:npti) = 0._wp 276 276 dh_snowice(1:npti) = 0._wp ; dh_s_mlt(1:npti) = 0._wp 277 dh_i_pnd (1:npti) = 0._wp 278 dh_s_pnd (1:npti) = 0._wp 277 279 ! 278 280 CALL ice_thd_zdf ! --- Ice-Snow temperature --- ! -
NEMO/branches/UKMO/NEMO_4.0_add_pond_lids_prints/src/ICE/icethd_dh.F90
r12369 r12439 24 24 USE lib_mpp ! MPP library 25 25 USE lib_fortran ! fortran utilities (glob_sum + no signed zero) 26 USE icethd_pnd, ONLY : a_pnd_avail 26 27 27 28 IMPLICIT NONE … … 113 114 END SELECT 114 115 116 ! Initialise fraction of sea ice available for melt ponding 117 DO ji = 1, npti 118 a_pnd_avail_1d(ji) = a_pnd_avail * at_i_1d(ji) 119 END DO 120 115 121 ! initialize layer thicknesses and enthalpies 116 122 h_i_old (1:npti,0:nlay_i+1) = 0._wp … … 281 287 ! updates available heat + thickness 282 288 dh_s_mlt(ji) = dh_s_mlt(ji) + zdeltah(ji,jk) 289 dh_s_pnd(ji) = dh_s_pnd(ji) + zdeltah(ji,jk) * a_pnd_avail_1d(ji) ! Cumulate surface melt on areas contributing to melt ponds 283 290 zq_top (ji) = MAX( 0._wp , zq_top(ji) + zdeltah(ji,jk) * e_s_1d(ji,jk) ) 284 291 h_s_1d (ji) = MAX( 0._wp , h_s_1d(ji) + zdeltah(ji,jk) ) 292 h_i_1d (ji) = MAX( 0._wp , h_i_1d(ji) - zdeltah(ji,jk) * a_pnd_avail_1d(ji) * rhos * r1_rhoi ) ! Snow melt trapped in ponds contrbutes to ice thickness 285 293 zh_s (ji,jk) = MAX( 0._wp , zh_s(ji,jk) + zdeltah(ji,jk) ) 286 294 ! … … 400 408 zq_top(ji) = MAX( 0._wp , zq_top(ji) - zdeltah(ji,jk) * rhoi * zdE ) ! update available heat 401 409 402 dh_i_sum(ji) = dh_i_sum(ji) + zdeltah(ji,jk) ! Cumulate surface melt 410 dh_i_sum(ji) = dh_i_sum(ji) + zdeltah(ji,jk) * (1._wp - a_pnd_avail_1d(ji)) ! Cumulate surface melt on areas not contributing to melt ponds 411 dh_i_pnd(ji) = dh_i_pnd(ji) + zdeltah(ji,jk) * a_pnd_avail_1d(ji) ! Cumulate surface melt on areas contributing to melt ponds 403 412 404 413 zfmdt = - rhoi * zdeltah(ji,jk) ! Recompute mass flux [kg/m2, >0] -
NEMO/branches/UKMO/NEMO_4.0_add_pond_lids_prints/src/ICE/icethd_pnd.F90
r12423 r12439 37 37 INTEGER, PARAMETER :: np_pndCST = 1 ! Constant pond scheme 38 38 INTEGER, PARAMETER :: np_pndH12 = 2 ! Evolutive pond scheme (Holland et al. 2012) 39 40 REAL(wp), PUBLIC, PARAMETER :: a_pnd_avail = 0.7_wp ! Fraction of sea ice available for melt ponding 41 REAL(wp), PUBLIC, PARAMETER :: pnd_lid_max = 0.015 ! pond lid thickness above which the ponds disappear from the albedo calculation 42 REAL(wp), PUBLIC, PARAMETER :: pnd_lid_min = 0.005 ! pond lid thickness below which the full pond area is used in the albedo calculation 43 44 REAL(wp), PARAMETER :: snow_lid_min = 0.15 ! Snow thickness above which form a lid of size pnd_lid_min on the melt ponds 45 REAL(wp), PARAMETER :: snow_lid_max = 0.25 ! Snow thickness above which form a lid of size pnd_lid_max on the melt ponds 39 46 40 47 !! * Substitutions … … 135 142 REAL(wp) :: z1_rhow ! inverse freshwater density 136 143 REAL(wp) :: z1_zpnd_aspect ! inverse pond aspect ratio 144 REAL(wp) :: z1_rhoi ! inverse ice density 137 145 REAL(wp) :: zfac, zdum 138 146 REAL(wp) :: t_grad ! Temperature deficit for refreezing … … 140 148 REAL(wp) :: lh_ip_end ! Lid thickness at end of timestep (temporary variable) 141 149 REAL(wp) :: zdh_frz ! Amount of melt pond that freezes (m) 150 REAL(wp) :: v_ip_old ! Pond volume before leaking back to the ocean 151 REAL(wp) :: dh_i_pndleak ! Grid box mean change in water depth due to leaking back to the ocean 152 REAL(wp) :: weighted_lid_snow ! Lid to go on ponds under snow if snow thickness exceeds snow_lid_min 142 153 ! 143 154 INTEGER :: ji ! loop indices … … 146 157 z1_zpnd_aspect = 1._wp / zpnd_aspect 147 158 z1_Tp = 1._wp / zTp 159 z1_rhoi = 1._wp / rhoi 148 160 149 161 ! Define time-independent field for use in refreezing … … 175 187 ! This is the change in ice thickness due to melt scaled up by the realive areas of the meltpond 176 188 ! and the area of sea ice feeding the melt ponds. 177 zdh_mlt = -( dh_i_sum(ji)*rhoi + dh_s_mlt(ji)*rhos ) * z1_rhow * (zrmax * a_i_1d(ji)) / a_ip_1d(ji)189 zdh_mlt = -(dh_i_pnd(ji)*rhoi + dh_s_pnd(ji)*rhos) * z1_rhow * a_i_1d(ji) / a_ip_1d(ji) 178 190 ! 179 191 !--- Pond gowth ---! … … 208 220 END IF 209 221 210 ! melt pond mass flux (<0)211 IF( zdh_mlt > 0._wp ) THEN212 zfac = zdh_mlt * zrmax * a_i_1d(ji) * rhow * r1_rdtice213 wfx_pnd_1d(ji) = wfx_pnd_1d(ji) - zfac214 !215 ! adjust ice/snow melting flux to balance melt pond flux (>0)216 zdum = zfac / ( wfx_snw_sum_1d(ji) + wfx_sum_1d(ji) )217 wfx_snw_sum_1d(ji) = wfx_snw_sum_1d(ji) * (1._wp + zdum)218 wfx_sum_1d(ji) = wfx_sum_1d(ji) * (1._wp + zdum)219 ENDIF220 222 ! 221 223 ! Make sure pond volume or lid thickness has not gone negative … … 237 239 v_ip_1d(ji) = 0._wp 238 240 END IF 241 242 ! If pond area exceeds a_pnd_avail_1d(ji) * a_i_1d(ji) then reduce the pond volume 243 IF ( a_ip_1d(ji) > a_pnd_avail_1d(ji) * a_i_1d(ji) ) THEN 244 v_ip_old = v_ip_1d(ji) ! Save original volume before leak for future use 245 h_ip_1d(ji) = zpnd_aspect * a_pnd_avail_1d(ji) 246 a_ip_1d(ji) = a_pnd_avail_1d(ji) * a_i_1d(ji) 247 v_ip_1d(ji) = h_ip_1d(ji) * a_ip_1d(ji) 248 a_ip_frac_1d(ji) = a_ip_1d(ji) / a_i_1d(ji) 249 250 ! A change in volume of a melt pond is equivalent to a change in water depth in the grid box mean. 251 ! Scale this up to make water depth meaned over sea ice. 252 dh_i_pndleak = (v_ip_1d(ji) - v_ip_old) / a_i_1d(ji) ! This will be a negative number 253 254 ! Output this water loss as a mass flux diagnostic 255 wfx_pnd_1d(ji) = wfx_pnd_1d(ji) - rhow * a_i_1d(ji) * dh_i_pndleak * r1_rdtice 256 257 ! Reduce the ice thickness using densities to convert from a water depth difference to a sea ice thickness difference 258 h_i_1d(ji) = MAX( 0._wp , h_i_1d(ji) + dh_i_pndleak * rhow * z1_rhoi ) 259 ENDIF 260 261 ! If pond depth exceeds half the ice thickness then reduce the pond volume 262 IF ( h_ip_1d(ji) > 0.5_wp * h_i_1d(ji) ) THEN 263 v_ip_old = v_ip_1d(ji) ! Save original volume before leak for future use 264 h_ip_1d(ji) = 0.5_wp * h_i_1d(ji) 265 a_ip_frac_1d(ji) = h_ip_1d(ji) / zpnd_aspect 266 a_ip_1d(ji) = a_ip_frac_1d(ji) * a_i_1d(ji) 267 v_ip_1d(ji) = h_ip_1d(ji) * a_ip_1d(ji) 268 269 ! A change in volume of a melt pond is equivalent to a change in water depth in the grid box mean. 270 ! Scale this up to make water depth meaned over sea ice. 271 dh_i_pndleak = (v_ip_1d(ji) - v_ip_old) / a_i_1d(ji) ! This will be a negative number 272 273 ! Output this water loss as a mass flux diagnostic 274 wfx_pnd_1d(ji) = wfx_pnd_1d(ji) - rhow * a_i_1d(ji) * dh_i_pndleak * r1_rdtice 275 276 ! Reduce the ice thickness using densities to convert from a water depth difference to a sea ice thickness difference 277 h_i_1d(ji) = MAX( 0._wp , h_i_1d(ji) + dh_i_pndleak * rhow * z1_rhoi ) 278 ENDIF 279 280 ! If any of the previous two IF tests has removed all the ice thickness then remove ice area. 281 IF ( h_i_1d(ji) == 0._wp ) THEN 282 a_i_1d(ji) = 0._wp 283 h_s_1d(ji) = 0._wp 284 ENDIF 285 286 ! If snow thickness exceeds snow_lid_min then form a very thin lid (so snow can go over the top) 287 IF ( h_s_1d(ji) > snow_lid_min .AND. h_s_1d(ji) < snow_lid_max ) THEN 288 weighted_lid_snow = (snow_lid_max - h_s_1d(ji))/(snow_lid_max-snow_lid_min) * pnd_lid_min + & 289 (h_s_1d(ji) - snow_lid_min)/(snow_lid_max-snow_lid_min) * pnd_lid_max 290 lh_ip_1d(ji) = MAX(lh_ip_1d(ji), weighted_lid_snow) 291 ENDIF 292 IF ( h_s_1d(ji) >= snow_lid_max ) THEN 293 lh_ip_1d(ji) = MAX(lh_ip_1d(ji), pnd_lid_max) 294 ENDIF 295 239 296 ! 240 297 ENDIF … … 245 302 write(numout,*)'icethd_pnd: meltt = ', -( dh_i_sum(ji)*rhoi + dh_s_mlt(ji)*rhos ) / rhoi 246 303 write(numout,*)'icethd_pnd: lh_ip_1d(ji), zdh_mlt, zdh_frz, t_su_1d(ji) = ',lh_ip_1d(ji), ' ', zdh_mlt, ' ', zdh_frz, ' ', t_su_1d(ji) 304 write(numout,*)'icethd_pnd: a_pnd_avail_1d(ji), at_i_1d(ji), wfx_pnd_1d(ji), h_i_1d(ji) = ', a_pnd_avail_1d(ji), ' ', at_i_1d(ji), ' ', wfx_pnd_1d(ji), ' ', h_i_1d(ji) 247 305 END IF 248 306 -
NEMO/branches/UKMO/NEMO_4.0_add_pond_lids_prints/src/ICE/icewri.F90
r12394 r12439 172 172 !------------------ 173 173 ! trends 174 IF( iom_use('dmithd') ) CALL iom_put( "dmithd", - wfx_bog - wfx_bom - wfx_sum - wfx_sni - wfx_opw - wfx_lam - wfx_res ) ! Sea-ice mass change from thermodynamics174 IF( iom_use('dmithd') ) CALL iom_put( "dmithd", - wfx_bog - wfx_bom - wfx_sum - wfx_sni - wfx_opw - wfx_lam - wfx_res - wfx_pnd ) ! Sea-ice mass change from thermodynamics 175 175 IF( iom_use('dmidyn') ) CALL iom_put( "dmidyn", - wfx_dyn + rhoi * diag_trp_vi ) ! Sea-ice mass change from dynamics(kg/m2/s) 176 176 IF( iom_use('dmiopw') ) CALL iom_put( "dmiopw", - wfx_opw ) ! Sea-ice mass change through growth in open water … … 178 178 IF( iom_use('dmisni') ) CALL iom_put( "dmisni", - wfx_sni ) ! Sea-ice mass change through snow-to-ice conversion 179 179 IF( iom_use('dmisum') ) CALL iom_put( "dmisum", - wfx_sum ) ! Sea-ice mass change through surface melting 180 IF( iom_use('dmipnd') ) CALL iom_put( "dmipnd", - wfx_pnd ) ! Sea-ice mass change through meltponds overflowing to ocean 180 181 IF( iom_use('dmibom') ) CALL iom_put( "dmibom", - wfx_bom ) ! Sea-ice mass change through bottom melting 181 182 IF( iom_use('dmtsub') ) CALL iom_put( "dmtsub", - wfx_sub ) ! Sea-ice mass change through evaporation and sublimation -
NEMO/branches/UKMO/NEMO_4.0_add_pond_lids_prints/src/OCE/SBC/sbccpl.F90
r12394 r12439 29 29 #if defined key_si3 30 30 USE ice ! ice variables 31 USE icethd_pnd, only: pnd_lid_max, pnd_lid_min 31 32 #endif 32 33 USE cpl_oasis3 ! OASIS3 coupling … … 2122 2123 INTEGER, INTENT(in) :: kt 2123 2124 ! 2124 REAL(wp), PARAMETER :: pnd_lid_max = 0.015 ! pond lid thickness above which the ponds disappear from the albedo calculation2125 REAL(wp), PARAMETER :: pnd_lid_min = 0.005 ! pond lid thickness below which the full pond area is used in the albedo calculation2126 ! Note: these two variables are mirrored in icealb.F90 (maybe put them in one place...)2127 2125 ! 2128 2126 INTEGER :: ji, jj, jl ! dummy loop indices
Note: See TracChangeset
for help on using the changeset viewer.