-
Notifications
You must be signed in to change notification settings - Fork 72
Pass new seaice_melt
field from SIS2 to MOM6
#710
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
base: dev/gfdl
Are you sure you want to change the base?
Changes from 7 commits
b3e65c6
202ff90
c8dc42e
13b9960
04cca2c
ac855f9
791521c
5fd1689
f5443b3
37d1385
83ad1f1
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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] | ||
|
@@ -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) & | ||
|
@@ -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)) + & | ||
hdrake marked this conversation as resolved.
Show resolved
Hide resolved
|
||
(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 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Oh, I see. I will try to replace |
||
|
@@ -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)) & | ||
|
@@ -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 | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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, & | ||
hdrake marked this conversation as resolved.
Show resolved
Hide resolved
|
||
"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 | ||
|
@@ -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) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 |
||
|
||
! seaice_melt < 0 means sea ice formation taking water from the ocean. | ||
|
@@ -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 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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%heat_content_lprec(i,j) = tv%C_p*fluxes%lprec(i,j)*T(i,1) | ||
|
@@ -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) | ||
|
||
|
@@ -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) | ||
|
@@ -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') | ||
|
||
|
@@ -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') | ||
|
||
|
Uh oh!
There was an error while loading. Please reload this page.