Skip to content

Add surface coupling design document#408

Open
andrewdnolan wants to merge 5 commits into
E3SM-Project:developfrom
andrewdnolan:omega/coupling-design-doc
Open

Add surface coupling design document#408
andrewdnolan wants to merge 5 commits into
E3SM-Project:developfrom
andrewdnolan:omega/coupling-design-doc

Conversation

@andrewdnolan

Copy link
Copy Markdown

This PR adds the design document for the surface coupling within E3SM. Builds off the discussion during the Omega special topics meetings 05/06/26.

Checklist:

@andrewdnolan

Copy link
Copy Markdown
Author

I may have been a little heavy handed with the request for reviews. If you think there's someone else better suited to review, please feel free to reassign.

@xylar xylar changed the title Addd surface coupling design document Add surface coupling design document May 13, 2026

@xylar xylar 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.

@andrewdnolan a few questions and comments to get things started.

Comment thread components/omega/doc/design/Coupling.md Outdated
Comment thread components/omega/doc/design/Coupling.md Outdated
Comment thread components/omega/doc/design/Coupling.md
Comment thread components/omega/doc/design/Coupling.md Outdated
Comment thread components/omega/doc/design/Coupling.md Outdated
Comment thread components/omega/doc/design/Coupling.md Outdated
Comment thread components/omega/doc/design/Coupling.md Outdated
Comment thread components/omega/doc/design/Coupling.md Outdated
The class must provide methods to import fields, apply them to forcing
state, accumulate export quantities each ocean timestep, export
accumulated fields, and reset accumulators.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

A similar comment - while this is focused on the interface to the coupler, we also need to flesh out how this interacts with the rest of the surface forcing. In particular, where it sits in the run driver, how the fields are combined with other options like restoring. Conceptually, coupling should be identical to standalone forcing with just the source of the data coming from a coupler rather than a file (with the obvious exceptions that we also need to pass stuff back and the fields can be somewhat different).

Also, what will be the configuration options?

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

The idea is that the forcing class (under Omega) is identical for both standalone and coupled. In coupled, it's populated by the coupling that andrew is building. In standalone, it reads from file. I am not sure if this answers your question though?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

@philipwjones I addressed these missing pieces in e4b2ae2. Curious to hear if it that's enough detail?

Comment thread components/omega/doc/design/Coupling.md
Comment thread components/omega/doc/design/Coupling.md Outdated

@alicebarthel alicebarthel 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.

Thanks @andrewdnolan! This seems in line with what we discussed. Only minor comments asking for clarification at this stage.

@andrewdnolan andrewdnolan requested review from alicebarthel, cbegeman, philipwjones and vanroekel and removed request for brian-oneill, jonbob and sbrus89 June 22, 2026 18:54

@cbegeman cbegeman 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.

@andrewdnolan Thanks for addressing all of my comments and working with @alicebarthel to make this consistent with the file-read approach for standalone.


## 1 Overview

The `SurfaceCoupling` class manages all fields exchanged between Omega and

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Suggested change
The `SurfaceCoupling` class manages all fields exchanged between Omega and
The `SfcCoupling` class manages all fields exchanged between Omega and

?
we are moving all the forcing terms to be named SfcForcing...
Just a suggestion.

Array1DReal EvaporationFlux; ///< Foxx_evap [kg m⁻² s⁻¹]
Array1DReal SeaIceFreshWaterFlux; ///< Fioi_meltw [kg m⁻² s⁻¹]
Array1DReal IcebergFreshWaterFlux; ///< Fioi_bergw [kg m⁻² s⁻¹]
Array1DReal SeaIceSalinityFlux; ///< Fioi_salt [kg m⁻² s⁻¹]

@alicebarthel alicebarthel Jun 25, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Suggested change
Array1DReal SeaIceSalinityFlux; ///< Fioi_salt [kg m⁻² s⁻¹]
Array1DReal SeaIceSaltFlux; ///< Fioi_salt [kg m⁻² s⁻¹]

Just a note for your implementation

@alicebarthel alicebarthel 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.

There may be implementation details that escape me but in general, I think that this design doc does a good job of laying out the requirements and tests.
That's in line with what we discussed.

class SurfaceCoupling {
public:
// Import fields (x2o): coupler → ocean
Array1DReal SurfaceStressZonal; ///< Foxx_taux [N m⁻²]

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

These are moving to SfcStressXXXX right?

Array1DReal SSHGradientMeridional; ///< So_dhdy [m m⁻¹]
Array1DReal SeaIceFormationHeat; ///< Fioo_q [W m⁻²]
Array1DReal FrazilIceMass; ///< Fioo_frazil [kg m⁻² s⁻¹]
Array1DReal FreshWaterHeatFlux; ///< Faoo_h2otemp[W m⁻²]

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

I believe we also need to import WindSpeed10m from the coupler for KPP

SurfaceCoupling *SurfaceCoupling::get(const std::string &Name);
```

Other portions of the code can inquire whether running in coupled mode by

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Suggested change
Other portions of the code can inquire whether running in coupled mode by
Other portions of the code can inquire whether it is running in coupled mode by

uses `col*NCells + i`, MOAB uses `i*NFields + col`. Unit conversions (e.g.,
in situ → conservative temperature) and corrections (e.g. forcing shortwave
radiation to be positive) are applied inline. The corrections are applied to
address numerical issues, not and physical one, in the off chance monotonicity

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

I don't understand what you are saying here


}

// if coupler tells us, force write restate stream

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Suggested change
// if coupler tells us, force write restate stream
// if coupler tells us, force write restart stream

??

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants