Skip to content

Add lake- and landice-specific exports to support budget closure - #1553

Draft
gmao-qliu wants to merge 12 commits into
developfrom
feature/qliu/add_lake_export_variables
Draft

gmao-qliu wants to merge 12 commits into
developfrom
feature/qliu/add_lake_export_variables

Conversation

@gmao-qliu

@gmao-qliu gmao-qliu commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

Adds exports needed to close the lake's water and energy budgets in post processing.

  • PRLAKE, SNOLAKE: total precipitation and snowfall over lake tiles; snowfall needed to calculate extra fusion-heat term in energy balance.
  • DHLAKE: rate of change of total lake heat content (similar to DHLAND/ECHANGE in Catchment GC).
  • FRLAKEICE: ice fraction(FR(:, ICE)), needed to evaluate the fusion heat sink from exports alone.
  • WNETFLUXLAKE: net water flux into lake (=precip-minus-evap). Same as "runoff" from Lake GC, but in Surface this diagnostic is averaged only over lake tiles

Tested with a 1-year GEOSldas offline simulation, and the annual energy and budgets based on lat/lon output are close to zero.
energy_balance: 0 = LWND + SWND - SH - LH - DHLAKE - MAPL_ALHF * (1. - FRLAKEICE) * SNOLAKE
water_balance: 0 = PRLAKE - EVAP - WNETFLUXLAKE


Balance computed from hourly averages:
TS_lake_EW_balance


Balance computed from daily averages (approximates fusion-heat term, where average of product is different from product of averages ):
Map_lake_202101-202112
TS_lake_EW_balance

@gmao-qliu gmao-qliu added the 0 diff The changes in this pull request have verified to be zero-diff with the target branch. label Oct 23, 2026
@gmao-rreichle gmao-rreichle added the enhancement New feature or request label Oct 23, 2026
@gmao-rreichle gmao-rreichle changed the title Add RAINF, SNOWF, DHLAKE, and FRLAKEICE exports to Lake GC for budget closure Add lake-specific exports to support Lake budget closure Oct 23, 2026
@gmao-rreichle

Copy link
Copy Markdown
Contributor

Thanks, @gmao-qliu, for putting this together! I made a few changes, consisting primarily of slightly changing/renaming the budget terms. I also added the exports into Surface, so they become available for GCM runs.
PRLAKE and SNOLAKE are meant to mirror PRLAND and SNOLAND from Catch.
Rather than use RUNOFF for the lake water budget, I added the same diagnostic with a different name that is (i) less confusing and (ii) does not interfere with the "runoff" diagnostic in Surface GC (which is averaged across land, landice, and lake).
Please take a look and let me know if you find anything wrong with my commits.

@gmao-qliu

gmao-qliu commented Oct 23, 2026 via email

Copy link
Copy Markdown
Contributor Author

@gmao-rreichle gmao-rreichle left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

see comment below

Comment on lines 1680 to 1681
real, parameter :: LAKECAP = (MAPL_RHOWTR*MAPL_CAPWTR*LAKEDEPTH )
real, parameter :: LAKEICECAP = (MAPL_RHOWTR*MAPL_CAPWTR*LAKEICEDEPTH )

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm a bit confused why liquid water values for density (RHOWTR) and specific heat (CAPWTR) are used to determine the lake ice heat capacity. MAPL does have CAPICE here:

real, parameter              :: MAPL_CAPICE                    = 2000.                          ! J/(K kg)
real, parameter              :: MAPL_CAPWTR                    = 4218.                          ! J/(K kg)
real, parameter              :: MAPL_RHOWTR                    = 1000.                          ! kg/m^3

A quick internet search suggests a density of bubble-free lake ice around 917 kg/m3, which happens to be the value for sea ice in MAPL:

real, parameter              :: MAPL_RHO_SEAICE                = 917.0                          ! sea ice   density [kg/m^3]

For sea ice, the interwebs suggest a density of something like 910 kg/m3 and lower. I'm not an expert on lake or sea ice, and I don't know what's actually used in sea ice calculations, but at least for lakes there's probably some potential for improvement.

Having said that, the heat capacity used by the lake model includes a layer thickness ("depth") in the calculation, and the ice layer thickness value might have been calibrated to produce a lake ice heat capacity that worked in the GCM of yore.

cc: @lcandre2 @zhaobin74 @gmao-qliu @amfox37 @wmputman @biljanaorescanin

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that you are correct, that the LAKEICECAP should use a ice density, not the water density. This issue also shows up in the Landice gridcomp calculation of LANDICECAP, which also uses water density, not ice density (~917 for land ice).

@gmao-rreichle

Copy link
Copy Markdown
Contributor

Rolf, I see you renamed runoff, precip and sno as WNETFLUXLAKE, PRLAKE and SNOLAKE. Other export variables don't have 'LAKE' in the name. I'd like to confirm that you prefer to keep 'LAKE' there?

Including "LAKE" in the name is intentional. Without giving the export a lake-specific name, Surface will average over the same-name quantities from tile of other surface types (i.e., land and landice). E.g., to get just land precipitation from Catch, we have an export called "PRLAND".

@gmao-rreichle

Copy link
Copy Markdown
Contributor

@gmao-qliu : One more thing:

In the intro comment, I changed the fusion heat term in the balance equation to the following:

MAPL_ALHF * FRLAKEICE * SNOWF

Before it was

MAPL_ALHF * (1 - FRLAKEICE) * SNOWF

which seemed wrong. Was this a typo in the original comment, or am I missing something?

@gmao-qliu

Copy link
Copy Markdown
Contributor Author

@gmao-qliu : One more thing:

In the intro comment, I changed the fusion heat term in the balance equation to the following:

MAPL_ALHF * FRLAKEICE * SNOWF

Before it was

MAPL_ALHF * (1 - FRLAKEICE) * SNOWF

which seemed wrong. Was this a typo in the original comment, or am I missing something?

The original should be correct because the snow fusion heat term applies only to the water subtile (1-FRLAKEICE).

@gmao-rreichle

Copy link
Copy Markdown
Contributor

The original should be correct because the snow fusion heat term applies only to the water subtile (1-FRLAKEICE).

Thanks, I see now. This is for snow falling on the unfrozen lake portion! I restored the original equation in the comment.

@gmao-rreichle gmao-rreichle changed the title Add lake-specific exports to support Lake budget closure Add lake- and landice-specific exports to support budget closure Nov 5, 2026
LANDICECAP = (MAPL_RHOWTR*MAPL_CAPICE*LANDICEDEPTH)
LANDICECAP = (MAPL_RHOWTR*MAPL_CAPICE*LANDICEDEPTH) !I dont think this is currently used for anything and I am not sure that it is correct because it uses water density, not ice density.
! calculate the heat content of the top layer at the start of the timestep to calculate DHGLC
ENTOP0 = HTSN(:,1) + FR(:,ICE) * MAPL_CAPICE*RHOICE*DZMAXI(1) * (TICE(:,ICE,1) - MAPL_TICE)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@lcandre2 : If I'm reading this correctly, only the top layers of snow and ice are included. Shouldn't the total energy in the system be computed from all layers? Unless layers 2:N are not connected to the rest of the system, using just the top-layer wouldn't close the budget, I think.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We normally do only the top layer -- my plan is to include both. Currently getting this to work.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

0 diff The changes in this pull request have verified to be zero-diff with the target branch. enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants