Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pass new seaice_melt field from SIS2 to MOM6 #710

Open
wants to merge 7 commits into
base: dev/gfdl
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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

Choose a reason for hiding this comment

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

@marshallward Is this sufficient to make sure that fluxes%seaice_melt is not filled with nonsense if IOB%seaice_melt is not allocated or used by the coupler?

Copy link
Member

@marshallward marshallward Aug 19, 2024

Choose a reason for hiding this comment

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

I wouldn't say prevent, it only ensures that the potential nonsense from IOB%seaice_melt is transferred to fluxes%seaice_melt.

The only solution I can see is for net_FW to have some awareness of the state of IOB%seaice_melt. If the coupler fills IOB%seaice_melt, then it can be used to compute new_FW (via fluxes%seaice_melt). Otherwise, it needs to be filled some other way (if at all).

Zero-initialization might get you out of this, although generally we try to avoid that solution where possible.

Choose a reason for hiding this comment

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

I am guessing there is no way to check if IOB%seaice_melt has been allocated with actual values?

What if we add use_seaice_melt to IOB as a logical, default it to false and then set it to true in the coupler where IOB%seaice_melt was allocated? Then use that here to see if seaice_melt should be used or not in this routine.

Choose a reason for hiding this comment

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

After some in preson discussion @marshallward confirmed the if associated should be enough to make sure the pointer was allocated in the coupler. There should be no need to change anything to get this working with older versions of the coupler.

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
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)

! 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
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