ESYSMooring user guide#

ESYSMooring is the DLL that allows you to model mooring lines and guy wires in HAWC2.

This DLL implements the equations of motion of a mooring line element. An extended description of the mathematical model can be found in Hansen and Kallesøe [^OO7vC4dA9n][^OO7vC4dA9n]: A.M.Hansen and B.Kallesøe “Detailed and reduced models of dynamic mooring systems”, In: Hansen, M. H., and Zahle, F. (2011). Aeroelastic Optimization of MW Wind Turbines. Roskilde: Danmarks Tekniske Universitet, Risø Nationallaboratoriet for Bæredygtig Energi. Denmark. Forskningscenter Risoe. Risoe-R; No. 1803(EN), link.

Via the ESYSMooring, a user can specify and define two main components, that univocally define a mooring system: the mooring lines themselves (named elasticbar) and a set of constraints where the mooring line can be fixed either to the global reference system, to another node of the HAWC2 structure, or to another mooring line, to generate more complex mooring geometries. We will hereafter see how to specify lines and how to connect them through constraints.

Definition of the mooring line#


begin ext_sys              ;
 module  ElasticBar          ;
 name   <line name>          ;
 dll        ESYSMooring.dll    ;
 ndata <n>                ;
 data nelem <n>             ;
 data mass <ma> <mw>           ;
 data start_pos <X> <Y> <Z>       ;
 data end_pos <X> <Y> <Z>        ;
 data cdp_cdl_cm <cdp> <cdl> <cm>    ;
 data axial_stiff <EA>          ;
 data read_write_initcond_file <fname>  ;
 data read_write_initcond <rd> <wr>   ;
 data bottom_prop <z0> <d0> <dr>     ;
 data damping_ratio <sdr>        ;
 data apply_wave_forces <wa>       ;
 data apply_wind_forces <wi>       ;
 data output position <node>       ;
 data output force <ielem>        ;
 data output strain <ielem>       ;
 data mass_summary <file>        ;
 data end                ;
end  ext_sys 
  

Obl.

Command name

Explanation

*

begin ext_sys ;

First line in ESYSMooring.

module ElasticBar ;

Module ID (Fixed)

name <line name>

Name of system, used as a reference. It becomes especially useful when you have more than one mooring system.

dll ESYSMooring.dll

DLL file name (including path)

ndata <n>

Number of data input lines below, including the “data end” line. Remember that commented lines are excluded from the count.

data nelem <n>

Numer of elements by which we discretize the mooring line

data mass <ma> <mw>

Mass per length [kg/m].

1. <ma> : mass per length in air

2. <mw> : mass per length in water, normally computed as mw - rho_water*A, where A is the cross sectional area of the line

data start_pos <X> <Y> <Z>

X-Y-Z-coordinate for first node (global coordinates)

data end_pos <X> <Y> <Z>

X-Y-Z-coordinate for last node (global coordinates)

data cdp_cdl_cm <cdp> <cdl> <cm>

The hydrodynamic coefficients of the line. For drag, the velocity in each node is decomposed into a perpendicular and an axial component, and the force/length in each of the directions is calculated as: q = cd*abs(v)*v, so cd-units=\([N/m/(m/s)^2]\). The same principle is used for cm, except only the perpendicular direction is active, ie. cm-unit \([N/m/(m/s^2)]\)

1. <cdp> Drag coefficient perpendicular to the element.

2. <cdl> Drag coefficient along the element.

3. <cm> Mass coefficient.

data axial_stiff <EA_1> <EA_2>…<EA_N>

Hyper-elastic axial stiffness of line [N] where the axial force, \(T\) is related to the Green’s strain, \(\epsilon\), as \(T = \sum_{i=1}^N (EA_i \epsilon^i)\).

data read_write_initcond_file <fname>

File name where initial conditions are read/written to (default=”ESYSMooring_init.dat”)

data read_write_initcond <rd> <wr>

Read/write position of the nodes. If <rd>=1, the initial positions of the nodes are read from file ESYSMooring_init.dat ; at the start of simulation. If <wr>=1, the node positions are written to same file when simulation ends.

data bottom_prop <z0> <d0> <dr>

Bottom properties.

1. <z0> [m] is the Z coordinate of the bottom (in global coordinates)

2. <d0> [m] is the penetration depth into the bottom. When an element lies on the bottom exposed to gravity and buoyancy (used to define the bottom sprinf stiffness)

3. <dr> [-] defines the bottom damper system as the damping ratio of the element lying on the bottom. ; NOTE: IF BOTTOM PROPERTIES ARE NOT NEEDED, MAKE <z0> SUFFICIENTLY LARGE TO AVOID BOTTOM CONTACT.

