13.3. Coupled variables#

13.3.1. Coupling with an atmospheric model#

When coupling CROCO to an atmospheric model, to have a consistent interface, you should use momentum and heat fluxes computed from the atmospheric model bulk formula.

No surface forcing file is required (only boundary forcing, and eventually tidal forcing).

The following cpp-keys have to be set:

# define OA_COUPLING
# define MPI

# undef  BULK_FLUX
# undef  SMFLUX_CFB

Note

SMFLUX_CFB is a cpp-key to use a wind stress relative to the current in forced mode. In coupled mode, as current is sent to the atmosphere, the wind stress from the atmospheric model account for such a current feedback.

Fields sent by CROCO

Name (units)

name and eventual oper. in the model

OASIS name

SST (K)

t(:,:,N,nnew,itemp) + 273.15

CROCO_SST

U-component of current (m/s)

u (at rho points):
0.5*(u(1:Lmmpi,1:Mmmpi,N,nnew)
+u(2:Lmmpi+1,1:Mmmpi,N,nnew))

CROCO_UOCE

V-component of current (m/s)

v (at rho points):
0.5*(v(1:Lmmpi,1:Mmmpi,N,nnew)
+v(1:Lmmpi,2:Mmmpi+1,N,nnew))

CROCO_VOCE

Eastward component of current (m/s)

u (at rho points) rotated eastwards
(useful for rotated grids)
(0.5 * (u(1:Lmmpi ,1:Mmmpi,N,nnew)
+ u(2:Lmmpi+1,1:Mmmpi,N,nnew)) )
* cos(angler(1:Lmmpi ,1:Mmmpi))
- (0.5 * (v(1:Lmmpi,1:Mmmpi ,N,nnew)
+ v(1:Lmmpi,2:Mmmpi+1,N,nnew)) )
* sin(angler(1:Lmmpi ,1:Mmmpi))
+u(2:Lmmpi+1,1:Mmmpi,N,nnew))

CROCO_EOCE

Northward component of current (m/s)

v (at rho points) rotated northward
(useful for rotated grids)
(0.5 * (u(1:Lmmpi ,1:Mmmpi,N,nnew)
+ u(2:Lmmpi+1,1:Mmmpi,N,nnew)) )
* sin(angler(1:Lmmpi ,1:Mmmpi))
+ (0.5 * (v(1:Lmmpi,1:Mmmpi ,N,nnew)
+ v(1:Lmmpi,2:Mmmpi+1,N,nnew)) )
* cos(angler(1:Lmmpi ,1:Mmmpi))

CROCO_NOCE

Fields received by CROCO

Name (units)

name and eventual oper. in the model

OASIS name

U component of wind stress (N/m2)

sustr (at u point):
0.5*(FIELD(io-1,jo)+FIELD(io,jo))/rho0
if eastward, it is first rotated:
FIELD = etau * cos(angler)
+ ntau * sin(angler)

CROCO_UTAW or CROCO_ETAW

V component of wind stress (N/m2)

svstr (at v point):
0.5*(FIELD(io,jo-1)+FIELD(io,jo))/rho
if northward, it is first rotated:
FIELD = ntau * cos(angler)
- etau * sin(angler)

CROCO_VTAW or CROCO_NTAW

Wind stress module (N/m2)

smstr = FIELD / rho0

CROCO_TAUM

Surface net solar flux (W/m2)

srflx = FIELD / (rho0*Cp)

CROCO_SRFL

Surface net non-solar flux (W/m2)

stflx(:,:,itemp) = FIELD / (rho0*Cp)

CROCO_STFL

Evaporation-Precipitation (kg/m2/s)

stflx(:,:,isalt) = FIELD / 1000

CROCO_EVPR

Surface atmospheric pressure (Pa)

patm2d = FIELD

CROCO_PSFC

Fields received by WRF

Name (units)

name (in the model)

OASIS name

SST (K)

SST

WRF_d01_EXT_d01_SST

U component of current (m/s)

UOCE

WRF_d01_EXT_d01_UOCE

V component of current (m/s)

VOCE

WRF_d01_EXT_d01_VOCE

Eastward component of current (m/s)

EOCE

WRF_d01_EXT_d01_EOCE

Northward component of current (m/s)

NOCE

WRF_d01_EXT_d01_NOCE

Fields sent by WRF

Name (units)

name (in the model)

OASIS name

Surface net solar flux (W/m2)

GSW

WRF_d01_EXT_d01_SURF_NET_SOLAR

Surface net non-solar flux (W/m2)

GLW-STBOLT*EMISS*SST**4-LH-HFX

WRF_d01_EXT_d01_SURF_NET_NON-SOLAR

Evaporation-precipitation (kg/m2/s)

QFX-(RAINCV+RAINNCV)/DT

