From fa56e7e387b1cf8f4de1d9b488386ef15249cbac Mon Sep 17 00:00:00 2001 From: Tony Craig Date: Tue, 26 Nov 2024 12:57:54 -0800 Subject: [PATCH 01/34] Update Perlmutter Port, switch to cce/17.0.0, gnu/12.3, and intel/2023.2.0 (#509) Update icepack_compute_tracers argument definitions to support cce/17.0.0. Switched two arguments from explicit size to assumed shape. Cleaned up some trailing blanks. --- columnphysics/icepack_fsd.F90 | 2 +- columnphysics/icepack_tracers.F90 | 4 ++-- configuration/scripts/machines/env.perlmutter_cray | 10 +++++----- configuration/scripts/machines/env.perlmutter_gnu | 8 ++++---- configuration/scripts/machines/env.perlmutter_intel | 10 +++++----- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/columnphysics/icepack_fsd.F90 b/columnphysics/icepack_fsd.F90 index 2e5175afa..75086a024 100644 --- a/columnphysics/icepack_fsd.F90 +++ b/columnphysics/icepack_fsd.F90 @@ -180,7 +180,7 @@ subroutine icepack_init_fsd_bounds( & floe_area_c (nfsd), & ! fsd area at bin centre (m^2) floe_area_binwidth (nfsd), & ! floe area bin width (m^2) floe_binwidth (nfsd), & ! floe bin width (m) - c_fsd_range (nfsd), & ! + c_fsd_range (nfsd), & ! iweld (nfsd, nfsd), & ! fsd categories that can weld stat=ierr) if (ierr/=0) then diff --git a/columnphysics/icepack_tracers.F90 b/columnphysics/icepack_tracers.F90 index fc3fafa8b..afa8204d5 100644 --- a/columnphysics/icepack_tracers.F90 +++ b/columnphysics/icepack_tracers.F90 @@ -1203,7 +1203,7 @@ subroutine icepack_compute_tracers (trcr_depend, & trcr_base, n_trcr_strata, & nt_strata, trcrn, Tf) - integer (kind=int_kind), dimension (ntrcr), intent(in) :: & + integer (kind=int_kind), dimension (:), intent(in) :: & trcr_depend, & ! = 0 for aicen tracers, 1 for vicen, 2 for vsnon n_trcr_strata ! number of underlying tracer layers @@ -1222,7 +1222,7 @@ subroutine icepack_compute_tracers (trcr_depend, & vicen , & ! volume per unit area of ice (m) vsnon ! volume per unit area of snow (m) - real (kind=dbl_kind), dimension (ntrcr), intent(out) :: & + real (kind=dbl_kind), dimension (:), intent(out) :: & trcrn ! ice tracers real (kind=dbl_kind), intent(in) :: & diff --git a/configuration/scripts/machines/env.perlmutter_cray b/configuration/scripts/machines/env.perlmutter_cray index 6cafd0153..8f20da6b8 100644 --- a/configuration/scripts/machines/env.perlmutter_cray +++ b/configuration/scripts/machines/env.perlmutter_cray @@ -18,13 +18,13 @@ source ${MODULESHOME}/init/csh #module load cpe/23.03 #module unload gpu module load cpu -module load PrgEnv-cray +module load PrgEnv-cray/8.5.0 module unload cce -module load cce/15.0.1 +module load cce/17.0.0 module unload cray-netcdf module unload cray-hdf5 -module load cray-hdf5/1.12.2.3 -module load cray-netcdf/4.9.0.3 +module load cray-hdf5/1.12.2.9 +module load cray-netcdf/4.9.0.9 #module unload cray-pals #module load cray-pals/1.2.2 @@ -37,7 +37,7 @@ setenv PALS_QUIET TRUE setenv ICE_MACHINE_MACHNAME perlmutter setenv ICE_MACHINE_MACHINFO "HPE Cray EX AMD EPYC 7763 Milan, Slingshot-11 Interconnect" setenv ICE_MACHINE_ENVNAME cray -setenv ICE_MACHINE_ENVINFO "Cray clang/Fortran 15.0.1, netcdf4.9.0.3" +setenv ICE_MACHINE_ENVINFO "Cray clang/Fortran 17.0.0, netcdf4.9.0.9" setenv ICE_MACHINE_MAKE gmake setenv ICE_MACHINE_WKDIR $SCRATCH/ICEPACK_RUNS setenv ICE_MACHINE_INPUTDATA /global/cfs/cdirs/e3sm/tcraig/cice-consortium diff --git a/configuration/scripts/machines/env.perlmutter_gnu b/configuration/scripts/machines/env.perlmutter_gnu index 417cdc897..5969a4002 100644 --- a/configuration/scripts/machines/env.perlmutter_gnu +++ b/configuration/scripts/machines/env.perlmutter_gnu @@ -18,13 +18,13 @@ source ${MODULESHOME}/init/csh #module load cpe/23.03 #module unload gpu module load cpu -module load PrgEnv-gnu +module load PrgEnv-gnu/8.5.0 module unload gcc -module load gcc/11.2.0 +module load gcc-native/12.3 module unload cray-netcdf module unload cray-hdf5 -module load cray-hdf5/1.12.2.3 -module load cray-netcdf/4.9.0.3 +module load cray-hdf5/1.12.2.9 +module load cray-netcdf/4.9.0.9 #module unload cray-pals #module load cray-pals/1.2.2 diff --git a/configuration/scripts/machines/env.perlmutter_intel b/configuration/scripts/machines/env.perlmutter_intel index 85b6989af..12a036604 100644 --- a/configuration/scripts/machines/env.perlmutter_intel +++ b/configuration/scripts/machines/env.perlmutter_intel @@ -18,13 +18,13 @@ source ${MODULESHOME}/init/csh #module load cpe/23.03 #module unload gpu module load cpu -module load PrgEnv-intel +module load PrgEnv-intel/8.5.0 module unload intel -module load intel/2023.1.0 +module load intel/2023.2.0 module unload cray-netcdf module unload cray-hdf5 -module load cray-hdf5/1.12.2.3 -module load cray-netcdf/4.9.0.3 +module load cray-hdf5/1.12.2.9 +module load cray-netcdf/4.9.0.9 #module unload cray-pals #module load cray-pals/1.2.2 @@ -37,7 +37,7 @@ setenv PALS_QUIET TRUE setenv ICE_MACHINE_MACHNAME perlmutter setenv ICE_MACHINE_MACHINFO "HPE Cray EX AMD EPYC 7763 Milan, Slingshot-11 Interconnect" setenv ICE_MACHINE_ENVNAME intel -setenv ICE_MACHINE_ENVINFO "ifort 2021.9.0 20230302, netcdf4.9.0.3" +setenv ICE_MACHINE_ENVINFO "ifort 2021.10.0 20230609, netcdf4.9.0.9" setenv ICE_MACHINE_MAKE gmake setenv ICE_MACHINE_WKDIR $SCRATCH/ICEPACK_RUNS setenv ICE_MACHINE_INPUTDATA /global/cfs/cdirs/e3sm/tcraig/cice-consortium From 43ead56380bf11ecad66f165dcd736ed0c278763 Mon Sep 17 00:00:00 2001 From: davidclemenssewall <51925832+davidclemenssewall@users.noreply.github.com> Date: Tue, 17 Dec 2024 10:07:54 -0700 Subject: [PATCH 02/34] hocn calculation and flushing velocity issue (#504) Currently, there are two bugs in how icepack computes the height of the ocean above the ice base in icepack_therm_mushy.F90 line 3141: hocn = (ice_mass + hpond * apond * rhow + hsn * rhos) / rhow First, rhow is the density of ocean water, but ponds that depress the ice surface are generally found to be fresh water. Thus, rhow in the numerator should be replaced by rhofresh. Second, apond here is the category pond area tracer, however it is being treated as the category pond area fraction (see footnote below). For the level-ice scheme, the category pond area fraction is apnd*alvl. This PR fixes both issues. There were also offsetting errors in the flushing_velocity and flush_pond subroutines that have been fixed. I believe that the second bug was made more likely by using inconsistent naming conventions for the pond area tracer and pond area fraction. In icepack_meltpond_lvl.F90 and other parts of the code base, it appears that the general convention is to use apnd to denote the pond area tracer and apondn for the category or full-grid-cell pond area fraction (i.e., apondn = apnd*alvl for the level pond scheme). I propose that we follow this convention throughout the code base, such that apnd always refers to the pond area tracer. This PR makes these changes in the mushy and vertical thermodynamics modules. Footnote: there is an alternate interpretation of using just the pond area tracer in the numerator for the level pond scheme which is that the level areas of an ice category separated from the deformed areas by borders of zero flexural rigidity (i.e., the thicker, pond-free, deformed ice cannot provide any upward buoyancy force to the level, ponded areas). If this is the intention, then I think we need to also use the level ice volume (vlvl) in the calculation of ice mass and the level-ice snow depth for consistency. --- columnphysics/icepack_atmo.F90 | 9 +++---- columnphysics/icepack_therm_mushy.F90 | 10 ++++---- columnphysics/icepack_therm_vertical.F90 | 32 ++++++++++++++++++++---- 3 files changed, 35 insertions(+), 16 deletions(-) diff --git a/columnphysics/icepack_atmo.F90 b/columnphysics/icepack_atmo.F90 index f85b7794b..2cee353f5 100644 --- a/columnphysics/icepack_atmo.F90 +++ b/columnphysics/icepack_atmo.F90 @@ -507,8 +507,7 @@ end subroutine atmo_boundary_const ! ! changes: Andrew Roberts, NPS (RASM/CESM coupling and documentation) - subroutine neutral_drag_coeffs (apnd, hpnd, & - ipnd, & + subroutine neutral_drag_coeffs (apondn, & alvl, vlvl, & aice, vice, & vsno, aicen, & @@ -526,9 +525,7 @@ subroutine neutral_drag_coeffs (apnd, hpnd, & use icepack_tracers, only: tr_pond real (kind=dbl_kind), dimension (:), intent(in) :: & - apnd ,& ! melt pond fraction of sea ice - hpnd ,& ! mean melt pond depth over sea ice - ipnd ,& ! mean ice pond depth over sea ice in cat n + apondn ,& ! melt pond fraction of sea ice category alvl ,& ! level ice area fraction (of grid cell ?) vlvl ! level ice mean thickness @@ -666,7 +663,7 @@ subroutine neutral_drag_coeffs (apnd, hpnd, & if (tr_pond) then do n = 1,ncat ! area of pond per unit area of grid cell - apond = apond+apnd(n)*aicen(n) + apond = apond+apondn(n)*aicen(n) enddo endif diff --git a/columnphysics/icepack_therm_mushy.F90 b/columnphysics/icepack_therm_mushy.F90 index 00438e8de..79146c342 100644 --- a/columnphysics/icepack_therm_mushy.F90 +++ b/columnphysics/icepack_therm_mushy.F90 @@ -5,7 +5,7 @@ module icepack_therm_mushy use icepack_kinds use icepack_parameters, only: c0, c1, c2, c8, c10 use icepack_parameters, only: p01, p05, p1, p2, p5, pi, bignum, puny - use icepack_parameters, only: viscosity_dyn, rhow, rhoi, rhos, cp_ocn, cp_ice, Lfresh, gravit + use icepack_parameters, only: viscosity_dyn, rhow, rhoi, rhos, cp_ocn, cp_ice, Lfresh, gravit, rhofresh use icepack_parameters, only: hs_min, snwgrain use icepack_parameters, only: a_rapid_mode, Rac_rapid_mode, tscale_pnd_drain use icepack_parameters, only: aspect_rapid_mode, dSdt_slow_mode, phi_c_slow_mode @@ -80,7 +80,7 @@ subroutine temperature_changes_salinity(dt, & real (kind=dbl_kind), intent(inout) :: & hilyr , & ! ice layer thickness (m) hslyr , & ! snow layer thickness (m) - apond , & ! melt pond area fraction + apond , & ! melt pond area fraction of category hpond ! melt pond depth (m) real (kind=dbl_kind), dimension (:), intent(inout) :: & @@ -3077,7 +3077,7 @@ subroutine flushing_velocity(zTin, phi, & real(kind=dbl_kind), intent(in) :: & hilyr , & ! ice layer thickness (m) hpond , & ! melt pond thickness (m) - apond , & ! melt pond area (-) + apond , & ! melt pond area fraction of category (-) hsn , & ! snow thickness (m) hin , & ! ice thickness (m) dt ! time step (s) @@ -3138,7 +3138,7 @@ subroutine flushing_velocity(zTin, phi, & perm_harm = real(nilyr,dbl_kind) / perm_harm ! calculate ocean surface height above bottom of ice - hocn = (ice_mass + hpond * apond * rhow + hsn * rhos) / rhow + hocn = (ice_mass + hpond * apond * rhofresh + hsn * rhos) / rhow ! calculate brine height above bottom of ice hbrine = hin + hpond @@ -3178,7 +3178,7 @@ subroutine flush_pond(w, hpond, apond, dt) real(kind=dbl_kind), intent(in) :: & w , & ! vertical flushing Darcy flow rate (m s-1) - apond , & ! melt pond area (-) + apond , & ! melt pond area fraction of category (-) dt ! time step (s) real(kind=dbl_kind), intent(inout) :: & diff --git a/columnphysics/icepack_therm_vertical.F90 b/columnphysics/icepack_therm_vertical.F90 index a0aa6b84a..e931629ce 100644 --- a/columnphysics/icepack_therm_vertical.F90 +++ b/columnphysics/icepack_therm_vertical.F90 @@ -122,7 +122,7 @@ subroutine thermo_vertical (dt, aicen, & ! tracers real (kind=dbl_kind), intent(inout) :: & Tsf , & ! ice/snow top surface temp, same as Tsfcn (deg C) - apond , & ! melt pond area fraction + apond , & ! melt pond area fraction of category hpond ! melt pond depth (m) ! iage ! ice age (s) @@ -2336,7 +2336,7 @@ subroutine icepack_step_therm1(dt, & Tsfc , & ! ice/snow surface temperature, Tsfcn alvl , & ! level ice area fraction vlvl , & ! level ice volume fraction - apnd , & ! melt pond area fraction + apnd , & ! melt pond area fraction tracer hpnd , & ! melt pond depth (m) ipnd , & ! melt pond refrozen lid thickness (m) iage , & ! volume-weighted ice age @@ -2437,6 +2437,7 @@ subroutine icepack_step_therm1(dt, & smliq ! tracer for mass of liquid in snow (kg/m^3) real (kind=dbl_kind), dimension(ncat) :: & + apond , & ! melt pond area fraction of category l_meltsliqn ! mass of snow melt local (kg/m^2) real (kind=dbl_kind) :: & @@ -2526,6 +2527,17 @@ subroutine icepack_step_therm1(dt, & massicen(:,:) = c0 massliqn(:,:) = c0 + !----------------------------------------------------------------- + ! Initialize pond area fractions + !----------------------------------------------------------------- + do n= 1, ncat + if (tr_pond_lvl) then + apond(n) = apnd(n) * alvl(n) + else + apond(n) = apnd(n) + endif + enddo + !----------------------------------------------------------------- ! Initialize rate of snow loss to leads !----------------------------------------------------------------- @@ -2556,8 +2568,7 @@ subroutine icepack_step_therm1(dt, & !----------------------------------------------------------------- if (formdrag) then - call neutral_drag_coeffs (apnd , & - hpnd , ipnd , & + call neutral_drag_coeffs (apond , & alvl , vlvl , & aice , vice, & vsno , aicen , & @@ -2704,7 +2715,7 @@ subroutine icepack_step_therm1(dt, & vicen=vicen (n), vsnon=vsnon (n), & Tsf=Tsfc (n), zSin=zSin (:,n), & zqin=zqin (:,n), zqsn=zqsn (:,n), & - apond=apnd (n), hpond=hpnd (n), & + apond=apond (n), hpond=hpnd (n), & flw=flw, potT=potT, & Qa=Qa, rhoa=rhoa, & fsnow=fsnow, fpond=fpond, & @@ -2736,6 +2747,17 @@ subroutine icepack_step_therm1(dt, & return endif + ! Translate changes in apond into apnd tracer + if (tr_pond_lvl) then + if (alvl(n) > puny) then + apnd(n) = max(apond(n) / alvl(n), c1) + else + apnd(n) = c0 + endif + else + apnd(n) = apond(n) + endif + if (snwgrain) then rsnwn (:,n) = rsnw (:) smicen(:,n) = smice(:) From 9f4b99afd90416cddc82cfd37ba90eb8ecebded3 Mon Sep 17 00:00:00 2001 From: Tony Craig Date: Thu, 16 Jan 2025 16:17:51 -0800 Subject: [PATCH 03/34] Update derecho gnu, add code coverage capability via lcov (#510) Update derecho gnu to support code coverage testing Update to ncarenv/24.12 and gcc/12.4.0 Add coverage compiler flags Add parse_lcov.sh script to support manually parsing lcov info files (not used in production) Update lcov scripting as needed Change derecho gnu non-debug tests to -O2. This should have always been the case, but was not. This results in answers changes relative to main but only for derecho gnu with debug off. As part of the CICE port to the new coverage tools, a bug was found in the tools that requires debug flags to be disabled when compiling with coverage flags. This was not the case when coverage was running on cheyenne. See linux-test-project/lcov#385 --- .../scripts/machines/Macros.derecho_gnu | 9 ++ .../scripts/machines/env.derecho_gnu | 29 ++++++- configuration/scripts/tests/icepack.lcov.csh | 21 ++++- configuration/scripts/tests/parse_lcov.sh | 86 +++++++++++++++++++ icepack.setup | 21 ++++- 5 files changed, 158 insertions(+), 8 deletions(-) create mode 100755 configuration/scripts/tests/parse_lcov.sh diff --git a/configuration/scripts/machines/Macros.derecho_gnu b/configuration/scripts/machines/Macros.derecho_gnu index 103ff8cdf..0ad50a67d 100644 --- a/configuration/scripts/machines/Macros.derecho_gnu +++ b/configuration/scripts/machines/Macros.derecho_gnu @@ -11,10 +11,19 @@ FREEFLAGS := -ffree-form FFLAGS := -fconvert=big-endian -fbacktrace -ffree-line-length-none -fallow-argument-mismatch FFLAGS_NOOPT:= -O0 +ifeq ($(ICE_COVERAGE), true) + FFLAGS += -O0 -g -fprofile-arcs -ftest-coverage + CFLAGS += -O0 -g -coverage + LDFLAGS += -g -ftest-coverage -fprofile-arcs +else ifeq ($(ICE_BLDDEBUG), true) FFLAGS += -O0 -g -fcheck=bounds -finit-real=nan -fimplicit-none -ffpe-trap=invalid,zero,overflow --std f2008 # FFLAGS += -O0 -g -fcheck=all -finit-real=snan -fimplicit-none -ffpe-trap=invalid,zero,overflow CFLAGS += -O0 +else + FFLAGS += -O2 + CFLAGS += -O2 +endif endif SCC := gcc diff --git a/configuration/scripts/machines/env.derecho_gnu b/configuration/scripts/machines/env.derecho_gnu index 0b5121c12..791b57964 100644 --- a/configuration/scripts/machines/env.derecho_gnu +++ b/configuration/scripts/machines/env.derecho_gnu @@ -10,14 +10,15 @@ if ("$inp" != "-nomodules") then source ${MODULESHOME}/init/csh module --force purge -module load ncarenv/23.06 +module load ncarenv/24.12 module load craype -module load gcc/12.2.0 +module load gcc/12.4.0 module load ncarcompilers #module load cray-mpich/8.1.25 #module load hdf5/1.12.2 module load netcdf/4.9.2 -module load cray-libsci/23.02.1.1 +module load cray-libsci/24.03.0 +module load lcov # For perftools with mpiexec # module load perftools-base @@ -38,7 +39,7 @@ setenv OMP_STACKSIZE 64M setenv ICE_MACHINE_MACHNAME derecho setenv ICE_MACHINE_MACHINFO "HPE Cray EX Milan Slingshot 11" setenv ICE_MACHINE_ENVNAME gnu -setenv ICE_MACHINE_ENVINFO "gcc 12.2.0 20220819, netcdf4.9.2" +setenv ICE_MACHINE_ENVINFO "gcc 12.4.0, netcdf4.9.2" setenv ICE_MACHINE_MAKE gmake setenv ICE_MACHINE_WKDIR /glade/derecho/scratch/$user/ICEPACK_RUNS setenv ICE_MACHINE_INPUTDATA /glade/campaign/cesm/development/pcwg @@ -49,3 +50,23 @@ setenv ICE_MACHINE_QUEUE "develop" setenv ICE_MACHINE_TPNODE 128 setenv ICE_MACHINE_BLDTHRDS 1 setenv ICE_MACHINE_QSTAT "qstat " + +# For lcov +#set lcovpath = "/glade/u/home/tcraig/bin" +#set lcovp5l = "/glade/u/home/tcraig/usr/lib/perl5/site_perl/5.18.2/x86_64-linux-thread-multi" + +#if ($?PATH) then +# if ("$PATH" !~ "*${lcovpath}*") then +# setenv PATH ${PATH}:$lcovpath +# endif +#else +# setenv PATH $lcovpath +#endif + +#if ($?PERL5LIB) then +# if ("$PERL5LIB" !~ "*${lcovp5l}*") then +# setenv PERL5LIB ${PERL5LIB}:$lcovp5l +# endif +#else +# setenv PERL5LIB $lcovp5l +#endif diff --git a/configuration/scripts/tests/icepack.lcov.csh b/configuration/scripts/tests/icepack.lcov.csh index 1f9efd09b..b3668060a 100644 --- a/configuration/scripts/tests/icepack.lcov.csh +++ b/configuration/scripts/tests/icepack.lcov.csh @@ -6,7 +6,19 @@ lcov ${lcovalist} -o total.info set lcovrepo = apcraig.github.io set lcovhtmldir = lcov_icepack_${report_name} -genhtml -o ./${lcovhtmldir} --precision 2 -t "${report_name}" total.info +if ("${useparser}" =~ "true") then + #local parsing script + mkdir ./${lcovhtmldir} + ./parse_lcov.sh >! ./${lcovhtmldir}/${lcovhtmldir}.txt + cat >! ./${lcovhtmldir}/index.html < + +EOF +else + #genhtml + genhtml -o ./${lcovhtmldir} --precision 2 -t "${report_name}" total.info +endif rm -r -f ${lcovrepo} git clone https://github.com/apcraig/${lcovrepo} @@ -14,7 +26,12 @@ cp -p -r ${lcovhtmldir} ${lcovrepo}/ cd ${lcovrepo} set covp0 = `grep message coverage_icepack.json | cut -d : -f 2 | cut -d \" -f 2 | cut -d % -f 1` -set covp = `grep -i headerCovTableEntry ${lcovhtmldir}/index.html | grep % | head -1 | cut -d \> -f 2 | cut -d % -f 1` +if ("${useparser}" =~ "true") then + set covp = `grep "**TOTAL**" ${lcovhtmldir}/${lcovhtmldir}.txt | cut -d \% -f 1` +else + set covp = `grep -i headerCovTableEntry ${lcovhtmldir}/index.html | grep % | head -1 | cut -d \> -f 2 | cut -d \& -f 1` + set covp = "${covp}%" +endif set covpi = `echo $covp | cut -d . -f 1` set lcovhtmlname = "${covpi}%:${report_name}" diff --git a/configuration/scripts/tests/parse_lcov.sh b/configuration/scripts/tests/parse_lcov.sh new file mode 100755 index 000000000..b4733e23c --- /dev/null +++ b/configuration/scripts/tests/parse_lcov.sh @@ -0,0 +1,86 @@ +#!/bin/sh + +INFILE=total.info + +file="ZZZ" +tfunc=0 +thit=0 +tfnd=0 +dacnt=0 +declare -a func +declare -a lines +declare -a linee +declare -a fhit +declare -a ffnd +echo " " + +while read -r LINE +do + case $LINE in + SF:*) + file="${LINE##*/}" + ;; + FN:*) + if [[ "$LINE" =~ ^FN:(.*),(.*),.*_MOD_(.*)$ ]]; then + func[$tfunc]="${BASH_REMATCH[3]}" + lines[$tfunc]="${BASH_REMATCH[1]}" + linee[$tfunc]="${BASH_REMATCH[2]}" + fhit[$tfunc]=0 + ffnd[$tfunc]=0 + tfunc=$(($tfunc + 1)) + fi + ;; + DA:*) + if [[ "$LINE" =~ ^DA:(.*),(.*)$ ]]; then + lnum="${BASH_REMATCH[1]}" + lhit="${BASH_REMATCH[2]}" +# echo "tcx3a ${linee[$dacnt]} $lnum $lhit $dacnt" + if [[ $lnum -lt ${lines[$dacnt]} || $lnum -gt ${linee[$dacnt]} ]]; then + cnt=0 + while [ $cnt -lt $tfunc ]; do + if [[ $lnum -ge ${lines[$cnt]} && $lnum -le ${linee[$cnt]} ]]; then + dacnt=$cnt + fi + cnt=$(($cnt + 1)) + done + fi +# echo "tcx3b $lnum $lhit $dacnt" + ffnd[$dacnt]=$((ffnd[$dacnt] + 1)) + if [[ $lhit -gt 0 ]]; then + fhit[$dacnt]=$((fhit[$dacnt] + 1)) + fi + fi + ;; + LF:*) + fnd="${LINE##*:}" + ;; + LH:*) + hit="${LINE##*:}" + ;; + end_of_record) + thit=$(($thit + $hit)) + tfnd=$(($tfnd + $fnd)) + percent=`echo "scale=2; $hit * 100. / $fnd" | bc` + printf "%6.2f%% %-42s %5d %5d\n" $percent $file $hit $fnd + cnt=0 + while [ $cnt -lt $tfunc ]; do + percent=`echo "scale=2; $((fhit[$cnt] * 100 / ffnd[$cnt]))" | bc` +# printf "%6.2f%% %-40s %5d %5d\n" 0 ${func[$cnt]} ${lines[$cnt]} ${linee[$cnt]} + printf "%12.2f%% %-36s %5d %5d\n" $percent ${func[$cnt]} ${fhit[$cnt]} ${ffnd[$cnt]} + cnt=$(($cnt + 1)) + done + file="ZZZ" + tfunc=0 + dacnt=0 + ;; + *) + ;; + esac + +done < "$INFILE" + +echo " " +#echo "tcx1 $thit $tfnd" +percent=`echo "scale=2; $thit * 100. / $tfnd" | bc` +printf "%6.2f%% %-32s %10d %10d\n" $percent **TOTAL** $thit $tfnd +echo " " diff --git a/icepack.setup b/icepack.setup index 788a273c8..d6cf67255 100755 --- a/icepack.setup +++ b/icepack.setup @@ -426,6 +426,7 @@ else cp -f ${ICE_SCRIPTS}/tests/report_results.csh ${tsdir} cp -f ${ICE_SCRIPTS}/tests/timeseries.csh ${tsdir} cp -f ${ICE_SCRIPTS}/tests/poll_queue.csh ${tsdir} + cp -f ${ICE_SCRIPTS}/tests/parse_lcov.sh ${tsdir} cat >! ${tsdir}/suite.run << EOF0 #!/bin/csh -f @@ -466,6 +467,21 @@ EOF0 cat >! ${tsdir}/report_codecov.csh << EOF0 #!/bin/csh -f +set useparser = false +if (\$#argv > 0) then + if (\$#argv > 1) then + echo "\${0}: ERROR, -parse is the only optional argument allowed" + exit 3 + else + if ("\$argv[1]" =~ "-parse") then + set useparser = true + else + echo "\${0}: ERROR, -parse is the only optional argument allowed" + exit 3 + endif + endif +endif + source ${ICE_SCRIPTS}/machines/env.${machcomp} set rn0 = "${sdate}-${stime}:${shhash}:${testsuitecnt}:${testsuite}" @@ -903,7 +919,7 @@ cp ${rundir}/compile/*.{gcno,gcda} ${testname_base}/codecov_output/ EOF cat >> ${tsdir}/report_lcov.csh << EOF -lcov --gcov-tool gcov -c -d ${rundir}/compile -o ${testname_base}/lcov.info +lcov --gcov-tool gcov -c --rc geninfo_unexecuted_blocks=1 -d ${rundir}/compile -o ${testname_base}/lcov.info if (-s ${testname_base}/lcov.info) then set lcovalist = "\${lcovalist} -a ${testname_base}/lcov.info" endif @@ -917,7 +933,7 @@ echo "${testname_base}" cd ${testname_base} source ./icepack.settings set md5chk = \`where md5sum\` -if ("\${md5chk}" != "") then +if ("\${md5chk}" != "" && "${coverage}" == "0") then set md5file = icepack.settings.md5 grep -v " ICE_CASENAME " icepack.settings | grep -v " ICE_CASEDIR " | grep -v " ICE_RUNDIR " | grep -v " ICE_TESTNAME " | grep -v " ICE_TEST " >! \${md5file} set icepsetmd5 = \` md5sum \${md5file} | cut -d " " -f 1 \` @@ -987,6 +1003,7 @@ EOF0 if ($coverage == 1) then echo "Generating coverage reports" ./poll_queue.csh +# ./report_lcov.csh -parse ./report_lcov.csh # ./report_codecov.csh endif From 352e6bc10683a23d024e1e8503ddad8d7e616fdc Mon Sep 17 00:00:00 2001 From: Tony Craig Date: Thu, 13 Feb 2025 09:31:10 -0800 Subject: [PATCH 04/34] Update copyright to 2025 (#514) --- LICENSE.pdf | Bin 55309 -> 60894 bytes columnphysics/icepack_intfc.F90 | 4 ++-- configuration/driver/icedrv_MAIN.F90 | 4 ++-- doc/source/conf.py | 2 +- doc/source/intro/copyright.rst | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/LICENSE.pdf b/LICENSE.pdf index 18e26a09961123cc71743b11a8c7c894bf3eaf13..b3a33201e64493d796f1158ae64e8d11f68ec393 100644 GIT binary patch literal 60894 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

@aOnzE0DpkBM2wec1Vr#*vTB6VV;PVTA z9`?a7F(6uV)RE-44o%DEi8GvACbBkV?~pxSC27daPGm1BZwZx)ZL!~OB3^PY`C=4z zu{`)VC#w5KTXUR$l|~YjK9RP(V|{8iJ#IFiSFdyWs#SDPgBLg54I&+)n_gUnFW-J$ z&`<;XDglp$WY(GG0ZqY-p*OFxMc`^=#>xNf&l>#3`KdHPHJ@*49j;Hj^1b#+!AwCX zi~l7rUgj-@soCV;`)yM6wJ5I==~+@?oK3Ed!_CR_QTd`iu<#7Yrbi#kBAvdxQNc}V zi=3crds77+JXZG!>eVMu~b)_DuN-C{HA$c58eQ<_gR>)5IL7tiR zW{n)^;Z`f2^!BCF2arqJn<2Wl(kEReQKnd43TeTdLDmq>Fyc*|+VuRFu3FX5q=+yS z+6*O+(^~(Pn@hkV=_zbJClecuvz9$V5Gbt_4EQ90H`l?hemm02k*zN>48WNIo6T=r zk&Pk@o6xyhv~0c(JB+nJ7eVkDomhd?7dx|pUVdadxX##SK2|SSATxEQzLCLzE2eyA zqY<22Is>FinX5qsjmE^UUmc@>3<%Z{9_WIRV#uC4iR;lPoga%AWuNGtzj#R7%Bbl; z1$B2J=m07ASoQcLAD0&GvCV1L$ztP<4(Wh%acqz$hPD@l-9Xo2Z{kRxvw$X$-s6j$-Kqo_So{xUMKxB_V_cSUH9<3M4bu)xcFH1K1p6P40vOzAg;zI^1wvD z=$5yjImh4`f;dWnOeg%47mX%0fw1bnt7>DJ;#KN1xJa#(2Ei;9)X6o^B^wVR^FTyf ze`gQy#Kf~D_x%patyO!7h(swOt?nnygn1s|aYGupqo00vy(J_cd`I#i)=o=L_h5Qt zj}eC9X$+VVl(fdzNK5Irl`o$efV#y!L@V!0@Ek%zNui7>wi#-h66|PzAkjMuUww)u zE8;mFdDr%mV7xm}geE*m_&df`AF?U_Huiq#U0w*VF5H8d(EodnuudUQOxaM;956I&a=E5f(|}Qf@s8D`1a7-&ca?Jz)k3>&Rd;bR;>tEb*qn^-t9%7 zu0od?7IW@))2`LmZ_~Y-!5Bj_JhTMiLq_aZjdp1|$OL#qiXaXBgjtG8R2wuM)NS~V zA?bavh`I>aArj@0UE)C7;&g=-hj-QRgNWP2SGmQUwo+-dy%&zV>yRTml!yJXTUNGZ zm|BROcXc;+AII zIKn4$7q{J6*9AB8f&$HSl4|4+yInG?_?@%?WD(@TaZRE0#57~b)OW`;f+b(SQUySc`t8S!jWio>;~YYA2pvnF!Bc(d|s zh}@&E`9CKbp>5y90Ubi!qr4{PBPs$ku}cv$iB#N*U!0k7_-DsHbG5_Y$gE4J#-TtJXv57pR-XcY=5Z_l3_!+eY<4EK?&I9t>g=&Lq_#yhhnUeva%R^NJ7|@*3h8 z`YRDzuf?wJo_B9^gfuQVen3%FuFkC3r1jWLQ3Ok<`H7L^`K~^4lIlRKUO0+KTL5OK z%@!;(M8SYzDkV+|0TrYf)I)ZhP!N#g#pe+W6%?re2T}0zT`0g1%p(~PAS+Kj8JvM9 z%rYl?O8-`5Mwoc2pFsN+!X=Id`KUBD^JN>(a)&vD&!y1=w&Vn|CasHHjZiKAiBOJm zF$yrm@ka781Yi*i)LO1O*HJr<^#JHW*cf&cp}Py1`8<)+#BdF4+R=Z&oLEQIVvU2&6lp3H1j%gX!S=eBi7N2q2fvnq zjCRTnh$I2Fm4J0dM3;83MmU;dk7)jKK^#~-i+I#>x!iK^kSW=tNb~63Uu4NOLn%UNpps&qqbgVXq#O{lq+I*tyxMK_R`P^VRIxTxtnFRyZH26<Bks~RLu8Ups&}I+8U5)q3bVe-|kJnRmX4JYfg{(M{iaflrY38)qozI;i{qu zvr1#^h!&GsgPLqL_j5}#jr#3}W zfpVhgpixDVsXS)ktS;MqzJztBauHp6b55m#Rx(lA5&+=96|-=4F!-tXo`#Zc+_X-m zppuMQKWU?x{Kq(niX~&jgtNdqa9B?%P~Q6F>Y_HD%4#R)U>|U@6e2N5gRlpz3<_lLy%IH+ys=CIoU`W-uUFz(>S#UD$$&~4PGXAf4YEl^85z4cFp(egs}q; z-tM6C_~moXk9UDbV#J1dtdK;ec>t; z&|fQulywCf-&Wqn#>ED2BPByKAtS?l=en`uk|aeDj>dcS%*B5#qE3seR4Ezd9shVuW9Ua)fm~P--RT(;Ocd&BbgXG$k z$&{M_8I3eHEuhF{K(2>62o6p|;qY3W6;c-`h=&QEw+|PhqHiqZicgIbGg^m3+rJ_w z>kTX^DE@U}@{R)nvSgMimBSGN6^HisHI)ea8qr0+vv6=qm31*1U7oeFvYH0$JTyyJ zRaJ#Gzp}jA$HH5?_%i^p(|d^6hRh|_z}dU)I$@uKt8_Bko`y0m$45%blE%(B$#Y4j#i#h>{Koj`&T4S7uOS}LsYeImnr z&@TN%dl^*%c{Rn$B-lYNdvuj(JfT3RLUDA${cX1=qLQsU zDY|m)iN+6Y4U*qvUIMHK5ObjrU~iYdv;W%bYHO3ou~Xr!YN%;>45LHmk|2FC^i zy<~PSFMlM=7c_xN;q@o!2^?&IVFmRFAmV_izvx-o=$yTo2CvY4EAOE&IjJ|PzCj-= zSl!O_CyJr-aN*g^99r#IFr^4w5$u_8eP4-ehT8nvl6NAYLjLWabh@1D377>=B81zH z-VQ+}yh>!%Z*OC?;{b1Xikhz(C^Ja@!CkC7DCefs3Qw()W0z>hd7duYD&HFY-XpjZ z{bfs!GxOLVh;I7zCiTJdp#IgB_TWipBl>+E<%?GAIop%i6MhfjYP2sIOx(G>AJxOJ zws`U=-lQ}6To74+MCZgAVlz_Kk>%|uO60b$(d)S$;6wg~R^pvmjpFSOpE4Iw1*>`n znmLcc_DE@Wtg<^<^$VdPIftr&OS@Q2Eyg(6Fzraqg#A4$q89vJbC8FYP~!CC6gcx) znC*s&JG>QZiznNMdSAl{OHHa3`K0cbsB@s5zHT>MlGXMyMO))BIhP)ymCLn?s?1sX z0)2EcIl6Kwwq(yW;RVyG)Fx8-z)6psBYj|aEuX)wNC33;ij##0Q$XRJI)jkp4ANN%@_^Nzef$R_|v;hGz*CmRVXxofHU;8fh$I zCgLXY6&1bTKihxX{}GHe1d#`^2l0x;62Y98ZYS+CB|?uH5p4Kc7oAUg2=#vNjWxu4 zkc0kx`O9A3^~96X;Z$1Y!sZQ#YYMvW;RH4du`3vr zSHa%`pCy*V_b@j?|7b7ejZKo9;V0%CI^~q#%XHv36Q1@q^!Zn1rOM#zLMX2Lg9s(&?7 z7T^=4qP=74xQ56>-i6RJFo%3<$g`3@g*W!ilv9Ho5mv~m*QUjZ8T4pfdUOsE= zBS1~>+DK)czEZpy6T#x-(=Gbzk8{oa8HE*pdBE| z_FXRL$9La_OLxof`2?&v0CFZab)U<%)IcVNJ|@;_vc85KJ~iYG)V&}= z-_L3{0xB7WYZYo#rkADXbI3AlDHl_yyehMoTPY{6=O-_UH0e|w)u0P84M1}`kV&>r4|Lbv01FtbY+dSq-Cx+)SQAT+Z8hYY7xTV; z3VFd^xi2I{$Ymj2N?K+zC&wR`%fozwt}~)@d$Sjq>P%-IW=SJyCiKjhODEU!QIs^1 zv!{D!?TB}r_78_-H72@OQFD$RHCEhtCCkv*nsF;b2Q(r@@&~wAuBw378^9B3y4T%x zqL-W3*6B;qrP4fbVN5{gy>ZPzO-Z&SMQZD5PE8INEJC$)R%x9Z56R)qN2g6&Nx=;c zVlkfivnEeLT0?}^iOHv;tT8Y}fiwq&-d{@p{2{RSV5fmU`3{k&vJHn{GI3Zkk&9|H zF2|f4{>AG)Rrby+pK5jWV)jJ!gcbfIcYy75HHMWk?MmWl^7g4|;``_IPDtl{QvGk* z4n66syqS!kgG*^&Pm$qr&sg?QJ*NPSrk=_{VKQ~YAv=sWj)SOSX+fUz#Q^0+#`O6` zh@$sW%?E3Al~MFkL-%i+H`X<2s(1ZmRiulG@W;p654xL*vk#8>#m#zQ80V_Tg@rGb z@`Zg5vu9w9i%W$Qv2L~yuuN4CmvFz0WSaH##nAHvP$#O2*5=k^Y)Lz0r z$@E>up_yv9AD(h*0qa7j2TQBH?^*#oUnBXEDO3h%dSH>WMIDhe;ma+Hp!%p99ha_s zLwdq!0;(Z41RNkA5O>s0IeG7390=9?oiJO1r_J@qd1_=fPCB!_9#+u|^Y)NMng=LF z18;LTsTohCGLrAnC&iya)@4Ya-RTV0RS+CYR_~!$uL2VQv(WsYt8;-Rz35fQUhc{B7=LVg_Y14EG5%@ z9}Y3hhgtyu_tOO9!AEH3DBeZeuzr-v)VX?;@z469%1_9HwJ$M7NBv3@r;T* z5PpTRD8LeADdU3Sp_b=D*I`n?hdN5}5$}T! ze*4AKA=iP1;E&5it3|pYpX;$1a1+5}=>Z!M?(gU$FXF|3V%S5E)X8PMVO=LVhe^xD zvi-({pYb1FL|{V`!I$xy3!B2838XKx-St8bWs5%`G84#zK2X#hKxPB8rx-y^^;?CU z3R~FiTvWZKj9J+88e~Zgd$COY!vW2x$6&xI#eeBn7RHDG*GFZ>p9!-7f6`k6e?s6B zuCnPg_&OWn1~3Bk(^G+J1z$%%;{)3t!lw04E1S{BpA@(ZS_{*r1FOS2E{5$VNDXaG zJwQy2ZAGTx>qMrJ@CHq>*8+utrwxrnsPU6j$mw^8q0B|PlQXVdp%RDbZK_4S<7h>`^Js;(N7)BZgPDN0^`nIMWZwp#P{bXOt_8d^X+^w4jj_xn zeNIHl)MC>()J=uYu=AkHoP zej@h!o@*HA-rizIZRCOCE%^SzE!jTqUfm++E%b<~KGMF;YSarhSGEUM_Q?zB3(!7P zoRAm79km-oGu{_QGeI}>2E6Xx3x$>JC&*JT?BL3-_~1$&?j6i(ng`NTKh2;w_D)a< z{5PO%$y1-^E%g2dwmov#P5VY+r7h)=~&z4)u4Zs^-W9}x#Dw<_n# zFQD5ZT!1%tU(p9Ud)k8qx4-v&dwm9N_q+#vd%?<7chSAVUT{Wk_6P@YcMldPZV9pZ zKEe-X==@%wyb|6Ru}|Cpc?7Y80>j8(xE|-f?cRJHWxmrL-&QggdiFEFP);6d*h+kd z*gxq`9tJWO;2dRmC;uM-{^UXM$6_zTJIMYiIen(a`Hg?gV4wR z2{nC|^8=pg_;!-HzK#vEq}42JnNxR`MTVHG|IeB3HaU5g+r2R4ftmXeIym3z+ zyfYV`?PYdG*u7~_9=d)62brA-_D`4}OgkChK*u+%pP-*YahyD?{Gd#;e=<*>d9wZd zf|S`E>iG8ie+!mB;dU}R1MJ>#ClB123%Wnmp*VR^{fQfA|3sNStNDQpc6_7!F@4z% zp3QylJ^XXBWcti}Q_J|?d=ty~?)$QRegnyrT<(Za*1y)ED%(w?N@VBH_#rAitntW& zeLkdF1DYvQ)n@rgRw;2sz9IuF{K9lVcx7fQn12pO3U@3r40n_v$^{*mw-3U<^JCY8 zC5*E|hJh&-Hwga}#xBVjS&;6|?Pvy$2LoH&0|qvmSU z%WX5X+kgAg)`Q<=n<$acURb-A(Z{Ll^&Gw}dTs2x^lOAJI5tmWni?Kz$q*UP#b%ga z%^yA*6)f(nmxj#Kin`~0g+GqPGI&eBWtB)ySxH5MVw{k;@$j16@)~#ZeE{WR2BI}R znbHJ}a4a?yT$pt=_VEYiA7~JSPT|( zQSO?lQ9g+rVyFaIXLuB*ft8C8^&-{Pv!l!?j7&yd#}F_}S|z5KMBY0~IR6JWK*_(2 zvJni4hj}0A{s_e6+LDsm+UGfz#AMd4kUB_5;=BuRzN`Vo9^br5obG-hA{(fXMJfBG zGbK9IWuKho7ve&@&?#&X1_Y(>6nUKP5&Ox)EeBYyM~<<_PShk;DN3R%q!*aVk`SRI z2W`#dYsD=;Pf`4y{n3JPsYAk(iuq`T<-)GM4z<6ZDEkx&8}keXcRw-77L6P7w=9ljHGv1f@046xQWAT@Dvj21N5r@G0FhNtO{qc0Go2iGL>Xs1YoZZ6>(1 z2z=c!DCDlN@G5J$WhlzfVK-+{oZ(2`P|0C0E3F(_X+|-p1x?4@w0K(k{mbuL{npIq zue$h!#;UH$#om&5ZdE~bL&cbKy6zB}aDMIj7YCpCW^l(HpFj7*;Gr#dbaZbfRfq0d z6c3D;ICwwG=qM7Q5@*Z~cgb0@v)#GDIp7q*DLd&>Gz6%z)=DlQwa9%N*xx1KVKs(B zDBvH#L@oe3rU3a?HWHJGYA8`?)OsqwF7g8wA1hmoMw4u=h?`cL)|xh$M3c+0i{_Gp znaPbN&XJBBWD5YSxPQHsq`P%PlvxdveS$4a_7N{6WE7%0E=RZou1+0nb zgS35^U8@Sa!*$}HAN*xi_b@LFhiT4`%jrkA7y7+EriVrNjGOQoy=1<8waTfhayYX` zlsjbv7Xy>mZZA+JRAW_-sg$z+SK>7FuN>2y7pWJU7hCSvJz%`Yyji!|_=@5c$IH(5 z9q&5_{6C35IczqPBf1nGo6GKUQa%Lq85fqmi@pH9Z=l=@-gmy`*rjagp_|CtTFEODMyMyLl_2dT&3uSvG+3(+SoY z)`ixUR?*r|RI-)*YeqNtWq*%fX!mdMQ@`se@)NEz1Ciyd8FV3CN!QS4>0Ww({++6+ z%eRZ%a$27cCej++b`CBpi7l)nC)&DjE9lyyWdHQ>$u%1CtY)u;al$$69e+iR1a`$6bJ-noA=Sy#| zoj32d+Xs&hlZLSGO%rjIPeFN>lJPt7NH)-?uhOuePbKtKwVFolC|y%f+^Zo41;YyD z^7it*7YBeiEmzVrLcW3Udl2=L&gbsv1Ecq&UIIJJ5F6bvWZOzY@pr0Px zx-U-R{X+S6K_S_Ry`QY#o+C$N)ekSXhQ3iA^mjOz0Yf?}2 z{bVhs7xxs?wZ$8XX)&g6pP^cb&)!czm$h;^*-*Z_oZ>D|Mm{N9pS4n}tBeuOp;H3l z(mB%Bb&SD5v^0=5PVcPBMhU~Z^dDWv0k(?s6qDHA(w_rlku$=r_ulCp1PMEjyVaDNpT&+7% zx>~fA-jnm~24aFngKQFH6Diaan+ge+2pWZwh&>J7N6vSo`(ouyK-eeb*g5W`dCezfj%WW8)q5T!<~RH_xCUN1gH#CnRZK#QK{_Ix=uVic%zVMDDv64? zU$LOcWI{&kMsudCo7h6;kU3C6%FrXi&K(<1JWrQgvT-n%9J^)kUNW~wxcc}_^uZG| zn4P*D^}QEo#DypOGIF`Rs}+rwGGAF?WMSFm!5&?YzQ^6;xjNjF*IV|ObEEr_@K*gc z_mg=~MPAgtsC&;~SAmu&4b-iP*bNSM*bp{0k(S z$I`nr<1E7LBU~t@(U>=Awu@?8IG_mOmaNK|Ns6)xXF`buS4B|7W#VO9a@1Zt6JlnB z(|dB1tr1)yfd6%qywk>&%I-+pKipgnGYgE7oh{4muqv6CSux~>2isnI>~}9O*p#dq z|G}2$7ED=2hFm5uojbRuVo2r0=9@2GaCP2jy6M^tQ?7lsuY3Hui&mdIw`HPv$5dU2tK_`YLE%x<2?s=oUM{;L^1kA|;QJAA zzPL=WLVdaBQvGFyW!6jmH>$6(YBlOL1$4Mt5pf10PKDqNi=a~MBD26rVsb2z}@+=a96CZ;FBB3b+v!O~CW$QCG&3wjC!xuCsZL%~3S zSU`566a!dH);_DHT37yAoOUElY9|ijb|ayLkjL7NbW6wBQG`p2Z7*D2g`QlsS)V6` zv-3iEK0{z8({eibkv=V^HV3oMhoXcrSEptOWI zn=QC{;LU;uR<3z%?iDXRa_Oxfzx3cUw9Hbs?3~u?TWe>OT$vrFOGxe$bN>2d-;Iy; zZu;fZ!DUxnNOxX+ZpSB=ZCLl#rBjO7ua(hqUMnQga&|!77Qw}S2$o}*SGm@;0S!PI zRC?K>Gs!kIsLR*dHrS}`X%Yq}`~}ZF{FHHw@4uNdMwFakQd`e7uLI1eMpqQ8tz*8B zOxxKdwI{4~=};Zx&Rg)D(JySl@q}QO>J1*NP15LhIQ48?S^dJf zvd=3!(bhL_b3MMb*K8nE!6 zoI;2@Gx%Ts^KnGjBB#eL|NQg69!%KZ-~&Yx&&=82qs}dq*&VWl_`KAc1KHke$nggBC2-b3a9vOh1K?DnRU9Xz?u#y$Bi$y#nO>9FxC(>T*8X{>ibpw%>0nw-_*z0fpIn(tjI z^@yvCy{1*tD$5Pt)xP^o_euAd@AK|7?UerL-s#uv1dCxb~ROb)HZXL$99?5B>5$8c6QJ#Wtlt8 zg#B3~V?TXGHd8Mi%e=mvjR5J1>nGb~y;?E}HoIM|)~K`l$W`k1tg&axe09dKc#|id>$5t@3)$_1-mQJ=L$qK8Sst`*W_VRc-QlG=ZSx z^VkESvRn|vBB+S^a)n^Qu%a@dB$!`Op|Ka_I~;aelFu|{Z63*EYF}N!y*lRgY^|v+ zXVI{ zJ(bXR^QexV1D~JhDVrR2&|t{Ph1h6QFZHW=RUt{cJtz{?axeke$B`h z58dXin||G#os+|rp>AQpm4TwLGxy0$=RRmsscNo1=h8>*zby1TblHSkC$WFeOkiB< z6NL%6I+swnPUDS{7>x-r-<_s=ybqZkvg|NDY0;^@IC`=|xWaas{br%p{(x|&d$aJA zpwSCPk>-pMS_MT+EtzvYcr;RMryfFfLBG(n!+){)zYi?((1_d4Hq zccJmv#r8KmZ5{if=Eyh4kaCzk`3e`W-{w*3Rbh9YF3%oTdNjqLw;`xqiejR57>bz< zLe8{6y1UwlHN+>K+OjPCy^TXDhWyM>wB$02gh_6w_@>V{@{0#oeXwHbk-M*bb(wGO z;L)cBpV-;EgVg--wl#$oPnKJ!xM;9!?~WS=-#*Yk`0d)RN3*s+`tz>id&s1x#@MZ% zINS3>xJxcWcCw@GCCIHhk1pqW=?>`~NwHK~nzc&0+j@`f70)Xg>b>3rQP%af@tGSo%{R?_hIi85?42 zab!(}93uV@=?rZM4TOYHz`<9egRe#hpKb@50(uEoqmm~o-7HbLF4&Qg0b7eFIHGOX z9sQmQ<@A!PI=RHM-CmPT3TNecP1#e3+lG*1_Dvxkt82>1>1QWdTrq83WoIu8zi6>Z zc$kggtOIf-u8UCFlw5l@TLJkbPDVVp`MJR*AFiBoh?EY#adg_E@X){_VZlm&QMh;T znYRW%f9CC(*<=)P5Ep64VY*(3`@uGx@iI~=*T@y~vMssN=vrAL)5c_;~? z{gG1!8>1yqEU{Mz^ex;filV4c8*@B|va@s4n$2ppa&rxPuK+4ZH9;j{TVKe{ysf1r zn~S2p;uuz4;NI*FzmqRL%YKCqLl z;-)GS6PFdPnYJUx+76yTakU*u@b^d3H@KstH^{ekq{_sJ1Tz$+Bj14ZU6f?}%sag{ zVh*qsfQMiHLLtE3@0IcQn?uWlG_jo)AX`fqBAZF!;z+qN95xy)=T9DdSIQsu#iIG~ zk+u0te)&2ckNO?%+(~iKW{TL#O7rI^=!rw2lEs7hv$8|^gSFEl4u5Rqiowlcha}Gu zx~}r(hX>!gsM%&>5)Gh4+28akCWTw_WBtS{4-L<*)QB2wGA7&|-4%T)`o8d1^ssnX z`-}LCR@15IRIWrB_b7UlYf#2&l~z+oRRO)epXA8~wMUiX^Ed)QB?^_L6ev7OBi}o{ zK2KgC6fMfvs`a9RqNs8D9mNpJgM2BU<}*o$Bau96cc>%L{LN56pdgM%txh~)tyL<0 zDl$Pup5;fj?Q#hixg?ETXhtqcW6+z!C7Ht$bGRgP)|LFrqC19bE`e5B7eAAs^#0a% zN_hNG#?NHYjPy>N^ihOe>?KB&n3>2>h$S=>GUKTViLK0b#=dk?ewa@l`eE_}LpV$# zjSW8-wEm*_kQ2M&lk%Jftq+w#_zy$K-8kn$6x!EK3kNGEj0+D=nHO+boZ;{g|K-Ah zba?RH8LjzDUSn{#`91D7<)lrXq!mY%P*=pAPbH`1qW(&`vc2*$b*Hn_by?wB=UP|N znRMxjV@q|bbb_<8#NAxkS$UKAxHwQL>V@ldyDNn;YLtufA3+O~TBw}wKU?|!L$;y? z*d*5vxwpvSbOx3AMS?Lus3B3GSI=hN%O}~ZWRvU-n$69YwH9i!Ot4VKohvOVi)ay< zG%QG<2e)wo?WaG=I&GpkkC^g&c@zzyqq4-B$&*-q-q?!Sy%|{{A>ulVMY*WB)DH6F zB9oGIa;M6$WVt`8lGNe+NI|49A}IA}h?oNA;l%Hg%&Mri7z`l<$!{DEnuxNP=)%V0 z%mJEN=KSLW-@>ANjWW}NZDc4#KQpn@JDHi86BPj)JLTETXov7^4Hqsu?WI3bh=)<^ zla@U*cw$x8o&V@*x~bMzdpig|XBH{A>)N$Fug5_NI%ejcktyn;|vScd>a@hs>dI|QY4#|AM1bM-r zyH>)JWDdF_bTM=#phwi8t3j8*Gp23?AfyCIBwEOia z^Zy#%JtQ9W$X%VIH;mpldSJ9@9lb7Fu5892MUB%1fx z+l}y?yfDCb;Q&{ifSh093UrufSE_v;8VEXl9!ntT@_9%gr15#ofsnq$w_%l>KVa8mh{ zhR@ly}e_+GO49@Dc1I zZ_{^$uis{hvDw3pe-%S+?slgK@AyW!5#JIXcb?^ALhW(s-}-o^$S*y7X} z2O;9LyF5;%Q(chfi42cWrs^kN_oyNS1AoDkCN>Ofndz%$qxh*wIe(U zg(!LyCcZ=Xe4a=kG`zgpGn@bfjfN~VoNEEtOO#3R@~n8g9EhR3R?!%T+H$elKq&jO z(JGa()A+2B8uQp+rn1{zo1KZ_!}IeaBdV(l3i38boDPRlsfbX8I&qt5jK^bQkAie6 zh@zhkll8Kp*+6>?BxxXqe)^MK6f^PN-^6*##M#Ug#Epq5SY~75`sZEO(D*b-@MEy+ zI~~CpYK!4qvDdZe*ee|N28X@CK|k~Q26vOw zZ*DS?RwNHJ&7rHizD3r=%8F}ab;b2!TWedietL_nt#sNAHClgGRcU`}V24yCOU5ep zW0*c;6<|sqkL~W0SZwze^fK>%qS4m$yLpm%>%-5x5%PaXKjzAzFq9vYS(=fuPm{CB zu`B*C^~4p`W!8$pBEDQoPCRqQGO8;PhqK#d|NbT{&@R#dUViqMJpPn z5vMb+oa`NJI?HkiI@2s9&mQcsE+Epc^1Y4_T0-`kQCT~2)fJ%a`6RA7KO|+31QPLs zpUA#k`M^mhkDE-f?A(P3WWSVKg2-> z0lv&OOEfz~1vM_a1+<^OAjjE|}_<^rhF#y8p`g_?3JmSoY3reRV?r;cE zD8SfosCHC2D_j-vn$iiS^Wkz>>Rjep9Pfo2oY%$gfxF_5!Nc(lrODFQ9IrTcmwx1U z-?^{!h~q2gSFVB5@8M_15ApCAGS)FFHjT78ro=9ET;_Vo`C|NC=ezOGou9{z={IJ6 zpT`{tmT(rqJzX6LrQe|iID;^g5=a&}T|it;C!>#%@mN;e>4?XiF%rYEJKQdpgKF4c zEsMt^`Re$ua36EUN`iiWU_&4oVEe{EKp9vkmy%LKSrZ1ynj;Mm7;fojB$RH^&F_ z<9K4vGB!;lJ>(m5ko3f+;t4+796PZ)J~d=N@twHj_|g@=!f?3U-z_YimY)*||MH>8 zqsMzsW%T}XBkpsl&r@IF>0vxX$a8X2uZ39F5JKe%6>BK55RsVAfbrU~&y*F}a2;7BitVXbEOnEJ0kMzm-jq%|xrw5bANOEgFH#LvNXA zHv6TxBuj#Xbhgcm!ok3?ZT$R=0sdk|T35i|eAZOR1;o$(V97uMEwE;>CTxK~JV7};Gd||vOaQTRa(q|N4zR7VwIF& zM{`Ec`5KGMQb1~;$}$1QS!TdA%R;!&a=GO`@)&uFY`5$oKNHK}DPgCCR={&$S3Uce z^ECD7R~&sxS`A9zToFoJ0e+0S$-_xRPG zya}jSOp%6<7@jj+G5)wpFrHMEUv3Z^j{otL;ylqA^ ze;0_RKfjI5&b*jpufWccx}x8w--Vt0#aSuwuwRzB^Q?JBy}1}X#92(TR2Z@=FeGUW z#l%GsENWXZI7C}9oH<$1t8fA1&SI7zz;I|KdpBq1KP$7CrAQt&Zn=2tvp?N%2_DcE4!%9OXK+5bg(OJ*Yg@*ydUWvV!EIYtlR{EUrf*u! z-b1plBvEc(7m>?$LJ2`vP@JKJXaY?&?ED($YMm4$bNd&2@Z$wpWShCo7MNr1tCV|NFk#mCcpk=VZ^kH*em|PWkpW zpXH>R&nj}*s?mX|0L2xUVnLjU6bKSA^38T8}i>%LzlUr)c5 zc`wO^^h7wr+kuqEQ8dWK5}43>VhJj&=G(%VMq+h>P9!)_TgL14&^*V>R6q)p1A1U2 zU=A!RHf@(w5$VMPMS5>>s(7-<6!VBMNJLm6A`BA69d?3kP3sEbkM^$@ij(MuXJTMZ z`IsEl#J8bU;8RE$K7|zc6b$1E@gP9>PF*%QDA+ZVSzk!eGO4UDRYA!RUZwqQ6{H2R zu6xd|xoqurU5a4xlbC0UN7Q-v6-FsUbapCd1SgDPb$tl*v;RtAiFd%;^wXxj=X?Sj z`gSO_syg!==FjdR=FjMlM}9u>e_n1M>#JQ7zUuy^x2>)8(>KpvKOV*WxjT9ta}D%X z9K7k#llCQ|_>J*_`&YOCD`vNvw_~jEP$_Cg&n`j(+*c99+R+BwyAo|fcc2OCYy1x# z|3(QWhfZCHnDsn!ziE;_sh46$XOLdi9 zy36cZmT6&7M$gchK(Ay|ZM4G{wb8a^>HiLcPJ!QM2;)(2V_G_6;F2z+R4tUUSVb$% zDq1q3C1^J4i5E~<2w>!K;8n_rH)HNd0pC^7iW`CV+r0&pknxJdP_@FS+8}PT86si^ zDHJL8;6|(arR=(QDOh@f)?f&@T0X!c*ue?P%(|g|kTytKNq0N#2%zDESEbHvMRFf8m9~ zYvn%_&K7Jk6hfY8&=HGMS|&(g<=P%gc)`+<(CNIE zOvY*C#)@_FJG4r3ZP`bNG2922%Sl{6H_R~;+&+%xsNi=()k*Ya-O-T=heNc(ZpUgQ zFB7-=fZ|{EtJi%<9JO`d&HXrwT2xfc8pod_# z=j*jk93$${$E>8%5ZFd?q&h{(!0J*HtDC~p^t6Q0dT6Ya11-rPkfvK25t8cxrKtkt zNStJQSpmE+v_}$At&k{HPA~{jrK!yK+Fr^{^_=c;U&MC@sjYNyKY9hxXeVlVF?Cz*q4rQPyfqq(M4k=9 zNY($48xxOStKDt2+H=-6yD24*hE1RutN~@(nM4M>n@Equs|ZEGsg4r5RC2!Hq~CNR z)w$pKrjv0_(z}jEzZ1zx5K)XLME4fa3&lSa&tlf5FRAIpSMUZy71d%HGdxrAyJ#_0 zM~jJ597yI+ZWI&Cu`>_|JT@~{FXar`gYYe%;qL}@-)`vnEz2|M4IycCx=C6)lV#48 zNm=qjg~~dBsk!iqE8|VEV69LVYd)8jFpG28vu&D;*&JVD0p<-8G+DLc?y$-*HU##9 z%Pm*hJ|$hA1A76&JeC@zh!$eCD2}?R?5J1D4k8{7BI1lNV!V72x*4Bm1R*;s5!wLr zbSjx@g|>phnt4i-hrV;^Rd?p*zx$7OulU1v=T)OW2>8RCrUeELU$f)OT|Md9Z+~Uw zTYrDe_HJJwCSr*ww`<>JJ1?GJS+V2F&)#?OLvIS^Mx=!P>E167-?p*i%6#Mp*WI)B z-hZz7qa}d+`B*kOKxCso>OC9LMtWm-W8^dFGxTS|pNa6LSR=MN_JH~R;N#{;gB*>* z5ijWUaRI1jf>RPyl$IQPY?7YRT>{Ecy3gK_9r$$p)PBq_C+UnH-~~eG1VYjTLg$3I z&l}A}fIiyc2r42)Hb?eFOp#~l4COuhzHR|3=q2>ei_iXyx@E|4_MI65f)~LA)>4BL z9JDy9_yOlmNxeHhL{ zmYW?9rC&(@ImPzc4f}628uZ8FZN&cT0wZ7otLB(b(OSkPv|%0XkB8u?;m+Gcfg>Gw zf?3eiBthVHYn|7zkiwUFn#by$?sU6>_YgkB67w%8eTIRUT^w7 zIjWMEsgjqel9#E*WqGFyZFM0R;ax5}>~lq6pUYo5b58#oYT0cd%AaU}xuJ8$9Kh?| zro#t|p(`%l{&W|QQ8yLKh)#$lr&))V){=I$KuOM&HCsRyF(zpRDr3<=t3ZbEL*i7> z5XMDn6i^nOvq7_j@1!uV`Iu>%;9rviG5>_#s`TeP7f=86*Ke2AMG%fsU7PfWSMIs$ z_Mfl99LJp2v<1=8nP2_%H{W>Zi-Uinf_VaXe<;=-uG!k6poD&6ziGgZw7(GW(#%tjGGP zwafPG0W-@20N1=eNVkbPu$V>B94mb2L%!dZy}Eb8d)jOAzEk$-o_@~(&uNcY^$dGP zJmVgdXOe#Jh#LD^3?lz9@fh--89FsYDNTz5$=d?nfm?-i{^wx7K@#J4?vF?`ShE=e zk}rsgTzBYl-2_$ysm}ARIu;vWJL0N~85fMc_Ozqk(s~C6A$JhIWPuV0h)@~>BLrvr z5Hc7+x@P`|rCKdJo7QGcY01BAKHYX%cM%ODz0|YFY&EacY_aw$KK#7t%NyO%gjv&s zVzT4YAN?ESysi+gSujxmN)$Z%8*T@Nz&aB#VDE^4y0a;_6GI;uIOsGT63Ri7MW!u0 z1@1y$y+HtR4ix%=B~p{6-67;wTY|Ss`z! zEtHM6b9GD0ofD?yc|F0h5HeYu#*+=oJZC``zMhr=>@nQ;62O1)#kpwmpq>{(Azl!~ z5SF_l5uRc(BDezXpes|#1~al1pCuhh1=IER?qGfL?8q}gi>OYX-Kx9GJf~VMmUs}) z4hBM@h#-o@5El&Lflw*T^Kr1$mP_p{$HAUZxgBq|yX15xgOz-Wwutau7-8Pm*+<&( zJ3FY?+Kqrn65yCBl&j_T@%D*!W_A1K_Tlysvhh~?>2|*T9sak%C6?gffaO_Qr2^=$ zx<$A4TTfaU>tj9hCh1Qtc1o6NI#C|lV%6Q$p~rR>Y_c7oLotWWR9SlwXqO^)I;aY_*5^dYvVE29B&ODSiJ zDwY8_1DlaPnnQ4DyA#>`LaGPdNZk-K%TXxkYIoF2lDjVT={dcR z=>x#n6HQdNQ8zkoijU-ODm)Z_F!3mQRC*%zMEr@wqlG6*&n2GIo=ZL3eWdZS^kVQu z_2v3h-!J7~s(-PZ?hDB!NtNSjGM6cqN*73Fxvb8Mb*9U?B@|ZE`_#U2-^o7HO9gaY z;g-_vx!onxg502WFvbW8f5JPz(YGS7AkE6|B1#soh&>W}q-bhlVB8ew)3eT0k#D`{Hzb zlK#OFz3*!+#5yyCRUyp6&JT!aW)*=VL@>$TM5+H3`kcRZ;J-mIxML~$Abv6!F#wg& z=z@VGC6tYq<}+B=0SWu+*p}SZ(r_Q~l_ISB5G-?CnZCN4ZUe7rLb8FC{2kq8ttS*q zy@;2@Qg1y~_QLqo5pO-7@d9Uj>!7y|RfLaNh_i+U?}0_G7kIfISLJ#)nCBh!w9$ZR z9yhAdNFuKf1wse;_OayDAg=8r5z`s|-R`@rS&wf*zTC;!;yvO0=O(QoR>&W)GQ zf0(`K&}Ph|kwws4KA&?5x^(uwp0r18V>Hby1qL>u`_Qhvm*Xv_7}A!^{s^^qW;`Cr z<3xDK;k)Q+z0uHZHiGUN^+TWGNTpC<;6%ZUyKI0jgf&&fB9PWTJGA+wQVEi zaWu}}#@&_~ZyPV~ZTlAb7QL^0Jp9Y>TV?fjb{DrR!yt|hB10jJrqp1R$`pf?p&CY% za4?cgDLx-obKMyHIi3gfh^I4nE2E@*r3_c*Gh8~Qn4=Pc?~z16mGpTh&;FH!q6f`y250dMx(1G(K2gtgaZQPUUNkg`A(+>#-05pbj#4ctA zGKvuaWq{MbN&yhIf?Nm<0QA$=dMi~7L_)${FcIdQ!+Wr*auU5B2yD5eclKB) zbxD3^3N+N&doC<3cc^7-Ut zvn$XyFDr)fez4XqJ3GznX7*DZ)CJ74W_FX>AQ4Fo9o~#5$Q3o-VgVa2jB1p%V&JSy zud8@r3f}%TQAR89@;va$Dr9b@&XJZY5Qm2<;6sWPDq_m!%T=o`;FDVQa2VE3yvsUy z_7{2tCRwefoeEOOs6u8ak{025^Cqe^-I&I*!jN1i(QPM6Gw?cpkvoA(c!Q9Dsi`+| zx#Q9=PC%GaP~U0^-BqFGHJwOSqxJE|Tb*3H8w1Jd!)vA!z6@O znpd)m)J5@?J$hqzm>2DwO2wC<72-0>vf7HS1wG3y*kJjT<#ypV@ivQNt@lvXhE%nvP zW@W3wl$4zct$ZG%3EXkHSMR0qZI3`AccF%#+a$ACcbY84sRAktYgEN%wN|V6!GDC` z0K2a898}1sH26h(ozkM(xHh4gbnUc8k84PiV3PJ6y@28<4;BNXbg}9v zud7@?H_kBrmV*q}99H1L$J9HMYsKY!Fodz}%*?4FX?nCV z4RJg-=Y-U(4sm%)|%&xBP&Tg6&c#)^sSX_=R5wl_o(`#2cvnihe!Hb`B;n29kIjgC>k z-5N6C3pon(w?pmtPK&^bB+?wQ*Sl0Za2dc<6(k}H=1!`m?!!w6pgmy0nw_QIm4Q~o zt%zFzx5Au9xb-)P?^9#BR_N139oAlCeuK`I}_t z1)FbMVC@q>A>EbE}9pTMIU^Etas$f_8xS9e)Yoj-79bVtkeI+PcLX+ zc;ouy?knT*d{42XT3A1kjb50$efCGU&U16N-tMn0{0bWC_2-A{OE+W8Kl|a?Q_L~* zmnbilL_aq$|LKSsFjxXyHoL8qLfra_6--Nj=vDwT7$P0Ob1TfZ!F;P#@lhsPaDhDP zbn611=JrrQO|ZlUX^z-&8*k(cLoUJ7H*!2VK`$l6(A<@@N6iyvde}UU z#c{^`p4CfHO44eTZ2h(o+l0+Dj#me43}pj%U>SF(Y$t7;4P*b&-kNP#`~He%&JV;> z8nJ9MLt}=8d#vH~)k(z>f*KjW%2>FR%0yHY5S0++S1i^LkGG&MyCAS-xLVU%#p(2(bF;8$-t71T( z?h!+OI>?()i+|98k0sm?9>97vhrkWTMq)G=vq+G1EQ~4sA(xw8hdVz$0vsjW&R`Oc z$#-t3aeSHp$_dDZeOe~@KG(Jts#F5rp3k4|+*tOh1a3I8e%Dl}yPL0P7 zVTI(R`WE$XW}yo$LF<)uq0Nb5WjM4=84KMdf5|oBoKPM`-=_B`o6k5cW%x}8a{SP%30xQ?S9cv6y<4v1o3zA!8nvR;);(6*T9Qc2+%PplO;87@ zDe5gsfB~9%^4h?y0lGhc_6AU35?OWmG>a%!VvRykW_Ce*!7=*FhWi9^$cDy7XGVuk zjS{fRq|ql9#ylA9ws zx>=H1VUOy0VUGyRTB8VTtaPnPRXSQ_2%3d~2qD9?jaja}cI)51gV3Q}|InVF7jaq= ziTPVDxcD2pKY3AC6*14?gn^LiMd-Pv+?Mkb;Fjez!7TbSqQNQ zMh%H7QJJXHE?uzG>s)S1!!ItMXNbfBl&gdn)RZvZ!1Bcu0Zs_2Z$8^gWPB8*S{Mcn z4UL469v%+U;iv_l#^NP3%xeOIg|E;Jt!i>O@S27_ph#xP9CCB)I+iUJ2~|6hGl(06 z^5=kDyfHL%q5*lJn80D&I7XGuPCc_^Nwowha$&Am9WLEsy2X5#X}q+*G*#mC(s+rc zO5Qe4Zk>4@zc%+Zj$6thwbUgp5!Z_km>z4}SK_8hr*pKbQflm34DA-o1sCAnTIdOccvHqAmVcj z-!dkT5}}WjbdF30QaKZ!)>3>{rE(^`%5a*B+RS;il@AH|c-;Wu5EucDY%s@atigz7 z%!q5}D5JrSeda{X3GTZl4AVbcFuwe2Z~gfP+gD=>8OYg?v*3t%g9Xd%=_1>Ed1+wL zrUTb(`qbhJK78>-v}Dy2e@6)Ahi`miNywQP{SkU?;YfY;RWJYeUob?k#Po6vbAWPF zVP;1YqBA^vSJVpW!jzpf%?v6}S*H+$qtFy3!H2icP7zuO9o-4hdlY2}YEBL^?`Q~H zI0Q#?gu3E+9M-m9B}d@SkBU2&z(34Tzu&G&`_?!sMLYMo*1d+&B~B}m>PD!%9#CX2#aZ< zx>pa?qa;0h!SX5}1r`w{AeO0;;Wcf=YLN8{1Fp-wn|&LVO#u!u0?P@!)$Ccu?xycy zcUkX}ZV!Kpeo8s)`UU;E<5$ud`ac+#Jj@OABlzxi3*X~jcAVxgr{iq5(To6i!eTsG z-YG1mmk6t)Yw5MZC+RVIw`;fmLD#p1Z;O-sVc~%IL;AP$Th=q8n?K1RiaW{CqtL>$ zgW!?_9Lw!6xv8?(1DEQO>+)vLPS0M?n;w(L6Z~h$G(US1GZ64M95fsZ`ckV&%Rg!Nn5f+V zS4>`)%XX-nz`zHARXcOqj_hzH0)CeE1(5|!$pxzbt7b+)Y#D`6{b?-clfofm08+Uz zCw@g(*52yDvUUy%Ql7zT@)#)(NOgBZeEfoeLo9`8dUTK|2gGVKM)YS6|C%LHx9Wwu z4KF-!oD3+>&;X4%7&Nwm#=hp3Xl#kbmO!?2yHNK?{<>dv)@>>Y*+jXIN$G=wgD%$B z%!xKQm<$|Di=_-d{jboLExR_}UWj^r{Jc>87GWE^k*ipbY? zdm-OqL2tkc|NMy)MpS4}pMSUdpy$C9vyfS6UFyG`x!r1h$b?FToiX@0YK+*BdV6QadK)uXvn@3v zCuJ?|_NFvXO7mtyRN9>kq5l*!g@vT^%sb$APSh$`1#FfC0zO0pCan2+DjxJ`NSnWA z=8bITLjS>o1BXYi9_Xn?e3j+VXsW1(-e*?MJUSlFCzF|lpQJY~?cM#4*Dow|M{2Rp zx?Js_diBDkP$%Sq*~QHN!7}+gY8f@i+^>I8_V(YOda#qB3eqNeTidoZG}Xoy*-P$L zO^vSAo3?gcpBmW&wY6^b-KOlR-8KK#MSE7}z56PGh zY4AGS)&{h?MYc5dYWuYpG)9|5Uq3vM8;^ne``5Y+=E{3x`(rP}m{{`|(&9s6c&@HY zEJw?scHwdz4=v9F>MZYfBljfYb=OuN?c{OC3E>Vk_Q3^c!6ehJTm8$$k{|W^$NjYb zdHUxRi;-&;)r)tDEa$%%U7XK5R{bMW#{4dV*L7+YQ`VzW8Eq}^Deo;aWd-h%SxdopNsW+XF}IhiqK z>@YLavVP*u?{ygnM&^2TQ+boVX&-*(=1p*D$YQN-vhVrYVzii8aTd3$UgYqOcwfQ9 ze)8rN6yV+Fy$ORmv7Nk6Z<9&DgSdztBH=za!4AUMsyqx6TXq{U}t;O9Y1hR#vA zN9O8{n~c3>P$f;XE;_(saCcw0+rr&l2X}YZK?Zkshryk}8DMaCcNpB=T`%uGXYcpB zaZjAMD>_zWW>r>KJ}E!CyQ;FqIE>omy*xQMNhEK-F3=2^Nt$zWe3u@HPN;dG&iYnt zqVl;ZU@)_o6(~5p$zP0>jH(7w^Vt}6Y%q~ImGf5mbR0YSsc$LW(xIw1?7lceVnC~L zrMT=~r;IYnk)v{Hs-8*{F4!9uRMHT0Fa6{9Ps10b3T3fM`rmrmc*1!e@yNgP8>NdF zL=lo(x>ljTy#=chA1AD8VbH5!hEBEIh9GNo60f55%?93-CZCO}HW+zSDwklDB2$|l zBjiO&V}+KoEk~+a#oG%Fl@2UKAX-=PzuQ)^D-|Qe<&XtNqb?Ljiox_+$R%_yxIA0_ z!699Ucq4%s%`K@97gY`gy`t~xD+k(}a=678OzAu^DXm2F`NG*RF4*zbUMy@~9Gt>i zo8kY#Yl#)8bCBZ4r41GL`QAOXpzv`Py3y(#+^@OAuI}u*tJz^{_}h1n5=+(WLx<+U z#^ZfTIr&(mQwYnn6Xbs2xHbmc;b&o%8WTn2SaNJvGLnv6Z-Dp5kM#P>W0 zj|RSs=BV}GXT{a_%?_u{ ziwN3_2%?XalflBVTIonSXFw%>aX2U_sHs*wJhyVP?PdE}=^F*lf_!Z&8VjgOzRE=Lw+~m{MWWg{f z1jz9s_$Ut%)nODUVM%JaM#Dx8Q~KBpQRuQe!QtTExqi8)Ln>P)-747Uo-UNs`=(@J zfdEgR{7099Ma^ms+I#l&dLCrZ%`Z&Z;IVh)?Z+=zU+-5Nl2Ce?=3>9_gw)TL;!Ta= zu)4E_E3xOZhg(5={1g|9D;@|_vwbt#5F-^z)ulVBzv1%?9TLS#`76-As;tlZ*IB5i zk~1GnVK~O*Ce@7JV>bUT^;luT$1Sit2*|GA0!{zAVp?>3ygX&vZvi?&ZCzx+!d@YD zH}kxT=zTQG+jf~{agLHU5=W-k!?OXb+A#{+#Nw&}A<%$9b~G=ogoedLYfrG+K=v5*~YW<;d=F!BVt>6I;jO_r;n z<)y0ZoC3U*JvN8FiX1ISPbTRR8mlvL$Gp`6QTcF`u-sKA@ z_Cs%L5jL5Ug2W>mIu)Y(Fty&)76Bc}++zKeSu&WE0J1rMC?XxjKyf!#t1MLT;MnZ@j|E}zh z517r}xxx?mue%5o_VNH_sR!V>dk)!={Yj={;%40|sLP;fD3z1N& zkrc;bB^}=3mqIK60AF-YTPP{T4RQICIQ2ZiK(p7Rg}?}PQ!N3gh~7lJsaA-jqxQ?P zuJcP@otvBEauZJ+=?F3;3`k!Y9d`%#l^Vx*Hpq|u3cCELhStZRq(fT>B|zdLN+F6k zuM{ASaP{S@(OfxQ#cvm1IbOx}PQzS}l$AJg+=9DLO-seUn7QCC{^=X{6!N)^asHZB zLB|p^h2F)cj7w&rl~uXQh4>okLHt6VOyTcxYGPYKJbZf@--NNzESZ80tj`r-o%zd@ z?nM@yxVobHhX(ZWp`(~JAp|Htl5~52u~af6Nn8K4*8R1Cf+&%1eW_q` zF_shrhJ*p&AkHa~NWpIsggXJ|Ew@DnDN70clLuq$aGuw!*QhJOqn+Ra5r30M2xD~3ZiYK6==!>o}qe|+O3Yh#TZ zDKM2(fYw31VM(+@S{&1_YH^qS+(vUv&|rIX`arz4c!75x{Yc^Uaw$5I5$!O#LxpEJ z8=jJhrjI%pfiAuBYkU^F8}_%yJPhq|Q@-Izm}^hVr00rNBjIiKpbPv~#q^Juaf9Gc z4FTxXCr)!qp@H%Dz@h?_|{ zhHX5umL6bj?o-z8JojQHUDKgAjviH82M7ij;HEPXuleV`s=rb*QoG(jG`9O!zqicu zP#Zrul{Y}~S*>MjQSCDjm$w;dwJE!Pb{_krwJHV8{u+z#b>6+y!3vM__h(R&t$-uZ zmQ0aRhn8OzQ^8JK5leh4ELKQO%<7ez*a~t0?BHAdIck6Ia76qa?cPW+`7YhmrIKuS z{sG-f<=)!%t~8im1nel2S*V&dl(!_%YPUOS`FWD&da_J@7Ln5A(C$&cmC6Vvfrs03 zy)uUW`WqYf%bM>QyAVOc){at410xEK{lsqR!}jb>y*4LH)Auz`c}x9mGUN-D@E4hJ z6buT90ViE=lZsfIyUMU^y%`wZ_8b+T>^O9b1H(P-fS1^hBmawK$gXa?b_v0zg97$W!r4s+k#FpQ-dd;!v zE5g@1#bh3?M<_;?7$GlYm!d2LIe4RF$#L-{spkTbt16p90yh^KFH`n96OYyO=*Jp0 z7pnMC@sY%+GsS#HJk2Pc=hwcL+wzXz@vd-BHj6av+2fb!CG?t|V0uw0O%a$eZ0Uc< zBma&@DB#~dfhVxw&{kN8@_ixl6l7bQPNv^aSleS@opH^LJP%;LC`a%fPNprWcvhd@ zsi07so};nEXon48T3bIZ-}3L4@+95Yh0k*GCXnka`SE;!UZyZ+YiK)n$ zRD(|w)A4@{&w0I1jh(C^@9g8@)KwQYwx8xw)#&h|J#38*AnV(!JeYGVV2c+Q`Rfyk z`S>Eu|Ee$0?`!zDn%l~CZ*&-a*DD|uG+Awc_~U&0qK#kHNS|r1Q){Fqch7L>q*AqvDIJFb!my4-)-LIBQG1sJt`A^l zQvdt-V?iarbT&I(XUkNF z6?dp|*win9p{zyzC78w}l=t=Re_q!%YqAe}4)5=)#a*j0zKyKkBDTjiUP++0I3tyT z@H1znSSd*}#-7AiNo!tieh_Z9Z!tW!v{V0 zj!J8wsY;w;Z`fJmT|ZiAI!L~!WrNiQmsu_iF->Fk<&roo#BME8HH)j7LDV%slfG$N z&}=*c;tk8*YXw*H-es=gG$9&dQUssYv`6Ol6uqVk5@MqWTo%eSe^qv{b*8oZhMn0B zn^&E-7%kXzJUjolqV(KS((IO6853;j5bb7m&sO#*MH$u5X7b>+GIb|Tbq2TdNo=2^ zkw&j#C?@>j#L3aga%NxVDaSB}XSI42(v?V{h&W**azfS}P>bPF0!reowppYu`b&UeD>rbJZJ%FYEizn(xO` z=jznr<1;rKshS4Zl%te3@xv-^ERix$dX`OHy}x;MtkfYUoew(Oj|1Rn5e!B#G)6IUh`g*} z?Jm0<^!Z=_O-W%YlOeq~9s3dXyyJaA@0TzFk}fhBCe(fpzQ<$e)fVVzm$I)&23z?) z)llIz#oL-V3)#hS8!?On;OY=qf+Te0fuQ_9OVNqro6-1!cL)6*Un*TK(;K8#&REyt zC2p>xJ!r2puXDcpaQo7CuKnTj#ruGMVEDl5R?Fs4#QCMC%yx967;X;ITn_H1`5>5hUP5x(2Nxt1H%*iMCsqrEQ??0^7V*FvS+@*KivvudyI7!0(l6IP zSIJ0R;CncEm=}MZM$TOE+&aS$n-oTcTMm0aS+xxM*p|8TccLDi8`N8S54W~^>A&se z;fv`xZB11rQQV%K=?H$>HPEcR$ntiw&Ntu8r;UB{x+M`ShOdVAM(=g{N?_Md`Wr>k ztbpGj@#$Hrf!teE+erl7AjF-xK-4<|Rftsj78Qgd6}5dAI4qZ^gq?L( zF{?exGb_v8ORe@ba1Lflq_`IITHge!hD?UYt&D8bh1%;>&9Foe?hybRS)JrppLmGl z5baC8i4WP10L|heDJ#OdlEOEMNKQb>j3DBi#b0XQFWguVcJdKKplSpB)`i zgG}j-AlyakOh#-5j(U1#-=zW-M19HJ-eMxQAQY0vN!Mg=7C%AKh;1uko5X?>Ew0L1 zC11)~B&`vXqoh!7=F0hUsFT!A93J}HWg z$h53q7@&{JrH?-$aS=_VhpxKZxced)+57DX`tm!8b+M_%%#pN2Vif_$$_{cSJ0Q~K z^-)oTTONd$F}<%zd@(s&r!z-?=QW_Dz8bg?T^3sOl3*5(#$xon8Ki_$T@y1xrgW#9 zCi>oYkM?r4>v*P*T1}xp*=g&^bM^gttxe2sH}pD(_H^h%=*J=7STj^dEj!_g?viqY z&>C($$}bzqu}=JtZvjZmdQJG(A#ckD??PKbSB7`A;nigHP7^7^jFZ(>HdU)>?aaQR zZ&!WqBRpe&iLF!YV-+W7QP9Q6uhW073LQUflffQNu#<25@?*n@LP)}vJ`Q)wf86LT z;iT@F^q4Vo%@i_AOd*vSl~w-C-^}~UfAK(zOm=pkve`W&kc^Vhz4ieWwr{Z7VhZT6 z;@D1eV2Y8ND|?v*^JN|(MQhT_)Z|(Ma+)M$( z*e9ZntKo2b366|@4#-SFd%_{>r)w~7=kaO=wWvl6A+*BMQq7?MN*vHvz|9MUDX10R z0$1nT7&{f9!aHypdZaXYMRVe-9&s46T-)lJ#dj62+uEq@hLJz1L->e6nCy<+CL8sY z4}5wg0$m&BvQDfXOnN!zR0UQWa?)1z1(`g*)^Xm7(z*5)MJ`rMk3YQcKAkM;q1`;% z)M^}_5qtMoIdg5^7#YTa!80OP&Y3?|z z3(tNInTGO0Yz?qXdpRXK(wluK1!h=^9R<7M%+@f4&(~{&XV}~|$1RJsF!T)RRE7bt z9Qa9Qy6c%nay1^?dQaGe+zEp<#)i%0v#I2W?5}G$w9*+44ih)b`wruNAGG-(dnr%B zG;sUW08mM^ySWw5eNyY?gzrx7%_x4;?o)5Vp~|EyX#^f!az#M!^et<|-BPgaCTL_7S|I9~`uU|=a)$JQr zrN2I8?;&f*x8!%d3gIY0NRt$=_Nj0z3`W+^=Z4Cg$Jss~Z{je{K{H&V60Ib#LVC#C z%wAdjaOXV1JUzUU(&4V+X0wxld8jjHgSAK_9q+x>Spao z2(0IzlKuNu2pD39fvoZ@6_rlhLzH8qSor?BAK;@;rai)r@pVI;bPjAEO|OAH8<2#s z=g|T}d=mmBUb7$LT|3>ryGU>neWWAbKI;7s0+g@xX^6szsEEG8{(wZMbj0sfo!MWB zW=~*SA(x3_|H-~0+GFuke&)DEK*hDsK5t+Oo6o32>@DEw`$2Z|RIhq}xe`)GpM1X_ zoP%3LYqG9Sv5a2%6hl9O<2NBT;o*FifZ9z&K1RT6`SwF9MPGw0Fx{Yqz8FcF%e*`qzfLmUpCi96LIIyN ziU3~ih<|8UA^5^enhL&-f3uE8Ev{){4cFr&>7RCAb;otbY>>dOvVw=M&>z{`{DCjX z2+lI{H%_fO3r1Fir&xB9d|qZ&P}l8^@t6juUrSsY6%5R~AbZB}+uaIontQu5dXw-B zcpjs@A+=c0l)$v=fht|`X33y7kfQ-hdV>JXs$S5l*O0B*k{x)JnJbL(F)H7T#a~5Ltz!lwz{-T zFI)-5WwXbnO_Qgu#N@!L#uSgZu(~jN|MkXY91H`c%LcmGGibo2#jMxn?)C9yO^b`5 zV8)Q&Q@)$y-Z1VMOd3>b6FZUqUZk!}J56JU(@FM+vz?}%<_9GQLp0Bacq@yu`S-TR zI2R(>h3v!_%Rvw$y8eRRL|avRHkW3Uk{Q~dr!2qF&Wv!#_<|Q)A>@S54f(3)Uc#x} zDB+R3X_K$pw*1+|ocnZ>OmlA&ZU0h`kV~LT;B1g1c&D5k8cJxb@HH1{LPnUF3QcCL zBH}cmqv%^awA#sqd&p!VGs{}uNkoc@M+{c83H#2384EUUgG)NrDlenKQQw7BM20r{ zZ&8q@+N+(|mANvEfZ77{d-x+CZ|M4XsrNB=FO*JGB*36bK4h9 zx&22XdDMD$LAi(ss?X7Qn9Ug%**EHuK<3r*$f9xT&&}<&@Z=8PM0#Re!hJCdxMKUM zzZHQjc%5-OmV-S6_*v^?NzJO?>2O1wIr!qGXc`+?XUv%jODB z&Yq^Q+sXSv*wvb>3`Qs2J@af~)fJ`>hEkFIXn$LRz-L|6f-Bl^N$=E^BXHeWbp^o4 zjsoEox|0G9h_91lda0=%kRo8nAe;TPJ71AqzBN6GNo1YRloJ&rq8i{#c>Q6hz-=#9&RGV9| zX3><%(8niVQQqFF^l}KwTOSL9{<7R$9QMl3W8|@of4`Hsm>xBY0o~R`Aee}soEq)J z7c&t!e>WL}aI%GWHO4LKO=Co}j=ok-X?1@LlVk?QOt~ zeHc>htQAy}A zwL2AZsi=1~1;;m#uYQT$d?cRAya*vXC|5`%r00IIV78dphESM9XP%r7*diWMS1DdD0z4=)ikLRWi%hFjy;x5={T{5dPxRR}Xy2@4mqzE7h1N^j$&^8c$Zxfn6J6fvnOrrMU>SretqxXs4(wr}Ejy#?agu$PUXWZ z(Ao4KRQ_)WD7zZD{1<#8QlkI#{Rd0Xr(sf}D)tgmqH=}~Kt?H(ParH^JpN0p?BV>0 zf|Q+^J@6BHB~x?DPsexwsf0e=VoD9msNiH`>SSqW4y5{TwNIh4tAm4$sqH^_GJTrE zs1DR-0%~(`aD3VfVq(z+vH`VOnK&6fY35IknHk6o0VFmu%`Y-kGG?@OQo&A5bIXSsL@5jW<{vWOXYX6_c{&!ygw*EWbzqxXw0kujy}o02w~`}G#oyx``~+Lc~Toi=cvfcjcl$*O4B$ezw)?ZE_W zyJBWR{l9hwV%;9sI1+=KlfVu{potz z4-5BQXi=3`1cP#EYRt}*9TZSH`IrrOY!=wM6-{&c~|+(^M*SAkN=sUz}NH?q+sX?n4iR}B!lJtYMvc-d1tGL|K zfzCph&ar0VCgS^O@i_5M8L}kK+^QV~5JP)k8utFs+?=gRS23&)TJ2yMryqdh!8NIG ze&s0Hzd&l_%2D|L)=JiYq5rp3{*#pdJN5q&eio|#KjlKq?$cZUWcU9R1$xQ&kv!uLuh}B!8gaDq@rLcI;snH=>iBu#fH60%3J-TICuHhU-mf^j`v?rR?D63 z=?~`0l-J02c_c|FGj-<&f}uHJFl zF8IA%nofByN3I-n-gK7i^GlbX?CemxL$8t|L)@;5^%_eGt2D>8DoV5k4rQS!sD#-C<`d1_%%7 z@gOdsLUlF|+HT?nAlZ2Q5N;K6$N0u)uBD;P{q4O0KBbd8|D)I#FIFK%(7I21EgVzR zF6t7!As!^42bj4ci3`W_hr1$S0v9Ka@dp8SF`eM918TB<^?b8dwN~MJETzqYv+pUI z%UAsts8vW8zSWq&CdP+E#Eu`Jc=$KZv(=kycp4rkC&b(jtcm;h2< zf|Jne1WhI^OksNI;iV584SpO`bCQv`V3%uK&~e_^(F0=r=pup(`4PUTgykh+q&Ab& zZuIx_jV84)H|IEWjp)5C!tZ;w^05sZ7}{w8uCDP5Cyy5Ur1HX2I(;8l)$A6ed?br_ z=5EuJy{Vk?uJNAWorp(dYmv{C6S@agA6>t7e?#I+%Fl~zBEL1$23$kVq|({vlzR;y zYsz;HsLtaO`ypI%ro+bes<~(550tR?m|6Jy`XNMY+GzlqxQiqa!vk zw-vP<+*+{OXWB2hNAv)ZhHx6;x=*lG0YyE3ALo>qgkY;~QJRnKfmk#*x#0I<>LT{H zPb_&UbF`)-(IZxSKJH)G;XV{&0>Sv!MBDV#JCr|{(?+eAf!hW17$Rv_{y=Tt5jzy& zfb$jks1Ywk4+m*-h44v+jMgHNJm)M*;UR4Pwcdm?qKpg@_8Rq;mh=ECT2&19F+;E+ z<{LK1_*JeLLQ@@x@mIsoz8x*Y08Ov*lFmyqs=RmPZN$)FlhBnvrUY^wXe<13MSk{V zBhaUL4DMZPhRF-X*ekzH?pso?BCgsx`9~h+ElE=)iFfIB@)t{D0)>nGmmuxF(Eg^+FZGXQrgk>I#P%rk z2|vfh?;3%E=}1P01l!KOg>bC{k#3Nm|=gX~C7t19VF5Z|)U2AMV{^dUCA!FUmjDzlqhrPzwtlQt!g-_0XNp zgA6hB6ku~A-J@s5QZ0BB8;Z_!XS})uOuGY?`I@;bEKM$M4 z+*7`NLTsSsaAzvV4gaCYcHRre1HS z#S7XlPFB&w5brA!_kRWD}ydh+wxZ==iMR=oV5D;yEY!nP27Qv=dfo1E_ zG0bzwL`Ky^<43uNkqF+nR1$4JL{S#)#72gS-0An&=G(^F#wv%MuPC3K^Spz<`+cl- z_mH8N0hWQ15uYJFEaEtK#b>+rAjSRlX zqRa(CQ~vX93ajdG!L^)w%HGYI!@)m3;Z;QvmcE8m)WijbxMwInncR9_fO=j>Jbd(= z?%H;Ld%axtg#O#O6=*qtg}%*=SY9hOvR*J!FrO&tIvi2Brx7XCkw_18Lx6cdSUE@% z^E`wyXn9xKJpt2r=&9n~vth?@7v&bNh%ED!&Y({wG!Nqr^S*c90mqvNahqEYu_;k% z+oT!AX^7+zoUl)IT8vHkXP!K;daBF_BAS$5us_t%#aoI7Mdiu?p$vVY6lofXNokq* z*s$pm``!o2TNs;$P%WB7*#S}qX0gY{6oyVEIov*e7#LT(iT051rcGuNIh>{+tXBl? zy+Wb0rags(4lPpK7n9;lywZ<-i)?+_0`V3UhRKSt_$YSRzwU?WN^KiFT#g-}2W32_ z{#T-#b5E#QIUSxQc|I=q-5|XVdZQVPKQOt*pU$=u+&G_1hpTlsxLn93)G97P4DS%i zg|)r1z{j!CyAM%+=MJzA-}U%g$O}naq{FHG8d1xQ+jEJ>5M1XAlta>nA)H7M`;aA( zI9{@lFnx?0Qj`jz60azda?%kKezrdpD^2MFKyi@x8Z+hrwluFG>5s77i%M2#GAEo+ zR;9|3no#h% zwz^Ei=kCLcak9wyNQXQ1Q}Yp#6%uYR2@`Mwm6f{KslUPB{$qdN zv5|T#CzZk{6>gV0YuKcTw!K4VM$JB8!g}bc6|F@Mn!z5Df2|%Y+UYhFNB8}r zav%OMaG46T?g7Ts>b(hAEIqaa3md# z>&zR{W(Y-e@}W9VcU%whasu%KvHq5z4-+eqV}*Vl&zVuwQ4OlLW<7*!4`zG*C2KK< z7sm#~s`IeM`#f-P3;s98gLPppn_-Ety!|)Fp)GnNK4_SZ?PIAt6w=X%NS)!~JmlW2wN9lu2N98MBVG#Q7%RsHR78(?x3(<5uzuD6bJ-9j`a*8^HR1pGe zj!qm=WyD99aCNoxFiB);rP8B=qG@H|K)vx$^0J)oWA|Bv>g`ksggI z1^M$`k;)Ond-O?pe#|4YQvKW=?+?TWf);ZdZ z(_tq==z-0V+bxBPnT61Ae`wMBsA)~WEqu4~hisvQ)PooY`+l*|IwNzpgoFs`c_@mg zinvxN33SuStcQ%>dOUlH*gC4tIcO!*Fa8k@tYRGelOg=Pm7mL0GcA)6YXhIKS1_1t zoAPCMugFv`X{x8(e=oXBL%mV+EA+L}h_ohgYy2`o5;DFC+Pss;;yzH2uNuPxtTSgx z+Ar0zz!X5yIOC9xPG6uw5i%Ok7Dc{q3@bA#|C_LbY_$FhyGU8w`f1aT@BE}L{_T<~ zhcoDsw>FqFL4C#V*#;GxwvA*agP0~TpvL9sf+$WnOVSxNe{XXpJ;@#?m@Aq>&%$U) z?fCB`Wnjpfl~Js4mh>}vYNTYa=M>AN7=$j|rq&UAsN<3tlhBH6z_5gxAtqy6i(DjZ`#!sdEF<7=C;23~6Td)WE5;pEn3n^T zzBS&@;RNv$h0nyIkUyg!o{;uwJQF(+%^=lU+jHEVXSS!a_}ifj>_jrLs|VF;)N3DU z%XPX4MP3&aPv>W2Dj9s)g{GG4Ak0?lUQgnfpOt>#7zLYb2{?Db3W}q;H^FLbgEJ{a zkyMrZEors8E_SY4DxnqJfJhw_q!vO&JnX_VV=Z|h>{bYzfhMD0TMim;m?4mR_s<5W z^$zTS|2#Qm@kqe^9oIYjpn3+&;~jQiD$Txxk&WCVx6AL&Z&ET%Ce5wa6XWfNb9sLO zdfJg%77vmUN1<2Y)~BUvBxOfx88fWI#@(sB2!DV3CCFW3OcDj%X+g{10N#Qv{6G-C zoi}kJ8no4Sv$-FQJXb0H9|QA4%$NGkd`|GMzM28}5FfWsp8|!9kWaGt>XSrb6hq8Q zUcXVX$|!lb91YV!mSG&!Y{54_a>^4Nf(UnxiW*mQINBCpueFPpM>2PF!P7exSu@GNmrYt# z62v9><&wBW2I7^H%5U$s>c8wVTFB52x13cd&hZ8LR|!hk7t#`=VARqiRNFk0PtQu9 zTU-mAQA+}wL=wW(B%T9u9+@s6TwgmVn}5?yLUMSc-<(oBXn4^z4(A*#3mYvdXYzJ7 zBe{1tH7S{Nx(J+kDA-|0B_0sadAKB+r~U{&NVcogqVpKokY@Tz;ygWm&YwNlMrU!_6END0pky)dw}cXgj}}Q19^5^jf%qk z7=?n{sW5QN%)q?0*`r{c?7fG%U3)mmpm?8MF5RrTIF&*>u}o^goi!Xcl|s*YT6zV$ z@>|8C)o-iH(ju*?fhL+CfnfIp?rj;qTh*925m~8JBKKk(&Yq$&Tj0?BFysv;w}MKj zR+-S`XuDI>)9Y&agBD_Y1d_rjs8rMh*vDv8mh)5v!tD^`#N%O+qqs1CYVl=6T)56> zicBj-4aH=1PjzZ=pqUxlyZf(ii#U=}1J}3(HnQz;49}YXx zF+Is@d6UMm$!pulTv&KGZ72lddi%vPhac!@8UND30|n4yjrMx{@~^KG)Icet{<0ks zTn%X#f3h$+%qXDh*s1B7DCiD)556%Zn^Kj``p1qwxo|U3qEaksq-yERrDcqm+JNR9 z)44Of%E!JFjXZkk3}_+!{WJF6nlBLsVUxs;BZBPDA85yb%*f{O#KKS^Hy6vDL z*!2WK`H|*cP;vV=oLRjj7#H?=czA%M^T%~K#_5#m9(|QiIjk;+Zv>x;fKUn^Wr~En z@q0N8T1ib?3x&#gB{i(vE#`3a8?C&uZg=_1k4W6S{N{#VwImwKb8`YqolDxfD(k%N zqIMUEww0XIYUg3IZ8m@(nhe&~4i~d34`%a$n%eFEb$zY}_t5UL^%B)A!2FtG95s1k zW;IpNuJ$Kk6iTaT1#H#*h4L>}YokF!9T>d(F7x))a!_A+9c&$}21XUN8b+`DLOjjO z_WN)Zy@^PnbdOQJ8xXKRQIQFCzg;G_mBTHo!RkhsdCBzk_?^m7mzgjj@^~LSDF`H< z8g$K^VLNA0(-46`J;$hJ#)NKcL&R_z5&Wi+2h2h?G4=Q*TM`NVuJ>_6;z6tpd3Sqc zhWhzvGOtPpnmjp4$px|~o^%W|s%Yt6Q9TCY7b%z$mbXOVU;i&b7yi*)(#{8B%|kk4 z(YsreSMe=}Nm-IMb>Ng{HVhqcu za>lv&qfL)9qv(W5ZL0ZnPo?I;hldSgFTI0P14%tmd_zcHlG7%8^4H+(1U|VoVgiiF8Fk+Lp&j{O( z6Z$&2mkB!{OeFWql^1rHJJ=v9m1rAs1afE(a1R-NhZFxRX^bCn80nVR9uIcEBdd;| z1}yoA5H^Ge%AivlbO>=ux5J(`RVYf>4l+_tKNIQ`EOxX8Oi@^>13r>*l6@}h0Et?! zSQr{|XGpkW3@6M0@j_RBSgLUFHHPdyCnOC@Ne}r*DicC^TxZmdOR0Dk7+Q@Ng{){+ ze=Q~jwSJdPsZbU~BFYKpL@@Qp0TWU&$wa7SSSqQ{SGY}3UoaEI6(bYc6>LnT0p@nH zVq`P687u-O zNvsE@ZZv!smeYe!gMB654C_cvC!`bHjAa+lNm3P3fnpzGoy6w=H>hn$y=_|qfAw7> z=C>R0+@Hq~avRq|@q4eX1Hty11K;)r=Q;!jNmX!i*ogtgc6(S(muEA~6~9KbyTEGH zj3hsOSm%^3_`(Gcq9_Ltw&ZHL9efbYU_dKTPS@8oOZzy zD1SGZ`#O7f!X|ss!u}c*Tr;$NA@0M<`{n_qxBUoWC4PsiH2A>^$i4wE8GR0B1ulXV1RQ!wCXY5}A3ppQHYUBF-#4Cay;n;v zc=}5&cKE%C9*$n*ua0uwCrU2%_`Mk)j(&W=c|Sva5a)E9WGM(7%zm7BJ^TL1dfzyi z{h*Tn6ihzd&c59GzWQ#?Qh)R_wF!Pf5Uk@`J{181d+h6`?zI(z8RPod@278yMzG4C z%A2O)h&-K0ex^uDRa~1!cIOfX&c2&E@a~ulvCH+T@^I7=R!QkVTC2puBBimz(HE!6 z@oWih3!sfNr-(Wm<;Ug8bC@@qP8!TEJw~Dqa2J;{$h7r1{WOhsFdxHx`06CEX5d3f zf#?QXg3ib#wo-m-Cw&oV+Xxvs`yyQ{D5|cL@XdidoO_t)2iT*jaM-MIf%r}rb0c;j z*f)Dt;%8I(X=*aloI^y|WgoAJGUA33RMr{!y?9`1L zehO7qu_B>CEBY&dIUKcoksL>`!jSZwLeq(@s0Xr6kNsQwEZOlRm8(}0H^1~x*~f>q z1krTin8v;VaqPr!mO-tk0qBC+pHy2bJos~&vO}u4FZ%fDSlKi;A%uf;u?my%5MV=- zJlTUoGfmprF1*ze5BSbb!cIX8k!780qyV2E63ybj_pa_=2Up}`jbj_PnNl~QArnwt z6xZ$jN#|?U;qbpzcQ!D6{c$5RHO5(P)Qie#bXQFu)qSiV=+zb!kW%j8l<|_4I(n0} z>X1FpmsR2hbD*cssUQn`@SSop5Qls z&?7Eq(w08MX^d;Xa>UXE zFm0*HFvv&gr9{d&EXt)<`v!gu@SgcvesM$ z8$U*vb-$~Tqz&3b#4-C-jigXg|4(;Hqdj%H1z-=Ik=alMZp> ziH0Vo%!9YNdRHLgEFz(!l4&VxF->t^+iM`0QRD5|DD=E4m-#)B4<6bg3#E`CIfK2W zB}(UV?am@#`r{2m{O;xY-Pba&zQ60H zn9kXSnN9Cf>O_vPn+U1nI4u~nG?&6fOD@b}MD>GgI?h<=tK--#Fn0MEutHMe1tt!Q z8Qm;Q)DsM_D=|xjGsSo`|Fp%oJIg}O``)fpR~##>Kg)>%z1wM}oS~S^tLit$OBQB{ zR@zvU_N_&`-Je!P7cmj@&z?~CNuyV49KNQ#J-VIWZ|Q>D(oPD|Gf#$25RzMPFHf*1 z`uBcRX|$}`9ZwAJja?eIGpB(SnVI2>g;(Zyq|NCH==cbgcJl6PGONVc)t6erGczY@ zkdWz_6VqQkdVuHn%c=CeM~}o;iDlePje;^KdE$&|moB^1fB9^9$){nggPpX~f#fb4 z=)cL3ek5qN%hFNF-2Ptc*X!fK06kk{tX)Z?bBx0Lbx=C=Pom+upk2Fbg{5&q)=0}L z4uCtaQ{iXyy5D7qoJf0jen-l<_F(3*(|$5O^xm8GQqM`5LsvrV@AeQcSua1N4Fu!1 z5CQdrD?BWk_roq9nZz?{bXMV-1k#JluFA#_6zL$V@Hp<~73jhzRk5CPfy8p3inFP( zefR#E)xV^MR-OWG`Y0(wA+#&LI&evD0&cP3}oKaEs)&kaOS|B?3`S8oJl5qt+j1x@TyPa`f`EonvqMd*?gW&JaR*rszEb?)pfcJfBOR^YbinFWMdvO?9(a zR@&ZvC?!^0(0*V7BhIQh+j{xV%0}~>m;}?P^gQ~+OTt)#seApDT5lGkDv+gkThjg8 zpHlE(VaB3rc{)DIOO~+5>gblsF=ekMblb{5Z^#tXdOXN>?5wf7J}LKPe-qnQDOXV{ zWq7SLO+3r^vu%5ZN#n9nwy!{L=Dg}O*-`+<37#{$fUZQ{`C}-+!Zb4rcFKganCr=z zBH=Nlwi+JglH(umKbpR2TF|OtdZ|h$U(hux`-XCkTdZFYD##%k(jwX-(djR)G*F!#7 z!+q)C2>^!+V4}6DMl+zr^fax9kfOsG2Zu9YqQtAcKp*8Y^zJcJmmaV>=#xQOBUb!; zD_0+JDr)jsc_8q51!deduHVQp~;F6ueQLUn-mm(PxS zH=-XcRq7b|Y_#cAXPpvJ81_8=^c7uQpj=(sDJ5P*u#V8_YhekYE((=>#dsUHTtr3R z(fjcLqFok6gRmcSI<3YWg7KPWk8fX(FH5g4(efqn_5Gnn;W+EZ&54hWNFz~Ky`J}lE=PNP|+stsWTe1GNw5|#TW|}AsmL-P~ zgP0v-VpdW=Enix%O|_dyr|(!UdJr6YgCOr%I-tEMNMa76F?(o}?4In9?4N9s?3`TC z_9mJoWnN8Hd3ETbTk1<9s8d$Juf)Rv<@dgKrw&^*?ATvlx%+h|82eYwWX9A=z@VdQ zgd(SaI*x;!k&1c!`^A$ZgI5Z&T5eTDqC5toM?6wty;dV(NJ0iTdo7>Dou%{5r?2s8 zK5LI!2dn|s#}~)n-fWkU3fBvlrXQTuU3wgDHTVbPmLoOe^E6LB;VAA*MnVWb3(qNc zI|tkF>iJJu#iz~sfZ4VRGbH)sMdZMvVh$-odo7s=#lj5g*+jOGwGyg`7=-4TW`vIe z%%`4zLx|o7KoIrNO#(`oZ)VF`s)_T$1cT#t6)p}(nb9@?AYBY8Tc>!Slt!fNy7fM~ z=;qhv{Z^oaF2gRiOkq zr$a5z>X|KHMM=d=6lrOa%f&QB1C^&^b+Kszf@&w zw4I?iNg3{i7a}Q|ny%?%Yuz#don_6m!_xQ8>8Mmi6aw%Q%Sg;{-u!8yLO}KAllJif zpw{+1%lx&Y93Snd%;sv0AEk3VS65`R7*SX3kC@uiKT{Ds*fApc!PN?~6mmpciS-e_ z=&3{V$%{FcX~23lvz1OhWsBPstya9Dig$`HmJE%c-b0HZJkxwNNT#9ZHtwhqc6XAc zL*i;EQ5R~bW4Wfw6u!bkCnl(h(5G=My+ZlM8Xsi<bW0~_-Q6JqT|4(ZA<&VI;s;KD;Mrd%sS z7uAgzHQb*=F>3}FPvq;V@f)f^h9?|r_O^QE#L^JMI$5Pt-Fq|CFTBMN&O@%ptMmoi z^<2#K^3KF>5ifHp;cVDvdm6cVk20LGjatu;;A(h( zK~|04#TAh=OS5pLWBt|0hukhwTn6iu%C@O{s0K!0R36X%^mfsZX}%!4f$>nXLDL_2 z3 z3nu}j(4?++&qcVlk3*Vi1}}29STi3JCO+_Nx=hWA7V#$Z7;H>Tz@_n1G64xrc6}w{ z9jA6~O-{IsH^x*{G@4lspd>%nC9-dJAN^uPy&K-+P^`lbkAD#LzZuT_bXFYu*iw8W+r)xHObCw;hk-)rbrO-W=$4V?VE*2P=AJDa+qb3~xC%Uv~0QVI7- z_JucJL)m9uwgE8|-TS`PI}1Zg(Z^Rl#v_%I?=6*zd51(a$K^m#64mtmIm0=+PI|MF zKsE-I0IS#CNmCy%;S>rO*ruK2U;Ic$UWwwgXqCGN^S4mh67{H7SO&cBg@y z0u_TRQp7)xiBdYH)2k|Nmx&*4p0_IrObSh=Kny26Sh_Tcz1Y3-XzB01jee}7oq$xz zrPwXS^ttkxWZ=z#d?t?stHGCMBSr!D0^=9 zTX*S!yg%GUD$QSUG|t-#$Qai{JB^h9ZkmtRrXNfX0S>_+7LOZf?$lt<-0=iIDhUWb zHA8|yn)tVVcuyH~Lsg^NMRkslyCSXdlPHs}9Bb_i4$ zLH5rFX8jPd!@=a}fy4f9ke$plg`rTg%_c*3QHU@c1P2{LcJloP#{DPA4nEMHKT3A! zq5k~Qr2dTfxxaPEPm=xD7yph}|3CaX6lB0n#{7r!nfy|Rxcfli|A5o~@z(z$>2D`N z+=%bU{m_CR{yKQTcX@5Vje!3sw7*|wzzqRGxbMI~5VDsS69@lCe+?r)>YsXv|K@8& z;m{v-twB^js+IdBZe6C0vpTq~6=%9v1PEHF!2+2)C2&$r~G>$iFO0|vXT@9=;u!_*kqL%AoyzBp9 zab=PwnBT^`{yeEy$@NBr(^la`)2itz9GNd|o?Uo(=47g&#O`a=W00YaF|&a$ z7QQ7c_Z0dx;jgZz+Vc;%dCO~9nrPjW3D!C_^2sQbUrUy}QFN7^I}Jfko2V1T#q?3$ z?TJe^&!B*YzwjSm!#u&dv%7AM(3Xk|GeR~ZgCQHPNuknZlRP0+>D7cODjt@FS3)z? zt>^6eb=VyP%(0WVCiW=2%)(y(zHI-Onf!fX{-&#cox=ZDQ+?3TFQ)onP=8oeo@fh8 z8gh{YoQ7Oe^3TBygF?li+?L$mW8`XzZ|Arj{*A#z4|MjyaTo)E#1X&5AmriOLY}<8<_94c z^ZfcAP%*@BZ9pL)@=E?W7bpY*f*;0Q(I(`g9P~lOk*19|S+v7xL^K>7$yGxKqd@+< hJgABJ2H(kL4=%1IXxDG!0fivMMQMOQ1vN#Q{{b8 Date: Sat, 15 Feb 2025 15:36:27 +1100 Subject: [PATCH 05/34] fix sfc_flux argument order in therm_vertical (#513) The call to set_sfcflux in icepack_therm_vertical.F90 has the fsurfn_f and fcondtopn_f arguments switched, causing issues for models using calc_Tsfc = .false.. This PR fixes these. --- columnphysics/icepack_therm_vertical.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/columnphysics/icepack_therm_vertical.F90 b/columnphysics/icepack_therm_vertical.F90 index e931629ce..a8eab3312 100644 --- a/columnphysics/icepack_therm_vertical.F90 +++ b/columnphysics/icepack_therm_vertical.F90 @@ -2697,8 +2697,8 @@ subroutine icepack_step_therm1(dt, & ! hadgem routine sets fluxes to default values in ice-only mode call set_sfcflux(aicen (n), & flatn_f (n), fsensn_f (n), & - fcondtopn_f(n), & fsurfn_f (n), & + fcondtopn_f(n), & flatn (n), fsensn (n), & fsurfn (n), & fcondtopn (n)) From b3b51277d0fdf01441db72690348025580c7f0cd Mon Sep 17 00:00:00 2001 From: Nicole Jeffery Date: Wed, 2 Apr 2025 16:06:39 -0600 Subject: [PATCH 06/34] Corrects negative silicate values (#519) The fix removes an incorrect if block around the silicate limitation functions which was mistakenly added in Icepack v1.5.0. Silicate limitation should not be wrapped in an if statement for iron tracers. nonBFB with active BGC. BFB for all else. --- columnphysics/icepack_algae.F90 | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/columnphysics/icepack_algae.F90 b/columnphysics/icepack_algae.F90 index 7a958ee82..7239edd15 100644 --- a/columnphysics/icepack_algae.F90 +++ b/columnphysics/icepack_algae.F90 @@ -1860,13 +1860,10 @@ subroutine algal_dyn (dt, & U_Nit(k) = U_Nit_f(k)*U_Nit_tot U_Sil(k) = U_Sil_f(k)*U_Sil_tot U_Fe(k) = U_Fe_f(k)*U_Fe_tot - - if (n_fed == 0) then - if (R_Si2N(k) > c0) then - grow_N(k) = min(U_Sil(k)/R_Si2N(k),U_Nit(k) + U_Am(k), U_Fe(k)/R_Fe2N(k)) - else - grow_N(k) = min(U_Nit(k) + U_Am(k),U_Fe(k)/R_Fe2N(k)) - endif + if (R_Si2N(k) > c0) then + grow_N(k) = min(U_Sil(k)/R_Si2N(k),U_Nit(k) + U_Am(k), U_Fe(k)/R_Fe2N(k)) + else + grow_N(k) = min(U_Nit(k) + U_Am(k),U_Fe(k)/R_Fe2N(k)) endif fr_Am(k) = c0 From 51695d08d92c20790d263d63abc2c17d715c8afe Mon Sep 17 00:00:00 2001 From: davidclemenssewall <51925832+davidclemenssewall@users.noreply.github.com> Date: Fri, 4 Apr 2025 12:50:07 -0600 Subject: [PATCH 07/34] MDF/MOSAiC forcing options (#500) The overall goal of these options added to the Icepack driver are to make it easier to use Icepack as a standalone tool forced with observations. These changes have been implemented specifically for the MOSAiC Expedition. But my hope is that they will be readily extendable to other field data (or reanalysis, etc), so that new datasets can simply be used in Icepack, rather than requiring code changes for every new forcing dataset. Observational data presents the following complications: Missing values. Real observational datasets almost always have missing values (power loss, radiometer dome iced over, etc...). Furthermore, future versions of the observational datasets may fill some of these missing values (e.g., by reprocessing data that previously failed qc). Variable frequencies. Different data streams may be measured at different sampling frequencies. Data might be measured more often than the model's timestep (thus requiring aggregation) or less often (thus requiring interpolation). Different start and end time points. Different data streams may have different start or end times, and updated versions of datasets may extend the time domain. Merged observational datasets are a work-in-progress. The 3 challenges above all touch on the fact that for sea ice field campaigns, it can take years from the end of the campaign until a truly finalized observational dataset is available to force Icepack with (e.g., MOSAiC is 4 years and counting, SHEBA still does not have such a dataset). We still want to be able to use campaign data to support Icepack development during this time, without having to change the Icepack driver every time the forcing dataset is updated. Additionally, for comparing with field data it is very useful to be able to easily adjust: The initial state of the sea ice and ocean mixed layer. Fixed values for the oceanic heat flux convergence (qdp) and sea surface salinity (sss). To address these challenges the PR provides the following features: Precalculate the forcing values at each timestep on initialization (in init_forcing). The current paradigm for forcing data in Icepack is that when init_forcing is called, a subroutine for the specific dataset (e.g., atm_CFS) stores the forcing data in the *_data in essentially the same format that the raw data is present in, without timestamp information. It also hardcodes the maximum size that a forcing dataset can be to 8760. Then, at each timestep the get_forcing subroutine has a code block for each forcing dataset that contains the timestamp information and interpolates the forcing data to the given timestep. Under this paradigm, I could not figure out a graceful way to handle missing values, nor forcing data with higher sampling frequency than the Icepack timestep, nor changing start times of the forcing dataset. This PR adds a new option, precalc_forc, for use with the MOSAiC forcing. When precalc_forc = .true., the forcing data is aggregated/interpolated to the Icepack timestep in the call to init_forcing and stored the the *_data arrays. Then, the get_forcing subroutine merely indexes into the *_data arrays. Read forcing data from MDF-formatted netCDF files (Uttal et al. 2024; https://doi.org/10.5194/gmd-17-5225-2024, https://gitlab.com/mdf-makers/mdf-toolkit). I chose this format because its framework seemed well-aligned, but it is still in development so we can add variables to it that we need for the ice model (e.g., mixed layer depth). To handle variable frequencies and missing data, forcing data are first temporally-averaged for each timestep and then interpolated. For a give data variable (var_data), The MOSAiC_average subroutine takes the average of all forcing datapoints within each timestep +- 0.5 dt excluding missing values and stores the results in var_data. If there is no valid data within 0.5 dt of a given timestep (e.g., most timesteps if the model timestep is much smaller than the sampling period) then a missing value is placed in var_data(timestep). Then, the MOSAiC_interpolate subroutine linearly interpolates missing values in var_data. The option to explicitly set in the namelist the initial ice and snow thicknesses for the slab and ITD grid cells and the SST for the 3 ice grid cells. The option to explicitly set in the namelist fixed ocean mixed layer conditions qdp_fixed, sss_fixed, and hmix_fixed. These are overwritten by forcing data. --- configuration/driver/icedrv_InitMod.F90 | 8 +- configuration/driver/icedrv_RunMod.F90 | 8 +- configuration/driver/icedrv_flux.F90 | 17 +- configuration/driver/icedrv_forcing.F90 | 919 ++++++++++++++---- configuration/driver/icedrv_init.F90 | 64 +- configuration/scripts/icepack_in | 23 +- .../scripts/options/set_nml.atmmosaic | 17 + .../scripts/options/set_nml.ocnmosaic | 6 + configuration/scripts/tests/base_suite.ts | 1 + doc/source/developer_guide/dg_driver.rst | 4 +- doc/source/icepack_index.rst | 11 +- doc/source/master_list.bib | 19 + doc/source/user_guide/ug_case_settings.rst | 13 + doc/source/user_guide/ug_implementation.rst | 65 +- doc/source/user_guide/ug_running.rst | 40 + 15 files changed, 998 insertions(+), 217 deletions(-) create mode 100644 configuration/scripts/options/set_nml.atmmosaic create mode 100644 configuration/scripts/options/set_nml.ocnmosaic diff --git a/configuration/driver/icedrv_InitMod.F90 b/configuration/driver/icedrv_InitMod.F90 index ba1b1de6f..6320986ec 100644 --- a/configuration/driver/icedrv_InitMod.F90 +++ b/configuration/driver/icedrv_InitMod.F90 @@ -42,7 +42,7 @@ subroutine icedrv_initialize ! use icedrv_diagnostics, only: icedrv_diagnostics_debug use icedrv_flux, only: init_coupler_flux, init_history_therm, & init_flux_atm_ocn - use icedrv_forcing, only: init_forcing, get_forcing, get_wave_spec + use icedrv_forcing, only: init_forcing, get_forcing, get_wave_spec, precalc_forc use icedrv_forcing_bgc, only: get_forcing_bgc, faero_default, fiso_default, init_forcing_bgc use icedrv_restart_shared, only: restart use icedrv_init, only: input_data, init_state, init_grid2, init_fsd @@ -137,7 +137,11 @@ subroutine icedrv_initialize call init_forcing ! initialize forcing (standalone) if (skl_bgc .or. z_tracers) call init_forcing_bgc !cn if (tr_fsd .and. wave_spec) call get_wave_spec ! wave spectrum in ice - call get_forcing(istep1) ! get forcing from data arrays + if (precalc_forc) then + call get_forcing(istep) ! precalculated arrays are indexed by istep + else + call get_forcing(istep1) ! get forcing from data arrays + endif if (tr_snow) then call icepack_init_snow ! snow aging table diff --git a/configuration/driver/icedrv_RunMod.F90 b/configuration/driver/icedrv_RunMod.F90 index a7bc82bde..fb784cc52 100644 --- a/configuration/driver/icedrv_RunMod.F90 +++ b/configuration/driver/icedrv_RunMod.F90 @@ -32,7 +32,7 @@ module icedrv_RunMod subroutine icedrv_run use icedrv_calendar, only: istep, istep1, time, dt, stop_now, calendar - use icedrv_forcing, only: get_forcing, get_wave_spec + use icedrv_forcing, only: get_forcing, get_wave_spec, precalc_forc use icedrv_forcing_bgc, only: faero_default, fiso_default, get_forcing_bgc use icedrv_flux, only: init_flux_atm_ocn use icedrv_history, only: history_format, history_close @@ -74,7 +74,11 @@ subroutine icedrv_run file=__FILE__,line= __LINE__) if (tr_fsd .and. wave_spec) call get_wave_spec ! wave spectrum in ice - call get_forcing(istep1) ! get forcing from data arrays + if (precalc_forc) then + call get_forcing(istep) ! precalculated arrays are indexed by istep + else + call get_forcing(istep1) ! get forcing from data arrays + endif ! biogeochemistry forcing if (tr_iso) call fiso_default ! default values diff --git a/configuration/driver/icedrv_flux.F90 b/configuration/driver/icedrv_flux.F90 index 321a84912..80d5eec46 100644 --- a/configuration/driver/icedrv_flux.F90 +++ b/configuration/driver/icedrv_flux.F90 @@ -129,6 +129,9 @@ module icedrv_flux qdp , & ! deep ocean heat flux (W/m^2), negative upward hmix ! mixed layer depth (m) + real (kind=dbl_kind), public :: & + sst_init ! initial sea surface temperature (C) + ! water isotopes real (kind=dbl_kind), dimension (nx), public :: & HDO_ocn , & ! seawater concentration of HDO (kg/kg) @@ -184,6 +187,12 @@ module icedrv_flux fswthru_idr , & ! nir dir shortwave penetrating to ocean (W/m^2) fswthru_idf ! nir dif shortwave penetrating to ocean (W/m^2) + ! fixed ocean mixed layer properties (are overwritten by forcing data) + real (kind=dbl_kind), public :: & + sss_fixed , & ! Sea surface salinity (PSU) + qdp_fixed , & ! Deep ocean heat flux (negative upward, W/m^2) + hmix_fixed ! Mixed layer depth (m) + ! internal real (kind=dbl_kind), & @@ -485,8 +494,8 @@ subroutine init_coupler_flux uocn (:) = c0 ! surface ocean currents (m/s) vocn (:) = c0 frzmlt (:) = c0 ! freezing/melting potential (W/m^2) - sss (:) = 34.0_dbl_kind ! sea surface salinity (ppt) - sst (:) = -1.8_dbl_kind ! sea surface temperature (C) + sss (:) = sss_fixed ! sea surface salinity (ppt) + sst (:) = sst_init ! sea surface temperature (C) sstdat (:) = sst(:) ! sea surface temperature (C) ! water isotopes from ocean @@ -501,8 +510,8 @@ subroutine init_coupler_flux if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, & file=__FILE__,line= __LINE__) - qdp (:) = c0 ! deep ocean heat flux (W/m^2) - hmix (:) = c20 ! ocean mixed layer depth + qdp (:) = qdp_fixed ! deep ocean heat flux (W/m^2) + hmix (:) = hmix_fixed ! ocean mixed layer depth !----------------------------------------------------------------- ! fluxes sent to atmosphere diff --git a/configuration/driver/icedrv_forcing.F90 b/configuration/driver/icedrv_forcing.F90 index 98e390e22..5e28c6d63 100644 --- a/configuration/driver/icedrv_forcing.F90 +++ b/configuration/driver/icedrv_forcing.F90 @@ -10,6 +10,7 @@ module icedrv_forcing use icedrv_domain_size, only: nx use icedrv_calendar, only: time, nyr, dayyr, mday, month, secday use icedrv_calendar, only: daymo, daycal, dt, yday, sec + use icedrv_calendar, only: npt, use_leap_years, time0, year_init use icedrv_constants, only: nu_diag, nu_forcing, nu_open_clos use icedrv_constants, only: c0, c1, c2, c10, c100, p5, c4, c24 use icepack_intfc, only: icepack_warnings_flush, icepack_warnings_aborted @@ -20,14 +21,18 @@ module icedrv_forcing use icedrv_flux, only: zlvl, Tair, potT, rhoa, uatm, vatm, wind, & strax, stray, fsw, swvdr, swvdf, swidr, swidf, Qa, flw, frain, & fsnow, sst, sss, uocn, vocn, qdp, hmix, Tf, opening, closing, sstdat +#ifdef USE_NETCDF + use netcdf +#endif implicit none private + public :: init_forcing, get_forcing, interp_coeff, & interp_coeff_monthly, get_wave_spec - integer (kind=int_kind), parameter :: & - ntime = 8760 ! number of data points in time + integer (kind=int_kind) :: & + ntime ! number of data points in time integer (kind=int_kind), public :: & ycycle , & ! number of years in forcing cycle @@ -35,47 +40,45 @@ module icedrv_forcing fyear , & ! current year in forcing cycle fyear_final ! last year in cycle - real (kind=dbl_kind), dimension(ntime) :: & - fsw_data, & ! field values at temporal data points - cldf_data, & - fsnow_data, & - Tair_data, & - uatm_data, & - vatm_data, & - wind_data, & - strax_data, & - stray_data, & - rhum_data, & - Qa_data, & - rhoa_data, & - potT_data, & - flw_data, & - qdp_data, & - sst_data, & - sss_data, & - uocn_data, & - vocn_data, & - frain_data, & - swvdr_data, & - swvdf_data, & - swidr_data, & - swidf_data, & - zlvl_data, & - hmix_data + real (kind=dbl_kind), allocatable :: & + fsw_data(:), & ! field values at temporal data points + cldf_data(:), & + fsnow_data(:), & + Tair_data(:), & + uatm_data(:), & + vatm_data(:), & + wind_data(:), & + strax_data(:), & + stray_data(:), & + rhum_data(:), & + Qa_data(:), & + rhoa_data(:), & + potT_data(:), & + flw_data(:), & + qdp_data(:), & + sst_data(:), & + sss_data(:), & + uocn_data(:), & + vocn_data(:), & + frain_data(:), & + swvdr_data(:), & + swvdf_data(:), & + swidr_data(:), & + swidf_data(:), & + zlvl_data(:), & + hmix_data(:), & + open_data(:), & + clos_data(:) real (kind=dbl_kind), dimension(nx) :: & sst_temp - real (kind=dbl_kind), dimension(ntime) :: & - open_data, & - clos_data - character(char_len), public :: & atm_data_format, & ! 'bin'=binary or 'nc'=netcdf ocn_data_format, & ! 'bin'=binary or 'nc'=netcdf bgc_data_format, & ! 'bin'=binary or 'nc'=netcdf - atm_data_type, & ! 'default', 'clim', 'CFS' - ocn_data_type, & ! 'default', 'SHEBA' + atm_data_type, & ! 'default', 'clim', 'CFS', 'MDF' + ocn_data_type, & ! 'default', 'SHEBA' 'MDF' bgc_data_type, & ! 'default', 'ISPOL', 'NICE' lateral_flux_type, & ! 'uniform_ice', 'open_water' atm_data_file, & ! atmospheric forcing data file @@ -94,8 +97,9 @@ module icedrv_forcing frcidf = 0.17_dbl_kind ! frac of incoming sw in near IR diffuse band logical (kind=log_kind), public :: & - oceanmixed_ice , & ! if true, use internal ocean mixed layer - restore_ocn ! restore sst if true + oceanmixed_ice , & ! if true, use internal ocean mixed layer + restore_ocn , & ! restore sst if true + precalc_forc ! whether to precalculate forcing real (kind=dbl_kind), public :: & trest, & ! restoring time scale (sec) @@ -120,6 +124,32 @@ subroutine init_forcing character(len=*), parameter :: subname='(init_forcing)' + ! Initialize ntime and allocate data arrays + if (precalc_forc) then + if (trim(atm_data_type(1:3)) /= 'MDF') & + call icedrv_system_abort(string=subname//& + 'precalc_forc should only be used with MDF atmosphere', & + file=__FILE__,line=__LINE__) + if (.not. ((trim(ocn_data_type(1:3)) == 'MDF') & + .or. (trim(ocn_data_type(1:7)) == 'default'))) & + call icedrv_system_abort(string=subname//& + 'precalc_forc should only be used with MDF ocean or'//& + ' default ocean', file=__FILE__,line=__LINE__) + ntime = npt + else + ntime = 8760 + endif + allocate(fsw_data(ntime), cldf_data(ntime), fsnow_data(ntime), & + Tair_data(ntime), uatm_data(ntime), vatm_data(ntime), & + wind_data(ntime), strax_data(ntime), stray_data(ntime), & + rhum_data(ntime), Qa_data(ntime), rhoa_data(ntime), & + potT_data(ntime), flw_data(ntime), qdp_data(ntime), & + sst_data(ntime), sss_data(ntime), uocn_data(ntime), & + vocn_data(ntime), frain_data(ntime), swvdr_data(ntime), & + swvdf_data(ntime), swidr_data(ntime), swidf_data(ntime), & + zlvl_data(ntime), hmix_data(ntime), open_data(ntime), & + clos_data(ntime)) + fyear = fyear_init + mod(nyr-1,ycycle) ! current year fyear_final = fyear_init + ycycle - 1 ! last year in forcing cycle @@ -153,6 +183,7 @@ subroutine init_forcing fsnow_data(:) = fsnow(i) ! snowfall rate (kg/m^2 s) qdp_data(:) = qdp (i) ! deep ocean heat flux (W/m^2) sss_data(:) = sss (i) ! sea surface salinity + hmix_data(:)= hmix (i) ! ocean mixed layer depth (m) uocn_data(:) = uocn (i) ! ocean current components (m/s) vocn_data(:) = vocn (i) cldf_data(:) = c0 ! cloud fraction @@ -161,6 +192,7 @@ subroutine init_forcing if (trim(atm_data_type(1:4)) == 'clim') call atm_climatological if (trim(atm_data_type(1:5)) == 'ISPOL') call atm_ISPOL if (trim(atm_data_type(1:4)) == 'NICE') call atm_NICE + if (trim(atm_data_type(1:3)) == 'MDF') call atm_MDF if (trim(ocn_data_type(1:5)) == 'SHEBA') call ice_open_clos if (restore_ocn) then @@ -176,6 +208,7 @@ subroutine init_forcing if (trim(ocn_data_type(1:5)) == 'ISPOL') call ocn_ISPOL if (trim(ocn_data_type(1:4)) == 'NICE') call ocn_NICE + if (trim(ocn_data_type(1:3)) == 'MDF') call ocn_MDF call prepare_forcing (Tair_data, fsw_data, & cldf_data, & @@ -227,164 +260,194 @@ subroutine get_forcing(timestep) character(len=*), parameter :: subname='(get_forcing)' - if (trim(atm_data_type) == 'CFS') then - ! calculate data index corresponding to current timestep - i = mod(timestep-1,ntime)+1 ! repeat forcing cycle - mlast = i - mnext = mlast - c1intp = c1 - c2intp = c0 - - ! fill all grid boxes with the same forcing data - Tair (:) = c1intp * Tair_data(mlast) + c2intp * Tair_data(mnext) - Qa (:) = c1intp * Qa_data(mlast) + c2intp * Qa_data(mnext) - uatm (:) = c1intp * uatm_data(mlast) + c2intp * uatm_data(mnext) - vatm (:) = c1intp * vatm_data(mlast) + c2intp * vatm_data(mnext) - fsnow(:) = c1intp * fsnow_data(mlast) + c2intp * fsnow_data(mnext) - flw (:) = c1intp * flw_data(mlast) + c2intp * flw_data(mnext) - fsw (:) = c1intp * fsw_data(mlast) + c2intp * fsw_data(mnext) + if (precalc_forc) then + ! Fill all grid boxes with same forcing data + Tair (:) = Tair_data(timestep) + Qa (:) = Qa_data(timestep) + uatm (:) = uatm_data(timestep) + vatm (:) = vatm_data(timestep) + fsnow(:) = fsnow_data(timestep) + flw (:) = flw_data(timestep) + fsw (:) = fsw_data(timestep) ! derived (or not otherwise set) - potT (:) = c1intp * potT_data(mlast) + c2intp * potT_data(mnext) - wind (:) = c1intp * wind_data(mlast) + c2intp * wind_data(mnext) - strax(:) = c1intp * strax_data(mlast) + c2intp * strax_data(mnext) - stray(:) = c1intp * stray_data(mlast) + c2intp * stray_data(mnext) - rhoa (:) = c1intp * rhoa_data(mlast) + c2intp * rhoa_data(mnext) - frain(:) = c1intp * frain_data(mlast) + c2intp * frain_data(mnext) - swvdr(:) = c1intp * swvdr_data(mlast) + c2intp * swvdr_data(mnext) - swvdf(:) = c1intp * swvdf_data(mlast) + c2intp * swvdf_data(mnext) - swidr(:) = c1intp * swidr_data(mlast) + c2intp * swidr_data(mnext) - swidf(:) = c1intp * swidf_data(mlast) + c2intp * swidf_data(mnext) - - elseif (trim(atm_data_type) == 'clim') then - midmonth = 15 ! assume data is given on 15th of every month - recslot = 1 ! latter half of month - if (mday < midmonth) recslot = 2 ! first half of month - if (recslot == 1) then - mlast = month - mnext = mod(month ,12) + 1 - else ! recslot = 2 - mlast = mod(month+10,12) + 1 - mnext = month - endif - call interp_coeff_monthly(recslot, c1intp, c2intp) + potT (:) = potT_data(timestep) + wind (:) = wind_data(timestep) + strax(:) = strax_data(timestep) + stray(:) = stray_data(timestep) + rhoa (:) = rhoa_data(timestep) + frain(:) = frain_data(timestep) + swvdr(:) = swvdr_data(timestep) + swvdf(:) = swvdf_data(timestep) + swidr(:) = swidr_data(timestep) + swidf(:) = swidf_data(timestep) + + ! Ocean forcing + sst_temp(:) = sst_data(timestep) + sss (:) = sss_data(timestep) + uocn (:) = uocn_data(timestep) + vocn (:) = vocn_data(timestep) + qdp (:) = qdp_data(timestep) + + else + if (trim(atm_data_type) == 'CFS') then + ! calculate data index corresponding to current timestep + i = mod(timestep-1,ntime)+1 ! repeat forcing cycle + mlast = i + mnext = mlast + c1intp = c1 + c2intp = c0 + + ! fill all grid boxes with the same forcing data + Tair (:) = c1intp * Tair_data(mlast) + c2intp * Tair_data(mnext) + Qa (:) = c1intp * Qa_data(mlast) + c2intp * Qa_data(mnext) + uatm (:) = c1intp * uatm_data(mlast) + c2intp * uatm_data(mnext) + vatm (:) = c1intp * vatm_data(mlast) + c2intp * vatm_data(mnext) + fsnow(:) = c1intp * fsnow_data(mlast) + c2intp * fsnow_data(mnext) + flw (:) = c1intp * flw_data(mlast) + c2intp * flw_data(mnext) + fsw (:) = c1intp * fsw_data(mlast) + c2intp * fsw_data(mnext) + + ! derived (or not otherwise set) + potT (:) = c1intp * potT_data(mlast) + c2intp * potT_data(mnext) + wind (:) = c1intp * wind_data(mlast) + c2intp * wind_data(mnext) + strax(:) = c1intp * strax_data(mlast) + c2intp * strax_data(mnext) + stray(:) = c1intp * stray_data(mlast) + c2intp * stray_data(mnext) + rhoa (:) = c1intp * rhoa_data(mlast) + c2intp * rhoa_data(mnext) + frain(:) = c1intp * frain_data(mlast) + c2intp * frain_data(mnext) + swvdr(:) = c1intp * swvdr_data(mlast) + c2intp * swvdr_data(mnext) + swvdf(:) = c1intp * swvdf_data(mlast) + c2intp * swvdf_data(mnext) + swidr(:) = c1intp * swidr_data(mlast) + c2intp * swidr_data(mnext) + swidf(:) = c1intp * swidf_data(mlast) + c2intp * swidf_data(mnext) + + elseif (trim(atm_data_type) == 'clim') then + midmonth = 15 ! assume data is given on 15th of every month + recslot = 1 ! latter half of month + if (mday < midmonth) recslot = 2 ! first half of month + if (recslot == 1) then + mlast = month + mnext = mod(month ,12) + 1 + else ! recslot = 2 + mlast = mod(month+10,12) + 1 + mnext = month + endif + call interp_coeff_monthly(recslot, c1intp, c2intp) + + ! fill all grid boxes with the same forcing data + Tair (:) = c1intp * Tair_data(mlast) + c2intp * Tair_data(mnext) + Qa (:) = c1intp * Qa_data(mlast) + c2intp * Qa_data(mnext) + uatm (:) = c1intp * uatm_data(mlast) + c2intp * uatm_data(mnext) + vatm (:) = c1intp * vatm_data(mlast) + c2intp * vatm_data(mnext) + fsnow(:) = c1intp * fsnow_data(mlast) + c2intp * fsnow_data(mnext) + flw (:) = c1intp * flw_data(mlast) + c2intp * flw_data(mnext) + fsw (:) = c1intp * fsw_data(mlast) + c2intp * fsw_data(mnext) + + ! derived (or not otherwise set) + potT (:) = c1intp * potT_data(mlast) + c2intp * potT_data(mnext) + wind (:) = c1intp * wind_data(mlast) + c2intp * wind_data(mnext) + strax(:) = c1intp * strax_data(mlast) + c2intp * strax_data(mnext) + stray(:) = c1intp * stray_data(mlast) + c2intp * stray_data(mnext) + rhoa (:) = c1intp * rhoa_data(mlast) + c2intp * rhoa_data(mnext) + frain(:) = c1intp * frain_data(mlast) + c2intp * frain_data(mnext) + swvdr(:) = c1intp * swvdr_data(mlast) + c2intp * swvdr_data(mnext) + swvdf(:) = c1intp * swvdf_data(mlast) + c2intp * swvdf_data(mnext) + swidr(:) = c1intp * swidr_data(mlast) + c2intp * swidr_data(mnext) + swidf(:) = c1intp * swidf_data(mlast) + c2intp * swidf_data(mnext) + + elseif (trim(atm_data_type) == 'ISPOL') then + + offndy = 0 ! first data record (Julian day) + offset = real(offndy,dbl_kind)*secday + dataloc = 1 ! data located at middle of interval + maxrec = 365 + recslot = 2 + recnum = mod(int(yday)+maxrec-offndy-1,maxrec)+1 + mlast = mod(recnum+maxrec-2,maxrec) + 1 + mnext = mod(recnum-1, maxrec) + 1 + call interp_coeff (recnum, recslot, secday, dataloc, & + c1intp, c2intp, offset) - ! fill all grid boxes with the same forcing data Tair (:) = c1intp * Tair_data(mlast) + c2intp * Tair_data(mnext) Qa (:) = c1intp * Qa_data(mlast) + c2intp * Qa_data(mnext) uatm (:) = c1intp * uatm_data(mlast) + c2intp * uatm_data(mnext) vatm (:) = c1intp * vatm_data(mlast) + c2intp * vatm_data(mnext) fsnow(:) = c1intp * fsnow_data(mlast) + c2intp * fsnow_data(mnext) - flw (:) = c1intp * flw_data(mlast) + c2intp * flw_data(mnext) - fsw (:) = c1intp * fsw_data(mlast) + c2intp * fsw_data(mnext) - - ! derived (or not otherwise set) - potT (:) = c1intp * potT_data(mlast) + c2intp * potT_data(mnext) - wind (:) = c1intp * wind_data(mlast) + c2intp * wind_data(mnext) - strax(:) = c1intp * strax_data(mlast) + c2intp * strax_data(mnext) - stray(:) = c1intp * stray_data(mlast) + c2intp * stray_data(mnext) - rhoa (:) = c1intp * rhoa_data(mlast) + c2intp * rhoa_data(mnext) - frain(:) = c1intp * frain_data(mlast) + c2intp * frain_data(mnext) - swvdr(:) = c1intp * swvdr_data(mlast) + c2intp * swvdr_data(mnext) - swvdf(:) = c1intp * swvdf_data(mlast) + c2intp * swvdf_data(mnext) - swidr(:) = c1intp * swidr_data(mlast) + c2intp * swidr_data(mnext) - swidf(:) = c1intp * swidf_data(mlast) + c2intp * swidf_data(mnext) - - elseif (trim(atm_data_type) == 'ISPOL') then - - offndy = 0 ! first data record (Julian day) - offset = real(offndy,dbl_kind)*secday - dataloc = 1 ! data located at middle of interval - maxrec = 365 - recslot = 2 - recnum = mod(int(yday)+maxrec-offndy-1,maxrec)+1 - mlast = mod(recnum+maxrec-2,maxrec) + 1 - mnext = mod(recnum-1, maxrec) + 1 - call interp_coeff (recnum, recslot, secday, dataloc, & - c1intp, c2intp, offset) - - Tair (:) = c1intp * Tair_data(mlast) + c2intp * Tair_data(mnext) - Qa (:) = c1intp * Qa_data(mlast) + c2intp * Qa_data(mnext) - uatm (:) = c1intp * uatm_data(mlast) + c2intp * uatm_data(mnext) - vatm (:) = c1intp * vatm_data(mlast) + c2intp * vatm_data(mnext) - fsnow(:) = c1intp * fsnow_data(mlast) + c2intp * fsnow_data(mnext) - ! derived (or not otherwise set) - potT (:) = c1intp * potT_data(mlast) + c2intp * potT_data(mnext) - wind (:) = c1intp * wind_data(mlast) + c2intp * wind_data(mnext) - strax(:) = c1intp * strax_data(mlast) + c2intp * strax_data(mnext) - stray(:) = c1intp * stray_data(mlast) + c2intp * stray_data(mnext) - rhoa (:) = c1intp * rhoa_data(mlast) + c2intp * rhoa_data(mnext) - frain(:) = c1intp * frain_data(mlast) + c2intp * frain_data(mnext) - - sec6hr = secday/c4; ! seconds in 6 hours - offndy = 0 - maxrec = 1460 - recnum = 4*int(yday) - 3 + int(real(sec,kind=dbl_kind)/sec6hr) - recnum = mod(recnum+maxrec-4*offndy-1,maxrec)+1 ! data begins on 16 June 2004 - recslot = 2 - mlast = mod(recnum+maxrec-2,maxrec) + 1 - mnext = mod(recnum-1, maxrec) + 1 - call interp_coeff (recnum, recslot, sec6hr, dataloc, & - c1intp, c2intp, offset) + ! derived (or not otherwise set) + potT (:) = c1intp * potT_data(mlast) + c2intp * potT_data(mnext) + wind (:) = c1intp * wind_data(mlast) + c2intp * wind_data(mnext) + strax(:) = c1intp * strax_data(mlast) + c2intp * strax_data(mnext) + stray(:) = c1intp * stray_data(mlast) + c2intp * stray_data(mnext) + rhoa (:) = c1intp * rhoa_data(mlast) + c2intp * rhoa_data(mnext) + frain(:) = c1intp * frain_data(mlast) + c2intp * frain_data(mnext) + + sec6hr = secday/c4; ! seconds in 6 hours + offndy = 0 + maxrec = 1460 + recnum = 4*int(yday) - 3 + int(real(sec,kind=dbl_kind)/sec6hr) + recnum = mod(recnum+maxrec-4*offndy-1,maxrec)+1 ! data begins on 16 June 2004 + recslot = 2 + mlast = mod(recnum+maxrec-2,maxrec) + 1 + mnext = mod(recnum-1, maxrec) + 1 + call interp_coeff (recnum, recslot, sec6hr, dataloc, & + c1intp, c2intp, offset) - fsw (:) = c1intp * fsw_data(mlast) + c2intp * fsw_data(mnext) - flw (:) = c1intp * flw_data(mlast) + c2intp * flw_data(mnext) + fsw (:) = c1intp * fsw_data(mlast) + c2intp * fsw_data(mnext) + flw (:) = c1intp * flw_data(mlast) + c2intp * flw_data(mnext) - ! derived - swvdr(:) = c1intp * swvdr_data(mlast) + c2intp * swvdr_data(mnext) - swvdf(:) = c1intp * swvdf_data(mlast) + c2intp * swvdf_data(mnext) - swidr(:) = c1intp * swidr_data(mlast) + c2intp * swidr_data(mnext) - swidf(:) = c1intp * swidf_data(mlast) + c2intp * swidf_data(mnext) + ! derived + swvdr(:) = c1intp * swvdr_data(mlast) + c2intp * swvdr_data(mnext) + swvdf(:) = c1intp * swvdf_data(mlast) + c2intp * swvdf_data(mnext) + swidr(:) = c1intp * swidr_data(mlast) + c2intp * swidr_data(mnext) + swidf(:) = c1intp * swidf_data(mlast) + c2intp * swidf_data(mnext) - elseif (trim(atm_data_type) == 'NICE') then + elseif (trim(atm_data_type) == 'NICE') then - offndy = 0 ! first data record (Julian day) - offset = real(offndy,dbl_kind)*secday - dataloc = 1 ! data located in middle of interval - maxrec = 365 - recslot = 2 - recnum = mod(int(yday)+maxrec-offndy-1,maxrec)+1 - mlast = mod(recnum+maxrec-2,maxrec) + 1 - mnext = mod(recnum-1, maxrec) + 1 - call interp_coeff (recnum, recslot, secday, dataloc, & - c1intp, c2intp, offset) + offndy = 0 ! first data record (Julian day) + offset = real(offndy,dbl_kind)*secday + dataloc = 1 ! data located in middle of interval + maxrec = 365 + recslot = 2 + recnum = mod(int(yday)+maxrec-offndy-1,maxrec)+1 + mlast = mod(recnum+maxrec-2,maxrec) + 1 + mnext = mod(recnum-1, maxrec) + 1 + call interp_coeff (recnum, recslot, secday, dataloc, & + c1intp, c2intp, offset) - Tair (:) = c1intp * Tair_data(mlast) + c2intp * Tair_data(mnext) - Qa (:) = c1intp * Qa_data(mlast) + c2intp * Qa_data(mnext) - uatm (:) = c1intp * uatm_data(mlast) + c2intp * uatm_data(mnext) - vatm (:) = c1intp * vatm_data(mlast) + c2intp * vatm_data(mnext) - fsnow(:) = c1intp * fsnow_data(mlast) + c2intp * fsnow_data(mnext) + Tair (:) = c1intp * Tair_data(mlast) + c2intp * Tair_data(mnext) + Qa (:) = c1intp * Qa_data(mlast) + c2intp * Qa_data(mnext) + uatm (:) = c1intp * uatm_data(mlast) + c2intp * uatm_data(mnext) + vatm (:) = c1intp * vatm_data(mlast) + c2intp * vatm_data(mnext) + fsnow(:) = c1intp * fsnow_data(mlast) + c2intp * fsnow_data(mnext) - ! derived (or not otherwise set) - potT (:) = c1intp * potT_data(mlast) + c2intp * potT_data(mnext) - wind (:) = c1intp * wind_data(mlast) + c2intp * wind_data(mnext) - strax(:) = c1intp * strax_data(mlast) + c2intp * strax_data(mnext) - stray(:) = c1intp * stray_data(mlast) + c2intp * stray_data(mnext) - rhoa (:) = c1intp * rhoa_data(mlast) + c2intp * rhoa_data(mnext) - frain(:) = c1intp * frain_data(mlast) + c2intp * frain_data(mnext) - - sec6hr = secday/c4; ! seconds in 6 hours - maxrec = 1460 - dataloc = 2 ! data located at end of interval - recnum = 4*int(yday) - 3 + int(real(sec,kind=dbl_kind)/sec6hr) - recnum = mod(recnum+maxrec-4*offndy-1,maxrec)+1 - recslot = 2 - mlast = mod(recnum+maxrec-2,maxrec) + 1 - mnext = mod(recnum-1, maxrec) + 1 - call interp_coeff (recnum, recslot, sec6hr, dataloc, & - c1intp, c2intp, offset) + ! derived (or not otherwise set) + potT (:) = c1intp * potT_data(mlast) + c2intp * potT_data(mnext) + wind (:) = c1intp * wind_data(mlast) + c2intp * wind_data(mnext) + strax(:) = c1intp * strax_data(mlast) + c2intp * strax_data(mnext) + stray(:) = c1intp * stray_data(mlast) + c2intp * stray_data(mnext) + rhoa (:) = c1intp * rhoa_data(mlast) + c2intp * rhoa_data(mnext) + frain(:) = c1intp * frain_data(mlast) + c2intp * frain_data(mnext) + + sec6hr = secday/c4; ! seconds in 6 hours + maxrec = 1460 + dataloc = 2 ! data located at end of interval + recnum = 4*int(yday) - 3 + int(real(sec,kind=dbl_kind)/sec6hr) + recnum = mod(recnum+maxrec-4*offndy-1,maxrec)+1 + recslot = 2 + mlast = mod(recnum+maxrec-2,maxrec) + 1 + mnext = mod(recnum-1, maxrec) + 1 + call interp_coeff (recnum, recslot, sec6hr, dataloc, & + c1intp, c2intp, offset) - fsw (:) = c1intp * fsw_data(mlast) + c2intp * fsw_data(mnext) - flw (:) = c1intp * flw_data(mlast) + c2intp * flw_data(mnext) + fsw (:) = c1intp * fsw_data(mlast) + c2intp * fsw_data(mnext) + flw (:) = c1intp * flw_data(mlast) + c2intp * flw_data(mnext) - ! derived - swvdr(:) = c1intp * swvdr_data(mlast) + c2intp * swvdr_data(mnext) - swvdf(:) = c1intp * swvdf_data(mlast) + c2intp * swvdf_data(mnext) - swidr(:) = c1intp * swidr_data(mlast) + c2intp * swidr_data(mnext) - swidf(:) = c1intp * swidf_data(mlast) + c2intp * swidf_data(mnext) + ! derived + swvdr(:) = c1intp * swvdr_data(mlast) + c2intp * swvdr_data(mnext) + swvdf(:) = c1intp * swvdf_data(mlast) + c2intp * swvdf_data(mnext) + swidr(:) = c1intp * swidr_data(mlast) + c2intp * swidr_data(mnext) + swidf(:) = c1intp * swidf_data(mlast) + c2intp * swidf_data(mnext) - endif + endif ! possible bug: is the ocean data also offset to the beginning of the field campaigns? @@ -441,6 +504,7 @@ subroutine get_forcing(timestep) qdp (:) = c1intp * qdp_data(mlast) + c2intp * qdp_data(mnext) endif + endif call finish_ocn_forcing(sst_temp) @@ -534,6 +598,10 @@ subroutine atm_climatological ! 6 W/m2 warming of mixed layer from deep ocean qdp_data(:) = -6.0 ! 2 W/m2 from deep + 4 W/m2 counteracting larger ! SH+LH with bulk transfer than in MU 71 + ! Warn that this overwrites default and namelist value + write(nu_diag,*) subname + write(nu_diag,*) 'WARNING: atm_data_type = clim overwrites '//& + 'oceanic heat flux convergence from default or namelist' end subroutine atm_climatological @@ -972,6 +1040,406 @@ subroutine atm_NICE end subroutine atm_NICE +!======================================================================= + + subroutine atm_MDF + + integer (kind=int_kind) :: & + nt, & ! timestep index for Icepack arrays + i, & ! index for forcing data arrays + bound, & ! bound for subsetting data + dimlen, & ! length of the data arrays + ncid, & ! NetCDF file id + dimid, & ! NetCDF dimension id + status, & ! NetCDF status flag + varid ! NetCDF variable id + + integer (kind=8), allocatable :: & + data_time(:) ! array for time array in forcing data + + integer (kind=8), dimension(ntime) :: & + model_time ! array for Icepack minutely time + + real (kind=dbl_kind) :: & + model_time0 ! start time for model in seconds since 1970 + + real (kind=dbl_kind), allocatable :: & + data(:) ! data array from file + + character (char_len) :: & + calendar_type, & ! data calendar type + varname + + character (char_len_long) :: & + filename, & + time_basis ! time basis for data + + integer (kind=int_kind), dimension(ntime, 2) :: & + data_sections ! 2D array for indices corresponding + ! to which data values should be averaged to + ! create the model forcing values + + real (kind=dbl_kind), parameter :: & + Gregorian_year = 365.2425, & ! days in Gregorian year per cf standard + model_miss_val = -9999.00 ! missing value for internal use + + character(len=*), parameter :: subname='(atm_MDF)' + + filename = trim(data_dir)//'/MDF/'//trim(atm_data_file) + + if (atm_data_format /= 'nc') then + call icedrv_system_abort(string=subname//& + ' ERROR: only NetCDF input implemented for atm_MDF', & + file=__FILE__,line=__LINE__) + else +#ifdef USE_NETCDF + ! Open forcing file + status = nf90_open(trim(filename), nf90_nowrite, ncid) + if (status /= nf90_noerr) call icedrv_system_abort(& + string=subname//'Couldnt open netcdf file', & + file=__FILE__,line=__LINE__) + + ! Create array for the time step values in seconds since 1970 + ! CF standard calendar is Gregorian + ! May have strange behavior if dt is not an integer + model_time0 = (year_init - 1970) * Gregorian_year * 24 * 3600 + time0 + do nt = 1, ntime + model_time(nt) = int(model_time0 + dt * nt, kind=8) + enddo + + ! Read, average, and interpolate forcing data from each variable + ! Moving average forcing values into model arrays + call load_var_MDF("tas", Tair_data, ncid, model_time) + call load_var_MDF("hus", Qa_data, ncid, model_time) + call load_var_MDF("uas", uatm_data, ncid, model_time) + call load_var_MDF("vas", vatm_data, ncid, model_time) + call load_var_MDF("rlds", flw_data, ncid, model_time) + call load_var_MDF("rsds", fsw_data, ncid, model_time) + + ! Precipitation data is optional + ! Check whether snowfall rate is in the dataset + status = nf90_inq_varid(ncid, "prsn", varid) + if (status /= nf90_noerr) then + write(nu_diag,*) subname + write(nu_diag,*) 'WARNING: no snowfall rate in forcing.'// & + ' Icepack will assume snowfall rate is zero.' + fsnow_data(:) = c0 + else + call load_var_MDF("prsn", fsnow_data, ncid, model_time) + endif + ! Check whether total precipitation rate is in the dataset + status = nf90_inq_varid(ncid, "pr", varid) + if (status /= nf90_noerr) then + write(nu_diag,*) subname + write(nu_diag,*) 'WARNING: no precipitation rate in '// & + 'forcing. Icepack will assume rainfall rate is zero.' + frain_data(:) = c0 + else + call load_var_MDF("pr", frain_data, ncid, model_time) + endif + ! rainfall is total precipitation minus snowfall + ! subject to the constraint that rainfall is non-negative + do nt = 1, ntime + frain_data(nt) = max(frain_data(nt) - fsnow_data(nt), c0) + enddo + +#else + call icedrv_system_abort(string=subname//& + ' ERROR: atm_data_format = "nc" requires USE_NETCDF', & + file=__FILE__,line=__LINE__) +#endif + endif + + end subroutine atm_MDF + +!======================================================================= + +#ifdef USE_NETCDF + subroutine MDF_average(data_var_name, model_var_arr, & + data_var_len, ncid, data_sections, model_miss_val) + + character(len=*), intent(in) :: & + data_var_name ! Name of the variable in the MDF forcing file + + real (kind=dbl_kind), dimension(ntime), intent(out) :: & + model_var_arr ! array to place averaged forcing data in + + integer (kind=int_kind), intent(in) :: & + data_var_len, & ! Size of data array in MDF forcing file + ncid ! NetCDF file id + + integer (kind=int_kind), dimension(ntime, 2) :: & + data_sections ! indices for which data values to average + + real (kind=dbl_kind), intent(in) :: & + model_miss_val ! for when there is no data in a time step + + ! Local variables + real (kind=dbl_kind), dimension(data_var_len) :: & + data_var_arr ! array for data from forcing file + + real (kind=dbl_kind) :: & + work, & ! variable for averaging + data_miss_val, & ! value of missing data + count ! counter for data to average + + integer (kind=int_kind) :: & + status, & ! NetCDF status flag + nt, & ! timestep index for Icepack arrays + i, & ! index for forcing data arrays + varid ! NetCDF variable id + + character(len=*), parameter :: subname='(MDF_average)' + + ! Allocate get data and missing value from file + status = nf90_inq_varid(ncid, trim(data_var_name), varid) + if (status /= nf90_noerr) call icedrv_system_abort(& + string=subname//'Couldnt get '//data_var_name//' var id', & + file=__FILE__,line=__LINE__) + status = nf90_get_att(ncid, varid, "missing_value", data_miss_val) + if (status /= nf90_noerr) call icedrv_system_abort(& + string=subname//'Couldnt get '//data_var_name//' missing value', & + file=__FILE__,line=__LINE__) + status = nf90_get_var(ncid, varid, data_var_arr) + if (status /= nf90_noerr) call icedrv_system_abort(& + string=subname//'Couldnt get '//data_var_name//' values', & + file=__FILE__,line=__LINE__) + + ! For each model time point average non-missing data values + do nt = 1, ntime + count = 0 + work = c0 + do i = data_sections(nt, 1), data_sections(nt, 2) + if (data_var_arr(i) /= data_miss_val) then + work = work + data_var_arr(i) + count = count + 1 + endif + end do + if (count > 0) then + model_var_arr(nt) = work / count + else + model_var_arr(nt) = model_miss_val + endif + end do + + end subroutine MDF_average +#endif + +!======================================================================= + + subroutine MDF_interpolate(model_var_arr, model_miss_val) + + real (kind=dbl_kind), dimension(ntime), intent(inout) :: & + model_var_arr ! array to place averaged forcing data in + + real (kind=dbl_kind), intent(in) :: & + model_miss_val ! for when there is no data in a time step + + integer (kind=int_kind) :: & + mlast, & ! index of last present data + nt, m, & ! model timestep indices + count ! counter for missing values + + character(len=*), parameter :: subname='(MDF_interpolate)' + + ! Interpolate, extrapolate for first and last values + if (model_var_arr(1) == model_miss_val) then + mlast = 0 + else + mlast = 1 + endif + do nt = 2, ntime + if (model_var_arr(nt) == model_miss_val) then + ! Do nothing (i.e., allow nt to increment) unless we're at end + if (nt == ntime) then + do m = mlast + 1, nt + model_var_arr(m) = model_var_arr(mlast) + end do + endif + else if ((nt - mlast) == 1) then + ! No missing data, increment mlast + mlast = nt + else + ! If we're at the start extrapolate to fill + if (mlast==0) then + do m = mlast + 1, nt - 1 + model_var_arr(m) = model_var_arr(nt) + end do + else + ! Interpolate missing data + do m = mlast + 1, nt - 1 + model_var_arr(m) = model_var_arr(mlast) & + + (model_var_arr(nt) - model_var_arr(mlast)) & + * (m - mlast) / (nt - mlast) + end do + endif + mlast = nt + endif + end do + + end subroutine MDF_interpolate +!======================================================================= + + subroutine load_var_MDF(data_var_name, model_var_arr, ncid, & + model_time) + + character(len=*), intent(in) :: & + data_var_name ! Name of the variable in the MDF forcing file + + real (kind=dbl_kind), dimension(ntime), intent(out) :: & + model_var_arr ! array to place forcing data in + + integer (kind=int_kind), intent(in) :: & + ncid ! NetCDF file id + + integer (kind=8), dimension(ntime), intent(in) :: & + model_time ! model time array + + ! Local variables + + integer (kind=int_kind) :: & + nt, & ! timestep index for Icepack arrays + i, & ! index for forcing data arrays + bound, & ! bound for subsetting data + dimlen, & ! length of the data arrays + dimid, & ! NetCDF dimension id + status, & ! NetCDF status flag + nvardims,& ! number of dimensions for variable + varid ! NetCDF variable id + + integer (kind=8), allocatable :: & + data_time(:) ! array for time array in forcing data + + integer, dimension(1) :: & + vardimids ! dimension id for variable + + character (char_len) :: & + calendar_type, & ! data calendar type + dimname ! name for variables dimension + + character (char_len_long) :: & + time_basis ! time basis for data + + integer (kind=int_kind), dimension(ntime, 2) :: & + data_sections ! 2D array for indices corresponding + ! to which data values should be averaged to + ! create the model forcing values + + real (kind=dbl_kind), parameter :: & + Gregorian_year = 365.2425, & ! days in Gregorian year per cf standard + model_miss_val = -9999.00 ! missing value for internal use + + character(len=*), parameter :: subname='(load_var_MDF)' + +#ifdef USE_NETCDF + + ! Get varid and missing value from file + status = nf90_inq_varid(ncid, trim(data_var_name), varid) + if (status /= nf90_noerr) call icedrv_system_abort(& + string=subname//'Couldnt get '//data_var_name//' var id', & + file=__FILE__,line=__LINE__) + ! Get information about the dimension for this variable + status = nf90_inquire_variable(ncid, varid, ndims=nvardims) + if (nvardims /= 1) call icedrv_system_abort(& + string=subname//data_var_name//' has more than 1 dimension', & + file=__FILE__,line=__LINE__) + status = nf90_inquire_variable(ncid, varid, dimids=vardimids) + status = nf90_inquire_dimension(ncid, vardimids(1), & + name=dimname, len=dimlen) + ! Check that dimname matches pattern + if (dimname(1:4) /= 'time') call icedrv_system_abort(& + string=subname//data_var_name//' dimension name is not timeXXXX', & + file=__FILE__,line=__LINE__) + if (verify(trim(dimname(5:)), "0123456789") /= 0) call icedrv_system_abort(& + string=subname//data_var_name//' dimension name is not timeXXXX', & + file=__FILE__,line=__LINE__) + allocate (data_time(dimlen)) + ! Check that cadence variable exists and calendars match + status = nf90_inq_varid(ncid, trim(dimname), varid) + if (status /= nf90_noerr) call icedrv_system_abort(& + string=subname//'Couldnt get '//trim(dimname)//' var id', & + file=__FILE__,line=__LINE__) + status = nf90_get_att(ncid, varid, "calendar", calendar_type) + if (status /= nf90_noerr) call icedrv_system_abort(& + string=subname//'Couldnt get calendar attribute', & + file=__FILE__,line=__LINE__) + ! In future this check could be replaced with calendar matching + if (calendar_type /= "standard" .or. .not. use_leap_years) then + call icedrv_system_abort(& + string=subname//'Forcing calendar not standard or not using leap years',& + file=__FILE__,line=__LINE__) + endif + ! Get the time array + !! Note, in the file the value is actually unsigned, need to make sure this + ! doesn't cause issues since Fortran 90 doesn't support unsigned ints. + status = nf90_get_var(ncid, varid, data_time) + if (status /= nf90_noerr) call icedrv_system_abort(& + string=subname//'Couldnt read '//trim(dimname)//' values', & + file=__FILE__,line=__LINE__) + ! Convert the data time from minutes into seconds for compatability w/ icepack + data_time = data_time * 60 + + ! Check that the time basis in forcing file is correct + status = nf90_get_att(ncid, varid, "units", time_basis) + if (status /= nf90_noerr) call icedrv_system_abort(& + string=subname//'Couldnt get '//trim(dimname)//' units', & + file=__FILE__,line=__LINE__) + if (time_basis /= "minutes since 1970-01-01 00:00:00") then + call icedrv_system_abort(& + string=subname//'Time basis is not minutes since 1970',& + file=__FILE__,line=__LINE__) + endif + + ! Check that we are not extrapolating forcing outside of time bounds + if (model_time(1) < data_time(1)) call icedrv_system_abort(& + string=subname//'Simulation starts before forcing',& + file=__FILE__,line=__LINE__) + if (model_time(ntime) > data_time(dimlen)) call icedrv_system_abort(& + string=subname//'Simulation ends after forcing',& + file=__FILE__,line=__LINE__) + + ! data_sections is a 2D array where the first dimension + ! is the same length as model_time. The 1D array at each index + ! contains the start and stop indices of the data to be averaged + ! into each model timestep + ! Get the first start index + bound = model_time(1) - (model_time(2) - model_time(1))/2 + i = 1 + do while (data_time(i) < bound) + i = i + 1 + end do + data_sections(1, 1) = i + do nt = 1, ntime - 1 + ! Bound is halfway between this time step and the next + bound = (model_time(nt + 1) + model_time(nt))/2 + do while (data_time(i) < bound) + i = i + 1 + end do ! i - 1 is now the last element in timestep nt + data_sections(nt, 2) = i - 1 + data_sections(nt + 1, 1) = i + end do + ! Get the last index + bound = model_time(ntime) + (model_time(ntime) - model_time(ntime - 1))/2 + i = dimlen + do while (data_time(i) > bound) + i = i - 1 + end do + data_sections(ntime, 2) = i + + ! Moving average forcing values into model arrays + call MDF_average(data_var_name, model_var_arr, dimlen, ncid, & + data_sections, model_miss_val) + ! Linearly interpolate missing values + call MDF_interpolate(model_var_arr, model_miss_val) + +#else + call icedrv_system_abort(string=subname//& + ' load_var_MDF requires USE_NETCDF', & + file=__FILE__,line=__LINE__) +#endif + + end subroutine load_var_MDF + !======================================================================= subroutine ocn_NICE @@ -1070,7 +1538,102 @@ subroutine ocn_ISPOL qdp_data (i) = qdp (i) end do - end subroutine ocn_ISPOL + end subroutine ocn_ISPOL + +!======================================================================= + + subroutine ocn_MDF + + integer (kind=int_kind) :: & + nt, & ! timestep index for Icepack arrays + i, & ! index for forcing data arrays + bound, & ! bound for subsetting data + dimlen, & ! length of the data arrays + ncid, & ! NetCDF file id + dimid, & ! NetCDF dimension id + status, & ! NetCDF status flag + varid ! NetCDF variable id + + integer (kind=8), allocatable :: & + data_time(:) ! array for time array in forcing data + + integer (kind=8), dimension(ntime) :: & + model_time ! array for Icepack minutely time + + real (kind=dbl_kind) :: & + model_time0 ! start time for model in seconds since 1970 + + real (kind=dbl_kind), allocatable :: & + data(:) ! data array from file + + character (char_len) :: & + calendar_type, & ! data calendar type + varname + + character (char_len_long) :: & + filename, & + time_basis ! time basis for data + + integer (kind=int_kind), dimension(ntime, 2) :: & + data_sections ! 2D array for indices corresponding + ! to which data values should be averaged to + ! create the model forcing values + + real (kind=dbl_kind), parameter :: & + Gregorian_year = 365.2425, & ! days in Gregorian year per cf standard + model_miss_val = -9999.00, & ! missing value for internal use + leg4_end_time = 1596034800, &! end of leg 4 in seconds since 1970 + leg5_start_time= 1598451600 ! start of leg 5 in seconds since 1970 + + character(len=*), parameter :: subname='(ocn_MDF)' + + filename = trim(data_dir)//'/MDF/'//trim(ocn_data_file) + + if (ocn_data_format /= 'nc') then + call icedrv_system_abort(string=subname//& + ' ERROR: only NetCDF input implemented for ocn_MDF', & + file=__FILE__,line=__LINE__) + else +#ifdef USE_NETCDF + ! Open forcing file + status = nf90_open(trim(filename), nf90_nowrite, ncid) + if (status /= nf90_noerr) call icedrv_system_abort(& + string=subname//'Couldnt open netcdf file', & + file=__FILE__,line=__LINE__) + + ! Create array for the time step values in seconds since 1970 + ! CF standard calendar is Gregorian + ! May have strange behavior if dt is not an integer + model_time0 = (year_init - 1970) * Gregorian_year * 24 * 3600 + time0 + do nt = 1, ntime + model_time(nt) = int(model_time0 + dt * nt, kind=8) + enddo + + ! Warn if simulation includes leg 4-5 transition + if ((model_time(1) < leg5_start_time) .and. & + (model_time(ntime) > leg4_end_time) .and. & + (index(ocn_data_file, 'MOSAiC') > 0)) then + write(nu_diag,*) subname + write(nu_diag,*) 'WARNING: Forcing may be from MOSAiC '// & + 'and time includes MOSAIC leg 4-5 repositioning. ' // & + 'If so, forcing interpolation is not valid.' + endif + + ! Read, average, and interpolate forcing data from each variable + ! Moving average forcing values into model arrays + call load_var_MDF("so", sss_data, ncid, model_time) + call load_var_MDF("mlotst", hmix_data, ncid, model_time) + call load_var_MDF("hfsot", qdp_data, ncid, model_time) + call load_var_MDF("tos", sst_data, ncid, model_time) + +#else + call icedrv_system_abort(string=subname//& + ' ERROR: ocn_data_format = "nc" requires USE_NETCDF', & + file=__FILE__,line=__LINE__) +#endif + endif + + end subroutine ocn_MDF !======================================================================= diff --git a/configuration/driver/icedrv_init.F90 b/configuration/driver/icedrv_init.F90 index f342d74fe..9a3d47481 100644 --- a/configuration/driver/icedrv_init.F90 +++ b/configuration/driver/icedrv_init.F90 @@ -10,6 +10,7 @@ module icedrv_init use icedrv_constants, only: nu_diag, ice_stdout, nu_diag_out, nu_nml use icedrv_constants, only: c0, c1, c2, c3, p2, p5 use icedrv_domain_size, only: nx + use icedrv_flux, only: sst_init use icepack_intfc, only: icepack_init_parameters use icepack_intfc, only: icepack_init_fsd use icepack_intfc, only: icepack_init_tracer_flags @@ -43,6 +44,12 @@ module icedrv_init lmask_n, & ! northern hemisphere mask lmask_s ! southern hemisphere mask + real (kind=dbl_kind), public :: & + hi_init_slab, & ! initial ice thickness for slab cell (nx=2) + hsno_init_slab, & ! initial snow thickness for slab cell (nx=2) + hbar_init_itd, & ! hbar for ice thickness for itd cell (nx=3) + hsno_init_itd ! initial snow thickness for itd cell (nx=3) + !======================================================================= contains @@ -66,6 +73,7 @@ subroutine input_data use icedrv_restart_shared, only: restart, restart_dir, restart_file, restart_format use icedrv_flux, only: l_mpond_fresh, cpl_bgc use icedrv_flux, only: default_season + use icedrv_flux, only: sss_fixed, qdp_fixed, hmix_fixed use icedrv_forcing, only: precip_units, fyear_init, ycycle use icedrv_forcing, only: atm_data_type, ocn_data_type, bgc_data_type use icedrv_forcing, only: atm_data_file, ocn_data_file, bgc_data_file @@ -74,6 +82,7 @@ subroutine input_data use icedrv_forcing, only: data_dir use icedrv_forcing, only: oceanmixed_ice, restore_ocn, trestore use icedrv_forcing, only: snw_ssp_table, lateral_flux_type + use icedrv_forcing, only: precalc_forc ! local variables @@ -138,7 +147,9 @@ subroutine input_data ice_ic, restart, restart_dir, restart_file, & restart_format, & dumpfreq, diagfreq, diag_file, cpl_bgc, & - conserv_check, history_format + conserv_check, history_format, & + hi_init_slab, hsno_init_slab, hbar_init_itd, hsno_init_itd, & + sst_init namelist /grid_nml/ & kcatbound @@ -183,7 +194,9 @@ subroutine input_data atm_data_file, ocn_data_file, bgc_data_file, & ice_data_file, & atm_data_format, ocn_data_format, bgc_data_format, & - data_dir, trestore, restore_ocn + data_dir, trestore, restore_ocn, & + sss_fixed, qdp_fixed, hmix_fixed, & + precalc_forc namelist /tracer_nml/ & tr_iage, & @@ -264,6 +277,11 @@ subroutine input_data history_format = 'none' ! if 'nc', write history files. Otherwise do nothing ice_ic = 'default' ! initial conditions are specified in the code ! otherwise, the filename for reading restarts + hi_init_slab = c2 ! initial ice thickness for slab cell (nx=2) + hsno_init_slab = c0 ! initial snow thickness for slab cell (nx=2) + hbar_init_itd = c3 ! hbar for ice thickness for itd cell (nx=3) + hsno_init_itd = 0.25_dbl_kind ! initial snow thickness for itd cell (nx=3) + sst_init = -1.8_dbl_kind ! initial mixed layer temperature (all cells) ndtd = 1 ! dynamic time steps per thermodynamic time step l_mpond_fresh = .false. ! logical switch for including meltpond freshwater ! flux feedback to ocean model @@ -290,6 +308,7 @@ subroutine input_data restore_ocn = .false. ! restore sst if true trestore = 90 ! restoring timescale, days (0 instantaneous) snw_ssp_table = 'test' ! snow table type, test or snicar + precalc_forc = .false. ! whether to precalculate forcing ! extra tracers tr_iage = .false. ! ice age @@ -673,6 +692,11 @@ subroutine input_data write(nu_diag,1030) ' restart_format = ', trim(restart_format) write(nu_diag,1030) ' history_format = ', trim(history_format) write(nu_diag,1030) ' ice_ic = ', trim(ice_ic) + write(nu_diag,1005) ' hi_init_slab = ', hi_init_slab + write(nu_diag,1005) ' hsno_init_slab = ', hsno_init_slab + write(nu_diag,1005) ' hbar_init_itd = ', hbar_init_itd + write(nu_diag,1005) ' hsno_init_itd = ', hsno_init_itd + write(nu_diag,1005) ' sst_init = ', sst_init write(nu_diag,1010) ' conserv_check = ', conserv_check write(nu_diag,1020) ' kitd = ', kitd write(nu_diag,1020) ' kcatbound = ', kcatbound @@ -778,6 +802,7 @@ subroutine input_data write(nu_diag,1030) ' ocn_data_file = ', trim(ocn_data_file) write(nu_diag,1030) ' bgc_data_file = ', trim(bgc_data_file) write(nu_diag,1030) ' ice_data_file = ', trim(ice_data_file) + write(nu_diag,1010) ' precalc_forc = ', precalc_forc if (trim(atm_data_type)=='default') & write(nu_diag,1030) ' default_season = ', trim(default_season) @@ -1342,9 +1367,6 @@ subroutine set_state_var (nx, & real (kind=dbl_kind), dimension(nslyr) :: & qsn ! snow enthalpy (J/m3) - real (kind=dbl_kind), parameter :: & - hsno_init = 0.25_dbl_kind ! initial snow thickness (m) - logical (kind=log_kind) :: tr_brine, tr_lvl, tr_fsd, tr_snow integer (kind=int_kind) :: nt_Tsfc, nt_qice, nt_qsno, nt_sice, nt_fsd integer (kind=int_kind) :: nt_fbri, nt_alvl, nt_vlvl @@ -1408,24 +1430,31 @@ subroutine set_state_var (nx, & i = 1 ! ice-free ! already initialized above + if (i <= nx) then ! need to set ocean parameters + sst(i) = sst_init + endif !----------------------------------------------------------------- - i = 2 ! 2-m slab, no snow + i = 2 ! 100% ice concentration slab, thickness and snow from namelist if (i <= nx) then - if (3 <= ncat) then - n = 3 - ainit(n) = c1 ! assumes we are using the default ITD boundaries - hinit(n) = c2 - else - ainit(ncat) = c1 - hinit(ncat) = c2 - endif + sst(i) = sst_init ! initial ocean temperature + do n = 1, ncat + if (hi_init_slab <= hin_max(n)) then + ainit(n) = c1 + hinit(n) = hi_init_slab + exit + endif + enddo + if (hi_init_slab > hin_max(ncat)) then + ainit(ncat) = c1 + hinit(ncat) = hi_init_slab + endif do n = 1, ncat ! ice volume, snow volume aicen(i,n) = ainit(n) vicen(i,n) = hinit(n) * ainit(n) ! m - vsnon(i,n) = c0 + vsnon(i,n) = hsno_init_slab * ainit(n) ! tracers call icepack_init_enthalpy(Tair = Tair(i), & Tf = Tf(i), & @@ -1469,8 +1498,9 @@ subroutine set_state_var (nx, & i = 3 ! full thickness distribution if (i <= nx) then + sst(i) = sst_init ! initial category areas in cells with ice - hbar = c3 ! initial ice thickness with greatest area + hbar = hbar_init_itd ! initial ice thickness with greatest area ! Note: the resulting average ice thickness ! tends to be less than hbar due to the ! nonlinear distribution of ice thicknesses @@ -1494,7 +1524,7 @@ subroutine set_state_var (nx, & ! ice volume, snow volume aicen(i,n) = ainit(n) vicen(i,n) = hinit(n) * ainit(n) ! m - vsnon(i,n) = min(aicen(i,n)*hsno_init,p2*vicen(i,n)) + vsnon(i,n) = min(aicen(i,n)*hsno_init_itd,p2*vicen(i,n)) ! tracers call icepack_init_enthalpy(Tair = Tair(i), & Tf = Tf(i), & diff --git a/configuration/scripts/icepack_in b/configuration/scripts/icepack_in index d831c2d53..a3fc6d259 100644 --- a/configuration/scripts/icepack_in +++ b/configuration/scripts/icepack_in @@ -7,6 +7,11 @@ npt = 8760 ndtd = 1 ice_ic = 'default' + hi_init_slab = 2.0 + hsno_init_slab = 0.0 + hbar_init_itd = 3.0 + hsno_init_itd = 0.25 + sst_init = -1.8 restart = .false. restart_dir = './restart/' restart_format = 'bin' @@ -58,7 +63,7 @@ albicev = 0.78 albicei = 0.36 albsnowv = 0.98 - albsnowi = 0.70 + albsnowi = 0.70 ahmax = 0.3 R_ice = 0. R_pnd = 0. @@ -121,6 +126,9 @@ wave_spec_type = 'none' restore_ocn = .false. trestore = 90 + sss_fixed = 34.0 + qdp_fixed = 0.0 + hmix_fixed = 20.0 precip_units = 'mks' default_season = 'spring' atm_data_type = 'clim' @@ -137,6 +145,7 @@ atm_data_format = 'bin' ocn_data_format = 'bin' bgc_data_format = 'bin' + precalc_forc = .false. / &dynamics_nml @@ -167,7 +176,7 @@ tr_bgc_PON = .false. tr_bgc_hum = .false. tr_bgc_DON = .false. - tr_bgc_Fe = .false. + tr_bgc_Fe = .false. grid_o = 0.006 grid_o_t = 0.006 l_sk = 2.0 @@ -175,17 +184,17 @@ l_skS = 0.028 phi_snow = -1.0 initbio_frac = 1.0 - frazil_scav = 0.8 - ratio_Si2N_diatoms = 1.8 + frazil_scav = 0.8 + ratio_Si2N_diatoms = 1.8 ratio_Si2N_sp = 0.0 ratio_Si2N_phaeo = 0.0 - ratio_S2N_diatoms = 0.03 - ratio_S2N_sp = 0.03 + ratio_S2N_diatoms = 0.03 + ratio_S2N_sp = 0.03 ratio_S2N_phaeo = 0.03 ratio_Fe2C_diatoms = 0.0033 ratio_Fe2C_sp = 0.0033 ratio_Fe2C_phaeo = 0.1 - ratio_Fe2N_diatoms = 0.023 + ratio_Fe2N_diatoms = 0.023 ratio_Fe2N_sp = 0.023 ratio_Fe2N_phaeo = 0.7 ratio_Fe2DON = 0.023 diff --git a/configuration/scripts/options/set_nml.atmmosaic b/configuration/scripts/options/set_nml.atmmosaic new file mode 100644 index 000000000..ec7dab91e --- /dev/null +++ b/configuration/scripts/options/set_nml.atmmosaic @@ -0,0 +1,17 @@ +atm_data_type = 'MDF' +atm_data_file = 'MOSAiC_atm_drift1_precip_MDF_20191015_20200731.nc' +atm_data_format = 'nc' +use_leap_years = .true. +fyear_init = 2019 +year_init = 2019 +istep0 = 7728 +npt = 6132 +precalc_forc = .true. +hi_init_slab = 0.55 +hsno_init_slab = 0.07 +hbar_init_itd = 1.5 +hsno_init_itd = 0.15 +qdp_fixed = -1.0 +sst_init = -1.8 +sss_fixed = 32.0 +hmix_fixed = 45.0 diff --git a/configuration/scripts/options/set_nml.ocnmosaic b/configuration/scripts/options/set_nml.ocnmosaic new file mode 100644 index 000000000..6334faf1f --- /dev/null +++ b/configuration/scripts/options/set_nml.ocnmosaic @@ -0,0 +1,6 @@ +ocn_data_type = 'MDF' +ocn_data_file = 'MOSAiC_ocn_drift1_MDF_20191006_20200731.nc' +ocn_data_format = 'nc' +ustar_min = 0.005 +precalc_forc = .true. +ice_data_file = 'unknown_ice_data_file' diff --git a/configuration/scripts/tests/base_suite.ts b/configuration/scripts/tests/base_suite.ts index 9ca134097..ddfe27ccd 100644 --- a/configuration/scripts/tests/base_suite.ts +++ b/configuration/scripts/tests/base_suite.ts @@ -25,6 +25,7 @@ smoke col 1x1 debug,run1year,dyn,fluxopenw smoke col 1x1 debug,run1year,debug,snicartest smoke col 1x1 debug,run1year,debug,snicar smoke col 1x1 debug,run1year,debug,congel +smoke col 1x1 debug,ionetcdf,atmmosaic,ocnmosaic restart col 1x1 debug restart col 1x1 diag1 restart col 1x1 pondlvl diff --git a/doc/source/developer_guide/dg_driver.rst b/doc/source/developer_guide/dg_driver.rst index b8389b90f..d211ec066 100755 --- a/doc/source/developer_guide/dg_driver.rst +++ b/doc/source/developer_guide/dg_driver.rst @@ -40,7 +40,7 @@ Overview The icepack driver exists to test the column physics. At the present time, it is hardwired to run 4 different gridcells on one processor with the same forcing used for all gridcells. -There is no MPI and no threading built into the icepack driver. There is limited IO capabilities, -no history files, and no netcdf restart files. The model generally runs very quickly. +There is no MPI nor threading built into the icepack driver. There are limited IO capabilities. +The model generally runs very quickly. Forcing data and details on these data are available in :ref:`force`. diff --git a/doc/source/icepack_index.rst b/doc/source/icepack_index.rst index 712d1d891..1e0cbeaac 100755 --- a/doc/source/icepack_index.rst +++ b/doc/source/icepack_index.rst @@ -206,7 +206,9 @@ section :ref:`tabnamelist`. "H2_16O_ocn", "concentration of H2_16O isotope in ocean", "kg/kg" "H2_18O_ocn", "concentration of H2_18O isotope in ocean", "kg/kg" "HDO_ocn", "concentration of HDO isotope in ocean", "kg/kg" + "hbar_init_itd", ":math:`\bullet` initial modal ice thickness for itd-initialized grid cell", "3. m" "hfrazilmin", "minimum thickness of new frazil ice", "0.05 m" + "hi_init_slab", ":math:`\bullet` initial ice thickness for slab-initialized grid cell", "2. m" "hi_min", "minimum ice thickness for thinnest ice category", "m" "hi_ssl", "ice surface scattering layer thickness", "0.05 m" "hicen", "ice thickness in category n", "m" @@ -215,6 +217,7 @@ section :ref:`tabnamelist`. "hin_max", "category thickness limits", "m" "history_format", "turns on netcdf history output if set to 'nc'", "" "hmix", "ocean mixed layer depth", "20. m" + "hmix_fixed", ":math:`\bullet` constant ocean mixed layer depth", "20. m" "hour", "hour of the year", "" "hp0", "pond depth at which shortwave transition to bare ice occurs", "0.2 m" "hp1", ":math:`\bullet` critical ice lid thickness for topo ponds (dEdd)", "0.01 m" @@ -224,6 +227,8 @@ section :ref:`tabnamelist`. "hs0", ":math:`\bullet` snow depth at which transition to ice occurs (dEdd)", "" "hs1", ":math:`\bullet` snow depth of transition to pond ice", "0.03 m" "hs_ssl", "snow surface scattering layer thickness", "0.04 m" + "hsno_init_itd", ":math:`\bullet` initial snow depth for itd-initialized grid cell", "0.25 m" + "hsno_init_slab", ":math:`\bullet` initial snow depth for slab-initialized grid cell", "0. m" "Hstar", "determines mean thickness of ridged ice", "25. m" "**I**", "", "" "i0vis","fraction of penetrating visible solar radiation", "0.70" @@ -357,13 +362,15 @@ section :ref:`tabnamelist`. "potT", "atmospheric potential temperature", "K" "PP_net", "total primary productivity per grid cell", "mg C/m\ :math:`^2`/s" "precip_units", ":math:`\bullet` liquid precipitation data units", "" + "precalc_forc", ":math:`\bullet` if true, average/interpolate forcing data on initialization", "" "print_points", ":math:`\bullet` if true, print point data", "F" "Pstar", "ice strength parameter", "2.75\ :math:`\times`\ 10\ :math:`^4`\ N/m\ :math:`^2`" "puny", "a small positive number", "1\ :math:`\times`\ 10\ :math:`^{-11}`" "**Q**", "", "" "Qa", "specific humidity at 10 m", "kg/kg" "Qa_iso", "water isotope specific humidity at 10 m", "kg/kg" - "qdp", "deep ocean heat flux", "W/m\ :math:`^2`" + "qdp", "oceanic heat flux convergence", "W/m\ :math:`^2`" + "qdp_fixed", ":math:`\bullet` constant oceanic heat flux convergence", "0. W/m\ :math:`^2`" "qqqice", "for saturated specific humidity over ice", "1.16378\ :math:`\times`\ 10\ :math:`^7`\ kg/m\ :math:`^3`" "qqqocn", "for saturated specific humidity over ocean", "6.275724\ :math:`\times`\ 10\ :math:`^6`\ kg/m\ :math:`^3`" "Qref", "2m atmospheric reference specific humidity", "kg/kg" @@ -432,7 +439,9 @@ section :ref:`tabnamelist`. "spval_dbl", "special value (double precision)", ":math:`10^{30}`", "" "ss_tltx(y)", "sea surface in the x(y) direction", "m/m" "sss", "sea surface salinity", "ppt" + "sss_fixed", ":math:`\bullet` constant mixed layer salinity", "34. ppt" "sst", "sea surface temperature", "C" + "sst_init", ":math:`\bullet` initial mixed layer temperature", "-1.8\ :math:`^\circ`\ C" "Sswabs", "shortwave radiation absorbed in snow layers", "W/m\ :math:`^2`" "stefan-boltzmann", "Stefan-Boltzmann constant", "5.67\ :math:`\times`\ 10\ :math:`^{-8}` W/m\ :math:`^2`\ K\ :math:`^4`" "stop_now", "if 1, end program execution", "" diff --git a/doc/source/master_list.bib b/doc/source/master_list.bib index 2296cbd98..52719e143 100644 --- a/doc/source/master_list.bib +++ b/doc/source/master_list.bib @@ -843,6 +843,25 @@ @article{Edwards2012 doi = {https://doi.org/10.4319/lo.2012.57.2.0554}, year = {2012} } +@article{Raphael24, +author = "Raphael, I.A. and Perovich, D.K. and Polashenski, C.M. and Clemens-Sewall, D. and Itkin, P. and Lei, R. and Nicolaus, M. and Regnery, J. and Smith, M.M. and Webster, M. and Jaggi, M.", +title = {Sea ice mass balance during the {MOSAiC} drift experiment: {Results} from manual ice and snow thickness gauges}, +volume = {12}, +issn = {2325-1026}, +url = {https://doi.org/10.1525/elementa.2023.00040}, +doi = {10.1525/elementa.2023.00040}, +number = {1}, +journal = {Elementa: Science of the Anthropocene}, +year = {2024}, +pages = {00040}, +} +@misc{Clemens-Sewall25 +author = "Clemens-Sewall, D. and Cox, C. and Schulz, K. and Raphael, I. and Persson, O. and Shupe, M. and Smith, M.", +title = "{Merged Datasets for the Multidisciplinary drifting Observatory for the Study of Arctic Climate (MOSAiC) Central Observatory in the Arctic Ocean (2019-2020) version 2}", +year = {2025}, +doi = {https://doi.org/10.18739/A2WD3Q35Z}, +howpublished = {Arctic Data Center} +} % ********************************************** % For new entries, see example entry in BIB_TEMPLATE.txt % ********************************************** diff --git a/doc/source/user_guide/ug_case_settings.rst b/doc/source/user_guide/ug_case_settings.rst index 3dea32fb6..4f862708a 100644 --- a/doc/source/user_guide/ug_case_settings.rst +++ b/doc/source/user_guide/ug_case_settings.rst @@ -142,8 +142,12 @@ setup_nml "", "``y``", "write restart every ``dumpfreq_n`` years", "" "``dump_last``", "true/false", "write restart at end of run", "false" "``dt``", "seconds", "thermodynamics time step length", "3600." + "``hbar_init_itd``", "real", "initial modal ice thickness for itd-initialized grid cell in m", "3.0" + "``hi_init_slab``", "real", "initial ice thickness for slab-initialized grid cell in m", "2.0" "``history_format``", "``cdf``", "history file output in netcdf format", "``none``" "","``none``","no history output","" + "``hsno_init_itd``", "real", "initial snow depth for itd-initialized grid cell in m", "0.25" + "``hsno_init_slab``", "real", "initial snow depth for slab-initialized grid cell in m", "0.0" "``ice_ic``", "``default``", "latitude and sst dependent initial condition", "``default``" "", "``none``", "no ice", "" "", "'path/file'", "restart file name", "" @@ -155,6 +159,7 @@ setup_nml "``restart_file``", "string", "output file prefix for restart dump", "'iced'" "``restart_format``", "``bin``", "restart file output in binary format", "``bin``" "","``cdf``","restart file output in netcdf format","" + "``sst_init``", "real", "initial ocean mixed layer temperature in C", "-1.8" "``use_leap_years``", "logical", "include leap days", "``.false.``" "``year_init``", "integer", "the initial year if not using restart", "0" "", "", "", "" @@ -331,10 +336,12 @@ forcing_nml "``atmiter_conv``", "real", "convergence criteria for ustar", "0.0" "``atm_data_file``", "string", "file containing atmospheric data", "' '" "``atm_data_format``", "``bin``", "read direct access binary forcing files", "``bin``" + "", "``nc``", "read netCDF forcing files", "" "``atm_data_type``", "``clim``", "monthly climatology (see :ref:`force`)", "``default``" "", "``CFS``", "CFS model output (see :ref:`force`)", "" "", "``default``", "constant values defined in the code", "" "", "``ISPOL``", "ISPOL experiment data (see :ref:`force`)", "" + "", "``MDF``", "Merged Data File (MDF) formatted forcing data (see :ref:`init`)", "" "", "``NICE``", "N-ICE experiment data (see :ref:`force`)", "" "``bgc_data_file``", "string", "file containing biogeochemistry data", "' '" "``bgc_data_format``", "``bin``", "read direct access binary forcing files", "``bin``" @@ -358,6 +365,7 @@ forcing_nml "``formdrag``", "logical", "calculate form drag", "``.false.``" "``fyear_init``", "integer", "first year of atmospheric forcing data", "1998" "``highfreq``", "logical", "high-frequency atmo coupling", "``.false.``" + "``hmix_fixed``", "real", "constant ocean mixed layer depth in m", "20.0" "``lateral_flux_type``", "``uniform_ice``", "flux ice with identical properties into the cell when closing (Icepack only)", "" "", "``none``", "advect open water into the cell when closing (Icepack only)", "" "``ice_data_file``", "string", "file containing ice opening, closing data", "' '" @@ -367,17 +375,22 @@ forcing_nml "``oceanmixed_ice``", "logical", "active ocean mixed layer calculation", "``.false.``" "``ocn_data_file``", "string", "file containing ocean data", "' ' " "``ocn_data_format``", "``bin``", "read direct access binary forcing files", "``bin``" + "", "``nc``", "read netCDF forcing files", "" "``ocn_data_type``", "``default``", "constant values defined in the code", "``default``" "", "``ISPOL``", "ISPOL experiment data (see :ref:`force`)", "" + "", "``MDF``", "Merged Data File (MDF) formatted forcing data (see :ref:`init`)", "" "", "``NICE``", "N-ICE experiment data (see :ref:`force`)", "" "", "``SHEBA``", "Opening/closing dataset from SHEBA", "" + "``precalc_forc``", "logical", "average/interpolate forcing data on initialization", "``.false.``" "``precip_units``", "``mks``", "liquid precipitation data units", "``mks``" "", "``mm_per_month``", "", "" "", "``mm_per_sec``", "(same as MKS units)", "" "", "``m_per_sec``", "", "" + "``qdp_fixed``", "real", "constant oceanic heat flux convergence W/m^2", "0.0" "``restore_ocn``", "logical", "restore sst to data", "``.false.``" "``saltflux_option``", "``constant``","salt flux is referenced to a constant salinity","``constant``" "","``prognostic``","use actual sea ice bulk salinity in flux" + "``sss_fixed``", "real", "constant ocean mixed layer salinity in ppt", "34.0" "``tfrz_option``","``constant``", "constant ocean freezing temperature (Tocnfrz)","``mushy``" "", "``linear_salt``", "linear function of salinity (ktherm=1)", "" "", "``minus1p8``", "constant ocean freezing temperature (:math:`-1.8^{\circ} C`)", "" diff --git a/doc/source/user_guide/ug_implementation.rst b/doc/source/user_guide/ug_implementation.rst index 76a0db32d..f60cfcbff 100755 --- a/doc/source/user_guide/ug_implementation.rst +++ b/doc/source/user_guide/ug_implementation.rst @@ -118,17 +118,74 @@ will be described in more detail in the :ref:`tabnamelist`. Two namelist variables control model initialization, ``ice_ic`` and ``restart``. Setting ``ice_ic`` = 'default' causes the model to run using -initial values set in the code. To start +initial values set in the code and the namelist. To start from a file **filename**, set ``restart`` = .true. and ``ice_ic`` = **filename**. When restarting using the Icepack driver, for simplicity the tracers are assumed to be set the same way (on/off) as in the run that created the restart file; i.e. that the restart file contains exactly the information needed for the new run. CICE is more flexible in this regard. +When the model is not running from a restart file (i.e., ``ice_ic`` = 'default' +and ``restart`` = .false.), there are namelist options that control the initial +snow depth , ice thicknesses and mixed layer temperature (``sst_init``). +For the slab-initialized grid cell (``nx`` = 2), the run starts with a single +ice thickness category having 100% ice cover . ``hsno_init_slab`` and +``hi_init_slab`` define the initial snow depth and ice thickness for that +ice thickness category. For the itd-initialized grid cell (``nx`` = 3), the ice +thickness in each category is set to the midpoint of that category's ice +thickness range (excluding the last category, which is set to 1 m thicker than +the lower bound). The area fraction of each category is set according to a +normalized, downward-facing parabolic function of ice thickness, where the +maximum of the parabola is ``hbar_init_itd`` and the area fraction of open +water is zero. All thickness categories are initialized with a snow depth of +``hsno_init_itd``. + For stand-alone runs, -routines in **icedrv\_forcing.F90** read and interpolate data from files, -and are intended merely for testing, although they can also provide guidance for -the user to write his or her own routines. +routines in **icedrv\_forcing.F90** read and interpolate data from files. +The namelist variables ``precalc_forc``, ``atm_data_type``, +``atm_data_format``, ``ocn_data_type``, and ``ocn_data_format`` control +how the forcing data is handled. If ``precalc_forc`` = .false. and the +``atm/ocn_data_type`` = 'bin', when ``init_forcing`` is called, a +subroutine for the specific dataset (e.g., ``atm_CFS``) stores the +forcing data in the ``*_data`` arrays in essentially the same format +that the raw data is present in, without timestamp information. Then, +at each timestep the ``get_forcing`` subroutine has a code block for +each forcing dataset that contains the forcing's time basis and +interpolates the forcing data to the given timestep. The forcing data +that is available in 'bin' format are intended merely for code testing, +not scientific results. + +If ``precalc_forc`` = .true., ``atm/ocn_data_type`` = 'MDF', and +``atm/ocn_data_format`` = 'nc', then ``init_forcing`` reads data from +netCDF files formatted according to the Merged Data File (MDF) +conventions, which includes timestamp information. During initialization, +the forcing data is averaged/interpolated to the Icepack timestep and +stored the the ``*_data`` arrays. The ``get_forcing`` subroutine then +simply queries the ``*_data`` arrays at each timestep. MDF forcing data +are expected to come from observations, and hence may contain missing +data and may be present at a shorter or longer sampling interval than +the Icepack timestep. To handle variable frequencies and missing data, +forcing data are first temporally-averaged for each timestep and then +interpolated. For a give data variable (``var_data``), The +``MDF_average`` subroutine takes the average of all forcing datapoints +within each ``timestep`` +- 0.5 ``dt`` excluding missing values and +stores the results in ``var_data``. If there is no valid data within +0.5 ``dt`` of a given ``timestep`` (e.g., most timesteps if ``dt`` is +much smaller than the sampling interval) then a missing value is placed +in ``var_data(timestep)``. Then, the ``MDF_interpolate`` subroutine +linearly interpolates missing values in ``var_data``. The MDF +conventions were developed by the Year of Polar Prediction supersite +Model Intercomparison Project (`Uttal et al., 2024 +`_) and a `python toolbox +`_ is available to build MDF +files from raw data. The ``ocn_MDF`` subroutine currently assumes that +the oceanic heat flux convergence (``qdp``) is equal to the turbulent +heat flux over the thermocline. + +If no ocean forcing is provided, namelist variables provide constant +values of the ocean mixed layer salinity (``sss_fixed``), thickness +(``hmix_fixed``), and oceanic heat flux convergence (``qdp_fixed``). If +forcing data is provided then these variables are ignored. .. _parameters: diff --git a/doc/source/user_guide/ug_running.rst b/doc/source/user_guide/ug_running.rst index 782ef56b8..ad86df1f7 100755 --- a/doc/source/user_guide/ug_running.rst +++ b/doc/source/user_guide/ug_running.rst @@ -736,6 +736,46 @@ cases. Current filenames can be found in the options scripts in At present, only the opening and closing rates (1/s) are used from the forcing data. In the namelist, set ``ocn_data_type = SHEBA`` to use this forcing in Icepack. + d) **Multidisciplinary Drifting Observatory for the Study of Arctic Climate (MOSAiC)** + + Atmospheric and oceanic forcing are available from the 2019-2020 Multidisciplinary Drifting Observatory + for the Study of Arctic Climate (MOSAiC) expedition :cite:`Clemens-Sewall25`. The atmospheric forcing is + available minutely and the oceanic forcing is available daily. These data are based on observations from + a collection of drifting ice floes in the Arctic Ocean. MOSAiC consisted of two drift experiments, + in which the R/V Polarstern was moored to a drifting ice floe and continuous observations were made. The + first drift started in October 2019 North of the Laptev Sea (85.4N, 129.2E) and ended in July 2020 in + the Fram Strait (79.2N, 2.6W). The second drift was from August to September, 2020 in the vicinity of + the North Pole (approximately 88.6N, 110.6E). Initial conditions are available for drift 1 in + **set_nml.atmmosaic**. Initial conditions for drift 2 have not yet been implemented in Icepack. + + + Atmospheric forcing fields from :cite:`Clemens-Sewall25` consist of 2-m air temperature (K), 2-m + specific humidity (kg/kg), 2-m wind velocity in the u and v directions (m/s), downward solar radiation + (:math:`W/m^2`), downward longwave radiation (:math:`W/m^2`), and total and solid (snowfall) + precipitation rate (:math:`kg/m^2/s`). Three options are available for the atmospheric forcing for + drift 1. The precip file, `MOSAiC_atm_drift1_precip_MDF_20191015_20200731.nc`, has our best estimate of + the actual precipitation input. The stakes files, `MOSAiC_atm_drift1_stakes_snow_fyi_MDF_20191015_20200731.nc` + and `MOSAiC_atm_drift1_stakes_snow_syi_MDF_20191015_20200731.nc`, contain a pseudo-precipitation that has + been tuned to reproduce the observed snow depth evolution at the manual mass balance ('stakes') sites + on relatively level first-year ice (`_fyi_`) and second-year ice (`_syi_`) respectively. Therefore, the stakes + pseudo-precipitation effectively combines the effects of true precipitation and snow redistribution. + It is recommended to use the precip file for general testing. However, to specifically reproduce the + observed snow depth at the manual mass balance sites with the precip forcing, one would need also need to + accurately reproduce the wind-driven snow redistribution. See :cite:`Raphael24` for further details on the + manual mass balance measurements. + + Oceanic forcing fields consist of mixed layer salinity (PSU), + mixed layer depth (m), turbulent heat fluxes over the halocline and thermocline (:math:`W/m^2`), + mixed layer temperature (K), ocean-ice friction velocity (m/s), and sea ice drift speed (m/s). Note, + Icepack's driver currently lacks a mechanism to use the ocean-ice friction velocity and/or sea ice + drift speed in the thermodynamics calculations. Additionally, caution should be used when using the + modeled ocean mixed layer temperatures. For much of the experiment, Icepack's parameterization + of the ocean mixed layer freezing point differs from the true freezing point by ~0.5 C. + + MOSAiC data are available exclusively as MDF-formatted netCDF files (see :ref:`init`). + + + 3) **Climatological** - Maykut and Untersteiner 1971 :cite:`Maykut71` The climatological forcing consists of a monthly climatology of downward radiative fluxes, air temperature, From 5feadd007a58fd6e923be99b2147c00130a7ce66 Mon Sep 17 00:00:00 2001 From: Tony Craig Date: Thu, 24 Apr 2025 11:21:37 -0700 Subject: [PATCH 08/34] Deprecate zsalinity (#521) Remove zsalinity code (was previously deprecated via an abort) Remove variables salt_loss, dts_b, solve_zsal, restart_zsal, grid_oS, l_skS, nt_bgc_S Remove subroutine icepack_init_zsalinity Update interfaces to remove zsalinity arguments - in icepack_parameters.F90 - in icepack_tracers.F90 - subroutine icepack_step_ridge (fzsal) - subroutine icepack_step_therm2 (fzsal) - subroutine init_zbgc Leave zsalinity namelist input in place for backwards compatibility but they have no impact. If solve_zsal is set to true, the code aborts. Update interface documentation Update user guide --- columnphysics/icepack_brine.F90 | 41 ++-------- columnphysics/icepack_intfc.F90 | 1 - columnphysics/icepack_mechred.F90 | 5 +- columnphysics/icepack_parameters.F90 | 65 +++------------ columnphysics/icepack_therm_itd.F90 | 7 +- columnphysics/icepack_tracers.F90 | 12 +-- columnphysics/icepack_zbgc.F90 | 2 +- configuration/driver/icedrv_init_column.F90 | 19 +++-- configuration/scripts/icepack_in | 3 - doc/source/science_guide/sg_bgc.rst | 6 -- doc/source/user_guide/interfaces.include | 87 ++++----------------- doc/source/user_guide/lg_sequence.rst | 1 - doc/source/user_guide/ug_case_settings.rst | 4 - 13 files changed, 52 insertions(+), 201 deletions(-) diff --git a/columnphysics/icepack_brine.F90 b/columnphysics/icepack_brine.F90 index f4738a4d8..1cb937fd9 100644 --- a/columnphysics/icepack_brine.F90 +++ b/columnphysics/icepack_brine.F90 @@ -9,8 +9,8 @@ module icepack_brine use icepack_kinds use icepack_parameters, only: p01, p001, p5, c0, c1, c2, c1p5, puny, p25 use icepack_parameters, only: gravit, rhoi, rhow, rhos, depressT - use icepack_parameters, only: salt_loss, min_salin, rhosi - use icepack_parameters, only: dts_b, l_sk + use icepack_parameters, only: min_salin, rhosi + use icepack_parameters, only: l_sk use icepack_tracers, only: nilyr, nblyr, ntrcr, nt_qice, nt_sice use icepack_tracers, only: nt_Tsfc use icepack_zbgc_shared, only: k_o, exp_h, Dm, Ra_c, viscos_dynamic, thinS @@ -28,8 +28,7 @@ module icepack_brine compute_microS_mushy, & update_hbrine, & calculate_drho, & - icepack_init_hbrine, & - icepack_init_zsalinity ! deprecated + icepack_init_hbrine real (kind=dbl_kind), parameter :: & maxhbr = 1.25_dbl_kind , & ! brine overflows if hbr > maxhbr*hin @@ -51,7 +50,7 @@ module icepack_brine !======================================================================= ! Computes the top and bottom brine boundary changes for flushing -! works for zsalinity and tr_salinity +! works for tr_salinity ! ! NOTE: In this subroutine, trcrn(nt_fbri) is the volume fraction of ice with ! dynamic salinity or the height ratio = hbr/vicen*aicen, where hbr is the @@ -680,7 +679,7 @@ subroutine icepack_init_hbrine(bgrid_out, igrid_out, cgrid_out, & ! Calculate bio gridn: 0 to 1 corresponds to ice top to bottom !----------------------------------------------------------------- - bgrid(:) = c0 ! zsalinity grid points + bgrid(:) = c0 ! biology nondimensional vertical grid points bgrid(nblyr+2) = c1 ! bottom value igrid(:) = c0 ! bgc interface grid points igrid(1) = c0 ! ice top @@ -738,36 +737,6 @@ subroutine icepack_init_hbrine(bgrid_out, igrid_out, cgrid_out, & end subroutine icepack_init_hbrine -!======================================================================= -!autodocument_start icepack_init_zsalinity -! **DEPRECATED**, all code removed -! Interface provided for backwards compatibility - - subroutine icepack_init_zsalinity(Rayleigh_criteria, & - Rayleigh_real, trcrn_bgc, sss) - - logical (kind=log_kind), intent(inout) :: & - Rayleigh_criteria - - real (kind=dbl_kind), intent(inout):: & - Rayleigh_real - - real (kind=dbl_kind), intent(in):: & - sss - - real (kind=dbl_kind), dimension(:,:), intent(inout):: & - trcrn_bgc ! bgc subset of trcrn - -!autodocument_end - - ! local variables - - character(len=*),parameter :: subname='(icepack_init_zsalinity)' - - call icepack_warnings_add(subname//' DEPRECATED, do not use') -! call icepack_warnings_setabort(.true.,__FILE__,__LINE__) - - end subroutine icepack_init_zsalinity !======================================================================= end module icepack_brine diff --git a/columnphysics/icepack_intfc.F90 b/columnphysics/icepack_intfc.F90 index d0e152fb1..1ed847f93 100644 --- a/columnphysics/icepack_intfc.F90 +++ b/columnphysics/icepack_intfc.F90 @@ -92,7 +92,6 @@ module icepack_intfc use icepack_shortwave, only: icepack_step_radiation use icepack_brine, only: icepack_init_hbrine - use icepack_brine, only: icepack_init_zsalinity ! deprecated use icepack_zbgc , only: icepack_init_bgc use icepack_zbgc , only: icepack_init_zbgc diff --git a/columnphysics/icepack_mechred.F90 b/columnphysics/icepack_mechred.F90 index 70766cc60..0f043ab1d 100644 --- a/columnphysics/icepack_mechred.F90 +++ b/columnphysics/icepack_mechred.F90 @@ -1739,7 +1739,7 @@ subroutine icepack_step_ridge(dt, ndtd, & dvirdgndt, & araftn, vraftn, & aice, fsalt, & - first_ice, fzsal, & + first_ice, & flux_bio, closing, & Tf, & docleanup, dorebin) @@ -1781,9 +1781,6 @@ subroutine icepack_step_ridge(dt, ndtd, & fsalt , & ! salt flux to ocean (kg/m^2/s) fhocn ! net heat flux to ocean (W/m^2) - real (kind=dbl_kind), intent(inout), optional :: & - fzsal ! zsalinity flux to ocean(kg/m^2/s) (deprecated) - real (kind=dbl_kind), intent(inout), optional :: & closing ! rate of closing due to divergence/shear (1/s) diff --git a/columnphysics/icepack_parameters.F90 b/columnphysics/icepack_parameters.F90 index ed76b6b41..2c4c1b399 100644 --- a/columnphysics/icepack_parameters.F90 +++ b/columnphysics/icepack_parameters.F90 @@ -126,10 +126,8 @@ module icepack_parameters ! phi_init, dSin0_frazil are for mushy thermo phi_init = 0.75_dbl_kind ,&! initial liquid fraction of frazil min_salin = p1 ,&! threshold for brine pocket treatment - salt_loss = 0.4_dbl_kind ,&! fraction of salt retained in zsalinity Tliquidus_max = c0 ,&! maximum liquidus temperature of mush (C) dSin0_frazil = c3 ,&! bulk salinity reduction of newly formed frazil - dts_b = 50._dbl_kind ,&! zsalinity timestep ustar_min = 0.005_dbl_kind ,&! minimum friction velocity for ocean heat flux (m/s) hi_min = p01 ,&! minimum ice thickness allowed (m) for thermo ! mushy thermo @@ -156,7 +154,6 @@ module icepack_parameters ! if false, Tsfc is computed elsewhere and ! atmos-ice fluxes are provided to CICE update_ocn_f = .false. ,&! include fresh water and salt fluxes for frazil - solve_zsal = .false. ,&! if true, update salinity profile from solve_S_dt modal_aero = .false. ,&! if true, use modal aerosal optical properties ! only for use with tr_aero or tr_zaero conserv_check = .false. ! if true, do conservations checks and abort @@ -410,9 +407,7 @@ module icepack_parameters phi_snow = -1.0_dbl_kind , & ! snow porosity (compute from snow density if negative) grid_o = 0.006_dbl_kind , & ! for bottom flux initbio_frac = c1 , & ! fraction of ocean trcr concentration in bio trcrs - l_sk = 2.0_dbl_kind , & ! characteristic diffusive scale (m) - grid_oS = c0 , & ! for bottom flux - l_skS = 0.028_dbl_kind , & ! characteristic skeletal layer thickness (m) (zsalinity) + l_sk = 2.0_dbl_kind , & ! characteristic diffusive scale brine (m) algal_vel = 1.0e-7_dbl_kind , & ! 0.5 cm/d(m/s) Lavoie 2005 1.5 cm/day R_dFe2dust = 0.035_dbl_kind , & ! g/g (3.5% content) Tagliabue 2009 dustFe_sol = 0.005_dbl_kind , & ! solubility fraction @@ -555,12 +550,11 @@ subroutine icepack_init_parameters( & iceruf_in, Cf_in, Pstar_in, Cstar_in, kappav_in, & kice_in, ksno_in, & zref_in, hs_min_in, snowpatch_in, rhosi_in, sk_l_in, & - saltmax_in, phi_init_in, min_salin_in, salt_loss_in, & - Tliquidus_max_in, & + saltmax_in, phi_init_in, min_salin_in, Tliquidus_max_in, & min_bgc_in, dSin0_frazil_in, hi_ssl_in, hs_ssl_in, hs_ssl_min_in, & awtvdr_in, awtidr_in, awtvdf_in, awtidf_in, & qqqice_in, TTTice_in, qqqocn_in, TTTocn_in, & - ktherm_in, conduct_in, fbot_xfer_type_in, calc_Tsfc_in, dts_b_in, & + ktherm_in, conduct_in, fbot_xfer_type_in, calc_Tsfc_in, & update_ocn_f_in, ustar_min_in, hi_min_in, a_rapid_mode_in, & cpl_frazil_in, & Rac_rapid_mode_in, aspect_rapid_mode_in, & @@ -577,8 +571,7 @@ subroutine icepack_init_parameters( & dpscale_in, rfracmin_in, rfracmax_in, pndaspect_in, hs1_in, hp1_in, & bgc_flux_type_in, z_tracers_in, scale_bgc_in, solve_zbgc_in, & modal_aero_in, use_macromolecules_in, restartbgc_in, skl_bgc_in, & - solve_zsal_in, grid_o_in, l_sk_in, & - initbio_frac_in, grid_oS_in, l_skS_in, dEdd_algae_in, & + grid_o_in, l_sk_in, initbio_frac_in, dEdd_algae_in, & phi_snow_in, T_max_in, fsal_in, use_atm_dust_iron_in, & fr_resp_in, algal_vel_in, R_dFe2dust_in, dustFe_sol_in, & op_dep_min_in, fr_graze_s_in, fr_graze_e_in, fr_mort2min_in, & @@ -678,7 +671,6 @@ subroutine icepack_init_parameters( & saltmax_in, & ! max salinity at ice base for BL99 (ppt) phi_init_in, & ! initial liquid fraction of frazil min_salin_in, & ! threshold for brine pocket treatment - salt_loss_in, & ! fraction of salt retained in zsalinity Tliquidus_max_in, & ! maximum liquidus temperature of mush (C) dSin0_frazil_in ! bulk salinity reduction of newly formed frazil @@ -700,7 +692,6 @@ subroutine icepack_init_parameters( & update_ocn_f_in ! include fresh water and salt fluxes for frazil real (kind=dbl_kind), intent(in), optional :: & - dts_b_in, & ! zsalinity timestep hi_min_in, & ! minimum ice thickness allowed (m) for thermo ustar_min_in ! minimum friction velocity for ice-ocean heat flux @@ -885,20 +876,15 @@ subroutine icepack_init_parameters( & conserv_check_in ! if .true., run conservation checks and abort if checks fail logical (kind=log_kind), intent(in), optional :: & - skl_bgc_in, & ! if true, solve skeletal biochemistry - solve_zsal_in ! if true, update salinity profile from solve_S_dt + skl_bgc_in ! if true, solve skeletal biochemistry real (kind=dbl_kind), intent(in), optional :: & grid_o_in , & ! for bottom flux - l_sk_in , & ! characteristic diffusive scale (zsalinity) (m) + l_sk_in , & ! characteristic diffusive scale (m) grid_o_t_in , & ! top grid point length scale initbio_frac_in, & ! fraction of ocean tracer concentration used to initialize tracer phi_snow_in ! snow porosity at the ice/snow interface - real (kind=dbl_kind), intent(in), optional :: & - grid_oS_in , & ! for bottom flux (zsalinity) - l_skS_in ! 0.02 characteristic skeletal layer thickness (m) (zsalinity) - real (kind=dbl_kind), intent(in), optional :: & ratio_Si2N_diatoms_in, & ! algal Si to N (mol/mol) ratio_Si2N_sp_in , & @@ -1146,7 +1132,6 @@ subroutine icepack_init_parameters( & if (present(saltmax_in) ) saltmax = saltmax_in if (present(phi_init_in) ) phi_init = phi_init_in if (present(min_salin_in) ) min_salin = min_salin_in - if (present(salt_loss_in) ) salt_loss = salt_loss_in if (present(Tliquidus_max_in) ) Tliquidus_max = Tliquidus_max_in if (present(min_bgc_in) ) min_bgc = min_bgc_in if (present(dSin0_frazil_in) ) dSin0_frazil = dSin0_frazil_in @@ -1168,7 +1153,6 @@ subroutine icepack_init_parameters( & if (present(calc_Tsfc_in) ) calc_Tsfc = calc_Tsfc_in if (present(cpl_frazil_in) ) cpl_frazil = cpl_frazil_in if (present(update_ocn_f_in) ) update_ocn_f = update_ocn_f_in - if (present(dts_b_in) ) dts_b = dts_b_in if (present(ustar_min_in) ) ustar_min = ustar_min_in if (present(hi_min_in) ) hi_min = hi_min_in if (present(a_rapid_mode_in) ) a_rapid_mode = a_rapid_mode_in @@ -1362,19 +1346,11 @@ subroutine icepack_init_parameters( & if (present(restartbgc_in) ) restartbgc = restartbgc_in if (present(conserv_check_in) ) conserv_check = conserv_check_in if (present(skl_bgc_in) ) skl_bgc = skl_bgc_in - if (present(solve_zsal_in)) then - call icepack_warnings_add(subname//' WARNING: zsalinity is deprecated') - if (solve_zsal_in) then - call icepack_warnings_setabort(.true.,__FILE__,__LINE__) - endif - endif if (present(grid_o_in) ) grid_o = grid_o_in if (present(l_sk_in) ) l_sk = l_sk_in if (present(grid_o_t_in) ) grid_o_t = grid_o_t_in if (present(frazil_scav_in) ) frazil_scav = frazil_scav_in if (present(initbio_frac_in) ) initbio_frac = initbio_frac_in - if (present(grid_oS_in) ) grid_oS = grid_oS_in - if (present(l_skS_in) ) l_skS = l_skS_in if (present(phi_snow_in) ) phi_snow = phi_snow_in if (present(ratio_Si2N_diatoms_in) ) ratio_Si2N_diatoms = ratio_Si2N_diatoms_in @@ -1566,13 +1542,12 @@ subroutine icepack_query_parameters( & iceruf_out, Cf_out, Pstar_out, Cstar_out, kappav_out, & kice_out, ksno_out, & zref_out, hs_min_out, snowpatch_out, rhosi_out, sk_l_out, & - saltmax_out, phi_init_out, min_salin_out, salt_loss_out, & - Tliquidus_max_out, & + saltmax_out, phi_init_out, min_salin_out, Tliquidus_max_out, & min_bgc_out, dSin0_frazil_out, hi_ssl_out, hs_ssl_out, hs_ssl_min_out, & awtvdr_out, awtidr_out, awtvdf_out, awtidf_out, cpl_frazil_out, & qqqice_out, TTTice_out, qqqocn_out, TTTocn_out, update_ocn_f_out, & Lfresh_out, cprho_out, Cp_out, ustar_min_out, hi_min_out, a_rapid_mode_out, & - ktherm_out, conduct_out, fbot_xfer_type_out, calc_Tsfc_out, dts_b_out, & + ktherm_out, conduct_out, fbot_xfer_type_out, calc_Tsfc_out, & Rac_rapid_mode_out, aspect_rapid_mode_out, dSdt_slow_mode_out, & phi_c_slow_mode_out, phi_i_mushy_out, shortwave_out, & albedo_type_out, albicev_out, albicei_out, albsnowv_out, & @@ -1587,8 +1562,7 @@ subroutine icepack_query_parameters( & dpscale_out, rfracmin_out, rfracmax_out, pndaspect_out, hs1_out, hp1_out, & bgc_flux_type_out, z_tracers_out, scale_bgc_out, solve_zbgc_out, & modal_aero_out, use_macromolecules_out, restartbgc_out, use_atm_dust_iron_out, & - skl_bgc_out, solve_zsal_out, grid_o_out, l_sk_out, & - initbio_frac_out, grid_oS_out, l_skS_out, & + skl_bgc_out, grid_o_out, l_sk_out, initbio_frac_out, & phi_snow_out, conserv_check_out, & fr_resp_out, algal_vel_out, R_dFe2dust_out, dustFe_sol_out, & T_max_out, fsal_out, op_dep_min_out, fr_graze_s_out, fr_graze_e_out, & @@ -1696,7 +1670,6 @@ subroutine icepack_query_parameters( & saltmax_out, & ! max salinity at ice base for BL99 (ppt) phi_init_out, & ! initial liquid fraction of frazil min_salin_out, & ! threshold for brine pocket treatment - salt_loss_out, & ! fraction of salt retained in zsalinity Tliquidus_max_out, & ! maximum liquidus temperature of mush (C) dSin0_frazil_out ! bulk salinity reduction of newly formed frazil @@ -1718,7 +1691,6 @@ subroutine icepack_query_parameters( & update_ocn_f_out ! include fresh water and salt fluxes for frazil real (kind=dbl_kind), intent(out), optional :: & - dts_b_out, & ! zsalinity timestep hi_min_out, & ! minimum ice thickness allowed (m) for thermo ustar_min_out ! minimum friction velocity for ice-ocean heat flux @@ -1905,20 +1877,15 @@ subroutine icepack_query_parameters( & conserv_check_out ! if .true., run conservation checks and abort if checks fail logical (kind=log_kind), intent(out), optional :: & - skl_bgc_out, & ! if true, solve skeletal biochemistry - solve_zsal_out ! if true, update salinity profile from solve_S_dt + skl_bgc_out ! if true, solve skeletal biochemistry real (kind=dbl_kind), intent(out), optional :: & grid_o_out , & ! for bottom flux - l_sk_out , & ! characteristic diffusive scale (zsalinity) (m) + l_sk_out , & ! characteristic diffusive scale (m) grid_o_t_out , & ! top grid point length scale initbio_frac_out, & ! fraction of ocean tracer concentration used to initialize tracer phi_snow_out ! snow porosity at the ice/snow interface - real (kind=dbl_kind), intent(out), optional :: & - grid_oS_out , & ! for bottom flux (zsalinity) - l_skS_out ! 0.02 characteristic skeletal layer thickness (m) (zsalinity) - real (kind=dbl_kind), intent(out), optional :: & ratio_Si2N_diatoms_out, & ! algal Si to N (mol/mol) ratio_Si2N_sp_out , & @@ -2198,7 +2165,6 @@ subroutine icepack_query_parameters( & if (present(saltmax_out) ) saltmax_out = saltmax if (present(phi_init_out) ) phi_init_out = phi_init if (present(min_salin_out) ) min_salin_out = min_salin - if (present(salt_loss_out) ) salt_loss_out = salt_loss if (present(Tliquidus_max_out) ) Tliquidus_max_out= Tliquidus_max if (present(min_bgc_out) ) min_bgc_out = min_bgc if (present(dSin0_frazil_out) ) dSin0_frazil_out = dSin0_frazil @@ -2220,7 +2186,6 @@ subroutine icepack_query_parameters( & if (present(calc_Tsfc_out) ) calc_Tsfc_out = calc_Tsfc if (present(cpl_frazil_out) ) cpl_frazil_out = cpl_frazil if (present(update_ocn_f_out) ) update_ocn_f_out = update_ocn_f - if (present(dts_b_out) ) dts_b_out = dts_b if (present(ustar_min_out) ) ustar_min_out = ustar_min if (present(hi_min_out) ) hi_min_out = hi_min if (present(a_rapid_mode_out) ) a_rapid_mode_out = a_rapid_mode @@ -2303,13 +2268,10 @@ subroutine icepack_query_parameters( & if (present(restartbgc_out) ) restartbgc_out= restartbgc if (present(conserv_check_out) ) conserv_check_out= conserv_check if (present(skl_bgc_out) ) skl_bgc_out = skl_bgc - if (present(solve_zsal_out) ) solve_zsal_out = solve_zsal if (present(grid_o_out) ) grid_o_out = grid_o if (present(l_sk_out) ) l_sk_out = l_sk if (present(initbio_frac_out) ) initbio_frac_out = initbio_frac if (present(frazil_scav_out) ) frazil_scav_out = frazil_scav - if (present(grid_oS_out) ) grid_oS_out = grid_oS - if (present(l_skS_out) ) l_skS_out = l_skS if (present(grid_o_t_out) ) grid_o_t_out = grid_o_t if (present(phi_snow_out) ) phi_snow_out = phi_snow if (present(ratio_Si2N_diatoms_out) ) ratio_Si2N_diatoms_out = ratio_Si2N_diatoms @@ -2497,7 +2459,6 @@ subroutine icepack_write_parameters(iounit) write(iounit,*) " saltmax = ",saltmax write(iounit,*) " phi_init = ",phi_init write(iounit,*) " min_salin = ",min_salin - write(iounit,*) " salt_loss = ",salt_loss write(iounit,*) " Tliquidus_max = ",Tliquidus_max write(iounit,*) " min_bgc = ",min_bgc write(iounit,*) " dSin0_frazil = ",dSin0_frazil @@ -2530,7 +2491,6 @@ subroutine icepack_write_parameters(iounit) write(iounit,*) " calc_Tsfc = ", calc_Tsfc write(iounit,*) " cpl_frazil = ", cpl_frazil write(iounit,*) " update_ocn_f = ", update_ocn_f - write(iounit,*) " dts_b = ", dts_b write(iounit,*) " ustar_min = ", ustar_min write(iounit,*) " hi_min = ", hi_min write(iounit,*) " a_rapid_mode = ", a_rapid_mode @@ -2613,14 +2573,11 @@ subroutine icepack_write_parameters(iounit) write(iounit,*) " restartbgc = ", restartbgc write(iounit,*) " conserv_check = ", conserv_check write(iounit,*) " skl_bgc = ", skl_bgc - write(iounit,*) " solve_zsal = ", solve_zsal write(iounit,*) " grid_o = ", grid_o write(iounit,*) " l_sk = ", l_sk write(iounit,*) " grid_o_t = ", grid_o_t write(iounit,*) " initbio_frac = ", initbio_frac write(iounit,*) " frazil_scav= ", frazil_scav - write(iounit,*) " grid_oS = ", grid_oS - write(iounit,*) " l_skS = ", l_skS write(iounit,*) " phi_snow = ", phi_snow write(iounit,*) " ratio_Si2N_diatoms = ", ratio_Si2N_diatoms diff --git a/columnphysics/icepack_therm_itd.F90 b/columnphysics/icepack_therm_itd.F90 index 0fcc96738..f7e74c9d0 100644 --- a/columnphysics/icepack_therm_itd.F90 +++ b/columnphysics/icepack_therm_itd.F90 @@ -26,7 +26,7 @@ module icepack_therm_itd use icepack_parameters, only: c0, c1, c2, c3, c4, c6, c10 use icepack_parameters, only: p001, p1, p333, p5, p666, puny, bignum use icepack_parameters, only: rhos, rhoi, Lfresh, ice_ref_salinity - use icepack_parameters, only: phi_init, dsin0_frazil, salt_loss + use icepack_parameters, only: phi_init, dsin0_frazil use icepack_parameters, only: Tliquidus_max use icepack_parameters, only: rhosi, conserv_check, rhosmin, snwredist use icepack_parameters, only: kitd, ktherm @@ -1860,7 +1860,7 @@ subroutine icepack_step_therm2(dt, hin_max, & fresh, fsalt, & fhocn, update_ocn_f, & faero_ocn, & - first_ice, fzsal, & + first_ice, & flux_bio, ocean_bio, & frazil_diag, & frz_onset, yday, & @@ -1915,9 +1915,6 @@ subroutine icepack_step_therm2(dt, hin_max, & frazil , & ! frazil ice growth (m/step-->cm/day) frazil_diag ! frazil ice growth diagnostic (m/step-->cm/day) - real (kind=dbl_kind), intent(inout), optional :: & - fzsal ! salt flux to ocean from zsalinity (kg/m^2/s) (deprecated) - real (kind=dbl_kind), intent(in), optional :: & wlat ! lateral melt rate (m/s) diff --git a/columnphysics/icepack_tracers.F90 b/columnphysics/icepack_tracers.F90 index afa8204d5..cbce7a765 100644 --- a/columnphysics/icepack_tracers.F90 +++ b/columnphysics/icepack_tracers.F90 @@ -95,8 +95,7 @@ module icepack_tracers nt_bgc_DMS = 0, & ! nt_bgc_PON = 0, & ! zooplankton and detritus nt_bgc_hum = 0, & ! humic material - nt_zbgc_frac = 0, & ! fraction of tracer in the mobile phase - nt_bgc_S = 0 ! Bulk salinity in fraction ice with dynamic salinity (Bio grid) (deprecated) + nt_zbgc_frac = 0 ! fraction of tracer in the mobile phase logical (kind=log_kind), public :: & tr_iage = .false., & ! if .true., use age tracer @@ -391,7 +390,7 @@ subroutine icepack_init_tracer_indices(& nlt_bgc_DOC_in, nlt_bgc_DON_in, nlt_bgc_DIC_in, nlt_bgc_Fed_in, & nlt_bgc_Fep_in, nlt_bgc_Nit_in, nlt_bgc_Am_in, nlt_bgc_Sil_in, & nlt_bgc_DMSPp_in, nlt_bgc_DMSPd_in, nlt_bgc_DMS_in, nlt_bgc_hum_in, & - nlt_bgc_PON_in, nt_zbgc_frac_in, nt_bgc_S_in, nlt_chl_sw_in, & + nlt_bgc_PON_in, nt_zbgc_frac_in, nlt_chl_sw_in, & nlt_zaero_sw_in, & bio_index_o_in, bio_index_in) @@ -433,7 +432,6 @@ subroutine icepack_init_tracer_indices(& nlt_bgc_hum_in,& ! nlt_bgc_PON_in,& ! zooplankton and detritus nt_zbgc_frac_in,&! fraction of tracer in the mobile phase - nt_bgc_S_in, & ! (deprecated, was related to zsalinity) nlt_chl_sw_in ! points to total chla in trcrn_sw integer (kind=int_kind), dimension(:), intent(in), optional :: & @@ -515,7 +513,6 @@ subroutine icepack_init_tracer_indices(& if (present(nlt_bgc_PON_in) ) nlt_bgc_PON = nlt_bgc_PON_in if (present(nlt_chl_sw_in) ) nlt_chl_sw = nlt_chl_sw_in if (present(nt_zbgc_frac_in) ) nt_zbgc_frac = nt_zbgc_frac_in - if (present(nt_bgc_S_in) ) nt_bgc_S = nt_bgc_S_in if (present(bio_index_in)) then nsiz = size(bio_index_in) @@ -753,7 +750,7 @@ subroutine icepack_query_tracer_indices(& nlt_bgc_DOC_out, nlt_bgc_DON_out, nlt_bgc_DIC_out, nlt_bgc_Fed_out, & nlt_bgc_Fep_out, nlt_bgc_Nit_out, nlt_bgc_Am_out, nlt_bgc_Sil_out, & nlt_bgc_DMSPp_out, nlt_bgc_DMSPd_out, nlt_bgc_DMS_out, nlt_bgc_hum_out, & - nlt_bgc_PON_out, nt_zbgc_frac_out, nt_bgc_S_out, nlt_chl_sw_out, & + nlt_bgc_PON_out, nt_zbgc_frac_out, nlt_chl_sw_out, & nlt_zaero_sw_out, & bio_index_o_out, bio_index_out) @@ -795,7 +792,6 @@ subroutine icepack_query_tracer_indices(& nlt_bgc_hum_out,& ! nlt_bgc_PON_out,& ! zooplankton and detritus nt_zbgc_frac_out,&! fraction of tracer in the mobile phase - nt_bgc_S_out, & ! (deprecated, was related to zsalinity) nlt_chl_sw_out ! points to total chla in trcrn_sw integer (kind=int_kind), dimension(:), intent(out), optional :: & @@ -875,7 +871,6 @@ subroutine icepack_query_tracer_indices(& if (present(nlt_bgc_PON_out) ) nlt_bgc_PON_out = nlt_bgc_PON if (present(nlt_chl_sw_out) ) nlt_chl_sw_out = nlt_chl_sw if (present(nt_zbgc_frac_out) ) nt_zbgc_frac_out = nt_zbgc_frac - if (present(nt_bgc_S_out) ) nt_bgc_S_out = nt_bgc_S if (present(bio_index_o_out) ) bio_index_o_out = bio_index_o if (present(bio_index_out) ) bio_index_out = bio_index @@ -954,7 +949,6 @@ subroutine icepack_write_tracer_indices(iounit) write(iounit,*) " nlt_bgc_PON = ",nlt_bgc_PON write(iounit,*) " nlt_chl_sw = ",nlt_chl_sw write(iounit,*) " nt_zbgc_frac = ",nt_zbgc_frac - write(iounit,*) " nt_bgc_S = ",nt_bgc_S," (deprecated)" write(iounit,*) " max_nbtrcr = ",max_nbtrcr do k = 1, max_nbtrcr diff --git a/columnphysics/icepack_zbgc.F90 b/columnphysics/icepack_zbgc.F90 index 1cb7a6c34..7ee662763 100644 --- a/columnphysics/icepack_zbgc.F90 +++ b/columnphysics/icepack_zbgc.F90 @@ -12,7 +12,7 @@ module icepack_zbgc use icepack_parameters !use icepack_parameters, only: c0, c1, c2, p001, p1, p5, puny - !use icepack_parameters, only: depressT, rhosi, min_salin, salt_loss + !use icepack_parameters, only: depressT, rhosi, min_salin !use icepack_parameters, only: fr_resp, algal_vel, R_dFe2dust, dustFe_sol, T_max !use icepack_parameters, only: op_dep_min, fr_graze_s, fr_graze_e, fr_mort2min, fr_dFe !use icepack_parameters, only: k_nitrif, t_iron_conv, max_loss, max_dfe_doc1 diff --git a/configuration/driver/icedrv_init_column.F90 b/configuration/driver/icedrv_init_column.F90 index ce1d1bbd0..87d0b9da5 100644 --- a/configuration/driver/icedrv_init_column.F90 +++ b/configuration/driver/icedrv_init_column.F90 @@ -610,16 +610,21 @@ subroutine init_zbgc tr_bgc_hum, tr_aero logical (kind=log_kind) :: & - solve_zsal, skl_bgc, z_tracers, scale_bgc, solve_zbgc, dEdd_algae, & + skl_bgc, z_tracers, scale_bgc, solve_zbgc, dEdd_algae, & modal_aero, restore_bgc + logical (kind=log_kind) :: & + solve_zsal = .false. ! deprecated with zsalinity + character (char_len) :: & bgc_flux_type + real (kind=dbl_kind) :: & + grid_oS, l_skS ! deprecated with zsalinity + real (kind=dbl_kind) :: & grid_o, grid_o_t, l_sk, initbio_frac, & - frazil_scav, grid_oS, l_skS, & - phi_snow, & + frazil_scav, phi_snow, & ratio_Si2N_diatoms , ratio_Si2N_sp , ratio_Si2N_phaeo , & ratio_S2N_diatoms , ratio_S2N_sp , ratio_S2N_phaeo , & ratio_Fe2C_diatoms , ratio_Fe2C_sp , ratio_Fe2C_phaeo , & @@ -827,7 +832,7 @@ subroutine init_zbgc dEdd_algae_out=dEdd_algae, solve_zbgc_out=solve_zbgc, grid_o_t_out=grid_o_t, & bgc_flux_type_out=bgc_flux_type, grid_o_out=grid_o, l_sk_out=l_sk, & initbio_frac_out=initbio_frac, frazil_scav_out=frazil_scav, & - grid_oS_out=grid_oS, l_skS_out=l_skS, phi_snow_out=phi_snow, & + phi_snow_out=phi_snow, & algal_vel_out=algal_vel, R_dFe2dust_out=R_dFe2dust, & dustFe_sol_out=dustFe_sol, T_max_out=T_max, fsal_out=fsal, & op_dep_min_out=op_dep_min, fr_graze_s_out=fr_graze_s, & @@ -835,7 +840,7 @@ subroutine init_zbgc fr_dFe_out=fr_dFe, k_nitrif_out=k_nitrif, t_iron_conv_out=t_iron_conv, & max_loss_out=max_loss, max_dfe_doc1_out=max_dfe_doc1, fr_resp_out=fr_resp, & fr_resp_s_out=fr_resp_s, y_sk_DMS_out=y_sk_DMS, t_sk_conv_out=t_sk_conv, & - t_sk_ox_out=t_sk_ox, modal_aero_out=modal_aero, solve_zsal_out = solve_zsal) + t_sk_ox_out=t_sk_ox, modal_aero_out=modal_aero) call icepack_warnings_flush(nu_diag) if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, & file=__FILE__, line=__LINE__) @@ -1178,7 +1183,7 @@ subroutine init_zbgc dEdd_algae_in=dEdd_algae, solve_zbgc_in=solve_zbgc, grid_o_t_in=grid_o_t, & bgc_flux_type_in=bgc_flux_type, grid_o_in=grid_o, l_sk_in=l_sk, & initbio_frac_in=initbio_frac, frazil_scav_in=frazil_scav, & - grid_oS_in=grid_oS, l_skS_in=l_skS, phi_snow_in=phi_snow, & + phi_snow_in=phi_snow, & algal_vel_in=algal_vel, R_dFe2dust_in=R_dFe2dust, & dustFe_sol_in=dustFe_sol, T_max_in=T_max, fsal_in=fsal, & op_dep_min_in=op_dep_min, fr_graze_s_in=fr_graze_s, & @@ -1186,7 +1191,7 @@ subroutine init_zbgc fr_dFe_in=fr_dFe, k_nitrif_in=k_nitrif, t_iron_conv_in=t_iron_conv, & max_loss_in=max_loss, max_dfe_doc1_in=max_dfe_doc1, fr_resp_in=fr_resp, & fr_resp_s_in=fr_resp_s, y_sk_DMS_in=y_sk_DMS, t_sk_conv_in=t_sk_conv, & - t_sk_ox_in=t_sk_ox, modal_aero_in=modal_aero, solve_zsal_in = solve_zsal) + t_sk_ox_in=t_sk_ox, modal_aero_in=modal_aero) call icepack_warnings_flush(nu_diag) if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, & file=__FILE__, line=__LINE__) diff --git a/configuration/scripts/icepack_in b/configuration/scripts/icepack_in index a3fc6d259..f46b329c1 100644 --- a/configuration/scripts/icepack_in +++ b/configuration/scripts/icepack_in @@ -166,7 +166,6 @@ solve_zbgc = .false. bgc_flux_type = 'Jin2006' scale_bgc = .false. - solve_zsal = .false. tr_bgc_Nit = .false. tr_bgc_C = .false. tr_bgc_chl = .false. @@ -180,8 +179,6 @@ grid_o = 0.006 grid_o_t = 0.006 l_sk = 2.0 - grid_oS = 0.0 - l_skS = 0.028 phi_snow = -1.0 initbio_frac = 1.0 frazil_scav = 0.8 diff --git a/doc/source/science_guide/sg_bgc.rst b/doc/source/science_guide/sg_bgc.rst index b38b27135..04db1f88e 100755 --- a/doc/source/science_guide/sg_bgc.rst +++ b/doc/source/science_guide/sg_bgc.rst @@ -456,12 +456,6 @@ flags in **icepack\_in** must be true: a) ``tr_brine``, b) ``z_tracers``, and c) This is appropriate for the black carbon and dust aerosols specified by ``tr_zaero`` true. -.. zsalinity is being deprecated -.. In addition, a halodynamics scheme must also be used. The default -.. thermo-halodynamics is mushy layer ``ktherm`` set to 2. An alternative uses -.. the Bitz and Lipscomb thermodynamics ``ktherm`` set to 1 and ``solve_zsal`` -.. true (referred to as "zsalinity"). - With the above flags and ``tr_bgc_Nit`` set to true, the default biochemistry is a simple algal-nitrate system: ``tr_bgc_N`` (turned on by default) and ``tr_bgc_Nit`` (required). Options exist in **icepack\_in** to use a more complicated ecosystem which includes up diff --git a/doc/source/user_guide/interfaces.include b/doc/source/user_guide/interfaces.include index b28eff1a7..7c0772082 100644 --- a/doc/source/user_guide/interfaces.include +++ b/doc/source/user_guide/interfaces.include @@ -100,32 +100,6 @@ icepack_init_hbrine -.. _icepack_init_zsalinity: - -icepack_init_zsalinity -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. code-block:: fortran - - ! **DEPRECATED**, all code removed - ! Interface provided for backwards compatibility - - subroutine icepack_init_zsalinity(Rayleigh_criteria, & - Rayleigh_real, trcrn_bgc, sss) - - logical (kind=log_kind), intent(inout) :: & - Rayleigh_criteria - - real (kind=dbl_kind), intent(inout):: & - Rayleigh_real - - real (kind=dbl_kind), intent(in):: & - sss - - real (kind=dbl_kind), dimension(:,:), intent(inout):: & - trcrn_bgc ! bgc subset of trcrn - - - icepack_fsd.F90 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -279,7 +253,6 @@ icepack_intfc.F90 use icepack_shortwave, only: icepack_step_radiation use icepack_brine, only: icepack_init_hbrine - use icepack_brine, only: icepack_init_zsalinity ! deprecated use icepack_zbgc , only: icepack_init_bgc use icepack_zbgc , only: icepack_init_zbgc @@ -489,7 +462,7 @@ icepack_step_ridge dvirdgndt, & araftn, vraftn, & aice, fsalt, & - first_ice, fzsal, & + first_ice, & flux_bio, closing, & Tf, & docleanup, dorebin) @@ -531,9 +504,6 @@ icepack_step_ridge fsalt , & ! salt flux to ocean (kg/m^2/s) fhocn ! net heat flux to ocean (W/m^2) - real (kind=dbl_kind), intent(inout), optional :: & - fzsal ! zsalinity flux to ocean(kg/m^2/s) (deprecated) - real (kind=dbl_kind), intent(inout), optional :: & closing ! rate of closing due to divergence/shear (1/s) @@ -809,12 +779,11 @@ icepack_init_parameters iceruf_in, Cf_in, Pstar_in, Cstar_in, kappav_in, & kice_in, ksno_in, & zref_in, hs_min_in, snowpatch_in, rhosi_in, sk_l_in, & - saltmax_in, phi_init_in, min_salin_in, salt_loss_in, & - Tliquidus_max_in, & + saltmax_in, phi_init_in, min_salin_in, Tliquidus_max_in, & min_bgc_in, dSin0_frazil_in, hi_ssl_in, hs_ssl_in, hs_ssl_min_in, & awtvdr_in, awtidr_in, awtvdf_in, awtidf_in, & qqqice_in, TTTice_in, qqqocn_in, TTTocn_in, & - ktherm_in, conduct_in, fbot_xfer_type_in, calc_Tsfc_in, dts_b_in, & + ktherm_in, conduct_in, fbot_xfer_type_in, calc_Tsfc_in, & update_ocn_f_in, ustar_min_in, hi_min_in, a_rapid_mode_in, & cpl_frazil_in, & Rac_rapid_mode_in, aspect_rapid_mode_in, & @@ -831,8 +800,7 @@ icepack_init_parameters dpscale_in, rfracmin_in, rfracmax_in, pndaspect_in, hs1_in, hp1_in, & bgc_flux_type_in, z_tracers_in, scale_bgc_in, solve_zbgc_in, & modal_aero_in, use_macromolecules_in, restartbgc_in, skl_bgc_in, & - solve_zsal_in, grid_o_in, l_sk_in, & - initbio_frac_in, grid_oS_in, l_skS_in, dEdd_algae_in, & + grid_o_in, l_sk_in, initbio_frac_in, dEdd_algae_in, & phi_snow_in, T_max_in, fsal_in, use_atm_dust_iron_in, & fr_resp_in, algal_vel_in, R_dFe2dust_in, dustFe_sol_in, & op_dep_min_in, fr_graze_s_in, fr_graze_e_in, fr_mort2min_in, & @@ -932,7 +900,6 @@ icepack_init_parameters saltmax_in, & ! max salinity at ice base for BL99 (ppt) phi_init_in, & ! initial liquid fraction of frazil min_salin_in, & ! threshold for brine pocket treatment - salt_loss_in, & ! fraction of salt retained in zsalinity Tliquidus_max_in, & ! maximum liquidus temperature of mush (C) dSin0_frazil_in ! bulk salinity reduction of newly formed frazil @@ -954,7 +921,6 @@ icepack_init_parameters update_ocn_f_in ! include fresh water and salt fluxes for frazil real (kind=dbl_kind), intent(in), optional :: & - dts_b_in, & ! zsalinity timestep hi_min_in, & ! minimum ice thickness allowed (m) for thermo ustar_min_in ! minimum friction velocity for ice-ocean heat flux @@ -1139,20 +1105,15 @@ icepack_init_parameters conserv_check_in ! if .true., run conservation checks and abort if checks fail logical (kind=log_kind), intent(in), optional :: & - skl_bgc_in, & ! if true, solve skeletal biochemistry - solve_zsal_in ! if true, update salinity profile from solve_S_dt + skl_bgc_in ! if true, solve skeletal biochemistry real (kind=dbl_kind), intent(in), optional :: & grid_o_in , & ! for bottom flux - l_sk_in , & ! characteristic diffusive scale (zsalinity) (m) + l_sk_in , & ! characteristic diffusive scale (m) grid_o_t_in , & ! top grid point length scale initbio_frac_in, & ! fraction of ocean tracer concentration used to initialize tracer phi_snow_in ! snow porosity at the ice/snow interface - real (kind=dbl_kind), intent(in), optional :: & - grid_oS_in , & ! for bottom flux (zsalinity) - l_skS_in ! 0.02 characteristic skeletal layer thickness (m) (zsalinity) - real (kind=dbl_kind), intent(in), optional :: & ratio_Si2N_diatoms_in, & ! algal Si to N (mol/mol) ratio_Si2N_sp_in , & @@ -1368,13 +1329,12 @@ icepack_query_parameters iceruf_out, Cf_out, Pstar_out, Cstar_out, kappav_out, & kice_out, ksno_out, & zref_out, hs_min_out, snowpatch_out, rhosi_out, sk_l_out, & - saltmax_out, phi_init_out, min_salin_out, salt_loss_out, & - Tliquidus_max_out, & + saltmax_out, phi_init_out, min_salin_out, Tliquidus_max_out, & min_bgc_out, dSin0_frazil_out, hi_ssl_out, hs_ssl_out, hs_ssl_min_out, & awtvdr_out, awtidr_out, awtvdf_out, awtidf_out, cpl_frazil_out, & qqqice_out, TTTice_out, qqqocn_out, TTTocn_out, update_ocn_f_out, & Lfresh_out, cprho_out, Cp_out, ustar_min_out, hi_min_out, a_rapid_mode_out, & - ktherm_out, conduct_out, fbot_xfer_type_out, calc_Tsfc_out, dts_b_out, & + ktherm_out, conduct_out, fbot_xfer_type_out, calc_Tsfc_out, & Rac_rapid_mode_out, aspect_rapid_mode_out, dSdt_slow_mode_out, & phi_c_slow_mode_out, phi_i_mushy_out, shortwave_out, & albedo_type_out, albicev_out, albicei_out, albsnowv_out, & @@ -1389,8 +1349,7 @@ icepack_query_parameters dpscale_out, rfracmin_out, rfracmax_out, pndaspect_out, hs1_out, hp1_out, & bgc_flux_type_out, z_tracers_out, scale_bgc_out, solve_zbgc_out, & modal_aero_out, use_macromolecules_out, restartbgc_out, use_atm_dust_iron_out, & - skl_bgc_out, solve_zsal_out, grid_o_out, l_sk_out, & - initbio_frac_out, grid_oS_out, l_skS_out, & + skl_bgc_out, grid_o_out, l_sk_out, initbio_frac_out, & phi_snow_out, conserv_check_out, & fr_resp_out, algal_vel_out, R_dFe2dust_out, dustFe_sol_out, & T_max_out, fsal_out, op_dep_min_out, fr_graze_s_out, fr_graze_e_out, & @@ -1498,7 +1457,6 @@ icepack_query_parameters saltmax_out, & ! max salinity at ice base for BL99 (ppt) phi_init_out, & ! initial liquid fraction of frazil min_salin_out, & ! threshold for brine pocket treatment - salt_loss_out, & ! fraction of salt retained in zsalinity Tliquidus_max_out, & ! maximum liquidus temperature of mush (C) dSin0_frazil_out ! bulk salinity reduction of newly formed frazil @@ -1520,7 +1478,6 @@ icepack_query_parameters update_ocn_f_out ! include fresh water and salt fluxes for frazil real (kind=dbl_kind), intent(out), optional :: & - dts_b_out, & ! zsalinity timestep hi_min_out, & ! minimum ice thickness allowed (m) for thermo ustar_min_out ! minimum friction velocity for ice-ocean heat flux @@ -1707,20 +1664,15 @@ icepack_query_parameters conserv_check_out ! if .true., run conservation checks and abort if checks fail logical (kind=log_kind), intent(out), optional :: & - skl_bgc_out, & ! if true, solve skeletal biochemistry - solve_zsal_out ! if true, update salinity profile from solve_S_dt + skl_bgc_out ! if true, solve skeletal biochemistry real (kind=dbl_kind), intent(out), optional :: & grid_o_out , & ! for bottom flux - l_sk_out , & ! characteristic diffusive scale (zsalinity) (m) + l_sk_out , & ! characteristic diffusive scale (m) grid_o_t_out , & ! top grid point length scale initbio_frac_out, & ! fraction of ocean tracer concentration used to initialize tracer phi_snow_out ! snow porosity at the ice/snow interface - real (kind=dbl_kind), intent(out), optional :: & - grid_oS_out , & ! for bottom flux (zsalinity) - l_skS_out ! 0.02 characteristic skeletal layer thickness (m) (zsalinity) - real (kind=dbl_kind), intent(out), optional :: & ratio_Si2N_diatoms_out, & ! algal Si to N (mol/mol) ratio_Si2N_sp_out , & @@ -2253,7 +2205,7 @@ icepack_step_therm2 fresh, fsalt, & fhocn, update_ocn_f, & faero_ocn, & - first_ice, fzsal, & + first_ice, & flux_bio, ocean_bio, & frazil_diag, & frz_onset, yday, & @@ -2308,9 +2260,6 @@ icepack_step_therm2 frazil , & ! frazil ice growth (m/step-->cm/day) frazil_diag ! frazil ice growth diagnostic (m/step-->cm/day) - real (kind=dbl_kind), intent(inout), optional :: & - fzsal ! salt flux to ocean from zsalinity (kg/m^2/s) (deprecated) - real (kind=dbl_kind), intent(in), optional :: & wlat ! lateral melt rate (m/s) @@ -2733,7 +2682,7 @@ icepack_step_therm1 Tsfc , & ! ice/snow surface temperature, Tsfcn alvl , & ! level ice area fraction vlvl , & ! level ice volume fraction - apnd , & ! melt pond area fraction + apnd , & ! melt pond area fraction tracer hpnd , & ! melt pond depth (m) ipnd , & ! melt pond refrozen lid thickness (m) iage , & ! volume-weighted ice age @@ -2913,7 +2862,7 @@ icepack_init_tracer_indices nlt_bgc_DOC_in, nlt_bgc_DON_in, nlt_bgc_DIC_in, nlt_bgc_Fed_in, & nlt_bgc_Fep_in, nlt_bgc_Nit_in, nlt_bgc_Am_in, nlt_bgc_Sil_in, & nlt_bgc_DMSPp_in, nlt_bgc_DMSPd_in, nlt_bgc_DMS_in, nlt_bgc_hum_in, & - nlt_bgc_PON_in, nt_zbgc_frac_in, nt_bgc_S_in, nlt_chl_sw_in, & + nlt_bgc_PON_in, nt_zbgc_frac_in, nlt_chl_sw_in, & nlt_zaero_sw_in, & bio_index_o_in, bio_index_in) @@ -2955,7 +2904,6 @@ icepack_init_tracer_indices nlt_bgc_hum_in,& ! nlt_bgc_PON_in,& ! zooplankton and detritus nt_zbgc_frac_in,&! fraction of tracer in the mobile phase - nt_bgc_S_in, & ! (deprecated, was related to zsalinity) nlt_chl_sw_in ! points to total chla in trcrn_sw integer (kind=int_kind), dimension(:), intent(in), optional :: & @@ -3017,7 +2965,7 @@ icepack_query_tracer_indices nlt_bgc_DOC_out, nlt_bgc_DON_out, nlt_bgc_DIC_out, nlt_bgc_Fed_out, & nlt_bgc_Fep_out, nlt_bgc_Nit_out, nlt_bgc_Am_out, nlt_bgc_Sil_out, & nlt_bgc_DMSPp_out, nlt_bgc_DMSPd_out, nlt_bgc_DMS_out, nlt_bgc_hum_out, & - nlt_bgc_PON_out, nt_zbgc_frac_out, nt_bgc_S_out, nlt_chl_sw_out, & + nlt_bgc_PON_out, nt_zbgc_frac_out, nlt_chl_sw_out, & nlt_zaero_sw_out, & bio_index_o_out, bio_index_out) @@ -3059,7 +3007,6 @@ icepack_query_tracer_indices nlt_bgc_hum_out,& ! nlt_bgc_PON_out,& ! zooplankton and detritus nt_zbgc_frac_out,&! fraction of tracer in the mobile phase - nt_bgc_S_out, & ! (deprecated, was related to zsalinity) nlt_chl_sw_out ! points to total chla in trcrn_sw integer (kind=int_kind), dimension(:), intent(out), optional :: & @@ -3228,7 +3175,7 @@ icepack_compute_tracers trcr_base, n_trcr_strata, & nt_strata, trcrn, Tf) - integer (kind=int_kind), dimension (ntrcr), intent(in) :: & + integer (kind=int_kind), dimension (:), intent(in) :: & trcr_depend, & ! = 0 for aicen tracers, 1 for vicen, 2 for vsnon n_trcr_strata ! number of underlying tracer layers @@ -3247,7 +3194,7 @@ icepack_compute_tracers vicen , & ! volume per unit area of ice (m) vsnon ! volume per unit area of snow (m) - real (kind=dbl_kind), dimension (ntrcr), intent(out) :: & + real (kind=dbl_kind), dimension (:), intent(out) :: & trcrn ! ice tracers real (kind=dbl_kind), intent(in) :: & diff --git a/doc/source/user_guide/lg_sequence.rst b/doc/source/user_guide/lg_sequence.rst index 04a72269c..1d58229cb 100755 --- a/doc/source/user_guide/lg_sequence.rst +++ b/doc/source/user_guide/lg_sequence.rst @@ -126,7 +126,6 @@ computation and a routine to update the radiation computation:: icepack_brine addresses brine computations:: use icepack_brine, only: icepack_init_hbrine - use icepack_brine, only: icepack_init_zsalinity ! DEPRECATED icepack_zbgc contains several public interfaces to support initialization and computation for the skeletal layer bgc and zbgc options:: diff --git a/doc/source/user_guide/ug_case_settings.rst b/doc/source/user_guide/ug_case_settings.rst index 4f862708a..9a66baef6 100644 --- a/doc/source/user_guide/ug_case_settings.rst +++ b/doc/source/user_guide/ug_case_settings.rst @@ -97,7 +97,6 @@ can be modified as needed. "NTRAERO", "integer", "number of aerosol tracers", "1" "NTRISO", "integer", "number of water isotope tracers", "1" "TRBRI", "0,1", "brine height tracer", "0" - "TRZS", "", "DEPRECATED", "" "TRBGCS", "0,1", "skeletal layer tracer, needs TRBGCZ=0", "0" "TRBGCZ", "0,1", "zbgc tracers, needs TRBGCS=0 and TRBRI=1", "0" "NBGCLYR", "integer", "number of zbgc layers", "1" @@ -464,7 +463,6 @@ zbgc_nml "``f_exude_l``", "real", "fraction of exudation to DOC lipids", "1.0" "``f_exude_s``", "real", "fraction of exudation to DOC saccharids", "1.0" "``grid_o``", "real", "z biology length scale for bottom flux (m)", "0.006" - "``grid_oS``", "real", "DEPRECATED", "" "``grow_Tdep_diatoms``", "real", "temperature dependence growth diatoms per degC", "0.063" "``grow_Tdep_phaeo``", "real", "temperature dependence growth phaeocystis per degC", "0.063" "``grow_Tdep_sp``", "real", "temperature dependence growth small plankton per degC", "0.063" @@ -490,7 +488,6 @@ zbgc_nml "``K_Sil_sp``", "real", "silicate half saturation small plankton mmol/m^3", "0.0" "``kn_bac_protein``", "real", "bacterial degradation of DON per day", "0.2" "``l_sk``", "real", "characteristic diffusive scale in m", "2.0" - "``l_skS``", "real", "DEPRECATED", "" "``max_dfe_doc1``", "real", "max ratio of dFe to saccharides in the ice in nm Fe / muM C", "0.2" "``max_loss``", "real", "restrict uptake to percent of remaining value", "0.9" "``modal_aero``", "logical", "modal aerosols", "``.false.``" @@ -534,7 +531,6 @@ zbgc_nml "``silicatetype``", "real", "mobility type between stationary and mobile silicate", "-1.0" "``skl_bgc``", "logical", "DEPRECATED: skeletal layer biogeochemistry", "``.false.``" "``solve_zbgc``", "logical", "solve z-biogeochemistry reactions", "``.false.``" - "``solve_zsal``", "logical", "DEPRECATED", "``.false.``" "``tau_max``", "real", "long time mobile to stationary exchanges (s)", "604800.0" "``tau_min``", "real", "rapid module to stationary exchanges (s)", "3600.0" "``tr_bgc_Am``", "logical", "ammonium tracer", "``.false.``" From dc769c7e319701b1dc51b69771d8fe272e4e4799 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Tue, 13 May 2025 17:53:08 -0600 Subject: [PATCH 09/34] Update institutions in distribution policy document and authors in zenodo template (#522) DistributionPolicy.pdf was updated to include institutions that have joined the CICE Consortium since its inception. The zenodo template was updated with authors included in the most recent release and links back to github for more detailed information. --- .zenodo.json | 11 ++++++++++- DistributionPolicy.pdf | Bin 38188 -> 70403 bytes 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/.zenodo.json b/.zenodo.json index 06d7e588d..0e25c9102 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -1,6 +1,6 @@ { "license": "other-open", - "description": "No description provided", + "description": "View detailed release notes at https://github.com/CICE-Consortium/Icepack/releases", "language": "eng", "title": "CICE-Consortium/Icepack: Icepack m.n.p", "keywords": [ @@ -75,10 +75,18 @@ "affiliation": "Danish Meteorological Institute", "name": "Mads Ribergaard" }, + { + "affiliation": "Alfred-Wegener-Institut Helmholz-Zentrum fur Polar- und Meersforschung", + "name": "Lettie Roach" + }, { "affiliation": "Los Alamos National Laboratory", "name": "Andrew Roberts" }, + { + "affiliation": "Australian Earth-System Simulator", + "name": "Anton Steketee" + }, { "affiliation": "Los Alamos National Laboratory", "name": "Matthew Turner" @@ -89,6 +97,7 @@ } ], "access_right": "open", + "repository_url": "https://github.com/CICE-Consortium/Icepack", "related_identifiers": [ { "identifier": "https://github.com/CICE-Consortium/Icepack/tree/Icepack1.0.0", diff --git a/DistributionPolicy.pdf b/DistributionPolicy.pdf index 014c8881542c701db612d8fdd2f6ce9c93d3538c..cb8c17ac81a53cdaf9897f114ee1bb1d367e30b3 100644 GIT binary patch literal 70403 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 fr1)`|8f`Y&(G&CY|qA33d-+2_} literal 38188 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 From 65926463a9f597ad50e951ac9d6623ef4453e535 Mon Sep 17 00:00:00 2001 From: Tony Craig Date: Mon, 19 May 2025 08:58:52 -0700 Subject: [PATCH 10/34] Update set_version_number.csh to update .zenodo.json file (#523) Update set_version_number.csh to update .zenodo.json file from the command line via ./icepack.setup --setvers x.y.z --- configuration/scripts/set_version_number.csh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/configuration/scripts/set_version_number.csh b/configuration/scripts/set_version_number.csh index 3c7274339..a31cb2ecd 100755 --- a/configuration/scripts/set_version_number.csh +++ b/configuration/scripts/set_version_number.csh @@ -10,6 +10,7 @@ if ( $#argv > 1 ) then endif set versno = $1 +set cdate = `date +%Y-%m-%d` #echo "$0 versno = $versno" cp -f doc/source/conf.py doc/source/conf.py.bu @@ -17,6 +18,12 @@ cp -f doc/source/conf.py doc/source/conf.py.bu sed -i 's|^.*version.*=.*$|version = u'"'"${versno}"'"' | g' doc/source/conf.py sed -i 's|^.*release.*=.*$|version = u'"'"${versno}"'"' | g' doc/source/conf.py +cp -f .zenodo.json .zenodo.json.bu + +sed -i 's|^\(.*CICE-Consortium/Icepack:\).*$|\1 Icepack '${versno}'", | g' .zenodo.json +sed -i 's|^\(.*"version":\).*$|\1 "'${versno}'", | g' .zenodo.json +sed -i 's|^\(.*"publication_date":\).*$|\1 "'${cdate}'", | g' .zenodo.json + echo "ICEPACK ${versno}" >! columnphysics/version.txt echo "$0 completed successfully" From cfdf8cc9cb73d54d5627714cb35717be4c4eb67b Mon Sep 17 00:00:00 2001 From: Tony Craig Date: Thu, 22 May 2025 09:48:53 -0700 Subject: [PATCH 11/34] Update Copyright and License, update version to 1.5.1 (#524) Update Copyright and License consistent with latest changes in CICE, includes updates in source code where needed. In preparation for release, update version number, remove trailing space. --- .zenodo.json | 6 ++-- COPYRIGHT.pdf | Bin 0 -> 53225 bytes LICENSE.pdf | Bin 60894 -> 59625 bytes columnphysics/icepack_intfc.F90 | 22 ++++++------ columnphysics/icepack_therm_vertical.F90 | 2 +- columnphysics/version.txt | 2 +- configuration/driver/icedrv_MAIN.F90 | 22 ++++++------ configuration/driver/icedrv_forcing.F90 | 8 ++--- doc/source/conf.py | 6 ++-- doc/source/intro/copyright.rst | 36 +++----------------- doc/source/user_guide/ug_implementation.rst | 3 ++ 11 files changed, 41 insertions(+), 66 deletions(-) create mode 100644 COPYRIGHT.pdf diff --git a/.zenodo.json b/.zenodo.json index 0e25c9102..b5ce8eaf1 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -2,18 +2,18 @@ "license": "other-open", "description": "View detailed release notes at https://github.com/CICE-Consortium/Icepack/releases", "language": "eng", - "title": "CICE-Consortium/Icepack: Icepack m.n.p", + "title": "CICE-Consortium/Icepack: Icepack 1.5.1", "keywords": [ "sea ice model, Icepack" ], - "version": "m.n.p", + "version": "1.5.1", "upload_type": "software", "communities": [ { "identifier": "cice-consortium" } ], - "publication_date": "2019-06-20", + "publication_date": "2025-05-21", "creators": [ { "affiliation": "Los Alamos National Laboratory", diff --git a/COPYRIGHT.pdf b/COPYRIGHT.pdf new file mode 100644 index 0000000000000000000000000000000000000000..55132ca5e9ade12f27491a5fb238239bc75b5fc3 GIT binary patch literal 53225 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 Date: Fri, 30 May 2025 01:17:02 +1000 Subject: [PATCH 12/34] Use proleptic gregorian in icepack (#525) This sets the calendar attribute correctly in history output. This update's any notes or other calendar references to support "proleptic_gregorian" as well as "gregorian" for calendar type. Use of the calendar_type variable was also removed where it wasn't needed in the driver. The correct cf-name for the calendar used is "proleptic_gregorian" but backward compatibility is maintained with the calendar name "gregorian". This is a companion PR to Setting calendar attribute in output to proleptic_gregorian CICE#1024. --- columnphysics/icepack_orbital.F90 | 5 +- columnphysics/icepack_shortwave.F90 | 4 +- configuration/driver/icedrv_calendar.F90 | 7 --- configuration/driver/icedrv_forcing.F90 | 8 +-- configuration/driver/icedrv_history.F90 | 6 ++- configuration/scripts/icepack.batch.csh | 25 ++++++++++ .../scripts/machines/Macros.gadi_intel | 50 +++++++++++++++++++ configuration/scripts/machines/env.gadi_intel | 32 ++++++++++++ 8 files changed, 118 insertions(+), 19 deletions(-) create mode 100644 configuration/scripts/machines/Macros.gadi_intel create mode 100644 configuration/scripts/machines/env.gadi_intel diff --git a/columnphysics/icepack_orbital.F90 b/columnphysics/icepack_orbital.F90 index a6a2bf406..8ebc0f235 100644 --- a/columnphysics/icepack_orbital.F90 +++ b/columnphysics/icepack_orbital.F90 @@ -172,7 +172,7 @@ subroutine compute_coszen (tlat, tlon, & nextsw_cday ! julian day of next shortwave calculation character (len=char_len), intent(in), optional :: & - calendar_type ! differentiates Gregorian from other calendars + calendar_type ! differentiates proleptic_gregorian from other calendars ! local variables @@ -196,7 +196,8 @@ subroutine compute_coszen (tlat, tlon, & endif endif - if (calendar_type == "GREGORIAN") then + if (calendar_type == "GREGORIAN" .or. & + calendar_type == "proleptic_gregorian") then ydayp1 = min(nextsw_cday, real(days_per_year,kind=dbl_kind)) else ydayp1 = nextsw_cday diff --git a/columnphysics/icepack_shortwave.F90 b/columnphysics/icepack_shortwave.F90 index 7a3e5a4e5..6f97c77aa 100644 --- a/columnphysics/icepack_shortwave.F90 +++ b/columnphysics/icepack_shortwave.F90 @@ -882,7 +882,7 @@ subroutine run_dEdd(dt, & yday ! day of the year character (len=char_len), intent(in), optional :: & - calendar_type ! differentiates Gregorian from other calendars + calendar_type ! differentiates proleptic_gregorian from other calendars integer (kind=int_kind), intent(in), optional :: & days_per_year ! number of days in one year @@ -3755,7 +3755,7 @@ subroutine icepack_step_radiation (dt, & yday ! day of the year character (len=char_len), intent(in), optional :: & - calendar_type ! differentiates Gregorian from other calendars + calendar_type ! differentiates proleptic_gregorian from other calendars integer (kind=int_kind), intent(in), optional :: & days_per_year ! number of days in one year diff --git a/configuration/driver/icedrv_calendar.F90 b/configuration/driver/icedrv_calendar.F90 index d2cab40a9..e5e02678e 100644 --- a/configuration/driver/icedrv_calendar.F90 +++ b/configuration/driver/icedrv_calendar.F90 @@ -93,10 +93,6 @@ module icedrv_calendar character (len=1), public :: & dumpfreq ! restart frequency, 'y','m','d' - character (len=char_len), public :: & - calendar_type ! differentiates Gregorian from other calendars - ! default = ' ' - !======================================================================= contains @@ -144,9 +140,6 @@ subroutine init_calendar ' because use_leap_years = .true.' end if - calendar_type = ' ' - if (use_leap_years .and. days_per_year == 365) calendar_type = 'Gregorian' - dayyr = real(days_per_year, kind=dbl_kind) if (days_per_year == 360) then daymo = daymo360 diff --git a/configuration/driver/icedrv_forcing.F90 b/configuration/driver/icedrv_forcing.F90 index ce264c707..202dc5c6e 100644 --- a/configuration/driver/icedrv_forcing.F90 +++ b/configuration/driver/icedrv_forcing.F90 @@ -1066,9 +1066,7 @@ subroutine atm_MDF real (kind=dbl_kind), allocatable :: & data(:) ! data array from file - character (char_len) :: & - calendar_type, & ! data calendar type - varname + character (char_len) :: varname character (char_len_long) :: & filename, & @@ -1566,9 +1564,7 @@ subroutine ocn_MDF real (kind=dbl_kind), allocatable :: & data(:) ! data array from file - character (char_len) :: & - calendar_type, & ! data calendar type - varname + character (char_len) :: varname character (char_len_long) :: & filename, & diff --git a/configuration/driver/icedrv_history.F90 b/configuration/driver/icedrv_history.F90 index 049566b7b..e7d3d98e9 100644 --- a/configuration/driver/icedrv_history.F90 +++ b/configuration/driver/icedrv_history.F90 @@ -176,8 +176,10 @@ subroutine history_write() status = nf90_put_att(ncid,varid,'calendar','NoLeap') if (status /= nf90_noerr) call icedrv_system_abort(string=subname//' ERROR: put_att calendar noleap') elseif (use_leap_years) then - status = nf90_put_att(ncid,varid,'calendar','Gregorian') - if (status /= nf90_noerr) call icedrv_system_abort(string=subname//' ERROR: put_att calendar gregorian') + status = nf90_put_att(ncid,varid,'calendar','proleptic_gregorian') + if (status /= nf90_noerr) then + call icedrv_system_abort(string=subname//' ERROR: put_att calendar proleptic_gregorian') + endif else call icedrv_system_abort(string=subname//' ERROR: invalid calendar settings') endif diff --git a/configuration/scripts/icepack.batch.csh b/configuration/scripts/icepack.batch.csh index 8a077969d..3dec1584f 100755 --- a/configuration/scripts/icepack.batch.csh +++ b/configuration/scripts/icepack.batch.csh @@ -64,6 +64,31 @@ cat >> ${jobfile} << EOFB ###PBS -m be EOFB +else if (${ICE_MACHINE} =~ gadi*) then +if (${ICE_MACHINE_QUEUE} =~ *sr) then #sapphire rapids + @ memuse = ( $ncores * 481 / 100 ) +else if (${ICE_MACHINE_QUEUE} =~ *bw) then #broadwell + @ memuse = ( $ncores * 457 / 100 ) +else if (${ICE_MACHINE_QUEUE} =~ *sl) then + @ memuse = ( $ncores * 6 ) +else #normal queues + @ memuse = ( $ncores * 395 / 100 ) +endif +cat >> ${jobfile} << EOFB +#PBS -q ${ICE_MACHINE_QUEUE} +#PBS -P ${ICE_MACHINE_PROJ} +#PBS -N ${ICE_CASENAME} +#PBS -l storage=gdata/${ICE_MACHINE_PROJ}+scratch/${ICE_MACHINE_PROJ}+gdata/ik11 +#PBS -l ncpus=${ncores} +#PBS -l mem=${memuse}gb +#PBS -l walltime=${ICE_RUNLENGTH} +#PBS -j oe +#PBS -W umask=003 +#PBS -o ${ICE_CASEDIR} +source /etc/profile.d/modules.csh +module use `echo ${MODULEPATH} | sed 's/:/ /g'` #copy the users modules +EOFB + else if (${ICE_MACHINE} =~ casper*) then cat >> ${jobfile} << EOFB #PBS -q ${ICE_MACHINE_QUEUE} diff --git a/configuration/scripts/machines/Macros.gadi_intel b/configuration/scripts/machines/Macros.gadi_intel new file mode 100644 index 000000000..13593fc77 --- /dev/null +++ b/configuration/scripts/machines/Macros.gadi_intel @@ -0,0 +1,50 @@ +#============================================================================== +# Makefile macros for NCI Gadi, intel compiler +#============================================================================== + +CPP := fpp +CPPDEFS := -DFORTRANUNDERSCORE -DREPRODUCIBLE ${ICE_CPPDEFS} +CFLAGS := -c -O2 -fp-model precise -Wno-unused-variable -Wno-unused-parameter + +FIXEDFLAGS := -132 +FREEFLAGS := -FR + +NCI_INTEL_FLAGS := -r8 -i4 -traceback -w -fpe0 -ftz -convert big_endian -assume byterecl -check noarg_temp_created +NCI_REPRO_FLAGS := -fp-model precise -fp-model source -align all + +ifeq ($(ICE_BLDDEBUG), true) + NCI_DEBUG_FLAGS := -g3 -O0 -debug all -check all -no-vec -assume nobuffered_io + FFLAGS := $(NCI_INTEL_FLAGS) $(NCI_REPRO_FLAGS) $(NCI_DEBUG_FLAGS) + CPPDEFS := $(CPPDEFS) -DDEBUG=$(DEBUG) +else + NCI_OPTIM_FLAGS := -g3 -O2 -axCORE-AVX2 -debug all -check none -qopt-report=5 -qopt-report-annotate -assume buffered_io + FFLAGS := $(NCI_INTEL_FLAGS) $(NCI_REPRO_FLAGS) $(NCI_OPTIM_FLAGS) +endif + +SCC := icx +SFC := ifort +MPICC := mpicc +MPIFC := mpifort + +ifeq ($(ICE_COMMDIR), mpi) + FC := $(MPIFC) + CC := $(MPICC) +else + FC := $(SFC) + CC := $(SCC) +endif +LD:= $(FC) + +SLIBS := $(SLIBS) +INCLDIR := $(INCLDIR) + +# if spack modules loaded, use them. otherwise use system modules +ifndef SPACK_NETCDF_FORTRAN_ROOT + SLIBS += -L$(NETCDF)/lib -lnetcdf -lnetcdff + INCLDIR += -I$(NETCDF)/include +else + SLIBS += -L$(SPACK_NETCDF_C_ROOT)/lib64 -lnetcdf + SLIBS += -L$(SPACK_NETCDF_FORTRAN_ROOT)/lib -lnetcdff + INCLDIR += -I$(SPACK_NETCDF_C_ROOT)/include + INCLDIR += -I$(SPACK_NETCDF_FORTRAN_ROOT)/include +endif diff --git a/configuration/scripts/machines/env.gadi_intel b/configuration/scripts/machines/env.gadi_intel new file mode 100644 index 000000000..59a70949d --- /dev/null +++ b/configuration/scripts/machines/env.gadi_intel @@ -0,0 +1,32 @@ +#!/bin/csh -f + +set inp = "undefined" +if ($#argv == 1) then + set inp = $1 +endif + +if ("$inp" != "-nomodules") then + + source /etc/profile.d/modules.csh + + module load intel-compiler + module load netcdf + +endif + +setenv ICE_MACHINE_MACHNAME gadi +setenv ICE_MACHINE_MACHINFO "Intel Xeon Scalable" +setenv ICE_MACHINE_ENVNAME intel +setenv ICE_MACHINE_ENVINFO INTEL_COMPILER_VERSION=$INTEL_COMPILER_VERSION +setenv ICE_MACHINE_MAKE gmake +setenv ICE_MACHINE_WKDIR /scratch/$PROJECT/$USER/ICEPACK_RUNS +setenv ICE_MACHINE_INPUTDATA /g/data/ik11/inputs/CICE_data/icepack-dirs/input +setenv ICE_MACHINE_BASELINE /scratch/$PROJECT/$USER/ICEPACK_BASELINE +setenv ICE_MACHINE_SUBMIT "qsub" +setenv ICE_MACHINE_PROJ $PROJECT +setenv ICE_MACHINE_ACCT $USER +setenv ICE_MACHINE_QUEUE "normal" +setenv ICE_MACHINE_TPNODE 48 +setenv ICE_MACHINE_BLDTHRDS 4 +setenv ICE_MACHINE_QSTAT "qstat" +setenv ICE_CPPDEFS -DUSE_NETCDF \ No newline at end of file From ac57a1c48af2447f3c1cbdb86b751f788603aac7 Mon Sep 17 00:00:00 2001 From: Tony Craig Date: Fri, 20 Jun 2025 12:43:31 -0700 Subject: [PATCH 13/34] Add GEOS coupling capability including heatflux and massflux modifications (#518) Add GEOS coupling updates. This allows coupling to the GEOS coupled system where a semi-implicit thermodynamic coupling scheme is introduced. Similar to the explicit case, the fields fsurfn are provided by the coupler, along with their derivatives with respect to surface temperature dfsurfn_dTs. In this case, calc_Tsfc is still set to true, allowing ice surface and internal temperature to be updated implicitly. The resultant surface temperature change is passed back to the atmosphere model via coupler to complete the full update of its temperature profiles. This middle-ground approach, enabled by semi_implicit_Tsfc=true, does not sacrifice accuracy because it does not need limiting effective conductivity as in the explicit case. In addition, in GEOS, the atmosphere model assumes vapor deposits or sublimates at 0 degC. In this case, mass conservation is enforced and the resulting discrepancy in energy is resolved by another term, de_vapor, and passed to ocean. This option is only on when vapor_flux_correction is true. Add 4 new shortwave terms, uvrdr, uvrdf, pardr, pardf to the coupling. These terms represent a breakdown of the direct and diffuse visible shortwave terms into two components, par = photosynthetical active radiation (400-700nm) and uvr = rest of the visible shortwave term (>700nm). The current visible shortwave is exactly represented by these two components. Includes adding atm forcing and terms associated with radiation passthru to the ocean. Add support for GEOS semi-implicit coupling of surface temperature. In GEOS, surface and latent heat flux is computed in the atmosphere at 0degC. The sea ice model has to respect that calculation, but then computes the d(dh)/dTs terms to correct the heatflux for the sea ice temperature which is then applied conservatively in the coupled system. Implementation includes turning off some of the heat flux calculations in Icepack. This is controlled by the semi_implicit_Tsfc namelist. Add check to not allow semi_implicit_Tsfc with tr_pond_topo. Add calculation of a vapor flux correction. A correction is needed for GEOS coupling to compute a mass and enthalpy correction for evaporation and sublimation. This is controlled by the vapor_flux_correction namelist. Rename sblx to de_vapor Update treatment of rain coupling for GEOS, include rain in fresh water coupling flux. This will require modifications to the coupling system in GEOS, in particular, the partitioning of rain between sea ice and ocean. Update discover port Update documentation --------- Co-authored-by: bzhao --- columnphysics/icepack_flux.F90 | 21 ++ columnphysics/icepack_parameters.F90 | 20 +- columnphysics/icepack_shortwave.F90 | 232 ++++++++++++++++-- columnphysics/icepack_therm_bl99.F90 | 70 ++++-- columnphysics/icepack_therm_itd.F90 | 2 +- columnphysics/icepack_therm_mushy.F90 | 75 ++++-- columnphysics/icepack_therm_shared.F90 | 8 + columnphysics/icepack_therm_vertical.F90 | 129 +++++++++- configuration/driver/icedrv_init.F90 | 18 +- configuration/scripts/icepack_in | 4 +- .../scripts/machines/env.discover_intel | 2 +- doc/source/icepack_index.rst | 10 +- .../science_guide/sg_boundary_forcing.rst | 12 +- doc/source/science_guide/sg_thermo.rst | 7 +- doc/source/user_guide/ug_case_settings.rst | 2 + 15 files changed, 528 insertions(+), 84 deletions(-) diff --git a/columnphysics/icepack_flux.F90 b/columnphysics/icepack_flux.F90 index 27a9f0f80..0c60616ad 100644 --- a/columnphysics/icepack_flux.F90 +++ b/columnphysics/icepack_flux.F90 @@ -43,6 +43,8 @@ subroutine merge_fluxes (aicen, & fhocnn, fswthrun, & fswthrun_vdr, fswthrun_vdf,& fswthrun_idr, fswthrun_idf,& + fswthrun_uvrdr, fswthrun_uvrdf,& + fswthrun_pardr, fswthrun_pardf,& strairxT, strairyT, & Cdn_atm_ratio, & fsurf, fcondtop, & @@ -56,6 +58,8 @@ subroutine merge_fluxes (aicen, & fhocn, fswthru, & fswthru_vdr, fswthru_vdf,& fswthru_idr, fswthru_idf,& + fswthru_uvrdr, fswthru_uvrdf,& + fswthru_pardr, fswthru_pardf,& melttn, meltsn, meltbn, congeln, snoicen, & meltt, melts, & meltb, dsnow, dsnown,& @@ -102,6 +106,10 @@ subroutine merge_fluxes (aicen, & fswthrun_vdf, & ! vis dif sw radiation through ice bot (W/m**2) fswthrun_idr, & ! nir dir sw radiation through ice bot (W/m**2) fswthrun_idf, & ! nir dif sw radiation through ice bot (W/m**2) + fswthrun_uvrdr, & ! > 700nm vis uvr dir sw radiation through ice bot (W/m**2) + fswthrun_uvrdf, & ! > 700nm vis uvr dif sw radiation through ice bot (W/m**2) + fswthrun_pardr, & ! 400-700nm vis par dir sw radiation through ice bot (W/m**2) + fswthrun_pardf, & ! 400-700nm vis par dif sw radiation through ice bot (W/m**2) Urefn ! air speed reference level (m/s) ! cumulative fluxes @@ -135,6 +143,10 @@ subroutine merge_fluxes (aicen, & fswthru_vdf, & ! vis dif sw radiation through ice bot (W/m**2) fswthru_idr, & ! nir dir sw radiation through ice bot (W/m**2) fswthru_idf, & ! nir dif sw radiation through ice bot (W/m**2) + fswthru_uvrdr, & ! > 700nm vis uvr dir sw radiation through ice bot (W/m**2) + fswthru_uvrdf, & ! > 700nm vis uvr dif sw radiation through ice bot (W/m**2) + fswthru_pardr, & ! 400-700nm vis par dir sw radiation through ice bot (W/m**2) + fswthru_pardf, & ! 400-700nm vis par dif sw radiation through ice bot (W/m**2) dsnow, & ! change in snow depth (m) Uref ! air speed reference level (m/s) @@ -228,6 +240,15 @@ subroutine merge_fluxes (aicen, & if (present(fswthrun_idf) .and. present(fswthru_idf)) & fswthru_idf = fswthru_idf + fswthrun_idf * aicen + if (present(fswthrun_uvrdr) .and. present(fswthru_uvrdr)) & + fswthru_uvrdr = fswthru_uvrdr + fswthrun_uvrdr * aicen + if (present(fswthrun_uvrdf) .and. present(fswthru_uvrdf)) & + fswthru_uvrdf = fswthru_uvrdf + fswthrun_uvrdf * aicen + if (present(fswthrun_pardr) .and. present(fswthru_pardr)) & + fswthru_pardr = fswthru_pardr + fswthrun_pardr * aicen + if (present(fswthrun_pardf) .and. present(fswthru_pardf)) & + fswthru_pardf = fswthru_pardf + fswthrun_pardf * aicen + ! ice/snow thickness if (present(melttn) .and. present(meltt)) & diff --git a/columnphysics/icepack_parameters.F90 b/columnphysics/icepack_parameters.F90 index 2c4c1b399..cc4fcca9b 100644 --- a/columnphysics/icepack_parameters.F90 +++ b/columnphysics/icepack_parameters.F90 @@ -153,6 +153,8 @@ module icepack_parameters calc_Tsfc = .true. ,&! if true, calculate surface temperature ! if false, Tsfc is computed elsewhere and ! atmos-ice fluxes are provided to CICE + semi_implicit_Tsfc = .false. ,&! surface temperature coupling option + vapor_flux_correction = .false. ,&! compute mass/enthalpy correction for evaporation/sublimation update_ocn_f = .false. ,&! include fresh water and salt fluxes for frazil modal_aero = .false. ,&! if true, use modal aerosal optical properties ! only for use with tr_aero or tr_zaero @@ -556,7 +558,7 @@ subroutine icepack_init_parameters( & qqqice_in, TTTice_in, qqqocn_in, TTTocn_in, & ktherm_in, conduct_in, fbot_xfer_type_in, calc_Tsfc_in, & update_ocn_f_in, ustar_min_in, hi_min_in, a_rapid_mode_in, & - cpl_frazil_in, & + cpl_frazil_in, semi_implicit_Tsfc_in, vapor_flux_correction_in, & Rac_rapid_mode_in, aspect_rapid_mode_in, & dSdt_slow_mode_in, phi_c_slow_mode_in, & phi_i_mushy_in, shortwave_in, albedo_type_in, albsnowi_in, & @@ -689,6 +691,9 @@ subroutine icepack_init_parameters( & calc_Tsfc_in , &! if true, calculate surface temperature ! if false, Tsfc is computed elsewhere and ! atmos-ice fluxes are provided to CICE + semi_implicit_Tsfc_in , &! compute dfsurf/dT, dflat/dT terms instead of fsurf, flat + vapor_flux_correction_in, &! compute mass/enthalpy correction when evaporation/sublimation + ! computed outside at 0C update_ocn_f_in ! include fresh water and salt fluxes for frazil real (kind=dbl_kind), intent(in), optional :: & @@ -1151,6 +1156,8 @@ subroutine icepack_init_parameters( & if (present(conduct_in) ) conduct = conduct_in if (present(fbot_xfer_type_in) ) fbot_xfer_type = fbot_xfer_type_in if (present(calc_Tsfc_in) ) calc_Tsfc = calc_Tsfc_in + if (present(semi_implicit_Tsfc_in)) semi_implicit_Tsfc= semi_implicit_Tsfc_in + if (present(vapor_flux_correction_in)) vapor_flux_correction= vapor_flux_correction_in if (present(cpl_frazil_in) ) cpl_frazil = cpl_frazil_in if (present(update_ocn_f_in) ) update_ocn_f = update_ocn_f_in if (present(ustar_min_in) ) ustar_min = ustar_min_in @@ -1549,8 +1556,8 @@ subroutine icepack_query_parameters( & Lfresh_out, cprho_out, Cp_out, ustar_min_out, hi_min_out, a_rapid_mode_out, & ktherm_out, conduct_out, fbot_xfer_type_out, calc_Tsfc_out, & Rac_rapid_mode_out, aspect_rapid_mode_out, dSdt_slow_mode_out, & - phi_c_slow_mode_out, phi_i_mushy_out, shortwave_out, & - albedo_type_out, albicev_out, albicei_out, albsnowv_out, & + phi_c_slow_mode_out, phi_i_mushy_out, shortwave_out, semi_implicit_Tsfc_out, & + albedo_type_out, albicev_out, albicei_out, albsnowv_out, vapor_flux_correction_out, & albsnowi_out, ahmax_out, R_ice_out, R_pnd_out, R_snw_out, dT_mlt_out, & rsnw_mlt_out, dEdd_algae_out, & kalg_out, R_gC2molC_out, kstrength_out, krdg_partic_out, krdg_redist_out, mu_rdg_out, & @@ -1688,6 +1695,9 @@ subroutine icepack_query_parameters( & calc_Tsfc_out ,&! if true, calculate surface temperature ! if false, Tsfc is computed elsewhere and ! atmos-ice fluxes are provided to CICE + semi_implicit_Tsfc_out ,&! compute dfsurf/dT, dflat/dT terms instead of fsurf, flat + vapor_flux_correction_out ,&! compute mass/enthalpy correction when evaporation/sublimation + ! computed outside at 0C update_ocn_f_out ! include fresh water and salt fluxes for frazil real (kind=dbl_kind), intent(out), optional :: & @@ -2184,6 +2194,8 @@ subroutine icepack_query_parameters( & if (present(conduct_out) ) conduct_out = conduct if (present(fbot_xfer_type_out) ) fbot_xfer_type_out = fbot_xfer_type if (present(calc_Tsfc_out) ) calc_Tsfc_out = calc_Tsfc + if (present(semi_implicit_Tsfc_out)) semi_implicit_Tsfc_out= semi_implicit_Tsfc + if (present(vapor_flux_correction_out)) vapor_flux_correction_out= vapor_flux_correction if (present(cpl_frazil_out) ) cpl_frazil_out = cpl_frazil if (present(update_ocn_f_out) ) update_ocn_f_out = update_ocn_f if (present(ustar_min_out) ) ustar_min_out = ustar_min @@ -2489,6 +2501,8 @@ subroutine icepack_write_parameters(iounit) write(iounit,*) " conduct = ", trim(conduct) write(iounit,*) " fbot_xfer_type = ", trim(fbot_xfer_type) write(iounit,*) " calc_Tsfc = ", calc_Tsfc + write(iounit,*) " semi_implicit_Tsfc = ", semi_implicit_Tsfc + write(iounit,*) " vapor_flux_correction = ", vapor_flux_correction write(iounit,*) " cpl_frazil = ", cpl_frazil write(iounit,*) " update_ocn_f = ", update_ocn_f write(iounit,*) " ustar_min = ", ustar_min diff --git a/columnphysics/icepack_shortwave.F90 b/columnphysics/icepack_shortwave.F90 index 6f97c77aa..863d3799e 100644 --- a/columnphysics/icepack_shortwave.F90 +++ b/columnphysics/icepack_shortwave.F90 @@ -51,7 +51,7 @@ module icepack_shortwave use icepack_parameters, only: z_tracers, skl_bgc, calc_tsfc, shortwave, kalg use icepack_parameters, only: R_ice, R_pnd, R_snw, dT_mlt, rsnw_mlt, hs0, hs1, hp1 use icepack_parameters, only: pndaspect, albedo_type, albicev, albicei, albsnowv, albsnowi, ahmax - use icepack_parameters, only: snw_ssp_table, modal_aero + use icepack_parameters, only: snw_ssp_table, modal_aero, semi_implicit_Tsfc use icepack_parameters, only: dEdd_algae use icepack_tracers, only: ncat, nilyr, nslyr, nblyr @@ -223,11 +223,17 @@ subroutine shortwave_ccsm3 (aicen, vicen, & alvdrn, alidrn, & alvdfn, alidfn, & fswsfc, fswint, & + swuvrdr, swuvrdf, & + swpardr, swpardf, & fswthrun, & fswthrun_vdr, & fswthrun_vdf, & fswthrun_idr, & fswthrun_idf, & + fswthrun_uvrdr, & + fswthrun_uvrdf, & + fswthrun_pardr, & + fswthrun_pardf, & fswpenl, & Iswabs, SSwabs, & albin, albsn, & @@ -245,6 +251,12 @@ subroutine shortwave_ccsm3 (aicen, vicen, & swidr , & ! sw down, near IR, direct (W/m^2) swidf ! sw down, near IR, diffuse (W/m^2) + real (kind=dbl_kind), intent(in), optional :: & + swuvrdr , & ! sw down, vis uvr dir (W/m^2) + swuvrdf , & ! sw down, vis uvr dif (W/m^2) + swpardr , & ! sw down, vis par dir (W/m^2) + swpardf ! sw down, vis par dif (W/m^2) + ! baseline albedos for ccsm3 shortwave, set in namelist real (kind=dbl_kind), intent(in) :: & albicev , & ! visible ice albedo for h > ahmax @@ -271,7 +283,11 @@ subroutine shortwave_ccsm3 (aicen, vicen, & fswthrun_vdr, & ! vis dir SW through ice to ocean (W m-2) fswthrun_vdf, & ! vis dif SW through ice to ocean (W m-2) fswthrun_idr, & ! nir dir SW through ice to ocean (W m-2) - fswthrun_idf ! nir dif SW through ice to ocean (W m-2) + fswthrun_idf, & ! nir dif SW through ice to ocean (W m-2) + fswthrun_uvrdr,&! vis dir uvr SW through ice to ocean (W m-2) + fswthrun_uvrdf,&! vis dif uvr SW through ice to ocean (W m-2) + fswthrun_pardr,&! vis dir par SW through ice to ocean (W m-2) + fswthrun_pardf ! vis dif par SW through ice to ocean (W m-2) real (kind=dbl_kind), intent(inout) :: & coszen ! cosine(zenith angle) @@ -303,8 +319,11 @@ subroutine shortwave_ccsm3 (aicen, vicen, & l_fswthru_vdr, & ! vis dir SW through ice to ocean (W m-2) l_fswthru_vdf, & ! vis dif SW through ice to ocean (W m-2) l_fswthru_idr, & ! nir dir SW through ice to ocean (W m-2) - l_fswthru_idf ! nir dif SW through ice to ocean (W m-2) - + l_fswthru_idf, & ! nir dif SW through ice to ocean (W m-2) + l_fswthru_uvrdr,&! vis uvr dir SW through ice to ocean (W m-2) + l_fswthru_uvrdf,&! vis uvr dif SW through ice to ocean (W m-2) + l_fswthru_pardr,&! vis par dir SW through ice to ocean (W m-2) + l_fswthru_pardf ! vis par dif SW through ice to ocean (W m-2) character(len=*),parameter :: subname='(shortwave_ccsm3)' !----------------------------------------------------------------- @@ -407,6 +426,10 @@ subroutine shortwave_ccsm3 (aicen, vicen, & alidrni, alidfni, & alvdrns, alvdfns, & alidrns, alidfns, & + swuvrdr=swuvrdr, & + swuvrdf=swuvrdf, & + swpardr=swpardr, & + swpardf=swpardf, & fswsfc=fswsfc(n), & fswint=fswint(n), & fswthru=fswthrun(n), & @@ -414,6 +437,10 @@ subroutine shortwave_ccsm3 (aicen, vicen, & fswthru_vdf=l_fswthru_vdf, & fswthru_idr=l_fswthru_idr, & fswthru_idf=l_fswthru_idf, & + fswthru_uvrdr=l_fswthru_uvrdr,& + fswthru_uvrdf=l_fswthru_uvrdf,& + fswthru_pardr=l_fswthru_pardr,& + fswthru_pardf=l_fswthru_pardf,& fswpenl=fswpenl(:,n), & Iswabs=Iswabs(:,n)) @@ -423,6 +450,10 @@ subroutine shortwave_ccsm3 (aicen, vicen, & if (present(fswthrun_vdf)) fswthrun_vdf(n) = l_fswthru_vdf if (present(fswthrun_idr)) fswthrun_idr(n) = l_fswthru_idr if (present(fswthrun_idf)) fswthrun_idf(n) = l_fswthru_idf + if (present(fswthrun_uvrdr)) fswthrun_uvrdr(n) = l_fswthru_uvrdr + if (present(fswthrun_uvrdf)) fswthrun_uvrdf(n) = l_fswthru_uvrdf + if (present(fswthrun_pardr)) fswthrun_pardr(n) = l_fswthru_pardr + if (present(fswthrun_pardf)) fswthrun_pardf(n) = l_fswthru_pardf endif ! aicen > puny @@ -677,12 +708,18 @@ subroutine absorbed_solar (aicen, & alidrni, alidfni, & alvdrns, alvdfns, & alidrns, alidfns, & + swuvrdr, swuvrdf, & + swpardr, swpardf, & fswsfc, fswint, & fswthru, & fswthru_vdr, & fswthru_vdf, & fswthru_idr, & fswthru_idf, & + fswthru_uvrdr, & + fswthru_uvrdf, & + fswthru_pardr, & + fswthru_pardf, & fswpenl, & Iswabs) @@ -703,6 +740,12 @@ subroutine absorbed_solar (aicen, & alvdfns , & ! visible, diffuse albedo, snow alidfns ! near-ir, diffuse albedo, snow + real (kind=dbl_kind), intent(in), optional :: & + swuvrdr , & ! sw down, vis uvr dir (W/m^2) + swuvrdf , & ! sw down, vis uvr dif (W/m^2) + swpardr , & ! sw down, vis par dir (W/m^2) + swpardf ! sw down, vis par dif (W/m^2) + real (kind=dbl_kind), intent(out):: & fswsfc , & ! SW absorbed at ice/snow surface (W m-2) fswint , & ! SW absorbed in ice interior, below surface (W m-2) @@ -712,7 +755,11 @@ subroutine absorbed_solar (aicen, & fswthru_vdr , & ! vis dir SW through ice to ocean (W m-2) fswthru_vdf , & ! vis dif SW through ice to ocean (W m-2) fswthru_idr , & ! nir dir SW through ice to ocean (W m-2) - fswthru_idf ! nir dif SW through ice to ocean (W m-2) + fswthru_idf , & ! nir dif SW through ice to ocean (W m-2) + fswthru_uvrdr, & ! vis dir uvr SW through ice to ocean (W m-2) + fswthru_uvrdf, & ! vis dif uvr SW through ice to ocean (W m-2) + fswthru_pardr, & ! vis dir par SW through ice to ocean (W m-2) + fswthru_pardf ! vis dif par SW through ice to ocean (W m-2) real (kind=dbl_kind), dimension (:), intent(out) :: & Iswabs , & ! SW absorbed in particular layer (W m-2) @@ -742,6 +789,12 @@ subroutine absorbed_solar (aicen, & hilyr , & ! ice layer thickness asnow ! fractional area of snow cover + real (kind=dbl_kind) :: & + swuvrdrpen , & ! penetrating SW, vis uvr dir (W/m^2) + swuvrdfpen , & ! penetrating SW, vis uvr dif (W/m^2) + swpardrpen , & ! penetrating SW, vis par dir (W/m^2) + swpardfpen ! penetrating SW, vis par dif (W/m^2) + character(len=*),parameter :: subname='(absorbed_solar)' !----------------------------------------------------------------- @@ -750,6 +803,10 @@ subroutine absorbed_solar (aicen, & trantop = c0 tranbot = c0 + swuvrdrpen = c0 + swuvrdfpen = c0 + swpardrpen = c0 + swpardfpen = c0 hs = vsnon / aicen @@ -789,6 +846,11 @@ subroutine absorbed_solar (aicen, & ! fswpenidr = swidr * (c1-alidrni) * (c1-asnow) * i0nir ! fswpenidf = swidf * (c1-alidfni) * (c1-asnow) * i0nir + if (present(swuvrdr)) swuvrdrpen = swuvrdr * (c1-alvdrni) * (c1-asnow) * i0vis + if (present(swuvrdf)) swuvrdfpen = swuvrdf * (c1-alvdfni) * (c1-asnow) * i0vis + if (present(swpardr)) swpardrpen = swpardr * (c1-alvdrni) * (c1-asnow) * i0vis + if (present(swpardf)) swpardfpen = swpardf * (c1-alvdfni) * (c1-asnow) * i0vis + fswpen = fswpenvdr + fswpenvdf fswsfc = swabs - fswpen @@ -825,6 +887,10 @@ subroutine absorbed_solar (aicen, & fswthru_vdf = fswpenvdf * tranbot fswthru_idr = c0 fswthru_idf = c0 + fswthru_uvrdr = swuvrdrpen * tranbot + fswthru_uvrdf = swuvrdfpen * tranbot + fswthru_pardr = swpardrpen * tranbot + fswthru_pardf = swpardfpen * tranbot ! SW absorbed in ice interior fswint = fswpen - fswthru @@ -860,11 +926,17 @@ subroutine run_dEdd(dt, & alvdrn, alvdfn, & alidrn, alidfn, & fswsfcn, fswintn, & + swuvrdr, swuvrdf, & + swpardr, swpardf, & fswthrun, & fswthrun_vdr, & fswthrun_vdf, & fswthrun_idr, & fswthrun_idf, & + fswthrun_uvrdr, & + fswthrun_uvrdf, & + fswthrun_pardr, & + fswthrun_pardf, & fswpenln, & Sswabsn, Iswabsn, & albicen, albsnon, & @@ -900,6 +972,12 @@ subroutine run_dEdd(dt, & swidf, & ! sw down, near IR, diffuse (W/m^2) fsnow ! snowfall rate (kg/m^2 s) + real (kind=dbl_kind), intent(in), optional :: & + swuvrdr, & ! sw down, vis uvr dir (W/m^2) + swuvrdf, & ! sw down, vis uvr dif (W/m^2) + swpardr, & ! sw down, vis par dir (W/m^2) + swpardf ! sw down, vis par dif (W/m^2) + real(kind=dbl_kind), dimension(:), intent(in) :: & aicen, & ! concentration of ice vicen, & ! volume per unit area of ice (m) @@ -939,7 +1017,11 @@ subroutine run_dEdd(dt, & fswthrun_vdr, & ! vis dir SW through ice to ocean (W/m^2) fswthrun_vdf, & ! vis dif SW through ice to ocean (W/m^2) fswthrun_idr, & ! nir dir SW through ice to ocean (W/m^2) - fswthrun_idf ! nir dif SW through ice to ocean (W/m^2) + fswthrun_idf, & ! nir dif SW through ice to ocean (W/m^2) + fswthrun_uvrdr,&! uvr dir SW through ice to ocean (W/m^2) + fswthrun_uvrdf,&! uvr dif SW through ice to ocean (W/m^2) + fswthrun_pardr,&! par dir SW through ice to ocean (W/m^2) + fswthrun_pardf ! par dif SW through ice to ocean (W/m^2) real(kind=dbl_kind), dimension(:,:), intent(inout) :: & Sswabsn , & ! SW radiation absorbed in snow layers (W m-2) @@ -993,7 +1075,11 @@ subroutine run_dEdd(dt, & l_fswthru_vdr , & ! vis dir SW through ice to ocean (W m-2) l_fswthru_vdf , & ! vis dif SW through ice to ocean (W m-2) l_fswthru_idr , & ! nir dir SW through ice to ocean (W m-2) - l_fswthru_idf ! nir dif SW through ice to ocean (W m-2) + l_fswthru_idf , & ! nir dif SW through ice to ocean (W m-2) + l_fswthru_uvrdr, & ! vis uvr dir SW through ice to ocean (W m-2) + l_fswthru_uvrdf, & ! vis uvr dif SW through ice to ocean (W m-2) + l_fswthru_pardr, & ! vis par dir SW through ice to ocean (W m-2) + l_fswthru_pardf ! vis par dif SW through ice to ocean (W m-2) logical (kind=log_kind) :: & l_initonly ! local initonly value @@ -1015,7 +1101,9 @@ subroutine run_dEdd(dt, & call compute_coszen (TLAT, TLON, yday, sec, coszen, & days_per_year, nextsw_cday, calendar_type) #else - call compute_coszen (TLAT, TLON, yday, sec, coszen) + if (.not.semi_implicit_Tsfc) then ! geos sets solar angles in driver level + call compute_coszen (TLAT, TLON, yday, sec, coszen) + endif #endif if (icepack_warnings_aborted(subname)) return @@ -1176,11 +1264,19 @@ subroutine run_dEdd(dt, & alvdrn(n), alvdfn(n), & alidrn(n), alidfn(n), & fswsfcn(n), fswintn(n), & + swuvrdr=swuvrdr, & + swuvrdf=swuvrdf, & + swpardr=swpardr, & + swpardf=swpardf, & fswthru=fswthrun(n), & fswthru_vdr=l_fswthru_vdr, & fswthru_vdf=l_fswthru_vdf, & fswthru_idr=l_fswthru_idr, & fswthru_idf=l_fswthru_idf, & + fswthru_uvrdr=l_fswthru_uvrdr, & + fswthru_uvrdf=l_fswthru_uvrdf, & + fswthru_pardr=l_fswthru_pardr, & + fswthru_pardf=l_fswthru_pardf, & Sswabs=Sswabsn(:,n), & Iswabs=Iswabsn(:,n), & albice=albicen(n), & @@ -1196,6 +1292,10 @@ subroutine run_dEdd(dt, & if(present(fswthrun_vdf)) fswthrun_vdf(n) = l_fswthru_vdf if(present(fswthrun_idr)) fswthrun_idr(n) = l_fswthru_idr if(present(fswthrun_idf)) fswthrun_idf(n) = l_fswthru_idf + if(present(fswthrun_uvrdr)) fswthrun_uvrdr(n) = l_fswthru_uvrdr + if(present(fswthrun_uvrdf)) fswthrun_uvrdf(n) = l_fswthru_uvrdf + if(present(fswthrun_pardr)) fswthrun_pardr(n) = l_fswthru_pardr + if(present(fswthrun_pardf)) fswthrun_pardf(n) = l_fswthru_pardf if (present(rsnow) .and. .not. snwgrain) then do k = 1,nslyr @@ -1248,11 +1348,17 @@ subroutine shortwave_dEdd (coszen, & alvdr, alvdf, & alidr, alidf, & fswsfc, fswint, & + swuvrdr, swuvrdf, & + swpardr, swpardf, & fswthru, & fswthru_vdr, & fswthru_vdf, & fswthru_idr, & fswthru_idf, & + fswthru_uvrdr, & + fswthru_uvrdf, & + fswthru_pardr, & + fswthru_pardf, & Sswabs, & Iswabs, albice, & albsno, albpnd, & @@ -1279,6 +1385,12 @@ subroutine shortwave_dEdd (coszen, & swidr , & ! sw down, near IR, direct (W/m^2) swidf ! sw down, near IR, diffuse (W/m^2) + real (kind=dbl_kind), intent(in), optional :: & + swuvrdr , & ! sw down, vis uvr dir (W/m^2) + swuvrdf , & ! sw down, vis uvr dif (W/m^2) + swpardr , & ! sw down, vis par dir (W/m^2) + swpardf ! sw down, vis par dif (W/m^2) + real (kind=dbl_kind), intent(inout) :: & coszen , & ! cosine of solar zenith angle alvdr , & ! visible, direct, albedo (fraction) @@ -1293,7 +1405,11 @@ subroutine shortwave_dEdd (coszen, & fswthru_vdr , & ! vis dir SW through snow/bare ice/ponded ice into ocean (W m-2) fswthru_vdf , & ! vis dif SW through snow/bare ice/ponded ice into ocean (W m-2) fswthru_idr , & ! nir dir SW through snow/bare ice/ponded ice into ocean (W m-2) - fswthru_idf ! nir dif SW through snow/bare ice/ponded ice into ocean (W m-2) + fswthru_idf , & ! nir dif SW through snow/bare ice/ponded ice into ocean (W m-2) + fswthru_uvrdr,& ! vis uvr dir sw radiation through ice bot (GEOS) (W/m**2) + fswthru_uvrdf,& ! vis uvr dif sw radiation through ice bot (GEOS) (W/m**2) + fswthru_pardr,& ! vis par dir sw radiation through ice bot (GEOS) (W/m**2) + fswthru_pardf ! vis par dif sw radiation through ice bot (GEOS) (W/m**2) real (kind=dbl_kind), dimension (:), intent(inout) :: & fswpenl , & ! visible SW entering ice layers (W m-2) @@ -1372,6 +1488,10 @@ subroutine shortwave_dEdd (coszen, & fswthru_vdf = c0 fswthru_idr = c0 fswthru_idf = c0 + fswthru_uvrdr = c0 + fswthru_uvrdf = c0 + fswthru_pardr = c0 + fswthru_pardf = c0 ! compute fraction of nir down direct to total over all points: fnidr = c0 if( swidr + swidf > puny ) then @@ -1430,7 +1550,10 @@ subroutine shortwave_dEdd (coszen, & aidrl, aidfl, fswsfc, fswint, fswthru, & fswthru_vdr, fswthru_vdf, & fswthru_idr, fswthru_idf, & - Sswabs, Iswabs, fswpenl ) + fswthru_uvrdr, fswthru_uvrdf, & + fswthru_pardr, fswthru_pardf, & + Sswabs, Iswabs, fswpenl, & + swuvrdr,swuvrdf, swpardr,swpardf) if (icepack_warnings_aborted(subname)) return alvdr = alvdr + avdrl*fi @@ -1474,7 +1597,10 @@ subroutine shortwave_dEdd (coszen, & aidrl, aidfl, fswsfc, fswint, fswthru, & fswthru_vdr, fswthru_vdf, & fswthru_idr, fswthru_idf, & - Sswabs, Iswabs, fswpenl ) + fswthru_uvrdr, fswthru_uvrdf, & + fswthru_pardr, fswthru_pardf, & + Sswabs, Iswabs, fswpenl, & + swuvrdr,swuvrdf, swpardr,swpardf) endif if (icepack_warnings_aborted(subname)) return @@ -1511,7 +1637,10 @@ subroutine shortwave_dEdd (coszen, & aidrl, aidfl, fswsfc, fswint, fswthru, & fswthru_vdr, fswthru_vdf, & fswthru_idr, fswthru_idf, & - Sswabs, Iswabs, fswpenl ) + fswthru_uvrdr, fswthru_uvrdf, & + fswthru_pardr, fswthru_pardf, & + Sswabs, Iswabs, fswpenl, & + swuvrdr,swuvrdf, swpardr,swpardf) if (icepack_warnings_aborted(subname)) return alvdr = alvdr + avdrl*fp @@ -1621,7 +1750,10 @@ subroutine compute_dEdd_3bd( & alidr, alidf, fswsfc, fswint, fswthru, & fswthru_vdr, fswthru_vdf, & fswthru_idr, fswthru_idf, & - Sswabs, Iswabs, fswpenl ) + fswthru_uvrdr, fswthru_uvrdf, & + fswthru_pardr, fswthru_pardf, & + Sswabs, Iswabs, fswpenl, & + swuvrdr,swuvrdf, swpardr,swpardf) integer (kind=int_kind), intent(in) :: & klev , & ! number of radiation layers - 1 @@ -1666,13 +1798,23 @@ subroutine compute_dEdd_3bd( & fswthru_vdr, & ! vis dir SW through snow/bare ice/ponded ice into ocean (W m-2) fswthru_vdf, & ! vis dif SW through snow/bare ice/ponded ice into ocean (W m-2) fswthru_idr, & ! nir dir SW through snow/bare ice/ponded ice into ocean (W m-2) - fswthru_idf ! nir dif SW through snow/bare ice/ponded ice into ocean (W m-2) + fswthru_idf, & ! nir dif SW through snow/bare ice/ponded ice into ocean (W m-2) + fswthru_uvrdr,&! vis uvr dir sw radiation through ice bot (GEOS) (W/m**2) + fswthru_uvrdf,&! vis uvr dif sw radiation through ice bot (GEOS) (W/m**2) + fswthru_pardr,&! vis par dir sw radiation through ice bot (GEOS) (W/m**2) + fswthru_pardf ! vis par dif sw radiation through ice bot (GEOS) (W/m**2) real (kind=dbl_kind), dimension (:), intent(inout) :: & fswpenl, & ! visible SW entering ice layers (W m-2) Sswabs , & ! SW absorbed in snow layer (W m-2) Iswabs ! SW absorbed in ice layer (W m-2) + real (kind=dbl_kind), intent(in), optional :: & + swuvrdr, & ! sw down, vis uvr dir (W/m^2) + swuvrdf, & ! sw down, vis uvr dif (W/m^2) + swpardr, & ! sw down, vis par dir (W/m^2) + swpardf ! sw down, vis par dif (W/m^2) + !----------------------------------------------------------------------- ! ! Set up optical property profiles, based on snow, sea ice and ponded @@ -1801,7 +1943,11 @@ subroutine compute_dEdd_3bd( & fthruvdr, & ! vis dir shortwave through snow/bare ice/ponded ice to ocean (W/m^2) fthruvdf, & ! vis dif shortwave through snow/bare ice/ponded ice to ocean (W/m^2) fthruidr, & ! nir dir shortwave through snow/bare ice/ponded ice to ocean (W/m^2) - fthruidf ! nir dif shortwave through snow/bare ice/ponded ice to ocean (W/m^2) + fthruidf, & ! nir dif shortwave through snow/bare ice/ponded ice to ocean (W/m^2) + fthruuvrdr,&! vis uvr dir shortwave through snow/bare ice/ponded ice to ocean (W/m^2) + fthruuvrdf,&! vis uvr dif shortwave through snow/bare ice/ponded ice to ocean (W/m^2) + fthrupardr,&! vis par dir shortwave through snow/bare ice/ponded ice to ocean (W/m^2) + fthrupardf ! vis par dif shortwave through snow/bare ice/ponded ice to ocean (W/m^2) real (kind=dbl_kind), dimension(nslyr) :: & Sabs ! shortwave absorbed in snow layer (W m-2) @@ -1983,6 +2129,10 @@ subroutine compute_dEdd_3bd( & fthruvdf = c0 fthruidr = c0 fthruidf = c0 + fthruuvrdr = c0 + fthruuvrdf = c0 + fthrupardr = c0 + fthrupardf = c0 ! spectral weights 2 (0.7-1.19 micro-meters) and 3 (1.19-5.0 micro-meters) ! are chosen based on 1D calculations using ratio of direct to total @@ -2712,6 +2862,10 @@ subroutine compute_dEdd_3bd( & fthru = fthru + tmp_kl fthruvdr = fthruvdr + dfdir(klevp)*swdr fthruvdf = fthruvdf + dfdif(klevp)*swdf + if (present(swuvrdr)) fthruuvrdr = dfdir(klevp)*swuvrdr + if (present(swuvrdf)) fthruuvrdf = dfdif(klevp)*swuvrdf + if (present(swpardr)) fthrupardr = dfdir(klevp)*swpardr + if (present(swpardf)) fthrupardf = dfdif(klevp)*swpardf ! if snow covered ice, set snow internal absorption; else, Sabs=0 if (srftyp == 1) then @@ -2829,6 +2983,10 @@ subroutine compute_dEdd_3bd( & fswthru_vdf = fswthru_vdf + fthruvdf*fi fswthru_idr = fswthru_idr + fthruidr*fi fswthru_idf = fswthru_idf + fthruidf*fi + fswthru_uvrdr = fswthru_uvrdr + fthruuvrdr*fi + fswthru_uvrdf = fswthru_uvrdf + fthruuvrdf*fi + fswthru_pardr = fswthru_pardr + fthrupardr*fi + fswthru_pardf = fswthru_pardf + fthrupardf*fi do k = 1, nslyr Sswabs(k) = Sswabs(k) + Sabs(k)*fi @@ -3720,6 +3878,8 @@ subroutine icepack_step_radiation (dt, & yday, sec, & swvdr, swvdf, & swidr, swidf, & + swuvrdr, swuvrdf, & + swpardr, swpardf, & coszen, fsnow, & alvdrn, alvdfn, & alidrn, alidfn, & @@ -3729,6 +3889,10 @@ subroutine icepack_step_radiation (dt, & fswthrun_vdf, & fswthrun_idr, & fswthrun_idf, & + fswthrun_uvrdr, & + fswthrun_uvrdf, & + fswthrun_pardr, & + fswthrun_pardf, & fswpenln, & Sswabsn, Iswabsn, & albicen, albsnon, & @@ -3748,6 +3912,12 @@ subroutine icepack_step_radiation (dt, & fsnow , & ! snowfall rate (kg/m^2 s) TLAT, TLON ! latitude and longitude (radian) + real (kind=dbl_kind), intent(in), optional :: & + swuvrdr , & ! sw down, vis uvr dir (W/m^2) + swuvrdf , & ! sw down, vis uvr dif (W/m^2) + swpardr , & ! sw down, vis par dir (W/m^2) + swpardf ! sw down, vis par dif (W/m^2) + integer (kind=int_kind), intent(in) :: & sec ! elapsed seconds into date @@ -3806,7 +3976,11 @@ subroutine icepack_step_radiation (dt, & fswthrun_vdr , & ! vis dir SW through ice to ocean (W/m^2) fswthrun_vdf , & ! vis dif SW through ice to ocean (W/m^2) fswthrun_idr , & ! nir dir SW through ice to ocean (W/m^2) - fswthrun_idf ! nir dif SW through ice to ocean (W/m^2) + fswthrun_idf , & ! nir dif SW through ice to ocean (W/m^2) + fswthrun_uvrdr,& ! vis uvr dir SW through ice to ocean (W/m^2) + fswthrun_uvrdf,& ! vis uvr dif SW through ice to ocean (W/m^2) + fswthrun_pardr,& ! vis par dir SW through ice to ocean (W/m^2) + fswthrun_pardf ! vis par dif SW through ice to ocean (W/m^2) real (kind=dbl_kind), dimension(:,:), intent(inout) :: & fswpenln , & ! visible SW entering ice layers (W m-2) @@ -3844,6 +4018,16 @@ subroutine icepack_step_radiation (dt, & call icepack_warnings_setabort(.true.,__FILE__,__LINE__) return endif + if (semi_implicit_Tsfc) then + if (.not.(present(swuvrdr) .and. present(swuvrdf) .and. & + present(swpardr) .and. present(swpardf) .and. & + present(fswthrun_uvrdr) .and. present(fswthrun_uvrdf) .and. & + present(fswthrun_pardr) .and. present(fswthrun_pardf))) then + call icepack_warnings_add(subname//' ERROR: semi_implicit_Tsfc=T, missing arguments') + call icepack_warnings_setabort(.true.,__FILE__,__LINE__) + return + endif + endif #ifdef CESMCOUPLED if (.not.present(days_per_year) .or. & .not.present(nextsw_cday) .or. & @@ -3912,11 +4096,19 @@ subroutine icepack_step_radiation (dt, & alvdrn, alvdfn, & alidrn, alidfn, & fswsfcn, fswintn, & + swuvrdr=swuvrdr, & + swuvrdf=swuvrdf, & + swpardr=swpardr, & + swpardf=swpardf, & fswthrun=fswthrun, & fswthrun_vdr=fswthrun_vdr, & fswthrun_vdf=fswthrun_vdf, & fswthrun_idr=fswthrun_idr, & fswthrun_idf=fswthrun_idf, & + fswthrun_uvrdr=fswthrun_uvrdr,& + fswthrun_uvrdf=fswthrun_uvrdf,& + fswthrun_pardr=fswthrun_pardr,& + fswthrun_pardf=fswthrun_pardf,& fswpenln=fswpenln, & Sswabsn=Sswabsn, & Iswabsn=Iswabsn, & @@ -3946,11 +4138,19 @@ subroutine icepack_step_radiation (dt, & alvdrn, alidrn, & alvdfn, alidfn, & fswsfcn, fswintn, & + swuvrdr=swuvrdr, & + swuvrdf=swuvrdf, & + swpardr=swpardr, & + swpardf=swpardf, & fswthrun=fswthrun, & fswthrun_vdr=fswthrun_vdr,& fswthrun_vdf=fswthrun_vdf,& fswthrun_idr=fswthrun_idr,& fswthrun_idf=fswthrun_idf,& + fswthrun_uvrdr=fswthrun_uvrdr,& + fswthrun_uvrdf=fswthrun_uvrdf,& + fswthrun_pardr=fswthrun_pardr,& + fswthrun_pardf=fswthrun_pardf,& fswpenl=fswpenln, & Iswabs=Iswabsn, & Sswabs=Sswabsn, & diff --git a/columnphysics/icepack_therm_bl99.F90 b/columnphysics/icepack_therm_bl99.F90 index 30c247ac7..f9485e32f 100644 --- a/columnphysics/icepack_therm_bl99.F90 +++ b/columnphysics/icepack_therm_bl99.F90 @@ -14,7 +14,7 @@ module icepack_therm_bl99 use icepack_kinds use icepack_parameters, only: c0, c1, c2, p1, p5, puny use icepack_parameters, only: rhoi, rhos, hs_min, cp_ice, cp_ocn, depressT, Lfresh, ksno, kice - use icepack_parameters, only: conduct, calc_Tsfc + use icepack_parameters, only: conduct, calc_Tsfc, semi_implicit_Tsfc use icepack_parameters, only: sw_redist, sw_frac, sw_dtemp use icepack_tracers, only: nilyr, nslyr use icepack_warnings, only: warnstr, icepack_warnings_add @@ -22,6 +22,8 @@ module icepack_therm_bl99 use icepack_therm_shared, only: ferrmax, l_brine use icepack_therm_shared, only: surface_heat_flux, dsurface_heat_flux_dTsf + use icepack_therm_shared, only: fsurf_cpl, flat_cpl, dfsurfdTs_cpl, dflatdTs_cpl + use icepack_therm_shared, only: fsurf_cpl0, flat_cpl0 implicit none @@ -211,6 +213,12 @@ subroutine temperature_changes (dt, & dflat_dT = c0 dflwout_dT = c0 einex = c0 + if (semi_implicit_Tsfc) then ! initialize + dfsurf_dT = dfsurfdTs_cpl + dflat_dT = dflatdTs_cpl + fsurfn = fsurf_cpl + flatn = flat_cpl + endif dt_rhoi_hlyr = dt / (rhoi*hilyr) ! hilyr > 0 if (hslyr > hs_min/real(nslyr,kind=dbl_kind)) & l_snow = .true. @@ -303,6 +311,10 @@ subroutine temperature_changes (dt, & endif + if (semi_implicit_Tsfc) then + fsurfn = fsurfn + fswsfc ! this is the total heat flux + endif + !----------------------------------------------------------------- ! Solve for new temperatures. ! Iterate until temperatures converge with minimal energy error. @@ -322,7 +334,7 @@ subroutine temperature_changes (dt, & !----------------------------------------------------------------- converged = .true. - dfsurf_dT = c0 + if (.not.semi_implicit_Tsfc) dfsurf_dT = c0 avg_Tsi = c0 enew = c0 einex = c0 @@ -353,21 +365,23 @@ subroutine temperature_changes (dt, & ! with respect to Tsf. !----------------------------------------------------------------- - ! surface heat flux - call surface_heat_flux(Tsf , fswsfc, & - rhoa , flw , & - potT , Qa , & - shcoef , lhcoef, & - flwoutn, fsensn, & - flatn , fsurfn) - if (icepack_warnings_aborted(subname)) return - - ! derivative of heat flux with respect to surface temperature - call dsurface_heat_flux_dTsf(Tsf , rhoa , & - shcoef , lhcoef , & - dfsurf_dT, dflwout_dT, & - dfsens_dT, dflat_dT ) - if (icepack_warnings_aborted(subname)) return + if (.not.semi_implicit_Tsfc) then ! no heat flux calculation + ! surface heat flux + call surface_heat_flux(Tsf , fswsfc, & + rhoa , flw , & + potT , Qa , & + shcoef , lhcoef, & + flwoutn, fsensn, & + flatn , fsurfn) + if (icepack_warnings_aborted(subname)) return + + ! derivative of heat flux with respect to surface temperature + call dsurface_heat_flux_dTsf(Tsf , rhoa , & + shcoef , lhcoef , & + dfsurf_dT, dflwout_dT, & + dfsens_dT, dflat_dT ) + if (icepack_warnings_aborted(subname)) return + endif !----------------------------------------------------------------- ! Compute conductive flux at top surface, fcondtopn. @@ -644,6 +658,9 @@ subroutine temperature_changes (dt, & !----------------------------------------------------------------- fsurfn = fsurfn + dTsf*dfsurf_dT + if (semi_implicit_Tsfc) then ! update lat hf based on dT + flatn = flatn + dTsf*dflat_dT + endif if (l_snow) then fcondtopn = kh(1) * (Tsf-zTsn(1)) else @@ -710,8 +727,15 @@ subroutine temperature_changes (dt, & call icepack_warnings_add(warnstr) write(warnstr,*) subname, 'fsurf:', fsurfn call icepack_warnings_add(warnstr) - write(warnstr,*) subname, 'fcondtop, fcondbot, fswint', & - fcondtopn, fcondbot, fswint + write(warnstr,*) subname, 'dfsurf_dT:', dfsurf_dT + call icepack_warnings_add(warnstr) + write(warnstr,*) subname, 'enew:', enew + call icepack_warnings_add(warnstr) + write(warnstr,*) subname, 'einit:', einit + call icepack_warnings_add(warnstr) + write(warnstr,*) subname, 'dt:', dt + call icepack_warnings_add(warnstr) + write(warnstr,*) subname, 'fcondtop, fcondbot, fswint', fcondtopn, fcondbot, fswint call icepack_warnings_add(warnstr) write(warnstr,*) subname, 'fswsfc', fswsfc call icepack_warnings_add(warnstr) @@ -777,9 +801,11 @@ subroutine temperature_changes (dt, & if (calc_Tsfc) then ! update fluxes that depend on Tsf - flwoutn = flwoutn + dTsf_prev * dflwout_dT - fsensn = fsensn + dTsf_prev * dfsens_dT - flatn = flatn + dTsf_prev * dflat_dT + if (.not.semi_implicit_Tsfc) then + flwoutn = flwoutn + dTsf_prev * dflwout_dT + fsensn = fsensn + dTsf_prev * dfsens_dT + flatn = flatn + dTsf_prev * dflat_dT + endif endif ! calc_Tsfc diff --git a/columnphysics/icepack_therm_itd.F90 b/columnphysics/icepack_therm_itd.F90 index f7e74c9d0..3124ab14b 100644 --- a/columnphysics/icepack_therm_itd.F90 +++ b/columnphysics/icepack_therm_itd.F90 @@ -29,7 +29,7 @@ module icepack_therm_itd use icepack_parameters, only: phi_init, dsin0_frazil use icepack_parameters, only: Tliquidus_max use icepack_parameters, only: rhosi, conserv_check, rhosmin, snwredist - use icepack_parameters, only: kitd, ktherm + use icepack_parameters, only: kitd, ktherm, semi_implicit_Tsfc use icepack_parameters, only: z_tracers, hfrazilmin, hi_min use icepack_parameters, only: cpl_frazil, update_ocn_f, saltflux_option use icepack_parameters, only: icepack_chkoptargflag diff --git a/columnphysics/icepack_therm_mushy.F90 b/columnphysics/icepack_therm_mushy.F90 index 79146c342..d5c56e894 100644 --- a/columnphysics/icepack_therm_mushy.F90 +++ b/columnphysics/icepack_therm_mushy.F90 @@ -6,7 +6,7 @@ module icepack_therm_mushy use icepack_parameters, only: c0, c1, c2, c8, c10 use icepack_parameters, only: p01, p05, p1, p2, p5, pi, bignum, puny use icepack_parameters, only: viscosity_dyn, rhow, rhoi, rhos, cp_ocn, cp_ice, Lfresh, gravit, rhofresh - use icepack_parameters, only: hs_min, snwgrain + use icepack_parameters, only: hs_min, snwgrain, semi_implicit_Tsfc use icepack_parameters, only: a_rapid_mode, Rac_rapid_mode, tscale_pnd_drain use icepack_parameters, only: aspect_rapid_mode, dSdt_slow_mode, phi_c_slow_mode use icepack_parameters, only: sw_redist, sw_frac, sw_dtemp @@ -19,6 +19,8 @@ module icepack_therm_mushy use icepack_mushy_physics, only: conductivity_mush_array, conductivity_snow_array use icepack_therm_shared, only: surface_heat_flux, dsurface_heat_flux_dTsf use icepack_therm_shared, only: ferrmax + use icepack_therm_shared, only: fsurf_cpl, flat_cpl, dfsurfdTs_cpl, dflatdTs_cpl + use icepack_therm_shared, only: fsurf_cpl0, flat_cpl0 use icepack_warnings, only: warnstr, icepack_warnings_add use icepack_warnings, only: icepack_warnings_setabort, icepack_warnings_aborted @@ -841,6 +843,11 @@ subroutine two_stage_solver_nosnow(Tsf, Tsf0, & else ! initially melting + if (semi_implicit_Tsfc) then ! update surf/lat hf based on dT + fsurf_cpl = fsurf_cpl + dfsurfdTs_cpl * (Tmlt - Tsf) + flat_cpl = flat_cpl + dflatdTs_cpl * (Tmlt - Tsf) + endif + ! solve the system for melt and no snow Tsf = Tmlt @@ -885,6 +892,11 @@ subroutine two_stage_solver_nosnow(Tsf, Tsf0, & fcondtop1 = fcondtop fsurfn1 = fsurfn + if (semi_implicit_Tsfc) then ! initialize + fsurf_cpl = fsurf_cpl0 + flat_cpl = flat_cpl0 + endif + ! reset the solution to initial values Tsf = Tsf0 zqin = zqin0 @@ -1226,24 +1238,36 @@ subroutine picard_solver(lsnow, lcold, & zTsn_prev = zTsn zTin_prev = zTin + if (semi_implicit_Tsfc) then ! surf/lat hf from coupler, d(surf/lat)/dT computed + dfsurfn_dTsf = dfsurfdTs_cpl + dflatn_dTsf = dflatdTs_cpl + fsurfn = fsurf_cpl + flatn = flat_cpl + fsurfn = fsurfn + fswsfc + flwoutn = c0 !prevent compiler warning + fsensn = c0 !prevent compiler warning + endif + ! picard iteration picard: do nit = 1, nit_max - ! surface heat flux - call surface_heat_flux(Tsf, fswsfc, & - rhoa, flw, & - potT, Qa, & - shcoef, lhcoef, & - flwoutn, fsensn, & - flatn, fsurfn) - if (icepack_warnings_aborted(subname)) return + if (.not.semi_implicit_Tsfc) then ! no surface heat flux calculation + ! surface heat flux + call surface_heat_flux(Tsf, fswsfc, & + rhoa, flw, & + potT, Qa, & + shcoef, lhcoef, & + flwoutn, fsensn, & + flatn, fsurfn) + if (icepack_warnings_aborted(subname)) return - ! derivative of heat flux with respect to surface temperature - call dsurface_heat_flux_dTsf(Tsf, rhoa, & - shcoef, lhcoef, & - dfsurfn_dTsf, dflwoutn_dTsf, & - dfsensn_dTsf, dflatn_dTsf) - if (icepack_warnings_aborted(subname)) return + ! derivative of heat flux with respect to surface temperature + call dsurface_heat_flux_dTsf(Tsf, rhoa, & + shcoef, lhcoef, & + dfsurfn_dTsf, dflwoutn_dTsf, & + dfsensn_dTsf, dflatn_dTsf) + if (icepack_warnings_aborted(subname)) return + endif ! tridiagonal solve of new temperatures call solve_heat_conduction(lsnow, lcold, & @@ -1289,6 +1313,11 @@ subroutine picard_solver(lsnow, lcold, & fadvheat_nit) if (icepack_warnings_aborted(subname)) return + if (semi_implicit_Tsfc) then ! update surf/lat hf based on dT + fsurfn = fsurfn + (Tsf - Tsf_prev)*dfsurfn_dTsf + flatn = flatn + (Tsf - Tsf_prev)*dflatn_dTsf + endif + if (lconverged) exit Tsf_prev = Tsf @@ -1312,13 +1341,15 @@ subroutine picard_solver(lsnow, lcold, & if (icepack_warnings_aborted(subname)) return ! final surface heat flux - call surface_heat_flux(Tsf, fswsfc, & - rhoa, flw, & - potT, Qa, & - shcoef, lhcoef, & - flwoutn, fsensn, & - flatn, fsurfn) - if (icepack_warnings_aborted(subname)) return + if (.not.semi_implicit_Tsfc) then ! no surface heat flux calculation + call surface_heat_flux(Tsf, fswsfc, & + rhoa, flw, & + potT, Qa, & + shcoef, lhcoef, & + flwoutn, fsensn, & + flatn, fsurfn) + if (icepack_warnings_aborted(subname)) return + endif ! if not converged if (.not. lconverged) then diff --git a/columnphysics/icepack_therm_shared.F90 b/columnphysics/icepack_therm_shared.F90 index 858e6c560..73d560b60 100644 --- a/columnphysics/icepack_therm_shared.F90 +++ b/columnphysics/icepack_therm_shared.F90 @@ -48,6 +48,14 @@ module icepack_therm_shared logical (kind=log_kind), public :: & l_brine ! if true, treat brine pocket effects + real (kind=dbl_kind), public :: & + dfsurfdTs_cpl, & ! + dflatdTs_cpl, & ! + fsurf_cpl0, & ! + flat_cpl0, & ! + fsurf_cpl, & ! + flat_cpl ! + !======================================================================= contains diff --git a/columnphysics/icepack_therm_vertical.F90 b/columnphysics/icepack_therm_vertical.F90 index 4d11e9f37..bd89bd7ca 100644 --- a/columnphysics/icepack_therm_vertical.F90 +++ b/columnphysics/icepack_therm_vertical.F90 @@ -30,7 +30,7 @@ module icepack_therm_vertical use icepack_parameters, only: ustar_min, fbot_xfer_type, formdrag, calc_strair use icepack_parameters, only: rfracmin, rfracmax, dpscale, frzpnd, snwgrain, snwlvlfac use icepack_parameters, only: phi_i_mushy, floeshape, floediam, use_smliq_pnd, snwredist - use icepack_parameters, only: saltflux_option, congel_freeze + use icepack_parameters, only: saltflux_option, congel_freeze, semi_implicit_Tsfc, vapor_flux_correction use icepack_parameters, only: icepack_chkoptargflag use icepack_tracers, only: ncat, nilyr, nslyr, nfsd @@ -41,6 +41,8 @@ module icepack_therm_vertical use icepack_therm_shared, only: ferrmax, l_brine use icepack_therm_shared, only: calculate_tin_from_qin, Tmin use icepack_therm_shared, only: adjust_enthalpy + use icepack_therm_shared, only: fsurf_cpl, flat_cpl, dfsurfdTs_cpl, dflatdTs_cpl + use icepack_therm_shared, only: fsurf_cpl0, flat_cpl0 use icepack_therm_bl99, only: temperature_changes use icepack_therm_mushy, only: temperature_changes_salinity @@ -342,7 +344,7 @@ subroutine thermo_vertical (dt, aicen, & Tsf, Tbot, & fsensn, flatn, & flwoutn, fsurfn, & - fcondtopn, fcondbotn, & + fcondtopn, fcondbotn, & einit ) if (icepack_warnings_aborted(subname)) return @@ -1154,7 +1156,8 @@ subroutine thickness_changes (dt, yday, & wk1 , & ! temporary variable zqsnew , & ! enthalpy of new snow (J m-3) hstot , & ! snow thickness including new snow (m) - Tmlts ! melting temperature (deg C) + Tmlts , & ! melting temperature (deg C) + de_vapor ! energy correction due to cond/sub inconsistency (J m-2) real (kind=dbl_kind), dimension (nilyr+1) :: & zi1 , & ! depth of ice layer boundaries (m) @@ -1191,6 +1194,7 @@ subroutine thickness_changes (dt, yday, & dhi = c0 dhs = c0 hsn_new = c0 + de_vapor = c0 do k = 1, nilyr dzi(k) = hilyr @@ -1275,21 +1279,53 @@ subroutine thickness_changes (dt, yday, & evapin = c0 ! initialize if (hsn > puny) then ! add snow with enthalpy zqsn(1) - dhs = econ / (zqsn(1) - rhos*Lvap) ! econ < 0, dhs > 0 - ! assume all condensation becomes ice (no liquid) - massice(1) = massice(1) + dhs*rhos + if (vapor_flux_correction) then ! compute mass/enthalpy at 0C + dhs = econ / (-rhos*Lfresh - rhos*Lvap) ! econ < 0, dhs > 0 + + ! assume all condensation becomes ice (no liquid) + massice(1) = massice(1) + dhs*rhos + + hstot = dzs(1) + dhs + ! adjust top layer snow enthalpy b.c. we added them at 0C + zqsnew = -rhos*Lfresh + if (hstot > puny) then + zqsn(1) = (dzs(1) * zqsn(1) & + + dhs * zqsnew) / hstot + if (ktherm < 2) then + ! avoid roundoff errors + zqsn(1) = min(zqsn(1), -rhos*Lfresh) + endif + endif + else + dhs = econ / (zqsn(1) - rhos*Lvap) ! econ < 0, dhs > 0 + + ! assume all condensation becomes ice (no liquid) + massice(1) = massice(1) + dhs*rhos + endif dzs(1) = dzs(1) + dhs evapn = evapn + dhs*rhos evapsn = evapsn + dhs*rhos + else ! add ice with enthalpy zqin(1) - dhi = econ / (qm(1) - rhoi*Lvap) ! econ < 0, dhi > 0 + + if (vapor_flux_correction) then ! compute mass/enthalpy at 0C + dhi = econ / (-rhoi*Lfresh - rhoi*Lvap) ! econ < 0, dhi > 0 + ! adjust top layer ice enthalpy b.c. we added them at 0C + !zqsnew = -rhoi*Lfresh + !hqtot = dzi(1)*qm(1) + dhi*zqsnew + de_vapor = de_vapor + (-dhi)*(qm(1) - (-rhoi*Lfresh)) ! de_vapor can be v+- (J m-2) + else + dhi = econ / (qm(1) - rhoi*Lvap) ! econ < 0, dhi > 0 + endif + dzi(1) = dzi(1) + dhi evapn = evapn + dhi*rhoi evapin = evapin + dhi*rhoi ! enthalpy of melt water emlt_atm = emlt_atm - qmlt(1) * dhi + endif !-------------------------------------------------------------- @@ -1389,8 +1425,14 @@ subroutine thickness_changes (dt, yday, & ! Sublimation of snow (evapn < 0) !-------------------------------------------------------------- - qsub = zqsn(k) - rhos*Lvap ! qsub < 0 - dhs = max (-dzs(k), esub/qsub) ! esub > 0, dhs < 0 + if (vapor_flux_correction) then ! compute mass/enthalpy and de_vapor correction + qsub = -rhos*Lfresh - rhos*Lvap ! qsub < 0 + dhs = max (-dzs(k), esub/qsub) ! esub > 0, dhs < 0 + de_vapor = de_vapor + (-dhs)*min(zqsn(k) - (-rhos*Lfresh), c0) ! de_vapor < 0 (J m-2) + else + qsub = zqsn(k) - rhos*Lvap ! qsub < 0 + dhs = max (-dzs(k), esub/qsub) ! esub > 0, dhs < 0 + endif mass = massice(k) + massliq(k) massi = c0 @@ -1776,6 +1818,9 @@ subroutine thickness_changes (dt, yday, & ! sublimated/condensed ice. !----------------------------------------------------------------- + if (vapor_flux_correction) then ! update fhocnn based on de_vapor correction + fhocnn = fhocnn + de_vapor/dt + endif efinal = -evapn*Lvap evapn = evapn/dt evapsn = evapsn/dt @@ -2166,6 +2211,10 @@ subroutine icepack_step_therm1(dt, & fswthrun_vdf, & fswthrun_idr, & fswthrun_idf, & + fswthrun_uvrdr, & + fswthrun_uvrdf, & + fswthrun_pardr, & + fswthrun_pardf, & fswabs , & flwout , & Sswabsn , Iswabsn , & @@ -2181,8 +2230,13 @@ subroutine icepack_step_therm1(dt, & fswthru_vdf , & fswthru_idr , & fswthru_idf , & + fswthru_uvrdr , & + fswthru_uvrdf , & + fswthru_pardr , & + fswthru_pardf , & flatn_f , fsensn_f , & fsurfn_f , fcondtopn_f , & + dfsurfdT , dflatdT , & faero_atm , faero_ocn , & fiso_atm , fiso_ocn , & fiso_evap , & @@ -2296,6 +2350,10 @@ subroutine icepack_step_therm1(dt, & fswthru_vdf , & ! vis dif shortwave penetrating to ocean (W/m^2) fswthru_idr , & ! nir dir shortwave penetrating to ocean (W/m^2) fswthru_idf , & ! nir dif shortwave penetrating to ocean (W/m^2) + fswthru_uvrdr,& ! vis uvr dir shortwave penetrating to ocean (W/m^2) + fswthru_uvrdf,& ! vis uvr dif shortwave penetrating to ocean (W/m^2) + fswthru_pardr,& ! vis par dir shortwave penetrating to ocean (W/m^2) + fswthru_pardf,& ! vis par dif shortwave penetrating to ocean (W/m^2) dsnow , & ! change in snow depth (m/step-->cm/day) fsloss ! rate of snow loss to leads (kg/m^2/s) @@ -2370,10 +2428,16 @@ subroutine icepack_step_therm1(dt, & dsnown ! change in snow thickness (m/step-->cm/day) real (kind=dbl_kind), dimension(:), intent(in), optional :: & + dfsurfdT , & ! derivative of fsurfn with respect to temperatur (W m-2 K-1) + dflatdT , & ! derivative of flatn with respect to temperature (W m-2 K-1) fswthrun_vdr , & ! vis dir SW through ice to ocean (W/m^2) fswthrun_vdf , & ! vis dif SW through ice to ocean (W/m^2) fswthrun_idr , & ! nir dir SW through ice to ocean (W/m^2) - fswthrun_idf ! nir dif SW through ice to ocean (W/m^2) + fswthrun_idf , & ! nir dif SW through ice to ocean (W/m^2) + fswthrun_uvrdr,& ! vis uvr dir SW through ice to ocean (W/m^2) + fswthrun_uvrdf,& ! vis uvr dif SW through ice to ocean (W/m^2) + fswthrun_pardr,& ! vis par dir SW through ice to ocean (W/m^2) + fswthrun_pardf ! via par dif SW through ice to ocean (W/m^2) real (kind=dbl_kind), dimension(:,:), intent(inout) :: & zqsn , & ! snow layer enthalpy (J m-3) @@ -2445,6 +2509,10 @@ subroutine icepack_step_therm1(dt, & l_fswthrun_vdf, & ! vis dif SW local n ice to ocean (W/m^2) l_fswthrun_idr, & ! nir dir SW local n ice to ocean (W/m^2) l_fswthrun_idf, & ! nir dif SW local n ice to ocean (W/m^2) + l_fswthrun_uvrdr,& ! vis uvr dir SW through ice to ocean (W/m^2) + l_fswthrun_uvrdf,& ! vis uvr dif SW through ice to ocean (W/m^2) + l_fswthrun_pardr,& ! vis par dir SW through ice to ocean (W/m^2) + l_fswthrun_pardf,& ! vis par dif SW through ice to ocean (W/m^2) l_dsnow, & ! local snow change l_dsnown, & ! local snow change category l_meltsliq ! mass of snow melt local (kg/m^2) @@ -2490,6 +2558,22 @@ subroutine icepack_step_therm1(dt, & call icepack_warnings_setabort(.true.,__FILE__,__LINE__) return endif + if (semi_implicit_Tsfc) then + if (.not.(present(fswthru_uvrdr) .and. present(fswthru_uvrdf) .and. & + present(fswthru_pardr) .and. present(fswthru_pardf) .and. & + present(dfsurfdT) .and. present(dflatdT) )) then + call icepack_warnings_add(subname//' error in semi_implicit_Tsfc arguments, semi_implicit_Tsfc=T') + call icepack_warnings_setabort(.true.,__FILE__,__LINE__) + endif + endif + if ((present(fswthru_uvrdr) .and. .not.present(fswthrun_uvrdr)) .or. & + (present(fswthru_uvrdf) .and. .not.present(fswthrun_uvrdf)) .or. & + (present(fswthru_pardr) .and. .not.present(fswthrun_pardr)) .or. & + (present(fswthru_pardf) .and. .not.present(fswthrun_pardf))) then + call icepack_warnings_add(subname//' error in fswthru [uvr|par]d[rf] arguments') + call icepack_warnings_setabort(.true.,__FILE__,__LINE__) + return + endif if ((present(dsnow) .and. .not.present(dsnown)) .or. & (present(dsnown) .and. .not.present(dsnow))) then call icepack_warnings_add(subname//' error in dsnow arguments') @@ -2711,6 +2795,15 @@ subroutine icepack_step_therm1(dt, & smliq(:) = smliqn(:,n) endif + if (semi_implicit_Tsfc) then + if (present(dfsurfdT)) dfsurfdTs_cpl = dfsurfdT(n) + if (present(dflatdT)) dflatdTs_cpl = dflatdT(n) + fsurf_cpl = fsurfn_f(n) + flat_cpl = flatn_f(n) + fsurf_cpl0 = fsurf_cpl + flat_cpl0 = flat_cpl + endif + call thermo_vertical(dt=dt, aicen=aicen (n), & vicen=vicen (n), vsnon=vsnon (n), & Tsf=Tsfc (n), zSin=zSin (:,n), & @@ -2898,6 +2991,14 @@ subroutine icepack_step_therm1(dt, & if (present(fswthrun_vdf)) l_fswthrun_vdf = fswthrun_vdf(n) if (present(fswthrun_idr)) l_fswthrun_idr = fswthrun_idr(n) if (present(fswthrun_idf)) l_fswthrun_idf = fswthrun_idf(n) + l_fswthrun_uvrdr = c0 + l_fswthrun_uvrdf = c0 + l_fswthrun_pardr = c0 + l_fswthrun_pardf = c0 + if (present(fswthrun_uvrdr)) l_fswthrun_uvrdr = fswthrun_uvrdr(n) + if (present(fswthrun_uvrdf)) l_fswthrun_uvrdf = fswthrun_uvrdf(n) + if (present(fswthrun_pardr)) l_fswthrun_pardr = fswthrun_pardr(n) + if (present(fswthrun_pardf)) l_fswthrun_pardf = fswthrun_pardf(n) call merge_fluxes (aicen=aicen_init(n), & flw=flw, & @@ -2917,6 +3018,10 @@ subroutine icepack_step_therm1(dt, & fswthrun_vdf=l_fswthrun_vdf, & fswthrun_idr=l_fswthrun_idr, & fswthrun_idf=l_fswthrun_idf, & + fswthrun_uvrdr=l_fswthrun_uvrdr, & + fswthrun_uvrdf=l_fswthrun_uvrdf, & + fswthrun_pardr=l_fswthrun_pardr, & + fswthrun_pardf=l_fswthrun_pardf, & strairxT=strairxT, strairyT=strairyT,& Cdn_atm_ratio=Cdn_atm_ratio, & fsurf=fsurf, fcondtop=fcondtop,& @@ -2933,6 +3038,10 @@ subroutine icepack_step_therm1(dt, & fswthru_vdf=fswthru_vdf, & fswthru_idr=fswthru_idr, & fswthru_idf=fswthru_idf, & + fswthru_uvrdr=fswthru_uvrdr, & + fswthru_uvrdf=fswthru_uvrdf, & + fswthru_pardr=fswthru_pardr, & + fswthru_pardf=fswthru_pardf, & melttn=melttn (n), meltsn=meltsn(n), & meltbn=meltbn (n), congeln=congeln(n),& meltt=meltt, melts=melts, & diff --git a/configuration/driver/icedrv_init.F90 b/configuration/driver/icedrv_init.F90 index 9a3d47481..f08d2a079 100644 --- a/configuration/driver/icedrv_init.F90 +++ b/configuration/driver/icedrv_init.F90 @@ -121,7 +121,7 @@ subroutine input_data real (kind=dbl_kind) :: ice_ref_salinity logical (kind=log_kind) :: calc_Tsfc, formdrag, highfreq, calc_strair, calc_dragio - logical (kind=log_kind) :: conserv_check + logical (kind=log_kind) :: conserv_check, semi_implicit_Tsfc, vapor_flux_correction integer (kind=int_kind) :: ntrcr logical (kind=log_kind) :: tr_iage, tr_FY, tr_lvl, tr_pond, tr_snow @@ -195,8 +195,9 @@ subroutine input_data ice_data_file, & atm_data_format, ocn_data_format, bgc_data_format, & data_dir, trestore, restore_ocn, & - sss_fixed, qdp_fixed, hmix_fixed, & - precalc_forc + sss_fixed, qdp_fixed, hmix_fixed, & + precalc_forc, semi_implicit_Tsfc, & + vapor_flux_correction namelist /tracer_nml/ & tr_iage, & @@ -230,6 +231,8 @@ subroutine input_data rfracmin_out=rfracmin, rfracmax_out=rfracmax, & pndaspect_out=pndaspect, hs1_out=hs1, hp1_out=hp1, & ktherm_out=ktherm, calc_Tsfc_out=calc_Tsfc, & + semi_implicit_Tsfc_out=semi_implicit_Tsfc, & + vapor_flux_correction_out=vapor_flux_correction, & floediam_out=floediam, hfrazilmin_out=hfrazilmin, & update_ocn_f_out = update_ocn_f, cpl_frazil_out = cpl_frazil, & conduct_out=conduct, a_rapid_mode_out=a_rapid_mode, & @@ -789,6 +792,8 @@ subroutine input_data write(nu_diag,1010) ' calc_strair = ', calc_strair write(nu_diag,1010) ' calc_Tsfc = ', calc_Tsfc write(nu_diag,1010) ' calc_dragio = ', calc_dragio + write(nu_diag,1010) ' semi_implicit_Tsfc = ', semi_implicit_Tsfc + write(nu_diag,1010) ' vapor_flux_correction = ', vapor_flux_correction write(nu_diag,1005) ' floediam = ', floediam write(nu_diag,1005) ' hfrazilmin = ', hfrazilmin @@ -979,6 +984,11 @@ subroutine input_data endif endif + if (semi_implicit_Tsfc .and. tr_pond_topo) then + write(nu_diag,*)'ERROR: semi_implicit_Tsfc and tr_pond_topo not supported together' + call icedrv_system_abort(file=__FILE__,line=__LINE__) + endif + !----------------------------------------------------------------- ! set Icepack values !----------------------------------------------------------------- @@ -1001,6 +1011,8 @@ subroutine input_data pndaspect_in=pndaspect, hs1_in=hs1, hp1_in=hp1, & floediam_in=floediam, hfrazilmin_in=hfrazilmin, & ktherm_in=ktherm, calc_Tsfc_in=calc_Tsfc, & + semi_implicit_Tsfc_in=semi_implicit_Tsfc, & + vapor_flux_correction_in=vapor_flux_correction, & conduct_in=conduct, a_rapid_mode_in=a_rapid_mode, & update_ocn_f_in=update_ocn_f, cpl_frazil_in=cpl_frazil, & Rac_rapid_mode_in=Rac_rapid_mode, & diff --git a/configuration/scripts/icepack_in b/configuration/scripts/icepack_in index f46b329c1..19433d0f0 100644 --- a/configuration/scripts/icepack_in +++ b/configuration/scripts/icepack_in @@ -145,7 +145,9 @@ atm_data_format = 'bin' ocn_data_format = 'bin' bgc_data_format = 'bin' - precalc_forc = .false. + precalc_forc = .false. + semi_implicit_Tsfc = .false. + vapor_flux_correction = .false. / &dynamics_nml diff --git a/configuration/scripts/machines/env.discover_intel b/configuration/scripts/machines/env.discover_intel index 4f13d1a5b..b8bdec18f 100755 --- a/configuration/scripts/machines/env.discover_intel +++ b/configuration/scripts/machines/env.discover_intel @@ -47,7 +47,7 @@ setenv ICE_MACHINE_WKDIR /discover/nobackup/$user/ICEPACK_RUNS setenv ICE_MACHINE_INPUTDATA /discover/nobackup/sakella/icepack_data setenv ICE_MACHINE_BASELINE /discover/nobackup/$user/ICEPACK_BASELINE setenv ICE_MACHINE_SUBMIT "sbatch" -setenv ICE_MACHINE_ACCT g0613 +setenv ICE_MACHINE_ACCT g0609 setenv ICE_MACHINE_QUEUE "share" setenv ICE_MACHINE_TPNODE 36 setenv ICE_MACHINE_BLDTHRDS 1 diff --git a/doc/source/icepack_index.rst b/doc/source/icepack_index.rst index 1e0cbeaac..71a2ec9ca 100755 --- a/doc/source/icepack_index.rst +++ b/doc/source/icepack_index.rst @@ -190,11 +190,15 @@ section :ref:`tabnamelist`. "fswint", "shortwave absorbed in ice interior", "W/m\ :math:`^2`" "fswpenl", "shortwave penetrating through ice layers", "W/m\ :math:`^2`" "fswthru", "shortwave penetrating to ocean", "W/m\ :math:`^2`" + "fswthru_ai", "grid-box-mean shortwave penetrating to ocean (fswthru)", "W/m\ :math:`^2`" + "fswthru_idf", "near IR diffuse shortwave penetrating to ocean", "W/m\ :math:`^2`" + "fswthru_idr", "near IR direct shortwave penetrating to ocean", "W/m\ :math:`^2`" + "fswthru_pardf", "visible photosynthetically active shortwave diffuse radiation 400-700nm penetrating to ocean", "W/m\ :math:`^2`" + "fswthru_pardr", "visible photosynthetically active shortwave direct radiation 400-700nm penetrating to ocean", "W/m\ :math:`^2`" + "fswthru_uvrdf", "visible ultraviolet shortwave diffuse radiation > 700nm penetrating to ocean", "W/m\ :math:`^2`" + "fswthru_uvrdr", "visible ultraviolet shortwave direct radiation > 7000nm penetrating to ocean", "W/m\ :math:`^2`" "fswthru_vdr", "visible direct shortwave penetrating to ocean", "W/m\ :math:`^2`" "fswthru_vdf", "visible diffuse shortwave penetrating to ocean", "W/m\ :math:`^2`" - "fswthru_idr", "near IR direct shortwave penetrating to ocean", "W/m\ :math:`^2`" - "fswthru_idf", "near IR diffuse shortwave penetrating to ocean", "W/m\ :math:`^2`" - "fswthru_ai", "grid-box-mean shortwave penetrating to ocean (fswthru)", "W/m\ :math:`^2`" "fyear", "current data year", "" "fyear_final", "last data year", "" "fyear_init", ":math:`\bullet` initial data year", "" diff --git a/doc/source/science_guide/sg_boundary_forcing.rst b/doc/source/science_guide/sg_boundary_forcing.rst index ce4f10e07..e73a13a93 100755 --- a/doc/source/science_guide/sg_boundary_forcing.rst +++ b/doc/source/science_guide/sg_boundary_forcing.rst @@ -88,7 +88,17 @@ stable and accurate procedure would be to compute the temperature profiles for both the atmosphere and ice, together with the surface fluxes, in a single implicit calculation. This was judged impractical, however, given that the atmosphere and sea ice models generally exist on -different grids and/or processor sets. +different grids and/or processor sets. In NASA GMAO GEOS-ESM coupled model, +a semi-implicit thermodynamic coupling scheme is introduced. Similar to the explicit +case, the fields ``fsurfn`` are provided by the coupler, along with their derivatives +with respect to surface temperature ``dfsurfn_dTs``. In this case, ``calc_Tsfc`` +is still set to true, allowing ice surface and internal temperature to be updated +implicitly. The resultant surface temperature change is passed back to the +atmosphere model via coupler to complete the full update of its temperature profiles. +This middle-ground approach, enabled by ``vapor_flux_correction=true``, does not sacrifice +accuracy because it does not need effective conductivity limiting as in the explicit case. + + .. _atmo: diff --git a/doc/source/science_guide/sg_thermo.rst b/doc/source/science_guide/sg_thermo.rst index 1577a7e5e..347777c1f 100755 --- a/doc/source/science_guide/sg_thermo.rst +++ b/doc/source/science_guide/sg_thermo.rst @@ -1802,7 +1802,12 @@ ice), and :math:`L_v = 2.501 \times 10^6 \ \mathrm{J/kg}` is the latent heat of vaporization of liquid water at :math:`0^{\circ}C`. Note that :math:`\rho L_v` is nearly an order of magnitude larger than typical values of :math:`q`. For positive latent heat fluxes, the deposited snow or ice is assumed to -have the same enthalpy as the existing surface layer. +have the same enthalpy as the existing surface layer. Some climate models (for +example, GEOS-ESM) compute mass flux (sublimation or deposition) in the atmsophere +model which assumes vapor deposits or sublimates at 0 degC. In this case, mass +conservation is enforced and the resulting discrepancy in energy is resolved by +another term ``de_vapor`` and passed to ocean. This option is only on when +``semi-implicit_Tsfc=true``. After growth and melting, the various ice layers no longer have equal thicknesses. We therefore adjust the layer interfaces, conserving diff --git a/doc/source/user_guide/ug_case_settings.rst b/doc/source/user_guide/ug_case_settings.rst index 9a66baef6..17e4c8c85 100644 --- a/doc/source/user_guide/ug_case_settings.rst +++ b/doc/source/user_guide/ug_case_settings.rst @@ -389,6 +389,7 @@ forcing_nml "``restore_ocn``", "logical", "restore sst to data", "``.false.``" "``saltflux_option``", "``constant``","salt flux is referenced to a constant salinity","``constant``" "","``prognostic``","use actual sea ice bulk salinity in flux" + "``semi-implicit_Tsfc``", "logical", "surface temperature coupling option based on d(hf)/dTs", "``.false.``" "``sss_fixed``", "real", "constant ocean mixed layer salinity in ppt", "34.0" "``tfrz_option``","``constant``", "constant ocean freezing temperature (Tocnfrz)","``mushy``" "", "``linear_salt``", "linear function of salinity (ktherm=1)", "" @@ -398,6 +399,7 @@ forcing_nml "``update_ocn_f``", "``.false.``", "do not include frazil water/salt fluxes in ocn fluxes", "``.false.``" "", "``true``", "include frazil water/salt fluxes in ocn fluxes", "" "``ustar_min``", "real", "minimum value of ocean friction velocity in m/s", "0.005" + "``vapor_flux_correction``", "logical", "water vapor deposition/sublimation correction associated with an assumed temperature", "``.false.``" "``wave_spec_type``", "``constant``", "wave data file is provided, sea surface height generated using constant phase (1 iteration of wave fracture)", "``none``" "", "``none``", "no wave data provided, no wave-ice interactions (not recommended when using the FSD)", "" "", "``profile``", "no wave data file is provided, use fixed dummy wave spectrum, for testing, sea surface height generated using constant phase (1 iteration of wave fracture)", "" From f61be9a1bd3578f89d559f9a8901252367cca0d7 Mon Sep 17 00:00:00 2001 From: Tony Craig Date: Fri, 20 Jun 2025 14:10:01 -0700 Subject: [PATCH 14/34] Final updates for GEOS changes. (#526) Remove extra use variable and update documentation. These are a couple of minor changes that will complete the initial GEOS coupling integration. --- columnphysics/icepack_therm_itd.F90 | 2 +- doc/source/icepack_index.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/columnphysics/icepack_therm_itd.F90 b/columnphysics/icepack_therm_itd.F90 index 3124ab14b..f7e74c9d0 100644 --- a/columnphysics/icepack_therm_itd.F90 +++ b/columnphysics/icepack_therm_itd.F90 @@ -29,7 +29,7 @@ module icepack_therm_itd use icepack_parameters, only: phi_init, dsin0_frazil use icepack_parameters, only: Tliquidus_max use icepack_parameters, only: rhosi, conserv_check, rhosmin, snwredist - use icepack_parameters, only: kitd, ktherm, semi_implicit_Tsfc + use icepack_parameters, only: kitd, ktherm use icepack_parameters, only: z_tracers, hfrazilmin, hi_min use icepack_parameters, only: cpl_frazil, update_ocn_f, saltflux_option use icepack_parameters, only: icepack_chkoptargflag diff --git a/doc/source/icepack_index.rst b/doc/source/icepack_index.rst index 71a2ec9ca..346fe2c45 100755 --- a/doc/source/icepack_index.rst +++ b/doc/source/icepack_index.rst @@ -196,7 +196,7 @@ section :ref:`tabnamelist`. "fswthru_pardf", "visible photosynthetically active shortwave diffuse radiation 400-700nm penetrating to ocean", "W/m\ :math:`^2`" "fswthru_pardr", "visible photosynthetically active shortwave direct radiation 400-700nm penetrating to ocean", "W/m\ :math:`^2`" "fswthru_uvrdf", "visible ultraviolet shortwave diffuse radiation > 700nm penetrating to ocean", "W/m\ :math:`^2`" - "fswthru_uvrdr", "visible ultraviolet shortwave direct radiation > 7000nm penetrating to ocean", "W/m\ :math:`^2`" + "fswthru_uvrdr", "visible ultraviolet shortwave direct radiation > 700nm penetrating to ocean", "W/m\ :math:`^2`" "fswthru_vdr", "visible direct shortwave penetrating to ocean", "W/m\ :math:`^2`" "fswthru_vdf", "visible diffuse shortwave penetrating to ocean", "W/m\ :math:`^2`" "fyear", "current data year", "" From ec7ad9c298b8dfd5a84b8fe74063d6174fc60b80 Mon Sep 17 00:00:00 2001 From: Nicole Jeffery Date: Thu, 10 Jul 2025 01:00:33 -0600 Subject: [PATCH 15/34] Move three snow grain radius parameters to namelist (#529) * Moves snow grain radius parameters to namelist Adds a minimum snow grain growth rate scale parameter, default 0 Moves the irreducible saturation fraction to the namelist. BFB * Moves S_wet to namelist snw_growth_wet Snow grain radius metamorphism rate is scaled by snw_growth_wet BFB * update snow documentation These changes are for sensitivity testing and model tuning. S_r (changed to snwliq_max) determines the maximum liquid water in snow which when cubed controls the rate at which snow grain size changes during wet metamorphism. drsnw_min is the minimum snow grain growth rate at 0 liquid water content. It's a new parameter but set to zero to be BFB though Brun 1989 experiments observe a non-zero value. Both parameters are physically based but with uncertainty in the literature, and they play a significant role in the snow grain evolution. --- columnphysics/icepack_parameters.F90 | 29 +++++++++++++++++++++++++--- columnphysics/icepack_snow.F90 | 16 +++++++++------ configuration/driver/icedrv_init.F90 | 15 ++++++++++---- configuration/scripts/icepack_in | 3 +++ doc/source/master_list.bib | 9 +++++++++ doc/source/science_guide/sg_snow.rst | 4 ++-- 6 files changed, 61 insertions(+), 15 deletions(-) diff --git a/columnphysics/icepack_parameters.F90 b/columnphysics/icepack_parameters.F90 index cc4fcca9b..ef20ad419 100644 --- a/columnphysics/icepack_parameters.F90 +++ b/columnphysics/icepack_parameters.F90 @@ -368,8 +368,14 @@ module icepack_parameters rhosmax = 450.0_dbl_kind, & ! maximum snow density (kg/m^3) windmin = 10.0_dbl_kind, & ! minimum wind speed to compact snow (m/s) drhosdwind = 27.3_dbl_kind, & ! wind compaction factor for snow (kg s/m^4) - snwlvlfac = 0.3_dbl_kind ! fractional increase in snow + snwlvlfac = 0.3_dbl_kind, & ! fractional increase in snow ! depth for bulk redistribution + snw_growth_wet = 4.22e5_dbl_kind, & ! wet metamorphism parameter (um^3/s) + ! 1.e18 * 4.22e-13 (Oleson 2010) + drsnw_min = 0.0_dbl_kind, & ! minimum snow grain growth factor + snwliq_max = 0.033_dbl_kind ! irreducible saturation fraction + ! 0.033 (Anderson 1976) + ! 0.09 to 0.1 (Denoth et al, 1979 & Brun 1989) ! indices for aging lookup table integer (kind=int_kind), public :: & isnw_T, & ! maximum temperature index @@ -582,6 +588,7 @@ subroutine icepack_init_parameters( & y_sk_DMS_in, t_sk_conv_in, t_sk_ox_in, frazil_scav_in, & sw_redist_in, sw_frac_in, sw_dtemp_in, snwgrain_in, & snwredist_in, use_smliq_pnd_in, rsnw_fall_in, rsnw_tmax_in, & + snw_growth_wet_in, drsnw_min_in, snwliq_max_in, & rhosnew_in, rhosmin_in, rhosmax_in, windmin_in, drhosdwind_in, & snwlvlfac_in, isnw_T_in, isnw_Tgrd_in, isnw_rhos_in, & snowage_rhos_in, snowage_Tgrd_in, snowage_T_in, & @@ -1058,7 +1065,10 @@ subroutine icepack_init_parameters( & rhosmax_in, & ! maximum snow density (kg/m^3) windmin_in, & ! minimum wind speed to compact snow (m/s) drhosdwind_in, & ! wind compaction factor (kg s/m^4) - snwlvlfac_in ! fractional increase in snow depth + snwlvlfac_in, & ! fractional increase in snow depth + snw_growth_wet_in, & ! wet metamorphism parameter (um^3/s) + drsnw_min_in, & ! minimum snow grain growth factor + snwliq_max_in ! irreducible saturation fraction integer (kind=int_kind), intent(in), optional :: & isnw_T_in, & ! maxiumum temperature index @@ -1221,6 +1231,9 @@ subroutine icepack_init_parameters( & if (present(windmin_in) ) windmin = windmin_in if (present(drhosdwind_in) ) drhosdwind = drhosdwind_in if (present(snwlvlfac_in) ) snwlvlfac = snwlvlfac_in + if (present(snw_growth_wet_in) ) snw_growth_wet = snw_growth_wet_in + if (present(drsnw_min_in) ) drsnw_min = drsnw_min_in + if (present(snwliq_max_in) ) snwliq_max = snwliq_max_in !------------------- ! SNOW table @@ -1578,6 +1591,7 @@ subroutine icepack_query_parameters( & y_sk_DMS_out, t_sk_conv_out, t_sk_ox_out, frazil_scav_out, & sw_redist_out, sw_frac_out, sw_dtemp_out, snwgrain_out, & snwredist_out, use_smliq_pnd_out, rsnw_fall_out, rsnw_tmax_out, & + snw_growth_wet_out, drsnw_min_out, snwliq_max_out, & rhosnew_out, rhosmin_out, rhosmax_out, windmin_out, drhosdwind_out, & snwlvlfac_out, isnw_T_out, isnw_Tgrd_out, isnw_rhos_out, & snowage_rhos_out, snowage_Tgrd_out, snowage_T_out, & @@ -2064,7 +2078,10 @@ subroutine icepack_query_parameters( & rhosmax_out, & ! maximum snow density (kg/m^3) windmin_out, & ! minimum wind speed to compact snow (m/s) drhosdwind_out, & ! wind compaction factor (kg s/m^4) - snwlvlfac_out ! fractional increase in snow depth + snwlvlfac_out, & ! fractional increase in snow depth + snw_growth_wet_out, & ! wet metamorphism parameter (um^3/s) + drsnw_min_out, & ! minimum snow grain growth factor + snwliq_max_out ! irreducible saturation fraction integer (kind=int_kind), intent(out), optional :: & isnw_T_out, & ! maxiumum temperature index @@ -2259,6 +2276,9 @@ subroutine icepack_query_parameters( & if (present(windmin_out) ) windmin_out = windmin if (present(drhosdwind_out) ) drhosdwind_out = drhosdwind if (present(snwlvlfac_out) ) snwlvlfac_out = snwlvlfac + if (present(snw_growth_wet_out) ) snw_growth_wet_out = snw_growth_wet + if (present(drsnw_min_out) ) drsnw_min_out = drsnw_min + if (present(snwliq_max_out) ) snwliq_max_out = snwliq_max if (present(isnw_T_out) ) isnw_T_out = isnw_T if (present(isnw_Tgrd_out) ) isnw_Tgrd_out = isnw_Tgrd if (present(isnw_rhos_out) ) isnw_rhos_out = isnw_rhos @@ -2566,6 +2586,9 @@ subroutine icepack_write_parameters(iounit) write(iounit,*) " windmin = ", windmin write(iounit,*) " drhosdwind = ", drhosdwind write(iounit,*) " snwlvlfac = ", snwlvlfac + write(iounit,*) " snw_growth_wet = ", snw_growth_wet + write(iounit,*) " drsnw_min = ", drsnw_min + write(iounit,*) " snwliq_max = ", snwliq_max write(iounit,*) " isnw_T = ", isnw_T write(iounit,*) " isnw_Tgrd = ", isnw_Tgrd write(iounit,*) " isnw_rhos = ", isnw_rhos diff --git a/columnphysics/icepack_snow.F90 b/columnphysics/icepack_snow.F90 index 3987d2922..982f1fb13 100644 --- a/columnphysics/icepack_snow.F90 +++ b/columnphysics/icepack_snow.F90 @@ -12,6 +12,7 @@ module icepack_snow use icepack_parameters, only: rhos, rhow, rhoi, rhofresh, snwgrain use icepack_parameters, only: snwlvlfac, Tffresh, cp_ice, Lfresh use icepack_parameters, only: snwredist, rsnw_fall, rsnw_tmax, rhosnew + use icepack_parameters, only: snw_growth_wet, drsnw_min, snwliq_max use icepack_parameters, only: rhosmin, rhosmax, windmin, drhosdwind use icepack_parameters, only: isnw_T, isnw_Tgrd, isnw_rhos use icepack_parameters, only: snowage_rhos, snowage_Tgrd, snowage_T @@ -31,9 +32,8 @@ module icepack_snow public :: icepack_step_snow, drain_snow, icepack_init_snow real (kind=dbl_kind), parameter, public :: & - S_r = 0.033_dbl_kind, & ! irreducible saturation (Anderson 1976) - S_wet= 4.22e5_dbl_kind ! wet metamorphism parameter (um^3/s) - ! = 1.e18 * 4.22e-13 (Oleson 2010) + drsnw_min_o = 1.0186_dbl_kind ! Bun 1989 (um^3/s) + ! minimum volume growth rate 1.28x10^-8 mm^3/s/4/pi real (kind=dbl_kind) :: & min_rhos, & ! snowtable axis data, assumes linear data @@ -843,6 +843,9 @@ subroutine update_snow_radius (dt, rsnw, hin, & drsnw_wet, & ! wet metamorphism (10^-6 m) drsnw_dry ! dry (temperature gradient) metamorphism (10^-6 m) + real (kind=dbl_kind) :: & + drsnw_dry_tmp ! snow grain radius growth (10^-6 m) + character (len=*),parameter :: subname='(update_snow_radius)' do n = 1, ncat @@ -867,7 +870,8 @@ subroutine update_snow_radius (dt, rsnw, hin, & call snow_wet_metamorph (dt, drsnw_wet(k), rsnw(k,n), & smice(k,n), smliq(k,n)) if (icepack_warnings_aborted(subname)) return - rsnw(k,n) = min(rsnw_tmax, rsnw(k,n) + drsnw_dry(k) + drsnw_wet(k)) + drsnw_dry_tmp = max(drsnw_dry(k), drsnw_min*drsnw_min_o/rsnw(k,n)**2*dt) + rsnw(k,n) = min(rsnw_tmax, rsnw(k,n) + drsnw_dry_tmp + drsnw_wet(k)) enddo else ! hsn or hin < puny @@ -1102,7 +1106,7 @@ subroutine snow_wet_metamorph (dt, dr_wet, rsnw, smice, smliq) fliq = c1 if (smice + smliq > c0 .and. rsnw > c0) then fliq = min(smliq/(smice + smliq),p1) - dr_wet = S_wet * fliq**3*dt/(c4*pi*rsnw**2) + dr_wet = snw_growth_wet * fliq**3*dt/(c4*pi*rsnw**2) endif end subroutine snow_wet_metamorph @@ -1199,7 +1203,7 @@ subroutine drain_snow (vsnon, aicen, & massliq(k) = massliq(k) + dlin(k) ! add liquid in from layer above phi_ice(k) = min(c1, massice(k) / (rhoi *hslyr)) phi_liq(k) = massliq(k) / (rhofresh*hslyr) - dlout(k) = max(c0, (phi_liq(k) - S_r*(c1-phi_ice(k))) * rhofresh * hslyr) + dlout(k) = max(c0, (phi_liq(k) - snwliq_max * (c1-phi_ice(k))) * rhofresh * hslyr) massliq(k) = massliq(k) - dlout(k) if (k < nslyr) then dlin(k+1) = dlout(k) diff --git a/configuration/driver/icedrv_init.F90 b/configuration/driver/icedrv_init.F90 index f08d2a079..13be2af57 100644 --- a/configuration/driver/icedrv_init.F90 +++ b/configuration/driver/icedrv_init.F90 @@ -102,7 +102,7 @@ subroutine input_data a_rapid_mode, Rac_rapid_mode, aspect_rapid_mode, dSdt_slow_mode, & phi_c_slow_mode, phi_i_mushy, kalg, emissivity, floediam, hfrazilmin, & rsnw_fall, rsnw_tmax, rhosnew, rhosmin, rhosmax, & - windmin, drhosdwind, snwlvlfac + windmin, drhosdwind, snwlvlfac, snw_growth_wet, drsnw_min, snwliq_max integer (kind=int_kind) :: ktherm, kstrength, krdg_partic, krdg_redist, & natmiter, kitd, kcatbound @@ -178,7 +178,8 @@ subroutine input_data namelist /snow_nml/ & snwredist, snwgrain, rsnw_fall, rsnw_tmax, & rhosnew, rhosmin, rhosmax, snwlvlfac, & - windmin, drhosdwind, use_smliq_pnd, snw_aging_table + windmin, drhosdwind, use_smliq_pnd, snw_aging_table, & + snw_growth_wet, drsnw_min, snwliq_max namelist /forcing_nml/ & atmbndy, calc_strair, calc_Tsfc, & @@ -251,7 +252,8 @@ subroutine input_data snwgrain_out=snwgrain, rsnw_fall_out=rsnw_fall, rsnw_tmax_out=rsnw_tmax, & rhosnew_out=rhosnew, rhosmin_out = rhosmin, rhosmax_out=rhosmax, & windmin_out=windmin, drhosdwind_out=drhosdwind, snwlvlfac_out=snwlvlfac, & - snw_aging_table_out=snw_aging_table) + snw_aging_table_out=snw_aging_table, snw_growth_wet_out=snw_growth_wet, & + drsnw_min_out=drsnw_min, snwliq_max_out=snwliq_max) call icepack_warnings_flush(nu_diag) if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, & @@ -768,6 +770,9 @@ subroutine input_data write(nu_diag,1000) ' windmin = ', windmin write(nu_diag,1000) ' drhosdwind = ', drhosdwind write(nu_diag,1000) ' snwlvlfac = ', snwlvlfac + write(nu_diag,1000) ' snw_growth_wet = ', snw_growth_wet + write(nu_diag,1000) ' drsnw_min = ', drsnw_min + write(nu_diag,1000) ' snwliq_max = ', snwliq_max endif write(nu_diag,1020) ' ktherm = ', ktherm @@ -1030,7 +1035,9 @@ subroutine input_data snw_aging_table_in=snw_aging_table, & snwgrain_in=snwgrain, rsnw_fall_in=rsnw_fall, rsnw_tmax_in=rsnw_tmax, & rhosnew_in=rhosnew, rhosmin_in=rhosmin, rhosmax_in=rhosmax, & - windmin_in=windmin, drhosdwind_in=drhosdwind, snwlvlfac_in=snwlvlfac) + windmin_in=windmin, drhosdwind_in=drhosdwind, snwlvlfac_in=snwlvlfac, & + snw_growth_wet_in=snw_growth_wet, drsnw_min_in=drsnw_min, & + snwliq_max_in=snwliq_max) call icepack_init_tracer_sizes(ntrcr_in=ntrcr, & ncat_in=ncat, nilyr_in=nilyr, nslyr_in=nslyr, nblyr_in=nblyr, & nfsd_in=nfsd, n_iso_in=n_iso, n_aero_in=n_aero) diff --git a/configuration/scripts/icepack_in b/configuration/scripts/icepack_in index 19433d0f0..eb90a39ab 100644 --- a/configuration/scripts/icepack_in +++ b/configuration/scripts/icepack_in @@ -101,6 +101,9 @@ drhosdwind = 27.3 snwlvlfac = 0.3 snw_aging_table = 'test' + snw_growth_wet = 4.22e5 + drsnw_min = 0.0 + snwliq_max = 0.033 / &forcing_nml diff --git a/doc/source/master_list.bib b/doc/source/master_list.bib index 52719e143..5db6db001 100644 --- a/doc/source/master_list.bib +++ b/doc/source/master_list.bib @@ -421,6 +421,15 @@ @Article{Jin06 pages = {63-72}, url = {https://github.com/CICE-Consortium/CICE/blob/master/doc/PDF/JDWSTWLG06.pdf} } +@Article{Brun89 + author = "E. Brun", + title = "{Investigation on wet-snow metamorphism in respect of liquid-water content}", + journal = AG, + year = {1989}, + volume = {13}, + pages = {22-26}, + url = {http://dx.doi.org/10.3189/S0260305500007576} +} @Manual{Briegleb07 author = "B.P. Briegleb and B. Light", title = "{A Delta-Eddington multiple scattering parameterization for solar radiation in the sea ice component of the Community Climate System Model}", diff --git a/doc/source/science_guide/sg_snow.rst b/doc/source/science_guide/sg_snow.rst index 751fd8744..59a151c15 100755 --- a/doc/source/science_guide/sg_snow.rst +++ b/doc/source/science_guide/sg_snow.rst @@ -123,7 +123,7 @@ Together with snow volume, they also can be used to determine effective snow den Sources of :math:`m_{ice}` are snowfall, condensation, and freezing of liquid water within the snowpack; sinks are sublimation and melting. All of the sources and sinks of :math:`m_{ice}` are already computed in the code except for freezing of liquid water within the snow pack. -Sources of :math:`m_{liq}` are rain and snow melt; freezing of liquid water within the snowpack and runoff are sinks. Runoff and meltwater entering a snow layer (i.e., runoff from the layer above) are associated with vertical flow through the snow column. As in :cite:`Oleson10`, when the liquid water within a snow layer exceeds the layer's holding capacity, the excess water is added to the underlying layer, limited by the effective porosity of the layer. When ``use_smliq_pnd`` is true, the excess water is supplied to the melt pond parameterization, which puts a fraction of it into the pond volume and allows the rest to run off into the ocean. +Sources of :math:`m_{liq}` are rain and snow melt; freezing of liquid water within the snowpack and runoff are sinks. Runoff and meltwater entering a snow layer (i.e., runoff from the layer above) are associated with vertical flow through the snow column. As in :cite:`Oleson10`, when the liquid water within a snow layer exceeds the layer's holding capacity, the excess water is added to the underlying layer, limited by the effective porosity of the layer. The layer's holding capacity, or irreducible saturation level, is a namelist option, ``snwliq_max``, with values ranging from about 0.03 to approximately 0.1 (:cite:`Brun89`). When ``use_smliq_pnd`` is true, the excess water is supplied to the melt pond parameterization, which puts a fraction of it into the pond volume and allows the rest to run off into the ocean. The snow mass fractions of precipitation and old ice are saved for metamorphosing the snow grain radius. @@ -140,7 +140,7 @@ In the formation of depth hoar, dry snow kinetic metamorphism (TG metamorphism) The tracers :math:`m_{liq}` and :math:`m_{ice}` characterize the snow in each snow layer, for each ice category and horizontal grid cell. The model's meltpond volume covers a fraction of the grid cell and represents liquid in excess of :math:`m_{liq}`. The radiative effects of snow grain radius in the fraction of ice covered by pond volume are only calculated when the pond volume has not yet saturated the snow pack; otherwise, delta-Eddington transfer uses meltpond properties. Therefore, modelled changes in snow grain radii from metamorphism are designed specifically for the fraction without exposed (i.e. effective) melt ponds. -Following :cite:`Oleson10`, the new snow grain radius is computed as a weighted function of existing and new (freshly fallen, ``rsnw_fall``) snow grain radii, using parameters from a look-up table that depends on snow temperature, temperature gradient and (effective) density. The maximum snow radius is a namelist option, ``rsnw_tmax``. +Following :cite:`Oleson10` and :cite:`Brun89`, the new snow grain radius tracer is a weighted function of existing and new (freshly fallen, ``rsnw_fall``) snow grain radii. The snow grain radius grows over time via two processes: temperature gradient (or dry) metamorphism and wet metamorphism. Temperature gradient metamorphism growth rates are determined using parameters from a look-up table that depends on snow temperature, temperature gradient and (effective) density as described in :cite:`Flanner06`. Wet metamorphism growth rates depend on the snow liquid fraction, :math:`f_{liq}=m_{liq}/(m_{ice}+m_{liq})`. The overall magnitude of the wet metamorphism rate is controlled by the namelist parameter, ``snw_growth_wet``. When no liquid is present in snow, :cite:`Brun89` observe a minimum snow grain growth rate, :math:`drsnw_min_o`. In our formulation, the total snow grain growth rate is the sum of the growth rates from dry and wet metamorphism, with the requirement that the dry metamorphism rate be greater than or equal to a minimum growth rate. This minimum rate is adjusted through the namelist parameter ``drsnw_min`` which is a unitless scaling of :math:`drsnw_min_o`. The maximum snow radius is also a namelist option, ``rsnw_tmax``. From 67f17abfc4036cd881d139eb769abefe5f78ff18 Mon Sep 17 00:00:00 2001 From: "David A. Bailey" Date: Tue, 15 Jul 2025 15:01:39 -0600 Subject: [PATCH 16/34] A new sea level pond scheme. (#515) Add new sea level pond scheme. Set with tr_pond_sealvl = .true. in namelist. Added new module icepack_meltponds_sealvl.F90 Added new pond diagnostics (for all meltpond schemes): flpnd, expnd, frpnd, rfpnd, ilpnd (plus category versions), as well as mipnd, and rdpnd. Added new code to icepack_therm_mushy.F90 to handle the case of sealevel pond drainage. Updated shortwave code. Added new pond history fields. Added new namelist, tr_pond_sealvl, apnd_sl, tscale_pnd_drain Added new pondsealvl test Updated documentation Co-authored-by: David Clemens-Sewall Co-authored-by: David Clemens-Sewall Co-authored-by: David Clemens-Sewall Co-authored-by: eclare108213 Co-authored-by: apcraig --- columnphysics/icepack_flux.F90 | 32 +- columnphysics/icepack_itd.F90 | 24 +- columnphysics/icepack_mechred.F90 | 30 +- columnphysics/icepack_meltpond_lvl.F90 | 33 +- columnphysics/icepack_meltpond_sealvl.F90 | 478 ++++++++++++++++++ columnphysics/icepack_parameters.F90 | 48 +- columnphysics/icepack_shortwave.F90 | 289 +++++++---- columnphysics/icepack_therm_itd.F90 | 46 +- columnphysics/icepack_therm_mushy.F90 | 147 +++++- columnphysics/icepack_therm_vertical.F90 | 102 +++- columnphysics/icepack_tracers.F90 | 34 +- configuration/driver/icedrv_InitMod.F90 | 7 + configuration/driver/icedrv_flux.F90 | 26 + configuration/driver/icedrv_forcing.F90 | 2 + configuration/driver/icedrv_history.F90 | 116 ++++- configuration/driver/icedrv_init.F90 | 46 +- configuration/driver/icedrv_restart.F90 | 76 ++- configuration/driver/icedrv_step.F90 | 20 +- configuration/scripts/icepack_in | 3 + .../scripts/options/set_nml.pondsealvl | 7 + configuration/scripts/tests/base_suite.ts | 1 + doc/source/icepack_index.rst | 2 + doc/source/master_list.bib | 79 +++ doc/source/science_guide/sg_thermo.rst | 201 +++++++- doc/source/user_guide/ug_case_settings.rst | 2 + 25 files changed, 1636 insertions(+), 215 deletions(-) create mode 100644 columnphysics/icepack_meltpond_sealvl.F90 create mode 100644 configuration/scripts/options/set_nml.pondsealvl diff --git a/columnphysics/icepack_flux.F90 b/columnphysics/icepack_flux.F90 index 0c60616ad..637eeec42 100644 --- a/columnphysics/icepack_flux.F90 +++ b/columnphysics/icepack_flux.F90 @@ -12,7 +12,7 @@ module icepack_flux use icepack_parameters, only: c1, emissivity, snwgrain use icepack_warnings, only: warnstr, icepack_warnings_add use icepack_warnings, only: icepack_warnings_setabort, icepack_warnings_aborted - use icepack_tracers, only: tr_iso + use icepack_tracers, only: tr_iso, tr_pond implicit none private @@ -68,7 +68,12 @@ subroutine merge_fluxes (aicen, & Uref, Urefn, & Qref_iso, Qrefn_iso, & fiso_ocn, fiso_ocnn, & - fiso_evap, fiso_evapn) + fiso_evap, fiso_evapn,& + flpnd, flpndn, & + expnd, expndn, & + frpnd, frpndn, & + rfpnd, rfpndn, & + ilpnd, ilpndn) ! single category fluxes real (kind=dbl_kind), intent(in) :: & @@ -102,6 +107,11 @@ subroutine merge_fluxes (aicen, & dsnown , & ! change in snow depth (m) congeln , & ! congelation ice growth (m) snoicen , & ! snow-ice growth (m) + flpndn , & ! pond flushing rate due to ice permeability (m/step) + expndn , & ! exponential pond drainage rate (m/step) + frpndn , & ! pond drainage rate due to freeboard constraint (m/step) + rfpndn , & ! runoff rate due to rfrac (m/step) + ilpndn , & ! pond loss/gain due to ice lid (m/step) fswthrun_vdr, & ! vis dir sw radiation through ice bot (W/m**2) fswthrun_vdf, & ! vis dif sw radiation through ice bot (W/m**2) fswthrun_idr, & ! nir dir sw radiation through ice bot (W/m**2) @@ -139,6 +149,11 @@ subroutine merge_fluxes (aicen, & meltsliq, & ! mass of snow melt (kg/m^2) congel , & ! congelation ice growth (m) snoice , & ! snow-ice growth (m) + flpnd , & ! pond flushing rate due to ice permeability (m/step) + expnd , & ! exponential pond drainage rate (m/step) + frpnd , & ! pond drainage rate due to freeboard constraint (m/step) + rfpnd , & ! runoff rate due to rfrac (m/step) + ilpnd , & ! pond loss/gain (+/-) to ice lid freezing/melting (m/step) fswthru_vdr, & ! vis dir sw radiation through ice bot (W/m**2) fswthru_vdf, & ! vis dif sw radiation through ice bot (W/m**2) fswthru_idr, & ! nir dir sw radiation through ice bot (W/m**2) @@ -268,6 +283,19 @@ subroutine merge_fluxes (aicen, & congel = congel + congeln * aicen if (present(snoicen) .and. present(snoice)) & snoice = snoice + snoicen * aicen + ! Meltwater fluxes + if (tr_pond) then + if (present(flpndn) .and. present(flpnd)) & + flpnd = flpnd + flpndn * aicen + if (present(expndn) .and. present(expnd)) & + expnd = expnd + expndn * aicen + if (present(frpndn) .and. present(frpnd)) & + frpnd = frpnd + frpndn * aicen + if (present(rfpndn) .and. present(rfpnd)) & + rfpnd = rfpnd + rfpndn * aicen + if (present(ilpndn) .and. present(ilpnd)) & + ilpnd = ilpnd + ilpndn * aicen + endif end subroutine merge_fluxes diff --git a/columnphysics/icepack_itd.F90 b/columnphysics/icepack_itd.F90 index 013373ad8..e2dc94ce2 100644 --- a/columnphysics/icepack_itd.F90 +++ b/columnphysics/icepack_itd.F90 @@ -32,6 +32,7 @@ module icepack_itd use icepack_tracers, only: ncat, nilyr, nslyr, nblyr, ntrcr, nbtrcr, n_aero use icepack_tracers, only: nt_Tsfc, nt_qice, nt_qsno, nt_aero, nt_isosno, nt_isoice use icepack_tracers, only: nt_apnd, nt_hpnd, nt_fbri, tr_brine, bio_index + use icepack_tracers, only: tr_pond, tr_pond_lvl, nt_alvl use icepack_tracers, only: n_iso, tr_iso, nt_smice, nt_rsnw, nt_rhos, nt_sice use icepack_tracers, only: icepack_compute_tracers use icepack_parameters, only: skl_bgc, z_tracers, hi_min @@ -295,28 +296,36 @@ end subroutine rebin subroutine reduce_area (hin_max, & aicen, vicen, & - aicen_init,vicen_init) + aicen_init,vicen_init, & + mipnd, trcrn) real (kind=dbl_kind), intent(in) :: & hin_max ! lowest category boundary real (kind=dbl_kind), intent(inout) :: & aicen , & ! concentration of ice - vicen ! volume per unit area of ice (m) + vicen , & ! volume per unit area of ice (m) + mipnd ! pond 'drainage' due to ice melting (m / step) real (kind=dbl_kind), intent(in) :: & aicen_init, & ! old ice area for category 1 (m) vicen_init ! old ice volume for category 1 (m) + real (kind=dbl_kind), dimension (:,:), intent(in) :: & + trcrn ! ice tracers + ! local variables real (kind=dbl_kind) :: & hi0 , & ! initial hi hi1 , & ! current hi - dhi ! hi1 - hi0 + dhi , & ! hi1 - hi0 + da ! total change in area complete within this subroutine character(len=*),parameter :: subname='(reduce_area)' + da = aicen ! store value of aicen at start of the subroutine + hi0 = c0 if (aicen_init > c0) & hi0 = vicen_init / aicen_init @@ -339,6 +348,15 @@ subroutine reduce_area (hin_max, & endif endif + da = da - aicen ! -1*change in fractional area over the subroutine + if (tr_pond) then + if (tr_pond_lvl) then + mipnd = da*trcrn(nt_apnd,1)*trcrn(nt_hpnd,1)*trcrn(nt_alvl,1) + else + mipnd = da*trcrn(nt_apnd,1)*trcrn(nt_hpnd,1) + endif + endif + end subroutine reduce_area !======================================================================= diff --git a/columnphysics/icepack_mechred.F90 b/columnphysics/icepack_mechred.F90 index 0f043ab1d..7878f946f 100644 --- a/columnphysics/icepack_mechred.F90 +++ b/columnphysics/icepack_mechred.F90 @@ -42,7 +42,8 @@ module icepack_mechred use icepack_parameters, only: kstrength, krdg_partic, krdg_redist, mu_rdg use icepack_parameters, only: conserv_check, z_tracers use icepack_tracers, only: ncat, nilyr, nslyr, nblyr, n_aero - use icepack_tracers, only: tr_pond_topo, tr_aero, tr_iso, tr_brine, ntrcr, nbtrcr + use icepack_tracers, only: tr_aero, tr_iso, tr_brine, ntrcr, nbtrcr + use icepack_tracers, only: tr_pond_lvl, tr_pond_topo, tr_pond_sealvl use icepack_tracers, only: nt_qice, nt_qsno, nt_fbri, nt_sice use icepack_tracers, only: nt_alvl, nt_vlvl, nt_aero, nt_isosno, nt_isoice use icepack_tracers, only: nt_apnd, nt_hpnd @@ -108,7 +109,7 @@ subroutine ridge_ice (dt, ndtd, & dardg1ndt, dardg2ndt, & dvirdgndt, Tf, & araftn, vraftn, & - closing ) + closing, rdpnd) integer (kind=int_kind), intent(in) :: & ndtd ! number of dynamics subcycles @@ -165,7 +166,8 @@ subroutine ridge_ice (dt, ndtd, & closing , & ! rate of closing due to divergence/shear (1/s) fpond , & ! fresh water flux to ponds (kg/m^2/s) fresh , & ! fresh water flux to ocean (kg/m^2/s) - fhocn ! net heat flux to ocean (W/m^2) + fhocn , & ! net heat flux to ocean (W/m^2) + rdpnd ! pond drainage due to ridging (m avg. over cell) real (kind=dbl_kind), dimension(:), intent(inout), optional :: & dardg1ndt , & ! rate of fractional area loss by ridging ice (1/s) @@ -202,7 +204,8 @@ subroutine ridge_ice (dt, ndtd, & aksum , & ! ratio of area removed to area ridged msnow_mlt , & ! mass of snow added to ocean (kg m-2) esnow_mlt , & ! energy needed to melt snow in ocean (J m-2) - mpond , & ! mass of pond added to ocean (kg m-2) + mpond , & ! thickness of pond water (avg. over grid cell) lost + ! due to ridging (m) closing_net, & ! net rate at which area is removed (1/s) ! (ridging ice area - area of new ridges) / dt divu_adv , & ! divu as implied by transport scheme (1/s) @@ -602,9 +605,11 @@ subroutine ridge_ice (dt, ndtd, & enddo endif endif + ! diagnostic for all non-topo pond schemes, which are virtual if (present(fpond)) then fpond = fpond - mpond ! units change later endif + if (present(rdpnd)) rdpnd = mpond !----------------------------------------------------------------- ! Check for fractional ice area > 1. @@ -1143,7 +1148,8 @@ subroutine ridge_shift (dt, hin_max, & real (kind=dbl_kind), intent(inout) :: & msnow_mlt , & ! mass of snow added to ocean (kg m-2) esnow_mlt , & ! energy needed to melt snow in ocean (J m-2) - mpond ! mass of pond added to ocean (kg m-2) + mpond ! thickness of pond water, averaged over entire grid + ! cell area, lost to ridging (m) real (kind=dbl_kind), dimension(:), intent(inout) :: & maero ! aerosol mass added to ocean (kg m-2) @@ -1389,7 +1395,12 @@ subroutine ridge_shift (dt, hin_max, & enddo endif - if (tr_pond_topo) then + ! diagnostic for all non-topo pond schemes, which are virtual + if (tr_pond_lvl) then + mpond = mpond + ardg1n * trcrn(nt_apnd,n) & + * trcrn(nt_hpnd,n) & + * trcrn(nt_alvl,n) + elseif (tr_pond_topo .or. tr_pond_sealvl) then mpond = mpond + ardg1n * trcrn(nt_apnd,n) & * trcrn(nt_hpnd,n) endif @@ -1741,7 +1752,7 @@ subroutine icepack_step_ridge(dt, ndtd, & aice, fsalt, & first_ice, & flux_bio, closing, & - Tf, & + Tf, rdpnd, & docleanup, dorebin) real (kind=dbl_kind), intent(in) :: & @@ -1814,6 +1825,9 @@ subroutine icepack_step_ridge(dt, ndtd, & logical (kind=log_kind), dimension(:), intent(inout) :: & first_ice ! true until ice forms + real (kind=dbl_kind), intent(inout), optional :: & + rdpnd ! pond drainage due to ridging + logical (kind=log_kind), intent(in), optional :: & docleanup, & ! if false, do not call cleanup_itd (default true) dorebin ! if false, do not call rebin in cleanup_itd (default true) @@ -1890,7 +1904,7 @@ subroutine icepack_step_ridge(dt, ndtd, & dardg1ndt, dardg2ndt, & dvirdgndt, Tf, & araftn, vraftn, & - closing ) + closing, rdpnd ) if (icepack_warnings_aborted(subname)) return !----------------------------------------------------------------- diff --git a/columnphysics/icepack_meltpond_lvl.F90 b/columnphysics/icepack_meltpond_lvl.F90 index 90d5f684f..808e7b5b2 100644 --- a/columnphysics/icepack_meltpond_lvl.F90 +++ b/columnphysics/icepack_meltpond_lvl.F90 @@ -42,7 +42,9 @@ subroutine compute_ponds_lvl(dt, & qicen, sicen, & Tsfcn, alvl, & apnd, hpnd, ipnd, & - meltsliqn) + meltsliqn, frpndn, & + rfpndn, ilpndn, & + flpndn) real (kind=dbl_kind), intent(in) :: & dt ! time step (s) @@ -62,7 +64,11 @@ subroutine compute_ponds_lvl(dt, & meltsliqn ! liquid contribution to meltponds in dt (kg/m^2) real (kind=dbl_kind), intent(inout) :: & - apnd, hpnd, ipnd + apnd, hpnd, ipnd, & + frpndn, & ! pond drainage rate due to freeboard constraint (m/step) + rfpndn, & ! runoff rate due to rfrac (m/step) + ilpndn, & ! pond loss/gain due to ice lid (m/step) + flpndn ! pond flushing rate due to ice permeability (m/s) real (kind=dbl_kind), dimension (:), intent(in) :: & qicen, & ! ice layer enthalpy (J m-3) @@ -77,7 +83,9 @@ subroutine compute_ponds_lvl(dt, & ! local temporary variables real (kind=dbl_kind) :: & - volpn ! pond volume per unit area (m) + volpn, & ! pond volume per unit area (m) + hpond_tmp, & ! local variable for hpond before flushing + dvn_temp ! local variable for change in volume due to rfrac real (kind=dbl_kind), dimension (nilyr) :: & Tmlt ! melting temperature (C) @@ -149,6 +157,13 @@ subroutine compute_ponds_lvl(dt, & + melts*rhos & + frain* dt)*aicen endif + ! Track meltwater runoff fraction. Here dvn is volume of + ! meltwater (m3/m2) captured over entire grid cell area. + ! Multiply by (1-rfrac)/rfrac to get loss over entire area. + ! Divide by aicen to get loss per unit category area + ! (for consistency with melttn, frpndn, etc) + rfpndn = dvn * (c1-rfrac) / (rfrac * aicen) + dvn_temp = dvn ! shrink pond volume under freezing conditions if (trim(frzpnd) == 'cesm') then @@ -188,6 +203,9 @@ subroutine compute_ponds_lvl(dt, & endif volpn = volpn + dvn + ! Track lost/gained meltwater per unit category area from pond + ! lid freezing/melting. Note sign flip relative to dvn convention + ilpndn = (dvn_temp - dvn) / aicen !----------------------------------------------------------- ! update pond area and depth @@ -206,21 +224,25 @@ subroutine compute_ponds_lvl(dt, & elseif (alvl_tmp*aicen > c10*puny) then ! new ponds apondn = min (sqrt(volpn/(pndaspect*aicen)), alvl_tmp) - hpondn = pndaspect * apondn + hpondn = pndaspect * apondn ! Possible loss of meltwater if apondn == alvl_tmp else ! melt water runs off deformed ice apondn = c0 - hpondn = c0 + hpondn = c0 ! Loss of meltwater for very deformed ice endif apondn = max(apondn, c0) ! limit pond depth to maintain nonnegative freeboard + hpond_tmp = hpondn hpondn = min(hpondn, ((rhow-rhoi)*hi - rhos*hs)/rhofresh) + frpndn = (hpond_tmp - hpondn) * apondn ! fraction of grid cell covered by ponds apondn = apondn * aicen volpn = hpondn*apondn + ! note, this implies that if ponds fully drain or freeze their + ! depressions cease to exist and the lid ice also ceases to exist if (volpn <= c0) then volpn = c0 apondn = c0 @@ -250,6 +272,7 @@ subroutine compute_ponds_lvl(dt, & + 0.5*dvn/(pndaspect*apondn), alvl_tmp*aicen)) hpondn = c0 if (apondn > puny) hpondn = volpn/apondn + flpndn = -dvn/aicen endif endif diff --git a/columnphysics/icepack_meltpond_sealvl.F90 b/columnphysics/icepack_meltpond_sealvl.F90 new file mode 100644 index 000000000..a93e5bcee --- /dev/null +++ b/columnphysics/icepack_meltpond_sealvl.F90 @@ -0,0 +1,478 @@ +!======================================================================= + +! sealvl meltpond parameterization +! +! This meltpond parameterization partitions pond volume into depth +! and area based on an assumed, subcategory elevation distribution +! (hypsometry) which permits pond bases to sit below sea level. +! Pond upper surfaces can be below sea level (e.g., when ponds initially +! form in the spring or after mechanical redistribution), but drainage +! processes will not lower pond surfaces below sea level (with the +! default parameter values). Currently, the only physical impacts +! of pond water are in the delta-Eddington radiation scheme. +! +! The sealvl meltpond parameterization was inspired by the level pond +! parameterization of Elizabeth Hunke, David Hebert, and Olivier +! Lecomte. Wherever possible, the code matches the level pond scheme +! (e.g., the pond lid refreezing calculations). +! +! authors David Clemens-Sewall (NCAR/NOAA) + + module icepack_meltpond_sealvl + + use icepack_kinds + use icepack_parameters, only: c0, c1, c2, c10, p01, p5, puny + use icepack_parameters, only: viscosity_dyn, rhoi, rhos, rhow + use icepack_parameters, only: Timelt, Tffresh, Lfresh, rhofresh + use icepack_parameters, only: gravit, depressT, rhofresh, kice + use icepack_parameters, only: rhosi, use_smliq_pnd + use icepack_parameters, only: ktherm, frzpnd, dpscale, hi_min + use icepack_parameters, only: pndhyps, pndfrbd, pndhead, apnd_sl + use icepack_parameters, only: pndaspect + use icepack_tracers, only: nilyr + use icepack_warnings, only: warnstr, icepack_warnings_add + use icepack_warnings, only: icepack_warnings_setabort + use icepack_warnings, only: icepack_warnings_aborted + + implicit none + + private + public :: compute_ponds_sealvl, & + pond_hypsometry, & + pond_height + +!======================================================================= + + contains + +!======================================================================= + + subroutine compute_ponds_sealvl( dt, & + meltt, melts, frain, & + Tair, fsurfn, Tsfcn, & + dhs, ffrac, & + aicen, vicen, vsnon, & + qicen, sicen, & + apnd, hpnd, ipnd, & + meltsliqn, frpndn, & + ilpndn, flpndn) + + real (kind=dbl_kind), intent(in) :: & + dt ! time step (s) + + real (kind=dbl_kind), intent(in) :: & + Tsfcn, & ! surface temperature (C) + meltt, & ! top melt rate (m/s) + melts, & ! snow melt rate (m/s) + frain, & ! rainfall rate (kg/m2/s) + Tair, & ! air temperature (K) + fsurfn,& ! atm-ice surface heat flux (W/m2) + aicen, & ! ice area fraction + vicen, & ! ice volume (m) + vsnon, & ! snow volume (m) + meltsliqn ! liquid contribution to meltponds in dt (kg/m^2) + + real (kind=dbl_kind), intent(inout) :: & + apnd, hpnd, ipnd, & ! pond tracers + frpndn, & ! pond drainage rate due to freeboard constraint (m/step) + ilpndn, & ! pond loss/gain due to ice lid (m/step) + flpndn ! pond flushing rate due to ice permeability (m/s) + + real (kind=dbl_kind), dimension (:), intent(in) :: & + qicen, & ! ice layer enthalpy (J m-3) + sicen ! salinity (ppt) + + real (kind=dbl_kind), intent(in) :: & + dhs ! depth difference for snow on sea ice and pond ice + + real (kind=dbl_kind), intent(out) :: & + ffrac ! fraction of fsurfn over pond used to melt ipond + + ! local temporary variables + + real (kind=dbl_kind) :: & + dhpond, & ! change in hpond (m) + dvn_temp ! local variable for change in volume due to rfrac + + real (kind=dbl_kind), dimension (nilyr) :: & + Tmlt ! melting temperature (C) + + real (kind=dbl_kind) :: & + hi , & ! ice thickness (m) + hs , & ! snow depth (m) + dTs , & ! surface temperature diff for freeze-up (C) + Tp , & ! pond freezing temperature (C) + Ts , & ! surface air temperature (C) + vpondn , & ! pond volume per category area (m) + dvpondn , & ! change in pond volume per category area (m) + hlid , & ! refrozen lid thickness + dhlid , & ! change in refrozen lid thickness + bdt , & ! 2 kice dT dt / (rhoi Lfresh) + hpsurf , & ! height of pond surface above mean ice base (m) + draft, pressure_head, perm, drain ! for permeability + + real (kind=dbl_kind), parameter :: & + Td = c2 , & ! temperature difference for freeze-up (C) + rexp = p01 ! pond contraction scaling + + character(len=*),parameter :: subname='(compute_ponds_sealvl)' + + !----------------------------------------------------------------- + ! Initialize + !----------------------------------------------------------------- + + vpondn = hpnd * apnd + ffrac = c0 + + !----------------------------------------------------------------- + ! Identify grid cells where ponds can be + !----------------------------------------------------------------- + + if (aicen > puny) then + + hi = vicen/aicen + hs = vsnon/aicen + + if (hi < hi_min) then + + !----------------------------------------------------------- + ! Remove ponds on thin ice + !----------------------------------------------------------- + frpndn = vpondn + apnd = c0 + hpnd = c0 + vpondn = c0 + hlid = c0 + + else + + !----------------------------------------------------------- + ! update pond volume + !----------------------------------------------------------- + ! add melt water + if (use_smliq_pnd) then + dvpondn = (meltt*rhoi + meltsliqn)/rhofresh + else + dvpondn = (meltt*rhoi + melts*rhos + frain*dt)/rhofresh + endif + dvn_temp = dvpondn + + ! shrink pond volume under freezing conditions + if (trim(frzpnd) == 'cesm') then + Tp = Timelt - Td + dTs = max(Tp - Tsfcn,c0) + dvpondn = dvpondn - vpondn * (c1 - exp(rexp*dTs/Tp)) + + else + ! trim(frzpnd) == 'hlid' Stefan approximation + ! assumes pond is fresh (freezing temperature = 0 C) + ! and ice grows from existing pond ice + hlid = ipnd + if (dvpondn == c0) then ! freeze pond + Ts = Tair - Tffresh + if (Ts < c0) then + ! if (Ts < -c2) then ! as in meltpond_cesm + bdt = -c2*Ts*kice*dt/(rhoi*Lfresh) + dhlid = p5*sqrt(bdt) ! open water freezing + if (hlid > dhlid) dhlid = p5*bdt/hlid ! extant ice + dhlid = min(dhlid, hpnd*rhofresh/rhoi) + hlid = hlid + dhlid + else + dhlid = c0 ! to account for surface inversions + endif + else ! convert refrozen pond ice back to water + dhlid = max(fsurfn*dt / (rhoi*Lfresh), c0) ! > 0 + dhlid = -min(dhlid, hlid) ! < 0 + hlid = max(hlid + dhlid, c0) + if (hs - dhs < puny) then ! pond ice is snow-free + ! fraction of fsurfn over pond used to melt ipond + ffrac = c1 + if (fsurfn > puny) & + ffrac = min(-dhlid*rhoi*Lfresh/(dt*fsurfn), c1) + endif + endif + dvpondn = dvpondn - dhlid*apnd*rhoi/rhofresh + endif + + ! Track lost/gained meltwater per unit category area from + ! pond lid freezing/melting. Note sign flip relative to dvn + ilpndn = dvn_temp - dvpondn + + !----------------------------------------------------------- + ! update pond area and depth + !----------------------------------------------------------- + call pond_hypsometry(hpnd, apnd, dvpond=dvpondn, hin=hi) + if (icepack_warnings_aborted(subname)) return + + dhpond = c0 + ! limit pond depth to maintain nonnegative freeboard + if (trim(pndfrbd) == 'floor') then + dhpond = ((rhow-rhoi)*hi - rhos*hs)/rhofresh - hpnd + elseif (trim(pndfrbd) == 'category') then + if (apnd .gt. puny) & + dhpond = ((rhow-rhoi)*hi-rhos*hs)/(rhofresh*apnd) & + - hpnd + else + call icepack_warnings_add(subname// & + " invalid pndfrbd option" ) + call icepack_warnings_setabort(.true.,__FILE__,__LINE__) + if (icepack_warnings_aborted(subname)) return + endif + dhpond = min(dhpond, c0) ! strictly drainage + frpndn = - dhpond * apnd + call pond_hypsometry(hpnd, apnd, dhpond=dhpond, hin=hi) + if (icepack_warnings_aborted(subname)) return + + ! clean up empty ponds. Note, this implies that if ponds + ! fully drain or freeze, the lid ice also ceases to exist + if (hpnd <= puny .or. apnd <= puny) then + apnd = c0 + hpnd = c0 + hlid = c0 + endif + + !----------------------------------------------------------- + ! drainage due to permeability (flushing) + ! setting dpscale = 0 turns this off + ! NOTE this uses the initial salinity and melting T profiles + !----------------------------------------------------------- + + if (ktherm /= 2 .and. hpnd > c0 .and. dpscale > puny) then + draft = (rhos*hs + rhoi*hi + rhofresh*hpnd*apnd)/rhow + call pond_height(apnd, hpnd, hi, hpsurf) + if (icepack_warnings_aborted(subname)) return + pressure_head = gravit * rhow * max(hpsurf - draft, c0) + Tmlt(:) = -sicen(:) * depressT + call brine_permeability(qicen, & + sicen, Tmlt, perm) + if (icepack_warnings_aborted(subname)) return + drain = perm*pressure_head*dt/(viscosity_dyn*hi)*dpscale + dhpond = -min(drain, hpnd) + flpndn = -dhpond * apnd + call pond_hypsometry(hpnd, apnd, dhpond=dhpond, hin=hi) + if (icepack_warnings_aborted(subname)) return + endif + endif ! hi < hi_min + + !----------------------------------------------------------- + ! Reload tracer array + !----------------------------------------------------------- + if (trim(frzpnd) == 'hlid') ipnd = hlid + + endif + + end subroutine compute_ponds_sealvl + +!======================================================================= + +! determine the liquid fraction of brine in the ice and the permeability + + subroutine brine_permeability(qicen, salin, Tmlt, perm) + + use icepack_therm_shared, only: calculate_Tin_from_qin + + real (kind=dbl_kind), dimension(:), intent(in) :: & + qicen, & ! enthalpy for each ice layer (J m-3) + salin, & ! salinity (ppt) + Tmlt ! melting temperature (C) + + real (kind=dbl_kind), intent(out) :: & + perm ! permeability (m^2) + + ! local variables + + real (kind=dbl_kind) :: & + Sbr ! brine salinity + + real (kind=dbl_kind), dimension(nilyr) :: & + Tin, & ! ice temperature (C) + phi ! liquid fraction + + integer (kind=int_kind) :: k + + character(len=*),parameter :: subname='(brine_permeability)' + + !----------------------------------------------------------------- + ! Compute ice temperatures from enthalpies using quadratic formula + !----------------------------------------------------------------- + + do k = 1,nilyr + Tin(k) = calculate_Tin_from_qin(qicen(k),Tmlt(k)) + enddo + + !----------------------------------------------------------------- + ! brine salinity and liquid fraction + !----------------------------------------------------------------- + + do k = 1,nilyr + Sbr = c1/(1.e-3_dbl_kind - depressT/Tin(k)) ! Notz thesis eq 3.6 + phi(k) = salin(k)/Sbr ! liquid fraction + if (phi(k) < 0.05) phi(k) = c0 ! impermeable + enddo + + !----------------------------------------------------------------- + ! permeability + !----------------------------------------------------------------- + + perm = 3.0e-8_dbl_kind * (minval(phi))**3 + + end subroutine brine_permeability + +!======================================================================= + +! compute the changes in pond area and depth + + subroutine pond_hypsometry(hpnd, apnd, dhpond, dvpond, hin) + + real (kind=dbl_kind), intent(inout) :: & + hpnd, & ! pond depth of ponded area tracer + apnd ! pond fractional area of category tracer + + real (kind=dbl_kind), intent(in), optional :: & + dvpond, & ! incoming change in pond volume per category area + dhpond, & ! incoming change in pond depth + hin ! category ice thickness + + ! local variables + + real (kind=dbl_kind) :: & + dv, & ! local variable for change in pond volume + vp, & ! local variable for pond volume per category area + pndasp ! pond aspect ratio + + character(len=*),parameter :: subname='(pond_hypsometry)' + + ! Behavior is undefined if dhpond and dvpond are both present + if (present(dhpond) .and. present(dvpond)) then + call icepack_warnings_setabort(.true.,__FILE__,__LINE__) + call icepack_warnings_add(subname// & + " dhpond and dvpond cannot both be input" ) + return + endif + ! or both absent + if ((.not. present(dhpond)) .and. (.not. present(dvpond))) then + call icepack_warnings_setabort(.true.,__FILE__,__LINE__) + call icepack_warnings_add(subname// & + " dhpond and dvpond cannot both be absent" ) + return + endif + ! Check that category ice thickness is present if needed + if ((trim(pndhyps) == 'sealevel') .and. (.not. present(hin))) then + call icepack_warnings_setabort(.true.,__FILE__,__LINE__) + call icepack_warnings_add(subname// & + " hin needed for sealevel ponds") + return + endif + + ! Get the change in volume + if (present(dvpond)) then + dv = dvpond + else ! compute change in volume from change in depth + dv = dhpond * apnd + endif + ! compute initial pond volume from area and depth + vp = apnd * hpnd + vp = vp + dv ! update pond volume + ! Compute pond area assuming that apond*pndaspect = hpond + if (vp <= puny) then + apnd = c0 + hpnd = c0 + else + if (trim(pndhyps) == 'sealevel') then + pndasp = calc_pndasp(hin) + elseif (trim(pndhyps) == 'fixed') then + pndasp = pndaspect + else + call icepack_warnings_add(subname// & + " unsupported pndhyps option" ) + call icepack_warnings_setabort(.true.,__FILE__,__LINE__) + if (icepack_warnings_aborted(subname)) return + endif + apnd = sqrt(vp/pndasp) + ! preserve pond volume if pond fills all available area + hpnd = c0 + if (apnd < c1) then + hpnd = apnd * pndasp + else + apnd = 1 ! ponds fill entire category + hpnd = vp ! conserve volume + endif + endif + + end subroutine pond_hypsometry + +!======================================================================= + +! compute the height of pond upper surface above mean base of ice + + subroutine pond_height(apond, hpnd, hin, hpsurf) + + real (kind=dbl_kind), intent(in) :: & + hin , & ! category mean ice thickness + apond , & ! pond area fraction of the category + hpnd ! mean pond depth (m) + + real (kind=dbl_kind), intent(out) :: & + hpsurf ! height of pond surface above base of the ice (m) + + ! local variables + real (kind=dbl_kind) :: & + pndasp ! pond aspect ratio + + character(len=*),parameter :: subname='(pond_height)' + + if (trim(pndhead) == 'perched') then + hpsurf = hin + hpnd + elseif (trim(pndhead) == 'hyps') then + if ((trim(pndhyps) == 'fixed') .or. & + (trim(pndhyps) == 'sealevel')) then + ! Applying a fixed aspect ratio to the ponds implicitly + ! assumes that the hypsometric curve has a constant slope + ! of double the aspect ratio. + ! If ponds occupy lowest elevations first. + if (trim(pndhyps) == 'sealevel') then + pndasp = calc_pndasp(hin) + else + pndasp = pndaspect + endif + if (apond < c1) then + hpsurf = hin - pndasp + c2*pndasp*apond + else ! ponds cover all available area + hpsurf = hin + hpnd + endif + else + call icepack_warnings_add(subname// & + " unsupported pndhyps option" ) + call icepack_warnings_setabort(.true.,__FILE__,__LINE__) + if (icepack_warnings_aborted(subname)) return + endif + else + call icepack_warnings_add(subname// & + " invalid pndhead option" ) + call icepack_warnings_setabort(.true.,__FILE__,__LINE__) + if (icepack_warnings_aborted(subname)) return + endif + + end subroutine pond_height + +!======================================================================= + + function calc_pndasp(hin) & + result(pndasp) + + real (kind=dbl_kind), intent(in) :: & + hin ! category mean ice thickness (m) + + real (kind=dbl_kind) :: & + pndasp ! pond aspect ratio + + character(len=*),parameter :: subname='(calc_pndasp)' + + ! Compute the pond aspect ratio for sea level ponds + pndasp = hin*(rhow - rhosi) / & + (rhofresh*apnd_sl**c2 - c2*rhow*apnd_sl + rhow) + + end function calc_pndasp + + end module icepack_meltpond_sealvl +!======================================================================= diff --git a/columnphysics/icepack_parameters.F90 b/columnphysics/icepack_parameters.F90 index ef20ad419..588dbb84c 100644 --- a/columnphysics/icepack_parameters.F90 +++ b/columnphysics/icepack_parameters.F90 @@ -235,6 +235,12 @@ module icepack_parameters character (len=char_len), public :: & snw_ssp_table = 'test' ! lookup table: 'snicar' or 'test' + ! Parameters for the impact of pond depth on shortwave + real (kind=dbl_kind), public :: & + hpmin = 0.005_dbl_kind, & ! minimum allowed melt pond depth (m) + hp0 = 0.200_dbl_kind ! pond depth below which transition to bare ice + + !----------------------------------------------------------------------- ! Parameters for dynamics, including ridging and strength !----------------------------------------------------------------------- @@ -331,18 +337,27 @@ module icepack_parameters !----------------------------------------------------------------------- real (kind=dbl_kind), public :: & - hs0 = 0.03_dbl_kind ! snow depth for transition to bare sea ice (m) - - ! level-ice ponds - character (len=char_len), public :: & - frzpnd = 'cesm' ! pond refreezing parameterization + hs0 = 0.03_dbl_kind, & ! snow depth for transition to bare sea ice (m) + hs1 = 0.03_dbl_kind ! snow depth for transition to bare pond ice (m) real (kind=dbl_kind), public :: & dpscale = 0.001_dbl_kind,& ! alter e-folding time scale for flushing (ktherm=1) rfracmin = 0.15_dbl_kind, & ! minimum retained fraction of meltwater rfracmax = 0.85_dbl_kind, & ! maximum retained fraction of meltwater - pndaspect = 0.8_dbl_kind, & ! ratio of pond depth to area fraction - hs1 = 0.03_dbl_kind ! snow depth for transition to bare pond ice (m) + pndaspect = 0.8_dbl_kind ! ratio of pond depth to area fraction + + character (len=char_len), public :: & + frzpnd = 'cesm' ! pond refreezing parameterization + + ! sealvl ponds + real (kind=dbl_kind), public :: & + apnd_sl = 0.27_dbl_kind ! equilibrium pond fraction for sea level parameterization + + character (len=char_len), public :: & + pndhyps = 'sealevel' , & ! pond hypsometry option + pndfrbd = 'floor' , & ! over what domain to calculate freeboard constraint + pndhead = 'perched' , & ! geometry for computing pond pressure head + pndmacr = 'lambda' ! driving force for macro-flaw pond drainage ! topo ponds real (kind=dbl_kind), public :: & @@ -574,7 +589,7 @@ subroutine icepack_init_parameters( & atmbndy_in, calc_strair_in, formdrag_in, highfreq_in, natmiter_in, & atmiter_conv_in, calc_dragio_in, & tfrz_option_in, kitd_in, kcatbound_in, hs0_in, frzpnd_in, & - saltflux_option_in, congel_freeze_in, & + apnd_sl_in, saltflux_option_in, congel_freeze_in, & floeshape_in, wave_spec_in, wave_spec_type_in, nfreq_in, & dpscale_in, rfracmin_in, rfracmax_in, pndaspect_in, hs1_in, hp1_in, & bgc_flux_type_in, z_tracers_in, scale_bgc_in, solve_zbgc_in, & @@ -1030,7 +1045,7 @@ subroutine icepack_init_parameters( & real (kind=dbl_kind), intent(in), optional :: & hs0_in ! snow depth for transition to bare sea ice (m) - ! level-ice ponds + ! level-ice and sealvl ponds character (len=*), intent(in), optional :: & frzpnd_in ! pond refreezing parameterization @@ -1041,6 +1056,10 @@ subroutine icepack_init_parameters( & pndaspect_in, & ! ratio of pond depth to pond fraction hs1_in ! tapering parameter for snow on pond ice + ! sealvl ponds + real (kind=dbl_kind), intent(in), optional :: & + apnd_sl_in ! equilibrium pond fraction for sea level parameterization + ! topo ponds real (kind=dbl_kind), intent(in), optional :: & hp1_in ! critical parameter for pond ice thickness @@ -1217,6 +1236,7 @@ subroutine icepack_init_parameters( & if (present(rfracmin_in) ) rfracmin = rfracmin_in if (present(rfracmax_in) ) rfracmax = rfracmax_in if (present(pndaspect_in) ) pndaspect = pndaspect_in + if (present(apnd_sl_in) ) apnd_sl = apnd_sl_in if (present(hs1_in) ) hs1 = hs1_in if (present(hp1_in) ) hp1 = hp1_in if (present(snwredist_in) ) snwredist = snwredist_in @@ -1577,7 +1597,7 @@ subroutine icepack_query_parameters( & atmbndy_out, calc_strair_out, formdrag_out, highfreq_out, natmiter_out, & atmiter_conv_out, calc_dragio_out, & tfrz_option_out, kitd_out, kcatbound_out, hs0_out, frzpnd_out, & - saltflux_option_out, congel_freeze_out, & + apnd_sl_out, saltflux_option_out, congel_freeze_out, & floeshape_out, wave_spec_out, wave_spec_type_out, nfreq_out, & dpscale_out, rfracmin_out, rfracmax_out, pndaspect_out, hs1_out, hp1_out, & bgc_flux_type_out, z_tracers_out, scale_bgc_out, solve_zbgc_out, & @@ -2043,7 +2063,7 @@ subroutine icepack_query_parameters( & real (kind=dbl_kind), intent(out), optional :: & hs0_out ! snow depth for transition to bare sea ice (m) - ! level-ice ponds + ! level-ice and sealvl ponds character (len=*), intent(out), optional :: & frzpnd_out ! pond refreezing parameterization @@ -2054,6 +2074,10 @@ subroutine icepack_query_parameters( & pndaspect_out, & ! ratio of pond depth to pond fraction hs1_out ! tapering parameter for snow on pond ice + ! sealvl ponds + real (kind=dbl_kind), intent(out), optional :: & + apnd_sl_out ! equilibrium pond fraction for sea level parameterization + ! topo ponds real (kind=dbl_kind), intent(out), optional :: & hp1_out ! critical parameter for pond ice thickness @@ -2262,6 +2286,7 @@ subroutine icepack_query_parameters( & if (present(rfracmin_out) ) rfracmin_out = rfracmin if (present(rfracmax_out) ) rfracmax_out = rfracmax if (present(pndaspect_out) ) pndaspect_out = pndaspect + if (present(apnd_sl_out) ) apnd_sl_out = apnd_sl if (present(hs1_out) ) hs1_out = hs1 if (present(hp1_out) ) hp1_out = hp1 if (present(snwredist_out) ) snwredist_out = snwredist @@ -2572,6 +2597,7 @@ subroutine icepack_write_parameters(iounit) write(iounit,*) " rfracmin = ", rfracmin write(iounit,*) " rfracmax = ", rfracmax write(iounit,*) " pndaspect = ", pndaspect + write(iounit,*) " apnd_sl = ", apnd_sl write(iounit,*) " hs1 = ", hs1 write(iounit,*) " hp1 = ", hp1 write(iounit,*) " snwredist = ", trim(snwredist) diff --git a/columnphysics/icepack_shortwave.F90 b/columnphysics/icepack_shortwave.F90 index 863d3799e..9fc97ca7a 100644 --- a/columnphysics/icepack_shortwave.F90 +++ b/columnphysics/icepack_shortwave.F90 @@ -53,10 +53,12 @@ module icepack_shortwave use icepack_parameters, only: pndaspect, albedo_type, albicev, albicei, albsnowv, albsnowi, ahmax use icepack_parameters, only: snw_ssp_table, modal_aero, semi_implicit_Tsfc use icepack_parameters, only: dEdd_algae + use icepack_parameters, only: hpmin, hp0 use icepack_tracers, only: ncat, nilyr, nslyr, nblyr use icepack_tracers, only: ntrcr, nbtrcr_sw - use icepack_tracers, only: tr_pond_lvl, tr_pond_topo + use icepack_tracers, only: tr_pond_lvl, tr_pond_topo, tr_pond_sealvl + use icepack_tracers, only: tr_lvl use icepack_tracers, only: tr_bgc_N, tr_aero use icepack_tracers, only: nt_bgc_N, nt_zaero use icepack_tracers, only: tr_zaero, nlt_chl_sw, nlt_zaero_sw @@ -114,10 +116,6 @@ module icepack_shortwave icepack_init_radiation, & icepack_step_radiation - real (kind=dbl_kind), parameter :: & - hpmin = 0.005_dbl_kind, & ! minimum allowed melt pond depth (m) - hp0 = 0.200_dbl_kind ! pond depth below which transition to bare ice - real (kind=dbl_kind), parameter :: & exp_argmax = c10 ! maximum argument of exponential @@ -907,6 +905,7 @@ end subroutine absorbed_solar ! author: Bruce P. Briegleb, NCAR ! 2011 ECH modified for melt pond tracers ! 2013 ECH merged with NCAR version +! 2024 DCS refactored for sealvl ponds subroutine run_dEdd(dt, & aicen, vicen, & @@ -986,14 +985,14 @@ subroutine run_dEdd(dt, & alvln, & ! level-ice area fraction apndn, & ! pond area fraction hpndn, & ! pond depth (m) - ipndn ! pond refrozen lid thickness (m) + ipndn, & ! pond refrozen lid thickness (m) + ffracn ! fraction of fsurfn used to melt ipond real(kind=dbl_kind), dimension(:,:), intent(in) :: & aeron, & ! aerosols (kg/m^3) trcrn_bgcsw ! zaerosols (kg/m^3) + chlorophyll on shorthwave grid real(kind=dbl_kind), dimension(:), intent(inout) :: & - ffracn, & ! fraction of fsurfn used to melt ipond dhsn ! depth difference for snow on sea ice and pond ice real(kind=dbl_kind), intent(inout) :: & @@ -1041,10 +1040,7 @@ subroutine run_dEdd(dt, & ! snow variables for Delta-Eddington shortwave real (kind=dbl_kind) :: & fsn , & ! snow horizontal fraction - hsn , & ! snow depth (m) - hsnlvl , & ! snow depth over level ice (m) - vsn , & ! snow volume - alvl ! area fraction of level ice + hsn ! snow depth (m) real (kind=dbl_kind), dimension (nslyr) :: & rhosnwn , & ! snow density (kg/m3) @@ -1052,6 +1048,7 @@ subroutine run_dEdd(dt, & ! pond variables for Delta-Eddington shortwave real (kind=dbl_kind) :: & + apondn , & ! pond fraction of category (incl. deformed) fpn , & ! pond fraction of ice cover hpn ! actual pond depth (m) @@ -1059,17 +1056,6 @@ subroutine run_dEdd(dt, & n , & ! thickness category index k ! snow layer index - real (kind=dbl_kind) :: & - ipn , & ! refrozen pond ice thickness (m), mean over ice fraction - hp , & ! pond depth - hs , & ! snow depth - asnow , & ! fractional area of snow cover - rp , & ! volume fraction of retained melt water to total liquid content - hmx , & ! maximum available snow infiltration equivalent depth - dhs , & ! local difference in snow depth on sea ice and pond ice - spn , & ! snow depth on refrozen pond (m) - tmp ! 0 or 1 - ! needed for optional fswthrun arrays when passed as scalars real (kind=dbl_kind) :: & l_fswthru_vdr , & ! vis dir SW through ice to ocean (W m-2) @@ -1136,85 +1122,31 @@ subroutine run_dEdd(dt, & ! set pond properties if (tr_pond_lvl) then - hsnlvl = hsn ! initialize - if (trim(snwredist) == 'bulk') then - hsnlvl = hsn / (c1 + snwlvlfac*(c1-alvln(n))) - ! snow volume over level ice - alvl = aicen(n) * alvln(n) - if (alvl > puny) then - vsn = hsnlvl * alvl - else - vsn = vsnon(n) - alvl = aicen(n) - endif - ! set snow properties over level ice - call shortwave_dEdd_set_snow(R_snw, & - dT_mlt, rsnw_mlt, & - alvl, vsn, & - Tsfcn(n), fsn, & - hs0, hsnlvl, & - rhosnwn(:), rsnwn(:), & - l_rsnows(:)) - if (icepack_warnings_aborted(subname)) return - endif ! snwredist - - fpn = c0 ! fraction of ice covered in pond - hpn = c0 ! pond depth over fpn - ! refrozen pond lid thickness avg over ice - ! allow snow to cover pond ice - ipn = alvln(n) * apndn(n) * ipndn(n) - dhs = dhsn(n) ! snow depth difference, sea ice - pond - if (.not. l_initonly .and. ipn > puny .and. & - dhs < puny .and. fsnow*dt > hs_min) & - dhs = hsnlvl - fsnow*dt ! initialize dhs>0 - spn = hsnlvl - dhs ! snow depth on pond ice - if (.not. l_initonly .and. ipn*spn < puny) dhs = c0 - dhsn(n) = dhs ! save: constant until reset to 0 - - ! not using ipn assumes that lid ice is perfectly clear - ! if (ipn <= 0.3_dbl_kind) then - - ! fraction of ice area - fpn = apndn(n) * alvln(n) - ! pond depth over fraction fpn - hpn = hpndn(n) - - ! reduce effective pond area absorbing surface heat flux - ! due to flux already having been used to melt pond ice - fpn = (c1 - ffracn(n)) * fpn - - ! taper pond area with snow on pond ice - if (dhs > puny .and. spn >= puny .and. hs1 > puny) then - asnow = min(spn/hs1, c1) - fpn = (c1 - asnow) * fpn - endif - - ! infiltrate snow - hp = hpn - if (hp > puny) then - hs = hsnlvl - rp = rhofresh*hp/(rhofresh*hp + rhos*hs) - if (rp < p15) then - fpn = c0 - hpn = c0 - else - hmx = hs*(rhofresh - rhos)/rhofresh - tmp = max(c0, sign(c1, hp-hmx)) ! 1 if hp>=hmx, else 0 - hp = (rhofresh*hp + rhos*hs*tmp) & - / (rhofresh - rhos*(c1-tmp)) - hsn = hsn - hp*fpn*(c1-tmp) - hpn = hp * tmp - fpn = fpn * tmp - endif - endif ! hp > puny - - ! Zero out fraction of thin ponds for radiation only - if (hpn < hpmin) fpn = c0 - fsn = min(fsn, c1-fpn) - - ! endif ! masking by lid ice - apeffn(n) = fpn ! for history - + apondn = alvln(n)*apndn(n) + call shortwave_dEdd_set_eff(aicen(n), vsnon(n), & + alvln(n), apondn, & + hpndn(n), ipndn(n), & + ffracn(n), fsnow, & + dt, Tsfcn(n), & + fsn, hsn, & + dhsn(n), fpn, & + hpn, apeffn(n), & + l_rsnows(:), rhosnwn(:), & + rsnwn(:), l_initonly) + if (icepack_warnings_aborted(subname)) return + elseif (tr_pond_sealvl) then + apondn = apndn(n) + call shortwave_dEdd_set_eff(aicen(n), vsnon(n), & + alvln(n), apondn, & + hpndn(n), ipndn(n), & + ffracn(n), fsnow, & + dt, Tsfcn(n), & + fsn, hsn, & + dhsn(n), fpn, & + hpn, apeffn(n), & + l_rsnows(:), rhosnwn(:), & + rsnwn(:), l_initonly) + if (icepack_warnings_aborted(subname)) return elseif (tr_pond_topo) then ! Lid effective if thicker than hp1 if (apndn(n)*aicen(n) > puny .and. ipndn(n) < hp1) then @@ -2749,7 +2681,9 @@ subroutine compute_dEdd_3bd( & enddo ! k endif ! adjust pond iops if pond depth within specified range - if( hpmin <= hp .and. hp <= hp0 ) then + ! turn off for sea level ponds + if(.not. tr_pond_sealvl .and. & + hpmin <= hp .and. hp < hp0 ) then k = kii sig_i = ki_ssl (ns) * wi_ssl (ns) sig_p = ki_p_ssl(ns) * wi_p_ssl(ns) @@ -3550,6 +3484,157 @@ subroutine shortwave_dEdd_set_snow(R_snw, & endif ! snwgrain end subroutine shortwave_dEdd_set_snow +!======================================================================= +! +! Set the 'effective' snow and pond fractions and depths for dEdd +! +! author: Bruce P. Briegleb, NCAR +! 2013: E Hunke merged with NCAR version +! 2024: DCS refactored for sealvl ponds + + subroutine shortwave_dEdd_set_eff(aicen, vsnon, alvln, & + apondn, hpndn, ipndn, & + ffracn, fsnow, dt, & + Tsfcn, fsn, hsn, & + dhsn, fpn, hpn, & + apeffn, l_rsnows,rhosnwn, & + rsnwn, l_initonly) + + real (kind=dbl_kind), intent(in) :: & + aicen , & ! concentration of ice + vsnon , & ! volume per unit area of snow (m) + alvln , & ! level-ice area fraction + apondn , & ! pond area fraction of category (incl. deformed) + hpndn , & ! pond depth (m) + ipndn , & ! pond refrozen lid thickness (m) + ffracn , & ! fraction of fsurfn used to melt ipond + fsnow , & ! snowfall rate (kg/m^2 s) + dt , & ! time step (s) + Tsfcn ! surface temperature (deg C) + + real (kind=dbl_kind), intent(inout) :: & + fsn , & ! snow horizontal fraction + hsn , & ! snow depth (m) + dhsn , & ! depth difference for snow on sea ice and pond ice + fpn , & ! pond fraction of ice cover + hpn ! actual pond depth (m) + + real (kind=dbl_kind), intent(out) :: & + apeffn ! effective pond area used for radiation + + real(kind=dbl_kind), dimension(nslyr), intent(in) :: & + l_rsnows ! snow grain radius tracer (10^-6 m) + + real (kind=dbl_kind), dimension (nslyr), intent(out) :: & + rhosnwn, & ! snow density (kg/m3) + rsnwn ! snow grain radius (micrometers) + + logical (kind=log_kind), intent(in) :: & + l_initonly ! local initonly value + + ! local variables + real (kind=dbl_kind) :: & + hsnlvl , & ! snow depth over level ice (m) + vsn , & ! snow volume + alvl , & ! area fraction of level ice + ipn , & ! pond lid thickness (m), mean over category + hp , & ! pond depth + hs , & ! snow depth + asnow , & ! fractional area of snow cover + rp , & ! ratio retained melt water to total liquid content + hmx , & ! maximum available snow infiltration equiv. depth + dhs , & ! local diff. in snow depth on sea ice and pond ice + spn , & ! snow depth on refrozen pond (m) + tmp ! 0 or 1 + + character(len=*),parameter :: subname='(shortwave_dEdd_set_eff)' + +!----------------------------------------------------------------------- + hsnlvl = hsn ! initialize + if (trim(snwredist) == 'bulk') then + if (.not. tr_lvl) then + call icepack_warnings_add(subname//' ERROR: need lvl trcr') + call icepack_warnings_setabort(.true.,__FILE__,__LINE__) + return + endif + hsnlvl = hsn / (c1 + snwlvlfac*(c1-alvln)) + ! snow volume over level ice + alvl = aicen * alvln + if (alvl > puny) then + vsn = hsnlvl * alvl + else + vsn = vsnon + alvl = aicen + endif + ! set snow properties over level ice + call shortwave_dEdd_set_snow(R_snw, & + dT_mlt, rsnw_mlt, & + alvl, vsn, & + Tsfcn, fsn, & + hs0, hsnlvl, & + rhosnwn(:), rsnwn(:), & + l_rsnows(:)) + if (icepack_warnings_aborted(subname)) return + endif ! snwredist + + fpn = c0 ! fraction of ice covered in pond + hpn = c0 ! pond depth over fpn + ! refrozen pond lid thickness avg over ice + ! allow snow to cover pond ice + ipn = apondn * ipndn + dhs = dhsn ! snow depth difference, sea ice - pond + if (.not. l_initonly .and. ipn > puny .and. & + dhs < puny .and. fsnow*dt > hs_min) & + dhs = hsnlvl - fsnow*dt ! initialize dhs>0 + spn = hsnlvl - dhs ! snow depth on pond ice + if (.not. l_initonly .and. ipn*spn < puny) dhs = c0 + dhsn = dhs ! save: constant until reset to 0 + + ! not using ipn assumes that lid ice is perfectly clear + ! if (ipn <= 0.3_dbl_kind) then + + ! fraction of ice area + fpn = apondn + ! pond depth over fraction fpn + hpn = hpndn + + ! reduce effective pond area absorbing surface heat flux + ! due to flux already having been used to melt pond ice + fpn = (c1 - ffracn) * fpn + + ! taper pond area with snow on pond ice + if (dhs > puny .and. spn >= puny .and. hs1 > puny) then + asnow = min(spn/hs1, c1) + fpn = (c1 - asnow) * fpn + endif + + ! infiltrate snow + hp = hpn + if (hp > puny) then + hs = hsnlvl + rp = rhofresh*hp/(rhofresh*hp + rhos*hs) + if (rp < p15) then + fpn = c0 + hpn = c0 + else + hmx = hs*(rhofresh - rhos)/rhofresh + tmp = max(c0, sign(c1, hp-hmx)) ! 1 if hp>=hmx, else 0 + hp = (rhofresh*hp + rhos*hs*tmp) & + / (rhofresh - rhos*(c1-tmp)) + hsn = hsn - hp*fpn*(c1-tmp) + hpn = hp * tmp + fpn = fpn * tmp + endif + endif ! hp > puny + + ! Zero out fraction of thin ponds for radiation only + if (hpn < hpmin) fpn = c0 + fsn = min(fsn, c1-fpn) + + ! endif ! masking by lid ice + apeffn = fpn ! for history + + end subroutine shortwave_dEdd_set_eff !======================================================================= ! diff --git a/columnphysics/icepack_therm_itd.F90 b/columnphysics/icepack_therm_itd.F90 index f7e74c9d0..fc3987b78 100644 --- a/columnphysics/icepack_therm_itd.F90 +++ b/columnphysics/icepack_therm_itd.F90 @@ -39,7 +39,7 @@ module icepack_therm_itd use icepack_tracers, only: nt_apnd, nt_hpnd, nt_aero, nt_isosno, nt_isoice use icepack_tracers, only: nt_Tsfc, nt_iage, nt_FY, nt_fsd, nt_rhos, nt_sice use icepack_tracers, only: nt_alvl, nt_vlvl - use icepack_tracers, only: tr_pond_lvl, tr_pond_topo + use icepack_tracers, only: tr_pond_lvl, tr_pond_topo, tr_pond use icepack_tracers, only: tr_iage, tr_FY, tr_lvl, tr_aero, tr_iso, tr_brine, tr_fsd use icepack_tracers, only: n_aero, n_iso use icepack_tracers, only: bio_index @@ -98,7 +98,8 @@ subroutine linear_itd (hin_max, trcr_depend, & aicen, trcrn, & vicen, vsnon, & aice, aice0, & - fpond, Tf ) + fpond, Tf, & + mipnd) real (kind=dbl_kind), dimension(0:ncat), intent(in) :: & hin_max ! category boundaries (m) @@ -134,6 +135,9 @@ subroutine linear_itd (hin_max, trcr_depend, & aice0 , & ! concentration of open water fpond ! fresh water flux to ponds (kg/m^2/s) + real (kind=dbl_kind), intent(inout), optional :: & + mipnd ! pond 'drainage' due to ice melting (m / step) + ! local variables integer (kind=int_kind) :: & @@ -463,6 +467,14 @@ subroutine linear_itd (hin_max, trcr_depend, & if (tr_pond_topo) & fpond = fpond - (da0 * trcrn(nt_apnd,1) & * trcrn(nt_hpnd,1)) + if (tr_pond .and. present(mipnd)) then + if (tr_pond_lvl) then + mipnd = mipnd + da0 * trcrn(nt_apnd,1) & + * trcrn(nt_hpnd,1) * trcrn(nt_alvl,1) + else + mipnd = mipnd + da0*trcrn(nt_apnd,1)*trcrn(nt_hpnd,1) + endif + endif endif ! etamax > 0 @@ -877,7 +889,8 @@ subroutine lateral_melt (dt, fpond, & wlat, & aicen, vicen, & vsnon, trcrn, & - flux_bio, d_afsd_latm) + flux_bio, d_afsd_latm,& + mipnd) real (kind=dbl_kind), intent(in) :: & dt ! time step (s) @@ -903,6 +916,9 @@ subroutine lateral_melt (dt, fpond, & fhocn , & ! net heat flux to ocean (W/m^2) meltl ! lateral ice melt (m/step-->cm/day) + real (kind=dbl_kind), intent(inout), optional :: & + mipnd ! pond 'drainage' due to ice melting (m / step) + real (kind=dbl_kind), dimension(nbtrcr), intent(inout) :: & flux_bio ! biology tracer flux from layer bgc (mmol/m^2/s) @@ -1013,6 +1029,16 @@ subroutine lateral_melt (dt, fpond, & fpond = fpond - dfpond endif + if (tr_pond .and. present(mipnd)) then + if (tr_pond_lvl) then + mipnd = mipnd + aicen(n)*trcrn(nt_apnd,n)*trcrn(nt_hpnd,n) & + *rsiden(n)*trcrn(nt_alvl,n) + else + mipnd = mipnd + aicen(n)*trcrn(nt_apnd,n)*trcrn(nt_hpnd,n) & + *rsiden(n) + endif + endif + ! history diagnostics meltl = meltl + vicen_init(n)*rsiden(n) @@ -1871,7 +1897,8 @@ subroutine icepack_step_therm2(dt, hin_max, & wavefreq, & dwavefreq, & d_afsd_latg, d_afsd_newi, & - d_afsd_latm, d_afsd_weld) + d_afsd_latm, d_afsd_weld, & + mipnd) use icepack_parameters, only: icepack_init_parameters @@ -1915,6 +1942,9 @@ subroutine icepack_step_therm2(dt, hin_max, & frazil , & ! frazil ice growth (m/step-->cm/day) frazil_diag ! frazil ice growth diagnostic (m/step-->cm/day) + real (kind=dbl_kind), intent(inout), optional :: & + mipnd ! pond 'drainage' due to ice melting (m / step) + real (kind=dbl_kind), intent(in), optional :: & wlat ! lateral melt rate (m/s) @@ -2052,7 +2082,8 @@ subroutine icepack_step_therm2(dt, hin_max, & vsnon, & aice , & aice0 , & - fpond, Tf ) + fpond, Tf , & + mipnd) if (icepack_warnings_aborted(subname)) return endif ! aice > puny @@ -2103,7 +2134,7 @@ subroutine icepack_step_therm2(dt, hin_max, & aicen, vicen, & vsnon, trcrn, & flux_bio, & - d_afsd_latm) + d_afsd_latm, mipnd) if (icepack_warnings_aborted(subname)) return ! Floe welding during freezing conditions @@ -2123,7 +2154,8 @@ subroutine icepack_step_therm2(dt, hin_max, & if (ncat==1) & call reduce_area (hin_max (0), & aicen (1), vicen (1), & - aicen_init(1), vicen_init(1)) + aicen_init(1), vicen_init(1), & + mipnd, trcrn) if (icepack_warnings_aborted(subname)) return !----------------------------------------------------------------- diff --git a/columnphysics/icepack_therm_mushy.F90 b/columnphysics/icepack_therm_mushy.F90 index d5c56e894..5b1f8ad8b 100644 --- a/columnphysics/icepack_therm_mushy.F90 +++ b/columnphysics/icepack_therm_mushy.F90 @@ -10,7 +10,8 @@ module icepack_therm_mushy use icepack_parameters, only: a_rapid_mode, Rac_rapid_mode, tscale_pnd_drain use icepack_parameters, only: aspect_rapid_mode, dSdt_slow_mode, phi_c_slow_mode use icepack_parameters, only: sw_redist, sw_frac, sw_dtemp - use icepack_tracers, only: nilyr, nslyr, tr_pond + use icepack_parameters, only: pndmacr + use icepack_tracers, only: nilyr, nslyr, tr_pond, tr_pond_sealvl use icepack_mushy_physics, only: icepack_mushy_density_brine, enthalpy_brine, icepack_enthalpy_snow use icepack_mushy_physics, only: enthalpy_mush_liquid_fraction use icepack_mushy_physics, only: icepack_mushy_temperature_mush, icepack_mushy_liquid_fraction @@ -19,6 +20,7 @@ module icepack_therm_mushy use icepack_mushy_physics, only: conductivity_mush_array, conductivity_snow_array use icepack_therm_shared, only: surface_heat_flux, dsurface_heat_flux_dTsf use icepack_therm_shared, only: ferrmax + use icepack_meltpond_sealvl, only: pond_hypsometry, pond_height use icepack_therm_shared, only: fsurf_cpl, flat_cpl, dfsurfdTs_cpl, dflatdTs_cpl use icepack_therm_shared, only: fsurf_cpl0, flat_cpl0 use icepack_warnings, only: warnstr, icepack_warnings_add @@ -58,7 +60,8 @@ subroutine temperature_changes_salinity(dt, & flwoutn, fsurfn, & fcondtop, fcondbot, & fadvheat, snoice, & - smice, smliq) + smice, smliq, & + flpnd, expnd) ! solve the enthalpy and bulk salinity of the ice for a single column @@ -112,6 +115,10 @@ subroutine temperature_changes_salinity(dt, & zSin , & ! internal ice layer salinities zqsn , & ! snow layer enthalpy (J m-3) zTsn ! internal snow layer temperatures + + real (kind=dbl_kind), intent(inout):: & + flpnd , & ! pond flushing rate due to ice permeability (m/s) + expnd ! exponential pond drainage rate (m/s) ! local variables real(kind=dbl_kind), dimension(1:nilyr) :: & @@ -330,7 +337,8 @@ subroutine temperature_changes_salinity(dt, & endif ! drain ponds from flushing - call flush_pond(w, hpond, apond, dt) + call flush_pond(w, hpond, apond, dt, flpnd, expnd, & + zTin, phi, hilyr, hin, hsn) if (icepack_warnings_aborted(subname)) return ! flood snow ice @@ -3152,13 +3160,13 @@ subroutine flushing_velocity(zTin, phi, & !phi = icepack_mushy_liquid_fraction(zTin(k), zSin(k)) phi_min = min(phi_min,phi(k)) + ice_mass = ice_mass + phi(k) * & + icepack_mushy_density_brine( & + liquidus_brine_salinity_mush(zTin(k))) + (c1 - phi(k))*rhoi + ! permeability perm = permeability(phi(k)) - ! ice mass - ice_mass = ice_mass + phi(k) * icepack_mushy_density_brine(liquidus_brine_salinity_mush(zTin(k))) + & - (c1 - phi(k)) * rhoi - ! permeability harmonic mean perm_harm = perm_harm + c1 / (perm + 1e-30_dbl_kind) @@ -3172,7 +3180,12 @@ subroutine flushing_velocity(zTin, phi, & hocn = (ice_mass + hpond * apond * rhofresh + hsn * rhos) / rhow ! calculate brine height above bottom of ice - hbrine = hin + hpond + if (tr_pond_sealvl) then + call pond_height(apond, hpond, hin, hbrine) + if (icepack_warnings_aborted(subname)) return + else + hbrine = hin + hpond + endif ! pressure head dhhead = max(hbrine - hocn,c0) @@ -3203,17 +3216,34 @@ end subroutine flushing_velocity !======================================================================= - subroutine flush_pond(w, hpond, apond, dt) + subroutine flush_pond(w, hpond, apond, dt, flpnd, expnd, & + zTin, phi, hilyr, hin, hsn) ! given a flushing velocity drain the meltponds real(kind=dbl_kind), intent(in) :: & w , & ! vertical flushing Darcy flow rate (m s-1) - apond , & ! melt pond area fraction of category (-) - dt ! time step (s) + dt , & ! time step (s) + hilyr , & ! ice layer thickness (m) + hin , & ! ice thickness (m) + hsn ! snow thickness (m) + + real(kind=dbl_kind), dimension(:), intent(in) :: & + zTin , & ! ice layer temperature (C) + phi ! ice layer liquid fraction real(kind=dbl_kind), intent(inout) :: & - hpond ! melt pond thickness (m) + hpond , & ! melt pond thickness (m) + apond , & ! melt pond area fraction of category (-) + flpnd , & ! pond flushing rate due to ice permeability (m/s) + expnd ! exponential pond drainage rate (m/s) + + real(kind=dbl_kind) :: & + dhpond , & ! change in pond depth per unit pond area (m) + ice_mass , & ! mass of ice (kg m-2) + hocn , & ! height of ocean above mean base of ice (m) + hpsurf , & ! height of the pond surface above mean base of ice (m) + head ! height of pond surface above sea level (m) real(kind=dbl_kind), parameter :: & hpond0 = 0.01_dbl_kind @@ -3225,18 +3255,58 @@ subroutine flush_pond(w, hpond, apond, dt) if (tr_pond) then if (apond > c0 .and. hpond > c0) then - - ! flush pond through mush - hpond = hpond - w * dt / apond - + !------------------------------------------------------------- + ! flush pond through mush (percolation drainage) + !------------------------------------------------------------- + dhpond = max(-w * dt / apond, -hpond) + flpnd = -dhpond * apond + ! update pond depth (and area) + if (tr_pond_sealvl) then + call pond_hypsometry(hpond, apond, dhpond=dhpond, hin=hin) + if (icepack_warnings_aborted(subname)) return + else + hpond = hpond - w * dt / apond + endif hpond = max(hpond, c0) - ! exponential decay of pond - lambda_pond = c1 / (tscale_pnd_drain * 24.0_dbl_kind * 3600.0_dbl_kind) - hpond = hpond - lambda_pond * dt * (hpond + hpond0) - + !------------------------------------------------------------- + ! exponential decay of pond (macro-flaw drainage) + !------------------------------------------------------------- + lambda_pond = c1 / (tscale_pnd_drain*24.0_dbl_kind & + *3600.0_dbl_kind) + if (trim(pndmacr) == 'lambda') then + dhpond = max(-lambda_pond*dt*(hpond + hpond0),-hpond) + elseif (trim(pndmacr) == 'head') then + ! Calling calc_ice_mass here is not bit-for-bit due to optimization, so left inline for now. + ! This will be updated in the future. + call calc_ice_mass(phi, zTin, hilyr, ice_mass) + if (icepack_warnings_aborted(subname)) return + hocn = (ice_mass + hpond*apond*rhofresh + hsn*rhos)/rhow + call pond_height(apond, hpond, hin, hpsurf) + if (icepack_warnings_aborted(subname)) return + head = hpsurf - hocn + dhpond = max(min(c0, -lambda_pond*dt*head), -hpond) + else + call icepack_warnings_add(subname//" unsupported pndmacr option" ) + call icepack_warnings_setabort(.true.,__FILE__,__LINE__) + if (icepack_warnings_aborted(subname)) return + endif + ! diagnostic drainage rate + expnd = -dhpond * apond + ! update pond depth (and area) + if (tr_pond_sealvl) then + call pond_hypsometry(hpond, apond, dhpond=dhpond, hin=hin) + if (icepack_warnings_aborted(subname)) return + else + if (trim(pndmacr) == 'lambda') then + hpond = hpond - lambda_pond * dt * (hpond + hpond0) + else + call icepack_warnings_add(subname//" currently only pondmacr='lambda' supported for not sealvlponds" ) + call icepack_warnings_setabort(.true.,__FILE__,__LINE__) + if (icepack_warnings_aborted(subname)) return + endif + endif hpond = max(hpond, c0) - endif endif @@ -3605,6 +3675,41 @@ subroutine update_vertical_tracers_ice(trc, hlyr1, hlyr2, & end subroutine update_vertical_tracers_ice +!======================================================================= +! Ice Mass +!======================================================================= + + subroutine calc_ice_mass(phi, zTin, hilyr, ice_mass) + + ! Calculate the mass of the ice per unit category area + real(kind=dbl_kind), dimension(:), intent(in) :: & + zTin , & ! ice layer temperature (C) + phi ! ice layer liquid fraction + + real(kind=dbl_kind), intent(in) :: & + hilyr ! ice layer thickness (m) + + real(kind=dbl_kind), intent(out) :: & + ice_mass ! mass per unit category area (kg m-2) + + ! local variables + integer(kind=int_kind) :: & + k ! ice layer index + + character(len=*),parameter :: subname='(calc_ice_mass)' + + ice_mass = c0 + + do k = 1, nilyr + ice_mass = ice_mass + phi(k) * & + icepack_mushy_density_brine( & + liquidus_brine_salinity_mush(zTin(k))) + (c1 - phi(k))*rhoi + enddo + + ice_mass = ice_mass * hilyr + +end subroutine calc_ice_mass + !======================================================================= end module icepack_therm_mushy diff --git a/columnphysics/icepack_therm_vertical.F90 b/columnphysics/icepack_therm_vertical.F90 index bd89bd7ca..55ce68f20 100644 --- a/columnphysics/icepack_therm_vertical.F90 +++ b/columnphysics/icepack_therm_vertical.F90 @@ -35,7 +35,7 @@ module icepack_therm_vertical use icepack_tracers, only: ncat, nilyr, nslyr, nfsd use icepack_tracers, only: tr_iage, tr_FY, tr_aero, tr_pond, tr_fsd, tr_iso - use icepack_tracers, only: tr_pond_lvl, tr_pond_topo + use icepack_tracers, only: tr_pond_lvl, tr_pond_topo, tr_pond_sealvl use icepack_tracers, only: n_aero, n_iso use icepack_therm_shared, only: ferrmax, l_brine @@ -62,6 +62,7 @@ module icepack_therm_vertical use icepack_flux, only: set_sfcflux, merge_fluxes use icepack_meltpond_lvl, only: compute_ponds_lvl use icepack_meltpond_topo, only: compute_ponds_topo + use icepack_meltpond_sealvl, only: compute_ponds_sealvl use icepack_snow, only: drain_snow implicit none @@ -109,7 +110,8 @@ subroutine thermo_vertical (dt, aicen, & congel, snoice, & mlt_onset, frz_onset, & yday, dsnow, & - prescribed_ice) + prescribed_ice, & + flpnd, expnd) real (kind=dbl_kind), intent(in) :: & dt , & ! time step @@ -201,7 +203,9 @@ subroutine thermo_vertical (dt, aicen, & snoice , & ! snow-ice formation (m/step-->cm/day) dsnow , & ! change in snow thickness (m/step-->cm/day) mlt_onset, & ! day of year that sfc melting begins - frz_onset ! day of year that freezing begins (congel or frazil) + frz_onset, & ! day of year that freezing begins (congel or frazil) + flpnd , & ! pond flushing rate due to ice permeability (m/s) + expnd ! exponential pond drainage rate (m/s) real (kind=dbl_kind), intent(in) :: & yday ! day of year @@ -268,6 +272,10 @@ subroutine thermo_vertical (dt, aicen, & meltsliq= c0 massice(:) = c0 massliq(:) = c0 + if (tr_pond) then + flpnd = c0 + expnd = c0 + endif if (calc_Tsfc) then fsensn = c0 @@ -326,7 +334,8 @@ subroutine thermo_vertical (dt, aicen, & flwoutn, fsurfn, & fcondtopn, fcondbotn, & fadvocn, snoice, & - smice, smliq) + smice, smliq, & + flpnd, expnd) if (icepack_warnings_aborted(subname)) return else ! ktherm @@ -2255,7 +2264,12 @@ subroutine icepack_step_therm1(dt, & lmask_n , lmask_s , & mlt_onset , frz_onset , & yday , prescribed_ice, & - zlvs , afsdn) + zlvs , afsdn , & + flpnd , flpndn , & + expnd , expndn , & + frpnd , frpndn , & + rfpnd , rfpndn , & + ilpnd , ilpndn) real (kind=dbl_kind), intent(in) :: & dt , & ! time step @@ -2342,6 +2356,13 @@ subroutine icepack_step_therm1(dt, & mlt_onset , & ! day of year that sfc melting begins frz_onset ! day of year that freezing begins (congel or frazil) + real (kind=dbl_kind), intent(inout), optional :: & + flpnd , & ! pond flushing rate due to ice permeability (m/step) + expnd , & ! exponential pond drainage rate (m/step) + frpnd , & ! pond drainage rate due freeboard constraint (m/step) + rfpnd , & ! runoff rate due to rfrac (m/step) + ilpnd ! pond loss/gain (+/-) to ice lid (m/step) + real (kind=dbl_kind), intent(out), optional :: & wlat ! lateral melt rate (m/s) @@ -2421,6 +2442,13 @@ subroutine icepack_step_therm1(dt, & congeln , & ! congelation ice growth (m) snoicen ! snow-ice growth (m) + real (kind=dbl_kind), dimension(:), intent(inout), optional :: & + flpndn , & ! category pond flushing rate (m/step) + expndn , & ! exponential pond drainage rate (m/step) + frpndn , & ! pond drainage rate due to freeboard (m/step) + rfpndn , & ! runoff rate due to rfrac (m/step) + ilpndn ! category pond loss/gain due to ice lid (m/step) + real (kind=dbl_kind), dimension(:), intent(in) :: & fswthrun ! SW through ice to ocean (W/m^2) @@ -2515,7 +2543,14 @@ subroutine icepack_step_therm1(dt, & l_fswthrun_pardf,& ! vis par dif SW through ice to ocean (W/m^2) l_dsnow, & ! local snow change l_dsnown, & ! local snow change category - l_meltsliq ! mass of snow melt local (kg/m^2) + l_meltsliq ! mass of snow melt local (kg/m^2) + + real (kind=dbl_kind) :: & + l_flpndn , & ! category pond flushing rate (m/step) + l_expndn , & ! exponential pond drainage rate (m/step) + l_frpndn , & ! pond drainage rate due to freeboard (m/step) + l_rfpndn , & ! runoff rate due to rfrac (m/step) + l_ilpndn ! category pond loss/gain due to ice lid (m/step) real (kind=dbl_kind) :: & pond ! water retained in ponds (m) @@ -2696,6 +2731,19 @@ subroutine icepack_step_therm1(dt, & meltbn (n) = c0 congeln(n) = c0 snoicen(n) = c0 + l_flpndn = c0 + l_expndn = c0 + l_frpndn = c0 + l_rfpndn = c0 + l_ilpndn = c0 + if (tr_pond .and. present(flpndn) .and. present(expndn) .and. & + present(frpndn) .and. present(rfpndn) .and. present(ilpndn)) then + l_flpndn = flpndn (n) + l_expndn = expndn (n) + l_frpndn = frpndn (n) + l_rfpndn = rfpndn (n) + l_ilpndn = ilpndn (n) + endif l_dsnown = c0 Trefn = c0 @@ -2830,9 +2878,10 @@ subroutine icepack_step_therm1(dt, & smice=smice, massice=massicen (:,n), & smliq=smliq, massliq=massliqn (:,n), & congel=congeln (n), snoice=snoicen (n), & - mlt_onset=mlt_onset, frz_onset=frz_onset , & + mlt_onset=mlt_onset, frz_onset=frz_onset, & yday=yday, dsnow=l_dsnown , & - prescribed_ice=prescribed_ice) + prescribed_ice=prescribed_ice, & + flpnd=l_flpndn , expnd=l_expndn ) if (icepack_warnings_aborted(subname)) then write(warnstr,*) subname, ' ice: Vertical thermo error, cat ', n @@ -2945,7 +2994,35 @@ subroutine icepack_step_therm1(dt, & apnd=apnd (n), & hpnd=hpnd (n), & ipnd=ipnd (n), & - meltsliqn=l_meltsliqn(n)) + meltsliqn=l_meltsliqn(n), & + frpndn=l_frpndn, & + rfpndn=l_rfpndn, & + ilpndn=l_ilpndn, & + flpndn=l_flpndn) + if (icepack_warnings_aborted(subname)) return + + elseif (tr_pond_sealvl) then + call compute_ponds_sealvl(dt=dt, & + meltt=melttn (n), & + melts=meltsn (n), & + frain=frain, & + Tair=Tair, & + fsurfn=fsurfn(n), & + dhs=dhsn (n), & + ffrac=ffracn (n), & + aicen=aicen (n), & + vicen=vicen (n), & + vsnon=vsnon (n), & + qicen=zqin (:,n), & + sicen=zSin (:,n), & + Tsfcn=Tsfc (n), & + apnd=apnd (n), & + hpnd=hpnd (n), & + ipnd=ipnd (n), & + meltsliqn=l_meltsliqn(n), & + frpndn=l_frpndn, & + ilpndn=l_ilpndn, & + flpndn=l_flpndn) if (icepack_warnings_aborted(subname)) return elseif (tr_pond_topo) then @@ -3056,7 +3133,12 @@ subroutine icepack_step_therm1(dt, & fiso_ocn=fiso_ocn, & fiso_ocnn=fiso_ocnn, & fiso_evap=fiso_evap, & - fiso_evapn=fiso_evapn) + fiso_evapn=fiso_evapn, & + flpnd=flpnd, flpndn=l_flpndn, & + expnd=expnd, expndn=l_expndn, & + frpnd=frpnd, frpndn=l_frpndn, & + rfpnd=rfpnd, rfpndn=l_rfpndn, & + ilpnd=ilpnd, ilpndn=l_ilpndn) if (icepack_warnings_aborted(subname)) return diff --git a/columnphysics/icepack_tracers.F90 b/columnphysics/icepack_tracers.F90 index cbce7a765..22c30699d 100644 --- a/columnphysics/icepack_tracers.F90 +++ b/columnphysics/icepack_tracers.F90 @@ -9,6 +9,7 @@ module icepack_tracers use icepack_kinds use icepack_parameters, only: c0, c1, puny, rhos, rsnw_fall, rhosnew use icepack_parameters, only: snwredist, snwgrain + use icepack_parameters, only: pndhyps, pndfrbd, pndhead, pndmacr use icepack_warnings, only: warnstr, icepack_warnings_add use icepack_warnings, only: icepack_warnings_setabort, icepack_warnings_aborted @@ -104,6 +105,7 @@ module icepack_tracers tr_pond = .false., & ! if .true., use melt pond tracer tr_pond_lvl = .false., & ! if .true., use level-ice pond tracer tr_pond_topo = .false., & ! if .true., use explicit topography-based ponds + tr_pond_sealvl = .false., & ! if .true., use sealvl pond parameterization tr_snow = .false., & ! if .true., use snow redistribution or metamorphosis tracers tr_iso = .false., & ! if .true., use isotope tracers tr_aero = .false., & ! if .true., use aerosol tracers @@ -205,7 +207,7 @@ module icepack_tracers subroutine icepack_init_tracer_flags(& tr_iage_in, tr_FY_in, tr_lvl_in, tr_snow_in, & - tr_pond_in, tr_pond_lvl_in, tr_pond_topo_in, & + tr_pond_in, tr_pond_lvl_in, tr_pond_topo_in, tr_pond_sealvl_in, & tr_fsd_in, tr_aero_in, tr_iso_in, tr_brine_in, tr_zaero_in, & tr_bgc_Nit_in, tr_bgc_N_in, tr_bgc_DON_in, tr_bgc_C_in, tr_bgc_chl_in, & tr_bgc_Am_in, tr_bgc_Sil_in, tr_bgc_DMS_in, tr_bgc_Fe_in, tr_bgc_hum_in, & @@ -218,6 +220,7 @@ subroutine icepack_init_tracer_flags(& tr_pond_in , & ! if .true., use melt pond tracer tr_pond_lvl_in , & ! if .true., use level-ice pond tracer tr_pond_topo_in , & ! if .true., use explicit topography-based ponds + tr_pond_sealvl_in , & ! if .true., use sealvl pond parameteriztion tr_snow_in , & ! if .true., use snow redistribution or metamorphosis tracers tr_fsd_in , & ! if .true., use floe size distribution tracers tr_iso_in , & ! if .true., use isotope tracers @@ -246,6 +249,7 @@ subroutine icepack_init_tracer_flags(& if (present(tr_pond_in)) tr_pond = tr_pond_in if (present(tr_pond_lvl_in) ) tr_pond_lvl = tr_pond_lvl_in if (present(tr_pond_topo_in)) tr_pond_topo = tr_pond_topo_in + if (present(tr_pond_sealvl_in)) tr_pond_sealvl = tr_pond_sealvl_in if (present(tr_snow_in) ) tr_snow = tr_snow_in if (present(tr_fsd_in) ) tr_fsd = tr_fsd_in if (present(tr_iso_in) ) tr_iso = tr_iso_in @@ -264,6 +268,29 @@ subroutine icepack_init_tracer_flags(& if (present(tr_bgc_hum_in)) tr_bgc_hum = tr_bgc_hum_in if (present(tr_bgc_PON_in)) tr_bgc_PON = tr_bgc_PON_in + ! tcraig, July, 2025 + ! This should not be here. These options should either + ! - be moved to namelist + ! - be removed and have all the features selected by tr_pond_* values + ! + ! Because we don't actually know what options work for the various + ! pond schemes (beyond the settings below), and we don't know which + ! options we want to be chooseable overall, we are leaving the declarations + ! in icepack_parameters and we are hardwiring them here so they will + ! be consistent with the tr_pond_sealvl settings as best as we know. + + if (tr_pond_sealvl) then + pndhyps = 'sealevel' + pndfrbd = 'category' + pndhead = 'hyps' + pndmacr = 'head' + else + pndhyps = 'sealevel' + pndfrbd = 'floor' + pndhead = 'perched' + pndmacr = 'lambda' + endif + end subroutine icepack_init_tracer_flags !======================================================================= @@ -272,7 +299,7 @@ end subroutine icepack_init_tracer_flags subroutine icepack_query_tracer_flags(& tr_iage_out, tr_FY_out, tr_lvl_out, tr_snow_out, & - tr_pond_out, tr_pond_lvl_out, tr_pond_topo_out, & + tr_pond_out, tr_pond_lvl_out, tr_pond_topo_out, tr_pond_sealvl_out, & tr_fsd_out, tr_aero_out, tr_iso_out, tr_brine_out, tr_zaero_out, & tr_bgc_Nit_out, tr_bgc_N_out, tr_bgc_DON_out, tr_bgc_C_out, tr_bgc_chl_out, & tr_bgc_Am_out, tr_bgc_Sil_out, tr_bgc_DMS_out, tr_bgc_Fe_out, tr_bgc_hum_out, & @@ -285,6 +312,7 @@ subroutine icepack_query_tracer_flags(& tr_pond_out , & ! if .true., use melt pond tracer tr_pond_lvl_out , & ! if .true., use level-ice pond tracer tr_pond_topo_out , & ! if .true., use explicit topography-based ponds + tr_pond_sealvl_out, & ! if .true., use sealvl pond parameterization tr_snow_out , & ! if .true., use snow redistribution or metamorphosis tracers tr_fsd_out , & ! if .true., use floe size distribution tr_iso_out , & ! if .true., use isotope tracers @@ -313,6 +341,7 @@ subroutine icepack_query_tracer_flags(& if (present(tr_pond_out)) tr_pond_out = tr_pond if (present(tr_pond_lvl_out) ) tr_pond_lvl_out = tr_pond_lvl if (present(tr_pond_topo_out)) tr_pond_topo_out = tr_pond_topo + if (present(tr_pond_sealvl_out)) tr_pond_sealvl_out = tr_pond_sealvl if (present(tr_snow_out) ) tr_snow_out = tr_snow if (present(tr_fsd_out) ) tr_fsd_out = tr_fsd if (present(tr_iso_out) ) tr_iso_out = tr_iso @@ -352,6 +381,7 @@ subroutine icepack_write_tracer_flags(iounit) write(iounit,*) " tr_pond = ",tr_pond write(iounit,*) " tr_pond_lvl = ",tr_pond_lvl write(iounit,*) " tr_pond_topo = ",tr_pond_topo + write(iounit,*) " tr_pond_sealvl = ",tr_pond_sealvl write(iounit,*) " tr_snow = ",tr_snow write(iounit,*) " tr_fsd = ",tr_fsd write(iounit,*) " tr_iso = ",tr_iso diff --git a/configuration/driver/icedrv_InitMod.F90 b/configuration/driver/icedrv_InitMod.F90 index 6320986ec..0785ab7c3 100644 --- a/configuration/driver/icedrv_InitMod.F90 +++ b/configuration/driver/icedrv_InitMod.F90 @@ -56,6 +56,7 @@ subroutine icedrv_initialize tr_aero, & ! from icepack tr_iso, & ! from icepack tr_zaero, & ! from icepack + tr_pond_sealvl, & ! from icepack tr_fsd, wave_spec character(len=*), parameter :: subname='(icedrv_initialize)' @@ -110,6 +111,12 @@ subroutine icedrv_initialize call init_restart ! initialize restart variables call init_history_therm ! initialize thermo history variables + call icepack_query_tracer_flags(tr_pond_sealvl_out=tr_pond_sealvl) + call icepack_warnings_flush(nu_diag) + if (icepack_warnings_aborted(subname)) then + call icedrv_system_abort(file=__FILE__,line=__LINE__) + endif + if (restart) & call init_shortwave ! initialize radiative transfer diff --git a/configuration/driver/icedrv_flux.F90 b/configuration/driver/icedrv_flux.F90 index 80d5eec46..4ea7ee1a9 100644 --- a/configuration/driver/icedrv_flux.F90 +++ b/configuration/driver/icedrv_flux.F90 @@ -264,6 +264,25 @@ module icedrv_flux fsensn, & ! category sensible heat flux flatn ! category latent heat flux + ! General pond diagnostic variables + real (kind=dbl_kind), & + dimension (nx,ncat), public :: & + ! Like melttn these are defined as volume per unit category area + flpndn, & ! category pond flushing rate due to ice permeability + expndn, & ! category exponential pond drainage rate + frpndn, & ! category pond drainage rate due to freeboard constraint + rfpndn, & ! category runoff rate due to rfrac (m/step) + ilpndn ! category pond loss/gain due to ice lid (m/step) + + real (kind=dbl_kind), dimension (nx), public :: & + flpnd, & ! pond flushing rate due to ice permeability (m/step) + expnd, & ! exponential pond drainage rate (m/step) + frpnd, & ! pond drainage rate due to freeboard constraint (m/step) + rfpnd, & ! runoff rate due to rfrac (m/step) + ilpnd, & ! pond loss/gain (+/-) to ice lid freezing/melting (m/step) + mipnd, & ! pond 'drainage' due to ice melting (m / step) + rdpnd ! pond drainage due to ridging (m / step) + ! As above but these remain grid box mean values i.e. they are not ! divided by aice at end of ice_dynamics. ! These are used for generating @@ -697,6 +716,13 @@ subroutine init_history_therm apeff_ai (:) = c0 snowfrac (:) = c0 frazil_diag (:) = c0 + flpnd (:) = c0 + expnd (:) = c0 + frpnd (:) = c0 + rfpnd (:) = c0 + ilpnd (:) = c0 + mipnd (:) = c0 + rdpnd (:) = c0 ! drag coefficients are computed prior to the atmo_boundary call, ! during the thermodynamics section diff --git a/configuration/driver/icedrv_forcing.F90 b/configuration/driver/icedrv_forcing.F90 index 202dc5c6e..41ec9eefa 100644 --- a/configuration/driver/icedrv_forcing.F90 +++ b/configuration/driver/icedrv_forcing.F90 @@ -1424,6 +1424,8 @@ subroutine load_var_MDF(data_var_name, model_var_arr, ncid, & end do data_sections(ntime, 2) = i + model_var_arr(:) = model_miss_val + ! Moving average forcing values into model arrays call MDF_average(data_var_name, model_var_arr, dimlen, ncid, & data_sections, model_miss_val) diff --git a/configuration/driver/icedrv_history.F90 b/configuration/driver/icedrv_history.F90 index e7d3d98e9..4456bccd0 100644 --- a/configuration/driver/icedrv_history.F90 +++ b/configuration/driver/icedrv_history.F90 @@ -13,6 +13,7 @@ module icedrv_history use icepack_intfc, only: icepack_warnings_flush, icepack_warnings_aborted use icepack_intfc, only: icepack_query_parameters, icepack_query_tracer_sizes use icepack_intfc, only: icepack_query_tracer_flags, icepack_query_tracer_indices + use icepack_intfc, only: icepack_query_tracer_indices use icedrv_system, only: icedrv_system_abort implicit none @@ -49,7 +50,9 @@ subroutine history_write() use icedrv_flux, only: evap, fsnow, frain, frazil use icedrv_flux, only: fswabs, flw, flwout, fsens, fsurf, flat use icedrv_flux, only: Tair, Qa, fsw, fcondtop - use icedrv_flux, only: meltt, meltb, meltl, snoice + use icedrv_flux, only: meltt, meltb, meltl, melts, snoice + use icedrv_flux, only: flpndn, expndn, frpndn, rfpndn, ilpndn + use icedrv_flux, only: flpnd, expnd, frpnd, rfpnd, ilpnd, mipnd, rdpnd use icedrv_flux, only: dsnow, congel, sst, sss, Tf, fhocn use icedrv_arrays_column, only: d_afsd_newi, d_afsd_latg, d_afsd_latm, d_afsd_wave, d_afsd_weld #ifdef USE_NETCDF @@ -69,7 +72,8 @@ subroutine history_write() count1(1), count2(2), count3(3), count4(4), & ! cdf start/count arrays varid, & ! cdf varid status, & ! cdf status flag - iflag ! history file attributes + iflag, & ! history file attributes + nt_apnd, nt_hpnd, nt_ipnd ! pond tracer indices character (len=8) :: & cdate ! date string @@ -79,7 +83,7 @@ subroutine history_write() real (kind=dbl_kind),allocatable :: & value1(:), value2(:,:), value3(:,:,:), value4(:,:,:,:) ! temporary - integer (kind=dbl_kind), parameter :: num_2d = 32 + integer (kind=dbl_kind), parameter :: num_2d = 33 character(len=16), parameter :: fld_2d(num_2d) = & (/ 'aice ', 'vice ', 'vsno ', & 'uvel ', 'vvel ', 'divu ', & @@ -91,19 +95,34 @@ subroutine history_write() 'fsw ', 'fcondtop ', 'meltt ', & 'meltb ', 'meltl ', 'snoice ', & 'dsnow ', 'congel ', 'sst ', & - 'sss ', 'Tf ', 'fhocn ' /) - + 'sss ', 'Tf ', 'fhocn ', & + 'melts ' /) + + integer (kind=dbl_kind), parameter :: num_2d_pond = 10 + character(len=16), parameter :: fld_2d_pond(num_2d_pond) = & + (/ 'apnd ', 'hpnd ', 'ipnd ', & + 'flpnd ', 'expnd ', 'frpnd ', & + 'rfpnd ', 'ilpnd ', 'mipnd ', & + 'rdpnd ' /) + integer (kind=dbl_kind), parameter :: num_3d_ncat = 3 character(len=16), parameter :: fld_3d_ncat(num_3d_ncat) = & (/ 'aicen ', 'vicen ', 'vsnon ' /) logical (kind=log_kind) :: & - tr_fsd ! flag for tracing fsd + tr_fsd, & ! flag for tracing fsd + tr_pnd ! flag for tracing ponds integer (kind=dbl_kind), parameter :: num_3d_nfsd = 5 character(len=16), parameter :: fld_3d_nfsd(num_3d_nfsd) = & (/ 'd_afsd_newi ', 'd_afsd_latg ', 'd_afsd_latm ', & 'd_afsd_wave ', 'd_afsd_weld ' /) + + integer (kind=dbl_kind), parameter :: num_3d_pond = 8 + character(len=16), parameter :: fld_3d_pond(num_3d_pond) = & + (/ 'apndn ', 'hpndn ', 'ipndn ', & + 'flpndn ', 'expndn ', 'frpndn ', & + 'rfpndn ', 'ilpndn ' /) integer (kind=dbl_kind), parameter :: num_3d_ntrcr = 1 character(len=16), parameter :: fld_3d_ntrcr(num_3d_ntrcr) = & @@ -119,7 +138,7 @@ subroutine history_write() #ifdef USE_NETCDF call icepack_query_tracer_sizes(ntrcr_out=ntrcr) - call icepack_query_tracer_flags(tr_fsd_out=tr_fsd) + call icepack_query_tracer_flags(tr_fsd_out=tr_fsd, tr_pond_out=tr_pnd) if (first_call) then timcnt = 0 write(hist_file,'(a,i8.8,a)') './history/icepack.h.',idate,'.nc' @@ -198,6 +217,13 @@ subroutine history_write() if (status /= nf90_noerr) call icedrv_system_abort(string=subname//' ERROR in def_var '//trim(fld_2d(n))) enddo + if (tr_pnd) then + do n = 1,num_2d_pond + status = nf90_def_var(ncid,trim(fld_2d_pond(n)),NF90_DOUBLE,dimid2,varid) + if (status /= nf90_noerr) call icedrv_system_abort(string=subname//' ERROR in def_var '//trim(fld_2d_pond(n))) + enddo + endif ! tr_pnd + ! 3d ncat fields dimid3(1) = nxid @@ -209,6 +235,13 @@ subroutine history_write() if (status /= nf90_noerr) call icedrv_system_abort(string=subname//' ERROR in def_var '//trim(fld_3d_ncat(n))) enddo + if (tr_pnd) then + do n = 1,num_3d_pond + status = nf90_def_var(ncid,trim(fld_3d_pond(n)),NF90_DOUBLE,dimid3,varid) + if (status /= nf90_noerr) call icedrv_system_abort(string=subname//' ERROR in def_var '//trim(fld_3d_pond(n))) + enddo + endif ! tr_pnd + if (tr_fsd) then ! 3d nfsd fields @@ -335,6 +368,7 @@ subroutine history_write() if (trim(fld_2d(n)) == 'meltt') value2(1:count2(1),1) = meltt(1:count2(1)) if (trim(fld_2d(n)) == 'meltb') value2(1:count2(1),1) = meltb(1:count2(1)) if (trim(fld_2d(n)) == 'meltl') value2(1:count2(1),1) = meltl(1:count2(1)) + if (trim(fld_2d(n)) == 'melts') value2(1:count2(1),1) = melts(1:count2(1)) if (trim(fld_2d(n)) == 'snoice') value2(1:count2(1),1) = snoice(1:count2(1)) if (trim(fld_2d(n)) == 'dsnow') value2(1:count2(1),1) = dsnow(1:count2(1)) if (trim(fld_2d(n)) == 'congel') value2(1:count2(1),1) = congel(1:count2(1)) @@ -351,6 +385,40 @@ subroutine history_write() deallocate(value2) enddo + ! 2d pond fields + if (tr_pnd) then + call icepack_query_tracer_indices( & + nt_apnd_out=nt_apnd, nt_hpnd_out=nt_hpnd, nt_ipnd_out=nt_ipnd) + + start2(1) = 1 + count2(1) = nx + start2(2) = timcnt + count2(2) = 1 + + do n = 1,num_2d_pond + allocate(value2(count2(1),1)) + + value2 = -9999._dbl_kind + if (trim(fld_2d_pond(n)) == 'apnd') value2(1:count2(1),1) = trcr(1:count2(1),nt_apnd) + if (trim(fld_2d_pond(n)) == 'hpnd') value2(1:count2(1),1) = trcr(1:count2(1),nt_hpnd) + if (trim(fld_2d_pond(n)) == 'ipnd') value2(1:count2(1),1) = trcr(1:count2(1),nt_ipnd) + if (trim(fld_2d_pond(n)) == 'flpnd') value2(1:count2(1),1) = flpnd(1:count2(1)) + if (trim(fld_2d_pond(n)) == 'expnd') value2(1:count2(1),1) = expnd(1:count2(1)) + if (trim(fld_2d_pond(n)) == 'frpnd') value2(1:count2(1),1) = frpnd(1:count2(1)) + if (trim(fld_2d_pond(n)) == 'rfpnd') value2(1:count2(1),1) = rfpnd(1:count2(1)) + if (trim(fld_2d_pond(n)) == 'ilpnd') value2(1:count2(1),1) = ilpnd(1:count2(1)) + if (trim(fld_2d_pond(n)) == 'mipnd') value2(1:count2(1),1) = mipnd(1:count2(1)) + if (trim(fld_2d_pond(n)) == 'rdpnd') value2(1:count2(1),1) = rdpnd(1:count2(1)) + + status = nf90_inq_varid(ncid,trim(fld_2d_pond(n)),varid) + if (status /= nf90_noerr) call icedrv_system_abort(string=subname//' ERROR: inq_var '//trim(fld_2d_pond(n))) + status = nf90_put_var(ncid,varid,value2,start=start2,count=count2) + if (status /= nf90_noerr) call icedrv_system_abort(string=subname//' ERROR: put_var '//trim(fld_2d_pond(n))) + + deallocate(value2) + enddo + endif !tr_pnd + ! 3d ncat fields start3(1) = 1 @@ -376,6 +444,40 @@ subroutine history_write() deallocate(value3) enddo + ! 3d pond fields + if (tr_pnd) then + call icepack_query_tracer_indices( & + nt_apnd_out=nt_apnd, nt_hpnd_out=nt_hpnd, nt_ipnd_out=nt_ipnd) + + start3(1) = 1 + count3(1) = nx + start3(2) = 1 + count3(2) = ncat + start3(3) = timcnt + count3(3) = 1 + + do n = 1,num_3d_pond + allocate(value3(count3(1),count3(2),1)) + + value3 = -9999._dbl_kind + if (trim(fld_3d_pond(n)) == 'apndn') value3(1:count3(1),1:count3(2),1) = trcrn(1:count3(1),nt_apnd,1:count3(2)) + if (trim(fld_3d_pond(n)) == 'hpndn') value3(1:count3(1),1:count3(2),1) = trcrn(1:count3(1),nt_hpnd,1:count3(2)) + if (trim(fld_3d_pond(n)) == 'ipndn') value3(1:count3(1),1:count3(2),1) = trcrn(1:count3(1),nt_ipnd,1:count3(2)) + if (trim(fld_3d_pond(n)) == 'flpndn') value3(1:count3(1),1:count3(2),1) = flpndn(1:count3(1),1:count3(2)) + if (trim(fld_3d_pond(n)) == 'expndn') value3(1:count3(1),1:count3(2),1) = expndn(1:count3(1),1:count3(2)) + if (trim(fld_3d_pond(n)) == 'frpndn') value3(1:count3(1),1:count3(2),1) = frpndn(1:count3(1),1:count3(2)) + if (trim(fld_3d_pond(n)) == 'rfpndn') value3(1:count3(1),1:count3(2),1) = rfpndn(1:count3(1),1:count3(2)) + if (trim(fld_3d_pond(n)) == 'ilpndn') value3(1:count3(1),1:count3(2),1) = ilpndn(1:count3(1),1:count3(2)) + + status = nf90_inq_varid(ncid,trim(fld_3d_pond(n)),varid) + if (status /= nf90_noerr) call icedrv_system_abort(string=subname//' ERROR: inq_var '//trim(fld_3d_pond(n))) + status = nf90_put_var(ncid,varid,value3,start=start3,count=count3) + if (status /= nf90_noerr) call icedrv_system_abort(string=subname//' ERROR: put_var '//trim(fld_3d_pond(n))) + + deallocate(value3) + enddo + endif !tr_pnd + if (tr_fsd) then ! 3d nfsd fields diff --git a/configuration/driver/icedrv_init.F90 b/configuration/driver/icedrv_init.F90 index 13be2af57..69f4d7905 100644 --- a/configuration/driver/icedrv_init.F90 +++ b/configuration/driver/icedrv_init.F90 @@ -99,6 +99,7 @@ subroutine input_data real (kind=dbl_kind) :: ustar_min, albicev, albicei, albsnowv, albsnowi, & ahmax, R_ice, R_pnd, R_snw, dT_mlt, rsnw_mlt, ksno, hi_min, Tliquidus_max, & mu_rdg, hs0, dpscale, rfracmin, rfracmax, pndaspect, hs1, hp1, & + apnd_sl, tscale_pnd_drain, & a_rapid_mode, Rac_rapid_mode, aspect_rapid_mode, dSdt_slow_mode, & phi_c_slow_mode, phi_i_mushy, kalg, emissivity, floediam, hfrazilmin, & rsnw_fall, rsnw_tmax, rhosnew, rhosmin, rhosmax, & @@ -126,13 +127,13 @@ subroutine input_data integer (kind=int_kind) :: ntrcr logical (kind=log_kind) :: tr_iage, tr_FY, tr_lvl, tr_pond, tr_snow logical (kind=log_kind) :: tr_iso, tr_aero, tr_fsd - logical (kind=log_kind) :: tr_pond_lvl, tr_pond_topo, wave_spec + logical (kind=log_kind) :: tr_pond_lvl, tr_pond_topo, tr_pond_sealvl, wave_spec integer (kind=int_kind) :: nt_Tsfc, nt_sice, nt_qice, nt_qsno, nt_iage, nt_FY integer (kind=int_kind) :: nt_alvl, nt_vlvl, nt_apnd, nt_hpnd, nt_ipnd, & nt_smice, nt_smliq, nt_rhos, nt_rsnw, & nt_aero, nt_fsd, nt_isosno, nt_isoice - real (kind=real_kind) :: rplvl, rptopo + real (kind=real_kind) :: rplvl, rptopo, rpsealvl real (kind=dbl_kind) :: Cf, puny character(len=*), parameter :: subname='(input_data)' @@ -158,7 +159,8 @@ subroutine input_data kitd, ktherm, ksno, conduct, & a_rapid_mode, Rac_rapid_mode, aspect_rapid_mode, & dSdt_slow_mode, phi_c_slow_mode, phi_i_mushy, & - floediam, hfrazilmin, Tliquidus_max, hi_min + floediam, hfrazilmin, Tliquidus_max, hi_min, & + tscale_pnd_drain namelist /dynamics_nml/ & kstrength, krdg_partic, krdg_redist, mu_rdg, & @@ -174,7 +176,7 @@ subroutine input_data namelist /ponds_nml/ & hs0, dpscale, frzpnd, & rfracmin, rfracmax, pndaspect, hs1, & - hp1 + hp1, apnd_sl namelist /snow_nml/ & snwredist, snwgrain, rsnw_fall, rsnw_tmax, & rhosnew, rhosmin, rhosmax, snwlvlfac, & @@ -206,6 +208,7 @@ subroutine input_data tr_lvl, & tr_pond_lvl, & tr_pond_topo, & + tr_pond_sealvl, & tr_snow, & tr_aero, & tr_fsd, & @@ -231,6 +234,7 @@ subroutine input_data dpscale_out=dpscale, frzpnd_out=frzpnd, & rfracmin_out=rfracmin, rfracmax_out=rfracmax, & pndaspect_out=pndaspect, hs1_out=hs1, hp1_out=hp1, & + apnd_sl_out=apnd_sl, tscale_pnd_drain_out=tscale_pnd_drain, & ktherm_out=ktherm, calc_Tsfc_out=calc_Tsfc, & semi_implicit_Tsfc_out=semi_implicit_Tsfc, & vapor_flux_correction_out=vapor_flux_correction, & @@ -321,6 +325,7 @@ subroutine input_data tr_lvl = .false. ! level ice tr_pond_lvl = .false. ! level-ice melt ponds tr_pond_topo = .false. ! topographic melt ponds + tr_pond_sealvl = .false. ! sealvl melt ponds tr_snow = .false. ! snow tracers (wind redistribution, metamorphosis) tr_aero = .false. ! aerosols tr_fsd = .false. ! floe size distribution @@ -505,13 +510,15 @@ subroutine input_data rplvl = c0 rptopo = c0 + rpsealvl = c0 if (tr_pond_lvl ) rplvl = c1 if (tr_pond_topo) rptopo = c1 + if (tr_pond_sealvl) rpsealvl = c1 tr_pond = .false. ! explicit melt ponds - if (rplvl + rptopo > puny) tr_pond = .true. + if (rplvl + rptopo + rpsealvl > puny) tr_pond = .true. - if (rplvl + rptopo > c1 + puny) then + if (rplvl + rptopo + rpsealvl > c1 + puny) then write (nu_diag,*) 'WARNING: Must use only one melt pond scheme' call icedrv_system_abort(file=__FILE__,line=__LINE__) endif @@ -749,13 +756,15 @@ subroutine input_data write(nu_diag,1000) ' rfracmin = ', rfracmin write(nu_diag,1000) ' rfracmax = ', rfracmax - if (tr_pond_lvl) then + if (tr_pond_lvl .or. tr_pond_sealvl) then write(nu_diag,1000) ' hs1 = ', hs1 write(nu_diag,1000) ' dpscale = ', dpscale write(nu_diag,1030) ' frzpnd = ', trim(frzpnd) endif if (tr_pond .and. .not. tr_pond_lvl) & write(nu_diag,1000) ' pndaspect = ', pndaspect + if (tr_pond_sealvl) & + write(nu_diag,1000) ' apnd_sl = ', apnd_sl if (tr_snow) then write(nu_diag,1030) ' snwredist = ', trim(snwredist) @@ -787,6 +796,7 @@ subroutine input_data write(nu_diag,1005) ' phi_c_slow_mode = ', phi_c_slow_mode write(nu_diag,1005) ' phi_i_mushy = ', phi_i_mushy write(nu_diag,1005) ' Tliquidus_max = ', Tliquidus_max + write(nu_diag,1005) ' tscale_pnd_drain = ', tscale_pnd_drain endif write(nu_diag,1030) ' atmbndy = ', trim(atmbndy) @@ -844,6 +854,7 @@ subroutine input_data write(nu_diag,1010) ' tr_lvl = ', tr_lvl write(nu_diag,1010) ' tr_pond_lvl = ', tr_pond_lvl write(nu_diag,1010) ' tr_pond_topo = ', tr_pond_topo + write(nu_diag,1010) ' tr_pond_sealvl = ', tr_pond_sealvl write(nu_diag,1010) ' tr_snow = ', tr_snow write(nu_diag,1010) ' tr_aero = ', tr_aero write(nu_diag,1010) ' tr_fsd = ', tr_fsd @@ -889,13 +900,9 @@ subroutine input_data nt_apnd = ntrcr ntrcr = ntrcr + 1 nt_hpnd = ntrcr - if (tr_pond_lvl) then + if (tr_pond_lvl .or. tr_pond_topo .or. tr_pond_sealvl) then ntrcr = ntrcr + 1 ! refrozen pond ice lid thickness - nt_ipnd = ntrcr ! on level-ice ponds (if frzpnd='hlid') - endif - if (tr_pond_topo) then - ntrcr = ntrcr + 1 ! - nt_ipnd = ntrcr ! refrozen pond ice lid thickness + nt_ipnd = ntrcr ! on ponds (if frzpnd='hlid') endif endif @@ -1014,6 +1021,7 @@ subroutine input_data dpscale_in=dpscale, frzpnd_in=frzpnd, & rfracmin_in=rfracmin, rfracmax_in=rfracmax, & pndaspect_in=pndaspect, hs1_in=hs1, hp1_in=hp1, & + apnd_sl_in=apnd_sl, tscale_pnd_drain_in=tscale_pnd_drain, & floediam_in=floediam, hfrazilmin_in=hfrazilmin, & ktherm_in=ktherm, calc_Tsfc_in=calc_Tsfc, & semi_implicit_Tsfc_in=semi_implicit_Tsfc, & @@ -1046,7 +1054,8 @@ subroutine input_data tr_iso_in=tr_iso, tr_snow_in=tr_snow, & tr_pond_in=tr_pond, & tr_pond_lvl_in=tr_pond_lvl, & - tr_pond_topo_in=tr_pond_topo, tr_fsd_in=tr_fsd) + tr_pond_topo_in=tr_pond_topo, & + tr_pond_sealvl_in=tr_pond_sealvl, tr_fsd_in=tr_fsd) call icepack_init_tracer_indices(nt_Tsfc_in=nt_Tsfc, & nt_sice_in=nt_sice, nt_qice_in=nt_qice, & nt_qsno_in=nt_qsno, nt_iage_in=nt_iage, & @@ -1135,7 +1144,7 @@ subroutine init_state integer (kind=int_kind) :: ntrcr logical (kind=log_kind) :: tr_iage, tr_FY, tr_lvl, tr_aero, tr_fsd, tr_iso - logical (kind=log_kind) :: tr_pond_lvl, tr_pond_topo, tr_snow + logical (kind=log_kind) :: tr_pond_lvl, tr_pond_topo, tr_pond_sealvl, tr_snow integer (kind=int_kind) :: nt_Tsfc, nt_sice, nt_qice, nt_qsno, nt_iage, nt_fy integer (kind=int_kind) :: nt_alvl, nt_vlvl, nt_apnd, nt_hpnd, nt_ipnd, & nt_smice, nt_smliq, nt_rhos, nt_rsnw, & @@ -1152,7 +1161,8 @@ subroutine init_state tr_FY_out=tr_FY, tr_lvl_out=tr_lvl, tr_aero_out=tr_aero, & tr_iso_out=tr_iso, tr_snow_out=tr_snow, & tr_pond_lvl_out=tr_pond_lvl, & - tr_pond_topo_out=tr_pond_topo, tr_fsd_out=tr_fsd) + tr_pond_topo_out=tr_pond_topo, & + tr_pond_sealvl_out=tr_pond_sealvl, tr_fsd_out=tr_fsd) call icepack_query_tracer_indices(nt_Tsfc_out=nt_Tsfc, & nt_sice_out=nt_sice, nt_qice_out=nt_qice, & nt_qsno_out=nt_qsno, nt_iage_out=nt_iage, nt_fy_out=nt_fy, & @@ -1203,7 +1213,7 @@ subroutine init_state trcr_depend(nt_hpnd) = 2+nt_apnd ! melt pond depth trcr_depend(nt_ipnd) = 2+nt_apnd ! refrozen pond lid endif - if (tr_pond_topo) then + if (tr_pond_topo .or. tr_pond_sealvl) then trcr_depend(nt_apnd) = 0 ! melt pond area trcr_depend(nt_hpnd) = 2+nt_apnd ! melt pond depth trcr_depend(nt_ipnd) = 2+nt_apnd ! refrozen pond lid @@ -1267,7 +1277,7 @@ subroutine init_state nt_strata (nt_ipnd,2) = nt_apnd ! on melt pond area nt_strata (nt_ipnd,1) = nt_alvl ! on level ice area endif - if (tr_pond_topo) then + if (tr_pond_topo .or. tr_pond_sealvl) then n_trcr_strata(nt_hpnd) = 1 ! melt pond depth nt_strata (nt_hpnd,1) = nt_apnd ! on melt pond area n_trcr_strata(nt_ipnd) = 1 ! refrozen pond lid diff --git a/configuration/driver/icedrv_restart.F90 b/configuration/driver/icedrv_restart.F90 index c9b076677..250c4b1b0 100644 --- a/configuration/driver/icedrv_restart.F90 +++ b/configuration/driver/icedrv_restart.F90 @@ -89,7 +89,7 @@ subroutine dumpfile logical (kind=log_kind) :: & tr_iage, tr_FY, tr_lvl, tr_iso, tr_aero, tr_brine, & - tr_pond_topo, tr_pond_lvl, tr_snow, tr_fsd + tr_pond_topo, tr_pond_lvl, tr_pond_sealvl, tr_snow, tr_fsd ! skl_bgc, z_tracers integer (kind=int_kind) :: dims(2) @@ -117,7 +117,9 @@ subroutine dumpfile tr_lvl_out=tr_lvl, tr_aero_out=tr_aero, tr_iso_out=tr_iso, & tr_brine_out=tr_brine, & tr_pond_topo_out=tr_pond_topo, & - tr_pond_lvl_out=tr_pond_lvl,tr_snow_out=tr_snow,tr_fsd_out=tr_fsd) + tr_pond_lvl_out=tr_pond_lvl, & + tr_pond_sealvl_out=tr_pond_sealvl, & + tr_snow_out=tr_snow,tr_fsd_out=tr_fsd) ! call icepack_query_parameters(skl_bgc_out=skl_bgc, z_tracers_out=z_tracers) call icepack_warnings_flush(nu_diag) if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, & @@ -219,6 +221,7 @@ subroutine dumpfile if (tr_lvl) call write_restart_lvl(dims) ! level ice tracer if (tr_pond_lvl) call write_restart_pond_lvl(dims) ! level-ice melt ponds if (tr_pond_topo) call write_restart_pond_topo(dims) ! topographic melt ponds + if (tr_pond_sealvl) call write_restart_pond_sealvl(dims) ! same restart fields as lvl if (tr_snow) call write_restart_snow(dims) ! snow metamorphosis tracers if (tr_iso) call write_restart_iso(dims) ! ice isotopes if (tr_aero) call write_restart_aero(dims) ! ice aerosols @@ -277,7 +280,7 @@ subroutine restartfile (ice_ic) logical (kind=log_kind) :: & tr_iage, tr_FY, tr_lvl, tr_iso, tr_aero, tr_brine, & - tr_pond_topo, tr_pond_lvl, tr_snow, tr_fsd + tr_pond_topo, tr_pond_lvl, tr_pond_sealvl, tr_snow, tr_fsd character(len=char_len_long) :: filename character(len=*), parameter :: subname='(restartfile)' @@ -294,7 +297,9 @@ subroutine restartfile (ice_ic) tr_lvl_out=tr_lvl, tr_aero_out=tr_aero, tr_iso_out=tr_iso, & tr_brine_out=tr_brine, & tr_pond_topo_out=tr_pond_topo, & - tr_pond_lvl_out=tr_pond_lvl,tr_snow_out=tr_snow,tr_fsd_out=tr_fsd) + tr_pond_lvl_out=tr_pond_lvl, & + tr_pond_sealvl_out=tr_pond_sealvl, & + tr_snow_out=tr_snow,tr_fsd_out=tr_fsd) call icepack_warnings_flush(nu_diag) if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, & file=__FILE__,line= __LINE__) @@ -395,6 +400,7 @@ subroutine restartfile (ice_ic) if (tr_FY) call read_restart_FY() ! first-year area tracer if (tr_lvl) call read_restart_lvl() ! level ice tracer if (tr_pond_lvl) call read_restart_pond_lvl() ! level-ice melt ponds + if (tr_pond_sealvl) call read_restart_pond_sealvl() ! sealvl ponds same as lvl if (tr_pond_topo) call read_restart_pond_topo() ! topographic melt ponds if (tr_snow) call read_restart_snow() ! snow metamorphosis tracers if (tr_iso) call read_restart_iso() ! ice isotopes @@ -996,6 +1002,68 @@ end subroutine read_restart_pond_lvl !======================================================================= +! Dumps all values needed for restarting +! + subroutine write_restart_pond_sealvl(dims) + + use icedrv_arrays_column, only: dhsn, ffracn + use icedrv_flux, only: fsnow + use icedrv_state, only: trcrn + use icedrv_domain_size, only: ncat + + integer (kind=int_kind), intent(in), optional :: & + dims(:) ! netcdf dimension IDs + + integer (kind=int_kind) :: nt_apnd, nt_hpnd, nt_ipnd + character(len=*), parameter :: subname='(write_restart_pond_sealvl)' + + call icepack_query_tracer_indices(nt_apnd_out=nt_apnd, nt_hpnd_out=nt_hpnd, & + nt_ipnd_out=nt_ipnd) + call icepack_warnings_flush(nu_diag) + if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, & + file=__FILE__,line= __LINE__) + + call write_restart_field(nu_dump,trcrn(:,nt_apnd,:),ncat,'apnd',dims) + call write_restart_field(nu_dump,trcrn(:,nt_hpnd,:),ncat,'hpnd',dims) + call write_restart_field(nu_dump,trcrn(:,nt_ipnd,:),ncat,'ipnd',dims) + call write_restart_field(nu_dump,fsnow(:),1,'fsnow',dims) + call write_restart_field(nu_dump,dhsn(:,:),ncat,'dhsn',dims) + call write_restart_field(nu_dump,ffracn(:,:),ncat,'ffracn',dims) + + end subroutine write_restart_pond_sealvl + +!======================================================================= + +! Reads all values needed for a sea level pond restart +! + subroutine read_restart_pond_sealvl() + + use icedrv_arrays_column, only: dhsn, ffracn + use icedrv_flux, only: fsnow + use icedrv_state, only: trcrn + use icedrv_domain_size, only: ncat + integer (kind=int_kind) :: nt_apnd, nt_hpnd, nt_ipnd + character(len=*), parameter :: subname='(write_restart_pond_sealvl)' + + call icepack_query_tracer_indices(nt_apnd_out=nt_apnd, nt_hpnd_out=nt_hpnd, & + nt_ipnd_out=nt_ipnd) + call icepack_warnings_flush(nu_diag) + if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, & + file=__FILE__,line= __LINE__) + + write(nu_diag,*) 'min/max level-ice ponds' + + call read_restart_field(nu_restart,trcrn(:,nt_apnd,:),ncat,'apnd') + call read_restart_field(nu_restart,trcrn(:,nt_hpnd,:),ncat,'hpnd') + call read_restart_field(nu_restart,trcrn(:,nt_ipnd,:),ncat,'ipnd') + call read_restart_field(nu_restart,fsnow(:),1,'fsnow') + call read_restart_field(nu_restart,dhsn(:,:),ncat,'dhsn') + call read_restart_field(nu_restart,ffracn(:,:),ncat,'ffracn') + + end subroutine read_restart_pond_sealvl + +!======================================================================= + ! Dumps all values needed for restarting ! ! authors Elizabeth Hunke, LANL diff --git a/configuration/driver/icedrv_step.F90 b/configuration/driver/icedrv_step.F90 index 13f6f2f83..dff06bdca 100644 --- a/configuration/driver/icedrv_step.F90 +++ b/configuration/driver/icedrv_step.F90 @@ -129,6 +129,8 @@ subroutine step_therm1 (dt) use icedrv_flux, only: dsnow, dsnown, faero_atm, faero_ocn use icedrv_flux, only: fiso_atm, fiso_ocn, fiso_evap use icedrv_flux, only: HDO_ocn, H2_16O_ocn, H2_18O_ocn + use icedrv_flux, only: flpndn, expndn, frpndn, rfpndn, ilpndn + use icedrv_flux, only: flpnd, expnd, frpnd, rfpnd, ilpnd use icedrv_init, only: lmask_n, lmask_s use icedrv_state, only: aice, aicen, aice_init, aicen_init, vicen_init use icedrv_state, only: vice, vicen, vsno, vsnon, trcrn, uvel, vvel, vsnon_init @@ -373,7 +375,12 @@ subroutine step_therm1 (dt) afsdn = trcrn (i,nt_fsd:nt_fsd+nfsd-1,:), & lmask_n = lmask_n(i), lmask_s = lmask_s(i), & mlt_onset=mlt_onset(i), frz_onset = frz_onset(i), & - yday = yday, prescribed_ice = prescribed_ice) + yday = yday, prescribed_ice = prescribed_ice, & + flpnd = flpnd(i), flpndn = flpndn(i,:), & + expnd = expnd(i), expndn = expndn(i,:), & + frpnd = frpnd(i), frpndn = frpndn(i,:), & + rfpnd = rfpnd(i), rfpndn = rfpndn(i,:), & + ilpnd = ilpnd(i), ilpndn = ilpndn(i,:)) if (tr_aero) then do n = 1, ncat @@ -439,6 +446,7 @@ subroutine step_therm2 (dt) use icedrv_flux, only: fsalt, Tf, sss, salinz, fhocn, rsiden, wlat use icedrv_flux, only: meltl, frazil_diag, flux_bio, faero_ocn, fiso_ocn use icedrv_flux, only: HDO_ocn, H2_16O_ocn, H2_18O_ocn + use icedrv_flux, only: mipnd use icedrv_init, only: tmask use icedrv_state, only: aice, aicen, aice0, trcr_depend use icedrv_state, only: aicen_init, vicen_init, trcrn, vicen, vsnon @@ -522,7 +530,8 @@ subroutine step_therm2 (dt) d_afsd_latg=d_afsd_latg(i,:), & d_afsd_newi=d_afsd_newi(i,:), & d_afsd_latm=d_afsd_latm(i,:), & - d_afsd_weld=d_afsd_weld(i,:)) + d_afsd_weld=d_afsd_weld(i,:), & + mipnd=mipnd(i)) endif ! tmask @@ -815,6 +824,7 @@ subroutine step_dyn_ridge (dt, ndtd) use icedrv_flux, only: dvirdgdt, opening, closing, fpond, fresh, fhocn use icedrv_flux, only: aparticn, krdgn, aredistn, vredistn, dardg1ndt, dardg2ndt use icedrv_flux, only: dvirdgndt, araftn, vraftn, fsalt, flux_bio, faero_ocn, fiso_ocn + use icedrv_flux, only: rdpnd use icedrv_init, only: tmask use icedrv_state, only: trcrn, vsnon, aicen, vicen use icedrv_state, only: aice, aice0, trcr_depend, n_trcr_strata @@ -885,7 +895,8 @@ subroutine step_dyn_ridge (dt, ndtd) aice=aice(i), fsalt=fsalt(i), & first_ice=first_ice(i,:), & flux_bio=flux_bio(i,1:nbtrcr), & - closing=closing(i), Tf=Tf(i) ) + closing=closing(i), Tf=Tf(i), & + rdpnd=rdpnd(i)) endif ! tmask @@ -924,7 +935,8 @@ subroutine step_dyn_ridge (dt, ndtd) araftn=araftn(i,:), vraftn=vraftn(i,:), & aice=aice(i), fsalt=fsalt(i), & first_ice=first_ice(i,:), & - flux_bio=flux_bio(i,1:nbtrcr), Tf = Tf(i)) + flux_bio=flux_bio(i,1:nbtrcr), Tf = Tf(i), & + rdpnd=rdpnd(i)) endif ! tmask diff --git a/configuration/scripts/icepack_in b/configuration/scripts/icepack_in index eb90a39ab..dd1acff41 100644 --- a/configuration/scripts/icepack_in +++ b/configuration/scripts/icepack_in @@ -34,6 +34,7 @@ tr_lvl = .true. tr_pond_topo = .false. tr_pond_lvl = .true. + tr_pond_sealvl = .false. tr_snow = .false. tr_aero = .false. tr_fsd = .false. @@ -55,6 +56,7 @@ Tliquidus_max = -0.1d0 floediam = 300.0d0 hfrazilmin = 0.05d0 + tscale_pnd_drain = 10.0d0 / &shortwave_nml @@ -86,6 +88,7 @@ rfracmin = 0.15 rfracmax = 1. pndaspect = 0.8 + apnd_sl = 0.27d0 / &snow_nml diff --git a/configuration/scripts/options/set_nml.pondsealvl b/configuration/scripts/options/set_nml.pondsealvl new file mode 100644 index 000000000..17c2511a8 --- /dev/null +++ b/configuration/scripts/options/set_nml.pondsealvl @@ -0,0 +1,7 @@ +apnd_sl = 0.27d0 +rfracmin = 1.0d0 +rfracmax = 1.0d0 +tr_pond_topo = .false. +tr_pond_lvl = .false. +tr_pond_sealvl = .true. +tscale_pnd_drain = 0.5d0 diff --git a/configuration/scripts/tests/base_suite.ts b/configuration/scripts/tests/base_suite.ts index ddfe27ccd..b4334f02c 100644 --- a/configuration/scripts/tests/base_suite.ts +++ b/configuration/scripts/tests/base_suite.ts @@ -29,6 +29,7 @@ smoke col 1x1 debug,ionetcdf,atmmosaic,ocnmosaic restart col 1x1 debug restart col 1x1 diag1 restart col 1x1 pondlvl +restart col 1x1 pondsealvl restart col 1x1 pondtopo restart col 1x1 bgcispol restart col 1x1 bgcnice diff --git a/doc/source/icepack_index.rst b/doc/source/icepack_index.rst index 346fe2c45..6ebbeca0d 100755 --- a/doc/source/icepack_index.rst +++ b/doc/source/icepack_index.rst @@ -46,6 +46,7 @@ section :ref:`tabnamelist`. "amm", "ammonia/um concentration", "mmol/m\ :math:`^3`" "aparticn", "participation function", "" "apeff_ai", "grid-cell-mean effective pond fraction", "" + "apnd_sl", "equilibrium pond fraction in sealvl ponds", "0.27" "apondn", "area concentration of melt ponds", "" "araftn", "area fraction of rafted ice", "" "ardgn", "fractional area of ridged ice", "" @@ -496,6 +497,7 @@ section :ref:`tabnamelist`. "tr_lvl", ":math:`\bullet` if true, use level ice area and volume tracers", "" "tr_pond_lvl", ":math:`\bullet` if true, use level-ice melt pond scheme", "" "tr_pond_topo", ":math:`\bullet` if true, use topo melt pond scheme", "" + "tr_pond_sealvl", ":math:`\bullet` if true, use sealvl melt pond scheme", "" "trcr", "ice tracers", "" "trcr_depend", "tracer dependency on basic state variables", "" "Tref", "2m atmospheric reference temperature", "K" diff --git a/doc/source/master_list.bib b/doc/source/master_list.bib index 5db6db001..f7acf81cc 100644 --- a/doc/source/master_list.bib +++ b/doc/source/master_list.bib @@ -252,6 +252,16 @@ @Article{Murray96 pages = {251-273}, url = {http://dx.doi.org/10.1006/jcph.1996.0136} } +@Article{Fetterer98, + author="F. Fetterer and N. Untersteiner", + title="{Observations of melt ponds on Arctic sea ice}", + journal=JGRO, + year={1998}, + volume={103}, + number={C11}, + pages={24821-24835}, + url={https://doi.org/10.1029/98JC02034} +} @Article{Lindsay98 author = "R.W. Lindsay", title = "{Temporal variability of the energy balance of thick Arctic pack ice}", @@ -334,6 +344,16 @@ @Article{Trodahl01 pages = {1279-1282}, url = {http://dx.doi.org/10.1029/2000GL012088} } +@Article{Tschudi01, + author = "M.A. Tschudi and J.A. Curry and J.A. Maslanik", + title = "{Airborne observations of summertime surface features and their effect on surface albedo during FIRE/SHEBA}", + journal = JGRA, + year = {2001}, + volume = {106}, + number = {D14}, + pages = {15335-15344}, + url = {https://doi.org/10.1029/2000JD900275} +} @Manual{Kauffman02 author = "B.G. Kauffman and W.G. Large", title = "{The CCSM coupler, version 5.0.1}", @@ -554,6 +574,15 @@ @Article{Lupkes12 number = {D13}, url = {http://dx.doi.org/10.1029/2012JD017630} } +@Article{Polashenski12, + author="C. Polashenski and D. Perovich and Z. Courville", + title="{The mechanisms of sea ice melt pond formation and evolution}", + journal=JGRO, + year={2012}, + volume={117}, + number={C1}, + url={https://doi.org/10.1029/2011JC007231} +} @Article{Hunke13 author = "E.C. Hunke and D.A. Hebert and O. Lecomte", title = "{Level-ice melt ponds in the Los Alamos Sea Ice Model, CICE}", @@ -589,6 +618,16 @@ @Article{Jeffery14 pages = {5891-5920}, url = {http://dx.doi.org/10.1002/2013JC009634} } +@Article{Landy14, + author="J. Landy and J. Ehn and M. Shields and D. Barber", + title="{Surface and melt pond evolution on landfast first-year sea ice in the Canadian Arctic Archipelago}", + journal=JGRO, + year={2014}, + volume={119}, + number={5}, + pages={3054-3075}, + url={https://doi.org/10.1002/2013JC009617} +} @Article{Saha14 author = "S. Saha and S. Moorthi and X. Wu and J. Wang and S. Nadiga and P. Tripp and D Behringer and Y. Hou and H. Chuang and M. Iredell and M. Ek and J. Meng and R. Yang and M.P. Mendez and H. van den Dool and Q. Zhang and W. Wang and M. Chen and E. Becker", title = "{The NCEP Climate Forecast System Version 2}", @@ -628,6 +667,46 @@ @article{Roy15 url = {https://doi.org/10.1002/2014JC010677}, year = {2015} } +@Article{Webster15, + author="M.A. Webster and I.G. Rigor and D.K. Perovich and J.A. Richter-Menge, and C.M. Polashenski and B. Light", + title="{Seasonal evolution of melt ponds on Arctic sea ice}", + year={2015}, + journal=JGRO, + volume={120}, + number={9}, + pages={5968-5982}, + url={https://doi.org/10.1002/2015JC011030} +} +@Article{Wright20, + author="N.C. Wright and C.M. Polashenski and S.T. McMichael and R.A. Beyer", + title="{Observations of sea ice melt from Operation IceBridge imagery}", + year={2020}, + journal=TC, + volume={14}, + number={10}, + pages={3523-3536}, + url={https://doi.org/10.5194/tc-14-3523-2020} +} +@Article{Light22, + author = "B. Light and M.M. Smith and D.K. Perovich and M.A. Webster and M.M. Holland and F. Linhardt and I.A. Raphael and D. Clemens-Sewall and A.R. Macfarlane and P. Anhaus and others", + title = "{Arctic sea ice albedo: Spectral composition, spatial heterogeneity, and temporal evolution observed during the MOSAiC drift}", + year = {2022}, + journal = {Elem Sci Anth}, + volume = {10}, + number = {1}, + pages = {000103}, + url = {https://doi.org/10.1525/elementa.2021.000103} +} +@Article{Webster22, + author="M.A. Webster and M. Holland and N.C. Wright and S. Hendricks and N. Hutter and P. Itkin and B. Light and F. Linhardt and D.K. Perovich and I.A. Raphael and M.M. Smith and L.v. Albedyll and J. Zhang", + title="{Spatiotemporal evolution of melt ponds on Arctic sea ice: MOSAiC observations and model results}", + year={2022}, + journal={Elem Sci Anth}, + volume={10}, + number={1}, + pages={000072}, + url={https://doi.org/10.1525/elementa.2021.000072} +} @Article{Duarte17 author = "P. Duarte and Coauthors", title = "{Sea ice thermohaline dynamics and biogeochemistry in the Arctic Ocean: Empirical and model results}", diff --git a/doc/source/science_guide/sg_thermo.rst b/doc/source/science_guide/sg_thermo.rst index 347777c1f..3b27f4ec3 100755 --- a/doc/source/science_guide/sg_thermo.rst +++ b/doc/source/science_guide/sg_thermo.rst @@ -88,11 +88,11 @@ because the infiltration of snow by pond water accomplishes the gradual radiativ transition for which the patchy-snow parameters were originally intended. When level-ice ponds are not used, then a typical value for hs0 is 0.03. -With level-ice ponds, the pond water is allowed to infiltrate snow over the level ice area, +With level-ice ponds, the pond water is allowed to infiltrate snow over the level-ice area, invisible to the radiation scheme, until the water becomes deep enough to show through the snow layer. The pond fraction is computed during this process and then used to -set the snow fraction such that :math:`f_{snow}+f_{pond}=1`. The ponds are only on the level ice -area, and so there is still snow on the ridges even if the entire level ice area becomes filled +set the snow fraction such that :math:`f_{snow}+f_{pond}=1`. The ponds are only on the level-ice +area, and so there is still snow on the ridges even if the entire level-ice area becomes filled with ponds. See :cite:`Hunke13` for a discussion of the impacts of varying hs1, whose default value is 0.03. @@ -116,7 +116,7 @@ be added to the melt pond liquid volume: \Delta V_{melt} = {r\over\rho_w} \left({\rho_{i}}\Delta h_{i} + {\rho_{s}}\Delta h_{s} + F_{rain}{\Delta t}\right) a_i, :label: meltvol -where +For the topo pond parameterization and the level-ice pond parameterization .. math:: r = r_{min} + \left(r_{max} - r_{min}\right) a_i @@ -128,7 +128,10 @@ ponds, :math:`\rho_i` and :math:`\rho_s` are ice and snow densities, snow that melted, and :math:`F_{rain}` is the rainfall rate. Namelist parameters are set for the level-ice (``tr_pond_lvl``) parameterization; in the cesm and topo pond schemes the standard values of :math:`r_{max}` -and :math:`r_{min}` are 0.7 and 0.15, respectively. +and :math:`r_{min}` are 0.7 and 0.15, respectively. For the sealvl pond +parameterization, 100% of the melt water is added to the ponds +(:math:`r = 1.0`) and runoff is handled by the macro-flaw drainage +parameterization (see below). Radiatively, the surface of an ice category is divided into fractions of snow, pond and bare ice. In these melt pond schemes, the actual pond @@ -441,8 +444,7 @@ given by the parameter :math:`\delta_p` (``pndaspect``), :math:`\Delta V = \Delta h_p \Delta a_{p} = \delta_p\Delta a_p^2 = \Delta h_{p}^2/\delta_p`. Here, :math:`a_{p} = a_{pnd} a_{lvl}`, the mean pond area over the ice. -Given the ice velocity :math:`\bf u`, conservation equations for level -ice fraction :math:`a_{lvl}a_i`, pond area fraction +Given the ice velocity :math:`\bf u`, conservation equations for level-ice fraction :math:`a_{lvl}a_i`, pond area fraction :math:`a_{pnd}a_{lvl}a_i`, pond volume :math:`h_{pnd}a_{pnd}a_{lvl}a_i` and pond ice volume :math:`h_{ipnd}a_{pnd}a_{lvl}a_i` are @@ -467,7 +469,7 @@ and pond ice volume :math:`h_{ipnd}a_{pnd}a_{lvl}a_i` are conservation of melt pond volume and pond ice volume, but in this form highlight that the quantities tracked in the code are the tracers :math:`h_{pnd}` and :math:`h_{ipnd}`, pond depth and pond ice thickness. -Likewise, the level ice fraction :math:`a_{lvl}` is a tracer on ice area +Likewise, the level-ice fraction :math:`a_{lvl}` is a tracer on ice area fraction (Equation :eq:`transport-lvl`), and pond fraction :math:`a_{pnd}` is a tracer on level ice (Equation :eq:`transport-apnd-lvl`). @@ -669,7 +671,7 @@ where :math:`d_p` is a scaling factor (dpscale), and dynamic viscosity. *Conservation elsewhere.* When ice ridges and when new ice forms in open -water, the level ice area changes and ponds must be handled +water, the level-ice area changes and ponds must be handled appropriately. For example, when sea ice deforms, some of the level ice is transformed into ridged ice. We assume that pond water (and ice) on the portion of level ice that ridges is lost to the ocean. All of the @@ -692,6 +694,183 @@ same mean pond area in a grid cell after the addition of new ice, and solving for the new pond area tracer :math:`a_{pnd}^\prime` given the newly formed ice area :math:`\Delta a_i = \Delta a_{lvl}`. +sealvl pond formulation (``tr_pond_sealvl`` = true) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The sealvl meltpond parameterization was developed based on the +following observations from field studies and high-resolution (<=1 m) +satellite and airborne imagery: + +* Stage I and II of melt pond formation (initial formation and + drainage to sea level, respectively) last approximately 2 weeks + (:cite:`Eicken04`, :cite:`Polashenski12`, :cite:`Landy14`). + Therefore melt ponds spend most of their lifespan in Stage III (i.e., + pond-air interfaces are at or near sea level and pond-ice interfaces + are below sea level). +* On the scale of a CICE grid cell (> 1 km), melt ponds are + simultaneously observed on thicker and thinner ice; thinner ice + does not need to be saturated with ponds for there to be ponds on + thicker ice (e.g., :cite:`Webster15`, :cite:`Webster22`). +* For pack ice in the Arctic, Stage III melt pond fraction is rarely + observed to be below 15% or above 45% on the scale of a CICE grid cell + (e.g., :cite:`Fetterer98`, :cite:`Tschudi01`, :cite:`Webster15`, + :cite:`Wright20`). Some remote sensing retrievals show higher + pond fractions immediately before the ice melts out (:cite:`Webster15`), + but it is possible that melted-through ponds (i.e., + open water) are being misclassified as ponds. +* Ponds are routinely observed on deformed ice (e.g., :cite:`Eicken04`). +* When MYI and FYI coexist, observations do not clearly indicate + consistent differences in pond fraction, although there may be + differences in timing (e.g., :cite:`Webster15`, :cite:`Wright20`). +* Ponded ice albedos do not rapidly increase as pond depth decreases + below 20 cm (e.g., :cite:`Light22`). + +The sealvl parameterization assumes that each ice thickness category +within the grid cell has a subcategory distribution of ice surface +height relative to sea level (a.k.a. a hypsometric curve). Meltwater +is assumed to pool at the lowest ice surface height within the category +and meltwater does not laterally advect between categories on its own +(it is still handled as a tracer on ice area and hence advects with +ice thickness changes). The hypsometric curve is assumed to be linear. +For each category, the slope and intercept of the hypsometric curve are +parameterized such that when pond surfaces are at sea level and the +category is snow-free, the pond area fraction is equal to the namelist +parameter ``apnd_sl`` (notated as :math:`a_{p,sl}` in :eq:`pndasp`). +Unless otherwise specified, the sealvl parameterization uses the same +parameterizations as the level-ice pond scheme. For example, the same +approach is used to set the effective surface fractions for the Delta- +Eddington shortwave calculations). + +*Hypsometry and Pond Depth-Area Relationship.* + +Because sea ice is floating, the intercept of the hypsometric curve is +determined by buoyancy. In this construction, the slope of the +hypsometric curve is equal to double the pond aspect ratio +(:math:`pndasp`), which is defined such that + +.. math:: + h_p = a_p * pndasp + +where :math:`h_p` is the mean depth of the ponded area of the +category and :math:`a_p` is the pond area fraction of the category. +Pond meltwater volume is apportioned into depth and area according to +:math:`pndasp`, with the exception that if the pond area completely +fills the category :math:`h_p` may exceed :math:`a_p*pndasp` +(:math:`h_p` is still subject to a freeboard constraint, see below). +Unlike in the level-ice parameterization, this use of :math:`pndasp` means +that when drainage reduces pond volume, both pond area and depth +decrease; in the level-ice parameterization just depth decreases. In the +sealvl parameterization, pond aspect is calculated by + +.. math:: + pndasp = h_{in}*(\rho_w - \rho_{si}) / (\rho_{fresh} * (a_{p,sl})^2 - 2 \rho_w * a_{p,sl} + \rho_w) + :label: pndasp + +where :math:`h_{in}` is the ice thickness of the category. +:math:`\rho_w`, :math:`\rho_{si}`, and :math:`\rho_{fresh}` are the +densities of ocean water, sea ice, and pond water respectively. Note +that for simplicity we use a constant sea ice density instead of using +the mushy parameterization. + +The weight of the snow is omitted from the calculation of :math:`pndasp`. +The impact of this omission is that pond area and depth will tend to be +slightly higher while the category still has snow on it (i.e., in Stage +I). Since pond fractions are typically highest in Stage I +(:cite:`Eicken04`, :cite:`Polashenski12`), this was seen as a +desirable feature, although future work should explicitly parameterize +how the hypsometry and drainage evolves at different stages of pond +evolution. + +The parameterized hypsometric curve is also used to compute the height +of the pond surfaces above the mean ice draft (:math:`hpsurf`), which is +then used in the calculation of hydraulic head for the drainage +parameterizations (below). :math:`hpsurf` is calculated by + +.. math:: + hpsurf = h_{in} - pndasp + 2 * pndasp * a_{p} + :label: hpsurf + +Unlike in the level-ice pond scheme, ponds are not limited to the level-ice +fraction. Currently the parameterization of the hypsometric curve does +not account for the impacts of deformed ice due to limited data. Future +research should target this limitation. + +*Drainage and Pond Lid Refreezing.* + +There are five mechanisms by which water can be lost from melt ponds in +the sealvl parameterization: percolation through the ice (sub-cm scale +drainage), drainage through macroscopic flaws in the ice (super-cm scale), an +ice freeboard constraint, drainage during ice deformation, and pond lid +refreezing. Meltwater is also lost when the ice melts. Unlike in the +level-ice or topo schemes, the sealvl scheme does not use the 'runoff' +(``rfrac``) parameterization. Instead of draining a portion of the total +meltwater before it reaches the ponds via rfrac as in the topo and +level-ice schemes, this water is handled by the macro-scale drainage +in the sealvl scheme. + +* *Percolation Drainage.* Percolation drainage is implemented in the mushy + thermodynamics scheme. The harmonic mean of the permeability of the + ice column is estimated, as is the hydraulic head (the height of the + pond-air interface above sea level, see above). Then the drainage rate + is estimated assuming a Darcy flow. Percolation drainage in the sealvl + scheme is identical to the level-ice scheme except for the calculation of + the hydraulic head. + +* *Macro-Flaw Drainage.* Melt water is transported laterally and drains + through macroscopic flaws: cracks, floe edges, enlarged brine channels, + seal holes, etc. (:cite:`Eicken04`, :cite:`Polashenski12`). In the + real system, the efficiency of this process depends on the + connectivity of lateral flow networks and the frequency of + macroscopic flaws, both of which evolve with ice conditions. In the sealvl + scheme, macro-flaw drainage is parameterized as an exponential decay + of pond height relative to sea level (a.k.a., the hydraulic head), so + macro-flaw drainage cannot remove pond water that sits below sea + level. The level-ice pond scheme is identical except that the exponential + decay is applied to the entire pond height. The decay constant is + controlled by the ``tscale_pnd_drain`` namelist parameter. Currently, + this decay constant is uniform in time and space, but future work + should consider how changing ice conditions impact macro-flaw + drainage. + +* *Ice Freeboard Constraint.* For free-floating ice, pond water cannot + depress the mean ice surface below sea level when there are efficient + water transport pathways (i.e., Stage III melt ponds). The buoyancy + force from the ice drives the redistribution of water from above the + ice to below. Below-sea-level pond bottoms are sustained by the weight + of adjacent ice and snow above sea level. The sealvl scheme assumes + that each ice category is rigid and mechanically uncoupled from the + other categories. If necessary, pond water is drained such that the + mean ice surface of the category is at sea level. I.e., the mean + category ice freeboard is constrained to be greater than or equal to + zero. The level-ice pond scheme has the same constraint, except in the + level-ice pond scheme the ponded area of the category is assumed to be + mechanically uncoupled from the surrounding ice. + +* *Drainage During Ice Deformation.* In all of the pond schemes, it is + assumed that all pond water drains from ice undergoing deformation. + +* *Pond Lid Refreezing.* Pond lid refreezing and melting in the sealvl + scheme is handled in the same manner as in the level-ice scheme (above). + The only difference is that in the sealvl scheme the impact of the + removed/added pond water are distributed according to hypsometry. + +*Pond Depth and Optical Property Relationship.* + +When the Delta-Eddington radiation transport scheme +(:cite:`Briegleb07`) was implemented, there were no observations of +albedo in ponds shallower than 20 cm. For ponds shallower than a +transition depth (``hp0``, default 0.2 m), it was assumed that the +inherent optical properties (IOPs) were represented by a mixture of +ponded ice IOPs and bare ice IOPs, in proportions determined by the pond +depth. Additionally, if ponds are shallower than a cutoff depth +(``hpmin``, default 0.005 m) they are assumed to have no impact on the +optical properties (bare ice IOPs are used). Subsequent research +(e.g., :cite:`Light22`) does not support the assumption of a gradual +transition to bare ice IOPs below 20 cm pond depth. The presence of a +pond of any measured depth was sufficient to change the apparent optical +properties. Consequently, the sealvl scheme disables the pond to bare +ice transition depth assumption (i.e., ``hp0`` = ``hpmin`` = 0.005 m). + .. _sfc-forcing: Thermodynamic surface forcing balance @@ -711,8 +890,8 @@ heat flux, :math:`F_{L\downarrow}` is the incoming longwave flux, the incoming shortwave flux, :math:`\alpha` is the shortwave albedo, and :math:`i_0` is the fraction of absorbed shortwave flux that penetrates into the ice. The albedo may be altered by the presence of melt ponds. -Each of the explicit melt pond parameterizations (CESM, topo and -level-ice ponds) should be used in conjunction with the Delta-Eddington +Each of the explicit melt pond parameterizations (topo, level-ice and +sealvl ponds) should be used in conjunction with the Delta-Eddington shortwave scheme, described below. Shortwave radiation: Delta-Eddington diff --git a/doc/source/user_guide/ug_case_settings.rst b/doc/source/user_guide/ug_case_settings.rst index 17e4c8c85..9f3af587a 100644 --- a/doc/source/user_guide/ug_case_settings.rst +++ b/doc/source/user_guide/ug_case_settings.rst @@ -194,6 +194,7 @@ tracer_nml "``tr_lvl``", "logical", "level ice area and volume", "``.false.``" "``tr_pond_lvl``", "logical", "level-ice melt ponds", "``.false.``" "``tr_pond_topo``", "logical", "topo melt ponds", "``.false.``" + "``tr_pond_sealvl``", "logical", "sealvl melt ponds", "``.false.``" "``tr_snow``", "logical", "advanced snow physics", "``.false.``" "", "", "", "" @@ -291,6 +292,7 @@ ponds_nml "``hs0``", "real", "snow depth of transition to bare sea ice in m", "0.03" "``hs1``", "real", "snow depth of transition to pond ice in m", "0.03" "``pndaspect``", "real", "aspect ratio of pond changes (depth:area)", "0.8" + "``apnd_sl``", "real", "equilibrium pond fraction for sealvl ponds", "0.27" "``rfracmax``", ":math:`0 \le r_{max} \le 1`", "maximum melt water added to ponds", "0.85" "``rfracmin``", ":math:`0 \le r_{min} \le 1`", "minimum melt water added to ponds", "0.15" "", "", "", "" From 4469e2e878e952bf6669ffe4252507b9c0925a89 Mon Sep 17 00:00:00 2001 From: Tony Craig Date: Wed, 16 Jul 2025 14:14:04 -0700 Subject: [PATCH 17/34] Update ponds diagnostics and names (#530) Update the Ponds diagnostics. Fix a bug that was reporting pond history field values of zero for fields by category. Rename the ponds history field names. expnd -> dpnd_expon flpnd -> dpnd_flush frpnd -> dpnd_freebd ilpnd -> dpnd_dlid mipnd -> dpnd_melt rdpnd -> dpnd_ridge rfpnd -> dpnd_initial Clean up trailing blanks. Clean up some alignment. Update the interface documentation Turn off the dpnd history fields for topo ponds and add a warning message in the output. Add a note in the documentation that ponds diagnostics are not fully implemented yet for topo ponds. --------- Co-authored-by: eclare108213 --- columnphysics/icepack_flux.F90 | 50 +++---- columnphysics/icepack_itd.F90 | 8 +- columnphysics/icepack_mechred.F90 | 12 +- columnphysics/icepack_meltpond_lvl.F90 | 36 ++--- columnphysics/icepack_meltpond_sealvl.F90 | 57 ++++---- columnphysics/icepack_parameters.F90 | 8 +- columnphysics/icepack_shortwave.F90 | 2 +- columnphysics/icepack_snow.F90 | 2 +- columnphysics/icepack_therm_itd.F90 | 30 ++--- columnphysics/icepack_therm_mushy.F90 | 39 +++--- columnphysics/icepack_therm_vertical.F90 | 142 ++++++++++++-------- columnphysics/icepack_tracers.F90 | 6 +- configuration/driver/icedrv_flux.F90 | 38 +++--- configuration/driver/icedrv_history.F90 | 78 +++++++---- configuration/driver/icedrv_step.F90 | 24 ++-- doc/source/science_guide/sg_thermo.rst | 38 +++--- doc/source/user_guide/interfaces.include | 119 +++++++++++++--- doc/source/user_guide/ug_implementation.rst | 3 + 18 files changed, 415 insertions(+), 277 deletions(-) diff --git a/columnphysics/icepack_flux.F90 b/columnphysics/icepack_flux.F90 index 637eeec42..4b0888b0f 100644 --- a/columnphysics/icepack_flux.F90 +++ b/columnphysics/icepack_flux.F90 @@ -69,11 +69,11 @@ subroutine merge_fluxes (aicen, & Qref_iso, Qrefn_iso, & fiso_ocn, fiso_ocnn, & fiso_evap, fiso_evapn,& - flpnd, flpndn, & - expnd, expndn, & - frpnd, frpndn, & - rfpnd, rfpndn, & - ilpnd, ilpndn) + dpnd_flush, dpnd_flushn, & + dpnd_expon, dpnd_exponn, & + dpnd_freebd, dpnd_freebdn, & + dpnd_initial, dpnd_initialn, & + dpnd_dlid, dpnd_dlidn) ! single category fluxes real (kind=dbl_kind), intent(in) :: & @@ -107,11 +107,11 @@ subroutine merge_fluxes (aicen, & dsnown , & ! change in snow depth (m) congeln , & ! congelation ice growth (m) snoicen , & ! snow-ice growth (m) - flpndn , & ! pond flushing rate due to ice permeability (m/step) - expndn , & ! exponential pond drainage rate (m/step) - frpndn , & ! pond drainage rate due to freeboard constraint (m/step) - rfpndn , & ! runoff rate due to rfrac (m/step) - ilpndn , & ! pond loss/gain due to ice lid (m/step) + dpnd_flushn , & ! pond flushing rate due to ice permeability (m/step) + dpnd_exponn , & ! exponential pond drainage rate (m/step) + dpnd_freebdn, & ! pond drainage rate due to freeboard constraint (m/step) + dpnd_initialn,& ! runoff rate due to rfrac (m/step) + dpnd_dlidn , & ! pond loss/gain due to ice lid (m/step) fswthrun_vdr, & ! vis dir sw radiation through ice bot (W/m**2) fswthrun_vdf, & ! vis dif sw radiation through ice bot (W/m**2) fswthrun_idr, & ! nir dir sw radiation through ice bot (W/m**2) @@ -149,11 +149,11 @@ subroutine merge_fluxes (aicen, & meltsliq, & ! mass of snow melt (kg/m^2) congel , & ! congelation ice growth (m) snoice , & ! snow-ice growth (m) - flpnd , & ! pond flushing rate due to ice permeability (m/step) - expnd , & ! exponential pond drainage rate (m/step) - frpnd , & ! pond drainage rate due to freeboard constraint (m/step) - rfpnd , & ! runoff rate due to rfrac (m/step) - ilpnd , & ! pond loss/gain (+/-) to ice lid freezing/melting (m/step) + dpnd_flush , & ! pond flushing rate due to ice permeability (m/step) + dpnd_expon , & ! exponential pond drainage rate (m/step) + dpnd_freebd, & ! pond drainage rate due to freeboard constraint (m/step) + dpnd_initial,& ! runoff rate due to rfrac (m/step) + dpnd_dlid , & ! pond loss/gain (+/-) to ice lid freezing/melting (m/step) fswthru_vdr, & ! vis dir sw radiation through ice bot (W/m**2) fswthru_vdf, & ! vis dif sw radiation through ice bot (W/m**2) fswthru_idr, & ! nir dir sw radiation through ice bot (W/m**2) @@ -285,16 +285,16 @@ subroutine merge_fluxes (aicen, & snoice = snoice + snoicen * aicen ! Meltwater fluxes if (tr_pond) then - if (present(flpndn) .and. present(flpnd)) & - flpnd = flpnd + flpndn * aicen - if (present(expndn) .and. present(expnd)) & - expnd = expnd + expndn * aicen - if (present(frpndn) .and. present(frpnd)) & - frpnd = frpnd + frpndn * aicen - if (present(rfpndn) .and. present(rfpnd)) & - rfpnd = rfpnd + rfpndn * aicen - if (present(ilpndn) .and. present(ilpnd)) & - ilpnd = ilpnd + ilpndn * aicen + if (present(dpnd_flushn) .and. present(dpnd_flush)) & + dpnd_flush = dpnd_flush + dpnd_flushn * aicen + if (present(dpnd_exponn) .and. present(dpnd_expon)) & + dpnd_expon = dpnd_expon + dpnd_exponn * aicen + if (present(dpnd_freebdn) .and. present(dpnd_freebd)) & + dpnd_freebd = dpnd_freebd + dpnd_freebdn * aicen + if (present(dpnd_initialn).and. present(dpnd_initial)) & + dpnd_initial = dpnd_initial + dpnd_initialn * aicen + if (present(dpnd_dlidn) .and. present(dpnd_dlid)) & + dpnd_dlid = dpnd_dlid + dpnd_dlidn * aicen endif end subroutine merge_fluxes diff --git a/columnphysics/icepack_itd.F90 b/columnphysics/icepack_itd.F90 index e2dc94ce2..b1dd015df 100644 --- a/columnphysics/icepack_itd.F90 +++ b/columnphysics/icepack_itd.F90 @@ -297,7 +297,7 @@ end subroutine rebin subroutine reduce_area (hin_max, & aicen, vicen, & aicen_init,vicen_init, & - mipnd, trcrn) + dpnd_melt, trcrn) real (kind=dbl_kind), intent(in) :: & hin_max ! lowest category boundary @@ -305,7 +305,7 @@ subroutine reduce_area (hin_max, & real (kind=dbl_kind), intent(inout) :: & aicen , & ! concentration of ice vicen , & ! volume per unit area of ice (m) - mipnd ! pond 'drainage' due to ice melting (m / step) + dpnd_melt ! pond 'drainage' due to ice melting (m / step) real (kind=dbl_kind), intent(in) :: & aicen_init, & ! old ice area for category 1 (m) @@ -351,9 +351,9 @@ subroutine reduce_area (hin_max, & da = da - aicen ! -1*change in fractional area over the subroutine if (tr_pond) then if (tr_pond_lvl) then - mipnd = da*trcrn(nt_apnd,1)*trcrn(nt_hpnd,1)*trcrn(nt_alvl,1) + dpnd_melt = da*trcrn(nt_apnd,1)*trcrn(nt_hpnd,1)*trcrn(nt_alvl,1) else - mipnd = da*trcrn(nt_apnd,1)*trcrn(nt_hpnd,1) + dpnd_melt = da*trcrn(nt_apnd,1)*trcrn(nt_hpnd,1) endif endif diff --git a/columnphysics/icepack_mechred.F90 b/columnphysics/icepack_mechred.F90 index 7878f946f..72263df9d 100644 --- a/columnphysics/icepack_mechred.F90 +++ b/columnphysics/icepack_mechred.F90 @@ -109,7 +109,7 @@ subroutine ridge_ice (dt, ndtd, & dardg1ndt, dardg2ndt, & dvirdgndt, Tf, & araftn, vraftn, & - closing, rdpnd) + closing, dpnd_ridge) integer (kind=int_kind), intent(in) :: & ndtd ! number of dynamics subcycles @@ -167,7 +167,7 @@ subroutine ridge_ice (dt, ndtd, & fpond , & ! fresh water flux to ponds (kg/m^2/s) fresh , & ! fresh water flux to ocean (kg/m^2/s) fhocn , & ! net heat flux to ocean (W/m^2) - rdpnd ! pond drainage due to ridging (m avg. over cell) + dpnd_ridge ! pond drainage due to ridging (m avg. over cell) real (kind=dbl_kind), dimension(:), intent(inout), optional :: & dardg1ndt , & ! rate of fractional area loss by ridging ice (1/s) @@ -609,7 +609,7 @@ subroutine ridge_ice (dt, ndtd, & if (present(fpond)) then fpond = fpond - mpond ! units change later endif - if (present(rdpnd)) rdpnd = mpond + if (present(dpnd_ridge)) dpnd_ridge = mpond !----------------------------------------------------------------- ! Check for fractional ice area > 1. @@ -1752,7 +1752,7 @@ subroutine icepack_step_ridge(dt, ndtd, & aice, fsalt, & first_ice, & flux_bio, closing, & - Tf, rdpnd, & + Tf, dpnd_ridge, & docleanup, dorebin) real (kind=dbl_kind), intent(in) :: & @@ -1826,7 +1826,7 @@ subroutine icepack_step_ridge(dt, ndtd, & first_ice ! true until ice forms real (kind=dbl_kind), intent(inout), optional :: & - rdpnd ! pond drainage due to ridging + dpnd_ridge ! pond drainage due to ridging logical (kind=log_kind), intent(in), optional :: & docleanup, & ! if false, do not call cleanup_itd (default true) @@ -1904,7 +1904,7 @@ subroutine icepack_step_ridge(dt, ndtd, & dardg1ndt, dardg2ndt, & dvirdgndt, Tf, & araftn, vraftn, & - closing, rdpnd ) + closing, dpnd_ridge ) if (icepack_warnings_aborted(subname)) return !----------------------------------------------------------------- diff --git a/columnphysics/icepack_meltpond_lvl.F90 b/columnphysics/icepack_meltpond_lvl.F90 index 808e7b5b2..758777865 100644 --- a/columnphysics/icepack_meltpond_lvl.F90 +++ b/columnphysics/icepack_meltpond_lvl.F90 @@ -42,9 +42,11 @@ subroutine compute_ponds_lvl(dt, & qicen, sicen, & Tsfcn, alvl, & apnd, hpnd, ipnd, & - meltsliqn, frpndn, & - rfpndn, ilpndn, & - flpndn) + meltsliqn, & + dpnd_freebdn, & + dpnd_initialn, & + dpnd_dlidn, & + dpnd_flushn) real (kind=dbl_kind), intent(in) :: & dt ! time step (s) @@ -65,10 +67,10 @@ subroutine compute_ponds_lvl(dt, & real (kind=dbl_kind), intent(inout) :: & apnd, hpnd, ipnd, & - frpndn, & ! pond drainage rate due to freeboard constraint (m/step) - rfpndn, & ! runoff rate due to rfrac (m/step) - ilpndn, & ! pond loss/gain due to ice lid (m/step) - flpndn ! pond flushing rate due to ice permeability (m/s) + dpnd_freebdn, & ! pond drainage rate due to freeboard constraint (m/step) + dpnd_initialn, & ! runoff rate due to rfrac (m/step) + dpnd_dlidn, & ! pond loss/gain due to ice lid (m/step) + dpnd_flushn ! pond flushing rate due to ice permeability (m/s) real (kind=dbl_kind), dimension (:), intent(in) :: & qicen, & ! ice layer enthalpy (J m-3) @@ -157,12 +159,12 @@ subroutine compute_ponds_lvl(dt, & + melts*rhos & + frain* dt)*aicen endif - ! Track meltwater runoff fraction. Here dvn is volume of - ! meltwater (m3/m2) captured over entire grid cell area. - ! Multiply by (1-rfrac)/rfrac to get loss over entire area. - ! Divide by aicen to get loss per unit category area - ! (for consistency with melttn, frpndn, etc) - rfpndn = dvn * (c1-rfrac) / (rfrac * aicen) + ! Track meltwater runoff fraction. Here dvn is volume of + ! meltwater (m3/m2) captured over entire grid cell area. + ! Multiply by (1-rfrac)/rfrac to get loss over entire area. + ! Divide by aicen to get loss per unit category area + ! (for consistency with melttn, dpnd_freebdn, etc) + dpnd_initialn = dvn * (c1-rfrac) / (rfrac * aicen) dvn_temp = dvn ! shrink pond volume under freezing conditions @@ -203,9 +205,9 @@ subroutine compute_ponds_lvl(dt, & endif volpn = volpn + dvn - ! Track lost/gained meltwater per unit category area from pond + ! Track lost/gained meltwater per unit category area from pond ! lid freezing/melting. Note sign flip relative to dvn convention - ilpndn = (dvn_temp - dvn) / aicen + dpnd_dlidn = (dvn_temp - dvn) / aicen !----------------------------------------------------------- ! update pond area and depth @@ -235,7 +237,7 @@ subroutine compute_ponds_lvl(dt, & ! limit pond depth to maintain nonnegative freeboard hpond_tmp = hpondn hpondn = min(hpondn, ((rhow-rhoi)*hi - rhos*hs)/rhofresh) - frpndn = (hpond_tmp - hpondn) * apondn + dpnd_freebdn = (hpond_tmp - hpondn) * apondn ! fraction of grid cell covered by ponds apondn = apondn * aicen @@ -272,7 +274,7 @@ subroutine compute_ponds_lvl(dt, & + 0.5*dvn/(pndaspect*apondn), alvl_tmp*aicen)) hpondn = c0 if (apondn > puny) hpondn = volpn/apondn - flpndn = -dvn/aicen + dpnd_flushn = -dvn/aicen endif endif diff --git a/columnphysics/icepack_meltpond_sealvl.F90 b/columnphysics/icepack_meltpond_sealvl.F90 index a93e5bcee..cd463f7d9 100644 --- a/columnphysics/icepack_meltpond_sealvl.F90 +++ b/columnphysics/icepack_meltpond_sealvl.F90 @@ -19,10 +19,10 @@ ! authors David Clemens-Sewall (NCAR/NOAA) module icepack_meltpond_sealvl - + use icepack_kinds use icepack_parameters, only: c0, c1, c2, c10, p01, p5, puny - use icepack_parameters, only: viscosity_dyn, rhoi, rhos, rhow + use icepack_parameters, only: viscosity_dyn, rhoi, rhos, rhow use icepack_parameters, only: Timelt, Tffresh, Lfresh, rhofresh use icepack_parameters, only: gravit, depressT, rhofresh, kice use icepack_parameters, only: rhosi, use_smliq_pnd @@ -36,7 +36,7 @@ module icepack_meltpond_sealvl implicit none - private + private public :: compute_ponds_sealvl, & pond_hypsometry, & pond_height @@ -54,8 +54,9 @@ subroutine compute_ponds_sealvl( dt, & aicen, vicen, vsnon, & qicen, sicen, & apnd, hpnd, ipnd, & - meltsliqn, frpndn, & - ilpndn, flpndn) + meltsliqn, & + dpnd_freebdn, & + dpnd_dlidn, dpnd_flushn) real (kind=dbl_kind), intent(in) :: & dt ! time step (s) @@ -74,9 +75,9 @@ subroutine compute_ponds_sealvl( dt, & real (kind=dbl_kind), intent(inout) :: & apnd, hpnd, ipnd, & ! pond tracers - frpndn, & ! pond drainage rate due to freeboard constraint (m/step) - ilpndn, & ! pond loss/gain due to ice lid (m/step) - flpndn ! pond flushing rate due to ice permeability (m/s) + dpnd_freebdn, & ! pond drainage rate due to freeboard constraint (m/step) + dpnd_dlidn, & ! pond loss/gain due to ice lid (m/step) + dpnd_flushn ! pond flushing rate due to ice permeability (m/s) real (kind=dbl_kind), dimension (:), intent(in) :: & qicen, & ! ice layer enthalpy (J m-3) @@ -138,7 +139,7 @@ subroutine compute_ponds_sealvl( dt, & !----------------------------------------------------------- ! Remove ponds on thin ice !----------------------------------------------------------- - frpndn = vpondn + dpnd_freebdn = vpondn apnd = c0 hpnd = c0 vpondn = c0 @@ -186,7 +187,7 @@ subroutine compute_ponds_sealvl( dt, & hlid = max(hlid + dhlid, c0) if (hs - dhs < puny) then ! pond ice is snow-free ! fraction of fsurfn over pond used to melt ipond - ffrac = c1 + ffrac = c1 if (fsurfn > puny) & ffrac = min(-dhlid*rhoi*Lfresh/(dt*fsurfn), c1) endif @@ -194,10 +195,10 @@ subroutine compute_ponds_sealvl( dt, & dvpondn = dvpondn - dhlid*apnd*rhoi/rhofresh endif - ! Track lost/gained meltwater per unit category area from + ! Track lost/gained meltwater per unit category area from ! pond lid freezing/melting. Note sign flip relative to dvn - ilpndn = dvn_temp - dvpondn - + dpnd_dlidn = dvn_temp - dvpondn + !----------------------------------------------------------- ! update pond area and depth !----------------------------------------------------------- @@ -219,11 +220,11 @@ subroutine compute_ponds_sealvl( dt, & if (icepack_warnings_aborted(subname)) return endif dhpond = min(dhpond, c0) ! strictly drainage - frpndn = - dhpond * apnd + dpnd_freebdn = - dhpond * apnd call pond_hypsometry(hpnd, apnd, dhpond=dhpond, hin=hi) if (icepack_warnings_aborted(subname)) return - - ! clean up empty ponds. Note, this implies that if ponds + + ! clean up empty ponds. Note, this implies that if ponds ! fully drain or freeze, the lid ice also ceases to exist if (hpnd <= puny .or. apnd <= puny) then apnd = c0 @@ -248,7 +249,7 @@ subroutine compute_ponds_sealvl( dt, & if (icepack_warnings_aborted(subname)) return drain = perm*pressure_head*dt/(viscosity_dyn*hi)*dpscale dhpond = -min(drain, hpnd) - flpndn = -dhpond * apnd + dpnd_flushn = -dhpond * apnd call pond_hypsometry(hpnd, apnd, dhpond=dhpond, hin=hi) if (icepack_warnings_aborted(subname)) return endif @@ -327,14 +328,14 @@ subroutine pond_hypsometry(hpnd, apnd, dhpond, dvpond, hin) real (kind=dbl_kind), intent(inout) :: & hpnd, & ! pond depth of ponded area tracer apnd ! pond fractional area of category tracer - + real (kind=dbl_kind), intent(in), optional :: & dvpond, & ! incoming change in pond volume per category area dhpond, & ! incoming change in pond depth hin ! category ice thickness - + ! local variables - + real (kind=dbl_kind) :: & dv, & ! local variable for change in pond volume vp, & ! local variable for pond volume per category area @@ -363,7 +364,7 @@ subroutine pond_hypsometry(hpnd, apnd, dhpond, dvpond, hin) " hin needed for sealevel ponds") return endif - + ! Get the change in volume if (present(dvpond)) then dv = dvpond @@ -398,7 +399,7 @@ subroutine pond_hypsometry(hpnd, apnd, dhpond, dvpond, hin) hpnd = vp ! conserve volume endif endif - + end subroutine pond_hypsometry !======================================================================= @@ -411,25 +412,25 @@ subroutine pond_height(apond, hpnd, hin, hpsurf) hin , & ! category mean ice thickness apond , & ! pond area fraction of the category hpnd ! mean pond depth (m) - + real (kind=dbl_kind), intent(out) :: & hpsurf ! height of pond surface above base of the ice (m) ! local variables real (kind=dbl_kind) :: & pndasp ! pond aspect ratio - + character(len=*),parameter :: subname='(pond_height)' - + if (trim(pndhead) == 'perched') then hpsurf = hin + hpnd elseif (trim(pndhead) == 'hyps') then if ((trim(pndhyps) == 'fixed') .or. & (trim(pndhyps) == 'sealevel')) then - ! Applying a fixed aspect ratio to the ponds implicitly + ! Applying a fixed aspect ratio to the ponds implicitly ! assumes that the hypsometric curve has a constant slope ! of double the aspect ratio. - ! If ponds occupy lowest elevations first. + ! If ponds occupy lowest elevations first. if (trim(pndhyps) == 'sealevel') then pndasp = calc_pndasp(hin) else @@ -452,7 +453,7 @@ subroutine pond_height(apond, hpnd, hin, hpsurf) call icepack_warnings_setabort(.true.,__FILE__,__LINE__) if (icepack_warnings_aborted(subname)) return endif - + end subroutine pond_height !======================================================================= diff --git a/columnphysics/icepack_parameters.F90 b/columnphysics/icepack_parameters.F90 index 588dbb84c..ea836b958 100644 --- a/columnphysics/icepack_parameters.F90 +++ b/columnphysics/icepack_parameters.F90 @@ -713,7 +713,7 @@ subroutine icepack_init_parameters( & calc_Tsfc_in , &! if true, calculate surface temperature ! if false, Tsfc is computed elsewhere and ! atmos-ice fluxes are provided to CICE - semi_implicit_Tsfc_in , &! compute dfsurf/dT, dflat/dT terms instead of fsurf, flat + semi_implicit_Tsfc_in , &! compute dfsurf/dT, dflat/dT terms instead of fsurf, flat vapor_flux_correction_in, &! compute mass/enthalpy correction when evaporation/sublimation ! computed outside at 0C update_ocn_f_in ! include fresh water and salt fluxes for frazil @@ -1085,7 +1085,7 @@ subroutine icepack_init_parameters( & windmin_in, & ! minimum wind speed to compact snow (m/s) drhosdwind_in, & ! wind compaction factor (kg s/m^4) snwlvlfac_in, & ! fractional increase in snow depth - snw_growth_wet_in, & ! wet metamorphism parameter (um^3/s) + snw_growth_wet_in,&! wet metamorphism parameter (um^3/s) drsnw_min_in, & ! minimum snow grain growth factor snwliq_max_in ! irreducible saturation fraction @@ -1729,7 +1729,7 @@ subroutine icepack_query_parameters( & calc_Tsfc_out ,&! if true, calculate surface temperature ! if false, Tsfc is computed elsewhere and ! atmos-ice fluxes are provided to CICE - semi_implicit_Tsfc_out ,&! compute dfsurf/dT, dflat/dT terms instead of fsurf, flat + semi_implicit_Tsfc_out ,&! compute dfsurf/dT, dflat/dT terms instead of fsurf, flat vapor_flux_correction_out ,&! compute mass/enthalpy correction when evaporation/sublimation ! computed outside at 0C update_ocn_f_out ! include fresh water and salt fluxes for frazil @@ -2103,7 +2103,7 @@ subroutine icepack_query_parameters( & windmin_out, & ! minimum wind speed to compact snow (m/s) drhosdwind_out, & ! wind compaction factor (kg s/m^4) snwlvlfac_out, & ! fractional increase in snow depth - snw_growth_wet_out, & ! wet metamorphism parameter (um^3/s) + snw_growth_wet_out,&! wet metamorphism parameter (um^3/s) drsnw_min_out, & ! minimum snow grain growth factor snwliq_max_out ! irreducible saturation fraction diff --git a/columnphysics/icepack_shortwave.F90 b/columnphysics/icepack_shortwave.F90 index 9fc97ca7a..6ecdb6921 100644 --- a/columnphysics/icepack_shortwave.F90 +++ b/columnphysics/icepack_shortwave.F90 @@ -3531,7 +3531,7 @@ subroutine shortwave_dEdd_set_eff(aicen, vsnon, alvln, & logical (kind=log_kind), intent(in) :: & l_initonly ! local initonly value - + ! local variables real (kind=dbl_kind) :: & hsnlvl , & ! snow depth over level ice (m) diff --git a/columnphysics/icepack_snow.F90 b/columnphysics/icepack_snow.F90 index 982f1fb13..315ce4559 100644 --- a/columnphysics/icepack_snow.F90 +++ b/columnphysics/icepack_snow.F90 @@ -32,7 +32,7 @@ module icepack_snow public :: icepack_step_snow, drain_snow, icepack_init_snow real (kind=dbl_kind), parameter, public :: & - drsnw_min_o = 1.0186_dbl_kind ! Bun 1989 (um^3/s) + drsnw_min_o = 1.0186_dbl_kind ! Bun 1989 (um^3/s) ! minimum volume growth rate 1.28x10^-8 mm^3/s/4/pi real (kind=dbl_kind) :: & diff --git a/columnphysics/icepack_therm_itd.F90 b/columnphysics/icepack_therm_itd.F90 index fc3987b78..e62313181 100644 --- a/columnphysics/icepack_therm_itd.F90 +++ b/columnphysics/icepack_therm_itd.F90 @@ -99,7 +99,7 @@ subroutine linear_itd (hin_max, trcr_depend, & vicen, vsnon, & aice, aice0, & fpond, Tf, & - mipnd) + dpnd_melt) real (kind=dbl_kind), dimension(0:ncat), intent(in) :: & hin_max ! category boundaries (m) @@ -136,7 +136,7 @@ subroutine linear_itd (hin_max, trcr_depend, & fpond ! fresh water flux to ponds (kg/m^2/s) real (kind=dbl_kind), intent(inout), optional :: & - mipnd ! pond 'drainage' due to ice melting (m / step) + dpnd_melt ! pond 'drainage' due to ice melting (m / step) ! local variables @@ -467,12 +467,12 @@ subroutine linear_itd (hin_max, trcr_depend, & if (tr_pond_topo) & fpond = fpond - (da0 * trcrn(nt_apnd,1) & * trcrn(nt_hpnd,1)) - if (tr_pond .and. present(mipnd)) then + if (tr_pond .and. present(dpnd_melt)) then if (tr_pond_lvl) then - mipnd = mipnd + da0 * trcrn(nt_apnd,1) & + dpnd_melt = dpnd_melt + da0 * trcrn(nt_apnd,1) & * trcrn(nt_hpnd,1) * trcrn(nt_alvl,1) else - mipnd = mipnd + da0*trcrn(nt_apnd,1)*trcrn(nt_hpnd,1) + dpnd_melt = dpnd_melt + da0*trcrn(nt_apnd,1)*trcrn(nt_hpnd,1) endif endif @@ -890,7 +890,7 @@ subroutine lateral_melt (dt, fpond, & aicen, vicen, & vsnon, trcrn, & flux_bio, d_afsd_latm,& - mipnd) + dpnd_melt) real (kind=dbl_kind), intent(in) :: & dt ! time step (s) @@ -917,7 +917,7 @@ subroutine lateral_melt (dt, fpond, & meltl ! lateral ice melt (m/step-->cm/day) real (kind=dbl_kind), intent(inout), optional :: & - mipnd ! pond 'drainage' due to ice melting (m / step) + dpnd_melt ! pond 'drainage' due to ice melting (m / step) real (kind=dbl_kind), dimension(nbtrcr), intent(inout) :: & flux_bio ! biology tracer flux from layer bgc (mmol/m^2/s) @@ -1029,12 +1029,12 @@ subroutine lateral_melt (dt, fpond, & fpond = fpond - dfpond endif - if (tr_pond .and. present(mipnd)) then + if (tr_pond .and. present(dpnd_melt)) then if (tr_pond_lvl) then - mipnd = mipnd + aicen(n)*trcrn(nt_apnd,n)*trcrn(nt_hpnd,n) & + dpnd_melt = dpnd_melt + aicen(n)*trcrn(nt_apnd,n)*trcrn(nt_hpnd,n) & *rsiden(n)*trcrn(nt_alvl,n) else - mipnd = mipnd + aicen(n)*trcrn(nt_apnd,n)*trcrn(nt_hpnd,n) & + dpnd_melt = dpnd_melt + aicen(n)*trcrn(nt_apnd,n)*trcrn(nt_hpnd,n) & *rsiden(n) endif endif @@ -1898,7 +1898,7 @@ subroutine icepack_step_therm2(dt, hin_max, & dwavefreq, & d_afsd_latg, d_afsd_newi, & d_afsd_latm, d_afsd_weld, & - mipnd) + dpnd_melt) use icepack_parameters, only: icepack_init_parameters @@ -1943,7 +1943,7 @@ subroutine icepack_step_therm2(dt, hin_max, & frazil_diag ! frazil ice growth diagnostic (m/step-->cm/day) real (kind=dbl_kind), intent(inout), optional :: & - mipnd ! pond 'drainage' due to ice melting (m / step) + dpnd_melt ! pond 'drainage' due to ice melting (m / step) real (kind=dbl_kind), intent(in), optional :: & wlat ! lateral melt rate (m/s) @@ -2083,7 +2083,7 @@ subroutine icepack_step_therm2(dt, hin_max, & aice , & aice0 , & fpond, Tf , & - mipnd) + dpnd_melt) if (icepack_warnings_aborted(subname)) return endif ! aice > puny @@ -2134,7 +2134,7 @@ subroutine icepack_step_therm2(dt, hin_max, & aicen, vicen, & vsnon, trcrn, & flux_bio, & - d_afsd_latm, mipnd) + d_afsd_latm, dpnd_melt) if (icepack_warnings_aborted(subname)) return ! Floe welding during freezing conditions @@ -2155,7 +2155,7 @@ subroutine icepack_step_therm2(dt, hin_max, & call reduce_area (hin_max (0), & aicen (1), vicen (1), & aicen_init(1), vicen_init(1), & - mipnd, trcrn) + dpnd_melt , trcrn) if (icepack_warnings_aborted(subname)) return !----------------------------------------------------------------- diff --git a/columnphysics/icepack_therm_mushy.F90 b/columnphysics/icepack_therm_mushy.F90 index 5b1f8ad8b..7e5b698eb 100644 --- a/columnphysics/icepack_therm_mushy.F90 +++ b/columnphysics/icepack_therm_mushy.F90 @@ -61,7 +61,8 @@ subroutine temperature_changes_salinity(dt, & fcondtop, fcondbot, & fadvheat, snoice, & smice, smliq, & - flpnd, expnd) + dpnd_flush, & + dpnd_expon) ! solve the enthalpy and bulk salinity of the ice for a single column @@ -115,10 +116,10 @@ subroutine temperature_changes_salinity(dt, & zSin , & ! internal ice layer salinities zqsn , & ! snow layer enthalpy (J m-3) zTsn ! internal snow layer temperatures - + real (kind=dbl_kind), intent(inout):: & - flpnd , & ! pond flushing rate due to ice permeability (m/s) - expnd ! exponential pond drainage rate (m/s) + dpnd_flush , & ! pond flushing rate due to ice permeability (m/s) + dpnd_expon ! exponential pond drainage rate (m/s) ! local variables real(kind=dbl_kind), dimension(1:nilyr) :: & @@ -337,8 +338,8 @@ subroutine temperature_changes_salinity(dt, & endif ! drain ponds from flushing - call flush_pond(w, hpond, apond, dt, flpnd, expnd, & - zTin, phi, hilyr, hin, hsn) + call flush_pond(w, hpond, apond, dt, dpnd_flush, dpnd_expon, & + zTin, phi, hilyr, hin, hsn) if (icepack_warnings_aborted(subname)) return ! flood snow ice @@ -3216,7 +3217,7 @@ end subroutine flushing_velocity !======================================================================= - subroutine flush_pond(w, hpond, apond, dt, flpnd, expnd, & + subroutine flush_pond(w, hpond, apond, dt, dpnd_flush, dpnd_expon, & zTin, phi, hilyr, hin, hsn) ! given a flushing velocity drain the meltponds @@ -3233,11 +3234,11 @@ subroutine flush_pond(w, hpond, apond, dt, flpnd, expnd, & phi ! ice layer liquid fraction real(kind=dbl_kind), intent(inout) :: & - hpond , & ! melt pond thickness (m) - apond , & ! melt pond area fraction of category (-) - flpnd , & ! pond flushing rate due to ice permeability (m/s) - expnd ! exponential pond drainage rate (m/s) - + hpond , & ! melt pond thickness (m) + apond , & ! melt pond area fraction of category (-) + dpnd_flush, & ! pond flushing rate due to ice permeability (m/s) + dpnd_expon ! exponential pond drainage rate (m/s) + real(kind=dbl_kind) :: & dhpond , & ! change in pond depth per unit pond area (m) ice_mass , & ! mass of ice (kg m-2) @@ -3259,7 +3260,7 @@ subroutine flush_pond(w, hpond, apond, dt, flpnd, expnd, & ! flush pond through mush (percolation drainage) !------------------------------------------------------------- dhpond = max(-w * dt / apond, -hpond) - flpnd = -dhpond * apond + dpnd_flush = -dhpond * apond ! update pond depth (and area) if (tr_pond_sealvl) then call pond_hypsometry(hpond, apond, dhpond=dhpond, hin=hin) @@ -3269,7 +3270,7 @@ subroutine flush_pond(w, hpond, apond, dt, flpnd, expnd, & endif hpond = max(hpond, c0) - !------------------------------------------------------------- + !------------------------------------------------------------- ! exponential decay of pond (macro-flaw drainage) !------------------------------------------------------------- lambda_pond = c1 / (tscale_pnd_drain*24.0_dbl_kind & @@ -3277,7 +3278,7 @@ subroutine flush_pond(w, hpond, apond, dt, flpnd, expnd, & if (trim(pndmacr) == 'lambda') then dhpond = max(-lambda_pond*dt*(hpond + hpond0),-hpond) elseif (trim(pndmacr) == 'head') then - ! Calling calc_ice_mass here is not bit-for-bit due to optimization, so left inline for now. + ! Calling calc_ice_mass here is not bit-for-bit due to optimization, so left inline for now. ! This will be updated in the future. call calc_ice_mass(phi, zTin, hilyr, ice_mass) if (icepack_warnings_aborted(subname)) return @@ -3292,7 +3293,7 @@ subroutine flush_pond(w, hpond, apond, dt, flpnd, expnd, & if (icepack_warnings_aborted(subname)) return endif ! diagnostic drainage rate - expnd = -dhpond * apond + dpnd_expon = -dhpond * apond ! update pond depth (and area) if (tr_pond_sealvl) then call pond_hypsometry(hpond, apond, dhpond=dhpond, hin=hin) @@ -3680,7 +3681,7 @@ end subroutine update_vertical_tracers_ice !======================================================================= subroutine calc_ice_mass(phi, zTin, hilyr, ice_mass) - + ! Calculate the mass of the ice per unit category area real(kind=dbl_kind), dimension(:), intent(in) :: & zTin , & ! ice layer temperature (C) @@ -3691,11 +3692,11 @@ subroutine calc_ice_mass(phi, zTin, hilyr, ice_mass) real(kind=dbl_kind), intent(out) :: & ice_mass ! mass per unit category area (kg m-2) - + ! local variables integer(kind=int_kind) :: & k ! ice layer index - + character(len=*),parameter :: subname='(calc_ice_mass)' ice_mass = c0 diff --git a/columnphysics/icepack_therm_vertical.F90 b/columnphysics/icepack_therm_vertical.F90 index 55ce68f20..1b0fa027c 100644 --- a/columnphysics/icepack_therm_vertical.F90 +++ b/columnphysics/icepack_therm_vertical.F90 @@ -111,7 +111,7 @@ subroutine thermo_vertical (dt, aicen, & mlt_onset, frz_onset, & yday, dsnow, & prescribed_ice, & - flpnd, expnd) + dpnd_flush, dpnd_expon) real (kind=dbl_kind), intent(in) :: & dt , & ! time step @@ -204,8 +204,8 @@ subroutine thermo_vertical (dt, aicen, & dsnow , & ! change in snow thickness (m/step-->cm/day) mlt_onset, & ! day of year that sfc melting begins frz_onset, & ! day of year that freezing begins (congel or frazil) - flpnd , & ! pond flushing rate due to ice permeability (m/s) - expnd ! exponential pond drainage rate (m/s) + dpnd_flush,& ! pond flushing rate due to ice permeability (m/s) + dpnd_expon ! exponential pond drainage rate (m/s) real (kind=dbl_kind), intent(in) :: & yday ! day of year @@ -273,12 +273,12 @@ subroutine thermo_vertical (dt, aicen, & massice(:) = c0 massliq(:) = c0 if (tr_pond) then - flpnd = c0 - expnd = c0 + dpnd_flush = c0 + dpnd_expon = c0 endif if (calc_Tsfc) then - fsensn = c0 + fsensn = c0 flatn = c0 fsurfn = c0 fcondtopn = c0 @@ -335,7 +335,7 @@ subroutine thermo_vertical (dt, aicen, & fcondtopn, fcondbotn, & fadvocn, snoice, & smice, smliq, & - flpnd, expnd) + dpnd_flush,dpnd_expon) if (icepack_warnings_aborted(subname)) return else ! ktherm @@ -2265,11 +2265,11 @@ subroutine icepack_step_therm1(dt, & mlt_onset , frz_onset , & yday , prescribed_ice, & zlvs , afsdn , & - flpnd , flpndn , & - expnd , expndn , & - frpnd , frpndn , & - rfpnd , rfpndn , & - ilpnd , ilpndn) + dpnd_flush , dpnd_flushn , & + dpnd_expon , dpnd_exponn , & + dpnd_freebd , dpnd_freebdn, & + dpnd_initial, dpnd_initialn, & + dpnd_dlid , dpnd_dlidn) real (kind=dbl_kind), intent(in) :: & dt , & ! time step @@ -2357,11 +2357,11 @@ subroutine icepack_step_therm1(dt, & frz_onset ! day of year that freezing begins (congel or frazil) real (kind=dbl_kind), intent(inout), optional :: & - flpnd , & ! pond flushing rate due to ice permeability (m/step) - expnd , & ! exponential pond drainage rate (m/step) - frpnd , & ! pond drainage rate due freeboard constraint (m/step) - rfpnd , & ! runoff rate due to rfrac (m/step) - ilpnd ! pond loss/gain (+/-) to ice lid (m/step) + dpnd_flush , & ! pond flushing rate due to ice permeability (m/step) + dpnd_expon , & ! exponential pond drainage rate (m/step) + dpnd_freebd , & ! pond drainage rate due freeboard constraint (m/step) + dpnd_initial, & ! runoff rate due to rfrac (m/step) + dpnd_dlid ! pond loss/gain (+/-) to ice lid (m/step) real (kind=dbl_kind), intent(out), optional :: & wlat ! lateral melt rate (m/s) @@ -2443,11 +2443,11 @@ subroutine icepack_step_therm1(dt, & snoicen ! snow-ice growth (m) real (kind=dbl_kind), dimension(:), intent(inout), optional :: & - flpndn , & ! category pond flushing rate (m/step) - expndn , & ! exponential pond drainage rate (m/step) - frpndn , & ! pond drainage rate due to freeboard (m/step) - rfpndn , & ! runoff rate due to rfrac (m/step) - ilpndn ! category pond loss/gain due to ice lid (m/step) + dpnd_flushn , & ! category pond flushing rate (m/step) + dpnd_exponn , & ! exponential pond drainage rate (m/step) + dpnd_freebdn, & ! pond drainage rate due to freeboard (m/step) + dpnd_initialn,& ! runoff rate due to rfrac (m/step) + dpnd_dlidn ! category pond loss/gain due to ice lid (m/step) real (kind=dbl_kind), dimension(:), intent(in) :: & fswthrun ! SW through ice to ocean (W/m^2) @@ -2546,11 +2546,11 @@ subroutine icepack_step_therm1(dt, & l_meltsliq ! mass of snow melt local (kg/m^2) real (kind=dbl_kind) :: & - l_flpndn , & ! category pond flushing rate (m/step) - l_expndn , & ! exponential pond drainage rate (m/step) - l_frpndn , & ! pond drainage rate due to freeboard (m/step) - l_rfpndn , & ! runoff rate due to rfrac (m/step) - l_ilpndn ! category pond loss/gain due to ice lid (m/step) + l_dpnd_flushn, & ! category pond flushing rate (m/step) + l_dpnd_exponn, & ! exponential pond drainage rate (m/step) + l_dpnd_freebdn, & ! pond drainage rate due to freeboard (m/step) + l_dpnd_initialn,& ! runoff rate due to rfrac (m/step) + l_dpnd_dlidn ! category pond loss/gain due to ice lid (m/step) real (kind=dbl_kind) :: & pond ! water retained in ponds (m) @@ -2609,8 +2609,24 @@ subroutine icepack_step_therm1(dt, & call icepack_warnings_setabort(.true.,__FILE__,__LINE__) return endif - if ((present(dsnow) .and. .not.present(dsnown)) .or. & - (present(dsnown) .and. .not.present(dsnow))) then + if (tr_pond) then + if ((present(dpnd_flushn ) .and. .not.present(dpnd_flush )) .or. & + (present(dpnd_flush ) .and. .not.present(dpnd_flushn )) .or. & + (present(dpnd_exponn ) .and. .not.present(dpnd_expon )) .or. & + (present(dpnd_expon ) .and. .not.present(dpnd_exponn )) .or. & + (present(dpnd_freebdn ) .and. .not.present(dpnd_freebd )) .or. & + (present(dpnd_freebd ) .and. .not.present(dpnd_freebdn )) .or. & + (present(dpnd_initialn) .and. .not.present(dpnd_initial )) .or. & + (present(dpnd_initial ) .and. .not.present(dpnd_initialn)) .or. & + (present(dpnd_dlidn ) .and. .not.present(dpnd_dlid )) .or. & + (present(dpnd_dlid ) .and. .not.present(dpnd_dlidn ))) then + call icepack_warnings_add(subname//' error in pond arguments') + call icepack_warnings_setabort(.true.,__FILE__,__LINE__) + return + endif + endif + if ((present(dsnow ) .and. .not.present(dsnown)) .or. & + (present(dsnown) .and. .not.present(dsnow ))) then call icepack_warnings_add(subname//' error in dsnow arguments') call icepack_warnings_setabort(.true.,__FILE__,__LINE__) return @@ -2731,18 +2747,17 @@ subroutine icepack_step_therm1(dt, & meltbn (n) = c0 congeln(n) = c0 snoicen(n) = c0 - l_flpndn = c0 - l_expndn = c0 - l_frpndn = c0 - l_rfpndn = c0 - l_ilpndn = c0 - if (tr_pond .and. present(flpndn) .and. present(expndn) .and. & - present(frpndn) .and. present(rfpndn) .and. present(ilpndn)) then - l_flpndn = flpndn (n) - l_expndn = expndn (n) - l_frpndn = frpndn (n) - l_rfpndn = rfpndn (n) - l_ilpndn = ilpndn (n) + l_dpnd_flushn = c0 + l_dpnd_exponn = c0 + l_dpnd_freebdn = c0 + l_dpnd_initialn = c0 + l_dpnd_dlidn = c0 + if (tr_pond) then + if (present(dpnd_flushn) ) l_dpnd_flushn = dpnd_flushn(n) + if (present(dpnd_exponn) ) l_dpnd_exponn = dpnd_exponn(n) + if (present(dpnd_freebdn) ) l_dpnd_freebdn = dpnd_freebdn(n) + if (present(dpnd_initialn)) l_dpnd_initialn = dpnd_initialn(n) + if (present(dpnd_dlidn) ) l_dpnd_dlidn = dpnd_dlidn(n) endif l_dsnown = c0 @@ -2881,7 +2896,8 @@ subroutine icepack_step_therm1(dt, & mlt_onset=mlt_onset, frz_onset=frz_onset, & yday=yday, dsnow=l_dsnown , & prescribed_ice=prescribed_ice, & - flpnd=l_flpndn , expnd=l_expndn ) + dpnd_flush=l_dpnd_flushn, & + dpnd_expon=l_dpnd_exponn ) if (icepack_warnings_aborted(subname)) then write(warnstr,*) subname, ' ice: Vertical thermo error, cat ', n @@ -2994,15 +3010,15 @@ subroutine icepack_step_therm1(dt, & apnd=apnd (n), & hpnd=hpnd (n), & ipnd=ipnd (n), & - meltsliqn=l_meltsliqn(n), & - frpndn=l_frpndn, & - rfpndn=l_rfpndn, & - ilpndn=l_ilpndn, & - flpndn=l_flpndn) + meltsliqn = l_meltsliqn(n), & + dpnd_freebdn = l_dpnd_freebdn, & + dpnd_initialn = l_dpnd_initialn,& + dpnd_dlidn = l_dpnd_dlidn, & + dpnd_flushn = l_dpnd_flushn) if (icepack_warnings_aborted(subname)) return elseif (tr_pond_sealvl) then - call compute_ponds_sealvl(dt=dt, & + call compute_ponds_sealvl(dt=dt, & meltt=melttn (n), & melts=meltsn (n), & frain=frain, & @@ -3019,10 +3035,10 @@ subroutine icepack_step_therm1(dt, & apnd=apnd (n), & hpnd=hpnd (n), & ipnd=ipnd (n), & - meltsliqn=l_meltsliqn(n), & - frpndn=l_frpndn, & - ilpndn=l_ilpndn, & - flpndn=l_flpndn) + meltsliqn = l_meltsliqn(n), & + dpnd_freebdn = l_dpnd_freebdn, & + dpnd_dlidn = l_dpnd_dlidn, & + dpnd_flushn = l_dpnd_flushn) if (icepack_warnings_aborted(subname)) return elseif (tr_pond_topo) then @@ -3134,17 +3150,27 @@ subroutine icepack_step_therm1(dt, & fiso_ocnn=fiso_ocnn, & fiso_evap=fiso_evap, & fiso_evapn=fiso_evapn, & - flpnd=flpnd, flpndn=l_flpndn, & - expnd=expnd, expndn=l_expndn, & - frpnd=frpnd, frpndn=l_frpndn, & - rfpnd=rfpnd, rfpndn=l_rfpndn, & - ilpnd=ilpnd, ilpndn=l_ilpndn) + dpnd_flush=dpnd_flush, & + dpnd_flushn=l_dpnd_flushn, & + dpnd_expon=dpnd_expon, & + dpnd_exponn=l_dpnd_exponn, & + dpnd_freebd=dpnd_freebd, & + dpnd_freebdn=l_dpnd_freebdn, & + dpnd_initial=dpnd_initial, & + dpnd_initialn=l_dpnd_initialn, & + dpnd_dlid=dpnd_dlid, & + dpnd_dlidn=l_dpnd_dlidn) if (icepack_warnings_aborted(subname)) return endif - if (present(dsnown )) dsnown(n) = l_dsnown + if (present(dsnown) ) dsnown (n) = l_dsnown + if (present(dpnd_flushn) ) dpnd_flushn (n) = l_dpnd_flushn + if (present(dpnd_exponn) ) dpnd_exponn (n) = l_dpnd_exponn + if (present(dpnd_freebdn) ) dpnd_freebdn (n) = l_dpnd_freebdn + if (present(dpnd_initialn)) dpnd_initialn(n) = l_dpnd_initialn + if (present(dpnd_dlidn) ) dpnd_dlidn (n) = l_dpnd_dlidn enddo ! ncat diff --git a/columnphysics/icepack_tracers.F90 b/columnphysics/icepack_tracers.F90 index 22c30699d..c009450da 100644 --- a/columnphysics/icepack_tracers.F90 +++ b/columnphysics/icepack_tracers.F90 @@ -105,7 +105,7 @@ module icepack_tracers tr_pond = .false., & ! if .true., use melt pond tracer tr_pond_lvl = .false., & ! if .true., use level-ice pond tracer tr_pond_topo = .false., & ! if .true., use explicit topography-based ponds - tr_pond_sealvl = .false., & ! if .true., use sealvl pond parameterization + tr_pond_sealvl=.false., & ! if .true., use sealvl pond parameterization tr_snow = .false., & ! if .true., use snow redistribution or metamorphosis tracers tr_iso = .false., & ! if .true., use isotope tracers tr_aero = .false., & ! if .true., use aerosol tracers @@ -220,7 +220,7 @@ subroutine icepack_init_tracer_flags(& tr_pond_in , & ! if .true., use melt pond tracer tr_pond_lvl_in , & ! if .true., use level-ice pond tracer tr_pond_topo_in , & ! if .true., use explicit topography-based ponds - tr_pond_sealvl_in , & ! if .true., use sealvl pond parameteriztion + tr_pond_sealvl_in,& ! if .true., use sealvl pond parameteriztion tr_snow_in , & ! if .true., use snow redistribution or metamorphosis tracers tr_fsd_in , & ! if .true., use floe size distribution tracers tr_iso_in , & ! if .true., use isotope tracers @@ -312,7 +312,7 @@ subroutine icepack_query_tracer_flags(& tr_pond_out , & ! if .true., use melt pond tracer tr_pond_lvl_out , & ! if .true., use level-ice pond tracer tr_pond_topo_out , & ! if .true., use explicit topography-based ponds - tr_pond_sealvl_out, & ! if .true., use sealvl pond parameterization + tr_pond_sealvl_out,& ! if .true., use sealvl pond parameterization tr_snow_out , & ! if .true., use snow redistribution or metamorphosis tracers tr_fsd_out , & ! if .true., use floe size distribution tr_iso_out , & ! if .true., use isotope tracers diff --git a/configuration/driver/icedrv_flux.F90 b/configuration/driver/icedrv_flux.F90 index 4ea7ee1a9..bde389724 100644 --- a/configuration/driver/icedrv_flux.F90 +++ b/configuration/driver/icedrv_flux.F90 @@ -268,20 +268,20 @@ module icedrv_flux real (kind=dbl_kind), & dimension (nx,ncat), public :: & ! Like melttn these are defined as volume per unit category area - flpndn, & ! category pond flushing rate due to ice permeability - expndn, & ! category exponential pond drainage rate - frpndn, & ! category pond drainage rate due to freeboard constraint - rfpndn, & ! category runoff rate due to rfrac (m/step) - ilpndn ! category pond loss/gain due to ice lid (m/step) + dpnd_flushn, & ! category pond flushing rate due to ice permeability + dpnd_exponn, & ! category exponential pond drainage rate + dpnd_freebdn, & ! category pond drainage rate due to freeboard constraint + dpnd_initialn, & ! category runoff rate due to rfrac (m/step) + dpnd_dlidn ! category pond loss/gain due to ice lid (m/step) real (kind=dbl_kind), dimension (nx), public :: & - flpnd, & ! pond flushing rate due to ice permeability (m/step) - expnd, & ! exponential pond drainage rate (m/step) - frpnd, & ! pond drainage rate due to freeboard constraint (m/step) - rfpnd, & ! runoff rate due to rfrac (m/step) - ilpnd, & ! pond loss/gain (+/-) to ice lid freezing/melting (m/step) - mipnd, & ! pond 'drainage' due to ice melting (m / step) - rdpnd ! pond drainage due to ridging (m / step) + dpnd_flush, & ! pond flushing rate due to ice permeability (m/step) + dpnd_expon, & ! exponential pond drainage rate (m/step) + dpnd_freebd, & ! pond drainage rate due to freeboard constraint (m/step) + dpnd_initial, & ! runoff rate due to rfrac (m/step) + dpnd_dlid, & ! pond loss/gain (+/-) to ice lid freezing/melting (m/step) + dpnd_melt, & ! pond 'drainage' due to ice melting (m / step) + dpnd_ridge ! pond drainage due to ridging (m / step) ! As above but these remain grid box mean values i.e. they are not ! divided by aice at end of ice_dynamics. @@ -716,13 +716,13 @@ subroutine init_history_therm apeff_ai (:) = c0 snowfrac (:) = c0 frazil_diag (:) = c0 - flpnd (:) = c0 - expnd (:) = c0 - frpnd (:) = c0 - rfpnd (:) = c0 - ilpnd (:) = c0 - mipnd (:) = c0 - rdpnd (:) = c0 + dpnd_flush (:) = c0 + dpnd_expon (:) = c0 + dpnd_freebd (:) = c0 + dpnd_initial(:) = c0 + dpnd_dlid (:) = c0 + dpnd_melt (:) = c0 + dpnd_ridge (:) = c0 ! drag coefficients are computed prior to the atmo_boundary call, ! during the thermodynamics section diff --git a/configuration/driver/icedrv_history.F90 b/configuration/driver/icedrv_history.F90 index 4456bccd0..a471c0166 100644 --- a/configuration/driver/icedrv_history.F90 +++ b/configuration/driver/icedrv_history.F90 @@ -51,8 +51,9 @@ subroutine history_write() use icedrv_flux, only: fswabs, flw, flwout, fsens, fsurf, flat use icedrv_flux, only: Tair, Qa, fsw, fcondtop use icedrv_flux, only: meltt, meltb, meltl, melts, snoice - use icedrv_flux, only: flpndn, expndn, frpndn, rfpndn, ilpndn - use icedrv_flux, only: flpnd, expnd, frpnd, rfpnd, ilpnd, mipnd, rdpnd + use icedrv_flux, only: dpnd_flushn, dpnd_exponn, dpnd_freebdn, dpnd_initialn, dpnd_dlidn + use icedrv_flux, only: dpnd_flush, dpnd_expon, dpnd_freebd, dpnd_initial, dpnd_dlid + use icedrv_flux, only: dpnd_melt, dpnd_ridge use icedrv_flux, only: dsnow, congel, sst, sss, Tf, fhocn use icedrv_arrays_column, only: d_afsd_newi, d_afsd_latg, d_afsd_latm, d_afsd_wave, d_afsd_weld #ifdef USE_NETCDF @@ -73,6 +74,7 @@ subroutine history_write() varid, & ! cdf varid status, & ! cdf status flag iflag, & ! history file attributes + numvars, & ! temporary for writing fields nt_apnd, nt_hpnd, nt_ipnd ! pond tracer indices character (len=8) :: & @@ -97,32 +99,33 @@ subroutine history_write() 'dsnow ', 'congel ', 'sst ', & 'sss ', 'Tf ', 'fhocn ', & 'melts ' /) - + integer (kind=dbl_kind), parameter :: num_2d_pond = 10 character(len=16), parameter :: fld_2d_pond(num_2d_pond) = & (/ 'apnd ', 'hpnd ', 'ipnd ', & - 'flpnd ', 'expnd ', 'frpnd ', & - 'rfpnd ', 'ilpnd ', 'mipnd ', & - 'rdpnd ' /) - + 'dpnd_flush ', 'dpnd_expon ', 'dpnd_freebd ', & + 'dpnd_initial ', 'dpnd_dlid ', 'dpnd_melt ', & + 'dpnd_ridge ' /) + integer (kind=dbl_kind), parameter :: num_3d_ncat = 3 character(len=16), parameter :: fld_3d_ncat(num_3d_ncat) = & (/ 'aicen ', 'vicen ', 'vsnon ' /) logical (kind=log_kind) :: & tr_fsd, & ! flag for tracing fsd - tr_pnd ! flag for tracing ponds + tr_pnd, & ! flag for tracing ponds + tr_pnd_topo ! flag for tracing topo ponds integer (kind=dbl_kind), parameter :: num_3d_nfsd = 5 character(len=16), parameter :: fld_3d_nfsd(num_3d_nfsd) = & (/ 'd_afsd_newi ', 'd_afsd_latg ', 'd_afsd_latm ', & 'd_afsd_wave ', 'd_afsd_weld ' /) - + integer (kind=dbl_kind), parameter :: num_3d_pond = 8 character(len=16), parameter :: fld_3d_pond(num_3d_pond) = & (/ 'apndn ', 'hpndn ', 'ipndn ', & - 'flpndn ', 'expndn ', 'frpndn ', & - 'rfpndn ', 'ilpndn ' /) + 'dpnd_flushn ', 'dpnd_exponn ', 'dpnd_freebdn ', & + 'dpnd_initialn ', 'dpnd_dlidn ' /) integer (kind=dbl_kind), parameter :: num_3d_ntrcr = 1 character(len=16), parameter :: fld_3d_ntrcr(num_3d_ntrcr) = & @@ -138,7 +141,8 @@ subroutine history_write() #ifdef USE_NETCDF call icepack_query_tracer_sizes(ntrcr_out=ntrcr) - call icepack_query_tracer_flags(tr_fsd_out=tr_fsd, tr_pond_out=tr_pnd) + call icepack_query_tracer_flags(tr_fsd_out=tr_fsd, tr_pond_out=tr_pnd, & + tr_pond_topo_out=tr_pnd_topo) if (first_call) then timcnt = 0 write(hist_file,'(a,i8.8,a)') './history/icepack.h.',idate,'.nc' @@ -218,7 +222,11 @@ subroutine history_write() enddo if (tr_pnd) then - do n = 1,num_2d_pond + numvars = num_2d_pond + ! tcraig, July 2025, do not write most of the pond fields for topo ponds, they are not validated yet + ! this is a temporary implementation, hardcode to write the first 3 fields only + if (tr_pnd_topo) numvars=3 + do n = 1,numvars status = nf90_def_var(ncid,trim(fld_2d_pond(n)),NF90_DOUBLE,dimid2,varid) if (status /= nf90_noerr) call icedrv_system_abort(string=subname//' ERROR in def_var '//trim(fld_2d_pond(n))) enddo @@ -236,12 +244,16 @@ subroutine history_write() enddo if (tr_pnd) then - do n = 1,num_3d_pond + numvars = num_3d_pond + ! tcraig, July 2025, do not write most of the pond fields for topo ponds, they are not validated yet + ! this is a temporary implementation, hardcode to write the first 3 fields only + if (tr_pnd_topo) numvars=3 + do n = 1,numvars status = nf90_def_var(ncid,trim(fld_3d_pond(n)),NF90_DOUBLE,dimid3,varid) if (status /= nf90_noerr) call icedrv_system_abort(string=subname//' ERROR in def_var '//trim(fld_3d_pond(n))) enddo endif ! tr_pnd - + if (tr_fsd) then ! 3d nfsd fields @@ -395,20 +407,24 @@ subroutine history_write() start2(2) = timcnt count2(2) = 1 - do n = 1,num_2d_pond + numvars = num_2d_pond + ! tcraig, July 2025, do not write most of the pond fields for topo ponds, they are not validated yet + ! this is a temporary implementation, hardcode to write the first 3 fields only + if (tr_pnd_topo) numvars=3 + do n = 1,numvars allocate(value2(count2(1),1)) value2 = -9999._dbl_kind if (trim(fld_2d_pond(n)) == 'apnd') value2(1:count2(1),1) = trcr(1:count2(1),nt_apnd) if (trim(fld_2d_pond(n)) == 'hpnd') value2(1:count2(1),1) = trcr(1:count2(1),nt_hpnd) if (trim(fld_2d_pond(n)) == 'ipnd') value2(1:count2(1),1) = trcr(1:count2(1),nt_ipnd) - if (trim(fld_2d_pond(n)) == 'flpnd') value2(1:count2(1),1) = flpnd(1:count2(1)) - if (trim(fld_2d_pond(n)) == 'expnd') value2(1:count2(1),1) = expnd(1:count2(1)) - if (trim(fld_2d_pond(n)) == 'frpnd') value2(1:count2(1),1) = frpnd(1:count2(1)) - if (trim(fld_2d_pond(n)) == 'rfpnd') value2(1:count2(1),1) = rfpnd(1:count2(1)) - if (trim(fld_2d_pond(n)) == 'ilpnd') value2(1:count2(1),1) = ilpnd(1:count2(1)) - if (trim(fld_2d_pond(n)) == 'mipnd') value2(1:count2(1),1) = mipnd(1:count2(1)) - if (trim(fld_2d_pond(n)) == 'rdpnd') value2(1:count2(1),1) = rdpnd(1:count2(1)) + if (trim(fld_2d_pond(n)) == 'dpnd_flush' ) value2(1:count2(1),1) = dpnd_flush (1:count2(1)) + if (trim(fld_2d_pond(n)) == 'dpnd_expon' ) value2(1:count2(1),1) = dpnd_expon (1:count2(1)) + if (trim(fld_2d_pond(n)) == 'dpnd_freebd' ) value2(1:count2(1),1) = dpnd_freebd (1:count2(1)) + if (trim(fld_2d_pond(n)) == 'dpnd_initial') value2(1:count2(1),1) = dpnd_initial(1:count2(1)) + if (trim(fld_2d_pond(n)) == 'dpnd_dlid' ) value2(1:count2(1),1) = dpnd_dlid (1:count2(1)) + if (trim(fld_2d_pond(n)) == 'dpnd_melt' ) value2(1:count2(1),1) = dpnd_melt (1:count2(1)) + if (trim(fld_2d_pond(n)) == 'dpnd_ridge' ) value2(1:count2(1),1) = dpnd_ridge (1:count2(1)) status = nf90_inq_varid(ncid,trim(fld_2d_pond(n)),varid) if (status /= nf90_noerr) call icedrv_system_abort(string=subname//' ERROR: inq_var '//trim(fld_2d_pond(n))) @@ -456,18 +472,22 @@ subroutine history_write() start3(3) = timcnt count3(3) = 1 - do n = 1,num_3d_pond + numvars = num_3d_pond + ! tcraig, July 2025, do not write most of the pond fields for topo ponds, they are not validated yet + ! this is a temporary implementation, hardcode to write the first 3 fields only + if (tr_pnd_topo) numvars=3 + do n = 1,numvars allocate(value3(count3(1),count3(2),1)) value3 = -9999._dbl_kind if (trim(fld_3d_pond(n)) == 'apndn') value3(1:count3(1),1:count3(2),1) = trcrn(1:count3(1),nt_apnd,1:count3(2)) if (trim(fld_3d_pond(n)) == 'hpndn') value3(1:count3(1),1:count3(2),1) = trcrn(1:count3(1),nt_hpnd,1:count3(2)) if (trim(fld_3d_pond(n)) == 'ipndn') value3(1:count3(1),1:count3(2),1) = trcrn(1:count3(1),nt_ipnd,1:count3(2)) - if (trim(fld_3d_pond(n)) == 'flpndn') value3(1:count3(1),1:count3(2),1) = flpndn(1:count3(1),1:count3(2)) - if (trim(fld_3d_pond(n)) == 'expndn') value3(1:count3(1),1:count3(2),1) = expndn(1:count3(1),1:count3(2)) - if (trim(fld_3d_pond(n)) == 'frpndn') value3(1:count3(1),1:count3(2),1) = frpndn(1:count3(1),1:count3(2)) - if (trim(fld_3d_pond(n)) == 'rfpndn') value3(1:count3(1),1:count3(2),1) = rfpndn(1:count3(1),1:count3(2)) - if (trim(fld_3d_pond(n)) == 'ilpndn') value3(1:count3(1),1:count3(2),1) = ilpndn(1:count3(1),1:count3(2)) + if (trim(fld_3d_pond(n)) == 'dpnd_flushn' ) value3(1:count3(1),1:count3(2),1) = dpnd_flushn (1:count3(1),1:count3(2)) + if (trim(fld_3d_pond(n)) == 'dpnd_exponn' ) value3(1:count3(1),1:count3(2),1) = dpnd_exponn (1:count3(1),1:count3(2)) + if (trim(fld_3d_pond(n)) == 'dpnd_freebdn' ) value3(1:count3(1),1:count3(2),1) = dpnd_freebdn (1:count3(1),1:count3(2)) + if (trim(fld_3d_pond(n)) == 'dpnd_initialn') value3(1:count3(1),1:count3(2),1) = dpnd_initialn(1:count3(1),1:count3(2)) + if (trim(fld_3d_pond(n)) == 'dpnd_dlidn' ) value3(1:count3(1),1:count3(2),1) = dpnd_dlidn (1:count3(1),1:count3(2)) status = nf90_inq_varid(ncid,trim(fld_3d_pond(n)),varid) if (status /= nf90_noerr) call icedrv_system_abort(string=subname//' ERROR: inq_var '//trim(fld_3d_pond(n))) diff --git a/configuration/driver/icedrv_step.F90 b/configuration/driver/icedrv_step.F90 index dff06bdca..a6a85ef7a 100644 --- a/configuration/driver/icedrv_step.F90 +++ b/configuration/driver/icedrv_step.F90 @@ -129,8 +129,8 @@ subroutine step_therm1 (dt) use icedrv_flux, only: dsnow, dsnown, faero_atm, faero_ocn use icedrv_flux, only: fiso_atm, fiso_ocn, fiso_evap use icedrv_flux, only: HDO_ocn, H2_16O_ocn, H2_18O_ocn - use icedrv_flux, only: flpndn, expndn, frpndn, rfpndn, ilpndn - use icedrv_flux, only: flpnd, expnd, frpnd, rfpnd, ilpnd + use icedrv_flux, only: dpnd_flushn, dpnd_exponn, dpnd_freebdn, dpnd_initialn, dpnd_dlidn + use icedrv_flux, only: dpnd_flush, dpnd_expon, dpnd_freebd, dpnd_initial, dpnd_dlid use icedrv_init, only: lmask_n, lmask_s use icedrv_state, only: aice, aicen, aice_init, aicen_init, vicen_init use icedrv_state, only: vice, vicen, vsno, vsnon, trcrn, uvel, vvel, vsnon_init @@ -376,11 +376,11 @@ subroutine step_therm1 (dt) lmask_n = lmask_n(i), lmask_s = lmask_s(i), & mlt_onset=mlt_onset(i), frz_onset = frz_onset(i), & yday = yday, prescribed_ice = prescribed_ice, & - flpnd = flpnd(i), flpndn = flpndn(i,:), & - expnd = expnd(i), expndn = expndn(i,:), & - frpnd = frpnd(i), frpndn = frpndn(i,:), & - rfpnd = rfpnd(i), rfpndn = rfpndn(i,:), & - ilpnd = ilpnd(i), ilpndn = ilpndn(i,:)) + dpnd_flush = dpnd_flush(i), dpnd_flushn = dpnd_flushn(i,:), & + dpnd_expon = dpnd_expon(i), dpnd_exponn = dpnd_exponn(i,:), & + dpnd_freebd = dpnd_freebd(i), dpnd_freebdn = dpnd_freebdn(i,:), & + dpnd_initial= dpnd_initial(i), dpnd_initialn= dpnd_initialn(i,:), & + dpnd_dlid = dpnd_dlid(i), dpnd_dlidn = dpnd_dlidn(i,:)) if (tr_aero) then do n = 1, ncat @@ -446,7 +446,7 @@ subroutine step_therm2 (dt) use icedrv_flux, only: fsalt, Tf, sss, salinz, fhocn, rsiden, wlat use icedrv_flux, only: meltl, frazil_diag, flux_bio, faero_ocn, fiso_ocn use icedrv_flux, only: HDO_ocn, H2_16O_ocn, H2_18O_ocn - use icedrv_flux, only: mipnd + use icedrv_flux, only: dpnd_melt use icedrv_init, only: tmask use icedrv_state, only: aice, aicen, aice0, trcr_depend use icedrv_state, only: aicen_init, vicen_init, trcrn, vicen, vsnon @@ -531,7 +531,7 @@ subroutine step_therm2 (dt) d_afsd_newi=d_afsd_newi(i,:), & d_afsd_latm=d_afsd_latm(i,:), & d_afsd_weld=d_afsd_weld(i,:), & - mipnd=mipnd(i)) + dpnd_melt=dpnd_melt(i)) endif ! tmask @@ -824,7 +824,7 @@ subroutine step_dyn_ridge (dt, ndtd) use icedrv_flux, only: dvirdgdt, opening, closing, fpond, fresh, fhocn use icedrv_flux, only: aparticn, krdgn, aredistn, vredistn, dardg1ndt, dardg2ndt use icedrv_flux, only: dvirdgndt, araftn, vraftn, fsalt, flux_bio, faero_ocn, fiso_ocn - use icedrv_flux, only: rdpnd + use icedrv_flux, only: dpnd_ridge use icedrv_init, only: tmask use icedrv_state, only: trcrn, vsnon, aicen, vicen use icedrv_state, only: aice, aice0, trcr_depend, n_trcr_strata @@ -896,7 +896,7 @@ subroutine step_dyn_ridge (dt, ndtd) first_ice=first_ice(i,:), & flux_bio=flux_bio(i,1:nbtrcr), & closing=closing(i), Tf=Tf(i), & - rdpnd=rdpnd(i)) + dpnd_ridge=dpnd_ridge(i)) endif ! tmask @@ -936,7 +936,7 @@ subroutine step_dyn_ridge (dt, ndtd) aice=aice(i), fsalt=fsalt(i), & first_ice=first_ice(i,:), & flux_bio=flux_bio(i,1:nbtrcr), Tf = Tf(i), & - rdpnd=rdpnd(i)) + dpnd_ridge=dpnd_ridge(i)) endif ! tmask diff --git a/doc/source/science_guide/sg_thermo.rst b/doc/source/science_guide/sg_thermo.rst index 3b27f4ec3..2acc7bf0c 100755 --- a/doc/source/science_guide/sg_thermo.rst +++ b/doc/source/science_guide/sg_thermo.rst @@ -127,11 +127,11 @@ ponds, :math:`\rho_i` and :math:`\rho_s` are ice and snow densities, :math:`\Delta h_i` and :math:`\Delta h_s` are the thicknesses of ice and snow that melted, and :math:`F_{rain}` is the rainfall rate. Namelist parameters are set for the level-ice (``tr_pond_lvl``) parameterization; -in the cesm and topo pond schemes the standard values of :math:`r_{max}` -and :math:`r_{min}` are 0.7 and 0.15, respectively. For the sealvl pond -parameterization, 100% of the melt water is added to the ponds -(:math:`r = 1.0`) and runoff is handled by the macro-flaw drainage -parameterization (see below). +in the topo pond scheme the standard values of :math:`r_{max}` +and :math:`r_{min}` are 0.7 and 0.15, respectively. For the sea-level pond +parameterization, 100% of the melt water is added to the ponds +(:math:`r = 1.0`) and runoff is handled by the macro-flaw drainage +parameterization. Radiatively, the surface of an ice category is divided into fractions of snow, pond and bare ice. In these melt pond schemes, the actual pond @@ -694,36 +694,36 @@ same mean pond area in a grid cell after the addition of new ice, and solving for the new pond area tracer :math:`a_{pnd}^\prime` given the newly formed ice area :math:`\Delta a_i = \Delta a_{lvl}`. -sealvl pond formulation (``tr_pond_sealvl`` = true) +Sea-level pond formulation (``tr_pond_sealvl`` = true) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The sealvl meltpond parameterization was developed based on the +The sea-level meltpond parameterization was developed based on the following observations from field studies and high-resolution (<=1 m) satellite and airborne imagery: * Stage I and II of melt pond formation (initial formation and drainage to sea level, respectively) last approximately 2 weeks - (:cite:`Eicken04`, :cite:`Polashenski12`, :cite:`Landy14`). + :cite:`Eicken04`, :cite:`Polashenski12`, :cite:`Landy14`. Therefore melt ponds spend most of their lifespan in Stage III (i.e., pond-air interfaces are at or near sea level and pond-ice interfaces are below sea level). * On the scale of a CICE grid cell (> 1 km), melt ponds are simultaneously observed on thicker and thinner ice; thinner ice does not need to be saturated with ponds for there to be ponds on - thicker ice (e.g., :cite:`Webster15`, :cite:`Webster22`). + thicker ice :cite:`Webster15`, :cite:`Webster22`. * For pack ice in the Arctic, Stage III melt pond fraction is rarely observed to be below 15% or above 45% on the scale of a CICE grid cell (e.g., :cite:`Fetterer98`, :cite:`Tschudi01`, :cite:`Webster15`, :cite:`Wright20`). Some remote sensing retrievals show higher - pond fractions immediately before the ice melts out (:cite:`Webster15`), + pond fractions immediately before the ice melts out :cite:`Webster15`, but it is possible that melted-through ponds (i.e., open water) are being misclassified as ponds. * Ponds are routinely observed on deformed ice (e.g., :cite:`Eicken04`). * When MYI and FYI coexist, observations do not clearly indicate consistent differences in pond fraction, although there may be - differences in timing (e.g., :cite:`Webster15`, :cite:`Wright20`). + differences in timing :cite:`Webster15`, :cite:`Wright20`. * Ponded ice albedos do not rapidly increase as pond depth decreases - below 20 cm (e.g., :cite:`Light22`). + below 20 cm :cite:`Light22`. The sealvl parameterization assumes that each ice thickness category within the grid cell has a subcategory distribution of ice surface @@ -735,11 +735,11 @@ ice thickness changes). The hypsometric curve is assumed to be linear. For each category, the slope and intercept of the hypsometric curve are parameterized such that when pond surfaces are at sea level and the category is snow-free, the pond area fraction is equal to the namelist -parameter ``apnd_sl`` (notated as :math:`a_{p,sl}` in :eq:`pndasp`). +parameter ``apnd_sl`` (notated as :math:`a_{p,sl}` in Eq. :eq:`pndasp`). Unless otherwise specified, the sealvl parameterization uses the same parameterizations as the level-ice pond scheme. For example, the same approach is used to set the effective surface fractions for the Delta- -Eddington shortwave calculations). +Eddington shortwave calculations. *Hypsometry and Pond Depth-Area Relationship.* @@ -756,7 +756,7 @@ category and :math:`a_p` is the pond area fraction of the category. Pond meltwater volume is apportioned into depth and area according to :math:`pndasp`, with the exception that if the pond area completely fills the category :math:`h_p` may exceed :math:`a_p*pndasp` -(:math:`h_p` is still subject to a freeboard constraint, see below). +(:math:`h_p` is still subject to a freeboard constraint). Unlike in the level-ice parameterization, this use of :math:`pndasp` means that when drainage reduces pond volume, both pond area and depth decrease; in the level-ice parameterization just depth decreases. In the @@ -784,7 +784,7 @@ evolution. The parameterized hypsometric curve is also used to compute the height of the pond surfaces above the mean ice draft (:math:`hpsurf`), which is then used in the calculation of hydraulic head for the drainage -parameterizations (below). :math:`hpsurf` is calculated by +parameterizations. :math:`hpsurf` is calculated by .. math:: hpsurf = h_{in} - pndasp + 2 * pndasp * a_{p} @@ -811,7 +811,7 @@ in the sealvl scheme. * *Percolation Drainage.* Percolation drainage is implemented in the mushy thermodynamics scheme. The harmonic mean of the permeability of the ice column is estimated, as is the hydraulic head (the height of the - pond-air interface above sea level, see above). Then the drainage rate + pond-air interface above sea level). Then the drainage rate is estimated assuming a Darcy flow. Percolation drainage in the sealvl scheme is identical to the level-ice scheme except for the calculation of the hydraulic head. @@ -850,7 +850,7 @@ in the sealvl scheme. assumed that all pond water drains from ice undergoing deformation. * *Pond Lid Refreezing.* Pond lid refreezing and melting in the sealvl - scheme is handled in the same manner as in the level-ice scheme (above). + scheme is handled in the same manner as in the level-ice scheme. The only difference is that in the sealvl scheme the impact of the removed/added pond water are distributed according to hypsometry. @@ -869,7 +869,7 @@ optical properties (bare ice IOPs are used). Subsequent research transition to bare ice IOPs below 20 cm pond depth. The presence of a pond of any measured depth was sufficient to change the apparent optical properties. Consequently, the sealvl scheme disables the pond to bare -ice transition depth assumption (i.e., ``hp0`` = ``hpmin`` = 0.005 m). +ice transition depth assumption (``hp0`` = ``hpmin`` = 0.005 m). .. _sfc-forcing: diff --git a/doc/source/user_guide/interfaces.include b/doc/source/user_guide/interfaces.include index 7c0772082..14f60aab2 100644 --- a/doc/source/user_guide/interfaces.include +++ b/doc/source/user_guide/interfaces.include @@ -464,7 +464,7 @@ icepack_step_ridge aice, fsalt, & first_ice, & flux_bio, closing, & - Tf, & + Tf, dpnd_ridge, & docleanup, dorebin) real (kind=dbl_kind), intent(in) :: & @@ -537,6 +537,9 @@ icepack_step_ridge logical (kind=log_kind), dimension(:), intent(inout) :: & first_ice ! true until ice forms + real (kind=dbl_kind), intent(inout), optional :: & + dpnd_ridge ! pond drainage due to ridging + logical (kind=log_kind), intent(in), optional :: & docleanup, & ! if false, do not call cleanup_itd (default true) dorebin ! if false, do not call rebin in cleanup_itd (default true) @@ -785,7 +788,7 @@ icepack_init_parameters qqqice_in, TTTice_in, qqqocn_in, TTTocn_in, & ktherm_in, conduct_in, fbot_xfer_type_in, calc_Tsfc_in, & update_ocn_f_in, ustar_min_in, hi_min_in, a_rapid_mode_in, & - cpl_frazil_in, & + cpl_frazil_in, semi_implicit_Tsfc_in, vapor_flux_correction_in, & Rac_rapid_mode_in, aspect_rapid_mode_in, & dSdt_slow_mode_in, phi_c_slow_mode_in, & phi_i_mushy_in, shortwave_in, albedo_type_in, albsnowi_in, & @@ -795,7 +798,7 @@ icepack_init_parameters atmbndy_in, calc_strair_in, formdrag_in, highfreq_in, natmiter_in, & atmiter_conv_in, calc_dragio_in, & tfrz_option_in, kitd_in, kcatbound_in, hs0_in, frzpnd_in, & - saltflux_option_in, congel_freeze_in, & + apnd_sl_in, saltflux_option_in, congel_freeze_in, & floeshape_in, wave_spec_in, wave_spec_type_in, nfreq_in, & dpscale_in, rfracmin_in, rfracmax_in, pndaspect_in, hs1_in, hp1_in, & bgc_flux_type_in, z_tracers_in, scale_bgc_in, solve_zbgc_in, & @@ -809,6 +812,7 @@ icepack_init_parameters y_sk_DMS_in, t_sk_conv_in, t_sk_ox_in, frazil_scav_in, & sw_redist_in, sw_frac_in, sw_dtemp_in, snwgrain_in, & snwredist_in, use_smliq_pnd_in, rsnw_fall_in, rsnw_tmax_in, & + snw_growth_wet_in, drsnw_min_in, snwliq_max_in, & rhosnew_in, rhosmin_in, rhosmax_in, windmin_in, drhosdwind_in, & snwlvlfac_in, isnw_T_in, isnw_Tgrd_in, isnw_rhos_in, & snowage_rhos_in, snowage_Tgrd_in, snowage_T_in, & @@ -918,6 +922,9 @@ icepack_init_parameters calc_Tsfc_in , &! if true, calculate surface temperature ! if false, Tsfc is computed elsewhere and ! atmos-ice fluxes are provided to CICE + semi_implicit_Tsfc_in , &! compute dfsurf/dT, dflat/dT terms instead of fsurf, flat + vapor_flux_correction_in, &! compute mass/enthalpy correction when evaporation/sublimation + ! computed outside at 0C update_ocn_f_in ! include fresh water and salt fluxes for frazil real (kind=dbl_kind), intent(in), optional :: & @@ -1247,7 +1254,7 @@ icepack_init_parameters real (kind=dbl_kind), intent(in), optional :: & hs0_in ! snow depth for transition to bare sea ice (m) - ! level-ice ponds + ! level-ice and sealvl ponds character (len=*), intent(in), optional :: & frzpnd_in ! pond refreezing parameterization @@ -1258,6 +1265,10 @@ icepack_init_parameters pndaspect_in, & ! ratio of pond depth to pond fraction hs1_in ! tapering parameter for snow on pond ice + ! sealvl ponds + real (kind=dbl_kind), intent(in), optional :: & + apnd_sl_in ! equilibrium pond fraction for sea level parameterization + ! topo ponds real (kind=dbl_kind), intent(in), optional :: & hp1_in ! critical parameter for pond ice thickness @@ -1282,7 +1293,10 @@ icepack_init_parameters rhosmax_in, & ! maximum snow density (kg/m^3) windmin_in, & ! minimum wind speed to compact snow (m/s) drhosdwind_in, & ! wind compaction factor (kg s/m^4) - snwlvlfac_in ! fractional increase in snow depth + snwlvlfac_in, & ! fractional increase in snow depth + snw_growth_wet_in,&! wet metamorphism parameter (um^3/s) + drsnw_min_in, & ! minimum snow grain growth factor + snwliq_max_in ! irreducible saturation fraction integer (kind=int_kind), intent(in), optional :: & isnw_T_in, & ! maxiumum temperature index @@ -1336,15 +1350,15 @@ icepack_query_parameters Lfresh_out, cprho_out, Cp_out, ustar_min_out, hi_min_out, a_rapid_mode_out, & ktherm_out, conduct_out, fbot_xfer_type_out, calc_Tsfc_out, & Rac_rapid_mode_out, aspect_rapid_mode_out, dSdt_slow_mode_out, & - phi_c_slow_mode_out, phi_i_mushy_out, shortwave_out, & - albedo_type_out, albicev_out, albicei_out, albsnowv_out, & + phi_c_slow_mode_out, phi_i_mushy_out, shortwave_out, semi_implicit_Tsfc_out, & + albedo_type_out, albicev_out, albicei_out, albsnowv_out, vapor_flux_correction_out, & albsnowi_out, ahmax_out, R_ice_out, R_pnd_out, R_snw_out, dT_mlt_out, & rsnw_mlt_out, dEdd_algae_out, & kalg_out, R_gC2molC_out, kstrength_out, krdg_partic_out, krdg_redist_out, mu_rdg_out, & atmbndy_out, calc_strair_out, formdrag_out, highfreq_out, natmiter_out, & atmiter_conv_out, calc_dragio_out, & tfrz_option_out, kitd_out, kcatbound_out, hs0_out, frzpnd_out, & - saltflux_option_out, congel_freeze_out, & + apnd_sl_out, saltflux_option_out, congel_freeze_out, & floeshape_out, wave_spec_out, wave_spec_type_out, nfreq_out, & dpscale_out, rfracmin_out, rfracmax_out, pndaspect_out, hs1_out, hp1_out, & bgc_flux_type_out, z_tracers_out, scale_bgc_out, solve_zbgc_out, & @@ -1358,6 +1372,7 @@ icepack_query_parameters y_sk_DMS_out, t_sk_conv_out, t_sk_ox_out, frazil_scav_out, & sw_redist_out, sw_frac_out, sw_dtemp_out, snwgrain_out, & snwredist_out, use_smliq_pnd_out, rsnw_fall_out, rsnw_tmax_out, & + snw_growth_wet_out, drsnw_min_out, snwliq_max_out, & rhosnew_out, rhosmin_out, rhosmax_out, windmin_out, drhosdwind_out, & snwlvlfac_out, isnw_T_out, isnw_Tgrd_out, isnw_rhos_out, & snowage_rhos_out, snowage_Tgrd_out, snowage_T_out, & @@ -1475,6 +1490,9 @@ icepack_query_parameters calc_Tsfc_out ,&! if true, calculate surface temperature ! if false, Tsfc is computed elsewhere and ! atmos-ice fluxes are provided to CICE + semi_implicit_Tsfc_out ,&! compute dfsurf/dT, dflat/dT terms instead of fsurf, flat + vapor_flux_correction_out ,&! compute mass/enthalpy correction when evaporation/sublimation + ! computed outside at 0C update_ocn_f_out ! include fresh water and salt fluxes for frazil real (kind=dbl_kind), intent(out), optional :: & @@ -1806,7 +1824,7 @@ icepack_query_parameters real (kind=dbl_kind), intent(out), optional :: & hs0_out ! snow depth for transition to bare sea ice (m) - ! level-ice ponds + ! level-ice and sealvl ponds character (len=*), intent(out), optional :: & frzpnd_out ! pond refreezing parameterization @@ -1817,6 +1835,10 @@ icepack_query_parameters pndaspect_out, & ! ratio of pond depth to pond fraction hs1_out ! tapering parameter for snow on pond ice + ! sealvl ponds + real (kind=dbl_kind), intent(out), optional :: & + apnd_sl_out ! equilibrium pond fraction for sea level parameterization + ! topo ponds real (kind=dbl_kind), intent(out), optional :: & hp1_out ! critical parameter for pond ice thickness @@ -1841,7 +1863,10 @@ icepack_query_parameters rhosmax_out, & ! maximum snow density (kg/m^3) windmin_out, & ! minimum wind speed to compact snow (m/s) drhosdwind_out, & ! wind compaction factor (kg s/m^4) - snwlvlfac_out ! fractional increase in snow depth + snwlvlfac_out, & ! fractional increase in snow depth + snw_growth_wet_out,&! wet metamorphism parameter (um^3/s) + drsnw_min_out, & ! minimum snow grain growth factor + snwliq_max_out ! irreducible saturation fraction integer (kind=int_kind), intent(out), optional :: & isnw_T_out, & ! maxiumum temperature index @@ -1995,6 +2020,8 @@ icepack_step_radiation yday, sec, & swvdr, swvdf, & swidr, swidf, & + swuvrdr, swuvrdf, & + swpardr, swpardf, & coszen, fsnow, & alvdrn, alvdfn, & alidrn, alidfn, & @@ -2004,6 +2031,10 @@ icepack_step_radiation fswthrun_vdf, & fswthrun_idr, & fswthrun_idf, & + fswthrun_uvrdr, & + fswthrun_uvrdf, & + fswthrun_pardr, & + fswthrun_pardf, & fswpenln, & Sswabsn, Iswabsn, & albicen, albsnon, & @@ -2023,6 +2054,12 @@ icepack_step_radiation fsnow , & ! snowfall rate (kg/m^2 s) TLAT, TLON ! latitude and longitude (radian) + real (kind=dbl_kind), intent(in), optional :: & + swuvrdr , & ! sw down, vis uvr dir (W/m^2) + swuvrdf , & ! sw down, vis uvr dif (W/m^2) + swpardr , & ! sw down, vis par dir (W/m^2) + swpardf ! sw down, vis par dif (W/m^2) + integer (kind=int_kind), intent(in) :: & sec ! elapsed seconds into date @@ -2030,7 +2067,7 @@ icepack_step_radiation yday ! day of the year character (len=char_len), intent(in), optional :: & - calendar_type ! differentiates Gregorian from other calendars + calendar_type ! differentiates proleptic_gregorian from other calendars integer (kind=int_kind), intent(in), optional :: & days_per_year ! number of days in one year @@ -2081,7 +2118,11 @@ icepack_step_radiation fswthrun_vdr , & ! vis dir SW through ice to ocean (W/m^2) fswthrun_vdf , & ! vis dif SW through ice to ocean (W/m^2) fswthrun_idr , & ! nir dir SW through ice to ocean (W/m^2) - fswthrun_idf ! nir dif SW through ice to ocean (W/m^2) + fswthrun_idf , & ! nir dif SW through ice to ocean (W/m^2) + fswthrun_uvrdr,& ! vis uvr dir SW through ice to ocean (W/m^2) + fswthrun_uvrdf,& ! vis uvr dif SW through ice to ocean (W/m^2) + fswthrun_pardr,& ! vis par dir SW through ice to ocean (W/m^2) + fswthrun_pardf ! vis par dif SW through ice to ocean (W/m^2) real (kind=dbl_kind), dimension(:,:), intent(inout) :: & fswpenln , & ! visible SW entering ice layers (W m-2) @@ -2216,7 +2257,8 @@ icepack_step_therm2 wavefreq, & dwavefreq, & d_afsd_latg, d_afsd_newi, & - d_afsd_latm, d_afsd_weld) + d_afsd_latm, d_afsd_weld, & + dpnd_melt) use icepack_parameters, only: icepack_init_parameters @@ -2260,6 +2302,9 @@ icepack_step_therm2 frazil , & ! frazil ice growth (m/step-->cm/day) frazil_diag ! frazil ice growth diagnostic (m/step-->cm/day) + real (kind=dbl_kind), intent(inout), optional :: & + dpnd_melt ! pond 'drainage' due to ice melting (m / step) + real (kind=dbl_kind), intent(in), optional :: & wlat ! lateral melt rate (m/s) @@ -2512,6 +2557,10 @@ icepack_step_therm1 fswthrun_vdf, & fswthrun_idr, & fswthrun_idf, & + fswthrun_uvrdr, & + fswthrun_uvrdf, & + fswthrun_pardr, & + fswthrun_pardf, & fswabs , & flwout , & Sswabsn , Iswabsn , & @@ -2527,8 +2576,13 @@ icepack_step_therm1 fswthru_vdf , & fswthru_idr , & fswthru_idf , & + fswthru_uvrdr , & + fswthru_uvrdf , & + fswthru_pardr , & + fswthru_pardf , & flatn_f , fsensn_f , & fsurfn_f , fcondtopn_f , & + dfsurfdT , dflatdT , & faero_atm , faero_ocn , & fiso_atm , fiso_ocn , & fiso_evap , & @@ -2547,7 +2601,12 @@ icepack_step_therm1 lmask_n , lmask_s , & mlt_onset , frz_onset , & yday , prescribed_ice, & - zlvs , afsdn) + zlvs , afsdn , & + dpnd_flush , dpnd_flushn , & + dpnd_expon , dpnd_exponn , & + dpnd_freebd , dpnd_freebdn, & + dpnd_initial, dpnd_initialn, & + dpnd_dlid , dpnd_dlidn) real (kind=dbl_kind), intent(in) :: & dt , & ! time step @@ -2634,6 +2693,13 @@ icepack_step_therm1 mlt_onset , & ! day of year that sfc melting begins frz_onset ! day of year that freezing begins (congel or frazil) + real (kind=dbl_kind), intent(inout), optional :: & + dpnd_flush , & ! pond flushing rate due to ice permeability (m/step) + dpnd_expon , & ! exponential pond drainage rate (m/step) + dpnd_freebd , & ! pond drainage rate due freeboard constraint (m/step) + dpnd_initial, & ! runoff rate due to rfrac (m/step) + dpnd_dlid ! pond loss/gain (+/-) to ice lid (m/step) + real (kind=dbl_kind), intent(out), optional :: & wlat ! lateral melt rate (m/s) @@ -2642,6 +2708,10 @@ icepack_step_therm1 fswthru_vdf , & ! vis dif shortwave penetrating to ocean (W/m^2) fswthru_idr , & ! nir dir shortwave penetrating to ocean (W/m^2) fswthru_idf , & ! nir dif shortwave penetrating to ocean (W/m^2) + fswthru_uvrdr,& ! vis uvr dir shortwave penetrating to ocean (W/m^2) + fswthru_uvrdf,& ! vis uvr dif shortwave penetrating to ocean (W/m^2) + fswthru_pardr,& ! vis par dir shortwave penetrating to ocean (W/m^2) + fswthru_pardf,& ! vis par dif shortwave penetrating to ocean (W/m^2) dsnow , & ! change in snow depth (m/step-->cm/day) fsloss ! rate of snow loss to leads (kg/m^2/s) @@ -2709,6 +2779,13 @@ icepack_step_therm1 congeln , & ! congelation ice growth (m) snoicen ! snow-ice growth (m) + real (kind=dbl_kind), dimension(:), intent(inout), optional :: & + dpnd_flushn , & ! category pond flushing rate (m/step) + dpnd_exponn , & ! exponential pond drainage rate (m/step) + dpnd_freebdn, & ! pond drainage rate due to freeboard (m/step) + dpnd_initialn,& ! runoff rate due to rfrac (m/step) + dpnd_dlidn ! category pond loss/gain due to ice lid (m/step) + real (kind=dbl_kind), dimension(:), intent(in) :: & fswthrun ! SW through ice to ocean (W/m^2) @@ -2716,10 +2793,16 @@ icepack_step_therm1 dsnown ! change in snow thickness (m/step-->cm/day) real (kind=dbl_kind), dimension(:), intent(in), optional :: & + dfsurfdT , & ! derivative of fsurfn with respect to temperatur (W m-2 K-1) + dflatdT , & ! derivative of flatn with respect to temperature (W m-2 K-1) fswthrun_vdr , & ! vis dir SW through ice to ocean (W/m^2) fswthrun_vdf , & ! vis dif SW through ice to ocean (W/m^2) fswthrun_idr , & ! nir dir SW through ice to ocean (W/m^2) - fswthrun_idf ! nir dif SW through ice to ocean (W/m^2) + fswthrun_idf , & ! nir dif SW through ice to ocean (W/m^2) + fswthrun_uvrdr,& ! vis uvr dir SW through ice to ocean (W/m^2) + fswthrun_uvrdf,& ! vis uvr dif SW through ice to ocean (W/m^2) + fswthrun_pardr,& ! vis par dir SW through ice to ocean (W/m^2) + fswthrun_pardf ! via par dif SW through ice to ocean (W/m^2) real (kind=dbl_kind), dimension(:,:), intent(inout) :: & zqsn , & ! snow layer enthalpy (J m-3) @@ -2750,7 +2833,7 @@ icepack_init_tracer_flags subroutine icepack_init_tracer_flags(& tr_iage_in, tr_FY_in, tr_lvl_in, tr_snow_in, & - tr_pond_in, tr_pond_lvl_in, tr_pond_topo_in, & + tr_pond_in, tr_pond_lvl_in, tr_pond_topo_in, tr_pond_sealvl_in, & tr_fsd_in, tr_aero_in, tr_iso_in, tr_brine_in, tr_zaero_in, & tr_bgc_Nit_in, tr_bgc_N_in, tr_bgc_DON_in, tr_bgc_C_in, tr_bgc_chl_in, & tr_bgc_Am_in, tr_bgc_Sil_in, tr_bgc_DMS_in, tr_bgc_Fe_in, tr_bgc_hum_in, & @@ -2763,6 +2846,7 @@ icepack_init_tracer_flags tr_pond_in , & ! if .true., use melt pond tracer tr_pond_lvl_in , & ! if .true., use level-ice pond tracer tr_pond_topo_in , & ! if .true., use explicit topography-based ponds + tr_pond_sealvl_in,& ! if .true., use sealvl pond parameteriztion tr_snow_in , & ! if .true., use snow redistribution or metamorphosis tracers tr_fsd_in , & ! if .true., use floe size distribution tracers tr_iso_in , & ! if .true., use isotope tracers @@ -2793,7 +2877,7 @@ icepack_query_tracer_flags subroutine icepack_query_tracer_flags(& tr_iage_out, tr_FY_out, tr_lvl_out, tr_snow_out, & - tr_pond_out, tr_pond_lvl_out, tr_pond_topo_out, & + tr_pond_out, tr_pond_lvl_out, tr_pond_topo_out, tr_pond_sealvl_out, & tr_fsd_out, tr_aero_out, tr_iso_out, tr_brine_out, tr_zaero_out, & tr_bgc_Nit_out, tr_bgc_N_out, tr_bgc_DON_out, tr_bgc_C_out, tr_bgc_chl_out, & tr_bgc_Am_out, tr_bgc_Sil_out, tr_bgc_DMS_out, tr_bgc_Fe_out, tr_bgc_hum_out, & @@ -2806,6 +2890,7 @@ icepack_query_tracer_flags tr_pond_out , & ! if .true., use melt pond tracer tr_pond_lvl_out , & ! if .true., use level-ice pond tracer tr_pond_topo_out , & ! if .true., use explicit topography-based ponds + tr_pond_sealvl_out,& ! if .true., use sealvl pond parameterization tr_snow_out , & ! if .true., use snow redistribution or metamorphosis tracers tr_fsd_out , & ! if .true., use floe size distribution tr_iso_out , & ! if .true., use isotope tracers diff --git a/doc/source/user_guide/ug_implementation.rst b/doc/source/user_guide/ug_implementation.rst index 38897797d..bce940957 100755 --- a/doc/source/user_guide/ug_implementation.rst +++ b/doc/source/user_guide/ug_implementation.rst @@ -267,6 +267,9 @@ is done by setting ``ICE_IOTYPE`` to ``netcdf`` in **icepack.settings** or using ``icepack.setup -s`` option ``ionetcdf``. If netCDF is used on a particular machine, the machine env and Macros file must support compilation with netCDF. +Note that some of the ponds history fields are not yet implemented for the topo +ponds option. + .. _bgc-hist: Biogeochemistry History Fields From b91f1dd73d6c8475e6d94611f592b8036623bf78 Mon Sep 17 00:00:00 2001 From: Tony Craig Date: Fri, 18 Jul 2025 11:17:02 -0700 Subject: [PATCH 18/34] Add David Clemens-Sewall and Bin Zhao to zenodo (#531) --- .zenodo.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.zenodo.json b/.zenodo.json index b5ce8eaf1..fcad1b6c0 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -31,6 +31,10 @@ "affiliation": "Environment and Climate Change Canada", "name": "Philippe Blain" }, + { + "affiliation": "National Center for Atmospheric Research", + "name": "David Clemens-Sewall" + }, { "affiliation": "National Oceanic and Atmospheric Administration", "name": "Anthony Craig" @@ -95,6 +99,10 @@ "affiliation": "Geophysical Fluid Dynamics Laboratory", "name": "Michael Winton" } + { + "affiliation": "National Aeronautics and Space Administration", + "name": "Bin Zhao" + }, ], "access_right": "open", "repository_url": "https://github.com/CICE-Consortium/Icepack", From 842a15e41cfa73ef546d37ef0e4dad3305a8f7f0 Mon Sep 17 00:00:00 2001 From: Tony Craig Date: Fri, 25 Jul 2025 09:26:22 -0700 Subject: [PATCH 19/34] Fix nag compiler error about kind=8 declaration, change to kind=dbl_kind (#532) The nag error was introduced when the MOSAiC forcing was added to Icepack. It's in the Icepack driver so did not impact CICE testing. Some new variables were declared (kind=8) which isn't part of the Fortran standard even though most compilers allow it, but the nag compiler generated an error. The (kind=8) declarations were changed to (kind=dbl_kind). This should have been addressed sooner, but it should not impact solutions or results for compilers that allow it. --- configuration/driver/icedrv_forcing.F90 | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/configuration/driver/icedrv_forcing.F90 b/configuration/driver/icedrv_forcing.F90 index 41ec9eefa..2d773069e 100644 --- a/configuration/driver/icedrv_forcing.F90 +++ b/configuration/driver/icedrv_forcing.F90 @@ -1054,10 +1054,10 @@ subroutine atm_MDF status, & ! NetCDF status flag varid ! NetCDF variable id - integer (kind=8), allocatable :: & + integer (kind=dbl_kind), allocatable :: & data_time(:) ! array for time array in forcing data - integer (kind=8), dimension(ntime) :: & + integer (kind=dbl_kind), dimension(ntime) :: & model_time ! array for Icepack minutely time real (kind=dbl_kind) :: & @@ -1102,7 +1102,7 @@ subroutine atm_MDF ! May have strange behavior if dt is not an integer model_time0 = (year_init - 1970) * Gregorian_year * 24 * 3600 + time0 do nt = 1, ntime - model_time(nt) = int(model_time0 + dt * nt, kind=8) + model_time(nt) = int(model_time0 + dt * nt, kind=dbl_kind) enddo ! Read, average, and interpolate forcing data from each variable @@ -1290,7 +1290,7 @@ subroutine load_var_MDF(data_var_name, model_var_arr, ncid, & integer (kind=int_kind), intent(in) :: & ncid ! NetCDF file id - integer (kind=8), dimension(ntime), intent(in) :: & + integer (kind=dbl_kind), dimension(ntime), intent(in) :: & model_time ! model time array ! Local variables @@ -1305,7 +1305,7 @@ subroutine load_var_MDF(data_var_name, model_var_arr, ncid, & nvardims,& ! number of dimensions for variable varid ! NetCDF variable id - integer (kind=8), allocatable :: & + integer (kind=dbl_kind), allocatable :: & data_time(:) ! array for time array in forcing data integer, dimension(1) :: & @@ -1554,10 +1554,10 @@ subroutine ocn_MDF status, & ! NetCDF status flag varid ! NetCDF variable id - integer (kind=8), allocatable :: & + integer (kind=dbl_kind), allocatable :: & data_time(:) ! array for time array in forcing data - integer (kind=8), dimension(ntime) :: & + integer (kind=dbl_kind), dimension(ntime) :: & model_time ! array for Icepack minutely time real (kind=dbl_kind) :: & @@ -1604,7 +1604,7 @@ subroutine ocn_MDF ! May have strange behavior if dt is not an integer model_time0 = (year_init - 1970) * Gregorian_year * 24 * 3600 + time0 do nt = 1, ntime - model_time(nt) = int(model_time0 + dt * nt, kind=8) + model_time(nt) = int(model_time0 + dt * nt, kind=dbl_kind) enddo ! Warn if simulation includes leg 4-5 transition From 6bc2d0afcfb480e20aec43eab9cd9f80064decb3 Mon Sep 17 00:00:00 2001 From: Tony Craig Date: Fri, 25 Jul 2025 09:26:40 -0700 Subject: [PATCH 20/34] Fix commas in zenodo template (#533) This error was introduced during some recent zenodo changes. It was caught when the model was released and zenodo failed to import the latest release due to metadata errors. We will try to also implement some tools to pre-release test the zenodo template. --- .zenodo.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.zenodo.json b/.zenodo.json index fcad1b6c0..98eb5b1f2 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -98,11 +98,11 @@ { "affiliation": "Geophysical Fluid Dynamics Laboratory", "name": "Michael Winton" - } + }, { "affiliation": "National Aeronautics and Space Administration", "name": "Bin Zhao" - }, + } ], "access_right": "open", "repository_url": "https://github.com/CICE-Consortium/Icepack", From b7c4dc58a613f9930fa8f4f2bfa9762ffab50d00 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Mon, 28 Jul 2025 10:27:17 -0600 Subject: [PATCH 21/34] json updates (#534) A few updates to improve automation of the zenodo metadata. Changed license from generic open to BSD-3-Clause. We have the BSD 3-Clause "New" or "Revised" License. Added the Triad copyright statement. List keywords separately to improve searchability. Changed publication date for consistency with the v1.5.1 release, to avoid potential confusion. --- .zenodo.json | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.zenodo.json b/.zenodo.json index 98eb5b1f2..18af5092d 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -1,10 +1,12 @@ { - "license": "other-open", + "license": "BSD-3-Clause", + "copyright": "Copyright (c) 1998, 2017 Triad National Security, LLC", "description": "View detailed release notes at https://github.com/CICE-Consortium/Icepack/releases", "language": "eng", "title": "CICE-Consortium/Icepack: Icepack 1.5.1", "keywords": [ - "sea ice model, Icepack" + "sea ice model", + "Icepack" ], "version": "1.5.1", "upload_type": "software", @@ -13,7 +15,7 @@ "identifier": "cice-consortium" } ], - "publication_date": "2025-05-21", + "publication_date": "2025-07-21", "creators": [ { "affiliation": "Los Alamos National Laboratory", From 6a5c51e9e6c643da0760a315e452755661d7d745 Mon Sep 17 00:00:00 2001 From: Nicholas Szapiro <149816583+NickSzapiro-NOAA@users.noreply.github.com> Date: Fri, 1 Aug 2025 16:16:46 -0400 Subject: [PATCH 22/34] Add vicen, vsnon to zap_small_areas (#536) Floating point math (e.g., in ridge_shift) may lead to tiny vicen increments without area that are not currently zapped. This zaps them too (+ similar logic for tiny vsnon). Closes #535 --- columnphysics/icepack_itd.F90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/columnphysics/icepack_itd.F90 b/columnphysics/icepack_itd.F90 index b1dd015df..312dfb576 100644 --- a/columnphysics/icepack_itd.F90 +++ b/columnphysics/icepack_itd.F90 @@ -1097,8 +1097,8 @@ subroutine zap_small_areas (dt, & call icepack_warnings_setabort(.true.,__FILE__,__LINE__) call icepack_warnings_add(subname//' Zap ice: negative ice area') return - elseif (abs(aicen(n)) /= c0 .and. & - abs(aicen(n)) <= puny) then + elseif (abs(aicen(n)) <= puny .and. & + (abs(aicen(n)) /= c0 .or. abs(vicen(n)) /= c0 .or. abs(vsnon(n)) /= c0)) then !----------------------------------------------------------------- ! Account for tracers important for conservation From f9789c2f325993c0af28849c9dfdd1af92699ae0 Mon Sep 17 00:00:00 2001 From: Tony Craig Date: Mon, 18 Aug 2025 10:47:48 -0700 Subject: [PATCH 23/34] Update Copyright (#537) Update Version number in preparation for minor release --- .zenodo.json | 6 +++--- COPYRIGHT.pdf | Bin 53225 -> 20755 bytes columnphysics/icepack_intfc.F90 | 2 +- columnphysics/version.txt | 2 +- configuration/driver/icedrv_MAIN.F90 | 2 +- doc/source/conf.py | 6 +++--- doc/source/intro/copyright.rst | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.zenodo.json b/.zenodo.json index 18af5092d..991b2c14f 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -3,19 +3,19 @@ "copyright": "Copyright (c) 1998, 2017 Triad National Security, LLC", "description": "View detailed release notes at https://github.com/CICE-Consortium/Icepack/releases", "language": "eng", - "title": "CICE-Consortium/Icepack: Icepack 1.5.1", + "title": "CICE-Consortium/Icepack: Icepack 1.5.2", "keywords": [ "sea ice model", "Icepack" ], - "version": "1.5.1", + "version": "1.5.2", "upload_type": "software", "communities": [ { "identifier": "cice-consortium" } ], - "publication_date": "2025-07-21", + "publication_date": "2025-08-15", "creators": [ { "affiliation": "Los Alamos National Laboratory", diff --git a/COPYRIGHT.pdf b/COPYRIGHT.pdf index 55132ca5e9ade12f27491a5fb238239bc75b5fc3..2f37e495f02302a72c6b7943cf05b5ecfe3dfb19 100644 GIT binary patch literal 20755 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 literal 53225 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 Date: Mon, 18 Aug 2025 17:09:48 -0700 Subject: [PATCH 24/34] Update Copyright in zenodo json file (#538) Missed a Copyright update in the last PR Update Copyright in zenodo json file --- .zenodo.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.zenodo.json b/.zenodo.json index 991b2c14f..11f6453e4 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -1,6 +1,6 @@ { "license": "BSD-3-Clause", - "copyright": "Copyright (c) 1998, 2017 Triad National Security, LLC", + "copyright": "Copyright 1998-2025 Triad National Security, LLC", "description": "View detailed release notes at https://github.com/CICE-Consortium/Icepack/releases", "language": "eng", "title": "CICE-Consortium/Icepack: Icepack 1.5.2", From 3c2eeb55149c38851f5f28769e7fa6f42e865b22 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Wed, 3 Sep 2025 13:22:27 -0600 Subject: [PATCH 25/34] Remove unused _init variables (#539) Removing a few unused variables (aice_init, vice_init). Installed conda on a new laptop and discovered that the hardware platform is no longer x86_64, which slightly changes the miniconda porting instructions. --- columnphysics/icepack_algae.F90 | 3 +-- columnphysics/icepack_itd.F90 | 2 -- columnphysics/icepack_zbgc_shared.F90 | 6 ++---- doc/source/user_guide/ug_running.rst | 6 +++++- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/columnphysics/icepack_algae.F90 b/columnphysics/icepack_algae.F90 index 7239edd15..a39b4a647 100644 --- a/columnphysics/icepack_algae.F90 +++ b/columnphysics/icepack_algae.F90 @@ -394,8 +394,7 @@ subroutine zbio (dt, & bio_index, & aicen, & vicen, vsnon, & - iphin, &! ntrcr - trcrn, aice_old, &!aice_old + iphin, trcrn, & flux_bion, flux_bio, & upNOn, upNHn, & upNO, upNH, & diff --git a/columnphysics/icepack_itd.F90 b/columnphysics/icepack_itd.F90 index 312dfb576..518d26abe 100644 --- a/columnphysics/icepack_itd.F90 +++ b/columnphysics/icepack_itd.F90 @@ -434,7 +434,6 @@ subroutine shift_ice (trcr_depend, & worka, workb real (kind=dbl_kind), dimension(ncat) :: aicen_init - real (kind=dbl_kind), dimension(ncat) :: vicen_init real (kind=dbl_kind), dimension(ncat) :: vsnon_init character(len=*),parameter :: subname='(shift_ice)' @@ -444,7 +443,6 @@ subroutine shift_ice (trcr_depend, & !----------------------------------------------------------------- aicen_init(:) = aicen(:) - vicen_init(:) = vicen(:) vsnon_init(:) = vsnon(:) !----------------------------------------------------------------- diff --git a/columnphysics/icepack_zbgc_shared.F90 b/columnphysics/icepack_zbgc_shared.F90 index 08c6753d5..b7d3ec6e7 100644 --- a/columnphysics/icepack_zbgc_shared.F90 +++ b/columnphysics/icepack_zbgc_shared.F90 @@ -588,8 +588,7 @@ subroutine merge_bgc_fluxes (dt, & bio_index, & aicen, & vicen, vsnon, & - iphin, & - trcrn, aice_init, & + iphin, trcrn, & flux_bion, flux_bio, & upNOn, upNHn, & upNO, upNH, & @@ -618,8 +617,7 @@ subroutine merge_bgc_fluxes (dt, & real (kind=dbl_kind), intent(in):: & aicen , & ! concentration of ice vicen , & ! volume of ice (m) - vsnon , & ! volume of snow(m) - aice_init ! initial concentration of ice + vsnon ! volume of snow(m) ! single category rates real (kind=dbl_kind), dimension(:), intent(in):: & diff --git a/doc/source/user_guide/ug_running.rst b/doc/source/user_guide/ug_running.rst index ad86df1f7..1cc5f100c 100755 --- a/doc/source/user_guide/ug_running.rst +++ b/doc/source/user_guide/ug_running.rst @@ -390,8 +390,12 @@ On macOS: .. code-block:: bash - # Download the Miniconda installer to ~/Downloads/miniconda.sh + # Check hardware platform (x86_64 or arm64) + uname -m + # Download the compatible Miniconda installer to ~/Downloads/miniconda.sh curl -L https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh -o ~/Downloads/miniconda.sh + # or + curl -L https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-arm64.sh -o ~/Downloads/miniconda.sh # Install Miniconda bash ~/Downloads/miniconda.sh From 7ee2266089f80effb5fee8335c4a1056d7da11e7 Mon Sep 17 00:00:00 2001 From: Tony Craig Date: Wed, 10 Sep 2025 08:53:31 -0700 Subject: [PATCH 26/34] Update the qstat job completion checks to use (#541) set qstatus = `${ICE_MACHINE_QSTAT} $job | grep $job | wc -l` Some recent changes made the return status of "${ICE_MACHINE_QSTAT} $job" no longer robust as a way to check if a job was in the queue or not. --- configuration/scripts/tests/poll_queue.csh | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/configuration/scripts/tests/poll_queue.csh b/configuration/scripts/tests/poll_queue.csh index 0272a1aa9..39c53efd9 100755 --- a/configuration/scripts/tests/poll_queue.csh +++ b/configuration/scripts/tests/poll_queue.csh @@ -13,10 +13,9 @@ foreach line ("`cat suite.jobs`") set qstatjob = 1 if (${job} =~ [0-9]*) then while ($qstatjob) - ${ICE_MACHINE_QSTAT} $job >&/dev/null - set qstatus = $status -# echo $job $qstatus - if ($qstatus != 0) then + set qstatus = `${ICE_MACHINE_QSTAT} $job | grep $job | wc -l` +# echo $job $qstatus + if ($qstatus == 0) then echo "Job $job completed" set qstatjob = 0 else From 4954a6f9033f78e5c32bf33780384cbf2d0843e6 Mon Sep 17 00:00:00 2001 From: "David A. Bailey" Date: Mon, 3 Nov 2025 14:01:45 -0700 Subject: [PATCH 27/34] Fix Tsnice calculation (#542) Bug fix for the snow-ice interface temperature history variable (diagnostic only, does not affect the physics calculation). This code uses a straight line to interpolate between the bottom snow layer and top ice layer temperatures when snow is present, otherwise it is the surface temperature. --- columnphysics/icepack_therm_vertical.F90 | 7 +++---- configuration/driver/icedrv_flux.F90 | 1 + 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/columnphysics/icepack_therm_vertical.F90 b/columnphysics/icepack_therm_vertical.F90 index 1b0fa027c..53f082f63 100644 --- a/columnphysics/icepack_therm_vertical.F90 +++ b/columnphysics/icepack_therm_vertical.F90 @@ -375,12 +375,11 @@ subroutine thermo_vertical (dt, aicen, & einter = einter + hilyr * zqin(k) enddo ! k - Tsnice = c0 - if ((hslyr+hilyr) > puny) then + if (hilyr > puny) then if (hslyr > puny) then - Tsnice = (hslyr*zTsn(nslyr) + hilyr*zTin(1)) / (hslyr+hilyr) + Tsnice = Tsnice + aicen*((hilyr*zTsn(nslyr) + hslyr*zTin(1)) / (hslyr+hilyr)) else - Tsnice = Tsf + Tsnice = Tsnice + aicen*Tsf endif endif diff --git a/configuration/driver/icedrv_flux.F90 b/configuration/driver/icedrv_flux.F90 index bde389724..b05092869 100644 --- a/configuration/driver/icedrv_flux.F90 +++ b/configuration/driver/icedrv_flux.F90 @@ -688,6 +688,7 @@ subroutine init_history_therm congel (:) = c0 frazil (:) = c0 snoice (:) = c0 + Tsnice (:) = c0 dsnow (:) = c0 meltt (:) = c0 melts (:) = c0 From eedb519247f48bce9fa1d1b275b5cc3dc07643e4 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Fri, 21 Nov 2025 12:31:16 -0700 Subject: [PATCH 28/34] Zap residual ice (#543) This PR addresses the long-standing residual ice problem in CICE by zapping grid-cell volumes with area or mass less than the new namelist parameters min_area and min_mass. To work properly, these parameters should likely be set to the same values as the dynamics area and mass minimum values dyn_area_min and dyn_area_mass. Since those parameters in CICE are quite large (and everyone should decrease them), the default values in Icepack are currently set to 1.e-11 and 1.e-10, respectively, maintaining the area/mass=0.1 relationship of the dynamics parameters. The driver (e.g. CICE) should initialize them as needed via an icepack_init_parameters call. --- columnphysics/icepack_flux.F90 | 3 +- columnphysics/icepack_itd.F90 | 25 ++++++++- columnphysics/icepack_parameters.F90 | 64 +++++++++++++--------- configuration/driver/icedrv_init.F90 | 13 +++-- configuration/scripts/icepack_in | 2 + doc/source/icepack_index.rst | 2 + doc/source/science_guide/sg_thermo.rst | 24 +++++--- doc/source/user_guide/lg_overview.rst | 7 ++- doc/source/user_guide/ug_case_settings.rst | 2 + 9 files changed, 96 insertions(+), 46 deletions(-) diff --git a/columnphysics/icepack_flux.F90 b/columnphysics/icepack_flux.F90 index 4b0888b0f..fa8805453 100644 --- a/columnphysics/icepack_flux.F90 +++ b/columnphysics/icepack_flux.F90 @@ -75,10 +75,11 @@ subroutine merge_fluxes (aicen, & dpnd_initial, dpnd_initialn, & dpnd_dlid, dpnd_dlidn) - ! single category fluxes + ! concentration is aicen_init in call to subroutine real (kind=dbl_kind), intent(in) :: & aicen ! concentration of ice + ! single category fluxes real (kind=dbl_kind), optional, intent(in) :: & flw , & ! downward longwave flux (W/m**2) strairxn, & ! air/ice zonal strss, (N/m**2) diff --git a/columnphysics/icepack_itd.F90 b/columnphysics/icepack_itd.F90 index 518d26abe..8802a943b 100644 --- a/columnphysics/icepack_itd.F90 +++ b/columnphysics/icepack_itd.F90 @@ -35,7 +35,7 @@ module icepack_itd use icepack_tracers, only: tr_pond, tr_pond_lvl, nt_alvl use icepack_tracers, only: n_iso, tr_iso, nt_smice, nt_rsnw, nt_rhos, nt_sice use icepack_tracers, only: icepack_compute_tracers - use icepack_parameters, only: skl_bgc, z_tracers, hi_min + use icepack_parameters, only: skl_bgc, z_tracers, hi_min, itd_area_min, itd_mass_min use icepack_parameters, only: kcatbound, kitd, saltflux_option, snwgrain, snwredist use icepack_therm_shared, only: Tmin use icepack_warnings, only: warnstr, icepack_warnings_add @@ -1074,6 +1074,10 @@ subroutine zap_small_areas (dt, & n, k, it, & !counting indices blevels + logical (kind=log_kind) :: & + zap_residual, & + zap_category(ncat) + real (kind=dbl_kind) :: xtmp, sicen ! temporary variables real (kind=dbl_kind) :: dvssl, dvint ! temporary variables real (kind=dbl_kind) , dimension (1):: trcr_skl @@ -1081,6 +1085,22 @@ subroutine zap_small_areas (dt, & character(len=*),parameter :: subname='(zap_small_areas)' + !----------------------------------------------------------------- + ! Flag categories with very small areas and residual ice + !----------------------------------------------------------------- + + zap_category(:) = .false. + do n = 1, ncat + if ( abs(aicen(n)) <= puny .and. & + (abs(aicen(n)) /= c0 .or. abs(vicen(n)) /= c0 .or. abs(vsnon(n)) /= c0)) then + zap_category(n) = .true. + endif + enddo + + zap_residual = .false. + if (aice < max(itd_area_min, puny) .or. & + aice*rhoi < max(itd_mass_min, puny)) zap_residual = .true. ! all categories + !----------------------------------------------------------------- ! I. Zap categories with very small areas. !----------------------------------------------------------------- @@ -1095,8 +1115,7 @@ subroutine zap_small_areas (dt, & call icepack_warnings_setabort(.true.,__FILE__,__LINE__) call icepack_warnings_add(subname//' Zap ice: negative ice area') return - elseif (abs(aicen(n)) <= puny .and. & - (abs(aicen(n)) /= c0 .or. abs(vicen(n)) /= c0 .or. abs(vsnon(n)) /= c0)) then + elseif (zap_category(n) .or. zap_residual) then !----------------------------------------------------------------- ! Account for tracers important for conservation diff --git a/columnphysics/icepack_parameters.F90 b/columnphysics/icepack_parameters.F90 index ea836b958..16be85709 100644 --- a/columnphysics/icepack_parameters.F90 +++ b/columnphysics/icepack_parameters.F90 @@ -254,17 +254,19 @@ module icepack_parameters ! 1 for exponential redistribution function real (kind=dbl_kind), public :: & - Cf = 17._dbl_kind ,&! ratio of ridging work to PE change in ridging - Pstar = 2.75e4_dbl_kind ,&! constant in Hibler strength formula - ! (kstrength = 0) - Cstar = 20._dbl_kind ,&! constant in Hibler strength formula - ! (kstrength = 0) - dragio = 0.00536_dbl_kind ,&! ice-ocn drag coefficient + itd_area_min = 1.e-11_dbl_kind ,&! zap residual ice below a minimum area + itd_mass_min = 1.e-10_dbl_kind ,&! zap residual ice below a minimum mass + Cf = 17._dbl_kind ,&! ratio of ridging work to PE change in ridging + Pstar = 2.75e4_dbl_kind ,&! constant in Hibler strength formula + ! (kstrength = 0) + Cstar = 20._dbl_kind ,&! constant in Hibler strength formula + ! (kstrength = 0) + dragio = 0.00536_dbl_kind ,&! ice-ocn drag coefficient thickness_ocn_layer1 = 2.0_dbl_kind,&! thickness of first ocean level (m) - iceruf_ocn = 0.03_dbl_kind ,&! under-ice roughness (m) - gravit = 9.80616_dbl_kind ,&! gravitational acceleration (m/s^2) - mu_rdg = 3.0_dbl_kind ! e-folding scale of ridged ice, krdg_partic=1 (m^0.5) - ! (krdg_redist = 1) + iceruf_ocn = 0.03_dbl_kind ,&! under-ice roughness (m) + gravit = 9.80616_dbl_kind ,&! gravitational acceleration (m/s^2) + mu_rdg = 3.0_dbl_kind ! e-folding scale of ridged ice, krdg_partic=1 (m^0.5) + ! (krdg_redist = 1) logical (kind=log_kind), public :: & calc_dragio = .false. ! if true, calculate dragio from iceruf_ocn and thickness_ocn_layer1 @@ -571,7 +573,7 @@ subroutine icepack_init_parameters( & stefan_boltzmann_in, ice_ref_salinity_in, & Tffresh_in, Lsub_in, Lvap_in, Timelt_in, Tsmelt_in, & iceruf_in, Cf_in, Pstar_in, Cstar_in, kappav_in, & - kice_in, ksno_in, & + kice_in, ksno_in, itd_area_min_in, itd_mass_min_in, & zref_in, hs_min_in, snowpatch_in, rhosi_in, sk_l_in, & saltmax_in, phi_init_in, min_salin_in, Tliquidus_max_in, & min_bgc_in, dSin0_frazil_in, hi_ssl_in, hs_ssl_in, hs_ssl_min_in, & @@ -801,14 +803,16 @@ subroutine icepack_init_parameters( & !----------------------------------------------------------------------- real(kind=dbl_kind), intent(in), optional :: & - Cf_in, & ! ratio of ridging work to PE change in ridging - Pstar_in, & ! constant in Hibler strength formula - Cstar_in, & ! constant in Hibler strength formula - dragio_in, & ! ice-ocn drag coefficient + itd_area_min_in, & ! zap residual ice below this minimum area + itd_mass_min_in, & ! zap residual ice below this minimum mass + Cf_in, & ! ratio of ridging work to PE change in ridging + Pstar_in, & ! constant in Hibler strength formula + Cstar_in, & ! constant in Hibler strength formula + dragio_in, & ! ice-ocn drag coefficient thickness_ocn_layer1_in, & ! thickness of first ocean level (m) - iceruf_ocn_in, & ! under-ice roughness (m) - gravit_in, & ! gravitational acceleration (m/s^2) - iceruf_in ! ice surface roughness (m) + iceruf_ocn_in, & ! under-ice roughness (m) + gravit_in, & ! gravitational acceleration (m/s^2) + iceruf_in ! ice surface roughness (m) integer (kind=int_kind), intent(in), optional :: & ! defined in namelist kstrength_in , & ! 0 for simple Hibler (1979) formulation @@ -1152,6 +1156,8 @@ subroutine icepack_init_parameters( & if (present(Tsmelt_in) ) Tsmelt = Tsmelt_in if (present(ice_ref_salinity_in) ) ice_ref_salinity = ice_ref_salinity_in if (present(iceruf_in) ) iceruf = iceruf_in + if (present(itd_area_min_in) ) itd_area_min = itd_area_min_in + if (present(itd_mass_min_in) ) itd_mass_min = itd_mass_min_in if (present(Cf_in) ) Cf = Cf_in if (present(Pstar_in) ) Pstar = Pstar_in if (present(Cstar_in) ) Cstar = Cstar_in @@ -1580,7 +1586,7 @@ subroutine icepack_query_parameters( & stefan_boltzmann_out, ice_ref_salinity_out, & Tffresh_out, Lsub_out, Lvap_out, Timelt_out, Tsmelt_out, & iceruf_out, Cf_out, Pstar_out, Cstar_out, kappav_out, & - kice_out, ksno_out, & + kice_out, ksno_out, itd_area_min_out, itd_mass_min_out, & zref_out, hs_min_out, snowpatch_out, rhosi_out, sk_l_out, & saltmax_out, phi_init_out, min_salin_out, Tliquidus_max_out, & min_bgc_out, dSin0_frazil_out, hi_ssl_out, hs_ssl_out, hs_ssl_min_out, & @@ -1819,14 +1825,16 @@ subroutine icepack_query_parameters( & !----------------------------------------------------------------------- real(kind=dbl_kind), intent(out), optional :: & - Cf_out, & ! ratio of ridging work to PE change in ridging - Pstar_out, & ! constant in Hibler strength formula - Cstar_out, & ! constant in Hibler strength formula - dragio_out, & ! ice-ocn drag coefficient + itd_area_min_out, & ! zap residual ice below this minimum area + itd_mass_min_out, & ! zap residual ice below this minimum mass + Cf_out, & ! ratio of ridging work to PE change in ridging + Pstar_out, & ! constant in Hibler strength formula + Cstar_out, & ! constant in Hibler strength formula + dragio_out, & ! ice-ocn drag coefficient thickness_ocn_layer1_out, & ! thickness of first ocean level (m) - iceruf_ocn_out, & ! under-ice roughness (m) - gravit_out, & ! gravitational acceleration (m/s^2) - iceruf_out ! ice surface roughness (m) + iceruf_ocn_out, & ! under-ice roughness (m) + gravit_out, & ! gravitational acceleration (m/s^2) + iceruf_out ! ice surface roughness (m) integer (kind=int_kind), intent(out), optional :: & ! defined in namelist kstrength_out , & ! 0 for simple Hibler (1979) formulation @@ -2203,6 +2211,8 @@ subroutine icepack_query_parameters( & if (present(ice_ref_salinity_out) ) ice_ref_salinity_out = ice_ref_salinity if (present(iceruf_out) ) iceruf_out = iceruf if (present(Cf_out) ) Cf_out = Cf + if (present(itd_area_min_out) ) itd_area_min_out = itd_area_min + if (present(itd_mass_min_out) ) itd_mass_min_out = itd_mass_min if (present(Pstar_out) ) Pstar_out = Pstar if (present(Cstar_out) ) Cstar_out = Cstar if (present(kappav_out) ) kappav_out = kappav @@ -2502,6 +2512,8 @@ subroutine icepack_write_parameters(iounit) write(iounit,*) " Tsmelt = ",Tsmelt write(iounit,*) " ice_ref_salinity = ",ice_ref_salinity write(iounit,*) " iceruf = ",iceruf + write(iounit,*) " itd_area_min = ",itd_area_min + write(iounit,*) " itd_mass_min = ",itd_mass_min write(iounit,*) " Cf = ",Cf write(iounit,*) " Pstar = ",Pstar write(iounit,*) " Cstar = ",Cstar diff --git a/configuration/driver/icedrv_init.F90 b/configuration/driver/icedrv_init.F90 index 69f4d7905..6b708b9c2 100644 --- a/configuration/driver/icedrv_init.F90 +++ b/configuration/driver/icedrv_init.F90 @@ -99,7 +99,7 @@ subroutine input_data real (kind=dbl_kind) :: ustar_min, albicev, albicei, albsnowv, albsnowi, & ahmax, R_ice, R_pnd, R_snw, dT_mlt, rsnw_mlt, ksno, hi_min, Tliquidus_max, & mu_rdg, hs0, dpscale, rfracmin, rfracmax, pndaspect, hs1, hp1, & - apnd_sl, tscale_pnd_drain, & + apnd_sl, tscale_pnd_drain, itd_area_min, itd_mass_min, & a_rapid_mode, Rac_rapid_mode, aspect_rapid_mode, dSdt_slow_mode, & phi_c_slow_mode, phi_i_mushy, kalg, emissivity, floediam, hfrazilmin, & rsnw_fall, rsnw_tmax, rhosnew, rhosmin, rhosmax, & @@ -150,7 +150,7 @@ subroutine input_data dumpfreq, diagfreq, diag_file, cpl_bgc, & conserv_check, history_format, & hi_init_slab, hsno_init_slab, hbar_init_itd, hsno_init_itd, & - sst_init + sst_init, itd_area_min, itd_mass_min namelist /grid_nml/ & kcatbound @@ -177,6 +177,7 @@ subroutine input_data hs0, dpscale, frzpnd, & rfracmin, rfracmax, pndaspect, hs1, & hp1, apnd_sl + namelist /snow_nml/ & snwredist, snwgrain, rsnw_fall, rsnw_tmax, & rhosnew, rhosmin, rhosmax, snwlvlfac, & @@ -257,7 +258,8 @@ subroutine input_data rhosnew_out=rhosnew, rhosmin_out = rhosmin, rhosmax_out=rhosmax, & windmin_out=windmin, drhosdwind_out=drhosdwind, snwlvlfac_out=snwlvlfac, & snw_aging_table_out=snw_aging_table, snw_growth_wet_out=snw_growth_wet, & - drsnw_min_out=drsnw_min, snwliq_max_out=snwliq_max) + drsnw_min_out=drsnw_min, snwliq_max_out=snwliq_max, & + itd_area_min_out=itd_area_min, itd_mass_min_out=itd_mass_min) call icepack_warnings_flush(nu_diag) if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, & @@ -710,6 +712,8 @@ subroutine input_data write(nu_diag,1005) ' hsno_init_itd = ', hsno_init_itd write(nu_diag,1005) ' sst_init = ', sst_init write(nu_diag,1010) ' conserv_check = ', conserv_check + write(nu_diag,1000) ' itd_area_min = ', itd_area_min + write(nu_diag,1000) ' itd_mass_min = ', itd_mass_min write(nu_diag,1020) ' kitd = ', kitd write(nu_diag,1020) ' kcatbound = ', kcatbound write(nu_diag,1020) ' ndtd = ', ndtd @@ -1045,7 +1049,8 @@ subroutine input_data rhosnew_in=rhosnew, rhosmin_in=rhosmin, rhosmax_in=rhosmax, & windmin_in=windmin, drhosdwind_in=drhosdwind, snwlvlfac_in=snwlvlfac, & snw_growth_wet_in=snw_growth_wet, drsnw_min_in=drsnw_min, & - snwliq_max_in=snwliq_max) + snwliq_max_in=snwliq_max, itd_area_min_in=itd_area_min, & + itd_mass_min_in=itd_mass_min) call icepack_init_tracer_sizes(ntrcr_in=ntrcr, & ncat_in=ncat, nilyr_in=nilyr, nslyr_in=nslyr, nblyr_in=nblyr, & nfsd_in=nfsd, n_iso_in=n_iso, n_aero_in=n_aero) diff --git a/configuration/scripts/icepack_in b/configuration/scripts/icepack_in index dd1acff41..3b2f0c7fd 100644 --- a/configuration/scripts/icepack_in +++ b/configuration/scripts/icepack_in @@ -22,6 +22,8 @@ history_format = 'none' cpl_bgc = .false. conserv_check = .false. + itd_area_min = 1.e-11 + itd_mass_min = 1.e-10 / &grid_nml diff --git a/doc/source/icepack_index.rst b/doc/source/icepack_index.rst index 6ebbeca0d..6a46aeb9b 100755 --- a/doc/source/icepack_index.rst +++ b/doc/source/icepack_index.rst @@ -253,6 +253,8 @@ section :ref:`tabnamelist`. "istep0", ":math:`\bullet` number of steps taken in previous run", "0" "istep1", "total number of steps at current time step", "" "Iswabs", "shortwave radiation absorbed in ice layers", "W/m\ :math:`^2`" + "itd_area_min", ":math:`\bullet` zap residual ice below a minimum area", "1.e-11" + "itd_mass_min", ":math:`\bullet` zap residual ice below a minimum mass", "1.e-10 "**J**", "", "" "**K**", "", "" "kalg", ":math:`\bullet` absorption coefficient for algae", "" diff --git a/doc/source/science_guide/sg_thermo.rst b/doc/source/science_guide/sg_thermo.rst index 2acc7bf0c..874b0653e 100755 --- a/doc/source/science_guide/sg_thermo.rst +++ b/doc/source/science_guide/sg_thermo.rst @@ -1966,6 +1966,16 @@ as the product of sensitivity studies to balance the climatological tendencies o wave fracture and welding. So that results do not vary as the number or range of floe size categories varies, we fix this scaling coefficient, c_weld. +If ``tr_fsd=false``, lateral melting is accomplished by multiplying the state variables by +:math:`1-r_{side}`, where :math:`r_{side}` is the fraction of ice melted +laterally :cite:`Maykut87,Steele92`, and adjusting the ice +energy and fluxes as appropriate. We assume a floe diameter of 300 m. + +If ``tr_fsd=true``, lateral melting is accomplished using the :cite:`Maykut87` +lateral heat flux, but applied to the ice using the prognostic floe size distribution +as described in :cite:`Horvat15` and :cite:`Roach18`. Lateral melt modifies +the ITD and the FSD. + If the latent heat flux is negative (i.e., latent heat is transferred from the ice to the atmosphere), snow or snow-free ice sublimates at the top surface. If the latent heat flux is positive, vapor from the @@ -2004,15 +2014,11 @@ old and new layers, respectively. The enthalpies of the new layers are .. math:: q_k = \frac{1}{\Delta h_i} \sum_{m=1}^{N_i} \eta_{km} q_m. -If ``tr_fsd=false``, lateral melting is accomplished by multiplying the state variables by -:math:`1-r_{side}`, where :math:`r_{side}` is the fraction of ice melted -laterally :cite:`Maykut87,Steele92`, and adjusting the ice -energy and fluxes as appropriate. We assume a floe diameter of 300 m. - -If ``tr_fsd=true``, lateral melting is accomplished using the :cite:`Maykut87` -lateral heat flux, but applied to the ice using the prognostic floe size distribution -as described in :cite:`Horvat15` and :cite:`Roach18`. Lateral melt modifies -the ITD and the FSD. +Residual amounts of ice may be conservatively removed following the thermodynamics +and ridging calculations based on minimum area and mass parameters ``itd_area_min`` and +``itd_mass_min``. Initializing these parameters to CICE's ``dyn_area_min`` and ``dyn_mass_min`` +namelist values ensures consistency between Icepack's thermodynamic and CICE's +dynamic calculations and avoids tiny amounts of residual ice in the solution. Snow-ice formation ------------------ diff --git a/doc/source/user_guide/lg_overview.rst b/doc/source/user_guide/lg_overview.rst index 0d3243619..0ad96e86c 100755 --- a/doc/source/user_guide/lg_overview.rst +++ b/doc/source/user_guide/lg_overview.rst @@ -12,9 +12,10 @@ Icepack includes options for simulating sea ice thermodynamics, mechanical redis tracers, including thickness, enthalpy, ice age, first-year ice area, deformed ice area and volume, melt ponds, and biogeochemistry. -Icepack is called on a grid point by grid point basis. All data is passed in and out of the model -via subroutine interfaces. Fortran "use" statements are not encouraged for accessing data inside -the Icepack model. +Icepack is called on a grid point by grid point basis. All data is passed in and out of the model +via subroutine interfaces. Fortran "use" statements are not encouraged for accessing data inside +the Icepack model from outside. Parameters may be queried and/or reset from Icepack's default +values by calling the query and init interfaces as described in :ref:`sequence_and_interface`. Icepack does not generally contain any parallelization or I/O. The driver of Icepack is expected to support diff --git a/doc/source/user_guide/ug_case_settings.rst b/doc/source/user_guide/ug_case_settings.rst index 9f3af587a..ae2f245b8 100644 --- a/doc/source/user_guide/ug_case_settings.rst +++ b/doc/source/user_guide/ug_case_settings.rst @@ -151,6 +151,8 @@ setup_nml "", "``none``", "no ice", "" "", "'path/file'", "restart file name", "" "``istep0``", "integer", "initial time step number", "0" + "``itd_area_min``", "real", "area below which ice is zapped", "1.e-11" + "``itd_mass_min``", "real", "mass below which ice is zapped", "1.e-10" "``ndtd``", "integer", "number of dynamics/advection/ridging/steps per thermo timestep", "1" "``npt``", "integer", "total number of time steps to take", "99999" "``restart``", "logical", "initialize using restart file", "``.false.``" From 0bcde255637a5947b1b7a4e4fc8dccd77803cb65 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Thu, 8 Jan 2026 17:07:27 -0700 Subject: [PATCH 29/34] external wave height option (#545) Add option for externally generated significant wave height A new namelist flag allows significant wave height to be passed into the ice model from a coupler. In addition, this PR moves wave_spec_height out of icepack interface argument lists, since it is initialized via icepack_init_parameters consolidates multiple wave-spectrum calculations of significant wave height, to reduce duplication of code, used when wave_height_type = 'internal'. This PR is the first step in resyncing the CICE Consortium and E3SM versions of Icepack. The Icepack interface is not fully backwards compatible, the optional dwavefreq argument has been removed from subroutine icepack_step_therm2. --------- Co-authored-by: njeffery Co-authored-by: Erin Thomas Co-authored-by: Darin Comeau --- columnphysics/icepack_fsd.F90 | 27 ++++----- columnphysics/icepack_parameters.F90 | 16 ++++-- columnphysics/icepack_therm_itd.F90 | 13 +---- columnphysics/icepack_wavefracspec.F90 | 32 ++++++----- configuration/driver/icedrv_init.F90 | 33 ++++++++--- configuration/driver/icedrv_step.F90 | 25 ++++----- configuration/scripts/icepack_in | 1 + configuration/scripts/options/set_nml.fsd1 | 1 + configuration/scripts/options/set_nml.fsd12 | 1 + doc/source/user_guide/interfaces.include | 61 +++++++++++---------- doc/source/user_guide/ug_case_settings.rst | 3 + 11 files changed, 120 insertions(+), 93 deletions(-) diff --git a/columnphysics/icepack_fsd.F90 b/columnphysics/icepack_fsd.F90 index 75086a024..9b0f2e1fb 100644 --- a/columnphysics/icepack_fsd.F90 +++ b/columnphysics/icepack_fsd.F90 @@ -620,7 +620,6 @@ subroutine fsd_add_new_ice (n, & wave_sig_ht, & wave_spectrum, & wavefreq, & - dwavefreq, & d_afsd_latg, & d_afsd_newi, & afsdn, aicen_init, & @@ -640,8 +639,7 @@ subroutine fsd_add_new_ice (n, & ! power spectral density of surface elevation, E(f) (units m^2 s) real(kind=dbl_kind), dimension(:), intent(in) :: & - wavefreq , & ! wave frequencies (s^-1) - dwavefreq ! wave frequency bin widths (s^-1) + wavefreq ! wave frequencies (s^-1) real (kind=dbl_kind), dimension(:), intent(in) :: & d_an_latg , & ! change in aicen due to lateral growth @@ -746,9 +744,8 @@ subroutine fsd_add_new_ice (n, & if (wave_spec) then if (wave_sig_ht > puny) then - call wave_dep_growth (wave_spectrum, & - wavefreq, dwavefreq, & - new_size) + call wave_dep_growth (wave_spectrum, wave_sig_ht, & + wavefreq, new_size) if (icepack_warnings_aborted(subname)) return end if @@ -774,9 +771,8 @@ subroutine fsd_add_new_ice (n, & if (wave_spec) then if (wave_sig_ht > puny) then - call wave_dep_growth (wave_spectrum, & - wavefreq, dwavefreq, & - new_size) + call wave_dep_growth (wave_spectrum, wave_sig_ht, & + wavefreq, new_size) if (icepack_warnings_aborted(subname)) return end if @@ -816,9 +812,8 @@ end subroutine fsd_add_new_ice ! ! authors: Lettie Roach, NIWA/VUW ! - subroutine wave_dep_growth (local_wave_spec, & - wavefreq, dwavefreq, & - new_size) + subroutine wave_dep_growth (local_wave_spec, wave_height, & + wavefreq, new_size) real (kind=dbl_kind), dimension(:), intent(in) :: & local_wave_spec ! ocean surface wave spectrum as a function of frequency @@ -826,8 +821,10 @@ subroutine wave_dep_growth (local_wave_spec, & ! dimension set in ice_forcing real(kind=dbl_kind), dimension(:), intent(in) :: & - wavefreq, & ! wave frequencies (s^-1) - dwavefreq ! wave frequency bin widths (s^-1) + wavefreq ! wave frequencies (s^-1) + + real(kind=dbl_kind), intent(in) :: & + wave_height ! significant wave height (m) integer (kind=int_kind), intent(out) :: & new_size ! index of floe size category in which new floes will grow @@ -844,7 +841,7 @@ subroutine wave_dep_growth (local_wave_spec, & integer (kind=int_kind) :: k - w_amp = c2* SQRT(SUM(local_wave_spec*dwavefreq)) ! sig wave amplitude + w_amp = p5 * wave_height ! amplitude is 1/2 sig wave height f_peak = wavefreq(MAXLOC(local_wave_spec, DIM=1)) ! peak frequency ! tensile failure diff --git a/columnphysics/icepack_parameters.F90 b/columnphysics/icepack_parameters.F90 index 16be85709..fe6ce051e 100644 --- a/columnphysics/icepack_parameters.F90 +++ b/columnphysics/icepack_parameters.F90 @@ -332,7 +332,8 @@ module icepack_parameters wave_spec = .false. ! if true, use wave forcing character (len=char_len), public :: & - wave_spec_type = 'constant' ! 'none', 'constant', or 'random' + wave_spec_type = 'constant' , & ! 'none', 'constant', or 'random' + wave_height_type = 'internal' ! 'none', 'internal', 'coupled' !----------------------------------------------------------------------- ! Parameters for melt ponds @@ -592,7 +593,7 @@ subroutine icepack_init_parameters( & atmiter_conv_in, calc_dragio_in, & tfrz_option_in, kitd_in, kcatbound_in, hs0_in, frzpnd_in, & apnd_sl_in, saltflux_option_in, congel_freeze_in, & - floeshape_in, wave_spec_in, wave_spec_type_in, nfreq_in, & + floeshape_in, wave_spec_in, wave_spec_type_in, wave_height_type_in, nfreq_in, & dpscale_in, rfracmin_in, rfracmax_in, pndaspect_in, hs1_in, hp1_in, & bgc_flux_type_in, z_tracers_in, scale_bgc_in, solve_zbgc_in, & modal_aero_in, use_macromolecules_in, restartbgc_in, skl_bgc_in, & @@ -884,7 +885,8 @@ subroutine icepack_init_parameters( & wave_spec_in ! if true, use wave forcing character (len=*), intent(in), optional :: & - wave_spec_type_in ! type of wave spectrum forcing + wave_spec_type_in, & ! type of wave spectrum forcing + wave_height_type_in ! type of wave height forcing !----------------------------------------------------------------------- ! Parameters for biogeochemistry @@ -1235,6 +1237,7 @@ subroutine icepack_init_parameters( & if (present(floeshape_in) ) floeshape = floeshape_in if (present(wave_spec_in) ) wave_spec = wave_spec_in if (present(wave_spec_type_in) ) wave_spec_type = wave_spec_type_in + if (present(wave_height_type_in) ) wave_height_type = wave_height_type_in if (present(nfreq_in) ) nfreq = nfreq_in if (present(hs0_in) ) hs0 = hs0_in if (present(frzpnd_in) ) frzpnd = frzpnd_in @@ -1604,7 +1607,7 @@ subroutine icepack_query_parameters( & atmiter_conv_out, calc_dragio_out, & tfrz_option_out, kitd_out, kcatbound_out, hs0_out, frzpnd_out, & apnd_sl_out, saltflux_option_out, congel_freeze_out, & - floeshape_out, wave_spec_out, wave_spec_type_out, nfreq_out, & + floeshape_out, wave_spec_out, wave_spec_type_out, wave_height_type_out, nfreq_out, & dpscale_out, rfracmin_out, rfracmax_out, pndaspect_out, hs1_out, hp1_out, & bgc_flux_type_out, z_tracers_out, scale_bgc_out, solve_zbgc_out, & modal_aero_out, use_macromolecules_out, restartbgc_out, use_atm_dust_iron_out, & @@ -1906,7 +1909,8 @@ subroutine icepack_query_parameters( & wave_spec_out ! if true, use wave forcing character (len=*), intent(out), optional :: & - wave_spec_type_out ! type of wave spectrum forcing + wave_spec_type_out, & !type of wave spectrum forcing + wave_height_type_out ! type of wave height forcing !----------------------------------------------------------------------- ! Parameters for biogeochemistry @@ -2289,6 +2293,7 @@ subroutine icepack_query_parameters( & if (present(floeshape_out) ) floeshape_out = floeshape if (present(wave_spec_out) ) wave_spec_out = wave_spec if (present(wave_spec_type_out) ) wave_spec_type_out = wave_spec_type + if (present(wave_height_type_out) ) wave_height_type_out = wave_height_type if (present(nfreq_out) ) nfreq_out = nfreq if (present(hs0_out) ) hs0_out = hs0 if (present(frzpnd_out) ) frzpnd_out = frzpnd @@ -2602,6 +2607,7 @@ subroutine icepack_write_parameters(iounit) write(iounit,*) " floeshape = ", floeshape write(iounit,*) " wave_spec = ", wave_spec write(iounit,*) " wave_spec_type = ", trim(wave_spec_type) + write(iounit,*) " wave_height_type = ", trim(wave_height_type) write(iounit,*) " nfreq = ", nfreq write(iounit,*) " hs0 = ", hs0 write(iounit,*) " frzpnd = ", trim(frzpnd) diff --git a/columnphysics/icepack_therm_itd.F90 b/columnphysics/icepack_therm_itd.F90 index e62313181..508d9ace3 100644 --- a/columnphysics/icepack_therm_itd.F90 +++ b/columnphysics/icepack_therm_itd.F90 @@ -1237,7 +1237,6 @@ subroutine add_new_ice (dt, & wave_sig_ht, & wave_spectrum, & wavefreq, & - dwavefreq, & d_afsd_latg, & d_afsd_newi) @@ -1310,8 +1309,7 @@ subroutine add_new_ice (dt, & wave_spectrum ! ocean surface wave spectrum, E(f) (m^2 s) real(kind=dbl_kind), dimension(:), intent(in), optional :: & - wavefreq, & ! wave frequencies (s^-1) - dwavefreq ! wave frequency bin widths (s^-1) + wavefreq ! wave frequencies (s^-1) real (kind=dbl_kind), dimension(:), intent(out), optional :: & ! change in thickness distribution (area) @@ -1741,7 +1739,6 @@ subroutine add_new_ice (dt, & wave_sig_ht, & wave_spectrum, & wavefreq, & - dwavefreq, & d_afsd_latg, & d_afsd_newi, & afsdn, aicen_init, & @@ -1895,7 +1892,6 @@ subroutine icepack_step_therm2(dt, hin_max, & wave_sig_ht, & wave_spectrum, & wavefreq, & - dwavefreq, & d_afsd_latg, d_afsd_newi, & d_afsd_latm, d_afsd_weld, & dpnd_melt) @@ -1985,8 +1981,7 @@ subroutine icepack_step_therm2(dt, hin_max, & wave_spectrum ! ocean surface wave spectrum E(f) (m^2 s) real(kind=dbl_kind), dimension(:), intent(in), optional :: & - wavefreq, & ! wave frequencies (s^-1) - dwavefreq ! wave frequency bin widths (s^-1) + wavefreq ! wave frequencies (s^-1) real (kind=dbl_kind), dimension(:), intent(out), optional :: & ! change in floe size distribution (area) @@ -2027,7 +2022,6 @@ subroutine icepack_step_therm2(dt, hin_max, & present(wave_sig_ht) .and. & present(wave_spectrum) .and. & present(wavefreq) .and. & - present(dwavefreq) .and. & present(d_afsd_latg) .and. & present(d_afsd_newi) .and. & present(d_afsd_latm) .and. & @@ -2115,8 +2109,7 @@ subroutine icepack_step_therm2(dt, hin_max, & HDO_ocn, H2_16O_ocn, & H2_18O_ocn, & wave_sig_ht, & - wave_spectrum, & - wavefreq, dwavefreq, & + wave_spectrum, wavefreq, & d_afsd_latg, d_afsd_newi) if (icepack_warnings_aborted(subname)) return diff --git a/columnphysics/icepack_wavefracspec.F90 b/columnphysics/icepack_wavefracspec.F90 index 34c4e448f..96d070c02 100644 --- a/columnphysics/icepack_wavefracspec.F90 +++ b/columnphysics/icepack_wavefracspec.F90 @@ -31,8 +31,10 @@ module icepack_wavefracspec use icepack_kinds use icepack_parameters, only: p01, p5, c0, c1, c2, c3, c4, c10 use icepack_parameters, only: bignum, puny, gravit, pi + use icepack_parameters, only: wave_spec_type, wave_height_type use icepack_tracers, only: nt_fsd, ncat, nfsd - use icepack_warnings, only: warnstr, icepack_warnings_add, icepack_warnings_aborted + use icepack_warnings, only: warnstr, icepack_warnings_add + use icepack_warnings, only: icepack_warnings_setabort, icepack_warnings_aborted use icepack_fsd implicit none @@ -179,15 +181,11 @@ end function get_dafsd_wave ! ! authors: 2018 Lettie Roach, NIWA/VUW ! - subroutine icepack_step_wavefracture(wave_spec_type, & + subroutine icepack_step_wavefracture( & dt, nfreq, & aice, vice, aicen, & wave_spectrum, wavefreq, dwavefreq, & - trcrn, d_afsd_wave) - - - character (len=char_len), intent(in) :: & - wave_spec_type ! type of wave spectrum forcing + trcrn, d_afsd_wave, wave_height) integer (kind=int_kind), intent(in) :: & nfreq ! number of wave frequency categories @@ -214,6 +212,9 @@ subroutine icepack_step_wavefracture(wave_spec_type, & real (kind=dbl_kind), dimension(:), intent(out) :: & d_afsd_wave ! change in fsd due to waves + real (kind=dbl_kind), intent(in), optional :: & + wave_height ! significant wave height (m) + real (kind=dbl_kind), dimension(nfsd,ncat) :: & d_afsdn_wave ! change in fsd due to waves, per category @@ -254,7 +255,15 @@ subroutine icepack_step_wavefracture(wave_spec_type, & ! if all ice is not in first floe size category if (.NOT. ALL(trcrn(nt_fsd,:).ge.c1-puny)) then - local_sig_ht = c4*SQRT(SUM(wave_spectrum(:)*dwavefreq(:))) + ! set significant wave height + if (present(wave_height)) then + local_sig_ht = wave_height + elseif (trim(wave_height_type) == 'coupled') then + call icepack_warnings_add(subname//& + ' ERROR: wave_height_type=coupled but no wave height data found') + call icepack_warnings_setabort(.true.,__FILE__,__LINE__) + endif + ! do not try to fracture for minimal ice concentration or zero wave spectrum ! if ((aice > p01).and.(MAXVAL(wave_spectrum(:)) > puny)) then if ((aice > p01).and.(local_sig_ht>0.1_dbl_kind)) then @@ -262,7 +271,7 @@ subroutine icepack_step_wavefracture(wave_spec_type, & hbar = vice / aice ! calculate fracture histogram - call wave_frac(nfreq, wave_spec_type, & + call wave_frac(nfreq, & wavefreq, dwavefreq, & hbar, wave_spectrum, fracture_hist) @@ -390,16 +399,13 @@ end subroutine icepack_step_wavefracture ! ! authors: 2018 Lettie Roach, NIWA/VUW - subroutine wave_frac(nfreq, wave_spec_type, & + subroutine wave_frac(nfreq, & wavefreq, dwavefreq, & hbar, spec_efreq, frac_local) integer (kind=int_kind), intent(in) :: & nfreq ! number of wave frequency categories - character (len=char_len), intent(in) :: & - wave_spec_type ! type of wave spectrum forcing - real (kind=dbl_kind), intent(in) :: & hbar ! mean ice thickness (m) diff --git a/configuration/driver/icedrv_init.F90 b/configuration/driver/icedrv_init.F90 index 6b708b9c2..133683dd6 100644 --- a/configuration/driver/icedrv_init.F90 +++ b/configuration/driver/icedrv_init.F90 @@ -110,7 +110,8 @@ subroutine input_data character (len=char_len) :: shortwave, albedo_type, conduct, fbot_xfer_type, & cpl_frazil, congel_freeze, tfrz_option, saltflux_option, & - frzpnd, atmbndy, wave_spec_type, snwredist, snw_aging_table + frzpnd, atmbndy, wave_spec_type, wave_height_type, & + snwredist, snw_aging_table logical (kind=log_kind) :: sw_redist, use_smliq_pnd, snwgrain, update_ocn_f real (kind=dbl_kind) :: sw_frac, sw_dtemp @@ -190,8 +191,9 @@ subroutine input_data fbot_xfer_type, oceanmixed_ice, emissivity, & formdrag, highfreq, natmiter, & atmiter_conv, calc_dragio, congel_freeze, & - tfrz_option, saltflux_option, ice_ref_salinity, & - default_season, wave_spec_type, cpl_frazil, & + tfrz_option, saltflux_option, ice_ref_salinity,& + cpl_frazil, default_season, & + wave_spec_type, wave_height_type, & precip_units, fyear_init, ycycle, & atm_data_type, ocn_data_type, bgc_data_type, & lateral_flux_type, & @@ -252,6 +254,7 @@ subroutine input_data ice_ref_salinity_out=ice_ref_salinity, kalg_out=kalg, & fbot_xfer_type_out=fbot_xfer_type, puny_out=puny, & wave_spec_type_out=wave_spec_type, & + wave_height_type_out=wave_height_type, & sw_redist_out=sw_redist, sw_frac_out=sw_frac, sw_dtemp_out=sw_dtemp, & snwredist_out=snwredist, use_smliq_pnd_out=use_smliq_pnd, & snwgrain_out=snwgrain, rsnw_fall_out=rsnw_fall, rsnw_tmax_out=rsnw_tmax, & @@ -306,6 +309,7 @@ subroutine input_data ! 'mm_per_sec' = 'mks' = kg/m^2 s oceanmixed_ice = .false. ! if true, use internal ocean mixed layer wave_spec_type = 'none' ! type of wave spectrum forcing + wave_height_type= 'none' ! type of wave height forcing ocn_data_format = 'bin' ! file format ('bin'=binary or 'nc'=netcdf) ocn_data_type = 'default' ! source of ocean forcing data ocn_data_file = ' ' ! ocean forcing data file @@ -679,10 +683,21 @@ subroutine input_data endif wave_spec = .false. - if (tr_fsd .and. (trim(wave_spec_type) /= 'none')) wave_spec = .true. - if (tr_fsd .and. (trim(wave_spec_type) == 'none')) then - write (nu_diag,*) 'WARNING: tr_fsd=T but wave_spec=F - not recommended' - end if + if (tr_fsd) then + if (trim(wave_spec_type) /= 'none') then + if (trim(wave_height_type) /= 'none') wave_spec = .true. + if (trim(wave_height_type) /= 'internal') then + write (nu_diag,*) 'WARNING: set wave_height_type=internal or coupled' + call icedrv_system_abort(file=__FILE__,line=__LINE__) + endif + endif + if (.not.(wave_spec)) then + write (nu_diag,*) 'WARNING: tr_fsd=T but wave_spec=F - not recommended' + if (trim(wave_height_type) /= 'none') then + write (nu_diag,*) 'WARNING: Wave_spec=F, wave_height_type/=none, wave_sig_ht = 0' + endif + endif + endif !----------------------------------------------------------------- ! spew @@ -1041,7 +1056,9 @@ subroutine input_data tfrz_option_in=tfrz_option, saltflux_option_in=saltflux_option, & ice_ref_salinity_in=ice_ref_salinity, kalg_in=kalg, & fbot_xfer_type_in=fbot_xfer_type, & - wave_spec_type_in=wave_spec_type, wave_spec_in=wave_spec, & + wave_spec_type_in=wave_spec_type, & + wave_height_type_in=wave_height_type, & + wave_spec_in=wave_spec, & sw_redist_in=sw_redist, sw_frac_in=sw_frac, sw_dtemp_in=sw_dtemp, & snwredist_in=snwredist, use_smliq_pnd_in=use_smliq_pnd, & snw_aging_table_in=snw_aging_table, & diff --git a/configuration/driver/icedrv_step.F90 b/configuration/driver/icedrv_step.F90 index a6a85ef7a..f25c3c9bf 100644 --- a/configuration/driver/icedrv_step.F90 +++ b/configuration/driver/icedrv_step.F90 @@ -468,6 +468,9 @@ subroutine step_therm2 (dt) logical (kind=log_kind) :: & tr_fsd ! floe size distribution tracers + + character (len=char_len) :: & + wave_height_type ! type of significant wave height forcing character(len=*), parameter :: subname='(step_therm2)' @@ -477,6 +480,7 @@ subroutine step_therm2 (dt) call icepack_query_tracer_sizes(ntrcr_out=ntrcr, nbtrcr_out=nbtrcr) call icepack_query_tracer_flags(tr_fsd_out=tr_fsd) + call icepack_query_parameters(wave_height_type_out=wave_height_type) call icepack_warnings_flush(nu_diag) if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, & file=__FILE__,line= __LINE__) @@ -486,9 +490,11 @@ subroutine step_therm2 (dt) do i = 1, nx if (tmask(i)) then - ! wave_sig_ht - compute here to pass to add new ice - if (tr_fsd) & - wave_sig_ht(i) = c4*SQRT(SUM(wave_spectrum(i,:)*dwavefreq(:))) + ! significant wave height + if (tr_fsd .and. trim(wave_height_type) == 'internal') then + wave_sig_ht(i) = c4*SQRT(SUM(wave_spectrum(i,:)*dwavefreq(:))) + ! else wave_sig_ht = 0 unless provided by coupler or other external data + endif call icepack_step_therm2(dt=dt, & hin_max=hin_max(:), & @@ -526,7 +532,6 @@ subroutine step_therm2 (dt) wave_sig_ht=wave_sig_ht(i), & wave_spectrum=wave_spectrum(i,:), & wavefreq=wavefreq(:), & - dwavefreq=dwavefreq(:), & d_afsd_latg=d_afsd_latg(i,:), & d_afsd_newi=d_afsd_newi(i,:), & d_afsd_latm=d_afsd_latm(i,:), & @@ -676,18 +681,11 @@ subroutine step_dyn_wave (dt) ntrcr, & ! nbtrcr ! - character (len=char_len) :: wave_spec_type - character(len=*), parameter :: subname = '(step_dyn_wave)' - call icepack_query_parameters(wave_spec_type_out=wave_spec_type) - call icepack_warnings_flush(nu_diag) - if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, & - file=__FILE__,line= __LINE__) - do i = 1, nx d_afsd_wave(i,:) = c0 - call icepack_step_wavefracture (wave_spec_type=wave_spec_type, & + call icepack_step_wavefracture ( & dt=dt, nfreq=nfreq, & aice = aice (i), & vice = vice (i), & @@ -696,7 +694,8 @@ subroutine step_dyn_wave (dt) wavefreq = wavefreq (:), & dwavefreq = dwavefreq (:), & trcrn = trcrn (i,:,:), & - d_afsd_wave = d_afsd_wave (i,:)) + d_afsd_wave = d_afsd_wave (i,:), & + wave_height = wave_sig_ht (i)) end do ! i call icepack_warnings_flush(nu_diag) diff --git a/configuration/scripts/icepack_in b/configuration/scripts/icepack_in index 3b2f0c7fd..0ea12627e 100644 --- a/configuration/scripts/icepack_in +++ b/configuration/scripts/icepack_in @@ -132,6 +132,7 @@ saltflux_option = 'constant' oceanmixed_ice = .true. wave_spec_type = 'none' + wave_height_type= 'none' restore_ocn = .false. trestore = 90 sss_fixed = 34.0 diff --git a/configuration/scripts/options/set_nml.fsd1 b/configuration/scripts/options/set_nml.fsd1 index f79927e5c..690426d61 100644 --- a/configuration/scripts/options/set_nml.fsd1 +++ b/configuration/scripts/options/set_nml.fsd1 @@ -1,2 +1,3 @@ tr_fsd = .true. wave_spec_type = 'none' +wave_height_type = 'none' diff --git a/configuration/scripts/options/set_nml.fsd12 b/configuration/scripts/options/set_nml.fsd12 index ac5a02bba..fbc8d3743 100644 --- a/configuration/scripts/options/set_nml.fsd12 +++ b/configuration/scripts/options/set_nml.fsd12 @@ -1,3 +1,4 @@ tr_fsd = .true. wave_spec_type = 'constant' +wave_height_type = 'internal' tfrz_option = 'mushy' diff --git a/doc/source/user_guide/interfaces.include b/doc/source/user_guide/interfaces.include index 14f60aab2..27e93917b 100644 --- a/doc/source/user_guide/interfaces.include +++ b/doc/source/user_guide/interfaces.include @@ -780,7 +780,7 @@ icepack_init_parameters stefan_boltzmann_in, ice_ref_salinity_in, & Tffresh_in, Lsub_in, Lvap_in, Timelt_in, Tsmelt_in, & iceruf_in, Cf_in, Pstar_in, Cstar_in, kappav_in, & - kice_in, ksno_in, & + kice_in, ksno_in, itd_area_min_in, itd_mass_min_in, & zref_in, hs_min_in, snowpatch_in, rhosi_in, sk_l_in, & saltmax_in, phi_init_in, min_salin_in, Tliquidus_max_in, & min_bgc_in, dSin0_frazil_in, hi_ssl_in, hs_ssl_in, hs_ssl_min_in, & @@ -799,7 +799,7 @@ icepack_init_parameters atmiter_conv_in, calc_dragio_in, & tfrz_option_in, kitd_in, kcatbound_in, hs0_in, frzpnd_in, & apnd_sl_in, saltflux_option_in, congel_freeze_in, & - floeshape_in, wave_spec_in, wave_spec_type_in, nfreq_in, & + floeshape_in, wave_spec_in, wave_spec_type_in, wave_height_type_in, nfreq_in, & dpscale_in, rfracmin_in, rfracmax_in, pndaspect_in, hs1_in, hp1_in, & bgc_flux_type_in, z_tracers_in, scale_bgc_in, solve_zbgc_in, & modal_aero_in, use_macromolecules_in, restartbgc_in, skl_bgc_in, & @@ -1010,14 +1010,16 @@ icepack_init_parameters !----------------------------------------------------------------------- real(kind=dbl_kind), intent(in), optional :: & - Cf_in, & ! ratio of ridging work to PE change in ridging - Pstar_in, & ! constant in Hibler strength formula - Cstar_in, & ! constant in Hibler strength formula - dragio_in, & ! ice-ocn drag coefficient + itd_area_min_in, & ! zap residual ice below this minimum area + itd_mass_min_in, & ! zap residual ice below this minimum mass + Cf_in, & ! ratio of ridging work to PE change in ridging + Pstar_in, & ! constant in Hibler strength formula + Cstar_in, & ! constant in Hibler strength formula + dragio_in, & ! ice-ocn drag coefficient thickness_ocn_layer1_in, & ! thickness of first ocean level (m) - iceruf_ocn_in, & ! under-ice roughness (m) - gravit_in, & ! gravitational acceleration (m/s^2) - iceruf_in ! ice surface roughness (m) + iceruf_ocn_in, & ! under-ice roughness (m) + gravit_in, & ! gravitational acceleration (m/s^2) + iceruf_in ! ice surface roughness (m) integer (kind=int_kind), intent(in), optional :: & ! defined in namelist kstrength_in , & ! 0 for simple Hibler (1979) formulation @@ -1089,7 +1091,8 @@ icepack_init_parameters wave_spec_in ! if true, use wave forcing character (len=*), intent(in), optional :: & - wave_spec_type_in ! type of wave spectrum forcing + wave_spec_type_in, & ! type of wave spectrum forcing + wave_height_type_in ! type of wave height forcing !----------------------------------------------------------------------- ! Parameters for biogeochemistry @@ -1341,7 +1344,7 @@ icepack_query_parameters stefan_boltzmann_out, ice_ref_salinity_out, & Tffresh_out, Lsub_out, Lvap_out, Timelt_out, Tsmelt_out, & iceruf_out, Cf_out, Pstar_out, Cstar_out, kappav_out, & - kice_out, ksno_out, & + kice_out, ksno_out, itd_area_min_out, itd_mass_min_out, & zref_out, hs_min_out, snowpatch_out, rhosi_out, sk_l_out, & saltmax_out, phi_init_out, min_salin_out, Tliquidus_max_out, & min_bgc_out, dSin0_frazil_out, hi_ssl_out, hs_ssl_out, hs_ssl_min_out, & @@ -1359,7 +1362,7 @@ icepack_query_parameters atmiter_conv_out, calc_dragio_out, & tfrz_option_out, kitd_out, kcatbound_out, hs0_out, frzpnd_out, & apnd_sl_out, saltflux_option_out, congel_freeze_out, & - floeshape_out, wave_spec_out, wave_spec_type_out, nfreq_out, & + floeshape_out, wave_spec_out, wave_spec_type_out, wave_height_type_out, nfreq_out, & dpscale_out, rfracmin_out, rfracmax_out, pndaspect_out, hs1_out, hp1_out, & bgc_flux_type_out, z_tracers_out, scale_bgc_out, solve_zbgc_out, & modal_aero_out, use_macromolecules_out, restartbgc_out, use_atm_dust_iron_out, & @@ -1580,14 +1583,16 @@ icepack_query_parameters !----------------------------------------------------------------------- real(kind=dbl_kind), intent(out), optional :: & - Cf_out, & ! ratio of ridging work to PE change in ridging - Pstar_out, & ! constant in Hibler strength formula - Cstar_out, & ! constant in Hibler strength formula - dragio_out, & ! ice-ocn drag coefficient + itd_area_min_out, & ! zap residual ice below this minimum area + itd_mass_min_out, & ! zap residual ice below this minimum mass + Cf_out, & ! ratio of ridging work to PE change in ridging + Pstar_out, & ! constant in Hibler strength formula + Cstar_out, & ! constant in Hibler strength formula + dragio_out, & ! ice-ocn drag coefficient thickness_ocn_layer1_out, & ! thickness of first ocean level (m) - iceruf_ocn_out, & ! under-ice roughness (m) - gravit_out, & ! gravitational acceleration (m/s^2) - iceruf_out ! ice surface roughness (m) + iceruf_ocn_out, & ! under-ice roughness (m) + gravit_out, & ! gravitational acceleration (m/s^2) + iceruf_out ! ice surface roughness (m) integer (kind=int_kind), intent(out), optional :: & ! defined in namelist kstrength_out , & ! 0 for simple Hibler (1979) formulation @@ -1659,7 +1664,8 @@ icepack_query_parameters wave_spec_out ! if true, use wave forcing character (len=*), intent(out), optional :: & - wave_spec_type_out ! type of wave spectrum forcing + wave_spec_type_out, & !type of wave spectrum forcing + wave_height_type_out ! type of wave height forcing !----------------------------------------------------------------------- ! Parameters for biogeochemistry @@ -2255,7 +2261,6 @@ icepack_step_therm2 wave_sig_ht, & wave_spectrum, & wavefreq, & - dwavefreq, & d_afsd_latg, d_afsd_newi, & d_afsd_latm, d_afsd_weld, & dpnd_melt) @@ -2345,8 +2350,7 @@ icepack_step_therm2 wave_spectrum ! ocean surface wave spectrum E(f) (m^2 s) real(kind=dbl_kind), dimension(:), intent(in), optional :: & - wavefreq, & ! wave frequencies (s^-1) - dwavefreq ! wave frequency bin widths (s^-1) + wavefreq ! wave frequencies (s^-1) real (kind=dbl_kind), dimension(:), intent(out), optional :: & ! change in floe size distribution (area) @@ -3400,15 +3404,11 @@ icepack_step_wavefracture ! ! authors: 2018 Lettie Roach, NIWA/VUW ! - subroutine icepack_step_wavefracture(wave_spec_type, & + subroutine icepack_step_wavefracture( & dt, nfreq, & aice, vice, aicen, & wave_spectrum, wavefreq, dwavefreq, & - trcrn, d_afsd_wave) - - - character (len=char_len), intent(in) :: & - wave_spec_type ! type of wave spectrum forcing + trcrn, d_afsd_wave, wave_height) integer (kind=int_kind), intent(in) :: & nfreq ! number of wave frequency categories @@ -3435,6 +3435,9 @@ icepack_step_wavefracture real (kind=dbl_kind), dimension(:), intent(out) :: & d_afsd_wave ! change in fsd due to waves + real (kind=dbl_kind), intent(in), optional :: & + wave_height ! significant wave height (m) + real (kind=dbl_kind), dimension(nfsd,ncat) :: & d_afsdn_wave ! change in fsd due to waves, per category diff --git a/doc/source/user_guide/ug_case_settings.rst b/doc/source/user_guide/ug_case_settings.rst index ae2f245b8..256a82892 100644 --- a/doc/source/user_guide/ug_case_settings.rst +++ b/doc/source/user_guide/ug_case_settings.rst @@ -408,6 +408,9 @@ forcing_nml "", "``none``", "no wave data provided, no wave-ice interactions (not recommended when using the FSD)", "" "", "``profile``", "no wave data file is provided, use fixed dummy wave spectrum, for testing, sea surface height generated using constant phase (1 iteration of wave fracture)", "" "", "``random``", "wave data file is provided, sea surface height generated using random number (multiple iterations of wave fracture)", "" + "``wave_height_type``", "``internal``", "significant wave heights are calculated by icepack from the wave_spectra", "``none``" + "", "``none``", "No wave data provided, no wave-ice interactions", "" + "", "``coupled``", "significant wave heights data provided from a coupled wave model, like WW3", "" "``ycycle``", "integer", "number of years in forcing data cycle", "1" "", "", "", "" From d5d603e5ea9386bcba1ae73b73f05a54ead47f22 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Wed, 14 Jan 2026 14:23:33 -0600 Subject: [PATCH 30/34] remove duplicate declaration statement --- columnphysics/icepack_fsd.F90 | 3 --- 1 file changed, 3 deletions(-) diff --git a/columnphysics/icepack_fsd.F90 b/columnphysics/icepack_fsd.F90 index afcff4ee3..9b0f2e1fb 100644 --- a/columnphysics/icepack_fsd.F90 +++ b/columnphysics/icepack_fsd.F90 @@ -826,9 +826,6 @@ subroutine wave_dep_growth (local_wave_spec, wave_height, & real(kind=dbl_kind), intent(in) :: & wave_height ! significant wave height (m) - real(kind=dbl_kind), intent(in), optional :: & - wave_height ! significant wave height (m) - integer (kind=int_kind), intent(out) :: & new_size ! index of floe size category in which new floes will grow From 3e649ed3e836011c9cfff926c1b1f44a28733132 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Thu, 15 Jan 2026 15:58:55 -0700 Subject: [PATCH 31/34] add end-quote in index documentation (#547) --- doc/source/icepack_index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/icepack_index.rst b/doc/source/icepack_index.rst index 6a46aeb9b..ed3c796a1 100755 --- a/doc/source/icepack_index.rst +++ b/doc/source/icepack_index.rst @@ -254,7 +254,7 @@ section :ref:`tabnamelist`. "istep1", "total number of steps at current time step", "" "Iswabs", "shortwave radiation absorbed in ice layers", "W/m\ :math:`^2`" "itd_area_min", ":math:`\bullet` zap residual ice below a minimum area", "1.e-11" - "itd_mass_min", ":math:`\bullet` zap residual ice below a minimum mass", "1.e-10 + "itd_mass_min", ":math:`\bullet` zap residual ice below a minimum mass", "1.e-10" "**J**", "", "" "**K**", "", "" "kalg", ":math:`\bullet` absorption coefficient for algae", "" From fb8ccc175fc426438fe25d7ba6a710d845993df0 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Thu, 22 Jan 2026 12:42:41 -0700 Subject: [PATCH 32/34] clarify uv and par comments and doc (#549) This updates code comments and documentation only. The word 'visible' is confusing in the comments for ultraviolet radiation bands and not needed for PAR. It was removed for the uv and PAR variables but left as-is for older code, which used the term in a general sense for wavelengths < 700 nm. Changed the uv comments to state '< 400 nm' and added some text to the docs. --- columnphysics/icepack_flux.F90 | 16 +-- columnphysics/icepack_shortwave.F90 | 126 +++++++++++------------ columnphysics/icepack_therm_vertical.F90 | 38 +++---- doc/source/icepack_index.rst | 8 +- doc/source/science_guide/sg_thermo.rst | 22 ++-- doc/source/user_guide/interfaces.include | 32 +++--- 6 files changed, 125 insertions(+), 117 deletions(-) diff --git a/columnphysics/icepack_flux.F90 b/columnphysics/icepack_flux.F90 index fa8805453..d55780763 100644 --- a/columnphysics/icepack_flux.F90 +++ b/columnphysics/icepack_flux.F90 @@ -117,10 +117,10 @@ subroutine merge_fluxes (aicen, & fswthrun_vdf, & ! vis dif sw radiation through ice bot (W/m**2) fswthrun_idr, & ! nir dir sw radiation through ice bot (W/m**2) fswthrun_idf, & ! nir dif sw radiation through ice bot (W/m**2) - fswthrun_uvrdr, & ! > 700nm vis uvr dir sw radiation through ice bot (W/m**2) - fswthrun_uvrdf, & ! > 700nm vis uvr dif sw radiation through ice bot (W/m**2) - fswthrun_pardr, & ! 400-700nm vis par dir sw radiation through ice bot (W/m**2) - fswthrun_pardf, & ! 400-700nm vis par dif sw radiation through ice bot (W/m**2) + fswthrun_uvrdr, & ! < 400nm uv dir sw radiation through ice bot (W/m**2) + fswthrun_uvrdf, & ! < 400nm uv dif sw radiation through ice bot (W/m**2) + fswthrun_pardr, & ! 400-700nm par dir sw radiation through ice bot (W/m**2) + fswthrun_pardf, & ! 400-700nm par dif sw radiation through ice bot (W/m**2) Urefn ! air speed reference level (m/s) ! cumulative fluxes @@ -159,10 +159,10 @@ subroutine merge_fluxes (aicen, & fswthru_vdf, & ! vis dif sw radiation through ice bot (W/m**2) fswthru_idr, & ! nir dir sw radiation through ice bot (W/m**2) fswthru_idf, & ! nir dif sw radiation through ice bot (W/m**2) - fswthru_uvrdr, & ! > 700nm vis uvr dir sw radiation through ice bot (W/m**2) - fswthru_uvrdf, & ! > 700nm vis uvr dif sw radiation through ice bot (W/m**2) - fswthru_pardr, & ! 400-700nm vis par dir sw radiation through ice bot (W/m**2) - fswthru_pardf, & ! 400-700nm vis par dif sw radiation through ice bot (W/m**2) + fswthru_uvrdr, & ! < 400nm uv dir sw radiation through ice bot (W/m**2) + fswthru_uvrdf, & ! < 400nm uv dif sw radiation through ice bot (W/m**2) + fswthru_pardr, & ! 400-700nm par dir sw radiation through ice bot (W/m**2) + fswthru_pardf, & ! 400-700nm par dif sw radiation through ice bot (W/m**2) dsnow, & ! change in snow depth (m) Uref ! air speed reference level (m/s) diff --git a/columnphysics/icepack_shortwave.F90 b/columnphysics/icepack_shortwave.F90 index 6ecdb6921..af3f0f657 100644 --- a/columnphysics/icepack_shortwave.F90 +++ b/columnphysics/icepack_shortwave.F90 @@ -250,10 +250,10 @@ subroutine shortwave_ccsm3 (aicen, vicen, & swidf ! sw down, near IR, diffuse (W/m^2) real (kind=dbl_kind), intent(in), optional :: & - swuvrdr , & ! sw down, vis uvr dir (W/m^2) - swuvrdf , & ! sw down, vis uvr dif (W/m^2) - swpardr , & ! sw down, vis par dir (W/m^2) - swpardf ! sw down, vis par dif (W/m^2) + swuvrdr , & ! sw down, ultraviolet, direct (W/m^2) + swuvrdf , & ! sw down, ultraviolet, diffuse (W/m^2) + swpardr , & ! sw down, PAR, direct (W/m^2) + swpardf ! sw down, PAR, diffuse (W/m^2) ! baseline albedos for ccsm3 shortwave, set in namelist real (kind=dbl_kind), intent(in) :: & @@ -282,10 +282,10 @@ subroutine shortwave_ccsm3 (aicen, vicen, & fswthrun_vdf, & ! vis dif SW through ice to ocean (W m-2) fswthrun_idr, & ! nir dir SW through ice to ocean (W m-2) fswthrun_idf, & ! nir dif SW through ice to ocean (W m-2) - fswthrun_uvrdr,&! vis dir uvr SW through ice to ocean (W m-2) - fswthrun_uvrdf,&! vis dif uvr SW through ice to ocean (W m-2) - fswthrun_pardr,&! vis dir par SW through ice to ocean (W m-2) - fswthrun_pardf ! vis dif par SW through ice to ocean (W m-2) + fswthrun_uvrdr,&! uv dir SW through ice to ocean (W m-2) + fswthrun_uvrdf,&! uv dif SW through ice to ocean (W m-2) + fswthrun_pardr,&! par dir SW through ice to ocean (W m-2) + fswthrun_pardf ! par dif SW through ice to ocean (W m-2) real (kind=dbl_kind), intent(inout) :: & coszen ! cosine(zenith angle) @@ -318,10 +318,10 @@ subroutine shortwave_ccsm3 (aicen, vicen, & l_fswthru_vdf, & ! vis dif SW through ice to ocean (W m-2) l_fswthru_idr, & ! nir dir SW through ice to ocean (W m-2) l_fswthru_idf, & ! nir dif SW through ice to ocean (W m-2) - l_fswthru_uvrdr,&! vis uvr dir SW through ice to ocean (W m-2) - l_fswthru_uvrdf,&! vis uvr dif SW through ice to ocean (W m-2) - l_fswthru_pardr,&! vis par dir SW through ice to ocean (W m-2) - l_fswthru_pardf ! vis par dif SW through ice to ocean (W m-2) + l_fswthru_uvrdr,&! uv dir SW through ice to ocean (W m-2) + l_fswthru_uvrdf,&! uv dif SW through ice to ocean (W m-2) + l_fswthru_pardr,&! par dir SW through ice to ocean (W m-2) + l_fswthru_pardf ! par dif SW through ice to ocean (W m-2) character(len=*),parameter :: subname='(shortwave_ccsm3)' !----------------------------------------------------------------- @@ -739,10 +739,10 @@ subroutine absorbed_solar (aicen, & alidfns ! near-ir, diffuse albedo, snow real (kind=dbl_kind), intent(in), optional :: & - swuvrdr , & ! sw down, vis uvr dir (W/m^2) - swuvrdf , & ! sw down, vis uvr dif (W/m^2) - swpardr , & ! sw down, vis par dir (W/m^2) - swpardf ! sw down, vis par dif (W/m^2) + swuvrdr , & ! sw down, uv dir (W/m^2) + swuvrdf , & ! sw down, uv dif (W/m^2) + swpardr , & ! sw down, par dir (W/m^2) + swpardf ! sw down, par dif (W/m^2) real (kind=dbl_kind), intent(out):: & fswsfc , & ! SW absorbed at ice/snow surface (W m-2) @@ -754,10 +754,10 @@ subroutine absorbed_solar (aicen, & fswthru_vdf , & ! vis dif SW through ice to ocean (W m-2) fswthru_idr , & ! nir dir SW through ice to ocean (W m-2) fswthru_idf , & ! nir dif SW through ice to ocean (W m-2) - fswthru_uvrdr, & ! vis dir uvr SW through ice to ocean (W m-2) - fswthru_uvrdf, & ! vis dif uvr SW through ice to ocean (W m-2) - fswthru_pardr, & ! vis dir par SW through ice to ocean (W m-2) - fswthru_pardf ! vis dif par SW through ice to ocean (W m-2) + fswthru_uvrdr, & ! uv dir SW through ice to ocean (W m-2) + fswthru_uvrdf, & ! uv dif SW through ice to ocean (W m-2) + fswthru_pardr, & ! par dir SW through ice to ocean (W m-2) + fswthru_pardf ! par dif SW through ice to ocean (W m-2) real (kind=dbl_kind), dimension (:), intent(out) :: & Iswabs , & ! SW absorbed in particular layer (W m-2) @@ -788,10 +788,10 @@ subroutine absorbed_solar (aicen, & asnow ! fractional area of snow cover real (kind=dbl_kind) :: & - swuvrdrpen , & ! penetrating SW, vis uvr dir (W/m^2) - swuvrdfpen , & ! penetrating SW, vis uvr dif (W/m^2) - swpardrpen , & ! penetrating SW, vis par dir (W/m^2) - swpardfpen ! penetrating SW, vis par dif (W/m^2) + swuvrdrpen , & ! penetrating SW, uv dir (W/m^2) + swuvrdfpen , & ! penetrating SW, uv dif (W/m^2) + swpardrpen , & ! penetrating SW, par dir (W/m^2) + swpardfpen ! penetrating SW, par dif (W/m^2) character(len=*),parameter :: subname='(absorbed_solar)' @@ -972,10 +972,10 @@ subroutine run_dEdd(dt, & fsnow ! snowfall rate (kg/m^2 s) real (kind=dbl_kind), intent(in), optional :: & - swuvrdr, & ! sw down, vis uvr dir (W/m^2) - swuvrdf, & ! sw down, vis uvr dif (W/m^2) - swpardr, & ! sw down, vis par dir (W/m^2) - swpardf ! sw down, vis par dif (W/m^2) + swuvrdr, & ! sw down, uv dir (W/m^2) + swuvrdf, & ! sw down, uv dif (W/m^2) + swpardr, & ! sw down, par dir (W/m^2) + swpardf ! sw down, par dif (W/m^2) real(kind=dbl_kind), dimension(:), intent(in) :: & aicen, & ! concentration of ice @@ -1017,8 +1017,8 @@ subroutine run_dEdd(dt, & fswthrun_vdf, & ! vis dif SW through ice to ocean (W/m^2) fswthrun_idr, & ! nir dir SW through ice to ocean (W/m^2) fswthrun_idf, & ! nir dif SW through ice to ocean (W/m^2) - fswthrun_uvrdr,&! uvr dir SW through ice to ocean (W/m^2) - fswthrun_uvrdf,&! uvr dif SW through ice to ocean (W/m^2) + fswthrun_uvrdr,&! uv dir SW through ice to ocean (W/m^2) + fswthrun_uvrdf,&! uv dif SW through ice to ocean (W/m^2) fswthrun_pardr,&! par dir SW through ice to ocean (W/m^2) fswthrun_pardf ! par dif SW through ice to ocean (W/m^2) @@ -1062,10 +1062,10 @@ subroutine run_dEdd(dt, & l_fswthru_vdf , & ! vis dif SW through ice to ocean (W m-2) l_fswthru_idr , & ! nir dir SW through ice to ocean (W m-2) l_fswthru_idf , & ! nir dif SW through ice to ocean (W m-2) - l_fswthru_uvrdr, & ! vis uvr dir SW through ice to ocean (W m-2) - l_fswthru_uvrdf, & ! vis uvr dif SW through ice to ocean (W m-2) - l_fswthru_pardr, & ! vis par dir SW through ice to ocean (W m-2) - l_fswthru_pardf ! vis par dif SW through ice to ocean (W m-2) + l_fswthru_uvrdr, & ! uv dir SW through ice to ocean (W m-2) + l_fswthru_uvrdf, & ! uv dif SW through ice to ocean (W m-2) + l_fswthru_pardr, & ! par dir SW through ice to ocean (W m-2) + l_fswthru_pardf ! par dif SW through ice to ocean (W m-2) logical (kind=log_kind) :: & l_initonly ! local initonly value @@ -1087,7 +1087,7 @@ subroutine run_dEdd(dt, & call compute_coszen (TLAT, TLON, yday, sec, coszen, & days_per_year, nextsw_cday, calendar_type) #else - if (.not.semi_implicit_Tsfc) then ! geos sets solar angles in driver level + if (.not.semi_implicit_Tsfc) then ! GEOS sets solar angles in driver level call compute_coszen (TLAT, TLON, yday, sec, coszen) endif #endif @@ -1318,10 +1318,10 @@ subroutine shortwave_dEdd (coszen, & swidf ! sw down, near IR, diffuse (W/m^2) real (kind=dbl_kind), intent(in), optional :: & - swuvrdr , & ! sw down, vis uvr dir (W/m^2) - swuvrdf , & ! sw down, vis uvr dif (W/m^2) - swpardr , & ! sw down, vis par dir (W/m^2) - swpardf ! sw down, vis par dif (W/m^2) + swuvrdr , & ! sw down, uv dir (W/m^2) + swuvrdf , & ! sw down, uv dif (W/m^2) + swpardr , & ! sw down, par dir (W/m^2) + swpardf ! sw down, par dif (W/m^2) real (kind=dbl_kind), intent(inout) :: & coszen , & ! cosine of solar zenith angle @@ -1338,10 +1338,10 @@ subroutine shortwave_dEdd (coszen, & fswthru_vdf , & ! vis dif SW through snow/bare ice/ponded ice into ocean (W m-2) fswthru_idr , & ! nir dir SW through snow/bare ice/ponded ice into ocean (W m-2) fswthru_idf , & ! nir dif SW through snow/bare ice/ponded ice into ocean (W m-2) - fswthru_uvrdr,& ! vis uvr dir sw radiation through ice bot (GEOS) (W/m**2) - fswthru_uvrdf,& ! vis uvr dif sw radiation through ice bot (GEOS) (W/m**2) - fswthru_pardr,& ! vis par dir sw radiation through ice bot (GEOS) (W/m**2) - fswthru_pardf ! vis par dif sw radiation through ice bot (GEOS) (W/m**2) + fswthru_uvrdr,& ! uv dir SW through ice into ocean (W m-2) + fswthru_uvrdf,& ! uv dif SW through ice into ocean (W m-2) + fswthru_pardr,& ! par dir SW through ice into ocean (W m-2) + fswthru_pardf ! par dif SW through ice into ocean (W m-2) real (kind=dbl_kind), dimension (:), intent(inout) :: & fswpenl , & ! visible SW entering ice layers (W m-2) @@ -1731,10 +1731,10 @@ subroutine compute_dEdd_3bd( & fswthru_vdf, & ! vis dif SW through snow/bare ice/ponded ice into ocean (W m-2) fswthru_idr, & ! nir dir SW through snow/bare ice/ponded ice into ocean (W m-2) fswthru_idf, & ! nir dif SW through snow/bare ice/ponded ice into ocean (W m-2) - fswthru_uvrdr,&! vis uvr dir sw radiation through ice bot (GEOS) (W/m**2) - fswthru_uvrdf,&! vis uvr dif sw radiation through ice bot (GEOS) (W/m**2) - fswthru_pardr,&! vis par dir sw radiation through ice bot (GEOS) (W/m**2) - fswthru_pardf ! vis par dif sw radiation through ice bot (GEOS) (W/m**2) + fswthru_uvrdr,&! uv dir SW through ice into ocean (W m-2) + fswthru_uvrdf,&! uv dif SW through ice into ocean (W m-2) + fswthru_pardr,&! par dir SW through ice into ocean (W m-2) + fswthru_pardf ! par dif SW through ice into ocean (W m-2) real (kind=dbl_kind), dimension (:), intent(inout) :: & fswpenl, & ! visible SW entering ice layers (W m-2) @@ -1742,10 +1742,10 @@ subroutine compute_dEdd_3bd( & Iswabs ! SW absorbed in ice layer (W m-2) real (kind=dbl_kind), intent(in), optional :: & - swuvrdr, & ! sw down, vis uvr dir (W/m^2) - swuvrdf, & ! sw down, vis uvr dif (W/m^2) - swpardr, & ! sw down, vis par dir (W/m^2) - swpardf ! sw down, vis par dif (W/m^2) + swuvrdr, & ! sw down, uv dir (W/m^2) + swuvrdf, & ! sw down, uv dif (W/m^2) + swpardr, & ! sw down, par dir (W/m^2) + swpardf ! sw down, par dif (W/m^2) !----------------------------------------------------------------------- ! @@ -1876,10 +1876,10 @@ subroutine compute_dEdd_3bd( & fthruvdf, & ! vis dif shortwave through snow/bare ice/ponded ice to ocean (W/m^2) fthruidr, & ! nir dir shortwave through snow/bare ice/ponded ice to ocean (W/m^2) fthruidf, & ! nir dif shortwave through snow/bare ice/ponded ice to ocean (W/m^2) - fthruuvrdr,&! vis uvr dir shortwave through snow/bare ice/ponded ice to ocean (W/m^2) - fthruuvrdf,&! vis uvr dif shortwave through snow/bare ice/ponded ice to ocean (W/m^2) - fthrupardr,&! vis par dir shortwave through snow/bare ice/ponded ice to ocean (W/m^2) - fthrupardf ! vis par dif shortwave through snow/bare ice/ponded ice to ocean (W/m^2) + fthruuvrdr,&! uv dir shortwave through snow/bare ice/ponded ice to ocean (W/m^2) + fthruuvrdf,&! uv dif shortwave through snow/bare ice/ponded ice to ocean (W/m^2) + fthrupardr,&! par dir shortwave through snow/bare ice/ponded ice to ocean (W/m^2) + fthrupardf ! par dif shortwave through snow/bare ice/ponded ice to ocean (W/m^2) real (kind=dbl_kind), dimension(nslyr) :: & Sabs ! shortwave absorbed in snow layer (W m-2) @@ -3998,10 +3998,10 @@ subroutine icepack_step_radiation (dt, & TLAT, TLON ! latitude and longitude (radian) real (kind=dbl_kind), intent(in), optional :: & - swuvrdr , & ! sw down, vis uvr dir (W/m^2) - swuvrdf , & ! sw down, vis uvr dif (W/m^2) - swpardr , & ! sw down, vis par dir (W/m^2) - swpardf ! sw down, vis par dif (W/m^2) + swuvrdr , & ! sw down, uv dir (W/m^2) + swuvrdf , & ! sw down, uv dif (W/m^2) + swpardr , & ! sw down, par dir (W/m^2) + swpardf ! sw down, par dif (W/m^2) integer (kind=int_kind), intent(in) :: & sec ! elapsed seconds into date @@ -4062,10 +4062,10 @@ subroutine icepack_step_radiation (dt, & fswthrun_vdf , & ! vis dif SW through ice to ocean (W/m^2) fswthrun_idr , & ! nir dir SW through ice to ocean (W/m^2) fswthrun_idf , & ! nir dif SW through ice to ocean (W/m^2) - fswthrun_uvrdr,& ! vis uvr dir SW through ice to ocean (W/m^2) - fswthrun_uvrdf,& ! vis uvr dif SW through ice to ocean (W/m^2) - fswthrun_pardr,& ! vis par dir SW through ice to ocean (W/m^2) - fswthrun_pardf ! vis par dif SW through ice to ocean (W/m^2) + fswthrun_uvrdr,& ! uv dir SW through ice to ocean (W/m^2) + fswthrun_uvrdf,& ! uv dif SW through ice to ocean (W/m^2) + fswthrun_pardr,& ! par dir SW through ice to ocean (W/m^2) + fswthrun_pardf ! par dif SW through ice to ocean (W/m^2) real (kind=dbl_kind), dimension(:,:), intent(inout) :: & fswpenln , & ! visible SW entering ice layers (W m-2) diff --git a/columnphysics/icepack_therm_vertical.F90 b/columnphysics/icepack_therm_vertical.F90 index 53f082f63..00b3756d6 100644 --- a/columnphysics/icepack_therm_vertical.F90 +++ b/columnphysics/icepack_therm_vertical.F90 @@ -2370,10 +2370,10 @@ subroutine icepack_step_therm1(dt, & fswthru_vdf , & ! vis dif shortwave penetrating to ocean (W/m^2) fswthru_idr , & ! nir dir shortwave penetrating to ocean (W/m^2) fswthru_idf , & ! nir dif shortwave penetrating to ocean (W/m^2) - fswthru_uvrdr,& ! vis uvr dir shortwave penetrating to ocean (W/m^2) - fswthru_uvrdf,& ! vis uvr dif shortwave penetrating to ocean (W/m^2) - fswthru_pardr,& ! vis par dir shortwave penetrating to ocean (W/m^2) - fswthru_pardf,& ! vis par dif shortwave penetrating to ocean (W/m^2) + fswthru_uvrdr,& ! uv dir shortwave penetrating to ocean (W/m^2) + fswthru_uvrdf,& ! uv dif shortwave penetrating to ocean (W/m^2) + fswthru_pardr,& ! par dir shortwave penetrating to ocean (W/m^2) + fswthru_pardf,& ! par dif shortwave penetrating to ocean (W/m^2) dsnow , & ! change in snow depth (m/step-->cm/day) fsloss ! rate of snow loss to leads (kg/m^2/s) @@ -2461,10 +2461,10 @@ subroutine icepack_step_therm1(dt, & fswthrun_vdf , & ! vis dif SW through ice to ocean (W/m^2) fswthrun_idr , & ! nir dir SW through ice to ocean (W/m^2) fswthrun_idf , & ! nir dif SW through ice to ocean (W/m^2) - fswthrun_uvrdr,& ! vis uvr dir SW through ice to ocean (W/m^2) - fswthrun_uvrdf,& ! vis uvr dif SW through ice to ocean (W/m^2) - fswthrun_pardr,& ! vis par dir SW through ice to ocean (W/m^2) - fswthrun_pardf ! via par dif SW through ice to ocean (W/m^2) + fswthrun_uvrdr,& ! uv dir SW through ice to ocean (W/m^2) + fswthrun_uvrdf,& ! uv dif SW through ice to ocean (W/m^2) + fswthrun_pardr,& ! par dir SW through ice to ocean (W/m^2) + fswthrun_pardf ! par dif SW through ice to ocean (W/m^2) real (kind=dbl_kind), dimension(:,:), intent(inout) :: & zqsn , & ! snow layer enthalpy (J m-3) @@ -2532,17 +2532,17 @@ subroutine icepack_step_therm1(dt, & l_meltsliqn ! mass of snow melt local (kg/m^2) real (kind=dbl_kind) :: & - l_fswthrun_vdr, & ! vis dir SW local n ice to ocean (W/m^2) - l_fswthrun_vdf, & ! vis dif SW local n ice to ocean (W/m^2) - l_fswthrun_idr, & ! nir dir SW local n ice to ocean (W/m^2) - l_fswthrun_idf, & ! nir dif SW local n ice to ocean (W/m^2) - l_fswthrun_uvrdr,& ! vis uvr dir SW through ice to ocean (W/m^2) - l_fswthrun_uvrdf,& ! vis uvr dif SW through ice to ocean (W/m^2) - l_fswthrun_pardr,& ! vis par dir SW through ice to ocean (W/m^2) - l_fswthrun_pardf,& ! vis par dif SW through ice to ocean (W/m^2) - l_dsnow, & ! local snow change - l_dsnown, & ! local snow change category - l_meltsliq ! mass of snow melt local (kg/m^2) + l_fswthrun_vdr, & ! vis dir SW category ice to ocean (W/m^2) + l_fswthrun_vdf, & ! vis dif SW category ice to ocean (W/m^2) + l_fswthrun_idr, & ! nir dir SW category ice to ocean (W/m^2) + l_fswthrun_idf, & ! nir dif SW category ice to ocean (W/m^2) + l_fswthrun_uvrdr, & ! uv dir SW category ice to ocean (W/m^2) + l_fswthrun_uvrdf, & ! uv dif SW category ice to ocean (W/m^2) + l_fswthrun_pardr, & ! par dir SW category ice to ocean (W/m^2) + l_fswthrun_pardf, & ! par dif SW category ice to ocean (W/m^2) + l_dsnow, & ! local snow change + l_dsnown, & ! local snow change category + l_meltsliq ! mass of snow melt local (kg/m^2) real (kind=dbl_kind) :: & l_dpnd_flushn, & ! category pond flushing rate (m/step) diff --git a/doc/source/icepack_index.rst b/doc/source/icepack_index.rst index ed3c796a1..38b3a4cf6 100755 --- a/doc/source/icepack_index.rst +++ b/doc/source/icepack_index.rst @@ -194,10 +194,10 @@ section :ref:`tabnamelist`. "fswthru_ai", "grid-box-mean shortwave penetrating to ocean (fswthru)", "W/m\ :math:`^2`" "fswthru_idf", "near IR diffuse shortwave penetrating to ocean", "W/m\ :math:`^2`" "fswthru_idr", "near IR direct shortwave penetrating to ocean", "W/m\ :math:`^2`" - "fswthru_pardf", "visible photosynthetically active shortwave diffuse radiation 400-700nm penetrating to ocean", "W/m\ :math:`^2`" - "fswthru_pardr", "visible photosynthetically active shortwave direct radiation 400-700nm penetrating to ocean", "W/m\ :math:`^2`" - "fswthru_uvrdf", "visible ultraviolet shortwave diffuse radiation > 700nm penetrating to ocean", "W/m\ :math:`^2`" - "fswthru_uvrdr", "visible ultraviolet shortwave direct radiation > 700nm penetrating to ocean", "W/m\ :math:`^2`" + "fswthru_pardf", "photosynthetically active diffuse shortwave radiation 400-700nm penetrating to ocean", "W/m\ :math:`^2`" + "fswthru_pardr", "photosynthetically active direct shortwave radiation 400-700nm penetrating to ocean", "W/m\ :math:`^2`" + "fswthru_uvrdf", "ultraviolet diffuse shortwave radiation < 400nm penetrating to ocean", "W/m\ :math:`^2`" + "fswthru_uvrdr", "ultraviolet direct shortwave radiation < 400nm penetrating to ocean", "W/m\ :math:`^2`" "fswthru_vdr", "visible direct shortwave penetrating to ocean", "W/m\ :math:`^2`" "fswthru_vdf", "visible diffuse shortwave penetrating to ocean", "W/m\ :math:`^2`" "fyear", "current data year", "" diff --git a/doc/source/science_guide/sg_thermo.rst b/doc/source/science_guide/sg_thermo.rst index 874b0653e..bf3d3c251 100755 --- a/doc/source/science_guide/sg_thermo.rst +++ b/doc/source/science_guide/sg_thermo.rst @@ -889,19 +889,27 @@ heat flux, :math:`F_{L\downarrow}` is the incoming longwave flux, :math:`F_{L\uparrow}` is the outgoing longwave flux, :math:`F_{sw}` is the incoming shortwave flux, :math:`\alpha` is the shortwave albedo, and :math:`i_0` is the fraction of absorbed shortwave flux that penetrates -into the ice. The albedo may be altered by the presence of melt ponds. +into the ice. + +Two methods for computing albedo and shortwave fluxes are available, the +"CCSM3" method and a multiple scattering radiative transfer scheme that +uses a Delta-Eddington approach. Shortwave forcing input is generally +divided into two wavelength bands (:math:`< 700` \ nm, visible and below) and +(:math:`> 700` \ nm, infrared), with an additional capability to accept +shortwave divided into ultraviolet (:math:`< 400` \ nm) and visible / +photosynthetically active (:math:`400 - 700` \ nm) bands. +Radiation calculations may occur in the original two bands +or for up to five bands, as described below. + +The albedo may be altered by the presence of melt ponds. Each of the explicit melt pond parameterizations (topo, level-ice and sealvl ponds) should be used in conjunction with the Delta-Eddington -shortwave scheme, described below. +shortwave scheme. Shortwave radiation: Delta-Eddington ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Two methods for computing albedo and shortwave fluxes are available, the -"ccsm3" method, described in the next section, and a multiple scattering -radiative transfer scheme that uses a Delta-Eddington approach -(``shortwave`` = ``dEdd``). - +In the Delta-Eddington approach (``shortwave`` = ``dEdd``), "Inherent" optical properties (IOPs) for snow and sea ice, such as extinction coefficient and single scattering albedo, are prescribed based on physical measurements; reflected, absorbed and transmitted diff --git a/doc/source/user_guide/interfaces.include b/doc/source/user_guide/interfaces.include index 27e93917b..3620e5c1b 100644 --- a/doc/source/user_guide/interfaces.include +++ b/doc/source/user_guide/interfaces.include @@ -2061,10 +2061,10 @@ icepack_step_radiation TLAT, TLON ! latitude and longitude (radian) real (kind=dbl_kind), intent(in), optional :: & - swuvrdr , & ! sw down, vis uvr dir (W/m^2) - swuvrdf , & ! sw down, vis uvr dif (W/m^2) - swpardr , & ! sw down, vis par dir (W/m^2) - swpardf ! sw down, vis par dif (W/m^2) + swuvrdr , & ! sw down, uv dir (W/m^2) + swuvrdf , & ! sw down, uv dif (W/m^2) + swpardr , & ! sw down, par dir (W/m^2) + swpardf ! sw down, par dif (W/m^2) integer (kind=int_kind), intent(in) :: & sec ! elapsed seconds into date @@ -2125,10 +2125,10 @@ icepack_step_radiation fswthrun_vdf , & ! vis dif SW through ice to ocean (W/m^2) fswthrun_idr , & ! nir dir SW through ice to ocean (W/m^2) fswthrun_idf , & ! nir dif SW through ice to ocean (W/m^2) - fswthrun_uvrdr,& ! vis uvr dir SW through ice to ocean (W/m^2) - fswthrun_uvrdf,& ! vis uvr dif SW through ice to ocean (W/m^2) - fswthrun_pardr,& ! vis par dir SW through ice to ocean (W/m^2) - fswthrun_pardf ! vis par dif SW through ice to ocean (W/m^2) + fswthrun_uvrdr,& ! uv dir SW through ice to ocean (W/m^2) + fswthrun_uvrdf,& ! uv dif SW through ice to ocean (W/m^2) + fswthrun_pardr,& ! par dir SW through ice to ocean (W/m^2) + fswthrun_pardf ! par dif SW through ice to ocean (W/m^2) real (kind=dbl_kind), dimension(:,:), intent(inout) :: & fswpenln , & ! visible SW entering ice layers (W m-2) @@ -2712,10 +2712,10 @@ icepack_step_therm1 fswthru_vdf , & ! vis dif shortwave penetrating to ocean (W/m^2) fswthru_idr , & ! nir dir shortwave penetrating to ocean (W/m^2) fswthru_idf , & ! nir dif shortwave penetrating to ocean (W/m^2) - fswthru_uvrdr,& ! vis uvr dir shortwave penetrating to ocean (W/m^2) - fswthru_uvrdf,& ! vis uvr dif shortwave penetrating to ocean (W/m^2) - fswthru_pardr,& ! vis par dir shortwave penetrating to ocean (W/m^2) - fswthru_pardf,& ! vis par dif shortwave penetrating to ocean (W/m^2) + fswthru_uvrdr,& ! uv dir shortwave penetrating to ocean (W/m^2) + fswthru_uvrdf,& ! uv dif shortwave penetrating to ocean (W/m^2) + fswthru_pardr,& ! par dir shortwave penetrating to ocean (W/m^2) + fswthru_pardf,& ! par dif shortwave penetrating to ocean (W/m^2) dsnow , & ! change in snow depth (m/step-->cm/day) fsloss ! rate of snow loss to leads (kg/m^2/s) @@ -2803,10 +2803,10 @@ icepack_step_therm1 fswthrun_vdf , & ! vis dif SW through ice to ocean (W/m^2) fswthrun_idr , & ! nir dir SW through ice to ocean (W/m^2) fswthrun_idf , & ! nir dif SW through ice to ocean (W/m^2) - fswthrun_uvrdr,& ! vis uvr dir SW through ice to ocean (W/m^2) - fswthrun_uvrdf,& ! vis uvr dif SW through ice to ocean (W/m^2) - fswthrun_pardr,& ! vis par dir SW through ice to ocean (W/m^2) - fswthrun_pardf ! via par dif SW through ice to ocean (W/m^2) + fswthrun_uvrdr,& ! uv dir SW through ice to ocean (W/m^2) + fswthrun_uvrdf,& ! uv dif SW through ice to ocean (W/m^2) + fswthrun_pardr,& ! par dir SW through ice to ocean (W/m^2) + fswthrun_pardf ! par dif SW through ice to ocean (W/m^2) real (kind=dbl_kind), dimension(:,:), intent(inout) :: & zqsn , & ! snow layer enthalpy (J m-3) From 2f31ee37f3a70a70b5e33cae43476f09dbb33da7 Mon Sep 17 00:00:00 2001 From: Tony Craig Date: Thu, 22 Jan 2026 14:56:53 -0800 Subject: [PATCH 33/34] Update version to 1.5.3 (#550) Update version to 1.5.3 and update Copyright to 2026 --- .zenodo.json | 8 ++++---- COPYRIGHT.pdf | Bin 20755 -> 20693 bytes columnphysics/icepack_intfc.F90 | 2 +- columnphysics/version.txt | 2 +- configuration/driver/icedrv_MAIN.F90 | 2 +- configuration/driver/icedrv_step.F90 | 2 +- doc/source/conf.py | 6 +++--- doc/source/intro/copyright.rst | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.zenodo.json b/.zenodo.json index 11f6453e4..f4d5dcabb 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -1,21 +1,21 @@ { "license": "BSD-3-Clause", - "copyright": "Copyright 1998-2025 Triad National Security, LLC", + "copyright": "Copyright 1998-2026 Triad National Security, LLC", "description": "View detailed release notes at https://github.com/CICE-Consortium/Icepack/releases", "language": "eng", - "title": "CICE-Consortium/Icepack: Icepack 1.5.2", + "title": "CICE-Consortium/Icepack: Icepack 1.5.3", "keywords": [ "sea ice model", "Icepack" ], - "version": "1.5.2", + "version": "1.5.3", "upload_type": "software", "communities": [ { "identifier": "cice-consortium" } ], - "publication_date": "2025-08-15", + "publication_date": "2026-01-22", "creators": [ { "affiliation": "Los Alamos National Laboratory", diff --git a/COPYRIGHT.pdf b/COPYRIGHT.pdf index 2f37e495f02302a72c6b7943cf05b5ecfe3dfb19..6a8923c9547fe437cd574f543141bf30920e1d3a 100644 GIT binary patch delta 15575 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 UnVG|}GP7}T!BJ3%D@efo53tWJVgLXD diff --git a/columnphysics/icepack_intfc.F90 b/columnphysics/icepack_intfc.F90 index 243e896d1..a1eb4f654 100644 --- a/columnphysics/icepack_intfc.F90 +++ b/columnphysics/icepack_intfc.F90 @@ -1,5 +1,5 @@ !======================================================================= -! Copyright 1998-2025 Triad National Security, LLC +! Copyright 1998-2026 Triad National Security, LLC ! All rights reserved. ! ! This program was produced under U.S. Government contract 89233218CNA000001 diff --git a/columnphysics/version.txt b/columnphysics/version.txt index cf3a4bb53..416c71391 100644 --- a/columnphysics/version.txt +++ b/columnphysics/version.txt @@ -1 +1 @@ -ICEPACK 1.5.2 +ICEPACK 1.5.3 diff --git a/configuration/driver/icedrv_MAIN.F90 b/configuration/driver/icedrv_MAIN.F90 index 6f8a6dd21..becd63868 100644 --- a/configuration/driver/icedrv_MAIN.F90 +++ b/configuration/driver/icedrv_MAIN.F90 @@ -1,5 +1,5 @@ !======================================================================= -! Copyright 1998-2025, Triad National Security, LLC +! Copyright 1998-2026, Triad National Security, LLC ! All rights reserved. ! ! This program was produced under U.S. Government contract 89233218CNA000001 diff --git a/configuration/driver/icedrv_step.F90 b/configuration/driver/icedrv_step.F90 index f25c3c9bf..f43d5a788 100644 --- a/configuration/driver/icedrv_step.F90 +++ b/configuration/driver/icedrv_step.F90 @@ -468,7 +468,7 @@ subroutine step_therm2 (dt) logical (kind=log_kind) :: & tr_fsd ! floe size distribution tracers - + character (len=char_len) :: & wave_height_type ! type of significant wave height forcing diff --git a/doc/source/conf.py b/doc/source/conf.py index 6eea3f9e5..ea7ec4942 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -55,7 +55,7 @@ # General information about the project. project = u'Icepack' -copyright = u'1998-2025, Triad National Security, LLC (code) and National Center for Atmospheric Research (documentation)' +copyright = u'1998-2026, Triad National Security, LLC (code) and National Center for Atmospheric Research (documentation)' author = u'CICE-Consortium' # The version info for the project you're documenting, acts as replacement for @@ -63,9 +63,9 @@ # built documents. # # The short X.Y version. -version = u'1.5.2' +version = u'1.5.3' # The full version, including alpha/beta/rc tags. -version = u'1.5.2' +version = u'1.5.3' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/doc/source/intro/copyright.rst b/doc/source/intro/copyright.rst index 420a6ca22..d359d19a9 100755 --- a/doc/source/intro/copyright.rst +++ b/doc/source/intro/copyright.rst @@ -5,7 +5,7 @@ Copyright ============================= -© Copyright 1998-2025, Triad National Security, LLC +© Copyright 1998-2026, Triad National Security, LLC All rights reserved. This program was produced under U.S. Government contract 89233218CNA000001 for Los Alamos National Laboratory (LANL), which is operated by Triad National Security, LLC for the U.S. Department of Energy/National Nuclear Security Administration. All rights in the program are reserved by Triad National Security, LLC, and the U.S. Department of Energy/National Nuclear Security Administration. The Government is granted for itself and others acting on its behalf a nonexclusive, paid-up, irrevocable worldwide license in this material to reproduce, prepare. derivative works, distribute copies to the public, perform publicly and display publicly, and to permit others to do so. From daa41638c6cef298583f35ee4dec5ab1bb077aea Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Wed, 28 Jan 2026 10:14:30 -0700 Subject: [PATCH 34/34] enforce minimum snow grain radius (#552) If the snow grain radius is set to zero, possibly because of zapping small ice or if ice disappears mid-timestep, then updates of snow grain radius will produce NaNs. Snow grain radius is usually bounded between a min and max so this generally doesn't happen, but a recent coupled E3SM bgc run crashed with this error. While the error seems to be relatively rare, this bug fix changes answers when the snow grain radius is nonzero but still less than the minimum. --- columnphysics/icepack_snow.F90 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/columnphysics/icepack_snow.F90 b/columnphysics/icepack_snow.F90 index 315ce4559..1d10d95bc 100644 --- a/columnphysics/icepack_snow.F90 +++ b/columnphysics/icepack_snow.F90 @@ -360,6 +360,9 @@ subroutine icepack_step_snow(dt, & hsn(n) = vsnon(n)/aicen(n) hin(n) = vicen(n)/aicen(n) endif + do k = 1, nslyr + rsnw (k,n) = max(rsnw_fall, rsnw(k,n)) + enddo enddo call update_snow_radius (dt, &