Skip to content
Open
22 changes: 17 additions & 5 deletions config_src/drivers/FMS_cap/MOM_surface_forcing_gfdl.F90
Original file line number Diff line number Diff line change
Expand Up @@ -184,10 +184,11 @@ module MOM_surface_forcing_gfdl
real, pointer, dimension(:,:) :: sw_flux_vis_dif =>NULL() !< diffuse visible sw radiation [W m-2]
real, pointer, dimension(:,:) :: sw_flux_nir_dir =>NULL() !< direct Near InfraRed sw radiation [W m-2]
real, pointer, dimension(:,:) :: sw_flux_nir_dif =>NULL() !< diffuse Near InfraRed sw radiation [W m-2]
real, pointer, dimension(:,:) :: lprec =>NULL() !< mass flux of liquid precip [kg m-2 s-1]
real, pointer, dimension(:,:) :: fprec =>NULL() !< mass flux of frozen precip [kg m-2 s-1]
real, pointer, dimension(:,:) :: runoff =>NULL() !< mass flux of liquid runoff [kg m-2 s-1]
real, pointer, dimension(:,:) :: calving =>NULL() !< mass flux of frozen runoff [kg m-2 s-1]
real, pointer, dimension(:,:) :: lprec =>NULL() !< mass flux of liquid precip [kg m-2 s-1]
real, pointer, dimension(:,:) :: fprec =>NULL() !< mass flux of frozen precip [kg m-2 s-1]
real, pointer, dimension(:,:) :: seaice_melt =>NULL() !< mass flux of melted sea ice [kg m-2 s-1]
real, pointer, dimension(:,:) :: runoff =>NULL() !< mass flux of liquid runoff [kg m-2 s-1]
real, pointer, dimension(:,:) :: calving =>NULL() !< mass flux of frozen runoff [kg m-2 s-1]
real, pointer, dimension(:,:) :: stress_mag =>NULL() !< The time-mean magnitude of the stress on the ocean [Pa]
real, pointer, dimension(:,:) :: ustar_berg =>NULL() !< frictional velocity beneath icebergs [m s-1]
real, pointer, dimension(:,:) :: area_berg =>NULL() !< fractional area covered by icebergs [m2 m-2]
Expand Down Expand Up @@ -446,6 +447,12 @@ subroutine convert_IOB_to_fluxes(IOB, fluxes, index_bounds, Time, valid_time, G,
call check_mask_val_consistency(IOB%fprec(i-i0,j-j0), G%mask2dT(i,j), i, j, 'fprec', G)
endif

if (associated(IOB%seaice_melt)) then
fluxes%seaice_melt(i,j) = kg_m2_s_conversion * IOB%seaice_melt(i-i0,j-j0) * G%mask2dT(i,j)
if (CS%check_no_land_fluxes) &
call check_mask_val_consistency(IOB%seaice_melt(i-i0,j-j0), G%mask2dT(i,j), i, j, 'seaice_melt', G)
endif

if (associated(IOB%q_flux)) then
fluxes%evap(i,j) = - kg_m2_s_conversion * IOB%q_flux(i-i0,j-j0) * G%mask2dT(i,j)
if (CS%check_no_land_fluxes) &
Expand Down Expand Up @@ -604,7 +611,7 @@ subroutine convert_IOB_to_fluxes(IOB, fluxes, index_bounds, Time, valid_time, G,
if (CS%use_net_FW_adjustment_sign_bug) sign_for_net_FW_bug = -1.
do j=js,je ; do i=is,ie
net_FW(i,j) = US%RZ_T_to_kg_m2s* &
(((fluxes%lprec(i,j) + fluxes%fprec(i,j)) + &
(((fluxes%lprec(i,j) + fluxes%fprec(i,j) + fluxes%seaice_melt(i,j)) + &
(fluxes%lrunoff(i,j) + fluxes%frunoff(i,j))) + &
(fluxes%evap(i,j) + fluxes%vprec(i,j)) ) * US%L_to_m**2*G%areaT(i,j)
! The following contribution appears to be calculating the volume flux of sea-ice
Copy link

Choose a reason for hiding this comment

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

I think that seaice_melt might now be removed from the summation above, since the purpose of the code below appears to be to remove it from the net_FW flux.

We recently noticed some diagnosed imbalances in ice+ocean water conservation in OM5 with (CS%adjust_net_fresh_water_to_zero=.true.). If I understood the comments below, then I think this PR would take care of that non-conservation by no longer using the imperfect estimate for seaice_melt below.

Copy link
Author

Choose a reason for hiding this comment

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

Oh, I see. I will try to replacenet_FW with fluxes%seaice_melt directly then.

Expand Down Expand Up @@ -828,6 +835,8 @@ subroutine convert_IOB_to_forces(IOB, forces, index_bounds, Time, G, US, CS, dt_
net_mass_src(i,j) = net_mass_src(i,j) + kg_m2_s_conversion * IOB%lprec(i-i0,j-j0)
if (associated(IOB%fprec)) &
net_mass_src(i,j) = net_mass_src(i,j) + kg_m2_s_conversion * IOB%fprec(i-i0,j-j0)
if (associated(IOB%seaice_melt)) &
net_mass_src(i,j) = net_mass_src(i,j) + kg_m2_s_conversion * IOB%seaice_melt(i-i0,j-j0)
if (associated(IOB%runoff)) &
net_mass_src(i,j) = net_mass_src(i,j) + kg_m2_s_conversion * IOB%runoff(i-i0,j-j0)
if (associated(IOB%calving)) &
Expand Down Expand Up @@ -1787,6 +1796,9 @@ subroutine ice_ocn_bnd_type_chksum(id, timestep, iobt)
chks = field_chksum( iobt%sw_flux_nir_dif) ; if (root) write(outunit,100) 'iobt%sw_flux_nir_dif', chks
chks = field_chksum( iobt%lprec ) ; if (root) write(outunit,100) 'iobt%lprec ', chks
chks = field_chksum( iobt%fprec ) ; if (root) write(outunit,100) 'iobt%fprec ', chks
if (associated(iobt%seaice_melt)) then
chks = field_chksum( iobt%seaice_melt ) ; if (root) write(outunit,100) 'iobt%seaice_melt ', chks
endif
chks = field_chksum( iobt%runoff ) ; if (root) write(outunit,100) 'iobt%runoff ', chks
chks = field_chksum( iobt%calving ) ; if (root) write(outunit,100) 'iobt%calving ', chks
chks = field_chksum( iobt%p ) ; if (root) write(outunit,100) 'iobt%p ', chks
Expand Down
2 changes: 2 additions & 0 deletions config_src/drivers/solo_driver/MESO_surface_forcing.F90
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ subroutine MESO_buoyancy_forcing(sfc_state, fluxes, day, dt, G, US, CS)
call safe_alloc_ptr(fluxes%evap, isd, ied, jsd, jed)
call safe_alloc_ptr(fluxes%lprec, isd, ied, jsd, jed)
call safe_alloc_ptr(fluxes%fprec, isd, ied, jsd, jed)
call safe_alloc_ptr(fluxes%seaice_melt, isd, ied, jsd, jed)
call safe_alloc_ptr(fluxes%lrunoff, isd, ied, jsd, jed)
call safe_alloc_ptr(fluxes%frunoff, isd, ied, jsd, jed)
call safe_alloc_ptr(fluxes%vprec, isd, ied, jsd, jed)
Expand Down Expand Up @@ -142,6 +143,7 @@ subroutine MESO_buoyancy_forcing(sfc_state, fluxes, day, dt, G, US, CS)
! and are positive downward - i.e. evaporation should be negative.
fluxes%evap(i,j) = -0.0 * G%mask2dT(i,j)
fluxes%lprec(i,j) = CS%PmE(i,j) * CS%Rho0 * G%mask2dT(i,j)
fluxes%seaice_melt(i,j) = 0.0 * G%mask2dT(i,j)

! vprec will be set later, if it is needed for salinity restoring.
fluxes%vprec(i,j) = 0.0
Expand Down
50 changes: 28 additions & 22 deletions config_src/drivers/solo_driver/MOM_surface_forcing.F90
Original file line number Diff line number Diff line change
Expand Up @@ -1180,15 +1180,16 @@ subroutine buoyancy_forcing_from_files(sfc_state, fluxes, day, dt, G, US, CS)
! assume solid runoff (calving) enters ocean at 0degC
! mass leaving the ocean has heat_content determined in MOM_diabatic_driver.F90
do j=js,je ; do i=is,ie
fluxes%evap(i,j) = fluxes%evap(i,j) * G%mask2dT(i,j)
fluxes%lprec(i,j) = fluxes%lprec(i,j) * G%mask2dT(i,j)
fluxes%fprec(i,j) = fluxes%fprec(i,j) * G%mask2dT(i,j)
fluxes%lrunoff(i,j) = fluxes%lrunoff(i,j) * G%mask2dT(i,j)
fluxes%frunoff(i,j) = fluxes%frunoff(i,j) * G%mask2dT(i,j)
fluxes%lw(i,j) = fluxes%lw(i,j) * G%mask2dT(i,j)
fluxes%sens(i,j) = fluxes%sens(i,j) * G%mask2dT(i,j)
fluxes%sw(i,j) = fluxes%sw(i,j) * G%mask2dT(i,j)
fluxes%latent(i,j) = fluxes%latent(i,j) * G%mask2dT(i,j)
fluxes%evap(i,j) = fluxes%evap(i,j) * G%mask2dT(i,j)
fluxes%lprec(i,j) = fluxes%lprec(i,j) * G%mask2dT(i,j)
fluxes%fprec(i,j) = fluxes%fprec(i,j) * G%mask2dT(i,j)
fluxes%seaice_melt(i,j) = fluxes%seaice_melt(i,j) * G%mask2dT(i,j)
fluxes%lrunoff(i,j) = fluxes%lrunoff(i,j) * G%mask2dT(i,j)
fluxes%frunoff(i,j) = fluxes%frunoff(i,j) * G%mask2dT(i,j)
fluxes%lw(i,j) = fluxes%lw(i,j) * G%mask2dT(i,j)
fluxes%sens(i,j) = fluxes%sens(i,j) * G%mask2dT(i,j)
fluxes%sw(i,j) = fluxes%sw(i,j) * G%mask2dT(i,j)
fluxes%latent(i,j) = fluxes%latent(i,j) * G%mask2dT(i,j)

fluxes%latent_evap_diag(i,j) = fluxes%latent_evap_diag(i,j) * G%mask2dT(i,j)
fluxes%latent_fprec_diag(i,j) = -fluxes%fprec(i,j)*CS%latent_heat_fusion
Expand Down Expand Up @@ -1294,10 +1295,11 @@ subroutine buoyancy_forcing_from_data_override(sfc_state, fluxes, day, dt, G, US
fluxes%latent_evap_diag(i,j) = fluxes%latent(i,j)
enddo ; enddo

call data_override(G%Domain, 'snow', fluxes%fprec, day, scale=US%kg_m2s_to_RZ_T)
call data_override(G%Domain, 'rain', fluxes%lprec, day, scale=US%kg_m2s_to_RZ_T)
call data_override(G%Domain, 'runoff', fluxes%lrunoff, day, scale=US%kg_m2s_to_RZ_T)
call data_override(G%Domain, 'calving', fluxes%frunoff, day, scale=US%kg_m2s_to_RZ_T)
call data_override(G%Domain, 'snow', fluxes%fprec, day, scale=US%kg_m2s_to_RZ_T)
call data_override(G%Domain, 'rain', fluxes%lprec, day, scale=US%kg_m2s_to_RZ_T)
call data_override(G%Domain, 'seaice_melt', fluxes%seaice_melt, day, scale=US%kg_m2s_to_RZ_T)
call data_override(G%Domain, 'runoff', fluxes%lrunoff, day, scale=US%kg_m2s_to_RZ_T)
call data_override(G%Domain, 'calving', fluxes%frunoff, day, scale=US%kg_m2s_to_RZ_T)

! Read the SST and SSS fields for damping.
if (CS%restorebuoy) then !#CTRL# .or. associated(CS%ctrl_forcing_CSp)) then
Expand Down Expand Up @@ -1345,15 +1347,16 @@ subroutine buoyancy_forcing_from_data_override(sfc_state, fluxes, day, dt, G, US
! assume solid runoff (calving) enters ocean at 0degC
! mass leaving ocean has heat_content determined in MOM_diabatic_driver.F90
do j=js,je ; do i=is,ie
fluxes%evap(i,j) = fluxes%evap(i,j) * G%mask2dT(i,j)
fluxes%lprec(i,j) = fluxes%lprec(i,j) * G%mask2dT(i,j)
fluxes%fprec(i,j) = fluxes%fprec(i,j) * G%mask2dT(i,j)
fluxes%lrunoff(i,j) = fluxes%lrunoff(i,j) * G%mask2dT(i,j)
fluxes%frunoff(i,j) = fluxes%frunoff(i,j) * G%mask2dT(i,j)
fluxes%lw(i,j) = fluxes%lw(i,j) * G%mask2dT(i,j)
fluxes%latent(i,j) = fluxes%latent(i,j) * G%mask2dT(i,j)
fluxes%sens(i,j) = fluxes%sens(i,j) * G%mask2dT(i,j)
fluxes%sw(i,j) = fluxes%sw(i,j) * G%mask2dT(i,j)
fluxes%evap(i,j) = fluxes%evap(i,j) * G%mask2dT(i,j)
fluxes%lprec(i,j) = fluxes%lprec(i,j) * G%mask2dT(i,j)
fluxes%fprec(i,j) = fluxes%fprec(i,j) * G%mask2dT(i,j)
fluxes%seaice_melt(i,j) = fluxes%seaice_melt(i,j) * G%mask2dT(i,j)
fluxes%lrunoff(i,j) = fluxes%lrunoff(i,j) * G%mask2dT(i,j)
fluxes%frunoff(i,j) = fluxes%frunoff(i,j) * G%mask2dT(i,j)
fluxes%lw(i,j) = fluxes%lw(i,j) * G%mask2dT(i,j)
fluxes%latent(i,j) = fluxes%latent(i,j) * G%mask2dT(i,j)
fluxes%sens(i,j) = fluxes%sens(i,j) * G%mask2dT(i,j)
fluxes%sw(i,j) = fluxes%sw(i,j) * G%mask2dT(i,j)

fluxes%latent_evap_diag(i,j) = fluxes%latent_evap_diag(i,j) * G%mask2dT(i,j)
fluxes%latent_fprec_diag(i,j) = -fluxes%fprec(i,j)*CS%latent_heat_fusion
Expand Down Expand Up @@ -1395,6 +1398,7 @@ subroutine buoyancy_forcing_zero(sfc_state, fluxes, day, dt, G, CS)
fluxes%evap(i,j) = 0.0
fluxes%lprec(i,j) = 0.0
fluxes%fprec(i,j) = 0.0
fluxes%seaice_melt(i,j) = 0.0
fluxes%vprec(i,j) = 0.0
fluxes%lrunoff(i,j) = 0.0
fluxes%frunoff(i,j) = 0.0
Expand Down Expand Up @@ -1438,6 +1442,7 @@ subroutine buoyancy_forcing_const(sfc_state, fluxes, day, dt, G, US, CS)
fluxes%evap(i,j) = 0.0
fluxes%lprec(i,j) = 0.0
fluxes%fprec(i,j) = 0.0
fluxes%seaice_melt(i,j) = 0.0
fluxes%vprec(i,j) = 0.0
fluxes%lrunoff(i,j) = 0.0
fluxes%frunoff(i,j) = 0.0
Expand Down Expand Up @@ -1486,6 +1491,7 @@ subroutine buoyancy_forcing_linear(sfc_state, fluxes, day, dt, G, US, CS)
fluxes%evap(i,j) = 0.0
fluxes%lprec(i,j) = 0.0
fluxes%fprec(i,j) = 0.0
fluxes%seaice_melt(i,j) = 0.0
fluxes%vprec(i,j) = 0.0
fluxes%lrunoff(i,j) = 0.0
fluxes%frunoff(i,j) = 0.0
Expand Down
4 changes: 3 additions & 1 deletion config_src/drivers/solo_driver/user_surface_forcing.F90
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ subroutine USER_buoyancy_forcing(sfc_state, fluxes, day, dt, G, US, CS)
call safe_alloc_ptr(fluxes%evap, isd, ied, jsd, jed)
call safe_alloc_ptr(fluxes%lprec, isd, ied, jsd, jed)
call safe_alloc_ptr(fluxes%fprec, isd, ied, jsd, jed)
call safe_alloc_ptr(fluxes%seaice_melt, isd, ied, jsd, jed)
call safe_alloc_ptr(fluxes%lrunoff, isd, ied, jsd, jed)
call safe_alloc_ptr(fluxes%frunoff, isd, ied, jsd, jed)
call safe_alloc_ptr(fluxes%vprec, isd, ied, jsd, jed)
Expand All @@ -177,6 +178,7 @@ subroutine USER_buoyancy_forcing(sfc_state, fluxes, day, dt, G, US, CS)
! and are positive downward - i.e. evaporation should be negative.
fluxes%evap(i,j) = -0.0 * G%mask2dT(i,j)
fluxes%lprec(i,j) = 0.0 * G%mask2dT(i,j)
fluxes%seaice_melt(i,j) = 0.0 * G%mask2dT(i,j)

! vprec will be set later, if it is needed for salinity restoring.
fluxes%vprec(i,j) = 0.0
Expand Down Expand Up @@ -313,7 +315,7 @@ end subroutine USER_surface_forcing_init
!!
!! USER_buoyancy() forcing is used to set the surface buoyancy
!! forcing, which may include a number of fresh water flux fields
!! (evap, lprec, fprec, lrunoff, frunoff, and
!! (evap, lprec, fprec, seaice_melt, lrunoff, frunoff, and
!! vprec) and the surface heat fluxes (sw, lw, latent and sens)
!! if temperature and salinity are state variables, or it may simply
!! be the buoyancy flux if it is not. This routine also has coded a
Expand Down
48 changes: 21 additions & 27 deletions src/core/MOM_forcing_type.F90
Original file line number Diff line number Diff line change
Expand Up @@ -543,14 +543,17 @@ subroutine extractFluxes1d(G, GV, US, fluxes, optics, nsw, j, dt, &
"MOM_forcing_type extractFluxes1d: fluxes%sens is not associated.")

if (.not.associated(fluxes%evap)) call MOM_error(FATAL, &
"MOM_forcing_type extractFluxes1d: No evaporation defined.")
"MOM_forcing_type extractFluxes1d: fluxes%evap is not associated.")

if (.not.associated(fluxes%vprec)) call MOM_error(FATAL, &
"MOM_forcing_type extractFluxes1d: fluxes%vprec not defined.")
"MOM_forcing_type extractFluxes1d: fluxes%vprec is not associated.")

if ((.not.associated(fluxes%lprec)) .or. &
(.not.associated(fluxes%fprec))) call MOM_error(FATAL, &
"MOM_forcing_type extractFluxes1d: No precipitation defined.")
"MOM_forcing_type extractFluxes1d: fluxes%lprec or fluxes%fprec not associated.")

if (.not.associated(fluxes%seaice_melt)) call MOM_error(FATAL, &
"MOM_forcing_type extractFluxes1d: fluxes%seaice_melt is not associated.")

do i=is,ie ; htot(i) = h(i,1) ; enddo
do k=2,nz ; do i=is,ie ; htot(i) = htot(i) + h(i,k) ; enddo ; enddo
Expand Down Expand Up @@ -630,8 +633,6 @@ subroutine extractFluxes1d(G, GV, US, fluxes, optics, nsw, j, dt, &
if (fluxes%evap(i,j) < 0.0) netMassOut(i) = netMassOut(i) + fluxes%evap(i,j)
! if (associated(fluxes%heat_content_cond)) fluxes%heat_content_cond(i,j) = 0.0 !??? --AJA

! lprec < 0 means sea ice formation taking water from the ocean.
! smg: we should split the ice melt/formation from the lprec
if (fluxes%lprec(i,j) < 0.0) netMassOut(i) = netMassOut(i) + fluxes%lprec(i,j)
Copy link
Member

@Hallberg-NOAA Hallberg-NOAA Apr 30, 2025

Choose a reason for hiding this comment

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

The changes in the next ~8 lines will change answers for people who are using the NUOPC coupler and are already using fluxes%seaice_melt. A runtime flag might be needed here as well to recreate previous answers.


! seaice_melt < 0 means sea ice formation taking water from the ocean.
Expand Down Expand Up @@ -801,13 +802,8 @@ subroutine extractFluxes1d(G, GV, US, fluxes, optics, nsw, j, dt, &
endif
endif

! smg: we should remove sea ice melt from lprec!!!
! fluxes%lprec > 0 means ocean gains mass via liquid precipitation and/or sea ice melt.
! When atmosphere does not provide heat of this precipitation, the ocean assumes
! it enters the ocean at the SST.
! fluxes%lprec < 0 means ocean loses mass via sea ice formation. As we do not yet know
! the layer at which this mass is removed, we cannot compute it heat content. We must
! wait until MOM_diabatic_driver.F90.
if (associated(fluxes%heat_content_lprec)) then
if (fluxes%lprec(i,j) > 0.0) then
Copy link
Member

Choose a reason for hiding this comment

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

I believe that these changes will change answers for people (like EMC and NCAR) that were already using fluxes%seaice_melt. We are probably going to need to control this with a runtime logical flag.

fluxes%heat_content_lprec(i,j) = tv%C_p*fluxes%lprec(i,j)*T(i,1)
Expand Down Expand Up @@ -1571,15 +1567,6 @@ subroutine register_forcing_type_diags(Time, diag, US, use_temperature, handles,
cmor_standard_name='water_evaporation_flux', &
cmor_long_name='Water Evaporation Flux Where Ice Free Ocean over Sea')

! smg: seaice_melt field requires updates to the sea ice model
handles%id_seaice_melt = register_diag_field('ocean_model', 'seaice_melt', &
diag%axesT1, Time, 'water flux to ocean from snow/sea ice melting(> 0) or formation(< 0)', &
'kg m-2 s-1', conversion=US%RZ_T_to_kg_m2s, &
standard_name='water_flux_into_sea_water_due_to_sea_ice_thermodynamics', &
cmor_field_name='fsitherm', &
cmor_standard_name='water_flux_into_sea_water_due_to_sea_ice_thermodynamics',&
cmor_long_name='water flux to ocean from sea ice melt(> 0) or form(< 0)')

handles%id_precip = register_diag_field('ocean_model', 'precip', diag%axesT1, Time, &
'Liquid + frozen precipitation into ocean', 'kg m-2 s-1', conversion=US%RZ_T_to_kg_m2s)

Expand All @@ -1596,6 +1583,14 @@ subroutine register_forcing_type_diags(Time, diag, US, use_temperature, handles,
cmor_field_name='prlq', cmor_standard_name='rainfall_flux', &
cmor_long_name='Rainfall Flux where Ice Free Ocean over Sea')

handles%id_seaice_melt = register_diag_field('ocean_model', 'seaice_melt', &
diag%axesT1, Time, 'water flux to ocean from snow/sea ice melting(> 0) or formation(< 0)', &
'kg m-2 s-1', conversion=US%RZ_T_to_kg_m2s, &
standard_name='water_flux_into_sea_water_due_to_sea_ice_thermodynamics', &
cmor_field_name='fsitherm', &
cmor_standard_name='water_flux_into_sea_water_due_to_sea_ice_thermodynamics',&
cmor_long_name='water flux to ocean from sea ice melt(> 0) or form(< 0)')

handles%id_vprec = register_diag_field('ocean_model', 'vprec', diag%axesT1, Time, &
'Virtual liquid precip into ocean due to SSS restoring', &
units='kg m-2 s-1', conversion=US%RZ_T_to_kg_m2s)
Expand Down Expand Up @@ -1648,14 +1643,6 @@ subroutine register_forcing_type_diags(Time, diag, US, use_temperature, handles,
cmor_standard_name='water_evaporation_flux_area_integrated', &
cmor_long_name='Evaporation Where Ice Free Ocean over Sea Area Integrated')

! seaice_melt field requires updates to the sea ice model
handles%id_total_seaice_melt = register_scalar_field('ocean_model', 'total_icemelt', Time, diag, &
long_name='Area integrated sea ice melt (>0) or form (<0)', units='kg s-1', &
standard_name='water_flux_into_sea_water_due_to_sea_ice_thermodynamics_area_integrated', &
cmor_field_name='total_fsitherm', &
cmor_standard_name='water_flux_into_sea_water_due_to_sea_ice_thermodynamics_area_integrated', &
cmor_long_name='Water Melt/Form from Sea Ice Area Integrated')

handles%id_total_precip = register_scalar_field('ocean_model', 'total_precip', Time, diag, &
long_name='Area integrated liquid+frozen precip into ocean', units='kg s-1')

Expand All @@ -1673,6 +1660,13 @@ subroutine register_forcing_type_diags(Time, diag, US, use_temperature, handles,
cmor_standard_name='rainfall_flux_area_integrated', &
cmor_long_name='Rainfall Flux where Ice Free Ocean over Sea Area Integrated')

handles%id_total_seaice_melt = register_scalar_field('ocean_model', 'total_icemelt', Time, diag, &
long_name='Area integrated sea ice melt (>0) or form (<0)', units='kg s-1', &
standard_name='water_flux_into_sea_water_due_to_sea_ice_thermodynamics_area_integrated', &
cmor_field_name='total_fsitherm', &
cmor_standard_name='water_flux_into_sea_water_due_to_sea_ice_thermodynamics_area_integrated', &
cmor_long_name='Water Melt/Form from Sea Ice Area Integrated')

handles%id_total_vprec = register_scalar_field('ocean_model', 'total_vprec', Time, diag, &
long_name='Area integrated virtual liquid precip due to SSS restoring', units='kg s-1')

Expand Down
3 changes: 1 addition & 2 deletions src/parameterizations/vertical/MOM_diabatic_aux.F90
Original file line number Diff line number Diff line change
Expand Up @@ -909,8 +909,7 @@ subroutine applyBoundaryFluxesInOut(CS, G, GV, US, dt, fluxes, optics, nsw, h, t
! The surface forcing is contained in the fluxes type.
! We aggregate the thermodynamic forcing for a time step into the following:
! netMassInOut = surface water fluxes [H ~> m or kg m-2] over time step
! = lprec + fprec + vprec + evap + lrunoff + frunoff
! note that lprec generally has sea ice melt/form included.
! = lprec + fprec + seaice_melt + vprec + evap + lrunoff + frunoff
! netMassOut = net mass leaving ocean surface [H ~> m or kg m-2] over a time step.
! netMassOut < 0 means mass leaves ocean.
! netHeat = heat via surface fluxes [C H ~> degC m or degC kg m-2], excluding the part
Expand Down
Loading