# 12.3. OBSTRUCTIONS module : flow in presence of various obstructions#

## 12.3.1. Introduction#

In coastal environments, hydrodynamics is often modified by obstructions (natural or anthropogenic) such as seagrass meadows, oyster and mussels farming, salt-marsh and estuarine vegetation.

The OBSTRUCTIONS module have been implemented to take account for these modifications of hydrodynamics induced by differents kinds of obstructions. This is a generic module adapted to various types of natural and anthropogenic obstructions that can be found in coastal ecosystems (i.e. rigid/flexible, submerged/emergent, upward/downward/3D).

The module as been designed to need a minimal, optimized, number of empirical calibration parameters. Multiple obstruction types can be defined in the same grid cell.

The influence of obstruction elements on three-dimensional flow is taken into account through:

the loss of momentum due to the drag exerted on obstruction elements

the balance between turbulence production and dissipation introduced within the k-\(\epsilon\) turbulence closure scheme

The OBSTRUCTIONS module is coupled with the hydrodynamic CROCO model.

This module was primarily designed to describe the three-dimensional hydrodynamic effects
of flexible seagrass Zostera noltei on flow Kombiadou *et al.* [2014]. In its updated present state
(Ganthy *et al.* [2024]),
the module allows the simulation of various types of obstructions.
The numerical scheme has also been modified to allow multiple obstructions
in the same grid cell. The computation procedure for flexible obstructions height has been improved.

Currently three generic obstructions types can be taken into account :

**Upward obstructions (UP)**: obstructions starting from the seabed and erected toward the water surface (e.g. vegetation, mussel post…). These obstructions can be rigid or flexible.**Downward obstructions (DO)**: obstruction starting from the water surface and hanging toward the bottom (e.g. mussel/oyster lines). As for the UP type, these obstructions can be rigid or flexible.**Three dimensional obstruction (3D)**: specific case of upward type, describes obstructions which are in mid-water (no structures near the bed nor the surface). This specific type has been typically dedicated to represent oyster bags.

Each obstruction element can be described in two ways depending on its geometry:

**cylinder-like**(e.g reeds or mussel rops)**parallelepiped-like**(e.g. seagrass leaves)

For upward or downward obstruction, obstruction can be **flexible**.
This means the obstruction elements will interact with ambient current flow while bending,
leading to changes in obstruction height, element density and horizontal cross-sectional area
depending on their bending angle.

The main formulations (cylinder case) of the module are :

for the drag part :

\[\begin{split}F_{u}(z) &= -\frac{1}{2} \cdot C_d \cdot \rho \cdot d_0(z) \cdot n(z) \cdot u(z) \cdot \sqrt{u(z)^2+v(z)^2} \cdot f_{z}(z) \cdot f_{xy}(z) \\ F_{v}(z) &= -\frac{1}{2} \cdot C_d \cdot \rho \cdot d_0(z) \cdot n(z) \cdot v(z) \cdot \sqrt{u(z)^2+v(z)^2} \cdot f_{z}(z) \cdot f_{xy}(z)\end{split}\]for the turbulence part :

\[\begin{split}(\frac{\partial k}{\partial t})_{obstruction} &= \frac{1}{1-A(z)} \cdot \frac{\partial }{\partial z} \biggl\{ (1-A(z)) \cdot \frac{\nu+\nu_t}{\sigma_k} \cdot \frac{\partial k}{\partial z} \biggr\} +T(z) \\ (\frac{\partial \epsilon}{\partial t})_{obstruction} &= \frac{1}{1-A(z)} \cdot \frac{\partial }{\partial z} \biggl\{ (1-A(z)) \cdot \frac{\nu+\nu_t}{\sigma_{\epsilon}} \cdot \frac{\partial \epsilon}{\partial z} \biggr\} +T(z) \cdot \tau_{\epsilon}^{-1}\end{split}\]

With :

\(C_d\) : the drag coefficient

\(d_0\) : the obsruction diameter

\(n\) : the obsruction density

\(f_z\) : the fraction of layer effectively occupied by obstructions

\(f_{xy}\) : the fraction of grid cell effectively occupied by obstructions

\(A\) : the horizontal cross-sectional obstruction area per unit area

