Open Boundary Conditions - adcroft/MOM6-examples GitHub Wiki

Open Boundary Conditions

The boundaries pass from q-point to q-point. Each boundary segment is specified separately in the MOM_input file as shown below. The boundary conditions for the southern and western sides only work in symmetric mode.

The boundaries can be either specified or computed based on a radiation-type condition, possibly with nudging as well. There is land mask outside a specified boundary, ocean outside a radiation boundary.

The old way

There was a "Flather" option for each of the four sides of the domain, which applied boundary conditions to the flow normal to the corresponding side. It applied these conditions to both the baroclinic and barotropic velocities, Orlanski and Flather, respectively. It is no longer available, however picking the "FLATHER, ORLANSKI" options is meant to reproduce the old answers.

The new way

Drawing of domain with open segments

Segments are a means of specifying pieces of open boundary, each being aligned with the i- or j-axis. We don't promise to support convex interior corners such as would be required by converting the peninsula between segment 1 and segment 2 in the figure to an open boundary.

Boundary specification in MOM_input

We start by setting the number of segments:

  • OBC_NUMBER_OF_SEGMENTS = 2

For each segment, there's a range of i or j at a fixed j or i. Set the fixed value first, then the range. The index order for the range will give the direction, going around the domain in a counter-clockwise direction.

Once the location of the boundary is set, determine its type. Up to five descriptive words can be used. Some examples:

  • OBC_SEGMENT_001 = "I=0,J=23:1,SIMPLE"
  • OBC_SEGMENT_002 = "J=45,I=5:15,FLATHER, OBLIQUE, NUDGED"

For the I,J ranges, can use a shorthand of "N" for the northernmost or easternmost value instead of spelling out the numeric value:

  • "I=N,J=5:N-2" (part of eastern boundary)
  • "I=0,J=N:0" (entire western boundary)
  • "I=N-2,J=N-10:N-2" (eastern boundary condition 2 rows in)
  • Maybe even shorthand for the entire boundary being open? "IJ=N" (not yet)

For the whole boundary to be open, including corners, one should set:

  • OBC_NUMBER_OF_SEGMENTS = 4
  • OBC_SEGMENT_001 = "J=N,I=N:0,FLATHER"
  • OBC_SEGMENT_002 = "J=0,I=0:N,FLATHER"
  • OBC_SEGMENT_003 = "I=N,J=0:N,FLATHER"
  • OBC_SEGMENT_004 = "I=0,J=N:0,FLATHER"

The order should not matter.

The boundary types are currently:

  • SIMPLE - the boundary values are specified. User-specified fields for open boundaries can be set via OBC_USER_CONFIG in MOM_input, DOME, for instance. This user code is currently the only way to provide the cross-boundary transport required for SIMPLE boundaries. Supercritical is another example.

  • GRADIENT - zero gradient of all fields near the boundary.

  • FLATHER - a radiation boundary condition on the barotropic flow which attempts to comply with exterior values, tidal or otherwise.

  • ORLANSKI - a radiation boundary condition on the baroclinic flow.

  • OBLIQUE - a radiation boundary condition for both barotropic and baroclinic flows using oblique phase speeds.

  • NUDGED - a modifier on the radiation conditions (ORLANSKI and OBLIQUE) to nudge to exterior values.

The above list is subject to change.

Note that FLATHER and NUDGED imply the need for boundary values, barotropic and baroclinic, respectively. These can either come from an internal configuration using the "user" directory, from a set value in MOM_input, or from an external file.

OBCs on tangential velocities are applied via choices to the vorticity and strain boundary condition. These options are available globally. Set at most one of these:

  • OBC_ZERO_VORTICITY = True
  • OBC_FREESLIP_VORTICITY = True

Also, at most one of these:

  • OBC_ZERO_STRAIN = True
  • OBC_FREESLIP_STRAIN = True

When using biharmonic viscosity, you probably also want this:

  • OBC_ZERO_BIHARMONIC = True

The gradient of kinetic energy is also set to zero across open boundaries.

Under construction:

  • OBC_SEGMENT_001_DATA = “TEMP=file:xyz_%y.nc(theta),SALT=...”
  • OBC_SEGMENT_002_DATA = “SALT=IC”
  • or OBC_SEGMENT_002_DATA = “TEMP=DOME”
  • OBC_SEGMENT_003_DATA = "U=value:0.0,V=value:0.0,SSH=value:0.0

For the first example, the value in parentheses is the name of the variable in the file.

Right now, values in MOM_input have to be in the order shown in the fourth line, U then V then SSH (T and S for later).

For providing data, one should know that open boundaries are internally extended by one on each end to allow for open corner points. We're trying to understand and get rid of this need...