data damping_ratio <sdr>

Structural damping ratio, defined as the damping ratio of 1st axial mode of the free-free line [-]

data apply_wave_forces <wa>

If <wa>=1, wave kinematics is read and used to calculate drag/added mass forces. This option is mutually exclusive with apply_wind_forces

data apply_wind_forces <wi>

If <wi>=1, wind speed read and used to calculate drag/added mass forces.

data output position <node>

Write global position of node number <node> to output file. (only if “ESYS <line name> ;” is defined in output block of htc file.)

data output force <ielem>

Write force in element number <ielem> to output file. (only if “ESYS <line name> ;” is defined in output block of htc file.)

data output strain <ielem>

Write strain in element number <ielem> to output file. (only if “ESYS <line name> ;” is defined in output block of htc file.)

data mass_summary <file>

Write summary of all ElasticBar objects to <file>

data creep_time <tstart>

Time [s] when creep models are activated (default=0s).

data creep_kc <K> <tau>

Creep model consisting of a spring/damper system (in series) which act in parallel with the “axial_stiff” spring. The spring has the stiffness <K> [N] and the damping is defined via the time constant <tau>=C/K [s]. For each “creep_kc” line, one new spring/damper system is added parallel with the other systems.

data pretension <T>

Pre-tension [N]. The un-stretched length of the line is adjusted (relative to the length between start and end position) according to the strain caused by the pre-tension. Initial position of the nodes are distributed between start and end positions so that the initial pre-tension in each element is equal to <T>.

data end

MUST be the last line in the input block

Constraints#

There are 4 types of constraints, that are able to describe different ways to anchor the mooring lines.

  • Bar fixed to bar: a mooring element is fixed to another mooring element

  • Bar fixed to global: a mooring element is fixed to a global reference

  • Bar fixed to body: a mooring line is fixed to an HAWC2 beam node

  • Bar fixed to body relative: a mooring line is fixed to an HAWC2 beam mode, but is possible to specify an offset from a certain node.

Each one of those has a slightly different interface.

Bar fixed to bar (cstrbarfixedtobar)#


 begin  dll                     ;  
 dll   .\ESYSMooring.DLL            ;    
 init  cstrbarfixedtobar_init   ;  
 update cstrbarfixedtobar_update  ;  Update procedure name
 neq   3                ;    NOF constraint equations
 nbodies 0              ;  NOF bodies involved
 nesys  2              ;  NOF ESYSs involved
 esys_node    line1  10       ;  ESYS name and node number for 1st node
 esys_node    line2   1       ;  ESYS name and node number for 2nd node
end   dll                 ;  

Obl.

Command name

Explanation

*

begin dll ;

First line in ESYSMooring.

dll <name>

DLL name

init cstrbarfixedtobar_init

Init procedure name. Not to be altered

update cstrbarfixedtobar_update

Update procedure name. Not to be altered

neq <n>

Number of constraint equations, normally 3.

nbodies <n>

Number of bodies involved. This is zero for this type of constraint, as it’s a line-to-line constraint.

nesys <n>

Number of esys involved. This is different from zero for this type of constraint, normally 2 if two lines are involved.

esys_node <name> <node>

ESYS name and node number for a node. This command needs to be specified more than once, for all the lines involved.

<name> is the name specified in the definition block for the line under consideration, see Definition of the mooring line.

<node> is an integer specifying the node nr.

Bar fixed to bar (cstrbarfixedtoglobal)#


 begin  dll           ;    
 dll   .\ESYSMooring.DLL            ;    DLL name
 init  cstrbarfixedtoglobal_init  ;  Init procedure name
 update cstrbarfixedtoglobal_update ;  Update procedure name
 neq   3                ;    NOF constraint equations
 nbodies 0              ;  NOF bodies involved
 nesys  1              ;  NOF ESYSs involved
 esys_node    line1_1 1       ;  ESYS name and node number
end   dll                 ;  

Obl.

Command name

Explanation

*

begin dll ;

First line in ESYSMooring.

dll <name>

DLL name

init cstrbarfixedtoglobal_init

Init procedure name. Not to be altered

update cstrbarfixedtoglobal_update

Update procedure name. Not to be altered

neq <n>

Number of constraint equations, normally 3.

nbodies <n>

Number of bodies involved. This is zero for this type of constraint, as the line is fixed to the global reference system.

nesys <n>

Number of esys involved. This is 1 for this type of constraint.

esys_node <name> <node>

ESYS name and node number for a node. This command needs to be specified once for every node that is considered fixed to the global reference system.