\(T\) : a function of \(F_{u},F_{v}, u,v,\rho\)

\(\tau_{\epsilon}\) : a function of \(A, n, k, \epsilon, T\)

This module have been developped by Florian Ganthy coupled with MARS model
since 2011 (Ganthy *et al.* [2024]).
It has been implemented in CROCO in 2023-2024 with an 1DV module
(all computing are done within one (i,j) grid cell).

At each time step, the module execute the steps:

Reading forcing height,density, width and thickness of obstruction (if time varying)

Preparing hydrodynamic variables from CROCO :

current component u,v at the center of the cell

thicknesses of layers at the center of the cell

height of the center of each layer at the center of the cell

Computes obstructions height and bending angle (if flexible)

Computes vertical distribution of obstructions densities

Computes the fraction of sigma layer occupied by obstructions

Computes obstructions width and thickness according to bending angle (if flexible)

Computes obstructions correction term for coverage (fragmentation) within one single grid cell

Computes obstructions projected horizontal and vertical area

Computes obstructions bottom roughness (for obstruction represented as macro-roughness instead of turbulent approach)

Computes obstructions parameters used after by CROCO (drag and turbulence)

the sink terms for 3D friction force component at the center of the cell : \(F_{u}, F_{u}\)

the source terms : \(T, \tau_{\epsilon}\) for 3D turbulent dissipation at the center of the cell

the 3D obstruction vertical area for all obstructions \(A\)

Note

OBSTRUCTIONS module can only be used if #SOLVE3D and #GLS_KEPSILON are activated as the turbulence closure scheme in the equations is k-\(\epsilon\)

## 12.3.2. Inputs files#

To use the OBSTRUCTIONS module in CROCO you will need to :

activate module OBSTRUCTIONS within CROCO environment by defining the

**#OBSTRUCTION**cppkey.define path to the module main parameter file in CROCO input file

**croco.in**as follow. In this example, the file is located in TEST_CASES directory but it could be placed in any directory.

```
obstruction: input file
TEST_CASES/obstruction_seagrass_para.txt
```

Then you can compile and run CROCO as any other CROCO run.

### 12.3.2.1. Obstruction main parameter file#

This file is the main file of obstruction module. It’s where the number of obstruction and the path to specific parameters files are defined. It’s also where the output of obstruction variables is defined.

The file is structured in 3 namelists :

obst_main : number of obstruction and parameter for unconfined conditions

obst_input : paths to each obstruction variable file and to position file

obst_output : booleans to choose which variable will be outputed

Each namelist is described bellow with the description of each parameter.

&obst_main namelist:

**obst_nbvar**: number of obstructions**obst_c_paramhuv**: coefficient for unconfined conditions. For flexible obstructions, when model from Abdelrhman [2007] is not used but exponential formula is used (see parameter r_l_obst_param_height), obstruction’s height is compute using partial depth averaged velocity corresponding to unconfined canopy. This partial depth is computed from bottom (or surface depending on obstruction type) with formula: obst_c_paramhuv * height of obstruction at precedent time step. As default value, one could take obst_c_paramhuv=10.

&obst_input namelist:

**obst_fn_position**: file name for input obstruction variables positions, see position file**obst_fn_var**: list of paths to the parameter file of each obstruction variable. For example with obst_nbvar = 2 : ‘file1.txt’,’file2.txt’. See variable specific file

&obst_output namelist:

**l_obstout_pos**: write obstructions position within output file, one 2D variable per obstruction**l_obstout_height_f**: write obstructions forcing height within output file, one 2D variable per obstruction**l_obstout_height_e**: write obstructions effective height within output file, one 2D variable per obstruction**l_obstout_dens_f**: write obstructions forcing density within output file, one 2D variable per obstruction**l_obstout_dens_e**: write obstructions effective density within output file, one 3D variable per obstruction**l_obstout_width_f**: write obstructions forcing width, one 2D variable per obstruction**l_obstout_width_e**: write obstructions effective width, one 3D variable per obstruction**l_obstout_thick_f**: write obstructions forcing thick, one 2D variable per obstruction**l_obstout_thick_e**: write obstructions effective thick, one 3D variable per obstruction**l_obstout_theta**: write obstructions bending angle, one 3D variable per obstruction**l_obstout_frac_xy**: write obstructions fragmentation correction factor, one 2D variable per obstruction**l_obstout_frac_z**: write obstructions fraction of sigma layer occupied, one 3D variable per obstruction**l_obstout_fuzvz**: write obstructions resistance force 3D, two 3D variable (vector)**l_obstout_a2d**: write 2D obstructions horizontal area, one 2D variable per obstruction and 3 additionnal 2D variables to distinguish “No_turb” variables, “Turb” variable and “All” variables**l_obstout_a3d**: write 3D obstructions horizontal area, one 3D variable per obstruction and 3 additionnal 3D variables to distinguish “No_turb” variables, “Turb” variable and “All” variables**l_obstout_s2d**: write 2D obstructions vertical area, one 2D variable per obstruction and 3 additionnal 2D variables to distinguish “No_turb” variables, “Turb” variable and “All” variables**l_obstout_s3d**: write 3D obstructions vertical area, one 3D variable per obstruction and 3 additionnal 3D variables to distinguish “No_turb” variables, “Turb” variable and “All” variables**l_obstout_drag**: write obstructions drag coefficient, one 3D variable per obstruction**l_obstout_tau**: write obstructions turbulent stress, 3D variable

If you have several type of obstructions, the number of variables could become huge. Be careful to output only the needed variables.

“Turb”(“No_turb”) variables correspond to the contribution of obstructions with r_l_obst_noturb == False (True), see variable specific file.

Note

Variables dens_e, width_e, thick_e, theta, frac_xy, frac_z, a2d, s2d, s3d and drag are not allocated if not wanted in output. If you do not need them, put False in the corresponding boolean to reduce space disk and memory needs of your simulation

### 12.3.2.2. Obstruction variable specific characteristics file#

This file contains the characteristics of one type of obstruction structured in 7 namelists :

obst_var_main : main variable parameters

obst_var_option : variable behaviour’s options

obst_var_init : parameters relative to initialization

obst_var_flexibility : parameters relative to the flexible obctructions

obst_var_roughdrag : parameters relative to the roughness length and drag computing

obst_var_fracxy : parameters relative to small-scale patchiness correction

obst_var_bstress : parameters relative to the bottom shear stress

Each namelist is described bellow with the description of each parameter.

&obst_var_main namelist:

**r_obst_varname**: Name (identifier) of the variable, for example “Seagrass”**r_obst_type**: choice between “UP”, “DO”, “3D” :“UP” : if variable start from the bed

“DO” : if variable hang from sea-surface (down)

“3D” : if variable is full 3D (based on vertical density variation, see r_l_obst_filedistri and variable vertical distribution file)

**r_l_obst_cylinder**: boolean, True if variable representation is a cylinder (if False : parallelepiped)

&obst_var_option namelist:

**r_l_obst_flexible**: boolean, True if variable is flexible (if False : rigid)

**r_l_obst_noturb**: boolean, True, if variable should be represented as macro-roughness (instead of turbulent approach) (only for obstruction of type “UP”)**r_l_obst_filetimeserie**: boolean, True to use a time-series (not spatial) of obstructions characteristics. NOT AVAILABLE with r_l_obst_init_spatial = .TRUE.**r_obst_fn_timeserie**: Netcdf file containing temporal obstructions characteristics (if r_l_obst_filetimeserie = .TRUE.), For information about format, see variable temporal file

**r_l_obst_filedistri**: To use a file describing the vertical distribution of obstruction density**r_obst_fn_distrib**: File containing the vertical distribution of obstruction density (if r_l_obst_filedistri = .TRUE.), see variable vertical distribution file

&obst_var_init namelist:

