diff --git a/components/mpas-ocean/bld/build-namelist b/components/mpas-ocean/bld/build-namelist index 76da422dc997..79b527e4f402 100755 --- a/components/mpas-ocean/bld/build-namelist +++ b/components/mpas-ocean/bld/build-namelist @@ -782,7 +782,7 @@ if ($OCN_ISMF eq 'coupled') { } elsif ($OCN_ISMF eq 'internal') { add_default($nl, 'config_land_ice_flux_mode', 'val'=>"standalone"); } else { - add_default($nl, 'config_land_ice_flux_mode', 'val'=>"pressure_only"); + add_default($nl, 'config_land_ice_flux_mode'); } add_default($nl, 'config_land_ice_flux_formulation'); add_default($nl, 'config_land_ice_flux_useHollandJenkinsAdvDiff'); diff --git a/components/mpas-ocean/bld/namelist_files/namelist_defaults_mpaso.xml b/components/mpas-ocean/bld/namelist_files/namelist_defaults_mpaso.xml index e2bacaff9779..21ae2bafc47c 100644 --- a/components/mpas-ocean/bld/namelist_files/namelist_defaults_mpaso.xml +++ b/components/mpas-ocean/bld/namelist_files/namelist_defaults_mpaso.xml @@ -333,12 +333,12 @@ 'off' -'standalone' -'standalone' -'standalone' -'standalone' -'standalone' -'standalone' +'pressure_only' +'pressure_only' +'pressure_only' +'pressure_only' +'pressure_only' +'pressure_only' 'Jenkins' .false. 10.0 diff --git a/components/mpas-ocean/cime_config/buildnml b/components/mpas-ocean/cime_config/buildnml index dda7531576ab..0061f4ff75e9 100755 --- a/components/mpas-ocean/cime_config/buildnml +++ b/components/mpas-ocean/cime_config/buildnml @@ -90,10 +90,10 @@ def buildnml(case, caseroot, compname): decomp_prefix = 'mpas-o.graph.info.' restoring_file = 'sss.monthlyClimatology.PHC2_salx_040803.oEC60to30v3wLI.nc' analysis_mask_file = 'masks_SingleRegionAtlanticWTransportTransects_EC60to30v3wLI_171116.nc' - ic_date = '171031' + ic_date = '230220' ic_prefix = 'oEC60to30v3wLI60lev' if ocn_ic_mode == 'spunup': - ic_date = '171116' + ic_date = '230220' ic_prefix = 'oEC60to30v3wLI60lev.restart_theta_year26' elif ocn_grid == 'ECwISC30to60E1r2': @@ -101,7 +101,7 @@ def buildnml(case, caseroot, compname): decomp_prefix = 'mpas-o.graph.info.' restoring_file = 'sss.PHC2_monthlyClimatology.ECwISC30to60E1r02.200408.nc' analysis_mask_file = 'ECwISC30to60E1r02_transportTransects.nc' - ic_date = '200408' + ic_date = '230220' ic_prefix = 'ocean.ECwISC30to60E1r2' if ocn_ic_mode == 'spunup': logger.warning("WARNING: The specified compset is requesting ocean ICs spunup from a G-case") @@ -128,7 +128,7 @@ def buildnml(case, caseroot, compname): elif ocn_grid == 'oQU240wLI': decomp_date = '160929' decomp_prefix = 'mpas-o.graph.info.' - ic_date = '160929' + ic_date = '230220' ic_prefix = 'ocean.QU.240wLI' if ocn_ic_mode == 'spunup': logger.warning("WARNING: The specified compset is requesting ocean ICs spunup from a G-case") @@ -159,7 +159,7 @@ def buildnml(case, caseroot, compname): decomp_prefix = 'mpas-o.graph.info.' restoring_file = 'sss.monthlyClimatology.PHC2_salx.2004_08_03.180503.nc' analysis_mask_file = 'masks_SingleRegionAtlanticWTransportTransects_RRS30to10v3wLI.nc' - ic_date = '171109' + ic_date = '230220' ic_prefix = 'oRRS30to10v3wLI' if ocn_ic_mode == 'spunup': logger.warning("WARNING: The specified compset is requesting ocean ICs spunup from a G-case") @@ -261,10 +261,10 @@ def buildnml(case, caseroot, compname): decomp_prefix = 'mpas-o.graph.info.' restoring_file = 'sss.PHC2_monthlyClimatology.SOwISC12to60E2r4_nomask.210120.nc' analysis_mask_file = 'SOwISC12to60E2r4_mocBasinsAndTransects20210623.nc' - ic_date = '210107' + ic_date = '230220' ic_prefix = 'ocean.SOwISC12to60E2r4' if ocn_ic_mode == 'spunup': - ic_date = '210203' + ic_date = '230220' ic_prefix = 'mpaso.SOwISC12to60E2r4.rstFromG-anvil' elif ocn_grid == 'ECwISC30to60E2r1': @@ -272,10 +272,10 @@ def buildnml(case, caseroot, compname): decomp_prefix = 'mpas-o.graph.info.' restoring_file = 'sss.PHC2_monthlyClimatology.ECwISC30to60E2r1_nomask.201221.nc' analysis_mask_file = 'ECwISC30to60E2r1_mocBasinsAndTransects20210623.nc' - ic_date = '210413' + ic_date = '230220' ic_prefix = 'ocean.ECwISC30to60E2r1' if ocn_ic_mode == 'spunup': - ic_date = '210414' + ic_date = '230220' ic_prefix = 'mpaso.ECwISC30to60E2r1.rstFromG-anvil' diff --git a/components/mpas-ocean/driver/ocn_comp_mct.F b/components/mpas-ocean/driver/ocn_comp_mct.F index 9c47dc25715b..71fa9a14d061 100644 --- a/components/mpas-ocean/driver/ocn_comp_mct.F +++ b/components/mpas-ocean/driver/ocn_comp_mct.F @@ -790,10 +790,9 @@ end subroutine xml_stream_get_attributes call t_stopf ('mpaso_mct_init') call mpas_pool_get_config(domain % configs, 'config_land_ice_flux_mode', config_land_ice_flux_mode) - if ( trim(config_land_ice_flux_mode) .eq. 'pressure_only' ) then - call seq_infodata_PutData( infodata, ocn_prognostic=.true., ocnrof_prognostic=.true., & - ocn_c2_glcshelf=.false.) - else if ( trim(config_land_ice_flux_mode) .eq. 'standalone' ) then + if ( trim(config_land_ice_flux_mode) == 'off' .or. & + trim(config_land_ice_flux_mode) == 'pressure_only' .or. & + trim(config_land_ice_flux_mode) == 'standalone' ) then call seq_infodata_PutData( infodata, ocn_prognostic=.true., ocnrof_prognostic=.true., & ocn_c2_glcshelf=.false.) else if ( trim(config_land_ice_flux_mode) .eq. 'coupled' ) then @@ -2784,7 +2783,8 @@ subroutine ocn_export_mct(o2x_o, errorCode) !{{{ !JW o2x_o % rAttr(index_o2x_So_htv, n) = landIceHeatTransferVelocity(i) !JW o2x_o % rAttr(index_o2x_So_stv, n) = landIceSaltTransferVelocity(i) - if ( trim(config_land_ice_flux_mode) .ne. 'pressure_only' ) then + if ( trim(config_land_ice_flux_mode) .eq. 'standalone' .or. & + trim(config_land_ice_flux_mode) .eq. 'coupled' ) then o2x_o % rAttr(index_o2x_So_blt, n) = landIceBoundaryLayerTracers(indexBLT,i) o2x_o % rAttr(index_o2x_So_bls, n) = landIceBoundaryLayerTracers(indexBLS,i) o2x_o % rAttr(index_o2x_So_htv, n) = landIceTracerTransferVelocities(indexHeatTrans,i) diff --git a/components/mpas-ocean/src/Registry.xml b/components/mpas-ocean/src/Registry.xml index ec873e494282..99438351fb8e 100644 --- a/components/mpas-ocean/src/Registry.xml +++ b/components/mpas-ocean/src/Registry.xml @@ -1640,6 +1640,8 @@ + + + + + + @@ -1990,6 +1996,7 @@ immutable="true"> + @@ -2106,6 +2113,8 @@ + + @@ -3612,6 +3621,14 @@ description="Mask indicating where land-ice is present (1) or absent (0)" packages="landIcePressurePKG" /> + + + = 0.0_RKIND)) cycle + if ((landIceFloatingMask(iCell) == 0) .or. (landIceFreshwaterFlux(iCell) >= 0.0_RKIND)) cycle landIceInterfaceTracers(indexIS,iCell) = freezeInterfaceSalinity(iCell) landIceInterfaceTracers(indexIT,iCell) = freezeInterfaceTemperature(iCell) @@ -593,7 +593,7 @@ subroutine ocn_surface_land_ice_fluxes_build_arrays(meshPool, & end do else ! not using Holland and Jenkins advection/diffusion call compute_melt_fluxes( & - landIceMask, & + landIceFloatingMask, & landIceBoundaryLayerTracers(indexBLT,:), & landIceBoundaryLayerTracers(indexBLS,:), & landIceTracerTransferVelocities(indexHeatTrans,:), & @@ -613,13 +613,13 @@ subroutine ocn_surface_land_ice_fluxes_build_arrays(meshPool, & end if end if - ! modulate the fluxes by the landIceFraction + ! modulate the fluxes by the landIceFloatingFraction do iCell = 1, nCells - if (landIceMask(iCell) == 0) cycle + if (landIceFloatingMask(iCell) == 0) cycle - landIceFreshwaterFlux(iCell) = landIceFraction(iCell)*landIceFreshwaterFlux(iCell) - landIceHeatFlux(iCell) = landIceFraction(iCell)*landIceHeatFlux(iCell) - heatFluxToLandIce(iCell) = landIceFraction(iCell)*heatFluxToLandIce(iCell) + landIceFreshwaterFlux(iCell) = landIceFloatingFraction(iCell)*landIceFreshwaterFlux(iCell) + landIceHeatFlux(iCell) = landIceFloatingFraction(iCell)*landIceHeatFlux(iCell) + heatFluxToLandIce(iCell) = landIceFloatingFraction(iCell)*heatFluxToLandIce(iCell) end do endif ! jenkinsOn or hollandJenkinsOn diff --git a/components/mpas-ocean/src/shared/mpas_ocn_time_varying_forcing.F b/components/mpas-ocean/src/shared/mpas_ocn_time_varying_forcing.F index 6b1bef26feeb..8e64618a27ad 100644 --- a/components/mpas-ocean/src/shared/mpas_ocn_time_varying_forcing.F +++ b/components/mpas-ocean/src/shared/mpas_ocn_time_varying_forcing.F @@ -442,6 +442,10 @@ subroutine init_land_ice_forcing(domain)!{{{ "landIceFraction", "land_ice_forcing", "timeVaryingForcing", "landIceFractionForcing", "linear", & config_time_varying_land_ice_forcing_reference_time, config_time_varying_land_ice_forcing_interval) + call mpas_forcing_init_field(domain % streamManager, forcingGroupHead, "ocn_land_ice_forcing", & + "landIceFloatingFraction", "land_ice_forcing", "timeVaryingForcing", "landIceFloatingFractionForcing", "linear", & + config_time_varying_land_ice_forcing_reference_time, config_time_varying_land_ice_forcing_interval) + call mpas_forcing_init_field(domain % streamManager, forcingGroupHead, "ocn_land_ice_forcing", & "landIceDraft", "land_ice_forcing", "timeVaryingForcing", "landIceDraftForcing", "linear", & config_time_varying_land_ice_forcing_reference_time, config_time_varying_land_ice_forcing_interval) @@ -495,6 +499,8 @@ subroutine land_ice_forcing(streamManager, domain, simulationClock)!{{{ real(kind=RKIND), dimension(:), pointer :: & landIceFractionForcing, & landIceFraction, & + landIceFloatingFractionForcing, & + landIceFloatingFraction, & landIcePressureForcing, & landIcePressure, & landIceDraftForcing, & @@ -525,15 +531,18 @@ subroutine land_ice_forcing(streamManager, domain, simulationClock)!{{{ call MPAS_pool_get_dimension(mesh, "nCells", nCells) call MPAS_pool_get_array(timeVaryingForcingPool, "landIceFractionForcing", landIceFractionForcing) + call MPAS_pool_get_array(timeVaryingForcingPool, "landIceFloatingFractionForcing", landIceFloatingFractionForcing) call MPAS_pool_get_array(timeVaryingForcingPool, "landIcePressureForcing", landIcePressureForcing) call MPAS_pool_get_array(timeVaryingForcingPool, "landIceDraftForcing", landIceDraftForcing) call MPAS_pool_get_array(forcingPool, "landIceFraction", landIceFraction) + call MPAS_pool_get_array(forcingPool, "landIceFloatingFraction", landIceFloatingFraction) call MPAS_pool_get_array(forcingPool, "landIcePressure", landIcePressure) call MPAS_pool_get_array(forcingPool, "landIceDraft", landIceDraft) do iCell = 1, nCells landIceFraction(iCell) = landIceFractionForcing(iCell) + landIceFloatingFraction(iCell) = landIceFloatingFractionForcing(iCell) landIcePressure(iCell) = landIcePressureForcing(iCell) landIceDraft(iCell) = landIceDraftForcing(iCell) diff --git a/components/mpas-ocean/src/shared/mpas_ocn_tracer_ideal_age.F b/components/mpas-ocean/src/shared/mpas_ocn_tracer_ideal_age.F index 1f8fb440c287..60eb0eb184c8 100644 --- a/components/mpas-ocean/src/shared/mpas_ocn_tracer_ideal_age.F +++ b/components/mpas-ocean/src/shared/mpas_ocn_tracer_ideal_age.F @@ -189,7 +189,7 @@ subroutine ocn_tracer_ideal_age_init(domain,err)!{{{ if (config_use_idealAgeTracers_idealAge_forcing) then ! set mask = 0 for open ocean - ! set mask = 1 under ice shelves + ! set mask = 1 under land ice idealAgeMask = 0.0_RKIND if (associated(landIceMask)) then where (landIceMask /= 0) idealAgeMask(1,:) = 1.0_RKIND