<name> is the one specified in the line definition block, see Definition of the mooring line.

<node> is an integer specifying the node nr.

Bar fixed to bar (cstrbarfixedtobody)#


 begin  dll           ;    
 ID   100.0                  ;    time to satisfy constraint [sec]
 dll   .\ESYSMooring.DLL                ;    DLL name
 init  cstrbarsfixedtobody_init      ;  Init procedure name
 update cstrbarsfixedtobody_update     ;  Update procedure name
 neq   3                    ;    NOF constraint equations
 nbodies 1                  ;  NOF bodies involved
 nesys  1                  ;  NOF ESYSs involved
 mbdy_node    arm1  2            ;    Bode name and node number
 esys_node    line1_1 31           ;  ESYS name and node number
end   dll  

Obl.

Command name

Explanation

*

begin dll ;

First line in ESYSMooring.

ID <time>

Time at which the constraint should be satisfied. This is useful when initializing the mooring system, see Procedure for mooring initialization.

dll <name>

DLL name

init cstrbarsfixedtobody_init

Init procedure name. Not to be altered

update cstrbarsfixedtobody_update

Update procedure name. Not to be altered

neq <n>

Number of constraint equations, normally 3.

nbodies <n>

Number of bodies involved. This is different from zero for this type of constraint, as there should at least be a body involved.

nesys <n>

Number of esys involved. This is 1 or more for this type of constraint.

esys_node <name> <node>

ESYS name and node number for a node. This command needs to be specified once for each node of the linex involved in the constraint.

<name> is the one specified in the line definition block, see Definition of the mooring line.

<node> is an integer specifying the node nr.

nbodies <n>

Number of bodies involved in the constraint

mbdy_node <name> <node>

multibody name and node number for a node. This command needs to be specified once for each node of the multibody involved in the constraint.

<name> is the one specified in the multibody definition block.

<node> is an integer specifying the node nr.

Bar fixed to bar (cstrbarfixedtobodyrelative)#


 begin  dll           ;    
 ID   0.0 1.0 0.0 100.0            ;    vector from body node (in body coordinates)(x,y,z)([m],[m],[m]), time to satisfy constraint [sec]
 dll   .\ESYSMooring.DLL                ;    DLL name
 init  cstrbarsfixedtobodyrelative_init  ;  Init procedure name
 update cstrbarsfixedtobodyrelative_update ;  Update procedure name
 neq   3                    ;    NOF constraint equations
 nbodies 1                  ;  NOF bodies involved
 nesys  1                  ;  NOF ESYSs involved
 mbdy_node    arm1  2            ;    Bode name and node number
 esys_node    line1_1 31           ;  ESYS name and node number
end   dll 

Obl.

Command name

Explanation

*

begin dll ;

First line in ESYSMooring.

ID <x> <y> <z> <time>

Vector from the body node (in body coordinates), units [m] and time [sec] at which the constraint should be satisfied. This is useful when initializing the mooring system, see Procedure for mooring initialization.

dll <name>

DLL name

init cstrbarsfixedtobody_init

Init procedure name. Not to be altered

update cstrbarsfixedtobody_update

Update procedure name. Not to be altered

neq <n>

Number of constraint equations, normally 3.

nbodies <n>

Number of bodies involved. This is different from zero for this type of constraint, as there should at least be a body involved.

nesys <n>

Number of esys involved. This is 1 or more for this type of constraint.

esys_node <name> <node>

ESYS name and node number for a node. This command needs to be specified once for each node of the linex involved in the constraint.

<name> is the one specified in the line definition block, see Definition of the mooring line.

<node> is an integer specifying the node nr.

nbodies <n>

Number of bodies involved in the constraint

mbdy_node <name> <node>

multibody name and node number for a node. This command needs to be specified once for each node of the multibody involved in the constraint.

<name> is the one specified in the multibody definition block.

<node> is an integer specifying the node nr.

Procedure for mooring initialization#

When initializing a simulation with a mooring system, it is often important to initialize the connection with the mooring system as well. The initial position and tension of the lines should be as close as possible to the equilibrium position, otherwise quite large oscillations can be triggered at the beginning of the simulation, which, depending on the natural frequencies of the system and on the damping level, can last for many seconds, unnecessarily increasing the transient time and possibly posing threats to the stability and convergence of the simulation.

Unless the configuration of the lines is simple (e.g. a vertical tendon or a taut line with a certain angle), the initial position of the line elements is normally difficult to precompute. The strategy that is here suggested therefore consists in two steps:

  1. Run a line initialization simulation and store the final position of the lines

  2. Read in the stored line position and use it as initial condition for the mooring system in the production simulation