**r_l_obst_init_spatial**: boolean, True to use spatially variable file (not temporal) of obstructions characteristics. NOT AVAILABLE with r_l_obst_filetimeserie = .TRUE.**r_obst_fn_initspatial**: Netcdf file containing spatial obstructions characteristics (if r_l_obst_init_spatial = .TRUE.) (variables : height,width,thick and dens) For information about format see : initialization spatial file**r_obst_i_height**: Initial height (unbent, eg. leaf-length for segrasses) of obstructions, used if not spatial initialisation (r_l_obst_init_spatial = .FALSE.)**r_obst_i_width**: Initial width (or diameter for cylindric obstructions) of obstructions (perpendicular to flow), used if not spatial initialisation (r_l_obst_init_spatial = .FALSE.)**r_obst_i_thick**: Initial thick (or diameter for cylindric obstructions) of obstructions (along the flow), used if not spatial initialisation (r_l_obst_init_spatial = .FALSE.).**r_obst_i_dens**: Initial density of obstructions (maximum density if using a vertical distribution file), used if not spatial initialisation (r_l_obst_init_spatial = .FALSE.)

Note

Width (r_obst_i_width) should equal thickness (r_obst_i_thick) for cylindric obstructions

If the obstruction is flexible, the obstruction posture is computed at each time step depending on current (u,v) with an update of obstruction bending depending on the folowing 3 options :

Abdelrhman [2007] procedure,

exponential decrease, using r_obst_c_height_x0 and r_obst_c_height_x1,

proportional (no influence of current), using only r_obst_c_height_x0

To choose an option and the corresponding parameters, fill the &obst_var_flexibility namelist:

**r_l_obst_abdelposture**: boolean, True to use Abdelrhman [2007] procedure to compute bending**r_obst_c_abdel_nmax**: Number of segments for Abdelrhman [2007] procedure**r_obst_c_rho**: Volumic mass of obstructions for Abdelrhman [2007] procedure**r_obst_c_lift**: Lift coefficient for Abdelrhman [2007] procedure**r_obst_c_shelter**: Sheltering coefficient A for Abdelrhman [2007] procedure

**r_l_obst_param_height**: boolean, True to use exponential decrease formulation to compute bending (height = r_obst_c_height_x0 * height * EXP(r_obst_c_height_x1*uv), with uv the partial depth averaged velocity corresponding to unconfined canopy)**r_obst_c_height_x0**: First parameter for empirical formulation**r_obst_c_height_x1**: Second parameter for empirical formulation

&obst_var_roughdrag namelist:

**r_l_obst_drag_cste**: To use a constant drag coefficient (r_obst_c_drag) for \(C_d\) (see equations) (if false, drag varies depending on the bending angle)**r_obst_c_drag**: Drag coefficient \(C_d\) (maximum value if not constant) for obstructions elements**r_obst_c_lz**: Coefficient for turbulent dissipation time-scale between obstructions elements (used to compute \(\tau_{\epsilon}\) in equations)**r_l_obst_abdelrough_cste**: To use a constant coefficient during Abdelrhman [2003] procedure used to compute obstruction macro-roughness**r_obst_c_crough_x0**: First coefficient for drag coefficient during Abdelrhman [2003] procedure**r_obst_c_crough_x1**: Second coefficient for drag coefficient during Abdelrhman [2003] procedure

If obstructions do not fill completly the cell surface, a patchiness correction can be applied using the fraction of cell occupied by obstructions (given in position file) and several parametrization given in &obst_var_fracxy namelist:

**r_l_obst_fracxy**: boolean, True to take account for patchiness correction (if false, no correction is applied)**r_obst_fracxy_type**: if r_l_obst_fracxy is True, choose the kind of correction method :0 : patchiness correction is equal to the fraction of cell occupied by obstructions (given in position file)

1 : patchiness correction is equal to an exponential of the fraction of cell occupied by obstructions with one coefficient (r_obst_c_fracxy_k0)

2 : patchiness correction is equal to an exponential of the fraction of cell occupied by obstructions with several coefficients (r_obst_c_fracxy_k0, r_obst_c_fracxy_k1 and r_obst_c_fracxy_l)

3 : patchiness correction is equal to the product of the fraction of cell occupied by obstructions and r_obst_c_fracxy_k0

**r_obst_c_fracxy_k0**: Coefficient for the corrections type 1, 2 and 3**r_obst_c_fracxy_k1**: First parameter for correction of the exponential coefficient (type 2)**r_obst_c_fracxy_l**: Second parameter for correction of the exponential coefficient (type 2)

