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