diff --git a/cime_config/config_grids.xml b/cime_config/config_grids.xml
index 179d8af39739..70641cd1c660 100755
--- a/cime_config/config_grids.xml
+++ b/cime_config/config_grids.xml
@@ -5910,6 +5910,7 @@
+
@@ -6486,6 +6487,7 @@
+
diff --git a/components/mpas-albany-landice/driver/glc_comp_mct.F b/components/mpas-albany-landice/driver/glc_comp_mct.F
index 72f827960636..81c00c328488 100644
--- a/components/mpas-albany-landice/driver/glc_comp_mct.F
+++ b/components/mpas-albany-landice/driver/glc_comp_mct.F
@@ -1554,12 +1554,12 @@ subroutine glc_export_mct(g2x_g, errorCode)
do i = 1, nCellsSolve
n = n + 1
- ! Fogg_rofl
+ ! Fogg_rofl - liquid runoff to ocean
g2x_g % rAttr(index_g2x_Fogg_rofl,n) = avgBareIceAblationApplied(i)
- ! Figg_rofi
- g2x_g % rAttr(index_g2x_Figg_rofi,n) = 0.0 ! placeholder
- ! Fogg_rofi
- g2x_g % rAttr(index_g2x_Fogg_rofi,n) = avgCalvingFlux(i)
+ ! Figg_rofi - solid runoff to sea ice
+ g2x_g % rAttr(index_g2x_Figg_rofi,n) = avgCalvingFlux(i)
+ ! Fogg_rofi - solid runoff to ocean
+ g2x_g % rAttr(index_g2x_Fogg_rofi,n) = 0.0
g2x_g % rAttr(index_g2x_Fogg_rofi,n) = g2x_g % rAttr(index_g2x_Fogg_rofi,n) + avgFaceMeltFlux(i)
if (trim(config_basal_mass_bal_float) == 'ismip6') then
! if MALI is calculating ISMF, add that to rofi
diff --git a/components/mpas-seaice/driver/ice_comp_mct.F b/components/mpas-seaice/driver/ice_comp_mct.F
index 6aaf30708bc2..a8a4b9bcd25f 100644
--- a/components/mpas-seaice/driver/ice_comp_mct.F
+++ b/components/mpas-seaice/driver/ice_comp_mct.F
@@ -874,7 +874,7 @@ end subroutine xml_stream_get_attributes
call t_stopf ('mpassi_mct_init')
- call seq_infodata_PutData( infodata, ice_prognostic=.true.)
+ call seq_infodata_PutData( infodata, ice_prognostic=.true., iceberg_prognostic=.true.)
!-----------------------------------------------------------------------
!
@@ -2095,6 +2095,7 @@ subroutine ice_import_mct(x2i_i, errorCode)!{{{
! The following fields are sometimes received from the coupler,
! depending on model options:
!
+! o rofi -- frozen water flux into sea ice
! o algae1 --
! o algae2 --
! o algae3 --
@@ -2125,6 +2126,10 @@ subroutine ice_import_mct(x2i_i, errorCode)!{{{
! !REVISION HISTORY:
! same as module
+ use seaice_constants, only: &
+ seaiceLatentHeatMelting, & ! latent heat of melting of fresh ice (J/kg)
+ seaiceFreshIceSpecificHeat ! specific heat of fresh ice (J/kg/K)
+
! !INPUT/OUTPUT PARAMETERS:
type(mct_aVect), intent(inout) :: x2i_i
@@ -2161,6 +2166,7 @@ subroutine ice_import_mct(x2i_i, errorCode)!{{{
aerosols, &
atmosCoupling, &
oceanCoupling, &
+ icebergFluxes, &
biogeochemistry
integer, pointer :: nCellsSolve
@@ -2170,7 +2176,11 @@ subroutine ice_import_mct(x2i_i, errorCode)!{{{
config_use_modal_aerosols, &
config_use_zaerosols, &
config_use_column_biogeochemistry, &
- config_couple_biogeochemistry_fields
+ config_couple_biogeochemistry_fields, &
+ config_use_data_icebergs
+
+ real(kind=RKIND), pointer :: &
+ bergTemperature ! iceberg temperature
character(len=strKIND), pointer :: &
config_column_physics_type, &
@@ -2201,6 +2211,8 @@ subroutine ice_import_mct(x2i_i, errorCode)!{{{
snowfallRateField, &
uAirVelocityField, &
vAirVelocityField, &
+ bergFreshwaterFluxField, &
+ bergLatentHeatFluxField, &
oceanNitrateConcField, &
oceanSilicateConcField, &
oceanAmmoniumConcField, &
@@ -2246,6 +2258,8 @@ subroutine ice_import_mct(x2i_i, errorCode)!{{{
snowfallRate, &
uAirVelocity, &
vAirVelocity, &
+ bergFreshwaterFlux, &
+ bergLatentHeatFlux, &
oceanNitrateConc, &
oceanSilicateConc, &
oceanAmmoniumConc, &
@@ -2291,6 +2305,8 @@ subroutine ice_import_mct(x2i_i, errorCode)!{{{
call mpas_pool_get_config(configs, "config_column_physics_type", config_column_physics_type)
call mpas_pool_get_config(configs, "config_thermodynamics_type", config_thermodynamics_type)
call mpas_pool_get_config(configs, "config_ocean_surface_type", config_ocean_surface_type)
+ call MPAS_pool_get_config(configs, "config_use_data_icebergs", config_use_data_icebergs)
+ call MPAS_pool_get_config(configs, "config_iceberg_temperature", bergTemperature)
call mpas_pool_get_config(configs, "config_use_aerosols", config_use_aerosols)
call mpas_pool_get_config(configs, "config_use_modal_aerosols", config_use_modal_aerosols)
call mpas_pool_get_config(configs, "config_use_column_biogeochemistry", config_use_column_biogeochemistry)
@@ -2328,6 +2344,12 @@ subroutine ice_import_mct(x2i_i, errorCode)!{{{
call mpas_pool_get_array(atmosCoupling, 'uAirVelocity', uAirVelocity)
call mpas_pool_get_array(atmosCoupling, 'vAirVelocity', vAirVelocity)
+ if (.not. config_use_data_icebergs) then
+ call MPAS_pool_get_subpool(block_ptr % structs, "berg_fluxes", icebergFluxes)
+ call MPAS_pool_get_array(icebergFluxes, "bergFreshwaterFlux", bergFreshwaterFlux)
+ call MPAS_pool_get_array(icebergFluxes, "bergLatentHeatFlux", bergLatentHeatFlux)
+ endif
+
if (config_use_aerosols) then
call mpas_pool_get_subpool(block_ptr % structs, 'aerosols', aerosols)
@@ -2417,6 +2439,13 @@ subroutine ice_import_mct(x2i_i, errorCode)!{{{
uAirVelocity(i) = x2i_i % rAttr(index_x2i_Sa_u, n)
vAirVelocity(i) = x2i_i % rAttr(index_x2i_Sa_v, n)
+ ! if not using data icebergs, import icebergs here
+ if (.not. config_use_data_icebergs) then
+ bergFreshwaterFlux(i) = x2i_i % rAttr(index_x2i_Fixx_rofi, n)
+ bergLatentHeatFlux(i) = bergFreshwaterFlux(i) * &
+ (seaiceLatentHeatMelting - seaiceFreshIceSpecificHeat*bergTemperature)
+ endif
+
! set aerosols, if configured
if (config_use_aerosols) then
if (config_use_modal_aerosols) then
@@ -2641,6 +2670,14 @@ subroutine ice_import_mct(x2i_i, errorCode)!{{{
call mpas_dmpar_exch_halo_field(uAirVelocityField)
call mpas_dmpar_exch_halo_field(vAirVelocityField)
+ if (.not. config_use_data_icebergs) then
+ call mpas_pool_get_subpool(domain % blocklist % structs, 'berg_fluxes', icebergFluxes)
+ call mpas_pool_get_field(icebergFluxes, 'bergFreshwaterFlux', bergFreshwaterFluxField)
+ call mpas_pool_get_field(icebergFluxes, 'bergLatentHeatFlux', bergLatentHeatFluxField)
+ call mpas_dmpar_exch_halo_field(bergFreshwaterFluxField)
+ call mpas_dmpar_exch_halo_field(bergLatentHeatFluxField)
+ endif
+
if (config_use_aerosols) then
call mpas_dmpar_exch_halo_field(atmosAerosolFluxField)
endif
@@ -2742,8 +2779,7 @@ subroutine ice_export_mct(i2x_i, errorCode) !{{{
config_use_column_biogeochemistry, &
config_use_zaerosols, &
config_couple_biogeochemistry_fields, &
- config_use_column_shortwave, &
- config_use_data_icebergs
+ config_use_column_shortwave
real(kind=RKIND), pointer :: &
sphere_radius
@@ -2818,7 +2854,6 @@ subroutine ice_export_mct(i2x_i, errorCode) !{{{
call MPAS_pool_get_config(configs, "config_use_column_biogeochemistry", config_use_column_biogeochemistry)
call mpas_pool_get_config(configs, "config_couple_biogeochemistry_fields", config_couple_biogeochemistry_fields)
call MPAS_pool_get_config(configs, "config_use_column_shortwave", config_use_column_shortwave)
- call MPAS_pool_get_config(configs, "config_use_data_icebergs", config_use_data_icebergs)
call MPAS_pool_get_subpool(block_ptr % structs, 'mesh', meshPool)
call MPAS_pool_get_subpool(block_ptr % structs, "tracers_aggregate", tracersAggregate)
@@ -2872,12 +2907,10 @@ subroutine ice_export_mct(i2x_i, errorCode) !{{{
call MPAS_pool_get_array(oceanFluxes, 'oceanFreshWaterFlux', oceanFreshWaterFlux)
call MPAS_pool_get_array(oceanFluxes, 'oceanSaltFlux', oceanSaltFlux)
- if (config_use_data_icebergs) then
- call MPAS_pool_get_subpool(block_ptr % structs, "berg_fluxes", icebergFluxes)
+ call MPAS_pool_get_subpool(block_ptr % structs, "berg_fluxes", icebergFluxes)
- call MPAS_pool_get_array(icebergFluxes, "bergFreshwaterFlux", bergFreshwaterFlux)
- call MPAS_pool_get_array(icebergFluxes, "bergLatentHeatFlux", bergLatentHeatFlux)
- endif
+ call MPAS_pool_get_array(icebergFluxes, "bergFreshwaterFlux", bergFreshwaterFlux)
+ call MPAS_pool_get_array(icebergFluxes, "bergLatentHeatFlux", bergLatentHeatFlux)
if (config_use_column_biogeochemistry .and. config_couple_biogeochemistry_fields) then
call mpas_pool_get_subpool(block_ptr % structs, 'biogeochemistry', biogeochemistry)
@@ -2956,10 +2989,10 @@ subroutine ice_export_mct(i2x_i, errorCode) !{{{
!-------states--------------------
i2x_i % rAttr(index_i2x_Si_ifrac ,n) = ailohi
- if (config_use_data_icebergs) then
- i2x_i % rAttr(index_i2x_Fioi_bergw,n) = bergFreshwaterFlux(i)
- i2x_i % rAttr(index_i2x_Fioi_bergh,n) = bergLatentHeatFlux(i)
- endif
+ ! Always export berg fluxes - they are either from coupler or from data
+ ! but either way have been assigned at this point
+ i2x_i % rAttr(index_i2x_Fioi_bergw,n) = bergFreshwaterFlux(i)
+ i2x_i % rAttr(index_i2x_Fioi_bergh,n) = bergLatentHeatFlux(i)
if ( ailohi > 0.0_RKIND ) then
diff --git a/components/mpas-seaice/driver/mpassi_cpl_indices.F b/components/mpas-seaice/driver/mpassi_cpl_indices.F
index 8646233475bb..b32fae41c04b 100644
--- a/components/mpas-seaice/driver/mpassi_cpl_indices.F
+++ b/components/mpas-seaice/driver/mpassi_cpl_indices.F
@@ -87,6 +87,7 @@ module mpassi_cpl_indices
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_Fixx_rofi ! flux: frozen water flux into sea ice
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
@@ -214,6 +215,7 @@ 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_Fixx_rofi = mct_avect_indexra(x2i,'Fixx_rofi')
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 ed94bb094e88..fa2a2dae6fb6 100644
--- a/components/mpas-seaice/src/Registry.xml
+++ b/components/mpas-seaice/src/Registry.xml
@@ -4967,7 +4967,7 @@
-
+
rof2ocn runoff mapping file decomp type
+
+ char
+ idmap
+ run_domain
+ env_run.xml
+ rof2ice runoff mapping file
+
+
+
+ char
+ X,Y
+ Y
+ run_domain
+ env_run.xml
+ rof2ice runoff mapping file decomp type
+
+
char
idmap
diff --git a/driver-mct/cime_config/namelist_definition_drv.xml b/driver-mct/cime_config/namelist_definition_drv.xml
index 227d4619869c..228f237dcd0b 100644
--- a/driver-mct/cime_config/namelist_definition_drv.xml
+++ b/driver-mct/cime_config/namelist_definition_drv.xml
@@ -4748,6 +4748,35 @@
+
+ char
+ mapping
+ abs
+ seq_maps
+
+ runoff to ice mapping file
+
+
+ $ROF2ICE_RMAPNAME
+
+
+
+
+ char
+ mapping
+ seq_maps
+
+ The type of mapping desired, either "source" or "destination" mapping.
+ X is associated with rearrangement of the source grid to the
+ destination grid and then local mapping. Y is associated with mapping
+ on the source grid and then rearrangement and sum to the destination
+ grid.
+
+
+ $ROF2ICE_RMAPTYPE
+ X
+
+
char
diff --git a/driver-mct/main/prep_ice_mod.F90 b/driver-mct/main/prep_ice_mod.F90
index 36c478f6fc21..4e8a849c50c9 100644
--- a/driver-mct/main/prep_ice_mod.F90
+++ b/driver-mct/main/prep_ice_mod.F90
@@ -561,7 +561,7 @@ subroutine prep_ice_calc_g2x_ix(timer)
do egi = 1,num_inst_glc
g2x_gx => component_get_c2x_cx(glc(egi))
call seq_map_map(mapper_Rg2i, g2x_gx, g2x_ix(egi), &
- fldlist='Fixx_rofi', norm=.true.)
+ fldlist='Figg_rofi', norm=.true.)
enddo
call t_drvstopf (trim(timer))