If a sediment model is used (here available with MUSTANG), the OBSTRUCTIONS module can be used to modify the roughness length used to compute the bottom shear stress. The corresponding parameters are in &obst_var_bstress namelist:

**r_l_obst_z0bstress**: To activate the impact of obstruction on roughness length used to compute the bottom shear stress (only for UP type)**r_obst_z0bstress_option**: Option to compute the obstruction induced roughness length:0 : constant z0 (r_obst_c_z0bstress)

1 : parameterization

**r_obst_c_z0bstress**: Constant (uncorrected value of roughness length)**r_obst_c_z0bstress_x0**: First parameter for rouhgness length computation (in 3D)**r_obst_c_z0bstress_x1**: Second parameter for rouhgness length computation (in 3D)

### 12.3.2.3. Obstruction variable specific vertical distribution file#

To specified 3D obstruction or a variation of obstruction density on its height, a text file can be used to specified the fraction (in %, between 0 and 100) of density to apply at a fraction of height (in %, between 0 and 100) .

Example for a density equal to 100% of the specified density through 0 to 50% of specified height and 50% above :

```
name
nb_hnorm
4
Hnorm nnorm
0. 100
50. 100
50.0001 50
100.100 50
END OF FILE
```

The number of vertical discretization is given on line number 3. The readed lines begin at line number 5.

Example to specified a 3D obsctruction :

```
Table
nb_hnorm
4
Hnorm nnorm
0.0000 0
87.5 0
87.5001 100.
100.100 100.
END OF FILE
```

### 12.3.2.4. Obstruction position file#

This file is a netcdf file containing the fraction of cell occupied by obstructions (value from 0 to 1) on the model grid.

The dimension are the same as the grid file (eta_rho, xi_rho). The name of the variable must be pos_<obstruction name> (with obstruction name given in obst_var_main)

Example with an obstruction named Obstruct :

```
netcdf obstruction_seagrass_position {
dimensions:
eta_rho = 7 ;
time = UNLIMITED ; // (1 currently)
xi_rho = 38 ;
variables:
float pos_Obstruct(time, eta_rho, xi_rho) ;
pos_Obstruct:_FillValue = NaN ;
double time(time) ;
time:long_name = "time since initialization" ;
time:units = "seconds since 2019/01/01 00:00:00" ;
time:field = "time, scalar, series" ;
time:standard_name = "time" ;
time:axis = "T" ;
}
```

Only the first time index is read.

### 12.3.2.5. Obstruction initialization spatial file#

This file is a netcdf file containing the variables : height, density, width and thickness on the model grid.

The dimension are the same as the grid file (eta_rho, xi_rho). The name of the variable must be :

height_f_<obstruction name>

dens_f_<obstruction name>

width_f_<obstruction name>

thick_f_<obstruction name>

(with obstruction name given in obst_var_main)

Example with an obstruction named Obstruct :

```
ncdump -h ../ktest/SEAGRASS_initspatial/spatial.nc
netcdf spatial {
dimensions:
xi_rho = 38 ;
eta_rho = 7 ;
time = UNLIMITED ; // (1 currently)
variables:
double time(time) ;
time:long_name = "time since initialization" ;
time:units = "seconds since 2019/01/01 00:00:00" ;
time:field = "time, scalar, series" ;
time:standard_name = "time" ;
time:axis = "T" ;
float height_f_Obstruct(time, eta_rho, xi_rho) ;
height_f_Obstruct:long_name = "Obstruction forcing height for Obstruct" ;
height_f_Obstruct:units = "m" ;
height_f_Obstruct:field = "" ;
height_f_Obstruct:coordinates = "time lat_rho lon_rho" ;
float dens_f_Obstruct(time, eta_rho, xi_rho) ;
dens_f_Obstruct:long_name = "Obstruction forcing density for Obstruct" ;
dens_f_Obstruct:units = "m-2" ;
dens_f_Obstruct:field = "" ;
dens_f_Obstruct:coordinates = "time lat_rho lon_rho" ;
float width_f_Obstruct(time, eta_rho, xi_rho) ;
width_f_Obstruct:long_name = "Obstruction forcing width for Obstruct" ;
width_f_Obstruct:units = "m" ;
width_f_Obstruct:field = "" ;
width_f_Obstruct:coordinates = "time lat_rho lon_rho" ;
float thick_f_Obstruct(time, eta_rho, xi_rho) ;
thick_f_Obstruct:long_name = "Obstruction forcing thickness for Obstruct" ;
thick_f_Obstruct:units = "m" ;
thick_f_Obstruct:field = "" ;
thick_f_Obstruct:coordinates = "time lat_rho lon_rho" ;
}
```

