diff --git a/src/core_ocean/Registry.xml b/src/core_ocean/Registry.xml
index 4e1397a381..92fd636456 100644
--- a/src/core_ocean/Registry.xml
+++ b/src/core_ocean/Registry.xml
@@ -391,6 +391,22 @@
description="If true, the standard GM for the tracer advection and mixing is turned on. This includes the redi portion which is captured in hmix."
possible_values=".true. or .false."
/>
+
+
+
+
-
-
-
-
-
+
+
-
-#include "mode_init/Registry.xml"
-
+
#include "tracer_groups/Registry_tracers.xml"
#include "analysis_members/Registry_analysis_members.xml"
+#include "mode_init/Registry.xml"
diff --git a/src/core_ocean/analysis_members/Registry_eddy_product_variables.xml b/src/core_ocean/analysis_members/Registry_eddy_product_variables.xml
index dfbd38e643..48be8b032c 100644
--- a/src/core_ocean/analysis_members/Registry_eddy_product_variables.xml
+++ b/src/core_ocean/analysis_members/Registry_eddy_product_variables.xml
@@ -39,6 +39,12 @@
+
+
+
+
diff --git a/src/core_ocean/analysis_members/Registry_moc_streamfunction.xml b/src/core_ocean/analysis_members/Registry_moc_streamfunction.xml
index bff0cabc8c..5824bbf6a0 100644
--- a/src/core_ocean/analysis_members/Registry_moc_streamfunction.xml
+++ b/src/core_ocean/analysis_members/Registry_moc_streamfunction.xml
@@ -63,13 +63,13 @@
-
-
diff --git a/src/core_ocean/analysis_members/Registry_time_series_stats_monthly_mean.xml b/src/core_ocean/analysis_members/Registry_time_series_stats_monthly_mean.xml
index 1f91af44de..35336e7203 100644
--- a/src/core_ocean/analysis_members/Registry_time_series_stats_monthly_mean.xml
+++ b/src/core_ocean/analysis_members/Registry_time_series_stats_monthly_mean.xml
@@ -195,5 +195,9 @@
+
+
+
+
diff --git a/src/core_ocean/analysis_members/mpas_ocn_eddy_product_variables.F b/src/core_ocean/analysis_members/mpas_ocn_eddy_product_variables.F
index d0b1ea97e6..a7f7da1666 100644
--- a/src/core_ocean/analysis_members/mpas_ocn_eddy_product_variables.F
+++ b/src/core_ocean/analysis_members/mpas_ocn_eddy_product_variables.F
@@ -183,8 +183,9 @@ subroutine ocn_compute_eddy_product_variables(domain, timeLevel, err)!{{{
integer, dimension(:), pointer :: maxLevelCell
real (kind=RKIND), dimension(:), pointer :: ssh, SSHSquared
- real (kind=RKIND), dimension(:,:), pointer :: velocityZonal, velocityMeridional, &
- velocityZonalSquared, velocityMeridionalSquared, velocityZonalTimesTemperature, velocityMeridionalTimesTemperature
+ real (kind=RKIND), dimension(:,:), pointer :: velocityZonal, velocityMeridional, GMBolusVelocityZonal, GMBolusVelocityMeridional, &
+ velocityZonalSquared, velocityMeridionalSquared, velocityZonalTimesTemperature, velocityMeridionalTimesTemperature, &
+ velocityZonalTimesTemperature_GM, velocityMeridionalTimesTemperature_GM
real (kind=RKIND), dimension(:,:,:), pointer :: activeTracers
err = 0
@@ -208,7 +209,8 @@ subroutine ocn_compute_eddy_product_variables(domain, timeLevel, err)!{{{
call mpas_pool_get_array(statePool, 'ssh',ssh, 1)
call mpas_pool_get_array(diagnosticsPool, 'velocityZonal', velocityZonal)
call mpas_pool_get_array(diagnosticsPool, 'velocityMeridional', velocityMeridional)
-
+ call mpas_pool_get_array(diagnosticsPool, 'GMBolusVelocityZonal',GMBolusVelocityZonal)
+ call mpas_pool_get_array(diagnosticsPool, 'GMBolusVelocityMeridional', GMBolusVelocityMeridional)
call mpas_pool_get_array(meshPool, 'maxLevelCell', maxLevelCell)
call mpas_pool_get_array(eddyProductVariablesAMPool, 'SSHSquared', SSHSquared)
call mpas_pool_get_array(eddyProductVariablesAMPool, 'velocityZonalSquared', velocityZonalSquared)
@@ -216,6 +218,9 @@ subroutine ocn_compute_eddy_product_variables(domain, timeLevel, err)!{{{
call mpas_pool_get_array(eddyProductVariablesAMPool, 'velocityZonalTimesTemperature', velocityZonalTimesTemperature)
call mpas_pool_get_array(eddyProductVariablesAMPool, 'velocityMeridionalTimesTemperature', &
velocityMeridionalTimesTemperature)
+ call mpas_pool_get_array(eddyProductVariablesAMPool,'velocityZonalTimesTemperature_GM', velocityZonalTimesTemperature_GM)
+ call mpas_pool_get_array(eddyProductVariablesAMPool,'velocityMeridionalTimesTemperature_GM', &
+ velocityMeridionalTimesTemperature_GM)
do iCell = 1,nCellsSolve
SSHSquared(iCell) = ssh(iCell)**2
@@ -224,7 +229,9 @@ subroutine ocn_compute_eddy_product_variables(domain, timeLevel, err)!{{{
velocityMeridionalSquared(k,iCell) = velocityMeridional(k,iCell)**2
velocityZonalTimesTemperature(k,iCell) = velocityZonal(k,iCell)*activeTracers(index_temperature,k,iCell)
velocityMeridionalTimesTemperature(k,iCell) = velocityMeridional(k,iCell)*activeTracers(index_temperature,k,iCell)
- end do
+ velocityZonalTimesTemperature_GM(k,iCell) = GMBolusVelocityZonal(k,iCell)*activeTracers(index_temperature,k,iCell)
+ velocityMeridionalTimesTemperature_GM(k,iCell) = GMBolusVelocityMeridional(k,iCell)*activeTracers(index_temperature,k,iCell)
+ end do
end do
block => block % next
diff --git a/src/core_ocean/analysis_members/mpas_ocn_moc_streamfunction.F b/src/core_ocean/analysis_members/mpas_ocn_moc_streamfunction.F
index 95828afd5d..38986c4b91 100644
--- a/src/core_ocean/analysis_members/mpas_ocn_moc_streamfunction.F
+++ b/src/core_ocean/analysis_members/mpas_ocn_moc_streamfunction.F
@@ -146,7 +146,7 @@ subroutine ocn_init_moc_streamfunction(domain, err)!{{{
!! region dimensions
call mpas_pool_get_dimension(domain % blocklist % dimensions, 'nRegions', nRegions)
call mpas_pool_get_dimension(domain % blocklist % dimensions, 'nRegionGroups', nRegionGroups)
- call mpas_pool_get_dimension(domain % blocklist % dimensions, 'R3', maxRegionsInGroup)
+ call mpas_pool_get_dimension(domain % blocklist % dimensions, 'maxRegionsInGroup', maxRegionsInGroup)
!! region config for moc
call mpas_pool_get_config(domain % configs, 'config_AM_mocStreamfunction_region_group', &
@@ -159,11 +159,19 @@ subroutine ocn_init_moc_streamfunction(domain, err)!{{{
call mpas_pool_get_array(regionPool, 'regionGroupNames', regionGroupNames)
!!! region preliminaries
+ regionGroupNumber=0
do i = 1, nRegionGroups
if (regionGroupNames(i) .eq. additionalRegion) then
regionGroupNumber = i
end if
end do
+ if (regionGroupNumber.eq.0) then
+ call mpas_log_write &
+ ('ocn_moc_streamfunction AM: config_AM_mocStreamfunction_region_group not found in regionGroupNames')
+ call mpas_log_write &
+ ('ocn_moc_streamfunction AM: setting regionGroupNumber=1')
+ regionGroupNumber = 1
+ end if
regionsInAddGroup = MIN(nRegionsInGroup(regionGroupNumber), maxRegionsInGroup)
!!!! END REGION STUFF
@@ -379,7 +387,7 @@ subroutine ocn_compute_moc_streamfunction(domain, timeLevel, err)!{{{
!! region dimensions
call mpas_pool_get_dimension(domain % blocklist % dimensions, 'nRegions', nRegions)
call mpas_pool_get_dimension(domain % blocklist % dimensions, 'nRegionGroups', nRegionGroups)
- call mpas_pool_get_dimension(domain % blocklist % dimensions, 'R3', maxRegionsInGroup)
+ call mpas_pool_get_dimension(domain % blocklist % dimensions, 'maxRegionsInGroup', maxRegionsInGroup)
!! region config for moc
call mpas_pool_get_config(domain % configs, 'config_AM_mocStreamfunction_region_group', &
@@ -392,12 +400,19 @@ subroutine ocn_compute_moc_streamfunction(domain, timeLevel, err)!{{{
call mpas_pool_get_array(regionPool, 'regionNames', regionNames)
call mpas_pool_get_array(regionPool, 'regionGroupNames', regionGroupNames)
+ regionGroupNumber=0
do i = 1, nRegionGroups
if (regionGroupNames(i) .eq. additionalRegion) then
regionGroupNumber = i
- !print *, 'found region with the same name:', regionGroupNames(i)
end if
end do
+ if (regionGroupNumber.eq.0) then
+ call mpas_log_write &
+ ('ocn_moc_streamfunction AM: config_AM_mocStreamfunction_region_group not found in regionGroupNames')
+ call mpas_log_write &
+ ('ocn_moc_streamfunction AM: setting regionGroupNumber=1')
+ regionGroupNumber = 1
+ end if
regionsInAddGroup = MIN(nRegionsInGroup(regionGroupNumber), maxRegionsInGroup)
@@ -426,11 +441,20 @@ subroutine ocn_compute_moc_streamfunction(domain, timeLevel, err)!{{{
call mpas_pool_get_array(transectPool, 'nTransectsInGroup', nTransectsInGroup)
call mpas_pool_get_array(transectPool, 'transectNames', transectNames)
call mpas_pool_get_array(transectPool, 'transectGroupNames', transectGroupNames)
+
+ transectGroupNumber=0
do i = 1, nTransectGroups
if (transectGroupNames(i) .eq. additionalTransect) then
transectGroupNumber = i
end if
end do
+ if (transectGroupNumber.eq.0) then
+ call mpas_log_write &
+ ('ocn_moc_streamfunction AM: config_AM_mocStreamfunction_transect_group not found in transectGroupNames')
+ call mpas_log_write &
+ ('ocn_moc_streamfunction AM: setting transectGroupNumber=1')
+ transectGroupNumber = 1
+ end if
transectsInAddGroup = nTransectsInGroup(transectGroupNumber)
@@ -493,7 +517,11 @@ subroutine ocn_compute_moc_streamfunction(domain, timeLevel, err)!{{{
call mpas_pool_get_array(transectPool,'transectEdgeMaskSigns',transectEdgeMaskSigns)
call mpas_pool_get_array(transectPool,'transectEdgeMasks',transectEdgeMasks)
call mpas_pool_get_subpool(block % structs, 'state', statePool)
- call mpas_pool_get_array(statePool, normalVelocityArrayName, normalVelocity, timeLevel)
+ if (trim(normalVelocityArrayName)=="normalVelocity") then
+ call mpas_pool_get_array(statePool, trim(normalVelocityArrayName), normalVelocity, timeLevel)
+ else
+ call mpas_pool_get_array(diagnosticsPool, trim(normalVelocityArrayName), normalVelocity, timeLevel)
+ end if
call mpas_pool_get_array(meshPool, 'cellsOnEdge', cellsOnEdge)
call mpas_pool_get_array(meshPool, 'maxLevelEdgeTop', maxLevelEdgeTop)
call mpas_pool_get_array(meshPool, 'maxLevelCell', maxLevelCell)
diff --git a/src/core_ocean/shared/mpas_ocn_gm.F b/src/core_ocean/shared/mpas_ocn_gm.F
index 646208519b..1d0d3f9b9f 100644
--- a/src/core_ocean/shared/mpas_ocn_gm.F
+++ b/src/core_ocean/shared/mpas_ocn_gm.F
@@ -51,7 +51,10 @@ module ocn_gm
logical, pointer :: config_use_Redi_bottom_layer_tapering
real (kind=RKIND), pointer :: config_Redi_surface_layer_tapering_extent
real (kind=RKIND), pointer :: config_Redi_bottom_layer_tapering_depth
-
+ logical, pointer :: config_gm_lat_variable_c2
+ logical, pointer :: config_gm_kappa_lat_depth_variable
+ real (kind=RKIND), pointer :: config_gm_min_stratification_ratio
+ real (kind=RKIND), pointer :: config_gm_min_phase_speed
real (kind=RKIND), parameter :: epsGM = 1.0e-12_RKIND
!***********************************************************************
@@ -98,18 +101,20 @@ subroutine ocn_gm_compute_Bolus_velocity(diagnosticsPool, meshPool, scratchPool)
!
!-----------------------------------------------------------------
- real(kind=RKIND), dimension(:,:), pointer :: density, displacedDensity, zMid, normalGMBolusVelocity, hEddyFlux, &
+ real(kind=RKIND), dimension(:,:), pointer :: density, displacedDensity, zMid, normalGMBolusVelocity, &
layerThicknessEdge, gradDensityEdge, gradDensityTopOfEdge, gradDensityConstZTopOfEdge, gradZMidEdge, &
gradZMidTopOfEdge, relativeSlopeTopOfEdge, relativeSlopeTopOfCell, k33, gmStreamFuncTopOfEdge, BruntVaisalaFreqTop, &
gmStreamFuncTopOfCell, dDensityDzTopOfEdge, dDensityDzTopOfCell, relativeSlopeTapering, relativeSlopeTaperingCell, &
- areaCellSum
- real(kind=RKIND), dimension(:), pointer :: boundaryLayerDepth, gmBolusKappa
+ areaCellSum, kappaGM3D
+
+ real(kind=RKIND), dimension(:), pointer :: boundaryLayerDepth, gmBolusKappa, cGMphaseSpeed, bottomDepth
real(kind=RKIND), dimension(:), pointer :: areaCell, dcEdge, dvEdge, tridiagA, tridiagB, tridiagC, rightHandSide
integer, dimension(:), pointer :: maxLevelEdgeTop, maxLevelCell, nEdgesOnCell
integer, dimension(:,:), pointer :: cellsOnEdge, edgesOnCell
integer :: i, k, iEdge, cell1, cell2, iCell, N, iter
real(kind=RKIND) :: h1, h2, areaEdge, c, BruntVaisalaFreqTopEdge, rtmp, stmp, maxSlopeK33
-
+ real(kind=RKIND) :: bottomAv, sumN2, countN2, maxN, kappaSum, ltSum
+
! Dimensions
integer :: nCells, nEdges
integer, pointer :: nVertLevels
@@ -124,6 +129,8 @@ subroutine ocn_gm_compute_Bolus_velocity(diagnosticsPool, meshPool, scratchPool)
call mpas_pool_get_array(diagnosticsPool, 'displacedDensity', displacedDensity)
call mpas_pool_get_array(diagnosticsPool, 'zMid', zMid)
+ call mpas_pool_get_array(diagnosticsPool, 'cGMphaseSpeed', cGMphaseSpeed)
+ call mpas_pool_get_array(diagnosticsPool, 'kappaGM3D', kappaGM3D)
call mpas_pool_get_array(diagnosticsPool, 'normalGMBolusVelocity', normalGMBolusVelocity)
call mpas_pool_get_array(diagnosticsPool, 'relativeSlopeTopOfEdge', relativeSlopeTopOfEdge)
call mpas_pool_get_array(diagnosticsPool, 'relativeSlopeTopOfCell', relativeSlopeTopOfCell)
@@ -131,7 +138,6 @@ subroutine ocn_gm_compute_Bolus_velocity(diagnosticsPool, meshPool, scratchPool)
call mpas_pool_get_array(diagnosticsPool, 'relativeSlopeTaperingCell', relativeSlopeTaperingCell)
call mpas_pool_get_array(diagnosticsPool, 'k33', k33)
call mpas_pool_get_array(diagnosticsPool, 'layerThicknessEdge', layerThicknessEdge)
- call mpas_pool_get_array(diagnosticsPool, 'hEddyFlux', hEddyFlux)
call mpas_pool_get_array(diagnosticsPool, 'zMid', zMid)
call mpas_pool_get_array(diagnosticsPool, 'BruntVaisalaFreqTop', BruntVaisalaFreqTop)
call mpas_pool_get_array(diagnosticsPool, 'gmStreamFuncTopOfEdge', gmStreamFuncTopOfEdge)
@@ -141,6 +147,7 @@ subroutine ocn_gm_compute_Bolus_velocity(diagnosticsPool, meshPool, scratchPool)
if (config_use_Redi_surface_layer_tapering) call mpas_pool_get_array(diagnosticsPool, 'boundaryLayerDepth', &
boundaryLayerDepth)
+ call mpas_pool_get_array(meshPool, 'bottomDepth', bottomDepth)
call mpas_pool_get_array(meshPool, 'maxLevelEdgeTop', maxLevelEdgeTop)
call mpas_pool_get_array(meshPool, 'maxLevelCell', maxLevelCell)
call mpas_pool_get_array(meshPool, 'cellsOnEdge', cellsOnEdge)
@@ -191,22 +198,29 @@ subroutine ocn_gm_compute_Bolus_velocity(diagnosticsPool, meshPool, scratchPool)
! Assign a huge value to the scratch variables which may manifest itself when
! there is a bug.
- !$omp do schedule(runtime)
- do iEdge = 1, nEdges + 1
+ !$omp do schedule(runtime) private(k)
+ do iEdge = 1, nEdges
do k = 1, nVertLevels
gradDensityEdge(k, iEdge) = huge(0D0)
+ gradZMidEdge(k, iEdge) = huge(0D0)
+ normalGMBolusVelocity(k, iEdge) = 0.0_RKIND
+ end do
+ end do
+ !$omp end do
+
+ !$omp do schedule(runtime) private(k)
+ do iEdge = 1, nEdges
+ do k = 1, nVertLevels + 1
gradDensityTopOfEdge(k, iEdge) = huge(0D0)
dDensityDzTopOfEdge(k, iEdge) = huge(0D0)
- gradZMidEdge(k, iEdge) = huge(0D0)
gradZMidTopOfEdge(k, iEdge) = huge(0D0)
relativeSlopeTopOfEdge(k, iEdge) = 0.0_RKIND
relativeSlopeTapering(k, iEdge) = 0.0_RKIND
- normalGMBolusVelocity(k, iEdge) = 0.0_RKIND
end do
end do
!$omp end do
- !$omp do schedule(runtime)
+ !$omp do schedule(runtime) private(k)
do iCell = 1, nCells + 1
do k = 1, nVertLevels
dDensityDzTopOfCell(k, iCell) = huge(0D0)
@@ -516,7 +530,71 @@ subroutine ocn_gm_compute_Bolus_velocity(diagnosticsPool, meshPool, scratchPool)
!
!--------------------------------------------------------------------
- c = config_gravWaveSpeed_trunc**2
+ if (config_gm_lat_variable_c2) then
+ !$omp do schedule(runtime) private(cell1, cell2, sumN2, ltSum, countN2, BruntVaisalaFreqTopEdge)
+ do iEdge = 1, nEdges
+ cell1 = cellsOnEdge(1,iEdge)
+ cell2 = cellsOnEdge(2,iEdge)
+ sumN2 = 0.0
+ ltSum = 0.0
+ countN2 = 0
+
+ do k=2,maxLevelEdgeTop(iEdge)
+
+ BruntVaisalaFreqTopEdge = 0.5_RKIND * (BruntVaisalaFreqTop(k,cell1) + BruntVaisalaFreqTop(k,cell2))
+ BruntVaisalaFreqTopEdge = max(BruntVaisalaFreqTopEdge, 0.0_RKIND)
+
+ sumN2 = sumN2 + BruntVaisalaFreqTopEdge*layerThicknessEdge(k,iEdge)
+ ltSum = ltSum + layerThicknessEdge(k,iEdge)
+ countN2 = countN2 +1
+
+ enddo
+
+ if(countN2 > 0) cGMphaseSpeed(iEdge) = max(config_gm_min_phase_speed ,sqrt(sumN2/ltSum)*ltSum / 3.141592_RKIND)
+
+ enddo
+ !$omp end do
+
+ else
+ !$omp do schedule(runtime)
+ do iEdge = 1, nEdges
+ cGMphaseSpeed(iEdge) = config_gravWaveSpeed_trunc
+ enddo
+ !$omp end do
+ endif
+
+ !$omp do schedule(runtime)
+ do iEdge=1,nEdges
+ kappaGM3D(:,iEdge) = gmBolusKappa(iEdge)
+ enddo
+ !$omp end do
+
+ if (config_gm_kappa_lat_depth_variable) then
+
+ !$omp do schedule(runtime) private(cell1, cell2, k, BruntVaisalaFreqTopEdge, maxN)
+ do iEdge = 1,nEdges
+ cell1 = cellsOnEdge(1,iEdge)
+ cell2 = cellsOnEdge(2,iEdge)
+
+ maxN = -1.0_RKIND
+ do k=2,maxLevelEdgeTop(iEdge)
+ BruntVaisalaFreqTopEdge = 0.5_RKIND * (BruntVaisalaFreqTop(k,cell1) + BruntVaisalaFreqTop(k,cell2))
+ BruntVaisalaFreqTopEdge = max(BruntVaisalaFreqTopEdge, 0.0_RKIND)
+
+ maxN = max(maxN,BruntVaisalaFreqTopEdge)
+
+ enddo
+
+ do k=2,maxLevelEdgeTop(iEdge)
+ BruntVaisalaFreqTopEdge = 0.5_RKIND * (BruntVaisalaFreqTop(k,cell1) + BruntVaisalaFreqTop(k,cell2))
+ BruntVaisalaFreqTopEdge = max(BruntVaisalaFreqTopEdge, 0.0_RKIND)
+
+ kappaGM3D(k,iEdge) = gmBolusKappa(iEdge)*max(config_gm_min_stratification_ratio, &
+ BruntVaisalaFreqTopEdge / (maxN + 1.0E-10_RKIND))
+ enddo
+ enddo
+ !$omp end do
+ endif
nEdges = nEdgesArray( 3 )
@@ -533,34 +611,34 @@ subroutine ocn_gm_compute_Bolus_velocity(diagnosticsPool, meshPool, scratchPool)
k = 2
BruntVaisalaFreqTopEdge = 0.5_RKIND * (BruntVaisalaFreqTop(k,cell1) + BruntVaisalaFreqTop(k,cell2))
BruntVaisalaFreqTopEdge = max(BruntVaisalaFreqTopEdge, 0.0_RKIND)
- tridiagB(k-1) = - 2.0_RKIND * config_gravWaveSpeed_trunc**2 / (layerThicknessEdge(k-1,iEdge) &
+ tridiagB(k-1) = - 2.0_RKIND * cGMphaseSpeed(iEdge)**2 / (layerThicknessEdge(k-1,iEdge) &
* layerThicknessEdge(k,iEdge)) - BruntVaisalaFreqTopEdge
- tridiagC(k-1) = 2.0_RKIND * config_gravWaveSpeed_trunc**2 / layerThicknessEdge(k, iEdge) &
+ tridiagC(k-1) = 2.0_RKIND * cGMphaseSpeed(iEdge)**2 / layerThicknessEdge(k, iEdge) &
/ (layerThicknessEdge(k-1, iEdge) + layerThicknessEdge(k, iEdge))
- rightHandSide(k-1) = gmBolusKappa(iEdge) * gravity / rho_sw * gradDensityConstZTopOfEdge(k,iEdge)
+ rightHandSide(k-1) = kappaGM3D(k-1,iEdge) * gravity / rho_sw * gradDensityConstZTopOfEdge(k,iEdge)
! Second to next to the last rows
do k = 3, maxLevelEdgeTop(iEdge)-1
BruntVaisalaFreqTopEdge = 0.5_RKIND * (BruntVaisalaFreqTop(k,cell1) + BruntVaisalaFreqTop(k,cell2))
BruntVaisalaFreqTopEdge = max(BruntVaisalaFreqTopEdge, 0.0_RKIND)
- tridiagA(k-2) = 2.0_RKIND * config_gravWaveSpeed_trunc**2 / layerThicknessEdge(k-1, iEdge) &
+ tridiagA(k-2) = 2.0_RKIND * cGMphaseSpeed(iEdge)**2 / layerThicknessEdge(k-1, iEdge) &
/ (layerThicknessEdge(k-1, iEdge) + layerThicknessEdge(k, iEdge))
- tridiagB(k-1) = - 2.0_RKIND * config_gravWaveSpeed_trunc**2 / (layerThicknessEdge(k-1, iEdge) &
+ tridiagB(k-1) = - 2.0_RKIND * cGMphaseSpeed(iEdge)**2 / (layerThicknessEdge(k-1, iEdge) &
* layerThicknessEdge(k, iEdge) ) - BruntVaisalaFreqTopEdge
- tridiagC(k-1) = 2.0_RKIND * config_gravWaveSpeed_trunc**2 / layerThicknessEdge(k, iEdge) &
+ tridiagC(k-1) = 2.0_RKIND * cGMphaseSpeed(iEdge)**2 / layerThicknessEdge(k, iEdge) &
/ (layerThicknessEdge(k-1, iEdge) + layerThicknessEdge(k, iEdge))
- rightHandSide(k-1) = gmBolusKappa(iEdge) * gravity / rho_sw * gradDensityConstZTopOfEdge(k,iEdge)
+ rightHandSide(k-1) = kappaGM3D(k-1,iEdge) * gravity / rho_sw * gradDensityConstZTopOfEdge(k,iEdge)
end do
! Last row
k = maxLevelEdgeTop(iEdge)
BruntVaisalaFreqTopEdge = 0.5_RKIND * (BruntVaisalaFreqTop(k,cell1) + BruntVaisalaFreqTop(k,cell2))
BruntVaisalaFreqTopEdge = max(BruntVaisalaFreqTopEdge, 0.0_RKIND)
- tridiagA(k-2) = 2.0_RKIND * config_gravWaveSpeed_trunc**2 / layerThicknessEdge(k-1,iEdge) &
+ tridiagA(k-2) = 2.0_RKIND * cGMphaseSpeed(iEdge)**2 / layerThicknessEdge(k-1,iEdge) &
/ (layerThicknessEdge(k-1,iEdge) + layerThicknessEdge(k,iEdge))
- tridiagB(k-1) = - 2.0_RKIND * config_gravWaveSpeed_trunc**2 / (layerThicknessEdge(k-1, iEdge) &
+ tridiagB(k-1) = - 2.0_RKIND * cGMphaseSpeed(iEdge)**2 / (layerThicknessEdge(k-1, iEdge) &
* layerThicknessEdge(k, iEdge)) - BruntVaisalaFreqTopEdge
- rightHandSide(k-1) = gmBolusKappa(iEdge) * gravity / rho_sw * gradDensityConstZTopOfEdge(k,iEdge)
+ rightHandSide(k-1) = kappaGM3D(k-1,iEdge) * gravity / rho_sw * gradDensityConstZTopOfEdge(k,iEdge)
! Total number of rows
N = maxLevelEdgeTop(iEdge) - 1
@@ -747,7 +825,10 @@ subroutine ocn_gm_init(domain, err)!{{{
call mpas_pool_get_config(ocnConfigs, 'config_use_Redi_bottom_layer_tapering',config_use_Redi_bottom_layer_tapering)
call mpas_pool_get_config(ocnConfigs, 'config_Redi_surface_layer_tapering_extent',config_Redi_surface_layer_tapering_extent)
call mpas_pool_get_config(ocnConfigs, 'config_Redi_bottom_layer_tapering_depth',config_Redi_bottom_layer_tapering_depth)
-
+ call mpas_pool_get_config(ocnConfigs, 'config_gm_lat_variable_c2',config_gm_lat_variable_c2)
+ call mpas_pool_get_config(ocnConfigs, 'config_gm_kappa_lat_depth_variable', config_gm_kappa_lat_depth_variable)
+ call mpas_pool_get_config(ocnConfigs, 'config_gm_min_stratification_ratio', config_gm_min_stratification_ratio)
+ call mpas_pool_get_config(ocnConfigs, 'config_gm_min_phase_speed', config_gm_min_phase_speed)
block => domain % blocklist
do while (associated(block))
@@ -788,6 +869,7 @@ subroutine ocn_gm_init(domain, err)!{{{
call mpas_dmpar_finalize(domain % dminfo)
end if
+
block => block % next
end do
end subroutine ocn_gm_init!}}}
diff --git a/src/core_ocean/shared/mpas_ocn_tendency.F b/src/core_ocean/shared/mpas_ocn_tendency.F
index 661e625a6a..4d78f64fa8 100644
--- a/src/core_ocean/shared/mpas_ocn_tendency.F
+++ b/src/core_ocean/shared/mpas_ocn_tendency.F
@@ -117,7 +117,7 @@ subroutine ocn_tend_thick(tendPool, forcingPool, diagnosticsPool, meshPool)!{{{
real (kind=RKIND), dimension(:), pointer :: surfaceThicknessFlux
real (kind=RKIND), dimension(:), pointer :: surfaceThicknessFluxRunoff
- real (kind=RKIND), dimension(:,:), pointer :: layerThickness, layerThicknessEdge, &
+ real (kind=RKIND), dimension(:,:), pointer :: layerThicknessEdge, &
vertAleTransportTop, tend_layerThickness, normalTransportVelocity, fractionAbsorbed, fractionAbsorbedRunoff
integer, pointer :: nCells
@@ -180,7 +180,7 @@ subroutine ocn_tend_thick(tendPool, forcingPool, diagnosticsPool, meshPool)!{{{
! surface flux tendency
!
- call ocn_thick_surface_flux_tend(meshPool, fractionAbsorbed, fractionAbsorbedRunoff, layerThickness, &
+ call ocn_thick_surface_flux_tend(meshPool, fractionAbsorbed, fractionAbsorbedRunoff, &
surfaceThicknessFlux, surfaceThicknessFluxRunoff, tend_layerThickness, err)
!
diff --git a/src/core_ocean/shared/mpas_ocn_thick_surface_flux.F b/src/core_ocean/shared/mpas_ocn_thick_surface_flux.F
index d9caec3625..2e1959b414 100644
--- a/src/core_ocean/shared/mpas_ocn_thick_surface_flux.F
+++ b/src/core_ocean/shared/mpas_ocn_thick_surface_flux.F
@@ -72,7 +72,7 @@ module ocn_thick_surface_flux
!-----------------------------------------------------------------------
subroutine ocn_thick_surface_flux_tend(meshPool, transmissionCoefficients, transmissionCoefficientsRunoff, &
- layerThickness, surfaceThicknessFlux, surfaceThicknessFluxRunoff, tend, err)!{{{
+ surfaceThicknessFlux, surfaceThicknessFluxRunoff, tend, err)!{{{
!-----------------------------------------------------------------
!
! input variables
@@ -86,9 +86,6 @@ subroutine ocn_thick_surface_flux_tend(meshPool, transmissionCoefficients, trans
transmissionCoefficients, &!< Input: Coefficients for the transmission of surface fluxes
transmissionCoefficientsRunoff !< Input: Coefficients for the transmission of surface fluxes due to river runoff
- real (kind=RKIND), dimension(:,:), intent(in) :: &
- layerThickness !< Input: Layer thickness
-
real (kind=RKIND), dimension(:), intent(in) :: &
surfaceThicknessFlux, &!< Input: surface flux of thickness
surfaceThicknessFluxRunoff !< Input: surface flux of thickness due to river runoff
diff --git a/testing_and_setup/compass/README_ocean.md b/testing_and_setup/compass/README_ocean.md
index 1c5ac6d803..5c7d560f61 100644
--- a/testing_and_setup/compass/README_ocean.md
+++ b/testing_and_setup/compass/README_ocean.md
@@ -6,8 +6,8 @@ To set up and run ocean test cases from COMPASS, you will need a conda
environment. First, install Miniconda3 (if miniconda is not already
installed), then create a new conda environment as follows:
``` bash
-conda create -n compass_py3.7 -c conda-forge python=3.7 \
- geometric_features=0.1.1 mpas_tools=0.0.3 jigsaw=0.9.10 jigsawpy=0.0.2 \
+conda create -n compass_py3.7 -c conda-forge -c xylar python=3.7 \
+ geometric_features=0.1.3 mpas_tools=0.0.3 jigsaw=0.9.11 jigsawpy=0.0.2 \
metis pyflann scikit-image basemap pyamg ffmpeg
```
Each time you want to work with COMPASS, you will need to run:
diff --git a/testing_and_setup/compass/general.config.ocean b/testing_and_setup/compass/general.config.ocean
index 819c41ed1d..d60f520cb4 100644
--- a/testing_and_setup/compass/general.config.ocean
+++ b/testing_and_setup/compass/general.config.ocean
@@ -9,8 +9,8 @@
# init namelists in the default_inputs directory after a successful build of
# the ocean model.
[namelists]
-forward = FULL_PATH_TO_MPAS_MODEL_REPO/namelist.ocean.forward
-init = FULL_PATH_TO_MPAS_MODEL_REPO/namelist.ocean.init
+forward = FULL_PATH_TO_MPAS_MODEL_REPO/namelist.ocean
+init = FULL_PATH_TO_MPAS_MODEL_REPO/namelist.ocean
# The streams section defines paths to template streams files that will be used
# to generate specific streams files. Typically these will point to the forward and
diff --git a/testing_and_setup/compass/ocean/global_ocean/template_forward.xml b/testing_and_setup/compass/ocean/global_ocean/template_forward.xml
index 0af5703b74..5d06bbbf8e 100644
--- a/testing_and_setup/compass/ocean/global_ocean/template_forward.xml
+++ b/testing_and_setup/compass/ocean/global_ocean/template_forward.xml
@@ -16,5 +16,8 @@
+
+
+