diff --git a/components/mpas-ocean/bld/build-namelist b/components/mpas-ocean/bld/build-namelist index 460b9ecda428..debc65395c74 100755 --- a/components/mpas-ocean/bld/build-namelist +++ b/components/mpas-ocean/bld/build-namelist @@ -783,6 +783,8 @@ add_default($nl, 'config_frazil_in_open_ocean'); add_default($nl, 'config_frazil_under_land_ice'); add_default($nl, 'config_frazil_heat_of_fusion'); add_default($nl, 'config_frazil_ice_density'); +add_default($nl, 'config_use_frazil_ice_porosity'); +add_default($nl, 'config_frazil_ice_porosity'); add_default($nl, 'config_frazil_fractional_thickness_limit'); add_default($nl, 'config_specific_heat_sea_water'); add_default($nl, 'config_frazil_maximum_depth'); diff --git a/components/mpas-ocean/bld/build-namelist-section b/components/mpas-ocean/bld/build-namelist-section index c5dad5d935a9..1d09fdfbdb45 100644 --- a/components/mpas-ocean/bld/build-namelist-section +++ b/components/mpas-ocean/bld/build-namelist-section @@ -291,6 +291,8 @@ add_default($nl, 'config_frazil_in_open_ocean'); add_default($nl, 'config_frazil_under_land_ice'); add_default($nl, 'config_frazil_heat_of_fusion'); add_default($nl, 'config_frazil_ice_density'); +add_default($nl, 'config_use_frazil_ice_porosity'); +add_default($nl, 'config_frazil_ice_porosity'); add_default($nl, 'config_frazil_fractional_thickness_limit'); add_default($nl, 'config_specific_heat_sea_water'); add_default($nl, 'config_frazil_maximum_depth'); 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 4f9b5d8fe4d3..559bc1ed84e3 100644 --- a/components/mpas-ocean/bld/namelist_files/namelist_defaults_mpaso.xml +++ b/components/mpas-ocean/bld/namelist_files/namelist_defaults_mpaso.xml @@ -394,6 +394,8 @@ .true. 3.337e5 1000.0 +.false. +1.0 0.1 3.996e3 100.0 diff --git a/components/mpas-ocean/bld/namelist_files/namelist_definition_mpaso.xml b/components/mpas-ocean/bld/namelist_files/namelist_definition_mpaso.xml index bea1e98d9de8..09ef82120433 100644 --- a/components/mpas-ocean/bld/namelist_files/namelist_definition_mpaso.xml +++ b/components/mpas-ocean/bld/namelist_files/namelist_definition_mpaso.xml @@ -1539,6 +1539,22 @@ Valid values: Any positive real number. Default: Defined in namelist_defaults.xml + +If true, use an internal porosity to set internal frazil salinity and that of specified passive tracers. + +Valid values: .true. or .false. +Default: Defined in namelist_defaults.xml + + + +If frazil porosity is used, sets the porosity of internal ocean frazil ice. + +Valid values: Positive real number from 0 to 1. +Default: Defined in namelist_defaults.xml + + maximum fraction of layer thickness than can be used or created at an instant by frazil. diff --git a/components/mpas-ocean/src/Registry.xml b/components/mpas-ocean/src/Registry.xml index 2a21e22f40d2..e4276a705e5d 100644 --- a/components/mpas-ocean/src/Registry.xml +++ b/components/mpas-ocean/src/Registry.xml @@ -985,10 +985,18 @@ description="Energy per kilogram released when sea water freezes. NOTE: test and make consistent with E3SM." possible_values="Any positive real number." /> + + + 0.0_RKIND) @@ -609,22 +619,42 @@ subroutine ocn_frazil_forcing_build_arrays(domain, meshPool, forcingPool, stateP enddo ! do k=kBottom,minLevelCell,-1 - ! frazilIceFreshwaterFlux forms part of the landIceFreshwaterFluxTotal computed in surface land ice fluxes - frazilIceFreshwaterFlux(iCell) = - (sumNewFrazilIceThickness * config_frazil_ice_density) / dt ! accumulate frazil mass to column total ! note: the accumulatedFrazilIceMass (at both time levels) is reset to zero after being sent to the coupler accumulatedFrazilIceMassNew(iCell) = accumulatedFrazilIceMassOld(iCell) + sumNewFrazilIceThickness & - * config_frazil_ice_density - accumulatedFrazilIceSalinityNew(iCell) = accumulatedFrazilIceSalinityOld(iCell) + sumNewThicknessWeightedSaltContent + * config_frazil_ice_density + + accumulatedFrazilIceSalinityNew(iCell) = accumulatedFrazilIceSalinityOld(iCell) + & + (1-usePorosity) * sumNewThicknessWeightedSaltContent + !NJ: Assume frazil salinity is the coupling salinity if ( underLandIce ) then + ! frazilIceFreshwaterFlux forms part of the landIceFreshwaterFluxTotal computed in surface land ice fluxes + frazilIceFreshwaterFlux(iCell) = - (sumNewFrazilIceThickness * config_frazil_ice_density) / dt ! accumulate frazil formed under land ice in case we're not coupling and we need to keep track of it ! for freshwater budgets accumulatedLandIceFrazilMassNew(iCell) = accumulatedLandIceFrazilMassOld(iCell) & + sumNewFrazilIceThickness * config_frazil_ice_density ! There is no accumulatedLandIceFrazilSalinity because it is always 0 + frazilSalinity = 0.0_RKIND + else + frazilSalinity = config_frazil_sea_ice_reference_salinity end if + !Determine salt expelled in the upper layer to arrive at the assumed frazil salt for coupling + if (sumNewFrazilIceThickness > 0.0_RKIND .and. usePorosity .ge. 1) then + newThicknessWeightedSaltContent = sumNewFrazilIceThickness * frazilSalinity + if (newThicknessWeightedSaltContent > sumNewThicknessWeightedSaltContent) then + !Warning: salt conservation error. Track with lowSalinityFrazilIce + lowSalinityFrazilIce(iCell) = newThicknessWeightedSaltContent - sumNewThicknessWeightedSaltContent + accumulatedFrazilIceSalinityNew(iCell) = accumulatedFrazilIceSalinityOld(iCell) + max(0.0_RKIND, sumNewThicknessWeightedSaltContent) + else + !salt expelled at the surface + frazilSalinityTendency(minLevelCell(iCell),iCell) = frazilSalinityTendency(minLevelCell(iCell),iCell) + & + max(0.0_RKIND,(sumNewThicknessWeightedSaltContent - newThicknessWeightedSaltContent) ) / dt + accumulatedFrazilIceSalinityNew(iCell) = accumulatedFrazilIceSalinityOld(iCell) + newThicknessWeightedSaltContent + endif + endif ! if frazil ice is formed enddo ! do iCell = 1, nCells !$omp end do !$omp end parallel