WRF_d01_EXT_d01_EVAP-PRECIP

Surface atmospheric pressure (Pa)

PSFC

WRF_d01_EXT_d01_PSFC

Wind stress module (N/m2)

taut = rho * ust**2

WRF_d01_EXT_d01_TAUMOD

U component of wind stress (N/m2)

taui = taut * u_uo / wspd

WRF_d01_EXT_d01_TAUX

V component of wind stress (N/m2)

tauj = taut * v_uo / wspd

WRF_d01_EXT_d01_TAUY

Eastward comp. of wind stress(N/m2)

cosa * taui - sina * tauj

WRF_d01_EXT_d01_TAUE

Northward comp. of wind stress(N/m2)

cosa * tauj + sina * taui

WRF_d01_EXT_d01_TAUN

Note

If you decide to couple CROCO with multiple WRF domains, variables coming from WRF will be defined by adding _EXT*. Here * corresponds to which domains the variable is coming (1=Parent, 2=Nest 1 ,…).

13.3.2. Coupling with a wave model#

When coupling CROCO to a wave model, the wave-current interactions have to be set on. At the moment, only mean wave parameters are exchanged, their contribution to ocean dynamics is computed into the wave-current interaction routine in CROCO.

The following cpp-keys have to be set:

# define OW_COUPLING
# define MPI

# define MRL_WCI

Note

You also have to be careful to the choice of the momentum flux. For better consistency, here we suggest to account for the momentum flux seen by the wave model, and thus set:

# undef  BULK_FLUX
# define WAVE_SMFLUX

Fields sent by CROCO

Name (units)

name and eventual oper. in the model

OASIS name

SSH (m)

zeta

CROCO_SSH

U-component of current (m/s)

u (at rho points):
0.5*(u(1:Lmmpi,1:Mmmpi,N,nnew)
+u(2:Lmmpi+1,1:Mmmpi,N,nnew))

CROCO_UOCE

V-component of current (m/s)

v (at rho points):
0.5*(v(1:Lmmpi,1:Mmmpi,N,nnew)
+v(1:Lmmpi,2:Mmmpi+1,N,nnew))

CROCO_VOCE

Eastward component of current (m/s)

u (at rho points) rotated to east
(useful for rotated grids)
(0.5 * (u(1:Lmmpi ,1:Mmmpi,N,nnew)
+ u(2:Lmmpi+1,1:Mmmpi,N,nnew)) )
* cos(angler(1:Lmmpi ,1:Mmmpi))
- (0.5 * (v(1:Lmmpi,1:Mmmpi ,N,nnew)
+ v(1:Lmmpi,2:Mmmpi+1,N,nnew)) )
* sin(angler(1:Lmmpi ,1:Mmmpi))
+u(2:Lmmpi+1,1:Mmmpi,N,nnew))

CROCO_EOCE

Northward component of current (m/s)

v (at rho points) rotated to north
(useful for rotated grids)
(0.5 * (u(1:Lmmpi ,1:Mmmpi,N,nnew)
+ u(2:Lmmpi+1,1:Mmmpi,N,nnew)) )
* sin(angler(1:Lmmpi ,1:Mmmpi))
+ (0.5 * (v(1:Lmmpi,1:Mmmpi ,N,nnew)
+ v(1:Lmmpi,2:Mmmpi+1,N,nnew)) )
* cos(angler(1:Lmmpi ,1:Mmmpi))

CROCO_NOCE

Fields received by CROCO

Name (units)

name and eventual oper. in the model

OASIS name

Significant wave height (m)

whrm = FIELD * 0.70710678

CROCO_HS

Mean wave period (s) -> frequency

wfrq = 2*pi / FIELD

CROCO_T0M1

Mean wave direction -> wavenumbers

wdrx = cos(FIELD - angler)
wdre = sin(FIELD - angler)

CROCO_DIR

U component of wave stress (m2/s2)

twox (at u point):
0.5*(FIELD(io-1,jo)+FIELD(io,jo))
if eastward, it is first rotated:
FIELD = etwo * cos(angler)
+ ntwo * sin(angler)

CROCO_UTWO or CROCO_ETWO

V component of wave stress (m2/s2)

twoy (at v point):
0.5*(FIELD(io,jo-1)+FIELD(io,jo))
if northward, it is first rotated:
FIELD = ntwo * cos(angler)
- etwo * sin(angler)

CROCO_VTWO or CROCO_NTWO

U comp. of wind-to-wave stress (m2/s2)

tawx (at u point):
0.5*(FIELD(io-1,jo)+FIELD(io,jo))
if eastward, it is first rotated:
FIELD = etaw * cos(angler)
+ ntaw * sin(angler)

CROCO_UTAW or CROCO_ETAW

V comp. of wind-to-wave stress (m2/s2)

