Skip to content

add KPP mixing - #512

Merged
sbrus89 merged 42 commits into
E3SM-Project:developfrom
vanroekel:vanroekel/omega/kpp-final
Oct 6, 2026
Merged

sbrus89 merged 42 commits into
E3SM-Project:developfrom
vanroekel:vanroekel/omega/kpp-final

Conversation

@vanroekel

@vanroekel vanroekel commented Aug 13, 2026 •

Copy link
Copy Markdown
Collaborator

This PR adds the mixing scheme of Large et al (1994), the K-Profile Parameterization (KPP) to omega. It includes the local and non-local components and theory wave langmuir mixing. The code

  1. computes the boundary layer depth in a manner similar to MPAS-Ocean and CVMix including boundary layer base search with quadratic interpolation
  2. computes a surface layer average consistent with MPAS-Ocean
  3. implements non-local forcing split from the implicit solve as is common
  4. It merges mixing coefficients from each parameterization (background, convection, shear instability driven mixing) similarly to mpas-ocean

The bulk of the code is written through co-pilot with physics guidance and corrections by me.

Checklist

  • Documentation:

  • Linting

  • Building

    • CMake build does not produce any new warnings from changes in this PR
  • Testing

    aurora, oneapi-ifx, mpich

    • CTests Pass
    • Polaris omega_pr Pass

    chrysalis, oneapi-ifx, openmpi

    • CTests Pass
    • Polaris omega_pr Pass

    frontier, craygnu, mpich

    • CTests Pass
    • Polaris omega_pr Pass

    frontier, craygnu-mphipcc, mpich

    • CTests Pass
    • Polaris omega_pr Pass

    pm-cpu, gnu, mpich

    • CTests Pass
    • Polaris omega_pr Pass

    pm-gpu, gnugpu, mpich

    • CTests Pass
    • Polaris omega_pr Pass
  • New tests:

    • CTest unit tests for new features have been added per the approved design.
    • Polaris tests for new features have been added per the approved design (and included in a test suite)

@vanroekel

Copy link
Copy Markdown
Collaborator Author

This PR is rebased on #461 so it has extra changes. Anything related to forcing can be ignored here

@katsmith133 katsmith133 left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice job on this @vanroekel! This must have been a lot of work.

This was just my first pass as this was a lot of code to go through, but its a place to start. I think in addition to the specific comments I made below, some commenting throughout the KPP guts would be helpful for me to review more in depth. There are a lot of variable names that are ambiguous, so I am not sure what is being calculated. I haven't done the job of going back and forth between the CVMix code and this code to make sure its all of the guts are exactly correct. I think the single column testing might actually do a better job of catching those or letting us know there is a problem with them in the first place. More so I looked at how everything (functions, variables, etc) was being used and passed around from a higher level.

Also, a lot of the variable names don't conform to the Omega standard. I'm guessing because they were direct variable name ports from CVMix?

Lastly... I think @mwarusz input on how things are called from a computational perspective will be super helpful here as it was a lot for me to go through and I am sure I did not catch those things.

Comment thread components/omega/doc/design/KPPMix.md Outdated
Comment thread components/omega/doc/userGuide/KPPMix.md
Comment thread components/omega/doc/devGuide/KPPMix.md
Comment thread components/omega/doc/userGuide/KPPMix.md Outdated
Comment thread components/omega/doc/devGuide/KPPMix.md
Comment thread components/omega/src/ocn/Tendencies.cpp Outdated
Comment thread components/omega/src/ocn/Tendencies.cpp Outdated
Comment thread components/omega/src/ocn/Tendencies.cpp Outdated

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What was the reason for moving this to the .cpp side? And was the equivalent code in VertMix.h removed?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was a mistake in a copilot PR, I'm working to fix this now

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually what is 'this'? I see some computation here but I think that was added in the tendency hookup not in this PR. I just added to it.

Comment thread components/omega/src/ocn/VertMix.cpp
Comment thread components/omega/src/ocn/KPPMix.cpp Outdated
@mark-petersen

mark-petersen commented Aug 26, 2026 •

Copy link
Copy Markdown
Collaborator

This KPP branch works great on the SOMA test case!

SOMA after 4 months, 32km resolution. RK4 with 2 min timestep, viscosity del4 of 2e11. No explicit tracer diffusion.
Omega No KPP
image
MPAS-Ocean No KPP
image

The instability creeps northward from the southern boundary where cooler water is being advected upwards.

KPP saves the day! Using this branch with linear EOS on both (but JM/TEOS10 looks the same)
Omega with KPP
image
MPAS-O with KPP
image

I used default KPP flags in both models. Thank you @vanroekel for this addition! Thanks to @hyungyukang for his consultation to get this working.

@mark-petersen

Copy link
Copy Markdown
Collaborator

You should remove these. They are printing with every RHS compute