An example on the procedure is available in our public example library here. The two steps are here described in more detail:\

1. Line initialization: In the line initialization simulation, we start with the lines in a simple, unloaded position. For a catenary line, it could be a position for which it is lying flat on the seabed. We then make use of the time option in the cstrbarfixedtobody and cstrbarfixedtobodyrelative constraints, see Bar fixed to bar (cstrbarfixedtobody) and Bar fixed to bar (cstrbarfixedtobodyrelative) to fix a line to a body after a certain specified time. This will allow the line to move to the specified position and assume a natural position, that is then physically accurate as it will be computed by the structural solver itself. The time at which the constraint is satisfied needs to be long enough so that the structural accelerations of the lines is small. If not, traveling waves can be generated in the line, which may take a long time to damp out, artificially increasing the transient. This initialization simulation is best run without water and wind forces. We then use the option data read_write_initcond 0 1 in the line initialization to write a file containing the position of the nodes of the line at final position, i.e. at the end of the simulation time.

2. Production run: The final position of the files stored in the above mentioned file will consist in the initial condition of the lines in the production simulation. With this respect, the command needs now to be changed to data read_write_initcond 1 0 to signify that the initial condition is now read and not written to file. The time in the ID <x> <y> <z> <time> and ID <time> respectively for the fixed to body relative and fixed to body constraints can now be set to a small value, ideally to zero. However, small discrepancies are to be expected between the final position of the line in the initialization simulation and the required initial position in the production run, so a value different from zero may be used here.

Important notes for the line initialization procedure#

  • The initialization and production simulation do not need to be the same, i.e. to have the same number of bodies. As far as the final position of the line is consistent, the initialization simulation could be run with a single dummy body.

  • It is suggested to fix all present multibodies to the global reference system when running the initialization simulation, and possibly to turn off gravity on them, but not the one for the lines, as f.ex. in catenary mooring we do want the lines to assume a natural shape, driven by their own weight.

  • It is suggested to switch off the wave and wind loads for the lines in the initialization simulation, as this could lead to convergence issues.

  • The simulation time for the initialization simulation needs to be larger or equal to the time at which the constraint is satisfied.

Format of the line initialization file#

The file that is written by ESYSMooring initialization routine is quite simple. In practice, it stores the coordinates of the nodes sequentially, stasrting from node 1 to the last node, in global coordinates. If the same file is specified for all the lines via the data read_write_initcond_file <fname>  ; command, then the node coordinates are written in the same order in which the lines are defined. If the file name is not provided,the default file name is used, ESYSMooring_init.dat.

Assuming we have m lines, each one with n nodes, the format of the file is therefore:


  l1_x1 l1_y1 l1_z1
  l1_x2 l1_y2 l1_z2
  ...
  l1_xn l1_yn l1_zn
  l2_x1 l2_y1 l2_z1
  l2_x2 l2_y2 l2_z2
  ...
  lm_xn lm_yn lm_zn

where l1_x1 is the x-coordinate for the first node of the first line, while lm_yn is the y-coordinate of the n-th node of the m-th line.

If particular initial conditions of the lines are needed, the coordinates of the nodes can f.ex. be generated via a scripting language and then written to file in this format. If properly formatted, ESYSMooring will be able to load them in.

List of Channels in the HAWC2 output#

To switch on the output for a generic line named lineX  the following line needs to be specified in the HAWC2 output section


  esys	lineX; 

In the HAWC2 output files, the results for the mooring line are stored according to the following format. The output comes in blocks of 4 values, which are the X,Y,Z position of a mooring node and the axial tension experienced at that node. For a given mooring line lineX discretized in N elements, the line will have N+1 nodes and the output channels will be sorted like shown below. All coordinates are given in HAWC2’s global coordinate system.


ESYS lineX SENSOR	1			X position of 	node 1
ESYS lineX SENSOR	2			Y position of 	node 1
ESYS lineX SENSOR	3			Z position of	node 1
ESYS lineX SENSOR	4			Tension at 		node 1

...

ESYS lineX SENSOR	4*i-3		X position of 	node i
ESYS lineX SENSOR	4*i-2		Y position of 	node i
ESYS lineX SENSOR	4*i-1 		Z position of	node i
ESYS lineX SENSOR	4*i			Tension at 		node i

...

ESYS lineX SENSOR	4*(N+1)-3	X position of 	node N+1
ESYS lineX SENSOR	4*(N+1)-2	Y position of 	node N+1
ESYS lineX SENSOR	4*(N+1)-1 	Z position of	node N+1
ESYS lineX SENSOR	4*(N+1)		Tension at 		node N+1