diff --git a/components/elm/src/external_models/fates b/components/elm/src/external_models/fates
index e027a4030d2a..83863e9398e2 160000
--- a/components/elm/src/external_models/fates
+++ b/components/elm/src/external_models/fates
@@ -1 +1 @@
-Subproject commit e027a4030d2a0f09039fb337ad67ced7461dd4f0
+Subproject commit 83863e9398e2098b5ef04a8b8525733a881c1ca3
diff --git a/components/mpas-ocean/driver/mpaso_cpl_indices.F b/components/mpas-ocean/driver/mpaso_cpl_indices.F
index de86b439c2ea..e7daa4f9b57b 100644
--- a/components/mpas-ocean/driver/mpaso_cpl_indices.F
+++ b/components/mpas-ocean/driver/mpaso_cpl_indices.F
@@ -21,6 +21,8 @@ module mpaso_cpl_indices
integer :: index_o2x_Fioo_q
integer :: index_o2x_Foxo_q_li
integer :: index_o2x_Fioo_frazil
+ integer :: index_o2x_Fioo_frazils
+ integer :: index_o2x_Fioo_frazilh
integer :: index_o2x_Foxo_frazil_li
integer :: index_o2x_Faoo_h2otemp
integer :: index_o2x_Faoo_fco2_ocn
@@ -215,6 +217,8 @@ subroutine mpaso_cpl_indices_set( )
index_o2x_Fioo_q = mct_avect_indexra(o2x,'Fioo_q',perrWith='quiet')
index_o2x_Foxo_q_li = mct_avect_indexra(o2x,'Foxo_q_li',perrWith='quiet')
index_o2x_Fioo_frazil = mct_avect_indexra(o2x,'Fioo_frazil',perrWith='quiet')
+ index_o2x_Fioo_frazils = mct_avect_indexra(o2x,'Fioo_frazils',perrWith='quiet')
+ index_o2x_Fioo_frazilh = mct_avect_indexra(o2x,'Fioo_frazilh',perrWith='quiet')
index_o2x_Foxo_frazil_li= mct_avect_indexra(o2x,'Foxo_frazil_li',perrWith='quiet')
index_o2x_Faoo_h2otemp = mct_avect_indexra(o2x,'Faoo_h2otemp',perrWith='quiet')
index_o2x_Faoo_fco2_ocn = mct_avect_indexra(o2x,'Faoo_fco2_ocn',perrWith='quiet')
diff --git a/components/mpas-ocean/driver/ocn_comp_mct.F b/components/mpas-ocean/driver/ocn_comp_mct.F
index fc3c4edda820..9de9c00e0f7b 100644
--- a/components/mpas-ocean/driver/ocn_comp_mct.F
+++ b/components/mpas-ocean/driver/ocn_comp_mct.F
@@ -3166,6 +3166,7 @@ subroutine ocn_export_mct(o2x_o, errorCode) !{{{
integer, dimension(:), pointer :: landIceMask
real (kind=RKIND), dimension(:), pointer :: seaIceEnergy, accumulatedFrazilIceMass, frazilSurfacePressure, &
+ accumulatedFrazilIceEnergy, &
avgTotalFreshWaterTemperatureFlux, &
avgCO2_gas_flux, DMSFlux, surfaceUpwardCO2Flux, &
avgOceanSurfaceDIC, &
@@ -3286,6 +3287,7 @@ subroutine ocn_export_mct(o2x_o, errorCode) !{{{
call mpas_pool_get_array(forcingPool, 'seaIceEnergy', seaIceEnergy)
call mpas_pool_get_array(forcingPool, 'frazilSurfacePressure', frazilSurfacePressure)
call mpas_pool_get_array(statePool, 'accumulatedFrazilIceMass', accumulatedFrazilIceMass, 1)
+ call mpas_pool_get_array(statePool, 'accumulatedFrazilIceEnergy', accumulatedFrazilIceEnergy, 1)
end if
! Cryo fields
@@ -3405,11 +3407,17 @@ subroutine ocn_export_mct(o2x_o, errorCode) !{{{
o2x_o(index_o2x_Fioo_q, n) = seaIceEnergy(i) / ocn_cpl_dt
o2x_o(index_o2x_Fioo_frazil, n) = accumulatedFrazilIceMass(i) / ocn_cpl_dt
+ o2x_o(index_o2x_Fioo_frazils, n) = accumulatedFrazilIceMass(i)/ 1000.0_RKIND * &
+ config_frazil_sea_ice_reference_salinity / ocn_cpl_dt
+ !defined positive to be consistent with Fioo_q when frazil is formed
+ o2x_o(index_o2x_Fioo_frazilh, n) = accumulatedFrazilIceEnergy(i)/ ocn_cpl_dt
else
o2x_o(index_o2x_Fioo_q, n) = 0.0_RKIND
o2x_o(index_o2x_Fioo_frazil, n) = 0.0_RKIND
+ o2x_o(index_o2x_Fioo_frazils, n) = 0.0_RKIND
+ o2x_o(index_o2x_Fioo_frazilh, n) = 0.0_RKIND
if (trim(config_land_ice_flux_mode) == 'standalone' .or. trim(config_land_ice_flux_mode) == 'data') then
o2x_o(index_o2x_Foxo_q_li, n) = accumulatedFrazilIceMass(i) * config_frazil_heat_of_fusion / ocn_cpl_dt
o2x_o(index_o2x_Foxo_frazil_li, n) = accumulatedFrazilIceMass(i) / ocn_cpl_dt
@@ -3420,6 +3428,7 @@ subroutine ocn_export_mct(o2x_o, errorCode) !{{{
! Reset SeaIce Energy and Accumulated Frazil Ice
seaIceEnergy(i) = 0.0_RKIND
accumulatedFrazilIceMass(i) = 0.0_RKIND
+ accumulatedFrazilIceEnergy(i) = 0.0_RKIND
frazilSurfacePressure(i) = 0.0_RKIND
end if
diff --git a/components/mpas-ocean/src/Registry.xml b/components/mpas-ocean/src/Registry.xml
index 00f15a2961f9..31f950349fa8 100644
--- a/components/mpas-ocean/src/Registry.xml
+++ b/components/mpas-ocean/src/Registry.xml
@@ -2146,6 +2146,7 @@
+
@@ -2517,6 +2518,10 @@
description="Mass per unit area of frazil ice produced. Reset to zero at each coupling interval"
packages="frazilIce"
/>
+
0.0_RKIND)
endif ! if (freezingEnergy < 0)
@@ -711,6 +723,9 @@ subroutine ocn_frazil_forcing_build_arrays(domain, meshPool, forcingPool, stateP
accumulatedFrazilIceMassNew(iCell) = accumulatedFrazilIceMassOld(iCell) + sumNewFrazilIceThickness &
* config_frazil_ice_density
+ !frazilIceEnergy > 0
+ accumulatedFrazilIceEnergyNew(iCell) = accumulatedFrazilIceEnergyOld(iCell) + sumNewFrazilEnergy
+
accumulatedFrazilIceSalinityNew(iCell) = accumulatedFrazilIceSalinityOld(iCell) + &
(1-usePorosity) * sumNewThicknessWeightedSaltContent
diff --git a/components/mpas-seaice/bld/namelist_files/namelist_definition_mpassi.xml b/components/mpas-seaice/bld/namelist_files/namelist_definition_mpassi.xml
index 0d8964e034f0..54a5153701f8 100644
--- a/components/mpas-seaice/bld/namelist_files/namelist_definition_mpassi.xml
+++ b/components/mpas-seaice/bld/namelist_files/namelist_definition_mpassi.xml
@@ -533,7 +533,7 @@ Default: Defined in namelist_defaults.xml
category="forcing" group="forcing">
Type of frazil ice coupling.
-Valid values: 'external', 'internal', 'fresh_ice_correction'
+Valid values: 'external', 'internal', 'fresh_ice_correction', 'omega-fluxes'
Default: Defined in namelist_defaults.xml
diff --git a/components/mpas-seaice/cime_config/buildnml b/components/mpas-seaice/cime_config/buildnml
index 4386f95711ad..d749b1424318 100755
--- a/components/mpas-seaice/cime_config/buildnml
+++ b/components/mpas-seaice/cime_config/buildnml
@@ -852,6 +852,9 @@ def buildnml(case, caseroot, compname):
lines.append(' ')
lines.append(' ')
lines.append(' ')
+ lines.append(' ')
+ lines.append(' ')
+ lines.append(' ')
if ("WW3" in compset or "DWAV%FSD" in compset or "DWAV%ZEROS" in compset):
lines.append(' ')
lines.append(' ')
@@ -913,6 +916,9 @@ def buildnml(case, caseroot, compname):
lines.append(' ')
lines.append(' ')
lines.append(' ')
+ lines.append(' ')
+ lines.append(' ')
+ lines.append(' ')
lines.append(' ')
lines.append(' ')
lines.append(' ')
diff --git a/components/mpas-seaice/driver/ice_comp_mct.F b/components/mpas-seaice/driver/ice_comp_mct.F
index 12e84a107bb1..2693e3e32a8c 100644
--- a/components/mpas-seaice/driver/ice_comp_mct.F
+++ b/components/mpas-seaice/driver/ice_comp_mct.F
@@ -2050,6 +2050,8 @@ subroutine ice_import_mct(x2i_i, errorCode)!{{{
! o swnet -- sw: net
! o q -- ocn frazil heat flux(+) / melt potential(-)
! o frazil -- ocn frazil mass flux
+! o frazils -- ocn frazil salt flux
+! o frazilh -- ocn frazil enthalpy flux (+)
! o bcphidry -- Black Carbon hydrophilic dry deposition flux
! o bcphodry -- Black Carbon hydrophobic dry deposition flux
! o bcphiwet -- Black Carbon hydrophilic wet deposition flux
@@ -2125,7 +2127,6 @@ subroutine ice_import_mct(x2i_i, errorCode)!{{{
i,n,iFreq
real (kind=RKIND) :: &
- frazilMassFlux, &
frazilMassFluxRev
type (block_type), pointer :: block_ptr
@@ -2154,7 +2155,8 @@ subroutine ice_import_mct(x2i_i, errorCode)!{{{
character(len=strKIND), pointer :: &
config_column_physics_type, &
config_thermodynamics_type, &
- config_ocean_surface_type
+ config_ocean_surface_type, &
+ config_frazil_coupling_type
type (field1DReal), pointer :: &
seaSurfaceTemperatureField, &
@@ -2162,6 +2164,9 @@ subroutine ice_import_mct(x2i_i, errorCode)!{{{
seaFreezingTemperatureField, &
freezingMeltingPotentialField, &
frazilMassAdjustField, &
+ frazilMassFluxField, &
+ frazilSaltFluxField, &
+ frazilEnthalpyFluxField, &
uOceanVelocityField, &
vOceanVelocityField, &
seaSurfaceTiltUField, &
@@ -2208,6 +2213,9 @@ subroutine ice_import_mct(x2i_i, errorCode)!{{{
seaSurfaceSalinity, &
seaFreezingTemperature, &
freezingMeltingPotential, &
+ frazilMassFlux, &
+ frazilSaltFlux, &
+ frazilEnthalpyFlux, &
frazilMassAdjust, &
uOceanVelocity, &
vOceanVelocity, &
@@ -2280,6 +2288,7 @@ subroutine ice_import_mct(x2i_i, errorCode)!{{{
call mpas_pool_get_config(configs, "config_couple_biogeochemistry_fields", config_couple_biogeochemistry_fields)
call mpas_pool_get_config(configs, "config_use_zaerosols", config_use_zaerosols)
call mpas_pool_get_config(configs, "config_use_column_waves", config_use_column_waves)
+ call mpas_pool_get_config(configs, "config_frazil_coupling_type", config_frazil_coupling_type)
call mpas_pool_get_subpool(block_ptr % structs, 'mesh', meshPool)
call mpas_pool_get_subpool(block_ptr % structs, 'ocean_coupling', oceanCoupling)
@@ -2292,6 +2301,9 @@ subroutine ice_import_mct(x2i_i, errorCode)!{{{
call mpas_pool_get_array(oceanCoupling, 'seaSurfaceSalinity', seaSurfaceSalinity)
call mpas_pool_get_array(oceanCoupling, 'seaFreezingTemperature', seaFreezingTemperature)
call mpas_pool_get_array(oceanCoupling, 'freezingMeltingPotential', freezingMeltingPotential)
+ call mpas_pool_get_array(oceanCoupling, 'frazilMassFlux', frazilMassFlux)
+ call mpas_pool_get_array(oceanCoupling, 'frazilSaltFlux', frazilSaltFlux)
+ call mpas_pool_get_array(oceanCoupling, 'frazilEnthalpyFlux', frazilEnthalpyFlux)
call mpas_pool_get_array(oceanCoupling, 'frazilMassAdjust', frazilMassAdjust)
call mpas_pool_get_array(oceanCoupling, 'uOceanVelocity', uOceanVelocity)
call mpas_pool_get_array(oceanCoupling, 'vOceanVelocity', vOceanVelocity)
@@ -2383,7 +2395,12 @@ subroutine ice_import_mct(x2i_i, errorCode)!{{{
freezingMeltingPotential(i) = x2i_i(index_x2i_Fioo_q, n)
- frazilMassFlux = x2i_i(index_x2i_Fioo_frazil, n)
+ frazilMassFlux(i) = x2i_i(index_x2i_Fioo_frazil, n)
+
+ if (trim(config_frazil_coupling_type) == "omega-fluxes") then
+ frazilSaltFlux(i) = x2i_i(index_x2i_Fioo_frazils, n)
+ frazilEnthalpyFlux(i) = x2i_i(index_x2i_Fioo_frazilh, n)
+ frazilMassAdjust(i) = 0.0_RKIND
! Now determine the sea ice mass associated with the frazil heat flux given when
! freezingMeltingPotential(i) is positive. This produces a revised mass flux, given
@@ -2392,14 +2409,23 @@ subroutine ice_import_mct(x2i_i, errorCode)!{{{
! coupling step as a freshwater and salt flux. This step is required to balance mass
! and heat with the ocean.
- call frazil_mass(freezingMeltingPotential(i), frazilMassFluxRev, seaSurfaceSalinity(i))
+ else
+ call frazil_mass(freezingMeltingPotential(i), frazilMassFluxRev, seaSurfaceSalinity(i))
- frazilMassAdjust(i) = frazilMassFlux-frazilMassFluxRev
+ frazilMassAdjust(i) = frazilMassFlux(i)-frazilMassFluxRev
+ frazilSaltFlux(i) = 0.0_RKIND
+ frazilEnthalpyFlux(i) = 0.0_RKIND
+
+ endif
else ! non-free surface (SOM)
freezingMeltingPotential(i) = x2i_i(index_x2i_Fioo_q, n)
+ frazilSaltFlux(i) = 0.0_RKIND
+ frazilEnthalpyFlux(i) = 0.0_RKIND
+ frazilMassAdjust(i) = 0.0_RKIND
+
endif
airLevelHeight(i) = x2i_i(index_x2i_Sa_z, n)
@@ -2564,6 +2590,9 @@ subroutine ice_import_mct(x2i_i, errorCode)!{{{
call mpas_pool_get_field(oceanCoupling, 'seaFreezingTemperature', seaFreezingTemperatureField)
call mpas_pool_get_field(oceanCoupling, 'freezingMeltingPotential', freezingMeltingPotentialField)
call mpas_pool_get_field(oceanCoupling, 'frazilMassAdjust', frazilMassAdjustField)
+ call mpas_pool_get_field(oceanCoupling, 'frazilMassFlux', frazilMassFluxField)
+ call mpas_pool_get_field(oceanCoupling, 'frazilSaltFlux', frazilSaltFluxField)
+ call mpas_pool_get_field(oceanCoupling, 'frazilEnthalpyFlux', frazilEnthalpyFluxField)
call mpas_pool_get_field(oceanCoupling, 'uOceanVelocity', uOceanVelocityField)
call mpas_pool_get_field(oceanCoupling, 'vOceanVelocity', vOceanVelocityField)
call mpas_pool_get_field(oceanCoupling, 'seaSurfaceTiltU', seaSurfaceTiltUField)
@@ -2627,6 +2656,9 @@ subroutine ice_import_mct(x2i_i, errorCode)!{{{
call mpas_dmpar_exch_halo_field(seaFreezingTemperatureField)
call mpas_dmpar_exch_halo_field(freezingMeltingPotentialField)
call mpas_dmpar_exch_halo_field(frazilMassAdjustField)
+ call mpas_dmpar_exch_halo_field(frazilMassFluxField)
+ call mpas_dmpar_exch_halo_field(frazilSaltFluxField)
+ call mpas_dmpar_exch_halo_field(frazilEnthalpyFluxField)
call mpas_dmpar_exch_halo_field(uOceanVelocityField)
call mpas_dmpar_exch_halo_field(vOceanVelocityField)
call mpas_dmpar_exch_halo_field(seaSurfaceTiltUField)
@@ -3025,12 +3057,15 @@ subroutine ice_export_mct(i2x_i, errorCode) !{{{
! i/o fluxes computed by ice, as well as additional freshwater and salt calculated at the last
! coupling import and needed to grow sea ice from frazil passed from the ocean model in the
! field frazilMassAdjust.
- i2x_i(index_i2x_Fioi_melth,n) = oceanHeatFlux(i)
- i2x_i(index_i2x_Fioi_swpen,n) = oceanShortwaveFlux(i)
- i2x_i(index_i2x_Fioi_meltw,n) = oceanFreshWaterFlux(i) + frazilMassAdjust(i)/ailohi
- i2x_i(index_i2x_Fioi_salt ,n) = oceanSaltFlux(i) + seaiceReferenceSalinity*0.001_RKIND*frazilMassAdjust(i)/ailohi
- i2x_i(index_i2x_Fioi_taux ,n) = tauxo
- i2x_i(index_i2x_Fioi_tauy ,n) = tauyo
+ i2x_i(index_i2x_Fioi_melth ,n) = oceanHeatFlux(i)
+ i2x_i(index_i2x_Fioi_swpen ,n) = oceanShortwaveFlux(i)
+ i2x_i(index_i2x_Fioi_meltw ,n) = oceanFreshWaterFlux(i) + frazilMassAdjust(i)/ailohi
+ i2x_i(index_i2x_Fioi_frazil ,n) = frazilMassAdjust(i)/ailohi
+ i2x_i(index_i2x_Fioi_salt ,n) = oceanSaltFlux(i) + seaiceReferenceSalinity*0.001_RKIND*frazilMassAdjust(i)/ailohi
+ i2x_i(index_i2x_Fioi_frazils,n) = seaiceReferenceSalinity*0.001_RKIND*frazilMassAdjust(i)/ailohi
+ i2x_i(index_i2x_Fioi_frazilh,n) = 0.0_RKIND
+ i2x_i(index_i2x_Fioi_taux ,n) = tauxo
+ i2x_i(index_i2x_Fioi_tauy ,n) = tauyo
! export biogeochemistry fields, if configured
if (config_use_column_biogeochemistry .and. config_couple_biogeochemistry_fields) then
diff --git a/components/mpas-seaice/driver/mpassi_cpl_indices.F b/components/mpas-seaice/driver/mpassi_cpl_indices.F
index 6e84fcba8533..c38387f31883 100644
--- a/components/mpas-seaice/driver/mpassi_cpl_indices.F
+++ b/components/mpas-seaice/driver/mpassi_cpl_indices.F
@@ -34,7 +34,10 @@ module mpassi_cpl_indices
integer :: index_i2x_Fioi_swpen ! sw: net penetrating ice
integer :: index_i2x_Fioi_melth ! heat flux from melting ice (<0)
integer :: index_i2x_Fioi_meltw ! water flux from melting ice
- integer :: index_i2x_Fioi_salt ! salt flux from meting ice
+ integer :: index_i2x_Fioi_salt ! salt flux from melting ice
+ integer :: index_i2x_Fioi_frazil ! water flux from frazil ice
+ integer :: index_i2x_Fioi_frazils ! salt flux from frazil ice
+ integer :: index_i2x_Fioi_frazilh ! heat flux from frazil ice
integer :: index_i2x_Fioi_taux ! ice/ocn stress, zonal
integer :: index_i2x_Fioi_tauy ! ice/ocn stress, zonal
integer :: index_i2x_Fioi_bergh ! heat flux from melting icebergs (<0)
@@ -87,7 +90,9 @@ module mpassi_cpl_indices
integer :: index_x2i_Faxa_swvdf ! sw: vis diffuse downward
integer :: index_x2i_Faxa_swnet ! sw: net
integer :: index_x2i_Fioo_q ! ocn freezing melting potential
- integer :: index_x2i_Fioo_frazil ! ocn frazil ice formation
+ integer :: index_x2i_Fioo_frazil ! ocn frazil ice mass flux
+ integer :: index_x2i_Fioo_frazils ! ocn frazil ice salt flux
+ integer :: index_x2i_Fioo_frazilh ! ocn frazil heat flux
integer :: index_x2i_Faxa_bcphidry ! flux: Black Carbon hydrophilic dry deposition
integer :: index_x2i_Faxa_bcphodry ! flux: Black Carbon hydrophobic dry deposition
integer :: index_x2i_Faxa_bcphiwet ! flux: Black Carbon hydrophilic wet deposition
@@ -176,6 +181,9 @@ subroutine mpassi_cpl_indices_set( )
index_i2x_Fioi_melth = mct_avect_indexra(i2x,'Fioi_melth')
index_i2x_Fioi_meltw = mct_avect_indexra(i2x,'Fioi_meltw')
index_i2x_Fioi_salt = mct_avect_indexra(i2x,'Fioi_salt')
+ index_i2x_Fioi_frazil = mct_avect_indexra(i2x,'Fioi_frazil')
+ index_i2x_Fioi_frazils = mct_avect_indexra(i2x,'Fioi_frazils')
+ index_i2x_Fioi_frazilh = mct_avect_indexra(i2x,'Fioi_frazilh')
index_i2x_Fioi_taux = mct_avect_indexra(i2x,'Fioi_taux')
index_i2x_Fioi_tauy = mct_avect_indexra(i2x,'Fioi_tauy')
index_i2x_Fioi_bergh = mct_avect_indexra(i2x,'PFioi_bergh')
@@ -228,6 +236,8 @@ subroutine mpassi_cpl_indices_set( )
index_x2i_Faxa_swvdf = mct_avect_indexra(x2i,'Faxa_swvdf')
index_x2i_Fioo_q = mct_avect_indexra(x2i,'Fioo_q')
index_x2i_Fioo_frazil = mct_avect_indexra(x2i,'Fioo_frazil')
+ index_x2i_Fioo_frazils = mct_avect_indexra(x2i,'Fioo_frazils')
+ index_x2i_Fioo_frazilh = mct_avect_indexra(x2i,'Fioo_frazilh')
index_x2i_Faxa_bcphidry = mct_avect_indexra(x2i,'Faxa_bcphidry')
index_x2i_Faxa_bcphodry = mct_avect_indexra(x2i,'Faxa_bcphodry')
index_x2i_Faxa_bcphiwet = mct_avect_indexra(x2i,'Faxa_bcphiwet')
diff --git a/components/mpas-seaice/src/Registry.xml b/components/mpas-seaice/src/Registry.xml
index de91fd55b530..46a8bd8bd8b5 100644
--- a/components/mpas-seaice/src/Registry.xml
+++ b/components/mpas-seaice/src/Registry.xml
@@ -566,7 +566,7 @@
/>
+
+
+
@@ -2457,6 +2460,9 @@
+
+
+
@@ -4364,6 +4370,21 @@
dimensions="nCells Time"
units="kg m-2 s-1"
/>
+
+
+