KPPMix.cpp:922:   LOG_INFO("KPPMix::computeOBLDepth: OBL depth computed");
KPPMix.cpp:1245:   LOG_INFO("KPPMix::computeMixingCoefficients: Phase 2 mixing coefficients "

@vanroekel
vanroekel force-pushed the vanroekel/omega/kpp-final branch from 6ccf433 to de1c24d Compare September 3, 2026 13:49
@xylar

xylar commented Sep 4, 2026 •

Copy link
Copy Markdown

@vanroekel, can you check this?

$ which clang-format
/gpfs/fs1/home/ac.xylar/chrysalis/miniforge3/envs/omega_dev/bin/clang-format
$ clang-format --version
clang-format version 18.1.8 (https://github.com/conda-forge/clangdev-feedstock 3c15221e001c9fe87fcc807876aa06d599616b01)

@xylar

xylar commented Sep 4, 2026 •

Copy link
Copy Markdown

Claude says that your results are consistent with running clang-format 22.x but that's not what we use in the omega dev environment, we're pinned to 18.1.x:
https://github.com/E3SM-Project/Omega/blob/develop/components/omega/dev-conda.txt#L11

@xylar

xylar commented Sep 4, 2026

Copy link
Copy Markdown

The next CI issue is related to the docs.

@vanroekel

Copy link
Copy Markdown
Collaborator Author

@xylar thanks for looking into this. I definitely thought was the version. I had regenerated with 18.1.8 and it still showed no issue, but just did it again and I see the fail in lint. Should I fix that here even though it's not touched in this PR? or should I make a separate PR to fix the linting issue?

@vanroekel

Copy link
Copy Markdown
Collaborator Author

I'm happy to do either.

@xylar

xylar commented Sep 4, 2026

Copy link
Copy Markdown

@vanroekel, if there's a lint problem here and it isn't from a file you charged, a rebase must fix it. We don't have lint problems on develop.

I'll give it another look over the weekend.

@vanroekel
vanroekel force-pushed the vanroekel/omega/kpp-final branch from 5b7db4f to 287a9e4 Compare September 4, 2026 20:25
@xylar

xylar commented Sep 4, 2026

Copy link
Copy Markdown

@vanroekel, I see what you mean. You changed the time stepping file but not that part. How strange!

We should fix this elsewhere first.

@vanroekel

Copy link
Copy Markdown
Collaborator Author

Okay very weird, but after a rebase, those lines do show up as changed by claude in one of the KPP commits. I don't understand why or how, but I went ahead and fixed the linting and pushed

@mwarusz mwarusz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a big PR and I am still digesting it, but I have a few initial comments.

I also have been thinking how to make the time stepping sequence a bit better for parametrizations that are called once per step, either at the start or end of the step . My rough idea is to refactor doStep to do the following:

  1. doStepStart - common for all time steppers

    • prescribeState
    • compute all auxiliary vars
    • compute KPP and maybe submesoscale eddies if we decide to compute it only once, like MPAS-O does
  2. doStepMain - depends on time stepper

    • mostly the same as before, except, in the first stage, it can assume that all auxiliary variables have been computed, and hence it can use the computeXTendenciesOnly functions
  3. doStepFinish - common for all time steppers

    • implicit vertical mixing

@hyungyukang
What do you think of this plan ?

Comment thread components/omega/src/ocn/TendencyTerms.h Outdated
Comment thread components/omega/src/ocn/Tendencies.h Outdated
Comment thread components/omega/src/ocn/Tendencies.h Outdated
// Called once per time step by the active time stepper.
void computeKPPFields(const OceanState *State,
const Array3DReal &TracerArray, int ThickTimeLevel,
int VelTimeLevel);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here, why isn't this just a method of the KPP class.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is still in Tendencies.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

okay I think i got claude to finally move it. It's now in KPPMix.h as updateKPPFields

Comment thread components/omega/src/ocn/TendencyTerms.h Outdated
Comment thread components/omega/src/ocn/TendencyTerms.h Outdated
Comment thread components/omega/src/ocn/KPPMix.cpp
Comment thread components/omega/src/ocn/KPPMix.cpp Outdated
Comment thread components/omega/src/ocn/KPPMix.cpp Outdated
Comment thread components/omega/src/ocn/KPPMix.cpp Outdated
Comment thread components/omega/src/ocn/KPPMix.cpp Outdated
@xylar

xylar commented Sep 4, 2026

Copy link
Copy Markdown

I had Claude push a fix, so that's why.

@vanroekel vanroekel changed the title [WIP] add KPP mixing add KPP mixing Sep 8, 2026
@vanroekel

Copy link
Copy Markdown
Collaborator Author

@mwarusz and @katsmith133 this should be ready for review again. I think all comments are addressed. I'm going to start testing again on the various machines.

@vanroekel

Copy link
Copy Markdown
Collaborator Author

@katsmith133 - I still have one comment left from you I wasn't sure what you were asking about in it.

@mwarusz mwarusz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have a few more comments. I also reopened two of my previous comments, since they don't seem to be resolved. Moreover, the current version of this branch doesn't compile for me. @vanroekel are you sure you pushed all of your fixes ?

One general issue I noticed is that Claude (I assume) is adding a lot of checks for conditions that can never happen on a valid Omega mesh. I highlighted some of them, but there are probably more. Most of the time it is hard to figure out which checks and index clamps are actually necessary.

Comment thread components/omega/src/ocn/KPPMix.h Outdated
Comment on lines +228 to +229
// Edge weights are the MPAS kite areas (0.25*dc*dv) normalized by
// the cell area.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this comment is misleading. 0.25*dc*dv is the area of triangle formed by cell center and edge vertices. "kite areas" makes me think of KiteAreasOnVertex, which the code is not using.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

changed

Comment thread components/omega/src/ocn/KPPMix.h Outdated
Comment on lines +231 to +232
const I4 NEdges = NEdgesOnCell(ICell);
const I4 NEdgesEff = Kokkos::min(NEdges, I4(MaxEdgesBound));

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If MaxEdgesBound is a bound on the number of edges then NEdgesEff == NEdges always, and we don't need both variables.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree, removed

Comment thread components/omega/src/ocn/KPPMix.h Outdated
Comment on lines +247 to +260
if (NEdgesEff > 0) {
Real SumW = 0.0_Real;
for (I4 J = 0; J < NEdgesEff; ++J) {
if (EdgeValid[J]) {
SumW += EdgeWeights[J];
}
}
const Real InvSumW = 1.0_Real / SumW;
for (I4 J = 0; J < NEdgesEff; ++J) {
if (EdgeValid[J]) {
EdgeWeights[J] *= InvSumW;
}
}
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we want to do this. I believe that 0.25_Real * DcEdge(IEdge) * DvEdge(IEdge) * InvAreaCell is already the correct normalized weight for edge to cell interpolation.

Suggested change
if (NEdgesEff > 0) {
Real SumW = 0.0_Real;
for (I4 J = 0; J < NEdgesEff; ++J) {
if (EdgeValid[J]) {
SumW += EdgeWeights[J];
}
}
const Real InvSumW = 1.0_Real / SumW;
for (I4 J = 0; J < NEdgesEff; ++J) {
if (EdgeValid[J]) {
EdgeWeights[J] *= InvSumW;
}
}
}

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes this is odd. looks like it is computing the sum of the weights which is weird given the invAreaCell, this is removed

Comment on lines +110 to +112
/// Compile-time upper bound on MaxEdges, for sizing on-stack (per-thread)
/// arrays in device kernels. Meshes with more edges per cell are rejected.
static constexpr I4 MaxEdgesBound = 10;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Despite what the comment says, I don't see a check for this in HorzMesh. There is one in tracer advection, but only if this tendency term is enabled. Let's move this check into HorzMesh.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe this should be moved now

Comment thread components/omega/src/ocn/KPPMix.h Outdated
Comment on lines +235 to +236
const Real InvAreaCell =
1.0_Real / Kokkos::fmax(AreaCell(ICell), KPP::Tiny);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think any valid mesh has cell areas smaller than 1e-20.

Suggested change
const Real InvAreaCell =
1.0_Real / Kokkos::fmax(AreaCell(ICell), KPP::Tiny);
const Real InvAreaCell =
1.0_Real / AreaCell(ICell);

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes this is crazy, this guard is removed.

Comment thread components/omega/src/ocn/KPPMix.h Outdated

// Resolved shear |V_r - V(d)|^2, averaged over the cell edges
Real DeltaVSq = 0.0_Real;
if (NEdges > 0) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A valid mesh cannot have cells with zero edges.

Suggested change
if (NEdges > 0) {

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

similarly removed

Comment thread components/omega/src/ocn/KPPMix.h Outdated
Comment on lines +597 to +604
if (INeighbor == NCellsAll) {
continue;
}

const I4 KMinNbr = MinLayerCell(INeighbor);
if (KMinNbr < 0 || KMinNbr >= NVertLayers) {
continue;
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe the first check is enough to handle horizontal boundaries.

Suggested change
if (INeighbor == NCellsAll) {
continue;
}
const I4 KMinNbr = MinLayerCell(INeighbor);
if (KMinNbr < 0 || KMinNbr >= NVertLayers) {
continue;
}
if (INeighbor == NCellsAll) {
continue;
}

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, not needed for a 2-D field smoothing, removed

Comment thread components/omega/src/ocn/KPPMix.h Outdated
Comment on lines +646 to +648
if (KMin < 0 || KMax < KMin || KMin >= NVertLayers) {
return;
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't think this can ever happen.

Suggested change
if (KMin < 0 || KMax < KMin || KMin >= NVertLayers) {
return;
}

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, agreed. Vertical checks also not necessary for 2D field routines.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removed

Comment on lines +651 to +653
const bool IsValidCell =
KMin >= 0 && KMin < NVertLayers && KMax >= KMin;
if (IsValidCell && K >= KMin && K <= KMax + 1) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here.

Suggested change
const bool IsValidCell =
KMin >= 0 && KMin < NVertLayers && KMax >= KMin;
if (IsValidCell && K >= KMin && K <= KMax + 1) {
if (K >= KMin && K <= KMax + 1) {

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removed

@hyungyukang

hyungyukang commented Sep 9, 2026 •

Copy link
Copy Markdown

@hyungyukang
What do you think of this plan ?

@mwarusz , Sorry for the delayed response. I think that's a good idea. It would make it clearer where the physical parameterizations are applied in the time-stepping sequence, and I think it would also make the overall code structure cleaner.

This is not directly related to this PR, but during the refactoring, could we also address the time-lagged auxiliary variable issue? We could move the auxiliary variable computations to doStepFinish so that the auxiliary variables are always up to date before output. I was thinking of something like:

  • Before the time loop starts

    • compute all auxiliary vars
  • Time loop

    • doStepStart - common for all time steppers

      • prescribeState
      • compute KPP and maybe submesoscale eddies if we decide to compute it only once, like MPAS-O does
    • doStepMain - depends on time stepper

    • doStepFinish - common for all time steppers

      • compute all auxiliary vars
      • implicit vertical mixing

This is just a rough idea for now. We can discuss it further in another channel later.

@vanroekel

Copy link
Copy Markdown
Collaborator Author

Sorry @mwarusz something must have gone wrong in the push. I had seen computeKPPFields moved previously (and it compiled on pm-cpu/gpu). I'll look into it.

yes Co-pilot is very keen in protecting against things that never happen. I removed a number of them but see more to remove.

@mark-petersen

Copy link
Copy Markdown
Collaborator

I just merged #517. There are a number of conflicts between that branch and this one. I had previously tested KPP+SE Time Stepping using the merged branch remotes/hyungyukang/omega/se-time-stepper-kpp, (made by @hyungyukang). When you rebase this KPP branch, that will be a useful resource when you resolve conflicts.

@vanroekel

Copy link
Copy Markdown
Collaborator Author

Okay I think I addressed the comments. I also worked with copilot to remove unneeded guards, such as those guaranteed by a valid mesh, no vertical bounds checking in 2D loops, or cases that don't happen (e.g. AreaCell < 1e-20).

I'll look through the code more tomorrow to check for more places to streamline

The code builds okay for me on pm-cpu and pm-gpu

@mark-petersen

mark-petersen commented Sep 10, 2026 •

Copy link
Copy Markdown
Collaborator

With the current head 9c25f68, I get two cTest failures on perlmutter cpus with gnu.

96% tests passed, 2 tests failed out of 55

Label Time Summary:
Omega-0    =  69.25 sec*proc (54 tests)
SERIAL     =  69.25 sec*proc (54 tests)

Total Test time (real) =  70.08 sec

The following tests FAILED:
	 35 - DRIVER_TEST (Failed)
	 45 - KPP_OSBL_TEST (Failed)
Errors while running CTest

The driver test detects state validation failure after the first time step

[critical] [StateValidation.cpp:230] StateValidation: Temperature contains 21806 NaN value(s)
[critical] [StateValidation.cpp:252] StateValidation: Salinity contains 21806 NaN value(s)
[critical] [StateValidation.cpp:65] StateValidation: Ocean state validation aborting with 43612 NaNs and 0 OOBs.See critical messages above for details.

and I get this for the KPP OSBL test

info] [KPPMixTest.cpp:58] ------ KPP Mixing Unit Tests ------
[info] [TimeMgr.cpp:1127] Omega using calendar type: No Leap
[warning] [IOStream.cpp:545] Stream Forcing has IO frequency of never and will be skipped
[info] [IOStream.cpp:2487] Successfully read stream HorzMeshIn from file OmegaMesh.nc
[info] [KPPMix.cpp:920] KPPMix::defineFields: registered OSBLDepth, OSBLDepthIndex, VertNonLocalFlux, BulkRichardsonNumber, BulkRichardsonShear, UnresolvedShear, BuoyancyJump, TurbulentVelocityScale, PotentialDensity, SurfaceFrictionVelocity, SurfaceBuoyancyFlux
[warning] [KPPMix.cpp:237] KPPMix::init: KPP initialized enabled=true debugDiagnostics=false match=SimpleShapes
[info] [KPPMixTest.cpp:112] KPPMixTest: analytic boundary-layer depth PASS
[info] [KPPMixTest.cpp:112] KPPMixTest: boundary-layer linear interpolation PASS
[info] [KPPMixTest.cpp:112] KPPMixTest: boundary-layer partial wet column PASS
[critical] [KPPMixTest.cpp:110] KPPMixTest: boundary-layer resolved shear FAIL with 7153 errors
[critical] [Error.cpp:43] Omega aborting
Here is my command sequence:

module load python
export CODEDIR=opr
export CODEPATH=${HOME}/repos/E3SM/${CODEDIR}
export RUNDIR=test_omega_cpu-kppPR-260910

cd $CODEPATH
git submodule update --init --recursive externals/ekat externals/scorpio cime components/omega/external

module load cmake
mkdir ${PSCRATCH}/runs/$RUNDIR
cd ${PSCRATCH}/runs/$RUNDIR

rm -rf build
mkdir build
cd build

# compiler options are:
export compiler=gnu
#export compiler=nvidia # not working 250421

export PARMETIS_ROOT=/global/cfs/cdirs/e3sm/software/polaris/pm-cpu/spack/dev_polaris_1.1.0/var/spack/environments/spack_env_${compiler}_mpich/.spack-env/view
# nvidia or gnu compiler:
cmake \
   -DOMEGA_CIME_COMPILER=${compiler} \
   -DOMEGA_BUILD_TYPE=Release \
   -DOMEGA_CIME_MACHINE=pm-cpu \
   -DOMEGA_PARMETIS_ROOT=${PARMETIS_ROOT}\
   -DOMEGA_BUILD_TEST=ON \
   -DOMEGA_VECTOR_LENGTH=1 \
   -Wno-dev \
   -S ${CODEPATH}/components/omega -B .
# note OMEGA_VECTOR_LENGTH=8 fails MPI tests on CPUs.
cd ${PSCRATCH}/runs/$RUNDIR/build
./omega_build.sh

# linking:
cd test
ln -isf /global/homes/m/mpeterse/meshes/omega/O*nc .
cp ${CODEPATH}/components/omega/configs/Default.yml omega.yml

# run test:
salloc --nodes 1 --qos interactive --time 01:00:00 --constraint cpu --account=e3sm #m4572 # or e3sm
cd ${PSCRATCH}/runs/${RUNDIR}/build

./omega_ctest.sh

@mark-petersen

Copy link
Copy Markdown
Collaborator

Perlmutter GPU cTests failed identically to above, with same error messages.

@vanroekel
vanroekel force-pushed the vanroekel/omega/kpp-final branch from 51614ff to 8c56ca4 Compare October 3, 2026 04:06
@sbrus89

sbrus89 commented Oct 6, 2026

Copy link
Copy Markdown
Collaborator

Local merge passes CTests and omega_pr suite on Frontier with craygnu and craygnu-mphipcc with expected diffs:

Polaris omega_pr suite

  • Baseline workdir: /ccs/home/brus/run/polaris_baseline_omega_pr_omega_craygnu-mphipcc_mpich/
  • Baseline build: /ccs/home/brus/run/polaris_baseline_omega_pr_omega_craygnu-mphipcc_mpich/ocean_build
  • PR build: /ccs/home/brus/run/polaris_kpp_omega_pr_omega_craygnu-mphipcc_mpich/ocean_build
  • PR workdir: /ccs/home/brus/run/polaris_kpp_omega_pr_omega_craygnu-mphipcc_mpich
  • Machine: frontier
  • Partition: batch
  • Compiler: craygnu-mphipcc
  • Build type: Release
  • Log: not found
  • Result:
    • Diffs (9 of 29):
    - ocean/column/vmix_stable
      - normalVelocity: l1=9.371e+02  l2=4.712e+01  linf=7.290e+00
      - temperature:    l1=2.697e+02  l2=1.765e+01  linf=1.713e+00
      - layerThickness: l1=2.163e-01  l2=1.416e-02  linf=1.374e-03
      - salinity:       l1=9.694e-07  l2=7.382e-08  linf=1.781e-08
    - ocean/column/vmix_unstable
      - salinity:       l1=9.689e+01  l2=6.322e+00  linf=5.081e-01
      - layerThickness: l1=3.886e-03  l2=2.536e-04  linf=2.039e-05
      - temperature:    l1=4.722e-10  l2=2.443e-11  linf=2.995e-12
    - ocean/planar/barotropic_channel/short
      - normalVelocity: l1=2.486e-01  l2=1.937e-02  linf=2.383e-03
      - temperature:    l1=2.771e-05  l2=3.134e-06  linf=4.083e-07
      - layerThickness: l1=4.125e-06  l2=4.210e-07  linf=5.189e-08
    - ocean/planar/overflow/linear/zstar/smoke_test_horiz_adv_order_2_del4
      - temperature:    l1=1.754e-01  l2=2.692e-02  linf=7.365e-03
      - normalVelocity: l1=4.557e-01  l2=3.538e-02  linf=5.173e-03
      - salinity:       l1=1.561e-09  l2=6.153e-12  linf=7.816e-14
    - ocean/planar/overflow/linear/zstar/smoke_test_horiz_adv_order_3
      - normalVelocity: l1=5.972e-01  l2=3.505e-02  linf=5.150e-03
      - temperature:    l1=9.201e-02  l2=1.671e-02  linf=4.025e-03
      - salinity:       l1=1.569e-09  l2=6.107e-12  linf=9.237e-14
    - ocean/planar/overflow/linear/zstar/smoke_test_horiz_adv_order_4
      - normalVelocity: l1=3.705e+00  l2=1.991e-01  linf=2.502e-02
      - temperature:    l1=9.164e-01  l2=8.213e-02  linf=1.167e-02
      - salinity:       l1=1.533e-09  l2=6.001e-12  linf=9.237e-14
    - ocean/planar/overflow/nonlinear/pstar/smoke_test_horiz_adv_order_4_del4
      - normalVelocity: l1=8.586e+00  l2=2.904e-01  linf=4.326e-02
      - temperature:    l1=2.557e+00  l2=1.782e-01  linf=2.793e-02
      - salinity:       l1=3.069e-09  l2=1.096e-11  linf=1.350e-13
    - ocean/planar/overflow/nonlinear/pstar/smoke_test_horiz_adv_order_3_nofct
      - normalVelocity: l1=1.759e+00  l2=3.698e-02  linf=4.903e-03
      - temperature:    l1=1.535e-01  l2=1.025e-02  linf=2.299e-03
      - salinity:       l1=3.047e-09  l2=1.091e-11  linf=1.279e-13
    - ocean/column/ekman
      - normalVelocity: l1=8.879e+01  l2=2.175e+00  linf=2.515e-01
      - salinity:       l1=2.694e-11  l2=8.320e-13  linf=5.684e-14
      - temperature:    l1=1.751e-11  l2=5.348e-13  linf=3.553e-14

Polaris omega_pr suite

  • Baseline workdir: /ccs/home/brus/run/polaris_baseline_omega_pr_omega_craygnu_mpich/
  • Baseline build: /ccs/home/brus/run/polaris_baseline_omega_pr_omega_craygnu_mpich/ocean_build
  • PR build: /ccs/home/brus/run/polaris_kpp_omega_pr_omega_craygnu_mpich/ocean_build
  • PR workdir: /ccs/home/brus/run/polaris_kpp_omega_pr_omega_craygnu_mpich
  • Machine: frontier
  • Partition: batch
  • Compiler: craygnu
  • Build type: Release
  • Log: not found
  • Result:
    • Diffs (9 of 29):
    - ocean/column/vmix_stable
      - normalVelocity: l1=9.371e+02  l2=4.712e+01  linf=7.290e+00
      - temperature:    l1=2.697e+02  l2=1.765e+01  linf=1.713e+00
      - layerThickness: l1=2.163e-01  l2=1.416e-02  linf=1.374e-03
      - salinity:       l1=1.229e-06  l2=7.662e-08  linf=9.250e-09
    - ocean/column/vmix_unstable
      - salinity:       l1=9.689e+01  l2=6.322e+00  linf=5.081e-01
      - layerThickness: l1=3.886e-03  l2=2.536e-04  linf=2.039e-05
      - temperature:    l1=1.025e-09  l2=5.719e-11  linf=3.297e-12
    - ocean/planar/barotropic_channel/short
      - normalVelocity: l1=2.486e-01  l2=1.937e-02  linf=2.383e-03
      - temperature:    l1=2.771e-05  l2=3.134e-06  linf=4.083e-07
      - layerThickness: l1=4.125e-06  l2=4.210e-07  linf=5.189e-08
    - ocean/planar/overflow/linear/zstar/smoke_test_horiz_adv_order_2_del4
      - temperature:    l1=1.754e-01  l2=2.692e-02  linf=7.365e-03
      - normalVelocity: l1=4.472e-01  l2=3.538e-02  linf=5.173e-03
      - salinity:       l1=1.178e-09  l2=4.719e-12  linf=7.105e-14
    - ocean/planar/overflow/linear/zstar/smoke_test_horiz_adv_order_3
      - normalVelocity: l1=5.967e-01  l2=3.505e-02  linf=5.150e-03
      - temperature:    l1=9.201e-02  l2=1.671e-02  linf=4.025e-03
      - salinity:       l1=1.021e-09  l2=4.026e-12  linf=6.395e-14
    - ocean/planar/overflow/linear/zstar/smoke_test_horiz_adv_order_4
      - normalVelocity: l1=3.706e+00  l2=1.991e-01  linf=2.502e-02
      - temperature:    l1=9.164e-01  l2=8.213e-02  linf=1.167e-02
      - salinity:       l1=1.072e-09  l2=4.286e-12  linf=5.684e-14
    - ocean/planar/overflow/nonlinear/pstar/smoke_test_horiz_adv_order_4_del4
      - normalVelocity: l1=8.437e+00  l2=2.982e-01  linf=4.724e-02
      - temperature:    l1=2.940e+00  l2=2.077e-01  linf=3.831e-02
      - salinity:       l1=1.515e-09  l2=5.543e-12  linf=7.816e-14
    - ocean/planar/overflow/nonlinear/pstar/smoke_test_horiz_adv_order_3_nofct
      - normalVelocity: l1=1.687e+00  l2=3.668e-02  linf=4.903e-03
      - temperature:    l1=1.535e-01  l2=1.025e-02  linf=2.299e-03
      - salinity:       l1=1.504e-09  l2=5.496e-12  linf=7.105e-14
    - ocean/column/ekman
      - normalVelocity: l1=8.879e+01  l2=2.175e+00  linf=2.515e-01
      - salinity:       l1=2.825e-09  l2=8.669e-11  linf=4.619e-12
      - temperature:    l1=1.876e-09  l2=5.741e-11  linf=2.768e-12
      - layerThickness: l1=2.989e-13  l2=1.053e-14  linf=1.998e-15

Also passes omega_pr on Aurora with oneapi-ifx and oneapi-ifxgpu with expected diffs:

Polaris omega_pr suite

  • Baseline workdir: /home/brus/run/polaris_omega_pr_baseline_oneapi-ifx_mpich
  • Baseline build: /home/brus/run/polaris_omega_pr_baseline_oneapi-ifx_mpich/ocean_build
  • PR build: /home/brus/run/polaris_kpp_omega_pr_omega_oneapi-ifx_mpich/ocean_build
  • PR workdir: /home/brus/run/polaris_kpp_omega_pr_omega_oneapi-ifx_mpich
  • Machine: aurora
  • Compiler: oneapi-ifx
  • Build type: Release
  • Log: /home/brus/run/polaris_kpp_omega_pr_omega_oneapi-ifx_mpich/polaris_omega_pr.o8906477
  • Result:
    • Diffs (9 of 29):
    - ocean/column/vmix_stable
      - normalVelocity: l1=9.371e+02  l2=4.712e+01  linf=7.290e+00
      - temperature:    l1=2.697e+02  l2=1.765e+01  linf=1.713e+00
      - layerThickness: l1=2.163e-01  l2=1.416e-02  linf=1.374e-03
      - salinity:       l1=5.772e-07  l2=3.757e-08  linf=5.666e-09
    - ocean/column/vmix_unstable
      - salinity:       l1=9.689e+01  l2=6.322e+00  linf=5.081e-01
      - layerThickness: l1=3.886e-03  l2=2.536e-04  linf=2.039e-05
      - temperature:    l1=1.077e-09  l2=6.007e-11  linf=3.457e-12
    - ocean/planar/barotropic_channel/short
      - normalVelocity: l1=2.486e-01  l2=1.937e-02  linf=2.383e-03
      - temperature:    l1=2.771e-05  l2=3.134e-06  linf=4.083e-07
      - layerThickness: l1=4.125e-06  l2=4.210e-07  linf=5.189e-08
    - ocean/planar/overflow/linear/zstar/smoke_test_horiz_adv_order_2_del4
      - temperature:    l1=1.754e-01  l2=2.692e-02  linf=7.365e-03
      - normalVelocity: l1=4.469e-01  l2=3.538e-02  linf=5.173e-03
      - salinity:       l1=1.320e-09  l2=5.197e-12  linf=7.105e-14
    - ocean/planar/overflow/linear/zstar/smoke_test_horiz_adv_order_3
      - normalVelocity: l1=5.966e-01  l2=3.505e-02  linf=5.150e-03
      - temperature:    l1=9.201e-02  l2=1.671e-02  linf=4.025e-03
      - salinity:       l1=1.175e-09  l2=4.541e-12  linf=7.816e-14
    - ocean/planar/overflow/linear/zstar/smoke_test_horiz_adv_order_4
      - normalVelocity: l1=3.705e+00  l2=1.991e-01  linf=2.502e-02
      - temperature:    l1=9.164e-01  l2=8.213e-02  linf=1.167e-02
      - salinity:       l1=1.208e-09  l2=4.776e-12  linf=7.105e-14
    - ocean/planar/overflow/nonlinear/pstar/smoke_test_horiz_adv_order_4_del4
      - normalVelocity: l1=7.854e+00  l2=2.809e-01  linf=3.573e-02
      - temperature:    l1=2.732e+00  l2=1.918e-01  linf=3.351e-02
      - salinity:       l1=1.663e-09  l2=6.054e-12  linf=7.816e-14
    - ocean/planar/overflow/nonlinear/pstar/smoke_test_horiz_adv_order_3_nofct
      - normalVelocity: l1=1.654e+00  l2=3.603e-02  linf=4.903e-03
      - temperature:    l1=1.535e-01  l2=1.025e-02  linf=2.299e-03
      - salinity:       l1=1.668e-09  l2=6.079e-12  linf=7.816e-14
    - ocean/column/ekman
      - normalVelocity: l1=8.879e+01  l2=2.175e+00  linf=2.515e-01
      - salinity:       l1=1.313e-09  l2=3.839e-11  linf=1.421e-12
      - temperature:    l1=6.414e-10  l2=1.746e-11  linf=5.862e-13

Polaris omega_pr suite

  • Baseline workdir: /home/brus/run/polaris_omega_pr_baseline_oneapi-ifxgpu_mpich/
  • Baseline build: /home/brus/run/polaris_omega_pr_baseline_oneapi-ifxgpu_mpich/ocean_build
  • PR build: /home/brus/run/polaris_kpp_omega_pr_omega_oneapi-ifxgpu_mpich/ocean_build
  • PR workdir: /home/brus/run/polaris_kpp_omega_pr_omega_oneapi-ifxgpu_mpich
  • Machine: aurora
  • Compiler: oneapi-ifxgpu
  • Build type: Release
  • Log: /home/brus/run/polaris_kpp_omega_pr_omega_oneapi-ifxgpu_mpich/polaris_omega_pr.o8906505
  • Result:
    • Diffs (9 of 29):
    - ocean/column/vmix_stable
      - normalVelocity: l1=9.371e+02  l2=4.712e+01  linf=7.290e+00
      - temperature:    l1=2.697e+02  l2=1.765e+01  linf=1.713e+00
      - layerThickness: l1=2.163e-01  l2=1.416e-02  linf=1.374e-03
      - salinity:       l1=5.120e-06  l2=3.815e-07  linf=8.453e-08
    - ocean/column/vmix_unstable
      - salinity:       l1=9.689e+01  l2=6.322e+00  linf=5.081e-01
      - layerThickness: l1=3.886e-03  l2=2.536e-04  linf=2.039e-05
      - temperature:    l1=4.742e-10  l2=2.437e-11  linf=2.871e-12
    - ocean/planar/barotropic_channel/short
      - normalVelocity: l1=2.486e-01  l2=1.937e-02  linf=2.383e-03
      - temperature:    l1=2.771e-05  l2=3.134e-06  linf=4.083e-07
      - layerThickness: l1=4.125e-06  l2=4.210e-07  linf=5.189e-08
    - ocean/planar/overflow/linear/zstar/smoke_test_horiz_adv_order_2_del4
      - temperature:    l1=1.754e-01  l2=2.692e-02  linf=7.365e-03
      - normalVelocity: l1=4.557e-01  l2=3.538e-02  linf=5.173e-03
      - salinity:       l1=1.572e-09  l2=6.185e-12  linf=7.816e-14
    - ocean/planar/overflow/linear/zstar/smoke_test_horiz_adv_order_3
      - normalVelocity: l1=5.972e-01  l2=3.505e-02  linf=5.150e-03
      - temperature:    l1=9.201e-02  l2=1.671e-02  linf=4.025e-03
      - salinity:       l1=1.561e-09  l2=6.053e-12  linf=7.816e-14
    - ocean/planar/overflow/linear/zstar/smoke_test_horiz_adv_order_4
      - normalVelocity: l1=3.705e+00  l2=1.991e-01  linf=2.502e-02
      - temperature:    l1=9.164e-01  l2=8.213e-02  linf=1.167e-02
      - salinity:       l1=1.521e-09  l2=5.964e-12  linf=9.237e-14
    - ocean/planar/overflow/nonlinear/pstar/smoke_test_horiz_adv_order_4_del4
      - normalVelocity: l1=8.181e+00  l2=2.788e-01  linf=4.191e-02
      - temperature:    l1=2.721e+00  l2=1.821e-01  linf=2.889e-02
      - salinity:       l1=3.086e-09  l2=1.103e-11  linf=1.279e-13
    - ocean/planar/overflow/nonlinear/pstar/smoke_test_horiz_adv_order_3_nofct
      - normalVelocity: l1=1.756e+00  l2=3.685e-02  linf=4.903e-03
      - temperature:    l1=1.535e-01  l2=1.025e-02  linf=2.299e-03
      - salinity:       l1=3.053e-09  l2=1.095e-11  linf=1.350e-13
    - ocean/column/ekman
      - normalVelocity: l1=8.879e+01  l2=2.175e+00  linf=2.515e-01
      - salinity:       l1=2.797e-11  l2=8.508e-13  linf=5.684e-14
      - temperature:    l1=2.149e-11  l2=6.227e-13  linf=3.553e-14

@sbrus89
sbrus89 merged commit b42d508 into E3SM-Project:develop Oct 6, 2026
8 checks passed
@vanroekel

Copy link
Copy Markdown
Collaborator Author

Thanks @sbrus89!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants