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-ocean/cime_config/testdefs/testmods_dirs/mpaso/scaled_dib_dismf/README b/components/mpas-ocean/cime_config/testdefs/testmods_dirs/mpaso/scaled_dib_dismf/README
index f9f97d27de15..cb260f0638e4 100644
--- a/components/mpas-ocean/cime_config/testdefs/testmods_dirs/mpaso/scaled_dib_dismf/README
+++ b/components/mpas-ocean/cime_config/testdefs/testmods_dirs/mpaso/scaled_dib_dismf/README
@@ -2,7 +2,7 @@ This testdef is used to test a stealth feature in mpaso and mpassi introduced
by PR #6696. It simply changes sets the following namelist option in mpaso
to true
config_scale_dismf_by_removed_ice_runoff
-and the following namelist option in mpassi to true
- config_scale_dib_by_removed_ice_runoff
+and the following namelist option in mpassi
+ config_dib_scale_mode = 'removed_ice_runoff'
These flags only makes sense to use in a B-case runs with data icebergs (DIB)
and data ice-shelf melt fluxes (DISMF).
diff --git a/components/mpas-ocean/cime_config/testdefs/testmods_dirs/mpaso/scaled_dib_dismf/user_nl_mpassi b/components/mpas-ocean/cime_config/testdefs/testmods_dirs/mpaso/scaled_dib_dismf/user_nl_mpassi
index 8512001af932..25d3cc3c9c8c 100644
--- a/components/mpas-ocean/cime_config/testdefs/testmods_dirs/mpaso/scaled_dib_dismf/user_nl_mpassi
+++ b/components/mpas-ocean/cime_config/testdefs/testmods_dirs/mpaso/scaled_dib_dismf/user_nl_mpassi
@@ -1 +1 @@
- config_scale_dib_by_removed_ice_runoff = .true.
+ config_dib_scale_mode = 'removed_ice_runoff'
diff --git a/components/mpas-seaice/bld/build-namelist b/components/mpas-seaice/bld/build-namelist
index 462454f828d5..b150b80b00ac 100755
--- a/components/mpas-seaice/bld/build-namelist
+++ b/components/mpas-seaice/bld/build-namelist
@@ -940,7 +940,7 @@ if ($iceberg_mode eq 'data') {
add_default($nl, 'config_use_data_icebergs', 'val'=>"false");
}
add_default($nl, 'config_iceberg_temperature');
-add_default($nl, 'config_scale_dib_by_removed_ice_runoff');
+add_default($nl, 'config_dib_scale_mode');
add_default($nl, 'config_salt_flux_coupling_type');
add_default($nl, 'config_ice_ocean_drag_coefficient');
diff --git a/components/mpas-seaice/bld/build-namelist-section b/components/mpas-seaice/bld/build-namelist-section
index 467e04c7908b..24c5739931e7 100644
--- a/components/mpas-seaice/bld/build-namelist-section
+++ b/components/mpas-seaice/bld/build-namelist-section
@@ -446,7 +446,7 @@ add_default($nl, 'config_sea_freezing_temperature_type');
add_default($nl, 'config_ocean_surface_type');
add_default($nl, 'config_use_data_icebergs');
add_default($nl, 'config_iceberg_temperature');
-add_default($nl, 'config_scale_dib_by_removed_ice_runoff');
+add_default($nl, 'config_dib_scale_mode');
add_default($nl, 'config_salt_flux_coupling_type');
add_default($nl, 'config_ice_ocean_drag_coefficient');
diff --git a/components/mpas-seaice/bld/namelist_files/namelist_defaults_mpassi.xml b/components/mpas-seaice/bld/namelist_files/namelist_defaults_mpassi.xml
index 336c67a42848..bce5fa9121db 100644
--- a/components/mpas-seaice/bld/namelist_files/namelist_defaults_mpassi.xml
+++ b/components/mpas-seaice/bld/namelist_files/namelist_defaults_mpassi.xml
@@ -457,7 +457,7 @@
'free'
false
-4.0
-false
+'none'
'constant'
0.00536
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 193fab7a5e04..27d59b97948b 100644
--- a/components/mpas-seaice/bld/namelist_files/namelist_definition_mpassi.xml
+++ b/components/mpas-seaice/bld/namelist_files/namelist_definition_mpassi.xml
@@ -2662,11 +2662,11 @@ Valid values: Any real number.
Default: Defined in namelist_defaults.xml
-
-Whether to scale data iceberg fluxes by the running mean of removed ice runoff
+How to scale data iceberg fluxes: 'none'=no scaling, 'removed_ice_runoff'=running mean of removed ice runoff, 'coupler_ice_runoff'=sum of Fixx_rofi from coupler"
-Valid values: true or false
+Valid values: 'none', 'removed_ice_runoff','coupler_ice_runoff'
Default: Defined in namelist_defaults.xml
diff --git a/components/mpas-seaice/cime_config/buildnml b/components/mpas-seaice/cime_config/buildnml
index 68ba3075a44a..a1acddf6d9d7 100755
--- a/components/mpas-seaice/cime_config/buildnml
+++ b/components/mpas-seaice/cime_config/buildnml
@@ -680,6 +680,7 @@ def buildnml(case, caseroot, compname):
lines.append(' input_interval="none" >')
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 6aaf30708bc2..54e4f37b9675 100644
--- a/components/mpas-seaice/driver/ice_comp_mct.F
+++ b/components/mpas-seaice/driver/ice_comp_mct.F
@@ -243,8 +243,8 @@ subroutine ice_init_mct( EClock, cdata_i, x2i_i, i2x_i, NLFilename )!{{{
#endif
logical, pointer :: &
- tempLogicalConfig, &
- config_scale_dib_by_removed_ice_runoff
+ tempLogicalConfig
+ character(len=StrKIND), pointer :: config_dib_scale_mode
character(len=StrKIND), pointer :: tempCharConfig
real (kind=RKIND), pointer :: tempRealConfig
@@ -504,8 +504,8 @@ end subroutine xml_stream_get_attributes
end if
- call MPAS_pool_get_config(domain % configs, "config_scale_dib_by_removed_ice_runoff", &
- config_scale_dib_by_removed_ice_runoff)
+ call MPAS_pool_get_config(domain % configs, "config_dib_scale_mode", &
+ config_dib_scale_mode)
! Setup MPASSI simulation clock
ierr = domain % core % setup_clock(domain % clock, domain % configs)
@@ -638,7 +638,7 @@ end subroutine xml_stream_get_attributes
! Determine coupling type
call seq_infodata_GetData(infodata, cpl_seq_option=cpl_seq_option)
- if (config_scale_dib_by_removed_ice_runoff) then
+ if (trim(config_dib_scale_mode) == 'removed_ice_runoff') then
! independent of space so should be no need to loop over blocks
block => domain % blocklist
call MPAS_pool_get_subpool(block % structs, "berg_forcing", berg_forcing)
@@ -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.)
!-----------------------------------------------------------------------
!
@@ -1186,8 +1186,9 @@ subroutine ice_run_mct( EClock, cdata_i, x2i_i, i2x_i)!{{{
integer :: ierr, streamDirection, iam
logical :: streamActive, debugOn
logical, pointer :: &
- config_write_output_on_startup, &
- config_scale_dib_by_removed_ice_runoff
+ config_write_output_on_startup
+ character (len=StrKIND), pointer :: &
+ config_dib_scale_mode
logical, save :: first=.true.
character (len=StrKIND), pointer :: &
config_restart_timestamp_name, &
@@ -1218,8 +1219,8 @@ subroutine ice_run_mct( EClock, cdata_i, x2i_i, i2x_i)!{{{
call MPAS_pool_get_config(domain % configs, 'config_restart_timestamp_name', config_restart_timestamp_name)
call MPAS_pool_get_config(domain % configs, "config_column_physics_type", config_column_physics_type)
- call MPAS_pool_get_config(domain % configs, "config_scale_dib_by_removed_ice_runoff", &
- config_scale_dib_by_removed_ice_runoff)
+ call MPAS_pool_get_config(domain % configs, "config_dib_scale_mode", &
+ config_dib_scale_mode)
! Setup log information.
call shr_file_getLogUnit (shrlogunit)
@@ -1255,7 +1256,7 @@ subroutine ice_run_mct( EClock, cdata_i, x2i_i, i2x_i)!{{{
! Post coupling calls
block => domain % blocklist
- if (config_scale_dib_by_removed_ice_runoff) then
+ if (trim(config_dib_scale_mode) == 'removed_ice_runoff') then
! independent of space so should be no need to loop over blocks
call MPAS_pool_get_subpool(block % structs, "berg_forcing", berg_forcing)
call MPAS_pool_get_array(berg_forcing, "runningMeanRemovedIceRunoff", &
@@ -2095,6 +2096,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 +2127,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 +2167,7 @@ subroutine ice_import_mct(x2i_i, errorCode)!{{{
aerosols, &
atmosCoupling, &
oceanCoupling, &
+ icebergFluxes, &
biogeochemistry
integer, pointer :: nCellsSolve
@@ -2170,12 +2177,17 @@ 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, &
config_thermodynamics_type, &
- config_ocean_surface_type
+ config_ocean_surface_type, &
+ config_dib_scale_mode
type (field1DReal), pointer :: &
seaSurfaceTemperatureField, &
@@ -2201,6 +2213,8 @@ subroutine ice_import_mct(x2i_i, errorCode)!{{{
snowfallRateField, &
uAirVelocityField, &
vAirVelocityField, &
+ bergFreshwaterFluxField, &
+ bergLatentHeatFluxField, &
oceanNitrateConcField, &
oceanSilicateConcField, &
oceanAmmoniumConcField, &
@@ -2246,6 +2260,8 @@ subroutine ice_import_mct(x2i_i, errorCode)!{{{
snowfallRate, &
uAirVelocity, &
vAirVelocity, &
+ bergFreshwaterFlux, &
+ bergLatentHeatFlux, &
oceanNitrateConc, &
oceanSilicateConc, &
oceanAmmoniumConc, &
@@ -2291,6 +2307,9 @@ 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_dib_scale_mode", config_dib_scale_mode)
+ 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 +2347,10 @@ subroutine ice_import_mct(x2i_i, errorCode)!{{{
call mpas_pool_get_array(atmosCoupling, 'uAirVelocity', uAirVelocity)
call mpas_pool_get_array(atmosCoupling, 'vAirVelocity', vAirVelocity)
+ 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)
+
if (config_use_aerosols) then
call mpas_pool_get_subpool(block_ptr % structs, 'aerosols', aerosols)
@@ -2417,6 +2440,10 @@ 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)
+ bergFreshwaterFlux(i) = x2i_i % rAttr(index_x2i_Fixx_rofi, n)
+ bergLatentHeatFlux(i) = bergFreshwaterFlux(i) * &
+ (seaiceLatentHeatMelting - seaiceFreshIceSpecificHeat*bergTemperature)
+
! set aerosols, if configured
if (config_use_aerosols) then
if (config_use_modal_aerosols) then
@@ -2641,6 +2668,12 @@ subroutine ice_import_mct(x2i_i, errorCode)!{{{
call mpas_dmpar_exch_halo_field(uAirVelocityField)
call mpas_dmpar_exch_halo_field(vAirVelocityField)
+ 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)
+
if (config_use_aerosols) then
call mpas_dmpar_exch_halo_field(atmosAerosolFluxField)
endif
@@ -2668,6 +2701,10 @@ subroutine ice_import_mct(x2i_i, errorCode)!{{{
call mpas_dmpar_exch_halo_field(oceanDissolvedIronConcField)
endif
+ if (trim(config_dib_scale_mode) == 'coupler_ice_runoff') then
+ call scale_icebergs(domain)
+ endif
+
! REVISION HISTORY:
! Revised Andrew Roberts May 2021
!-----------------------------------------------------------------------
@@ -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
@@ -3248,6 +3281,110 @@ subroutine frazil_mass(freezingPotential, frazilMassFlux, seaSurfaceSalinity)
end subroutine frazil_mass!}}}
+
+ subroutine scale_icebergs(domain)
+ use seaice_constants, only: &
+ seaiceLatentHeatMelting, & ! latent heat of melting of fresh ice (J/kg)
+ seaiceFreshIceSpecificHeat ! specific heat of fresh ice (J/kg/K)
+
+ type(domain_type), intent(inout) :: &
+ domain
+
+ type(block_type), pointer :: &
+ block
+
+ type(MPAS_pool_type), pointer :: &
+ mesh, &
+ berg_forcing, &
+ berg_fluxes
+
+ integer, pointer :: &
+ nCellsSolve
+
+ real(kind=RKIND), dimension(:), pointer :: &
+ bergFreshwaterFluxData, & ! iceberg freshwater flux read in from file (kg/m^2/s)
+ bergFreshwaterFlux, & ! iceberg freshwater flux for ocean (kg/m^2/s)
+ bergLatentHeatFlux, & ! iceberg latent heat flux for ocean (J/m^2/s)
+ areaCell, &
+ latCell
+
+ real(kind=RKIND), pointer :: &
+ bergTemperature, & ! iceberg temperature
+ areaIntegAnnMeanDataIcebergFreshwaterFlux, & ! area integrated, annual mean freshwater flux from icebegs and ice shelves (kg/s)
+ runningMeanRemovedIceRunoff ! the area integrated, running mean of removed ice runoff (kg/s)
+
+ integer :: &
+ iCell
+
+ real(kind=RKIND) :: &
+ scaling, &
+ globalBergFluxIn, &
+ globalBergFluxOut
+
+ call MPAS_pool_get_config(domain % configs, "config_iceberg_temperature", &
+ bergTemperature)
+
+
+ ! global reudction of coupler ice runoff
+ globalBergFluxIn = 0.0_RKIND
+ globalBergFluxOut = 0.0_RKIND
+ block => domain % blocklist
+ do while (associated(block))
+
+ call MPAS_pool_get_subpool(block % structs, "mesh", mesh)
+ call MPAS_pool_get_subpool(block % structs, "berg_fluxes", berg_fluxes)
+ call MPAS_pool_get_subpool(block % structs, "berg_forcing", berg_forcing)
+
+ call MPAS_pool_get_dimension(mesh, "nCellsSolve", nCellsSolve)
+ call MPAS_pool_get_array(mesh, "areaCell", areaCell)
+ call MPAS_pool_get_array(mesh, "latCell", latCell)
+
+ call MPAS_pool_get_array(berg_fluxes, "bergFreshwaterFlux", bergFreshwaterFlux)
+ call mpas_pool_get_array(berg_forcing, 'areaIntegAnnMeanDataIcebergFreshwaterFlux', &
+ areaIntegAnnMeanDataIcebergFreshwaterFlux)
+
+ do iCell = 1, nCellsSolve
+ ! TODO: Generalize to both ice sheets, accounting for the possibility of rofi from
+ ! runoff model at low-mid latitudes
+ if ((latCell(iCell) < 0.0_RKIND) .and. (bergFreshwaterFlux(iCell) > 0.0_RKIND)) then
+ globalBergFluxIn = globalBergFluxIn + areaCell(iCell) * bergFreshwaterFlux(iCell)
+ endif
+ enddo
+
+ block => block % next
+ enddo
+
+ call mpas_dmpar_sum_real(domain % dminfo, globalBergFluxIn, globalBergFluxOut)
+ scaling = globalBergFluxOut / areaIntegAnnMeanDataIcebergFreshwaterFlux
+ call mpas_log_write("globalBergIn=$r, globalBergOut=$r, areaIntegAnnMeanDataIcebergFreshwaterFlux=$r, iceberg flux scaling=$r", realArgs=(/globalBergFluxIn, globalBergFluxOut, areaIntegAnnMeanDataIcebergFreshwaterFlux, scaling/))
+ if (scaling == 0.0_RKIND) scaling = 1.0_RKIND ! coupler rofi flux may be 0 on first coupling interval
+
+ block => domain % blocklist
+ do while (associated(block))
+
+ call MPAS_pool_get_subpool(block % structs, "mesh", mesh)
+ call MPAS_pool_get_subpool(block % structs, "berg_forcing", berg_forcing)
+ call MPAS_pool_get_subpool(block % structs, "berg_fluxes", berg_fluxes)
+
+ call MPAS_pool_get_dimension(mesh, "nCellsSolve", nCellsSolve)
+
+ call MPAS_pool_get_array(berg_forcing, "bergFreshwaterFluxData", bergFreshwaterFluxData)
+ call MPAS_pool_get_array(berg_fluxes, "bergFreshwaterFlux", bergFreshwaterFlux)
+ call MPAS_pool_get_array(berg_fluxes, "bergLatentHeatFlux", bergLatentHeatFlux)
+
+ do iCell = 1, nCellsSolve
+
+ bergFreshwaterFlux(iCell) = scaling * bergFreshwaterFluxData(iCell)
+ bergLatentHeatFlux(iCell) = -scaling * bergFreshwaterFluxData(iCell) * &
+ (seaiceLatentHeatMelting - seaiceFreshIceSpecificHeat*bergTemperature)
+ enddo
+
+ block => block % next
+ enddo
+
+ end subroutine scale_icebergs
+
+
!***********************************************************************
!BOP
!
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..bd088130f598 100644
--- a/components/mpas-seaice/src/Registry.xml
+++ b/components/mpas-seaice/src/Registry.xml
@@ -1866,9 +1866,9 @@
description="Initial temperature of icebergs."
possible_values="Any real number."
/>
-
+
-
+
domain % blocklist
call MPAS_pool_get_subpool(block % structs, "berg_forcing", berg_forcing)
call mpas_pool_get_array(berg_forcing, 'runningMeanRemovedIceRunoff', runningMeanRemovedIceRunoff)
call mpas_pool_get_array(berg_forcing, 'areaIntegAnnMeanDataIcebergIceShelfFreshwaterFlux', &
areaIntegAnnMeanDataIcebergIceShelfFreshwaterFlux)
scaling = runningMeanRemovedIceRunoff / areaIntegAnnMeanDataIcebergIceShelfFreshwaterFlux
- else
+
+ elseif (trim(config_dib_scale_mode) == 'coupler_ice_runoff') then
+ return ! handled in ice_comp_mct.F
+
+ elseif (trim(config_dib_scale_mode) == 'none') then
scaling = 1.0_RKIND
+ else
+ call mpas_log_write('Unknown value for config_dib_scale_mode', MPAS_LOG_ERR)
+ ! TODO: how to throw an error?
+ return
end if
block => domain % blocklist
diff --git a/driver-mct/cime_config/config_component.xml b/driver-mct/cime_config/config_component.xml
index b065cae41f40..b9df3738f8da 100644
--- a/driver-mct/cime_config/config_component.xml
+++ b/driver-mct/cime_config/config_component.xml
@@ -1738,6 +1738,23 @@
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))