Only the first time index is read.

### 12.3.2.6. Obstruction temporal file#

This file is a netcdf file containing the variables : height, density, width and thickness.

The name of the variable must be :

height_f_<obstruction name>

dens_f_<obstruction name>

width_f_<obstruction name>

thick_f_<obstruction name>

(with obstruction name given in obst_var_main)

The only axis heare is time. The height, density, width and thickness values are applied where the fraction of cell occupied by obstructions is greater than 0 (given in position file).

Example with an obstruction named Obstruct :

```
netcdf timeserie2 {
dimensions:
time = UNLIMITED ; // (741 currently)
variables:
float dens_f_Obstruct(time) ;
dens_f_Obstruct:long_name = "Obstruction forcing density for Obstruct" ;
dens_f_Obstruct:units = "m-2" ;
dens_f_Obstruct:field = "" ;
dens_f_Obstruct:coordinates = "time lat_rho lon_rho" ;
dens_f_Obstruct:cell_methods = "eta_rho, xi_rho: mean" ;
float height_f_Obstruct(time) ;
height_f_Obstruct:long_name = "Obstruction forcing height for Obstruct" ;
height_f_Obstruct:units = "m" ;
height_f_Obstruct:field = "" ;
height_f_Obstruct:coordinates = "time lat_rho lon_rho" ;
height_f_Obstruct:cell_methods = "eta_rho, xi_rho: mean" ;
float thick_f_Obstruct(time) ;
thick_f_Obstruct:long_name = "Obstruction forcing thickness for Obstruct" ;
thick_f_Obstruct:units = "m" ;
thick_f_Obstruct:field = "" ;
thick_f_Obstruct:coordinates = "time lat_rho lon_rho" ;
thick_f_Obstruct:cell_methods = "eta_rho, xi_rho: mean" ;
double time(time) ;
time:long_name = "time since initialization" ;
time:units = "seconds since 2019/01/01 00:00:00" ;
time:field = "time, scalar, series" ;
time:standard_name = "time" ;
time:axis = "T" ;
float width_f_Obstruct(time) ;
width_f_Obstruct:long_name = "Obstruction forcing width for Obstruct" ;
width_f_Obstruct:units = "m" ;
width_f_Obstruct:field = "" ;
width_f_Obstruct:coordinates = "time lat_rho lon_rho" ;
width_f_Obstruct:cell_methods = "eta_rho, xi_rho: mean" ;
}
```

## 12.3.3. Outputs#

### 12.3.3.1. Using CROCO output file#

To select whether a variable is written to the output file, the boolean in namelist &obst_output has to be filled in.

Note

Variables dens_e, width_e, thick_e, theta, frac_xy, frac_z, a2d, s2d, s3d and drag are not allocated if not wanted in output. If you do not need them, put False in the corresponding boolean to reduce space disk and memory needs of your simulation

### 12.3.3.2. Using XIOS#

XIOS can be used to output the same variables as in CROCO output file.

Example of a .xml field file for a case with one obstruction called “Obstruct”. The id of each field has to be coherent with the given name of obstruction.

