From 64cf486b1ae42151330c409283714f97a7737d65 Mon Sep 17 00:00:00 2001 From: apcraig Date: Fri, 3 Apr 2026 15:33:22 -0600 Subject: [PATCH 1/4] Update snwredist documentation Update snwredist documentation to be consistent with implementation Add check for snwredist and snw_aging_table valid values --- columnphysics/icepack_snow.F90 | 18 ++++++++++++++++++ doc/source/science_guide/sg_snow.rst | 8 +++----- doc/source/user_guide/ug_case_settings.rst | 12 +++++++----- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/columnphysics/icepack_snow.F90 b/columnphysics/icepack_snow.F90 index 1d10d95bc..b0b86e521 100644 --- a/columnphysics/icepack_snow.F90 +++ b/columnphysics/icepack_snow.F90 @@ -69,6 +69,24 @@ subroutine icepack_init_snow character (len=*),parameter :: subname='(icepack_init_snow)' + !----------------------------------------------------------------- + ! Check for valid values + !----------------------------------------------------------------- + + if (snwredist /= 'none' .and. snwredist /= 'bulk' .and. & + snwredist /= 'ITD' .and. snwredist /= 'ITDrdg') then + call icepack_warnings_setabort(.true.,__FILE__,__LINE__) + call icepack_warnings_add(subname//'ERROR: snwredist value invalid = '//trim(snwredist)) + return + endif + + if (snw_aging_table /= 'file' .and. snw_aging_table /= 'test' .and. & + snw_aging_table /= 'snicar') then + call icepack_warnings_setabort(.true.,__FILE__,__LINE__) + call icepack_warnings_add(subname//'ERROR: snw_aging_table value invalid = '//trim(snw_aging_table)) + return + endif + !----------------------------------------------------------------- ! Snow metamorphism lookup table !----------------------------------------------------------------- diff --git a/doc/source/science_guide/sg_snow.rst b/doc/source/science_guide/sg_snow.rst index 59a151c15..c16fdd795 100755 --- a/doc/source/science_guide/sg_snow.rst +++ b/doc/source/science_guide/sg_snow.rst @@ -29,9 +29,7 @@ Snow redistribution Because the thermodynamic schemes in CICE assume a uniform snow depth over each category, ignoring the fractions of level and deformed ice, effects of snow redistribution are included only via the delta-Eddington radiation scheme. The redistributed snow depth is used to determine the effective area of bare ice (for very small snow depths) and the effective area and depth of melt ponds over level ice. Once those areas are determined, the redistributed snow volume over them is known, from which the snow depth for the remaining snow-covered area can be computed and used for its radiation balance calculation. -Two basic approaches are available for snow redistribution by wind, ``snwredist`` = ``bulk``, for which a user-defined parameter :math:`p` (``snwlvlfac``) determines the ratio of snow on ridges to that on level ice, and ``snwITDrdg``, in which snow can be compacted by the wind or eroded and redeposited on other thickness categories. For both, nonlocal redistribution of snow (i.e., between grid cells) is neglected, assuming that the difference between snow mass blowing into a grid cell and that blowing out is negligible, but snow can be blown into nearby leads and open water. - - +Three basic approaches are available for snow redistribution by wind, ``snwredist`` = ``bulk``, for which a user-defined parameter :math:`p` (``snwlvlfac``) determines the ratio of snow on ridges to that on level ice, ``ITD``, in which snow can be compacted by the wind or eroded and redeposited on other thickness categories, and ``ITDrdg`` which modifies the ``ITD`` approach to use the standard deviation of the level and ridged ice thickness distribution for snow in suspension to redistribute based on ridged ice area. For all, nonlocal redistribution of snow (i.e., between grid cells) is neglected, assuming that the difference between snow mass blowing into a grid cell and that blowing out is negligible, but snow can be blown into nearby leads and open water. .. _snow_bulk: @@ -64,7 +62,7 @@ In the shortwave module for level-ice ponds, we create a new variable :math:`h_{ Snow redistribution and compaction by wind ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Following :cite:`Lecomte15`, when ``snwredist`` = ``snwITDrdg`` we parameterize the amount of snow lost into the ocean through leads or redistributed to other thickness categories by defining the redistribution function :math:`\Phi` for snow mass as the sum of an erosion rate :math:`\Phi_E` and a redeposition rate :math:`\Phi_R` for each category of thickness :math:`h_i`: +Following :cite:`Lecomte15`, when ``snwredist`` = ``ITD`` or ``ITDrdg`` we parameterize the amount of snow lost into the ocean through leads or redistributed to other thickness categories by defining the redistribution function :math:`\Phi` for snow mass as the sum of an erosion rate :math:`\Phi_E` and a redeposition rate :math:`\Phi_R` for each category of thickness :math:`h_i`: .. math:: \Phi_E = \left({\partial m \over \partial t}\right)_{erosion} = -{\gamma \over \sigma_{ITD}} \left(V-V^*\right){\rho_{max} - \rho_s \over \rho_{max}} @@ -87,7 +85,7 @@ Thus, the snow mass that is redistribution on the ice (i.e., not lost in leads) .. math:: \Phi_R \Delta t = a_i \left(1-f\right) \Phi_E \Delta t. -We extend this approach by using the level and ridged ice thicknesses to compute the standard deviation of ice thickness across all categories. That is, +We extend this approach for ``snwredist`` = ``ITDrdg`` by using the level and ridged ice thicknesses to compute the standard deviation of ice thickness across all categories. That is, .. math:: \sigma_{ITD}^2 = \sum_{n=1}^N a_{in} a_{lvln} \left(h_{ilvln}-\sum_{k=1}^N a_{ik}h_{ik}\right)^2 + a_{in} a_{rdgn} \left(h_{irdgn} - \sum_{k=1}^N a_{ik} h_{ik} \right)^2. diff --git a/doc/source/user_guide/ug_case_settings.rst b/doc/source/user_guide/ug_case_settings.rst index 256a82892..265960ec8 100644 --- a/doc/source/user_guide/ug_case_settings.rst +++ b/doc/source/user_guide/ug_case_settings.rst @@ -313,13 +313,15 @@ snow_nml "``rhosnew``", "real", "new snow density", "100.0" "``rsnw_fall``", "real", "radius of new snow (um)", "54.526" "``rsnw_tmax``", "real", "maximum snow radius (um)", "1500.0" - "``snw_aging_table``", "test", "snow aging lookup table", "test" - "", "snicar", "(not available in Icepack)", "" "``snwgrain``", "logical", "snow grain metamorphosis", ".false." "``snwlvlfac``", "real", "fraction increase in bulk snow redistribution", "0.3" - "``snwredist``", "``snwITDrdg``", "snow redistribution using ITD/ridges", "none" - "", "``bulk``", "bulk snow redistribution", "" - "", "``none``", "no snow redistribution", "" + "``snwredist``", "``bulk``", "bulk snow redistribution scheme", "``none``" + "", "``ITD``", "ITD snow redistribution scheme", "" + "", "``ITDrdg``", "ITDrdg snow redistribution scheme", "" + "", "``none``", "snow redistribution scheme off", "" + "``snw_aging_table``", "``file``", "read 1D and 3D fields for dry metamorophsis lookup table (not available in standalone Icepack)", "``test``" + "", "``snicar``", "read 3D fields for dry metamorophsis lookup table (not available in standalone Icepack)", "" + "", "``test``", "internally generated dry metamorophsis lookup table for testing", "" "``use_smliq_pnd``", "logical", "use liquid in snow for ponds", ".false." "``windmin``", "real", "minimum wind speed to compact snow", "10.0" "", "", "", "" From 257bbfbfbb9d107fc22fc310647c9292d9daa6dd Mon Sep 17 00:00:00 2001 From: apcraig Date: Fri, 3 Apr 2026 15:41:28 -0600 Subject: [PATCH 2/4] Update documentation --- doc/source/science_guide/sg_snow.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/science_guide/sg_snow.rst b/doc/source/science_guide/sg_snow.rst index c16fdd795..32b81d8d6 100755 --- a/doc/source/science_guide/sg_snow.rst +++ b/doc/source/science_guide/sg_snow.rst @@ -29,7 +29,7 @@ Snow redistribution Because the thermodynamic schemes in CICE assume a uniform snow depth over each category, ignoring the fractions of level and deformed ice, effects of snow redistribution are included only via the delta-Eddington radiation scheme. The redistributed snow depth is used to determine the effective area of bare ice (for very small snow depths) and the effective area and depth of melt ponds over level ice. Once those areas are determined, the redistributed snow volume over them is known, from which the snow depth for the remaining snow-covered area can be computed and used for its radiation balance calculation. -Three basic approaches are available for snow redistribution by wind, ``snwredist`` = ``bulk``, for which a user-defined parameter :math:`p` (``snwlvlfac``) determines the ratio of snow on ridges to that on level ice, ``ITD``, in which snow can be compacted by the wind or eroded and redeposited on other thickness categories, and ``ITDrdg`` which modifies the ``ITD`` approach to use the standard deviation of the level and ridged ice thickness distribution for snow in suspension to redistribute based on ridged ice area. For all, nonlocal redistribution of snow (i.e., between grid cells) is neglected, assuming that the difference between snow mass blowing into a grid cell and that blowing out is negligible, but snow can be blown into nearby leads and open water. +Three basic approaches are available for snow redistribution by wind, ``snwredist`` = ``bulk``, for which a user-defined parameter :math:`p` (``snwlvlfac``) determines the ratio of snow on ridges to that on level ice, ``snwredist`` = ``ITD``, in which snow can be compacted by the wind or eroded and redeposited on other thickness categories, and ``snwredist`` = ``ITDrdg`` which modifies the ``ITD`` approach to use the standard deviation of the level and ridged ice thickness distribution for snow in suspension to redistribute based on ridged ice area. For all, nonlocal redistribution of snow (i.e., between grid cells) is neglected, assuming that the difference between snow mass blowing into a grid cell and that blowing out is negligible, but snow can be blown into nearby leads and open water. .. _snow_bulk: From a8c5df13d8602a0264e1ac37144708b36d317798 Mon Sep 17 00:00:00 2001 From: apcraig Date: Tue, 7 Apr 2026 20:06:40 -0600 Subject: [PATCH 3/4] Update documentation and checks to support only snwredist = [none,bulk,ITDrdg] --- columnphysics/icepack_snow.F90 | 16 +++++++++------- doc/source/science_guide/sg_snow.rst | 6 +++--- doc/source/user_guide/ug_case_settings.rst | 1 - 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/columnphysics/icepack_snow.F90 b/columnphysics/icepack_snow.F90 index b0b86e521..fc4494a58 100644 --- a/columnphysics/icepack_snow.F90 +++ b/columnphysics/icepack_snow.F90 @@ -74,17 +74,19 @@ subroutine icepack_init_snow !----------------------------------------------------------------- if (snwredist /= 'none' .and. snwredist /= 'bulk' .and. & - snwredist /= 'ITD' .and. snwredist /= 'ITDrdg') then + snwredist /= 'ITDrdg') then call icepack_warnings_setabort(.true.,__FILE__,__LINE__) call icepack_warnings_add(subname//'ERROR: snwredist value invalid = '//trim(snwredist)) return endif - if (snw_aging_table /= 'file' .and. snw_aging_table /= 'test' .and. & - snw_aging_table /= 'snicar') then - call icepack_warnings_setabort(.true.,__FILE__,__LINE__) - call icepack_warnings_add(subname//'ERROR: snw_aging_table value invalid = '//trim(snw_aging_table)) - return + if (snwgrain) then + if (snw_aging_table /= 'file' .and. snw_aging_table /= 'test' .and. & + snw_aging_table /= 'snicar') then + call icepack_warnings_setabort(.true.,__FILE__,__LINE__) + call icepack_warnings_add(subname//'ERROR: snw_aging_table value invalid = '//trim(snw_aging_table)) + return + endif endif !----------------------------------------------------------------- @@ -248,7 +250,7 @@ subroutine icepack_init_snow call icepack_warnings_add(subname//'ERROR: snw_aging_table value') return endif - endif + endif ! snwgrain end subroutine icepack_init_snow diff --git a/doc/source/science_guide/sg_snow.rst b/doc/source/science_guide/sg_snow.rst index 32b81d8d6..e05dc3b33 100755 --- a/doc/source/science_guide/sg_snow.rst +++ b/doc/source/science_guide/sg_snow.rst @@ -29,7 +29,7 @@ Snow redistribution Because the thermodynamic schemes in CICE assume a uniform snow depth over each category, ignoring the fractions of level and deformed ice, effects of snow redistribution are included only via the delta-Eddington radiation scheme. The redistributed snow depth is used to determine the effective area of bare ice (for very small snow depths) and the effective area and depth of melt ponds over level ice. Once those areas are determined, the redistributed snow volume over them is known, from which the snow depth for the remaining snow-covered area can be computed and used for its radiation balance calculation. -Three basic approaches are available for snow redistribution by wind, ``snwredist`` = ``bulk``, for which a user-defined parameter :math:`p` (``snwlvlfac``) determines the ratio of snow on ridges to that on level ice, ``snwredist`` = ``ITD``, in which snow can be compacted by the wind or eroded and redeposited on other thickness categories, and ``snwredist`` = ``ITDrdg`` which modifies the ``ITD`` approach to use the standard deviation of the level and ridged ice thickness distribution for snow in suspension to redistribute based on ridged ice area. For all, nonlocal redistribution of snow (i.e., between grid cells) is neglected, assuming that the difference between snow mass blowing into a grid cell and that blowing out is negligible, but snow can be blown into nearby leads and open water. +Two basic approaches are available for snow redistribution by wind, ``snwredist`` = ``bulk``, for which a user-defined parameter :math:`p` (``snwlvlfac``) determines the ratio of snow on ridges to that on level ice and ``snwredist`` = ``ITDrdg`` in which snow can be compacted by the wind or eroded and redeposited on other thickness categories based on the standard deviation of the level and ridged ice thickness distribution. For both, nonlocal redistribution of snow (i.e., between grid cells) is neglected, assuming that the difference between snow mass blowing into a grid cell and that blowing out is negligible, but snow can be blown into nearby leads and open water. .. _snow_bulk: @@ -62,7 +62,7 @@ In the shortwave module for level-ice ponds, we create a new variable :math:`h_{ Snow redistribution and compaction by wind ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Following :cite:`Lecomte15`, when ``snwredist`` = ``ITD`` or ``ITDrdg`` we parameterize the amount of snow lost into the ocean through leads or redistributed to other thickness categories by defining the redistribution function :math:`\Phi` for snow mass as the sum of an erosion rate :math:`\Phi_E` and a redeposition rate :math:`\Phi_R` for each category of thickness :math:`h_i`: +Following :cite:`Lecomte15`, when ``snwredist`` = ``ITDrdg`` we parameterize the amount of snow lost into the ocean through leads or redistributed to other thickness categories by defining the redistribution function :math:`\Phi` for snow mass as the sum of an erosion rate :math:`\Phi_E` and a redeposition rate :math:`\Phi_R` for each category of thickness :math:`h_i`: .. math:: \Phi_E = \left({\partial m \over \partial t}\right)_{erosion} = -{\gamma \over \sigma_{ITD}} \left(V-V^*\right){\rho_{max} - \rho_s \over \rho_{max}} @@ -85,7 +85,7 @@ Thus, the snow mass that is redistribution on the ice (i.e., not lost in leads) .. math:: \Phi_R \Delta t = a_i \left(1-f\right) \Phi_E \Delta t. -We extend this approach for ``snwredist`` = ``ITDrdg`` by using the level and ridged ice thicknesses to compute the standard deviation of ice thickness across all categories. That is, +We extend this approach by using the level and ridged ice thicknesses to compute the standard deviation of ice thickness across all categories. That is, .. math:: \sigma_{ITD}^2 = \sum_{n=1}^N a_{in} a_{lvln} \left(h_{ilvln}-\sum_{k=1}^N a_{ik}h_{ik}\right)^2 + a_{in} a_{rdgn} \left(h_{irdgn} - \sum_{k=1}^N a_{ik} h_{ik} \right)^2. diff --git a/doc/source/user_guide/ug_case_settings.rst b/doc/source/user_guide/ug_case_settings.rst index 265960ec8..a24a0b794 100644 --- a/doc/source/user_guide/ug_case_settings.rst +++ b/doc/source/user_guide/ug_case_settings.rst @@ -316,7 +316,6 @@ snow_nml "``snwgrain``", "logical", "snow grain metamorphosis", ".false." "``snwlvlfac``", "real", "fraction increase in bulk snow redistribution", "0.3" "``snwredist``", "``bulk``", "bulk snow redistribution scheme", "``none``" - "", "``ITD``", "ITD snow redistribution scheme", "" "", "``ITDrdg``", "ITDrdg snow redistribution scheme", "" "", "``none``", "snow redistribution scheme off", "" "``snw_aging_table``", "``file``", "read 1D and 3D fields for dry metamorophsis lookup table (not available in standalone Icepack)", "``test``" From 0fafe80cdfd728ef955136e8596f18906b0ee2de Mon Sep 17 00:00:00 2001 From: apcraig Date: Wed, 8 Apr 2026 17:52:49 -0600 Subject: [PATCH 4/4] Update documentation --- doc/source/science_guide/sg_snow.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/science_guide/sg_snow.rst b/doc/source/science_guide/sg_snow.rst index e05dc3b33..f85e1a36b 100755 --- a/doc/source/science_guide/sg_snow.rst +++ b/doc/source/science_guide/sg_snow.rst @@ -29,7 +29,7 @@ Snow redistribution Because the thermodynamic schemes in CICE assume a uniform snow depth over each category, ignoring the fractions of level and deformed ice, effects of snow redistribution are included only via the delta-Eddington radiation scheme. The redistributed snow depth is used to determine the effective area of bare ice (for very small snow depths) and the effective area and depth of melt ponds over level ice. Once those areas are determined, the redistributed snow volume over them is known, from which the snow depth for the remaining snow-covered area can be computed and used for its radiation balance calculation. -Two basic approaches are available for snow redistribution by wind, ``snwredist`` = ``bulk``, for which a user-defined parameter :math:`p` (``snwlvlfac``) determines the ratio of snow on ridges to that on level ice and ``snwredist`` = ``ITDrdg`` in which snow can be compacted by the wind or eroded and redeposited on other thickness categories based on the standard deviation of the level and ridged ice thickness distribution. For both, nonlocal redistribution of snow (i.e., between grid cells) is neglected, assuming that the difference between snow mass blowing into a grid cell and that blowing out is negligible, but snow can be blown into nearby leads and open water. +Two basic approaches are available for snow redistribution by wind, ``snwredist`` = ``bulk``, for which a user-defined parameter :math:`p` (``snwlvlfac``) determines the ratio of snow on ridges to that on level ice, and ``snwredist`` = ``ITDrdg``, in which snow can be compacted by the wind or eroded and redeposited on other thickness categories based on the standard deviation of the level and ridged ice thickness distribution. For both, nonlocal redistribution of snow (i.e., between grid cells) is neglected, assuming that the difference between snow mass blowing into a grid cell and that blowing out is negligible, but snow can be blown into nearby leads and open water. .. _snow_bulk: