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.

../_images/obstruction_intro.png

Description of 3 types of obstructions#

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.

../_images/obstruction_flexibility.png

Description of the effect of flexibility on obstructions#

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 :

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” :

  • 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.