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" /> + + +