tawy (at v point):
0.5*(FIELD(io,jo-1)+FIELD(io,jo))
if northward, it is first rotated:
FIELD = ntaw * cos(angler)
- etaw * sin(angler)

CROCO_VTAW or CROCO_NTAW

Other optional fields enventually sent, if not, they are analytically computed in the MRL_WCI routine

Bernoulli head pressure (N/m)

bhd

CROCO_BHD

Wave-to-ocean TKE flux (W/m2)

foc

CROCO_FOC

Mean wavelength (m)

wlm

CROCO_LM

Wave orbital bottom velocity (m/s)

ubr = sqrt(ubrx**2+ubry**2)

CROCO_UBRX and CROCO_UBRY

Stokes drift surface velocity (m/s)

ust_ext = sqrt(ustx_ext**2+usty_ext**2)

CROCO_USSX and CROCO_USSY

Fields received by WW3

Name (units)

name (in the model)

OASIS name

SSH = water level (m)

LEV

WW3__SSH

Zonal current (m/s)

CUR

WW3_OSSU

Meridional current (m/s)

CUR

WW3_OSSV

Fields sent by WW3

Name (units)

name (in the model)

OASIS name

Mean wave period (s)

T0M1

WW3_T0M1

Significant wave height (m)

HS

WW3__OHS

Mean wave direction

THM

WW3__DIR

Zonal wave stress (N/m2)

TWOX

WW3_TWOX

Meridional wave stress (N/m2)

TWOY

WW3_TWOY

Zonal wind stress (N/m2)

TAWX

WW3_TAWX

Meridional wind stress(N/m2) TAWY WW3_TAWY

Other fields possibly sent, but not used in coupling with CROCO at the moment

Bernoulli head pressure (N/m)

BHD

WW3__BHD

Bottom orbital velocity (m/s)

UBR

WW3__UBR

Wave-to-ocean TKE flux (W/m2)

FOC

WW3__FOC

Mean wavelength (m)

LM

WW3___LM

Wave peak frequency (/s)

FP

WW3___FP

13.3.3. Coupling atmosphere and wave models#

Fields received by WW3

Name (units)

name (in the model)

OASIS name

Zonal wind (m/s)

WND

WW3__U10

Meridional wind (m/s)

WND

WW3__V10

Fields sent by WW3

Name (units)

name (in the model)

OASIS name

Significant wave height (m)

HS

WW3__AHS

Charnock coefficient

ACHA

WW3_ACHA

Fields sent by WRF

Name (units)

name (in the model)

OASIS name

Zonal wind at first level( (m/s)

u_uo

WRF_d01_EXT_d01_WND_E_01

Meridional wind at first level (m/s)

v_vo

WRF_d01_EXT_d01_WND_N_01

Fields received by WRF

Name (units)

name (in the model)

OASIS name

Charnock coefficient

CHA_COEF

WRF_d01_EXT_d01_CHA_COEF

13.3.4. Note on momentum flux when coupling 3 models#

As the wave model has a quite complex parameterization of wave generation by winds, which is in subtle balance with the wave dissipation, the wind stress for the wave model is computed by its own parameterization. Therefore, to ensure energetic consistency of the momentum flux when coupling 3 models, we prescribe the wind stress in CROCO as:

sustr = sustr_from_atm_model - tawx + twox
svstr = svstr_from_atm_model - tawy + twoy

# where taw is stress from atm to waves
# and   two is stress from waves to ocean

13.3.5. Note on coupling with AGRIF#

You may decide to coupled CROCO while using AGRIF. To do so, the variables sent by the parent domain (0) and the child domains (1,2,…) must be separated. Thus the variables sent, in case of using AGRIF, take the radical defined above (CROCO_VAR) to which we add _0 (for parent) or _1 (for first child). This gives, for example for variable SST, CROCO_SST_0 or CROCO_SST_1 for parent and child respectively.

For the variables received by CROCO, we will use its ability to handle CPLMASK. Each of the domains (parent or children) will be assigned a coupling mask named coupling_mask0.nc (parent), coupling_mask1.nc (child 1), each coupling mask being relative to its grid. The CROCO domain that receives a variable will be identified by its mask (CPLMASK*), which will be added to the previous radical. This will give CROCO_VAR_CPLMASK0 for the parent or CROCO_VAR_CPLMASK1 for child 1.

This makes it easy to define the received variables in a case where one decides to couple CROCO-AGRIF with several WRF domains. In this case the variables will have the nomenclature CROCO_VAR_CPLMASK0 for the parent CROCO to which we add _EXT1 for the first domain of coupling_mask0.nc. By continuity _EXT2 will correspond to domain 2 of coupling_mask0.nc. Then the variables received by CROCO, in a case of CROCO-AGRIF/WRF-nest simulation, will follow the format CROCO_VAR_CPLMASK*_EXT*.