Skip to content

Commit a221335

Browse files
reedmaxwellReedclaudesmithsg84
authored
Feature: CLM snow parameterization options (parflow#695)
## Summary Add configurable snow parameterization options for CLM. ## New Features - **Rain-snow partitioning:** CLM, WetbulbThreshold, WetbulbLinear methods - **Thin snow damping:** Prevents spurious early-season melt from warm ground - **Albedo schemes:** CLM, VIC, Tarboton temperature-dependent aging ## New Keys (12 total) - `Solver.CLM.SnowPartition`, `WetbulbThreshold` - `Solver.CLM.ThinSnowDamping`, `ThinSnowThreshold` - `Solver.CLM.AlbedoScheme`, `AlbedoVisNew`, `AlbedoNirNew`, `AlbedoMin` - `Solver.CLM.AlbedoDecayVis`, `AlbedoDecayNir`, `AlbedoAccumA`, `AlbedoThawA` ## Changes - YAML schema with types, defaults, and bounds - RST documentation with physics background - 3 bibliography references - 3 Python tests with reference outputs ## References - Wang et al. (2019) GRL, doi:10.1029/2019GL085722 - Tarboton & Luce (1996) WRR, doi:10.1029/96WR01049 - Andreadis et al. (2009) JHM ## Test Plan - [x] `clm_snow_defaults` - backward compatibility - [x] `clm_snow_partition` - WetbulbThreshold method - [x] `clm_snow_albedo` - Tarboton scheme All pass via `ctest -R clm_snow` --------- Co-authored-by: Reed <rmaxwell@mines.edu> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Steven Smith <smith84@llnl.gov>
1 parent 52120cb commit a221335

96 files changed

Lines changed: 2037 additions & 65 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

docs/user_manual/keys.rst

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6337,6 +6337,182 @@ to be active.
63376337
<runname>.Solver.CLM.UseSlopeAspect = True ## Python syntax
63386338

63396339

6340+
.. _CLM Snow Parameterization:
6341+
6342+
CLM Snow Parameterization
6343+
^^^^^^^^^^^^^^^^^^^^^^^^^
6344+
6345+
These keys control snow physics options for improved snow modeling.
6346+
All keys default to backward-compatible behavior when not set.
6347+
Note that ``CLM`` must be compiled and linked at runtime for these
6348+
options to be active.
6349+
6350+
**Rain-Snow Partitioning**
6351+
6352+
Standard ``CLM`` uses air temperature to partition precipitation into rain
6353+
and snow. However, falling hydrometeors cool via evaporation, making
6354+
wet-bulb temperature a better predictor, especially in dry mountain
6355+
climates where snow can persist at air temperatures above 0°C.
6356+
Reference: :cite:p:`Wang2019`.
6357+
6358+
*string* **Solver.CLM.SnowPartition** CLM Selects the method for
6359+
partitioning precipitation into rain and snow. The valid types for
6360+
this key are **CLM**, **WetbulbThreshold**, **WetbulbLinear**.
6361+
6362+
**CLM**:
6363+
Standard air temperature threshold with linear transition (default).
6364+
6365+
**WetbulbThreshold**:
6366+
Sharp threshold at wet-bulb temperature. Better for dry mountain climates.
6367+
6368+
**WetbulbLinear**:
6369+
Linear transition around wet-bulb temperature threshold.
6370+
6371+
.. container:: list
6372+
6373+
::
6374+
6375+
pfset Solver.CLM.SnowPartition "WetbulbThreshold" ## TCL syntax
6376+
<runname>.Solver.CLM.SnowPartition = "WetbulbThreshold" ## Python syntax
6377+
6378+
*double* **Solver.CLM.WetbulbThreshold** 274.15 Threshold temperature in
6379+
Kelvin for wetbulb partitioning methods. Default 274.15 K (1°C). Only
6380+
used when ``Solver.CLM.SnowPartition`` is ``WetbulbThreshold`` or
6381+
``WetbulbLinear``.
6382+
6383+
.. container:: list
6384+
6385+
::
6386+
6387+
pfset Solver.CLM.WetbulbThreshold 274.15 ## TCL syntax
6388+
<runname>.Solver.CLM.WetbulbThreshold = 274.15 ## Python syntax
6389+
6390+
**Thin Snow Damping**
6391+
6392+
Thin early-season snowpacks can experience spurious melt due to warm
6393+
ground heat flux. This option reduces melt energy for shallow snowpacks
6394+
to prevent premature ablation.
6395+
6396+
*double* **Solver.CLM.ThinSnowDamping** 1.0 Fraction of melt energy
6397+
retained for thin snowpacks. A value of 1.0 means no damping (default,
6398+
backward compatible). A value of 0.1 means only 10% of melt energy is
6399+
applied (90% reduction).
6400+
6401+
.. container:: list
6402+
6403+
::
6404+
6405+
pfset Solver.CLM.ThinSnowDamping 0.3 ## TCL syntax
6406+
<runname>.Solver.CLM.ThinSnowDamping = 0.3 ## Python syntax
6407+
6408+
*double* **Solver.CLM.ThinSnowThreshold** 50.0 Snow water equivalent
6409+
threshold in mm below which thin snow damping applies.
6410+
6411+
.. container:: list
6412+
6413+
::
6414+
6415+
pfset Solver.CLM.ThinSnowThreshold 50.0 ## TCL syntax
6416+
<runname>.Solver.CLM.ThinSnowThreshold = 50.0 ## Python syntax
6417+
6418+
**Albedo Schemes**
6419+
6420+
Snow albedo controls the radiation balance and strongly influences melt
6421+
timing. Three schemes are available:
6422+
6423+
*string* **Solver.CLM.AlbedoScheme** CLM Snow albedo calculation method.
6424+
The valid types for this key are **CLM**, **VIC**, **Tarboton**.
6425+
6426+
**CLM**:
6427+
Age-based exponential decay using the snowage variable (default).
6428+
6429+
**VIC**:
6430+
Separate decay rates for cold (accumulating) and warm (melting)
6431+
conditions based on ground temperature. Reference: :cite:p:`Andreadis2009`.
6432+
6433+
**Tarboton**:
6434+
Arrhenius temperature-dependent aging where decay accelerates near
6435+
the melting point. Reference: :cite:p:`Tarboton1996`.
6436+
6437+
.. container:: list
6438+
6439+
::
6440+
6441+
pfset Solver.CLM.AlbedoScheme "Tarboton" ## TCL syntax
6442+
<runname>.Solver.CLM.AlbedoScheme = "Tarboton" ## Python syntax
6443+
6444+
*double* **Solver.CLM.AlbedoVisNew** 0.95 Fresh snow visible-band albedo.
6445+
Physically ranges 0.85-0.98.
6446+
6447+
.. container:: list
6448+
6449+
::
6450+
6451+
pfset Solver.CLM.AlbedoVisNew 0.95 ## TCL syntax
6452+
<runname>.Solver.CLM.AlbedoVisNew = 0.95 ## Python syntax
6453+
6454+
*double* **Solver.CLM.AlbedoNirNew** 0.65 Fresh snow near-infrared albedo.
6455+
Physically ranges 0.5-0.7.
6456+
6457+
.. container:: list
6458+
6459+
::
6460+
6461+
pfset Solver.CLM.AlbedoNirNew 0.65 ## TCL syntax
6462+
<runname>.Solver.CLM.AlbedoNirNew = 0.65 ## Python syntax
6463+
6464+
*double* **Solver.CLM.AlbedoMin** 0.4 Minimum snow albedo floor for aged
6465+
or dirty snow.
6466+
6467+
.. container:: list
6468+
6469+
::
6470+
6471+
pfset Solver.CLM.AlbedoMin 0.4 ## TCL syntax
6472+
<runname>.Solver.CLM.AlbedoMin = 0.4 ## Python syntax
6473+
6474+
*double* **Solver.CLM.AlbedoDecayVis** 0.5 Visible albedo decay coefficient
6475+
for ``CLM`` and ``Tarboton`` schemes.
6476+
6477+
.. container:: list
6478+
6479+
::
6480+
6481+
pfset Solver.CLM.AlbedoDecayVis 0.5 ## TCL syntax
6482+
<runname>.Solver.CLM.AlbedoDecayVis = 0.5 ## Python syntax
6483+
6484+
*double* **Solver.CLM.AlbedoDecayNir** 0.2 NIR albedo decay coefficient
6485+
for ``CLM`` and ``Tarboton`` schemes. NIR typically decays faster than visible.
6486+
6487+
.. container:: list
6488+
6489+
::
6490+
6491+
pfset Solver.CLM.AlbedoDecayNir 0.2 ## TCL syntax
6492+
<runname>.Solver.CLM.AlbedoDecayNir = 0.2 ## Python syntax
6493+
6494+
*double* **Solver.CLM.AlbedoAccumA** 0.94 VIC scheme cold-phase
6495+
(accumulation) decay base per hour. Should be greater than ``AlbedoThawA``.
6496+
6497+
.. container:: list
6498+
6499+
::
6500+
6501+
pfset Solver.CLM.AlbedoAccumA 0.94 ## TCL syntax
6502+
<runname>.Solver.CLM.AlbedoAccumA = 0.94 ## Python syntax
6503+
6504+
*double* **Solver.CLM.AlbedoThawA** 0.82 VIC scheme melt-phase decay base
6505+
per hour. Should be less than ``AlbedoAccumA`` since melt conditions age
6506+
snow faster.
6507+
6508+
.. container:: list
6509+
6510+
::
6511+
6512+
pfset Solver.CLM.AlbedoThawA 0.82 ## TCL syntax
6513+
<runname>.Solver.CLM.AlbedoThawA = 0.82 ## Python syntax
6514+
6515+
63406516
.. _ParFlow NetCDF4 Parallel I/O:
63416517

63426518
ParFlow NetCDF4 Parallel I/O

docs/user_manual/refs.bib

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1378,3 +1378,36 @@ @misc{endian
13781378
title = {Endianness --- Wikipedia, The Free Encyclopedia},
13791379
url = {http://en.wikipedia.org/wiki/Endianness},
13801380
}
1381+
1382+
@article{Wang2019,
1383+
author = {Wang, Y. and Broxton, P. and Fang, Y. and Behrangi, A. and Barlage, M. and Zeng, X. and Niu, G.},
1384+
journal = {Geophysical Research Letters},
1385+
number = {22},
1386+
pages = {13104--13113},
1387+
title = {A Wet-Bulb Temperature-Based Rain-Snow Partitioning Scheme Improves Snowpack Prediction Over the Drier Western United States},
1388+
volume = {46},
1389+
year = {2019},
1390+
doi = {10.1029/2019GL085722},
1391+
}
1392+
1393+
@article{Andreadis2009,
1394+
author = {Andreadis, K. M. and Storck, P. and Lettenmaier, D. P.},
1395+
journal = {Journal of Hydrometeorology},
1396+
number = {6},
1397+
pages = {1379--1395},
1398+
title = {Modeling Snow Accumulation and Ablation Processes in Forested Environments},
1399+
volume = {10},
1400+
year = {2009},
1401+
doi = {10.1175/2009JHM1083.1},
1402+
}
1403+
1404+
@article{Tarboton1996,
1405+
author = {Tarboton, D. G. and Luce, C. H.},
1406+
journal = {Water Resources Research},
1407+
number = {4},
1408+
pages = {1195--1207},
1409+
title = {Utah Energy Balance Snow Accumulation and Melt Model (UEB)},
1410+
volume = {32},
1411+
year = {1996},
1412+
doi = {10.1029/96WR01049},
1413+
}

pf-keys/definitions/solver.yaml

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,146 @@ Solver:
494494
BoolDomain:
495495
RequiresModule: CLM
496496

497+
# -----------------------------------------------------------------------------
498+
# CLM Snow Parameterization Keys
499+
# -----------------------------------------------------------------------------
500+
501+
SnowPartition:
502+
help: >
503+
[Type: string] Selects the rain-snow partitioning method. CLM uses air
504+
temperature threshold, while wetbulb methods account for evaporative
505+
cooling of falling hydrometeors. Reference: Wang et al. (2019) GRL.
506+
default: CLM
507+
domains:
508+
EnumDomain:
509+
enum_list:
510+
- CLM
511+
- WetbulbThreshold
512+
- WetbulbLinear
513+
RequiresModule: CLM
514+
515+
WetbulbThreshold:
516+
help: >
517+
[Type: double] Threshold temperature (K) for wetbulb rain-snow partitioning.
518+
Default 274.15 K (1 degree C). Only used when SnowPartition is WetbulbThreshold
519+
or WetbulbLinear.
520+
default: 274.15
521+
domains:
522+
DoubleValue:
523+
min_value: 268.15
524+
max_value: 278.15
525+
RequiresModule: CLM
526+
527+
ThinSnowDamping:
528+
help: >
529+
[Type: double] Fraction of melt energy retained for thin snowpacks.
530+
1.0 = no damping (default, backward compatible), 0.1 = 90% energy reduction.
531+
Prevents spurious early-season melt from warm ground heat flux.
532+
default: 1.0
533+
domains:
534+
DoubleValue:
535+
min_value: 0.0
536+
max_value: 1.0
537+
RequiresModule: CLM
538+
539+
ThinSnowThreshold:
540+
help: >
541+
[Type: double] SWE threshold (mm) below which thin snow damping applies.
542+
default: 50.0
543+
domains:
544+
DoubleValue:
545+
min_value: 1.0
546+
max_value: 500.0
547+
RequiresModule: CLM
548+
549+
AlbedoScheme:
550+
help: >
551+
[Type: string] Snow albedo calculation method. CLM uses age-based decay,
552+
VIC uses separate cold/melt decay rates based on ground temperature,
553+
Tarboton uses Arrhenius temperature-dependent aging.
554+
References: Andreadis et al. (2009), Tarboton and Luce (1996).
555+
default: CLM
556+
domains:
557+
EnumDomain:
558+
enum_list:
559+
- CLM
560+
- VIC
561+
- Tarboton
562+
RequiresModule: CLM
563+
564+
AlbedoVisNew:
565+
help: >
566+
[Type: double] Fresh snow visible-band albedo. Physically ranges 0.85-0.98.
567+
default: 0.95
568+
domains:
569+
DoubleValue:
570+
min_value: 0.80
571+
max_value: 0.99
572+
RequiresModule: CLM
573+
574+
AlbedoNirNew:
575+
help: >
576+
[Type: double] Fresh snow near-infrared albedo. Physically ranges 0.5-0.7.
577+
default: 0.65
578+
domains:
579+
DoubleValue:
580+
min_value: 0.40
581+
max_value: 0.85
582+
RequiresModule: CLM
583+
584+
AlbedoMin:
585+
help: >
586+
[Type: double] Minimum snow albedo floor for aged or dirty snow.
587+
default: 0.4
588+
domains:
589+
DoubleValue:
590+
min_value: 0.2
591+
max_value: 0.7
592+
RequiresModule: CLM
593+
594+
AlbedoDecayVis:
595+
help: >
596+
[Type: double] Visible albedo decay coefficient for CLM and Tarboton schemes.
597+
default: 0.5
598+
domains:
599+
DoubleValue:
600+
min_value: 0.1
601+
max_value: 2.0
602+
RequiresModule: CLM
603+
604+
AlbedoDecayNir:
605+
help: >
606+
[Type: double] NIR albedo decay coefficient for CLM and Tarboton schemes.
607+
NIR typically decays faster than visible.
608+
default: 0.2
609+
domains:
610+
DoubleValue:
611+
min_value: 0.05
612+
max_value: 1.0
613+
RequiresModule: CLM
614+
615+
AlbedoAccumA:
616+
help: >
617+
[Type: double] VIC scheme cold-phase (accumulation) decay base per hour.
618+
Should be greater than AlbedoThawA.
619+
default: 0.94
620+
domains:
621+
DoubleValue:
622+
min_value: 0.80
623+
max_value: 0.99
624+
RequiresModule: CLM
625+
626+
AlbedoThawA:
627+
help: >
628+
[Type: double] VIC scheme melt-phase decay base per hour.
629+
Should be less than AlbedoAccumA since melt conditions age snow faster.
630+
default: 0.82
631+
domains:
632+
DoubleValue:
633+
min_value: 0.70
634+
max_value: 0.95
635+
RequiresModule: CLM
636+
497637
# -----------------------------------------------------------------------------
498638
# CLM input variables to write drv_clmin.dat (Input) and drv_vegp.dat (VegParams) files
499639
# -----------------------------------------------------------------------------

0 commit comments

Comments
 (0)