```
<field_group id="rho" grid_ref="rho_2D">
<field id="pos_Obstruct"
long_name="Obstruction occupation rate for Obstruct"
unit="-" grid_ref="rho_2D" />
<field id="height_f_Obstruct"
long_name="Obstruction forcing height for Obstruct"
unit="m" grid_ref="rho_2D" />
<field id="height_e_Obstruct"
long_name="Obstruction effective height for Obstruct"
unit="m" grid_ref="rho_2D" />
<field id="dens_f_Obstruct"
long_name="Obstruction forcing density for Obstruct"
unit="m-2" grid_ref="rho_2D" />
<field id="dens_e_Obstruct"
long_name="Obstruction effective density for Obstruct"
unit="m-2" grid_ref="rho_3D" />
<field id="width_f_Obstruct"
long_name="Obstruction forcing width for Obstruct"
unit="m" grid_ref="rho_2D" />
<field id="width_e_Obstruct"
long_name="Obstruction effective width for Obstruct"
unit="m" grid_ref="rho_3D" />
<field id="thick_f_Obstruct"
long_name="Obstruction forcing thickness for Obstruct"
unit="m" grid_ref="rho_2D" />
<field id="thick_e_Obstruct"
long_name="Obstruction effective thickness for Obstruct"
unit="m" grid_ref="rho_3D" />
<field id="theta_Obstruct"
long_name="Obstruction bending angle for Obstruct"
unit="deg" grid_ref="rho_3D" />
<field id="frac_xy_Obstruct"
long_name="Obstruction fragmentation correction factor for Obstruct"
unit="-" grid_ref="rho_2D" />
<field id="frac_z_Obstruct"
long_name="Obstruction sigma fraction for Obstruct"
unit="-" grid_ref="rho_2D" />
<field id="cd3d_Obstruct"
long_name="Obstruction drag coefficient for Obstruct"
unit="-" grid_ref="rho_3D" />
<field id="a2d_Obstruct"
long_name="2D Obstruction horizontal area for Obstruct"
unit="-" grid_ref="rho_2D" />
<field id="a3d_Obstruct"
long_name="3D Obstruction horizontal area for Obstruct"
unit="-" grid_ref="rho_3D" />
<field id="s2d_Obstruct"
long_name="2D Obstruction vertical area for Obstruct"
unit="-" grid_ref="rho_2D" />
<field id="s3d_Obstruct"
long_name="3D Obstruction vertical area for Obstruct"
unit="-" grid_ref="rho_3D" />
<field id="a2d_NoTurb"
long_name="2D Obstruction horizontal area for NoTurb variables"
unit="-" grid_ref="rho_2D" />
<field id="a2d_Turb"
long_name="2D Obstruction horizontal area for Turb variables"
unit="-" grid_ref="rho_2D" />
<field id="a2d_All"
long_name="2D Obstruction horizontal area for All variables"
unit="-" grid_ref="rho_2D" />
<field id="a3d_NoTurb"
long_name="3D Obstruction horizontal area for NoTurb variables"
unit="-" grid_ref="rho_3D" />
<field id="a3d_Turb"
long_name="3D Obstruction horizontal area for Turb variables"
unit="-" grid_ref="rho_3D" />
<field id="a3d_All"
long_name="3D Obstruction horizontal area for All variables"
unit="-" grid_ref="rho_3D" />
<field id="s2d_NoTurb"
long_name="2D Obstruction vertical area for NoTurb variables"
unit="-" grid_ref="rho_2D" />
<field id="s2d_Turb"
long_name="2D Obstruction vertical area for Turb variables"
unit="-" grid_ref="rho_2D" />
<field id="s2d_All"
long_name="2D Obstruction vertical area for All variables"
unit="-" grid_ref="rho_2D" />
<field id="s3d_NoTurb"
long_name="3D Obstruction vertical area for NoTurb variables"
unit="-" grid_ref="rho_3D" />
<field id="s3d_Turb"
long_name="3D Obstruction vertical area for Turb variables"
unit="-" grid_ref="rho_3D" />
<field id="s3d_All"
long_name="3D Obstruction vertical area for All variables"
unit="-" grid_ref="rho_3D" />
<field id="fuzvz_uz"
long_name="Obstruction 3D friction force FUZ"
unit="N.m-2" grid_ref="rho_3D" />
<field id="fuzvz_vz"
long_name="Obstruction 3D friction force FVZ"
unit="N.m-2" grid_ref="rho_3D" />
<field id="tau3d"
long_name="Obstruction 3D turbulent dissipation"
unit="N.m-2" grid_ref="rho_3D" />
</field_group>
```

## 12.3.4. Example#

A test case is provided with cppkey #SEAGRASS. See SEAGRASS for more informations.