From 268c338a74d01baae012a18601076ec57b317f32 Mon Sep 17 00:00:00 2001 From: James Overfelt Date: Mon, 15 Jun 2026 13:36:10 -0600 Subject: [PATCH 01/32] Convert some initial FCT algorithm from F90 to C++ --- components/omega/src/ocn/Tendencies.cpp | 4 + components/omega/src/ocn/TendencyTerms.cpp | 14 +- components/omega/src/ocn/TendencyTerms.h | 214 ++++++++++++++++++++- 3 files changed, 229 insertions(+), 3 deletions(-) diff --git a/components/omega/src/ocn/Tendencies.cpp b/components/omega/src/ocn/Tendencies.cpp index a85e24d37dc6..8db52b4fe55d 100644 --- a/components/omega/src/ocn/Tendencies.cpp +++ b/components/omega/src/ocn/Tendencies.cpp @@ -226,6 +226,10 @@ void Tendencies::readConfig(Config *OmegaConfig ///< [in] Omega config if (Order == 4) { this->TracerHorzAdv.Coef3rdOrder = 0; } + Err += AdvectConfig.get("HorzTracerFluxLimiterEnable", TracerHorzAdv.FCT); + CHECK_ERROR_ABORT( + Err, + "Tendencies: HorzTracerFluxLimiterEnable not found in AdvectConfig"); } Err += TendConfig.get("TracerDiffTendencyEnable", this->TracerDiffusion.Enabled); diff --git a/components/omega/src/ocn/TendencyTerms.cpp b/components/omega/src/ocn/TendencyTerms.cpp index 5b142888142c..09578d1b3200 100644 --- a/components/omega/src/ocn/TendencyTerms.cpp +++ b/components/omega/src/ocn/TendencyTerms.cpp @@ -11,6 +11,7 @@ #include "TendencyTerms.h" #include "AuxiliaryState.h" #include "DataTypes.h" +#include "Error.h" #include "HorzMesh.h" #include "HorzOperators.h" #include "OceanState.h" @@ -74,6 +75,7 @@ BottomDragOnEdge::BottomDragOnEdge(const HorzMesh *Mesh, TracerHorzAdvOnCell::TracerHorzAdvOnCell(const HorzMesh *Mesh, const VertCoord *VCoord) : HorzontalMesh(Mesh), VerticalCoord(VCoord), + NVertLayers(VCoord->NVertLayers), NAdvCellsForEdge("NumberOfCellsContribToAdvectionAtEdge", Mesh->NEdgesAll), AdvCellsForEdge("IndexOfCellsContributingToAdvection", Mesh->NEdgesAll, @@ -136,12 +138,22 @@ void TracerHorzAdvOnCell::init() { // Compute masks and coefficients Kokkos::fence(); MasksAndCoefficients masksAndCoefficients( - Mesh, VCoord, DerivTwo, NAdvCellsForEdge, AdvCellsForEdge, + Mesh, VCoord, DerivTwo, NAdvCellsForEdge, AdvCellsForEdge, AdvMaskHighOrder, AdvCoefs, AdvCoefs3rd); Kokkos::fence(); parallelFor( {NEdgesAll}, KOKKOS_LAMBDA(int IEdge) { masksAndCoefficients(IEdge); }); Kokkos::fence(); + if (FCT) { + HProvInv = Array2DReal("FCTProvesionalLayerThickness", Mesh->NEdgesAll, + NVertLayers); + HNewInv = + Array2DReal("FCTProvesionalNewInverse", Mesh->NEdgesAll, NVertLayers); + HProv = + Array2DReal("FCTProvesionalThickness", Mesh->NCellsAll, NVertLayers); + TracerMax = Array2DReal("FCTTracerMax", Mesh->NCellsAll, NVertLayers); + TracerMin = Array2DReal("FCTTracerMin", Mesh->NCellsAll, NVertLayers); + } } } // end namespace OMEGA diff --git a/components/omega/src/ocn/TendencyTerms.h b/components/omega/src/ocn/TendencyTerms.h index 389d6bb1aafb..37a9d9d5c2f1 100644 --- a/components/omega/src/ocn/TendencyTerms.h +++ b/components/omega/src/ocn/TendencyTerms.h @@ -12,6 +12,7 @@ #include "AuxiliaryState.h" #include "GlobalConstants.h" +#include "Halo.h" #include "HorzMesh.h" #include "MachEnv.h" #include "OceanState.h" @@ -163,7 +164,6 @@ class KEGradOnEdge { /// Gradient of sea surface height defined on edges multipled by gravitational /// acceleration, for momentum equation -/// NOTE: This term is only appropriate for shallow water (Omega v0) simulations class SSHGradOnEdge { public: bool Enabled = false; @@ -369,6 +369,7 @@ class TracerHorzAdvOnCell { public: bool Enabled = false; bool ForceLowOrder = false; + bool FCT = false; // coefficient for blending high-order terms Real Coef3rdOrder = 0.25; TracerHorzAdvOnCell(const HorzMesh *Mesh, const VertCoord *VCoord); @@ -424,19 +425,215 @@ class TracerHorzAdvOnCell { for (int I = 0; I < NEdgesOnCell(ICell); ++I) { const I4 IEdge = EdgesOnCell(ICell, I); - for (int K = KStart; K < KEnd; ++K) { + for (I4 K = KStart; K < KEnd; ++K) { Tend(L, ICell, K) += EdgeSignOnCell(ICell, I) * HighOrderFlxHorz(L, IEdge, K) * InvAreaCell; } } } + KOKKOS_FUNCTION void FCTProvisionaLayerThicknesses( + Array2DReal HProvInv, Array2DReal HNewInv, Array2DReal HProv, + const Array2DReal &FluxPseudoThickEdge, const Array2DReal &NormVelEdge, + const Real Dt, const I4 ICell, const I4 KChunk) const { + + const I4 KStart = KChunk * VecLength; + const I4 KEnd = KStart + VecLength; + const Real InvAreaCell = 1.0_Real / AreaCell(ICell); + for (I4 K = KStart; K < KEnd; ++K) { + HProv(ICell, K) = Dt * PseudoThick(ICell, K); + } + for (I4 I = 0; I < NEdgesOnCell(ICell); ++I) { + const I4 IEdge = EdgesOnCell(ICell, I); + const Real SignedFactor = + InvAreaCell * DvEdge(IEdge) * EdgeSignOnCell(ICell, I); + // Provisional layer thickness is after horizontal + // thickness flux only + for (I4 K = KStart; K < KEnd; ++K) { + const Real NormalPseudoThicknessFlux = + FluxPseudoThickEdge(IEdge, K) * NormVelEdge(IEdge, K); + HProv(ICell, K) += SignedFactor * NormalPseudoThicknessFlux; + } + } + // New layer thickness is after horizontal and vertical + // thickness flux + for (I4 K = KStart; K < KEnd; ++K) { + HProvInv(ICell, K) = 1.0_Real / HProv(ICell, K); + HNewInv(ICell, K) = + 1.0_Real / + (HProv(ICell, K) - Dt * VerticalPseudoVelocity(ICell, K) + + Dt * VerticalPseudoVelocity(ICell, K + 1)); + } + } + + KOKKOS_FUNCTION void FCTTracerMinMax(const I4 L, const I4 ICell, + const I4 KChunk, + const Array1DI4 MinLayerCell, + const Array1DI4 MaxLayerCell, + const Array3DReal &TracerCell) const { + + const I4 KStart = KChunk * VecLength; + const I4 KEnd = KStart + VecLength; + for (I4 K = KStart; K < KEnd; ++K) { + TracerMin(ICell, K) = TracerCell(L, ICell, K); + TracerMax(ICell, K) = TracerCell(L, ICell, K); + } + for (I4 I = 0; I < NEdgesOnCell(ICell); ++I) { + const I4 IEdge = EdgesOnCell(ICell, I); + const I4 ICell2 = CellsOnCell(IEdge, I); + const I4 KMin = MinLayerCell(ICell2); + const I4 KMax = MaxLayerCell(ICell2); + const I4 KRange = vertRangeChunked(KMin, KMax); + for (I4 KChunk = 0; KChunk < KRange; ++KChunk) { + const I4 KStart1 = Kokkos::max(KStart, KChunk * VecLength); + const I4 KEnd1 = Kokkos::min(KEnd, KStart1 + VecLength); + for (I4 K = KStart1; K < KEnd1; ++K) { + TracerMax(ICell, K) = + Kokkos::max(TracerMax(ICell, K), TracerCell(L, ICell2, K)); + TracerMin(ICell, K) = + Kokkos::min(TracerMin(ICell, K), TracerCell(L, ICell2, K)); + } + } + } + } + + KOKKOS_FUNCTION void FCTHighAndLowOrderFlux( + const I4 L, const I4 IEdge, const I4 KChunk, + const Array1DI4 &MinLayerCell, const Array1DI4 &MaxLayerCell, + const Array2DReal &FluxPseudoThickEdge, const Array2DReal &NormVelEdge, + const Array3DReal &TracerCell) const { + const Real Coef3rdOrder = 0.25; + + const I4 ICell1 = CellsOnEdge(IEdge, 0); + const I4 ICell2 = CellsOnEdge(IEdge, 0); + + const I4 KStart = KChunk * VecLength; + const I4 KEnd = KStart + VecLength; + + // compute some common intermediate factors + for (I4 K = KStart; K < KEnd; ++K) + HighOrderFlx(L, IEdge, K) = 0.0_Real; + + // Compute 3rd or 4th fluxes where requested. + for (int I = 0; I < NAdvCellsForEdge(IEdge); ++I) { + const I4 ICell = AdvCellsForEdge(IEdge, I); + const Real Coef1 = AdvCoefs(IEdge, I); + const Real Coef3 = AdvCoefs3rd(IEdge, I) * Coef3rdOrder; + const I4 KStartCell = MinLayerCell(ICell); + const I4 KLenCell = MaxLayerCell(ICell); + const I4 KEndCell = KStartCell + KLenCell; + for (I4 K = KStartCell; K < KEndCell; ++K) { + const Real NormalPseudoThicknessFlux = + FluxPseudoThickEdge(IEdge, K) * NormVelEdge(IEdge, K); + HighOrderFlx(L, IEdge, K) += + TracerCell(L, ICell, K) * NormalPseudoThicknessFlux * + AdvMaskHighOrder(IEdge, K) * + (Coef1 + + Coef3 * std::copysign(1.0_Real, NormalPseudoThicknessFlux)); + } + } + // Compute 2nd order fluxes where needed. + // Also compute low order upwind horizontal flux (monotonic) + // Remove low order flux from the high order flux + // Store left over high order flux in highOrderFlx array + for (I4 K = MinLayerEdgeBot(IEdge); K < MaxLayerEdgeTop(IEdge); ++K) { + const Real NormalPseudoThicknessFlux = + FluxPseudoThickEdge(IEdge, K) * NormVelEdge(IEdge, K); + const Real TracerWeight = (1.0_Real - AdvMaskHighOrder(IEdge, K)) * + (DvEdge(IEdge) * 0.5_Real) * + NormalPseudoThicknessFlux; + + LowOrderFlx(L, IEdge, K) = + DvEdge(IEdge) * (Kokkos::max(0.0_Real, NormalPseudoThicknessFlux) * + TracerCell(L, ICell1, K) + + Kokkos::min(0.0_Real, NormalPseudoThicknessFlux) * + TracerCell(L, ICell2, K)); + + HighOrderFlx(L, IEdge, K) += TracerWeight * (TracerCell(L, ICell1, K) + + TracerCell(L, ICell2, K)); + HighOrderFlx(L, IEdge, K) -= LowOrderFlx(L, IEdge, K); + } + } + + KOKKOS_FUNCTION void FCTInitFluxInOut(const I4 L, const I4 ICell, + const I4 KChunk, Array2DReal &WorkTend, + Array2DReal &FlxIn, + Array2DReal &FlxOut) { + const I4 KStart = KChunk * VecLength; + const I4 KEnd = KStart + VecLength; + for (I4 K = KStart; K < KEnd; ++K) + WorkTend(ICell, K) = 0; + for (I4 K = KStart; K < KEnd; ++K) + FlxIn(ICell, K) = 0; + for (I4 K = KStart; K < KEnd; ++K) + FlxOut(ICell, K) = 0; + } + + KOKKOS_FUNCTION void FCTFluxInOut(const I4 L, const I4 ICell, + const I4 KChunk, Array2DReal &WorkTend, + Array2DReal &FlxIn, Array2DReal &FlxOut, + const Real Dt, + const Array3DReal &TracerCell) const { + const Real Eps = 1.e-10_Real; + const Real InvAreaCell = 1._Real / AreaCell(ICell); + const I4 KStartCell = chunkStart(KChunk, MinLayerCell(ICell)); + const I4 KLenCell = chunkLength(KChunk, KStartCell, MaxLayerCell(ICell)); + const I4 KEndCell = KStartCell + KLenCell - 1; + for (I4 K = KStartCell; K < KEndCell; ++K) { + // Finish computing the low order horizontal fluxes + // Upwind fluxes are accumulated in workTend + for (I4 I = 0; I < NEdgesOnCell(ICell); ++I) { + const I4 IEdge = EdgesOnCell(ICell, I); + const Real SignedFactor = EdgeSignOnCell(ICell, I) * InvAreaCell; + for (I4 K = MinLayerEdgeBot(IEdge); K < MaxLayerEdgeTop(IEdge); + ++K) { + // Here workTend is the advection tendency due to the + // upwind (low order) fluxes. + WorkTend(ICell, K) += SignedFactor * LowOrderFlx(L, IEdge, K); + + // Accumulate remaining high order fluxes + FlxOut(ICell, K) += Kokkos::min( + 0.0_Real, SignedFactor * HighOrderFlx(L, IEdge, K)); + FlxIn(ICell, K) += Kokkos::max( + 0.0_Real, SignedFactor * HighOrderFlx(L, IEdge, K)); + } + } + // Build the factors for the FCT + // Computed using the bounds that were computed previously, + // and the bounds on the newly updated value + // Factors are placed in the flxIn and flxOut arrays + for (I4 K = MinLayerCell(ICell); K < MaxLayerCell(ICell); ++K) { + // Here workTend is the upwind tendency + const Real TracerUpwindNew = + (TracerCell(L, ICell, K) * PseudoThick(ICell, K) + + Dt * WorkTend(ICell, K)) * + HProvInv(ICell, K); + const Real TracerMinNew = + TracerUpwindNew + Dt * FlxOut(ICell, K) * HProvInv(ICell, K); + const Real TracerMaxNew = + TracerUpwindNew + Dt * FlxIn(ICell, K) * HProvInv(ICell, K); + const Real ScaleFactorIn = (TracerMax(ICell, K) - TracerUpwindNew) / + (TracerMaxNew - TracerUpwindNew + Eps); + FlxIn(ICell, K) = + Kokkos::min(1.0_Real, Kokkos::max(0.0_Real, ScaleFactorIn)); + const Real ScaleFactorOut = + (TracerUpwindNew - TracerMin(ICell, K)) / + (TracerUpwindNew - TracerMinNew + Eps); + FlxOut(ICell, K) = + Kokkos::min(1.0_Real, Kokkos::max(0.0_Real, ScaleFactorOut)); + } + } + } + private: const HorzMesh *HorzontalMesh; const VertCoord *VerticalCoord; + const I4 NVertLayers; + Array1DI4 NAdvCellsForEdge; Array2DI4 AdvCellsForEdge; Array2DI4 AdvMaskHighOrder; + Array2DI4 CellsOnCell; Array2DReal AdvCoefs; Array2DReal AdvCoefs3rd; Array3DReal HighOrderFlxHorz; @@ -444,9 +641,22 @@ class TracerHorzAdvOnCell { Array1DI4 NEdgesOnCell; Array2DI4 EdgesOnCell; Array2DI4 CellsOnEdge; + Array1DI4 MinLayerEdgeBot; + Array1DI4 MaxLayerEdgeTop; Array2DReal EdgeSignOnCell; Array1DReal DvEdge; Array1DReal AreaCell; + Array2DReal PseudoThick; + Array2DReal VerticalPseudoVelocity; + Array2DReal HProvInv; + Array2DReal HNewInv; + Array2DReal HProv; + Array2DReal TracerMax; + Array2DReal TracerMin; + Array3DReal HighOrderFlx; + Array3DReal LowOrderFlx; + Array1DI4 MinLayerCell; + Array1DI4 MaxLayerCell; }; // Tracer horizontal diffusion term From 9c79e41982ecbc509ad4aa76029a24f15e770c4d Mon Sep 17 00:00:00 2001 From: James Overfelt Date: Wed, 17 Jun 2026 14:48:50 -0600 Subject: [PATCH 02/32] Done converting functions. --- components/omega/src/ocn/Tendencies.cpp | 11 +++ components/omega/src/ocn/TendencyTerms.h | 90 ++++++++++++++++++++---- 2 files changed, 89 insertions(+), 12 deletions(-) diff --git a/components/omega/src/ocn/Tendencies.cpp b/components/omega/src/ocn/Tendencies.cpp index 8db52b4fe55d..6204a71566cb 100644 --- a/components/omega/src/ocn/Tendencies.cpp +++ b/components/omega/src/ocn/Tendencies.cpp @@ -754,8 +754,18 @@ void Tendencies::computeTracerTendenciesOnly( Array2DReal NormalVelEdge = State->getNormalVelocity(VelTimeLevel); const Array2DReal &FluxPseudoThickEdge = AuxState->PseudoThicknessAux.FluxPseudoThickEdge; + const Array2DReal NormVelEdge = State->getNormalVelocity(VelTimeLevel); + R8 Dt = 0; + TimeStep.get(Dt, TimeUnits::Seconds); if (LocTracerHorzAdv.Enabled) { Pacer::start("Tend:tracerHorzAdv", 2); + if (LocTracerHorzAdv.FCT) { + parallelFor( + {Mesh->NCellsAll}, KOKKOS_LAMBDA(int ICell) { + LocTracerHorzAdv.FCTProvisionaLayerThicknesses( + FluxPseudoThickEdge, NormVelEdge, Dt, ICell); + }); + } else { parallelForOuter( {NTracers, Mesh->NEdgesAll}, KOKKOS_LAMBDA(int L, int IEdge, const TeamMember &Team) { @@ -779,6 +789,7 @@ void Tendencies::computeTracerTendenciesOnly( LocTracerHorzAdv(LocTracerTend, L, ICell, KChunk); }); }); + } Pacer::stop("Tend:tracerHorzAdv", 2); } diff --git a/components/omega/src/ocn/TendencyTerms.h b/components/omega/src/ocn/TendencyTerms.h index 37a9d9d5c2f1..26259c380307 100644 --- a/components/omega/src/ocn/TendencyTerms.h +++ b/components/omega/src/ocn/TendencyTerms.h @@ -367,9 +367,9 @@ class BottomDragOnEdge { // Tracer horizontal advection term class TracerHorzAdvOnCell { public: - bool Enabled = false; + bool Enabled = true; bool ForceLowOrder = false; - bool FCT = false; + bool FCT = true; // coefficient for blending high-order terms Real Coef3rdOrder = 0.25; TracerHorzAdvOnCell(const HorzMesh *Mesh, const VertCoord *VCoord); @@ -433,14 +433,11 @@ class TracerHorzAdvOnCell { } KOKKOS_FUNCTION void FCTProvisionaLayerThicknesses( - Array2DReal HProvInv, Array2DReal HNewInv, Array2DReal HProv, const Array2DReal &FluxPseudoThickEdge, const Array2DReal &NormVelEdge, - const Real Dt, const I4 ICell, const I4 KChunk) const { + const Real Dt, const I4 ICell) const { - const I4 KStart = KChunk * VecLength; - const I4 KEnd = KStart + VecLength; const Real InvAreaCell = 1.0_Real / AreaCell(ICell); - for (I4 K = KStart; K < KEnd; ++K) { + for (I4 K = MinLayerCell(ICell); K < MaxLayerCell(ICell); ++K) { HProv(ICell, K) = Dt * PseudoThick(ICell, K); } for (I4 I = 0; I < NEdgesOnCell(ICell); ++I) { @@ -449,7 +446,7 @@ class TracerHorzAdvOnCell { InvAreaCell * DvEdge(IEdge) * EdgeSignOnCell(ICell, I); // Provisional layer thickness is after horizontal // thickness flux only - for (I4 K = KStart; K < KEnd; ++K) { + for (I4 K = MinLayerCell(ICell); K < MaxLayerCell(ICell); ++K) { const Real NormalPseudoThicknessFlux = FluxPseudoThickEdge(IEdge, K) * NormVelEdge(IEdge, K); HProv(ICell, K) += SignedFactor * NormalPseudoThicknessFlux; @@ -457,7 +454,7 @@ class TracerHorzAdvOnCell { } // New layer thickness is after horizontal and vertical // thickness flux - for (I4 K = KStart; K < KEnd; ++K) { + for (I4 K = MinLayerCell(ICell); K < MaxLayerCell(ICell); ++K) { HProvInv(ICell, K) = 1.0_Real / HProv(ICell, K); HNewInv(ICell, K) = 1.0_Real / @@ -574,7 +571,6 @@ class TracerHorzAdvOnCell { Array2DReal &FlxIn, Array2DReal &FlxOut, const Real Dt, const Array3DReal &TracerCell) const { - const Real Eps = 1.e-10_Real; const Real InvAreaCell = 1._Real / AreaCell(ICell); const I4 KStartCell = chunkStart(KChunk, MinLayerCell(ICell)); const I4 KLenCell = chunkLength(KChunk, KStartCell, MaxLayerCell(ICell)); @@ -606,8 +602,7 @@ class TracerHorzAdvOnCell { // Here workTend is the upwind tendency const Real TracerUpwindNew = (TracerCell(L, ICell, K) * PseudoThick(ICell, K) + - Dt * WorkTend(ICell, K)) * - HProvInv(ICell, K); + Dt * WorkTend(ICell, K)) * HProvInv(ICell, K); const Real TracerMinNew = TracerUpwindNew + Dt * FlxOut(ICell, K) * HProvInv(ICell, K); const Real TracerMaxNew = @@ -624,8 +619,77 @@ class TracerHorzAdvOnCell { } } } + KOKKOS_FUNCTION void FCTRescaleHighOrderFlux(const I4 L, const I4 ICell, + const Real Dt, + const Array3DReal &Tend, + Array2DReal &WorkTend, + Array2DReal &PseudoThickCell, + const Array3DReal &TracerCell) const { + + // Accumulate the scaled high order vertical tendencies + // and the upwind tendencies + //do iCell = 1, nCellsOwned + const Real InvAreaCell1 = 1.0_Real / AreaCell(ICell); + + // Accumulate the scaled high order horizontal tendencies + for (I4 I=0; I TracerMax(ICell,K)+Eps) { + printf("Horizontal maximum out of bounds on tracer: %i %lg %lg\n", + L, TracerMax(ICell, K), TracerCell(L,ICell,K)); + } + } + } + private: + const Real Eps = 1.e-10_Real; const HorzMesh *HorzontalMesh; const VertCoord *VerticalCoord; const I4 NVertLayers; @@ -657,6 +721,8 @@ class TracerHorzAdvOnCell { Array3DReal LowOrderFlx; Array1DI4 MinLayerCell; Array1DI4 MaxLayerCell; + Array3DReal ActiveTracerHorizontalAdvectionEdgeFlux; + Array3DReal ActiveTracerHorizontalAdvectionTendency; }; // Tracer horizontal diffusion term From c8451c168e5b8ffdc8eacf1c340b18806d60b9e2 Mon Sep 17 00:00:00 2001 From: James Overfelt Date: Thu, 18 Jun 2026 12:13:04 -0500 Subject: [PATCH 03/32] Starting debugging. --- components/omega/src/ocn/Tendencies.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/components/omega/src/ocn/Tendencies.cpp b/components/omega/src/ocn/Tendencies.cpp index 6204a71566cb..d511523f704a 100644 --- a/components/omega/src/ocn/Tendencies.cpp +++ b/components/omega/src/ocn/Tendencies.cpp @@ -7,6 +7,7 @@ // tendency terms are enabled. // //===----------------------------------------------------------------------===// +#include #include "Tendencies.h" #include "CustomTendencyTerms.h" @@ -230,6 +231,8 @@ void Tendencies::readConfig(Config *OmegaConfig ///< [in] Omega config CHECK_ERROR_ABORT( Err, "Tendencies: HorzTracerFluxLimiterEnable not found in AdvectConfig"); + std::cout<<__FILE__<<":"<<__LINE__<<" Set TracerHorzAdv.FCT to true"<TracerDiffusion.Enabled); @@ -760,6 +763,7 @@ void Tendencies::computeTracerTendenciesOnly( if (LocTracerHorzAdv.Enabled) { Pacer::start("Tend:tracerHorzAdv", 2); if (LocTracerHorzAdv.FCT) { + std::cout<<__FILE__<<":"<<__LINE__<<" Calling LocTracerHorzAdv.FCTProvisionaLayerThicknesses."<NCellsAll}, KOKKOS_LAMBDA(int ICell) { LocTracerHorzAdv.FCTProvisionaLayerThicknesses( From 723fc1b83c84a86a540df424ff27bfd4b7b10f68 Mon Sep 17 00:00:00 2001 From: James Overfelt Date: Thu, 18 Jun 2026 13:19:48 -0600 Subject: [PATCH 04/32] Allocate scratch memory. --- components/omega/src/ocn/Tendencies.cpp | 7 ++-- components/omega/src/ocn/TendencyTerms.cpp | 36 +++++++++++++--- components/omega/src/ocn/TendencyTerms.h | 49 ++++++++++++---------- 3 files changed, 62 insertions(+), 30 deletions(-) diff --git a/components/omega/src/ocn/Tendencies.cpp b/components/omega/src/ocn/Tendencies.cpp index d511523f704a..af6cb8f65b2f 100644 --- a/components/omega/src/ocn/Tendencies.cpp +++ b/components/omega/src/ocn/Tendencies.cpp @@ -426,7 +426,7 @@ Tendencies::Tendencies(const std::string &Name_, ///< [in] Name for tendencies VelocityDiffusion(Mesh, VCoord), VelocityHyperDiff(Mesh, VCoord), SfcStressForcing(Mesh, VCoord), BottomDrag(Mesh, VCoord), TracerDiffusion(Mesh, VCoord), TracerHyperDiff(Mesh, VCoord), - TracerHorzAdv(Mesh, VCoord), SurfaceTracerRestoring(Mesh), + TracerHorzAdv(Mesh, VCoord, VAdv), SurfaceTracerRestoring(Mesh), CustomThicknessTend(InCustomThicknessTend), CustomVelocityTend(InCustomVelocityTend), EqState(EqState), PGrad(PGrad), VMix(VMix) { @@ -757,7 +757,8 @@ void Tendencies::computeTracerTendenciesOnly( Array2DReal NormalVelEdge = State->getNormalVelocity(VelTimeLevel); const Array2DReal &FluxPseudoThickEdge = AuxState->PseudoThicknessAux.FluxPseudoThickEdge; - const Array2DReal NormVelEdge = State->getNormalVelocity(VelTimeLevel); + const Array2DReal &PseudoThickCell = State->getPseudoThickness(ThickTimeLevel); + const Array2DReal NormVelEdge = State->getNormalVelocity(VelTimeLevel); R8 Dt = 0; TimeStep.get(Dt, TimeUnits::Seconds); if (LocTracerHorzAdv.Enabled) { @@ -767,7 +768,7 @@ void Tendencies::computeTracerTendenciesOnly( parallelFor( {Mesh->NCellsAll}, KOKKOS_LAMBDA(int ICell) { LocTracerHorzAdv.FCTProvisionaLayerThicknesses( - FluxPseudoThickEdge, NormVelEdge, Dt, ICell); + FluxPseudoThickEdge, PseudoThickCell, NormVelEdge, Dt, ICell); }); } else { parallelForOuter( diff --git a/components/omega/src/ocn/TendencyTerms.cpp b/components/omega/src/ocn/TendencyTerms.cpp index 09578d1b3200..34b761d6576b 100644 --- a/components/omega/src/ocn/TendencyTerms.cpp +++ b/components/omega/src/ocn/TendencyTerms.cpp @@ -9,12 +9,10 @@ //===----------------------------------------------------------------------===// #include "TendencyTerms.h" -#include "AuxiliaryState.h" #include "DataTypes.h" #include "Error.h" #include "HorzMesh.h" #include "HorzOperators.h" -#include "OceanState.h" #include "Tracers.h" namespace OMEGA { @@ -73,7 +71,8 @@ BottomDragOnEdge::BottomDragOnEdge(const HorzMesh *Mesh, MaxLayerEdgeTop(VCoord->MaxLayerEdgeTop) {} TracerHorzAdvOnCell::TracerHorzAdvOnCell(const HorzMesh *Mesh, - const VertCoord *VCoord) + const VertCoord *VCoord, + const VertAdv *VAdv) : HorzontalMesh(Mesh), VerticalCoord(VCoord), NVertLayers(VCoord->NVertLayers), NAdvCellsForEdge("NumberOfCellsContribToAdvectionAtEdge", @@ -82,6 +81,7 @@ TracerHorzAdvOnCell::TracerHorzAdvOnCell(const HorzMesh *Mesh, Mesh->MaxEdges2 + 2), AdvMaskHighOrder("MaskForHighOrderAdvectionTerms", Mesh->NEdgesAll, VCoord->NVertLayers), + CellsOnCell(Mesh->CellsOnCell), AdvCoefs("CommonAdvectionCoefficients", Mesh->MaxEdges2 + 2, Mesh->NEdgesAll), AdvCoefs3rd("CommonAdvectionCoeffsForHighOrder", Mesh->MaxEdges2 + 2, @@ -89,8 +89,25 @@ TracerHorzAdvOnCell::TracerHorzAdvOnCell(const HorzMesh *Mesh, HighOrderFlxHorz("HigherOrderHorizontalFlux", Tracers::getNumTracers(), Mesh->NEdgesAll, VCoord->NVertLayers), NEdgesOnCell(Mesh->NEdgesOnCell), EdgesOnCell(Mesh->EdgesOnCell), - CellsOnEdge(Mesh->CellsOnEdge), EdgeSignOnCell(Mesh->EdgeSignOnCell), - DvEdge(Mesh->DvEdge), AreaCell(Mesh->AreaCell) {} + CellsOnEdge(Mesh->CellsOnEdge), + MinLayerEdgeBot(VCoord->MinLayerEdgeBot), + MaxLayerEdgeTop(VCoord->MinLayerEdgeTop), + EdgeSignOnCell(Mesh->EdgeSignOnCell), + DvEdge(Mesh->DvEdge), AreaCell(Mesh->AreaCell), + VerticalPseudoVelocity(VAdv->VerticalPseudoVelocity), + HProvInv(), + HNewInv(), + HProv(), + TracerMax(), + TracerMin(), + HighOrderFlx(), + LowOrderFlx(), + MinLayerCell(VCoord->MinLayerCell), + MaxLayerCell(VCoord->MaxLayerCell), + ActiveTracerHorizontalAdvectionEdgeFlux(), + ActiveTracerHorizontalAdvectionTendency() { + deepCopy(HighOrderFlxHorz, 0); +} TracerDiffOnCell::TracerDiffOnCell(const HorzMesh *Mesh, const VertCoord *VCoord) @@ -153,6 +170,15 @@ void TracerHorzAdvOnCell::init() { Array2DReal("FCTProvesionalThickness", Mesh->NCellsAll, NVertLayers); TracerMax = Array2DReal("FCTTracerMax", Mesh->NCellsAll, NVertLayers); TracerMin = Array2DReal("FCTTracerMin", Mesh->NCellsAll, NVertLayers); + HighOrderFlx = Array2DReal("FCTHighOrderFlx", Mesh->NEdgesAll, NVertLayers); + LowOrderFlx = Array2DReal("FCTLowhOrderFlx", Mesh->NEdgesAll, NVertLayers); + if (ComputeBudgets) { + const int NTracers = Tracers::getNumTracers(); + ActiveTracerHorizontalAdvectionEdgeFlux = + Array3DReal("FCTActiveTracerHorizontalAdvectionEdgeFlux", NTracers, Mesh->NCellsAll, NVertLayers); + ActiveTracerHorizontalAdvectionTendency = + Array3DReal("FCTActiveTracerHorizontalAdvectionTendency", NTracers, Mesh->NCellsAll, NVertLayers); + } } } } // end namespace OMEGA diff --git a/components/omega/src/ocn/TendencyTerms.h b/components/omega/src/ocn/TendencyTerms.h index 26259c380307..f0c738bfbcd9 100644 --- a/components/omega/src/ocn/TendencyTerms.h +++ b/components/omega/src/ocn/TendencyTerms.h @@ -367,12 +367,14 @@ class BottomDragOnEdge { // Tracer horizontal advection term class TracerHorzAdvOnCell { public: - bool Enabled = true; - bool ForceLowOrder = false; - bool FCT = true; + bool Enabled = true; + bool ForceLowOrder = false; + bool FCT = true; + bool ComputeBudgets = false; + bool MonotonicityCheck = false; // coefficient for blending high-order terms Real Coef3rdOrder = 0.25; - TracerHorzAdvOnCell(const HorzMesh *Mesh, const VertCoord *VCoord); + TracerHorzAdvOnCell(const HorzMesh *Mesh, const VertCoord *VCoord, const VertAdv *VAdv); void init(); KOKKOS_FUNCTION void operator()(const I4 L, const I4 IEdge, const I4 KChunk, const Array3DReal &TracerCell, @@ -433,12 +435,14 @@ class TracerHorzAdvOnCell { } KOKKOS_FUNCTION void FCTProvisionaLayerThicknesses( - const Array2DReal &FluxPseudoThickEdge, const Array2DReal &NormVelEdge, + const Array2DReal &FluxPseudoThickEdge, + const Array2DReal &PseudoThickCell, + const Array2DReal &NormVelEdge, const Real Dt, const I4 ICell) const { const Real InvAreaCell = 1.0_Real / AreaCell(ICell); for (I4 K = MinLayerCell(ICell); K < MaxLayerCell(ICell); ++K) { - HProv(ICell, K) = Dt * PseudoThick(ICell, K); + HProv(ICell, K) = Dt * PseudoThickCell(ICell, K); } for (I4 I = 0; I < NEdgesOnCell(ICell); ++I) { const I4 IEdge = EdgesOnCell(ICell, I); @@ -509,7 +513,7 @@ class TracerHorzAdvOnCell { // compute some common intermediate factors for (I4 K = KStart; K < KEnd; ++K) - HighOrderFlx(L, IEdge, K) = 0.0_Real; + HighOrderFlx(IEdge, K) = 0.0_Real; // Compute 3rd or 4th fluxes where requested. for (int I = 0; I < NAdvCellsForEdge(IEdge); ++I) { @@ -522,7 +526,7 @@ class TracerHorzAdvOnCell { for (I4 K = KStartCell; K < KEndCell; ++K) { const Real NormalPseudoThicknessFlux = FluxPseudoThickEdge(IEdge, K) * NormVelEdge(IEdge, K); - HighOrderFlx(L, IEdge, K) += + HighOrderFlx(IEdge, K) += TracerCell(L, ICell, K) * NormalPseudoThicknessFlux * AdvMaskHighOrder(IEdge, K) * (Coef1 + @@ -540,15 +544,15 @@ class TracerHorzAdvOnCell { (DvEdge(IEdge) * 0.5_Real) * NormalPseudoThicknessFlux; - LowOrderFlx(L, IEdge, K) = + LowOrderFlx(IEdge, K) = DvEdge(IEdge) * (Kokkos::max(0.0_Real, NormalPseudoThicknessFlux) * TracerCell(L, ICell1, K) + Kokkos::min(0.0_Real, NormalPseudoThicknessFlux) * TracerCell(L, ICell2, K)); - HighOrderFlx(L, IEdge, K) += TracerWeight * (TracerCell(L, ICell1, K) + + HighOrderFlx(IEdge, K) += TracerWeight * (TracerCell(L, ICell1, K) + TracerCell(L, ICell2, K)); - HighOrderFlx(L, IEdge, K) -= LowOrderFlx(L, IEdge, K); + HighOrderFlx(IEdge, K) -= LowOrderFlx(IEdge, K); } } @@ -567,7 +571,9 @@ class TracerHorzAdvOnCell { } KOKKOS_FUNCTION void FCTFluxInOut(const I4 L, const I4 ICell, - const I4 KChunk, Array2DReal &WorkTend, + const I4 KChunk, + const Array2DReal &PseudoThickCell, + Array2DReal &WorkTend, Array2DReal &FlxIn, Array2DReal &FlxOut, const Real Dt, const Array3DReal &TracerCell) const { @@ -585,13 +591,13 @@ class TracerHorzAdvOnCell { ++K) { // Here workTend is the advection tendency due to the // upwind (low order) fluxes. - WorkTend(ICell, K) += SignedFactor * LowOrderFlx(L, IEdge, K); + WorkTend(ICell, K) += SignedFactor * LowOrderFlx(IEdge, K); // Accumulate remaining high order fluxes FlxOut(ICell, K) += Kokkos::min( - 0.0_Real, SignedFactor * HighOrderFlx(L, IEdge, K)); + 0.0_Real, SignedFactor * HighOrderFlx(IEdge, K)); FlxIn(ICell, K) += Kokkos::max( - 0.0_Real, SignedFactor * HighOrderFlx(L, IEdge, K)); + 0.0_Real, SignedFactor * HighOrderFlx(IEdge, K)); } } // Build the factors for the FCT @@ -601,7 +607,7 @@ class TracerHorzAdvOnCell { for (I4 K = MinLayerCell(ICell); K < MaxLayerCell(ICell); ++K) { // Here workTend is the upwind tendency const Real TracerUpwindNew = - (TracerCell(L, ICell, K) * PseudoThick(ICell, K) + + (TracerCell(L, ICell, K) * PseudoThickCell(ICell, K) + Dt * WorkTend(ICell, K)) * HProvInv(ICell, K); const Real TracerMinNew = TracerUpwindNew + Dt * FlxOut(ICell, K) * HProvInv(ICell, K); @@ -638,7 +644,7 @@ class TracerHorzAdvOnCell { for (I4 K = MinLayerEdgeBot(IEdge); K < MaxLayerEdgeTop(IEdge); ++K) { // WorkTend on RHS is upwind tendency // WorkTend on LHS is total horiz advect tendency - WorkTend(ICell,K) += SignedFactor*HighOrderFlx(L,IEdge,K); + WorkTend(ICell,K) += SignedFactor*HighOrderFlx(IEdge,K); } } for (I4 K = MinLayerCell(ICell); K < MaxLayerCell(ICell); ++K) { @@ -657,7 +663,7 @@ class TracerHorzAdvOnCell { // Save u*h*T flux on edge for analysis. This variable will be // divided by h at the end of the time step. ActiveTracerHorizontalAdvectionEdgeFlux(L,IEdge,K) = - (LowOrderFlx(L,IEdge,K) + HighOrderFlx(L,IEdge,K))/DvEdge(IEdge); + (LowOrderFlx(IEdge,K) + HighOrderFlx(IEdge,K))/DvEdge(IEdge); } } @@ -689,7 +695,7 @@ class TracerHorzAdvOnCell { private: - const Real Eps = 1.e-10_Real; + const Real Eps = 1.e-10_Real; const HorzMesh *HorzontalMesh; const VertCoord *VerticalCoord; const I4 NVertLayers; @@ -710,15 +716,14 @@ class TracerHorzAdvOnCell { Array2DReal EdgeSignOnCell; Array1DReal DvEdge; Array1DReal AreaCell; - Array2DReal PseudoThick; Array2DReal VerticalPseudoVelocity; Array2DReal HProvInv; Array2DReal HNewInv; Array2DReal HProv; Array2DReal TracerMax; Array2DReal TracerMin; - Array3DReal HighOrderFlx; - Array3DReal LowOrderFlx; + Array2DReal HighOrderFlx; + Array2DReal LowOrderFlx; Array1DI4 MinLayerCell; Array1DI4 MaxLayerCell; Array3DReal ActiveTracerHorizontalAdvectionEdgeFlux; From 517662c0218b9016f3ed7192f2ef5685d76ec822 Mon Sep 17 00:00:00 2001 From: James Overfelt Date: Sat, 20 Jun 2026 10:09:36 -0500 Subject: [PATCH 05/32] Debugging NormalThicknessFlux. --- components/omega/src/ocn/Tendencies.cpp | 80 ++++++++++++++---------- components/omega/src/ocn/TendencyTerms.h | 48 ++++++++------ 2 files changed, 74 insertions(+), 54 deletions(-) diff --git a/components/omega/src/ocn/Tendencies.cpp b/components/omega/src/ocn/Tendencies.cpp index af6cb8f65b2f..38981e67852b 100644 --- a/components/omega/src/ocn/Tendencies.cpp +++ b/components/omega/src/ocn/Tendencies.cpp @@ -566,7 +566,7 @@ void Tendencies::computeVelocityTendenciesOnly( AuxState->PseudoThicknessAux.FluxPseudoThickEdge; const Array2DReal &NormRVortEdge = AuxState->VorticityAux.NormRelVortEdge; const Array2DReal &NormFEdge = AuxState->VorticityAux.NormPlanetVortEdge; - Array2DReal NormVelEdge = State->getNormalVelocity(VelTimeLevel); + Array2DReal NormalVelEdge = State->getNormalVelocity(VelTimeLevel); if (LocPotentialVortHAdv.Enabled) { Pacer::start("Tend:PotentialVortHAdv", 2); parallelForOuter( @@ -579,7 +579,7 @@ void Tendencies::computeVelocityTendenciesOnly( Team, KRange, INNER_LAMBDA(int KChunk) { LocPotentialVortHAdv(LocNormalVelocityTend, IEdge, KChunk, NormRVortEdge, NormFEdge, - FluxPseudoThickEdge, NormVelEdge); + FluxPseudoThickEdge, NormalVelEdge); }); }); Pacer::stop("Tend:PotentialVortHAdv", 2); @@ -660,7 +660,7 @@ void Tendencies::computeVelocityTendenciesOnly( Pacer::start("Tend:computeVelocityVAdvTend", 2); // Compute velocity tendency from vertical advection - VAdv->computeVelocityVAdvTend(NormalVelocityTend, NormVelEdge, + VAdv->computeVelocityVAdvTend(NormalVelocityTend, NormalVelEdge, FluxPseudoThickEdge); Pacer::stop("Tend:computeVelocityVAdvTend", 2); @@ -691,7 +691,7 @@ void Tendencies::computeVelocityTendenciesOnly( Pacer::start("Tend:bottomDrag", 2); parallelFor( {Mesh->NEdgesAll}, KOKKOS_LAMBDA(int IEdge) { - LocBottomDrag(LocNormalVelocityTend, IEdge, NormVelEdge, KECell, + LocBottomDrag(LocNormalVelocityTend, IEdge, NormalVelEdge, KECell, MeanPseudoThickEdge); }); Pacer::stop("Tend:bottomDrag", 2); @@ -736,58 +736,70 @@ void Tendencies::computeTracerTendenciesOnly( OMEGA_SCOPE(LocTracerDiffusion, TracerDiffusion); OMEGA_SCOPE(LocTracerHyperDiff, TracerHyperDiff); OMEGA_SCOPE(LocSurfaceTracerRestoring, SurfaceTracerRestoring); - OMEGA_SCOPE(MinLayerCell, VCoord->MinLayerCell); - OMEGA_SCOPE(MaxLayerCell, VCoord->MaxLayerCell); - OMEGA_SCOPE(MinLayerEdgeBot, VCoord->MinLayerEdgeBot); - OMEGA_SCOPE(MaxLayerEdgeTop, VCoord->MaxLayerEdgeTop); + OMEGA_SCOPE(LocMinLayerCell, VCoord->MinLayerCell); + OMEGA_SCOPE(LocMaxLayerCell, VCoord->MaxLayerCell); + OMEGA_SCOPE(LocMinLayerEdgeBot, VCoord->MinLayerEdgeBot); + OMEGA_SCOPE(LocMaxLayerEdgeTop, VCoord->MaxLayerEdgeTop); + + Array2DReal NormalVelEdge = State->getNormalVelocity(VelTimeLevel); + Array2DReal PseudoThickCell = State->getPseudoThickness(ThickTimeLevel); + Array2DReal FluxPseudoThickEdge = AuxState->PseudoThicknessAux.FluxPseudoThickEdge; + + OMEGA_SCOPE(LocPseudoThickCell, PseudoThickCell); + OMEGA_SCOPE(LocNormalVelEdge, NormalVelEdge); + OMEGA_SCOPE(LocFluxPseudoThickEdge, FluxPseudoThickEdge); Pacer::start("Tend:computeTracerTendenciesOnly", 1); parallelForOuter( {NTracers, Mesh->NCellsAll}, KOKKOS_LAMBDA(int L, int ICell, const TeamMember &Team) { - const int KMin = MinLayerCell(ICell); - const int KMax = MaxLayerCell(ICell); + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); parallelForInner( Team, Range{KMin, KMax}, INNER_LAMBDA(int K) { LocTracerTend(L, ICell, K) = 0; }); }); // compute tracer horizotal advection - Array2DReal NormalVelEdge = State->getNormalVelocity(VelTimeLevel); - const Array2DReal &FluxPseudoThickEdge = - AuxState->PseudoThicknessAux.FluxPseudoThickEdge; - const Array2DReal &PseudoThickCell = State->getPseudoThickness(ThickTimeLevel); - const Array2DReal NormVelEdge = State->getNormalVelocity(VelTimeLevel); R8 Dt = 0; TimeStep.get(Dt, TimeUnits::Seconds); if (LocTracerHorzAdv.Enabled) { Pacer::start("Tend:tracerHorzAdv", 2); if (LocTracerHorzAdv.FCT) { - std::cout<<__FILE__<<":"<<__LINE__<<" Calling LocTracerHorzAdv.FCTProvisionaLayerThicknesses."<NCellsAll}, KOKKOS_LAMBDA(int ICell) { - LocTracerHorzAdv.FCTProvisionaLayerThicknesses( - FluxPseudoThickEdge, PseudoThickCell, NormVelEdge, Dt, ICell); - }); +// parallelForOuter( {Mesh->NCellsAll}, +// KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { + for (int ICell=0; ICell< Mesh->NCellsAll; ++ICell) { + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); + const int KRange = vertRangeChunked(KMin, KMax); +// parallelForInner( +// Team, KRange, INNER_LAMBDA(int KChunk) { + for (int KChunk=KMin; KChunk <= KMax; ++KChunk) { + LocTracerHorzAdv.FCTProvisionaLayerThicknesses(ICell, KChunk, Dt, + LocFluxPseudoThickEdge, LocPseudoThickCell, LocNormalVelEdge); + } + } +// }); +// }); } else { parallelForOuter( {NTracers, Mesh->NEdgesAll}, KOKKOS_LAMBDA(int L, int IEdge, const TeamMember &Team) { - const int KMin = MinLayerEdgeBot(IEdge); - const int KMax = MaxLayerEdgeTop(IEdge); + const int KMin = LocMinLayerEdgeBot(IEdge); + const int KMax = LocMaxLayerEdgeTop(IEdge); const int KRange = vertRangeChunked(KMin, KMax); parallelForInner( Team, KRange, INNER_LAMBDA(int KChunk) { LocTracerHorzAdv(L, IEdge, KChunk, TracerArray, - FluxPseudoThickEdge, NormalVelEdge); + LocFluxPseudoThickEdge, LocNormalVelEdge); }); }); parallelForOuter( {NTracers, Mesh->NCellsAll}, KOKKOS_LAMBDA(int L, int ICell, const TeamMember &Team) { - const int KMin = MinLayerCell(ICell); - const int KMax = MaxLayerCell(ICell); + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); const int KRange = vertRangeChunked(KMin, KMax); parallelForInner( Team, KRange, INNER_LAMBDA(int KChunk) { @@ -806,8 +818,8 @@ void Tendencies::computeTracerTendenciesOnly( parallelForOuter( {NTracers, Mesh->NCellsAll}, KOKKOS_LAMBDA(int L, int ICell, const TeamMember &Team) { - const int KMin = MinLayerCell(ICell); - const int KMax = MaxLayerCell(ICell); + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); const int KRange = vertRangeChunked(KMin, KMax); parallelForInner( @@ -826,8 +838,8 @@ void Tendencies::computeTracerTendenciesOnly( parallelForOuter( {NTracers, Mesh->NCellsAll}, KOKKOS_LAMBDA(int L, int ICell, const TeamMember &Team) { - const int KMin = MinLayerCell(ICell); - const int KMax = MaxLayerCell(ICell); + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); const int KRange = vertRangeChunked(KMin, KMax); parallelForInner( @@ -862,7 +874,7 @@ void Tendencies::computeTracerTendenciesOnly( parallelFor( {NTracersToRestore, Mesh->NCellsAll}, KOKKOS_LAMBDA(int R, int ICell) { - const int KMin = MinLayerCell(ICell); + const int KMin = LocMinLayerCell(ICell); const int L = TracerIdsToRestore(R); LocSurfaceTracerRestoring(LocTracerTend, L, ICell, KMin, TracersMonthlySurfClimo, TracerArray); @@ -882,10 +894,10 @@ void Tendencies::computePseudoThicknessTendencies( ) { // only need PseudoThicknessAux on edge Array2DReal PseudoThick = State->getPseudoThickness(ThickTimeLevel); - Array2DReal NormVel = State->getNormalVelocity(VelTimeLevel); + Array2DReal NormalVelEdge = State->getNormalVelocity(VelTimeLevel); OMEGA_SCOPE(PseudoThicknessAux, AuxState->PseudoThicknessAux); OMEGA_SCOPE(PseudoThickCell, PseudoThick); - OMEGA_SCOPE(NormalVelEdge, NormVel); + OMEGA_SCOPE(LocNormalVelEdge, NormalVelEdge); OMEGA_SCOPE(MinLayerEdgeBot, VCoord->MinLayerEdgeBot); OMEGA_SCOPE(MaxLayerEdgeTop, VCoord->MaxLayerEdgeTop); @@ -902,7 +914,7 @@ void Tendencies::computePseudoThicknessTendencies( parallelForInner( Team, KRange, INNER_LAMBDA(int KChunk) { PseudoThicknessAux.computeVarsOnEdge( - IEdge, KChunk, PseudoThickCell, NormalVelEdge); + IEdge, KChunk, PseudoThickCell, LocNormalVelEdge); }); }); Pacer::stop("Tend:computePseudoThickAux", 2); diff --git a/components/omega/src/ocn/TendencyTerms.h b/components/omega/src/ocn/TendencyTerms.h index f0c738bfbcd9..dc0932b10eec 100644 --- a/components/omega/src/ocn/TendencyTerms.h +++ b/components/omega/src/ocn/TendencyTerms.h @@ -19,6 +19,7 @@ #include "VertCoord.h" #include // for std::copysign +#include namespace OMEGA { @@ -435,14 +436,18 @@ class TracerHorzAdvOnCell { } KOKKOS_FUNCTION void FCTProvisionaLayerThicknesses( + const I4 ICell, const I4 KChunk, const Real Dt, const Array2DReal &FluxPseudoThickEdge, const Array2DReal &PseudoThickCell, - const Array2DReal &NormVelEdge, - const Real Dt, const I4 ICell) const { + const Array2DReal &NormVelEdge) const { - const Real InvAreaCell = 1.0_Real / AreaCell(ICell); - for (I4 K = MinLayerCell(ICell); K < MaxLayerCell(ICell); ++K) { - HProv(ICell, K) = Dt * PseudoThickCell(ICell, K); + + const I4 KStart = KChunk * VecLength; + const I4 KEnd = KStart + VecLength; + + const Real InvAreaCell = Dt / AreaCell(ICell); + for (I4 K = KStart; K < KEnd; ++K) { + HProv(ICell, K) = PseudoThickCell(ICell, K); } for (I4 I = 0; I < NEdgesOnCell(ICell); ++I) { const I4 IEdge = EdgesOnCell(ICell, I); @@ -450,19 +455,22 @@ class TracerHorzAdvOnCell { InvAreaCell * DvEdge(IEdge) * EdgeSignOnCell(ICell, I); // Provisional layer thickness is after horizontal // thickness flux only - for (I4 K = MinLayerCell(ICell); K < MaxLayerCell(ICell); ++K) { - const Real NormalPseudoThicknessFlux = + for (I4 K = KStart; K < KEnd; ++K) { + const Real NormalThicknessFlux = FluxPseudoThickEdge(IEdge, K) * NormVelEdge(IEdge, K); - HProv(ICell, K) += SignedFactor * NormalPseudoThicknessFlux; + HProv(ICell, K) += SignedFactor * NormalThicknessFlux; +std::cout<<"HProv "< Date: Sat, 20 Jun 2026 09:21:01 -0600 Subject: [PATCH 06/32] Call FCTTracerMinMax --- components/omega/src/ocn/Tendencies.cpp | 26 ++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/components/omega/src/ocn/Tendencies.cpp b/components/omega/src/ocn/Tendencies.cpp index 38981e67852b..5b372dff561a 100644 --- a/components/omega/src/ocn/Tendencies.cpp +++ b/components/omega/src/ocn/Tendencies.cpp @@ -775,12 +775,32 @@ void Tendencies::computeTracerTendenciesOnly( const int KRange = vertRangeChunked(KMin, KMax); // parallelForInner( // Team, KRange, INNER_LAMBDA(int KChunk) { - for (int KChunk=KMin; KChunk <= KMax; ++KChunk) { - LocTracerHorzAdv.FCTProvisionaLayerThicknesses(ICell, KChunk, Dt, - LocFluxPseudoThickEdge, LocPseudoThickCell, LocNormalVelEdge); + for (int KChunk=KMin; KChunk <= KMax; ++KChunk) { + LocTracerHorzAdv.FCTProvisionaLayerThicknesses(ICell, KChunk, Dt, + LocFluxPseudoThickEdge, LocPseudoThickCell, LocNormalVelEdge); } } // }); +// }); +// parallelForOuter( {NTracers, Mesh->NCellsAll}, +// KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { + for (int L=0; L< NTracers; ++L) { + for (int ICell=0; ICell< Mesh->NCellsAll; ++ICell) { + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); + const int KRange = vertRangeChunked(KMin, KMax); +// parallelForInner( +// Team, KRange, INNER_LAMBDA(int KChunk) { + for (int KChunk=KMin; KChunk <= KMax; ++KChunk) { + LocTracerHorzAdv.FCTTracerMinMax(L, ICell, + KChunk, + LocMinLayerCell, + LocMaxLayerCell, + TracerArray); + } + } + } +// }); // }); } else { parallelForOuter( From aa259c965d5ea6977b197fb3688790a44e4c4e41 Mon Sep 17 00:00:00 2001 From: James Overfelt Date: Sat, 20 Jun 2026 12:03:23 -0500 Subject: [PATCH 07/32] Fix tracer min/max. --- components/omega/src/ocn/Tendencies.cpp | 27 +++++++++++++++------ components/omega/src/ocn/TendencyTerms.cpp | 18 +++++++------- components/omega/src/ocn/TendencyTerms.h | 28 ++++++++++++++-------- 3 files changed, 48 insertions(+), 25 deletions(-) diff --git a/components/omega/src/ocn/Tendencies.cpp b/components/omega/src/ocn/Tendencies.cpp index 5b372dff561a..229a1da9b9e6 100644 --- a/components/omega/src/ocn/Tendencies.cpp +++ b/components/omega/src/ocn/Tendencies.cpp @@ -782,9 +782,23 @@ void Tendencies::computeTracerTendenciesOnly( } // }); // }); -// parallelForOuter( {NTracers, Mesh->NCellsAll}, + for (int L=0; L< NTracers; ++L) { +// parallelForOuter( {Mesh->NCellsAll}, +// KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { + for (int ICell=0; ICell< Mesh->NCellsAll; ++ICell) { + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); + const int KRange = vertRangeChunked(KMin, KMax); +// parallelForInner( +// Team, KRange, INNER_LAMBDA(int KChunk) { + for (int KChunk=KMin; KChunk <= KMax; ++KChunk) { + LocTracerHorzAdv.FCTTracerCurFill(L, ICell, KChunk, TracerArray); + } + } +// }); +// }); +// parallelForOuter( {Mesh->NCellsAll}, // KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { - for (int L=0; L< NTracers; ++L) { for (int ICell=0; ICell< Mesh->NCellsAll; ++ICell) { const int KMin = LocMinLayerCell(ICell); const int KMax = LocMaxLayerCell(ICell); @@ -795,13 +809,12 @@ void Tendencies::computeTracerTendenciesOnly( LocTracerHorzAdv.FCTTracerMinMax(L, ICell, KChunk, LocMinLayerCell, - LocMaxLayerCell, - TracerArray); - } - } - } + LocMaxLayerCell); + } + } // }); // }); + } } else { parallelForOuter( {NTracers, Mesh->NEdgesAll}, diff --git a/components/omega/src/ocn/TendencyTerms.cpp b/components/omega/src/ocn/TendencyTerms.cpp index 34b761d6576b..cab333525227 100644 --- a/components/omega/src/ocn/TendencyTerms.cpp +++ b/components/omega/src/ocn/TendencyTerms.cpp @@ -88,6 +88,7 @@ TracerHorzAdvOnCell::TracerHorzAdvOnCell(const HorzMesh *Mesh, Mesh->NEdgesAll), HighOrderFlxHorz("HigherOrderHorizontalFlux", Tracers::getNumTracers(), Mesh->NEdgesAll, VCoord->NVertLayers), + TracerCur(), NEdgesOnCell(Mesh->NEdgesOnCell), EdgesOnCell(Mesh->EdgesOnCell), CellsOnEdge(Mesh->CellsOnEdge), MinLayerEdgeBot(VCoord->MinLayerEdgeBot), @@ -165,19 +166,20 @@ void TracerHorzAdvOnCell::init() { HProvInv = Array2DReal("FCTProvesionalLayerThickness", Mesh->NEdgesAll, NVertLayers); HNewInv = - Array2DReal("FCTProvesionalNewInverse", Mesh->NEdgesAll, NVertLayers); + Array2DReal("FCTProvesionalNewInverse", NEdgesAll, NVertLayers); HProv = - Array2DReal("FCTProvesionalThickness", Mesh->NCellsAll, NVertLayers); - TracerMax = Array2DReal("FCTTracerMax", Mesh->NCellsAll, NVertLayers); - TracerMin = Array2DReal("FCTTracerMin", Mesh->NCellsAll, NVertLayers); - HighOrderFlx = Array2DReal("FCTHighOrderFlx", Mesh->NEdgesAll, NVertLayers); - LowOrderFlx = Array2DReal("FCTLowhOrderFlx", Mesh->NEdgesAll, NVertLayers); + Array2DReal("FCTProvesionalThickness", NCellsAll, NVertLayers); + TracerCur = Array2DReal("TracerCur", NCellsAll+1, NVertLayers), + TracerMax = Array2DReal("FCTTracerMax", NCellsAll, NVertLayers); + TracerMin = Array2DReal("FCTTracerMin", NCellsAll, NVertLayers); + HighOrderFlx = Array2DReal("FCTHighOrderFlx", NEdgesAll, NVertLayers); + LowOrderFlx = Array2DReal("FCTLowhOrderFlx", NEdgesAll, NVertLayers); if (ComputeBudgets) { const int NTracers = Tracers::getNumTracers(); ActiveTracerHorizontalAdvectionEdgeFlux = - Array3DReal("FCTActiveTracerHorizontalAdvectionEdgeFlux", NTracers, Mesh->NCellsAll, NVertLayers); + Array3DReal("FCTActiveTracerHorizontalAdvectionEdgeFlux", NTracers, NCellsAll, NVertLayers); ActiveTracerHorizontalAdvectionTendency = - Array3DReal("FCTActiveTracerHorizontalAdvectionTendency", NTracers, Mesh->NCellsAll, NVertLayers); + Array3DReal("FCTActiveTracerHorizontalAdvectionTendency", NTracers, NCellsAll, NVertLayers); } } } diff --git a/components/omega/src/ocn/TendencyTerms.h b/components/omega/src/ocn/TendencyTerms.h index dc0932b10eec..b443d4a935c5 100644 --- a/components/omega/src/ocn/TendencyTerms.h +++ b/components/omega/src/ocn/TendencyTerms.h @@ -459,8 +459,8 @@ class TracerHorzAdvOnCell { const Real NormalThicknessFlux = FluxPseudoThickEdge(IEdge, K) * NormVelEdge(IEdge, K); HProv(ICell, K) += SignedFactor * NormalThicknessFlux; -std::cout<<"HProv "< Date: Sat, 20 Jun 2026 11:40:31 -0600 Subject: [PATCH 08/32] Add call to FCTHighAndLowOrderFlux --- components/omega/src/ocn/Tendencies.cpp | 28 ++++++++++++++++++++---- components/omega/src/ocn/TendencyTerms.h | 19 ++++++++-------- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/components/omega/src/ocn/Tendencies.cpp b/components/omega/src/ocn/Tendencies.cpp index 229a1da9b9e6..38d69d5581df 100644 --- a/components/omega/src/ocn/Tendencies.cpp +++ b/components/omega/src/ocn/Tendencies.cpp @@ -806,14 +806,34 @@ void Tendencies::computeTracerTendenciesOnly( // parallelForInner( // Team, KRange, INNER_LAMBDA(int KChunk) { for (int KChunk=KMin; KChunk <= KMax; ++KChunk) { - LocTracerHorzAdv.FCTTracerMinMax(L, ICell, - KChunk, - LocMinLayerCell, - LocMaxLayerCell); + LocTracerHorzAdv.FCTTracerMinMax(ICell, KChunk, + LocMinLayerCell, LocMaxLayerCell); } } // }); // }); + + +// parallelForOuter( {Mesh->NEdgesAll}, +// KOKKOS_LAMBDA(int IEdge, const TeamMember &Team) { + for (int IEdge=0; IEdge< Mesh->NEdgesAll; ++IEdge) { + const int KMin = LocMinLayerEdgeBot(IEdge); + const int KMax = LocMaxLayerEdgeTop(IEdge); + const int KRange = vertRangeChunked(KMin, KMax); +// parallelForInner( +// Team, KRange, INNER_LAMBDA(int KChunk) { + for (int KChunk=KMin; KChunk <= KMax; ++KChunk) { + LocTracerHorzAdv.FCTHighAndLowOrderFlux(L, IEdge, KChunk, + LocMinLayerCell, LocMaxLayerCell, + LocFluxPseudoThickEdge, LocNormalVelEdge); + } + } +// }); +// }); + + + + } } else { parallelForOuter( diff --git a/components/omega/src/ocn/TendencyTerms.h b/components/omega/src/ocn/TendencyTerms.h index b443d4a935c5..1550d55f138e 100644 --- a/components/omega/src/ocn/TendencyTerms.h +++ b/components/omega/src/ocn/TendencyTerms.h @@ -482,7 +482,7 @@ class TracerHorzAdvOnCell { for (I4 K = KStart; K < KEnd; ++K) TracerCur(ICell, K) = TracerArray(L, ICell, K); } - KOKKOS_FUNCTION void FCTTracerMinMax(const I4 L, const I4 ICell, + KOKKOS_FUNCTION void FCTTracerMinMax(const I4 ICell, const I4 KChunk, const Array1DI4 MinLayerCell, const Array1DI4 MaxLayerCell) const { @@ -509,15 +509,12 @@ class TracerHorzAdvOnCell { } } } -//for (I4 K = KStart; K < KEnd; ++K) -//std::cout<<"TracerM "< Date: Sun, 21 Jun 2026 09:14:32 -0600 Subject: [PATCH 09/32] Update function signature --- components/omega/test/ocn/TendencyTermsTest.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/components/omega/test/ocn/TendencyTermsTest.cpp b/components/omega/test/ocn/TendencyTermsTest.cpp index fb2b178d634f..74793921e45e 100644 --- a/components/omega/test/ocn/TendencyTermsTest.cpp +++ b/components/omega/test/ocn/TendencyTermsTest.cpp @@ -884,7 +884,12 @@ int testTracerHorzAdvOnCell(int NVertLayers, int NTracers, Real RTol) { // Compute numerical result Array3DReal NumTrFluxDiv("NumTrFluxDiv", NTracers, Mesh->NCellsOwned, NVertLayers); - TracerHorzAdvOnCell TrHorzAdvOnC(Mesh, VCoord); + + VertAdv::init(); + const auto VAdv = VertAdv::getDefault(); + VertAdv::clear(); + + TracerHorzAdvOnCell TrHorzAdvOnC(Mesh, VCoord, VAdv); TrHorzAdvOnC.ForceLowOrder = true; TrHorzAdvOnC.init(); From 849e239ef7df06918a8549eba372ac5b4100e722 Mon Sep 17 00:00:00 2001 From: James Overfelt Date: Sun, 21 Jun 2026 13:25:53 -0500 Subject: [PATCH 10/32] Debug HighOrderFlx --- components/omega/src/ocn/Tendencies.cpp | 21 ++++++++++++-------- components/omega/src/ocn/TendencyTerms.cpp | 9 ++++++--- components/omega/src/ocn/TendencyTerms.h | 23 +++++++++++++--------- 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/components/omega/src/ocn/Tendencies.cpp b/components/omega/src/ocn/Tendencies.cpp index 38d69d5581df..e7c894f3d306 100644 --- a/components/omega/src/ocn/Tendencies.cpp +++ b/components/omega/src/ocn/Tendencies.cpp @@ -816,7 +816,7 @@ void Tendencies::computeTracerTendenciesOnly( // parallelForOuter( {Mesh->NEdgesAll}, // KOKKOS_LAMBDA(int IEdge, const TeamMember &Team) { - for (int IEdge=0; IEdge< Mesh->NEdgesAll; ++IEdge) { + for (int IEdge=0; IEdge< Mesh->NEdgesHalo(1); ++IEdge) { const int KMin = LocMinLayerEdgeBot(IEdge); const int KMax = LocMaxLayerEdgeTop(IEdge); const int KRange = vertRangeChunked(KMin, KMax); @@ -836,18 +836,23 @@ void Tendencies::computeTracerTendenciesOnly( } } else { - parallelForOuter( - {NTracers, Mesh->NEdgesAll}, - KOKKOS_LAMBDA(int L, int IEdge, const TeamMember &Team) { +// parallelForOuter( +// {NTracers, Mesh->NEdgesAll}, +// KOKKOS_LAMBDA(int L, int IEdge, const TeamMember &Team) { +for (int L=0; LNEdgesAll; ++IEdge) { const int KMin = LocMinLayerEdgeBot(IEdge); const int KMax = LocMaxLayerEdgeTop(IEdge); const int KRange = vertRangeChunked(KMin, KMax); - parallelForInner( - Team, KRange, INNER_LAMBDA(int KChunk) { +// parallelForInner( +// Team, KRange, INNER_LAMBDA(int KChunk) { +for (int KChunk=KMin; KChunk<=KMax; ++KChunk) { LocTracerHorzAdv(L, IEdge, KChunk, TracerArray, LocFluxPseudoThickEdge, LocNormalVelEdge); - }); - }); +// }); +} +// }); +}} parallelForOuter( {NTracers, Mesh->NCellsAll}, KOKKOS_LAMBDA(int L, int ICell, const TeamMember &Team) { diff --git a/components/omega/src/ocn/TendencyTerms.cpp b/components/omega/src/ocn/TendencyTerms.cpp index cab333525227..e711866d6c02 100644 --- a/components/omega/src/ocn/TendencyTerms.cpp +++ b/components/omega/src/ocn/TendencyTerms.cpp @@ -7,6 +7,8 @@ // defined in the corresponding header file. // //===----------------------------------------------------------------------===// +#include +#include #include "TendencyTerms.h" #include "DataTypes.h" @@ -73,8 +75,9 @@ BottomDragOnEdge::BottomDragOnEdge(const HorzMesh *Mesh, TracerHorzAdvOnCell::TracerHorzAdvOnCell(const HorzMesh *Mesh, const VertCoord *VCoord, const VertAdv *VAdv) - : HorzontalMesh(Mesh), VerticalCoord(VCoord), + : HorzontalMesh(Mesh), VerticalCoord(VCoord), NVertLayers(VCoord->NVertLayers), + NEdgesHalo(Mesh->NEdgesHalo(1)), NAdvCellsForEdge("NumberOfCellsContribToAdvectionAtEdge", Mesh->NEdgesAll), AdvCellsForEdge("IndexOfCellsContributingToAdvection", Mesh->NEdgesAll, @@ -172,8 +175,8 @@ void TracerHorzAdvOnCell::init() { TracerCur = Array2DReal("TracerCur", NCellsAll+1, NVertLayers), TracerMax = Array2DReal("FCTTracerMax", NCellsAll, NVertLayers); TracerMin = Array2DReal("FCTTracerMin", NCellsAll, NVertLayers); - HighOrderFlx = Array2DReal("FCTHighOrderFlx", NEdgesAll, NVertLayers); - LowOrderFlx = Array2DReal("FCTLowhOrderFlx", NEdgesAll, NVertLayers); + HighOrderFlx = Array2DReal("FCTHighOrderFlx", std::max(NEdgesAll,NCellsAll)+1, NVertLayers+1); + LowOrderFlx = Array2DReal("FCTLowOrderFlx", std::max(NEdgesAll,NCellsAll)+1, NVertLayers+1); if (ComputeBudgets) { const int NTracers = Tracers::getNumTracers(); ActiveTracerHorizontalAdvectionEdgeFlux = diff --git a/components/omega/src/ocn/TendencyTerms.h b/components/omega/src/ocn/TendencyTerms.h index 1550d55f138e..78c5943e696d 100644 --- a/components/omega/src/ocn/TendencyTerms.h +++ b/components/omega/src/ocn/TendencyTerms.h @@ -530,12 +530,12 @@ class TracerHorzAdvOnCell { // Compute 3rd or 4th fluxes where requested. for (int I = 0; I < NAdvCellsForEdge(IEdge); ++I) { const I4 ICell = AdvCellsForEdge(IEdge, I); - const Real Coef1 = AdvCoefs(IEdge, I); - const Real Coef3 = AdvCoefs3rd(IEdge, I) * Coef3rdOrder; + const Real Coef1 = AdvCoefs(I, IEdge); + const Real Coef3 = AdvCoefs3rd(I, IEdge) * Coef3rdOrder; const I4 KStartCell = MinLayerCell(ICell); const I4 KLenCell = MaxLayerCell(ICell); const I4 KEndCell = KStartCell + KLenCell; - for (I4 K = KStartCell; K < KEndCell; ++K) { + for (I4 K = KStartCell; K <= KEndCell; ++K) { const Real NormalThicknessFlux = FluxPseudoThickEdge(IEdge, K) * NormVelEdge(IEdge, K); HighOrderFlx(IEdge, K) += @@ -543,13 +543,15 @@ class TracerHorzAdvOnCell { AdvMaskHighOrder(IEdge, K) * (Coef1 + Coef3 * std::copysign(1.0_Real, NormalThicknessFlux)); +if (L==0 && IEdge==0 && K==0) +std::cout<<"HighOrderFlx "< Date: Mon, 22 Jun 2026 14:46:06 -0600 Subject: [PATCH 11/32] Fill out rest of function --- components/omega/src/ocn/Tendencies.cpp | 110 ++++++++++++++++++++- components/omega/src/ocn/TendencyTerms.cpp | 6 ++ components/omega/src/ocn/TendencyTerms.h | 101 ++++++++++--------- 3 files changed, 169 insertions(+), 48 deletions(-) diff --git a/components/omega/src/ocn/Tendencies.cpp b/components/omega/src/ocn/Tendencies.cpp index e7c894f3d306..edb17d75f26b 100644 --- a/components/omega/src/ocn/Tendencies.cpp +++ b/components/omega/src/ocn/Tendencies.cpp @@ -814,7 +814,7 @@ void Tendencies::computeTracerTendenciesOnly( // }); -// parallelForOuter( {Mesh->NEdgesAll}, +// parallelForOuter( {Mesh->NEdgesHalo(1)}, // KOKKOS_LAMBDA(int IEdge, const TeamMember &Team) { for (int IEdge=0; IEdge< Mesh->NEdgesHalo(1); ++IEdge) { const int KMin = LocMinLayerEdgeBot(IEdge); @@ -830,9 +830,117 @@ void Tendencies::computeTracerTendenciesOnly( } // }); // }); + + +// parallelForOuter( {Mesh->NCellsHalo(0)}, +// KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { + for (int ICell=0; ICell< Mesh->NCellsAll+1; ++ICell) { + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); + const int KRange = vertRangeChunked(KMin, KMax); +// parallelForInner( +// Team, KRange, INNER_LAMBDA(int KChunk) { + for (int KChunk=KMin; KChunk <= KMax; ++KChunk) { + LocTracerHorzAdv.FCTInitFluxInOut(L, ICell, KChunk); + } + } +// }); +// }); +// parallelForOuter( {Mesh->NCellsHalo(0)}, +// KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { + for (int ICell=0; ICell< Mesh->NCellsHalo(0); ++ICell) { + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); + const int KRange = vertRangeChunked(KMin, KMax); +// parallelForInner( +// Team, KRange, INNER_LAMBDA(int KChunk) { + for (int KChunk=KMin; KChunk <= KMax; ++KChunk) { + LocTracerHorzAdv.FCTFluxInOut(L, ICell, KChunk, Dt, LocPseudoThickCell); + } + } +// }); +// }); +// parallelForOuter( {Mesh->NEdgesHalo(1)}, +// KOKKOS_LAMBDA(int IEdge, const TeamMember &Team) { + for (int IEdge=0; IEdge< Mesh->NEdgesHalo(0); ++IEdge) { + const int KMin = LocMinLayerEdgeBot(IEdge); + const int KMax = LocMaxLayerEdgeTop(IEdge); + const int KRange = vertRangeChunked(KMin, KMax); +// parallelForInner( +// Team, KRange, INNER_LAMBDA(int KChunk) { + for (int KChunk=KMin; KChunk <= KMax; ++KChunk) { + LocTracerHorzAdv.FCTRescaleHighOrderFlux(L, IEdge); + } + } +// }); +// }); +// parallelForOuter( {Mesh->NCellsHalo(0)}, +// KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { + for (int ICell=0; ICell< Mesh->NCellsOwned; ++ICell) { + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); + const int KRange = vertRangeChunked(KMin, KMax); +// parallelForInner( +// Team, KRange, INNER_LAMBDA(int KChunk) { + for (int KChunk=KMin; KChunk <= KMax; ++KChunk) { + LocTracerHorzAdv.FCTAccumulateHighOrderFlux(L, ICell, KChunk, Dt, + TracerArray, LocPseudoThickCell); + } + } +// }); +// }); + + + if (LocTracerHorzAdv.ComputeBudgets) { +// parallelForOuter( {Mesh->NEdgesHalo(1)}, +// KOKKOS_LAMBDA(int IEdge, const TeamMember &Team) { + for (int IEdge=0; IEdge< Mesh->NEdgesHalo(1); ++IEdge) { + const int KMin = LocMinLayerEdgeBot(IEdge); + const int KMax = LocMaxLayerEdgeTop(IEdge); + const int KRange = vertRangeChunked(KMin, KMax); +// parallelForInner( +// Team, KRange, INNER_LAMBDA(int KChunk) { + for (int KChunk=KMin; KChunk <= KMax; ++KChunk) { + LocTracerHorzAdv.FCTComputeBudgetAdvectionEdgeFlux(L, IEdge, KChunk); + } + } +// }); +// }); + +// parallelForOuter( {Mesh->NCellsHalo(0)}, +// KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { + for (int ICell=0; ICell< Mesh->NCellsOwned; ++ICell) { + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); + const int KRange = vertRangeChunked(KMin, KMax); +// parallelForInner( +// Team, KRange, INNER_LAMBDA(int KChunk) { + for (int KChunk=KMin; KChunk <= KMax; ++KChunk) { + LocTracerHorzAdv.FCTComputeBudgetAdvectionTendency(L, ICell, KChunk); + } + } + } +// }); +// }); + if (LocTracerHorzAdv.MonotonicityCheck) { +// parallelForOuter( {Mesh->NCellsHalo(0)}, +// KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { + for (int ICell=0; ICell< Mesh->NCellsOwned; ++ICell) { + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); + const int KRange = vertRangeChunked(KMin, KMax); +// parallelForInner( +// Team, KRange, INNER_LAMBDA(int KChunk) { + for (int KChunk=KMin; KChunk <= KMax; ++KChunk) { + LocTracerHorzAdv.FCTMonotonicityCheck(L, ICell, KChunk, TracerArray); + } + } + } +// }); +// }); } } else { diff --git a/components/omega/src/ocn/TendencyTerms.cpp b/components/omega/src/ocn/TendencyTerms.cpp index e711866d6c02..4369c6ba409d 100644 --- a/components/omega/src/ocn/TendencyTerms.cpp +++ b/components/omega/src/ocn/TendencyTerms.cpp @@ -108,6 +108,9 @@ TracerHorzAdvOnCell::TracerHorzAdvOnCell(const HorzMesh *Mesh, LowOrderFlx(), MinLayerCell(VCoord->MinLayerCell), MaxLayerCell(VCoord->MaxLayerCell), + WorkTend(), + FlxIn(), + FlxOut(), ActiveTracerHorizontalAdvectionEdgeFlux(), ActiveTracerHorizontalAdvectionTendency() { deepCopy(HighOrderFlxHorz, 0); @@ -177,6 +180,9 @@ void TracerHorzAdvOnCell::init() { TracerMin = Array2DReal("FCTTracerMin", NCellsAll, NVertLayers); HighOrderFlx = Array2DReal("FCTHighOrderFlx", std::max(NEdgesAll,NCellsAll)+1, NVertLayers+1); LowOrderFlx = Array2DReal("FCTLowOrderFlx", std::max(NEdgesAll,NCellsAll)+1, NVertLayers+1); + WorkTend = Array2DReal("WorkTend", NCellsAll+1, NVertLayers); + FlxIn = Array2DReal("FlxIn", NCellsAll+1, NVertLayers); + FlxOut = Array2DReal("FlxOut", NCellsAll+1, NVertLayers); if (ComputeBudgets) { const int NTracers = Tracers::getNumTracers(); ActiveTracerHorizontalAdvectionEdgeFlux = diff --git a/components/omega/src/ocn/TendencyTerms.h b/components/omega/src/ocn/TendencyTerms.h index 78c5943e696d..aad5b3511fea 100644 --- a/components/omega/src/ocn/TendencyTerms.h +++ b/components/omega/src/ocn/TendencyTerms.h @@ -438,7 +438,7 @@ class TracerHorzAdvOnCell { KOKKOS_FUNCTION void FCTProvisionaLayerThicknesses( const I4 ICell, const I4 KChunk, const Real Dt, const Array2DReal &FluxPseudoThickEdge, - const Array2DReal &PseudoThickCell, + const Array2DReal &LayerThickness, const Array2DReal &NormVelEdge) const { @@ -447,7 +447,7 @@ class TracerHorzAdvOnCell { const Real InvAreaCell = Dt / AreaCell(ICell); for (I4 K = KStart; K < KEnd; ++K) { - HProv(ICell, K) = PseudoThickCell(ICell, K); + HProv(ICell, K) = LayerThickness(ICell, K); } for (I4 I = 0; I < NEdgesOnCell(ICell); ++I) { const I4 IEdge = EdgesOnCell(ICell, I); @@ -518,7 +518,7 @@ class TracerHorzAdvOnCell { const Real Coef3rdOrder = 0.25; const I4 ICell1 = CellsOnEdge(IEdge, 0); - const I4 ICell2 = CellsOnEdge(IEdge, 0); + const I4 ICell2 = CellsOnEdge(IEdge, 1); const I4 KStart = KChunk * VecLength; const I4 KEnd = KStart + VecLength; @@ -574,10 +574,7 @@ for (I4 K = KStart; K < KEnd; ++K) std::cout<<"HighOrderFlx "< TracerMax(ICell,K)+Eps) { + if (TracerArray(L,ICell,K) > TracerMax(ICell,K)+Eps) { printf("Horizontal maximum out of bounds on tracer: %i %lg %lg\n", - L, TracerMax(ICell, K), TracerCell(L,ICell,K)); + L, TracerMax(ICell, K), TracerArray(L,ICell,K)); } } } @@ -746,6 +750,9 @@ std::cout<<"HighOrderFlx "< Date: Wed, 24 Jun 2026 15:15:22 -0700 Subject: [PATCH 12/32] Seems to be working but need to clean up the code. --- components/omega/src/ocn/Tendencies.cpp | 17 +++++++++----- components/omega/src/ocn/TendencyTerms.h | 28 ++++++++++-------------- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/components/omega/src/ocn/Tendencies.cpp b/components/omega/src/ocn/Tendencies.cpp index edb17d75f26b..c928fdbb6ffd 100644 --- a/components/omega/src/ocn/Tendencies.cpp +++ b/components/omega/src/ocn/Tendencies.cpp @@ -231,8 +231,7 @@ void Tendencies::readConfig(Config *OmegaConfig ///< [in] Omega config CHECK_ERROR_ABORT( Err, "Tendencies: HorzTracerFluxLimiterEnable not found in AdvectConfig"); - std::cout<<__FILE__<<":"<<__LINE__<<" Set TracerHorzAdv.FCT to true"<TracerDiffusion.Enabled); @@ -760,7 +759,6 @@ void Tendencies::computeTracerTendenciesOnly( Team, Range{KMin, KMax}, INNER_LAMBDA(int K) { LocTracerTend(L, ICell, K) = 0; }); }); - // compute tracer horizotal advection R8 Dt = 0; TimeStep.get(Dt, TimeUnits::Seconds); @@ -782,6 +780,7 @@ void Tendencies::computeTracerTendenciesOnly( } // }); // }); + Kokkos::fence(); for (int L=0; L< NTracers; ++L) { // parallelForOuter( {Mesh->NCellsAll}, // KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { @@ -797,6 +796,7 @@ void Tendencies::computeTracerTendenciesOnly( } // }); // }); + Kokkos::fence(); // parallelForOuter( {Mesh->NCellsAll}, // KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { for (int ICell=0; ICell< Mesh->NCellsAll; ++ICell) { @@ -812,6 +812,7 @@ void Tendencies::computeTracerTendenciesOnly( } // }); // }); + Kokkos::fence(); // parallelForOuter( {Mesh->NEdgesHalo(1)}, @@ -830,6 +831,7 @@ void Tendencies::computeTracerTendenciesOnly( } // }); // }); + Kokkos::fence(); // parallelForOuter( {Mesh->NCellsHalo(0)}, @@ -846,6 +848,7 @@ void Tendencies::computeTracerTendenciesOnly( } // }); // }); + Kokkos::fence(); // parallelForOuter( {Mesh->NCellsHalo(0)}, // KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { @@ -861,6 +864,7 @@ void Tendencies::computeTracerTendenciesOnly( } // }); // }); + Kokkos::fence(); // parallelForOuter( {Mesh->NEdgesHalo(1)}, // KOKKOS_LAMBDA(int IEdge, const TeamMember &Team) { @@ -871,11 +875,12 @@ void Tendencies::computeTracerTendenciesOnly( // parallelForInner( // Team, KRange, INNER_LAMBDA(int KChunk) { for (int KChunk=KMin; KChunk <= KMax; ++KChunk) { - LocTracerHorzAdv.FCTRescaleHighOrderFlux(L, IEdge); + LocTracerHorzAdv.FCTRescaleHighOrderFlux(L, IEdge, KChunk); } } // }); // }); + Kokkos::fence(); // parallelForOuter( {Mesh->NCellsHalo(0)}, // KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { @@ -887,11 +892,12 @@ void Tendencies::computeTracerTendenciesOnly( // Team, KRange, INNER_LAMBDA(int KChunk) { for (int KChunk=KMin; KChunk <= KMax; ++KChunk) { LocTracerHorzAdv.FCTAccumulateHighOrderFlux(L, ICell, KChunk, Dt, - TracerArray, LocPseudoThickCell); + LocTracerTend, LocPseudoThickCell); } } // }); // }); + Kokkos::fence(); if (LocTracerHorzAdv.ComputeBudgets) { @@ -941,6 +947,7 @@ void Tendencies::computeTracerTendenciesOnly( } // }); // }); + Kokkos::fence(); } } else { diff --git a/components/omega/src/ocn/TendencyTerms.h b/components/omega/src/ocn/TendencyTerms.h index aad5b3511fea..c1f73041e608 100644 --- a/components/omega/src/ocn/TendencyTerms.h +++ b/components/omega/src/ocn/TendencyTerms.h @@ -459,8 +459,6 @@ class TracerHorzAdvOnCell { const Real NormalThicknessFlux = FluxPseudoThickEdge(IEdge, K) * NormVelEdge(IEdge, K); HProv(ICell, K) += SignedFactor * NormalThicknessFlux; -//std::cout<<"HProv "< Date: Thu, 25 Jun 2026 08:35:59 -0600 Subject: [PATCH 13/32] Code cleanup. --- components/omega/src/ocn/Tendencies.cpp | 341 +++++++++-------------- components/omega/src/ocn/TendencyTerms.h | 14 +- 2 files changed, 139 insertions(+), 216 deletions(-) diff --git a/components/omega/src/ocn/Tendencies.cpp b/components/omega/src/ocn/Tendencies.cpp index c928fdbb6ffd..daee63f6859b 100644 --- a/components/omega/src/ocn/Tendencies.cpp +++ b/components/omega/src/ocn/Tendencies.cpp @@ -765,220 +765,145 @@ void Tendencies::computeTracerTendenciesOnly( if (LocTracerHorzAdv.Enabled) { Pacer::start("Tend:tracerHorzAdv", 2); if (LocTracerHorzAdv.FCT) { -// parallelForOuter( {Mesh->NCellsAll}, -// KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { - for (int ICell=0; ICell< Mesh->NCellsAll; ++ICell) { - const int KMin = LocMinLayerCell(ICell); - const int KMax = LocMaxLayerCell(ICell); - const int KRange = vertRangeChunked(KMin, KMax); -// parallelForInner( -// Team, KRange, INNER_LAMBDA(int KChunk) { - for (int KChunk=KMin; KChunk <= KMax; ++KChunk) { - LocTracerHorzAdv.FCTProvisionaLayerThicknesses(ICell, KChunk, Dt, - LocFluxPseudoThickEdge, LocPseudoThickCell, LocNormalVelEdge); - } - } -// }); -// }); - Kokkos::fence(); - for (int L=0; L< NTracers; ++L) { -// parallelForOuter( {Mesh->NCellsAll}, -// KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { - for (int ICell=0; ICell< Mesh->NCellsAll; ++ICell) { - const int KMin = LocMinLayerCell(ICell); - const int KMax = LocMaxLayerCell(ICell); - const int KRange = vertRangeChunked(KMin, KMax); -// parallelForInner( -// Team, KRange, INNER_LAMBDA(int KChunk) { - for (int KChunk=KMin; KChunk <= KMax; ++KChunk) { - LocTracerHorzAdv.FCTTracerCurFill(L, ICell, KChunk, TracerArray); - } - } -// }); -// }); - Kokkos::fence(); -// parallelForOuter( {Mesh->NCellsAll}, -// KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { - for (int ICell=0; ICell< Mesh->NCellsAll; ++ICell) { - const int KMin = LocMinLayerCell(ICell); - const int KMax = LocMaxLayerCell(ICell); - const int KRange = vertRangeChunked(KMin, KMax); -// parallelForInner( -// Team, KRange, INNER_LAMBDA(int KChunk) { - for (int KChunk=KMin; KChunk <= KMax; ++KChunk) { - LocTracerHorzAdv.FCTTracerMinMax(ICell, KChunk, - LocMinLayerCell, LocMaxLayerCell); - } - } -// }); -// }); - Kokkos::fence(); - - -// parallelForOuter( {Mesh->NEdgesHalo(1)}, -// KOKKOS_LAMBDA(int IEdge, const TeamMember &Team) { - for (int IEdge=0; IEdge< Mesh->NEdgesHalo(1); ++IEdge) { - const int KMin = LocMinLayerEdgeBot(IEdge); - const int KMax = LocMaxLayerEdgeTop(IEdge); - const int KRange = vertRangeChunked(KMin, KMax); -// parallelForInner( -// Team, KRange, INNER_LAMBDA(int KChunk) { - for (int KChunk=KMin; KChunk <= KMax; ++KChunk) { - LocTracerHorzAdv.FCTHighAndLowOrderFlux(L, IEdge, KChunk, + parallelForOuter( {Mesh->NCellsAll}, + KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); + const int KRange = vertRangeChunked(KMin, KMax); + parallelForInner( + Team, KRange, INNER_LAMBDA(int KChunk) { + LocTracerHorzAdv.FCTProvisionaLayerThicknesses(ICell, KChunk, Dt, + LocFluxPseudoThickEdge, LocPseudoThickCell, LocNormalVelEdge); + }); + }); + Kokkos::fence(); + for (int L=0; L< NTracers; ++L) { + parallelForOuter( {Mesh->NCellsAll}, + KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); + const int KRange = vertRangeChunked(KMin, KMax); + parallelForInner(Team, KRange, INNER_LAMBDA(int KChunk) { + LocTracerHorzAdv.FCTTracerCurFill(L, ICell, KChunk, TracerArray); + }); + }); + Kokkos::fence(); + parallelForOuter( {Mesh->NCellsAll}, + KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); + const int KRange = vertRangeChunked(KMin, KMax); + parallelForInner(Team, KRange, INNER_LAMBDA(int KChunk) { + LocTracerHorzAdv.FCTTracerMinMax(ICell, KChunk, + LocMinLayerCell, LocMaxLayerCell); + }); + }); + Kokkos::fence(); + parallelForOuter( {Mesh->NEdgesHalo(1)}, + KOKKOS_LAMBDA(int IEdge, const TeamMember &Team) { + const int KMin = LocMinLayerEdgeBot(IEdge); + const int KMax = LocMaxLayerEdgeTop(IEdge); + const int KRange = vertRangeChunked(KMin, KMax); + parallelForInner(Team, KRange, INNER_LAMBDA(int KChunk) { + LocTracerHorzAdv.FCTHighAndLowOrderFlux(IEdge, KChunk, LocMinLayerCell, LocMaxLayerCell, LocFluxPseudoThickEdge, LocNormalVelEdge); - } - } -// }); -// }); - Kokkos::fence(); - - -// parallelForOuter( {Mesh->NCellsHalo(0)}, -// KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { - for (int ICell=0; ICell< Mesh->NCellsAll+1; ++ICell) { - const int KMin = LocMinLayerCell(ICell); - const int KMax = LocMaxLayerCell(ICell); - const int KRange = vertRangeChunked(KMin, KMax); -// parallelForInner( -// Team, KRange, INNER_LAMBDA(int KChunk) { - for (int KChunk=KMin; KChunk <= KMax; ++KChunk) { - LocTracerHorzAdv.FCTInitFluxInOut(L, ICell, KChunk); - } - } -// }); -// }); - Kokkos::fence(); - -// parallelForOuter( {Mesh->NCellsHalo(0)}, -// KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { - for (int ICell=0; ICell< Mesh->NCellsHalo(0); ++ICell) { - const int KMin = LocMinLayerCell(ICell); - const int KMax = LocMaxLayerCell(ICell); - const int KRange = vertRangeChunked(KMin, KMax); -// parallelForInner( -// Team, KRange, INNER_LAMBDA(int KChunk) { - for (int KChunk=KMin; KChunk <= KMax; ++KChunk) { - LocTracerHorzAdv.FCTFluxInOut(L, ICell, KChunk, Dt, LocPseudoThickCell); - } - } -// }); -// }); - Kokkos::fence(); - -// parallelForOuter( {Mesh->NEdgesHalo(1)}, -// KOKKOS_LAMBDA(int IEdge, const TeamMember &Team) { - for (int IEdge=0; IEdge< Mesh->NEdgesHalo(0); ++IEdge) { - const int KMin = LocMinLayerEdgeBot(IEdge); - const int KMax = LocMaxLayerEdgeTop(IEdge); - const int KRange = vertRangeChunked(KMin, KMax); -// parallelForInner( -// Team, KRange, INNER_LAMBDA(int KChunk) { - for (int KChunk=KMin; KChunk <= KMax; ++KChunk) { - LocTracerHorzAdv.FCTRescaleHighOrderFlux(L, IEdge, KChunk); - } - } -// }); -// }); - Kokkos::fence(); - -// parallelForOuter( {Mesh->NCellsHalo(0)}, -// KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { - for (int ICell=0; ICell< Mesh->NCellsOwned; ++ICell) { - const int KMin = LocMinLayerCell(ICell); - const int KMax = LocMaxLayerCell(ICell); - const int KRange = vertRangeChunked(KMin, KMax); -// parallelForInner( -// Team, KRange, INNER_LAMBDA(int KChunk) { - for (int KChunk=KMin; KChunk <= KMax; ++KChunk) { - LocTracerHorzAdv.FCTAccumulateHighOrderFlux(L, ICell, KChunk, Dt, - LocTracerTend, LocPseudoThickCell); - } - } -// }); -// }); - Kokkos::fence(); - - - if (LocTracerHorzAdv.ComputeBudgets) { -// parallelForOuter( {Mesh->NEdgesHalo(1)}, -// KOKKOS_LAMBDA(int IEdge, const TeamMember &Team) { - for (int IEdge=0; IEdge< Mesh->NEdgesHalo(1); ++IEdge) { - const int KMin = LocMinLayerEdgeBot(IEdge); - const int KMax = LocMaxLayerEdgeTop(IEdge); - const int KRange = vertRangeChunked(KMin, KMax); -// parallelForInner( -// Team, KRange, INNER_LAMBDA(int KChunk) { - for (int KChunk=KMin; KChunk <= KMax; ++KChunk) { - LocTracerHorzAdv.FCTComputeBudgetAdvectionEdgeFlux(L, IEdge, KChunk); - } - } -// }); -// }); - -// parallelForOuter( {Mesh->NCellsHalo(0)}, -// KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { - for (int ICell=0; ICell< Mesh->NCellsOwned; ++ICell) { - const int KMin = LocMinLayerCell(ICell); - const int KMax = LocMaxLayerCell(ICell); - const int KRange = vertRangeChunked(KMin, KMax); -// parallelForInner( -// Team, KRange, INNER_LAMBDA(int KChunk) { - for (int KChunk=KMin; KChunk <= KMax; ++KChunk) { - LocTracerHorzAdv.FCTComputeBudgetAdvectionTendency(L, ICell, KChunk); - } + }); + }); + Kokkos::fence(); + parallelForOuter( {Mesh->NCellsAll+1}, + KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); + const int KRange = vertRangeChunked(KMin, KMax); + parallelForInner(Team, KRange, INNER_LAMBDA(int KChunk) { + LocTracerHorzAdv.FCTInitFluxInOut(ICell, KChunk); + }); + }); + Kokkos::fence(); + parallelForOuter( {Mesh->NCellsHalo(0)}, + KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); + const int KRange = vertRangeChunked(KMin, KMax); + parallelForInner(Team, KRange, INNER_LAMBDA(int KChunk) { + LocTracerHorzAdv.FCTFluxInOut(ICell, KChunk, Dt, LocPseudoThickCell); + }); + }); + Kokkos::fence(); + parallelForOuter( {Mesh->NEdgesHalo(0)}, + KOKKOS_LAMBDA(int IEdge, const TeamMember &Team) { + const int KMin = LocMinLayerEdgeBot(IEdge); + const int KMax = LocMaxLayerEdgeTop(IEdge); + const int KRange = vertRangeChunked(KMin, KMax); + parallelForInner(Team, KRange, INNER_LAMBDA(int KChunk) { + LocTracerHorzAdv.FCTRescaleHighOrderFlux(IEdge, KChunk); + }); + }); + Kokkos::fence(); + parallelForOuter( {Mesh->NCellsOwned}, + KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); + const int KRange = vertRangeChunked(KMin, KMax); + parallelForInner(Team, KRange, INNER_LAMBDA(int KChunk) { + LocTracerHorzAdv.FCTAccumulateHighOrderFlux(L, ICell, KChunk, Dt, + LocTracerTend, LocPseudoThickCell); + }); + }); + Kokkos::fence(); + if (LocTracerHorzAdv.ComputeBudgets) { + parallelForOuter( {Mesh->NEdgesHalo(1)}, + KOKKOS_LAMBDA(int IEdge, const TeamMember &Team) { + const int KMin = LocMinLayerEdgeBot(IEdge); + const int KMax = LocMaxLayerEdgeTop(IEdge); + const int KRange = vertRangeChunked(KMin, KMax); + parallelForInner(Team, KRange, INNER_LAMBDA(int KChunk) { + LocTracerHorzAdv.FCTComputeBudgetAdvectionEdgeFlux(L, IEdge, KChunk); + }); + }); + parallelForOuter( {Mesh->NCellsOwned}, + KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); + const int KRange = vertRangeChunked(KMin, KMax); + parallelForInner(Team, KRange, INNER_LAMBDA(int KChunk) { + LocTracerHorzAdv.FCTComputeBudgetAdvectionTendency(L, ICell, KChunk); + }); + }); } - } -// }); -// }); - if (LocTracerHorzAdv.MonotonicityCheck) { -// parallelForOuter( {Mesh->NCellsHalo(0)}, -// KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { - for (int ICell=0; ICell< Mesh->NCellsOwned; ++ICell) { - const int KMin = LocMinLayerCell(ICell); - const int KMax = LocMaxLayerCell(ICell); - const int KRange = vertRangeChunked(KMin, KMax); -// parallelForInner( -// Team, KRange, INNER_LAMBDA(int KChunk) { - for (int KChunk=KMin; KChunk <= KMax; ++KChunk) { - LocTracerHorzAdv.FCTMonotonicityCheck(L, ICell, KChunk, TracerArray); - } + if (LocTracerHorzAdv.MonotonicityCheck) { + parallelForOuter( {Mesh->NCellsOwned}, + KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); + const int KRange = vertRangeChunked(KMin, KMax); + parallelForInner(Team, KRange, INNER_LAMBDA(int KChunk) { + LocTracerHorzAdv.FCTMonotonicityCheck(L, ICell, KChunk, TracerArray); + }); + }); } - } -// }); -// }); - Kokkos::fence(); - - } + } } else { -// parallelForOuter( -// {NTracers, Mesh->NEdgesAll}, -// KOKKOS_LAMBDA(int L, int IEdge, const TeamMember &Team) { -for (int L=0; LNEdgesAll; ++IEdge) { - const int KMin = LocMinLayerEdgeBot(IEdge); - const int KMax = LocMaxLayerEdgeTop(IEdge); - const int KRange = vertRangeChunked(KMin, KMax); -// parallelForInner( -// Team, KRange, INNER_LAMBDA(int KChunk) { -for (int KChunk=KMin; KChunk<=KMax; ++KChunk) { - LocTracerHorzAdv(L, IEdge, KChunk, TracerArray, + parallelForOuter( {NTracers, Mesh->NEdgesAll}, + KOKKOS_LAMBDA(int L, int IEdge, const TeamMember &Team) { + const int KMin = LocMinLayerEdgeBot(IEdge); + const int KMax = LocMaxLayerEdgeTop(IEdge); + const int KRange = vertRangeChunked(KMin, KMax); + parallelForInner(Team, KRange, INNER_LAMBDA(int KChunk) { + LocTracerHorzAdv(L, IEdge, KChunk, TracerArray, LocFluxPseudoThickEdge, LocNormalVelEdge); -// }); -} -// }); -}} - parallelForOuter( - {NTracers, Mesh->NCellsAll}, - KOKKOS_LAMBDA(int L, int ICell, const TeamMember &Team) { - const int KMin = LocMinLayerCell(ICell); - const int KMax = LocMaxLayerCell(ICell); - const int KRange = vertRangeChunked(KMin, KMax); - parallelForInner( - Team, KRange, INNER_LAMBDA(int KChunk) { - LocTracerHorzAdv(LocTracerTend, L, ICell, KChunk); - }); - }); + }); + }); + parallelForOuter({NTracers, Mesh->NCellsAll}, + KOKKOS_LAMBDA(int L, int ICell, const TeamMember &Team) { + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); + const int KRange = vertRangeChunked(KMin, KMax); + parallelForInner(Team, KRange, INNER_LAMBDA(int KChunk) { + LocTracerHorzAdv(LocTracerTend, L, ICell, KChunk); + }); + }); } Pacer::stop("Tend:tracerHorzAdv", 2); } diff --git a/components/omega/src/ocn/TendencyTerms.h b/components/omega/src/ocn/TendencyTerms.h index c1f73041e608..7181bb6e402a 100644 --- a/components/omega/src/ocn/TendencyTerms.h +++ b/components/omega/src/ocn/TendencyTerms.h @@ -510,7 +510,7 @@ class TracerHorzAdvOnCell { } KOKKOS_FUNCTION void FCTHighAndLowOrderFlux( - const I4 L, const I4 IEdge, const I4 KChunk, + const I4 IEdge, const I4 KChunk, const Array1DI4 &MinLayerCell, const Array1DI4 &MaxLayerCell, const Array2DReal &FluxPseudoThickEdge, const Array2DReal &NormVelEdge) const { const Real Coef3rdOrder = 0.25; @@ -562,11 +562,9 @@ class TracerHorzAdvOnCell { TracerCur(ICell2, K)); HighOrderFlx(IEdge, K) -= LowOrderFlx(IEdge, K); } -//int K=0; if (L==0 && IEdge==0 && K==0) -//std::cout<<"HighOrderFlx "<<__LINE__<<" "< Date: Thu, 25 Jun 2026 09:51:33 -0700 Subject: [PATCH 14/32] GPU fixes. --- components/omega/src/ocn/Tendencies.cpp | 8 ++++---- components/omega/src/ocn/TendencyTerms.cpp | 1 - components/omega/src/ocn/TendencyTerms.h | 1 - 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/components/omega/src/ocn/Tendencies.cpp b/components/omega/src/ocn/Tendencies.cpp index daee63f6859b..08d65fb38b6a 100644 --- a/components/omega/src/ocn/Tendencies.cpp +++ b/components/omega/src/ocn/Tendencies.cpp @@ -799,7 +799,7 @@ void Tendencies::computeTracerTendenciesOnly( }); }); Kokkos::fence(); - parallelForOuter( {Mesh->NEdgesHalo(1)}, + parallelForOuter( {Mesh->NEdgesHaloH(1)}, KOKKOS_LAMBDA(int IEdge, const TeamMember &Team) { const int KMin = LocMinLayerEdgeBot(IEdge); const int KMax = LocMaxLayerEdgeTop(IEdge); @@ -821,7 +821,7 @@ void Tendencies::computeTracerTendenciesOnly( }); }); Kokkos::fence(); - parallelForOuter( {Mesh->NCellsHalo(0)}, + parallelForOuter( {Mesh->NCellsHaloH(0)}, KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { const int KMin = LocMinLayerCell(ICell); const int KMax = LocMaxLayerCell(ICell); @@ -831,7 +831,7 @@ void Tendencies::computeTracerTendenciesOnly( }); }); Kokkos::fence(); - parallelForOuter( {Mesh->NEdgesHalo(0)}, + parallelForOuter( {Mesh->NEdgesHaloH(0)}, KOKKOS_LAMBDA(int IEdge, const TeamMember &Team) { const int KMin = LocMinLayerEdgeBot(IEdge); const int KMax = LocMaxLayerEdgeTop(IEdge); @@ -853,7 +853,7 @@ void Tendencies::computeTracerTendenciesOnly( }); Kokkos::fence(); if (LocTracerHorzAdv.ComputeBudgets) { - parallelForOuter( {Mesh->NEdgesHalo(1)}, + parallelForOuter( {Mesh->NEdgesHaloH(1)}, KOKKOS_LAMBDA(int IEdge, const TeamMember &Team) { const int KMin = LocMinLayerEdgeBot(IEdge); const int KMax = LocMaxLayerEdgeTop(IEdge); diff --git a/components/omega/src/ocn/TendencyTerms.cpp b/components/omega/src/ocn/TendencyTerms.cpp index 4369c6ba409d..3b8a2d2bb27d 100644 --- a/components/omega/src/ocn/TendencyTerms.cpp +++ b/components/omega/src/ocn/TendencyTerms.cpp @@ -77,7 +77,6 @@ TracerHorzAdvOnCell::TracerHorzAdvOnCell(const HorzMesh *Mesh, const VertAdv *VAdv) : HorzontalMesh(Mesh), VerticalCoord(VCoord), NVertLayers(VCoord->NVertLayers), - NEdgesHalo(Mesh->NEdgesHalo(1)), NAdvCellsForEdge("NumberOfCellsContribToAdvectionAtEdge", Mesh->NEdgesAll), AdvCellsForEdge("IndexOfCellsContributingToAdvection", Mesh->NEdgesAll, diff --git a/components/omega/src/ocn/TendencyTerms.h b/components/omega/src/ocn/TendencyTerms.h index 7181bb6e402a..14b5d1c0f95a 100644 --- a/components/omega/src/ocn/TendencyTerms.h +++ b/components/omega/src/ocn/TendencyTerms.h @@ -713,7 +713,6 @@ class TracerHorzAdvOnCell { const HorzMesh *HorzontalMesh; const VertCoord *VerticalCoord; const I4 NVertLayers; - const I4 NEdgesHalo; Array1DI4 NAdvCellsForEdge; Array2DI4 AdvCellsForEdge; From eb02174f5994702f4bf1f026e278c7895748dd08 Mon Sep 17 00:00:00 2001 From: James Overfelt Date: Thu, 25 Jun 2026 10:53:06 -0600 Subject: [PATCH 15/32] Remove debug printout --- components/omega/src/ocn/Tendencies.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/components/omega/src/ocn/Tendencies.cpp b/components/omega/src/ocn/Tendencies.cpp index 08d65fb38b6a..e1664e992e75 100644 --- a/components/omega/src/ocn/Tendencies.cpp +++ b/components/omega/src/ocn/Tendencies.cpp @@ -231,7 +231,6 @@ void Tendencies::readConfig(Config *OmegaConfig ///< [in] Omega config CHECK_ERROR_ABORT( Err, "Tendencies: HorzTracerFluxLimiterEnable not found in AdvectConfig"); - std::cout<<__FILE__<<":"<<__LINE__<<" Set TracerHorzAdv.FCT to "<TracerDiffusion.Enabled); From ab60f8a5dab34429040505815d36e2ab8bcf8239 Mon Sep 17 00:00:00 2001 From: James Overfelt Date: Thu, 25 Jun 2026 13:04:58 -0600 Subject: [PATCH 16/32] Add FCT checks. --- components/omega/src/ocn/Tendencies.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/components/omega/src/ocn/Tendencies.cpp b/components/omega/src/ocn/Tendencies.cpp index e1664e992e75..99302c202f0b 100644 --- a/components/omega/src/ocn/Tendencies.cpp +++ b/components/omega/src/ocn/Tendencies.cpp @@ -229,8 +229,15 @@ void Tendencies::readConfig(Config *OmegaConfig ///< [in] Omega config } Err += AdvectConfig.get("HorzTracerFluxLimiterEnable", TracerHorzAdv.FCT); CHECK_ERROR_ABORT( - Err, - "Tendencies: HorzTracerFluxLimiterEnable not found in AdvectConfig"); + Err, "Tendencies: HorzTracerFluxLimiterEnable not found in AdvectConfig"); + if (TracerHorzAdv.FCT) { + Err += AdvectConfig.get("HorzTracerFluxLimiterBudgetsEnable", TracerHorzAdv.ComputeBudgets); + CHECK_ERROR_ABORT( + Err, "Tendencies: HorzTracerFluxLimiterBudgetsEnable not found in AdvectConfig"); + Err += AdvectConfig.get("HorzTracerFluxLimiterMonotonicityCheckEnable", TracerHorzAdv.MonotonicityCheck); + CHECK_ERROR_ABORT( + Err, "Tendencies: HorzTracerFluxLimiterMonotonicityCheckEnable not found in AdvectConfig"); + } } Err += TendConfig.get("TracerDiffTendencyEnable", this->TracerDiffusion.Enabled); From 98f84e2a40d760ac60b6cb17a348f3403beb6a0e Mon Sep 17 00:00:00 2001 From: James Overfelt Date: Fri, 26 Jun 2026 05:05:28 -0700 Subject: [PATCH 17/32] Fix size of array --- components/omega/src/ocn/TendencyTerms.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/components/omega/src/ocn/TendencyTerms.cpp b/components/omega/src/ocn/TendencyTerms.cpp index 3b8a2d2bb27d..9931cae482da 100644 --- a/components/omega/src/ocn/TendencyTerms.cpp +++ b/components/omega/src/ocn/TendencyTerms.cpp @@ -183,9 +183,10 @@ void TracerHorzAdvOnCell::init() { FlxIn = Array2DReal("FlxIn", NCellsAll+1, NVertLayers); FlxOut = Array2DReal("FlxOut", NCellsAll+1, NVertLayers); if (ComputeBudgets) { - const int NTracers = Tracers::getNumTracers(); + const int NTracers = Tracers::getNumTracers(); + const int NEdges = Mesh->NEdgesHaloH(1); ActiveTracerHorizontalAdvectionEdgeFlux = - Array3DReal("FCTActiveTracerHorizontalAdvectionEdgeFlux", NTracers, NCellsAll, NVertLayers); + Array3DReal("FCTActiveTracerHorizontalAdvectionEdgeFlux", NTracers, NEdges, NVertLayers); ActiveTracerHorizontalAdvectionTendency = Array3DReal("FCTActiveTracerHorizontalAdvectionTendency", NTracers, NCellsAll, NVertLayers); } From e2f114325160850aa580f27a9e36ac84eb2f4e76 Mon Sep 17 00:00:00 2001 From: James Overfelt Date: Fri, 26 Jun 2026 12:32:33 -0600 Subject: [PATCH 18/32] Clang format --- components/omega/src/ocn/Tendencies.cpp | 312 ++++++++++++--------- components/omega/src/ocn/TendencyTerms.cpp | 70 +++-- components/omega/src/ocn/TendencyTerms.h | 165 ++++++----- 3 files changed, 297 insertions(+), 250 deletions(-) diff --git a/components/omega/src/ocn/Tendencies.cpp b/components/omega/src/ocn/Tendencies.cpp index 99302c202f0b..c5a20c9222de 100644 --- a/components/omega/src/ocn/Tendencies.cpp +++ b/components/omega/src/ocn/Tendencies.cpp @@ -9,7 +9,6 @@ //===----------------------------------------------------------------------===// #include -#include "Tendencies.h" #include "CustomTendencyTerms.h" #include "Eos.h" #include "Error.h" @@ -18,6 +17,7 @@ #include "OceanState.h" #include "PGrad.h" #include "Pacer.h" +#include "Tendencies.h" #include "TimeStepper.h" #include "Tracers.h" #include "VertAdv.h" @@ -229,14 +229,19 @@ void Tendencies::readConfig(Config *OmegaConfig ///< [in] Omega config } Err += AdvectConfig.get("HorzTracerFluxLimiterEnable", TracerHorzAdv.FCT); CHECK_ERROR_ABORT( - Err, "Tendencies: HorzTracerFluxLimiterEnable not found in AdvectConfig"); + Err, + "Tendencies: HorzTracerFluxLimiterEnable not found in AdvectConfig"); if (TracerHorzAdv.FCT) { - Err += AdvectConfig.get("HorzTracerFluxLimiterBudgetsEnable", TracerHorzAdv.ComputeBudgets); - CHECK_ERROR_ABORT( - Err, "Tendencies: HorzTracerFluxLimiterBudgetsEnable not found in AdvectConfig"); - Err += AdvectConfig.get("HorzTracerFluxLimiterMonotonicityCheckEnable", TracerHorzAdv.MonotonicityCheck); - CHECK_ERROR_ABORT( - Err, "Tendencies: HorzTracerFluxLimiterMonotonicityCheckEnable not found in AdvectConfig"); + Err += AdvectConfig.get("HorzTracerFluxLimiterBudgetsEnable", + TracerHorzAdv.ComputeBudgets); + CHECK_ERROR_ABORT(Err, + "Tendencies: HorzTracerFluxLimiterBudgetsEnable not " + "found in AdvectConfig"); + Err += AdvectConfig.get("HorzTracerFluxLimiterMonotonicityCheckEnable", + TracerHorzAdv.MonotonicityCheck); + CHECK_ERROR_ABORT( + Err, "Tendencies: HorzTracerFluxLimiterMonotonicityCheckEnable " + "not found in AdvectConfig"); } } Err += TendConfig.get("TracerDiffTendencyEnable", @@ -746,12 +751,13 @@ void Tendencies::computeTracerTendenciesOnly( OMEGA_SCOPE(LocMinLayerEdgeBot, VCoord->MinLayerEdgeBot); OMEGA_SCOPE(LocMaxLayerEdgeTop, VCoord->MaxLayerEdgeTop); - Array2DReal NormalVelEdge = State->getNormalVelocity(VelTimeLevel); + Array2DReal NormalVelEdge = State->getNormalVelocity(VelTimeLevel); Array2DReal PseudoThickCell = State->getPseudoThickness(ThickTimeLevel); - Array2DReal FluxPseudoThickEdge = AuxState->PseudoThicknessAux.FluxPseudoThickEdge; + Array2DReal FluxPseudoThickEdge = + AuxState->PseudoThicknessAux.FluxPseudoThickEdge; OMEGA_SCOPE(LocPseudoThickCell, PseudoThickCell); - OMEGA_SCOPE(LocNormalVelEdge, NormalVelEdge); + OMEGA_SCOPE(LocNormalVelEdge, NormalVelEdge); OMEGA_SCOPE(LocFluxPseudoThickEdge, FluxPseudoThickEdge); Pacer::start("Tend:computeTracerTendenciesOnly", 1); @@ -771,145 +777,179 @@ void Tendencies::computeTracerTendenciesOnly( if (LocTracerHorzAdv.Enabled) { Pacer::start("Tend:tracerHorzAdv", 2); if (LocTracerHorzAdv.FCT) { - parallelForOuter( {Mesh->NCellsAll}, + parallelForOuter( + {Mesh->NCellsAll}, KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { - const int KMin = LocMinLayerCell(ICell); - const int KMax = LocMaxLayerCell(ICell); - const int KRange = vertRangeChunked(KMin, KMax); - parallelForInner( - Team, KRange, INNER_LAMBDA(int KChunk) { - LocTracerHorzAdv.FCTProvisionaLayerThicknesses(ICell, KChunk, Dt, - LocFluxPseudoThickEdge, LocPseudoThickCell, LocNormalVelEdge); - }); - }); + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); + const int KRange = vertRangeChunked(KMin, KMax); + parallelForInner( + Team, KRange, INNER_LAMBDA(int KChunk) { + LocTracerHorzAdv.FCTProvisionaLayerThicknesses( + ICell, KChunk, Dt, LocFluxPseudoThickEdge, + LocPseudoThickCell, LocNormalVelEdge); + }); + }); Kokkos::fence(); - for (int L=0; L< NTracers; ++L) { - parallelForOuter( {Mesh->NCellsAll}, - KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { - const int KMin = LocMinLayerCell(ICell); - const int KMax = LocMaxLayerCell(ICell); - const int KRange = vertRangeChunked(KMin, KMax); - parallelForInner(Team, KRange, INNER_LAMBDA(int KChunk) { - LocTracerHorzAdv.FCTTracerCurFill(L, ICell, KChunk, TracerArray); - }); - }); + for (int L = 0; L < NTracers; ++L) { + parallelForOuter( + {Mesh->NCellsAll}, + KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); + const int KRange = vertRangeChunked(KMin, KMax); + parallelForInner( + Team, KRange, INNER_LAMBDA(int KChunk) { + LocTracerHorzAdv.FCTTracerCurFill(L, ICell, KChunk, + TracerArray); + }); + }); Kokkos::fence(); - parallelForOuter( {Mesh->NCellsAll}, - KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { - const int KMin = LocMinLayerCell(ICell); - const int KMax = LocMaxLayerCell(ICell); - const int KRange = vertRangeChunked(KMin, KMax); - parallelForInner(Team, KRange, INNER_LAMBDA(int KChunk) { - LocTracerHorzAdv.FCTTracerMinMax(ICell, KChunk, - LocMinLayerCell, LocMaxLayerCell); - }); - }); + parallelForOuter( + {Mesh->NCellsAll}, + KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); + const int KRange = vertRangeChunked(KMin, KMax); + parallelForInner( + Team, KRange, INNER_LAMBDA(int KChunk) { + LocTracerHorzAdv.FCTTracerMinMax( + ICell, KChunk, LocMinLayerCell, LocMaxLayerCell); + }); + }); Kokkos::fence(); - parallelForOuter( {Mesh->NEdgesHaloH(1)}, - KOKKOS_LAMBDA(int IEdge, const TeamMember &Team) { - const int KMin = LocMinLayerEdgeBot(IEdge); - const int KMax = LocMaxLayerEdgeTop(IEdge); - const int KRange = vertRangeChunked(KMin, KMax); - parallelForInner(Team, KRange, INNER_LAMBDA(int KChunk) { - LocTracerHorzAdv.FCTHighAndLowOrderFlux(IEdge, KChunk, - LocMinLayerCell, LocMaxLayerCell, - LocFluxPseudoThickEdge, LocNormalVelEdge); - }); - }); + parallelForOuter( + {Mesh->NEdgesHaloH(1)}, + KOKKOS_LAMBDA(int IEdge, const TeamMember &Team) { + const int KMin = LocMinLayerEdgeBot(IEdge); + const int KMax = LocMaxLayerEdgeTop(IEdge); + const int KRange = vertRangeChunked(KMin, KMax); + parallelForInner( + Team, KRange, INNER_LAMBDA(int KChunk) { + LocTracerHorzAdv.FCTHighAndLowOrderFlux( + IEdge, KChunk, LocMinLayerCell, LocMaxLayerCell, + LocFluxPseudoThickEdge, LocNormalVelEdge); + }); + }); Kokkos::fence(); - parallelForOuter( {Mesh->NCellsAll+1}, - KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { - const int KMin = LocMinLayerCell(ICell); - const int KMax = LocMaxLayerCell(ICell); - const int KRange = vertRangeChunked(KMin, KMax); - parallelForInner(Team, KRange, INNER_LAMBDA(int KChunk) { - LocTracerHorzAdv.FCTInitFluxInOut(ICell, KChunk); - }); - }); + parallelForOuter( + {Mesh->NCellsAll + 1}, + KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); + const int KRange = vertRangeChunked(KMin, KMax); + parallelForInner( + Team, KRange, INNER_LAMBDA(int KChunk) { + LocTracerHorzAdv.FCTInitFluxInOut(ICell, KChunk); + }); + }); Kokkos::fence(); - parallelForOuter( {Mesh->NCellsHaloH(0)}, - KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { - const int KMin = LocMinLayerCell(ICell); - const int KMax = LocMaxLayerCell(ICell); - const int KRange = vertRangeChunked(KMin, KMax); - parallelForInner(Team, KRange, INNER_LAMBDA(int KChunk) { - LocTracerHorzAdv.FCTFluxInOut(ICell, KChunk, Dt, LocPseudoThickCell); - }); - }); + parallelForOuter( + {Mesh->NCellsHaloH(0)}, + KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); + const int KRange = vertRangeChunked(KMin, KMax); + parallelForInner( + Team, KRange, INNER_LAMBDA(int KChunk) { + LocTracerHorzAdv.FCTFluxInOut(ICell, KChunk, Dt, + LocPseudoThickCell); + }); + }); Kokkos::fence(); - parallelForOuter( {Mesh->NEdgesHaloH(0)}, - KOKKOS_LAMBDA(int IEdge, const TeamMember &Team) { - const int KMin = LocMinLayerEdgeBot(IEdge); - const int KMax = LocMaxLayerEdgeTop(IEdge); - const int KRange = vertRangeChunked(KMin, KMax); - parallelForInner(Team, KRange, INNER_LAMBDA(int KChunk) { - LocTracerHorzAdv.FCTRescaleHighOrderFlux(IEdge, KChunk); - }); - }); + parallelForOuter( + {Mesh->NEdgesHaloH(0)}, + KOKKOS_LAMBDA(int IEdge, const TeamMember &Team) { + const int KMin = LocMinLayerEdgeBot(IEdge); + const int KMax = LocMaxLayerEdgeTop(IEdge); + const int KRange = vertRangeChunked(KMin, KMax); + parallelForInner( + Team, KRange, INNER_LAMBDA(int KChunk) { + LocTracerHorzAdv.FCTRescaleHighOrderFlux(IEdge, + KChunk); + }); + }); Kokkos::fence(); - parallelForOuter( {Mesh->NCellsOwned}, - KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { - const int KMin = LocMinLayerCell(ICell); - const int KMax = LocMaxLayerCell(ICell); - const int KRange = vertRangeChunked(KMin, KMax); - parallelForInner(Team, KRange, INNER_LAMBDA(int KChunk) { - LocTracerHorzAdv.FCTAccumulateHighOrderFlux(L, ICell, KChunk, Dt, - LocTracerTend, LocPseudoThickCell); - }); - }); + parallelForOuter( + {Mesh->NCellsOwned}, + KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); + const int KRange = vertRangeChunked(KMin, KMax); + parallelForInner( + Team, KRange, INNER_LAMBDA(int KChunk) { + LocTracerHorzAdv.FCTAccumulateHighOrderFlux( + L, ICell, KChunk, Dt, LocTracerTend, + LocPseudoThickCell); + }); + }); Kokkos::fence(); if (LocTracerHorzAdv.ComputeBudgets) { - parallelForOuter( {Mesh->NEdgesHaloH(1)}, - KOKKOS_LAMBDA(int IEdge, const TeamMember &Team) { - const int KMin = LocMinLayerEdgeBot(IEdge); - const int KMax = LocMaxLayerEdgeTop(IEdge); - const int KRange = vertRangeChunked(KMin, KMax); - parallelForInner(Team, KRange, INNER_LAMBDA(int KChunk) { - LocTracerHorzAdv.FCTComputeBudgetAdvectionEdgeFlux(L, IEdge, KChunk); - }); - }); - parallelForOuter( {Mesh->NCellsOwned}, - KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { - const int KMin = LocMinLayerCell(ICell); - const int KMax = LocMaxLayerCell(ICell); - const int KRange = vertRangeChunked(KMin, KMax); - parallelForInner(Team, KRange, INNER_LAMBDA(int KChunk) { - LocTracerHorzAdv.FCTComputeBudgetAdvectionTendency(L, ICell, KChunk); - }); - }); + parallelForOuter( + {Mesh->NEdgesHaloH(1)}, + KOKKOS_LAMBDA(int IEdge, const TeamMember &Team) { + const int KMin = LocMinLayerEdgeBot(IEdge); + const int KMax = LocMaxLayerEdgeTop(IEdge); + const int KRange = vertRangeChunked(KMin, KMax); + parallelForInner( + Team, KRange, INNER_LAMBDA(int KChunk) { + LocTracerHorzAdv.FCTComputeBudgetAdvectionEdgeFlux( + L, IEdge, KChunk); + }); + }); + parallelForOuter( + {Mesh->NCellsOwned}, + KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); + const int KRange = vertRangeChunked(KMin, KMax); + parallelForInner( + Team, KRange, INNER_LAMBDA(int KChunk) { + LocTracerHorzAdv.FCTComputeBudgetAdvectionTendency( + L, ICell, KChunk); + }); + }); } if (LocTracerHorzAdv.MonotonicityCheck) { - parallelForOuter( {Mesh->NCellsOwned}, - KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { - const int KMin = LocMinLayerCell(ICell); - const int KMax = LocMaxLayerCell(ICell); - const int KRange = vertRangeChunked(KMin, KMax); - parallelForInner(Team, KRange, INNER_LAMBDA(int KChunk) { - LocTracerHorzAdv.FCTMonotonicityCheck(L, ICell, KChunk, TracerArray); - }); - }); + parallelForOuter( + {Mesh->NCellsOwned}, + KOKKOS_LAMBDA(int ICell, const TeamMember &Team) { + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); + const int KRange = vertRangeChunked(KMin, KMax); + parallelForInner( + Team, KRange, INNER_LAMBDA(int KChunk) { + LocTracerHorzAdv.FCTMonotonicityCheck( + L, ICell, KChunk, TracerArray); + }); + }); } } } else { - parallelForOuter( {NTracers, Mesh->NEdgesAll}, - KOKKOS_LAMBDA(int L, int IEdge, const TeamMember &Team) { - const int KMin = LocMinLayerEdgeBot(IEdge); - const int KMax = LocMaxLayerEdgeTop(IEdge); - const int KRange = vertRangeChunked(KMin, KMax); - parallelForInner(Team, KRange, INNER_LAMBDA(int KChunk) { - LocTracerHorzAdv(L, IEdge, KChunk, TracerArray, - LocFluxPseudoThickEdge, LocNormalVelEdge); - }); - }); - parallelForOuter({NTracers, Mesh->NCellsAll}, - KOKKOS_LAMBDA(int L, int ICell, const TeamMember &Team) { - const int KMin = LocMinLayerCell(ICell); - const int KMax = LocMaxLayerCell(ICell); - const int KRange = vertRangeChunked(KMin, KMax); - parallelForInner(Team, KRange, INNER_LAMBDA(int KChunk) { - LocTracerHorzAdv(LocTracerTend, L, ICell, KChunk); - }); - }); + parallelForOuter( + {NTracers, Mesh->NEdgesAll}, + KOKKOS_LAMBDA(int L, int IEdge, const TeamMember &Team) { + const int KMin = LocMinLayerEdgeBot(IEdge); + const int KMax = LocMaxLayerEdgeTop(IEdge); + const int KRange = vertRangeChunked(KMin, KMax); + parallelForInner( + Team, KRange, INNER_LAMBDA(int KChunk) { + LocTracerHorzAdv(L, IEdge, KChunk, TracerArray, + LocFluxPseudoThickEdge, + LocNormalVelEdge); + }); + }); + parallelForOuter( + {NTracers, Mesh->NCellsAll}, + KOKKOS_LAMBDA(int L, int ICell, const TeamMember &Team) { + const int KMin = LocMinLayerCell(ICell); + const int KMax = LocMaxLayerCell(ICell); + const int KRange = vertRangeChunked(KMin, KMax); + parallelForInner( + Team, KRange, INNER_LAMBDA(int KChunk) { + LocTracerHorzAdv(LocTracerTend, L, ICell, KChunk); + }); + }); } Pacer::stop("Tend:tracerHorzAdv", 2); } @@ -997,7 +1037,7 @@ void Tendencies::computePseudoThicknessTendencies( TimeInstant Time ///< [in] Time ) { // only need PseudoThicknessAux on edge - Array2DReal PseudoThick = State->getPseudoThickness(ThickTimeLevel); + Array2DReal PseudoThick = State->getPseudoThickness(ThickTimeLevel); Array2DReal NormalVelEdge = State->getNormalVelocity(VelTimeLevel); OMEGA_SCOPE(PseudoThicknessAux, AuxState->PseudoThicknessAux); OMEGA_SCOPE(PseudoThickCell, PseudoThick); diff --git a/components/omega/src/ocn/TendencyTerms.cpp b/components/omega/src/ocn/TendencyTerms.cpp index 9931cae482da..0bf6a9860dfb 100644 --- a/components/omega/src/ocn/TendencyTerms.cpp +++ b/components/omega/src/ocn/TendencyTerms.cpp @@ -10,11 +10,11 @@ #include #include -#include "TendencyTerms.h" #include "DataTypes.h" #include "Error.h" #include "HorzMesh.h" #include "HorzOperators.h" +#include "TendencyTerms.h" #include "Tracers.h" namespace OMEGA { @@ -74,8 +74,8 @@ BottomDragOnEdge::BottomDragOnEdge(const HorzMesh *Mesh, TracerHorzAdvOnCell::TracerHorzAdvOnCell(const HorzMesh *Mesh, const VertCoord *VCoord, - const VertAdv *VAdv) - : HorzontalMesh(Mesh), VerticalCoord(VCoord), + const VertAdv *VAdv) + : HorzontalMesh(Mesh), VerticalCoord(VCoord), NVertLayers(VCoord->NVertLayers), NAdvCellsForEdge("NumberOfCellsContribToAdvectionAtEdge", Mesh->NEdgesAll), @@ -90,26 +90,16 @@ TracerHorzAdvOnCell::TracerHorzAdvOnCell(const HorzMesh *Mesh, Mesh->NEdgesAll), HighOrderFlxHorz("HigherOrderHorizontalFlux", Tracers::getNumTracers(), Mesh->NEdgesAll, VCoord->NVertLayers), - TracerCur(), - NEdgesOnCell(Mesh->NEdgesOnCell), EdgesOnCell(Mesh->EdgesOnCell), - CellsOnEdge(Mesh->CellsOnEdge), + TracerCur(), NEdgesOnCell(Mesh->NEdgesOnCell), + EdgesOnCell(Mesh->EdgesOnCell), CellsOnEdge(Mesh->CellsOnEdge), MinLayerEdgeBot(VCoord->MinLayerEdgeBot), MaxLayerEdgeTop(VCoord->MinLayerEdgeTop), - EdgeSignOnCell(Mesh->EdgeSignOnCell), - DvEdge(Mesh->DvEdge), AreaCell(Mesh->AreaCell), - VerticalPseudoVelocity(VAdv->VerticalPseudoVelocity), - HProvInv(), - HNewInv(), - HProv(), - TracerMax(), - TracerMin(), - HighOrderFlx(), - LowOrderFlx(), - MinLayerCell(VCoord->MinLayerCell), - MaxLayerCell(VCoord->MaxLayerCell), - WorkTend(), - FlxIn(), - FlxOut(), + EdgeSignOnCell(Mesh->EdgeSignOnCell), DvEdge(Mesh->DvEdge), + AreaCell(Mesh->AreaCell), + VerticalPseudoVelocity(VAdv->VerticalPseudoVelocity), HProvInv(), + HNewInv(), HProv(), TracerMax(), TracerMin(), HighOrderFlx(), + LowOrderFlx(), MinLayerCell(VCoord->MinLayerCell), + MaxLayerCell(VCoord->MaxLayerCell), WorkTend(), FlxIn(), FlxOut(), ActiveTracerHorizontalAdvectionEdgeFlux(), ActiveTracerHorizontalAdvectionTendency() { deepCopy(HighOrderFlxHorz, 0); @@ -161,7 +151,7 @@ void TracerHorzAdvOnCell::init() { // Compute masks and coefficients Kokkos::fence(); MasksAndCoefficients masksAndCoefficients( - Mesh, VCoord, DerivTwo, NAdvCellsForEdge, AdvCellsForEdge, + Mesh, VCoord, DerivTwo, NAdvCellsForEdge, AdvCellsForEdge, AdvMaskHighOrder, AdvCoefs, AdvCoefs3rd); Kokkos::fence(); parallelFor( @@ -170,25 +160,29 @@ void TracerHorzAdvOnCell::init() { if (FCT) { HProvInv = Array2DReal("FCTProvesionalLayerThickness", Mesh->NEdgesAll, NVertLayers); - HNewInv = - Array2DReal("FCTProvesionalNewInverse", NEdgesAll, NVertLayers); - HProv = - Array2DReal("FCTProvesionalThickness", NCellsAll, NVertLayers); - TracerCur = Array2DReal("TracerCur", NCellsAll+1, NVertLayers), + HNewInv = Array2DReal("FCTProvesionalNewInverse", NEdgesAll, NVertLayers); + HProv = Array2DReal("FCTProvesionalThickness", NCellsAll, NVertLayers); + TracerCur = Array2DReal("TracerCur", NCellsAll + 1, NVertLayers), TracerMax = Array2DReal("FCTTracerMax", NCellsAll, NVertLayers); TracerMin = Array2DReal("FCTTracerMin", NCellsAll, NVertLayers); - HighOrderFlx = Array2DReal("FCTHighOrderFlx", std::max(NEdgesAll,NCellsAll)+1, NVertLayers+1); - LowOrderFlx = Array2DReal("FCTLowOrderFlx", std::max(NEdgesAll,NCellsAll)+1, NVertLayers+1); - WorkTend = Array2DReal("WorkTend", NCellsAll+1, NVertLayers); - FlxIn = Array2DReal("FlxIn", NCellsAll+1, NVertLayers); - FlxOut = Array2DReal("FlxOut", NCellsAll+1, NVertLayers); + HighOrderFlx = + Array2DReal("FCTHighOrderFlx", std::max(NEdgesAll, NCellsAll) + 1, + NVertLayers + 1); + LowOrderFlx = + Array2DReal("FCTLowOrderFlx", std::max(NEdgesAll, NCellsAll) + 1, + NVertLayers + 1); + WorkTend = Array2DReal("WorkTend", NCellsAll + 1, NVertLayers); + FlxIn = Array2DReal("FlxIn", NCellsAll + 1, NVertLayers); + FlxOut = Array2DReal("FlxOut", NCellsAll + 1, NVertLayers); if (ComputeBudgets) { - const int NTracers = Tracers::getNumTracers(); - const int NEdges = Mesh->NEdgesHaloH(1); - ActiveTracerHorizontalAdvectionEdgeFlux = - Array3DReal("FCTActiveTracerHorizontalAdvectionEdgeFlux", NTracers, NEdges, NVertLayers); - ActiveTracerHorizontalAdvectionTendency = - Array3DReal("FCTActiveTracerHorizontalAdvectionTendency", NTracers, NCellsAll, NVertLayers); + const int NTracers = Tracers::getNumTracers(); + const int NEdges = Mesh->NEdgesHaloH(1); + ActiveTracerHorizontalAdvectionEdgeFlux = + Array3DReal("FCTActiveTracerHorizontalAdvectionEdgeFlux", NTracers, + NEdges, NVertLayers); + ActiveTracerHorizontalAdvectionTendency = + Array3DReal("FCTActiveTracerHorizontalAdvectionTendency", NTracers, + NCellsAll, NVertLayers); } } } diff --git a/components/omega/src/ocn/TendencyTerms.h b/components/omega/src/ocn/TendencyTerms.h index 14b5d1c0f95a..b0697eb821ab 100644 --- a/components/omega/src/ocn/TendencyTerms.h +++ b/components/omega/src/ocn/TendencyTerms.h @@ -375,7 +375,8 @@ class TracerHorzAdvOnCell { bool MonotonicityCheck = false; // coefficient for blending high-order terms Real Coef3rdOrder = 0.25; - TracerHorzAdvOnCell(const HorzMesh *Mesh, const VertCoord *VCoord, const VertAdv *VAdv); + TracerHorzAdvOnCell(const HorzMesh *Mesh, const VertCoord *VCoord, + const VertAdv *VAdv); void init(); KOKKOS_FUNCTION void operator()(const I4 L, const I4 IEdge, const I4 KChunk, const Array3DReal &TracerCell, @@ -435,12 +436,11 @@ class TracerHorzAdvOnCell { } } - KOKKOS_FUNCTION void FCTProvisionaLayerThicknesses( - const I4 ICell, const I4 KChunk, const Real Dt, - const Array2DReal &FluxPseudoThickEdge, - const Array2DReal &LayerThickness, - const Array2DReal &NormVelEdge) const { - + KOKKOS_FUNCTION void + FCTProvisionaLayerThicknesses(const I4 ICell, const I4 KChunk, const Real Dt, + const Array2DReal &FluxPseudoThickEdge, + const Array2DReal &LayerThickness, + const Array2DReal &NormVelEdge) const { const I4 KStart = KChunk * VecLength; const I4 KEnd = KStart + VecLength; @@ -467,21 +467,20 @@ class TracerHorzAdvOnCell { HProvInv(ICell, K) = 1.0_Real / HProv(ICell, K); HNewInv(ICell, K) = 1.0_Real / - (HProv(ICell, K) - - Dt * VerticalPseudoVelocity(ICell, K) + + (HProv(ICell, K) - Dt * VerticalPseudoVelocity(ICell, K) + Dt * VerticalPseudoVelocity(ICell, K + 1)); } } - KOKKOS_FUNCTION void FCTTracerCurFill(const I4 L, const I4 ICell, const I4 KChunk, - const Array3DReal &TracerArray) const { + KOKKOS_FUNCTION void FCTTracerCurFill(const I4 L, const I4 ICell, + const I4 KChunk, + const Array3DReal &TracerArray) const { const I4 KStart = KChunk * VecLength; const I4 KEnd = KStart + VecLength; - for (I4 K = KStart; K < KEnd; ++K) + for (I4 K = KStart; K < KEnd; ++K) TracerCur(ICell, K) = TracerArray(L, ICell, K); } - KOKKOS_FUNCTION void FCTTracerMinMax(const I4 ICell, - const I4 KChunk, + KOKKOS_FUNCTION void FCTTracerMinMax(const I4 ICell, const I4 KChunk, const Array1DI4 MinLayerCell, const Array1DI4 MaxLayerCell) const { @@ -510,9 +509,9 @@ class TracerHorzAdvOnCell { } KOKKOS_FUNCTION void FCTHighAndLowOrderFlux( - const I4 IEdge, const I4 KChunk, - const Array1DI4 &MinLayerCell, const Array1DI4 &MaxLayerCell, - const Array2DReal &FluxPseudoThickEdge, const Array2DReal &NormVelEdge) const { + const I4 IEdge, const I4 KChunk, const Array1DI4 &MinLayerCell, + const Array1DI4 &MaxLayerCell, const Array2DReal &FluxPseudoThickEdge, + const Array2DReal &NormVelEdge) const { const Real Coef3rdOrder = 0.25; const I4 ICell1 = CellsOnEdge(IEdge, 0); @@ -536,9 +535,11 @@ class TracerHorzAdvOnCell { for (I4 K = KStartCell; K <= KEndCell; ++K) { const Real NormalThicknessFlux = FluxPseudoThickEdge(IEdge, K) * NormVelEdge(IEdge, K); - const Real TracerWgt = - NormalThicknessFlux * (Coef1 + Coef3 * std::copysign(1.0_Real, NormalThicknessFlux)); - HighOrderFlx(IEdge, K) += TracerWgt * TracerCur(ICell, K) * AdvMaskHighOrder(IEdge, K); + const Real TracerWgt = + NormalThicknessFlux * + (Coef1 + Coef3 * std::copysign(1.0_Real, NormalThicknessFlux)); + HighOrderFlx(IEdge, K) += + TracerWgt * TracerCur(ICell, K) * AdvMaskHighOrder(IEdge, K); } } // Compute 2nd order fluxes where needed. @@ -558,13 +559,14 @@ class TracerHorzAdvOnCell { Kokkos::min(0.0_Real, NormalThicknessFlux) * TracerCur(ICell2, K)); - HighOrderFlx(IEdge, K) += TracerWeight * (TracerCur(ICell1, K) + - TracerCur(ICell2, K)); + HighOrderFlx(IEdge, K) += + TracerWeight * (TracerCur(ICell1, K) + TracerCur(ICell2, K)); HighOrderFlx(IEdge, K) -= LowOrderFlx(IEdge, K); } } - KOKKOS_FUNCTION void FCTInitFluxInOut(const I4 ICell, const I4 KChunk) const { + KOKKOS_FUNCTION void FCTInitFluxInOut(const I4 ICell, + const I4 KChunk) const { const I4 KStart = KChunk * VecLength; const I4 KEnd = KStart + VecLength; for (I4 K = KStart; K < KEnd; ++K) @@ -575,10 +577,11 @@ class TracerHorzAdvOnCell { FlxOut(ICell, K) = 0; } - KOKKOS_FUNCTION void FCTFluxInOut(const I4 ICell, const I4 KChunk, - const Real Dt, const Array2DReal &LayerThickness) const { + KOKKOS_FUNCTION void FCTFluxInOut(const I4 ICell, const I4 KChunk, + const Real Dt, + const Array2DReal &LayerThickness) const { const Real InvAreaCell = 1._Real / AreaCell(ICell); - const I4 KStartCell = chunkStart(KChunk, MinLayerCell(ICell)); + const I4 KStartCell = chunkStart(KChunk, MinLayerCell(ICell)); const I4 KLenCell = chunkLength(KChunk, KStartCell, MaxLayerCell(ICell)); const I4 KEndCell = KStartCell + KLenCell - 1; for (I4 K = KStartCell; K <= KEndCell; ++K) { @@ -594,10 +597,10 @@ class TracerHorzAdvOnCell { WorkTend(ICell, K) += SignedFactor * LowOrderFlx(IEdge, K); // Accumulate remaining high order fluxes - FlxOut(ICell, K) += Kokkos::min( - 0.0_Real, SignedFactor * HighOrderFlx(IEdge, K)); - FlxIn(ICell, K) += Kokkos::max( - 0.0_Real, SignedFactor * HighOrderFlx(IEdge, K)); + FlxOut(ICell, K) += + Kokkos::min(0.0_Real, SignedFactor * HighOrderFlx(IEdge, K)); + FlxIn(ICell, K) += + Kokkos::max(0.0_Real, SignedFactor * HighOrderFlx(IEdge, K)); } } // Build the factors for the FCT @@ -608,7 +611,8 @@ class TracerHorzAdvOnCell { // Here workTend is the upwind tendency const Real TracerUpwindNew = (TracerCur(ICell, K) * LayerThickness(ICell, K) + - Dt * WorkTend(ICell, K)) * HProvInv(ICell, K); + Dt * WorkTend(ICell, K)) * + HProvInv(ICell, K); const Real TracerMinNew = TracerUpwindNew + Dt * FlxOut(ICell, K) * HProvInv(ICell, K); const Real TracerMaxNew = @@ -626,88 +630,97 @@ class TracerHorzAdvOnCell { } } - KOKKOS_FUNCTION void FCTRescaleHighOrderFlux(const I4 IEdge, const I4 KChunk) const { + KOKKOS_FUNCTION void FCTRescaleHighOrderFlux(const I4 IEdge, + const I4 KChunk) const { const I4 ICell1 = CellsOnEdge(IEdge, 0); const I4 ICell2 = CellsOnEdge(IEdge, 1); const I4 KStart = KChunk * VecLength; const I4 KEnd = KStart + VecLength; for (I4 K = KStart; K < KEnd; ++K) { - HighOrderFlx(IEdge,K) = - Kokkos::max(0.0_Real,HighOrderFlx(IEdge,K)) * - Kokkos::min(FlxOut(ICell1,K), FlxIn (ICell2,K)) + - Kokkos::min(0.0_Real,HighOrderFlx(IEdge,K)) * - Kokkos::min(FlxIn (ICell1,K), FlxOut(ICell2,K)); + HighOrderFlx(IEdge, K) = + Kokkos::max(0.0_Real, HighOrderFlx(IEdge, K)) * + Kokkos::min(FlxOut(ICell1, K), FlxIn(ICell2, K)) + + Kokkos::min(0.0_Real, HighOrderFlx(IEdge, K)) * + Kokkos::min(FlxIn(ICell1, K), FlxOut(ICell2, K)); } } - KOKKOS_FUNCTION void FCTAccumulateHighOrderFlux(const I4 L, const I4 ICell, const I4 KChunk, const Real Dt, - const Array3DReal &TracerArray, const Array2DReal &LayerThickness) const { + KOKKOS_FUNCTION void + FCTAccumulateHighOrderFlux(const I4 L, const I4 ICell, const I4 KChunk, + const Real Dt, const Array3DReal &TracerArray, + const Array2DReal &LayerThickness) const { // Accumulate the scaled high order vertical tendencies // and the upwind tendencies const Real InvAreaCell1 = 1.0_Real / AreaCell(ICell); - const I4 KStart = KChunk * VecLength; - const I4 KEnd = KStart + VecLength; + const I4 KStart = KChunk * VecLength; + const I4 KEnd = KStart + VecLength; // Accumulate the scaled high order horizontal tendencies - for (I4 I=0; I TracerMax(ICell,K)+Eps) { - printf("Horizontal maximum out of bounds on tracer: %i %lg %lg\n", - L, TracerMax(ICell, K), TracerArray(L,ICell,K)); - } + if (TracerArray(L, ICell, K) < TracerMin(ICell, K) - Eps) { + printf("Horizontal minimum out of bounds on tracer: %i %lg %lg\n", + L, TracerMin(ICell, K), TracerArray(L, ICell, K)); + } + if (TracerArray(L, ICell, K) > TracerMax(ICell, K) + Eps) { + printf("Horizontal maximum out of bounds on tracer: %i %lg %lg\n", + L, TracerMax(ICell, K), TracerArray(L, ICell, K)); + } } } - private: const Real Eps = 1.e-10_Real; const HorzMesh *HorzontalMesh; From 0a3b57e383f4f085b0074f8a0c1e69dde436aac2 Mon Sep 17 00:00:00 2001 From: James Overfelt Date: Fri, 26 Jun 2026 12:38:44 -0600 Subject: [PATCH 19/32] Clang format --- components/omega/test/ocn/TendencyTermsTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/omega/test/ocn/TendencyTermsTest.cpp b/components/omega/test/ocn/TendencyTermsTest.cpp index 74793921e45e..5592f1548f70 100644 --- a/components/omega/test/ocn/TendencyTermsTest.cpp +++ b/components/omega/test/ocn/TendencyTermsTest.cpp @@ -886,7 +886,7 @@ int testTracerHorzAdvOnCell(int NVertLayers, int NTracers, Real RTol) { NVertLayers); VertAdv::init(); - const auto VAdv = VertAdv::getDefault(); + const auto VAdv = VertAdv::getDefault(); VertAdv::clear(); TracerHorzAdvOnCell TrHorzAdvOnC(Mesh, VCoord, VAdv); From a793080061e5b0c0457e77757339b6ddd74d64f0 Mon Sep 17 00:00:00 2001 From: James Overfelt Date: Fri, 26 Jun 2026 12:53:16 -0600 Subject: [PATCH 20/32] Update user guide --- components/omega/doc/userGuide/TendencyTerms.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/components/omega/doc/userGuide/TendencyTerms.md b/components/omega/doc/userGuide/TendencyTerms.md index e6ee85a5045c..83a6ad7d9c36 100644 --- a/components/omega/doc/userGuide/TendencyTerms.md +++ b/components/omega/doc/userGuide/TendencyTerms.md @@ -48,6 +48,9 @@ the currently available tendency terms: | | HorzTracerFluxOrder | 1 for standard linear advection | TracerHighOrderHorzAdvOnCell | TracerHorzAdvTendencyEnable | enable/disable term | | HorzTracerFluxOrder | 2 for second order advection algorithm +| | HorzTracerFluxLimiterEnable | enable montonic flux corrected transport (FCT) +| | HorzTracerFluxLimiterBudgetsEnable | enable budgets if FCT is enabled +| | HorzTracerFluxLimiterMonotonicityCheckEnable | enable check for monononic if FCT is enabled | TracerDiffOnCell | TracerDiffTendencyEnable | enable/disable term | | EddyDiff2 | horizontal diffusion coefficient | TracerHyperDiffOnCell | TracerHyperDiffTendencyEnable | enable/disable term From e8b90c570c824d9def6b627dd5da83903628058e Mon Sep 17 00:00:00 2001 From: James Overfelt Date: Tue, 30 Jun 2026 13:42:30 -0600 Subject: [PATCH 21/32] Add dumping of budget fields to output database. --- components/omega/src/ocn/TendencyTerms.cpp | 40 ++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/components/omega/src/ocn/TendencyTerms.cpp b/components/omega/src/ocn/TendencyTerms.cpp index 0bf6a9860dfb..30f7c5d49ac5 100644 --- a/components/omega/src/ocn/TendencyTerms.cpp +++ b/components/omega/src/ocn/TendencyTerms.cpp @@ -183,6 +183,46 @@ void TracerHorzAdvOnCell::init() { ActiveTracerHorizontalAdvectionTendency = Array3DReal("FCTActiveTracerHorizontalAdvectionTendency", NTracers, NCellsAll, NVertLayers); + const std::string EdgeFieldName = "BudgetAdvectionEdgeFlux"; + const Real FillValueReal = -9.99e30; + const int NDims = 1; + std::vector FluxDimNames(NDims, "NEdges"); + auto BudgetAdvectionEdgeFlux = Field::create( + EdgeFieldName, // field name + "Tracer FCT Horizontal Advection Edge Flux Budget", // long name or + // description + "", // units + "", // CF standard Name + 0, // min valid value + std::numeric_limits::max(), // max valid value + FillValueReal, // scalar for undefined entries + NDims, // number of dimensions + FluxDimNames // dimension names + ); + BudgetAdvectionEdgeFlux->attachData( + ActiveTracerHorizontalAdvectionEdgeFlux); + FieldGroup::addFieldToGroup( + ActiveTracerHorizontalAdvectionEdgeFlux.label(), Mesh->MeshName); + const std::string CellFieldName = "BudgetAdvectionTendency"; + std::vector TendDimNames(NDims, "NCells"); + auto + BudgetAdvectionCellTend = + Field::create(CellFieldName, // field name + "Tracer FCT Horizontal Advection Cell Flux " + "Tendency", // long name or description + "", // units + "", // CF standard Name + 0, // min valid value + std::numeric_limits::max(), // max valid + // value + FillValueReal, // scalar for undefined entries + NDims, // number of dimensions + TendDimNames // dimension names + ); + BudgetAdvectionCellTend->attachData( + ActiveTracerHorizontalAdvectionTendency); + FieldGroup::addFieldToGroup( + ActiveTracerHorizontalAdvectionTendency.label(), Mesh->MeshName); } } } From 2069ebdfa4d7512672a68769c2bd9ca93404fa35 Mon Sep 17 00:00:00 2001 From: James Overfelt Date: Tue, 30 Jun 2026 13:53:40 -0600 Subject: [PATCH 22/32] Clang format --- components/omega/src/ocn/TendencyTerms.cpp | 27 +++++++++++----------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/components/omega/src/ocn/TendencyTerms.cpp b/components/omega/src/ocn/TendencyTerms.cpp index 30f7c5d49ac5..7b1a3713f844 100644 --- a/components/omega/src/ocn/TendencyTerms.cpp +++ b/components/omega/src/ocn/TendencyTerms.cpp @@ -205,20 +205,19 @@ void TracerHorzAdvOnCell::init() { ActiveTracerHorizontalAdvectionEdgeFlux.label(), Mesh->MeshName); const std::string CellFieldName = "BudgetAdvectionTendency"; std::vector TendDimNames(NDims, "NCells"); - auto - BudgetAdvectionCellTend = - Field::create(CellFieldName, // field name - "Tracer FCT Horizontal Advection Cell Flux " - "Tendency", // long name or description - "", // units - "", // CF standard Name - 0, // min valid value - std::numeric_limits::max(), // max valid - // value - FillValueReal, // scalar for undefined entries - NDims, // number of dimensions - TendDimNames // dimension names - ); + auto BudgetAdvectionCellTend = + Field::create(CellFieldName, // field name + "Tracer FCT Horizontal Advection Cell Flux " + "Tendency", // long name or description + "", // units + "", // CF standard Name + 0, // min valid value + std::numeric_limits::max(), // max valid + // value + FillValueReal, // scalar for undefined entries + NDims, // number of dimensions + TendDimNames // dimension names + ); BudgetAdvectionCellTend->attachData( ActiveTracerHorizontalAdvectionTendency); FieldGroup::addFieldToGroup( From ce77721d48fe44525eac8032c94ea04ffdb414f7 Mon Sep 17 00:00:00 2001 From: James Overfelt Date: Wed, 1 Jul 2026 09:37:47 -0500 Subject: [PATCH 23/32] Fix up field names. --- components/omega/src/ocn/TendencyTerms.cpp | 35 +++++++++++----------- components/omega/src/ocn/TendencyTerms.h | 8 +++++ 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/components/omega/src/ocn/TendencyTerms.cpp b/components/omega/src/ocn/TendencyTerms.cpp index 7b1a3713f844..a027075e4444 100644 --- a/components/omega/src/ocn/TendencyTerms.cpp +++ b/components/omega/src/ocn/TendencyTerms.cpp @@ -183,12 +183,12 @@ void TracerHorzAdvOnCell::init() { ActiveTracerHorizontalAdvectionTendency = Array3DReal("FCTActiveTracerHorizontalAdvectionTendency", NTracers, NCellsAll, NVertLayers); - const std::string EdgeFieldName = "BudgetAdvectionEdgeFlux"; const Real FillValueReal = -9.99e30; const int NDims = 1; + const std::string GroupName = "AuxiliaryState"; std::vector FluxDimNames(NDims, "NEdges"); auto BudgetAdvectionEdgeFlux = Field::create( - EdgeFieldName, // field name + ActiveTracerHorizontalAdvectionEdgeFlux.label(), // field name "Tracer FCT Horizontal Advection Edge Flux Budget", // long name or // description "", // units @@ -202,26 +202,25 @@ void TracerHorzAdvOnCell::init() { BudgetAdvectionEdgeFlux->attachData( ActiveTracerHorizontalAdvectionEdgeFlux); FieldGroup::addFieldToGroup( - ActiveTracerHorizontalAdvectionEdgeFlux.label(), Mesh->MeshName); - const std::string CellFieldName = "BudgetAdvectionTendency"; + ActiveTracerHorizontalAdvectionEdgeFlux.label(), GroupName); std::vector TendDimNames(NDims, "NCells"); - auto BudgetAdvectionCellTend = - Field::create(CellFieldName, // field name - "Tracer FCT Horizontal Advection Cell Flux " - "Tendency", // long name or description - "", // units - "", // CF standard Name - 0, // min valid value - std::numeric_limits::max(), // max valid - // value - FillValueReal, // scalar for undefined entries - NDims, // number of dimensions - TendDimNames // dimension names - ); + auto BudgetAdvectionCellTend = Field::create( + ActiveTracerHorizontalAdvectionTendency.label() , // field name + "Tracer FCT Horizontal Advection Cell Flux " + "Tendency", // long name or description + "", // units + "", // CF standard Name + 0, // min valid value + std::numeric_limits::max(), // max valid + // value + FillValueReal, // scalar for undefined entries + NDims, // number of dimensions + TendDimNames // dimension names + ); BudgetAdvectionCellTend->attachData( ActiveTracerHorizontalAdvectionTendency); FieldGroup::addFieldToGroup( - ActiveTracerHorizontalAdvectionTendency.label(), Mesh->MeshName); + ActiveTracerHorizontalAdvectionTendency.label(), GroupName); } } } diff --git a/components/omega/src/ocn/TendencyTerms.h b/components/omega/src/ocn/TendencyTerms.h index b0697eb821ab..7fbf809f2c2d 100644 --- a/components/omega/src/ocn/TendencyTerms.h +++ b/components/omega/src/ocn/TendencyTerms.h @@ -377,6 +377,14 @@ class TracerHorzAdvOnCell { Real Coef3rdOrder = 0.25; TracerHorzAdvOnCell(const HorzMesh *Mesh, const VertCoord *VCoord, const VertAdv *VAdv); +#if (0) + ~TracerHorzAdvOnCell() { + if (ComputeBudgets) { + Field::destroy(ActiveTracerHorizontalAdvectionEdgeFlux.label()); + Field::destroy(ActiveTracerHorizontalAdvectionTendency.label()); + } + } +#endif void init(); KOKKOS_FUNCTION void operator()(const I4 L, const I4 IEdge, const I4 KChunk, const Array3DReal &TracerCell, From ea9f3e99584d95b0f6e60d44f7b3ffa9faf34ac4 Mon Sep 17 00:00:00 2001 From: James Overfelt Date: Wed, 1 Jul 2026 09:00:13 -0600 Subject: [PATCH 24/32] Clang format --- components/omega/src/ocn/TendencyTerms.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/components/omega/src/ocn/TendencyTerms.cpp b/components/omega/src/ocn/TendencyTerms.cpp index a027075e4444..22878a5ca82d 100644 --- a/components/omega/src/ocn/TendencyTerms.cpp +++ b/components/omega/src/ocn/TendencyTerms.cpp @@ -183,8 +183,8 @@ void TracerHorzAdvOnCell::init() { ActiveTracerHorizontalAdvectionTendency = Array3DReal("FCTActiveTracerHorizontalAdvectionTendency", NTracers, NCellsAll, NVertLayers); - const Real FillValueReal = -9.99e30; - const int NDims = 1; + const Real FillValueReal = -9.99e30; + const int NDims = 1; const std::string GroupName = "AuxiliaryState"; std::vector FluxDimNames(NDims, "NEdges"); auto BudgetAdvectionEdgeFlux = Field::create( @@ -205,12 +205,12 @@ void TracerHorzAdvOnCell::init() { ActiveTracerHorizontalAdvectionEdgeFlux.label(), GroupName); std::vector TendDimNames(NDims, "NCells"); auto BudgetAdvectionCellTend = Field::create( - ActiveTracerHorizontalAdvectionTendency.label() , // field name + ActiveTracerHorizontalAdvectionTendency.label(), // field name "Tracer FCT Horizontal Advection Cell Flux " - "Tendency", // long name or description - "", // units - "", // CF standard Name - 0, // min valid value + "Tendency", // long name or description + "", // units + "", // CF standard Name + 0, // min valid value std::numeric_limits::max(), // max valid // value FillValueReal, // scalar for undefined entries From e7d211b3fba9628eb35df59d1cdd1b50cb10eee0 Mon Sep 17 00:00:00 2001 From: James Overfelt Date: Wed, 1 Jul 2026 09:33:04 -0600 Subject: [PATCH 25/32] Update default yaml file --- components/omega/configs/Default.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/components/omega/configs/Default.yml b/components/omega/configs/Default.yml index 08164bdaa373..cc7e62cfae65 100644 --- a/components/omega/configs/Default.yml +++ b/components/omega/configs/Default.yml @@ -32,6 +32,9 @@ Omega: FluxThicknessType: Center HorzTracerFluxOrder: 2 VerticalTracerFluxLimiterEnable: true + HorzTracerFluxLimiterEnable: false + HorzTracerFluxLimiterBudgetsEnable: false + HorzTracerFluxLimiterMonotonicityCheckEnable: false VerticalTracerFluxOrder: 3 SfcStress: InterpType: Isotropic From abd4f8307e5ad50be79c77e9e2cb8e5c0d5d328a Mon Sep 17 00:00:00 2001 From: James Overfelt Date: Wed, 1 Jul 2026 14:36:01 -0600 Subject: [PATCH 26/32] Add section on FCT --- .../omega/doc/userGuide/TendencyTerms.md | 50 ++++++++++++++++--- 1 file changed, 43 insertions(+), 7 deletions(-) diff --git a/components/omega/doc/userGuide/TendencyTerms.md b/components/omega/doc/userGuide/TendencyTerms.md index 83a6ad7d9c36..4ee42d4c8950 100644 --- a/components/omega/doc/userGuide/TendencyTerms.md +++ b/components/omega/doc/userGuide/TendencyTerms.md @@ -45,12 +45,12 @@ the currently available tendency terms: | | ViscDel4 | horizontal biharmonic mixing coefficient for normal velocity | | DivFactor | scale factor for the divergence term | TracerHorzAdvOnCell | TracerHorzAdvTendencyEnable | enable/disable term -| | HorzTracerFluxOrder | 1 for standard linear advection +| | HorzTracerFluxOrder | 2 for standard linear advection | TracerHighOrderHorzAdvOnCell | TracerHorzAdvTendencyEnable | enable/disable term -| | HorzTracerFluxOrder | 2 for second order advection algorithm -| | HorzTracerFluxLimiterEnable | enable montonic flux corrected transport (FCT) -| | HorzTracerFluxLimiterBudgetsEnable | enable budgets if FCT is enabled -| | HorzTracerFluxLimiterMonotonicityCheckEnable | enable check for monononic if FCT is enabled +| | HorzTracerFluxOrder | 3 for second order advection algorithm +| | HorzTracerFluxLimiterEnable | enable/disable monotonic flux corrected transport (FCT) +| | HorzTracerFluxLimiterBudgetsEnable | enable/disable budgets if FCT is enabled +| | HorzTracerFluxLimiterMonotonicityCheckEnable | enable/disable check for mon-mononic values if FCT is enabled | TracerDiffOnCell | TracerDiffTendencyEnable | enable/disable term | | EddyDiff2 | horizontal diffusion coefficient | TracerHyperDiffOnCell | TracerHyperDiffTendencyEnable | enable/disable term @@ -95,13 +95,13 @@ $$ $$ Where $u$ is $\mathbf{V}\cdot\mathbf{n}$ where $\mathbf{n}$ is the unit normal along the edge being evaluated and $F$ is the evaluation of $\psi$ for the elements on each side of the edge being evaluated. -This is used when the TracerHorzAdvOnCell user option is active and HorzTracerFluxOrder is 1. +This is used when the TracerHorzAdvOnCell user option is active and HorzTracerFluxOrder is 2. To make the comparison to higher order methods explicit, this first order method is equivalent to defining $\psi$ as a linear function, $\psi = c_0 + c_x x + c_y y$, between the two elements sharing the edge $i$ and taking the directed derivative along the edge. For higher order flux calculations, higher order derivatives of $\psi$ are needed and for the user option of -TracerHorzAdvOnCell along with HorzTracerFluxOrder set to 2, a quadratic approximation of $\psi$ is used, +TracerHorzAdvOnCell along with HorzTracerFluxOrder set to 3, a quadratic approximation of $\psi$ is used, $$ \psi = c_0 + c_x x + c_y y + c_{xx} x^2 + c_{xy} xy + c_{yy} y^2, $$ @@ -141,6 +141,42 @@ is about order 1.7 as shown in {numref}`tracer-higher-order-convergence`: Tracer higer order convergence example of a cosine bell advected on a sphere showing an order 1.71 convergence rate ``` +### Monotonic Flux Limiting Transport for Second Order Horizontal Advection + +It is well known that higher order (order 2 and above) scheme for numerically integrating fluxes suffer +from dispersive "ripples" in the results particularly near steep gradients. Lower order schemes +produce no ripples but suffer from excessive numerical diffusion. Flux-corrected transport (FCT) is a +technique which embodies the best of both schemes. + +The implementation of a monotonic flux-corrected transport (FCT) in Omega follows a standard algorithm as given in + +Zalesak, S. T. (1979). Fully multidimensional flux-corrected transport algorithms for fluids. +Journal of Computational Physics, 31(3), 335–362. DOI: 10.1016/0021-9991(79)90051-2 + +The procedure is as follows given the notation above: +1. Compute $F^L_{i+1/2}(u\psi)$, the transportive flux by some low order scheme guarenteed to give +monotonic (ripple-free) results. +2. Compute $F^H_{i+1/2}(u\psi)$, the transportative flux by some high order scheme. +3. Define the "antififfusive flux": +$$ +A_{i+1/2}(u\psi) = F^H_{i+1/2}(u\psi) - F^L_{i+1/2}(u\psi) +$$ +4. Compute the updated low order ("transported and diffused") "td" solution: +$$ + w^{td}_i = w^n_i - \frac{1}{\Delta x}[F_{i+1/2}(u\psi) - F_{i-1/2}(u\psi)] +$$ +5. Limit he $A_{i+1/2}(u\psi)$ in a manner such that $w^{n+1}$ as computed below is free of extrema +not found in $w^{td}$ = $w^n$; +$$ +A^C_{i+1/2}(u\psi) = C_{i+1/2}(u\psi) A_{i+1/2}(u\psi), \quad \quad 0 \leq C_{i+1/2} \leq 1 +$$ +6. Finally apply hte limited antidiffusive fluxes: +$$ + w^{n+1}_i = w^{td}_i - \frac{1}{\Delta x}[A^C_{i+1/2}(u\psi) - A^C_{i-1/2}(u\psi)] +$$ + + + ## See Also Additional information on forcing (currently wind forcing and surface tracer From 204f2b60b4f226e79be62a492bd823dab284a8d0 Mon Sep 17 00:00:00 2001 From: James Overfelt Date: Wed, 1 Jul 2026 14:59:54 -0600 Subject: [PATCH 27/32] trim trailing whitespace --- .../omega/doc/userGuide/TendencyTerms.md | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/components/omega/doc/userGuide/TendencyTerms.md b/components/omega/doc/userGuide/TendencyTerms.md index 4ee42d4c8950..d72a81cedb7c 100644 --- a/components/omega/doc/userGuide/TendencyTerms.md +++ b/components/omega/doc/userGuide/TendencyTerms.md @@ -143,36 +143,36 @@ Tracer higer order convergence example of a cosine bell advected on a sphere sho ### Monotonic Flux Limiting Transport for Second Order Horizontal Advection -It is well known that higher order (order 2 and above) scheme for numerically integrating fluxes suffer -from dispersive "ripples" in the results particularly near steep gradients. Lower order schemes -produce no ripples but suffer from excessive numerical diffusion. Flux-corrected transport (FCT) is a +It is well known that higher order (order 2 and above) scheme for numerically integrating fluxes suffer +from dispersive "ripples" in the results particularly near steep gradients. Lower order schemes +produce no ripples but suffer from excessive numerical diffusion. Flux-corrected transport (FCT) is a technique which embodies the best of both schemes. -The implementation of a monotonic flux-corrected transport (FCT) in Omega follows a standard algorithm as given in +The implementation of a monotonic flux-corrected transport (FCT) in Omega follows a standard algorithm as given in -Zalesak, S. T. (1979). Fully multidimensional flux-corrected transport algorithms for fluids. +Zalesak, S. T. (1979). Fully multidimensional flux-corrected transport algorithms for fluids. Journal of Computational Physics, 31(3), 335–362. DOI: 10.1016/0021-9991(79)90051-2 The procedure is as follows given the notation above: -1. Compute $F^L_{i+1/2}(u\psi)$, the transportive flux by some low order scheme guarenteed to give +1. Compute $F^L_{i+1/2}(u\psi)$, the transportive flux by some low order scheme guarenteed to give monotonic (ripple-free) results. 2. Compute $F^H_{i+1/2}(u\psi)$, the transportative flux by some high order scheme. 3. Define the "antififfusive flux": $$ -A_{i+1/2}(u\psi) = F^H_{i+1/2}(u\psi) - F^L_{i+1/2}(u\psi) +A_{i+1/2}(u\psi) = F^H_{i+1/2}(u\psi) - F^L_{i+1/2}(u\psi) $$ 4. Compute the updated low order ("transported and diffused") "td" solution: $$ - w^{td}_i = w^n_i - \frac{1}{\Delta x}[F_{i+1/2}(u\psi) - F_{i-1/2}(u\psi)] + w^{td}_i = w^n_i - \frac{1}{\Delta x}[F_{i+1/2}(u\psi) - F_{i-1/2}(u\psi)] $$ -5. Limit he $A_{i+1/2}(u\psi)$ in a manner such that $w^{n+1}$ as computed below is free of extrema +5. Limit he $A_{i+1/2}(u\psi)$ in a manner such that $w^{n+1}$ as computed below is free of extrema not found in $w^{td}$ = $w^n$; $$ A^C_{i+1/2}(u\psi) = C_{i+1/2}(u\psi) A_{i+1/2}(u\psi), \quad \quad 0 \leq C_{i+1/2} \leq 1 $$ 6. Finally apply hte limited antidiffusive fluxes: $$ - w^{n+1}_i = w^{td}_i - \frac{1}{\Delta x}[A^C_{i+1/2}(u\psi) - A^C_{i-1/2}(u\psi)] + w^{n+1}_i = w^{td}_i - \frac{1}{\Delta x}[A^C_{i+1/2}(u\psi) - A^C_{i-1/2}(u\psi)] $$ From 9060652be07e1f5b091cdfaa51651b05f38f82f1 Mon Sep 17 00:00:00 2001 From: James Overfelt Date: Wed, 8 Jul 2026 07:19:58 -0600 Subject: [PATCH 28/32] Fixes after rebase to develop --- components/omega/src/ocn/TendencyTerms.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/components/omega/src/ocn/TendencyTerms.cpp b/components/omega/src/ocn/TendencyTerms.cpp index 22878a5ca82d..c0a07548f1ef 100644 --- a/components/omega/src/ocn/TendencyTerms.cpp +++ b/components/omega/src/ocn/TendencyTerms.cpp @@ -183,7 +183,6 @@ void TracerHorzAdvOnCell::init() { ActiveTracerHorizontalAdvectionTendency = Array3DReal("FCTActiveTracerHorizontalAdvectionTendency", NTracers, NCellsAll, NVertLayers); - const Real FillValueReal = -9.99e30; const int NDims = 1; const std::string GroupName = "AuxiliaryState"; std::vector FluxDimNames(NDims, "NEdges"); @@ -195,7 +194,6 @@ void TracerHorzAdvOnCell::init() { "", // CF standard Name 0, // min valid value std::numeric_limits::max(), // max valid value - FillValueReal, // scalar for undefined entries NDims, // number of dimensions FluxDimNames // dimension names ); @@ -211,9 +209,7 @@ void TracerHorzAdvOnCell::init() { "", // units "", // CF standard Name 0, // min valid value - std::numeric_limits::max(), // max valid - // value - FillValueReal, // scalar for undefined entries + std::numeric_limits::max(), // max valid value NDims, // number of dimensions TendDimNames // dimension names ); From 1b66468c1d6d2217cc72e9139023e36d325b53a5 Mon Sep 17 00:00:00 2001 From: James Overfelt Date: Wed, 8 Jul 2026 07:20:31 -0600 Subject: [PATCH 29/32] Clang format --- components/omega/src/ocn/TendencyTerms.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/omega/src/ocn/TendencyTerms.cpp b/components/omega/src/ocn/TendencyTerms.cpp index c0a07548f1ef..e08a70e37749 100644 --- a/components/omega/src/ocn/TendencyTerms.cpp +++ b/components/omega/src/ocn/TendencyTerms.cpp @@ -210,8 +210,8 @@ void TracerHorzAdvOnCell::init() { "", // CF standard Name 0, // min valid value std::numeric_limits::max(), // max valid value - NDims, // number of dimensions - TendDimNames // dimension names + NDims, // number of dimensions + TendDimNames // dimension names ); BudgetAdvectionCellTend->attachData( ActiveTracerHorizontalAdvectionTendency); From 59901653a1fc37968c3e74b6a5f453c428babec5 Mon Sep 17 00:00:00 2001 From: James Overfelt Date: Wed, 8 Jul 2026 12:19:58 -0600 Subject: [PATCH 30/32] Add FCT convergence plot. --- .../omega/doc/userGuide/TendencyTerms.md | 7 +++++++ ...order_tracer_convergence_on_sphere_FCT.jpeg | Bin 0 -> 399978 bytes 2 files changed, 7 insertions(+) create mode 100644 components/omega/doc/userGuide/images/higher_order_tracer_convergence_on_sphere_FCT.jpeg diff --git a/components/omega/doc/userGuide/TendencyTerms.md b/components/omega/doc/userGuide/TendencyTerms.md index d72a81cedb7c..81ae406019a0 100644 --- a/components/omega/doc/userGuide/TendencyTerms.md +++ b/components/omega/doc/userGuide/TendencyTerms.md @@ -176,6 +176,13 @@ $$ $$ +```{figure} images/higher_order_tracer_convergence_on_sphere_FCT.jpeg +:name: tracer-higher-order-convergence_FCT +:align: center +:width: 600 px +Tracer higer order convergence example of a cosine bell advected on a sphere with FCT showing an order 2.23 convergence rate +``` + ## See Also diff --git a/components/omega/doc/userGuide/images/higher_order_tracer_convergence_on_sphere_FCT.jpeg b/components/omega/doc/userGuide/images/higher_order_tracer_convergence_on_sphere_FCT.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..4f55571646108f11a4bf3713a59a7fa0da93053d GIT binary patch literal 399978 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⩔n*XInNAEirt{2g| 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 RG>s3X_!@O9>G|>hO#so4ghc=V literal 0 HcmV?d00001 From 955b12e124e96d75945a2f5f29ebfb24d010379d Mon Sep 17 00:00:00 2001 From: James Overfelt Date: Thu, 9 Jul 2026 08:47:01 -0600 Subject: [PATCH 31/32] Documentation updates. --- components/omega/doc/design/Tendencies.md | 17 ++++++++++++++--- components/omega/doc/devGuide/TendencyTerms.md | 1 - components/omega/doc/userGuide/TendencyTerms.md | 13 +++++++++++-- components/omega/src/ocn/TendencyTerms.cpp | 2 ++ 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/components/omega/doc/design/Tendencies.md b/components/omega/doc/design/Tendencies.md index cfc5e00ca364..89d2b6bf86c1 100644 --- a/components/omega/doc/design/Tendencies.md +++ b/components/omega/doc/design/Tendencies.md @@ -52,11 +52,22 @@ class Tendencies{ VelocityHyperDiffOnEdge VelocityHyperDiff; SfcStressForcingOnEdge SfcStressForcing; BottomDragOnEdge BottomDrag; + TracerHorzAdvOnCell TracerHorzAdv; TracerDiffOnCell TracerDiffusion; TracerHyperDiffOnCell TracerHyperDiff; - TracerHorzAdvOnCell TracerHorzAdv; - TracerHighOrderHorzAdvOnCell TracerHighOrderHorzAdv; + SurfaceTracerRestoringOnCell SurfaceTracerRestoring; + private: + const HorzMesh *Mesh; ///< Pointer to horizontal mesh + VertCoord *VCoord; ///< Pointer to vertical coordinate + VertAdv *VAdv; ///< Pointer to vertical advection + CustomTendencyType CustomThicknessTend; + CustomTendencyType CustomVelocityTend; + Eos *EqState; ///< Pointer to equation of state + PressureGrad *PGrad; ///< Pointer to pressure gradient + VertMix *VMix; ///< Pointer to vertical mixing + I4 NTracers; ///< Number of tracers + TimeInterval TimeStep; ///< Time step static Tendencies *DefaultTendencies; static std::map> AllTendencies; }; @@ -106,7 +117,7 @@ void Tendencies::computeAllTendencies(const OceanState *State, const AuxilarySta ``` The layer thickness tendencies will be computed with a method: ```c++ -void Tendencies::computeThicknessTendencies(const OceanState *State, const AuxilaryState *AuxState, int TimeLevel, int VelTimeLevel, TimeInstant Time); +void Tendencies::computePseudoThicknessTendencies(const OceanState *State, const AuxilaryState *AuxState, int TimeLevel, int VelTimeLevel, TimeInstant Time); ``` The normal velocity tendencies will be computed with a method: ```c++ diff --git a/components/omega/doc/devGuide/TendencyTerms.md b/components/omega/doc/devGuide/TendencyTerms.md index 5fa72197132f..aa99ac309ea4 100644 --- a/components/omega/doc/devGuide/TendencyTerms.md +++ b/components/omega/doc/devGuide/TendencyTerms.md @@ -38,7 +38,6 @@ implemented: - `SfcStressForcingOnEdge` - `BottomDragOnEdge` - `TracerHorzAdvOnCell` -- `TracerHighOrderHorzAdvOnCell` - `TracerDiffOnCell` - `TracerHyperDiffOnCell` - `SurfaceTracerRestoringOnCell` diff --git a/components/omega/doc/userGuide/TendencyTerms.md b/components/omega/doc/userGuide/TendencyTerms.md index 81ae406019a0..f6a20ec5c3a7 100644 --- a/components/omega/doc/userGuide/TendencyTerms.md +++ b/components/omega/doc/userGuide/TendencyTerms.md @@ -15,7 +15,6 @@ tendency terms are currently implemented: | VelocityDiffusionOnEdge | Laplacian horizontal mixing, defined on edges | VelocityHyperDiffOnEdge | biharmonic horizontal mixing, defined on edges | TracerHorzAdvOnCell | horizontal advection of thickness-weighted tracers -| TracerHighOrderHorzAdvOnCell | second order horizontal advection of thickness-weighted tracers | TracerDiffOnCell | horizontal diffusion of thickness-weighted tracers | TracerHyperDiffOnCell | biharmonic horizontal mixing of thickness-weighted tracers | SfcStressForcingOnEdge | forcing by surface stress (e.g. wind), defined on edges @@ -46,7 +45,6 @@ the currently available tendency terms: | | DivFactor | scale factor for the divergence term | TracerHorzAdvOnCell | TracerHorzAdvTendencyEnable | enable/disable term | | HorzTracerFluxOrder | 2 for standard linear advection -| TracerHighOrderHorzAdvOnCell | TracerHorzAdvTendencyEnable | enable/disable term | | HorzTracerFluxOrder | 3 for second order advection algorithm | | HorzTracerFluxLimiterEnable | enable/disable monotonic flux corrected transport (FCT) | | HorzTracerFluxLimiterBudgetsEnable | enable/disable budgets if FCT is enabled @@ -184,6 +182,17 @@ Tracer higer order convergence example of a cosine bell advected on a sphere wit ``` +When monotonic flux limiting is used then there are two diagnostic options that can be enabled, +HorzTracerFluxLimiterBudgetsEnable and HorzTracerFluxLimiterMonotonicityCheckEnable. The +HorzTracerFluxLimiterMonotonicityCheckEnable flag enables a post-transport check that the +resulting values are indeed monotone as required by the algorithm and any discrepancies are +printed along with information on where they occur. + +The HorzTracerFluxLimiterBudgetsEnable option enables the output of two diagnostic fields to the +output mesh file. One is the "FCTActiveTracerHorizontalAdvectionEdgeFlux" variable which is the +edge flux across every side of every element. The other is the "FCTActiveTracerHorizontalAdvectionTendency" +variable which is the cell-centered value of the advection tendency. + ## See Also Additional information on forcing (currently wind forcing and surface tracer diff --git a/components/omega/src/ocn/TendencyTerms.cpp b/components/omega/src/ocn/TendencyTerms.cpp index e08a70e37749..abefbe7be16f 100644 --- a/components/omega/src/ocn/TendencyTerms.cpp +++ b/components/omega/src/ocn/TendencyTerms.cpp @@ -183,6 +183,8 @@ void TracerHorzAdvOnCell::init() { ActiveTracerHorizontalAdvectionTendency = Array3DReal("FCTActiveTracerHorizontalAdvectionTendency", NTracers, NCellsAll, NVertLayers); + deepCopy(ActiveTracerHorizontalAdvectionEdgeFlux, 0.0); + deepCopy(ActiveTracerHorizontalAdvectionTendency, 0.0); const int NDims = 1; const std::string GroupName = "AuxiliaryState"; std::vector FluxDimNames(NDims, "NEdges"); From ee604d558fbe1c38bb5e9642d62158cac78a24e4 Mon Sep 17 00:00:00 2001 From: James Overfelt Date: Fri, 10 Jul 2026 07:40:53 -0600 Subject: [PATCH 32/32] Start adding unit tests for horizontal FCT transport. --- components/omega/src/ocn/TendencyTerms.h | 17 +-- .../omega/test/ocn/TendencyTermsTest.cpp | 134 +++++++++++++++++- 2 files changed, 137 insertions(+), 14 deletions(-) diff --git a/components/omega/src/ocn/TendencyTerms.h b/components/omega/src/ocn/TendencyTerms.h index 7fbf809f2c2d..756c360a2f11 100644 --- a/components/omega/src/ocn/TendencyTerms.h +++ b/components/omega/src/ocn/TendencyTerms.h @@ -370,21 +370,14 @@ class TracerHorzAdvOnCell { public: bool Enabled = true; bool ForceLowOrder = false; - bool FCT = true; + bool FCT = false; bool ComputeBudgets = false; bool MonotonicityCheck = false; // coefficient for blending high-order terms Real Coef3rdOrder = 0.25; TracerHorzAdvOnCell(const HorzMesh *Mesh, const VertCoord *VCoord, const VertAdv *VAdv); -#if (0) - ~TracerHorzAdvOnCell() { - if (ComputeBudgets) { - Field::destroy(ActiveTracerHorizontalAdvectionEdgeFlux.label()); - Field::destroy(ActiveTracerHorizontalAdvectionTendency.label()); - } - } -#endif + virtual ~TracerHorzAdvOnCell() {} void init(); KOKKOS_FUNCTION void operator()(const I4 L, const I4 IEdge, const I4 KChunk, const Array3DReal &TracerCell, @@ -489,8 +482,8 @@ class TracerHorzAdvOnCell { TracerCur(ICell, K) = TracerArray(L, ICell, K); } KOKKOS_FUNCTION void FCTTracerMinMax(const I4 ICell, const I4 KChunk, - const Array1DI4 MinLayerCell, - const Array1DI4 MaxLayerCell) const { + const Array1DI4 &MinLayerCell, + const Array1DI4 &MaxLayerCell) const { const I4 KStart = KChunk * VecLength; const I4 KEnd = KStart + VecLength; @@ -729,7 +722,7 @@ class TracerHorzAdvOnCell { } } - private: + protected: const Real Eps = 1.e-10_Real; const HorzMesh *HorzontalMesh; const VertCoord *VerticalCoord; diff --git a/components/omega/test/ocn/TendencyTermsTest.cpp b/components/omega/test/ocn/TendencyTermsTest.cpp index 5592f1548f70..b12d8bc43dce 100644 --- a/components/omega/test/ocn/TendencyTermsTest.cpp +++ b/components/omega/test/ocn/TendencyTermsTest.cpp @@ -56,6 +56,7 @@ struct TestSetupPlane { 0.00134324628763667899}; ErrorMeasures ExpectedTrHAdvErrors = {0.0029211089892916243, 0.0024583038518548855}; + ErrorMeasures ExpectedFCTTracerHorzAdvErrors = {0.00, 0.00}; ErrorMeasures ExpectedTrDel2Errors = {0.00334357193650093847, 0.00290978146207349032}; ErrorMeasures ExpectedTrDel4Errors = {0.00508833446725232875, @@ -196,6 +197,7 @@ struct TestSetupSphere { 0.270546491554748}; ErrorMeasures ExpectedTrHAdvErrors = {0.013259410329645643, 0.004094907022292395}; + ErrorMeasures ExpectedFCTTracerHorzAdvErrors = {0.00, 0.00}; ErrorMeasures ExpectedTrDel2Errors = {0.04865718541236144, 0.005105510870642706}; ErrorMeasures ExpectedTrDel4Errors = {0.0008646345116716073, @@ -848,7 +850,6 @@ int testTracerHorzAdvOnCell(int NVertLayers, int NTracers, Real RTol) { I4 Err = 0; TestSetup Setup; - const auto Mesh = HorzMesh::getDefault(); const auto VCoord = VertCoord::getDefault(); @@ -887,7 +888,6 @@ int testTracerHorzAdvOnCell(int NVertLayers, int NTracers, Real RTol) { VertAdv::init(); const auto VAdv = VertAdv::getDefault(); - VertAdv::clear(); TracerHorzAdvOnCell TrHorzAdvOnC(Mesh, VCoord, VAdv); TrHorzAdvOnC.ForceLowOrder = true; @@ -899,11 +899,13 @@ int testTracerHorzAdvOnCell(int NVertLayers, int NTracers, Real RTol) { TrHorzAdvOnC(L, IEdge, KLayer, TrCell, ThickEdge, NormalVelocity); }); + Kokkos::fence(); parallelFor( {NTracers, Mesh->NCellsOwned, NVertLayers}, KOKKOS_LAMBDA(int L, int ICell, int KLayer) { TrHorzAdvOnC(NumTrFluxDiv, L, ICell, KLayer); }); + Kokkos::fence(); ErrorMeasures TrHAdvErrors; Err += @@ -916,6 +918,132 @@ int testTracerHorzAdvOnCell(int NVertLayers, int NTracers, Real RTol) { LOG_INFO("TendencyTermsTest: TracerHorzAdv PASS"); } + VertAdv::clear(); + return Err; +} // end testTracerHorzAdvOnCell + +int testFCTTracerHorzAdvOnCell(int NVertLayers, int NTracers, Real RTol) { + + class TracerHorzAdvOnCellTest : public TracerHorzAdvOnCell { + public: + TracerHorzAdvOnCellTest(const HorzMesh *Mesh, const VertCoord *VCoord, + const VertAdv *VAdv) + : TracerHorzAdvOnCell(Mesh, VCoord, VAdv){}; + Array2DReal GetHProvInv() { return HProvInv; }; + Array2DReal GetHProv() { return HProv; }; + Array2DReal GetHNewInv() { return HNewInv; }; + Array2DReal GetTracerCur() { return TracerCur; }; + }; + + I4 Err = 0; + TestSetup Setup; + const auto Mesh = HorzMesh::getDefault(); + const auto VCoord = VertCoord::getDefault(); + + // Compute exact result + Array3DReal ExactTrFluxDiv("ExactTrFluxDiv", NTracers, Mesh->NCellsOwned, + NVertLayers); + + Err += setScalar( + KOKKOS_LAMBDA(Real X, Real Y) { return Setup.tracerFluxDiv(X, Y); }, + ExactTrFluxDiv, Geom, Mesh, OnCell, ExchangeHalos::No); + + // Set input arrays + Array2DReal NormalVelocity("NormalVelocity", Mesh->NEdgesSize, NVertLayers); + + Err += setVectorEdge( + KOKKOS_LAMBDA(Real(&VecField)[2], Real X, Real Y) { + VecField[0] = Setup.vectorX(X, Y); + VecField[1] = Setup.vectorY(X, Y); + }, + NormalVelocity, EdgeComponent::Normal, Geom, Mesh); + + Array3DReal TrCell("TrCell", NTracers, Mesh->NCellsSize, NVertLayers); + Array2DReal FluxPseudoThickEdge("FluxPseudoThickEdge", Mesh->NEdgesSize, + NVertLayers); + Array2DReal LayerThickness("LayerThickness", Mesh->NCellsSize, NVertLayers); + Array2DReal NormVelEdge("NormVelEdge", Mesh->NEdgesSize, NVertLayers); + Array2DReal HProvInvExact("HProvInvExact", Mesh->NCellsSize, NVertLayers); + Array2DReal HProvExact("HProvExact", Mesh->NCellsSize, NVertLayers); + Array2DReal HNewInvExact("HProvExact", Mesh->NCellsSize, NVertLayers); + Array2DReal TracerSubView("TracerSubView", Mesh->NCellsSize, NVertLayers); + + Err += setScalar( + KOKKOS_LAMBDA(Real X, Real Y) { return -Setup.pseudoThick(X, Y); }, + TrCell, Geom, Mesh, OnCell); + + deepCopy(FluxPseudoThickEdge, 1._Real); + deepCopy(LayerThickness, 1._Real); + deepCopy(HProvExact, 1._Real); + deepCopy(HProvInvExact, 1._Real); + deepCopy(HNewInvExact, 1._Real); + deepCopy(NormVelEdge, 1._Real); + + // Compute numerical result + Array3DReal NumTrFluxDiv("NumTrFluxDiv", NTracers, Mesh->NCellsOwned, + NVertLayers); + + VertAdv::init(); + const auto VAdv = VertAdv::getDefault(); + deepCopy(VAdv->VerticalPseudoVelocity, 10._Real); + + TracerHorzAdvOnCellTest TrHorzAdvOnC(Mesh, VCoord, VAdv); + TrHorzAdvOnC.ForceLowOrder = false; + TrHorzAdvOnC.FCT = true; + TrHorzAdvOnC.init(); + + const Real Dt = 1; + parallelFor( + {Mesh->NCellsOwned, NVertLayers}, KOKKOS_LAMBDA(int ICell, int KLayer) { + TrHorzAdvOnC.FCTProvisionaLayerThicknesses( + ICell, KLayer, Dt, FluxPseudoThickEdge, LayerThickness, + NormVelEdge); + }); + Kokkos::fence(); + + const auto HProvInv = TrHorzAdvOnC.GetHProvInv(); + const auto HProv = TrHorzAdvOnC.GetHProv(); + const auto HNewInv = TrHorzAdvOnC.GetHNewInv(); + // for (int i=0; iNCellsOwned; ++i) + // for (int j=0; jNCellsOwned, NVertLayers}, + KOKKOS_LAMBDA(int ICell, int KLayer) { + TrHorzAdvOnC.FCTTracerCurFill(L, ICell, KLayer, TrCell); + }); + const auto TracerCur = TrHorzAdvOnC.GetTracerCur(); + const auto Tracers = Kokkos::subview(TrCell, L, Kokkos::ALL, Kokkos::ALL); + deepCopy(TracerSubView, Tracers); + Err += computeErrors(FCTTracerHorzAdvErrors, TracerCur, TracerSubView, + Mesh, OnCell); + Err += + checkErrors("TendencyTermsTest", "TracerCur", FCTTracerHorzAdvErrors, + Setup.ExpectedFCTTracerHorzAdvErrors, RTol); + } + + if (Err == 0) { + LOG_INFO("TendencyTermsTest: FCTTracerHorzAdv PASS"); + } + + VertAdv::clear(); return Err; } // end testTracerHorzAdvOnCell @@ -1222,6 +1350,8 @@ int tendencyTermsTest(const std::string &MeshFile = DefaultMeshFile) { Err += testTracerHorzAdvOnCell(NVertLayers, NTracers, RTol); + Err += testFCTTracerHorzAdvOnCell(NVertLayers, NTracers, RTol); + Err += testTracerDiffOnCell(NVertLayers, NTracers, RTol); Err += testTracerHyperDiffOnCell(NVertLayers, NTracers, RTol);