diff --git a/dev/.documenter-siteinfo.json b/dev/.documenter-siteinfo.json index 2d769ac..275fb13 100644 --- a/dev/.documenter-siteinfo.json +++ b/dev/.documenter-siteinfo.json @@ -1 +1 @@ -{"documenter":{"julia_version":"1.11.1","generation_timestamp":"2024-10-17T16:21:41","documenter_version":"1.7.0"}} \ No newline at end of file +{"documenter":{"julia_version":"1.11.1","generation_timestamp":"2024-10-17T22:17:24","documenter_version":"1.7.0"}} \ No newline at end of file diff --git a/dev/FramesOfReference/index.html b/dev/FramesOfReference/index.html index 641c199..8b6b96a 100644 --- a/dev/FramesOfReference/index.html +++ b/dev/FramesOfReference/index.html @@ -1,2 +1,2 @@ -- · OWENS.jl

OWENS X is outwards on blade, y is trailing edge always

Struts, CCW, z is inwards, y trailing, and CW z is outwards

Aerodyn

if CW z is up, y is trailing (root at bottom) blades, z is outwards and y is towards trailing edge. If struts have asymmetric, then you need to align your desired suction side with the x-vector, which means you might have to invert your airfoil lookup tables for struts that the suction side isn’t where you want it.

Aerodyn if CCW, root is at top and z is down, y is trailing edge, for struts, z is outwards, and y is trailing edge.

Hub is rotated such that the axis of rotation is x. So for a VAWT hub-x points up, and hawt hub-x point in x.

{width="4.917280183727034in" height="4.585993000874891in"}{width="5.469136045494313in" height="5.071805555555556in"}Meet porcupine the OWENS element orientation helper. It is comprised of a tower, horizonal struts, and blades that have both curved and vertical sections. Let's start with all of the orientations set to 0. We can see that the 1,0,0 norm is in the positive x direction, and likewise for the y and z norms.

Now, let's turn on just the yaw orientation, (psi in OWENS). The top blade gets a -90 degree yaw shift (like the other blades), and the other blades' yaw is additionally rotated to match the global blade orientation around the turbine axis of rotation. Yes the initial 90 degree shift is confusing, but it is the convention in the structural solver – is seems that the z-norm of the blade is intended to be eventually pointing away from the axis of rotation.

{width="5.595138888888889in" height="4.875694444444444in"}{width="5.737141294838145in" height="5.283430664916885in"}

If we add 30 degrees of rotation to the yaw, this is what it looks like.

{width="4.91704615048119in" height="4.992732939632546in"}

Ok, let's now turn on roll (in addition to yaw), which is the blade slope, or theta in OWENS. Now, the z norm is no longer always vertical, but now aligned with the blade slope.

{width="4.382957130358705in" height="4.783430664916885in"}{width="5.226388888888889in" height="4.833333333333333in"}

{width="4.406944444444444in" height="3.9298611111111112in"}If we add 30 degrees of roll, this is what it looks like:

{width="5.124857830271216in" height="4.771802274715661in"}

{width="4.45625in" height="4.469444444444444in"}Now, the blade pitch, also angle of attack, is generally 0, but can be offset similarly to the yaw, but the rotation is truly in a blade angle of attack frame of reference. Here it is with 30 degrees offset.

{width="4.095165135608049in" height="4.388081802274716in"}

In all, these are the rotation matrices were used to create the plots: Twist/aoa about the x-axis, slope/theta about the y-axis, and psi/yaw about the z axis.

# apply the twist rotation, which is about the x (1) axis

myvec = myvec*[1.0 0.0 0.0

0.0 cosd(Twistdel) sind(Twistdel)

0.0 -sind(Twistdel) cosd(Twistdel)]

# apply theta rotation, which is the tilt angle, or about the y (2) axis in global

myvec = myvec*[cosd(Thetadel) 0.0 -sind(Thetadel)

0.0 1.0 0.0

sind(Thetadel) 0.0 cosd(Thetadel)]

# apply Psi rotation, which is about Z (3) axis in global

myvec = myvec*[cosd(Psidel) sind(Psidel) 0.0

-sind(Psidel) cosd(Psidel) 0.0

0.0 0.0 1.0]

+- · OWENS.jl

OWENS X is outwards on blade, y is trailing edge always

Struts, CCW, z is inwards, y trailing, and CW z is outwards

Aerodyn

if CW z is up, y is trailing (root at bottom) blades, z is outwards and y is towards trailing edge. If struts have asymmetric, then you need to align your desired suction side with the x-vector, which means you might have to invert your airfoil lookup tables for struts that the suction side isn’t where you want it.

Aerodyn if CCW, root is at top and z is down, y is trailing edge, for struts, z is outwards, and y is trailing edge.

Hub is rotated such that the axis of rotation is x. So for a VAWT hub-x points up, and hawt hub-x point in x.

{width="4.917280183727034in" height="4.585993000874891in"}{width="5.469136045494313in" height="5.071805555555556in"}Meet porcupine the OWENS element orientation helper. It is comprised of a tower, horizonal struts, and blades that have both curved and vertical sections. Let's start with all of the orientations set to 0. We can see that the 1,0,0 norm is in the positive x direction, and likewise for the y and z norms.

Now, let's turn on just the yaw orientation, (psi in OWENS). The top blade gets a -90 degree yaw shift (like the other blades), and the other blades' yaw is additionally rotated to match the global blade orientation around the turbine axis of rotation. Yes the initial 90 degree shift is confusing, but it is the convention in the structural solver – is seems that the z-norm of the blade is intended to be eventually pointing away from the axis of rotation.

{width="5.595138888888889in" height="4.875694444444444in"}{width="5.737141294838145in" height="5.283430664916885in"}

If we add 30 degrees of rotation to the yaw, this is what it looks like.

{width="4.91704615048119in" height="4.992732939632546in"}

Ok, let's now turn on roll (in addition to yaw), which is the blade slope, or theta in OWENS. Now, the z norm is no longer always vertical, but now aligned with the blade slope.

{width="4.382957130358705in" height="4.783430664916885in"}{width="5.226388888888889in" height="4.833333333333333in"}

{width="4.406944444444444in" height="3.9298611111111112in"}If we add 30 degrees of roll, this is what it looks like:

{width="5.124857830271216in" height="4.771802274715661in"}

{width="4.45625in" height="4.469444444444444in"}Now, the blade pitch, also angle of attack, is generally 0, but can be offset similarly to the yaw, but the rotation is truly in a blade angle of attack frame of reference. Here it is with 30 degrees offset.

{width="4.095165135608049in" height="4.388081802274716in"}

In all, these are the rotation matrices were used to create the plots: Twist/aoa about the x-axis, slope/theta about the y-axis, and psi/yaw about the z axis.

# apply the twist rotation, which is about the x (1) axis

myvec = myvec*[1.0 0.0 0.0

0.0 cosd(Twistdel) sind(Twistdel)

0.0 -sind(Twistdel) cosd(Twistdel)]

# apply theta rotation, which is the tilt angle, or about the y (2) axis in global

myvec = myvec*[cosd(Thetadel) 0.0 -sind(Thetadel)

0.0 1.0 0.0

sind(Thetadel) 0.0 cosd(Thetadel)]

# apply Psi rotation, which is about Z (3) axis in global

myvec = myvec*[cosd(Psidel) sind(Psidel) 0.0

-sind(Psidel) cosd(Psidel) 0.0

0.0 0.0 1.0]

diff --git a/dev/OWENS_Dev_Guide/index.html b/dev/OWENS_Dev_Guide/index.html index dd72408..c654688 100644 --- a/dev/OWENS_Dev_Guide/index.html +++ b/dev/OWENS_Dev_Guide/index.html @@ -1,2 +1,2 @@ -Developer Guide · OWENS.jl

author:

  • Kevin R. Moore

bibliography:

  • ac_sources.bib

title: Offshore Wind Energy Simulator (OWENS) Glue Code Basic Theory, Frames of Reference, and Inter-Module Coupling Methods –-

Introduction

The Offshore Wind Energy Simulator (OWENS) Code is a floating turbine-platform code capable of steady, unsteady, and modal analysis. It is comprised of, or coupled to many modules for aerodynamics, hydrodynamics, mooring dynamics, and finite element formulations.

How many of these items are used is not straightforward or a-priori and can easily lead to confusion or mistake (like how the aerodynamics uses inflow data; is it just simple based on the mean hub velocity, or in the rotating blade frame of reference? If the latter, what is that frame of reference so that we make sure we don't incorrectly map the vectors?) This document is intended as a developers guide for the intent of clearing up the relative ambiguity between the many moving and modular pieces. It is not a full theory document or users guide. For theory and use, please see the theory and user guides respectively. Within this document, we give enough detail about the operations of the \"glue\" code, the frames of reference, and coupling methods to aid further development.

Contributing

Please make all feature changes and bug fixes as branches and then create pull requests against the dev branch. The dev branch will be periodically pulled into master.

Glue Code Basic Theory

Due to the nonlinearity and non-closed-form nature of the floating turbine problem in both the design and temporal space, OWENS uses many types of iterative solution methods, specific to the physics involved. Loose or Gauss-Seidel iteration is used for the coupling between the modules. gives an overview of the general code structure for transient analysis, with the main equations being solved and the relative location of the iteration loops.

::: algorithm ::: spacing 1.18

::: algorithmic Initialize simulation (all module parameters, meshing, composite properties, etc) Initialize displacements and forces as 0

Get driveshaft displacement from generator torque Get rotor speed, rotational displacement from generator torque, aero torque, and turbine inertia Get aero forces from rotor speed, position Get structural displacements and reaction forces from aero forces Update displacements$_\text{guess}$ with the calculated displacements ::: :::

[]{#alg:Transient label="alg:Transient"} :::

Global Frame of Reference

Thanks to some legacy VAWT frames of reference where wind was originally coming from the top down, and then from the left right, the convention was to simply rotate the axes instead of properly redefining the global frame of reference to match standard math convention again. Therefore, an azimuth angle of 0, or yaw angle for standard VAWT frame of reference is top dead center. Therefore, blade 1 of a vawt should also be top dead center, i.e. aligned with the y+ axis as shown below.

Global Frame of Reference. Wind comes in from the left in the direction of the positive X-axis, the positive Y-axis is 90 degrees counter-clockwise to the X-axis. Z-axis is vertical. Positive rotations follow right hand rule. Note that the turbine is modeled in the rotating frame of reference. Therefore, the turbine stays stationary in its initial meshed position, excepting deformations, and inertial effects are calculated. The developer must use the calculated rotational position to map to the other models as necessary.{#fig:ac_velocities width="60%"}

InflowWind and TurbSim Velocity Inflow

This is how it is defined in the manual, despite inverting the positive direction of rotation compared to standard notation.

Wind frame of reference is the same as global. However, the angle follows TurbSim and [InflowWind](https://github.com/old-NWTC/InflowWind) notation Wind propagation angle is zero when aligned with the positive X-axis and clockwise positive, in the direction of the negative negative Y-axis.{#fig:ac_velocities width="50%"}

OWENSAero Aerodynamics (AC and DMS)

VAWT 2D section looking downwards with induced velocity \$w\$ vector broken into \$u\$ and \$v\$ components depicted by arrows. Airfoils show example blade locations with dots aligning to the circumferential discretization. Aero frame of reference is the same as global, however a blade is at 0 degrees azimuth when it is aligned with the Y-axis. If an aero module is 2D, it is made quasi-3D by stacking slices from lower to higher in the Z-axis.{#fig:ac_velocities width="50%"}

Note: CACTUS, does not fully follow this scheme and differs from the global frame of reference by switching the Y and Z axes for a VAWT. Also, be careful with the geometry inputs; if the blade 1 starts out at the \"south\" position, as opposed to the north, then it will behave as though it were a north starting blade rotating clockwise, and a symmetric gust velocity will match (if the simple iec uniform gust is used). All else for CACTUS follows the description above.

Aerodynamics forces are radial inward positive and tangential in direction of rotation positive. So, the blade local accelerations in the radial will be outward positive and in the tangential will be in the opposite direction of rotation for a CCW rotor. CW rotors are still in work and would need to have the local frame of reference rotation verified. Therefor, for the added mass equations, the forces should be negated.

OWENSFEA Structures

Yaw is equivalent to the global azimuth angle as above, and is denoted in the code as Psi. Zero is top dead center, right hand rule positive rotation. The subscript D indicates degrees. Theta is the element slope, or delta, and

The rotation sequence is a Roll (Rx) - Pitch (Ry) - Yaw (Rz) sequence in OWENSFEA (R = Rz * Ry *Rx in multiplication order). This corresponds to Twist - Theta - Psi angle ordering. In the matrix multiplication this is R = $R_{psi}$ * $R_{theta}$ * $R_{twist}$, which is a [3,2,1] matrix ordering.

::: center Name Rotation Axis OWENS Angle Names –––- –––––––- –––––––––- Roll about X Twist Pitch about Y Theta Yaw about Z Psi

: Module Level of Detail in This Document :::

We apply these in order of Roll, then Pitch, then Yaw, which is R = Rz * Ry * Rx (application is from right to left in rotations) for a rotation of vector x by R. i.e R(x) = Rz * Ry * Rx * x.

In the code I now have ang = [ort.Psid[idx], ort.Thetad[idx],ort.Twistd[idx]+180,-90]; DCM = CH2G * createGeneralTransformationMatrix(ang,[3,2,1,2]); Where I have an additional rotation by -90 about the Y axis to align Z with X before applying the other rotation sequences. This is due to AD15 using the IEC conventions with +Z along the blade, but the beam solver using the more typical beam formulation of +X along the beam.

This is almost consistent between blades and struts (have a +90 rotation on struts for some reason that I haven't sorted out yet).

Rotating Frame of Reference, 6 DOF where 1 = turbine vertical force, 2 = turbine 2D slice tangential force, 3 = turbine 2D slice normal force, 4 = blade M25 twisting moment, 5 = blade curvature twisting moment, 6 = blade sweep moment.

The Mesh matches the global frame of reference of x, y, and z. Element length is the length along the element.

The mesh itself is comprised only of components. For example, a tower, two blades, and four struts. The element number is sequential. There are overlapping points where each component connects. The mesh has a connectivity vector, which has rows corresponding to each element, column 1 corresponds to the \"master\" node, and column 2 corresponds to the \"slave\" node. The element connection in the mesh is only intra-component. I.e. there is no connectivity between components - that is defined in the joint matrix, which has columns for: Joint Number, Joint Master Node, Joint Slave Node, Joint Type, Joint Mass, Not Used, PsiD, ThetaD. The D indicates angle in degrees. Joint types are: (0 = weld(fixed), 1=pinned, 2 = hinge joint with axis about slave node element's e2 axis, 3 = hinge joint axis about slave node element's e1 axis, 4 = hinge joint axis about slave node element's e3 axis). The Psi and Theta are of the slave node (or its closest neighbor of the same component due to the gaps in element mesh connectivity). The not used column is just filled with zeros. The \"flapwise\" normal vector of an element is forced to be away from the machine for consistency. During the meshing process, the component type need to be known in order to get this right: Mesh Type: 0-blade 1-tower 2-strut.

Composites

Hydrodynamics

Hydrodynamics are applied into OWENS using the HydroDyn module native to OpenFAST, but applied here through a standalone library linked to OWENS. The physics contained in the HydroDyn standalone library is virtually unchanged from its native application in OpenFAST. HydroDyn user documentation can be found here.

Platform Structure

To enable capturing the hydrodynamics in OWENS for floating turbines, a second mesh is created to represent the platform. OWENS assumes the platform is a rigid body, so the mesh is composed of a single element with effectively infinite stiffness. The two nodes forming this element are:

  • The platform reference point (i.e., the platform at the still water level along the vertical centerline of its center of gravity) is the bottom node
  • The tower base point is the top node

The structures composing the platform mesh itself are the same as the OWENSFEA structures documented above, though most of the definitions to define the mesh can be set to zero or are very simple. There are two main exceptions:

  • The platform center of gravity must be defined, since neither node is at this location. This is defined in the zcm parameter in the SectionPropsArray for the platform mesh.
  • The 6x6 rigid body mass matrix is defined as a concentrated input at the platform reference point node

A full example of these definitions can be found in the floating platform example notebook (TODO).

Solve Procedure

When applying hydrodynamics, OWENS adds additional Gauss-Seidel loops to solve for the structural motions of both the platform mesh and the "topside" mesh (i.e. everything above the platform) in a way that generates global convergence. This process is:

  1. Solve via a Gauss-Seidel loop for the topside mesh using platform motions from the previous time step
  • Setting platform motions to zero is how OWENS runs for land-based turbines
  1. Solve via an outer Gauss-Seidel loop and an inner Newton-Raphson loop for the platform mesh, using updated external hydrodynamic loads from HydroDyn and tower base loads from step 1
  • The Newton-Raphson loop is contained in Unsteady.OWENS_HD_Coupled_Solve, and is necessary to properly account for added mass impacting both HydroDyn and OWENS in a tightly coupled manner.

This solve process is complex, but is documented in detail in Section 2.4.1 of Devin et al. (2022) here. This is a very similar procedure used to coupled HydroDyn to the ElastoDyn module in OpenFAST.

  1. Solve via a Gauss-Seidel loop for the topside mesh using platform motions from the current time step, i.e. the motions calculated in step 2.

This flow chart visualizes this solve procedure, and which step corresponds to which modules connecting to the core OWENS glue code: Hydrodynamics Solve Procedure Flowchart

Reference Frame Conversions

Since HydroDyn operates in the global reference frame, the hydrodynamics capabilities in OWENS deviate from the general convention in OWENS of operating in the hub reference frame. As a result, operations manipulating the platform mesh (e.g. running OWENSFEA.structuralDynamicsTransient) are also applied in the global reference frame. Functionally, this means that the rbData vector input is set to zero when using the platform mesh in OWENSFEA.structuralDynamicsTransient. Care must be taken for I/O procedures between the platform and topside meshes! The Unsteady_utilities.frame_convert function is intended to make this process simpler.

Mooring

Mooring dynamics for floating platforms in OWENS are calculated using a standalone library linking to MoorDyn, another module native to OpenFAST. The mooring loads calculated in MoorDyn are applied as an external load to the same platform mesh as the hydrodynamics, as described above. Since the mooring dynamics do not need to account for added mass, the coupling between MoorDyn and OWENS is much simpler, and the mooring dynamics are applied in the Gauss-Seidel solve procedure without being modified by the additional Newton-Raphson solve in Unsteady.OWENS_HD_Coupled_Solve. Note that MoorDyn operates in the global reference frame, so be careful with reference frame conversions for MoorDyn I/O.

Coupling Methods

Inflow - Aero

Direct: Aero module supplies an x-y-z and time coordinate, inflow returns x-y-z velocity. This is repeated for all blade discrete points as per the aero formulation.

Aero - Turbine Structure

Loose Iteration: Structure provides blade local radius, twist, sweep, and 6 DOF velocities, aero returns forces, moments. This is iterated on until convergence. It is preferred to change this to a N-dimensional root solver and pass gradients to the root solver to increase performance.

Specifically, from the meshing process, the starting and ending node numbers for the blades are known and the aerodynamic loads mapped to the elements between those nodes.

Turbine Structure - Platform Structure

Same as Aero-Structure

Hydro - Platform Structure - Mooring

Same as Aero-Structure

Structures - Composites

Initialization is Direct: Structures provides macro geometry, Composites provide sectional properties. Composite Failure is Direct: Structure provides strains, composites provides failure. Buckling is also calculated.

Controllers - Control Elements

Direct: Controllers provide reactionary inputs to control inputs in real time based on dynamics.

+Developer Guide · OWENS.jl

author:

  • Kevin R. Moore

bibliography:

  • ac_sources.bib

title: Offshore Wind Energy Simulator (OWENS) Glue Code Basic Theory, Frames of Reference, and Inter-Module Coupling Methods –-

Introduction

The Offshore Wind Energy Simulator (OWENS) Code is a floating turbine-platform code capable of steady, unsteady, and modal analysis. It is comprised of, or coupled to many modules for aerodynamics, hydrodynamics, mooring dynamics, and finite element formulations.

How many of these items are used is not straightforward or a-priori and can easily lead to confusion or mistake (like how the aerodynamics uses inflow data; is it just simple based on the mean hub velocity, or in the rotating blade frame of reference? If the latter, what is that frame of reference so that we make sure we don't incorrectly map the vectors?) This document is intended as a developers guide for the intent of clearing up the relative ambiguity between the many moving and modular pieces. It is not a full theory document or users guide. For theory and use, please see the theory and user guides respectively. Within this document, we give enough detail about the operations of the \"glue\" code, the frames of reference, and coupling methods to aid further development.

Contributing

Please make all feature changes and bug fixes as branches and then create pull requests against the dev branch. The dev branch will be periodically pulled into master.

Glue Code Basic Theory

Due to the nonlinearity and non-closed-form nature of the floating turbine problem in both the design and temporal space, OWENS uses many types of iterative solution methods, specific to the physics involved. Loose or Gauss-Seidel iteration is used for the coupling between the modules. gives an overview of the general code structure for transient analysis, with the main equations being solved and the relative location of the iteration loops.

::: algorithm ::: spacing 1.18

::: algorithmic Initialize simulation (all module parameters, meshing, composite properties, etc) Initialize displacements and forces as 0

Get driveshaft displacement from generator torque Get rotor speed, rotational displacement from generator torque, aero torque, and turbine inertia Get aero forces from rotor speed, position Get structural displacements and reaction forces from aero forces Update displacements$_\text{guess}$ with the calculated displacements ::: :::

[]{#alg:Transient label="alg:Transient"} :::

Global Frame of Reference

Thanks to some legacy VAWT frames of reference where wind was originally coming from the top down, and then from the left right, the convention was to simply rotate the axes instead of properly redefining the global frame of reference to match standard math convention again. Therefore, an azimuth angle of 0, or yaw angle for standard VAWT frame of reference is top dead center. Therefore, blade 1 of a vawt should also be top dead center, i.e. aligned with the y+ axis as shown below.

Global Frame of Reference. Wind comes in from the left in the direction of the positive X-axis, the positive Y-axis is 90 degrees counter-clockwise to the X-axis. Z-axis is vertical. Positive rotations follow right hand rule. Note that the turbine is modeled in the rotating frame of reference. Therefore, the turbine stays stationary in its initial meshed position, excepting deformations, and inertial effects are calculated. The developer must use the calculated rotational position to map to the other models as necessary.{#fig:ac_velocities width="60%"}

InflowWind and TurbSim Velocity Inflow

This is how it is defined in the manual, despite inverting the positive direction of rotation compared to standard notation.

Wind frame of reference is the same as global. However, the angle follows TurbSim and [InflowWind](https://github.com/old-NWTC/InflowWind) notation Wind propagation angle is zero when aligned with the positive X-axis and clockwise positive, in the direction of the negative negative Y-axis.{#fig:ac_velocities width="50%"}

OWENSAero Aerodynamics (AC and DMS)

VAWT 2D section looking downwards with induced velocity \$w\$ vector broken into \$u\$ and \$v\$ components depicted by arrows. Airfoils show example blade locations with dots aligning to the circumferential discretization. Aero frame of reference is the same as global, however a blade is at 0 degrees azimuth when it is aligned with the Y-axis. If an aero module is 2D, it is made quasi-3D by stacking slices from lower to higher in the Z-axis.{#fig:ac_velocities width="50%"}

Note: CACTUS, does not fully follow this scheme and differs from the global frame of reference by switching the Y and Z axes for a VAWT. Also, be careful with the geometry inputs; if the blade 1 starts out at the \"south\" position, as opposed to the north, then it will behave as though it were a north starting blade rotating clockwise, and a symmetric gust velocity will match (if the simple iec uniform gust is used). All else for CACTUS follows the description above.

Aerodynamics forces are radial inward positive and tangential in direction of rotation positive. So, the blade local accelerations in the radial will be outward positive and in the tangential will be in the opposite direction of rotation for a CCW rotor. CW rotors are still in work and would need to have the local frame of reference rotation verified. Therefor, for the added mass equations, the forces should be negated.

OWENSFEA Structures

Yaw is equivalent to the global azimuth angle as above, and is denoted in the code as Psi. Zero is top dead center, right hand rule positive rotation. The subscript D indicates degrees. Theta is the element slope, or delta, and

The rotation sequence is a Roll (Rx) - Pitch (Ry) - Yaw (Rz) sequence in OWENSFEA (R = Rz * Ry *Rx in multiplication order). This corresponds to Twist - Theta - Psi angle ordering. In the matrix multiplication this is R = $R_{psi}$ * $R_{theta}$ * $R_{twist}$, which is a [3,2,1] matrix ordering.

::: center Name Rotation Axis OWENS Angle Names –––- –––––––- –––––––––- Roll about X Twist Pitch about Y Theta Yaw about Z Psi

: Module Level of Detail in This Document :::

We apply these in order of Roll, then Pitch, then Yaw, which is R = Rz * Ry * Rx (application is from right to left in rotations) for a rotation of vector x by R. i.e R(x) = Rz * Ry * Rx * x.

In the code I now have ang = [ort.Psid[idx], ort.Thetad[idx],ort.Twistd[idx]+180,-90]; DCM = CH2G * createGeneralTransformationMatrix(ang,[3,2,1,2]); Where I have an additional rotation by -90 about the Y axis to align Z with X before applying the other rotation sequences. This is due to AD15 using the IEC conventions with +Z along the blade, but the beam solver using the more typical beam formulation of +X along the beam.

This is almost consistent between blades and struts (have a +90 rotation on struts for some reason that I haven't sorted out yet).

Rotating Frame of Reference, 6 DOF where 1 = turbine vertical force, 2 = turbine 2D slice tangential force, 3 = turbine 2D slice normal force, 4 = blade M25 twisting moment, 5 = blade curvature twisting moment, 6 = blade sweep moment.

The Mesh matches the global frame of reference of x, y, and z. Element length is the length along the element.

The mesh itself is comprised only of components. For example, a tower, two blades, and four struts. The element number is sequential. There are overlapping points where each component connects. The mesh has a connectivity vector, which has rows corresponding to each element, column 1 corresponds to the \"master\" node, and column 2 corresponds to the \"slave\" node. The element connection in the mesh is only intra-component. I.e. there is no connectivity between components - that is defined in the joint matrix, which has columns for: Joint Number, Joint Master Node, Joint Slave Node, Joint Type, Joint Mass, Not Used, PsiD, ThetaD. The D indicates angle in degrees. Joint types are: (0 = weld(fixed), 1=pinned, 2 = hinge joint with axis about slave node element's e2 axis, 3 = hinge joint axis about slave node element's e1 axis, 4 = hinge joint axis about slave node element's e3 axis). The Psi and Theta are of the slave node (or its closest neighbor of the same component due to the gaps in element mesh connectivity). The not used column is just filled with zeros. The \"flapwise\" normal vector of an element is forced to be away from the machine for consistency. During the meshing process, the component type need to be known in order to get this right: Mesh Type: 0-blade 1-tower 2-strut.

Composites

Hydrodynamics

Hydrodynamics are applied into OWENS using the HydroDyn module native to OpenFAST, but applied here through a standalone library linked to OWENS. The physics contained in the HydroDyn standalone library is virtually unchanged from its native application in OpenFAST. HydroDyn user documentation can be found here.

Platform Structure

To enable capturing the hydrodynamics in OWENS for floating turbines, a second mesh is created to represent the platform. OWENS assumes the platform is a rigid body, so the mesh is composed of a single element with effectively infinite stiffness. The two nodes forming this element are:

  • The platform reference point (i.e., the platform at the still water level along the vertical centerline of its center of gravity) is the bottom node
  • The tower base point is the top node

The structures composing the platform mesh itself are the same as the OWENSFEA structures documented above, though most of the definitions to define the mesh can be set to zero or are very simple. There are two main exceptions:

  • The platform center of gravity must be defined, since neither node is at this location. This is defined in the zcm parameter in the SectionPropsArray for the platform mesh.
  • The 6x6 rigid body mass matrix is defined as a concentrated input at the platform reference point node

A full example of these definitions can be found in the floating platform example notebook (TODO).

Solve Procedure

When applying hydrodynamics, OWENS adds additional Gauss-Seidel loops to solve for the structural motions of both the platform mesh and the "topside" mesh (i.e. everything above the platform) in a way that generates global convergence. This process is:

  1. Solve via a Gauss-Seidel loop for the topside mesh using platform motions from the previous time step
  • Setting platform motions to zero is how OWENS runs for land-based turbines
  1. Solve via an outer Gauss-Seidel loop and an inner Newton-Raphson loop for the platform mesh, using updated external hydrodynamic loads from HydroDyn and tower base loads from step 1
  • The Newton-Raphson loop is contained in Unsteady.OWENS_HD_Coupled_Solve, and is necessary to properly account for added mass impacting both HydroDyn and OWENS in a tightly coupled manner.

This solve process is complex, but is documented in detail in Section 2.4.1 of Devin et al. (2022) here. This is a very similar procedure used to coupled HydroDyn to the ElastoDyn module in OpenFAST.

  1. Solve via a Gauss-Seidel loop for the topside mesh using platform motions from the current time step, i.e. the motions calculated in step 2.

This flow chart visualizes this solve procedure, and which step corresponds to which modules connecting to the core OWENS glue code: Hydrodynamics Solve Procedure Flowchart

Reference Frame Conversions

Since HydroDyn operates in the global reference frame, the hydrodynamics capabilities in OWENS deviate from the general convention in OWENS of operating in the hub reference frame. As a result, operations manipulating the platform mesh (e.g. running OWENSFEA.structuralDynamicsTransient) are also applied in the global reference frame. Functionally, this means that the rbData vector input is set to zero when using the platform mesh in OWENSFEA.structuralDynamicsTransient. Care must be taken for I/O procedures between the platform and topside meshes! The Unsteady_utilities.frame_convert function is intended to make this process simpler.

Mooring

Mooring dynamics for floating platforms in OWENS are calculated using a standalone library linking to MoorDyn, another module native to OpenFAST. The mooring loads calculated in MoorDyn are applied as an external load to the same platform mesh as the hydrodynamics, as described above. Since the mooring dynamics do not need to account for added mass, the coupling between MoorDyn and OWENS is much simpler, and the mooring dynamics are applied in the Gauss-Seidel solve procedure without being modified by the additional Newton-Raphson solve in Unsteady.OWENS_HD_Coupled_Solve. Note that MoorDyn operates in the global reference frame, so be careful with reference frame conversions for MoorDyn I/O.

Coupling Methods

Inflow - Aero

Direct: Aero module supplies an x-y-z and time coordinate, inflow returns x-y-z velocity. This is repeated for all blade discrete points as per the aero formulation.

Aero - Turbine Structure

Loose Iteration: Structure provides blade local radius, twist, sweep, and 6 DOF velocities, aero returns forces, moments. This is iterated on until convergence. It is preferred to change this to a N-dimensional root solver and pass gradients to the root solver to increase performance.

Specifically, from the meshing process, the starting and ending node numbers for the blades are known and the aerodynamic loads mapped to the elements between those nodes.

Turbine Structure - Platform Structure

Same as Aero-Structure

Hydro - Platform Structure - Mooring

Same as Aero-Structure

Structures - Composites

Initialization is Direct: Structures provides macro geometry, Composites provide sectional properties. Composite Failure is Direct: Structure provides strains, composites provides failure. Buckling is also calculated.

Controllers - Control Elements

Direct: Controllers provide reactionary inputs to control inputs in real time based on dynamics.

diff --git a/dev/VAWTGenUserGuide/index.html b/dev/VAWTGenUserGuide/index.html index 73dba03..c6336f4 100644 --- a/dev/VAWTGenUserGuide/index.html +++ b/dev/VAWTGenUserGuide/index.html @@ -1,2 +1,2 @@ -Legacy VAWTGen Guide · OWENS.jl

All of this has been automated, but the option to create and load these legacy files has been preserved. TODO: show how to do this and condense and modernize this text.

Version 1.0 User Guide

Brian C. Owens

Wind Energy Technologies

Sandia National Laboratories

November 7, 2013

Contents

Introduction 1

Overview of VAWTGen Mesh Generator 1

Demonstration 3

Conventions Employed in Creating a Model with VAWTGen 5

Structural and aerodynamic description of components 5

Caveats of creating a VAWT configuration in VAWTGen 7

Coordinate system 7

Tower component 7

Blade component 7

Blade component 8

VAWTGen Input File 9

VAWTGen Command Line Execution 10

VAWTGen Graphical Output 11

VAWTGen Output Files 15

OWENS Main Input File (.owens) 15

Mesh File (.mesh) 16

Element Property File (.el) 16

Element Orientation File (.ort) 17

Joint File (.jnt) 17

Boundary Conditions File (.bc) 17

Blade Data File (.bld) 18

Output File (.out) 18

Future Versions 18

References 19

Introduction

This user guide presents instructions for using the VAWTGen vertical-axis wind turbine (VAWT) mesh generator. This generator is intended to be utilized with the Offshore Wind ENergy Simulation (OWENS) analysis tool [1]. The input files for this mesh generator are discussed in detail. Turbine components (tower, blades, and struts) are described using existing National Renewable Energy Laboratory (NREL) file formats [2]. A simple input file sizes these basic components and positions them in a hub fixed coordinate frame at arbitrary distances from the origin with arbitrary orientation. VAWTGen generates a mesh of a VAWT consisting of Timoshenko beam elements along with other files describing properties of the VAWT. These files serve as inputs to the OWENS analysis tool. VAWTGen also visualizes the VAWT assembly and mesh to provide a visual confirmation that the VAWT is constructed correctly. Furthermore, VAWTGen can visualize the modal and transient results output by the OWENS analysis tool.

Overview of VAWTGen Mesh Generator

A VAWT rotor primarily consists of a tower and blade components. The blades may be affixed to the tower at their ends as in the Darrieus and V-VAWT configurations or via struts as in the H-VAWT configuration. Struts may also provide a connection between the tower and blades at any position along the tower and blade spans. The VAWTGen mesh generator is capable of generating VAWTs of arbitrary geometry, including H-type, V-type, and Darrieus configurations shown in Figure 1. The VAWT configuration is discretized from continuous structural components into a finite number of beam elements. Elements span between discrete points in the mesh, known as nodes. Finite element analysis examines the motions of nodes as dictated by the deformation of the beam elements under prescribed boundary conditions. This collection of nodes and elements forms the mesh of the VAWT configuration.

{width="2.5990562117235347in" height="1.453332239720035in"}

[]{#_bookmark2 .anchor}Figure 1 Illustrations of V, H, and Darrieus VAWT configurations

VAWTGen accepts data files containing the basic geometry of tower, blade, and strut components. Other crucial configuration information is specified such as the elevation of the blade root from the tower root, as well as the radial distance the blade root is positioned from the tower. An arbitrary number of blades may be specified for the configuration. VAWTGen positions the blade roots with equal azimuth spacing about the tower axis. The blades may be rotated into an arbitrary orientation per a sequence of Euler angles input by the user. If required, struts may be inserted between the tower and a

blade by specifying a fraction of the tower span and the blade span the strut will span. VAWTGen will insert a straight strut of the appropriate length between the tower and blade components. The geometry of the strut component is specified by a file containing geometric data.

With these relatively minimal set of inputs (as illustrated in Figure 2) a VAWT of arbitrary configuration may be created. Therefore, a separate tool is not required for the various types of configurations. VAWTGen provides a convenient means to visualize the VAWT turbine in a wireframe or rendered format. This serves as a quick check for the user to ensure the VAWT has been constructed as intended, and shows the actual turbine configuration that the mesh of beam elements represents. VAWTGen also visualizes the finite element mesh once it is created. VAWTGen identifies points of intersection between the various components and inserts nodes accordingly. These node pairs at points of intersection (i.e. strut to tower, blade to strut, blade to tower) are recorded so appropriate constraint conditions at these joints may be imposed. The orientation of the finite elements in the mesh is also visualized to ensure the elements are positioned and oriented as intended.

C:\\\\Users\\\\bcowens\\\\Desktop\\\\meshGenFlow.png{width="4.016800087489064in" height="2.6266666666666665in"}

[]{#_bookmark3 .anchor}Figure 2 Input and output of VAWTGen mesh generator

Output includes a mesh file is generated that will be used by the analysis software. By default, the mesh is discretized in the same manner as the geometric description of components as specified in the component data files. The user may further subdivide the mesh by specifying an integer factor to further discretize the geometric data into elements. An elemental data file is also created, containing the structural properties of elements. An orientation file is generated containing the Euler angles representing the orientation of the elements. VAWTGen requires data files be supplied to describe the geometry of the primary turbine components (blades, towers, and struts). A joint file is also generated containing nodal information about joint locations. This file is used to specify general constraints between structural components. A blade file is also generated that contains aerodynamic data and

provides information needed for mapping aerodynamic loads to nodal locations on the structural model, as well as supplying geometry to aerodynamic data and geometry to external aerodynamic modules.

The format of the structural component data files is the same as the component files for NREL's FAST code [2]. These files describe the geometry and aerodynamic properties of general turbine components, and there is nothing that restricts their use to horizontal-axis wind turbines (HAWTs) specifically. For example, even though a Darrieus blade is not likely be installed on a HAWT, it is easily described by the NREL's FAST blade geometry file format. This allows existing wind energy design tools to be interfaced with the VAWT analysis tool without the need to consider new file formats. NREL's FAST separates geometrical/structural properties of a blade and aerodynamic properties of a blade into two files and the same approach is employed in the VAWTGen mesh generator.

Demonstration

This section demonstrates the capabilities of the VAWTGen mesh generator. First a two bladed V-VAWT configuration is considered. Figure 3 shows the wireframe visualization of this VAWT. The red line within the wireframe represents the beam flexural axis upon which the actual finite element mesh is created. Note that the blades may be positioned at any orientation. The blades and top of the tower share a common point and can be joined together via a constraint relationship that appropriately models the joint. Next, a three bladed H-VAWT with multiple strut connections is considered. Figure 4 shows the wireframe visualization and mesh for the H-VAWT configuration. The blades are oriented at an arbitrary orientation, and two strut connections per blade are specified. Finally, Darrieus type turbine configurations with swept and strutted blades are considered as shown in Figure 5 and Figure 6 respectively.

C:\\\\Users\\\\bcowens\\\\Desktop\\\\export_fig\\\\Vvawt.png{width="1.8892694663167104in" height="3.2266666666666666in"} C:\\\\Users\\\\bcowens\\\\Desktop\\\\export_fig\\\\hvawt.png{width="1.3600043744531933in" height="3.2133333333333334in"}

[]{#bookmark5 .anchor}Figure 3 Wireframe of V-VAWT []{#bookmark6 .anchor}Figure 4 Wireframe of H-VAWT

C:\\\\Users\\\\bcowens\\\\Desktop\\\\export_fig\\\\dar3swept.png{width="1.02086176727909in" height="3.3866666666666667in"}C:\\\\Users\\\\bcowens\\\\Desktop\\\\export_fig\\\\dar3strut.png{width="0.8588167104111986in" height="3.3866666666666667in"}

+–––––––––––––––––+–––––––––––––––––-+ | > []{#bookmark7 | > []{#bookmark8 .anchor}Figure | | > .anchor}Figure 5 Wireframe | > 6 Wireframe of Strutted | | > of Swept Darrieus VAWT** | > Darrieus VAWT** | +==================================+===================================+ +–––––––––––––––––+–––––––––––––––––-+

Conventions Employed in Creating a Model with VAWTGen

This section describes some specific conventions and caveats of creating a mesh of a VAWT using the VAWTGen mesh generator. First, the files use to describe the structural and aerodynamic properties of files are discussed

Structural and aerodynamic description of components

Structural and aerodynamic descriptions of components are specified through NREL FAST file format using the blade .dat files and Aerodyn .ipt files. For structural description (using the .dat file), only the lines highlighted in red are considered by VAWTGen.

+––––––+–––+–––––-+–-+–––+–-+–––-+–––-+––+ | > (-) | * | > | | > | | > * | > ** | ** | | > (-) | *(de | (kg/m) | | **( | | *(Nm\ | (N) | (- | | | g)** | > | | Nm\^ | | ^2)** | | ** | | | | (Nm\^2)** | | 2)** | | | | | +============+======+===========+===+======+===+=======+=======+====+ | > ) (kg | > | **(m) | * | ( | > | > ** | | | | > m) (kg | m) | | * | m) | | (m)** | | | | | > ( | | ( | | * | | | | | | m)** | | m | | * | | | | | | | | ) | | ( | | | | | | | | * | | m | | | | | | | | * | | ) | | | | | | | | | | * | | | | | | | | | | * | | | | +––––––+–––+–––––-+–-+–––+–-+–––-+–––-+––+

+––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > | | 0. | ** | > **9.163e+009 | > * | > ** | > | | **0 | | 000 | 353. | > 9.163e+009** | *6.8042 | 8.211e | * | | .00 | | | 43** | | e+009** | +009** | *0 | | 000 | | | | | | | .0 | | > 0 | | | | | | | 00 | | .20 | | | | | | | ** | | 0** | | | | | | | | +=====+====+=======+======+=================+=========+========+====+ | > | | > | > * | > 0.000 0.0 | > ** | | | | ** | | **0. | *0.0 | > 0.000 | 0.000** | | | | 316 | | 000** | 00** | | | | | | .71 | | | | | | | | | > | | | | | | | | | 31 | | | | | | | | | 6.7 | | | | | | | | | 1** | | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > | | 0. | ** | **9.163e+009 | > * | ** | * | | **0 | | 000 | 353. | 9.163e+009** | *6.8042 | 8.211e | *0 | | .05 | | | 43** | | e+009** | +009** | .0 | | > 0 | | | | | | | 00 | | .20 | | | | | | | ** | | 0** | | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > | | > | > * | > 0.000 0.0 | > ** | | | | ** | | **0. | *0.0 | > 0.000 | 0.000** | | | | 316 | | 000** | 00** | | | | | | .71 | | | | | | | | | > | | | | | | | | | 31 | | | | | | | | | 6.7 | | | | | | | | | 1** | | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > | | 0. | ** | **9.163e+009 | > * | ** | * | | ** | | 000 | 353. | 9.163e+009** | *6.8042 | 8.211e | *0 | | 0.1 | | | 43** | | e+009** | +009** | .0 | | > 0 | | | | | | | 00 | | .20 | | | | | | | ** | | 0** | | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > | | > | > * | > 0.000 0.0 | > ** | | | | ** | | **0. | *0.0 | > 0.000 | 0.000** | | | | 316 | | 000** | 00** | | | | | | .71 | | | | | | | | | > | | | | | | | | | 31 | | | | | | | | | 6.7 | | | | | | | | | 1** | | | | | | | | | > | | | | | | | | | > | | | | | | | | | ** | | | | | | | | | .. | | | | | | | | | .** | | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > * | > | 0. | ** | **9.163e+009 | > * | ** | * | | *0. | * | 000 | 353. | 9.163e+009** | *6.8042 | 8.211e | *0 | | 8** | *0 | | 43** | | e+009** | +009** | .0 | | | .2 | | | | | | 00 | | | 00 | | | | | | ** | | | ** | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > * | ** | > | > * | > 0.000 0.0 | > ** | | | | *31 | 31 | **0. | *0.0 | > 0.000 | 0.000** | | | | 6.7 | 6. | 000** | 00** | | | | | | 1** | 71 | | | | | | | | | ** | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > | > | 0. | ** | **9.163e+009 | > * | ** | * | | ** | * | 000 | 353. | 9.163e+009** | *6.8042 | 8.211e | *0 | | 0.8 | *0 | | 43** | | e+009** | +009** | .0 | | 5** | .2 | | | | | | 00 | | | 00 | | | | | | ** | | | ** | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > * | ** | > | > * | > 0.000 0.0 | > ** | | | | *31 | 31 | **0. | *0.0 | > 0.000 | 0.000** | | | | 6.7 | 6. | 000** | 00** | | | | | | 1** | 71 | | | | | | | | | ** | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > * | > | 0. | ** | **9.163e+009 | > * | ** | * | | *0. | * | 000 | 353. | 9.163e+009** | *6.8042 | 8.211e | *0 | | 9** | *0 | | 43** | | e+009** | +009** | .0 | | | .2 | | | | | | 00 | | | 00 | | | | | | ** | | | ** | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > * | ** | > | > * | > 0.000 0.0 | > ** | | | | *31 | 31 | **0. | *0.0 | > 0.000 | 0.000** | | | | 6.7 | 6. | 000** | 00** | | | | | | 1** | 71 | | | | | | | | | ** | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > | > | 0. | ** | **9.163e+009 | > * | ** | * | | ** | * | 000 | 353. | 9.163e+009** | *6.8042 | 8.211e | *0 | | 0.9 | *0 | | 43** | | e+009** | +009** | .0 | | 5** | .2 | | | | | | 00 | | | 00 | | | | | | ** | | | ** | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > * | ** | > | > * | > 0.000 0.0 | > ** | | | | *31 | 31 | **0. | *0.0 | > 0.000 | 0.000** | | | | 6.7 | 6. | 000** | 00** | | | | | | 1** | 71 | | | | | | | | | ** | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > | > | 0. | ** | > **9.163e+009 | > * | > ** | > | | ** | * | 000 | 353. | > 9.163e+009** | *6.8042 | 8.211e | * | | 1.0 | *0 | | 43** | | e+009** | +009** | *0 | | 000 | .2 | | | | | | .0 | | 0** | 00 | | | | | | 00 | | | ** | | | | | | ** | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > * | ** | > | > * | > 0.000 0.0 | > ** | | | | *31 | 31 | **0. | *0.0 | > 0.000 | 0.000** | | | | 6.7 | 6. | 000** | 00** | | | | | | 1** | 71 | | | | | | | | | ** | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+

Caveats of blade structural description in VAWTGen are described below.

  • {width="4.046369203849519e-3in" height="0.15120188101487314in"}The alpha column describing bend-twist coupling is not currently employed in the analysis.{width="4.046369203849519e-3in" height="0.15120188101487314in"}

  • For blades, the reference axis is assumed to pass through the quarter chord. The blade may be shaped by using the PrecrvRef and PreswpRef parameters.

  • VAWTGen creates a counter clockwise rotating turbine. A positive PreswpRef parameter sweeps a blade away from the direction of rotation. A positive PrecrvRef will shape a blade outward from the machine center.

  • Edgewise elastic axis and mass center offsets are positive towards the trailing edge of the blade section.

  • Flapwise elastic axis and mass center offsets are positive in the direction outward from the machine center.

  • Under these assumptions, positive structural twist twists the leading edge inwards towards the machine center.

  • All other structural properties are the same as that specified in the FAST manual[1].

The aerodynamic description of a component is accomplished via the Aerodyn .ipt file format. As with the blade properties (.dat) file, only certain parts of this file are used by VAWTGen. Specifically, the parts used by VAWTGen are highlighted in red in the example file below.

Note that the DRNodes and PrnElm columns are not used by VAWTGen but must remain in the file for successful reading of the .ipt file. As with the conventional use of the file, RNodes denotes a point by a physical distance along a blade span from the root. AeroTwst is the aerodynamic twist angle in degrees such that a positive twist angle rotates the leading edge of the blade inwards towards machine center. Chord is used as an aerodynamic property and also for a wireframe visualization of a VAWT design. N{width="4.046369203849519e-3in" height="0.15120188101487314in"}Foil gives an airfoil ID to a section. For wireframe visualization purposes the following thickness to chord ratios for an elliptical cross-section are specified by the NFoil integer: 1 – 1.0, 2 – 0.6, 3 - 0.3, all other –

0.2. These thickness to chord ratios are only employed for visualization purposes and do not affect VAWTGen output.

+––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > | 11.10 | > | 1 | * | **NOPRINT | | 2.85833 | | 2.21667 | .22** | *2** | | +=============+===========+=============+=======+======+==============+ | > | 11.10 | > | 1 | * | **NOPRINT | | 5.07500 | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > | 11.10 | > | 1 | * | **NOPRINT | | 7.29167 | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > | 10.41 | > | 1 | * | **NOPRINT | | 9.50833 | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > * | 8.38 | > | 1 | * | **NOPRINT | | *11.72500** | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > * | 6.35 | > | 1 | * | **NOPRINT | | *13.94167** | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > * | 4.33 | > | 1 | * | **NOPRINT | | *16.15833** | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > * | 2.85 | > | 1 | * | **NOPRINT | | *18.37500** | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > * | 2.22 | > | 1 | * | **NOPRINT | | *20.59167** | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > * | 1.58 | > | 1 | * | **NOPRINT | | *22.80833** | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > * | 0.95 | > | 1 | * | **NOPRINT | | *25.02500** | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > * | 0.53 | > | 1 | * | **NOPRINT | | *27.24167** | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > * | 0.38 | > | 1 | * | **NOPRINT | | *29.45833** | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > * | 0.23 | > | 1 | * | **NOPRINT | | *31.67500** | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > * | 0.08 | > | 1 | * | **NOPRINT | | *33.89167** | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+

Caveats of creating a VAWT configuration in VAWTGen

The previous sections discussed the files for describing the various components (blades, tower, struts) of a VAWT. This section provides details for creating consistent VAWT models using VAWTGen and illustrates input parameters.

Coordinate system

The following coordinate system z-axis is along the tower axis, and x- and y-axes are in the plane of rotation.

Tower component

The primary input for the tower component is the tower length or height. With this specification, VAWTGen positions the tower vertically along the h~3~ axis with the root of the tower at the origin of the coordinate system. A straight tower is assumed. Any PrecrvRef or PreswpRef specified in the .dat file for the tower is ignored.

Blade component

The blade components are positioned using the following input parameters:

  • Number of blades

  • Blade length

  • Blade root elevation from tower base elevation (z= 0)

  • Blade root radial offset from z-axis (this positions the root of the blade at the appropriate x and y coordinates depending on the azimuth location of the blade)

  • Blade theta orientation a (degrees, rotation about the y-axis)

  • Blade sweep angle (degrees, rotation about an intermediate "2-axis" a positive angle sweeps the blade away from the direction of rotation)

Notes:

  • The blade "theta" orientation angle should be negative so that the root is at a lower elevation (z-coordinate). A warning message is output if blade tip elevation is lower than blade root elevation.

  • Blades will be positioned with equal azimuth spacing of the blade root dictated by the specified number of blades.

  • Under this convention the root of "Blade 1" will always be positioned at 180 degrees (the x-axis being at 0 degrees azimuth). From this position blades are numbered in ascending order counter clockwise.

  • This convention of blade placement will also produce element orientations with tangential vectors along the trailing edge of a cross section and normal vectors outward from the machine center.

[]{#_bookmark15 .anchor}Strut component

The strut components (which can provide a structural component between the tower and blade connection) are positioned using the following input parameters:

  • Fraction of tower span for strut placement

  • Fraction of blade span for strut placement

VAWTGen will automatically determine the strut length and insert the component based off of these two parameters. VAWTGen inserts a straight strut with the discretization described in the .dat file for the strut. Any PrecrvRef or PreswpRef specified in this file is ignored.

VAWTGen will also insert nodes as needed to provide connections between the structural components.

VAWTGen Input File

As mentioned before, the structural component (tower, blade, and struts) are described by the NREL file formats [1] and will not be discussed here. The main input file for VAWTGen is described below. This example input file is for a three bladed VAWT with struts, but without swept blades. The commented input file shown below is sufficient for explanation and will not be discussed further.

VAWTGen Command Line Execution

VAWTGen is written using the MATLAB programming language. The VAWTGen source code directory should be added to the MATLAB path, and VAWTGen should be executed from a job directory containing the component data files (.dat and .ipt NREL formats), and the VAWTGen input file described in the following section. The command line input should be executed in the MATLAB command window as:

vawtGen(inputFile,outputFileRootName,renderBool,zeroTolerance);

For example:

vawtGen('snl34m.in','snl34m',true,1.0e-5);

Results in execution with "snl34m.in" as the main VAWTGen input file. Resulting output files would have the root "snl34m", such as "snl34m.mesh", "snl34m.el", etc. The renderBool produces a rendered surface plot of the turbine if set to true, and no rendered view if set to "false". The zeroTolerance variable specifies a tolerance to be considered numerical zero when searching for coincident points in the configuration for identifying locations where joints are to be specified. If excluded from the command line input a default value of 1.0e-6 is used.

Command line output from VAWTGen consists of a set of minimum element length ratios to the length of the actual structural component. This allows the user to ensure that element lengths are not too small to cause problems with the structural dynamics simulation. The located joints in the model are also displayed with information of the master and slave node numbers and component types.

A variety of examples are available in the "sampleJobs" directory distributed with VAWTGen. They may be executed by adding the VAWTGen directory to the MATLAB path and running the "generateMesh.m" scripts in the example job directory.

A sample command line output is shown below:

+––––+––––––––+––––––––––––––––––––––+ | > \>\> | | | | > vawt | | | | Gen(\' | | | | ideal3 | | | | 4m.in\ | | | | ',\'id | | | | eal34m | | | | \',0); | | | | > | | | | > * | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | | | | | - | | | | SNL | | | | V | | | | AWTGen | | | | | | | | V1.0 | | | | * | | | | | | | | - | | | | Dev | | | | eloped | | | | by | | | | | | | | Sandia | | | | Na | | | | tional | | | | | | | | Labora | | | | tories | | | | | | | | Wind | | | | | | | | Energy | | | | | | | | Techno | | | | logies | | | | * | | | | | | | | - | | | | See | | | | | | | | licen | | | | se.txt | | | | | | | | for | | | | | | | | disc | | | | laimer | | | | | | | | infor | | | | mation | | | | * | | | | | | | | > * | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | > Zero | | | | > tol | | | | erance | | | | > set | | | | > to | | | | > d | | | | efault | | | | > of | | | | > | | | | 1.0e-6 | | | | > | | | | > M | | | | inimum | | | | > e | | | | lement | | | | > to | | | | > com | | | | ponent | | | | > | | | | length | | | | > r | | | | atios: | | | | > Com | | | | ponent | | | | > 1 : | | | | > 0. | | | | 050000 | | | | > | | | | > Com | | | | ponent | | | | > 2 : | | | | > 0. | | | | 050000 | | | | > | | | | > Com | | | | ponent | | | | > 3 : | | | | > 0. | | | | 050000 | | | | > | | | | > 4 | | | | > | | | | Joints | | | | > lo | | | | cated: | | | +========+================+============================================+ | > | > Master - | > Component Type T Component Type B | | Joint | > Node #1, | | | > 1: | > Slave - Node | | | | > #22, | | +––––+––––––––+––––––––––––––––––––––+ | > | > Master - | > Component Type T Component Type B | | Joint | > Node #1, | | | > 2: | > Slave - Node | | | | > #43, | | +––––+––––––––+––––––––––––––––––––––+ | > | > Master - | > Component Type T Component Type B | | Joint | > Node #21, | | | > 3: | > Slave - Node | | | | > #42, | | +––––+––––––––+––––––––––––––––––––––+ | > | > Master - | > Component Type T Component Type B | | Joint | > Node #21, | | | > 4: | > Slave - Node | | | | > #63, | | +––––+––––––––+––––––––––––––––––––––+

VAWTGen Graphical Output

VAWTGen has various graphical outputs after creating a mesh of a VAWT configuration. First, a wire- frame visualization (and surface rendering if requested) is created to allow the user to visually inspect the turbine was constructed as intended. These are shown in Figure 3 through Figure 6. The finite element mesh with node numbering is also visualized as shown in Figure 7. Figure 8 shows the element orientations e~1~ is the local axial direction of an element, e~2~ is the local edgewise direction of an element, and e~3~ is the local flapwise direction of an element.

Finite Element Mesh

Element Orientation Visualization

{width="2.202673884514436in" height="2.950511811023622in"}{width="2.1219225721784776in" height="2.6937674978127735in"}40

35

30

25

20

15

10

5

0

1 0-1

-15

15

10

5

0

-5

-10

x

[]{#_bookmark19 .anchor}Figure 7. Finite element mesh with node numbering Figure 8. Finite element mesh with element orientations

Visualization of OWENS Output using VAWTGen

A number of visualization options exist in VAWTGen for results obtained with the OWENS analysis tool. This section discusses the available options for modal and transient analysis results. These function are located in the "vizFiles" directory of the VAWTGen distribution.

Visualization of Static Analysis Results

The MATLAB function staticPlotter.m will visualize the deformed mesh from a static analysis. This visualization option shows multiple views of the turbine, with the undeformed mesh, and deformed mesh overlaying. The undeformed mesh is plotted in black, and the deformed mesh is plotted in red. The viz function is executed with the following command line call:

staticPlotter(meshFile,resultsFile,scaleFactor);

Such that meshFile is the mesh filename (.mesh), resultsFile is the OWENS output file from static analysis (_static.mat), and scaleFactor scales the deformed mesh.

Visualization of Modal Analysis Results

The MATLAB function viz.m will visualize the mode shapes for a particular mode. This visualization option shows multiple views of the turbine, with the undeformed mesh, 0 degree mode shape, and 90 degree mode shape overlaying. The undeformed mesh is plotted in black, 0 degree mode shape in red, and 90 degree mode shape in blue. The viz function is executed with the following command line call:

viz(meshFile,resultsFile,selectedMode,scaleFactor);

Such that meshFile is the mesh filename (.mesh), resultsFile is the OWENS output file from modal analysis (.out), selectedMode is an integer mode number, and scaleFactor scales the mode shape deformation.

An example of an actual viz function execution is: viz(\'snl34m.mesh\',\'snl34m.out\',2,3) The resulting plot is shown in Figure 9 below:

[]{#bookmark21 .anchor}![C:\Users\bcowens\Desktop\exportfig\modefirstas.png](figs/VAWTGenUserGuide/image12.png){width="2.5578937007874014in" height="2.013333333333333in"}

[]{#_bookmark20 .anchor}Figure 9 Mode shape visualization using viz.m

A similar capability exists for generating animated mode shapes. The vizAnimateModal function is utilized in the following manner:

vizAnimateModal(meshFile,resultsFile,selectedMode,sf,outFileName);

All the input parameters are the same as those for viz, however, the last parameter specifies a file name for a AVI movie file.

Visualization of Transient Analysis Results

A visualization option of transient results as an animation of the motion history of the turbine structure is accomplished via the vizAnimateTransient function. The command line argument is executed as:

vizAnimateTransient(meshFile,uData,sf,outFileName);

Such that mesh file is the mesh filename (.mesh), uData is an n x m array holding displacement data for n degrees of freedom at m time steps, and sf is the deformation scale factor for the structural mesh. The AVI movie file is generated using outFileName.

VAWTGen Output Files

The following output files are generated to serve as input for the OWENS analysis tool:

  • OWENS main input file (.owens)

  • Beam mesh file (.mesh)

  • Element property file (.el)

  • Element orientation file (.ort)

  • Joint file (.jnt)

  • Boundary conditions file (.bc)

  • Blade data file (.bld)

Additionally, a log file describing the junctions of various structural components is generated in a .out output file.

OWENS Main Input File (.owens)

The OWENS main input file is generated with the following format:

Here, the root file name of "vawt" was specified at the command line input for VAWTGen. Command line usage will be discussed in a later section. The associated mesh, element, orientation, joint, and boundary conditions file are listed. The bracketed file comments serve as place holders and are not essential for all OWENS analysis types. These file types will be discussed separately in the OWENS analysis tool user guide. Lines 7 , 9, and 10 contain certain flags that are used by the OWENS software. The two doubles on the 12^th^ line are damping parameters for Rayleigh damping. These are discussed in the OWENS user guide[1].

Mesh File (.mesh)

The mesh file generated by VAWTGen simply lists nodal coordinates and element connectivity. The number of structural components (tower, blades, and struts) and number of elements per component are also listed in this file. The file format is described below:

+––––-+–––––+–––-+–––––––-+–––––––––––-+ | > n | > num | > y | > zCoord | | | umNodes | Elements | Coord | | | | > | > | | | | | > | > xCoord | | | | | nodeNum | | | | | +=========+==========+=======+===============+=======================+ | > | > xCoord | > y | > zCoord | | | nodeNum | | Coord | | | +––––-+–––––+–––-+–––––––-+–––––––––––-+ | > | > xCoord | > y | > zCoord | | | nodeNum | | Coord | | | | > | | | | | | > ... | | | | | +––––-+–––––+–––-+–––––––-+–––––––––––-+ | > ele | > nu | | > | > localNodeNum2 | | mentNum | mNodesPe | | localNodeNum1 | | | | rElement | | | | +––––-+–––––+–––-+–––––––-+–––––––––––-+ | > ele | > nu | | > | > localNodeNum2 | | mentNum | mNodesPe | | localNodeNum1 | | | | rElement | | | | +––––-+–––––+–––-+–––––––-+–––––––––––-+ | > ele | > nu | | > | > localNodeNum2 | | mentNum | mNodesPe | | localNodeNum1 | | | > | rElement | | | | | > ... | | | | | +––––-+–––––+–––-+–––––––-+–––––––––––-+

Element Property File (.el)

The element property file generated by VAWTGen contains element mechanical and some aerodynamic properties. The properties specified in this file are those defined in the NREL file formats [1], but sorted into a form that is more usable by the OWENS analysis tool. The file has the following format:

Element Orientation File (.ort)

The element orientation file generated by VAWTGen lists Euler angles for a 3-2 rotation sequence and some other miscellaneous element information. The file format is described below:

Such that elNum is the element number. Theta3, theta2, and theta1 are the orientation angles (degrees) about a 3, 2, and 1 axes respectively for a 3-2-1 Euler rotation sequence. Length is the element length, and x/y/zOffsets are the offsets of the first node of the element from the coordinate frame origin.

Joint File (.jnt)

The joint file generated by VAWTgen specifies joint conditions at coincident nodes between structural components. The file format for the joint file is shown below:

A master and slave node is defined at a joint from which constraints will be developed. The joint type is also specified (0 = weld(fixed), 1=pinned, 2 = hinge joint with axis about slave node element's e~2~ axis, 3 = hinge joint axis about slave node element's e~1~ axis, 4 = hinge joint axis about slave node element's e~3~ axis). The mass of the joint may be specified in this file. If this option is not sufficient for modeling purposes concentrated mass can be imposed on degrees of freedom using the .ndl file. A place-holder double of zero after jointMass is also in this file, but not currently used in analysis. The orientation associated with the joint is also described by the jointPsi and jointTheta angles (degrees). These angles are used to transform from the global coordinate frame to the local element/joint frame via a 3-2 Euler rotation sequence. Psi denotes rotation about 3, theta denotes rotation about 2.

Boundary Conditions File (.bc)

The boundary conditions file generated by VAWTGen specifies a fixed boundary condition at the tower base (node 1). This file specifies the number of boundary conditions, the node number, local degree of freedom, and specified displacement value for the boundary condition. This file attempts to provide a likely boundary condition for a VAWT structure, but may need to be modified by the analyst depending on the specific configuration of interest. The boundary condition file generated by VAWTGen is shown below:

Blade Data File (.bld)

A blade data file is generated by VAWTGen to aid in mapping aerodynamic loads to the structural mesh generated by VAWTGen. This information includes the blade number, node locations of blade sections in terms of spanwise distance from the blade root, and node number and element numbers associated with these locations. The file also contains the quarter chord coordinate of the blade section, the normal and tangential vector components of the blade section, and the chord of the section. Coordinate and vector components are represented in the rotating, rotor-fixed hub frame. An integer number representing the airfoil as specified in the .ipt file for the blade component and section lift curve slope are also specified. The last column is a place holder not used in the release version of OWENS. The file format for the blade file is described below:

Output File (.out)

This file describes the various component junctions in the generated turbine model. An example of the file is shown below. "T", "B", and "S" denote tower, blade, and strut components. "T/B" denotes a tower blade junction. The component numbers present at this junction are also output for more detail. By default, the tower component is labeled as component 1. Blade components are considered next in a counter clockwise azimuthal direction with the first blade located at 180 degrees azimuth from the x- axis. Struts are numbered last, per blade in a clockwise manner.

+–-+–––-+––+–––––––––––––––––––––––––-+ | T | > jun | > | > (1-2) | | / | ction | f | | | B | | ou | | | | | nd | | +===+=======+====+===================================================+ | T | > jun | > | > (1-2) | | / | ction | f | | | B | | ou | | | | | nd | | +–-+–––-+––+–––––––––––––––––––––––––-+ | T | > jun | > | > (1-3) | | / | ction | f | | | B | | ou | | | | | nd | | +–-+–––-+––+–––––––––––––––––––––––––-+ | T | > jun | > | > (1-3) | | / | ction | f | | | B | | ou | | | | | nd | | +–-+–––-+––+–––––––––––––––––––––––––-+ | T | > jun | > | > (1-4) | | / | ction | f | | | S | | ou | | | | | nd | | +–-+–––-+––+–––––––––––––––––––––––––-+ | T | > jun | > | > (1-5) | | / | ction | f | | | S | | ou | | | | | nd | | +–-+–––-+––+–––––––––––––––––––––––––-+ | T | > jun | > | > (1-6) | | / | ction | f | | | S | | ou | | | | | nd | | +–-+–––-+––+–––––––––––––––––––––––––-+ | T | > jun | > | > (1-7) | | / | ction | f | | | S | | ou | | | | | nd | | +–-+–––-+––+–––––––––––––––––––––––––-+ | B | > jun | > | > (2-1) | | / | ction | f | | | T | | ou | | | | | nd | | +–-+–––-+––+–––––––––––––––––––––––––-+ | B | > jun | > | > (2-1) | | / | ction | f | | | T | | ou | | | | | nd | | +–-+–––-+––+–––––––––––––––––––––––––-+ | B | > jun | > | > (2-3) | | / | ction | f | | | B | | ou | | | | | nd | | +–-+–––-+––+–––––––––––––––––––––––––-+ | \ | | | | | . | | | | | . | | | | | . | | | | +–-+–––-+––+–––––––––––––––––––––––––-+

Future Versions

There are no planned future developments for VAWTGen. Future developments or modifications will be considered as analysis needs arise.

References

  1. OWENS User Guide

  2. Jonkman, J.M., and Buhl, M. L., 2005, FAST User's Guide, National Renewable Energy Laboratory, NREL/EL- 500-38230.

+Legacy VAWTGen Guide · OWENS.jl

All of this has been automated, but the option to create and load these legacy files has been preserved. TODO: show how to do this and condense and modernize this text.

Version 1.0 User Guide

Brian C. Owens

Wind Energy Technologies

Sandia National Laboratories

November 7, 2013

Contents

Introduction 1

Overview of VAWTGen Mesh Generator 1

Demonstration 3

Conventions Employed in Creating a Model with VAWTGen 5

Structural and aerodynamic description of components 5

Caveats of creating a VAWT configuration in VAWTGen 7

Coordinate system 7

Tower component 7

Blade component 7

Blade component 8

VAWTGen Input File 9

VAWTGen Command Line Execution 10

VAWTGen Graphical Output 11

VAWTGen Output Files 15

OWENS Main Input File (.owens) 15

Mesh File (.mesh) 16

Element Property File (.el) 16

Element Orientation File (.ort) 17

Joint File (.jnt) 17

Boundary Conditions File (.bc) 17

Blade Data File (.bld) 18

Output File (.out) 18

Future Versions 18

References 19

Introduction

This user guide presents instructions for using the VAWTGen vertical-axis wind turbine (VAWT) mesh generator. This generator is intended to be utilized with the Offshore Wind ENergy Simulation (OWENS) analysis tool [1]. The input files for this mesh generator are discussed in detail. Turbine components (tower, blades, and struts) are described using existing National Renewable Energy Laboratory (NREL) file formats [2]. A simple input file sizes these basic components and positions them in a hub fixed coordinate frame at arbitrary distances from the origin with arbitrary orientation. VAWTGen generates a mesh of a VAWT consisting of Timoshenko beam elements along with other files describing properties of the VAWT. These files serve as inputs to the OWENS analysis tool. VAWTGen also visualizes the VAWT assembly and mesh to provide a visual confirmation that the VAWT is constructed correctly. Furthermore, VAWTGen can visualize the modal and transient results output by the OWENS analysis tool.

Overview of VAWTGen Mesh Generator

A VAWT rotor primarily consists of a tower and blade components. The blades may be affixed to the tower at their ends as in the Darrieus and V-VAWT configurations or via struts as in the H-VAWT configuration. Struts may also provide a connection between the tower and blades at any position along the tower and blade spans. The VAWTGen mesh generator is capable of generating VAWTs of arbitrary geometry, including H-type, V-type, and Darrieus configurations shown in Figure 1. The VAWT configuration is discretized from continuous structural components into a finite number of beam elements. Elements span between discrete points in the mesh, known as nodes. Finite element analysis examines the motions of nodes as dictated by the deformation of the beam elements under prescribed boundary conditions. This collection of nodes and elements forms the mesh of the VAWT configuration.

{width="2.5990562117235347in" height="1.453332239720035in"}

[]{#_bookmark2 .anchor}Figure 1 Illustrations of V, H, and Darrieus VAWT configurations

VAWTGen accepts data files containing the basic geometry of tower, blade, and strut components. Other crucial configuration information is specified such as the elevation of the blade root from the tower root, as well as the radial distance the blade root is positioned from the tower. An arbitrary number of blades may be specified for the configuration. VAWTGen positions the blade roots with equal azimuth spacing about the tower axis. The blades may be rotated into an arbitrary orientation per a sequence of Euler angles input by the user. If required, struts may be inserted between the tower and a

blade by specifying a fraction of the tower span and the blade span the strut will span. VAWTGen will insert a straight strut of the appropriate length between the tower and blade components. The geometry of the strut component is specified by a file containing geometric data.

With these relatively minimal set of inputs (as illustrated in Figure 2) a VAWT of arbitrary configuration may be created. Therefore, a separate tool is not required for the various types of configurations. VAWTGen provides a convenient means to visualize the VAWT turbine in a wireframe or rendered format. This serves as a quick check for the user to ensure the VAWT has been constructed as intended, and shows the actual turbine configuration that the mesh of beam elements represents. VAWTGen also visualizes the finite element mesh once it is created. VAWTGen identifies points of intersection between the various components and inserts nodes accordingly. These node pairs at points of intersection (i.e. strut to tower, blade to strut, blade to tower) are recorded so appropriate constraint conditions at these joints may be imposed. The orientation of the finite elements in the mesh is also visualized to ensure the elements are positioned and oriented as intended.

C:\\\\Users\\\\bcowens\\\\Desktop\\\\meshGenFlow.png{width="4.016800087489064in" height="2.6266666666666665in"}

[]{#_bookmark3 .anchor}Figure 2 Input and output of VAWTGen mesh generator

Output includes a mesh file is generated that will be used by the analysis software. By default, the mesh is discretized in the same manner as the geometric description of components as specified in the component data files. The user may further subdivide the mesh by specifying an integer factor to further discretize the geometric data into elements. An elemental data file is also created, containing the structural properties of elements. An orientation file is generated containing the Euler angles representing the orientation of the elements. VAWTGen requires data files be supplied to describe the geometry of the primary turbine components (blades, towers, and struts). A joint file is also generated containing nodal information about joint locations. This file is used to specify general constraints between structural components. A blade file is also generated that contains aerodynamic data and

provides information needed for mapping aerodynamic loads to nodal locations on the structural model, as well as supplying geometry to aerodynamic data and geometry to external aerodynamic modules.

The format of the structural component data files is the same as the component files for NREL's FAST code [2]. These files describe the geometry and aerodynamic properties of general turbine components, and there is nothing that restricts their use to horizontal-axis wind turbines (HAWTs) specifically. For example, even though a Darrieus blade is not likely be installed on a HAWT, it is easily described by the NREL's FAST blade geometry file format. This allows existing wind energy design tools to be interfaced with the VAWT analysis tool without the need to consider new file formats. NREL's FAST separates geometrical/structural properties of a blade and aerodynamic properties of a blade into two files and the same approach is employed in the VAWTGen mesh generator.

Demonstration

This section demonstrates the capabilities of the VAWTGen mesh generator. First a two bladed V-VAWT configuration is considered. Figure 3 shows the wireframe visualization of this VAWT. The red line within the wireframe represents the beam flexural axis upon which the actual finite element mesh is created. Note that the blades may be positioned at any orientation. The blades and top of the tower share a common point and can be joined together via a constraint relationship that appropriately models the joint. Next, a three bladed H-VAWT with multiple strut connections is considered. Figure 4 shows the wireframe visualization and mesh for the H-VAWT configuration. The blades are oriented at an arbitrary orientation, and two strut connections per blade are specified. Finally, Darrieus type turbine configurations with swept and strutted blades are considered as shown in Figure 5 and Figure 6 respectively.

C:\\\\Users\\\\bcowens\\\\Desktop\\\\export_fig\\\\Vvawt.png{width="1.8892694663167104in" height="3.2266666666666666in"} C:\\\\Users\\\\bcowens\\\\Desktop\\\\export_fig\\\\hvawt.png{width="1.3600043744531933in" height="3.2133333333333334in"}

[]{#bookmark5 .anchor}Figure 3 Wireframe of V-VAWT []{#bookmark6 .anchor}Figure 4 Wireframe of H-VAWT

C:\\\\Users\\\\bcowens\\\\Desktop\\\\export_fig\\\\dar3swept.png{width="1.02086176727909in" height="3.3866666666666667in"}C:\\\\Users\\\\bcowens\\\\Desktop\\\\export_fig\\\\dar3strut.png{width="0.8588167104111986in" height="3.3866666666666667in"}

+–––––––––––––––––+–––––––––––––––––-+ | > []{#bookmark7 | > []{#bookmark8 .anchor}Figure | | > .anchor}Figure 5 Wireframe | > 6 Wireframe of Strutted | | > of Swept Darrieus VAWT** | > Darrieus VAWT** | +==================================+===================================+ +–––––––––––––––––+–––––––––––––––––-+

Conventions Employed in Creating a Model with VAWTGen

This section describes some specific conventions and caveats of creating a mesh of a VAWT using the VAWTGen mesh generator. First, the files use to describe the structural and aerodynamic properties of files are discussed

Structural and aerodynamic description of components

Structural and aerodynamic descriptions of components are specified through NREL FAST file format using the blade .dat files and Aerodyn .ipt files. For structural description (using the .dat file), only the lines highlighted in red are considered by VAWTGen.

+––––––+–––+–––––-+–-+–––+–-+–––-+–––-+––+ | > (-) | * | > | | > | | > * | > ** | ** | | > (-) | *(de | (kg/m) | | **( | | *(Nm\ | (N) | (- | | | g)** | > | | Nm\^ | | ^2)** | | ** | | | | (Nm\^2)** | | 2)** | | | | | +============+======+===========+===+======+===+=======+=======+====+ | > ) (kg | > | **(m) | * | ( | > | > ** | | | | > m) (kg | m) | | * | m) | | (m)** | | | | | > ( | | ( | | * | | | | | | m)** | | m | | * | | | | | | | | ) | | ( | | | | | | | | * | | m | | | | | | | | * | | ) | | | | | | | | | | * | | | | | | | | | | * | | | | +––––––+–––+–––––-+–-+–––+–-+–––-+–––-+––+

+––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > | | 0. | ** | > **9.163e+009 | > * | > ** | > | | **0 | | 000 | 353. | > 9.163e+009** | *6.8042 | 8.211e | * | | .00 | | | 43** | | e+009** | +009** | *0 | | 000 | | | | | | | .0 | | > 0 | | | | | | | 00 | | .20 | | | | | | | ** | | 0** | | | | | | | | +=====+====+=======+======+=================+=========+========+====+ | > | | > | > * | > 0.000 0.0 | > ** | | | | ** | | **0. | *0.0 | > 0.000 | 0.000** | | | | 316 | | 000** | 00** | | | | | | .71 | | | | | | | | | > | | | | | | | | | 31 | | | | | | | | | 6.7 | | | | | | | | | 1** | | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > | | 0. | ** | **9.163e+009 | > * | ** | * | | **0 | | 000 | 353. | 9.163e+009** | *6.8042 | 8.211e | *0 | | .05 | | | 43** | | e+009** | +009** | .0 | | > 0 | | | | | | | 00 | | .20 | | | | | | | ** | | 0** | | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > | | > | > * | > 0.000 0.0 | > ** | | | | ** | | **0. | *0.0 | > 0.000 | 0.000** | | | | 316 | | 000** | 00** | | | | | | .71 | | | | | | | | | > | | | | | | | | | 31 | | | | | | | | | 6.7 | | | | | | | | | 1** | | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > | | 0. | ** | **9.163e+009 | > * | ** | * | | ** | | 000 | 353. | 9.163e+009** | *6.8042 | 8.211e | *0 | | 0.1 | | | 43** | | e+009** | +009** | .0 | | > 0 | | | | | | | 00 | | .20 | | | | | | | ** | | 0** | | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > | | > | > * | > 0.000 0.0 | > ** | | | | ** | | **0. | *0.0 | > 0.000 | 0.000** | | | | 316 | | 000** | 00** | | | | | | .71 | | | | | | | | | > | | | | | | | | | 31 | | | | | | | | | 6.7 | | | | | | | | | 1** | | | | | | | | | > | | | | | | | | | > | | | | | | | | | ** | | | | | | | | | .. | | | | | | | | | .** | | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > * | > | 0. | ** | **9.163e+009 | > * | ** | * | | *0. | * | 000 | 353. | 9.163e+009** | *6.8042 | 8.211e | *0 | | 8** | *0 | | 43** | | e+009** | +009** | .0 | | | .2 | | | | | | 00 | | | 00 | | | | | | ** | | | ** | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > * | ** | > | > * | > 0.000 0.0 | > ** | | | | *31 | 31 | **0. | *0.0 | > 0.000 | 0.000** | | | | 6.7 | 6. | 000** | 00** | | | | | | 1** | 71 | | | | | | | | | ** | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > | > | 0. | ** | **9.163e+009 | > * | ** | * | | ** | * | 000 | 353. | 9.163e+009** | *6.8042 | 8.211e | *0 | | 0.8 | *0 | | 43** | | e+009** | +009** | .0 | | 5** | .2 | | | | | | 00 | | | 00 | | | | | | ** | | | ** | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > * | ** | > | > * | > 0.000 0.0 | > ** | | | | *31 | 31 | **0. | *0.0 | > 0.000 | 0.000** | | | | 6.7 | 6. | 000** | 00** | | | | | | 1** | 71 | | | | | | | | | ** | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > * | > | 0. | ** | **9.163e+009 | > * | ** | * | | *0. | * | 000 | 353. | 9.163e+009** | *6.8042 | 8.211e | *0 | | 9** | *0 | | 43** | | e+009** | +009** | .0 | | | .2 | | | | | | 00 | | | 00 | | | | | | ** | | | ** | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > * | ** | > | > * | > 0.000 0.0 | > ** | | | | *31 | 31 | **0. | *0.0 | > 0.000 | 0.000** | | | | 6.7 | 6. | 000** | 00** | | | | | | 1** | 71 | | | | | | | | | ** | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > | > | 0. | ** | **9.163e+009 | > * | ** | * | | ** | * | 000 | 353. | 9.163e+009** | *6.8042 | 8.211e | *0 | | 0.9 | *0 | | 43** | | e+009** | +009** | .0 | | 5** | .2 | | | | | | 00 | | | 00 | | | | | | ** | | | ** | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > * | ** | > | > * | > 0.000 0.0 | > ** | | | | *31 | 31 | **0. | *0.0 | > 0.000 | 0.000** | | | | 6.7 | 6. | 000** | 00** | | | | | | 1** | 71 | | | | | | | | | ** | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > | > | 0. | ** | > **9.163e+009 | > * | > ** | > | | ** | * | 000 | 353. | > 9.163e+009** | *6.8042 | 8.211e | * | | 1.0 | *0 | | 43** | | e+009** | +009** | *0 | | 000 | .2 | | | | | | .0 | | 0** | 00 | | | | | | 00 | | | ** | | | | | | ** | +––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > * | ** | > | > * | > 0.000 0.0 | > ** | | | | *31 | 31 | **0. | *0.0 | > 0.000 | 0.000** | | | | 6.7 | 6. | 000** | 00** | | | | | | 1** | 71 | | | | | | | | | ** | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+

Caveats of blade structural description in VAWTGen are described below.

  • {width="4.046369203849519e-3in" height="0.15120188101487314in"}The alpha column describing bend-twist coupling is not currently employed in the analysis.{width="4.046369203849519e-3in" height="0.15120188101487314in"}

  • For blades, the reference axis is assumed to pass through the quarter chord. The blade may be shaped by using the PrecrvRef and PreswpRef parameters.

  • VAWTGen creates a counter clockwise rotating turbine. A positive PreswpRef parameter sweeps a blade away from the direction of rotation. A positive PrecrvRef will shape a blade outward from the machine center.

  • Edgewise elastic axis and mass center offsets are positive towards the trailing edge of the blade section.

  • Flapwise elastic axis and mass center offsets are positive in the direction outward from the machine center.

  • Under these assumptions, positive structural twist twists the leading edge inwards towards the machine center.

  • All other structural properties are the same as that specified in the FAST manual[1].

The aerodynamic description of a component is accomplished via the Aerodyn .ipt file format. As with the blade properties (.dat) file, only certain parts of this file are used by VAWTGen. Specifically, the parts used by VAWTGen are highlighted in red in the example file below.

Note that the DRNodes and PrnElm columns are not used by VAWTGen but must remain in the file for successful reading of the .ipt file. As with the conventional use of the file, RNodes denotes a point by a physical distance along a blade span from the root. AeroTwst is the aerodynamic twist angle in degrees such that a positive twist angle rotates the leading edge of the blade inwards towards machine center. Chord is used as an aerodynamic property and also for a wireframe visualization of a VAWT design. N{width="4.046369203849519e-3in" height="0.15120188101487314in"}Foil gives an airfoil ID to a section. For wireframe visualization purposes the following thickness to chord ratios for an elliptical cross-section are specified by the NFoil integer: 1 – 1.0, 2 – 0.6, 3 - 0.3, all other –

0.2. These thickness to chord ratios are only employed for visualization purposes and do not affect VAWTGen output.

+––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > | 11.10 | > | 1 | * | **NOPRINT | | 2.85833 | | 2.21667 | .22** | *2** | | +=============+===========+=============+=======+======+==============+ | > | 11.10 | > | 1 | * | **NOPRINT | | 5.07500 | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > | 11.10 | > | 1 | * | **NOPRINT | | 7.29167 | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > | 10.41 | > | 1 | * | **NOPRINT | | 9.50833 | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > * | 8.38 | > | 1 | * | **NOPRINT | | *11.72500** | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > * | 6.35 | > | 1 | * | **NOPRINT | | *13.94167** | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > * | 4.33 | > | 1 | * | **NOPRINT | | *16.15833** | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > * | 2.85 | > | 1 | * | **NOPRINT | | *18.37500** | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > * | 2.22 | > | 1 | * | **NOPRINT | | *20.59167** | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > * | 1.58 | > | 1 | * | **NOPRINT | | *22.80833** | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > * | 0.95 | > | 1 | * | **NOPRINT | | *25.02500** | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > * | 0.53 | > | 1 | * | **NOPRINT | | *27.24167** | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > * | 0.38 | > | 1 | * | **NOPRINT | | *29.45833** | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > * | 0.23 | > | 1 | * | **NOPRINT | | *31.67500** | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > * | 0.08 | > | 1 | * | **NOPRINT | | *33.89167** | | 2.21667 | .22** | *2** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+

Caveats of creating a VAWT configuration in VAWTGen

The previous sections discussed the files for describing the various components (blades, tower, struts) of a VAWT. This section provides details for creating consistent VAWT models using VAWTGen and illustrates input parameters.

Coordinate system

The following coordinate system z-axis is along the tower axis, and x- and y-axes are in the plane of rotation.

Tower component

The primary input for the tower component is the tower length or height. With this specification, VAWTGen positions the tower vertically along the h~3~ axis with the root of the tower at the origin of the coordinate system. A straight tower is assumed. Any PrecrvRef or PreswpRef specified in the .dat file for the tower is ignored.

Blade component

The blade components are positioned using the following input parameters:

  • Number of blades

  • Blade length

  • Blade root elevation from tower base elevation (z= 0)

  • Blade root radial offset from z-axis (this positions the root of the blade at the appropriate x and y coordinates depending on the azimuth location of the blade)

  • Blade theta orientation a (degrees, rotation about the y-axis)

  • Blade sweep angle (degrees, rotation about an intermediate "2-axis" a positive angle sweeps the blade away from the direction of rotation)

Notes:

  • The blade "theta" orientation angle should be negative so that the root is at a lower elevation (z-coordinate). A warning message is output if blade tip elevation is lower than blade root elevation.

  • Blades will be positioned with equal azimuth spacing of the blade root dictated by the specified number of blades.

  • Under this convention the root of "Blade 1" will always be positioned at 180 degrees (the x-axis being at 0 degrees azimuth). From this position blades are numbered in ascending order counter clockwise.

  • This convention of blade placement will also produce element orientations with tangential vectors along the trailing edge of a cross section and normal vectors outward from the machine center.

[]{#_bookmark15 .anchor}Strut component

The strut components (which can provide a structural component between the tower and blade connection) are positioned using the following input parameters:

  • Fraction of tower span for strut placement

  • Fraction of blade span for strut placement

VAWTGen will automatically determine the strut length and insert the component based off of these two parameters. VAWTGen inserts a straight strut with the discretization described in the .dat file for the strut. Any PrecrvRef or PreswpRef specified in this file is ignored.

VAWTGen will also insert nodes as needed to provide connections between the structural components.

VAWTGen Input File

As mentioned before, the structural component (tower, blade, and struts) are described by the NREL file formats [1] and will not be discussed here. The main input file for VAWTGen is described below. This example input file is for a three bladed VAWT with struts, but without swept blades. The commented input file shown below is sufficient for explanation and will not be discussed further.

VAWTGen Command Line Execution

VAWTGen is written using the MATLAB programming language. The VAWTGen source code directory should be added to the MATLAB path, and VAWTGen should be executed from a job directory containing the component data files (.dat and .ipt NREL formats), and the VAWTGen input file described in the following section. The command line input should be executed in the MATLAB command window as:

vawtGen(inputFile,outputFileRootName,renderBool,zeroTolerance);

For example:

vawtGen('snl34m.in','snl34m',true,1.0e-5);

Results in execution with "snl34m.in" as the main VAWTGen input file. Resulting output files would have the root "snl34m", such as "snl34m.mesh", "snl34m.el", etc. The renderBool produces a rendered surface plot of the turbine if set to true, and no rendered view if set to "false". The zeroTolerance variable specifies a tolerance to be considered numerical zero when searching for coincident points in the configuration for identifying locations where joints are to be specified. If excluded from the command line input a default value of 1.0e-6 is used.

Command line output from VAWTGen consists of a set of minimum element length ratios to the length of the actual structural component. This allows the user to ensure that element lengths are not too small to cause problems with the structural dynamics simulation. The located joints in the model are also displayed with information of the master and slave node numbers and component types.

A variety of examples are available in the "sampleJobs" directory distributed with VAWTGen. They may be executed by adding the VAWTGen directory to the MATLAB path and running the "generateMesh.m" scripts in the example job directory.

A sample command line output is shown below:

+––––+––––––––+––––––––––––––––––––––+ | > \>\> | | | | > vawt | | | | Gen(\' | | | | ideal3 | | | | 4m.in\ | | | | ',\'id | | | | eal34m | | | | \',0); | | | | > | | | | > * | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | | | | | - | | | | SNL | | | | V | | | | AWTGen | | | | | | | | V1.0 | | | | * | | | | | | | | - | | | | Dev | | | | eloped | | | | by | | | | | | | | Sandia | | | | Na | | | | tional | | | | | | | | Labora | | | | tories | | | | | | | | Wind | | | | | | | | Energy | | | | | | | | Techno | | | | logies | | | | * | | | | | | | | - | | | | See | | | | | | | | licen | | | | se.txt | | | | | | | | for | | | | | | | | disc | | | | laimer | | | | | | | | infor | | | | mation | | | | * | | | | | | | | > * | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | *** | | | | > Zero | | | | > tol | | | | erance | | | | > set | | | | > to | | | | > d | | | | efault | | | | > of | | | | > | | | | 1.0e-6 | | | | > | | | | > M | | | | inimum | | | | > e | | | | lement | | | | > to | | | | > com | | | | ponent | | | | > | | | | length | | | | > r | | | | atios: | | | | > Com | | | | ponent | | | | > 1 : | | | | > 0. | | | | 050000 | | | | > | | | | > Com | | | | ponent | | | | > 2 : | | | | > 0. | | | | 050000 | | | | > | | | | > Com | | | | ponent | | | | > 3 : | | | | > 0. | | | | 050000 | | | | > | | | | > 4 | | | | > | | | | Joints | | | | > lo | | | | cated: | | | +========+================+============================================+ | > | > Master - | > Component Type T Component Type B | | Joint | > Node #1, | | | > 1: | > Slave - Node | | | | > #22, | | +––––+––––––––+––––––––––––––––––––––+ | > | > Master - | > Component Type T Component Type B | | Joint | > Node #1, | | | > 2: | > Slave - Node | | | | > #43, | | +––––+––––––––+––––––––––––––––––––––+ | > | > Master - | > Component Type T Component Type B | | Joint | > Node #21, | | | > 3: | > Slave - Node | | | | > #42, | | +––––+––––––––+––––––––––––––––––––––+ | > | > Master - | > Component Type T Component Type B | | Joint | > Node #21, | | | > 4: | > Slave - Node | | | | > #63, | | +––––+––––––––+––––––––––––––––––––––+

VAWTGen Graphical Output

VAWTGen has various graphical outputs after creating a mesh of a VAWT configuration. First, a wire- frame visualization (and surface rendering if requested) is created to allow the user to visually inspect the turbine was constructed as intended. These are shown in Figure 3 through Figure 6. The finite element mesh with node numbering is also visualized as shown in Figure 7. Figure 8 shows the element orientations e~1~ is the local axial direction of an element, e~2~ is the local edgewise direction of an element, and e~3~ is the local flapwise direction of an element.

Finite Element Mesh

Element Orientation Visualization

{width="2.202673884514436in" height="2.950511811023622in"}{width="2.1219225721784776in" height="2.6937674978127735in"}40

35

30

25

20

15

10

5

0

1 0-1

-15

15

10

5

0

-5

-10

x

[]{#_bookmark19 .anchor}Figure 7. Finite element mesh with node numbering Figure 8. Finite element mesh with element orientations

Visualization of OWENS Output using VAWTGen

A number of visualization options exist in VAWTGen for results obtained with the OWENS analysis tool. This section discusses the available options for modal and transient analysis results. These function are located in the "vizFiles" directory of the VAWTGen distribution.

Visualization of Static Analysis Results

The MATLAB function staticPlotter.m will visualize the deformed mesh from a static analysis. This visualization option shows multiple views of the turbine, with the undeformed mesh, and deformed mesh overlaying. The undeformed mesh is plotted in black, and the deformed mesh is plotted in red. The viz function is executed with the following command line call:

staticPlotter(meshFile,resultsFile,scaleFactor);

Such that meshFile is the mesh filename (.mesh), resultsFile is the OWENS output file from static analysis (_static.mat), and scaleFactor scales the deformed mesh.

Visualization of Modal Analysis Results

The MATLAB function viz.m will visualize the mode shapes for a particular mode. This visualization option shows multiple views of the turbine, with the undeformed mesh, 0 degree mode shape, and 90 degree mode shape overlaying. The undeformed mesh is plotted in black, 0 degree mode shape in red, and 90 degree mode shape in blue. The viz function is executed with the following command line call:

viz(meshFile,resultsFile,selectedMode,scaleFactor);

Such that meshFile is the mesh filename (.mesh), resultsFile is the OWENS output file from modal analysis (.out), selectedMode is an integer mode number, and scaleFactor scales the mode shape deformation.

An example of an actual viz function execution is: viz(\'snl34m.mesh\',\'snl34m.out\',2,3) The resulting plot is shown in Figure 9 below:

[]{#bookmark21 .anchor}![C:\Users\bcowens\Desktop\exportfig\modefirstas.png](figs/VAWTGenUserGuide/image12.png){width="2.5578937007874014in" height="2.013333333333333in"}

[]{#_bookmark20 .anchor}Figure 9 Mode shape visualization using viz.m

A similar capability exists for generating animated mode shapes. The vizAnimateModal function is utilized in the following manner:

vizAnimateModal(meshFile,resultsFile,selectedMode,sf,outFileName);

All the input parameters are the same as those for viz, however, the last parameter specifies a file name for a AVI movie file.

Visualization of Transient Analysis Results

A visualization option of transient results as an animation of the motion history of the turbine structure is accomplished via the vizAnimateTransient function. The command line argument is executed as:

vizAnimateTransient(meshFile,uData,sf,outFileName);

Such that mesh file is the mesh filename (.mesh), uData is an n x m array holding displacement data for n degrees of freedom at m time steps, and sf is the deformation scale factor for the structural mesh. The AVI movie file is generated using outFileName.

VAWTGen Output Files

The following output files are generated to serve as input for the OWENS analysis tool:

  • OWENS main input file (.owens)

  • Beam mesh file (.mesh)

  • Element property file (.el)

  • Element orientation file (.ort)

  • Joint file (.jnt)

  • Boundary conditions file (.bc)

  • Blade data file (.bld)

Additionally, a log file describing the junctions of various structural components is generated in a .out output file.

OWENS Main Input File (.owens)

The OWENS main input file is generated with the following format:

Here, the root file name of "vawt" was specified at the command line input for VAWTGen. Command line usage will be discussed in a later section. The associated mesh, element, orientation, joint, and boundary conditions file are listed. The bracketed file comments serve as place holders and are not essential for all OWENS analysis types. These file types will be discussed separately in the OWENS analysis tool user guide. Lines 7 , 9, and 10 contain certain flags that are used by the OWENS software. The two doubles on the 12^th^ line are damping parameters for Rayleigh damping. These are discussed in the OWENS user guide[1].

Mesh File (.mesh)

The mesh file generated by VAWTGen simply lists nodal coordinates and element connectivity. The number of structural components (tower, blades, and struts) and number of elements per component are also listed in this file. The file format is described below:

+––––-+–––––+–––-+–––––––-+–––––––––––-+ | > n | > num | > y | > zCoord | | | umNodes | Elements | Coord | | | | > | > | | | | | > | > xCoord | | | | | nodeNum | | | | | +=========+==========+=======+===============+=======================+ | > | > xCoord | > y | > zCoord | | | nodeNum | | Coord | | | +––––-+–––––+–––-+–––––––-+–––––––––––-+ | > | > xCoord | > y | > zCoord | | | nodeNum | | Coord | | | | > | | | | | | > ... | | | | | +––––-+–––––+–––-+–––––––-+–––––––––––-+ | > ele | > nu | | > | > localNodeNum2 | | mentNum | mNodesPe | | localNodeNum1 | | | | rElement | | | | +––––-+–––––+–––-+–––––––-+–––––––––––-+ | > ele | > nu | | > | > localNodeNum2 | | mentNum | mNodesPe | | localNodeNum1 | | | | rElement | | | | +––––-+–––––+–––-+–––––––-+–––––––––––-+ | > ele | > nu | | > | > localNodeNum2 | | mentNum | mNodesPe | | localNodeNum1 | | | > | rElement | | | | | > ... | | | | | +––––-+–––––+–––-+–––––––-+–––––––––––-+

Element Property File (.el)

The element property file generated by VAWTGen contains element mechanical and some aerodynamic properties. The properties specified in this file are those defined in the NREL file formats [1], but sorted into a form that is more usable by the OWENS analysis tool. The file has the following format:

Element Orientation File (.ort)

The element orientation file generated by VAWTGen lists Euler angles for a 3-2 rotation sequence and some other miscellaneous element information. The file format is described below:

Such that elNum is the element number. Theta3, theta2, and theta1 are the orientation angles (degrees) about a 3, 2, and 1 axes respectively for a 3-2-1 Euler rotation sequence. Length is the element length, and x/y/zOffsets are the offsets of the first node of the element from the coordinate frame origin.

Joint File (.jnt)

The joint file generated by VAWTgen specifies joint conditions at coincident nodes between structural components. The file format for the joint file is shown below:

A master and slave node is defined at a joint from which constraints will be developed. The joint type is also specified (0 = weld(fixed), 1=pinned, 2 = hinge joint with axis about slave node element's e~2~ axis, 3 = hinge joint axis about slave node element's e~1~ axis, 4 = hinge joint axis about slave node element's e~3~ axis). The mass of the joint may be specified in this file. If this option is not sufficient for modeling purposes concentrated mass can be imposed on degrees of freedom using the .ndl file. A place-holder double of zero after jointMass is also in this file, but not currently used in analysis. The orientation associated with the joint is also described by the jointPsi and jointTheta angles (degrees). These angles are used to transform from the global coordinate frame to the local element/joint frame via a 3-2 Euler rotation sequence. Psi denotes rotation about 3, theta denotes rotation about 2.

Boundary Conditions File (.bc)

The boundary conditions file generated by VAWTGen specifies a fixed boundary condition at the tower base (node 1). This file specifies the number of boundary conditions, the node number, local degree of freedom, and specified displacement value for the boundary condition. This file attempts to provide a likely boundary condition for a VAWT structure, but may need to be modified by the analyst depending on the specific configuration of interest. The boundary condition file generated by VAWTGen is shown below:

Blade Data File (.bld)

A blade data file is generated by VAWTGen to aid in mapping aerodynamic loads to the structural mesh generated by VAWTGen. This information includes the blade number, node locations of blade sections in terms of spanwise distance from the blade root, and node number and element numbers associated with these locations. The file also contains the quarter chord coordinate of the blade section, the normal and tangential vector components of the blade section, and the chord of the section. Coordinate and vector components are represented in the rotating, rotor-fixed hub frame. An integer number representing the airfoil as specified in the .ipt file for the blade component and section lift curve slope are also specified. The last column is a place holder not used in the release version of OWENS. The file format for the blade file is described below:

Output File (.out)

This file describes the various component junctions in the generated turbine model. An example of the file is shown below. "T", "B", and "S" denote tower, blade, and strut components. "T/B" denotes a tower blade junction. The component numbers present at this junction are also output for more detail. By default, the tower component is labeled as component 1. Blade components are considered next in a counter clockwise azimuthal direction with the first blade located at 180 degrees azimuth from the x- axis. Struts are numbered last, per blade in a clockwise manner.

+–-+–––-+––+–––––––––––––––––––––––––-+ | T | > jun | > | > (1-2) | | / | ction | f | | | B | | ou | | | | | nd | | +===+=======+====+===================================================+ | T | > jun | > | > (1-2) | | / | ction | f | | | B | | ou | | | | | nd | | +–-+–––-+––+–––––––––––––––––––––––––-+ | T | > jun | > | > (1-3) | | / | ction | f | | | B | | ou | | | | | nd | | +–-+–––-+––+–––––––––––––––––––––––––-+ | T | > jun | > | > (1-3) | | / | ction | f | | | B | | ou | | | | | nd | | +–-+–––-+––+–––––––––––––––––––––––––-+ | T | > jun | > | > (1-4) | | / | ction | f | | | S | | ou | | | | | nd | | +–-+–––-+––+–––––––––––––––––––––––––-+ | T | > jun | > | > (1-5) | | / | ction | f | | | S | | ou | | | | | nd | | +–-+–––-+––+–––––––––––––––––––––––––-+ | T | > jun | > | > (1-6) | | / | ction | f | | | S | | ou | | | | | nd | | +–-+–––-+––+–––––––––––––––––––––––––-+ | T | > jun | > | > (1-7) | | / | ction | f | | | S | | ou | | | | | nd | | +–-+–––-+––+–––––––––––––––––––––––––-+ | B | > jun | > | > (2-1) | | / | ction | f | | | T | | ou | | | | | nd | | +–-+–––-+––+–––––––––––––––––––––––––-+ | B | > jun | > | > (2-1) | | / | ction | f | | | T | | ou | | | | | nd | | +–-+–––-+––+–––––––––––––––––––––––––-+ | B | > jun | > | > (2-3) | | / | ction | f | | | B | | ou | | | | | nd | | +–-+–––-+––+–––––––––––––––––––––––––-+ | \ | | | | | . | | | | | . | | | | | . | | | | +–-+–––-+––+–––––––––––––––––––––––––-+

Future Versions

There are no planned future developments for VAWTGen. Future developments or modifications will be considered as analysis needs arise.

References

  1. OWENS User Guide

  2. Jonkman, J.M., and Buhl, M. L., 2005, FAST User's Guide, National Renewable Energy Laboratory, NREL/EL- 500-38230.

diff --git a/dev/examples/A_simplyRunningOWENS.ipynb b/dev/examples/A_simplyRunningOWENS.ipynb index 3d397a0..1df3803 100644 --- a/dev/examples/A_simplyRunningOWENS.ipynb +++ b/dev/examples/A_simplyRunningOWENS.ipynb @@ -54,10 +54,10 @@ " - Precision: double\n", " - OpenMP: Yes, number of threads: 4/4\n", " - Date: Oct 17 2024\n", - " - Time: 16:01:39\n", + " - Time: 21:57:44\n", " Execution Info:\n", " - Date: 10/17/2024\n", - " - Time: 16:08:28+0000\n", + " - Time: 22:04:27+0000\n", "\n", " Running ADI.\n", " Running AeroDyn.\n", @@ -256,7 +256,7 @@ " Writing statistics to summary file\n", " Generating AeroDyn binary time-series file \"./turbsimfiles/DLC1_1Vinf10.0.bts\"\n", "\n", - " Processing complete. 24.659 CPU seconds used.\n", + " Processing complete. 23.935 CPU seconds used.\n", "\n", " TurbSim terminated normally.\n", "\n", @@ -287,10 +287,10 @@ " - Precision: double\n", " - OpenMP: Yes, number of threads: 4/4\n", " - Date: Oct 17 2024\n", - " - Time: 16:01:39\n", + " - Time: 21:57:44\n", " Execution Info:\n", " - Date: 10/17/2024\n", - " - Time: 16:10:54+0000\n", + " - Time: 22:06:49+0000\n", "\n", " Running ADI.\n", " Running AeroDyn.\n", diff --git a/dev/examples/A_simplyRunningOWENS/index.html b/dev/examples/A_simplyRunningOWENS/index.html index 284e5d3..f2f9d39 100644 --- a/dev/examples/A_simplyRunningOWENS/index.html +++ b/dev/examples/A_simplyRunningOWENS/index.html @@ -33,10 +33,10 @@ - Precision: double - OpenMP: Yes, number of threads: 4/4 - Date: Oct 17 2024 - - Time: 16:01:39 + - Time: 21:57:44 Execution Info: - Date: 10/17/2024 - - Time: 16:15:58+0000 + - Time: 22:11:47+0000 Running ADI. Running AeroDyn. @@ -236,7 +236,7 @@ Writing statistics to summary file Generating AeroDyn binary time-series file "./turbsimfiles/DLC1_1Vinf10.0.bts" - Processing complete. 24.431 CPU seconds used. + Processing complete. 24.416 CPU seconds used. TurbSim terminated normally. @@ -267,10 +267,10 @@ - Precision: double - OpenMP: Yes, number of threads: 4/4 - Date: Oct 17 2024 - - Time: 16:01:39 + - Time: 21:57:44 Execution Info: - Date: 10/17/2024 - - Time: 16:17:33+0000 + - Time: 22:13:21+0000 Running ADI. Running AeroDyn. @@ -407,4 +407,4 @@ Maximum Damage per hr: 0.14693877554749607 At composite station 12 of 21 at lam 1 of 1 -Mass of Turbine: 208897.3537787773 kg

This page was generated using Literate.jl.

+Mass of Turbine: 208897.3537787773 kg

This page was generated using Literate.jl.

diff --git a/dev/examples/B_detailedInputs.ipynb b/dev/examples/B_detailedInputs.ipynb index c6ce38e..51b4a65 100644 --- a/dev/examples/B_detailedInputs.ipynb +++ b/dev/examples/B_detailedInputs.ipynb @@ -148,10 +148,10 @@ " - Precision: double\n", " - OpenMP: Yes, number of threads: 4/4\n", " - Date: Oct 17 2024\n", - " - Time: 16:01:39\n", + " - Time: 21:57:44\n", " Execution Info:\n", " - Date: 10/17/2024\n", - " - Time: 16:12:04+0000\n", + " - Time: 22:07:58+0000\n", "\n", " Running ADI.\n", " Running AeroDyn.\n", diff --git a/dev/examples/B_detailedInputs/index.html b/dev/examples/B_detailedInputs/index.html index beeff37..3f6fcb8 100644 --- a/dev/examples/B_detailedInputs/index.html +++ b/dev/examples/B_detailedInputs/index.html @@ -131,10 +131,10 @@ - Precision: double - OpenMP: Yes, number of threads: 4/4 - Date: Oct 17 2024 - - Time: 16:01:39 + - Time: 21:57:44 Execution Info: - Date: 10/17/2024 - - Time: 16:18:43+0000 + - Time: 22:14:31+0000 Running ADI. Running AeroDyn. @@ -296,4 +296,4 @@ Minimum Safety Factor on tower Surface: 4.663274990042024 At time 0.04s at composite station 1 of 21 at lam 1 of 1 Maximum Damage per hr: 0.1469387755538469 -At composite station 13 of 21 at lam 1 of 1

This page was generated using Literate.jl.

+At composite station 13 of 21 at lam 1 of 1

This page was generated using Literate.jl.

diff --git a/dev/examples/C_customizablePreprocessing.ipynb b/dev/examples/C_customizablePreprocessing.ipynb index 87e40aa..985a934 100644 --- a/dev/examples/C_customizablePreprocessing.ipynb +++ b/dev/examples/C_customizablePreprocessing.ipynb @@ -80,7 +80,7 @@ " libdrm-2.4.123 | hb9d3cd8_0 296 KB conda-forge\n", " libegl-1.7.0 | ha4b6fd6_1 44 KB conda-forge\n", " libgl-1.7.0 | ha4b6fd6_1 131 KB conda-forge\n", - " libglib-2.82.1 | h2ff4ddf_1 3.8 MB conda-forge\n", + " libglib-2.82.2 | h2ff4ddf_0 3.7 MB conda-forge\n", " libglvnd-1.7.0 | ha4b6fd6_1 129 KB conda-forge\n", " libglx-1.7.0 | ha4b6fd6_1 76 KB conda-forge\n", " libjpeg-turbo-3.0.0 | hd590300_1 604 KB conda-forge\n", @@ -139,7 +139,7 @@ " xorg-xorgproto-2024.1 | hb9d3cd8_1 552 KB conda-forge\n", " zlib-1.3.1 | h4ab18f5_1 91 KB conda-forge\n", " ------------------------------------------------------------\n", - " Total: 210.4 MB\n", + " Total: 210.3 MB\n", "\n", "The following NEW packages will be INSTALLED:\n", "\n", @@ -177,7 +177,7 @@ " libdrm conda-forge/linux-64::libdrm-2.4.123-hb9d3cd8_0 \n", " libegl conda-forge/linux-64::libegl-1.7.0-ha4b6fd6_1 \n", " libgl conda-forge/linux-64::libgl-1.7.0-ha4b6fd6_1 \n", - " libglib conda-forge/linux-64::libglib-2.82.1-h2ff4ddf_1 \n", + " libglib conda-forge/linux-64::libglib-2.82.2-h2ff4ddf_0 \n", " libglvnd conda-forge/linux-64::libglvnd-1.7.0-ha4b6fd6_1 \n", " libglx conda-forge/linux-64::libglx-1.7.0-ha4b6fd6_1 \n", " libjpeg-turbo conda-forge/linux-64::libjpeg-turbo-3.0.0-hd590300_1 \n", @@ -990,10 +990,10 @@ " - Precision: double\n", " - OpenMP: Yes, number of threads: 4/4\n", " - Date: Oct 17 2024\n", - " - Time: 16:01:39\n", + " - Time: 21:57:44\n", " Execution Info:\n", " - Date: 10/17/2024\n", - " - Time: 16:13:38+0000\n", + " - Time: 22:09:32+0000\n", "\n", " Running ADI.\n", " Running AeroDyn.\n", diff --git a/dev/examples/C_customizablePreprocessing/index.html b/dev/examples/C_customizablePreprocessing/index.html index b39818d..9e072e3 100644 --- a/dev/examples/C_customizablePreprocessing/index.html +++ b/dev/examples/C_customizablePreprocessing/index.html @@ -657,10 +657,10 @@ - Precision: double - OpenMP: Yes, number of threads: 4/4 - Date: Oct 17 2024 - - Time: 16:01:39 + - Time: 21:57:44 Execution Info: - Date: 10/17/2024 - - Time: 16:19:53+0000 + - Time: 22:15:41+0000 Running ADI. Running AeroDyn. @@ -835,4 +835,4 @@ Minimum Safety Factor on tower Surface: 4.331286121960938 At time 0.035s at composite station 1 of 21 at lam 1 of 1 Maximum Damage per hr: 0.14693877554749607 -At composite station 12 of 21 at lam 1 of 1

This page was generated using Literate.jl.

+At composite station 12 of 21 at lam 1 of 1

This page was generated using Literate.jl.

diff --git a/dev/examples/D_simulatingFloatingPlatforms.ipynb b/dev/examples/D_simulatingFloatingPlatforms.ipynb index 860b0b8..c32315d 100644 --- a/dev/examples/D_simulatingFloatingPlatforms.ipynb +++ b/dev/examples/D_simulatingFloatingPlatforms.ipynb @@ -566,10 +566,10 @@ " - Precision: double\n", " - OpenMP: Yes, number of threads: 4/4\n", " - Date: Oct 17 2024\n", - " - Time: 16:01:39\n", + " - Time: 21:57:44\n", " Execution Info:\n", " - Date: 10/17/2024\n", - " - Time: 16:14:56+0000\n", + " - Time: 22:10:49+0000\n", "\n", " Running SeaState.\n", " Generating incident wave kinematics and current time history.\n", @@ -596,10 +596,10 @@ " - Precision: double\n", " - OpenMP: Yes, number of threads: 4/4\n", " - Date: Oct 17 2024\n", - " - Time: 16:01:39\n", + " - Time: 21:57:44\n", " Execution Info:\n", " - Date: 10/17/2024\n", - " - Time: 16:15:04+0000\n", + " - Time: 22:10:57+0000\n", "\n", " Running MoorDyn (v2.0.0, 2022-12-08).\n", " This is MoorDyn v2, with significant input file changes from v1.\n", diff --git a/dev/examples/D_simulatingFloatingPlatforms/index.html b/dev/examples/D_simulatingFloatingPlatforms/index.html index 5e423bb..fcf580a 100644 --- a/dev/examples/D_simulatingFloatingPlatforms/index.html +++ b/dev/examples/D_simulatingFloatingPlatforms/index.html @@ -313,10 +313,10 @@ - Precision: double - OpenMP: Yes, number of threads: 4/4 - Date: Oct 17 2024 - - Time: 16:01:39 + - Time: 21:57:44 Execution Info: - Date: 10/17/2024 - - Time: 16:21:01+0000 + - Time: 22:16:49+0000 Running SeaState. Generating incident wave kinematics and current time history. @@ -343,10 +343,10 @@ - Precision: double - OpenMP: Yes, number of threads: 4/4 - Date: Oct 17 2024 - - Time: 16:01:39 + - Time: 21:57:44 Execution Info: - Date: 10/17/2024 - - Time: 16:21:09+0000 + - Time: 22:16:56+0000 Running MoorDyn (v2.0.0, 2022-12-08). This is MoorDyn v2, with significant input file changes from v1. @@ -370,4 +370,4 @@ PyPlot.ylabel("Force [N]") PyPlot.title("Hydrodynamic Surge Loading") -nothing

This page was generated using Literate.jl.

+nothing

This page was generated using Literate.jl.

diff --git a/dev/examples/MDroot.MD.out b/dev/examples/MDroot.MD.out index fb09c12..e44a803 100644 --- a/dev/examples/MDroot.MD.out +++ b/dev/examples/MDroot.MD.out @@ -1,5 +1,5 @@ -These predictions were generated by MoorDyn (v2.0.02022-12-08) on 17-Oct-2024 at 16:21:09. +These predictions were generated by MoorDyn (v2.0.02022-12-08) on 17-Oct-2024 at 22:16:56. diff --git a/dev/examples/hydrodyn_temp.out.HD.out b/dev/examples/hydrodyn_temp.out.HD.out index 004563e..d552f20 100644 --- a/dev/examples/hydrodyn_temp.out.HD.out +++ b/dev/examples/hydrodyn_temp.out.HD.out @@ -1,5 +1,5 @@ -These predictions were generated by HydroDyn on 17-Oct-2024 at 16:21:09. +These predictions were generated by HydroDyn on 17-Oct-2024 at 22:16:56. diff --git a/dev/examples/hydrodyn_temp.out.SEA.out b/dev/examples/hydrodyn_temp.out.SEA.out index 5aad165..e19125d 100644 --- a/dev/examples/hydrodyn_temp.out.SEA.out +++ b/dev/examples/hydrodyn_temp.out.SEA.out @@ -1,5 +1,5 @@ -These predictions were generated by SeaState on 17-Oct-2024 at 16:21:08. +These predictions were generated by SeaState on 17-Oct-2024 at 22:16:56. diff --git a/dev/examples/turbsimfiles/DLC1_1Vinf10.0.bts b/dev/examples/turbsimfiles/DLC1_1Vinf10.0.bts index f1875b6..f31ca41 100644 Binary files a/dev/examples/turbsimfiles/DLC1_1Vinf10.0.bts and b/dev/examples/turbsimfiles/DLC1_1Vinf10.0.bts differ diff --git a/dev/examples/turbsimfiles/DLC1_1Vinf10.0.sum b/dev/examples/turbsimfiles/DLC1_1Vinf10.0.sum index 03cd1a7..2ba70c7 100644 --- a/dev/examples/turbsimfiles/DLC1_1Vinf10.0.sum +++ b/dev/examples/turbsimfiles/DLC1_1Vinf10.0.sum @@ -1,5 +1,5 @@ -This summary file was generated by TurbSim (from OpenFAST--128-NOTFOUND) on 17-Oct-2024 at 16:17:08. +This summary file was generated by TurbSim (from OpenFAST--128-NOTFOUND) on 17-Oct-2024 at 22:12:57. Runtime Options: @@ -321,4 +321,4 @@ U-component (X) statistics from the interpolated hub point: TI = 8.8494 % -Processing complete. 24.431 CPU seconds used. +Processing complete. 24.416 CPU seconds used. diff --git a/dev/getting_started/index.html b/dev/getting_started/index.html index 5a13162..440613e 100644 --- a/dev/getting_started/index.html +++ b/dev/getting_started/index.html @@ -1,2 +1,2 @@ -nothing yet · OWENS.jl
+nothing yet · OWENS.jl
diff --git a/dev/index.html b/dev/index.html index dcaa7fa..c394418 100644 --- a/dev/index.html +++ b/dev/index.html @@ -15,4 +15,4 @@ img

OWENS under the hood

The OWENS.jl package contains functions and interfaces related to the ontology (how everything comes together, forms a wind turbine, and operates like a wind turbine), with preprocessing and postprocessing helper functions. These include automated meshing functions, sectional property mapping, two-way loads mapping, generalized torque and direct mesh controls, algorithms for two-way coupling and time stepping, fatigue and design equivalent load calculation, and all of the ontology and coupling to the other packages used.

OWENSPrecomp.jl is a translation of Precomp and calculates the sectional properties

Composites.jl provides classical laminate theory definitions used for both pre and post processing

OWENSFEA.jl is one of the structural models including a Timoshenko beam solver in the linear and nonlinear steady, modal, time domain, and reduced order modal domains.

GXBeam.jl has also been integrated for geometrically exact beam solutions of the same above

The aerodynamics are provided by the OWENSAero.jl module, or optionally OpenFAST OLAF via OWENSOpenFASTWrappers.jl

Floating dynamics are provided by OWENSOpenFASTWrappers.jl and the HydroDyn and MoorDyn libraries

Turbulent inflow is provided by OWENSOpenFASTWrappers.jl and the inflowwind and turbsim libraries

Rainflow counting was provided by Rainflow.jl, however, this package became orphained and was pulled into the OWENS code base.

img -

Installation

Please follow the instructions on the setup page

Documentation

- All of the functions have docstrings describing the i/o and function purpose, which can be accessed the docs site or by: * import module * ? module.function() - A note about julia debuggers – if you don’t want it to step through everything, you need to tell it what packages to compile vs while packages to step through. This will make the debugger comparable (if not faster) than Matlab in speed. In VSCode, this can be done in the debug pane, or by optionally loading the provided VS code profile in the OWENS.jl/docs folder. This VS code profile will also set up the julia environment and other useful packages and key bindings, and can be modified as desired.

Software License

Copyright 2021 National Technology & Engineering Solutions of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, there is a non-exclusive license for use of this work by or on behalf of the U.S. Government. Export of this data may require a license from the United States Government.

See Copyright.txt file for more information

+

Installation

Please follow the instructions on the setup page

Documentation

- All of the functions have docstrings describing the i/o and function purpose, which can be accessed the docs site or by: * import module * ? module.function() - A note about julia debuggers – if you don’t want it to step through everything, you need to tell it what packages to compile vs while packages to step through. This will make the debugger comparable (if not faster) than Matlab in speed. In VSCode, this can be done in the debug pane, or by optionally loading the provided VS code profile in the OWENS.jl/docs folder. This VS code profile will also set up the julia environment and other useful packages and key bindings, and can be modified as desired.

Software License

Copyright 2021 National Technology & Engineering Solutions of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, there is a non-exclusive license for use of this work by or on behalf of the U.S. Government. Export of this data may require a license from the United States Government.

See Copyright.txt file for more information

diff --git a/dev/installation/index.html b/dev/installation/index.html index ebc3b6f..072bc0a 100644 --- a/dev/installation/index.html +++ b/dev/installation/index.html @@ -221,4 +221,4 @@ # Pkg.add("PyPlot")

Testing Your Build of OWENS

clone the owens repository which contains example scripts that will setup and run example turbines from end to end

git clone git@github.com:sandialabs/OWENS.jl

If you get an error about attempting to access library xyz, but it doesn't exist, check the path to openfast in the scripts at the top level of the error to make sure the path and library file matches, most of these are:

adi_lib = "path/to/openfast/build/modules/libraryfolder/libraryname"
cd OWENS.jl/examples/literate/
 julia B_detailedInputs.jl

You can visualize the output vtk/vtu/pvd paraview files with paraview, install paraview via apt-get -y install paraview # or on mac, brew install paraview

You can also run julia more interactively and maintain variables in scope for inspections etc if you don't have an IDE set up (but be careful of assuming a variable was cleared when it wasn't!) by starting the repl and essentially copying and pasing the run script via

julia
    include("path/to/file.jl")

Visual Studio Code IDE

You can install VScode and get a debugger etc. In VScode, there is a setting file which sets up VS code for julia and sets some quick keys that can be changed if desired (OWENS.jl/docs/OWENS.code-profile).

With the sample profile loaded into VSCode, If you want to clear out all the variables and restart do

cmd-j cmd-k,

if you want to clear out the console

cmd-j cmd-c

open the workspace

cmd-j cmd-w

run highlighted code

shift-enter

run the currently selected file

cmd-shift-enter

You can also use the gui buttons.

VSCode Julia Debugger

It is a lot like matlab, but you are working with a compiled code, so in the debugger portion of the vscode gui, you need to check which code is compiled and which is interpereted, and turn off the compilation for the packages you are trying to debug. The debugger will not step through compiled code. Also, some lines of code have many instructions, particularly function calls with conversions on the inputs, etc, so if you are trying to use the step in gui button, you may need to click it multiple times.

If you are working on a module and want it to reload with your most recent local changes without committing to master, pushing, and telling julia to update the package which is pointing to the git repo:

Install custom repositories you want to develop

start Julia from the cloned directory and use the command:

] dev .

This type of installation will cause the module to reload each time Julia starts without needing to tell Julia to update. You are developing the current directory

alternatively, instead of using or import to get access to the module, within julia

include("path/to/module.jl/source/module.jl")

then you don't even have to restart julia when you make changes, but be careful to only do this for a limited number of modules, and if you are changing constants, like c library interfaces, or the libraries themselves, then you need to restart julia to get it to pick up the most recent changes.

You can also install a specific branch of a remote repository package without having to clone the repo and checkout the branch:

using Pkg
-Pkg.add(url = "git@github.com:sandialabs/OWENS.jl.git", rev = "dev")
+Pkg.add(url = "git@github.com:sandialabs/OWENS.jl.git", rev = "dev") diff --git a/dev/legacyUserGuide/index.html b/dev/legacyUserGuide/index.html index 9f919b4..45f2eb3 100644 --- a/dev/legacyUserGuide/index.html +++ b/dev/legacyUserGuide/index.html @@ -20,4 +20,4 @@ \end{Bmatrix} = \begin{Bmatrix} F_{T} \\ F_{P} -\end{Bmatrix}\]

Such that M, C, and K represent the system mass, damping, and stiffness matrices respectively. The terms U~T~ and U~P~ denote the displacement of the turbine and platform respectively. The terms F~T~ and F~P~ denote the forces acting on the turbine and platform respectively. Terms with subscript "TT" denote influence of the turbine forces on the turbine response. Whereas, terms with subscript "TP" denote influence of turbine forces on the platform response, and terms with subscript "PT" denote influence of the platform forces on the turbine response. Finally, terms with subscript "PP" denote the influence of platform forces on the platform response. Although not explicitly shown here, the rotor velocity/acceleration and platform velocity/acceleration are incorporated in the system damping and stiffness matrices through gyroscopic effects.

Modal analysis may be performed on the above system of equations to examine the stability of the turbine configuration. Whereas understanding the stability of a turbine to avoid potential resonance issues is critical, transient conditions such as rotor start-up, turbulent/unsteady winds, and unsteady waves require a transient analysis capability. Implicit time integration methods have been considered for their ability to reduce time step restriction and maintain efficiency.

Overview of OWENS Analysis Framework

The Offshore Wind Energy Numerical Simulation (OWENS) allows for a convenient coupling of the aeroelastic/structural dynamics finite element analysis to aerodynamic, hydrodynamic, and generator modules. Figure 2 shows an illustration for the framework of OWENS indicating data flow among the analysis tool and various modules. In this figure analysis components surrounded in the purple boxes are independent modules that will interface with the VAWT simulation tool. OWENS will provide and receive data to and from these modules. The implementation of these modules, however, are "as is" and cannot be modified by the authors. Components outlined in the blue boxes are components of the analysis tool that are under direct development by the authors. Data flow is illustrated by various colored arrows. Orange arrows denote an internal data flow from one segment of the OWENS analysis routines to another. Red arrows denote flow of information from the core analysis tool to external modules. Green arrows represent flow of information from external modules to the core analysis tool components.

This analysis framework begins with startup procedures. These include creation of the VAWT configuration mesh using the mesh generator VAWTGen, and specification of initial conditions. VAWTGen produces a finite element mesh representative of a VAWT. Initial conditions such as the initial forces acting on the turbine/platform, initial rotor angular velocity/acceleration, and initial platform angular velocity/acceleration must be provided. With these specifications complete, the coupled aeroelastic/hydrodynamic analysis begins, involving the components outlined in the black box.

The mesh and initial conditions are provided to the OWENS toolkit. By performing a transient analysis via the aforementioned time integration procedures, turbine and platform motions are calculated. The turbine motions along with aerodynamic properties of the turbine are provided to an aerodynamics module. Future versions will actively link OWENS with aerodynamic modules and wind field data while considering turbine motions to calculate aerodynamic loads on the turbine. The aerodynamic loads are provided back to the OWENS toolkit as boundary conditions for the next time step or iteration.

The motion of the turbine shaft is provided to a generator/drivetrain model, which considers the relative motions of the shaft and generator to calculate a resistance torque provided by the generator. By considering the resistance torque along with the shaft torque and rotor inertia, an updated rotor angular velocity/acceleration may be calculated. The generator module is similar to that of NREL's FAST analysis tool [3].

OWENS is interfaced with the WavEC platform dynamics module[2]. The hydrodynamics/mooring module accepts wave data as external forcing on the platform and a reaction force from the attached turbine structure. This module returns rigid body motions (translational and rotational) of the platform due to platform accelerations. These rigid body motions are then applied to the structure as body forces. The resistance torque of the generator may also be applied to the platform.

The above description fully outlines the proposed analysis framework and interface of the core analysis tool with various modules. In the development of this framework, a loose coupling is inherent in that typically motions are provided to a module and loads are calculated and supplied back to the analysis tool. In reality such a clear flow of information does not exist, and the coupling is more complex with loads influencing motions in addition to the motions influencing loads. Therefore, at any given time step an iterative procedure is considered to reach a convergence among the actual two-way coupling between the turbine structural dynamics and aerodynamics, hydrodynamics, and generator dynamics.

Future versions may consider a turbine controller algorithm that provides prescribed motions of the tower and blades or applied braking torque is also required. The prescribed motions or applied torques are imposed via boundary conditions on the finite element model. As illustrated in Figure 2, the turbine controller accepts turbine motions, rotor speed/torque, or wind data and provides prescribed motions or breaking torques. The finite element model provides a convenient interface for the turbine controller.

figs/userguide2.png{width="8.1578947944007in" height="5.019896106736658in"}

Figure Analysis framework for the OWENS toolkit

OWENS Installation

The OWENS analysis software should be installed by adding the following directories to the MATLAB path:

Platform dynamics software interface

If a floating turbine is to be considered, the WavEC platform dynamics software[2] should be installed and the file "waveECStartUp.m" should be modified in the "OWENS/source/transientSource/" directory. An appropriate system call must be specified to launch a MATLAB instance of WavEC that accepts a network socket connection from OWENS. The string variable "sysCallString" in the following code snippet must be modified appropriately depending on whether a Unix or PC system is being used.

%sets system commands to launch wavEC software

hydroLaunchScript = \'/home/bcowens/work/OWENSsingle/launchPlatformCode\';

%sysCallString = [matlabPath,\' -sd \',hydroCodeDirectory,\' -r \',hydroCodeExec,\' &\'];

sysCallString = [\'bash \',hydroLaunchScript,\' &\'];

disp(\'launching WAVEC\'); %launch wavEC depending on pc or unix environment

if(ispc());

system(sysCallString);

end

if(isunix())

unix(sysCallString);
end

OWENS Command Line Execution

The beta version of OWENS is written using the MATLAB programming language. The OWENS source code directory (and subdirectories) should be added to the MATLAB path, and OWENS should be executed from a job directory containing the associated input files described in the following section. Three types of analysis capabilities exist: static, modal and, transient analysis. These will be described in the following subsections.

Static Analysis Execution

The static analysis capability of OWENS is executed as follows:

owens(inputFile,'S',rotorSpeed,nonlinearBool,dispGuess);

For example:

owens('vawt.owens','S',0.5,true);

Performs a modal analysis using the main OWENS input file "vawt.owens". The input character 'S' denotes a static analysis is to be performed. Rotor speed input is the specified angular velocity of the rotor in Hz. The Boolean input of "true" geometric nonlinearities. Setting this Boolean to false performs a linear static analysis. The input "dispGuess" is an array of the initial guess for displacements to be used in nonlinear static analysis and should be a vector of the total number of degrees of freedom in the structural model (number of nodes x 6). It is not used if nonlinearBool is set to false. If not specified, the initial guess is a vector of zeros by default.

By default, body forces from gravity and rotational effects are included in static analysis. Arbitrary static loading may be specified by modifying the "externalForcingStatic.m" file in the OWENS source directory. The Fexternal array may be modified to include loads for a corresponding degree of freedom in the Fdof array. See this function for usage instructions.

For nonlinear static analysis, load stepping procedures are implemented within OWENS. The parameters governing load stepping and nonlinear iteration may be adjusted if desired by the user and the process is described in Appendix B.

The modal analysis capability of OWENS is executed as follows:

owens(inputFile,'M',rotorSpeed,spinUpBool,numModesOutput,dispGuess);

For example:

owens('vawt.owens','M',0.0,true,40);

Performs a modal analysis using the main OWENS input file "vawt.owens". The input character 'M' denotes a modal analysis is to be performed. Rotor speed input is the specified angular velocity of the rotor in Hz. The Boolean input of "true" activates a spin up procedures which performs a nonlinear static analysis on the structure to arrive at a "stiffened" stiffness matrix to be used in the modal analysis. Setting this Boolean to false skips the spin up procedure and uses an unmodified stiffness matrix in modal analysis. The last argument is the number of modes extracted and output for the model. If no value is specified, the default number is 20. The input "dispGuess" is an array of the initial guess for displacements to be used in nonlinear static analysis and should be a vector of the total number of degrees of freedom in the structural model (number of nodes x 6). It is not used if spinUpBool is set to false. If not specified, the initial guess is a vector of zeros by default.

By default, body forces from gravity and rotational effects are included in static analysis used in pre-stressed modal analysis. Arbitrary static loading may be specified by modifying the "externalForcingStatic.m" file in the OWENS source directory. The Fexternal array may be modified to include loads for a corresponding degree of freedom in the Fdof array. See this function for usage instructions.

For pre-stressed modal analysis (which employs nonlinear static analysis), load stepping procedures are implemented within OWENS. The parameters governing load stepping and nonlinear iteration may be adjusted if desired by the user and the process is described in Appendix B.

Creating Campbell Diagrams of a VAWT Configuration

Automated functionality exists for creating Campbell diagrams of a land based VAWT configuration. A Campbell diagram examines how modal frequencies vary with respect to the rotor speed of a turbine. It is also helpful for identifying critical per-rev excitations that may cause resonance in a VAWT configuration.

The function "campDiagramGen.m" located in "OWENS/source/utilitySource/" performs modal analysis at user specified rotor speeds. Command line execution is performed with the following call:

[freq] = campDiagramGen(inputFileName,outputFileName,rotorSpeedArray,spinUpOn,numModes)

Such that "inputFileName" is a string specifying the main .owens file corresponding to the VAWT configuration. The "outputFileName" is a string specifying the prefix that will be given to a MATLAB .mat array containing the results. The rotor speed array and corresponding frequencies are saved to this .mat file. The "rotorSpeedArray" variable is an array containing the rotor speeds (Hz) of interest. The Boolean flag "spinUpOn" includes nonlinear stress stiffening effects in modal analysis if set to true, if set to false these effects are excluded from the analysis. The integer "numModes" specifies the number of lower system modes to extract during modal analysis.

The previous functionality performed the analysis for creating a Campbell diagram, and "campDiagPlotter.m" in "OWENS/source/utilitySource" plots the Campbell diagram. Command line execution of Campbell diagram plotting is performed with the following call:

campDiagPlotter(resultsFileName,numModesToPlot,numPerRevLines,minRPMplot,maxRPMplot)

Such that "resultsFileName" is a string specifying the .mat file generated using campDiagramGen.m. The integer "NumModesToPlot" specifies the number of modes to be plotted on the Campbell diagram. The integer "numPerRevLines" specifies how many per-rev lines to include on the Campbell diagram. The values "minRPMplot" and "maxRPMplot" specify the RPM values at which the per-rev lines will begin and end. Figure 3 shows an example of a Campbell digram generated using the aforementioned procedures.

figs/userguide3.png{width="5.829861111111111in" height="4.254861111111111in"}

Figure 3 Example of a Campbell diagram

Transient Analysis Execution

The transient analysis capability of OWENS is executed as follows:

owens(inputFile,'TNB',timeStep,numTimeSteps,nlBool,turbineOperationParams...);

By default, body forces from gravity and rotational effects are included in trasient analysis. Arbitrary transient external loading may be specified by modifying the "externalForcing.m" file in the OWENS source directory. The Fexternal array may be modified to include loads for a corresponding degree of freedom in the Fdof array. See this function for usage instructions.

Specified rotor speed profile

An arbitrary VAWT configuration may be subjected to an arbitrary, specified rotor speed profile using the following command line execution.

owens('vawt.owens','TNB',1.0e-3,40000,true,0,[0.0 5.0 30.0],[0.0 0.5 0.5]);

This performs a transient analysis using the main OWENS input file 'vawt.owens'. The input character 'TNB' denotes a transient analysis is to be performed. A time step of 1.0e-3 seconds is utilized and 40000 time steps are performed for a simulation time of 40 seconds. The flag of true activates nonlinear strain calculation in the transient analysis. The turbine operation flag of "0" denotes a specified omega profile is utilized. The 7^th^ argument is an array of times for the specified rotor speed profile. The 8^th^ argument is an array of specified rotor speeds at the aforementioned times.

Alternatively, the 7^th^ and 8^th^ arguments may be omitted and the file "OWENS\source\userDefinedRotorSpeedProfile.m" may be modified to specify an arbitrary time varying rotor speed profile. See the comments within this function for appropriate usage.

Forced start-up mode using generator

An arbitrary VAWT configuration may be subjected to a forced start-up mode using the generator to provide a motoring torque using the following command line execution.

owens('vawt.owens','T',1.0e-3,40000,true,1,0.0);

This performs a transient analysis using the main OWENS input file 'vawt.owens'. The input character 'TNB' denotes a transient analysis is to be performed. A time step of 1.0e-3 seconds is utilized and 40000 time steps are performed for a simulation time of 40 seconds. The flag of true activates nonlinear strain calculation in the transient analysis. The turbine operation flag of "1" denotes a forced start up using the generator as a motor. Accordingly, generator properties must be specified by providing a .gen file. The 7^th^ argument is the initial rotor speed at t=0 in Hz.

Alternatively, the .gen file in the main .owens input file may be replaced with the integer "1" and a user defined generator function may be employed. The file "OWENS\source\userDefinedGenerator.m" may be modified to specify an arbitrary time varying rotor speed profile. See the comments within this function for appropriate usage.

Self-starting turbine mode

An arbitrary VAWT configuration may be considered in a self-starting mode in which external forces provide a torque to increase the rotor speed of the turbine using the following command line execution.

owens('vawt.owens','T',1.0e-3,40000,true 2,0.0,1.05);

This performs a transient analysis using the main OWENS input file 'vawt.owens'. The input character 'TNB' denotes a transient analysis is to be performed. A time step of 1.0e-3 seconds is utilized and 40000 time steps are performed for a simulation time of 40 seconds. The turbine operation flag of "2" denotes a self-starting turbine with the generator disconnected from the grid initially. The 7^th^ argument is the initial rotor speed at t=0 in Hz. The 8^th^ argument is the rotor speed at which the generator will activate. Accordingly, generator properties must be specified by providing a .gen file. The history of nodal displacements, generator torque, generator power, rotor speed, rotor position, and reaction at the turbine base at each time step are saved in the MATLAB file \<root\>.mat such as "vawt.mat". Table 1 provides a listing with output description, variable name, and size of the output.

Transient Analysis Execution Using Reduced Order Model

The transient analysis capability with a reduced order model of OWENS is executed as follows:

owens(inputFile,'ROM',timeStep,numTimeSteps,numModesForROM,nlBool,turbineOperationParams...);

This option performs a transient analysis as before, but using a reduced order model which contains a subset of system modes as specified by "numModesForROM". The reduced order model contains the first "numModesForROM" lowest frequency modes. A modal analysis should be constructed to determine how many modes a user is interested in including in a reduced order model. The various operation modes (specified rotor speed, force start-up, self-starting) are specified as in the previous section.

OWENS Input Files

This section presents input file formats for OWENS, including the main input file and sub-input files. The input files discussed in this section include:

Note that while these files may be created manually, many are created automatically by the mesh generator/pre-processor VAWTGen. VAWTGen is described in a separate user guide[1] and is not discussed here.

OWENS Main Input File (.owens)

The OWENS main input file is generated by VAWTGen with the following format:

vawt.mesh
vawt.el
vawt.ort
vawt.jnt
[concentrated nodal terms file]
vawt.bc
0 vawt.plat
[initial conditions file]
0 vawt.bld [aero loads file]
0 [drivetrain property file]
[generator property file]
0.0 0.0

The mesh, element, orientation, joint, and boundary conditions files for analysis are listed. The bracketed file comments serve as place holders and are not essential for all OWENS analysis types. The 5^th^ line specifies a concentrated nodal term file that can be used to specify concentrated masses, stiffness, and loads at nodal locations. The 6^th^ line specifies a boundary condition file. The integer on the 7^th^ line is a flag for activating the floating platform (1 – active, 0 – inactive) and the following platform file contain information governing a platform dynamics analysis. The 8^th^ line specified initial conditions for a transient analysis. The flag on the 9^th^ line governs activation of aerodynamic loads, a blade file provides information for mapping aerodynamic loads to the structural mesh, and an aerodynamic loads file provide loading data. The flag on the 10^th^ line governs activation of a simple drivetrain model and the drive train property file contains drive train model properties. The 11^th^ line specifies properties for a simple induction generator, which is not required for all analysis types. The 12^th^ line specifies Rayleigh damping parameters. These are the 𝛼 and 𝛽 parameters respectively in the following expression for the damping matrix:

\[\lbrack C\rbrack = \ \alpha\lbrack M\rbrack + \beta\lbrack K\rbrack\]

Such that [M], [C], and [K] are the system mass, damping, and stiffness matrices respectively. 𝛼 and 𝛽 should be positive numbers. 𝛼 serves to damp higher frequency modes while 𝛽 serves to damp lower frequency modes.

Mesh File (.mesh)

The mesh file generated by VAWTGen simply lists nodal coordinates and element connectivity. The number of structural components (tower, blades, and struts) and number of elements per component are also listed in this file. The file format is described below:

numNodes numElements
nodeNum xCoord yCoord zCoord
nodeNum xCoord yCoord zCoord
nodeNum xCoord yCoord zCoord
...
elementNum numNodesPerElement localNodeNum1 localNodeNum2
elementNum numNodesPerElement localNodeNum1 localNodeNum2
elementNum numNodesPerElement localNodeNum1 localNodeNum2
...
numberOfStructuralComponents numElementsComponent1 .... numElementsComponentN

Element Property File (.el)

The element property file generated by VAWTGen contains element mechanical and some aerodynamic properties. The properties specified in this file are those defined in the NREL file formats [1], but sorted into a form that is more usable by the OWENS analysis tool. It should be noted that the mass offsets have been corrected to be the distance from the offset from the elastic axis of section. Edgewise offsets are positive towards the trailing edge, flapwise offsets are positive outward from the machine center. The alpha coupling factor is not currently employed in analysis. The file has the following format:

Element1, Node 1: [blade fraction] [aeroCenter] [structuralTwist] [MassPerLength] [FlapwiseStiffness] [EdgewiseStiffness] [TorsionalStiffness] [AxialStiffness] [alphaCouplingFactor] [FlapwiseInertia] [EdgewiseInertia] [Precurve] [PreSweep] [FlapwiseCGoffset] [EdgewiseCGOffset] [FlapwiseEAOffset] [EdgewiseEAOffset] ...
Element1, Node 2: [blade fraction] [aeroCenter] [structuralTwist] [MassPerLength] [FlapwiseStiffness] [EdgewiseStiffness] [TorsionalStiffness] [AxialStiffness] [alphaCouplingFactor] [FlapwiseInertia] [EdgewiseInertia] [Precurve] [PreSweep] [FlapwiseCGoffset] [EdgewiseCGOffset] [FlapwiseEAOffset] [EdgewiseEAOffset] ...

...

...
Element n, Node 1: [blade fraction] [aeroCenter] [structuralTwist] [MassPerLength] [FlapwiseStiffness] [EdgewiseStiffness] [TorsionalStiffness] [AxialStiffness] [alphaCouplingFactor] [FlapwiseInertia] [EdgewiseInertia] [Precurve] [PreSweep] [FlapwiseCGoffset] [EdgewiseCGOffset] [FlapwiseEAOffset] [EdgewiseEAOffset] ...

Element n, Node 2: [blade fraction] [aeroCenter] [structuralTwist] [MassPerLength] [FlapwiseStiffness] [EdgewiseStiffness] [TorsionalStiffness] [AxialStiffness] [alphaCouplingFactor] [FlapwiseInertia] [EdgewiseInertia] [Precurve] [PreSweep] [FlapwiseCGoffset] [EdgewiseCGOffset] [FlapwiseEAOffset] [EdgewiseEAOffset] ...

Element Orientation File (.ort)

The element orientation file generated by VAWTGen lists Euler angles for a 3-2 rotation sequence and some other miscellaneous element information. The file format is described below:

elNum theta3 theta2 theta1 length xOffset yOffset zOffset

Such that elNum is the element number. Theta3, theta2, and theta1 are the orientation angles (degrees) about a 3, 2, and 1 axes respectively for a 3-2-1 Euler rotation sequence. Length is the element length, and x/y/zOffsets are the offsets of the first node of the element from the coordinate frame origin.

Joint File (.jnt)

The joint file generated by VAWTgen specifies joint conditions at coincident nodes between structural components. The file format for the joint file is shown below:

jointNumber masterNode slaveNode jointType jointMass 0.0 ... jointPsi jointTheta

A master and slave node is defined at a joint from which constraints will be developed. The joint type is also specified (0 = weld(fixed), 1=pinned, 2 = hinge joint with axis about slave node element's e~2~ axis, 3 = hinge joint axis about slave node element's e~1~ axis, 4 = hinge joint axis about slave node element's e~3~ axis). The mass of the joint may be specified in this file. If this option is not sufficient for modeling purposes concentrated mass can be imposed on degrees of freedom using the .ndl file. [A place-holder double of zero after jointMass is also in this file, but not currently used in analysis.]{.mark} The orientation associated with the joint is also described by the jointPsi and jointTheta angles (degrees). These angles are used to transform from the global coordinate frame to the local element/joint frame via a 3-2 Euler rotation sequence. Psi denotes rotation about 3, theta denotes rotation about 2.

Concentrated Nodal Terms File

The concentrated nodal terms file applies concentrated mass, stiffness, or forces to nodes of the finite element mesh. This files requires a node number, concentrated term type, local degree of freedom number, and value for the concentrated term. Concentrated term types include "M" for mass, "K" for stiffness, and "F" for force. The degree of freedom specification is not used when the concentrated term is for mass. The mass value specified is applied to all translational degrees of freedom associated with the specified node. See Appendix A for an explanation of local degree of freedom numbering at a particular node. A sample concentrated nodal terms file is shown below:

74 M 1 254.0
81 K 3 1.0e6
92 F 2 2000.0

nodeNum termType localDOFNum value

Boundary Conditions File (.bc)

The boundary conditions file generated by VAWTGen specifies a fixed boundary condition at the tower base (node 1). This file specifies the number of boundary conditions, the node number, local degree of freedom, and specified displacement value for the boundary condition. This file attempts to provide a likely boundary condition for a VAWT structure, but may need to be modified by the analyst depending on the specific configuration of interest. See Appendix A for an explanation of local degree of freedom numbering at a particular node. The boundary condition file generated by VAWTGen is shown below:

6
1 1 0.000000
1 2 0.000000
1 3 0.000000
1 4 0.000000
1 5 0.000000
1 6 0.000000

nodeNum localDOFNum value

Platform Simulation File (.plat)

The platform simulation file specifies parameters required for an external platform dynamics simulation. An example, annotated platform file is shown below.

1 0 0 0 0 0 :active platform DOFs (surge, sway, heave, roll, pitch, yaw)

0.0 0.0 0.0 0.0 0.0 :initial conditions for platform DOFs

0 :drag damping flag (1 = on, 0 = off)

1 :mooring flag (1 = on, 0 = off)

0 :gravity flag (1 = on, 0 = off)

0 :plot flag (1 = on, 0 = off)

0 :radiation damping flag (1 = on, 0 = off)

1 :node number for platform turbine connection

1 :platform turbine yaw interaction (0 = free spinning tower, 1 = fixed tower, 2 = generator reaction torque applied to platform)

3500 :platform server port

4500 :platform client port

The first line activates platform degrees of freedom (DOFs) the ordering of degrees of freedom is surge, sway, have, roll, pitch, and yaw. The second line specifies initial conditions for the platform degrees of freedom, the DOF ordering is the same as the previous line. Lines 5-7 activate/deactivate various aspects of the hydrodynamic/platform dynamics simulation (drag, mooring, gravity, plotting, and radiation damping). Line 8 specifies the node number at the connection of the turbine to the platform. This is used in calculating the reaction force the turbine imparts on the platform. Line 9 is a flag to specify the platform turbine yaw interaction. For a flag of 0 there is no interaction, for a flag of 1 the tower is considered fully constrained to the platform, for a flag of 2, the generator reaction torque is applied to the turbine. The last two lines specify the server port and client port numbers for the network socket interface between the OWENS analysis tool and the platform dynamics module.

Initial Conditions File

The initial conditions file is used for transient analysis to specify an initial displacement of the structure at t =0. This file requires a node number, local degree of freedom number, and displacement value. See Appendix A for an explanation of local degree of freedom numbering at a particular node. The file format is described below:

60 1 0.1
51 2 -0.4
nodeNum localDOFNum value

Blade Data File (.bld)

A blade data file is generated by VAWTGen to aid in mapping aerodynamic loads to the structural mesh generated by VAWTGen. This information includes the blade number, node locations of blade sections in terms of spanwise distance from the blade root, and node number and element numbers associated with these locations. The file also contains the quarter chord coordinate of the blade section, the normal and tangential vector components of the blade section, and the chord of the section. Coordinate and vector components are represented in the rotating, rotor-fixed hub frame. An integer number representing the airfoil as specified in the .ipt file for the blade component and section lift curve slope are also specified. The last column is a place holder not used in the release version of OWENS. The file format for the blade file is described below:

bladeNum nodeDistance nodeNum elementNum quarterChordCoord1 quarterChordCoord2 quarterChordCoord3 sectionNormalVec1 sectionNormalVec2 sectionNormalVec3 sectionTangentVec1 sectionTangentVec2 sectionTangentVec3 sectionChord sectionAirfoilNumber [place holder not used]

Aerodynamic Loads File

Drivetrain Properties File

The drive train properties file is read for cases where the drive train flag is set to true in the main OWENS analysis file. This file contains an effective torsional spring and damping constant for the drivetrain, along with a moment of inertia for the drive train. These values are cast on the low speed shaft (LSS) side of the drivetrain. The file also contains gear ratio and gear box efficiency parameters. A sample drivetrain file is shown below:

1.0e8 1e6 1000.0 :drivetrain spring constant, damping constant, MOI
1.0 1.0 :gear ratio, gear box efficiency

Generator Properties File

The generator properties file is read where the turbine operation mode requires generator interaction. This file includes the generator rated torque, zero torque generator speed, pull out ratio, and rated slip percentage. A sample generator properties file is shown below:

2.09e4 :generator rated torque
1.0 :zero torque generator speed (in Hz)
2.0 :pull out ratio
5.0 :generator rated slip percentage

OWENS Output Files

This section describes the output files generated by the OWENS analysis software. Output is different for the static, modal, and transient analysis types.

Static Analysis Output

Output from this analysis is written to the root filename with "_static.mat" suffix, such as "vawt_static.mat". This MATLAB database contains a solution vector for each degree of freedom of the model. The deformed configuration may be visualized using VAWTGen visualization capabilities[1]. See Appendix A for an explanation of mapping between a global degree of freedom list to local degree of freedom numbering at a particular node.

For modal analysis the output file lists the frequency, damping ratio, and nodal values for mode shapes of the 0 degree (real) and 90 degree out of phase (imaginary) mode shapes. The generated file has the same root name as the .owens input file, but with a suffix of .out. The various mode shapes may be visualized using VAWTGen visualization capabilities[1]. The file format for the modal analysis output is shown below:

MODE # 1

Frequency: 9.941364e-001:

Damping 3.576857e-014:

0 deg Mode Shape:

Ux Uy Uz thetax thetay thetaz

-0.000000 -0.000000 -0.000000 -0.000000 0.000833 -0.000000

0.000627 0.000000 0.000000 -0.000000 0.000819 0.000000

0.001235 0.000000 0.000000 -0.000000 0.000780 0.000000

0.001819 0.000000 0.000000 -0.000000 0.000713 0.000000

0.002353 0.000000 0.000000 -0.000000 0.000620 0.000000

0.002669 0.000000 0.000000 -0.000000 0.000557 0.000000

0.002948 0.000000 0.000000 -0.000000 0.000497 0.000000

0.003196 0.000000 0.000000 -0.000000 0.000437 0.000000
...
90 deg Mode Shape:

Ux Uy Uz thetax thetay thetaz

-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000

-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000

-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000

-0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000

-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000

-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000

-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000

-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000

-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000

...

Mode #2

...

Transient Analysis Output

Transient analysis output has a great deal of data associated with it due to having both spatial and temporal information and OWENS transient analysis output is saved in a MATLAB workspace as \<root\>.mat. Table 1 lists the following information saved in the transient analysis output file with the variable name and associated array size. The units specified in this file assume that the mesh and associated element properties are in SI units. See Appendix A for an explanation of mapping between a global degree of freedom list to local degree of freedom numbering at a particular node.

Transient analysis output may be visualized using VAWTGen visualization capabilities[1].

Table 1. OWENS Transient Output


Output Variable Name (units) Size –––––––––––- –––––––––––- –––––––––––- Time t (s) 1 x numTimeSteps

Nodal displacements uHist (m or rad) numDOF x numTimeSteps

Generator torque genTorque (N-m) 1 x numTimeSteps

Generator power genPower (W) 1 x numTimeSteps

Rotor position aziHist (rad) 1 x numTimeSteps

Rotor speed OmegaHist (Hz) 1 x numTimeSteps

Rotor acceleration OmegaDotHist (Hz/s) 1x numTimetSteps

Gearbox position gbHist (rad) 1 x numTimeSteps

Gearbox speed gbDotHist (Hz) 1 x numTimeSteps

Gearbox acceleration gbDotDotHist (Hz/s) 1 x numTimeSteps

Driveshaft torque torqueDriveShaft (N-m) 1 x numTimeSteps

Platform degrees of rigidDof (m or rad) 6 x numTimeSteps freedom

Turbine base reaction FReactionHist (N or 6 x numTimeSteps force N-m) –––––––––––––––––––––––––––––––––––-

: Default static nonlinear analysis parameters

References

  1. VAWTGen Manual

  2. WavEC manual

  3. Jonkman, J.M., and Buhl, M. L., 2005, FAST User's Guide, National Renewable Energy Laboratory, NREL/EL-500-38230.

Appendix A: Mapping from local nodal DOF numbering to global DOF numbering

Structural nodes in the finite element formulation of the OWENS toolkit each have 6 degrees of freedom. That is 3 translational and 3 rotational. The finite element mesh is represented in a Cartesian frame with "x", "y", and "z" axes. The z axis is typically located along the tower axis of the turbine. Local degree of freedom numberings 1, 2, and 3 correspond to displacements along the x, y, and z axes respectively. Local degree of freedom numberings 4, 5, and 6 correspond to rotations of 4, 5, and 6 about the x, y, and z axes respectively.

For a particular node number "nodeNum" and an associated local degree of freedom "localDOFNum" the following relation exists to the global degree of freedom number "globalDOFNum".

globalDOFNum = (nodeNum-1)*6 + localDOFNum

Appendix B: Nonlinear Static Analysis Parameters

If desired, the user may modify the default parameters for nonlinear static analysis. This is done by creating a file with the same prefix as the main (.owens) analysis file, but with the suffix ".nl". For example, if the main file for an analysis is "vawt.owens", the nonlinear parameter file should be named "vawt.nl". If no ".nl" file exists in the job directory default nonlinear static parameters will be used.

The nonlinear parameter file has the following format for adaptive load stepping in nonlinear iteration:

NR :iteration type, NR = Newton Raphson, DI = Direct Iteration

1.0e-6 :tolerance for nonlinear iteration convergence

5 :maximum number of iterations per load step

0 :integer denoting load steps (0 for adaptive), otherwise, number of load steps followed by values

20 :maximum number of load steps

0.3 :minimum load step

0.1 :minimum delta load step

The adaptive load stepping algorithm attempts to reach a converged solution by adjusting load steps as necessary within the specified or default nonlinear analysis parameters.

If desired, the user may specify a prescribed loadstepping profile for nonlinear iteration with the following file format:

NR :iteration type, NR = Newton Raphson, DI = Direct Iteration

1.0e-6 :tolerance for nonlinear iteration convergence

20 :maximum number of iterations per load step

5 0.2 0.4 0.6 0.8 1.0 :integer denoting load steps (0 for adaptive), otherwise, number of load steps followed by values

The prescribed load stepping algorithm attempts to reach a converged solution within the maximum number of iterations per load step and terminates analysis if unsuccessful.

By default, the nonlinear iteration parameters are those listed in Table


  1. Parameter Value –––––––––––––––––- –––––––––––––––––- Nonlinear Iteration Tolerance 1.0e-6

    Iteration Type Newton Raphson

    Loads Stepping Algorithm Adaptive

    Max Iterations Per Load Step 50

    Max Number of Load Steps 20

    Minimum Load Step 0.05

    Minimum Load Step Delta 0.05

+\end{Bmatrix}\]

Such that M, C, and K represent the system mass, damping, and stiffness matrices respectively. The terms U~T~ and U~P~ denote the displacement of the turbine and platform respectively. The terms F~T~ and F~P~ denote the forces acting on the turbine and platform respectively. Terms with subscript "TT" denote influence of the turbine forces on the turbine response. Whereas, terms with subscript "TP" denote influence of turbine forces on the platform response, and terms with subscript "PT" denote influence of the platform forces on the turbine response. Finally, terms with subscript "PP" denote the influence of platform forces on the platform response. Although not explicitly shown here, the rotor velocity/acceleration and platform velocity/acceleration are incorporated in the system damping and stiffness matrices through gyroscopic effects.

Modal analysis may be performed on the above system of equations to examine the stability of the turbine configuration. Whereas understanding the stability of a turbine to avoid potential resonance issues is critical, transient conditions such as rotor start-up, turbulent/unsteady winds, and unsteady waves require a transient analysis capability. Implicit time integration methods have been considered for their ability to reduce time step restriction and maintain efficiency.

Overview of OWENS Analysis Framework

The Offshore Wind Energy Numerical Simulation (OWENS) allows for a convenient coupling of the aeroelastic/structural dynamics finite element analysis to aerodynamic, hydrodynamic, and generator modules. Figure 2 shows an illustration for the framework of OWENS indicating data flow among the analysis tool and various modules. In this figure analysis components surrounded in the purple boxes are independent modules that will interface with the VAWT simulation tool. OWENS will provide and receive data to and from these modules. The implementation of these modules, however, are "as is" and cannot be modified by the authors. Components outlined in the blue boxes are components of the analysis tool that are under direct development by the authors. Data flow is illustrated by various colored arrows. Orange arrows denote an internal data flow from one segment of the OWENS analysis routines to another. Red arrows denote flow of information from the core analysis tool to external modules. Green arrows represent flow of information from external modules to the core analysis tool components.

This analysis framework begins with startup procedures. These include creation of the VAWT configuration mesh using the mesh generator VAWTGen, and specification of initial conditions. VAWTGen produces a finite element mesh representative of a VAWT. Initial conditions such as the initial forces acting on the turbine/platform, initial rotor angular velocity/acceleration, and initial platform angular velocity/acceleration must be provided. With these specifications complete, the coupled aeroelastic/hydrodynamic analysis begins, involving the components outlined in the black box.

The mesh and initial conditions are provided to the OWENS toolkit. By performing a transient analysis via the aforementioned time integration procedures, turbine and platform motions are calculated. The turbine motions along with aerodynamic properties of the turbine are provided to an aerodynamics module. Future versions will actively link OWENS with aerodynamic modules and wind field data while considering turbine motions to calculate aerodynamic loads on the turbine. The aerodynamic loads are provided back to the OWENS toolkit as boundary conditions for the next time step or iteration.

The motion of the turbine shaft is provided to a generator/drivetrain model, which considers the relative motions of the shaft and generator to calculate a resistance torque provided by the generator. By considering the resistance torque along with the shaft torque and rotor inertia, an updated rotor angular velocity/acceleration may be calculated. The generator module is similar to that of NREL's FAST analysis tool [3].

OWENS is interfaced with the WavEC platform dynamics module[2]. The hydrodynamics/mooring module accepts wave data as external forcing on the platform and a reaction force from the attached turbine structure. This module returns rigid body motions (translational and rotational) of the platform due to platform accelerations. These rigid body motions are then applied to the structure as body forces. The resistance torque of the generator may also be applied to the platform.

The above description fully outlines the proposed analysis framework and interface of the core analysis tool with various modules. In the development of this framework, a loose coupling is inherent in that typically motions are provided to a module and loads are calculated and supplied back to the analysis tool. In reality such a clear flow of information does not exist, and the coupling is more complex with loads influencing motions in addition to the motions influencing loads. Therefore, at any given time step an iterative procedure is considered to reach a convergence among the actual two-way coupling between the turbine structural dynamics and aerodynamics, hydrodynamics, and generator dynamics.

Future versions may consider a turbine controller algorithm that provides prescribed motions of the tower and blades or applied braking torque is also required. The prescribed motions or applied torques are imposed via boundary conditions on the finite element model. As illustrated in Figure 2, the turbine controller accepts turbine motions, rotor speed/torque, or wind data and provides prescribed motions or breaking torques. The finite element model provides a convenient interface for the turbine controller.

figs/userguide2.png{width="8.1578947944007in" height="5.019896106736658in"}

Figure Analysis framework for the OWENS toolkit

OWENS Installation

The OWENS analysis software should be installed by adding the following directories to the MATLAB path:

Platform dynamics software interface

If a floating turbine is to be considered, the WavEC platform dynamics software[2] should be installed and the file "waveECStartUp.m" should be modified in the "OWENS/source/transientSource/" directory. An appropriate system call must be specified to launch a MATLAB instance of WavEC that accepts a network socket connection from OWENS. The string variable "sysCallString" in the following code snippet must be modified appropriately depending on whether a Unix or PC system is being used.

%sets system commands to launch wavEC software

hydroLaunchScript = \'/home/bcowens/work/OWENSsingle/launchPlatformCode\';

%sysCallString = [matlabPath,\' -sd \',hydroCodeDirectory,\' -r \',hydroCodeExec,\' &\'];

sysCallString = [\'bash \',hydroLaunchScript,\' &\'];

disp(\'launching WAVEC\'); %launch wavEC depending on pc or unix environment

if(ispc());

system(sysCallString);

end

if(isunix())

unix(sysCallString);
end

OWENS Command Line Execution

The beta version of OWENS is written using the MATLAB programming language. The OWENS source code directory (and subdirectories) should be added to the MATLAB path, and OWENS should be executed from a job directory containing the associated input files described in the following section. Three types of analysis capabilities exist: static, modal and, transient analysis. These will be described in the following subsections.

Static Analysis Execution

The static analysis capability of OWENS is executed as follows:

owens(inputFile,'S',rotorSpeed,nonlinearBool,dispGuess);

For example:

owens('vawt.owens','S',0.5,true);

Performs a modal analysis using the main OWENS input file "vawt.owens". The input character 'S' denotes a static analysis is to be performed. Rotor speed input is the specified angular velocity of the rotor in Hz. The Boolean input of "true" geometric nonlinearities. Setting this Boolean to false performs a linear static analysis. The input "dispGuess" is an array of the initial guess for displacements to be used in nonlinear static analysis and should be a vector of the total number of degrees of freedom in the structural model (number of nodes x 6). It is not used if nonlinearBool is set to false. If not specified, the initial guess is a vector of zeros by default.

By default, body forces from gravity and rotational effects are included in static analysis. Arbitrary static loading may be specified by modifying the "externalForcingStatic.m" file in the OWENS source directory. The Fexternal array may be modified to include loads for a corresponding degree of freedom in the Fdof array. See this function for usage instructions.

For nonlinear static analysis, load stepping procedures are implemented within OWENS. The parameters governing load stepping and nonlinear iteration may be adjusted if desired by the user and the process is described in Appendix B.

The modal analysis capability of OWENS is executed as follows:

owens(inputFile,'M',rotorSpeed,spinUpBool,numModesOutput,dispGuess);

For example:

owens('vawt.owens','M',0.0,true,40);

Performs a modal analysis using the main OWENS input file "vawt.owens". The input character 'M' denotes a modal analysis is to be performed. Rotor speed input is the specified angular velocity of the rotor in Hz. The Boolean input of "true" activates a spin up procedures which performs a nonlinear static analysis on the structure to arrive at a "stiffened" stiffness matrix to be used in the modal analysis. Setting this Boolean to false skips the spin up procedure and uses an unmodified stiffness matrix in modal analysis. The last argument is the number of modes extracted and output for the model. If no value is specified, the default number is 20. The input "dispGuess" is an array of the initial guess for displacements to be used in nonlinear static analysis and should be a vector of the total number of degrees of freedom in the structural model (number of nodes x 6). It is not used if spinUpBool is set to false. If not specified, the initial guess is a vector of zeros by default.

By default, body forces from gravity and rotational effects are included in static analysis used in pre-stressed modal analysis. Arbitrary static loading may be specified by modifying the "externalForcingStatic.m" file in the OWENS source directory. The Fexternal array may be modified to include loads for a corresponding degree of freedom in the Fdof array. See this function for usage instructions.

For pre-stressed modal analysis (which employs nonlinear static analysis), load stepping procedures are implemented within OWENS. The parameters governing load stepping and nonlinear iteration may be adjusted if desired by the user and the process is described in Appendix B.

Creating Campbell Diagrams of a VAWT Configuration

Automated functionality exists for creating Campbell diagrams of a land based VAWT configuration. A Campbell diagram examines how modal frequencies vary with respect to the rotor speed of a turbine. It is also helpful for identifying critical per-rev excitations that may cause resonance in a VAWT configuration.

The function "campDiagramGen.m" located in "OWENS/source/utilitySource/" performs modal analysis at user specified rotor speeds. Command line execution is performed with the following call:

[freq] = campDiagramGen(inputFileName,outputFileName,rotorSpeedArray,spinUpOn,numModes)

Such that "inputFileName" is a string specifying the main .owens file corresponding to the VAWT configuration. The "outputFileName" is a string specifying the prefix that will be given to a MATLAB .mat array containing the results. The rotor speed array and corresponding frequencies are saved to this .mat file. The "rotorSpeedArray" variable is an array containing the rotor speeds (Hz) of interest. The Boolean flag "spinUpOn" includes nonlinear stress stiffening effects in modal analysis if set to true, if set to false these effects are excluded from the analysis. The integer "numModes" specifies the number of lower system modes to extract during modal analysis.

The previous functionality performed the analysis for creating a Campbell diagram, and "campDiagPlotter.m" in "OWENS/source/utilitySource" plots the Campbell diagram. Command line execution of Campbell diagram plotting is performed with the following call:

campDiagPlotter(resultsFileName,numModesToPlot,numPerRevLines,minRPMplot,maxRPMplot)

Such that "resultsFileName" is a string specifying the .mat file generated using campDiagramGen.m. The integer "NumModesToPlot" specifies the number of modes to be plotted on the Campbell diagram. The integer "numPerRevLines" specifies how many per-rev lines to include on the Campbell diagram. The values "minRPMplot" and "maxRPMplot" specify the RPM values at which the per-rev lines will begin and end. Figure 3 shows an example of a Campbell digram generated using the aforementioned procedures.

figs/userguide3.png{width="5.829861111111111in" height="4.254861111111111in"}

Figure 3 Example of a Campbell diagram

Transient Analysis Execution

The transient analysis capability of OWENS is executed as follows:

owens(inputFile,'TNB',timeStep,numTimeSteps,nlBool,turbineOperationParams...);

By default, body forces from gravity and rotational effects are included in trasient analysis. Arbitrary transient external loading may be specified by modifying the "externalForcing.m" file in the OWENS source directory. The Fexternal array may be modified to include loads for a corresponding degree of freedom in the Fdof array. See this function for usage instructions.

Specified rotor speed profile

An arbitrary VAWT configuration may be subjected to an arbitrary, specified rotor speed profile using the following command line execution.

owens('vawt.owens','TNB',1.0e-3,40000,true,0,[0.0 5.0 30.0],[0.0 0.5 0.5]);

This performs a transient analysis using the main OWENS input file 'vawt.owens'. The input character 'TNB' denotes a transient analysis is to be performed. A time step of 1.0e-3 seconds is utilized and 40000 time steps are performed for a simulation time of 40 seconds. The flag of true activates nonlinear strain calculation in the transient analysis. The turbine operation flag of "0" denotes a specified omega profile is utilized. The 7^th^ argument is an array of times for the specified rotor speed profile. The 8^th^ argument is an array of specified rotor speeds at the aforementioned times.

Alternatively, the 7^th^ and 8^th^ arguments may be omitted and the file "OWENS\source\userDefinedRotorSpeedProfile.m" may be modified to specify an arbitrary time varying rotor speed profile. See the comments within this function for appropriate usage.

Forced start-up mode using generator

An arbitrary VAWT configuration may be subjected to a forced start-up mode using the generator to provide a motoring torque using the following command line execution.

owens('vawt.owens','T',1.0e-3,40000,true,1,0.0);

This performs a transient analysis using the main OWENS input file 'vawt.owens'. The input character 'TNB' denotes a transient analysis is to be performed. A time step of 1.0e-3 seconds is utilized and 40000 time steps are performed for a simulation time of 40 seconds. The flag of true activates nonlinear strain calculation in the transient analysis. The turbine operation flag of "1" denotes a forced start up using the generator as a motor. Accordingly, generator properties must be specified by providing a .gen file. The 7^th^ argument is the initial rotor speed at t=0 in Hz.

Alternatively, the .gen file in the main .owens input file may be replaced with the integer "1" and a user defined generator function may be employed. The file "OWENS\source\userDefinedGenerator.m" may be modified to specify an arbitrary time varying rotor speed profile. See the comments within this function for appropriate usage.

Self-starting turbine mode

An arbitrary VAWT configuration may be considered in a self-starting mode in which external forces provide a torque to increase the rotor speed of the turbine using the following command line execution.

owens('vawt.owens','T',1.0e-3,40000,true 2,0.0,1.05);

This performs a transient analysis using the main OWENS input file 'vawt.owens'. The input character 'TNB' denotes a transient analysis is to be performed. A time step of 1.0e-3 seconds is utilized and 40000 time steps are performed for a simulation time of 40 seconds. The turbine operation flag of "2" denotes a self-starting turbine with the generator disconnected from the grid initially. The 7^th^ argument is the initial rotor speed at t=0 in Hz. The 8^th^ argument is the rotor speed at which the generator will activate. Accordingly, generator properties must be specified by providing a .gen file. The history of nodal displacements, generator torque, generator power, rotor speed, rotor position, and reaction at the turbine base at each time step are saved in the MATLAB file \<root\>.mat such as "vawt.mat". Table 1 provides a listing with output description, variable name, and size of the output.

Transient Analysis Execution Using Reduced Order Model

The transient analysis capability with a reduced order model of OWENS is executed as follows:

owens(inputFile,'ROM',timeStep,numTimeSteps,numModesForROM,nlBool,turbineOperationParams...);

This option performs a transient analysis as before, but using a reduced order model which contains a subset of system modes as specified by "numModesForROM". The reduced order model contains the first "numModesForROM" lowest frequency modes. A modal analysis should be constructed to determine how many modes a user is interested in including in a reduced order model. The various operation modes (specified rotor speed, force start-up, self-starting) are specified as in the previous section.

OWENS Input Files

This section presents input file formats for OWENS, including the main input file and sub-input files. The input files discussed in this section include:

Note that while these files may be created manually, many are created automatically by the mesh generator/pre-processor VAWTGen. VAWTGen is described in a separate user guide[1] and is not discussed here.

OWENS Main Input File (.owens)

The OWENS main input file is generated by VAWTGen with the following format:

vawt.mesh
vawt.el
vawt.ort
vawt.jnt
[concentrated nodal terms file]
vawt.bc
0 vawt.plat
[initial conditions file]
0 vawt.bld [aero loads file]
0 [drivetrain property file]
[generator property file]
0.0 0.0

The mesh, element, orientation, joint, and boundary conditions files for analysis are listed. The bracketed file comments serve as place holders and are not essential for all OWENS analysis types. The 5^th^ line specifies a concentrated nodal term file that can be used to specify concentrated masses, stiffness, and loads at nodal locations. The 6^th^ line specifies a boundary condition file. The integer on the 7^th^ line is a flag for activating the floating platform (1 – active, 0 – inactive) and the following platform file contain information governing a platform dynamics analysis. The 8^th^ line specified initial conditions for a transient analysis. The flag on the 9^th^ line governs activation of aerodynamic loads, a blade file provides information for mapping aerodynamic loads to the structural mesh, and an aerodynamic loads file provide loading data. The flag on the 10^th^ line governs activation of a simple drivetrain model and the drive train property file contains drive train model properties. The 11^th^ line specifies properties for a simple induction generator, which is not required for all analysis types. The 12^th^ line specifies Rayleigh damping parameters. These are the 𝛼 and 𝛽 parameters respectively in the following expression for the damping matrix:

\[\lbrack C\rbrack = \ \alpha\lbrack M\rbrack + \beta\lbrack K\rbrack\]

Such that [M], [C], and [K] are the system mass, damping, and stiffness matrices respectively. 𝛼 and 𝛽 should be positive numbers. 𝛼 serves to damp higher frequency modes while 𝛽 serves to damp lower frequency modes.

Mesh File (.mesh)

The mesh file generated by VAWTGen simply lists nodal coordinates and element connectivity. The number of structural components (tower, blades, and struts) and number of elements per component are also listed in this file. The file format is described below:

numNodes numElements
nodeNum xCoord yCoord zCoord
nodeNum xCoord yCoord zCoord
nodeNum xCoord yCoord zCoord
...
elementNum numNodesPerElement localNodeNum1 localNodeNum2
elementNum numNodesPerElement localNodeNum1 localNodeNum2
elementNum numNodesPerElement localNodeNum1 localNodeNum2
...
numberOfStructuralComponents numElementsComponent1 .... numElementsComponentN

Element Property File (.el)

The element property file generated by VAWTGen contains element mechanical and some aerodynamic properties. The properties specified in this file are those defined in the NREL file formats [1], but sorted into a form that is more usable by the OWENS analysis tool. It should be noted that the mass offsets have been corrected to be the distance from the offset from the elastic axis of section. Edgewise offsets are positive towards the trailing edge, flapwise offsets are positive outward from the machine center. The alpha coupling factor is not currently employed in analysis. The file has the following format:

Element1, Node 1: [blade fraction] [aeroCenter] [structuralTwist] [MassPerLength] [FlapwiseStiffness] [EdgewiseStiffness] [TorsionalStiffness] [AxialStiffness] [alphaCouplingFactor] [FlapwiseInertia] [EdgewiseInertia] [Precurve] [PreSweep] [FlapwiseCGoffset] [EdgewiseCGOffset] [FlapwiseEAOffset] [EdgewiseEAOffset] ...
Element1, Node 2: [blade fraction] [aeroCenter] [structuralTwist] [MassPerLength] [FlapwiseStiffness] [EdgewiseStiffness] [TorsionalStiffness] [AxialStiffness] [alphaCouplingFactor] [FlapwiseInertia] [EdgewiseInertia] [Precurve] [PreSweep] [FlapwiseCGoffset] [EdgewiseCGOffset] [FlapwiseEAOffset] [EdgewiseEAOffset] ...

...

...
Element n, Node 1: [blade fraction] [aeroCenter] [structuralTwist] [MassPerLength] [FlapwiseStiffness] [EdgewiseStiffness] [TorsionalStiffness] [AxialStiffness] [alphaCouplingFactor] [FlapwiseInertia] [EdgewiseInertia] [Precurve] [PreSweep] [FlapwiseCGoffset] [EdgewiseCGOffset] [FlapwiseEAOffset] [EdgewiseEAOffset] ...

Element n, Node 2: [blade fraction] [aeroCenter] [structuralTwist] [MassPerLength] [FlapwiseStiffness] [EdgewiseStiffness] [TorsionalStiffness] [AxialStiffness] [alphaCouplingFactor] [FlapwiseInertia] [EdgewiseInertia] [Precurve] [PreSweep] [FlapwiseCGoffset] [EdgewiseCGOffset] [FlapwiseEAOffset] [EdgewiseEAOffset] ...

Element Orientation File (.ort)

The element orientation file generated by VAWTGen lists Euler angles for a 3-2 rotation sequence and some other miscellaneous element information. The file format is described below:

elNum theta3 theta2 theta1 length xOffset yOffset zOffset

Such that elNum is the element number. Theta3, theta2, and theta1 are the orientation angles (degrees) about a 3, 2, and 1 axes respectively for a 3-2-1 Euler rotation sequence. Length is the element length, and x/y/zOffsets are the offsets of the first node of the element from the coordinate frame origin.

Joint File (.jnt)

The joint file generated by VAWTgen specifies joint conditions at coincident nodes between structural components. The file format for the joint file is shown below:

jointNumber masterNode slaveNode jointType jointMass 0.0 ... jointPsi jointTheta

A master and slave node is defined at a joint from which constraints will be developed. The joint type is also specified (0 = weld(fixed), 1=pinned, 2 = hinge joint with axis about slave node element's e~2~ axis, 3 = hinge joint axis about slave node element's e~1~ axis, 4 = hinge joint axis about slave node element's e~3~ axis). The mass of the joint may be specified in this file. If this option is not sufficient for modeling purposes concentrated mass can be imposed on degrees of freedom using the .ndl file. [A place-holder double of zero after jointMass is also in this file, but not currently used in analysis.]{.mark} The orientation associated with the joint is also described by the jointPsi and jointTheta angles (degrees). These angles are used to transform from the global coordinate frame to the local element/joint frame via a 3-2 Euler rotation sequence. Psi denotes rotation about 3, theta denotes rotation about 2.

Concentrated Nodal Terms File

The concentrated nodal terms file applies concentrated mass, stiffness, or forces to nodes of the finite element mesh. This files requires a node number, concentrated term type, local degree of freedom number, and value for the concentrated term. Concentrated term types include "M" for mass, "K" for stiffness, and "F" for force. The degree of freedom specification is not used when the concentrated term is for mass. The mass value specified is applied to all translational degrees of freedom associated with the specified node. See Appendix A for an explanation of local degree of freedom numbering at a particular node. A sample concentrated nodal terms file is shown below:

74 M 1 254.0
81 K 3 1.0e6
92 F 2 2000.0

nodeNum termType localDOFNum value

Boundary Conditions File (.bc)

The boundary conditions file generated by VAWTGen specifies a fixed boundary condition at the tower base (node 1). This file specifies the number of boundary conditions, the node number, local degree of freedom, and specified displacement value for the boundary condition. This file attempts to provide a likely boundary condition for a VAWT structure, but may need to be modified by the analyst depending on the specific configuration of interest. See Appendix A for an explanation of local degree of freedom numbering at a particular node. The boundary condition file generated by VAWTGen is shown below:

6
1 1 0.000000
1 2 0.000000
1 3 0.000000
1 4 0.000000
1 5 0.000000
1 6 0.000000

nodeNum localDOFNum value

Platform Simulation File (.plat)

The platform simulation file specifies parameters required for an external platform dynamics simulation. An example, annotated platform file is shown below.

1 0 0 0 0 0 :active platform DOFs (surge, sway, heave, roll, pitch, yaw)

0.0 0.0 0.0 0.0 0.0 :initial conditions for platform DOFs

0 :drag damping flag (1 = on, 0 = off)

1 :mooring flag (1 = on, 0 = off)

0 :gravity flag (1 = on, 0 = off)

0 :plot flag (1 = on, 0 = off)

0 :radiation damping flag (1 = on, 0 = off)

1 :node number for platform turbine connection

1 :platform turbine yaw interaction (0 = free spinning tower, 1 = fixed tower, 2 = generator reaction torque applied to platform)

3500 :platform server port

4500 :platform client port

The first line activates platform degrees of freedom (DOFs) the ordering of degrees of freedom is surge, sway, have, roll, pitch, and yaw. The second line specifies initial conditions for the platform degrees of freedom, the DOF ordering is the same as the previous line. Lines 5-7 activate/deactivate various aspects of the hydrodynamic/platform dynamics simulation (drag, mooring, gravity, plotting, and radiation damping). Line 8 specifies the node number at the connection of the turbine to the platform. This is used in calculating the reaction force the turbine imparts on the platform. Line 9 is a flag to specify the platform turbine yaw interaction. For a flag of 0 there is no interaction, for a flag of 1 the tower is considered fully constrained to the platform, for a flag of 2, the generator reaction torque is applied to the turbine. The last two lines specify the server port and client port numbers for the network socket interface between the OWENS analysis tool and the platform dynamics module.

Initial Conditions File

The initial conditions file is used for transient analysis to specify an initial displacement of the structure at t =0. This file requires a node number, local degree of freedom number, and displacement value. See Appendix A for an explanation of local degree of freedom numbering at a particular node. The file format is described below:

60 1 0.1
51 2 -0.4
nodeNum localDOFNum value

Blade Data File (.bld)

A blade data file is generated by VAWTGen to aid in mapping aerodynamic loads to the structural mesh generated by VAWTGen. This information includes the blade number, node locations of blade sections in terms of spanwise distance from the blade root, and node number and element numbers associated with these locations. The file also contains the quarter chord coordinate of the blade section, the normal and tangential vector components of the blade section, and the chord of the section. Coordinate and vector components are represented in the rotating, rotor-fixed hub frame. An integer number representing the airfoil as specified in the .ipt file for the blade component and section lift curve slope are also specified. The last column is a place holder not used in the release version of OWENS. The file format for the blade file is described below:

bladeNum nodeDistance nodeNum elementNum quarterChordCoord1 quarterChordCoord2 quarterChordCoord3 sectionNormalVec1 sectionNormalVec2 sectionNormalVec3 sectionTangentVec1 sectionTangentVec2 sectionTangentVec3 sectionChord sectionAirfoilNumber [place holder not used]

Aerodynamic Loads File

Drivetrain Properties File

The drive train properties file is read for cases where the drive train flag is set to true in the main OWENS analysis file. This file contains an effective torsional spring and damping constant for the drivetrain, along with a moment of inertia for the drive train. These values are cast on the low speed shaft (LSS) side of the drivetrain. The file also contains gear ratio and gear box efficiency parameters. A sample drivetrain file is shown below:

1.0e8 1e6 1000.0 :drivetrain spring constant, damping constant, MOI
1.0 1.0 :gear ratio, gear box efficiency

Generator Properties File

The generator properties file is read where the turbine operation mode requires generator interaction. This file includes the generator rated torque, zero torque generator speed, pull out ratio, and rated slip percentage. A sample generator properties file is shown below:

2.09e4 :generator rated torque
1.0 :zero torque generator speed (in Hz)
2.0 :pull out ratio
5.0 :generator rated slip percentage

OWENS Output Files

This section describes the output files generated by the OWENS analysis software. Output is different for the static, modal, and transient analysis types.

Static Analysis Output

Output from this analysis is written to the root filename with "_static.mat" suffix, such as "vawt_static.mat". This MATLAB database contains a solution vector for each degree of freedom of the model. The deformed configuration may be visualized using VAWTGen visualization capabilities[1]. See Appendix A for an explanation of mapping between a global degree of freedom list to local degree of freedom numbering at a particular node.

For modal analysis the output file lists the frequency, damping ratio, and nodal values for mode shapes of the 0 degree (real) and 90 degree out of phase (imaginary) mode shapes. The generated file has the same root name as the .owens input file, but with a suffix of .out. The various mode shapes may be visualized using VAWTGen visualization capabilities[1]. The file format for the modal analysis output is shown below:

MODE # 1

Frequency: 9.941364e-001:

Damping 3.576857e-014:

0 deg Mode Shape:

Ux Uy Uz thetax thetay thetaz

-0.000000 -0.000000 -0.000000 -0.000000 0.000833 -0.000000

0.000627 0.000000 0.000000 -0.000000 0.000819 0.000000

0.001235 0.000000 0.000000 -0.000000 0.000780 0.000000

0.001819 0.000000 0.000000 -0.000000 0.000713 0.000000

0.002353 0.000000 0.000000 -0.000000 0.000620 0.000000

0.002669 0.000000 0.000000 -0.000000 0.000557 0.000000

0.002948 0.000000 0.000000 -0.000000 0.000497 0.000000

0.003196 0.000000 0.000000 -0.000000 0.000437 0.000000
...
90 deg Mode Shape:

Ux Uy Uz thetax thetay thetaz

-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000

-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000

-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000

-0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000

-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000

-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000

-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000

-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000

-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000

...

Mode #2

...

Transient Analysis Output

Transient analysis output has a great deal of data associated with it due to having both spatial and temporal information and OWENS transient analysis output is saved in a MATLAB workspace as \<root\>.mat. Table 1 lists the following information saved in the transient analysis output file with the variable name and associated array size. The units specified in this file assume that the mesh and associated element properties are in SI units. See Appendix A for an explanation of mapping between a global degree of freedom list to local degree of freedom numbering at a particular node.

Transient analysis output may be visualized using VAWTGen visualization capabilities[1].

Table 1. OWENS Transient Output


Output Variable Name (units) Size –––––––––––- –––––––––––- –––––––––––- Time t (s) 1 x numTimeSteps

Nodal displacements uHist (m or rad) numDOF x numTimeSteps

Generator torque genTorque (N-m) 1 x numTimeSteps

Generator power genPower (W) 1 x numTimeSteps

Rotor position aziHist (rad) 1 x numTimeSteps

Rotor speed OmegaHist (Hz) 1 x numTimeSteps

Rotor acceleration OmegaDotHist (Hz/s) 1x numTimetSteps

Gearbox position gbHist (rad) 1 x numTimeSteps

Gearbox speed gbDotHist (Hz) 1 x numTimeSteps

Gearbox acceleration gbDotDotHist (Hz/s) 1 x numTimeSteps

Driveshaft torque torqueDriveShaft (N-m) 1 x numTimeSteps

Platform degrees of rigidDof (m or rad) 6 x numTimeSteps freedom

Turbine base reaction FReactionHist (N or 6 x numTimeSteps force N-m) –––––––––––––––––––––––––––––––––––-

: Default static nonlinear analysis parameters

References

  1. VAWTGen Manual

  2. WavEC manual

  3. Jonkman, J.M., and Buhl, M. L., 2005, FAST User's Guide, National Renewable Energy Laboratory, NREL/EL-500-38230.

Appendix A: Mapping from local nodal DOF numbering to global DOF numbering

Structural nodes in the finite element formulation of the OWENS toolkit each have 6 degrees of freedom. That is 3 translational and 3 rotational. The finite element mesh is represented in a Cartesian frame with "x", "y", and "z" axes. The z axis is typically located along the tower axis of the turbine. Local degree of freedom numberings 1, 2, and 3 correspond to displacements along the x, y, and z axes respectively. Local degree of freedom numberings 4, 5, and 6 correspond to rotations of 4, 5, and 6 about the x, y, and z axes respectively.

For a particular node number "nodeNum" and an associated local degree of freedom "localDOFNum" the following relation exists to the global degree of freedom number "globalDOFNum".

globalDOFNum = (nodeNum-1)*6 + localDOFNum

Appendix B: Nonlinear Static Analysis Parameters

If desired, the user may modify the default parameters for nonlinear static analysis. This is done by creating a file with the same prefix as the main (.owens) analysis file, but with the suffix ".nl". For example, if the main file for an analysis is "vawt.owens", the nonlinear parameter file should be named "vawt.nl". If no ".nl" file exists in the job directory default nonlinear static parameters will be used.

The nonlinear parameter file has the following format for adaptive load stepping in nonlinear iteration:

NR :iteration type, NR = Newton Raphson, DI = Direct Iteration

1.0e-6 :tolerance for nonlinear iteration convergence

5 :maximum number of iterations per load step

0 :integer denoting load steps (0 for adaptive), otherwise, number of load steps followed by values

20 :maximum number of load steps

0.3 :minimum load step

0.1 :minimum delta load step

The adaptive load stepping algorithm attempts to reach a converged solution by adjusting load steps as necessary within the specified or default nonlinear analysis parameters.

If desired, the user may specify a prescribed loadstepping profile for nonlinear iteration with the following file format:

NR :iteration type, NR = Newton Raphson, DI = Direct Iteration

1.0e-6 :tolerance for nonlinear iteration convergence

20 :maximum number of iterations per load step

5 0.2 0.4 0.6 0.8 1.0 :integer denoting load steps (0 for adaptive), otherwise, number of load steps followed by values

The prescribed load stepping algorithm attempts to reach a converged solution within the maximum number of iterations per load step and terminates analysis if unsuccessful.

By default, the nonlinear iteration parameters are those listed in Table


  1. Parameter Value –––––––––––––––––- –––––––––––––––––- Nonlinear Iteration Tolerance 1.0e-6

    Iteration Type Newton Raphson

    Loads Stepping Algorithm Adaptive

    Max Iterations Per Load Step 50

    Max Number of Load Steps 20

    Minimum Load Step 0.05

    Minimum Load Step Delta 0.05

diff --git a/dev/reference/reference/index.html b/dev/reference/reference/index.html index a0bce7a..008f92b 100644 --- a/dev/reference/reference/index.html +++ b/dev/reference/reference/index.html @@ -1,5 +1,5 @@ -OWENS · OWENS.jl

OWENS

Index

Types and functions

OWENS.BinType

Inputs pointing to the file paths of compiled binaries of external libraries

OWENS.BladeType

Internal, struct containing the CACTUS geometry file data for a blade

OWENS.BladeDataType

Internal, struct containing blade specific data and location within the mesh

OWENS.CactusGeomType

Internal, struct containing the CACTUS geometry file data

OWENS.InputsMethod

Inputs(;analysisType = "TNB", turbineStartup = 0, usingRotorSpeedFunction = false, tocp = [0.0,1.1], tocpVinf = [0.0,1.1], numTS = 50.0, deltat = 2e-3, Omegaocp = [7.2,7.2] ./ 60, Vinfocp = [12.0,12.0], aeroLoadsOn = 1, AD15On = false, driveTrainOn = false, generatorOn = false, hydroOn = false, topsideOn = true, interpOrder = 2, hdinputfile = "none", mdinputfile = "none", JgearBox = 0.0, gearRatio = 1.0, gearBoxEfficiency = 1.0, useGeneratorFunction = false, generatorProps = 0.0, ratedTorque = 0.0, zeroTorqueGenSpeed = 0.0, pulloutRatio = 0.0, ratedGenSlipPerc = 0.0, OmegaGenStart = 0.0, omegaControl = false, OmegaInit = 7.2/60, #TODO: simplify this in the code since it is redundant rigid = false, #turn off structural dynamics aeroloadfile = "modulepath/../test/data/inputfilestest/DVAWT2BLCDTElementData.csv", owensfile = "modulepath/../test/data/inputfilestest/15mTowertransientdvawtc2_lcdt.owens", outFilename = "none", numDofPerNode = 6, bladeData = [], driveShaftProps = DriveShaftProps(0.0,0.0) TOl = 1e-4, MAXITER = 300, iterwarnings = true, )

Model inputs for OWENS coupled analysis, struct

Inputs

  • analysisType::string: Newmark Beta time stepping "TNB", Dean time stepping "TD", modal "M"
  • turbineStartup::int: 1 forced start-up using generator as motor, 2 self-starting mode, 0 specified rotor speed mode")
  • usingRotorSpeedFunction::bool: use user specified rotor speed profile function
  • tocp::Array{<:float}: = time points for rotor speed profile (s)
  • tocp_Vinf::Array{<:float}: = time points for specified Vinf profile (s)
  • numTS::int: total number of timesteps to run
  • delta_t::float: timestep interval (s)
  • Omegaocp::Array{<:float}: = rotor speed points for rotor speed profile (Hz)
  • Vinfocp::Array{<:float}: = rotor speed points for specified Vinf profile (Hz)
  • aeroLoadsOn::bool: #0 off, 1 one way, 1.5 one way with deformation from last timestep, 2 two way
  • AD15On::bool: flag to use AD15 for aero
  • driveTrainOn::bool: flag to include drivetrain effects
  • generatorOn::bool: flag to include generator effects
  • hydroOn::bool: flag to include platform coupling
  • interpOrder::int: order used for extrapolating inputs and states, 0 flat, 1 linear, 2 quadratic
  • hd_input_file::string: file path to the HydroDyn .dat input file
  • ss_input_file::string: file path to the HydroDyn sea states input file
  • md_input_file::string: file path to the MoorDyn .dat input file
  • JgearBox::float: gearbox intertia, standard SI units
  • gearRatio::float: gearbox gear ratio
  • gearBoxEfficiency::float: gearbox efficiency (typically 0-1)
  • useGeneratorFunction::bool: = flag to use user specified generator profile
  • generatorProps::float: not used, should clean up
  • ratedTorque::float: Generator rated max torque
  • zeroTorqueGenSpeed::float: rated generator speed (minus slippage)
  • pulloutRatio::float: Fraction of the min/max torque that the generator engages/disengages
  • ratedGenSlipPerc::float: extra speed from slipping?
  • OmegaGenStart::float: speed (Hz) at which generator would kick in
  • omegaControl::bool: false for fixed speed, true for dynamic
  • OmegaInit::float: initial rotor speed (Hz)
  • aeroloadfile::string: string of the name and path for the cactus aeroloads if using the old serial owens call
  • owensfile::string: string of the name and path for the owens input file if using the old serial owens call
  • potflowfile::string: string of the prefix and path for the directory containing the potential flow files from WAMIT (required by HydroDyn)
  • outFilename::string: path and name of output file, will be overwritten if already exists
  • numDofPerNode::int: number of degrees of freedom per node
  • bladeData::BladeData: see ?BladeData, only used if calling the old serial owens function
  • driveShaftProps::DriveShaftProps: see ?DriveShaftProps
  • TOl::float: gauss-seidel iteration tolerance
  • MAXITER::int: gauss-seidel maximum iterations
  • iterwarnings::bool: iteration warnings flag

Outputs:

  • OWENS.Inputs:
OWENS.NuMadType

NuMad(nweb,nstack,nsegments,span,airfoil,tetype,twistd,chord,xoffset,aerocenter,stackmattypes,stacklayers,segments,DPtypes,skin,webstack,webdp)

Parameters defining the blade composite layup. See NuMad user guide SAND2012_7028 appendix B for more details

Arguments

  • n_web::Int64: number of shear webs
  • n_stack::Int64: number of predefined composite stacks
  • n_segments::Int64: number of segments around the airfoil
  • span::Vector{Float64}: span-wise position
  • airfoil::Vector{String}: airfoil name
  • te_type::Vector{String}: trailing edge type
  • twist_d::Vector{Float64}: twist_d in degrees
  • chord::Vector{Float64}: chord length
  • xoffset::Vector{Float64}: The distance from the “nose” of a station to the blade reference axis.
  • aerocenter::Vector{Float64}: This is an aerodynamic parameter that is an output from aerodynamic performance analysis of a two-dimensional airfoil section. The aerodynamic center is the point along the chord where the aerodynamic pitching moment does not vary with changes in angle of attack.
  • stack_mat_types::Vector{Int64}: Material numbers used that correspond to each stack number
  • stack_layers::Array{Int64,2}: number of layers at each span used corresponding to each material type (first index corresponds to spanwise position, second index corresponds to the stack number)
  • segments::Array{Float64,2}: normalized starting and stopping points of each section (i.e. leading edge, sparcap, etc). First index corresponds to spanwise position, second index corresponds to the section, except there is an extra first column starting at -1 for the trailing edge. There must be a leading edge position at 0, and the last column must be 1 corresponding to the trailing edge again. Positions are fractions of the chord, lower (HP) is negative, upper (LP) is positive
  • DPtypes::Array{Int64,2}: division point types (NOTE THAT THIS ISN'T IMPLEMENTED AND DOES NOTHING CURRENTLY, i.e. only SINGLE is being used). First index corresponds to spanwise position, second corresponds to section number
  • skin_seq::Array{Seq,2}: stack sequence, is an array of structures, each containing a Vector{Int64} of the sequence (i.e. skin[2,5].seq). First index corresponds to spanwise positoin, second index the section
  • web_seq::Array{Seq,2}: same format and meaning as skin sequence, but for the webs with the second index corresponding to the web number
  • web_dp::Array{Seq,2}: same format as skin sequence, but this corresponds to the section numbers the web connects to at the top and bottom at both edges. There are always four entries in the CSV list and the order goes as follows: inboard LP, inboard HP, outboard HP, outboard LP.
OWENS.StrutType

Internal, struct containing the CACTUS geometry file data for a strut

OWENS.plypropertiesMethod

Struct containing

material names

Composites.Material structs for each material name - see ?Composites.Material

OWENS.OWENSVTKMethod
OWENSVTK(savename,t,uHist,system,assembly,sections,aziHist,mymesh,myel,epsilon_x_hist,epsilon_y_hist,epsilon_z_hist,kappa_x_hist,kappa_y_hist,kappa_z_hist,FReactionHist)

Formats and outputs OWENS data into VTK format

#Intput

#Output

  • none:
OWENS.UnsteadyMethod

Unsteady(model,topModel,mesh,el,aero;getLinearizedMatrices=false)

Executable function for transient analysis. Provides the interface of various external module with transient structural dynamics analysis capability.

# Input
+OWENS · OWENS.jl

OWENS

Index

Types and functions

OWENS.BinType

Inputs pointing to the file paths of compiled binaries of external libraries

OWENS.BladeType

Internal, struct containing the CACTUS geometry file data for a blade

OWENS.BladeDataType

Internal, struct containing blade specific data and location within the mesh

OWENS.CactusGeomType

Internal, struct containing the CACTUS geometry file data

OWENS.InputsMethod

Inputs(;analysisType = "TNB", turbineStartup = 0, usingRotorSpeedFunction = false, tocp = [0.0,1.1], tocpVinf = [0.0,1.1], numTS = 50.0, deltat = 2e-3, Omegaocp = [7.2,7.2] ./ 60, Vinfocp = [12.0,12.0], aeroLoadsOn = 1, AD15On = false, driveTrainOn = false, generatorOn = false, hydroOn = false, topsideOn = true, interpOrder = 2, hdinputfile = "none", mdinputfile = "none", JgearBox = 0.0, gearRatio = 1.0, gearBoxEfficiency = 1.0, useGeneratorFunction = false, generatorProps = 0.0, ratedTorque = 0.0, zeroTorqueGenSpeed = 0.0, pulloutRatio = 0.0, ratedGenSlipPerc = 0.0, OmegaGenStart = 0.0, omegaControl = false, OmegaInit = 7.2/60, #TODO: simplify this in the code since it is redundant rigid = false, #turn off structural dynamics aeroloadfile = "modulepath/../test/data/inputfilestest/DVAWT2BLCDTElementData.csv", owensfile = "modulepath/../test/data/inputfilestest/15mTowertransientdvawtc2_lcdt.owens", outFilename = "none", numDofPerNode = 6, bladeData = [], driveShaftProps = DriveShaftProps(0.0,0.0) TOl = 1e-4, MAXITER = 300, iterwarnings = true, )

Model inputs for OWENS coupled analysis, struct

Inputs

  • analysisType::string: Newmark Beta time stepping "TNB", Dean time stepping "TD", modal "M"
  • turbineStartup::int: 1 forced start-up using generator as motor, 2 self-starting mode, 0 specified rotor speed mode")
  • usingRotorSpeedFunction::bool: use user specified rotor speed profile function
  • tocp::Array{<:float}: = time points for rotor speed profile (s)
  • tocp_Vinf::Array{<:float}: = time points for specified Vinf profile (s)
  • numTS::int: total number of timesteps to run
  • delta_t::float: timestep interval (s)
  • Omegaocp::Array{<:float}: = rotor speed points for rotor speed profile (Hz)
  • Vinfocp::Array{<:float}: = rotor speed points for specified Vinf profile (Hz)
  • aeroLoadsOn::bool: #0 off, 1 one way, 1.5 one way with deformation from last timestep, 2 two way
  • AD15On::bool: flag to use AD15 for aero
  • driveTrainOn::bool: flag to include drivetrain effects
  • generatorOn::bool: flag to include generator effects
  • hydroOn::bool: flag to include platform coupling
  • interpOrder::int: order used for extrapolating inputs and states, 0 flat, 1 linear, 2 quadratic
  • hd_input_file::string: file path to the HydroDyn .dat input file
  • ss_input_file::string: file path to the HydroDyn sea states input file
  • md_input_file::string: file path to the MoorDyn .dat input file
  • JgearBox::float: gearbox intertia, standard SI units
  • gearRatio::float: gearbox gear ratio
  • gearBoxEfficiency::float: gearbox efficiency (typically 0-1)
  • useGeneratorFunction::bool: = flag to use user specified generator profile
  • generatorProps::float: not used, should clean up
  • ratedTorque::float: Generator rated max torque
  • zeroTorqueGenSpeed::float: rated generator speed (minus slippage)
  • pulloutRatio::float: Fraction of the min/max torque that the generator engages/disengages
  • ratedGenSlipPerc::float: extra speed from slipping?
  • OmegaGenStart::float: speed (Hz) at which generator would kick in
  • omegaControl::bool: false for fixed speed, true for dynamic
  • OmegaInit::float: initial rotor speed (Hz)
  • aeroloadfile::string: string of the name and path for the cactus aeroloads if using the old serial owens call
  • owensfile::string: string of the name and path for the owens input file if using the old serial owens call
  • potflowfile::string: string of the prefix and path for the directory containing the potential flow files from WAMIT (required by HydroDyn)
  • outFilename::string: path and name of output file, will be overwritten if already exists
  • numDofPerNode::int: number of degrees of freedom per node
  • bladeData::BladeData: see ?BladeData, only used if calling the old serial owens function
  • driveShaftProps::DriveShaftProps: see ?DriveShaftProps
  • TOl::float: gauss-seidel iteration tolerance
  • MAXITER::int: gauss-seidel maximum iterations
  • iterwarnings::bool: iteration warnings flag

Outputs:

  • OWENS.Inputs:
OWENS.NuMadType

NuMad(nweb,nstack,nsegments,span,airfoil,tetype,twistd,chord,xoffset,aerocenter,stackmattypes,stacklayers,segments,DPtypes,skin,webstack,webdp)

Parameters defining the blade composite layup. See NuMad user guide SAND2012_7028 appendix B for more details

Arguments

  • n_web::Int64: number of shear webs
  • n_stack::Int64: number of predefined composite stacks
  • n_segments::Int64: number of segments around the airfoil
  • span::Vector{Float64}: span-wise position
  • airfoil::Vector{String}: airfoil name
  • te_type::Vector{String}: trailing edge type
  • twist_d::Vector{Float64}: twist_d in degrees
  • chord::Vector{Float64}: chord length
  • xoffset::Vector{Float64}: The distance from the “nose” of a station to the blade reference axis.
  • aerocenter::Vector{Float64}: This is an aerodynamic parameter that is an output from aerodynamic performance analysis of a two-dimensional airfoil section. The aerodynamic center is the point along the chord where the aerodynamic pitching moment does not vary with changes in angle of attack.
  • stack_mat_types::Vector{Int64}: Material numbers used that correspond to each stack number
  • stack_layers::Array{Int64,2}: number of layers at each span used corresponding to each material type (first index corresponds to spanwise position, second index corresponds to the stack number)
  • segments::Array{Float64,2}: normalized starting and stopping points of each section (i.e. leading edge, sparcap, etc). First index corresponds to spanwise position, second index corresponds to the section, except there is an extra first column starting at -1 for the trailing edge. There must be a leading edge position at 0, and the last column must be 1 corresponding to the trailing edge again. Positions are fractions of the chord, lower (HP) is negative, upper (LP) is positive
  • DPtypes::Array{Int64,2}: division point types (NOTE THAT THIS ISN'T IMPLEMENTED AND DOES NOTHING CURRENTLY, i.e. only SINGLE is being used). First index corresponds to spanwise position, second corresponds to section number
  • skin_seq::Array{Seq,2}: stack sequence, is an array of structures, each containing a Vector{Int64} of the sequence (i.e. skin[2,5].seq). First index corresponds to spanwise positoin, second index the section
  • web_seq::Array{Seq,2}: same format and meaning as skin sequence, but for the webs with the second index corresponding to the web number
  • web_dp::Array{Seq,2}: same format as skin sequence, but this corresponds to the section numbers the web connects to at the top and bottom at both edges. There are always four entries in the CSV list and the order goes as follows: inboard LP, inboard HP, outboard HP, outboard LP.
OWENS.StrutType

Internal, struct containing the CACTUS geometry file data for a strut

OWENS.plypropertiesMethod

Struct containing

material names

Composites.Material structs for each material name - see ?Composites.Material

OWENS.OWENSVTKMethod
OWENSVTK(savename,t,uHist,system,assembly,sections,aziHist,mymesh,myel,epsilon_x_hist,epsilon_y_hist,epsilon_z_hist,kappa_x_hist,kappa_y_hist,kappa_z_hist,FReactionHist)

Formats and outputs OWENS data into VTK format

#Intput

#Output

  • none:
OWENS.UnsteadyMethod

Unsteady(model,topModel,mesh,el,aero;getLinearizedMatrices=false)

Executable function for transient analysis. Provides the interface of various external module with transient structural dynamics analysis capability.

# Input
 * `inputs::Inputs`: see ?Inputs
 * `topModel::FEAModel`: see ?OWENSFEA.FEAModel
 * `mesh::Mesh`: see ?OWENSFEA.Mesh
@@ -141,4 +141,4 @@
 * `regenWindFiles`: =false
 
 # Output
-* `nothing`:
OWENS.simpleGeneratorMethod
simpleGenerator(generatorProps,genSpeed)

Caclulates generator torque for simple induction generator

#Input

  • generatorProps object containing generator properties, see ?model
  • genSpeed::float generator speed (Hz)

#Output

  • genTorque::float generator torque
OWENS.sort_peaksFunction

This function sorts out points where the slope changes sign

OWENS.sum_cyclesMethod

Sums the cycle count given intervals of rangeintervals and meanintervals. The rangeintervals and meanintervals are given in fraction of range size

OWENS.timeIntegrateSubSystemMethod
timeIntegrateSubSystem(M,K,C,F,delta_t,u,udot,uddot)

Internal, performs integration of a system using the Newmark-Beta method (constant-average acceleration sceheme).

#Input

  • M: system mass matrix
  • K: system sttiffness matrix
  • C: system damping matrix
  • F: system force vector
  • delta_t: time step
  • u: displacement at beginning of time step
  • udot: velocity at beginning of time step
  • uddot: acceleration at beginning of time step

#Output

  • unp1: displacement at end of time step
  • udotnp1: velocity at end of time step
  • uddotnp1: acceleration at end of time step
OWENS.transMatMethod
transMat(theta1, theta2, theta3)

Internal, computes the 3x3 transformation matrix for given input rotations. The generated matrix is the closest orthonormal matrix to the Bernoulli-Euler transformation matrix from beam theory, which assumes small rotations. A full description of this matrix is found in the "FASTCoordinateSystems.doc" document by Jason Jonkman.

OWENS.updateRotorRotationMethod

updateRotorRotation updates rotor rotation

updateRotorRotation(Irotor,Crotor,Krotor,shaftTorque,genTorque,azi_s,Omega_s,OmegaDot_s,delta_t)

Internal, updates the rotor rotation given rotor properties and external torques

#Input

  • Irotor: rotor inertia
  • Crotor: arbitrary rotor damping
  • Krotor: arbitrary rotor stiffness
  • shaftTorque: torque from external forces on rotor
  • genTorque: torque from generator
  • azi_s: rotor azimuth (rad) at beginning of time step
  • Omega_s: rotor speed (Hz) at beginning of time step
  • OmegaDot_s: rotor acceleration (Hz/s) at beginning of time step
  • delta_t: time step

#Output

  • azi_sp1: rotor azimuth (rad) at end of time step
  • Omega_sp1: rotor speed (Hz/s) at end of time step
  • OmegaDot_sp1: rotor acceleration (Hz/s) at end of time step
OWENS.vizMethod
viz(;mesh=[],meshFile="none",resultsFile="none",selectedMode=10,sf=10)

Plots the mode shapes of a mode from a modal analysis performed using the OWENS toolkit. Either send the mesh struct or the mesh filename but not both

#Input

  • mesh::OWENSFEA.Mesh: Mesh struct, See ?OWENSFEA.Mesh
  • meshFile::String: optional string containing mesh file name
  • resultsFile::String: optional string containing results file name
  • selectedMode::Int: integer denoting selected mode to plot
  • sf::Float: scale factor for mode shape displacements

#Output None

OWENS.writeOwensNDLMethod
writeOwensNDL(fileRoot, nodes, cmkType, cmkValues)

writes a nodal input file

#Intput

  • fileRoot::string: string path to desired location with name but no extension
  • nodes::int: node numbers for C/M/K
  • cmkType::string: "C" "M" or "K"
  • cmkValues::float: C/M/K value

#Output

  • none:
+* `nothing`:
OWENS.simpleGeneratorMethod
simpleGenerator(generatorProps,genSpeed)

Caclulates generator torque for simple induction generator

#Input

  • generatorProps object containing generator properties, see ?model
  • genSpeed::float generator speed (Hz)

#Output

  • genTorque::float generator torque
OWENS.sort_peaksFunction

This function sorts out points where the slope changes sign

OWENS.sum_cyclesMethod

Sums the cycle count given intervals of rangeintervals and meanintervals. The rangeintervals and meanintervals are given in fraction of range size

OWENS.timeIntegrateSubSystemMethod
timeIntegrateSubSystem(M,K,C,F,delta_t,u,udot,uddot)

Internal, performs integration of a system using the Newmark-Beta method (constant-average acceleration sceheme).

#Input

  • M: system mass matrix
  • K: system sttiffness matrix
  • C: system damping matrix
  • F: system force vector
  • delta_t: time step
  • u: displacement at beginning of time step
  • udot: velocity at beginning of time step
  • uddot: acceleration at beginning of time step

#Output

  • unp1: displacement at end of time step
  • udotnp1: velocity at end of time step
  • uddotnp1: acceleration at end of time step
OWENS.transMatMethod
transMat(theta1, theta2, theta3)

Internal, computes the 3x3 transformation matrix for given input rotations. The generated matrix is the closest orthonormal matrix to the Bernoulli-Euler transformation matrix from beam theory, which assumes small rotations. A full description of this matrix is found in the "FASTCoordinateSystems.doc" document by Jason Jonkman.

OWENS.updateRotorRotationMethod

updateRotorRotation updates rotor rotation

updateRotorRotation(Irotor,Crotor,Krotor,shaftTorque,genTorque,azi_s,Omega_s,OmegaDot_s,delta_t)

Internal, updates the rotor rotation given rotor properties and external torques

#Input

  • Irotor: rotor inertia
  • Crotor: arbitrary rotor damping
  • Krotor: arbitrary rotor stiffness
  • shaftTorque: torque from external forces on rotor
  • genTorque: torque from generator
  • azi_s: rotor azimuth (rad) at beginning of time step
  • Omega_s: rotor speed (Hz) at beginning of time step
  • OmegaDot_s: rotor acceleration (Hz/s) at beginning of time step
  • delta_t: time step

#Output

  • azi_sp1: rotor azimuth (rad) at end of time step
  • Omega_sp1: rotor speed (Hz/s) at end of time step
  • OmegaDot_sp1: rotor acceleration (Hz/s) at end of time step
OWENS.vizMethod
viz(;mesh=[],meshFile="none",resultsFile="none",selectedMode=10,sf=10)

Plots the mode shapes of a mode from a modal analysis performed using the OWENS toolkit. Either send the mesh struct or the mesh filename but not both

#Input

  • mesh::OWENSFEA.Mesh: Mesh struct, See ?OWENSFEA.Mesh
  • meshFile::String: optional string containing mesh file name
  • resultsFile::String: optional string containing results file name
  • selectedMode::Int: integer denoting selected mode to plot
  • sf::Float: scale factor for mode shape displacements

#Output None

OWENS.writeOwensNDLMethod
writeOwensNDL(fileRoot, nodes, cmkType, cmkValues)

writes a nodal input file

#Intput

  • fileRoot::string: string path to desired location with name but no extension
  • nodes::int: node numbers for C/M/K
  • cmkType::string: "C" "M" or "K"
  • cmkValues::float: C/M/K value

#Output

  • none:
diff --git a/dev/reference/referenceAero/index.html b/dev/reference/referenceAero/index.html index 43cd3f5..15a1a72 100644 --- a/dev/reference/referenceAero/index.html +++ b/dev/reference/referenceAero/index.html @@ -1,4 +1,4 @@ OWENSAero · OWENS.jl

OWENSAero

Types and functions

OWENSAero.EnvironmentType

Environment(rho::TF,mu::TF,Vx::TAF #Vinf is Vx,Vy::TAF,Vz::TAF,Vtwist::TAF,windangle::TF #radians,DSModel::TS,AModel::TS,awwarm::TVF,steplast::TAI,idxRPI::TAI,Vwakeold::TVF2,BVDynamicFlagL::TAI,BVDynamicFlagD::TAI,alphalast::TAF2,suction::TB) Environment(rho,mu,Vx,Vy,Vz,Vtwist,windangle,DSModel,AModel,awwarm) = Environment(rho,mu,Vx,Vy,Vz,Vtwist,windangle,DSModel,AModel,awwarm,zeros(Int,1),zeros(Int,length(Vx)),deepcopy(Vx),zeros(Int,1),zeros(Int,1),zeros(Real,1),false) Environment(rho,mu,Vx,DSModel,AModel,awwarm) = Environment(rho,mu,Vx,zeros(Real,size(Vx)),zeros(Real,size(Vx)),zeros(Real,size(Vx)),0.0,DSModel,AModel,awwarm,zeros(Int,1),zeros(Int,length(Vx)),deepcopy(Vx),zeros(Int,1),zeros(Int,1),zeros(Real,1),false)

Contains specications for turbine slice environment/operating conditions as well as some backend memory for dynamic stall and unsteady calculations

Inputs

  • rho::TF: Working fluid density (kg/m^3)
  • mu::TF: Working fluid viscosity (standard SI units)
  • V_x::TAF Vinf is Vx for simple simulations (m/s), array corresponding to each azimuthal position
  • V_y::TAF: y input velocity (m/s), array corresponding to each azimuthal position
  • V_z::TAF: z input velocity (m/s), array corresponding to each azimuthal position
  • V_twist::TAF: rotational velocity from active twist (rad/s), array corresponding to each azimuthal position
  • windangle::TF: angle of mean oncoming wind (rad)
  • DSModel::TS: dynamic stall model ("BV" or "none" or "LB" - once it is finished)
  • AModel::TS: aero model used ("DMS" or "AC")
  • aw_warm::TVF: warm start induction factor array, first half corresponding to u, second half to v
  • steplast::TAI: prior simulation step index, used for unsteady wake propogation
  • idx_RPI::TAI: used to specify the azimuthal indices needed for a partial solve (i.e. not every azimuthal index), such as is used in the RPI method
  • V_wake_old::TVF2: Prior step's mean wake velocity (m/s)
  • BV_DynamicFlagL::TAI: Boeing-vertol dynamic stall lift flag
  • BV_DynamicFlagD::TAI: Boeing-vertol dynamic stall drag flag
  • alpha_last::TAF2: Boeing-vertol dynamic stall prior step's angle of attack
  • suction::TB: DMS flag for alternate induction model

Outputs:

  • none:
OWENSAero.TurbineType
Turbine(R::TF,r::TAF,z::TF,chord::TAF3,twist::TAF5,delta::TAF,omega::TAF4,B::TI,af::TFN,ntheta::TI,r_delta_influence::TB,centerX::TAF2,centerY::TAF2)
 Turbine(R,r,z,chord,twist,delta,omega,B,af,ntheta,r_delta_infl) = Turbine(R,r,z,chord,twist,delta,omega,B,af,ntheta,r_delta_infl,zeros(Real,size(R)),zeros(Real,size(R)))
-Turbine(R,r,chord,twist,delta,omega,B,af,ntheta,r_delta_infl) = Turbine(R,r,1.0,chord,twist,delta,omega,B,af,ntheta,r_delta_infl,zeros(Real,size(R)),zeros(Real,size(R)))

Contains specications for turbine slice (geometry, location, airfoil)

Inputs

  • R::TF: Nominal turbine radius (m)
  • r::TAF: Array of local radaii corresponding to each azimuthal position for the slice, allows for active blade deformation (m)
  • z::TF: Vertical location of slice (only used when calling inflow-wind turbulent input)(m)
  • chord::TAF3: Array of chord corresponding to each azimuthal position, allows for active blade deformation (m)
  • twist::TAF5: Array of blade twist corresponding to each azimuthal position, allows for active blade deformation (rad)
  • delta::TAF: Array of blade slope corresponding to each azimuthal position, allows for active blade deformation (rad)
  • omega::TAF4: Array of rotational rate corresponding to each azimuthal position, allows for active blade deformation (rad/s)
  • B::TI: Number of blades
  • af::TFN: Airfoil function - see tests for example of how to create
  • ntheta::TI: Number of azimuthal discretizations
  • r_delta_influence::TB: Specification of whether local radius and blade slope are used in the influence coefficients for the actuator cylinder method
  • centerX::TAF2: Turbine center x location (only used if multiple turbines are modeled)
  • centerY::TAF2: Turbine center y location (only used if multiple turbines are modeled)

Outputs:

  • none:
OWENSAero.UnsteadyParamsType

UnsteadyParams(RPI::TB,tau::TAF,ifw::TB,IECgust::TB,nominalVinf::TF,G_amp::TF,gustX0::TF,gustT::TF) UnsteadyParams(RPI,tau,ifw) = UnsteadyParams(RPI,tau,ifw,false,1.0,0.0,1.0,1.0)

Contains specications for turbine slice unsteady inputs

Inputs

  • RPI::TB: Flag to specify if RPI is being used
  • tau::TAF: Unsteady method wake propogation weighting [3.0,0.3]
  • ifw::TB: Flag to specify if inflow-wind is being used
  • IECgust::TB: Flag to specify if the simple sin-cos gust profile in the x-direction will be used
  • nominalVinf::TF: Nominal velocity used to calculate the IEC gust size (m/s)
  • G_amp::TF: IEC gust amplitude (m/s)
  • gustX0::TF: IEC gust normalized starting point (x-location divided by reference radius)
  • gustT::TF: IEC gust duration (s)

Outputs:

  • none:
OWENSAero.ACMethod

AC(turbines, env; w=zeros(Real,2turbines[1].ntheta), idx_RPI=1:2turbine.ntheta, solve=true, ifw=false)

see ?steady for detailed i/o description

Double multiple streamtube model

OWENSAero.Boeing_VertolMethod
Boeing_Vertol(af,alpha,adotnorm,umach,Re,aoaStallPos,aoaStallNeg,AOA0,tc,BV_DynamicFlagL,BV_DynamicFlagD; family_factor = 0.0)

Boeing-Vertol Dynamic Stall Model. All angles are in rad unless explicitely stated otherwise (e.g. alpha_d) Arguments

  • af::airfoil_data4D: airfoil function callable by: CL, CD, CM = af(aoa,Re,mach,family_factor)
  • alpha::Float64: Static Angle of Attack (at 0.75 chord)
  • adotnorm::Float64: Normalized Change in Angle of Attack adotc/(2U)
  • umach::Float64: Blade mach number
  • Re::Float64: Blade Reynolds number
  • aoaStallPos::Float64: Positive Stall Angle (onset)
  • aoaStallNeg::Float64: Negative Stall Angle (onset)
  • AOA0::Float64: Zero Lift AOA
  • tc::Float64: Thickness to chord ratio
  • BV_DynamicFlagL::Int: lagged dynamic stall state for lift
  • BV_DynamicFlagD::Int: lagged dynamic stall state for drag
  • family_factor::float64: factor indexing airfoil family, if used
OWENSAero.DMSMethod

DMS(turbine, env; w=0, idx_RPI=1:turbine.ntheta, solve=true)

see ?steady for detailed i/o description

Double multiple streamtube model

OWENSAero.Unsteady_StepMethod
Unsteady_Step(turbine,env,us_param,mystep)

calls inflow wind init

Inputs

  • turbine::Turbine: turbine input for slice see ?Turbine
  • env::Env: environment input for slice see ?Env
  • us_param::UnsteadyParams: unsteady inputs for slice see ?UnsteadyParams
  • mystep::int: continuous index cooresponding to the azimuthal discretation - i.e. for ntheta of 30 step 1 is the first step of rev 1, sep 31 is the first step of rev 2, etc. Keeps track of temporal locaion

Outputs:

  • CP: This slice's coefficient of performance at this step
  • Th: This slice's thrust coefficient at this step
  • Q: Torque (N0m) at this step
  • Rp: Radial force per height (N) at this step
  • Tp: Tangential force per height (N) at this step
  • Zp: Vertical force per height (N) at this step
  • Vloc: Local velocity array for each azimuthal position (includes induction) (m/s) at this step
  • CD: This slice's drag coefficient at this step
  • CT: This slice's thrust coefficient (should equal drag, but may no depending on usage or solver status) at this step
  • amean: Mean turbine induction in the streamwise direction at this step
  • astar: Solved induction factors for each azimuthal location. First half are streamwise (u), second are cross-steam (v) at this step
  • alpha: Local angle of attack array for each azimuthal position (includes induction) (rad) at this step
  • cl: Local lift coefficient used for each azimuthal position at this step
  • cd_af: Local drag coefficient used for each azimuthal position at this step
  • thetavec: Azimuthal location of each discretization (rad)
  • Re: Reynolds number for each azimuthal position at this step
OWENSAero.advanceTurbMethod
advanceTurb(tnew;ts=2*pi/(turbslices[1].omega[1]*turbslices[1].ntheta))

Runs a previously initialized aero model (see ?setupTurb) in the unsteady mode (can be repeateadly called, or called for a specific time, or repeatedly called for sections of time)

Inputs

  • tnew::float: new time (s); will run from last time specified from the last call, to the current time specified, or from t=ts if the first time called
  • ts::float: optional, desired timestep. Will run at finer timesteps than the azimuthal discretization without interfering with wake propogation. While possible, it is not recommended to run with timesteps larger than the azimuthal discretization (hence the optional nature and automatic calculation)

Outputs:

  • CP: Turbine coefficient of performance
  • Rp: Array(B,Nslices,nsteps) of radial force (N) where nsteps = max(1,round(Int,(tnew-timelast)/ts))
  • Tp: Array(B,Nslices,n_steps) of tangential force (N)
  • Zp: Array(B,Nslices,n_steps) of vertical force (N)
  • alpha: Array(B,Nslices,n_steps) of angle of attack (rad)
  • cl: Array(B,Nslices,n_steps) of airfoil cl used
  • cd_af: Array(B,Nslices,n_steps) of airfoil cd used
  • Vloc: Array(B,Nslices,n_steps) of airfoil local velocity used
  • Re: Array(B,Nslices,n_steps) of airfoil Reynolds number used
  • thetavec: Azimuthal discretization location (rad)
  • ntheta: number of azimuthal discretizations used
  • Fx_base: Array(ntheta)Turbine base Fx (N)
  • Fy_base: Array(ntheta)Turbine base Fy (N)
  • Fz_base: Array(ntheta)Turbine base Fz (N)
  • Mx_base: Array(ntheta)Turbine base Mx (N-m)
  • My_base: Array(ntheta)Turbine base My (N-m)
  • Mz_base: Array(ntheta)Turbine base Mz (N-m)
  • power: Array(ntheta)Turbine power (watts)
  • power2: Turbine average power for the revolution (watts)
  • torque: Array(ntheta)Turbine torque (N-m) (alternative calculation method from Mz-base)
OWENSAero.deformTurbMethod

deformTurb(azi;newOmega=-1,newVinf=-1,bldx=-1, bldz=-1, bld_twist=-1, steady=false)

Equivalent to an update states call, mutating the internal aerodynamic inputs within the unsteady model.

Inputs

  • azi: Current azimuth position of the turbine in radians (continuously growing with numbers of revolutions)
  • bld_x: Blade structural x shape, size(NBlade,any), any as it is splined against bld_z and the aero discretization
  • bld_z: Blade structural z shape, size(NBlade,any), any as it is splined against bld_x and the aero discretization
  • bld_twist: Blade structural twist, size(NBlade,any), any as it is splined against bld_z and the aero discretization. Note that in the calcs, this will be in addition to the aero twist offset already applied in initialization.
  • accel_flap_in: Blade structural acceleration in the flap direction, size(NBlade,any), any as it is splined against bld_z and the aero discretization
  • accel_edge_in: Blade structural acceleration in the edge direction, size(NBlade,any), any as it is splined against bld_z and the aero discretization
  • steady::bool: if steady is true, it just updates a single step. TODO: verify this is correct

Outputs:

  • none:
OWENSAero.matrixAssembleMethod

Internal, assembles the matrices of multiple turbine systems into a combined system centerX, centerY: array of x,y coordinates for centers of the VAWTs in the farm radii: corresponding array of their radii

OWENSAero.pIntMethod

Internal, integration for a periodic function where end points don't reach ends (uses trapezoidal method)

OWENSAero.radialforceMethod

Internal, calculates the radial force used in the residual function as well as the turbine performance when converged

OWENSAero.readaerodynMethod
readaerodyn(filename)

create airfoil lookup for a file with only one reynolds number

Inputs

  • filename::string: file path/name to airfoil file formatted like in the test folder

Outputs:

  • af::function: cl, cd = af(alpha,re,mach) with alpha in rad
OWENSAero.readaerodyn_BVMethod
readaerodyn_BV(filename)

create airfoil lookup function with boeing vertol dynamic stall model for a file with only one reynolds number

Inputs

  • filename::string: file path/name to airfoil file formatted like in the test folder

Outputs:

  • af::function: cl, cd = afBV(alpha,Re,M,env,Vtwist,c,dt,U;solvestep=false) with alpha in rad, OWENSAero.Env, V_twist in rad/s, c chord in m, dt in sec, U Vloc in m/s, solvestep true during solve loop
OWENSAero.readaerodyn_BV_NEWMethod
readaerodyn_BV_NEW(filename;DSModel="BV")

for a file with multiple reynolds numbers create airfoil lookup function with boeing vertol dynamic stall model and wrap interpolation

Inputs

  • filename::string: file path/name to airfoil file formatted like in the test folder
  • DSModel::string: "BV" or "none"

Outputs:

  • af::function: cl, cd = afBV(alpha,Re,M,env,Vtwist,c,dt,U;solvestep=false) with alpha in rad, OWENSAero.Env, V_twist in rad/s, c chord in m, dt in sec, U Vloc in m/s, solvestep true during solve loop
  • af::function: cl, cd = af(alpha,re,mach) with alpha in rad
OWENSAero.setupTurbMethod

setupTurb(bldx,bldz,B,chord,omega,Vinf; Height = maximum(bldz), Radius = maximum(bldx), eta = 0.25, twist = 0.0, #or array{Float,Nslices} rho = 1.225, mu = 1.7894e-5, RPI = true, tau = [0.3,3.0], ntheta = 30, Nslices = 30, #TODO: make this different from ntheta ifw = false, DSModel = "BV", AModel = "DMS", windangleD = 0.0, afname = "(path)/airfoils/NACA0015RE3E5.dat", #TODO: analytical airfoil as default turbsimfilename = "(path)/data/ifw/turbDLC1p313mps330mseed1.bts", ifwlibfile = joinpath(dirname(@FILE), "../bin/libifwcbinding"), AMflag = false, buoyflag = false, rotAccelflag = false, AMCoeffCa = 1.0)

Initializes aerodynamic models and sets up backend persistent memory to simplify intermittent calling within coupled solver loops

Inputs

  • bld_x: Blade x shape
  • bld_z: Blade z shape
  • B: Number of blades
  • chord: chord length (m)
  • omega: rotation rate in rad/s. size(1) or size(ntheta), pass in an array(Real,ntheta) when propogating automatic gradients
  • Vinf: Inflow velocity
  • Height: turbine total height (m) typically maximum(bldz) unless only the shape and not size of bldz is being used
  • Radius: turbine nominal radius (m) typically maximum(bldx) unless only shape and not size of bldx is used
  • eta: blade mount point ratio, i.e. 0.25 would be at the quarter chord
  • twist: 0.0, #or array{Float,Nslices}
  • rho: working fluid density (kg/m^3)
  • mu: working fluid dynamic viscosity (Pa*s)
  • RPI: RPI method flag
  • tau: Unsteady wake propogation time constants [0.3,3.0],
  • ntheta: Number of azimuthal discretizations
  • Nslices: Number of vertical slices of the turbine
  • ifw: flag for inflow wind
  • DSModel: Dynamic stall model "BV" or "none" or "LB" when we get it working
  • AModel: Aerodynamic model "DMS" or "AC"
  • windangle_D: Inflow wind angle (degrees)
  • afname: airfoil path and name e.g. "(path)/airfoils/NACA0015RE3E5.dat"
  • turbsim_filename: turbsim path and name e.g. "(path)/data/ifw/turbDLC1p313mps330mseed1.bts",
  • ifw_libfile: inflow wind dynamic library location e.g. joinpath(dirname(@FILE), "../../../openfast/build/modules/inflowwind/libifwcbinding"))
  • AM_flag::bool: flag to turn on added mass effects
  • buoy_flag::bool: flag to turn on buoyancy forces
  • rotAccel_flag::bool: flag to turn on the rotational acceleration portion of added mass for a crossflow turbine
  • AM_Coeff_Ca::float: added mass coefficient, typically 1.0

Outputs:

  • none:
OWENSAero.steadyMethod
steady(turbine::Turbine, env::Env; w=zeros(Real,2*turbine.ntheta), idx_RPI=1:2*turbine.ntheta,solve=true,ifw=false)

Calculates steady state aerodynamics for a single VAWT slice

Inputs

  • turbine::Turbine: Turbine struct, see ?Turbine for details
  • env::Env: Env struct, see ?Env for details
  • w::Array(<:Real): Optional, used if solve=false, induction factor array, first half corresponding to u, second half to v
  • idx_RPI::Array(<:Int): Optional, used to specify the azimuthal indices needed for a partial solve (i.e. not every azimuthal index), such as is used in the RPI method
  • solve::Bool: Optional, False is used when you want the model outputs for a given set of induction factors without resolving them.
  • ifw::Bool: Optional, used to tell the Vinf lookup to attempt to use the dynamic inflow wind library, requires preprocessing as is shown in the test cases.

Outputs:

  • CP: This slice's coefficient of performance
  • Th: This slice's thrust coefficient
  • Q: Torque (N0m)
  • Rp: Radial force per height (N)
  • Tp: Tangential force per height (N)
  • Zp: Vertical force per height (N)
  • Vloc: Local velocity array for each azimuthal position (includes induction) (m/s)
  • CD: This slice's drag coefficient
  • CT: This slice's thrust coefficient (should equal drag, but may no depending on usage or solver status)
  • amean: Mean turbine induction in the streamwise direction
  • astar: Solved induction factors for each azimuthal location. First half are streamwise (u), second are cross-steam (v)
  • alpha: Local angle of attack array for each azimuthal position (includes induction) (rad)
  • cl: Local lift coefficient used for each azimuthal position
  • cd_af: Local drag coefficient used for each azimuthal position
  • thetavec: Azimuthal location of each discretization (rad)
  • Re: Reynolds number for each azimuthal position
OWENSAero.steadyTurbMethod
steadyTurb(omega,Vinf)

Runs a previously initialized aero model (see ?setupTurb) in the steady state mode

Inputs

  • omega::float: turbine rotation rate (rad/s)
  • Vinf::float: turbine steady inflow velocity (m/s)

Outputs:

  • CP: Turbine coefficient of performance
  • Rp: Array(B,Nslices,ntheta) of radial force (N)
  • Tp: Array(B,Nslices,ntheta) of tangential force (N)
  • Zp: Array(B,Nslices,ntheta) of vertical force (N)
  • alpha: Array(B,Nslices,ntheta) of angle of attack (rad)
  • cl: Array(B,Nslices,ntheta) of airfoil cl used
  • cd_af: Array(B,Nslices,ntheta) of airfoil cd used
  • Vloc: Array(B,Nslices,ntheta) of airfoil local velocity used
  • Re: Array(B,Nslices,ntheta) of airfoil Reynolds number used
  • thetavec: Azimuthal discretization location (rad)
  • ntheta: number of azimuthal discretizations used
  • Fx_base: Array(ntheta)Turbine base Fx (N)
  • Fy_base: Array(ntheta)Turbine base Fy (N)
  • Fz_base: Array(ntheta)Turbine base Fz (N)
  • Mx_base: Array(ntheta)Turbine base Mx (N-m)
  • My_base: Array(ntheta)Turbine base My (N-m)
  • Mz_base: Array(ntheta)Turbine base Mz (N-m)
  • power: Array(ntheta)Turbine power (watts)
  • power2: Turbine average power for the revolution (watts)
  • torque: Array(ntheta)Turbine torque (N-m) (alternative calculation method from Mz-base)
OWENSAero.streamtubeMethod

INTERNAL streamtube(a,theta,turbine,env;output_all=false,Vxwake=nothing,solvestep=false)

Double multiple streamtube individual streamtube calculation

Output:

if outputall return Th, Q, Rp, Tp, Zp, Vloc, CD, CT, alpha, cl, cdaf, Re else return CD-CT # Residual, section 2.4 end

+Turbine(R,r,chord,twist,delta,omega,B,af,ntheta,r_delta_infl) = Turbine(R,r,1.0,chord,twist,delta,omega,B,af,ntheta,r_delta_infl,zeros(Real,size(R)),zeros(Real,size(R)))

Contains specications for turbine slice (geometry, location, airfoil)

Inputs

Outputs:

OWENSAero.UnsteadyParamsType

UnsteadyParams(RPI::TB,tau::TAF,ifw::TB,IECgust::TB,nominalVinf::TF,G_amp::TF,gustX0::TF,gustT::TF) UnsteadyParams(RPI,tau,ifw) = UnsteadyParams(RPI,tau,ifw,false,1.0,0.0,1.0,1.0)

Contains specications for turbine slice unsteady inputs

Inputs

  • RPI::TB: Flag to specify if RPI is being used
  • tau::TAF: Unsteady method wake propogation weighting [3.0,0.3]
  • ifw::TB: Flag to specify if inflow-wind is being used
  • IECgust::TB: Flag to specify if the simple sin-cos gust profile in the x-direction will be used
  • nominalVinf::TF: Nominal velocity used to calculate the IEC gust size (m/s)
  • G_amp::TF: IEC gust amplitude (m/s)
  • gustX0::TF: IEC gust normalized starting point (x-location divided by reference radius)
  • gustT::TF: IEC gust duration (s)

Outputs:

  • none:
OWENSAero.ACMethod

AC(turbines, env; w=zeros(Real,2turbines[1].ntheta), idx_RPI=1:2turbine.ntheta, solve=true, ifw=false)

see ?steady for detailed i/o description

Double multiple streamtube model

OWENSAero.AyIJMethod

integrand used for computing AIJ

OWENSAero.AyintegrandMethod

integrand used for computing Ay

OWENSAero.Boeing_VertolMethod
Boeing_Vertol(af,alpha,adotnorm,umach,Re,aoaStallPos,aoaStallNeg,AOA0,tc,BV_DynamicFlagL,BV_DynamicFlagD; family_factor = 0.0)

Boeing-Vertol Dynamic Stall Model. All angles are in rad unless explicitely stated otherwise (e.g. alpha_d) Arguments

  • af::airfoil_data4D: airfoil function callable by: CL, CD, CM = af(aoa,Re,mach,family_factor)
  • alpha::Float64: Static Angle of Attack (at 0.75 chord)
  • adotnorm::Float64: Normalized Change in Angle of Attack adotc/(2U)
  • umach::Float64: Blade mach number
  • Re::Float64: Blade Reynolds number
  • aoaStallPos::Float64: Positive Stall Angle (onset)
  • aoaStallNeg::Float64: Negative Stall Angle (onset)
  • AOA0::Float64: Zero Lift AOA
  • tc::Float64: Thickness to chord ratio
  • BV_DynamicFlagL::Int: lagged dynamic stall state for lift
  • BV_DynamicFlagD::Int: lagged dynamic stall state for drag
  • family_factor::float64: factor indexing airfoil family, if used
OWENSAero.DMSMethod

DMS(turbine, env; w=0, idx_RPI=1:turbine.ntheta, solve=true)

see ?steady for detailed i/o description

Double multiple streamtube model

OWENSAero.DxIIMethod

integrand used for computing DxII

OWENSAero.DxIJMethod

integrand used for computing DxIJ

OWENSAero.DxintegrandMethod

integrand used for computing Dx

OWENSAero.Unsteady_StepMethod
Unsteady_Step(turbine,env,us_param,mystep)

calls inflow wind init

Inputs

  • turbine::Turbine: turbine input for slice see ?Turbine
  • env::Env: environment input for slice see ?Env
  • us_param::UnsteadyParams: unsteady inputs for slice see ?UnsteadyParams
  • mystep::int: continuous index cooresponding to the azimuthal discretation - i.e. for ntheta of 30 step 1 is the first step of rev 1, sep 31 is the first step of rev 2, etc. Keeps track of temporal locaion

Outputs:

  • CP: This slice's coefficient of performance at this step
  • Th: This slice's thrust coefficient at this step
  • Q: Torque (N0m) at this step
  • Rp: Radial force per height (N) at this step
  • Tp: Tangential force per height (N) at this step
  • Zp: Vertical force per height (N) at this step
  • Vloc: Local velocity array for each azimuthal position (includes induction) (m/s) at this step
  • CD: This slice's drag coefficient at this step
  • CT: This slice's thrust coefficient (should equal drag, but may no depending on usage or solver status) at this step
  • amean: Mean turbine induction in the streamwise direction at this step
  • astar: Solved induction factors for each azimuthal location. First half are streamwise (u), second are cross-steam (v) at this step
  • alpha: Local angle of attack array for each azimuthal position (includes induction) (rad) at this step
  • cl: Local lift coefficient used for each azimuthal position at this step
  • cd_af: Local drag coefficient used for each azimuthal position at this step
  • thetavec: Azimuthal location of each discretization (rad)
  • Re: Reynolds number for each azimuthal position at this step
OWENSAero.WxIIMethod

integrand used for computing WxII

OWENSAero.WxIJMethod

integrand used for computing WxIJ

OWENSAero.advanceTurbMethod
advanceTurb(tnew;ts=2*pi/(turbslices[1].omega[1]*turbslices[1].ntheta))

Runs a previously initialized aero model (see ?setupTurb) in the unsteady mode (can be repeateadly called, or called for a specific time, or repeatedly called for sections of time)

Inputs

  • tnew::float: new time (s); will run from last time specified from the last call, to the current time specified, or from t=ts if the first time called
  • ts::float: optional, desired timestep. Will run at finer timesteps than the azimuthal discretization without interfering with wake propogation. While possible, it is not recommended to run with timesteps larger than the azimuthal discretization (hence the optional nature and automatic calculation)

Outputs:

  • CP: Turbine coefficient of performance
  • Rp: Array(B,Nslices,nsteps) of radial force (N) where nsteps = max(1,round(Int,(tnew-timelast)/ts))
  • Tp: Array(B,Nslices,n_steps) of tangential force (N)
  • Zp: Array(B,Nslices,n_steps) of vertical force (N)
  • alpha: Array(B,Nslices,n_steps) of angle of attack (rad)
  • cl: Array(B,Nslices,n_steps) of airfoil cl used
  • cd_af: Array(B,Nslices,n_steps) of airfoil cd used
  • Vloc: Array(B,Nslices,n_steps) of airfoil local velocity used
  • Re: Array(B,Nslices,n_steps) of airfoil Reynolds number used
  • thetavec: Azimuthal discretization location (rad)
  • ntheta: number of azimuthal discretizations used
  • Fx_base: Array(ntheta)Turbine base Fx (N)
  • Fy_base: Array(ntheta)Turbine base Fy (N)
  • Fz_base: Array(ntheta)Turbine base Fz (N)
  • Mx_base: Array(ntheta)Turbine base Mx (N-m)
  • My_base: Array(ntheta)Turbine base My (N-m)
  • Mz_base: Array(ntheta)Turbine base Mz (N-m)
  • power: Array(ntheta)Turbine power (watts)
  • power2: Turbine average power for the revolution (watts)
  • torque: Array(ntheta)Turbine torque (N-m) (alternative calculation method from Mz-base)
OWENSAero.deformTurbMethod

deformTurb(azi;newOmega=-1,newVinf=-1,bldx=-1, bldz=-1, bld_twist=-1, steady=false)

Equivalent to an update states call, mutating the internal aerodynamic inputs within the unsteady model.

Inputs

  • azi: Current azimuth position of the turbine in radians (continuously growing with numbers of revolutions)
  • bld_x: Blade structural x shape, size(NBlade,any), any as it is splined against bld_z and the aero discretization
  • bld_z: Blade structural z shape, size(NBlade,any), any as it is splined against bld_x and the aero discretization
  • bld_twist: Blade structural twist, size(NBlade,any), any as it is splined against bld_z and the aero discretization. Note that in the calcs, this will be in addition to the aero twist offset already applied in initialization.
  • accel_flap_in: Blade structural acceleration in the flap direction, size(NBlade,any), any as it is splined against bld_z and the aero discretization
  • accel_edge_in: Blade structural acceleration in the edge direction, size(NBlade,any), any as it is splined against bld_z and the aero discretization
  • steady::bool: if steady is true, it just updates a single step. TODO: verify this is correct

Outputs:

  • none:
OWENSAero.matrixAssembleMethod

Internal, assembles the matrices of multiple turbine systems into a combined system centerX, centerY: array of x,y coordinates for centers of the VAWTs in the farm radii: corresponding array of their radii

OWENSAero.pIntMethod

Internal, integration for a periodic function where end points don't reach ends (uses trapezoidal method)

OWENSAero.panelIntegrationMethod

applies for both Ay and Rx depending on which function ifunc(x, y, phi) is passed in

OWENSAero.precomputeMatricesMethod

Internal, precomputes influence coefficient matricies and saves them as HDF5 files

OWENSAero.radialforceMethod

Internal, calculates the radial force used in the residual function as well as the turbine performance when converged

OWENSAero.readaerodynMethod
readaerodyn(filename)

create airfoil lookup for a file with only one reynolds number

Inputs

  • filename::string: file path/name to airfoil file formatted like in the test folder

Outputs:

  • af::function: cl, cd = af(alpha,re,mach) with alpha in rad
OWENSAero.readaerodyn_BVMethod
readaerodyn_BV(filename)

create airfoil lookup function with boeing vertol dynamic stall model for a file with only one reynolds number

Inputs

  • filename::string: file path/name to airfoil file formatted like in the test folder

Outputs:

  • af::function: cl, cd = afBV(alpha,Re,M,env,Vtwist,c,dt,U;solvestep=false) with alpha in rad, OWENSAero.Env, V_twist in rad/s, c chord in m, dt in sec, U Vloc in m/s, solvestep true during solve loop
OWENSAero.readaerodyn_BV_NEWMethod
readaerodyn_BV_NEW(filename;DSModel="BV")

for a file with multiple reynolds numbers create airfoil lookup function with boeing vertol dynamic stall model and wrap interpolation

Inputs

  • filename::string: file path/name to airfoil file formatted like in the test folder
  • DSModel::string: "BV" or "none"

Outputs:

  • af::function: cl, cd = afBV(alpha,Re,M,env,Vtwist,c,dt,U;solvestep=false) with alpha in rad, OWENSAero.Env, V_twist in rad/s, c chord in m, dt in sec, U Vloc in m/s, solvestep true during solve loop
  • af::function: cl, cd = af(alpha,re,mach) with alpha in rad
OWENSAero.residualMethod

Internal, sets up the residual function

OWENSAero.setupTurbMethod

setupTurb(bldx,bldz,B,chord,omega,Vinf; Height = maximum(bldz), Radius = maximum(bldx), eta = 0.25, twist = 0.0, #or array{Float,Nslices} rho = 1.225, mu = 1.7894e-5, RPI = true, tau = [0.3,3.0], ntheta = 30, Nslices = 30, #TODO: make this different from ntheta ifw = false, DSModel = "BV", AModel = "DMS", windangleD = 0.0, afname = "(path)/airfoils/NACA0015RE3E5.dat", #TODO: analytical airfoil as default turbsimfilename = "(path)/data/ifw/turbDLC1p313mps330mseed1.bts", ifwlibfile = joinpath(dirname(@FILE), "../bin/libifwcbinding"), AMflag = false, buoyflag = false, rotAccelflag = false, AMCoeffCa = 1.0)

Initializes aerodynamic models and sets up backend persistent memory to simplify intermittent calling within coupled solver loops

Inputs

  • bld_x: Blade x shape
  • bld_z: Blade z shape
  • B: Number of blades
  • chord: chord length (m)
  • omega: rotation rate in rad/s. size(1) or size(ntheta), pass in an array(Real,ntheta) when propogating automatic gradients
  • Vinf: Inflow velocity
  • Height: turbine total height (m) typically maximum(bldz) unless only the shape and not size of bldz is being used
  • Radius: turbine nominal radius (m) typically maximum(bldx) unless only shape and not size of bldx is used
  • eta: blade mount point ratio, i.e. 0.25 would be at the quarter chord
  • twist: 0.0, #or array{Float,Nslices}
  • rho: working fluid density (kg/m^3)
  • mu: working fluid dynamic viscosity (Pa*s)
  • RPI: RPI method flag
  • tau: Unsteady wake propogation time constants [0.3,3.0],
  • ntheta: Number of azimuthal discretizations
  • Nslices: Number of vertical slices of the turbine
  • ifw: flag for inflow wind
  • DSModel: Dynamic stall model "BV" or "none" or "LB" when we get it working
  • AModel: Aerodynamic model "DMS" or "AC"
  • windangle_D: Inflow wind angle (degrees)
  • afname: airfoil path and name e.g. "(path)/airfoils/NACA0015RE3E5.dat"
  • turbsim_filename: turbsim path and name e.g. "(path)/data/ifw/turbDLC1p313mps330mseed1.bts",
  • ifw_libfile: inflow wind dynamic library location e.g. joinpath(dirname(@FILE), "../../../openfast/build/modules/inflowwind/libifwcbinding"))
  • AM_flag::bool: flag to turn on added mass effects
  • buoy_flag::bool: flag to turn on buoyancy forces
  • rotAccel_flag::bool: flag to turn on the rotational acceleration portion of added mass for a crossflow turbine
  • AM_Coeff_Ca::float: added mass coefficient, typically 1.0

Outputs:

  • none:
OWENSAero.steadyMethod
steady(turbine::Turbine, env::Env; w=zeros(Real,2*turbine.ntheta), idx_RPI=1:2*turbine.ntheta,solve=true,ifw=false)

Calculates steady state aerodynamics for a single VAWT slice

Inputs

  • turbine::Turbine: Turbine struct, see ?Turbine for details
  • env::Env: Env struct, see ?Env for details
  • w::Array(<:Real): Optional, used if solve=false, induction factor array, first half corresponding to u, second half to v
  • idx_RPI::Array(<:Int): Optional, used to specify the azimuthal indices needed for a partial solve (i.e. not every azimuthal index), such as is used in the RPI method
  • solve::Bool: Optional, False is used when you want the model outputs for a given set of induction factors without resolving them.
  • ifw::Bool: Optional, used to tell the Vinf lookup to attempt to use the dynamic inflow wind library, requires preprocessing as is shown in the test cases.

Outputs:

  • CP: This slice's coefficient of performance
  • Th: This slice's thrust coefficient
  • Q: Torque (N0m)
  • Rp: Radial force per height (N)
  • Tp: Tangential force per height (N)
  • Zp: Vertical force per height (N)
  • Vloc: Local velocity array for each azimuthal position (includes induction) (m/s)
  • CD: This slice's drag coefficient
  • CT: This slice's thrust coefficient (should equal drag, but may no depending on usage or solver status)
  • amean: Mean turbine induction in the streamwise direction
  • astar: Solved induction factors for each azimuthal location. First half are streamwise (u), second are cross-steam (v)
  • alpha: Local angle of attack array for each azimuthal position (includes induction) (rad)
  • cl: Local lift coefficient used for each azimuthal position
  • cd_af: Local drag coefficient used for each azimuthal position
  • thetavec: Azimuthal location of each discretization (rad)
  • Re: Reynolds number for each azimuthal position
OWENSAero.steadyTurbMethod
steadyTurb(omega,Vinf)

Runs a previously initialized aero model (see ?setupTurb) in the steady state mode

Inputs

  • omega::float: turbine rotation rate (rad/s)
  • Vinf::float: turbine steady inflow velocity (m/s)

Outputs:

  • CP: Turbine coefficient of performance
  • Rp: Array(B,Nslices,ntheta) of radial force (N)
  • Tp: Array(B,Nslices,ntheta) of tangential force (N)
  • Zp: Array(B,Nslices,ntheta) of vertical force (N)
  • alpha: Array(B,Nslices,ntheta) of angle of attack (rad)
  • cl: Array(B,Nslices,ntheta) of airfoil cl used
  • cd_af: Array(B,Nslices,ntheta) of airfoil cd used
  • Vloc: Array(B,Nslices,ntheta) of airfoil local velocity used
  • Re: Array(B,Nslices,ntheta) of airfoil Reynolds number used
  • thetavec: Azimuthal discretization location (rad)
  • ntheta: number of azimuthal discretizations used
  • Fx_base: Array(ntheta)Turbine base Fx (N)
  • Fy_base: Array(ntheta)Turbine base Fy (N)
  • Fz_base: Array(ntheta)Turbine base Fz (N)
  • Mx_base: Array(ntheta)Turbine base Mx (N-m)
  • My_base: Array(ntheta)Turbine base My (N-m)
  • Mz_base: Array(ntheta)Turbine base Mz (N-m)
  • power: Array(ntheta)Turbine power (watts)
  • power2: Turbine average power for the revolution (watts)
  • torque: Array(ntheta)Turbine torque (N-m) (alternative calculation method from Mz-base)
OWENSAero.streamtubeMethod

INTERNAL streamtube(a,theta,turbine,env;output_all=false,Vxwake=nothing,solvestep=false)

Double multiple streamtube individual streamtube calculation

Output:

if outputall return Th, Q, Rp, Tp, Zp, Vloc, CD, CT, alpha, cl, cdaf, Re else return CD-CT # Residual, section 2.4 end

OWENSAero.trapzMethod

Internal, trapezoidal integration of y w.r.t. x

diff --git a/dev/reference/referenceFEA/index.html b/dev/reference/referenceFEA/index.html index 23805fa..51b1dad 100644 --- a/dev/reference/referenceFEA/index.html +++ b/dev/reference/referenceFEA/index.html @@ -28,4 +28,4 @@ maxNumLoadSteps = 20, minLoadStepDelta = 0.0500, minLoadStep = 0.0500, - prescribedLoadStep = 0.0)

Model inputs for FEA analysis, struct

Inputs

Outputs:

OWENSFEA.MeshType
Mesh(nodeNum,numEl,numNodes,x,y,z,elNum,conn,type,meshSeg,structuralSpanLocNorm,structuralNodeNumbers,structuralElNumbers)

Struct with mesh definition

Inputs

  • nodeNum::Array{<:int}: Number mapping of nodes (typically 1:Nnodes)
  • numEl::int: total number of elements
  • numNodes::int: total number of nodes
  • x::Array{<:float}: Nodal x position
  • y::Array{<:float}: Nodal y position
  • z::Array{<:float}: Nodal z position
  • elNum::Array{<:int}: Number mapping of elements (typically 1:Nelements)
  • conn::Array{<:int}: Nelemx2 connectivity between nodes, gaps between joints (which are defined in the joints)
  • type::Array{<:int}: 0-blade 1-tower 2-strut
  • meshSeg::Array{<:int}: number of nodes within each segment, with segments consisting of tower, blade 1 2 etc, struts
  • structuralSpanLocNorm::Array{<:float}: Should be named heigh loc norm - unitized position along the blade height, used for aeroload mapping
  • structuralNodeNumbers::Array{<:int}: Node numbers associated with blades for aero loads mapping
  • structuralElNumbers::Array{<:int}: Element numbers associated with blades for aero loads mapping
  • nonRotating::Array{<:int}: size(Nsections,numNodes) where nsections are the number of sections of the mesh that are non-rotating, like if for some reason you had two towers, or if you had multiple guy wires
  • hubNodeNum::int: Node number where the rotating part of the turbine starts, assumes meshing always starts with tower, then blades, etc.

Outputs:

  • none:
OWENSFEA.NlParamsType
NlParams(iterationType,adaptiveLoadSteppingFlag,tolerance,maxIterations,maxNumLoadSteps,minLoadStepDelta,minLoadStep,prescribedLoadStep)

See ?FEAModel

OWENSFEA.NodalTermsType

Internal, see ?FEAModel for NodalTerms

OWENSFEA.OrtType
Ort(Psi_d,Theta_d,Twist_d,Length,elNum,Offset)

Struct with element orientation

Inputs

  • Psi_d::Array{<:float}: length NumEl, element rotation about 3 in global FOR (deg) These angles are used to transform from the global coordinate frame to the local element/joint frame via a 3-2 Euler rotation sequence.
  • Theta_d::Array{<:float}: length NumEl, element rotation about 2 (deg)
  • Twist_d::Array{<:float}: length NumEl, element twist (deg)
  • Length::Array{<:float}: length NumEl, element length (m)
  • elNum::Array{<:float}: Element number the other arrays are associated with
  • Offset::Array{<:float}: hub frame coordinate of node 1 of the element

Outputs:

  • none:
OWENSFEA.ROMType

Internal, ROM data

OWENSFEA.SectionPropsArrayType
SectionPropsArray(ac,twist,rhoA,EIyy,EIzz,GJ,EA,rhoIyy,rhoIzz,rhoJ,zcm,ycm,a,EIyz,alpha1,alpha2,alpha3,alpha4,alpha5,alpha6,rhoIyz,b,a0,aeroCenterOffset,xaf,yaf)

Struct with element sectional properties, each component is a 1x2 array with distributed properties

Inputs

  • ac::Array{<:float}: aerodynamic center, used in flutter approximation
  • twist::Array{<:float}: element twist (rad)
  • rhoA::Array{<:float}: rho * A in standard SI units
  • EIyy::Array{<:float}: E * Iyy
  • EIzz::Array{<:float}: E * Izz
  • GJ::Array{<:float}: G * J
  • EA::Array{<:float}: E * A
  • rhoIyy::Array{<:float}: rho * Iyy
  • rhoIzz::Array{<:float}: rho * Izz
  • rhoJ::Array{<:float}: rho * J
  • zcm::Array{<:float}: z location of center of mass
  • ycm::Array{<:float}: y location of center of mass
  • a::Array{<:float}: possibly lift slope
  • EIyz::Array{<:float}: E * Iyz
  • alpha1::Array{<:float}: #This is always 0 in the element file, and it is unclear what it is used for since I can't find it being used in the code
  • alpha2::Array{<:float}: doesn't appear to be used
  • alpha3::Array{<:float}: doesn't appear to be used
  • alpha4::Array{<:float}: doesn't appear to be used
  • alpha5::Array{<:float}: doesn't appear to be used
  • alpha6::Array{<:float}: doesn't appear to be used
  • rhoIyz::Array{<:float}: rho * Iyz
  • b::Array{<:float}: used in flutter approximation, possibly a chord or thickness value
  • a0::Array{<:float}: zero lift angle of attack, used in flutter approximation
  • aeroCenterOffset::Array{<:float}: doesn't appear to be used
  • xaf::Array{<:float}: x airfoil coordinates (to scale)
  • yaf::Array{<:float}: y airfoil coordinates (to scale)

Outputs:

  • none:
OWENSFEA.TimeIntType

Internal, time integration terms

OWENSFEA.ConcMassAssociatedWithElementMethod
ConcMassAssociatedWithElement(conn,joint,nodalMassTerms,nodalStiffnessTerms,nodalLoads)

Compiles concentrated mass, stiffness, and load associated with a node from both ndl and joint files. The mod* variables are passed back with these terms removed to prevent duplicate application of shared nodal terms between elements

#Input

  • conn connectivity list for element
  • joint joint array for nodal terms
  • nodalMassTerms listing of concentrated nodal mass terms
  • nodalStiffnessTerms listing of concentrated nodal stiffness terms
  • nodalLoads listing of concentrated nodal loads terms

#Output

  • mass array of concentrated mass associated with element
  • stiff array of concentrated stiffness associated with element
  • load array of concentrated loads associated with element
  • modJoint modified joint object removing nodal terms that have/will be applied to the element calculations
  • modNodalMassTerms modified nodal mass object removing nodal terms that have/will be applied to the element calculations
  • modalStiffnessTerms modified nodal stiffness object removing nodal terms that have/will be applied to the element calculations
  • modNodalLoads modified nodal loads object removing nodal terms that have/will be applied to the element calculations
OWENSFEA.ModalOutputMethod
writeOutput(freq,damp,phase1,phase2,imagComponentSign,fid)

Internal, writes an output file and or formats an output for modal analysis.

#Input

  • freq: array of modal frequencies
  • damp: array of modal damping ratios
  • phase1: array of in phase mode shapes
  • phase2: array of out of phase mode shapes
  • imagComponentSign: array of sign of imaginary components
  • fid: file identifier for output

#Output

  • freqSorted: array of sorted(by frequency) modal frequencies
  • dampSorted: array of sorted(by frequency) modal damping ratios
  • imagCompSignSorted: array of sorted(by frequency) of imaginarycomponentSign array
  • U_x_0: see ?Modal outputs
  • U_y_0: see ?Modal outputs
  • U_z_0: see ?Modal outputs
  • theta_x_0: see ?Modal outputs
  • theta_y_0: see ?Modal outputs
  • theta_z_0: see ?Modal outputs
  • U_x_90: see ?Modal outputs
  • U_y_90: see ?Modal outputs
  • U_z_90: see ?Modal outputs
  • theta_x_90: see ?Modal outputs
  • theta_y_90: see ?Modal outputs
  • theta_z_90: see ?Modal outputs
OWENSFEA.adaptiveLoadSteppingMethod

Internal, performs updates a loadstep adaptively, see ?updateLoadStep

OWENSFEA.applyBCMethod
applyBC(Kg,Fg,BC,u,iterationType,numDofPerNode)

Internal, applies boundary conditions to the stiffness matrix and load vector for a static analysis.

#Input

  • Kg assembled global stiffness matrix
  • Fg assembled global load vector
  • BC struct of boundary condition information
  • u global displacement vector
  • iterationType for nonlinear analysis, not used in BLAST
  • numDofPerNode number of degrees of freedom per node

#Output

  • Kg global stiffness matrix with boundary conditions
  • Fg global load vector with boundary condition
OWENSFEA.applyBCModalMethod
applyBCModal(K,BC,numDofPerNode)

Internal, applies boundary conditions to a system matrix for modal analysis

Inputs

  • K: assembled global system matrix
  • BC: struct of boundary condition information
  • numDofPerNode: number of degrees of freedom per node

Outputs:

  • Knew global system matrix with boundary conditions
OWENSFEA.applyConcentratedTermsMethod
applyConcentratedTerms(numNodes, numDOFPerNode; filename="none",data=[1 "M6" 1 1 0.0], jointData=[])

Internal, applies 6x6 concentrated nodal terms from user input.

#Input

  • filename: string containing nodal terms filename
  • data: Nx5 or Nx4 array matching general [1 "M6" 1 1 0.0] or diagonal only [1 "M" 1 0.0] aligning with node, Type, dof, value, where type is M,C,K, or F

#Output

  • nodalTerms::NodalTerms: see ?NodalTerms object containing concentrated nodal data
OWENSFEA.applyConstraintsMethod

Internal, this function transforms a matrix by the transformation matrix to enforce joint constraints

OWENSFEA.applyConstraintsVecMethod

Internal, this function transforms a vector by the transformation matrix to enforce joint constraints

OWENSFEA.assembly!Method
assembly(Ke,Fe,conn,numNodesPerEl,numDOFPerNode,Kg,Fg)

Internal, assembles the element matrix and load vector into the global system of equations

#Input

  • Ke: element matrix
  • Fe: element vector
  • conn: element connectivity
  • numNodesPerEl: number of nodes per element
  • numDofPerNode: number of degrees of freedom per node
  • Kg: global system matrix
  • Fg: global load vector

#Output

  • Kg: global system matrix with assembled element
  • Fg: global load vector with assembled element
OWENSFEA.assemblyMatrixOnlyMethod
assemblyMatrixOnly(Ke,conn,numNodesPerEl,numDOFPerNode,Kg)

Internal, assembles the element matrix into the global system of equations

Inputs

  • Ke: element matrix
  • conn: element connectivity
  • numNodesPerEl: number of nodes per element
  • numDofPerNode: number of degrees of freedom per node
  • Kg: global system matrix

Outputs:

  • Kg: global system matrix with assembled element
OWENSFEA.autoCampbellDiagramMethod

frequencies = autoCampbellDiagram(FEAinputs,mymesh,myel,system,assembly,sections; minRPM = 0.0, maxRPM = 40.0, NRPM = 9, # int vtksavename = nothing, saveModes = [1,3,5], #must be int saveRPM = [1,3,5], #must be int mode_scaling = 500.0, )

Automated Campbell Diagram Generator, this function runs the model with centrifugal stiffening for the specified RPM levels. If FEAinputs.analysisType == "GX" and vtksavename are specified, it will output paraview mode shape files at the specified save name.

#Inputs

  • FEAinputs::OWENSFEA.FEAModel: The FEA modeling options
  • mymesh::OWENSFEA.Mesh: a previously generated turbine mesh
  • myel::OWENSFEA.El: the element properties associated with that mesh
  • system::GXBeam.System: the converted GXBeam system from the mesh and el
  • assembly::GXBeam.AssemblyState: the converted GXBeam assembly from the mesh and el
  • sections::Array{Float64, 3}: the 3D point cloud to be converted to VTK format
  • minRPM::Float64: minimum RPM to be run, e.x. 0.0
  • maxRPM::Float64: maximum RPM to be run e.x. 40.0
  • NRPM::Int64: number of linear discretizations of RPM e.x. 9 must be int
  • vtksavename::string: filename (with path if desired) of the VTK outputs if GX. Set to "nothing" to not save.
  • saveModes::Array{Int64}: The modes to save in the VTK outputs e.x. [1,3,5] must be int
  • saveRPM::Array{Int64}: The RPMs to save in the VTK outputs e.x. [1,3,5] must be int
  • mode_scaling::Float64: The mode scaling in the VTK outputs e.x. 500.0

#Outputs

  • frequency::Array{Float64}: The output modal frequencies
OWENSFEA.calcUnormMethod

This function calculates a relative norm between two vectors: unew and uold

OWENSFEA.calculateBCMapMethod

calculateBCMap(numpBC,pBC,numDofPerNode,reducedDofList)

Internal, creates a boundary condition map between full and reduced dof listing as a result of constraints.

#Input

  • numpBC number of boundary conditions
  • pBC array of boundary condition data
  • numDofPerNode number of degrees of freedom per node
  • reducedDofList array of reduced DOF numbering

#Output

  • elStorage map for boundary conditions between full and reduced dof list
OWENSFEA.calculateElement1!Method

Internal, general routine to calculate an element matrix

OWENSFEA.calculateElementMassMethod

Internal, calculates element mass properties.

OWENSFEA.calculateLambdaMethod
calculateLambda(theta1,theta2,theta3)

This function calculates a transformation matrix to transform the element degree of freedom vector (12 DOFs) from the hub frame to the element frame. The transformation matrix is constructed via the direction cosine matrices of a 3-2-1 Euler rotation sequence.

#Input *theta1::float: angle (rad) of rotation for 1st rotation of 3-2-1 sequence *theta2::float: angle (rad) of rotation for 2nd rotation of 3-2-1 sequence *theta3::float: angle (rad) of rotation for 3rd rotation of 3-2-1 sequence

#Output *lambda::Array{<:float}: 12 x 12 transformation matrix

OWENSFEA.calculateLoadVecFromDistForceMethod

calculateLoadVecFromDistForce(elementOrder,x,xloc,twist,sweepAngle,coneAngle,rollAngle,extDistF2Node,extDistF3Node,extDistF4Node)

Takes in a global 6dof distributed force at two nodal points and returns the 6dof force in the element FOR

#Input

  • elementOrder:::
  • x::Array{<:float}: mesh x-position
  • xloc::Array{<:float}: local x-position [0 elLength]
  • twist::Array{<:float}: element twist angle (rad)
  • sweepAngle::Array{<:float}: element sweep angle (rad)
  • coneAngle::Array{<:float}: element cone angle (rad)
  • rollAngle::Array{<:float}: element roll angle (rad)
  • extDistF2Node::Array{<:float}: turbine Tangential force
  • extDistF3Node::Array{<:float}: turbine Normal force
  • extDistF4Node::Array{<:float}: turbine M25 moment

#Output

  • Fe::Array{float}: 6x1 Force on element in element FOR
OWENSFEA.calculateROMMethod
calculateROM(model,mesh,el,displ,omegaVec,omegaDotVec,elStorage,countedNodes)

This function calculates a reduced order model for a conventional structural dynamics system (parked, non-rotating)

#Input

  • model object containing model data
  • mesh object containing mesh data
  • el object containing elementdata
  • displ displacement vector
  • rbData: vector containing rigid body displacement, velocity, and acceleration
  • elStorage object containing stored element data
  • countedNodes prevents applied nodal terms from double counting

#Output

  • rom object containing reduced order model data
OWENSFEA.calculateROMGyricMethod

calculateROMGyric(feamodel,mesh,el,displ,omegaVec,omegaDotVec,elStorage,rom0,countedNodes)

Calculates a reduced order feamodel with rotational/ rigid body motion effects

#Input

  • feamodel: object containing feamodel data
  • mesh: object containing mesh data
  • el: object containing elementdata
  • displ: displacement vector
  • rbData: vector of hub frame accel (1-3), angular velocity components (4-6), and angular accleration (7-9)
  • elStorage: object containing stored element data
  • rom0: object containing parked/conventional reduced order feamodel
  • countedNodes: prevents applied nodal terms from double counting

#Output

  • rom: object containing reduced order feamodel data
OWENSFEA.calculateReactionForceAtNodeMethod
calculateReactionForceAtNode(nodeNum,model,mesh,el,elStorage,timeInt,dispData,displ_iter,rbData,Omega,OmegaDot,CN2H,countedNodes)

Internal, calculates the reaction force at a node by post processing all element associated with a node through connectivity or joint constraints.

#Input

  • nodeNum: node number joint constraints are desired at
  • model: object containing model data
  • mesh: object containing mesh data
  • elStorage: object containing stored element data
  • el: object containing element data
  • timeInt: object containing time integration parameters
  • dispData: object containing displacement data
  • displ_iter: converged displacement solution
  • rbData: vector containing rigid body displacement, velocity, and acceleration
  • Omega: rotor speed (Hz)
  • OmegaDot: rotor acceleratin (Hz)
  • CN2H: transformation matrix from inertial frame to hub frame
  • countedNodes: prevents nodal terms from being double counted

#Output

  • cummulativeForce: vector containing reaction force at nodeNum
OWENSFEA.calculateReducedDOFVectorMethod

Internal, searches over all DOFs in a structural model and determines and returns "dofVector" containing only unconstrained DOFs

OWENSFEA.calculateShapeFunctionsMethod

calculateShapeFunctions(elementOrder,xi,x)

This function calculates the Lagrange shape function, shape function derivative, and Jacobian to map between the local element domain and physical length of the element. The shape function derivative is defined with respect to the physical length domain. The shape functions may be linear or quadratic in order.

#Input

  • elementOrder order of element: 1 linear, 2 quadratic
  • xi guass point values to evaluate shape functions at
  • x nodal coordinates in physical length domain

#Output

  • N shape function value at specified gauss points
  • p_N_x shape function derivative w.r.t physical length domain at specified gauss points
  • Jac Jacobian for mat between local element domain and physical length domain.
OWENSFEA.calculateStrainForElementsMethod

Internal calculates element strains

OWENSFEA.calculateStructureMassPropsMethod

calculateStructureMassProps(elStorage)

This function caclulates structural mass properties of the finite element mesh (mass, moment of inertia, mass center) about the origin of the mesh coordinate system.

#Input

  • elStorage::ElStorage see ?ElStorage, object containing arrays of stored element information

#Output

  • structureMass::float mass of structure
  • structureMOI::float moment of inertia tensor of structgure
  • structureMassCenter::float center of mass of structure
OWENSFEA.calculateTimoshenkoElementInitialRunMethod
calculateTimoshenkoElementInitialRun(elementOrder,modalFlag,xloc,sectionProps,sweepAngle,coneAngle,rollAngle,aeroSweepAngle,x,y,z,concMassFlag,concMass,Omega)

Internal, see ?initialElementCalculations, performs initial element calculations and stores them for later use and efficiency gains.

OWENSFEA.calculateTimoshenkoElementNLMethod
calculateTimoshenkoElementNL(input,elStorage;predef=nothing)

Internal, performs nonlinear element calculations.

#Inputs

  • input::ElInput: see ?ElInput
  • elStorage::ElStorage: see ?ElStorage
  • predef::Bool: optional, if true, mutates ElStorage to include the nonlinear strain stiffening

#Outputs

  • ElOutput: see ?ElOutput
OWENSFEA.calculateTimoshenkoElementNLSSMethod
calculateTimoshenkoElementNLSS(elinput)

Performs selective nonlinear element calculations. Only stiffness matrix contributions are evaluate. No other calculations are performed to facilitate efficiency gains.

#Input

  • elinput: object containing element input

#Output

  • eloutput: object containing element data
OWENSFEA.calculateTimoshenkoElementStrainMethod
calculateTimoshenkoElementStrain(elementOrder,nlOn,xloc,sectionProps,sweepAngle,coneAngle,rollAngle,aeroSweepAngle,disp)

Internal, calculates element strain for a Timoshenko element

#Outputs

  • ElStrain: See ?ElStrain
OWENSFEA.calculateVec1!Method

Internal, general routine to calculate an element vector

OWENSFEA.constructReducedDispVecFromEigVecMethod
constructReducedDispVecFromEigVec(vec1,reducedDOFList,BC)

Internal, This function takes the original mode shape and modifies it to account for boundary conditions

Inputs

  • vec1:
  • reducedDOFList:
  • BC:

Outputs:

  • vec1Red:
OWENSFEA.constructReducedDispVectorMapMethod

Internal, creates a map of unconstrained DOFs between a full listing and reduced listing (after constraints have been applied)

OWENSFEA.createJointTransformMethod

createJointTransform(joint,numNodes,numDofPerNode)

Internal, calculates the JointTransform of a structural system.

#Input

  • joint: object containing joint data
  • numModes: number of nodes in mesh
  • numDofPerNode: number of degrees of freedom per node

#Output

  • jointTransform: joint transformation matrix
  • reducedDOF: map of original DOF numbering to reduced DOF numbering
OWENSFEA.createTdaMethod

Internal, creates a constraint transformation matrix for a single joint. Tda is this matrix, dDOF contains a listing of dependent global DOFs associated with this joint, and aDOF contains a listing of active global DOFs associated with this joint.

OWENSFEA.determineActiveDofsFromSlaveNodeMethod

Internal, determines the local master DOF associated with a local slave DOF.

OWENSFEA.extractFreqDampMethod
extractFreqDamp(val,vec,numDOFPerNode,jointTransform,reducedDOFList,BC,analysisType)

Internal, calculates the eigenvalues and vectors of a structural dynamic system

Inputs

  • val: eigenvalue
  • vec: eigenvector
  • numDOFPerNode: number of degrees of freedom per node
  • jointTransform: joint transformation matrix from reduced to full DOF list
  • reducedDOFList: listing of reduced DOFs
  • BC: boundary condition object containing boundary condition info
  • analysisType: analysis type

Outputs:

  • freq: modal frequency
  • damp: modal damping
  • phase1: in phase mode shape (real part of mode shape)
  • phase2: out of phase mode shape (imaginary part of mode shape)
  • sortedModes: total, complex mode shape
OWENSFEA.extractdaInfoMethod

Internal, gets the total number of DOFs in the model, active number of DOFs in the model, and a list of slave DOFs that will be eliminated by joint constraints.

OWENSFEA.findElementsAssociatedWithNodeNumberMethod
findElementsAssociatedWithNodeNumber(nodeNum,conn,jointData)

Internal, finds elements associated with a node number through mesh connectivity or joint constraints

#Input

  • nodeNum node number joint constraints are desired at
  • conn object containing mesh connectivity
  • jointData object containing joint information

#Output

  • elList array containing a list of element numbers associated with nodeNum
  • localNode array containing the local node number that correspond to nodeNum in the list of associated elements
OWENSFEA.getElementConcTerms!Method

Internal, gets the concentrated terms without double counting

OWENSFEA.getGPMethod
getGP(numGP)

Internal, defines gauss point coordinates in a local element frame and the associated weights for Gaussian quadrature numerical integration.

#Input

  • numGP: number of quad points used for integration

#Output

  • xi: list of quad point coordinates in local element frame
  • weight: associated weights for quad point coordinate
OWENSFEA.getNodeMapsMethod

Internal, gets node mapping

OWENSFEA.initialElementCalculationsMethod
initialElementCalculations(feamodel,el,mesh)

performs initial element calculation for use later in analysis for efficiency gains.

Inputs

  • feamodel::FEAmodel: see ?Feamodel
  • el::El: see ?El
  • mesh::Mesh: see ?Mesh

Outputs:

  • elStorage:ElStorage: see ?ElStorage
OWENSFEA.interpolateValMethod

Internal, linear interpolation

OWENSFEA.linearAnalysisModalMethod

Internal, see ?modal

OWENSFEA.makeBCdataMethod
makeBCdata(pBC,numNodes,numDofPerNode,reducedDOFList,jointTransform)

Internal, usese the pBC matrix and calculates/stores boundary condition data

#Input

  • pBC See ?FEAModel.pBC
  • numNodes number of nodes in structural model
  • numDofPerNode number of degrees of freedom per node
  • reducedDOFList joint transformation matrix from reduced to full DOF list
  • jointTransform listing of reduced DOFs

#Output

  • BC:BC_struct see ?BC_struct
OWENSFEA.mapMatrixNonSymMethod

Internal, function to form total stifness matrix and transform to desired DOF mapping

OWENSFEA.mapMatrixNonSym2Method

Internal, function to form total stifness matrix and transform to desired DOF mapping

OWENSFEA.mapVectorMethod

Internal, forms total force vector and transform to desired DOF mapping

OWENSFEA.modalMethod
modal(feamodel,mesh,el;Omega=0.0,displ=zeros(mesh.numNodes*6),OmegaStart=0.0,returnDynMatrices=false)

Modal analysis

Inputs

  • feamodel::FEAModel: see ?FEAModel
  • mesh::Mesh: see ?Mesh
  • el::El: see ?El
  • Omega::float: Rotational rate in Hz
  • displ::Array{<:float}: zeros(mesh.numNodes*6) initial (warm start) displacements for each dof
  • OmegaStart::float: rotor speed (Hz) from previous analysis if stepping through various rotor speeds, may be useful in load stepping
  • returnDynMatrices::Bool: Flag to save linearized K/C/M matrices for the design

Outputs:

  • freq::Array{<:float}: sorted modal frequencies (Hz)
  • damp::Array{<:float}: sorted modal damping
  • imagCompSign::Array{<:float}: sign of imaginary component of eigenvalues
  • U_x_0::Array{<:float}: NnodesxNmodes in-phase mode shape x
  • U_y_0::Array{<:float}: NnodesxNmodes in-phase mode shape y
  • U_z_0::Array{<:float}: NnodesxNmodes in-phase mode shape z
  • theta_x_0::Array{<:float}: NnodesxNmodes in-phase mode shape rotation about x
  • theta_y_0::Array{<:float}: NnodesxNmodes in-phase mode shape rotation about y
  • theta_z_0::Array{<:float}: NnodesxNmodes in-phase mode shape rotation about z
  • U_x_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape x
  • U_y_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape y
  • U_z_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape z
  • theta_x_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape rotation about x
  • theta_y_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape rotation about y
  • theta_z_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape rotation about z
OWENSFEA.reducedOrderModelMethod

reducedOrderModel(elStorage,feamodel,mesh,el,displ)

This function executes a reduced order model analysis.

#Input

  • elStorage object containing stored element matrices
  • feamodel object containing feamodel information
  • mesh object containing mesh information
  • el object containing element information
  • displ displacement vector for use in pre-stressed analysis

#Output

  • rom object containing a reduced order feamodel
OWENSFEA.setInitialConditionsMethod
setInitialConditions(initCond,u,numDOFPerNode)

sets initial conditions

#Input

  • initCond: array containing initial conditions initCond(i,1) node number for init cond i initCond(i,2) local DOF number for init cond i initCond(i,3) value for init cond i
  • u: displacement vector for each dof
  • numDOFPerNode: number of degrees of freedom per node

#Output

  • u: displacement vector modified for initial conditions
OWENSFEA.setPrescribedConditionsMethod
prescribed_conditions = setPrescribedConditions(mesh;pBC=zeros(2,2),Fexternal=[],ForceDof=[])

Internal, maps OWENS boundary conditions and applied forces to the GXBeam PrescribedConditions input

#Input

  • mesh::FEAModel.mesh: Input turbine mesh
  • pBC::FEAModel.BC.pBC: Boundary conditions
  • Fexternal::Array{Float64}: Applied forces to the mesh, 1D array ordered node 1 Dof 1-6, node 2 Dof 1-2, etc.
  • ForceDof::Array{Float64}: Degrees of freedom aligned with Fexternal, currently is unused, assumes Fexternal uses the full DOF array.

#Output

  • prescribed_conditions::GXBeam.PrescribedConditions: the boundary conditions/applied forces used by GXBeam see ?GXBeam.PrescribedConditions
OWENSFEA.staticAnalysisMethod

staticAnalysis(feamodel,mesh,el,displ,Omega,OmegaStart,elStorage; reactionNodeNumber=1, OmegaDot=0.0, Fdof=[1], Fexternal=[0.0])

This function performs a static analysis and returns displacement values and a flag denoting successful/unsuccessful analysis

#Inputs

  • feamodel: object containing feamodel information
  • mesh: object containing mesh information
  • el: object containing element information
  • displ: displacement vector for use in pre-stressed analysis
  • Omega: rotor speed (Hz)
  • OmegaStart: rotor speed (Hz) from previous analysis if stepping through various rotor speeds, may be useful in load stepping
  • elStorage: previously calculated element system matrices
  • reactionNodeNumber::Int: optional, node at which to calculate reaction force
  • OmegaDot::Float: Steady State Rotational Acceleration
  • Fdof::Array{<:Int}: Global Dofs where Fexternal is acting, where max dof = nelem*ndof
  • Fexternal{<:Float}: Forces or moments associated with the Fdofs specified

#Outputs

  • displ: vector of displacemetns
  • staticAnalysisSuccessful: boolean flag denoting successful static analysis
OWENSFEA.structuralDynamicsTransientMethod
structuralDynamicsTransient(feamodel,mesh,el,dispData,Omega,OmegaDot,time,delta_t,elStorage,Fexternal,Fdof,CN2H,rbData)

performs unsteady structural dynamics analysis

Inputs

  • feamodel::: object containing feamodel data
  • mesh::: object containing mesh data
  • el::: object containing element data
  • dispData::: object containing displacement data
  • Omega::: rotor speed (Hz)
  • OmegaDot::: rotor acceleratin (Hz)
  • time::: current simulation time
  • delta_t::: time step size
  • elStorage::: object containing stored element data
  • Fexternal::: vector containing external force values
  • Fdof::: vector containing global DOF numbering associated with external force values
  • CN2H::: transformation matrix from inertial frame to hub frame
  • rbData::: vector containing rigid body displacement, velocity, and acceleration

Outputs:

  • elStrain::ElStrain: see ?ElStrain strain for element at end of time step
  • dispOut::DispOut: see ?DispOut displacement data at end of time step
  • FReaction_sp1::: vector containing reaction force at turbine base at end of time step
OWENSFEA.structuralDynamicsTransientROMMethod
structuralDynamicsTransientROM(feamodel,mesh,el,dispData,Omega,OmegaDot,time,delta_t,elStorage,rom,Fexternal,Fdof,CN2H,rbData)

Performs transient structural dynamics analysis using a reduced order feamodel (ROM).

#Input

  • feamodel: object containing feamodel data
  • mesh: object containing mesh data
  • el: object containing element data
  • dispData: object containing displacement data
  • Omega: rotor speed (Hz)
  • OmegaDot: rotor acceleratin (Hz)
  • time: current simulation time
  • delta_t: time step size
  • elStorage: object containing stored element data
  • rom: object containing reduced order feamodel represnetation
  • Fexternal: vector containing external force values
  • Fdof: vector containing global DOF numbering associated with external force values
  • CN2H: transformation matrix from inertial frame to hub frame
  • rbData: vector containing rigid body displacement, velocity, and acceleration

#Output

  • dispOut: object containing displacement data at end of time step
  • FReaction_sp1: vector containing reaction force at turbine base at end of time step
OWENSFEA.timeIntegrateSubSystemEffMethod

timeIntegrateSubSystemEff(M,K,C,F,timeInt,u,udot,uddot)

Performs integration of a system using the Newmark-Beta method(constant-average acceleration sceheme). The integration parameters are calculated before hand and store in the timeInt object.

#Input

  • M system mass matrix
  • K system sttiffness matrix
  • C system damping matrix
  • F system force vector
  • timeInt object containing time integraton parameters
  • u displacement at beginning of time step
  • udot velocity at beginning of time step
  • uddot acceleration at beginning of time step

#Output

  • unp1: displacement at end of time step
  • udotnp1: velocity at end of time step
  • uddotnp1: acceleration at end of time step
OWENSFEA.updateLoadStepMethod
updateLoadStep(iterationCount,loadStepParams,loadStep,loadStepPrev,loadStepCount,displCopy,displ)

Updates the load stepping parameter whether through means of adaptive loadstepping or a specified load step profile.

#Input

  • iterationCount number of iterations for current load step
  • loadStepParams struct containing load step parameters
  • loadStep load step value for current load step
  • loadStepPrev load step value for previous load st ep
  • loadStepCount number of load steps performed up to this point
  • displPrev converged displacement vector form previous load step
  • displ displacement vector at current load step

#Output

  • loadStep new load step value
  • loadStepPrev load step value for previous load step
  • displ most up to date displacement vector in load stepping procedure
  • displPrev displacement vector at end of previous load step
  • staticAnalysisSuccessful boolean flag, true if load step was completed successfully
  • staticAnalysisComplete boolean flag, true if analysis is complete
+ prescribedLoadStep = 0.0)

Model inputs for FEA analysis, struct

Inputs

Outputs:

OWENSFEA.MeshType
Mesh(nodeNum,numEl,numNodes,x,y,z,elNum,conn,type,meshSeg,structuralSpanLocNorm,structuralNodeNumbers,structuralElNumbers)

Struct with mesh definition

Inputs

  • nodeNum::Array{<:int}: Number mapping of nodes (typically 1:Nnodes)
  • numEl::int: total number of elements
  • numNodes::int: total number of nodes
  • x::Array{<:float}: Nodal x position
  • y::Array{<:float}: Nodal y position
  • z::Array{<:float}: Nodal z position
  • elNum::Array{<:int}: Number mapping of elements (typically 1:Nelements)
  • conn::Array{<:int}: Nelemx2 connectivity between nodes, gaps between joints (which are defined in the joints)
  • type::Array{<:int}: 0-blade 1-tower 2-strut
  • meshSeg::Array{<:int}: number of nodes within each segment, with segments consisting of tower, blade 1 2 etc, struts
  • structuralSpanLocNorm::Array{<:float}: Should be named heigh loc norm - unitized position along the blade height, used for aeroload mapping
  • structuralNodeNumbers::Array{<:int}: Node numbers associated with blades for aero loads mapping
  • structuralElNumbers::Array{<:int}: Element numbers associated with blades for aero loads mapping
  • nonRotating::Array{<:int}: size(Nsections,numNodes) where nsections are the number of sections of the mesh that are non-rotating, like if for some reason you had two towers, or if you had multiple guy wires
  • hubNodeNum::int: Node number where the rotating part of the turbine starts, assumes meshing always starts with tower, then blades, etc.

Outputs:

  • none:
OWENSFEA.NlParamsType
NlParams(iterationType,adaptiveLoadSteppingFlag,tolerance,maxIterations,maxNumLoadSteps,minLoadStepDelta,minLoadStep,prescribedLoadStep)

See ?FEAModel

OWENSFEA.NodalTermsType

Internal, see ?FEAModel for NodalTerms

OWENSFEA.OrtType
Ort(Psi_d,Theta_d,Twist_d,Length,elNum,Offset)

Struct with element orientation

Inputs

  • Psi_d::Array{<:float}: length NumEl, element rotation about 3 in global FOR (deg) These angles are used to transform from the global coordinate frame to the local element/joint frame via a 3-2 Euler rotation sequence.
  • Theta_d::Array{<:float}: length NumEl, element rotation about 2 (deg)
  • Twist_d::Array{<:float}: length NumEl, element twist (deg)
  • Length::Array{<:float}: length NumEl, element length (m)
  • elNum::Array{<:float}: Element number the other arrays are associated with
  • Offset::Array{<:float}: hub frame coordinate of node 1 of the element

Outputs:

  • none:
OWENSFEA.ROMType

Internal, ROM data

OWENSFEA.SectionPropsArrayType
SectionPropsArray(ac,twist,rhoA,EIyy,EIzz,GJ,EA,rhoIyy,rhoIzz,rhoJ,zcm,ycm,a,EIyz,alpha1,alpha2,alpha3,alpha4,alpha5,alpha6,rhoIyz,b,a0,aeroCenterOffset,xaf,yaf)

Struct with element sectional properties, each component is a 1x2 array with distributed properties

Inputs

  • ac::Array{<:float}: aerodynamic center, used in flutter approximation
  • twist::Array{<:float}: element twist (rad)
  • rhoA::Array{<:float}: rho * A in standard SI units
  • EIyy::Array{<:float}: E * Iyy
  • EIzz::Array{<:float}: E * Izz
  • GJ::Array{<:float}: G * J
  • EA::Array{<:float}: E * A
  • rhoIyy::Array{<:float}: rho * Iyy
  • rhoIzz::Array{<:float}: rho * Izz
  • rhoJ::Array{<:float}: rho * J
  • zcm::Array{<:float}: z location of center of mass
  • ycm::Array{<:float}: y location of center of mass
  • a::Array{<:float}: possibly lift slope
  • EIyz::Array{<:float}: E * Iyz
  • alpha1::Array{<:float}: #This is always 0 in the element file, and it is unclear what it is used for since I can't find it being used in the code
  • alpha2::Array{<:float}: doesn't appear to be used
  • alpha3::Array{<:float}: doesn't appear to be used
  • alpha4::Array{<:float}: doesn't appear to be used
  • alpha5::Array{<:float}: doesn't appear to be used
  • alpha6::Array{<:float}: doesn't appear to be used
  • rhoIyz::Array{<:float}: rho * Iyz
  • b::Array{<:float}: used in flutter approximation, possibly a chord or thickness value
  • a0::Array{<:float}: zero lift angle of attack, used in flutter approximation
  • aeroCenterOffset::Array{<:float}: doesn't appear to be used
  • xaf::Array{<:float}: x airfoil coordinates (to scale)
  • yaf::Array{<:float}: y airfoil coordinates (to scale)

Outputs:

  • none:
OWENSFEA.TimeIntType

Internal, time integration terms

OWENSFEA.ConcMassAssociatedWithElementMethod
ConcMassAssociatedWithElement(conn,joint,nodalMassTerms,nodalStiffnessTerms,nodalLoads)

Compiles concentrated mass, stiffness, and load associated with a node from both ndl and joint files. The mod* variables are passed back with these terms removed to prevent duplicate application of shared nodal terms between elements

#Input

  • conn connectivity list for element
  • joint joint array for nodal terms
  • nodalMassTerms listing of concentrated nodal mass terms
  • nodalStiffnessTerms listing of concentrated nodal stiffness terms
  • nodalLoads listing of concentrated nodal loads terms

#Output

  • mass array of concentrated mass associated with element
  • stiff array of concentrated stiffness associated with element
  • load array of concentrated loads associated with element
  • modJoint modified joint object removing nodal terms that have/will be applied to the element calculations
  • modNodalMassTerms modified nodal mass object removing nodal terms that have/will be applied to the element calculations
  • modalStiffnessTerms modified nodal stiffness object removing nodal terms that have/will be applied to the element calculations
  • modNodalLoads modified nodal loads object removing nodal terms that have/will be applied to the element calculations
OWENSFEA.ModalOutputMethod
writeOutput(freq,damp,phase1,phase2,imagComponentSign,fid)

Internal, writes an output file and or formats an output for modal analysis.

#Input

  • freq: array of modal frequencies
  • damp: array of modal damping ratios
  • phase1: array of in phase mode shapes
  • phase2: array of out of phase mode shapes
  • imagComponentSign: array of sign of imaginary components
  • fid: file identifier for output

#Output

  • freqSorted: array of sorted(by frequency) modal frequencies
  • dampSorted: array of sorted(by frequency) modal damping ratios
  • imagCompSignSorted: array of sorted(by frequency) of imaginarycomponentSign array
  • U_x_0: see ?Modal outputs
  • U_y_0: see ?Modal outputs
  • U_z_0: see ?Modal outputs
  • theta_x_0: see ?Modal outputs
  • theta_y_0: see ?Modal outputs
  • theta_z_0: see ?Modal outputs
  • U_x_90: see ?Modal outputs
  • U_y_90: see ?Modal outputs
  • U_z_90: see ?Modal outputs
  • theta_x_90: see ?Modal outputs
  • theta_y_90: see ?Modal outputs
  • theta_z_90: see ?Modal outputs
OWENSFEA.adaptiveLoadSteppingMethod

Internal, performs updates a loadstep adaptively, see ?updateLoadStep

OWENSFEA.applyBCMethod
applyBC(Kg,Fg,BC,u,iterationType,numDofPerNode)

Internal, applies boundary conditions to the stiffness matrix and load vector for a static analysis.

#Input

  • Kg assembled global stiffness matrix
  • Fg assembled global load vector
  • BC struct of boundary condition information
  • u global displacement vector
  • iterationType for nonlinear analysis, not used in BLAST
  • numDofPerNode number of degrees of freedom per node

#Output

  • Kg global stiffness matrix with boundary conditions
  • Fg global load vector with boundary condition
OWENSFEA.applyBCModalMethod
applyBCModal(K,BC,numDofPerNode)

Internal, applies boundary conditions to a system matrix for modal analysis

Inputs

  • K: assembled global system matrix
  • BC: struct of boundary condition information
  • numDofPerNode: number of degrees of freedom per node

Outputs:

  • Knew global system matrix with boundary conditions
OWENSFEA.applyConcentratedTermsMethod
applyConcentratedTerms(numNodes, numDOFPerNode; filename="none",data=[1 "M6" 1 1 0.0], jointData=[])

Internal, applies 6x6 concentrated nodal terms from user input.

#Input

  • filename: string containing nodal terms filename
  • data: Nx5 or Nx4 array matching general [1 "M6" 1 1 0.0] or diagonal only [1 "M" 1 0.0] aligning with node, Type, dof, value, where type is M,C,K, or F

#Output

  • nodalTerms::NodalTerms: see ?NodalTerms object containing concentrated nodal data
OWENSFEA.applyConstraintsMethod

Internal, this function transforms a matrix by the transformation matrix to enforce joint constraints

OWENSFEA.applyConstraintsVecMethod

Internal, this function transforms a vector by the transformation matrix to enforce joint constraints

OWENSFEA.assembly!Method
assembly(Ke,Fe,conn,numNodesPerEl,numDOFPerNode,Kg,Fg)

Internal, assembles the element matrix and load vector into the global system of equations

#Input

  • Ke: element matrix
  • Fe: element vector
  • conn: element connectivity
  • numNodesPerEl: number of nodes per element
  • numDofPerNode: number of degrees of freedom per node
  • Kg: global system matrix
  • Fg: global load vector

#Output

  • Kg: global system matrix with assembled element
  • Fg: global load vector with assembled element
OWENSFEA.assemblyMatrixOnlyMethod
assemblyMatrixOnly(Ke,conn,numNodesPerEl,numDOFPerNode,Kg)

Internal, assembles the element matrix into the global system of equations

Inputs

  • Ke: element matrix
  • conn: element connectivity
  • numNodesPerEl: number of nodes per element
  • numDofPerNode: number of degrees of freedom per node
  • Kg: global system matrix

Outputs:

  • Kg: global system matrix with assembled element
OWENSFEA.autoCampbellDiagramMethod

frequencies = autoCampbellDiagram(FEAinputs,mymesh,myel,system,assembly,sections; minRPM = 0.0, maxRPM = 40.0, NRPM = 9, # int vtksavename = nothing, saveModes = [1,3,5], #must be int saveRPM = [1,3,5], #must be int mode_scaling = 500.0, )

Automated Campbell Diagram Generator, this function runs the model with centrifugal stiffening for the specified RPM levels. If FEAinputs.analysisType == "GX" and vtksavename are specified, it will output paraview mode shape files at the specified save name.

#Inputs

  • FEAinputs::OWENSFEA.FEAModel: The FEA modeling options
  • mymesh::OWENSFEA.Mesh: a previously generated turbine mesh
  • myel::OWENSFEA.El: the element properties associated with that mesh
  • system::GXBeam.System: the converted GXBeam system from the mesh and el
  • assembly::GXBeam.AssemblyState: the converted GXBeam assembly from the mesh and el
  • sections::Array{Float64, 3}: the 3D point cloud to be converted to VTK format
  • minRPM::Float64: minimum RPM to be run, e.x. 0.0
  • maxRPM::Float64: maximum RPM to be run e.x. 40.0
  • NRPM::Int64: number of linear discretizations of RPM e.x. 9 must be int
  • vtksavename::string: filename (with path if desired) of the VTK outputs if GX. Set to "nothing" to not save.
  • saveModes::Array{Int64}: The modes to save in the VTK outputs e.x. [1,3,5] must be int
  • saveRPM::Array{Int64}: The RPMs to save in the VTK outputs e.x. [1,3,5] must be int
  • mode_scaling::Float64: The mode scaling in the VTK outputs e.x. 500.0

#Outputs

  • frequency::Array{Float64}: The output modal frequencies
OWENSFEA.calcUnormMethod

This function calculates a relative norm between two vectors: unew and uold

OWENSFEA.calculateBCMapMethod

calculateBCMap(numpBC,pBC,numDofPerNode,reducedDofList)

Internal, creates a boundary condition map between full and reduced dof listing as a result of constraints.

#Input

  • numpBC number of boundary conditions
  • pBC array of boundary condition data
  • numDofPerNode number of degrees of freedom per node
  • reducedDofList array of reduced DOF numbering

#Output

  • elStorage map for boundary conditions between full and reduced dof list
OWENSFEA.calculateElement1!Method

Internal, general routine to calculate an element matrix

OWENSFEA.calculateElementMassMethod

Internal, calculates element mass properties.

OWENSFEA.calculateLambdaMethod
calculateLambda(theta1,theta2,theta3)

This function calculates a transformation matrix to transform the element degree of freedom vector (12 DOFs) from the hub frame to the element frame. The transformation matrix is constructed via the direction cosine matrices of a 3-2-1 Euler rotation sequence.

#Input *theta1::float: angle (rad) of rotation for 1st rotation of 3-2-1 sequence *theta2::float: angle (rad) of rotation for 2nd rotation of 3-2-1 sequence *theta3::float: angle (rad) of rotation for 3rd rotation of 3-2-1 sequence

#Output *lambda::Array{<:float}: 12 x 12 transformation matrix

OWENSFEA.calculateLoadVecFromDistForceMethod

calculateLoadVecFromDistForce(elementOrder,x,xloc,twist,sweepAngle,coneAngle,rollAngle,extDistF2Node,extDistF3Node,extDistF4Node)

Takes in a global 6dof distributed force at two nodal points and returns the 6dof force in the element FOR

#Input

  • elementOrder:::
  • x::Array{<:float}: mesh x-position
  • xloc::Array{<:float}: local x-position [0 elLength]
  • twist::Array{<:float}: element twist angle (rad)
  • sweepAngle::Array{<:float}: element sweep angle (rad)
  • coneAngle::Array{<:float}: element cone angle (rad)
  • rollAngle::Array{<:float}: element roll angle (rad)
  • extDistF2Node::Array{<:float}: turbine Tangential force
  • extDistF3Node::Array{<:float}: turbine Normal force
  • extDistF4Node::Array{<:float}: turbine M25 moment

#Output

  • Fe::Array{float}: 6x1 Force on element in element FOR
OWENSFEA.calculateROMMethod
calculateROM(model,mesh,el,displ,omegaVec,omegaDotVec,elStorage,countedNodes)

This function calculates a reduced order model for a conventional structural dynamics system (parked, non-rotating)

#Input

  • model object containing model data
  • mesh object containing mesh data
  • el object containing elementdata
  • displ displacement vector
  • rbData: vector containing rigid body displacement, velocity, and acceleration
  • elStorage object containing stored element data
  • countedNodes prevents applied nodal terms from double counting

#Output

  • rom object containing reduced order model data
OWENSFEA.calculateROMGyricMethod

calculateROMGyric(feamodel,mesh,el,displ,omegaVec,omegaDotVec,elStorage,rom0,countedNodes)

Calculates a reduced order feamodel with rotational/ rigid body motion effects

#Input

  • feamodel: object containing feamodel data
  • mesh: object containing mesh data
  • el: object containing elementdata
  • displ: displacement vector
  • rbData: vector of hub frame accel (1-3), angular velocity components (4-6), and angular accleration (7-9)
  • elStorage: object containing stored element data
  • rom0: object containing parked/conventional reduced order feamodel
  • countedNodes: prevents applied nodal terms from double counting

#Output

  • rom: object containing reduced order feamodel data
OWENSFEA.calculateReactionForceAtNodeMethod
calculateReactionForceAtNode(nodeNum,model,mesh,el,elStorage,timeInt,dispData,displ_iter,rbData,Omega,OmegaDot,CN2H,countedNodes)

Internal, calculates the reaction force at a node by post processing all element associated with a node through connectivity or joint constraints.

#Input

  • nodeNum: node number joint constraints are desired at
  • model: object containing model data
  • mesh: object containing mesh data
  • elStorage: object containing stored element data
  • el: object containing element data
  • timeInt: object containing time integration parameters
  • dispData: object containing displacement data
  • displ_iter: converged displacement solution
  • rbData: vector containing rigid body displacement, velocity, and acceleration
  • Omega: rotor speed (Hz)
  • OmegaDot: rotor acceleratin (Hz)
  • CN2H: transformation matrix from inertial frame to hub frame
  • countedNodes: prevents nodal terms from being double counted

#Output

  • cummulativeForce: vector containing reaction force at nodeNum
OWENSFEA.calculateReducedDOFVectorMethod

Internal, searches over all DOFs in a structural model and determines and returns "dofVector" containing only unconstrained DOFs

OWENSFEA.calculateShapeFunctionsMethod

calculateShapeFunctions(elementOrder,xi,x)

This function calculates the Lagrange shape function, shape function derivative, and Jacobian to map between the local element domain and physical length of the element. The shape function derivative is defined with respect to the physical length domain. The shape functions may be linear or quadratic in order.

#Input

  • elementOrder order of element: 1 linear, 2 quadratic
  • xi guass point values to evaluate shape functions at
  • x nodal coordinates in physical length domain

#Output

  • N shape function value at specified gauss points
  • p_N_x shape function derivative w.r.t physical length domain at specified gauss points
  • Jac Jacobian for mat between local element domain and physical length domain.
OWENSFEA.calculateStrainForElementsMethod

Internal calculates element strains

OWENSFEA.calculateStructureMassPropsMethod

calculateStructureMassProps(elStorage)

This function caclulates structural mass properties of the finite element mesh (mass, moment of inertia, mass center) about the origin of the mesh coordinate system.

#Input

  • elStorage::ElStorage see ?ElStorage, object containing arrays of stored element information

#Output

  • structureMass::float mass of structure
  • structureMOI::float moment of inertia tensor of structgure
  • structureMassCenter::float center of mass of structure
OWENSFEA.calculateTimoshenkoElementInitialRunMethod
calculateTimoshenkoElementInitialRun(elementOrder,modalFlag,xloc,sectionProps,sweepAngle,coneAngle,rollAngle,aeroSweepAngle,x,y,z,concMassFlag,concMass,Omega)

Internal, see ?initialElementCalculations, performs initial element calculations and stores them for later use and efficiency gains.

OWENSFEA.calculateTimoshenkoElementNLMethod
calculateTimoshenkoElementNL(input,elStorage;predef=nothing)

Internal, performs nonlinear element calculations.

#Inputs

  • input::ElInput: see ?ElInput
  • elStorage::ElStorage: see ?ElStorage
  • predef::Bool: optional, if true, mutates ElStorage to include the nonlinear strain stiffening

#Outputs

  • ElOutput: see ?ElOutput
OWENSFEA.calculateTimoshenkoElementNLSSMethod
calculateTimoshenkoElementNLSS(elinput)

Performs selective nonlinear element calculations. Only stiffness matrix contributions are evaluate. No other calculations are performed to facilitate efficiency gains.

#Input

  • elinput: object containing element input

#Output

  • eloutput: object containing element data
OWENSFEA.calculateTimoshenkoElementStrainMethod
calculateTimoshenkoElementStrain(elementOrder,nlOn,xloc,sectionProps,sweepAngle,coneAngle,rollAngle,aeroSweepAngle,disp)

Internal, calculates element strain for a Timoshenko element

#Outputs

  • ElStrain: See ?ElStrain
OWENSFEA.calculateVec1!Method

Internal, general routine to calculate an element vector

OWENSFEA.constructReducedDispVecFromEigVecMethod
constructReducedDispVecFromEigVec(vec1,reducedDOFList,BC)

Internal, This function takes the original mode shape and modifies it to account for boundary conditions

Inputs

  • vec1:
  • reducedDOFList:
  • BC:

Outputs:

  • vec1Red:
OWENSFEA.constructReducedDispVectorMapMethod

Internal, creates a map of unconstrained DOFs between a full listing and reduced listing (after constraints have been applied)

OWENSFEA.createJointTransformMethod

createJointTransform(joint,numNodes,numDofPerNode)

Internal, calculates the JointTransform of a structural system.

#Input

  • joint: object containing joint data
  • numModes: number of nodes in mesh
  • numDofPerNode: number of degrees of freedom per node

#Output

  • jointTransform: joint transformation matrix
  • reducedDOF: map of original DOF numbering to reduced DOF numbering
OWENSFEA.createTdaMethod

Internal, creates a constraint transformation matrix for a single joint. Tda is this matrix, dDOF contains a listing of dependent global DOFs associated with this joint, and aDOF contains a listing of active global DOFs associated with this joint.

OWENSFEA.determineActiveDofsFromSlaveNodeMethod

Internal, determines the local master DOF associated with a local slave DOF.

OWENSFEA.extractFreqDampMethod
extractFreqDamp(val,vec,numDOFPerNode,jointTransform,reducedDOFList,BC,analysisType)

Internal, calculates the eigenvalues and vectors of a structural dynamic system

Inputs

  • val: eigenvalue
  • vec: eigenvector
  • numDOFPerNode: number of degrees of freedom per node
  • jointTransform: joint transformation matrix from reduced to full DOF list
  • reducedDOFList: listing of reduced DOFs
  • BC: boundary condition object containing boundary condition info
  • analysisType: analysis type

Outputs:

  • freq: modal frequency
  • damp: modal damping
  • phase1: in phase mode shape (real part of mode shape)
  • phase2: out of phase mode shape (imaginary part of mode shape)
  • sortedModes: total, complex mode shape
OWENSFEA.extractdaInfoMethod

Internal, gets the total number of DOFs in the model, active number of DOFs in the model, and a list of slave DOFs that will be eliminated by joint constraints.

OWENSFEA.findElementsAssociatedWithNodeNumberMethod
findElementsAssociatedWithNodeNumber(nodeNum,conn,jointData)

Internal, finds elements associated with a node number through mesh connectivity or joint constraints

#Input

  • nodeNum node number joint constraints are desired at
  • conn object containing mesh connectivity
  • jointData object containing joint information

#Output

  • elList array containing a list of element numbers associated with nodeNum
  • localNode array containing the local node number that correspond to nodeNum in the list of associated elements
OWENSFEA.getElementConcTerms!Method

Internal, gets the concentrated terms without double counting

OWENSFEA.getGPMethod
getGP(numGP)

Internal, defines gauss point coordinates in a local element frame and the associated weights for Gaussian quadrature numerical integration.

#Input

  • numGP: number of quad points used for integration

#Output

  • xi: list of quad point coordinates in local element frame
  • weight: associated weights for quad point coordinate
OWENSFEA.getNodeMapsMethod

Internal, gets node mapping

OWENSFEA.initialElementCalculationsMethod
initialElementCalculations(feamodel,el,mesh)

performs initial element calculation for use later in analysis for efficiency gains.

Inputs

  • feamodel::FEAmodel: see ?Feamodel
  • el::El: see ?El
  • mesh::Mesh: see ?Mesh

Outputs:

  • elStorage:ElStorage: see ?ElStorage
OWENSFEA.interpolateValMethod

Internal, linear interpolation

OWENSFEA.linearAnalysisModalMethod

Internal, see ?modal

OWENSFEA.makeBCdataMethod
makeBCdata(pBC,numNodes,numDofPerNode,reducedDOFList,jointTransform)

Internal, usese the pBC matrix and calculates/stores boundary condition data

#Input

  • pBC See ?FEAModel.pBC
  • numNodes number of nodes in structural model
  • numDofPerNode number of degrees of freedom per node
  • reducedDOFList joint transformation matrix from reduced to full DOF list
  • jointTransform listing of reduced DOFs

#Output

  • BC:BC_struct see ?BC_struct
OWENSFEA.mapMatrixNonSymMethod

Internal, function to form total stifness matrix and transform to desired DOF mapping

OWENSFEA.mapMatrixNonSym2Method

Internal, function to form total stifness matrix and transform to desired DOF mapping

OWENSFEA.mapVectorMethod

Internal, forms total force vector and transform to desired DOF mapping

OWENSFEA.modalMethod
modal(feamodel,mesh,el;Omega=0.0,displ=zeros(mesh.numNodes*6),OmegaStart=0.0,returnDynMatrices=false)

Modal analysis

Inputs

  • feamodel::FEAModel: see ?FEAModel
  • mesh::Mesh: see ?Mesh
  • el::El: see ?El
  • Omega::float: Rotational rate in Hz
  • displ::Array{<:float}: zeros(mesh.numNodes*6) initial (warm start) displacements for each dof
  • OmegaStart::float: rotor speed (Hz) from previous analysis if stepping through various rotor speeds, may be useful in load stepping
  • returnDynMatrices::Bool: Flag to save linearized K/C/M matrices for the design

Outputs:

  • freq::Array{<:float}: sorted modal frequencies (Hz)
  • damp::Array{<:float}: sorted modal damping
  • imagCompSign::Array{<:float}: sign of imaginary component of eigenvalues
  • U_x_0::Array{<:float}: NnodesxNmodes in-phase mode shape x
  • U_y_0::Array{<:float}: NnodesxNmodes in-phase mode shape y
  • U_z_0::Array{<:float}: NnodesxNmodes in-phase mode shape z
  • theta_x_0::Array{<:float}: NnodesxNmodes in-phase mode shape rotation about x
  • theta_y_0::Array{<:float}: NnodesxNmodes in-phase mode shape rotation about y
  • theta_z_0::Array{<:float}: NnodesxNmodes in-phase mode shape rotation about z
  • U_x_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape x
  • U_y_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape y
  • U_z_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape z
  • theta_x_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape rotation about x
  • theta_y_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape rotation about y
  • theta_z_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape rotation about z
OWENSFEA.reducedOrderModelMethod

reducedOrderModel(elStorage,feamodel,mesh,el,displ)

This function executes a reduced order model analysis.

#Input

  • elStorage object containing stored element matrices
  • feamodel object containing feamodel information
  • mesh object containing mesh information
  • el object containing element information
  • displ displacement vector for use in pre-stressed analysis

#Output

  • rom object containing a reduced order feamodel
OWENSFEA.setInitialConditionsMethod
setInitialConditions(initCond,u,numDOFPerNode)

sets initial conditions

#Input

  • initCond: array containing initial conditions initCond(i,1) node number for init cond i initCond(i,2) local DOF number for init cond i initCond(i,3) value for init cond i
  • u: displacement vector for each dof
  • numDOFPerNode: number of degrees of freedom per node

#Output

  • u: displacement vector modified for initial conditions
OWENSFEA.setPrescribedConditionsMethod
prescribed_conditions = setPrescribedConditions(mesh;pBC=zeros(2,2),Fexternal=[],ForceDof=[])

Internal, maps OWENS boundary conditions and applied forces to the GXBeam PrescribedConditions input

#Input

  • mesh::FEAModel.mesh: Input turbine mesh
  • pBC::FEAModel.BC.pBC: Boundary conditions
  • Fexternal::Array{Float64}: Applied forces to the mesh, 1D array ordered node 1 Dof 1-6, node 2 Dof 1-2, etc.
  • ForceDof::Array{Float64}: Degrees of freedom aligned with Fexternal, currently is unused, assumes Fexternal uses the full DOF array.

#Output

  • prescribed_conditions::GXBeam.PrescribedConditions: the boundary conditions/applied forces used by GXBeam see ?GXBeam.PrescribedConditions
OWENSFEA.staticAnalysisMethod

staticAnalysis(feamodel,mesh,el,displ,Omega,OmegaStart,elStorage; reactionNodeNumber=1, OmegaDot=0.0, Fdof=[1], Fexternal=[0.0])

This function performs a static analysis and returns displacement values and a flag denoting successful/unsuccessful analysis

#Inputs

  • feamodel: object containing feamodel information
  • mesh: object containing mesh information
  • el: object containing element information
  • displ: displacement vector for use in pre-stressed analysis
  • Omega: rotor speed (Hz)
  • OmegaStart: rotor speed (Hz) from previous analysis if stepping through various rotor speeds, may be useful in load stepping
  • elStorage: previously calculated element system matrices
  • reactionNodeNumber::Int: optional, node at which to calculate reaction force
  • OmegaDot::Float: Steady State Rotational Acceleration
  • Fdof::Array{<:Int}: Global Dofs where Fexternal is acting, where max dof = nelem*ndof
  • Fexternal{<:Float}: Forces or moments associated with the Fdofs specified

#Outputs

  • displ: vector of displacemetns
  • staticAnalysisSuccessful: boolean flag denoting successful static analysis
OWENSFEA.structuralDynamicsTransientMethod
structuralDynamicsTransient(feamodel,mesh,el,dispData,Omega,OmegaDot,time,delta_t,elStorage,Fexternal,Fdof,CN2H,rbData)

performs unsteady structural dynamics analysis

Inputs

  • feamodel::: object containing feamodel data
  • mesh::: object containing mesh data
  • el::: object containing element data
  • dispData::: object containing displacement data
  • Omega::: rotor speed (Hz)
  • OmegaDot::: rotor acceleratin (Hz)
  • time::: current simulation time
  • delta_t::: time step size
  • elStorage::: object containing stored element data
  • Fexternal::: vector containing external force values
  • Fdof::: vector containing global DOF numbering associated with external force values
  • CN2H::: transformation matrix from inertial frame to hub frame
  • rbData::: vector containing rigid body displacement, velocity, and acceleration

Outputs:

  • elStrain::ElStrain: see ?ElStrain strain for element at end of time step
  • dispOut::DispOut: see ?DispOut displacement data at end of time step
  • FReaction_sp1::: vector containing reaction force at turbine base at end of time step
OWENSFEA.structuralDynamicsTransientROMMethod
structuralDynamicsTransientROM(feamodel,mesh,el,dispData,Omega,OmegaDot,time,delta_t,elStorage,rom,Fexternal,Fdof,CN2H,rbData)

Performs transient structural dynamics analysis using a reduced order feamodel (ROM).

#Input

  • feamodel: object containing feamodel data
  • mesh: object containing mesh data
  • el: object containing element data
  • dispData: object containing displacement data
  • Omega: rotor speed (Hz)
  • OmegaDot: rotor acceleratin (Hz)
  • time: current simulation time
  • delta_t: time step size
  • elStorage: object containing stored element data
  • rom: object containing reduced order feamodel represnetation
  • Fexternal: vector containing external force values
  • Fdof: vector containing global DOF numbering associated with external force values
  • CN2H: transformation matrix from inertial frame to hub frame
  • rbData: vector containing rigid body displacement, velocity, and acceleration

#Output

  • dispOut: object containing displacement data at end of time step
  • FReaction_sp1: vector containing reaction force at turbine base at end of time step
OWENSFEA.timeIntegrateSubSystemEffMethod

timeIntegrateSubSystemEff(M,K,C,F,timeInt,u,udot,uddot)

Performs integration of a system using the Newmark-Beta method(constant-average acceleration sceheme). The integration parameters are calculated before hand and store in the timeInt object.

#Input

  • M system mass matrix
  • K system sttiffness matrix
  • C system damping matrix
  • F system force vector
  • timeInt object containing time integraton parameters
  • u displacement at beginning of time step
  • udot velocity at beginning of time step
  • uddot acceleration at beginning of time step

#Output

  • unp1: displacement at end of time step
  • udotnp1: velocity at end of time step
  • uddotnp1: acceleration at end of time step
OWENSFEA.updateLoadStepMethod
updateLoadStep(iterationCount,loadStepParams,loadStep,loadStepPrev,loadStepCount,displCopy,displ)

Updates the load stepping parameter whether through means of adaptive loadstepping or a specified load step profile.

#Input

  • iterationCount number of iterations for current load step
  • loadStepParams struct containing load step parameters
  • loadStep load step value for current load step
  • loadStepPrev load step value for previous load st ep
  • loadStepCount number of load steps performed up to this point
  • displPrev converged displacement vector form previous load step
  • displ displacement vector at current load step

#Output

  • loadStep new load step value
  • loadStepPrev load step value for previous load step
  • displ most up to date displacement vector in load stepping procedure
  • displPrev displacement vector at end of previous load step
  • staticAnalysisSuccessful boolean flag, true if load step was completed successfully
  • staticAnalysisComplete boolean flag, true if analysis is complete
diff --git a/dev/reference/referenceOpenFASTWrappers/index.html b/dev/reference/referenceOpenFASTWrappers/index.html index 9014fb4..eef4994 100644 --- a/dev/reference/referenceOpenFASTWrappers/index.html +++ b/dev/reference/referenceOpenFASTWrappers/index.html @@ -1,2 +1,2 @@ -OWENSOpenFASTWrappers · OWENS.jl

OWENSOpenFASTWrappers

Types and functions

OWENSOpenFASTWrappers.EnvironmentType

Environment(rho::TF1, dt::TF2, steplast::TAI) Environment(rho) = Environment(rho)

Contains specications for turbine environment/operating conditions as well as some backend memory

Inputs

  • rho::TF1: Working fluid density (kg/m^3)
  • dt::TF2: timestep for ADI
  • num_channels::TI1: number of output channels from AD15
  • steplast::TAI: prior simulation step index, used for unsteady wake propogation

Outputs:

  • none:
OWENSOpenFASTWrappers.StructureType

Structure

Contains the position and orientation info passed to AD15. These positions are all in global and include the turbine RefPos.

Inputs:

  • hubPos::TAF1:
  • hubOrient::TAF2:
  • hubVel::TAF3:
  • hubAcc::TAF4:
  • nacPos::TAF5:
  • nacOrient::TAF6:
  • nacVel::TAF7:
  • nacAcc::TAF8:
  • rootPos::TAF9:
  • rootOrient::TAF10:
  • rootVel::TAF11:
  • rootAcc::TAF12:
  • meshPos::TAF13:
  • meshOrient::TAF14:
  • meshVel::TAF15:
  • meshAcc::TAF16:

Outputs:

  • none:
OWENSOpenFASTWrappers.adiCalcOutputMethod
adiCalcOutput( )

calls AeroDynInflowC_CalcOutput to calculate resulting loads. Call this only after SetRotorMotion on all rotors/turbines.

Inputs:

time::c_double: current timestep

  • num_channels::int: number of output channels
OWENSOpenFASTWrappers.adiGetRotorLoadsMethod
adiGetRotorLoads(iturb; )

Gets the loads for a single turbine rotor

Inputs:

  • iturb::int: required, current turbine number

Outputs:

  • meshFrcMom::Array(float): loads from ADI at mesh nodes
OWENSOpenFASTWrappers.adiInitMethod
adiInit( output_root_name ; )

calls aerodyninflowinit to initialize AeroDyn and InflowWind together

Inputs:

  • ad_input_file_passed::int: flag to indicate the AD15 input file is passed as a string 0=false, 1=true (set to false if passing input file name instead, NOT SUPPORTED YET)

  • ad_input_file::string: name of input file for AD15 – this is read by julia and passed to AD15

  • ifw_input_file_passed::int: flag to indicate the InflowWind input file is passed as a string 0=false, 1=true (set to false if passing input file name instead, NOT SUPPORTED YET)

  • ifw_input_file::string: name of input file for InflowWind – this is read by julia and passed to InflowWind

  • gravity::float: optional, gravity value (default: 9.80665 m/s^2)

  • defFldDens::float: optional, air density (default: 1.225 kg/m^3)

  • defKinVisc::float: optional, kinematic viscosity of working fluid (default: 1.464E-05 m^2/s)

  • defSpdSound::float: optional, speed of sound in working fluid (default: 335.0 m/s)

  • defPatm::float: optional, atmospheric pressure (default: 103500.0 Pa) [used only for an MHK turbine cavitation check]

  • defPvap::float: optional, vapour pressure of working fluid (default: 1700.0 Pa) [used only for an MHK turbine cavitation check]

  • WtrDpth::float: optional, water depth (default: 0.0 m) [used only for an MHK turbine]

  • MSL2SWL::float: optional, offset between still-water level and mean sea level (default: 0.0 m) [positive upward, used only for an MHK turbine]

  • storeHHVel::int: optional, internal parameter for adi_library. Exposed for convenience, but not needed. [0=false, 1=true]

  • WrVTK::int: optional, write VTK output files at all timesteps to visualize AeroDyn 15 meshes [0 none (default), 1 ref, 2 motion]

  • WrVTK_Type::int: optional, write VTK output files as [1 surfaces (default), 2 lines, 3 both]

  • VTKNacDim::Array(float*6) optional, Nacelle Dimension for VTK visualization x0,y0,z0,Lx,Ly,Lz (m)

  • VTKHubRad::float: optional, HubRadius for VTK visualization (m)

  • wrOuts::int: optional, file format for writing outputs [0 none (default), 1 txt, 2 binary, 3 both]

  • DT_Outs::float64: optional, timestep for outputs to file [0.0 (default) for every timestep]

  • interp_order::int: optional, interpolation order used internally [1 first order (default), 2 second order]

  • dt::float64: required, timestep for AD15 (needed for setting internal constants)

  • t_max::float: required, total expected simulation time – used only for setting VTK counter width

Outputs:

  • num_channels::int: number of output channels
  • channel_names::string: string of output channel names from ADI
  • channel_units::string: string of output channel units from ADI
OWENSOpenFASTWrappers.adiPreInitMethod
adiPreInit(adilib_filename numTurbines transposeDCM)

Does some pre-initializing of the ADI library to setup arrays for each turbine

Inputs:

  • adilib_filename::string: path and name of AeroDyn-Inflow dynamic library
  • numTurbines::int: required, number of turbines to setup ADI to handle
  • transposeDCM::int: required, transpose DCM internally in ADI to match calling code convention for direction cosine matrices (default: 1==true)
OWENSOpenFASTWrappers.adiSetRotorMotionMethod
adiSetRotorMotion(iturb; )

Sets the motions for a single turbine rotor

Inputs:

  • iturb::int: required, current turbine number

  • HubPos::Array(float): required, (x,y,z) position of hub

  • HubOrient::Array(float): required, orientation of hub as 9 element vector of flattened DCM

  • HubVel::Array(float): required, (TVx,TVy,TVz,RVx,RVy,RVz) velocity of hub, does not include rotational velocity, so this is extra like from a platform

  • HubAcc::Array(float): required, (TAx,TAy,TAz,RAx,RAy,RAz) acceleration of hub, does not include rotational accel, so this is extra like from a platform

  • NacPos::Array(float): required, (x,y,z) position of nacelle

  • NacOrient::Array(float): required, orientation of nacelle as 9 element vector of flattened DCM

  • NacVel::Array(float): required, (TVx,TVy,TVz,RVx,RVy,RVz) velocity of nacelle

  • NacAcc::Array(float): required, (TAx,TAy,TAz,RAx,RAy,RAz) acceleration of nacelle

  • RootPos::Array(float): required, size (numBlades,3) position vectors of roots

  • RootOrient::Array(float): required, size (numBlades,9) orientation DCMs flattened to array of 9 element vectors

  • RootVel::Array(float): required, size (numBlades,6) velocity vectors of roots

  • RootAcc::Array(float): required, size (numBlades,6) acceleration vectors of roots

  • numMeshNodes::Array(int): required, number of structural mesh points (total across all blades)

  • MeshPos::Array(float): required, size (sum(numMeshNodes),3) position vectors of mesh points

  • MeshOrient::Array(float): required, size (sum(numMeshNodes),9) orientation DCMs flattened to array of 9 element vectors

  • MeshVel::Array(float): required, size (sum(numMeshNodes),6) velocity vectors of mesh points

  • MeshAcc::Array(float): required, size (sum(numMeshNodes),6) acceleration vectors of mesh points

Outputs:

  • none:
OWENSOpenFASTWrappers.adiSetupRotorMethod
adiSetupRotor(iturb; )

Sets the initial locations of a single rotor (root orientations/positions etc)

Inputs:

  • iturb::int: required, current turbine number

  • isHAWT::bool: required, false: VAWT or cross-flow turbine, true: HAWT

  • intTurbPos::Array(float): required, (x,y,z) position of turbine

  • initHubPos::Array(float): required, (x,y,z) position of hub

  • initHubOrient::Array(float): required, orientation of hub as 9 element vector of flattened DCM

  • initNacellePos::Array(float): required, (x,y,z) position of nacelle

  • initNacelleOrient::Array(float): required, orientation of nacelle as 9 element vector of flattened DCM

  • numBlades::int: required, number of blades

  • initRootPos::Array(float): required, size (numBlades,3) position vectors of roots

  • initRootOrient::Array(float): required, size (numBlades,9) orientation DCMs flattened to array of 9 element vectors

  • numMeshNodes::Array(int): required, number of structural mesh points (total across all blades)

  • initMeshPos::Array(float): required, size (sum(numMeshNodes),3) position vectors of mesh points

  • initMeshOrient::Array(float): required, size (sum(numMeshNodes),9) orientation DCMs flattened to array of 9 element vectors

OWENSOpenFASTWrappers.adiUpdateStatesMethod
adiUpdateStates( )

calls AeroDynInflowC_UpdateStates to step ADI forward to the next timestep Call this only after SetRotorMotion on all rotors/turbines.

Inputs:

time::c_double: current timestep

time_next::c_double: next timestep

OWENSOpenFASTWrappers.advanceAD15Method
advanceAD15(t_new;ts=2*pi/(turbine.omega[1]*turbine.ntheta))

Runs a previously initialized aero model (see ?setupTurb) in the unsteady mode (can be repeateadly called, or called for a specific time, or repeatedly called for sections of time)

Inputs

  • t_new::float: new time (s); will run from last time specified from the last call, to the current time specified, or from t=ts if the first time called
  • mesh::: OWENSFEA mesh for the turbine structure
  • azi::: hub azimuth (radians)
  • dt::float: optional timestep

Outputs:

  • n_steps: number timesteps taken
  • Fx: Array(sum(numMeshNodes),ntheta) Turbine Fx (N)
  • Fy: Array(sum(numMeshNodes),ntheta) Turbine Fy (N)
  • Fz: Array(sum(numMeshNodes),ntheta) Turbine Fz (N)
  • Mx: Array(sum(numMeshNodes),ntheta) Turbine Mx (N-m)
  • My: Array(sum(numMeshNodes),ntheta) Turbine My (N-m)
  • Mz: Array(sum(numMeshNodes),ntheta) Turbine Mz (N-m)
OWENSOpenFASTWrappers.createGeneralTransformationMatrixMethod

createGeneralTransformationMatrix(angleArray,axisArray)

Calculates the transformation matrix assocaited with a general Euler rotation sequence.

#Input

  • angleArray: = array of angles for Euler rotation sequence
  • axisArray: = array of axis of rotations for Euler rotation

#Output

  • dcmTotal: = transformation matrix of specified euler rotation sequence
OWENSOpenFASTWrappers.deformAD15Method
deformAD15(u_j,udot_j,uddot_j,azi,Omega_rad,OmegaDot_rad,hubPos,hubAngle,hubVel,hubAcc)

Sets the inputs for AD15.

Inputs

  • u_j: mesh displacements – in hub coordinates, (m,rad)
  • udot_j: mesh velocity – in hub coordinates, (m/s,rad/s)
  • uddot_j: mesh velocity – in hub coordinates, (m/s,rad/s)
  • azi: current azimuth (rad)
  • Omega_rad: angular velocity of hub about hub axis (rad/s)
  • OmegaDot_rad: angular acceleration of hub about hub axis (rad/s^2)
  • hubPos: current global hubPos (x,y,z) vector (m)
  • hubAngle: 3 angle set for hub orientation (rad), no rotation from spinning
  • hubVel: hub velocity in global coords, 6-vector (m/s,rad/s), does not include rotational velocity, so this is extra like from a platform
  • hubAcc: hub acceleration in global coords, 6-vector (m/s^2,rad/s^2), does not include rotational accel, so this is extra like from a platform
OWENSOpenFASTWrappers.frame_convertMethod

frameconvert(initframevals, transmat)

Internal, transfers 6 DOFs element-wise to a new reference frame

Input

  • init_frame_vals::Vector{<:float}: Values in 6 degrees of freedom in the initial reference frame
  • trans_mat::Array{<:float}: Transformation matrix to the output reference frame

Output

  • out_frame_vals: Values in 6 degrees of freedom in the output reference frame
OWENSOpenFASTWrappers.getAD15MeshDCMMethod

getAD15MeshDCM(turbine,u_j,azi,hubAngle)

Extract the mesh points orientations for all the AD15 blades ordering here is important 1. root to tip of blades, in blade order 2. root to tip of bottom struts, in blade order 3. root to tip of top struts, in blade order

Inputs

  • turbine: turbine data storage
  • u_j: mesh displacements – in hub coordinates, (m,rad)
  • azi: current azimuth (rad)
  • hubAngle: 3 angle set for hub orientation (rad), no rotation from spinning

#FIXME: add averaging of orientations to get nodes within blade/strut

OWENSOpenFASTWrappers.getAD15MeshPosMethod

getAD15MeshPos(turbine,u_j,azi,nacPos,hubPos,hubAngle)

Extract the mesh points for all the AD15 blades ordering here is important 1. root to tip of blades, in blade order 2. root to tip of bottom struts, in blade order 3. root to tip of top struts, in blade order

Inputs

  • turbine: turbine data storage
  • u_j: mesh displacements – in hub coordinates, (m,rad)
  • azi: current azimuth (rad)
  • hubPos: current global hubPos (x,y,z) vector (m)
  • nacPos: current global nacPos (x,y,z) vector (m)
  • hubAngle: 3 angle set for hub orientation (rad) , no rotation from spinning
OWENSOpenFASTWrappers.getAD15MeshVelAccMethod

getAD15MeshVelAcc(turbine,meshPos,udotj,uddotj,azi,Omegarad,OmegaDotrad,nacPos,hubPos,hubAngle,hubVel,hubAcc)

Extract the mesh velocities and accelerations for all the AD15 blades ordering here is important 1. root to tip of blades, in blade order 2. root to tip of bottom struts, in blade order 3. root to tip of top struts, in blade order

Inputs

  • turbine: turbine data storage
  • rootPos: root positions from call to getAD15MeshPos
  • u_j: mesh displacements – in hub coordinates, (m,rad)
  • udot_j: mesh velocity – in hub coordinates, (m/s,rad/s)
  • uddot_j: mesh velocity – in hub coordinates, (m/s,rad/s)
  • azi: current azimuth (rad)
  • Omega_rad: angular velocity of hub about hub axis (rad/s)
  • OmegaDot_rad: angular acceleration of hub about hub axis (rad/s^2)
  • hubPos: current global hubPos (x,y,z) vector (m)
  • nacPos: current global nacPos (x,y,z) vector (m)
  • hubAngle: 3 angle set for hub orientation (rad), no rotation from spinning
  • hubVel: hub velocity in global coords (m/s,rad/s), does not include rotational velocity, so this is extra like from a platform
  • hubAcc: hub acceleration in global coords (m/s^2,rad/s^2), does not include rotational accel, so this is extra like from a platform
OWENSOpenFASTWrappers.getRootDCMMethod

getRootDCM(turbine,u_j,azi,hubAngle)

Note on angles The OWENSFEA mesh in OWENS uses +X as the blade/strut long axis. In AeroDyn, the blade axis is +Z. So for transforming the blades from OWENSFEA mesh coordinates, first rotate by -90 degrees about Y, then do the 3,2,1 coordinate transforms with (Twist,Theta,Psi) = (Rz,Ry,Rx) = (Yaw,Pitch,Roll) Psid – rotation about Z axis – Yaw (Rz) – degrees Thetad – rotation about Y axis – Pitch (Ry) – degrees Twist_d – rotation about X axis – Roll (Rx) – degrees The rotation sequence is Roll –> Pitch –> Yaw. In rotation matrix form, it is R = RzRyRx (a [3,2,1] matrix order).

Inputs

  • turbine: turbine data storage
  • u_j: mesh displacements – in hub coordinates, (m,rad)
  • azi: current azimuth (rad)
  • hubAngle: 3 angle set for hub orientation (rad), no rotation from spinning

#FIXME: add averaging of orientations to get nodes within blade/strut

OWENSOpenFASTWrappers.getRootPosMethod

getRootPos(turbine,u_j,azi,nacPos,hubPos,hubAngle)

Extract the root positions for all ADI blades

Inputs

  • turbine: turbine data storage
  • u_j: mesh displacements – in hub coordinates, (m,rad)
  • azi: current azimuth (rad)
  • nacPos: current global nacPos (x,y,z) vector (m)
  • hubPos: current global hubPos (x,y,z) vector (m)
  • hubAngle: 3 angle set for hub orientation (rad), no rotation from spinning
OWENSOpenFASTWrappers.getRootVelAccMethod

getRootVelAcc(turbine,rootPos,udotj,uddotj,azi,Omegarad,OmegaDotrad,nacPos,hubPos,hubAngle,hubVel,hubAcc)

Extract the root velocities and accelerations for all ADI blades

Inputs

  • turbine: turbine data storage
  • rootPos: root positions from call to getRootPos
  • azi: current azimuth (rad)
  • Omega_rad: angular velocity of hub about hub axis (rad/s)
  • OmegaDot_rad: angular acceleration of hub about hub axis (rad/s^2)
  • nacPos: current global nacPos (x,y,z) vector (m)
  • hubPos: current global hubPos (x,y,z) vector (m)
  • hubAngle: 3 angle set for hub orientation (rad) , no rotation from spinning
  • hubVel: hub velocity in global coords, 6-vector (m/s,rad/s), does not include rotational velocity, so this is extra like from a platform
  • hubAcc: hub acceleration in global coords, 6-vector (m/s^2,rad/s^2), does not include rotational accel, so this is extra like from a platform
OWENSOpenFASTWrappers.ifwcalcoutputMethod
ifwcalcoutput(position,time)

calls inflow wind clacoutput

Inputs

  • position::Array(float): x, y, z sample position (m)
  • time::float: sample time (s)

Outputs:

  • velocities: x, y, z velocity at sample position
OWENSOpenFASTWrappers.ifwinitMethod
ifwinit(inflowlib_filename ;HWindSpeed=6.87,turbsim_filename="path/test.bts")

calls inflow wind init

Inputs

  • inflowlib_filename::string: path and name of inflow-wind dynamic library
  • HWindSpeed::float: optional, backup steady windspeed (m/s)
  • turbsim_filename::string: path and name of turbsim data e.g. "path/test.bts"

Outputs:

  • none:
OWENSOpenFASTWrappers.setupTurbMethod

setupTurb(adilib,adinputfile,ifwinputfile,adirootname,bldx,bldz,B; rho = 1.225, gravity = 9.80665, defKinVisc = 1.464E-05, defSpdSound = 335.0, defPatm = 103500.0, defPvap = 1700.0, WtrDpth = 0.0, MSL2SWL = 0.0, storeHHVel = 0, #false transposeDCM= 1, #true WrVTK = 2, WrVTKType = 3, VTKNacDim = [-.10 ,-.10 ,-.10 ,.2 ,.2 ,.2], VTKHubRad = 1.0, adinstrut = 2, adidt = 0.05, aditmax = 10, adiwrOuts = 0, adiDT_Outs = 0.0, isHAWT = false, # false: VAWT or cross-flow turbine, true: HAWT numTurbines = 1)

Initializes aerodynamic models and sets up backend persistent memory to simplify intermittent calling within coupled solver loops

Inputs

  • adi_lib: path to adi library (.so, .dylib, .dll)
  • ad_input_file: input file for aerodyn15
  • ifw_input_file: input file for inflow wind
  • adi_rootname: rootname for vtk outputs
  • bld_x: Blade x shape
  • bld_z: Blade z shape
  • B: Number of blades
  • rho: working fluid density (kg/m^3)
  • gravity: Gravitational acceleration (m/s^2)
  • defKinVisc: Kinematic viscosity of working fluid (m^2/s)
  • defSpdSound: Speed of sound in working fluid (m/s)
  • defPatm: Atmospheric pressure (Pa) [used only for an MHK turbine cavitation check]
  • defPvap: Vapour pressure of working fluid (Pa) [used only for an MHK turbine cavitation check]
  • WtrDpth: Water depth (m)
  • MSL2SWL: Offset between still-water level and mean sea level (m) [positive upward]
  • storeHHVel: unused here
  • transposeDCM: 0=false, 1=true transpose DCM internally for calculations
  • WrVTK: write VTK files from adi to directory adi-vtk [0 none, 1 ref, 2 motion]
  • WrVTK_Type: write VTK files from adi to directory adi-vtk [1 surface, 2 lines, 3 both]
  • VTKNacDim: Nacelle Dimension for VTK visualization x0,y0,z0,Lx,Ly,Lz (m)
  • VTKHubRad: HubRadius for VTK visualization (m)
  • adi_wrOuts: file format to write to
  • adi_DT_Outs: output timestep to write at
  • adi_nstrut: createmeshstruts is hard coded for 2 struts per blade
  • adi_dt: timestep
  • adi_tmax: maximum time
  • hubPos: hub position in global coordinates, 3-vector (m). NOTE: AD15 assumes a different hub location than OWENS
  • hubAngle: hub axis angle, 3-vector (deg), no rotation from spinning
  • nacPos: nacelle position in global coordinates, 3-vector (m). NOTE: AD15 assumes a different hub location than OWENS
  • nacAngle: nacelle axis angle, 3-vector (deg)
  • numTurbines: number of turbines
  • isHAWT: # false: VAWT or cross-flow turbine, true: HAWT

Outputs:

  • none:
OWENSOpenFASTWrappers.transMatMethod

transMat(theta1, theta2, theta3)

Internal, computes the 3x3 transformation matrix for given input rotations. The generated matrix is the closest orthonormal matrix to the Bernoulli-Euler transformation matrix from beam theory, which assumes small rotations. A full description of this matrix is found in the "FASTCoordinateSystems.doc" document by Jason Jonkman.

+OWENSOpenFASTWrappers · OWENS.jl

OWENSOpenFASTWrappers

Types and functions

OWENSOpenFASTWrappers.EnvironmentType

Environment(rho::TF1, dt::TF2, steplast::TAI) Environment(rho) = Environment(rho)

Contains specications for turbine environment/operating conditions as well as some backend memory

Inputs

  • rho::TF1: Working fluid density (kg/m^3)
  • dt::TF2: timestep for ADI
  • num_channels::TI1: number of output channels from AD15
  • steplast::TAI: prior simulation step index, used for unsteady wake propogation

Outputs:

  • none:
OWENSOpenFASTWrappers.StructureType

Structure

Contains the position and orientation info passed to AD15. These positions are all in global and include the turbine RefPos.

Inputs:

  • hubPos::TAF1:
  • hubOrient::TAF2:
  • hubVel::TAF3:
  • hubAcc::TAF4:
  • nacPos::TAF5:
  • nacOrient::TAF6:
  • nacVel::TAF7:
  • nacAcc::TAF8:
  • rootPos::TAF9:
  • rootOrient::TAF10:
  • rootVel::TAF11:
  • rootAcc::TAF12:
  • meshPos::TAF13:
  • meshOrient::TAF14:
  • meshVel::TAF15:
  • meshAcc::TAF16:

Outputs:

  • none:
OWENSOpenFASTWrappers.adiCalcOutputMethod
adiCalcOutput( )

calls AeroDynInflowC_CalcOutput to calculate resulting loads. Call this only after SetRotorMotion on all rotors/turbines.

Inputs:

time::c_double: current timestep

  • num_channels::int: number of output channels
OWENSOpenFASTWrappers.adiGetRotorLoadsMethod
adiGetRotorLoads(iturb; )

Gets the loads for a single turbine rotor

Inputs:

  • iturb::int: required, current turbine number

Outputs:

  • meshFrcMom::Array(float): loads from ADI at mesh nodes
OWENSOpenFASTWrappers.adiInitMethod
adiInit( output_root_name ; )

calls aerodyninflowinit to initialize AeroDyn and InflowWind together

Inputs:

  • ad_input_file_passed::int: flag to indicate the AD15 input file is passed as a string 0=false, 1=true (set to false if passing input file name instead, NOT SUPPORTED YET)

  • ad_input_file::string: name of input file for AD15 – this is read by julia and passed to AD15

  • ifw_input_file_passed::int: flag to indicate the InflowWind input file is passed as a string 0=false, 1=true (set to false if passing input file name instead, NOT SUPPORTED YET)

  • ifw_input_file::string: name of input file for InflowWind – this is read by julia and passed to InflowWind

  • gravity::float: optional, gravity value (default: 9.80665 m/s^2)

  • defFldDens::float: optional, air density (default: 1.225 kg/m^3)

  • defKinVisc::float: optional, kinematic viscosity of working fluid (default: 1.464E-05 m^2/s)

  • defSpdSound::float: optional, speed of sound in working fluid (default: 335.0 m/s)

  • defPatm::float: optional, atmospheric pressure (default: 103500.0 Pa) [used only for an MHK turbine cavitation check]

  • defPvap::float: optional, vapour pressure of working fluid (default: 1700.0 Pa) [used only for an MHK turbine cavitation check]

  • WtrDpth::float: optional, water depth (default: 0.0 m) [used only for an MHK turbine]

  • MSL2SWL::float: optional, offset between still-water level and mean sea level (default: 0.0 m) [positive upward, used only for an MHK turbine]

  • storeHHVel::int: optional, internal parameter for adi_library. Exposed for convenience, but not needed. [0=false, 1=true]

  • WrVTK::int: optional, write VTK output files at all timesteps to visualize AeroDyn 15 meshes [0 none (default), 1 ref, 2 motion]

  • WrVTK_Type::int: optional, write VTK output files as [1 surfaces (default), 2 lines, 3 both]

  • VTKNacDim::Array(float*6) optional, Nacelle Dimension for VTK visualization x0,y0,z0,Lx,Ly,Lz (m)

  • VTKHubRad::float: optional, HubRadius for VTK visualization (m)

  • wrOuts::int: optional, file format for writing outputs [0 none (default), 1 txt, 2 binary, 3 both]

  • DT_Outs::float64: optional, timestep for outputs to file [0.0 (default) for every timestep]

  • interp_order::int: optional, interpolation order used internally [1 first order (default), 2 second order]

  • dt::float64: required, timestep for AD15 (needed for setting internal constants)

  • t_max::float: required, total expected simulation time – used only for setting VTK counter width

Outputs:

  • num_channels::int: number of output channels
  • channel_names::string: string of output channel names from ADI
  • channel_units::string: string of output channel units from ADI
OWENSOpenFASTWrappers.adiPreInitMethod
adiPreInit(adilib_filename numTurbines transposeDCM)

Does some pre-initializing of the ADI library to setup arrays for each turbine

Inputs:

  • adilib_filename::string: path and name of AeroDyn-Inflow dynamic library
  • numTurbines::int: required, number of turbines to setup ADI to handle
  • transposeDCM::int: required, transpose DCM internally in ADI to match calling code convention for direction cosine matrices (default: 1==true)
OWENSOpenFASTWrappers.adiSetRotorMotionMethod
adiSetRotorMotion(iturb; )

Sets the motions for a single turbine rotor

Inputs:

  • iturb::int: required, current turbine number

  • HubPos::Array(float): required, (x,y,z) position of hub

  • HubOrient::Array(float): required, orientation of hub as 9 element vector of flattened DCM

  • HubVel::Array(float): required, (TVx,TVy,TVz,RVx,RVy,RVz) velocity of hub, does not include rotational velocity, so this is extra like from a platform

  • HubAcc::Array(float): required, (TAx,TAy,TAz,RAx,RAy,RAz) acceleration of hub, does not include rotational accel, so this is extra like from a platform

  • NacPos::Array(float): required, (x,y,z) position of nacelle

  • NacOrient::Array(float): required, orientation of nacelle as 9 element vector of flattened DCM

  • NacVel::Array(float): required, (TVx,TVy,TVz,RVx,RVy,RVz) velocity of nacelle

  • NacAcc::Array(float): required, (TAx,TAy,TAz,RAx,RAy,RAz) acceleration of nacelle

  • RootPos::Array(float): required, size (numBlades,3) position vectors of roots

  • RootOrient::Array(float): required, size (numBlades,9) orientation DCMs flattened to array of 9 element vectors

  • RootVel::Array(float): required, size (numBlades,6) velocity vectors of roots

  • RootAcc::Array(float): required, size (numBlades,6) acceleration vectors of roots

  • numMeshNodes::Array(int): required, number of structural mesh points (total across all blades)

  • MeshPos::Array(float): required, size (sum(numMeshNodes),3) position vectors of mesh points

  • MeshOrient::Array(float): required, size (sum(numMeshNodes),9) orientation DCMs flattened to array of 9 element vectors

  • MeshVel::Array(float): required, size (sum(numMeshNodes),6) velocity vectors of mesh points

  • MeshAcc::Array(float): required, size (sum(numMeshNodes),6) acceleration vectors of mesh points

Outputs:

  • none:
OWENSOpenFASTWrappers.adiSetupRotorMethod
adiSetupRotor(iturb; )

Sets the initial locations of a single rotor (root orientations/positions etc)

Inputs:

  • iturb::int: required, current turbine number

  • isHAWT::bool: required, false: VAWT or cross-flow turbine, true: HAWT

  • intTurbPos::Array(float): required, (x,y,z) position of turbine

  • initHubPos::Array(float): required, (x,y,z) position of hub

  • initHubOrient::Array(float): required, orientation of hub as 9 element vector of flattened DCM

  • initNacellePos::Array(float): required, (x,y,z) position of nacelle

  • initNacelleOrient::Array(float): required, orientation of nacelle as 9 element vector of flattened DCM

  • numBlades::int: required, number of blades

  • initRootPos::Array(float): required, size (numBlades,3) position vectors of roots

  • initRootOrient::Array(float): required, size (numBlades,9) orientation DCMs flattened to array of 9 element vectors

  • numMeshNodes::Array(int): required, number of structural mesh points (total across all blades)

  • initMeshPos::Array(float): required, size (sum(numMeshNodes),3) position vectors of mesh points

  • initMeshOrient::Array(float): required, size (sum(numMeshNodes),9) orientation DCMs flattened to array of 9 element vectors

OWENSOpenFASTWrappers.adiUpdateStatesMethod
adiUpdateStates( )

calls AeroDynInflowC_UpdateStates to step ADI forward to the next timestep Call this only after SetRotorMotion on all rotors/turbines.

Inputs:

time::c_double: current timestep

time_next::c_double: next timestep

OWENSOpenFASTWrappers.advanceAD15Method
advanceAD15(t_new;ts=2*pi/(turbine.omega[1]*turbine.ntheta))

Runs a previously initialized aero model (see ?setupTurb) in the unsteady mode (can be repeateadly called, or called for a specific time, or repeatedly called for sections of time)

Inputs

  • t_new::float: new time (s); will run from last time specified from the last call, to the current time specified, or from t=ts if the first time called
  • mesh::: OWENSFEA mesh for the turbine structure
  • azi::: hub azimuth (radians)
  • dt::float: optional timestep

Outputs:

  • n_steps: number timesteps taken
  • Fx: Array(sum(numMeshNodes),ntheta) Turbine Fx (N)
  • Fy: Array(sum(numMeshNodes),ntheta) Turbine Fy (N)
  • Fz: Array(sum(numMeshNodes),ntheta) Turbine Fz (N)
  • Mx: Array(sum(numMeshNodes),ntheta) Turbine Mx (N-m)
  • My: Array(sum(numMeshNodes),ntheta) Turbine My (N-m)
  • Mz: Array(sum(numMeshNodes),ntheta) Turbine Mz (N-m)
OWENSOpenFASTWrappers.createGeneralTransformationMatrixMethod

createGeneralTransformationMatrix(angleArray,axisArray)

Calculates the transformation matrix assocaited with a general Euler rotation sequence.

#Input

  • angleArray: = array of angles for Euler rotation sequence
  • axisArray: = array of axis of rotations for Euler rotation

#Output

  • dcmTotal: = transformation matrix of specified euler rotation sequence
OWENSOpenFASTWrappers.deformAD15Method
deformAD15(u_j,udot_j,uddot_j,azi,Omega_rad,OmegaDot_rad,hubPos,hubAngle,hubVel,hubAcc)

Sets the inputs for AD15.

Inputs

  • u_j: mesh displacements – in hub coordinates, (m,rad)
  • udot_j: mesh velocity – in hub coordinates, (m/s,rad/s)
  • uddot_j: mesh velocity – in hub coordinates, (m/s,rad/s)
  • azi: current azimuth (rad)
  • Omega_rad: angular velocity of hub about hub axis (rad/s)
  • OmegaDot_rad: angular acceleration of hub about hub axis (rad/s^2)
  • hubPos: current global hubPos (x,y,z) vector (m)
  • hubAngle: 3 angle set for hub orientation (rad), no rotation from spinning
  • hubVel: hub velocity in global coords, 6-vector (m/s,rad/s), does not include rotational velocity, so this is extra like from a platform
  • hubAcc: hub acceleration in global coords, 6-vector (m/s^2,rad/s^2), does not include rotational accel, so this is extra like from a platform
OWENSOpenFASTWrappers.frame_convertMethod

frameconvert(initframevals, transmat)

Internal, transfers 6 DOFs element-wise to a new reference frame

Input

  • init_frame_vals::Vector{<:float}: Values in 6 degrees of freedom in the initial reference frame
  • trans_mat::Array{<:float}: Transformation matrix to the output reference frame

Output

  • out_frame_vals: Values in 6 degrees of freedom in the output reference frame
OWENSOpenFASTWrappers.getAD15MeshDCMMethod

getAD15MeshDCM(turbine,u_j,azi,hubAngle)

Extract the mesh points orientations for all the AD15 blades ordering here is important 1. root to tip of blades, in blade order 2. root to tip of bottom struts, in blade order 3. root to tip of top struts, in blade order

Inputs

  • turbine: turbine data storage
  • u_j: mesh displacements – in hub coordinates, (m,rad)
  • azi: current azimuth (rad)
  • hubAngle: 3 angle set for hub orientation (rad), no rotation from spinning

#FIXME: add averaging of orientations to get nodes within blade/strut

OWENSOpenFASTWrappers.getAD15MeshPosMethod

getAD15MeshPos(turbine,u_j,azi,nacPos,hubPos,hubAngle)

Extract the mesh points for all the AD15 blades ordering here is important 1. root to tip of blades, in blade order 2. root to tip of bottom struts, in blade order 3. root to tip of top struts, in blade order

Inputs

  • turbine: turbine data storage
  • u_j: mesh displacements – in hub coordinates, (m,rad)
  • azi: current azimuth (rad)
  • hubPos: current global hubPos (x,y,z) vector (m)
  • nacPos: current global nacPos (x,y,z) vector (m)
  • hubAngle: 3 angle set for hub orientation (rad) , no rotation from spinning
OWENSOpenFASTWrappers.getAD15MeshVelAccMethod

getAD15MeshVelAcc(turbine,meshPos,udotj,uddotj,azi,Omegarad,OmegaDotrad,nacPos,hubPos,hubAngle,hubVel,hubAcc)

Extract the mesh velocities and accelerations for all the AD15 blades ordering here is important 1. root to tip of blades, in blade order 2. root to tip of bottom struts, in blade order 3. root to tip of top struts, in blade order

Inputs

  • turbine: turbine data storage
  • rootPos: root positions from call to getAD15MeshPos
  • u_j: mesh displacements – in hub coordinates, (m,rad)
  • udot_j: mesh velocity – in hub coordinates, (m/s,rad/s)
  • uddot_j: mesh velocity – in hub coordinates, (m/s,rad/s)
  • azi: current azimuth (rad)
  • Omega_rad: angular velocity of hub about hub axis (rad/s)
  • OmegaDot_rad: angular acceleration of hub about hub axis (rad/s^2)
  • hubPos: current global hubPos (x,y,z) vector (m)
  • nacPos: current global nacPos (x,y,z) vector (m)
  • hubAngle: 3 angle set for hub orientation (rad), no rotation from spinning
  • hubVel: hub velocity in global coords (m/s,rad/s), does not include rotational velocity, so this is extra like from a platform
  • hubAcc: hub acceleration in global coords (m/s^2,rad/s^2), does not include rotational accel, so this is extra like from a platform
OWENSOpenFASTWrappers.getRootDCMMethod

getRootDCM(turbine,u_j,azi,hubAngle)

Note on angles The OWENSFEA mesh in OWENS uses +X as the blade/strut long axis. In AeroDyn, the blade axis is +Z. So for transforming the blades from OWENSFEA mesh coordinates, first rotate by -90 degrees about Y, then do the 3,2,1 coordinate transforms with (Twist,Theta,Psi) = (Rz,Ry,Rx) = (Yaw,Pitch,Roll) Psid – rotation about Z axis – Yaw (Rz) – degrees Thetad – rotation about Y axis – Pitch (Ry) – degrees Twist_d – rotation about X axis – Roll (Rx) – degrees The rotation sequence is Roll –> Pitch –> Yaw. In rotation matrix form, it is R = RzRyRx (a [3,2,1] matrix order).

Inputs

  • turbine: turbine data storage
  • u_j: mesh displacements – in hub coordinates, (m,rad)
  • azi: current azimuth (rad)
  • hubAngle: 3 angle set for hub orientation (rad), no rotation from spinning

#FIXME: add averaging of orientations to get nodes within blade/strut

OWENSOpenFASTWrappers.getRootPosMethod

getRootPos(turbine,u_j,azi,nacPos,hubPos,hubAngle)

Extract the root positions for all ADI blades

Inputs

  • turbine: turbine data storage
  • u_j: mesh displacements – in hub coordinates, (m,rad)
  • azi: current azimuth (rad)
  • nacPos: current global nacPos (x,y,z) vector (m)
  • hubPos: current global hubPos (x,y,z) vector (m)
  • hubAngle: 3 angle set for hub orientation (rad), no rotation from spinning
OWENSOpenFASTWrappers.getRootVelAccMethod

getRootVelAcc(turbine,rootPos,udotj,uddotj,azi,Omegarad,OmegaDotrad,nacPos,hubPos,hubAngle,hubVel,hubAcc)

Extract the root velocities and accelerations for all ADI blades

Inputs

  • turbine: turbine data storage
  • rootPos: root positions from call to getRootPos
  • azi: current azimuth (rad)
  • Omega_rad: angular velocity of hub about hub axis (rad/s)
  • OmegaDot_rad: angular acceleration of hub about hub axis (rad/s^2)
  • nacPos: current global nacPos (x,y,z) vector (m)
  • hubPos: current global hubPos (x,y,z) vector (m)
  • hubAngle: 3 angle set for hub orientation (rad) , no rotation from spinning
  • hubVel: hub velocity in global coords, 6-vector (m/s,rad/s), does not include rotational velocity, so this is extra like from a platform
  • hubAcc: hub acceleration in global coords, 6-vector (m/s^2,rad/s^2), does not include rotational accel, so this is extra like from a platform
OWENSOpenFASTWrappers.ifwcalcoutputMethod
ifwcalcoutput(position,time)

calls inflow wind clacoutput

Inputs

  • position::Array(float): x, y, z sample position (m)
  • time::float: sample time (s)

Outputs:

  • velocities: x, y, z velocity at sample position
OWENSOpenFASTWrappers.ifwinitMethod
ifwinit(inflowlib_filename ;HWindSpeed=6.87,turbsim_filename="path/test.bts")

calls inflow wind init

Inputs

  • inflowlib_filename::string: path and name of inflow-wind dynamic library
  • HWindSpeed::float: optional, backup steady windspeed (m/s)
  • turbsim_filename::string: path and name of turbsim data e.g. "path/test.bts"

Outputs:

  • none:
OWENSOpenFASTWrappers.setupTurbMethod

setupTurb(adilib,adinputfile,ifwinputfile,adirootname,bldx,bldz,B; rho = 1.225, gravity = 9.80665, defKinVisc = 1.464E-05, defSpdSound = 335.0, defPatm = 103500.0, defPvap = 1700.0, WtrDpth = 0.0, MSL2SWL = 0.0, storeHHVel = 0, #false transposeDCM= 1, #true WrVTK = 2, WrVTKType = 3, VTKNacDim = [-.10 ,-.10 ,-.10 ,.2 ,.2 ,.2], VTKHubRad = 1.0, adinstrut = 2, adidt = 0.05, aditmax = 10, adiwrOuts = 0, adiDT_Outs = 0.0, isHAWT = false, # false: VAWT or cross-flow turbine, true: HAWT numTurbines = 1)

Initializes aerodynamic models and sets up backend persistent memory to simplify intermittent calling within coupled solver loops

Inputs

  • adi_lib: path to adi library (.so, .dylib, .dll)
  • ad_input_file: input file for aerodyn15
  • ifw_input_file: input file for inflow wind
  • adi_rootname: rootname for vtk outputs
  • bld_x: Blade x shape
  • bld_z: Blade z shape
  • B: Number of blades
  • rho: working fluid density (kg/m^3)
  • gravity: Gravitational acceleration (m/s^2)
  • defKinVisc: Kinematic viscosity of working fluid (m^2/s)
  • defSpdSound: Speed of sound in working fluid (m/s)
  • defPatm: Atmospheric pressure (Pa) [used only for an MHK turbine cavitation check]
  • defPvap: Vapour pressure of working fluid (Pa) [used only for an MHK turbine cavitation check]
  • WtrDpth: Water depth (m)
  • MSL2SWL: Offset between still-water level and mean sea level (m) [positive upward]
  • storeHHVel: unused here
  • transposeDCM: 0=false, 1=true transpose DCM internally for calculations
  • WrVTK: write VTK files from adi to directory adi-vtk [0 none, 1 ref, 2 motion]
  • WrVTK_Type: write VTK files from adi to directory adi-vtk [1 surface, 2 lines, 3 both]
  • VTKNacDim: Nacelle Dimension for VTK visualization x0,y0,z0,Lx,Ly,Lz (m)
  • VTKHubRad: HubRadius for VTK visualization (m)
  • adi_wrOuts: file format to write to
  • adi_DT_Outs: output timestep to write at
  • adi_nstrut: createmeshstruts is hard coded for 2 struts per blade
  • adi_dt: timestep
  • adi_tmax: maximum time
  • hubPos: hub position in global coordinates, 3-vector (m). NOTE: AD15 assumes a different hub location than OWENS
  • hubAngle: hub axis angle, 3-vector (deg), no rotation from spinning
  • nacPos: nacelle position in global coordinates, 3-vector (m). NOTE: AD15 assumes a different hub location than OWENS
  • nacAngle: nacelle axis angle, 3-vector (deg)
  • numTurbines: number of turbines
  • isHAWT: # false: VAWT or cross-flow turbine, true: HAWT

Outputs:

  • none:
OWENSOpenFASTWrappers.transMatMethod

transMat(theta1, theta2, theta3)

Internal, computes the 3x3 transformation matrix for given input rotations. The generated matrix is the closest orthonormal matrix to the Bernoulli-Euler transformation matrix from beam theory, which assumes small rotations. A full description of this matrix is found in the "FASTCoordinateSystems.doc" document by Jason Jonkman.

diff --git a/dev/reference/referencePreComp/index.html b/dev/reference/referencePreComp/index.html index 53d680d..f728b8d 100644 --- a/dev/reference/referencePreComp/index.html +++ b/dev/reference/referencePreComp/index.html @@ -13,4 +13,4 @@ n_pliesW::Array{Int64,1}, t_lamW::Array{<:Real,1}, tht_lamW::Array{<:Real,1}, mat_lamW::Array{Int64,1})

Calculates span-variant structural properties for composite blades

Inputs

Outputs:

OWENSPreComp.propertiesMethod
properties(pc_input::Input)

Calculates span-variant structural properties for composite blades. Holds all inputs and outputs to properties function in structs

OWENSPreComp.q_barsMethod
q_bars(mat, thp, density, q11, q22, q12, q66)

Arguments

  • mat: material id
  • thp: ply orientation
  • density:
  • q11:
  • q22:
  • q12:
  • q66:

Outputs

  • qbar11:
  • qbar22:
  • qbar12:
  • qbar16:
  • qbar26:
  • qbar66:
  • rho_m:
OWENSPreComp.readcompositesectionMethod

readcompositesection(fname::String,locw::Array{Float64,1})

Reads a composite section input file. Returns locU, nlaminaU, npliesU, tU, thetaU, matidxU, locL, nlaminaL, npliesL, tL, thetaL, matidxL, locW, nlaminaW, npliesW, tW, thetaW, mat_idxW

OWENSPreComp.readmainMethod

readmain("fname::String")

Reads a main OWENSPreComp input file. Returns sloc,leloc,chord,twaero,afshapefile,intstrfile, ibspstn,obspstn,ibchloc,obchloc

OWENSPreComp.readmaterialsFunction

readmaterials(fname = "materials.inp")

reads material properties from OWENSPreComp materials input file fname returns e1,e2,g12,nu12,rho,name

OWENSPreComp.readprecompprofileMethod

readprecompprofile(filename::String) Reads precomp profile file. Returns xu, yu, xl, yl

OWENSPreComp.readprofileMethod

readprofile(filename::String, numHeaderlines::Int64, LEtoLE::Bool) Reads precomp profile file. Returns xu, yu, xl, yl

OWENSPreComp.readsectorsfromfileMethod

readsectorsfromfile(f::IOStream, n_sector::Int64)

Reads OWENSPreComp sector. Returns nlamina,nplies, t, theta, mat_idx

OWENSPreComp.seg_infoMethod
seg_info(ch, rle, nseg, nseg_u, nseg_p, xnode_u, ynode_u,
 xnode_l, ynode_l, ndl1, ndu1, loc_web, weby_u, weby_l, n_scts,
-xsec_node)

NOTE: coord transformation from xaf-yaf to yre-zref and seg info

OWENSPreComp.tw_rateMethod
tw_rate(naf, sloc, tw_aero)

Arguments

  • naf: no of blade stations
  • sloc: vector of station locations
  • tw_aero_d: vector of twist distribution in degrees

Outputs

  • th_prime_d: vector of twist rates in degrees
+xsec_node)

NOTE: coord transformation from xaf-yaf to yre-zref and seg info

OWENSPreComp.tw_rateMethod
tw_rate(naf, sloc, tw_aero)

Arguments

  • naf: no of blade stations
  • sloc: vector of station locations
  • tw_aero_d: vector of twist distribution in degrees

Outputs

  • th_prime_d: vector of twist rates in degrees