From e222e53e292410a894722618a1a388f26744e58e Mon Sep 17 00:00:00 2001 From: "Documenter.jl" Date: Fri, 14 Jun 2024 23:40:19 +0000 Subject: [PATCH] build based on a8400ee --- dev/.documenter-siteinfo.json | 2 +- dev/FramesOfReference/index.html | 2 +- dev/OWENS_Dev_Guide/index.html | 2 +- dev/VAWTGenUserGuide/index.html | 2 +- dev/examples/A_simplyRunningOWENS.ipynb | 4 +- dev/examples/A_simplyRunningOWENS/index.html | 2 +- dev/examples/B_detailedInputs.ipynb | 10 +-- dev/examples/B_detailedInputs.jl | 6 +- dev/examples/B_detailedInputs/index.html | 8 +- .../C_customizablePreprocessing.ipynb | 82 +++++++++--------- dev/examples/C_customizablePreprocessing.jl | 24 ++--- .../C_customizablePreprocessing/index.html | 26 +++--- dev/index.html | 2 +- dev/legacyUserGuide/index.html | 2 +- dev/literate/B_detailedInputs.jl | 6 +- dev/literate/C_customizablePreprocessing.jl | 24 ++--- dev/objects.inv | Bin 3753 -> 3768 bytes dev/reference/reference/index.html | 25 +++++- dev/search_index.js | 2 +- dev/setup/index.html | 2 +- 20 files changed, 126 insertions(+), 107 deletions(-) diff --git a/dev/.documenter-siteinfo.json b/dev/.documenter-siteinfo.json index aed83161..22e59515 100644 --- a/dev/.documenter-siteinfo.json +++ b/dev/.documenter-siteinfo.json @@ -1 +1 @@ -{"documenter":{"julia_version":"1.10.3","generation_timestamp":"2024-05-07T19:49:23","documenter_version":"1.4.1"}} \ No newline at end of file +{"documenter":{"julia_version":"1.10.4","generation_timestamp":"2024-06-14T23:40:00","documenter_version":"1.4.1"}} \ No newline at end of file diff --git a/dev/FramesOfReference/index.html b/dev/FramesOfReference/index.html index 39e5744a..5ce4db0a 100644 --- a/dev/FramesOfReference/index.html +++ b/dev/FramesOfReference/index.html @@ -1,2 +1,2 @@ -Frames of Reference · 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]

+Frames of Reference · 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 abd1aebf..bc3dc901 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.

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

Mooring

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.

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

Mooring

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 0ebf3750..f2997bf5 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 c88bda24..22e08cd3 100644 --- a/dev/examples/A_simplyRunningOWENS.ipynb +++ b/dev/examples/A_simplyRunningOWENS.ipynb @@ -203,11 +203,11 @@ "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", - "version": "1.10.3" + "version": "1.10.4" }, "kernelspec": { "name": "julia-1.10", - "display_name": "Julia 1.10.3", + "display_name": "Julia 1.10.4", "language": "julia" } }, diff --git a/dev/examples/A_simplyRunningOWENS/index.html b/dev/examples/A_simplyRunningOWENS/index.html index f0d3916e..fae25d2d 100644 --- a/dev/examples/A_simplyRunningOWENS/index.html +++ b/dev/examples/A_simplyRunningOWENS/index.html @@ -8,4 +8,4 @@ OWENS.runOWENS(Inp,runpath)
3-element Vector{Float64}:
  1.0
  2.0
- 3.0

This page was generated using Literate.jl.

+ 3.0

This page was generated using Literate.jl.

diff --git a/dev/examples/B_detailedInputs.ipynb b/dev/examples/B_detailedInputs.ipynb index 9ff66e5f..078ab2dd 100644 --- a/dev/examples/B_detailedInputs.ipynb +++ b/dev/examples/B_detailedInputs.ipynb @@ -109,8 +109,8 @@ "R = Blade_Radius#177.2022*0.3048 #m\n", "H = Blade_Height#1.02*R*2 #m\n", "\n", - "shapeY = collect(LinRange(0,H,Nslices+1))\n", - "shapeX = R.*(1.0.-4.0.*(shapeY/H.-.5).^2)#shapeX_spline(shapeY)\n", + "shapeZ = collect(LinRange(0,H,Nslices+1))\n", + "shapeX = R.*(1.0.-4.0.*(shapeZ/H.-.5).^2)#shapeX_spline(shapeZ)\n", "\n", "nothing" ], @@ -156,7 +156,7 @@ " B,\n", " H,\n", " R,\n", - " shapeY,\n", + " shapeZ,\n", " shapeX,\n", " ifw,\n", " WindType,\n", @@ -528,11 +528,11 @@ "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", - "version": "1.10.3" + "version": "1.10.4" }, "kernelspec": { "name": "julia-1.10", - "display_name": "Julia 1.10.3", + "display_name": "Julia 1.10.4", "language": "julia" } }, diff --git a/dev/examples/B_detailedInputs.jl b/dev/examples/B_detailedInputs.jl index bb4a3295..1825abb3 100644 --- a/dev/examples/B_detailedInputs.jl +++ b/dev/examples/B_detailedInputs.jl @@ -53,8 +53,8 @@ B = Nbld R = Blade_Radius#177.2022*0.3048 #m H = Blade_Height#1.02*R*2 #m -shapeY = collect(LinRange(0,H,Nslices+1)) -shapeX = R.*(1.0.-4.0.*(shapeY/H.-.5).^2)#shapeX_spline(shapeY) +shapeZ = collect(LinRange(0,H,Nslices+1)) +shapeX = R.*(1.0.-4.0.*(shapeZ/H.-.5).^2)#shapeX_spline(shapeZ) nothing @@ -72,7 +72,7 @@ mass_breakout_blds,mass_breakout_twr,system,assembly,sections,AD15bldNdIdxRng, A B, H, R, - shapeY, + shapeZ, shapeX, ifw, WindType, diff --git a/dev/examples/B_detailedInputs/index.html b/dev/examples/B_detailedInputs/index.html index 12f89b35..5768836e 100644 --- a/dev/examples/B_detailedInputs/index.html +++ b/dev/examples/B_detailedInputs/index.html @@ -50,8 +50,8 @@ R = Blade_Radius#177.2022*0.3048 #m H = Blade_Height#1.02*R*2 #m -shapeY = collect(LinRange(0,H,Nslices+1)) -shapeX = R.*(1.0.-4.0.*(shapeY/H.-.5).^2)#shapeX_spline(shapeY) +shapeZ = collect(LinRange(0,H,Nslices+1)) +shapeX = R.*(1.0.-4.0.*(shapeZ/H.-.5).^2)#shapeX_spline(shapeZ) nothing

Call the helper function that builds the mesh, calculates the sectional properties, and aligns the sectional properties to the mesh elements,

mymesh,myel,myort,myjoint,sectionPropsArray,mass_twr, mass_bld,
 stiff_twr, stiff_bld,bld_precompinput,
@@ -67,7 +67,7 @@
     B,
     H,
     R,
-    shapeY,
+    shapeZ,
     shapeX,
     ifw,
     WindType,
@@ -253,4 +253,4 @@
 Minimum Safety Factor on tower Surface: 27.658473494832347
 At time 0.064s at composite station 6 of 21 at lam 1 of 1
 Maximum Damage per hr: 0.10909090909654291
-At composite station 7 of 21 at lam 1 of 1

This page was generated using Literate.jl.

+At composite station 7 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 e6607152..55f3f417 100644 --- a/dev/examples/C_customizablePreprocessing.ipynb +++ b/dev/examples/C_customizablePreprocessing.ipynb @@ -46,7 +46,7 @@ "\n", " package | build\n", " ---------------------------|-----------------\n", - " alsa-lib-1.2.11 | hd590300_1 542 KB conda-forge\n", + " alsa-lib-1.2.12 | h4ab18f5_0 543 KB conda-forge\n", " attr-2.5.1 | h166bdaf_1 69 KB conda-forge\n", " brotli-1.1.0 | hd590300_1 19 KB conda-forge\n", " brotli-bin-1.1.0 | hd590300_1 19 KB conda-forge\n", @@ -62,16 +62,16 @@ " fontconfig-2.14.2 | h14ed4e7_0 266 KB conda-forge\n", " fonts-conda-ecosystem-1 | 0 4 KB conda-forge\n", " fonts-conda-forge-1 | 0 4 KB conda-forge\n", - " fonttools-4.51.0 | py310h2372a71_0 2.2 MB conda-forge\n", + " fonttools-4.53.0 | py310hc51659f_0 2.2 MB conda-forge\n", " freetype-2.12.1 | h267a509_2 620 KB conda-forge\n", " gettext-0.22.5 | h59595ed_2 464 KB conda-forge\n", " gettext-tools-0.22.5 | h59595ed_2 2.6 MB conda-forge\n", - " glib-2.80.0 | hf2295e7_6 584 KB conda-forge\n", - " glib-tools-2.80.0 | hde27a5a_6 110 KB conda-forge\n", + " glib-2.80.2 | hf974151_0 586 KB conda-forge\n", + " glib-tools-2.80.2 | hb6ce0ca_0 112 KB conda-forge\n", " graphite2-1.3.13 | h59595ed_1003 95 KB conda-forge\n", - " gst-plugins-base-1.24.3 | h9ad1361_0 2.7 MB conda-forge\n", - " gstreamer-1.24.3 | haf2f30d_0 1.9 MB conda-forge\n", - " harfbuzz-8.4.0 | h3d44ed6_0 1.5 MB conda-forge\n", + " gst-plugins-base-1.24.4 | h9ad1361_0 2.7 MB conda-forge\n", + " gstreamer-1.24.4 | haf2f30d_0 1.9 MB conda-forge\n", + " harfbuzz-8.5.0 | hfac3d4d_0 1.5 MB conda-forge\n", " kiwisolver-1.4.5 | py310hd41b1e2_1 71 KB conda-forge\n", " lame-3.100 | h166bdaf_1003 496 KB conda-forge\n", " lcms2-2.16 | hb7c19ff_0 239 KB conda-forge\n", @@ -92,7 +92,7 @@ " libgcrypt-1.10.3 | hd590300_0 620 KB conda-forge\n", " libgettextpo-0.22.5 | h59595ed_2 167 KB conda-forge\n", " libgettextpo-devel-0.22.5 | h59595ed_2 36 KB conda-forge\n", - " libglib-2.80.0 | hf2295e7_6 3.8 MB conda-forge\n", + " libglib-2.80.2 | hf974151_0 3.7 MB conda-forge\n", " libgpg-error-1.49 | h4f305b6_0 257 KB conda-forge\n", " libjpeg-turbo-3.0.0 | hd590300_1 604 KB conda-forge\n", " libllvm15-15.0.7 | hb3ce162_4 31.8 MB conda-forge\n", @@ -100,7 +100,7 @@ " libogg-1.3.4 | h7f98852_1 206 KB conda-forge\n", " libopus-1.3.1 | h7f98852_1 255 KB conda-forge\n", " libpng-1.6.43 | h2797004_0 281 KB conda-forge\n", - " libpq-16.2 | h33b98f1_1 2.5 MB conda-forge\n", + " libpq-16.3 | ha72fbe1_0 2.4 MB conda-forge\n", " libsndfile-1.2.2 | hc60ed4a_1 346 KB conda-forge\n", " libsystemd0-255 | h3516f8a_1 393 KB conda-forge\n", " libtiff-4.6.0 | h1dd3fc0_3 276 KB conda-forge\n", @@ -108,8 +108,8 @@ " libwebp-base-1.4.0 | hd590300_0 429 KB conda-forge\n", " libxcb-1.15 | h0b41bf4_0 375 KB conda-forge\n", " libxkbcommon-1.7.0 | h662e7e4_0 580 KB conda-forge\n", - " matplotlib-3.8.4 | py310hff52083_0 8 KB conda-forge\n", - " matplotlib-base-3.8.4 | py310h62c0568_0 6.7 MB conda-forge\n", + " matplotlib-3.8.4 | py310hff52083_2 8 KB conda-forge\n", + " matplotlib-base-3.8.4 | py310hef631a5_2 6.5 MB conda-forge\n", " mpg123-1.32.6 | h59595ed_0 480 KB conda-forge\n", " munkres-1.1.4 | pyh9f0ad1d_0 12 KB conda-forge\n", " mysql-common-8.3.0 | hf1915f5_4 766 KB conda-forge\n", @@ -132,14 +132,14 @@ " six-1.16.0 | pyh6c4a22f_0 14 KB conda-forge\n", " toml-0.10.2 | pyhd8ed1ab_0 18 KB conda-forge\n", " tomli-2.0.1 | pyhd8ed1ab_0 16 KB conda-forge\n", - " tornado-6.4 | py310h2372a71_0 636 KB conda-forge\n", + " tornado-6.4.1 | py310hc51659f_0 637 KB conda-forge\n", " unicodedata2-15.1.0 | py310h2372a71_0 365 KB conda-forge\n", " xcb-util-0.4.0 | hd590300_1 19 KB conda-forge\n", " xcb-util-image-0.4.0 | h8ee46fc_1 24 KB conda-forge\n", " xcb-util-keysyms-0.4.0 | h8ee46fc_1 14 KB conda-forge\n", " xcb-util-renderutil-0.3.9 | hd590300_1 17 KB conda-forge\n", " xcb-util-wm-0.4.1 | h8ee46fc_1 51 KB conda-forge\n", - " xkeyboard-config-2.41 | hd590300_0 877 KB conda-forge\n", + " xkeyboard-config-2.42 | h4ab18f5_0 380 KB conda-forge\n", " xorg-kbproto-1.0.7 | h7f98852_1002 27 KB conda-forge\n", " xorg-libice-1.1.1 | hd590300_0 57 KB conda-forge\n", " xorg-libsm-1.2.4 | h7391055_0 27 KB conda-forge\n", @@ -154,11 +154,11 @@ " xorg-xproto-7.0.31 | h7f98852_1007 73 KB conda-forge\n", " zlib-1.2.13 | hd590300_5 91 KB conda-forge\n", " ------------------------------------------------------------\n", - " Total: 253.0 MB\n", + " Total: 252.3 MB\n", "\n", "The following NEW packages will be INSTALLED:\n", "\n", - " alsa-lib conda-forge/linux-64::alsa-lib-1.2.11-hd590300_1 \n", + " alsa-lib conda-forge/linux-64::alsa-lib-1.2.12-h4ab18f5_0 \n", " attr conda-forge/linux-64::attr-2.5.1-h166bdaf_1 \n", " brotli conda-forge/linux-64::brotli-1.1.0-hd590300_1 \n", " brotli-bin conda-forge/linux-64::brotli-bin-1.1.0-hd590300_1 \n", @@ -174,16 +174,16 @@ " fontconfig conda-forge/linux-64::fontconfig-2.14.2-h14ed4e7_0 \n", " fonts-conda-ecosy~ conda-forge/noarch::fonts-conda-ecosystem-1-0 \n", " fonts-conda-forge conda-forge/noarch::fonts-conda-forge-1-0 \n", - " fonttools conda-forge/linux-64::fonttools-4.51.0-py310h2372a71_0 \n", + " fonttools conda-forge/linux-64::fonttools-4.53.0-py310hc51659f_0 \n", " freetype conda-forge/linux-64::freetype-2.12.1-h267a509_2 \n", " gettext conda-forge/linux-64::gettext-0.22.5-h59595ed_2 \n", " gettext-tools conda-forge/linux-64::gettext-tools-0.22.5-h59595ed_2 \n", - " glib conda-forge/linux-64::glib-2.80.0-hf2295e7_6 \n", - " glib-tools conda-forge/linux-64::glib-tools-2.80.0-hde27a5a_6 \n", + " glib conda-forge/linux-64::glib-2.80.2-hf974151_0 \n", + " glib-tools conda-forge/linux-64::glib-tools-2.80.2-hb6ce0ca_0 \n", " graphite2 conda-forge/linux-64::graphite2-1.3.13-h59595ed_1003 \n", - " gst-plugins-base conda-forge/linux-64::gst-plugins-base-1.24.3-h9ad1361_0 \n", - " gstreamer conda-forge/linux-64::gstreamer-1.24.3-haf2f30d_0 \n", - " harfbuzz conda-forge/linux-64::harfbuzz-8.4.0-h3d44ed6_0 \n", + " gst-plugins-base conda-forge/linux-64::gst-plugins-base-1.24.4-h9ad1361_0 \n", + " gstreamer conda-forge/linux-64::gstreamer-1.24.4-haf2f30d_0 \n", + " harfbuzz conda-forge/linux-64::harfbuzz-8.5.0-hfac3d4d_0 \n", " kiwisolver conda-forge/linux-64::kiwisolver-1.4.5-py310hd41b1e2_1 \n", " lame conda-forge/linux-64::lame-3.100-h166bdaf_1003 \n", " lcms2 conda-forge/linux-64::lcms2-2.16-hb7c19ff_0 \n", @@ -204,7 +204,7 @@ " libgcrypt conda-forge/linux-64::libgcrypt-1.10.3-hd590300_0 \n", " libgettextpo conda-forge/linux-64::libgettextpo-0.22.5-h59595ed_2 \n", " libgettextpo-devel conda-forge/linux-64::libgettextpo-devel-0.22.5-h59595ed_2 \n", - " libglib conda-forge/linux-64::libglib-2.80.0-hf2295e7_6 \n", + " libglib conda-forge/linux-64::libglib-2.80.2-hf974151_0 \n", " libgpg-error conda-forge/linux-64::libgpg-error-1.49-h4f305b6_0 \n", " libjpeg-turbo conda-forge/linux-64::libjpeg-turbo-3.0.0-hd590300_1 \n", " libllvm15 conda-forge/linux-64::libllvm15-15.0.7-hb3ce162_4 \n", @@ -212,7 +212,7 @@ " libogg conda-forge/linux-64::libogg-1.3.4-h7f98852_1 \n", " libopus conda-forge/linux-64::libopus-1.3.1-h7f98852_1 \n", " libpng conda-forge/linux-64::libpng-1.6.43-h2797004_0 \n", - " libpq conda-forge/linux-64::libpq-16.2-h33b98f1_1 \n", + " libpq conda-forge/linux-64::libpq-16.3-ha72fbe1_0 \n", " libsndfile conda-forge/linux-64::libsndfile-1.2.2-hc60ed4a_1 \n", " libsystemd0 conda-forge/linux-64::libsystemd0-255-h3516f8a_1 \n", " libtiff conda-forge/linux-64::libtiff-4.6.0-h1dd3fc0_3 \n", @@ -220,8 +220,8 @@ " libwebp-base conda-forge/linux-64::libwebp-base-1.4.0-hd590300_0 \n", " libxcb conda-forge/linux-64::libxcb-1.15-h0b41bf4_0 \n", " libxkbcommon conda-forge/linux-64::libxkbcommon-1.7.0-h662e7e4_0 \n", - " matplotlib conda-forge/linux-64::matplotlib-3.8.4-py310hff52083_0 \n", - " matplotlib-base conda-forge/linux-64::matplotlib-base-3.8.4-py310h62c0568_0 \n", + " matplotlib conda-forge/linux-64::matplotlib-3.8.4-py310hff52083_2 \n", + " matplotlib-base conda-forge/linux-64::matplotlib-base-3.8.4-py310hef631a5_2 \n", " mpg123 conda-forge/linux-64::mpg123-1.32.6-h59595ed_0 \n", " munkres conda-forge/noarch::munkres-1.1.4-pyh9f0ad1d_0 \n", " mysql-common conda-forge/linux-64::mysql-common-8.3.0-hf1915f5_4 \n", @@ -244,14 +244,14 @@ " six conda-forge/noarch::six-1.16.0-pyh6c4a22f_0 \n", " toml conda-forge/noarch::toml-0.10.2-pyhd8ed1ab_0 \n", " tomli conda-forge/noarch::tomli-2.0.1-pyhd8ed1ab_0 \n", - " tornado conda-forge/linux-64::tornado-6.4-py310h2372a71_0 \n", + " tornado conda-forge/linux-64::tornado-6.4.1-py310hc51659f_0 \n", " unicodedata2 conda-forge/linux-64::unicodedata2-15.1.0-py310h2372a71_0 \n", " xcb-util conda-forge/linux-64::xcb-util-0.4.0-hd590300_1 \n", " xcb-util-image conda-forge/linux-64::xcb-util-image-0.4.0-h8ee46fc_1 \n", " xcb-util-keysyms conda-forge/linux-64::xcb-util-keysyms-0.4.0-h8ee46fc_1 \n", " xcb-util-renderut~ conda-forge/linux-64::xcb-util-renderutil-0.3.9-hd590300_1 \n", " xcb-util-wm conda-forge/linux-64::xcb-util-wm-0.4.1-h8ee46fc_1 \n", - " xkeyboard-config conda-forge/linux-64::xkeyboard-config-2.41-hd590300_0 \n", + " xkeyboard-config conda-forge/linux-64::xkeyboard-config-2.42-h4ab18f5_0 \n", " xorg-kbproto conda-forge/linux-64::xorg-kbproto-1.0.7-h7f98852_1002 \n", " xorg-libice conda-forge/linux-64::xorg-libice-1.1.1-hd590300_0 \n", " xorg-libsm conda-forge/linux-64::xorg-libsm-1.2.4-h7391055_0 \n", @@ -376,8 +376,8 @@ "R = Blade_Radius#177.2022*0.3048 #m\n", "H = Blade_Height#1.02*R*2 #m\n", "\n", - "shapeY = collect(LinRange(0,H,Nslices+1))\n", - "shapeX = R.*(1.0.-4.0.*(shapeY/H.-.5).^2)\n", + "shapeZ = collect(LinRange(0,H,Nslices+1))\n", + "shapeX = R.*(1.0.-4.0.*(shapeZ/H.-.5).^2)\n", "\n", "\n", "stack_layers_bld = nothing\n", @@ -420,7 +420,7 @@ "Nstrutperbld = 2 #TODO: generalize and propogate\n", "\n", "Nbld = B\n", - "H = maximum(shapeY) #m,\n", + "H = maximum(shapeZ) #m,\n", "R = maximum(shapeX) #m,\n", "omega = RPM / 60 * 2 * pi\n", "tsr = omega*R/Vinf\n", @@ -456,7 +456,7 @@ " ncelem,\n", " c_mount_ratio,\n", " bshapex = shapeX, #Blade shape, magnitude is irrelevant, scaled based on height and radius above\n", - " bshapez = shapeY,\n", + " bshapez = shapeZ,\n", " joint_type, #hinged about y axis\n", " cables_connected_to_blade_base,\n", " angularOffset) #Blade shape, magnitude is irrelevant, scaled based on height and radius above\n", @@ -481,7 +481,7 @@ " strut_bld_mountpointbot = strut_mountpointbot, # This puts struts at top and bottom\n", " strut_bld_mountpointtop = strut_mountpointtop, # This puts struts at top and bottom\n", " bshapex = shapeX, #Blade shape, magnitude is irrelevant, scaled based on height and radius above\n", - " bshapez = shapeY,\n", + " bshapez = shapeZ,\n", " bshapey = zeros(nbelem+1), # but magnitude for this is relevant\n", " angularOffset, #Blade shape, magnitude is irrelevant, scaled based on height and radius above\n", " AD15_ccw = true,\n", @@ -872,9 +872,9 @@ " ### translate from blade span to blade height between the numad definition and the vertical slice positions\n", " ### First get the angles from the overall geometry npoints and go to the numad npoints\n", " delta_xs = shapeX[2:end] - shapeX[1:end-1]\n", - " delta_zs = shapeY[2:end] - shapeY[1:end-1]\n", + " delta_zs = shapeZ[2:end] - shapeZ[1:end-1]\n", " delta3D = atan.(delta_xs./delta_zs)\n", - " delta3D_spl = FLOWMath.akima(shapeY[1:end-1]./maximum(shapeY[1:end-1]), delta3D,LinRange(0,1,length(numadIn_bld.span)-1))\n", + " delta3D_spl = FLOWMath.akima(shapeZ[1:end-1]./maximum(shapeZ[1:end-1]), delta3D,LinRange(0,1,length(numadIn_bld.span)-1))\n", "\n", " bld_height_numad = cumsum(diff(numadIn_bld.span).*(1.0.-abs.(sin.(delta3D_spl)))) # now convert the numad span to a height\n", "\n", @@ -889,7 +889,7 @@ " end\n", " end\n", "\n", - " OWENSAero.setupTurb(shapeX,shapeY,B,chord,tsr,Vinf;AModel,DSModel,\n", + " OWENSAero.setupTurb(shapeX,shapeZ,B,chord,tsr,Vinf;AModel,DSModel,\n", " afname = airfoils, #TODO: map to the numad input\n", " rho,\n", " eta,\n", @@ -977,15 +977,15 @@ " bld_len[iADBody] = sqrt((x2-x1)^2+(y2-y1)^2+(z2-z1)^2)\n", "\n", " #Get the blade shape\n", - " ADshapeY = collect(LinRange(0,H,NumADBldNds))\n", + " ADshapeZ = collect(LinRange(0,H,NumADBldNds))\n", " xmesh = mymesh.x[strt_idx:end_idx]\n", " ymesh = mymesh.y[strt_idx:end_idx]\n", " ADshapeX = sqrt.(xmesh.^2 .+ ymesh.^2)\n", " ADshapeX .-= ADshapeX[1] #get it starting at zero #TODO: make robust for blades that don't start at 0\n", - " ADshapeXspl = FLOWMath.akima(LinRange(0,H,length(ADshapeX)),ADshapeX,ADshapeY)\n", + " ADshapeXspl = FLOWMath.akima(LinRange(0,H,length(ADshapeX)),ADshapeX,ADshapeZ)\n", "\n", " if iADBody<=Nbld #Note that the blades can be curved and are assumed to be oriented vertically\n", - " BlSpn=ADshapeY\n", + " BlSpn=ADshapeZ\n", " BlCrvAC=ADshapeXspl\n", " else # while the arms/struts are assumed to be straight and are oriented by the mesh angle\n", " BlSpn=collect(LinRange(0,bld_len[iADBody],blade_Nnodes[iADBody]))\n", @@ -1003,7 +1003,7 @@ "\n", " OWENSOpenFASTWrappers.writeIWfile(Vinf,ifw_input_file;windINPfilename)\n", "\n", - " OWENSOpenFASTWrappers.setupTurb(adi_lib,ad_input_file,ifw_input_file,adi_rootname,[shapeX],[shapeY],[B],[Ht],[mymesh],[myort],[AD15bldNdIdxRng],[AD15bldElIdxRng];\n", + " OWENSOpenFASTWrappers.setupTurb(adi_lib,ad_input_file,ifw_input_file,adi_rootname,[shapeX],[shapeZ],[B],[Ht],[mymesh],[myort],[AD15bldNdIdxRng],[AD15bldElIdxRng];\n", " rho = rho,\n", " adi_dt = delta_t,\n", " adi_tmax= numTS*delta_t,\n", @@ -1254,11 +1254,11 @@ "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", - "version": "1.10.3" + "version": "1.10.4" }, "kernelspec": { "name": "julia-1.10", - "display_name": "Julia 1.10.3", + "display_name": "Julia 1.10.4", "language": "julia" } }, diff --git a/dev/examples/C_customizablePreprocessing.jl b/dev/examples/C_customizablePreprocessing.jl index 4551cf26..cc079307 100644 --- a/dev/examples/C_customizablePreprocessing.jl +++ b/dev/examples/C_customizablePreprocessing.jl @@ -63,8 +63,8 @@ B = Nbld R = Blade_Radius#177.2022*0.3048 #m H = Blade_Height#1.02*R*2 #m -shapeY = collect(LinRange(0,H,Nslices+1)) -shapeX = R.*(1.0.-4.0.*(shapeY/H.-.5).^2) +shapeZ = collect(LinRange(0,H,Nslices+1)) +shapeX = R.*(1.0.-4.0.*(shapeZ/H.-.5).^2) stack_layers_bld = nothing @@ -92,7 +92,7 @@ nothing Nstrutperbld = 2 #TODO: generalize and propogate Nbld = B -H = maximum(shapeY) #m, +H = maximum(shapeZ) #m, R = maximum(shapeX) #m, omega = RPM / 60 * 2 * pi tsr = omega*R/Vinf @@ -112,7 +112,7 @@ if meshtype == "ARCUS" #TODO, for all of these propogate the AeroDyn additional ncelem, c_mount_ratio, bshapex = shapeX, #Blade shape, magnitude is irrelevant, scaled based on height and radius above - bshapez = shapeY, + bshapez = shapeZ, joint_type, #hinged about y axis cables_connected_to_blade_base, angularOffset) #Blade shape, magnitude is irrelevant, scaled based on height and radius above @@ -137,7 +137,7 @@ elseif meshtype == "Darrieus" || meshtype == "H-VAWT" strut_bld_mountpointbot = strut_mountpointbot, # This puts struts at top and bottom strut_bld_mountpointtop = strut_mountpointtop, # This puts struts at top and bottom bshapex = shapeX, #Blade shape, magnitude is irrelevant, scaled based on height and radius above - bshapez = shapeY, + bshapez = shapeZ, bshapey = zeros(nbelem+1), # but magnitude for this is relevant angularOffset, #Blade shape, magnitude is irrelevant, scaled based on height and radius above AD15_ccw = true, @@ -372,9 +372,9 @@ if !AD15On ### translate from blade span to blade height between the numad definition and the vertical slice positions ### First get the angles from the overall geometry npoints and go to the numad npoints delta_xs = shapeX[2:end] - shapeX[1:end-1] - delta_zs = shapeY[2:end] - shapeY[1:end-1] + delta_zs = shapeZ[2:end] - shapeZ[1:end-1] delta3D = atan.(delta_xs./delta_zs) - delta3D_spl = FLOWMath.akima(shapeY[1:end-1]./maximum(shapeY[1:end-1]), delta3D,LinRange(0,1,length(numadIn_bld.span)-1)) + delta3D_spl = FLOWMath.akima(shapeZ[1:end-1]./maximum(shapeZ[1:end-1]), delta3D,LinRange(0,1,length(numadIn_bld.span)-1)) bld_height_numad = cumsum(diff(numadIn_bld.span).*(1.0.-abs.(sin.(delta3D_spl)))) # now convert the numad span to a height @@ -389,7 +389,7 @@ if !AD15On end end - OWENSAero.setupTurb(shapeX,shapeY,B,chord,tsr,Vinf;AModel,DSModel, + OWENSAero.setupTurb(shapeX,shapeZ,B,chord,tsr,Vinf;AModel,DSModel, afname = airfoils, #TODO: map to the numad input rho, eta, @@ -461,15 +461,15 @@ if AD15On bld_len[iADBody] = sqrt((x2-x1)^2+(y2-y1)^2+(z2-z1)^2) #Get the blade shape - ADshapeY = collect(LinRange(0,H,NumADBldNds)) + ADshapeZ = collect(LinRange(0,H,NumADBldNds)) xmesh = mymesh.x[strt_idx:end_idx] ymesh = mymesh.y[strt_idx:end_idx] ADshapeX = sqrt.(xmesh.^2 .+ ymesh.^2) ADshapeX .-= ADshapeX[1] #get it starting at zero #TODO: make robust for blades that don't start at 0 - ADshapeXspl = FLOWMath.akima(LinRange(0,H,length(ADshapeX)),ADshapeX,ADshapeY) + ADshapeXspl = FLOWMath.akima(LinRange(0,H,length(ADshapeX)),ADshapeX,ADshapeZ) if iADBody<=Nbld #Note that the blades can be curved and are assumed to be oriented vertically - BlSpn=ADshapeY + BlSpn=ADshapeZ BlCrvAC=ADshapeXspl else # while the arms/struts are assumed to be straight and are oriented by the mesh angle BlSpn=collect(LinRange(0,bld_len[iADBody],blade_Nnodes[iADBody])) @@ -487,7 +487,7 @@ if AD15On OWENSOpenFASTWrappers.writeIWfile(Vinf,ifw_input_file;windINPfilename) - OWENSOpenFASTWrappers.setupTurb(adi_lib,ad_input_file,ifw_input_file,adi_rootname,[shapeX],[shapeY],[B],[Ht],[mymesh],[myort],[AD15bldNdIdxRng],[AD15bldElIdxRng]; + OWENSOpenFASTWrappers.setupTurb(adi_lib,ad_input_file,ifw_input_file,adi_rootname,[shapeX],[shapeZ],[B],[Ht],[mymesh],[myort],[AD15bldNdIdxRng],[AD15bldElIdxRng]; rho = rho, adi_dt = delta_t, adi_tmax= numTS*delta_t, diff --git a/dev/examples/C_customizablePreprocessing/index.html b/dev/examples/C_customizablePreprocessing/index.html index 09f8d09c..f565be1a 100644 --- a/dev/examples/C_customizablePreprocessing/index.html +++ b/dev/examples/C_customizablePreprocessing/index.html @@ -60,8 +60,8 @@ R = Blade_Radius#177.2022*0.3048 #m H = Blade_Height#1.02*R*2 #m -shapeY = collect(LinRange(0,H,Nslices+1)) -shapeX = R.*(1.0.-4.0.*(shapeY/H.-.5).^2) +shapeZ = collect(LinRange(0,H,Nslices+1)) +shapeX = R.*(1.0.-4.0.*(shapeZ/H.-.5).^2) stack_layers_bld = nothing @@ -87,7 +87,7 @@ nothing
Set up Turbine

Here is where we take the inputs from setupOWENS and break out what is going on behind the function. We do some intermediate calculations on the blade shape and angles

Nstrutperbld = 2 #TODO: generalize and propogate
 
 Nbld = B
-H = maximum(shapeY) #m,
+H = maximum(shapeZ) #m,
 R = maximum(shapeX) #m,
 omega = RPM / 60 * 2 * pi
 tsr = omega*R/Vinf
@@ -105,7 +105,7 @@
         ncelem,
         c_mount_ratio,
         bshapex = shapeX, #Blade shape, magnitude is irrelevant, scaled based on height and radius above
-        bshapez = shapeY,
+        bshapez = shapeZ,
         joint_type, #hinged about y axis
         cables_connected_to_blade_base,
         angularOffset) #Blade shape, magnitude is irrelevant, scaled based on height and radius above
@@ -130,7 +130,7 @@
         strut_bld_mountpointbot = strut_mountpointbot, # This puts struts at top and bottom
         strut_bld_mountpointtop = strut_mountpointtop, # This puts struts at top and bottom
         bshapex = shapeX, #Blade shape, magnitude is irrelevant, scaled based on height and radius above
-        bshapez = shapeY,
+        bshapez = shapeZ,
         bshapey = zeros(nbelem+1), # but magnitude for this is relevant
         angularOffset, #Blade shape, magnitude is irrelevant, scaled based on height and radius above
         AD15_ccw = true,
@@ -351,9 +351,9 @@
     ### translate from blade span to blade height between the numad definition and the vertical slice positions
     ### First get the angles from the overall geometry npoints and go to the numad npoints
     delta_xs = shapeX[2:end] - shapeX[1:end-1]
-    delta_zs = shapeY[2:end] - shapeY[1:end-1]
+    delta_zs = shapeZ[2:end] - shapeZ[1:end-1]
     delta3D = atan.(delta_xs./delta_zs)
-    delta3D_spl = FLOWMath.akima(shapeY[1:end-1]./maximum(shapeY[1:end-1]), delta3D,LinRange(0,1,length(numadIn_bld.span)-1))
+    delta3D_spl = FLOWMath.akima(shapeZ[1:end-1]./maximum(shapeZ[1:end-1]), delta3D,LinRange(0,1,length(numadIn_bld.span)-1))
 
     bld_height_numad = cumsum(diff(numadIn_bld.span).*(1.0.-abs.(sin.(delta3D_spl)))) # now convert the numad span to a height
 
@@ -368,7 +368,7 @@
         end
     end
 
-    OWENSAero.setupTurb(shapeX,shapeY,B,chord,tsr,Vinf;AModel,DSModel,
+    OWENSAero.setupTurb(shapeX,shapeZ,B,chord,tsr,Vinf;AModel,DSModel,
     afname = airfoils, #TODO: map to the numad input
     rho,
     eta,
@@ -438,15 +438,15 @@
         bld_len[iADBody] = sqrt((x2-x1)^2+(y2-y1)^2+(z2-z1)^2)
 
         #Get the blade shape
-        ADshapeY = collect(LinRange(0,H,NumADBldNds))
+        ADshapeZ = collect(LinRange(0,H,NumADBldNds))
         xmesh = mymesh.x[strt_idx:end_idx]
         ymesh = mymesh.y[strt_idx:end_idx]
         ADshapeX = sqrt.(xmesh.^2 .+ ymesh.^2)
         ADshapeX .-= ADshapeX[1] #get it starting at zero #TODO: make robust for blades that don't start at 0
-        ADshapeXspl = FLOWMath.akima(LinRange(0,H,length(ADshapeX)),ADshapeX,ADshapeY)
+        ADshapeXspl = FLOWMath.akima(LinRange(0,H,length(ADshapeX)),ADshapeX,ADshapeZ)
 
         if iADBody<=Nbld #Note that the blades can be curved and are assumed to be oriented vertically
-            BlSpn=ADshapeY
+            BlSpn=ADshapeZ
             BlCrvAC=ADshapeXspl
         else # while the arms/struts are assumed to be straight and are oriented by the mesh angle
             BlSpn=collect(LinRange(0,bld_len[iADBody],blade_Nnodes[iADBody]))
@@ -464,7 +464,7 @@
 
     OWENSOpenFASTWrappers.writeIWfile(Vinf,ifw_input_file;windINPfilename)
 
-    OWENSOpenFASTWrappers.setupTurb(adi_lib,ad_input_file,ifw_input_file,adi_rootname,[shapeX],[shapeY],[B],[Ht],[mymesh],[myort],[AD15bldNdIdxRng],[AD15bldElIdxRng];
+    OWENSOpenFASTWrappers.setupTurb(adi_lib,ad_input_file,ifw_input_file,adi_rootname,[shapeX],[shapeZ],[B],[Ht],[mymesh],[myort],[AD15bldNdIdxRng],[AD15bldElIdxRng];
             rho     = rho,
             adi_dt  = delta_t,
             adi_tmax= numTS*delta_t,
@@ -654,4 +654,4 @@
 Minimum Safety Factor on tower Surface: 28.046683968504755
 At time 0.063s at composite station 6 of 21 at lam 1 of 1
 Maximum Damage per hr: 0.07272727274008475
-At composite station 15 of 21 at lam 1 of 1

This page was generated using Literate.jl.

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

This page was generated using Literate.jl.

diff --git a/dev/index.html b/dev/index.html index 4587ef28..203e969c 100644 --- a/dev/index.html +++ b/dev/index.html @@ -1,2 +1,2 @@ -Home · OWENS.jl

OWENS (Offshore Wind ENergy Simulator)

This repository is based on the original structural dynamics solver by Brian Owens (see dissertation: http://hdl.handle.net/1969.1/151813). The original code has been translated to Julia and revised for simplicity and performance while maintaining accuracy. GXBeam.jl has also been integrated in beta form for geometrically exact beam solutions The aerodynamics are provided by the OWENSAero.jl module (https://gitlab.sandia.gov/8821-vawt-tools/OWENSAero.jl) in addition to a coupling to the OpenFAST AeroDyn module.

Documentation

In Work: Documentation can be found in the docs folder along with the validation paper(s).

- All of the functions have docstrings describing the i/o and function purpose, which can be accessed 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.

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

+Home · OWENS.jl

OWENS (Offshore Wind ENergy Simulator)

This repository is based on the original structural dynamics solver by Brian Owens (see dissertation: http://hdl.handle.net/1969.1/151813). The original code has been translated to Julia and revised for simplicity and performance while maintaining accuracy. GXBeam.jl has also been integrated in beta form for geometrically exact beam solutions The aerodynamics are provided by the OWENSAero.jl module (https://gitlab.sandia.gov/8821-vawt-tools/OWENSAero.jl) in addition to a coupling to the OpenFAST AeroDyn module.

Documentation

In Work: Documentation can be found in the docs folder along with the validation paper(s).

- All of the functions have docstrings describing the i/o and function purpose, which can be accessed 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.

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/legacyUserGuide/index.html b/dev/legacyUserGuide/index.html index e2a8db4f..a4b540ca 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/literate/B_detailedInputs.jl b/dev/literate/B_detailedInputs.jl index b00d5cdb..95cc7453 100644 --- a/dev/literate/B_detailedInputs.jl +++ b/dev/literate/B_detailedInputs.jl @@ -72,8 +72,8 @@ B = Nbld R = Blade_Radius#177.2022*0.3048 #m H = Blade_Height#1.02*R*2 #m -shapeY = collect(LinRange(0,H,Nslices+1)) -shapeX = R.*(1.0.-4.0.*(shapeY/H.-.5).^2)#shapeX_spline(shapeY) +shapeZ = collect(LinRange(0,H,Nslices+1)) +shapeX = R.*(1.0.-4.0.*(shapeZ/H.-.5).^2)#shapeX_spline(shapeZ) nothing @@ -94,7 +94,7 @@ mass_breakout_blds,mass_breakout_twr,system,assembly,sections,AD15bldNdIdxRng, A B, H, R, - shapeY, + shapeZ, shapeX, ifw, WindType, diff --git a/dev/literate/C_customizablePreprocessing.jl b/dev/literate/C_customizablePreprocessing.jl index c6b01a16..9761f949 100644 --- a/dev/literate/C_customizablePreprocessing.jl +++ b/dev/literate/C_customizablePreprocessing.jl @@ -79,8 +79,8 @@ B = Nbld R = Blade_Radius#177.2022*0.3048 #m H = Blade_Height#1.02*R*2 #m -shapeY = collect(LinRange(0,H,Nslices+1)) -shapeX = R.*(1.0.-4.0.*(shapeY/H.-.5).^2) +shapeZ = collect(LinRange(0,H,Nslices+1)) +shapeX = R.*(1.0.-4.0.*(shapeZ/H.-.5).^2) stack_layers_bld = nothing @@ -111,7 +111,7 @@ nothing Nstrutperbld = 2 #TODO: generalize and propogate Nbld = B -H = maximum(shapeY) #m, +H = maximum(shapeZ) #m, R = maximum(shapeX) #m, omega = RPM / 60 * 2 * pi tsr = omega*R/Vinf @@ -135,7 +135,7 @@ if meshtype == "ARCUS" #TODO, for all of these propogate the AeroDyn additional ncelem, c_mount_ratio, bshapex = shapeX, #Blade shape, magnitude is irrelevant, scaled based on height and radius above - bshapez = shapeY, + bshapez = shapeZ, joint_type, #hinged about y axis cables_connected_to_blade_base, angularOffset) #Blade shape, magnitude is irrelevant, scaled based on height and radius above @@ -160,7 +160,7 @@ elseif meshtype == "Darrieus" || meshtype == "H-VAWT" strut_bld_mountpointbot = strut_mountpointbot, # This puts struts at top and bottom strut_bld_mountpointtop = strut_mountpointtop, # This puts struts at top and bottom bshapex = shapeX, #Blade shape, magnitude is irrelevant, scaled based on height and radius above - bshapez = shapeY, + bshapez = shapeZ, bshapey = zeros(nbelem+1), # but magnitude for this is relevant angularOffset, #Blade shape, magnitude is irrelevant, scaled based on height and radius above AD15_ccw = true, @@ -408,9 +408,9 @@ if !AD15On ### translate from blade span to blade height between the numad definition and the vertical slice positions ### First get the angles from the overall geometry npoints and go to the numad npoints delta_xs = shapeX[2:end] - shapeX[1:end-1] - delta_zs = shapeY[2:end] - shapeY[1:end-1] + delta_zs = shapeZ[2:end] - shapeZ[1:end-1] delta3D = atan.(delta_xs./delta_zs) - delta3D_spl = FLOWMath.akima(shapeY[1:end-1]./maximum(shapeY[1:end-1]), delta3D,LinRange(0,1,length(numadIn_bld.span)-1)) + delta3D_spl = FLOWMath.akima(shapeZ[1:end-1]./maximum(shapeZ[1:end-1]), delta3D,LinRange(0,1,length(numadIn_bld.span)-1)) bld_height_numad = cumsum(diff(numadIn_bld.span).*(1.0.-abs.(sin.(delta3D_spl)))) # now convert the numad span to a height @@ -425,7 +425,7 @@ if !AD15On end end - OWENSAero.setupTurb(shapeX,shapeY,B,chord,tsr,Vinf;AModel,DSModel, + OWENSAero.setupTurb(shapeX,shapeZ,B,chord,tsr,Vinf;AModel,DSModel, afname = airfoils, #TODO: map to the numad input rho, eta, @@ -500,15 +500,15 @@ if AD15On bld_len[iADBody] = sqrt((x2-x1)^2+(y2-y1)^2+(z2-z1)^2) #Get the blade shape - ADshapeY = collect(LinRange(0,H,NumADBldNds)) + ADshapeZ = collect(LinRange(0,H,NumADBldNds)) xmesh = mymesh.x[strt_idx:end_idx] ymesh = mymesh.y[strt_idx:end_idx] ADshapeX = sqrt.(xmesh.^2 .+ ymesh.^2) ADshapeX .-= ADshapeX[1] #get it starting at zero #TODO: make robust for blades that don't start at 0 - ADshapeXspl = FLOWMath.akima(LinRange(0,H,length(ADshapeX)),ADshapeX,ADshapeY) + ADshapeXspl = FLOWMath.akima(LinRange(0,H,length(ADshapeX)),ADshapeX,ADshapeZ) if iADBody<=Nbld #Note that the blades can be curved and are assumed to be oriented vertically - BlSpn=ADshapeY + BlSpn=ADshapeZ BlCrvAC=ADshapeXspl else # while the arms/struts are assumed to be straight and are oriented by the mesh angle BlSpn=collect(LinRange(0,bld_len[iADBody],blade_Nnodes[iADBody])) @@ -526,7 +526,7 @@ if AD15On OWENSOpenFASTWrappers.writeIWfile(Vinf,ifw_input_file;windINPfilename) - OWENSOpenFASTWrappers.setupTurb(adi_lib,ad_input_file,ifw_input_file,adi_rootname,[shapeX],[shapeY],[B],[Ht],[mymesh],[myort],[AD15bldNdIdxRng],[AD15bldElIdxRng]; + OWENSOpenFASTWrappers.setupTurb(adi_lib,ad_input_file,ifw_input_file,adi_rootname,[shapeX],[shapeZ],[B],[Ht],[mymesh],[myort],[AD15bldNdIdxRng],[AD15bldElIdxRng]; rho = rho, adi_dt = delta_t, adi_tmax= numTS*delta_t, diff --git a/dev/objects.inv b/dev/objects.inv index cf42362cef329e34a91ce5f9ac4dc28046ea2e07..3786c9e5b3f99711b1ed327d422713decfcbbe14 100644 GIT binary patch delta 3633 zcmV-14$kqZ9k?BkeSh0-+ei|9=U3EX*1!yqjweoLGGpwEEZK>7?bxss5B5oDlP#MQ zip?}h+e(ms->PcfFA_!Xg8_-`bGq1dFUo%Csb`22@7U8Wh&KQq^;$WxO46u$nJ*l| zc^D@$2xQ{x&{5BF9R(^roGfD>KW%Q(F!aOwtG`Y^&8y(83x5w`&etHj2z<39KUsPz zk$#}O^Ds)2xRbcK=n!Vvcd!>qzUk6U<3z9hZ}Kis*G5G~yDE-p>n`do>knaCxdpX* z4nM|nrXH6cQr}Zm?#3+=_E7~oQU>^fb7tgP#aF8vwNgffZVlbKd6-=Sy@KMRV~X3R zi>2fCAxy5%D}M}ux|i*PT3}kpXn|>gX@8wd>Gqt1aHcv;kT4eCe{%DW zuNPNS@li<+34iPms=yz-KRGyh+sSe8eg^qEDEEQdJ`Uk-%1EgD;%(W!{Oq7Xt96?EU@OCncFo(d&F%$r>fYQ23 zfRhU^10h3CNM*FQ3FR93Jr%pgkJz~NO1OF*>5w&C6T9WTcwQwdAS+Z@p~6ZLs$_L$ z#(z|ak$$+hsg%%`t<3c*d6KC13*S{?+~6WvvwsDUEpRUUFn#Xzti{#r>KG3LO%NCJ zp{0>06D5)d)WwsZJm4oK&^lC{WcPMynn+2H*uoYyH#33z(Q`nKtGHD0gD9ih&ZEyc$Y1i5NE~H^%+o81y zlgQ33a@q_JgfEkjg9!)EWZy)}s8$lS7Jo2A&<;v#6FpK+f`E>h9p*vC;!fd-$P`O5 zv|8_#xJwiEA#Gz?qJ?V|`2YzLXz9^ibUwSUSfTzZM3KRJ=23aCg^dAdl~02HkjT?^ zTVkp?@ft16g#Ne8j}!Hryxygb?ay&=H2wcR2?d_<&w|2|U2?d=9e{R#^3VZA<$nld zMTJCz6_sNZi3%)grfgtQOQKR#$YLEy3iO9ep0@iERV@YJ;v=&^kC4W#6+U!&f1s2Ma1(hMBS!h{B(K>XT4x zElyulf)>Grd#8?YxGkVC#)iVvuYaku5fzR5QV)`=z>tkuj5Cjv>#uw)vW=#?GL95} z#$IbRBv2PF!ooAyiHR zISCXb&Y3pUGP7Q>vSm{cDSx-q_uW-e$4-_6auPNQU=k=uGWX_+lM))Wb$D9hRt4Ji zla0t+dYI>PJxbXoqk)_zyYGD5ct&@$n;87G8KMLx=xjCdVn*Wd3{AbQlMR|zQB~hR zv9i@P9&2H8Xh5!tn*CpgE^I|zfkF;-7Sz2g9%Lf^O~F9iq`fhRmVW{*1zt)MLBww& zWlNJ)8g_-OoDpbe{r+AonBM>uR-eU~q3?{jrr$br! z_t@$ViV!&^pSCNeSpeh!>-Rbc@Vm%9i_<`@+pTE63Za!l#Zu?-ewl-wDf zD|rsHh)$bHq-_~h1SJl{aGPDGKCnb&F^{NTuGLO4j_3`BXMZ09K<*IIPB!gWBF~`% zMhFEhT?e=mpAqepCGa;r3B2n%QU8M{zs zJutFX(ZFb6v<@QDg(-SwbPu!4;+d$XYtuo>_edMP+Q!g(Gl0*^=%(y64Lf|^>=y3 z0)%rr=Q*z}H)iTCy}$1*IPBW2;>g!Jw|<=BG0&6K^R=BCpU+PFD0ng0#dcPVi(85x z-XAt~Up9zkAt3gMWR;RbK#9vD%27{5X}uk%7k?;?_v2K1lY{?Pr$(G`rpRX!TdH+3 zHbMX+iUCB?n}0AedhlHuy>&Rtw*I_87E|QbsKizz)uv=p4KLJrcit1}U%>pNw5B%;N=4F|RBL*EuoXps2At%~=E zlSO05sDP+|seq{fAy7ilu`N~ox((N_tx1+IgBMsvtM8L=^9tQz^8@}4j@MjKLr)90 zh34S>336Zsb8z%4eRx01bNp+QFA5ufXxmWErk7)%ax2}Ir@dFn4GlG~bv&oB=EQYX zFi95JZi!D;mUsI}vYQdbdDkh-$`8HeolZkfn$7Z2261*Ax5`Dv?{?L6;|A)-V0rpT zQ3^|oA1cHsPgNu;94|{F*ykYX&`bwaYU$h2@d)Y~v`xL zvwskCK6u)tstj{*^rr4hMuzuFd=8P~yOnwI;}z6=iZ0ND{D7wiq=m)5j&Br3;B96sqser3InNF2w>|Sf z9gZ7+{nojSEn){7`)BOpXeP6~uy0lNwZaa3+X7Fl*AA1&R!}w}1pIQF-k)$Gbtw~r zRq~5Uvz^3SRG47xbRH(^o*ZDF-p%>fRJlU`*iW3TWGKWRogz@*nCx+wd63A){#VA& z-UMbMwK zZ9DlOpOWRB|AZahOS;l-n#R+yp7R1`WU<@8cNf(+Do%qW<{v>^rK9V*UaBoI6$_?+ z*~Ro_?ogo^;tJK4YGg8QG4$qR%-d7xCTYwsJoydYI7{s%+GVk1UQ7DfPqMcI_AxZ< zG>w&+DQrQM$0G-xH(cA_WsNY~-E?g$rqsmmVbT74j|Ro#G~371t6#lV_mX~@Hhoa; zmyuDmlcYDM+ClHWx~!ra`oo~EOeh0?`XLUD7DuOs4wkL6gRG9=@HB4IZkFCn<8-}r zX}lC~@5ZYWu2*1}&Jz{gP=|e?LPivw`;aAL8~dij!y5a>AdMI0@T!nCmiky=JZ#7u z!8Y~Z_G{)7D%!DDe^IumlMKlhJTKa}fua8@p#LbC7$Y|?61bOdi0qI4w-FJ4xIlFT zTAhYTZjm*gISaH*et%b5eSTs1leW04Hl5M6?XGg8r(Sz$q1IcWQ8BE(X&;N7n=}|Z zs_$m$4PyK+Q}YM8vQv-!+7DYp(DZX;LD?i|n~42aB~IP>E0FwP{@m|i`k8RoKYP;( zJ1n}mGCsB_FB}xNc{--WGMda(-uyOF{dIJ&+RK9)UhdVx6cPCV^`cnk1Ruay(4B#o+<`N9!= z3gbiuflPcII_gEPqd>(+lV$AVugz^5hJN^P{pZ=$yb9jB@P7#Ad=0XTz*kH1)1{{p z=?BXD6h>(hcM>-j9lQ9%Yw6ub{Z-nBunS zV(GYj1e2Rj6@P|6JxF)+Iaa3i1dUrqaKRUVu4K<}H~Dk%L4}?0=Dh-+-N-0zjDFdO zd0~rzyjMYKjX(Socm?nZXJKR*`zlPtB$UA>_G59KCaC;6wkbNY6iCRCV3A#%XD`Z4 z$^OM>(zCc#Ug|1OTpLdraj8ArX2gaCEif%)w7|5$w13W}bbHQ0I8z-aNEnN6Ke+kN z!^QPfd{ojy!tXnTD)0yIPY;gYb#ffMpFzG3%6*`=kAwPCMkd+_)DGHo;;UGkqc83} zmI4VS5(w#hD#BEO?=oOMiA8Ge{ZNT{Vp2CrjS@E)uvXfv%S&~trazK~ED4kd0Xa>1 z(V0Y%3V%KSMVy|9D;)+1kp{QH0O^({b0f(=6J_EZM^MroyqgRo%pq`k0tEmpptP$2V$O;u!sIXFmDp{SG z@t;&;q#y2WDkZdKD|5X{o+YaN!go~|H@HaFY<~e{3!Do-Oka9EYjHihKEcC46U4=Q zXldlhM2X}Pb@A*ckN8Uovog$W{i$)@7Ibj@`*zsD z@qZuI524@(S_pO_l>E+zAXQ?D5mB7V7|nL^sI=MabZLSC!GK|4VHjHc#7Aeqz~=d6 zqysH5!$FC&=6C(1%#*L4$%C?E6_+Z06lHYVdGt94`AeP>iKC2=d3r^$*K4w!3krE< z64|*$PMhI@@MRKmFyY{t?3+j#)k>n)0)K`G+Cgb;qDRU}5YRER!#v7Z+$%g0nPN$X zR_nbH_i4gDq-{(~v~Z0gA0R;jEj_x6&S&=(E7V_wC^C4@JSp!`*cgCT`7G!k5_#Hg zOH4Hv`*({^8?s>Q%UQhT2zb+T?nT(cySeyH$# zGGB<9;;iX5<8%@BGbrRx$e~a|ox(j9S_dbh?0dFk_$q|-U_ph;FjLk7QTWr(eG-bT z#p$a`&?2~S@6-_vw*?f&*id-(cYi8vL`CDi)Pv+IFl1vEk?=|nDq9X)x6rB6UgF2Y2><+P z2XikR>nJ9ma;fY`ibec9knO=eq46;u=d+D%#w|*jv&uadab8OM*y)*-bayMP5Gp5u zoCFFI=Uf|VnOUz`*|I5!lz-dlhwdt=V<$@jISCsDFbNbSnR|1^NePYGIy^0LrvmNz z$wp)@JO$>h83{e6Tbhes!F(Yw!hNj-t$p+1V z2W)i*MTndda!SZ4DO^jAM^K}5&QrFTJM7lmPumsKEC6zV^?Mxz__xS@i?cwj+pT^ z=yGE;yX70T3&+b!=%LcqPY`msppc8>Y;l6%uK=Zjj0{LB zTmcoSfTRMH3RtS5y?R5T}CDz&X&ZCM*gR!$X24GF*oQ#hqqew1qa&`r>)SraB&6-_>hJu9 zmYJex;(u(dD6kGBUqUq2S`<*8B}EP`Jo{#HN1JC^pvuAlfLM5JV_BS;T5D=0J4&Z6 z1qkPE&U0Q{Zp_qu`tZho!~;T9Yha1~0ITR^KM!<_)^T<~#fqoUFN`hMpE~ z3(dj%Q{=!3=HU2e`tg32=lDaDFA5ufYTHoGrk7)%ax2}Ir+rY#Ee$nqbUdfA=EQYX zFi95JZiy=^%P;#$vYQdb`K42sl^=S`d!2@!G@Ip<4C3rK?v#s+-|VXC#tqc>!SeKx zq7;@Ee^iK3o~lSxI9`@Uu+Kr%p_vY<)Y7-3;}O&~Xq$Syc{Ui-BVgH*&K!MVIE5=s=Ux z**}OmA3W_+Rfah@ep~k?Bf|$JK8Hy0&C0y^{swA3MHlEnzQgk)(!%0jC$|bC@;=^G z*#@5|f3gL+5^JyJZ{;of`26Pw&ny5fKX^BjPYWA=KNA_CkD^mN}!P`__hU}T9+E=8(iMlXdUpIXL`B8RnDbM43@C3s+)EaZ&6`_h0UihQ4iz* z^YnhspE~6V{e3@iwvwR`zjum2OxZYJ?GWM$V#+<@2+@nRh$M%%wH&6r=yFmUaBoI)uiF?Xp-huO)qxlkDw)eGCmdO=D$d3i|`)@jQTs0XO!e zsS#$oo33rel$!V@DcYa!(G+)_X8U-0^{dzFLDFYq(?{ig85vbONqS?dox<*`%POj& zKMd;1gfgJ7WN7X;IyH2#Y;EkbI)cN0)3{B$S$a2()AiD&*-yN^Rj!Vo-hf>?PgHbE z?eB#O8Bw&=Lzax~x|$)3LE?$(wt3uXT>OK2-*pMdQcHCe0>$DRp+ObxDRko;; z49OQf%-Oerp-=wlbN`7ka`P&Id-;aQ{^Wlh5rGR-N1)YdnB*2&^O^HN%jCCzUrMXb zFARUu7I)RAGrG3jRc`duYp*TTdMh+4hSgW?W3h9a24m;w-7LL9jQ>B={86s#)MLN) z!`2WqnjBeBHVN7$V*eizr|$gyM1C-T>~}EzOt|YGy=jFV7F}E!A6t}HPI22j9ivxPx!4KDX6zGISUrc0@z28r=1{_6u-(6|ugMrdCG1_xfUug4ps$Nlz o4dLyr&W!)yd#BplG!1c2LHc-lH;%PQmXVTQ;-M+-f4mj$C+=zruK)l5 diff --git a/dev/reference/reference/index.html b/dev/reference/reference/index.html index 21e4fc65..3ba754f0 100644 --- a/dev/reference/reference/index.html +++ b/dev/reference/reference/index.html @@ -1,5 +1,5 @@ -API Reference · OWENS.jl

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
  • 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 positoin, 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.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
+API Reference · OWENS.jl

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
  • 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 positoin, 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.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
@@ -103,7 +103,26 @@
     gearBoxEfficiency = 1.0,
     useGeneratorFunction = false,
     generatorProps = 0.0,
-    driveTrainOn = false)

Original serial and file reading method of running an analysis.

#Inputs See ?OWENS.Model and ?OWENSFEA.FEAModel

#Outputs See ?OWENS.Unsteady, ?OWENSFEA.Modal

OWENS.plotMeshMethod

plotMesh plots a mesh with various orthographic and isometric views plotMesh(mesh,colorstring,meshSeg)

This function plots a mesh in a 3D with isometric view.

#Input

  • mesh: object containing mesh data
  • colorstring: string containing color for plotting
  • meshSeg: array containing number of elements per mesh segment
  • ax1: handle to the 1 plot
  • ax2: handle to the 2 plot
  • ax3: handle to the 3 plot
  • ax4: handle to the 4 plot

#Output NONE

OWENS.rainflowMethod
rainflow(signal;nbins_range=10,nbins_mean=10)

Convenience function that returns the binned cycles with the corresponding ranges and means

Inputs

  • signal::Array{<:Real,1}: data input
  • nbins_range::Array{<:Int,1}: Number of bins for range
  • nbins_mean::Array{<:Int,1}: Number of bins for mean
  • m` : Wohler exponent (default is 3)
  • Teq` : The equivalent number of load cycles (default is 1, but normally the time duration in seconds is used)

Outputs:

  • Ncycles::Array{<:Real,2}: Summed/binned cycles with columns corresponding to mean levels and rows corresponding to range levels
  • meanIntervals::Array{<:Real,1}: Mean levels corresponging with bins columns
  • rangeIntervals::Array{<:Real,1}: Range levels corresponging with bins rows
  • equivalentLoad::Array{<:Real,1}: Design equivalent load for each mean level
OWENS.readBCdataMethod
readBCdata(bcfilename,numNodes,numDofPerNode)

This function reads the boundray condition file and stores data in the boundary condition object.

#Input

  • bcfilename::string: string containing boundary condition filename
  • numNodes::int: number of nodes in structural model
  • numDofPerNode::int: number of degrees of freedom per node

#Output

  • BC::OWENSFEA.BC_struct: see OWENSFEA.BC_struct, object containing boundary condition data
OWENS.readBladeDataMethod
readBladeData(filename)

This function reads blade data from file

#Input

  • filename::string: string containing /path/to/bladedata.bld

#Output

  • bladeData::BladeData: see ?BladeData object containing blade data
OWENS.readCactusGeomMethod

Internal, reads cactus .geom file and stores each column in an array within the CactusGeom struct

OWENS.readElementDataMethod
readElementData(numElements,elfile,ortfile,bldfile

Reads element data and stores data in the element data object.

#Input

  • numElements::int: number of elements in structural mesh
  • elfile::string: element data path/to/filename
  • ortfile::string: element orientation path/to/filename
  • bldfile::string: blade data path/to/filename

#Output

  • el::OWENSFEA.El: see OWENSFEA.El element data object
OWENS.readGeneratorPropsMethod
readGeneratorProps(generatorfilename)

This function reads generator properties from file.

#Input

  • generatorfilenanme::string: = string containing path/to/generatorfile

#Output

  • genprops: = model object containing generator properties
OWENS.readMeshMethod
readMesh(filename)

Reads the mesh file and stores data in the mesh object.

input:

  • filename::string string containing mesh path/to/filename.mesh

output:

  • mesh::OWENSFEA.Mesh see OWENSFEA.Mesh
OWENS.readNuMadGeomCSVMethod

readNuMadGeomCSV(NuMadgeomxlscsv_file)

Parameters defining the rotor (apply to all sections).

Arguments

  • NuMad_geom_xlscsv_file::String: name of the numad excel CSV file being read (!!! THE NUMAD TAB MUST BE SAVED AS A CSV FOR THIS TO WORK !!!)

Returns

  • Output::NuMad: numad structure as defined in the NuMad structure docstrings.
OWENS.readNuMadMaterialsCSVMethod

readNuMadMaterialsCSV(NuMadmaterialsxlscsv_file)

Parameters defining the rotor materials.

Arguments

  • NuMad_materials_xlscsv_file::String: name of the numad excel CSV file being read (!!! THE NUMAD TAB MUST BE SAVED AS A CSV FOR THIS TO WORK !!!)

Returns

  • Output::plyproperties: plyproperties structure as defined in the plyproperties structure docstrings.
OWENS.rigidBodyRotationMethod
rigidBodyRotation(B1,B2,B3,AngleArray,AxisArray)

Performs a coordinate transformation from a local body "B"(element) frame to a common hub frame "H" via a 3-2-3 euler rotation sequence

#Input

  • B1: array containing body frame 1 coordinates of points to be mapped to the hub frame
  • B2: array containing body frame 2 coordinates of points to be mapped to the hub frame
  • B3: array containing body frame 3 coordinates of points to be mapped to the hub frame
  • AngleArray: Array of angles for Euler rotation sequence
  • AxisArray: Array of axes for Euler rotation sequence

#Output

  • H1: array containg hub frame 1 coordinates of points mapped to the hub frame from body frame
  • H2: array containg hub frame 2 coordinates of points mapped to the hub frame from body frame
  • H3: array containg hub frame 3 coordinates of points mapped to the hub frame from body frame

That is CHtoB = [M3(SweepAngle)][M2(Theta)][M3(Psi)];

OWENS.runDLCMethod

runDLC(DLCs,Inp,path; Vinfrange=LinRange(5,20,16), IECstd=""2"", WindChar=""A"", WindClass=1, turbsimpath="./turbsimfiles", templatefile="./templateTurbSim.inp", pathtoturbsim="../../openfast/build/modules/turbsim/turbsim", NumGridZ=100, NumGridY=100, Vref=10.0, Vdesign=11.0, grid_oversize=1.1, regenWindFiles=false)

# Input
+    driveTrainOn = false)

Original serial and file reading method of running an analysis.

#Inputs See ?OWENS.Model and ?OWENSFEA.FEAModel

#Outputs See ?OWENS.Unsteady, ?OWENSFEA.Modal

OWENS.plotMeshMethod

plotMesh plots a mesh with various orthographic and isometric views plotMesh(mesh,colorstring,meshSeg)

This function plots a mesh in a 3D with isometric view.

#Input

  • mesh: object containing mesh data
  • colorstring: string containing color for plotting
  • meshSeg: array containing number of elements per mesh segment
  • ax1: handle to the 1 plot
  • ax2: handle to the 2 plot
  • ax3: handle to the 3 plot
  • ax4: handle to the 4 plot

#Output NONE

OWENS.rainflowMethod
rainflow(signal;nbins_range=10,nbins_mean=10)

Convenience function that returns the binned cycles with the corresponding ranges and means

Inputs

  • signal::Array{<:Real,1}: data input
  • nbins_range::Array{<:Int,1}: Number of bins for range
  • nbins_mean::Array{<:Int,1}: Number of bins for mean
  • m` : Wohler exponent (default is 3)
  • Teq` : The equivalent number of load cycles (default is 1, but normally the time duration in seconds is used)

Outputs:

  • Ncycles::Array{<:Real,2}: Summed/binned cycles with columns corresponding to mean levels and rows corresponding to range levels
  • meanIntervals::Array{<:Real,1}: Mean levels corresponging with bins columns
  • rangeIntervals::Array{<:Real,1}: Range levels corresponging with bins rows
  • equivalentLoad::Array{<:Real,1}: Design equivalent load for each mean level
OWENS.readBCdataMethod
readBCdata(bcfilename,numNodes,numDofPerNode)

This function reads the boundray condition file and stores data in the boundary condition object.

#Input

  • bcfilename::string: string containing boundary condition filename
  • numNodes::int: number of nodes in structural model
  • numDofPerNode::int: number of degrees of freedom per node

#Output

  • BC::OWENSFEA.BC_struct: see OWENSFEA.BC_struct, object containing boundary condition data
OWENS.readBladeDataMethod
readBladeData(filename)

This function reads blade data from file

#Input

  • filename::string: string containing /path/to/bladedata.bld

#Output

  • bladeData::BladeData: see ?BladeData object containing blade data
OWENS.readCactusGeomMethod

Internal, reads cactus .geom file and stores each column in an array within the CactusGeom struct

OWENS.readElementDataMethod
readElementData(numElements,elfile,ortfile,bldfile

Reads element data and stores data in the element data object.

#Input

  • numElements::int: number of elements in structural mesh
  • elfile::string: element data path/to/filename
  • ortfile::string: element orientation path/to/filename
  • bldfile::string: blade data path/to/filename

#Output

  • el::OWENSFEA.El: see OWENSFEA.El element data object
OWENS.readGeneratorPropsMethod
readGeneratorProps(generatorfilename)

This function reads generator properties from file.

#Input

  • generatorfilenanme::string: = string containing path/to/generatorfile

#Output

  • genprops: = model object containing generator properties
OWENS.readMeshMethod
readMesh(filename)

Reads the mesh file and stores data in the mesh object.

input:

  • filename::string string containing mesh path/to/filename.mesh

output:

  • mesh::OWENSFEA.Mesh see OWENSFEA.Mesh
OWENS.readNuMadGeomCSVMethod

readNuMadGeomCSV(NuMadgeomxlscsv_file)

Parameters defining the rotor (apply to all sections).

Arguments

  • NuMad_geom_xlscsv_file::String: name of the numad excel CSV file being read (!!! THE NUMAD TAB MUST BE SAVED AS A CSV FOR THIS TO WORK !!!)

Returns

  • Output::NuMad: numad structure as defined in the NuMad structure docstrings.
OWENS.readNuMadMaterialsCSVMethod

readNuMadMaterialsCSV(NuMadmaterialsxlscsv_file)

Parameters defining the rotor materials.

Arguments

  • NuMad_materials_xlscsv_file::String: name of the numad excel CSV file being read (!!! THE NUMAD TAB MUST BE SAVED AS A CSV FOR THIS TO WORK !!!)

Returns

  • Output::plyproperties: plyproperties structure as defined in the plyproperties structure docstrings.
OWENS.rigidBodyRotationMethod
rigidBodyRotation(B1,B2,B3,AngleArray,AxisArray)

Performs a coordinate transformation from a local body "B"(element) frame to a common hub frame "H" via a 3-2-3 euler rotation sequence

#Input

  • B1: array containing body frame 1 coordinates of points to be mapped to the hub frame
  • B2: array containing body frame 2 coordinates of points to be mapped to the hub frame
  • B3: array containing body frame 3 coordinates of points to be mapped to the hub frame
  • AngleArray: Array of angles for Euler rotation sequence
  • AxisArray: Array of axes for Euler rotation sequence

#Output

  • H1: array containg hub frame 1 coordinates of points mapped to the hub frame from body frame
  • H2: array containg hub frame 2 coordinates of points mapped to the hub frame from body frame
  • H3: array containg hub frame 3 coordinates of points mapped to the hub frame from body frame

That is CHtoB = [M3(SweepAngle)][M2(Theta)][M3(Psi)];

OWENS.run34mMethod

run34m(inputs,feamodel,mymesh,myel,aeroForces,deformAero;steady=true,system=nothing,assembly=nothing,VTKFilename="./outvtk")

helper function that rearranges the outputs into the expected 34m output # Input * inputs::Model: see ?Model * topModel::FEAModel: see ?OWENSFEA.FEAModel * mesh::Mesh: see ?OWENSFEA.Mesh * el::El: see ?OWENSFEA.El * aeroForces::function: Fexternal, Fdof = aero(t) where Fexternal is the force on each affected mesh dof and Fdof is the corresponding DOFs affected * deformAero::function: see deformTurb(azi;newOmega=-1,newVinf=-1,bldx=-1,bldz=-1,bld_twist=-1,steady=false) * steady::bool: run steadystate with no aero or not * system: see ?GXBeam.System * assembly: see ?GXBeam.Assembly * VTKFilename::string: Unused: path and name of VTK output

# Output
+* `eps_x`: strain history for eps_xx_0 for (Nbld,N_ts,mymesh.meshSeg[2]+1)
+* `eps_y`: strain history for eps_xx_z like above
+* `eps_z`: strain history for eps_xx_y like above
+* `kappa_x`: strain history for gam_xz_0 like above
+* `kappa_y`: strain history for gam_xz_y like above
+* `kappa_z`: strain history for gam_xy_0 like above
+* `t`: time array
+* `FReactionHist`: Nodal reaction 6dof forces history
+* `OmegaHist`: rotational speed array history
+* `genTorque`: generator torque history
+* `torqueDriveShaft`: driveshaft torque history
+* `aziHist`: azimuthal history array
+* `uHist`: mesh displacement history for each dof
+* `epsilon_x_hist`: strain history for eps_xx_0 for each dof
+* `epsilon_y_hist`: strain history for eps_xx_z for each dof
+* `epsilon_z_hist`: strain history for eps_xx_y for each dof
+* `kappa_x_hist`: strain history for gam_xz_0 for each dof
+* `kappa_y_hist`: strain history for gam_xz_y for each dof
+* `kappa_z_hist`: strain history for gam_xy_0 for each dof
OWENS.runDLCMethod

runDLC(DLCs,Inp,path; Vinfrange=LinRange(5,20,16), IECstd=""2"", WindChar=""A"", WindClass=1, turbsimpath="./turbsimfiles", templatefile="./templateTurbSim.inp", pathtoturbsim="../../openfast/build/modules/turbsim/turbsim", NumGridZ=100, NumGridY=100, Vref=10.0, Vdesign=11.0, grid_oversize=1.1, regenWindFiles=false)

# Input
 * `DLCs`: ["1_1","1_2"]
 * `Inp::MasterInput`: see ?OWENS.MasterInput
 * `path`: desired path to run everything
@@ -122,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/search_index.js b/dev/search_index.js index b291eab3..38694140 100644 --- a/dev/search_index.js +++ b/dev/search_index.js @@ -1,3 +1,3 @@ var documenterSearchIndex = {"docs": -[{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"EditURL = \"../literate/B_detailedInputs.jl\"","category":"page"},{"location":"examples/B_detailedInputs/#simple2","page":"Detailed Inputs","title":"Detailed Inputs","text":"","category":"section"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"In this example, we show the second level of what is going on behind the precompiled binary This would be appropriate if you need more customization in the run and design parameters than the input file currently allows, but your design still fits within the setupOWENS helper function etc.","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"tip: Tip\nThis example is also available as a Jupyter notebook todo: get link working:","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"First we import the packages. If \"using\" was employed, then all of the functions of the packages specified would be made available, but \"import\" requires PackageName.FunctionName to be used unless the function was explicitely exported in the package. If \"include(\"filepath/filename.jl)\" is used, that is the same as copying and pasting. Please see the respective page on YAML input (TODO) for a description of the YAML inputs","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"import OWENS\nimport OWENSAero","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"import PyPlot","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"path = runpath = \"/home/runner/work/OWENS.jl/OWENS.jl/docs/src/literate\" #splitdir(@__FILE__)[1]\n\nInp = OWENS.MasterInput(\"$runpath/sampleOWENS.yml\")\n\nnothing","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"Unpack inputs, or you could directly input them here and bypass the file","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"verbosity = 1\n\nanalysisType = Inp.analysisType\nturbineType = Inp.turbineType\neta = Inp.eta\nNbld = Inp.Nbld\ntowerHeight = Inp.towerHeight\nrho = Inp.rho\nVinf = Inp.Vinf\ncontrolStrategy = Inp.controlStrategy\nRPM = Inp.RPM\nNslices = Inp.Nslices\nntheta = Inp.ntheta\nstructuralModel = Inp.structuralModel\nntelem = Inp.ntelem\nnbelem = Inp.nbelem\nncelem = Inp.ncelem\nnselem = Inp.nselem\nifw = Inp.ifw\nWindType = Inp.WindType\nAModel = Inp.AModel\nwindINPfilename = \"$(path)$(Inp.windINPfilename)\"\nifw_libfile = Inp.ifw_libfile\nif ifw_libfile == \"nothing\"\n ifw_libfile = nothing\nend\nBlade_Height = Inp.Blade_Height\nBlade_Radius = Inp.Blade_Radius\nnumTS = Inp.numTS\ndelta_t = Inp.delta_t\nNuMad_geom_xlscsv_file_twr = \"$(path)$(Inp.NuMad_geom_xlscsv_file_twr)\"\nNuMad_mat_xlscsv_file_twr = \"$(path)$(Inp.NuMad_mat_xlscsv_file_twr)\"\nNuMad_geom_xlscsv_file_bld = \"$(path)$(Inp.NuMad_geom_xlscsv_file_bld)\"\nNuMad_mat_xlscsv_file_bld = \"$(path)$(Inp.NuMad_mat_xlscsv_file_bld)\"\nNuMad_geom_xlscsv_file_strut = \"$(path)$(Inp.NuMad_geom_xlscsv_file_strut)\"\nNuMad_mat_xlscsv_file_strut = \"$(path)$(Inp.NuMad_mat_xlscsv_file_strut)\"\nadi_lib = Inp.adi_lib\nif adi_lib == \"nothing\"\n adi_lib = nothing\nend\nadi_rootname = \"$(path)$(Inp.adi_rootname)\"\n\nB = Nbld\nR = Blade_Radius#177.2022*0.3048 #m\nH = Blade_Height#1.02*R*2 #m\n\nshapeY = collect(LinRange(0,H,Nslices+1))\nshapeX = R.*(1.0.-4.0.*(shapeY/H.-.5).^2)#shapeX_spline(shapeY)\n\nnothing","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"Call the helper function that builds the mesh, calculates the sectional properties, and aligns the sectional properties to the mesh elements,","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"mymesh,myel,myort,myjoint,sectionPropsArray,mass_twr, mass_bld,\nstiff_twr, stiff_bld,bld_precompinput,\nbld_precompoutput,plyprops_bld,numadIn_bld,lam_U_bld,lam_L_bld,\ntwr_precompinput,twr_precompoutput,plyprops_twr,numadIn_twr,lam_U_twr,lam_L_twr,aeroForces,deformAero,\nmass_breakout_blds,mass_breakout_twr,system,assembly,sections,AD15bldNdIdxRng, AD15bldElIdxRng = OWENS.setupOWENS(OWENSAero,path;\n rho,\n Nslices,\n ntheta,\n RPM,\n Vinf,\n eta,\n B,\n H,\n R,\n shapeY,\n shapeX,\n ifw,\n WindType,\n delta_t,\n numTS,\n adi_lib,\n adi_rootname,\n windINPfilename,\n ifw_libfile,\n NuMad_geom_xlscsv_file_twr,# = \"$path/data/NuMAD_Geom_SNL_5MW_ARCUS_Cables.csv\",\n NuMad_mat_xlscsv_file_twr,# = \"$path/data/NuMAD_Materials_SNL_5MW_D_TaperedTower.csv\",\n NuMad_geom_xlscsv_file_bld,# = \"$path/data/NuMAD_Geom_SNL_5MW_ARCUS.csv\",\n NuMad_mat_xlscsv_file_bld,# = \"$path/data/NuMAD_Materials_SNL_5MW_D_Carbon_LCDT_ThickFoils_ThinSkin.csv\",\n NuMad_geom_xlscsv_file_strut,\n NuMad_mat_xlscsv_file_strut,\n Ht=towerHeight,\n ntelem,\n nbelem,\n ncelem,\n nselem,\n joint_type = 0,\n c_mount_ratio = 0.05,\n AModel, #AD, DMS, AC\n DSModel=\"BV\",\n RPI=true,\n cables_connected_to_blade_base = true,\n meshtype = turbineType)\n\nnothing","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"Optionally, we can run the finite element solver with gemetrically exact beam theory via GXBeam.jl this requires that the OWENS style inputs are converted to the GXBeam inputs. This interface also includes the ability to output VTK files, which can be viewed in paraview. We have adapted this interface to work with OWENS inputs as well.","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"nothing","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"If the sectional properties material files includes cost information, that is combined with the density to estimate the overall material cost of of materials in the blades","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"if verbosity>0\n\n println(\"\\nBlades' Mass Breakout\")\n for (i,name) in enumerate(plyprops_bld.names)\n println(\"$name $(mass_breakout_blds[i]) kg, $(plyprops_bld.costs[i]) \\$/kg: \\$$(mass_breakout_blds[i]*plyprops_bld.costs[i])\")\n end\n\n println(\"\\nTower Mass Breakout\")\n for (i,name) in enumerate(plyprops_twr.names)\n println(\"$name $(mass_breakout_twr[i]) kg, $(plyprops_twr.costs[i]) \\$/kg: \\$$(mass_breakout_twr[i]*plyprops_twr.costs[i])\")\n end\n\n println(\"Total Material Cost Blades: \\$$(sum(mass_breakout_blds.*plyprops_bld.costs))\")\n println(\"Total Material Cost Tower: \\$$(sum(mass_breakout_twr.*plyprops_twr.costs))\")\n println(\"Total Material Cost: \\$$(sum(mass_breakout_blds.*plyprops_bld.costs)+ sum(mass_breakout_twr.*plyprops_twr.costs))\")\n\nend\n\nnothing","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"Here we apply the boundary conditions. For this case, with a regular cantelever tower, the tower base node which is 1 is constrained in all 6 degrees of freedom to have a displacement of 0. You can change this displacement to allow for things like pretension, and you can apply boundary conditions to any node.","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"pBC = [1 1 0\n1 2 0\n1 3 0\n1 4 0\n1 5 0\n1 6 0]\n\nnothing","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"There are inputs for the overall coupled simulation, please see the api reference for specifics on all the options","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"if AModel==\"AD\"\n AD15On = true\nelse\n AD15On = false\nend\n\ninputs = OWENS.Inputs(;analysisType = structuralModel,\ntocp = [0.0,100000.1],\nOmegaocp = [RPM,RPM] ./ 60,\ntocp_Vinf = [0.0,100000.1],\nVinfocp = [Vinf,Vinf],\nnumTS,\ndelta_t,\nAD15On,\naeroLoadsOn = 2)\n\nnothing","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"Then there are inputs for the finite element models, also, please see the api reference for specifics on the options (TODO: ensure that this is propogated to the docs)","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"feamodel = OWENS.FEAModel(;analysisType = structuralModel,\noutFilename = \"none\",\njoint = myjoint,\nplatformTurbineConnectionNodeNumber = 1,\npBC,\nnlOn = true,\nnumNodes = mymesh.numNodes,\nRayleighAlpha = 0.05,\nRayleighBeta = 0.05,\niterationType = \"DI\")\n\nnothing","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"Here is where we actually call the unsteady simulation and where owens pulls the aero and structural solutions together and propogates things in time.","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"println(\"Running Unsteady\")\nt, aziHist,OmegaHist,OmegaDotHist,gbHist,gbDotHist,gbDotDotHist,FReactionHist,\nFTwrBsHist,genTorque,genPower,torqueDriveShaft,uHist,uHist_prp,epsilon_x_hist,epsilon_y_hist,\nepsilon_z_hist,kappa_x_hist,kappa_y_hist,kappa_z_hist = OWENS.Unsteady_Land(inputs;system,assembly,\ntopModel=feamodel,topMesh=mymesh,topEl=myel,aero=aeroForces,deformAero)\n\nnothing","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"Like described above, we can output vtk files viewable in paraview. Here it is done for each time step and shows the deformations. Additionaly, there is a method to input custom values and have them show up on the vtk surface mesh for example, strain, or reaction force, etc. This is described in more detail in the api reference for the function and: TODO","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"println(\"Saving VTK time domain files\")\nOWENS.OWENSFEA_VTK(\"$path/vtk/SNLARCUS5MW_timedomain_TNBnltrue\",t,uHist,system,assembly,sections;scaling=1,azi=aziHist)\n\nnothing","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"This helper function looks through all the loads and picks out the worst case safety factor in each of the stacks of composite lamina it also calculates analytical simply supported buckling safety factors","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"##########################################\n#### Ultimate Failure #####\n##########################################\n\nmassOwens,stress_U,SF_ult_U,SF_buck_U,stress_L,SF_ult_L,SF_buck_L,stress_TU,SF_ult_TU,\nSF_buck_TU,stress_TL,SF_ult_TL,SF_buck_TL,topstrainout_blade_U,topstrainout_blade_L,\ntopstrainout_tower_U,topstrainout_tower_LtopDamage_blade_U,\ntopDamage_blade_L,topDamage_tower_U,topDamage_tower_L = OWENS.extractSF(bld_precompinput,\nbld_precompoutput,plyprops_bld,numadIn_bld,lam_U_bld,lam_L_bld,\ntwr_precompinput,twr_precompoutput,plyprops_twr,numadIn_twr,lam_U_twr,lam_L_twr,\nmymesh,myel,myort,Nbld,epsilon_x_hist,kappa_y_hist,kappa_z_hist,epsilon_z_hist,\nkappa_x_hist,epsilon_y_hist;verbosity, #Verbosity 0:no printing, 1: summary, 2: summary and spanwise worst safety factor # epsilon_x_hist_1,kappa_y_hist_1,kappa_z_hist_1,epsilon_z_hist_1,kappa_x_hist_1,epsilon_y_hist_1,\nLE_U_idx=1,TE_U_idx=6,SparCapU_idx=3,ForePanelU_idx=2,AftPanelU_idx=5,\nLE_L_idx=1,TE_L_idx=6,SparCapL_idx=3,ForePanelL_idx=2,AftPanelL_idx=5,\nTwr_LE_U_idx=1,Twr_LE_L_idx=1,\nAD15bldNdIdxRng,AD15bldElIdxRng,strut_precompoutput=nothing) #TODO: add in ability to have material safety factors and load safety factors\n\nnothing","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"This page was generated using Literate.jl.","category":"page"},{"location":"VAWTGenUserGuide/#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.","page":"Legacy VAWTGen Guide","title":"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.","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Version 1.0 User GuideBrian C. OwensWind Energy TechnologiesSandia National LaboratoriesNovember 7, 2013Contents","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Introduction 1","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Overview of VAWTGen Mesh Generator 1","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Demonstration 3","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Conventions Employed in Creating a Model with VAWTGen 5","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Structural and aerodynamic description of components 5","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Caveats of creating a VAWT configuration in VAWTGen 7","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Coordinate system 7","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Tower component 7","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Blade component 7","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Blade component 8","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"VAWTGen Input File 9","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"VAWTGen Command Line Execution 10","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"VAWTGen Graphical Output 11","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"VAWTGen Output Files 15","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"OWENS Main Input File (.owens) 15","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Mesh File (.mesh) 16","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Element Property File (.el) 16","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Element Orientation File (.ort) 17","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Joint File (.jnt) 17","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Boundary Conditions File (.bc) 17","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Blade Data File (.bld) 18","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Output File (.out) 18","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Future Versions 18","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"References 19","category":"page"},{"location":"VAWTGenUserGuide/#Introduction","page":"Legacy VAWTGen Guide","title":"Introduction","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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.","category":"page"},{"location":"VAWTGenUserGuide/#Overview-of-VAWTGen-Mesh-Generator","page":"Legacy VAWTGen Guide","title":"Overview of VAWTGen Mesh Generator","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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.","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"(Image: ){width=\"2.5990562117235347in\" height=\"1.453332239720035in\"}","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"[]{#_bookmark2 .anchor}Figure 1 Illustrations of V, H, and Darrieus VAWT configurationsVAWTGen 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 ablade 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.","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"(Image: C:\\\\Users\\\\bcowens\\\\Desktop\\\\meshGenFlow.png){width=\"4.016800087489064in\" height=\"2.6266666666666665in\"}","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"[]{#_bookmark3 .anchor}Figure 2 Input and output of VAWTGen mesh generatorOutput 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 andprovides 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.","category":"page"},{"location":"VAWTGenUserGuide/#Demonstration","page":"Legacy VAWTGen Guide","title":"Demonstration","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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.(Image: C:\\\\Users\\\\bcowens\\\\Desktop\\\\export_fig\\\\Vvawt.png){width=\"1.8892694663167104in\" height=\"3.2266666666666666in\"} (Image: 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","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"(Image: C:\\\\Users\\\\bcowens\\\\Desktop\\\\export_fig\\\\dar3swept.png){width=\"1.02086176727909in\" height=\"3.3866666666666667in\"}(Image: C:\\\\Users\\\\bcowens\\\\Desktop\\\\export_fig\\\\dar3strut.png){width=\"0.8588167104111986in\" height=\"3.3866666666666667in\"}","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"+–––––––––––––––––+–––––––––––––––––-+ | > []{#bookmark7 | > []{#bookmark8 .anchor}Figure | | > .anchor}Figure 5 Wireframe | > 6 Wireframe of Strutted | | > of Swept Darrieus VAWT** | > Darrieus VAWT** | +==================================+===================================+ +–––––––––––––––––+–––––––––––––––––-+","category":"page"},{"location":"VAWTGenUserGuide/#Conventions-Employed-in-Creating-a-Model-with-VAWTGen","page":"Legacy VAWTGen Guide","title":"Conventions Employed in Creating a Model with VAWTGen","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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","category":"page"},{"location":"VAWTGenUserGuide/#Structural-and-aerodynamic-description-of-components","page":"Legacy VAWTGen Guide","title":"Structural and aerodynamic description of components","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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.","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"+––––––+–––+–––––-+–-+–––+–-+–––-+–––-+––+ | > (-) | * | > | | > | | > * | > ** | ** | | > (-) | *(de | (kg/m) | | **( | | *(Nm\\ | (N) | (- | | | g)** | > | | Nm\\^ | | ^2)** | | ** | | | | (Nm\\^2)** | | 2)** | | | | | +============+======+===========+===+======+===+=======+=======+====+ | > ) (kg | > | **(m) | * | ( | > | > ** | | | | > m) (kg | m) | | * | m) | | (m)** | | | | | > ( | | ( | | * | | | | | | m)** | | m | | * | | | | | | | | ) | | ( | | | | | | | | * | | m | | | | | | | | * | | ) | | | | | | | | | | * | | | | | | | | | | * | | | | +––––––+–––+–––––-+–-+–––+–-+–––-+–––-+––+","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"+––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > | | 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 | | | | | | | | | ** | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Caveats of blade structural description in VAWTGen are described below.","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"(Image: ){width=\"4.046369203849519e-3in\" height=\"0.15120188101487314in\"}The alpha column describing bend-twist coupling is not currently employed in the analysis.(Image: ){width=\"4.046369203849519e-3in\" height=\"0.15120188101487314in\"}\nFor blades, the reference axis is assumed to pass through the quarter chord. The blade may be shaped by using the PrecrvRef and PreswpRef parameters.\nVAWTGen 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.\nEdgewise elastic axis and mass center offsets are positive towards the trailing edge of the blade section.\nFlapwise elastic axis and mass center offsets are positive in the direction outward from the machine center.\nUnder these assumptions, positive structural twist twists the leading edge inwards towards the machine center.\nAll other structural properties are the same as that specified in the FAST manual[1].","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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(Image: ){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.","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"+––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > | 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** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+","category":"page"},{"location":"VAWTGenUserGuide/#Caveats-of-creating-a-VAWT-configuration-in-VAWTGen","page":"Legacy VAWTGen Guide","title":"Caveats of creating a VAWT configuration in VAWTGen","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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.","category":"page"},{"location":"VAWTGenUserGuide/#Coordinate-system","page":"Legacy VAWTGen Guide","title":"Coordinate system","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"The following coordinate system z-axis is along the tower axis, and x- and y-axes are in the plane of rotation.","category":"page"},{"location":"VAWTGenUserGuide/#Tower-component","page":"Legacy VAWTGen Guide","title":"Tower component","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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.","category":"page"},{"location":"VAWTGenUserGuide/#Blade-component","page":"Legacy VAWTGen Guide","title":"Blade component","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"The blade components are positioned using the following input parameters:","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Number of blades\nBlade length\nBlade root elevation from tower base elevation (z= 0)\nBlade 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)\nBlade theta orientation a (degrees, rotation about the y-axis)\nBlade sweep angle (degrees, rotation about an intermediate \"2-axis\" a positive angle sweeps the blade away from the direction of rotation)","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Notes:","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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.\nBlades will be positioned with equal azimuth spacing of the blade root dictated by the specified number of blades.\nUnder 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.\nThis 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.","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"[]{#_bookmark15 .anchor}Strut componentThe strut components (which can provide a structural component between the tower and blade connection) are positioned using the following input parameters:","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Fraction of tower span for strut placement\nFraction of blade span for strut placement","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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.","category":"page"},{"location":"VAWTGenUserGuide/#VAWTGen-Input-File","page":"Legacy VAWTGen Guide","title":"VAWTGen Input File","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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.","category":"page"},{"location":"VAWTGenUserGuide/#VAWTGen-Command-Line-Execution","page":"Legacy VAWTGen Guide","title":"VAWTGen Command Line Execution","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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:","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"+––––+––––––––+––––––––––––––––––––––+ | > \\>\\> | | | | > 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, | | +––––+––––––––+––––––––––––––––––––––+","category":"page"},{"location":"VAWTGenUserGuide/#VAWTGen-Graphical-Output","page":"Legacy VAWTGen Guide","title":"VAWTGen Graphical Output","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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 MeshElement Orientation Visualization(Image: ){width=\"2.202673884514436in\" height=\"2.950511811023622in\"}(Image: ){width=\"2.1219225721784776in\" height=\"2.6937674978127735in\"}403530252015","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"10","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"5","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"0","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"1 0-1","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"-15","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"15","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"1050-5-10x[]{#_bookmark19 .anchor}Figure 7. Finite element mesh with node numbering Figure 8. Finite element mesh with element orientationsVisualization of OWENS Output using VAWTGenA 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 ResultsThe 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 ResultsThe 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.mA 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 ResultsA 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.","category":"page"},{"location":"VAWTGenUserGuide/#VAWTGen-Output-Files","page":"Legacy VAWTGen Guide","title":"VAWTGen Output Files","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"The following output files are generated to serve as input for the OWENS analysis tool:","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"OWENS main input file (.owens)\nBeam mesh file (.mesh)\nElement property file (.el)\nElement orientation file (.ort)\nJoint file (.jnt)\nBoundary conditions file (.bc)\nBlade data file (.bld)","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Additionally, a log file describing the junctions of various structural components is generated in a .out output file.","category":"page"},{"location":"VAWTGenUserGuide/#OWENS-Main-Input-File-(.owens)","page":"Legacy VAWTGen Guide","title":"OWENS Main Input File (.owens)","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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].","category":"page"},{"location":"VAWTGenUserGuide/#Mesh-File-(.mesh)","page":"Legacy VAWTGen Guide","title":"Mesh File (.mesh)","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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:","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"+––––-+–––––+–––-+–––––––-+–––––––––––-+ | > 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 | | | | | > ... | | | | | +––––-+–––––+–––-+–––––––-+–––––––––––-+","category":"page"},{"location":"VAWTGenUserGuide/#Element-Property-File-(.el)","page":"Legacy VAWTGen Guide","title":"Element Property File (.el)","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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:","category":"page"},{"location":"VAWTGenUserGuide/#Element-Orientation-File-(.ort)","page":"Legacy VAWTGen Guide","title":"Element Orientation File (.ort)","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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.","category":"page"},{"location":"VAWTGenUserGuide/#Joint-File-(.jnt)","page":"Legacy VAWTGen Guide","title":"Joint File (.jnt)","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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.","category":"page"},{"location":"VAWTGenUserGuide/#Boundary-Conditions-File-(.bc)","page":"Legacy VAWTGen Guide","title":"Boundary Conditions File (.bc)","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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:","category":"page"},{"location":"VAWTGenUserGuide/#Blade-Data-File-(.bld)","page":"Legacy VAWTGen Guide","title":"Blade Data File (.bld)","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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:","category":"page"},{"location":"VAWTGenUserGuide/#Output-File-(.out)","page":"Legacy VAWTGen Guide","title":"Output File (.out)","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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.","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"+–-+–––-+––+–––––––––––––––––––––––––-+ | 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 | | +–-+–––-+––+–––––––––––––––––––––––––-+ | \\ | | | | | . | | | | | . | | | | | . | | | | +–-+–––-+––+–––––––––––––––––––––––––-+","category":"page"},{"location":"VAWTGenUserGuide/#Future-Versions","page":"Legacy VAWTGen Guide","title":"Future Versions","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"There are no planned future developments for VAWTGen. Future developments or modifications will be considered as analysis needs arise.","category":"page"},{"location":"VAWTGenUserGuide/#References","page":"Legacy VAWTGen Guide","title":"References","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"OWENS User Guide\nJonkman, J.M., and Buhl, M. L., 2005, FAST User's Guide, National Renewable Energy Laboratory, NREL/EL- 500-38230.","category":"page"},{"location":"legacyUserGuide/#TODO:-condense-and-update-this-with-the-latest-updates","page":"Legacy User Guide","title":"TODO: condense and update this with the latest updates","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"subtitle: | Version 1.0","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"User Guide","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"*Brian C. Owens\n *","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Wind Energy Technologies\n Sandia National Laboratories","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"*November 11, 2013\n * title: | Offshore Wind Energy Simulation","category":"page"},{"location":"legacyUserGuide/#Analysis-Tool:-OWENS","page":"Legacy User Guide","title":"Analysis Tool: OWENS","text":"","category":"section"},{"location":"legacyUserGuide/#Contents-{#contents-.TOC-Heading}","page":"Legacy User Guide","title":"Contents {#contents .TOC-Heading}","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Introduction 1","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Overview of OWENS Model Formulation 1","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Basic Formulation Concepts 1","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Equations of Motion 2","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Overview of OWENS Analysis Framework 4","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"OWENS Installation 7","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Platform dynamics software interface 7","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"OWENS Command Line Execution 8","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Static Analysis Execution 8","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Modal Analysis Execution 8","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Creating Campbell Diagrams of a VAWT Configuration 9","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Transient Analysis Execution 11","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Specified rotor speed profile 11","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Forced start-up mode using generator 11","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Self-starting turbine mode 12","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Transient Analysis Execution Using Reduced Order Model 12","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"OWENS Input Files 13","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"OWENS Main Input File (.owens) 14","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Mesh File (.mesh) 15","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Element Property File (.el) 15","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Element Orientation File (.ort) 16","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Joint File (.jnt) 16","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Concentrated Nodal Terms File 16","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Boundary Conditions File (.bc) 17","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Platform Simulation File (.plat) 17","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Initial Conditions File 18","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Blade Data File (.bld) 18","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Aerodynamic Loads File 18","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Drivetrain Properties File 18","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Generator Properties File 19","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"OWENS Output Files 20","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Static Analysis Output 20","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Modal Analysis Output 20","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Transient Analysis Output 21","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"References 21","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Appendix A: Mapping from local nodal DOF numbering to global DOF numbering 22","category":"page"},{"location":"legacyUserGuide/#Introduction","page":"Legacy User Guide","title":"Introduction","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"This user guide presents instructions for using the Offshore Wind ENergy Simulation (OWENS) analysis tool. This structural dynamics finite element analysis tool is intended to be used for the analysis of vertical-axis wind turbine (VAWT) on a floating platform, and is used in conjunction with the VAWTGen mesh generator described in a separate user manual[1]. An overview of the OWENS analysis tool is presented. The execution, analysis modes, input files, and resulting output files for OWENS are discussed in detail. Visualization options for modal and transient analysis are also presented. Version 1.0 of OWENS presents a structural dynamics tool for modal and transient analysis of an arbitrary VAWT structure affixed to a floating platform. Simple drivetrain and generator modules are also present in this version. Future work will implement fully coupled hydrodynamic, aerodynamic, and more robust nonlinear formulations.","category":"page"},{"location":"legacyUserGuide/#","page":"Legacy User Guide","title":"","text":"","category":"section"},{"location":"legacyUserGuide/#Overview-of-OWENS-Model-Formulation","page":"Legacy User Guide","title":"Overview of OWENS Model Formulation","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The fundamental requirements of the aeroelastic analysis tool for off-shore VAWTs necessitates a flexible framework capable of considering arbitrary configuration geometries, arbitrary loading scenarios, and the ability to interface with various modules that account for the interaction of the environment and power generation hardware with the turbine structure. The finite element method provides a means to satisfy these general requirements. If a sufficiently robust element is developed, a mesh (collection of elements) of an arbitrary VAWT configuration may be constructed via a mesh generator. The ability to capture various couplings and provide an accurate representation of turbine behavior will depend on the robustness of the element formulation.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The finite element method requires boundary conditions to be imposed on the elements by specifying loads or displacements at discrete points (nodes) in the mesh. These boundary conditions provide a clear interface between aerodynamic and hydrodynamic modules that impart forces on the turbine. With boundary conditions specified, unspecified displacements and loads may be calculated. Next, displacement motions of the turbine may be provided to aerodynamic and hydrodynamic modules to calculate loads on the turbine. This gives rise to mutual causation because in reality loads and displacements are intricately connected. Iterative procedures, however, often allow for a convergence to be reached, eliminating this issue for all practical purposes.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The subsections that follow will present basic formulation concepts for the OWENS analysis tool.","category":"page"},{"location":"legacyUserGuide/#Basic-Formulation-Concepts","page":"Legacy User Guide","title":"Basic Formulation Concepts","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Basic formulation concepts will be discussed before describing components of the proposed formulation in detail. As stated earlier, the finite element method is utilized for its robustness and flexibility. A robust element formulation will become the foundation of the aeroelastic analysis tool. Analysis of the dynamic response of the turbine is challenging because of rotating components. Because almost all structural components of the turbine will be rotating at some rotor speed (𝛺), it is convenient to perform the formulation in a rotating reference frame. Such a frame is capable of capturing rotational effects, including centrifugal stiffening/softening and Coriolis effects.","category":"page"},{"location":"legacyUserGuide/#Equations-of-Motion","page":"Legacy User Guide","title":"Equations of Motion","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Equations of motion for the platform are developed by treating the platform as a rigid body, whereas the turbine is treated as a rotating deformable body. Motions of discrete points on the turbine can be expressed as the sum of the turbine motion (deformation and rigid rotor rotation) and the platform motion (rigid). Expressions for the velocities of the platform and for an arbitrary point on the turbine are shown below:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"oversetV_platform = frac_^(N)d dtoversetR_PN = dotU_1widehatn_1 + dotU_2widehatn_2 + dotU_3widehatn_3","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"oversetomega_platform = omega_1widehatp_1 + omega_2widehatp_2 + omega_3widehatp_3","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"oversetv = oversetV_platform + lbrack(oversetomega_platform + Omegawidehath_3) times oversetrrbrack + frac_^(H)d dtoversetr","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"(Image: figs/userguide1.png){width=\"2.3in\" height=\"2.28in\"}","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Figure 1 Illustration of frames, position vectors, and angular velocities","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Figure 1 presents an illustration of the frames, angular velocities, and positions vectors that will be described. Here, U~i~ represents the displacement components of the platform center of mass, and 𝜔~i~ represents the angular velocity components of the platform. The inertial frame is represented by the n~i~ coordinate axes, the platform frame is represented by the p~i~ coordinate axes, and the rotating hub frame is represented by the h~i\\ ~coordinate axes. The vector r defines the position of an arbitrary point on the turbine with respect to the hub frame origin. The time derivative of this vector is taken within the hub frame and is essentially the time derivative of turbine deformations. The platform and hub frame origins are coincident, and there is no translational velocity of the hub frame relative to the turbine frame. Hamilton's principle relates the variation of kinetic energy (T) and potential energy (V), and virtual work of non-conservative forces (δW~np­~) to formulate equations of motion. Hamilton's extended principle is written simply as:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"deltaint_t_1^t_2leftlbrack T(t) - V(t) rightrbrack dt +int_t_1^t_2delta W_np = 0","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The kinetic energy of the system may be written compactly as:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"T_system = T_platform + T_turbine","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"T_platform = frac12M_platformoversetV_platform bullet oversetV_platform + frac12(oversetomega_platform)^Tlbrack Jrbrackoversetomega_platform","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"T_turbine = frac12int_V^rhooversetv bullet oversetvdV","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The platform kinetic energy is decomposed into two parts, translational kinetic energy and rotational kinetic energy (where [J] is the moment of inertia tensor for the platform). The turbine (which will be represented by a collection of elements) kinetic energy is expressed in terms of the volume integral of the turbine density and the velocity of infinitesimal points in the turbine (as developed earlier).","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Note that the quantities described above may be represented or \"coordinatized\" in any frame. Indeed, some vectors were expressed in the inertial (n~i~) frame, and others in the rotating hub (h~i~) frame. Because the rotating turbine represents the bulk of the modeling effort, the implementation of the equations of motion will be coordinatized in the hub frame. Platform motions and forces, however, are described in the inertial or platform frames. Therefore, transformations between the various frames are performed where necessary.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"In the development of equations of motion, one can choose to retain the rotor angular velocity/acceleration (Omega) and platform angular velocity/acceleration (omega_i) as degrees of freedom in the resulting system of equations or as specified parameters. Retaining these terms as degrees of freedom is undesirable because it adds significant complexity to the formulation and introduces a significant number of nonlinear terms. More critically, however, is that the analysis tool must be interfaced with independent modules for aerodynamics, hydrodynamics, and generator dynamics that will affect these rotational motion quantities. Therefore, it is not possible to retain these variables as degrees of freedom in the model formulation without losing the ability to interface generic modules. Accordingly, these variables will be retained as specified motion parameters. The value of these parameters will be updated by post-processing routines after gathering information from the aforementioned modules and turbine motions.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The resulting equations of motion for a floating turbine structure will be of the following form (hyperbolic):","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"lbrack Mrbrackleft ddotU right + lbrack Crbrackleft dotU right + lbrack Krbrackleft U right = left F right","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"This can be decomposed to show contributions from the turbine and platform and show couplings between the two:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"beginbmatrix\nM_TT M_TP \nM_PT M_PP\nendbmatrixbeginBmatrix\nddotU_T \nddotU_P\nendBmatrix + beginbmatrix\nC_TT C_TP \nC_PT C_PP\nendbmatrixbeginBmatrix\ndotU_T \ndotU_P\nendBmatrix + beginbmatrix\nK_TT K_TP \nK_PT K_PP\nendbmatrixbeginBmatrix\nU_T \nU_P\nendBmatrix = beginBmatrix\nF_T \nF_P\nendBmatrix","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#-2","page":"Legacy User Guide","title":"","text":"","category":"section"},{"location":"legacyUserGuide/#Overview-of-OWENS-Analysis-Framework","page":"Legacy User Guide","title":"Overview of OWENS Analysis Framework","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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].","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"(Image: figs/userguide2.png){width=\"8.1578947944007in\" height=\"5.019896106736658in\"}","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Figure Analysis framework for the OWENS toolkit","category":"page"},{"location":"legacyUserGuide/#OWENS-Installation","page":"Legacy User Guide","title":"OWENS Installation","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The OWENS analysis software should be installed by adding the following directories to the MATLAB path:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"OWENS\\source\nOWENS\\source\\commonSource\nOWENS\\source\\modalSource\nOWENS\\source\\transientSource\nOWENS\\source\\utilitySource\nOWENS\\serverFiles","category":"page"},{"location":"legacyUserGuide/#Platform-dynamics-software-interface","page":"Legacy User Guide","title":"Platform dynamics software interface","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"%sets system commands to launch wavEC software","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"hydroLaunchScript = \\'/home/bcowens/work/OWENSsingle/launchPlatformCode\\';","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"%sysCallString = [matlabPath,\\' -sd \\',hydroCodeDirectory,\\' -r \\',hydroCodeExec,\\' &\\'];","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"sysCallString = [\\'bash \\',hydroLaunchScript,\\' &\\'];","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"disp(\\'launching WAVEC\\'); %launch wavEC depending on pc or unix environment","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"if(ispc());","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"system(sysCallString);","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"end","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"if(isunix())","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"unix(sysCallString);\nend","category":"page"},{"location":"legacyUserGuide/#OWENS-Command-Line-Execution","page":"Legacy User Guide","title":"OWENS Command Line Execution","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#Static-Analysis-Execution","page":"Legacy User Guide","title":"Static Analysis Execution","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The static analysis capability of OWENS is executed as follows:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"owens(inputFile,'S',rotorSpeed,nonlinearBool,dispGuess);","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"For example:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"owens('vawt.owens','S',0.5,true);","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#Modal-Analysis-Execution","page":"Legacy User Guide","title":"Modal Analysis Execution","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The modal analysis capability of OWENS is executed as follows:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"owens(inputFile,'M',rotorSpeed,spinUpBool,numModesOutput,dispGuess);","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"For example:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"owens('vawt.owens','M',0.0,true,40);","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#Creating-Campbell-Diagrams-of-a-VAWT-Configuration","page":"Legacy User Guide","title":"Creating Campbell Diagrams of a VAWT Configuration","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"[freq] = campDiagramGen(inputFileName,outputFileName,rotorSpeedArray,spinUpOn,numModes)","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"campDiagPlotter(resultsFileName,numModesToPlot,numPerRevLines,minRPMplot,maxRPMplot)","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"(Image: figs/userguide3.png){width=\"5.829861111111111in\" height=\"4.254861111111111in\"}","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Figure 3 Example of a Campbell diagram","category":"page"},{"location":"legacyUserGuide/#Transient-Analysis-Execution","page":"Legacy User Guide","title":"Transient Analysis Execution","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The transient analysis capability of OWENS is executed as follows:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"owens(inputFile,'TNB',timeStep,numTimeSteps,nlBool,turbineOperationParams...);","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#Specified-rotor-speed-profile","page":"Legacy User Guide","title":"Specified rotor speed profile","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"An arbitrary VAWT configuration may be subjected to an arbitrary, specified rotor speed profile using the following command line execution.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"owens('vawt.owens','TNB',1.0e-3,40000,true,0,[0.0 5.0 30.0],[0.0 0.5 0.5]);","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#Forced-start-up-mode-using-generator","page":"Legacy User Guide","title":"Forced start-up mode using generator","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"owens('vawt.owens','T',1.0e-3,40000,true,1,0.0);","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#Self-starting-turbine-mode","page":"Legacy User Guide","title":"Self-starting turbine mode","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"owens('vawt.owens','T',1.0e-3,40000,true 2,0.0,1.05);","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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 \\.mat such as \"vawt.mat\". Table 1 provides a listing with output description, variable name, and size of the output.","category":"page"},{"location":"legacyUserGuide/#Transient-Analysis-Execution-Using-Reduced-Order-Model","page":"Legacy User Guide","title":"Transient Analysis Execution Using Reduced Order Model","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The transient analysis capability with a reduced order model of OWENS is executed as follows:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"owens(inputFile,'ROM',timeStep,numTimeSteps,numModesForROM,nlBool,turbineOperationParams...);","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#OWENS-Input-Files","page":"Legacy User Guide","title":"OWENS Input Files","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"OWENS main input file (.owens)\nBeam mesh file (.mesh)\nElement property file (.el)\nElement orientation file (.ort)\nJoint file (.jnt)\nConcentrated nodal term file (.ndl)\nBoundary conditions file (.bc)\nPlatform simulation file (.plat)\nInitial conditions file (.ic)\nBlade data file (.bld)\nAerodynamic loads file\nDriveshaft file (.ds)\nGenerator properties file (.gen)","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#OWENS-Main-Input-File-(.owens)","page":"Legacy User Guide","title":"OWENS Main Input File (.owens)","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The OWENS main input file is generated by VAWTGen with the following format:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"vawt.mesh\nvawt.el\nvawt.ort\nvawt.jnt\n[concentrated nodal terms file]\nvawt.bc\n0 vawt.plat\n[initial conditions file]\n0 vawt.bld [aero loads file]\n0 [drivetrain property file]\n[generator property file]\n0.0 0.0","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"lbrack Crbrack = alphalbrack Mrbrack + betalbrack Krbrack","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#Mesh-File-(.mesh)","page":"Legacy User Guide","title":"Mesh File (.mesh)","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"numNodes numElements\nnodeNum xCoord yCoord zCoord\nnodeNum xCoord yCoord zCoord\nnodeNum xCoord yCoord zCoord\n...\nelementNum numNodesPerElement localNodeNum1 localNodeNum2\nelementNum numNodesPerElement localNodeNum1 localNodeNum2\nelementNum numNodesPerElement localNodeNum1 localNodeNum2\n...\nnumberOfStructuralComponents numElementsComponent1 .... numElementsComponentN","category":"page"},{"location":"legacyUserGuide/#Element-Property-File-(.el)","page":"Legacy User Guide","title":"Element Property File (.el)","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Element1, Node 1: [blade fraction] [aeroCenter] [structuralTwist] [MassPerLength] [FlapwiseStiffness] [EdgewiseStiffness] [TorsionalStiffness] [AxialStiffness] [alphaCouplingFactor] [FlapwiseInertia] [EdgewiseInertia] [Precurve] [PreSweep] [FlapwiseCGoffset] [EdgewiseCGOffset] [FlapwiseEAOffset] [EdgewiseEAOffset] ...\nElement1, Node 2: [blade fraction] [aeroCenter] [structuralTwist] [MassPerLength] [FlapwiseStiffness] [EdgewiseStiffness] [TorsionalStiffness] [AxialStiffness] [alphaCouplingFactor] [FlapwiseInertia] [EdgewiseInertia] [Precurve] [PreSweep] [FlapwiseCGoffset] [EdgewiseCGOffset] [FlapwiseEAOffset] [EdgewiseEAOffset] ...","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"...","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"...\nElement n, Node 1: [blade fraction] [aeroCenter] [structuralTwist] [MassPerLength] [FlapwiseStiffness] [EdgewiseStiffness] [TorsionalStiffness] [AxialStiffness] [alphaCouplingFactor] [FlapwiseInertia] [EdgewiseInertia] [Precurve] [PreSweep] [FlapwiseCGoffset] [EdgewiseCGOffset] [FlapwiseEAOffset] [EdgewiseEAOffset] ...","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Element n, Node 2: [blade fraction] [aeroCenter] [structuralTwist] [MassPerLength] [FlapwiseStiffness] [EdgewiseStiffness] [TorsionalStiffness] [AxialStiffness] [alphaCouplingFactor] [FlapwiseInertia] [EdgewiseInertia] [Precurve] [PreSweep] [FlapwiseCGoffset] [EdgewiseCGOffset] [FlapwiseEAOffset] [EdgewiseEAOffset] ...","category":"page"},{"location":"legacyUserGuide/#Element-Orientation-File-(.ort)","page":"Legacy User Guide","title":"Element Orientation File (.ort)","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"elNum theta3 theta2 theta1 length xOffset yOffset zOffset","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#Joint-File-(.jnt)","page":"Legacy User Guide","title":"Joint File (.jnt)","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"jointNumber masterNode slaveNode jointType jointMass 0.0 ... jointPsi jointTheta","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#Concentrated-Nodal-Terms-File","page":"Legacy User Guide","title":"Concentrated Nodal Terms File","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"74 M 1 254.0\n81 K 3 1.0e6\n92 F 2 2000.0","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"nodeNum termType localDOFNum value","category":"page"},{"location":"legacyUserGuide/#Boundary-Conditions-File-(.bc)","page":"Legacy User Guide","title":"Boundary Conditions File (.bc)","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"6\n1 1 0.000000\n1 2 0.000000\n1 3 0.000000\n1 4 0.000000\n1 5 0.000000\n1 6 0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"nodeNum localDOFNum value","category":"page"},{"location":"legacyUserGuide/#Platform-Simulation-File-(.plat)","page":"Legacy User Guide","title":"Platform Simulation File (.plat)","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The platform simulation file specifies parameters required for an external platform dynamics simulation. An example, annotated platform file is shown below.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"1 0 0 0 0 0 :active platform DOFs (surge, sway, heave, roll, pitch, yaw)","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0.0 0.0 0.0 0.0 0.0 :initial conditions for platform DOFs","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0 :drag damping flag (1 = on, 0 = off)","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"1 :mooring flag (1 = on, 0 = off)","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0 :gravity flag (1 = on, 0 = off)","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0 :plot flag (1 = on, 0 = off)","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0 :radiation damping flag (1 = on, 0 = off)","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"1 :node number for platform turbine connection","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"1 :platform turbine yaw interaction (0 = free spinning tower, 1 = fixed tower, 2 = generator reaction torque applied to platform)","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"3500 :platform server port","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"4500 :platform client port","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#Initial-Conditions-File","page":"Legacy User Guide","title":"Initial Conditions File","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"60 1 0.1\n51 2 -0.4\nnodeNum localDOFNum value","category":"page"},{"location":"legacyUserGuide/#Blade-Data-File-(.bld)","page":"Legacy User Guide","title":"Blade Data File (.bld)","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"bladeNum nodeDistance nodeNum elementNum quarterChordCoord1 quarterChordCoord2 quarterChordCoord3 sectionNormalVec1 sectionNormalVec2 sectionNormalVec3 sectionTangentVec1 sectionTangentVec2 sectionTangentVec3 sectionChord sectionAirfoilNumber [place holder not used]","category":"page"},{"location":"legacyUserGuide/#Aerodynamic-Loads-File","page":"Legacy User Guide","title":"Aerodynamic Loads File","text":"","category":"section"},{"location":"legacyUserGuide/#Drivetrain-Properties-File","page":"Legacy User Guide","title":"Drivetrain Properties File","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"1.0e8 1e6 1000.0 :drivetrain spring constant, damping constant, MOI\n1.0 1.0 :gear ratio, gear box efficiency","category":"page"},{"location":"legacyUserGuide/#Generator-Properties-File","page":"Legacy User Guide","title":"Generator Properties File","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"2.09e4 :generator rated torque\n1.0 :zero torque generator speed (in Hz)\n2.0 :pull out ratio\n5.0 :generator rated slip percentage","category":"page"},{"location":"legacyUserGuide/#OWENS-Output-Files","page":"Legacy User Guide","title":"OWENS Output Files","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"This section describes the output files generated by the OWENS analysis software. Output is different for the static, modal, and transient analysis types.","category":"page"},{"location":"legacyUserGuide/#Static-Analysis-Output","page":"Legacy User Guide","title":"Static Analysis Output","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#Modal-Analysis-Output","page":"Legacy User Guide","title":"Modal Analysis Output","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"MODE # 1","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Frequency: 9.941364e-001:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Damping 3.576857e-014:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0 deg Mode Shape:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Ux Uy Uz thetax thetay thetaz","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"-0.000000 -0.000000 -0.000000 -0.000000 0.000833 -0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0.000627 0.000000 0.000000 -0.000000 0.000819 0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0.001235 0.000000 0.000000 -0.000000 0.000780 0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0.001819 0.000000 0.000000 -0.000000 0.000713 0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0.002353 0.000000 0.000000 -0.000000 0.000620 0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0.002669 0.000000 0.000000 -0.000000 0.000557 0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0.002948 0.000000 0.000000 -0.000000 0.000497 0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0.003196 0.000000 0.000000 -0.000000 0.000437 0.000000\n...\n90 deg Mode Shape:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Ux Uy Uz thetax thetay thetaz","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"-0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"...","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Mode #2","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"...","category":"page"},{"location":"legacyUserGuide/#-3","page":"Legacy User Guide","title":"","text":"","category":"section"},{"location":"legacyUserGuide/#Transient-Analysis-Output","page":"Legacy User Guide","title":"Transient Analysis Output","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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 \\.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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Transient analysis output may be visualized using VAWTGen visualization capabilities[1].","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Table 1. OWENS Transient Output","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Output Variable Name (units) Size –––––––––––- –––––––––––- –––––––––––- Time t (s) 1 x numTimeSteps","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Nodal displacements uHist (m or rad) numDOF x numTimeSteps","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Generator torque genTorque (N-m) 1 x numTimeSteps","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Generator power genPower (W) 1 x numTimeSteps","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Rotor position aziHist (rad) 1 x numTimeSteps","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Rotor speed OmegaHist (Hz) 1 x numTimeSteps","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Rotor acceleration OmegaDotHist (Hz/s) 1x numTimetSteps","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Gearbox position gbHist (rad) 1 x numTimeSteps","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Gearbox speed gbDotHist (Hz) 1 x numTimeSteps","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Gearbox acceleration gbDotDotHist (Hz/s) 1 x numTimeSteps","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Driveshaft torque torqueDriveShaft (N-m) 1 x numTimeSteps","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Platform degrees of rigidDof (m or rad) 6 x numTimeSteps freedom ","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Turbine base reaction FReactionHist (N or 6 x numTimeSteps force N-m) –––––––––––––––––––––––––––––––––––-","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":": Default static nonlinear analysis parameters","category":"page"},{"location":"legacyUserGuide/#References","page":"Legacy User Guide","title":"References","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"VAWTGen Manual\nWavEC manual\nJonkman, J.M., and Buhl, M. L., 2005, FAST User's Guide, National Renewable Energy Laboratory, NREL/EL-500-38230.","category":"page"},{"location":"legacyUserGuide/#Appendix-A:-Mapping-from-local-nodal-DOF-numbering-to-global-DOF-numbering","page":"Legacy User Guide","title":"Appendix A: Mapping from local nodal DOF numbering to global DOF numbering","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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\".","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"globalDOFNum = (nodeNum-1)*6 + localDOFNum","category":"page"},{"location":"legacyUserGuide/#Appendix-B:-Nonlinear-Static-Analysis-Parameters","page":"Legacy User Guide","title":"Appendix B: Nonlinear Static Analysis Parameters","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The nonlinear parameter file has the following format for adaptive load stepping in nonlinear iteration:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"NR :iteration type, NR = Newton Raphson, DI = Direct Iteration","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"1.0e-6 :tolerance for nonlinear iteration convergence","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"5 :maximum number of iterations per load step","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0 :integer denoting load steps (0 for adaptive), otherwise, number of load steps followed by values","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"20 :maximum number of load steps","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0.3 :minimum load step","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0.1 :minimum delta load step","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"If desired, the user may specify a prescribed loadstepping profile for nonlinear iteration with the following file format:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"NR :iteration type, NR = Newton Raphson, DI = Direct Iteration","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"1.0e-6 :tolerance for nonlinear iteration convergence","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"20 :maximum number of iterations per load step","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"By default, the nonlinear iteration parameters are those listed in Table","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"\nParameter Value –––––––––––––––––- –––––––––––––––––- Nonlinear Iteration Tolerance 1.0e-6\nIteration Type Newton Raphson\nLoads Stepping Algorithm Adaptive\nMax Iterations Per Load Step 50\nMax Number of Load Steps 20\nMinimum Load Step 0.05\nMinimum Load Step Delta 0.05","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"EditURL = \"../literate/C_customizablePreprocessing.jl\"","category":"page"},{"location":"examples/C_customizablePreprocessing/#simple3","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"","category":"section"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"In this example, we show the third level of what is going on behind the precompiled binary This includes all of the second, but also breaks out the setupOWENS function. This would be a good starting point if you need to make modifications to use a unique mesh generation function, change how sectional properties are input, or adapt for a unique design an properly map the sectional properties to each element and apply unique boundary conditions, etc.","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"tip: Tip\nThis example is also available as a Jupyter notebook todo: get link working:","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"This example is the same as example B except that the setupOWENS function is broken out and each step defined","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"import OWENS\nimport OWENSFEA\nimport OWENSAero\nimport QuadGK\nimport FLOWMath\nimport PyPlot","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"PyPlot.pygui(true)","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"import OWENSOpenFASTWrappers\n\n\npath = runpath = \"/home/runner/work/OWENS.jl/OWENS.jl/docs/src/literate\" #splitdir(@__FILE__)[1]\n\nInp = OWENS.MasterInput(\"$runpath/sampleOWENS.yml\")\n\nnothing","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"Unpack inputs, or you could directly input them here and bypass the file","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"verbosity = 1\n\nanalysisType = Inp.analysisType\nturbineType = Inp.turbineType\neta = Inp.eta\nNbld = Inp.Nbld\ntowerHeight = Inp.towerHeight\nrho = Inp.rho\nVinf = Inp.Vinf\ncontrolStrategy = Inp.controlStrategy\nRPM = Inp.RPM\nNslices = Inp.Nslices\nntheta = Inp.ntheta\nstructuralModel = Inp.structuralModel\nntelem = Inp.ntelem\nnbelem = Inp.nbelem\nncelem = Inp.ncelem\nnselem = Inp.nselem\nifw = Inp.ifw\nWindType = Inp.WindType\nAModel = Inp.AModel\nwindINPfilename = \"$(path)$(Inp.windINPfilename)\"\nifw_libfile = Inp.ifw_libfile\nif ifw_libfile == \"nothing\"\n ifw_libfile = nothing\nend\nBlade_Height = Inp.Blade_Height\nBlade_Radius = Inp.Blade_Radius\nnumTS = Inp.numTS\ndelta_t = Inp.delta_t\nNuMad_geom_xlscsv_file_twr = \"$(path)$(Inp.NuMad_geom_xlscsv_file_twr)\"\nNuMad_mat_xlscsv_file_twr = \"$(path)$(Inp.NuMad_mat_xlscsv_file_twr)\"\nNuMad_geom_xlscsv_file_bld = \"$(path)$(Inp.NuMad_geom_xlscsv_file_bld)\"\nNuMad_mat_xlscsv_file_bld = \"$(path)$(Inp.NuMad_mat_xlscsv_file_bld)\"\nNuMad_geom_xlscsv_file_strut = \"$(path)$(Inp.NuMad_geom_xlscsv_file_strut)\"\nNuMad_mat_xlscsv_file_strut = \"$(path)$(Inp.NuMad_mat_xlscsv_file_strut)\"\nadi_lib = Inp.adi_lib\nif adi_lib == \"nothing\"\n adi_lib = nothing\nend\nadi_rootname = \"$(path)$(Inp.adi_rootname)\"\n\nprintln(\"Set up Turbine\")\n\nAD15On = true\nB = Nbld\nR = Blade_Radius#177.2022*0.3048 #m\nH = Blade_Height#1.02*R*2 #m\n\nshapeY = collect(LinRange(0,H,Nslices+1))\nshapeX = R.*(1.0.-4.0.*(shapeY/H.-.5).^2)\n\n\nstack_layers_bld = nothing\nstack_layers_scale = [1.0,1.0]\nchord_scale = [1.0,1.0]\nthickness_scale = [1.0,1.0]\nHt=towerHeight\nstrut_mountpointbot = 0.11\nstrut_mountpointtop = 0.11\njoint_type = 0\nc_mount_ratio = 0.05\nangularOffset = -pi/2\nif AModel==\"AD\" #TODO: unify flag\n AD15On=true #AD for AeroDyn, DMS for double multiple streamtube, AC for actuator cylinder\nelse\n AD15On=false\nend\nDSModel=\"BV\"\nRPI=true\ncables_connected_to_blade_base = true\nmeshtype = \"Darrieus\"\n\nnothing","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"Here is where we take the inputs from setupOWENS and break out what is going on behind the function. We do some intermediate calculations on the blade shape and angles","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"Nstrutperbld = 2 #TODO: generalize and propogate\n\nNbld = B\nH = maximum(shapeY) #m,\nR = maximum(shapeX) #m,\nomega = RPM / 60 * 2 * pi\ntsr = omega*R/Vinf\n\nnothing","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"Here we set up the mesh using one of the pre-made meshing functions. For this case, there is a function for the ARCUS, as well as for towered VAWTs where you can have an arbitrary blade shape with connected struts, and if the blade tips touch the tower, then you can tell it to constrain them to the tower thus allowing for both H-VAWT and Darrieus designs.","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"#########################################\n### Set up mesh\n#########################################\nif meshtype == \"ARCUS\" #TODO, for all of these propogate the AeroDyn additional output requirements\n mymesh,myort,myjoint = OWENS.create_arcus_mesh(;Ht,\n Hb = H, #blade height\n R, # m bade radius\n nblade = Nbld,\n ntelem, #tower elements\n nbelem, #blade elements\n ncelem,\n c_mount_ratio,\n bshapex = shapeX, #Blade shape, magnitude is irrelevant, scaled based on height and radius above\n bshapez = shapeY,\n joint_type, #hinged about y axis\n cables_connected_to_blade_base,\n angularOffset) #Blade shape, magnitude is irrelevant, scaled based on height and radius above\nelseif meshtype == \"Darrieus\" || meshtype == \"H-VAWT\"\n\n if meshtype == \"Darrieus\"\n connectBldTips2Twr = true\n else\n connectBldTips2Twr = false\n end\n\n mymesh, myort, myjoint, AD15bldNdIdxRng, AD15bldElIdxRng = OWENS.create_mesh_struts(;Ht,\n Hb = H, #blade height\n R, # m bade radius\n AD15hubR=2.0,\n nblade = Nbld,\n ntelem, #tower elements\n nbelem, #blade elements\n nselem,\n strut_twr_mountpointbot = strut_mountpointbot, # This puts struts at top and bottom\n strut_twr_mountpointtop = strut_mountpointtop, # This puts struts at top and bottom\n strut_bld_mountpointbot = strut_mountpointbot, # This puts struts at top and bottom\n strut_bld_mountpointtop = strut_mountpointtop, # This puts struts at top and bottom\n bshapex = shapeX, #Blade shape, magnitude is irrelevant, scaled based on height and radius above\n bshapez = shapeY,\n bshapey = zeros(nbelem+1), # but magnitude for this is relevant\n angularOffset, #Blade shape, magnitude is irrelevant, scaled based on height and radius above\n AD15_ccw = true,\n verbosity=0, # 0 nothing, 1 basic, 2 lots: amount of printed information\n connectBldTips2Twr)\nelse #TODO unify with HAWT\n error(\"please choose a valid mesh type (Darrieus, H-VAWT, ARCUS)\")\nend\n\nnTwrElem = Int(mymesh.meshSeg[1])\nif contains(NuMad_mat_xlscsv_file_bld,\"34m\") #TODO: this is really odd,\n nTwrElem = Int(mymesh.meshSeg[1])+1\nend\n\nnothing","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"Here is a way that you can visualize the nodal numbers of the mesh","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"PyPlot.figure()\nPyPlot.plot(mymesh.x,mymesh.z,\"b-\")\n for myi = 1:length(mymesh.x)\n PyPlot.text(mymesh.x[myi].+rand()/30,mymesh.z[myi].+rand()/30,\"$myi\",ha=\"center\",va=\"center\")\n PyPlot.draw()\n #sleep(0.1)\n end\nPyPlot.xlabel(\"x\")\nPyPlot.ylabel(\"y\")","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"This is where the sectional properties for the tower are either read in from the file, or are directly input and could be manuplated here in the script","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"#########################################\n### Set up Sectional Properties\n#########################################\n\nif !isnothing(NuMad_geom_xlscsv_file_twr)\n numadIn_twr = OWENS.readNuMadGeomCSV(NuMad_geom_xlscsv_file_twr)\nelse\n n_web = 0\n n_stack = 2\n n_segments = 2\n span = [0.0, 6.607421057, 13.21484211, 19.82226317, 26.42968423, 33.03710529, 39.64452634, 46.2519474, 52.85936846, 59.46678951, 66.07421057, 72.68163163, 79.28905268, 85.89647374, 92.5038948, 99.11131586, 105.7187369, 112.326158, 118.933579, 125.5410001, 132.1484211]\n airfoil = [\"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\"]\n te_type = [\"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\"]\n twist_d = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n chord = [10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 0.25, 0.25, 0.25]\n xoffset = [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]\n aerocenter = [0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25]\n stack_mat_types = [8, 2]\n stack_layers = [70 3; 70 3; 70 3; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03]\n segments = [-1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0]\n DPtypes = [\"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"]\n skin_seq = [Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2])]\n web_seq = Array{Seq, 2}(undef, length(twist_d),0) #can be any number of stack nums, so we have to make non-square containers\n web_dp = Array{Seq, 2}(undef, length(twist_d),0) #this is fixed size square, but it's easier to do it this way\n\n numadIn_twr = NuMad(n_web,n_stack,n_segments,span,airfoil,te_type,twist_d,chord,xoffset,aerocenter,stack_mat_types,stack_layers,segments,DPtypes,skin_seq,web_seq,web_dp)\nend\n\n#Add the full path\nfor (i,airfoil) in enumerate(numadIn_twr.airfoil)\n numadIn_twr.airfoil[i] = \"$path/airfoils/$airfoil\"\nend\n\nnothing","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"Here is where the material properties for the tower are either read in from the file, or directly input","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"if !isnothing(NuMad_mat_xlscsv_file_twr)\n plyprops_twr = OWENS.readNuMadMaterialsCSV(NuMad_mat_xlscsv_file_twr)\nelse\n names = [\"CLA_5500\", \"CBX_2400\", \"ETLX_2400\", \"Airex_C70_55\", \"EBX_2400_x10\", \"ETLX_2400_x10\", \"Airex_C70_55_x10\", \"CFP-baseline\"]\n plies = [Composites.Material{Float64}(9.824e10, 5.102e9, 4.274e9, 0.3, 1540.0, 8.75634139e8, 5.92949102e8, 1.0e8, 1.0e8, 1.0e8, 0.00066), Composites.Material{Float64}(1.4931e10, 1.4931e10, 2.389e10, 0.3, 1530.0, 4.55053962e8, 4.55053962e8, 1.0e8, 1.0e8, 1.0e8, 0.0008100000000000001), Composites.Material{Float64}(2.0333e10, 9.305e9, 4.756e9, 0.3, 1900.0, 5.30896289e8, 5.30896289e8, 1.0e8, 1.0e8, 1.0e8, 0.00066), Composites.Material{Float64}(4.5e7, 4.5e7, 2.2e7, 0.2, 59.0, 1.0e8, 1.0e8, 1.0e8, 1.0e8, 1.0e8, 0.001), Composites.Material{Float64}(9.824e11, 5.102e10, 4.274e10, 0.3, 15300.0, 4.55053962e9, 4.55053962e9, 1.0e8, 1.0e8, 1.0e8, 7.000000000000001e-5), Composites.Material{Float64}(1.4931e11, 1.4931e11, 2.389e11, 0.3, 19000.0, 5.30896289e9, 5.30896289e9, 1.0e8, 1.0e8, 1.0e8, 8.0e-5), Composites.Material{Float64}(2.03335e11, 9.3051e10, 4.756e10, 0.2, 590.0, 1.0e9, 1.0e9, 1.0e8, 1.0e8, 1.0e8, 7.000000000000001e-5), Composites.Material{Float64}(1.576e11, 9.1e9, 3.3e9, 0.263, 1600.0, 2.236e9, 1.528e9, 1.0e8, 1.0e8, 1.0e8, 0.00066)]\n plyprops_twr = OWENS.plyproperties(names,plies)\nend","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"Then this is where precomp.jl is called to get first the precomp outputs, then formatting those into the OWENS format, and then in the GXBeam.jl format for if GXBeam is used as the structural solver.","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"twr_precompoutput,twr_precompinput,lam_U_twr,lam_L_twr,lam_W_twr = OWENS.getOWENSPreCompOutput(numadIn_twr;plyprops = plyprops_twr)\nsectionPropsArray_twr = OWENS.getSectPropsFromOWENSPreComp(LinRange(0,1,nTwrElem),numadIn_twr,twr_precompoutput;precompinputs=twr_precompinput)\nstiff_twr, mass_twr = OWENS.getSectPropsFromOWENSPreComp(LinRange(0,1,nTwrElem),numadIn_twr,twr_precompoutput;GX=true)\n\nnothing","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"For the blades, we repeat what was done for the tower, but also include some simple design options for scaling thicknesses,","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"if !isnothing(NuMad_geom_xlscsv_file_bld)\n numadIn_bld = OWENS.readNuMadGeomCSV(NuMad_geom_xlscsv_file_bld)\nelse\n n_web = 1\n n_stack = 7\n n_segments = 12\n span = [0.0, 6.607, 13.215, 19.822, 26.43, 33.037, 39.645, 46.252, 52.859, 59.467, 66.074, 72.682, 79.289, 85.896, 92.504, 99.111, 105.719, 112.326, 118.934, 125.541, 132.148]\n airfoil = [\"circular\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\"]\n te_type = [\"round\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\"]\n twist_d = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n chord = [10.0, 10.0, 9.0, 8.0, 8.0, 7.0, 7.0, 6.0, 6.0, 6.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0]\n xoffset = [0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3]\n aerocenter = [0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2]\n stack_mat_types = [8, 2, 4, 8, 8, 8, 4]\n if isnothing(stack_layers_bld)\n stack_layers = [30.0 2.0 15.0 25.0 25.0 2.0 13.0; 15.0 2.0 10.0 13.0 11.0 2.0 11.0; 10.0 1.0 8.0 10.0 10.0 2.0 10.0; 8.0 1.0 6.0 9.0 10.0 1.0 9.0; 7.0 1.0 5.0 8.0 9.0 1.0 7.0; 6.0 1.0 4.0 8.0 9.0 1.0 6.0; 6.0 1.0 4.0 8.0 8.0 1.0 5.0; 6.0 1.0 4.0 7.0 7.0 1.0 5.0; 7.0 1.0 3.0 6.0 6.0 1.0 5.0; 8.0 1.0 3.0 6.0 6.0 1.0 5.0; 8.0 1.0 3.0 6.0 6.0 1.0 5.0; 7.0 1.0 3.0 6.0 6.0 1.0 5.0; 7.0 1.0 3.0 6.0 6.0 2.0 5.0; 7.0 1.0 3.0 6.0 6.0 2.0 5.0; 7.0 1.0 3.0 7.0 8.0 3.0 5.0; 7.0 2.0 3.0 9.0 12.0 3.0 6.0; 10.0 3.0 4.0 11.0 15.0 3.0 6.0; 12.0 3.0 4.0 13.0 15.0 3.0 6.0; 12.0 3.0 4.0 15.0 15.0 3.0 6.0; 12.0 3.0 4.0 15.0 15.0 3.0 6.0; 10.0 1.0 4.0 10.0 12.0 1.0 5.0]\n else\n stack_layers = stack_layers_bld\n end\n segments = [-1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0]\n DPtypes = [\"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"]\n skin_seq = [Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2])]\n web_seq = [Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]);;]\n web_dp = [Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]);;]\n\n numadIn_bld = NuMad(n_web,n_stack,n_segments,span,airfoil,te_type,twist_d,chord,xoffset,aerocenter,stack_mat_types,stack_layers,segments,DPtypes,skin_seq,web_seq,web_dp)\nend\nfor icol = 1:length(numadIn_bld.stack_layers[1,:])\n numadIn_bld.stack_layers[:,icol] .*= LinRange(stack_layers_scale[1],stack_layers_scale[2],length(numadIn_bld.chord))\nend\nnumadIn_bld.chord .*= LinRange(chord_scale[1],chord_scale[2],length(numadIn_bld.chord))\n\nfor (i,airfoil) in enumerate(numadIn_bld.airfoil)\n numadIn_bld.airfoil[i] = \"$path/airfoils/$airfoil\"\nend\n\nif !isnothing(NuMad_mat_xlscsv_file_bld)\n plyprops_bld = OWENS.readNuMadMaterialsCSV(NuMad_mat_xlscsv_file_bld)\nelse\n names = [\"CLA_5500\", \"CBX_2400\", \"ETLX_2400\", \"Airex_C70_55\", \"EBX_2400_x10\", \"ETLX_2400_x10\", \"Airex_C70_55_x10\", \"CFP-baseline\"]\n plies = [Composites.Material{Float64}(9.824e10, 5.102e9, 4.274e9, 0.3, 1540.0, 8.75634139e8, 5.92949102e8, 1.0e8, 1.0e8, 1.0e8, 0.00066), Composites.Material{Float64}(1.4931e10, 1.4931e10, 2.389e10, 0.3, 1530.0, 4.55053962e8, 4.55053962e8, 1.0e8, 1.0e8, 1.0e8, 0.0008100000000000001), Composites.Material{Float64}(2.0333e10, 9.305e9, 4.756e9, 0.3, 1900.0, 5.30896289e8, 5.30896289e8, 1.0e8, 1.0e8, 1.0e8, 0.00066), Composites.Material{Float64}(4.5e7, 4.5e7, 2.2e7, 0.2, 59.0, 1.0e8, 1.0e8, 1.0e8, 1.0e8, 1.0e8, 0.001), Composites.Material{Float64}(9.824e11, 5.102e10, 4.274e10, 0.3, 15300.0, 4.55053962e9, 4.55053962e9, 1.0e8, 1.0e8, 1.0e8, 7.000000000000001e-5), Composites.Material{Float64}(1.4931e11, 1.4931e11, 2.389e11, 0.3, 19000.0, 5.30896289e9, 5.30896289e9, 1.0e8, 1.0e8, 1.0e8, 8.0e-5), Composites.Material{Float64}(2.03335e11, 9.3051e10, 4.756e10, 0.2, 590.0, 1.0e8, 1.0e8, 1.0e8, 1.0e8, 1.0e8, 7.000000000000001e-5), Composites.Material{Float64}(1.576e11, 9.1e9, 3.3e9, 0.263, 1600.0, 2.236e9, 1.528e9, 1.0e8, 1.0e8, 1.0e8, 0.00066)]\n plyprops_bld = OWENS.plyproperties(names,plies)\nend\n\nbld1start = Int(mymesh.structuralNodeNumbers[1,1]) #Get blade spanwise position\nbld1end = Int(mymesh.structuralNodeNumbers[1,end])\nspanpos = [0.0;cumsum(sqrt.(diff(mymesh.x[bld1start:bld1end]).^2 .+ diff(mymesh.z[bld1start:bld1end]).^2))]\n\nif length(thickness_scale)==2\n yscale = collect(LinRange(thickness_scale[1],thickness_scale[2],length(numadIn_bld.span)))\nelseif length(thickness_scale)==length(numadIn_bld.span)\n yscale = thickness_scale\nend\n\nbld_precompoutput,bld_precompinput,lam_U_bld,lam_L_bld,lam_W_bld = OWENS.getOWENSPreCompOutput(numadIn_bld;yscale,plyprops = plyprops_bld)\nsectionPropsArray_bld = OWENS.getSectPropsFromOWENSPreComp(spanpos,numadIn_bld,bld_precompoutput;precompinputs=bld_precompinput)\nstiff_bld, mass_bld = OWENS.getSectPropsFromOWENSPreComp(spanpos,numadIn_bld,bld_precompoutput;GX=true)\n\nnothing","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"Similarly for the struts, we do what was done for the blades","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"if !isnothing(NuMad_geom_xlscsv_file_strut)\n numadIn_strut = OWENS.readNuMadGeomCSV(NuMad_geom_xlscsv_file_strut)\nelse\n n_web = 1\n n_stack = 7\n n_segments = 12\n span = [0.0, 6.607, 13.215, 19.822, 26.43, 33.037, 39.645, 46.252, 52.859, 59.467, 66.074, 72.682, 79.289, 85.896, 92.504, 99.111, 105.719, 112.326, 118.934, 125.541, 132.148]\n airfoil = [\"circular\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\"]\n te_type = [\"round\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\"]\n twist_d = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n chord = [10.0, 10.0, 9.0, 8.0, 8.0, 7.0, 7.0, 6.0, 6.0, 6.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0]\n xoffset = [0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3]\n aerocenter = [0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2]\n stack_mat_types = [8, 2, 4, 8, 8, 8, 4]\n if isnothing(stack_layers_strut)\n stack_layers = [30.0 2.0 15.0 25.0 25.0 2.0 13.0; 15.0 2.0 10.0 13.0 11.0 2.0 11.0; 10.0 1.0 8.0 10.0 10.0 2.0 10.0; 8.0 1.0 6.0 9.0 10.0 1.0 9.0; 7.0 1.0 5.0 8.0 9.0 1.0 7.0; 6.0 1.0 4.0 8.0 9.0 1.0 6.0; 6.0 1.0 4.0 8.0 8.0 1.0 5.0; 6.0 1.0 4.0 7.0 7.0 1.0 5.0; 7.0 1.0 3.0 6.0 6.0 1.0 5.0; 8.0 1.0 3.0 6.0 6.0 1.0 5.0; 8.0 1.0 3.0 6.0 6.0 1.0 5.0; 7.0 1.0 3.0 6.0 6.0 1.0 5.0; 7.0 1.0 3.0 6.0 6.0 2.0 5.0; 7.0 1.0 3.0 6.0 6.0 2.0 5.0; 7.0 1.0 3.0 7.0 8.0 3.0 5.0; 7.0 2.0 3.0 9.0 12.0 3.0 6.0; 10.0 3.0 4.0 11.0 15.0 3.0 6.0; 12.0 3.0 4.0 13.0 15.0 3.0 6.0; 12.0 3.0 4.0 15.0 15.0 3.0 6.0; 12.0 3.0 4.0 15.0 15.0 3.0 6.0; 10.0 1.0 4.0 10.0 12.0 1.0 5.0]\n else\n stack_layers = stack_layers_strut\n end\n segments = [-1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0]\n DPtypes = [\"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"]\n skin_seq = [Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2])]\n web_seq = [Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]);;]\n web_dp = [Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]);;]\n\n numadIn_strut = NuMad(n_web,n_stack,n_segments,span,airfoil,te_type,twist_d,chord,xoffset,aerocenter,stack_mat_types,stack_layers,segments,DPtypes,skin_seq,web_seq,web_dp)\nend\nfor icol = 1:length(numadIn_strut.stack_layers[1,:])\n numadIn_strut.stack_layers[:,icol] .*= LinRange(stack_layers_scale[1],stack_layers_scale[2],length(numadIn_strut.chord))\nend\nnumadIn_strut.chord .*= LinRange(chord_scale[1],chord_scale[2],length(numadIn_strut.chord))\n\nfor (i,airfoil) in enumerate(numadIn_strut.airfoil)\n numadIn_strut.airfoil[i] = \"$path/airfoils/$airfoil\"\nend\n\nif !isnothing(NuMad_mat_xlscsv_file_strut)\n plyprops_strut = OWENS.readNuMadMaterialsCSV(NuMad_mat_xlscsv_file_strut)\nelse\n names = [\"CLA_5500\", \"CBX_2400\", \"ETLX_2400\", \"Airex_C70_55\", \"EBX_2400_x10\", \"ETLX_2400_x10\", \"Airex_C70_55_x10\", \"CFP-baseline\"]\n plies = [Composites.Material{Float64}(9.824e10, 5.102e9, 4.274e9, 0.3, 1540.0, 8.75634139e8, 5.92949102e8, 1.0e8, 1.0e8, 1.0e8, 0.00066), Composites.Material{Float64}(1.4931e10, 1.4931e10, 2.389e10, 0.3, 1530.0, 4.55053962e8, 4.55053962e8, 1.0e8, 1.0e8, 1.0e8, 0.0008100000000000001), Composites.Material{Float64}(2.0333e10, 9.305e9, 4.756e9, 0.3, 1900.0, 5.30896289e8, 5.30896289e8, 1.0e8, 1.0e8, 1.0e8, 0.00066), Composites.Material{Float64}(4.5e7, 4.5e7, 2.2e7, 0.2, 59.0, 1.0e8, 1.0e8, 1.0e8, 1.0e8, 1.0e8, 0.001), Composites.Material{Float64}(9.824e11, 5.102e10, 4.274e10, 0.3, 15300.0, 4.55053962e9, 4.55053962e9, 1.0e8, 1.0e8, 1.0e8, 7.000000000000001e-5), Composites.Material{Float64}(1.4931e11, 1.4931e11, 2.389e11, 0.3, 19000.0, 5.30896289e9, 5.30896289e9, 1.0e8, 1.0e8, 1.0e8, 8.0e-5), Composites.Material{Float64}(2.03335e11, 9.3051e10, 4.756e10, 0.2, 590.0, 1.0e8, 1.0e8, 1.0e8, 1.0e8, 1.0e8, 7.000000000000001e-5), Composites.Material{Float64}(1.576e11, 9.1e9, 3.3e9, 0.263, 1600.0, 2.236e9, 1.528e9, 1.0e8, 1.0e8, 1.0e8, 0.00066)]\n plyprops_strut = OWENS.plyproperties(names,plies)\nend\n\n#TODO: not straight struts\nspanpos = LinRange(0,1,nselem+1)#[0.0;cumsum(sqrt.(diff(mymesh.x[strut1start:strut1end]).^2 .+ diff(mymesh.z[strut1start:strut1end]).^2))]\n\nif length(thickness_scale)==2\n yscale = collect(LinRange(thickness_scale[1],thickness_scale[2],length(numadIn_strut.span)))\nelseif length(thickness_scale)==length(numadIn_strut.span)\n yscale = thickness_scale\nend\n\nstrut_precompoutput,strut_precompinput,lam_U_strut,lam_L_strut,lam_W_strut = OWENS.getOWENSPreCompOutput(numadIn_strut;yscale,plyprops = plyprops_strut)\nsectionPropsArray_strut = OWENS.getSectPropsFromOWENSPreComp(spanpos,numadIn_strut,strut_precompoutput;precompinputs=strut_precompinput)\nstiff_strut, mass_strut = OWENS.getSectPropsFromOWENSPreComp(spanpos,numadIn_strut,strut_precompoutput;GX=true)\n\nnothing","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"Here we combine the section properties into an array matching the mesh elements","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"bldssecprops = collect(Iterators.flatten(fill(sectionPropsArray_bld, Nbld)))\nstrutssecprops = collect(Iterators.flatten(fill(sectionPropsArray_strut, Nstrutperbld*Nbld)))\n\nif meshtype == \"ARCUS\"\n cable_secprop = sectionPropsArray_twr[end]\n Nremain = sum(Int,mymesh.meshSeg[Nbld+1+1:end]) #strut elements remain\n sectionPropsArray = [fill(sectionPropsArray_twr[1],length(sectionPropsArray_twr));bldssecprops; fill(cable_secprop,Nremain)]#;sectionPropsArray_str;sectionPropsArray_str;sectionPropsArray_str;sectionPropsArray_str]\n\n stiff_blds = collect(Iterators.flatten(fill(stiff_bld, Nbld))) # GXBeam sectional properties\n stiff_cables = fill(stiff_twr[end],Nremain)\n stiff_array = [stiff_twr; stiff_blds; stiff_cables]\n\n mass_blds = collect(Iterators.flatten(fill(mass_bld, Nbld)))\n mass_cables = fill(mass_twr[end],Nremain)\n mass_array = [mass_twr; mass_blds; mass_cables]\nelse\n sectionPropsArray = [sectionPropsArray_twr; bldssecprops; strutssecprops]#;sectionPropsArray_str;sectionPropsArray_str;sectionPropsArray_str;sectionPropsArray_str]\n\n stiff_blds = collect(Iterators.flatten(fill(stiff_bld, Nbld))) # GXBeam sectional properties\n stiff_struts = collect(Iterators.flatten(fill(stiff_strut, Nstrutperbld*Nbld)))\n stiff_array = [stiff_twr; stiff_blds; stiff_struts]\n\n mass_blds = collect(Iterators.flatten(fill(mass_bld, Nbld)))\n mass_struts = collect(Iterators.flatten(fill(mass_strut, Nstrutperbld*Nbld)))\n mass_array = [mass_twr; mass_blds; mass_struts]\nend\nrotationalEffects = ones(mymesh.numEl) #TODO: non rotating tower, or rotating blades\n\nmyel = OWENSFEA.El(sectionPropsArray,myort.Length,myort.Psi_d,myort.Theta_d,myort.Twist_d,rotationalEffects) #store data in element object\nsystem, assembly, sections = OWENS.owens_to_gx(mymesh,myort,myjoint,sectionPropsArray,stiff_array,mass_array)\n\nnothing","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"Set up the OWENSAero aerodynamics if used","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"if !AD15On\n #########################################\n ### Set up aero forces\n #########################################\n ### translate from blade span to blade height between the numad definition and the vertical slice positions\n ### First get the angles from the overall geometry npoints and go to the numad npoints\n delta_xs = shapeX[2:end] - shapeX[1:end-1]\n delta_zs = shapeY[2:end] - shapeY[1:end-1]\n delta3D = atan.(delta_xs./delta_zs)\n delta3D_spl = FLOWMath.akima(shapeY[1:end-1]./maximum(shapeY[1:end-1]), delta3D,LinRange(0,1,length(numadIn_bld.span)-1))\n\n bld_height_numad = cumsum(diff(numadIn_bld.span).*(1.0.-abs.(sin.(delta3D_spl)))) # now convert the numad span to a height\n\n chord = FLOWMath.akima(bld_height_numad./maximum(bld_height_numad), numadIn_bld.chord,LinRange(0,1,Nslices)) # now we can use it to access the numad data\n airfoils = fill(\"nothing\",Nslices)\n\n for (iheight_numad,height_numad) in enumerate(bld_height_numad./maximum(bld_height_numad)) # Discretely assign the airfoils\n for (iheight,height_slices) in enumerate(collect(LinRange(0,1,Nslices)))\n if airfoils[iheight]==\"nothing\" && height_slices<=height_numad\n airfoils[iheight] = \"$(numadIn_bld.airfoil[iheight_numad]).dat\"\n end\n end\n end\n\n OWENSAero.setupTurb(shapeX,shapeY,B,chord,tsr,Vinf;AModel,DSModel,\n afname = airfoils, #TODO: map to the numad input\n rho,\n eta,\n ifw, #TODO: propogate WindType\n turbsim_filename = windINPfilename,\n ifw_libfile,\n tau = [1e-5,1e-5],\n ntheta,\n Nslices,\n RPI)\n\n aeroForcesACDMS(t,azi) = OWENS.mapACDMS(t,azi,mymesh,myel,OWENSAero.AdvanceTurbineInterpolate;alwaysrecalc=true)\n deformAeroACDMS = OWENSAero.deformTurb\nend\nnothing","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"Set up AeroDyn if used Here we create AeroDyn the files, first by specifying the names, then by creating the files Then by initializing AeroDyn and grabbing the backend functionality with a function handle","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"if AD15On\n ad_input_file=\"$path/ADInputFile_SingleTurbine2.dat\"\n ifw_input_file=\"$path/IW2.dat\"\n blade_filename=\"$path/blade2.dat\"\n lower_strut_filename=\"$path/lower_arm2.dat\"\n upper_strut_filename=\"$path/upper_arm2.dat\"\n OLAF_filename = \"$path/OLAF2.dat\"\n\n NumADBldNds = NumADStrutNds = 10\n\n bldchord_spl = FLOWMath.akima(numadIn_bld.span./maximum(numadIn_bld.span), numadIn_bld.chord,LinRange(0,1,NumADBldNds))\n\n airfoil_filenames = fill(\"nothing\",NumADBldNds) # Discretely assign the airfoils #TODO: separate out struts\n for (ispan_numad,span_numad) in enumerate(numadIn_bld.span./maximum(numadIn_bld.span))\n for (ispan,span_slices) in enumerate(collect(LinRange(0,1,NumADBldNds)))\n if airfoil_filenames[ispan]==\"nothing\" && span_slices<=span_numad\n airfoil_filenames[ispan] = \"$(numadIn_bld.airfoil[ispan_numad]).dat\"\n end\n end\n end\n\n if meshtype == \"ARCUS\"\n blade_filenames = [blade_filename for i=1:Nbld]\n blade_chords = [bldchord_spl for i=1:Nbld]\n blade_Nnodes = [NumADBldNds for i=1:Nbld]\n else\n blade_filenames = [[blade_filename for i=1:Nbld];[lower_strut_filename for i=1:Nbld];[upper_strut_filename for i=1:Nbld]]\n strutchord_spl = FLOWMath.akima(numadIn_strut.span./maximum(numadIn_strut.span), numadIn_strut.chord,LinRange(0,1,NumADStrutNds))\n blade_chords = [[bldchord_spl for i=1:Nbld];[strutchord_spl for i=1:Nbld];[strutchord_spl for i=1:Nbld]]\n blade_Nnodes = [[NumADBldNds for i=1:Nbld];[NumADStrutNds for i=1:Nbld];[NumADStrutNds for i=1:Nbld]]\n end\n\n OWENSOpenFASTWrappers.writeADinputFile(ad_input_file,blade_filenames,airfoil_filenames,OLAF_filename)\n\n NumADBody = length(AD15bldNdIdxRng[:,1])\n bld_len = zeros(NumADBody)\n for (iADBody,filename) in enumerate(blade_filenames)\n strt_idx = AD15bldNdIdxRng[iADBody,1]\n end_idx = AD15bldNdIdxRng[iADBody,2]\n if end_idx0\n\n println(\"\\nBlades' Mass Breakout\")\n for (i,name) in enumerate(plyprops_bld.names)\n println(\"$name $(mass_breakout_blds[i]) kg, $(plyprops_bld.costs[i]) \\$/kg: \\$$(mass_breakout_blds[i]*plyprops_bld.costs[i])\")\n end\n\n println(\"\\nTower Mass Breakout\")\n for (i,name) in enumerate(plyprops_twr.names)\n println(\"$name $(mass_breakout_twr[i]) kg, $(plyprops_twr.costs[i]) \\$/kg: \\$$(mass_breakout_twr[i]*plyprops_twr.costs[i])\")\n end\n\n println(\"Total Material Cost Blades: \\$$(sum(mass_breakout_blds.*plyprops_bld.costs))\")\n println(\"Total Material Cost Tower: \\$$(sum(mass_breakout_twr.*plyprops_twr.costs))\")\n println(\"Total Material Cost: \\$$(sum(mass_breakout_blds.*plyprops_bld.costs)+ sum(mass_breakout_twr.*plyprops_twr.costs))\")\n\nend\n\npBC = [1 1 0\n1 2 0\n1 3 0\n1 4 0\n1 5 0\n1 6 0]\n\ninputs = OWENS.Inputs(;analysisType = structuralModel,\ntocp = [0.0,100000.1],\nOmegaocp = [RPM,RPM] ./ 60,\ntocp_Vinf = [0.0,100000.1],\nVinfocp = [Vinf,Vinf],\nnumTS,\ndelta_t,\nAD15On,\naeroLoadsOn = 2)\n\nfeamodel = OWENS.FEAModel(;analysisType = structuralModel,\noutFilename = \"none\",\njoint = myjoint,\nplatformTurbineConnectionNodeNumber = 1,\npBC,\nnlOn = true,\nnumNodes = mymesh.numNodes,\nRayleighAlpha = 0.05,\nRayleighBeta = 0.05,\niterationType = \"DI\")\n\nprintln(\"Running Unsteady\")\nif AD15On\n t, aziHist,OmegaHist,OmegaDotHist,gbHist,gbDotHist,gbDotDotHist,FReactionHist,\n FTwrBsHist,genTorque,genPower,torqueDriveShaft,uHist,uHist_prp,epsilon_x_hist,epsilon_y_hist,\n epsilon_z_hist,kappa_x_hist,kappa_y_hist,kappa_z_hist = OWENS.Unsteady_Land(inputs;system,assembly,\n topModel=feamodel,topMesh=mymesh,topEl=myel,aero=aeroForcesAD,deformAero=deformAeroAD)\nelse\n t, aziHist,OmegaHist,OmegaDotHist,gbHist,gbDotHist,gbDotDotHist,FReactionHist,\n FTwrBsHist,genTorque,genPower,torqueDriveShaft,uHist,uHist_prp,epsilon_x_hist,epsilon_y_hist,\n epsilon_z_hist,kappa_x_hist,kappa_y_hist,kappa_z_hist = OWENS.Unsteady_Land(inputs;system,assembly,\n topModel=feamodel,topMesh=mymesh,topEl=myel,aero=aeroForcesACDMS,deformAero=deformAeroACDMS)\nend\n\nif AD15On #TODO: move this into the run functions\n OWENSOpenFASTWrappers.endTurb()\nend\n\nprintln(\"Saving VTK time domain files\")\nOWENS.OWENSFEA_VTK(\"$path/vtk/SNLARCUS5MW_timedomain_TNBnltrue\",t,uHist,system,assembly,sections;scaling=1,azi=aziHist)\n\n\n##########################################\n#### Ultimate Failure #####\n##########################################\n\nmassOwens,stress_U,SF_ult_U,SF_buck_U,stress_L,SF_ult_L,SF_buck_L,stress_TU,SF_ult_TU,\nSF_buck_TU,stress_TL,SF_ult_TL,SF_buck_TL,topstrainout_blade_U,topstrainout_blade_L,\ntopstrainout_tower_U,topstrainout_tower_LtopDamage_blade_U,\ntopDamage_blade_L,topDamage_tower_U,topDamage_tower_L = OWENS.extractSF(bld_precompinput,\nbld_precompoutput,plyprops_bld,numadIn_bld,lam_U_bld,lam_L_bld,\ntwr_precompinput,twr_precompoutput,plyprops_twr,numadIn_twr,lam_U_twr,lam_L_twr,\nmymesh,myel,myort,Nbld,epsilon_x_hist,kappa_y_hist,kappa_z_hist,epsilon_z_hist,\nkappa_x_hist,epsilon_y_hist;verbosity, #Verbosity 0:no printing, 1: summary, 2: summary and spanwise worst safety factor # epsilon_x_hist_1,kappa_y_hist_1,kappa_z_hist_1,epsilon_z_hist_1,kappa_x_hist_1,epsilon_y_hist_1,\nLE_U_idx=1,TE_U_idx=6,SparCapU_idx=3,ForePanelU_idx=2,AftPanelU_idx=5,\nLE_L_idx=1,TE_L_idx=6,SparCapL_idx=3,ForePanelL_idx=2,AftPanelL_idx=5,\nTwr_LE_U_idx=1,Twr_LE_L_idx=1,\nAD15bldNdIdxRng,AD15bldElIdxRng,strut_precompoutput=nothing,strut_precompinput,plyprops_strut,numadIn_strut,lam_U_strut,lam_L_strut) #TODO: add in ability to have material safety factors and load safety factors\n\nnothing","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"This page was generated using Literate.jl.","category":"page"},{"location":"examples/A_simplyRunningOWENS/","page":"Simply Running OWENS","title":"Simply Running OWENS","text":"EditURL = \"../literate/A_simplyRunningOWENS.jl\"","category":"page"},{"location":"examples/A_simplyRunningOWENS/#simple1","page":"Simply Running OWENS","title":"Simply Running OWENS","text":"","category":"section"},{"location":"examples/A_simplyRunningOWENS/","page":"Simply Running OWENS","title":"Simply Running OWENS","text":"In this example, we show the first level of what is going on behind the precompiled binary Running julia directly with this as a starting point could make things like automating many runs in a way that is not compatible with the current interface, but your design design fits.","category":"page"},{"location":"examples/A_simplyRunningOWENS/","page":"Simply Running OWENS","title":"Simply Running OWENS","text":"OWENS is comprised of many building blocks. These series of examples progressively shows the internals of several of the key building blocks a new user might employ for their projects. Fundamentally, OWENS has been built to be as generalizable as possible. The lowest level of building blocks enable this, however, there are many common use cases for which helper functions have been developed, such as for meshing certain standard architectures and calculating and applying sectional properties to these architectures. The figure below summarizes this at a high level. TODO: yml file definition and inputs expanded","category":"page"},{"location":"examples/A_simplyRunningOWENS/","page":"Simply Running OWENS","title":"Simply Running OWENS","text":"(Image: )","category":"page"},{"location":"examples/A_simplyRunningOWENS/","page":"Simply Running OWENS","title":"Simply Running OWENS","text":"tip: Tip\nThis example is also available as a Jupyter notebook todo: get link working:","category":"page"},{"location":"examples/A_simplyRunningOWENS/","page":"Simply Running OWENS","title":"Simply Running OWENS","text":"import OWENS\n\nrunpath = \"/home/runner/work/OWENS.jl/OWENS.jl/docs/src/literate\" #splitdir(@__FILE__)[1]\n\nInp = OWENS.MasterInput(\"/home/runner/work/OWENS.jl/OWENS.jl/docs/src/literate/sampleOWENS.yml\")\n\nOWENS.runOWENS(Inp,runpath)","category":"page"},{"location":"examples/A_simplyRunningOWENS/","page":"Simply Running OWENS","title":"Simply Running OWENS","text":"","category":"page"},{"location":"examples/A_simplyRunningOWENS/","page":"Simply Running OWENS","title":"Simply Running OWENS","text":"This page was generated using Literate.jl.","category":"page"},{"location":"reference/reference/","page":"API Reference","title":"API Reference","text":"CurrentModule = OWENS","category":"page"},{"location":"reference/reference/#Index","page":"API Reference","title":"Index","text":"","category":"section"},{"location":"reference/reference/","page":"API Reference","title":"API Reference","text":"","category":"page"},{"location":"reference/reference/#Types-and-functions","page":"API Reference","title":"Types and functions","text":"","category":"section"},{"location":"reference/reference/","page":"API Reference","title":"API Reference","text":"Modules = [OWENS]","category":"page"},{"location":"reference/reference/#OWENS.Bin","page":"API Reference","title":"OWENS.Bin","text":"Inputs pointing to the file paths of compiled binaries of external libraries\n\n\n\n\n\n","category":"type"},{"location":"reference/reference/#OWENS.Blade","page":"API Reference","title":"OWENS.Blade","text":"Internal, struct containing the CACTUS geometry file data for a blade\n\n\n\n\n\n","category":"type"},{"location":"reference/reference/#OWENS.BladeData","page":"API Reference","title":"OWENS.BladeData","text":"Internal, struct containing blade specific data and location within the mesh\n\n\n\n\n\n","category":"type"},{"location":"reference/reference/#OWENS.CactusGeom","page":"API Reference","title":"OWENS.CactusGeom","text":"Internal, struct containing the CACTUS geometry file data\n\n\n\n\n\n","category":"type"},{"location":"reference/reference/#OWENS.DriveShaftProps","page":"API Reference","title":"OWENS.DriveShaftProps","text":"Internal, driveshaft stiffness k and damping c\n\n\n\n\n\n","category":"type"},{"location":"reference/reference/#OWENS.Inputs-Tuple{}","page":"API Reference","title":"OWENS.Inputs","text":"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, )\n\nModel inputs for OWENS coupled analysis, struct\n\nInputs\n\nanalysisType::string: Newmark Beta time stepping \"TNB\", Dean time stepping \"TD\", modal \"M\"\nturbineStartup::int: 1 forced start-up using generator as motor, 2 self-starting mode, 0 specified rotor speed mode\")\nusingRotorSpeedFunction::bool: use user specified rotor speed profile function\ntocp::Array{<:float}: = time points for rotor speed profile (s)\ntocp_Vinf::Array{<:float}: = time points for specified Vinf profile (s)\nnumTS::int: total number of timesteps to run\ndelta_t::float: timestep interval (s)\nOmegaocp::Array{<:float}: = rotor speed points for rotor speed profile (Hz)\nVinfocp::Array{<:float}: = rotor speed points for specified Vinf profile (Hz)\naeroLoadsOn::bool: #0 off, 1 one way, 1.5 one way with deformation from last timestep, 2 two way\nAD15On::bool: flag to use AD15 for aero\ndriveTrainOn::bool: flag to include drivetrain effects\ngeneratorOn::bool: flag to include generator effects\nhydroOn::bool: flag to include platform coupling\ninterpOrder::int: order used for extrapolating inputs and states, 0 flat, 1 linear, 2 quadratic\nhd_input_file::string: file path to the HydroDyn .dat input file\nmd_input_file::string: file path to the MoorDyn .dat input file\nJgearBox::float: gearbox intertia, standard SI units\ngearRatio::float: gearbox gear ratio\ngearBoxEfficiency::float: gearbox efficiency (typically 0-1)\nuseGeneratorFunction::bool: = flag to use user specified generator profile\ngeneratorProps::float: not used, should clean up\nratedTorque::float: Generator rated max torque\nzeroTorqueGenSpeed::float: rated generator speed (minus slippage)\npulloutRatio::float: Fraction of the min/max torque that the generator engages/disengages\nratedGenSlipPerc::float: extra speed from slipping?\nOmegaGenStart::float: speed (Hz) at which generator would kick in\nomegaControl::bool: false for fixed speed, true for dynamic\nOmegaInit::float: initial rotor speed (Hz)\naeroloadfile::string: string of the name and path for the cactus aeroloads if using the old serial owens call\nowensfile::string: string of the name and path for the owens input file if using the old serial owens call\npotflowfile::string: string of the prefix and path for the directory containing the potential flow files from WAMIT (required by HydroDyn)\noutFilename::string: path and name of output file, will be overwritten if already exists\nnumDofPerNode::int: number of degrees of freedom per node\nbladeData::BladeData: see ?BladeData, only used if calling the old serial owens function\ndriveShaftProps::DriveShaftProps: see ?DriveShaftProps\nTOl::float: gauss-seidel iteration tolerance\nMAXITER::int: gauss-seidel maximum iterations\niterwarnings::bool: iteration warnings flag\n\nOutputs:\n\nOWENS.Inputs:\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.Iteration_Parameters","page":"API Reference","title":"OWENS.Iteration_Parameters","text":"Internal, gauss-seidel iteration parameters \n\n\n\n\n\n","category":"type"},{"location":"reference/reference/#OWENS.NuMad","page":"API Reference","title":"OWENS.NuMad","text":"NuMad(nweb,nstack,nsegments,span,airfoil,tetype,twistd,chord,xoffset,aerocenter,stackmattypes,stacklayers,segments,DPtypes,skin,webstack,webdp)\n\nParameters defining the blade composite layup. See NuMad user guide SAND2012_7028 appendix B for more details\n\nArguments\n\nn_web::Int64: number of shear webs\nn_stack::Int64: number of predefined composite stacks\nn_segments::Int64: number of segments around the airfoil\nspan::Vector{Float64}: span-wise position\nairfoil::Vector{String}: airfoil name\nte_type::Vector{String}: trailing edge type\ntwist_d::Vector{Float64}: twist_d in degrees\nchord::Vector{Float64}: chord length\nxoffset::Vector{Float64}: The distance from the “nose” of a station to the blade reference axis.\naerocenter::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.\nstack_mat_types::Vector{Int64}: Material numbers used that correspond to each stack number\nstack_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)\nsegments::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\nDPtypes::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 positoin, second corresponds to section number\nskin_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\nweb_seq::Array{Seq,2}: same format and meaning as skin sequence, but for the webs with the second index corresponding to the web number\nweb_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.\n\n\n\n\n\n","category":"type"},{"location":"reference/reference/#OWENS.Strut","page":"API Reference","title":"OWENS.Strut","text":"Internal, struct containing the CACTUS geometry file data for a strut\n\n\n\n\n\n","category":"type"},{"location":"reference/reference/#OWENS.plyproperties-Tuple{}","page":"API Reference","title":"OWENS.plyproperties","text":"Struct containing\n\nmaterial names\n\nComposites.Material structs for each material name - see ?Composites.Material\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.Unsteady-Tuple{Any}","page":"API Reference","title":"OWENS.Unsteady","text":"Unsteady(model,topModel,mesh,el,aero;getLinearizedMatrices=false)\n\nExecutable function for transient analysis. Provides the interface of various external module with transient structural dynamics analysis capability.\n\n# Input\n* `inputs::Inputs`: see ?Inputs\n* `topModel::FEAModel`: see ?OWENSFEA.FEAModel\n* `mesh::Mesh`: see ?OWENSFEA.Mesh\n* `el::El`: see ?OWENSFEA.El\n* `bin::Bin`: see ?Bin\n* `aero::function`: Fexternal, Fdof = aero(t) where Fexternal is the force on each affected mesh dof and Fdof is the corresponding DOFs affected\n* `getLinearizedMatrices::Bool`: Flag to save the linearized matrices\n* `elStorage::ElStorage.ElStorage`: Optional object containing stored element matrices\n* `u_s::Array{<:float}`: Optional warm start of top deflections, of length Nnodes x Ndof\n\n\n# Output\n* `t`: time array\n* `aziHist`: azimuthal history array\n* `OmegaHist`: rotational speed array history\n* `OmegaDotHist`: rotational acceleration array history\n* `gbHist`: gearbox position history array\n* `gbDotHist`: gearbox velocity history array\n* `gbDotDotHist`: gearbox acceleration history array\n* `FReactionHist`: Nodal reaction 6dof forces history\n* `rigidDof`:\n* `genTorque`: generator torque history\n* `genPower`: generator power history\n* `torqueDriveShaft`: driveshaft torque history\n* `uHist`: mesh displacement history for each dof\n* `epsilon_x_hist`: strain history for eps_xx_0 for each dof\n* `epsilon_y_hist`: strain history for eps_xx_z for each dof\n* `epsilon_z_hist`: strain history for eps_xx_y for each dof\n* `kappa_x_hist`: strain history for gam_xz_0 for each dof\n* `kappa_y_hist`: strain history for gam_xz_y for each dof\n* `kappa_z_hist`: strain history for gam_xy_0 for each dof\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.Unsteady_Land-Tuple{Any}","page":"API Reference","title":"OWENS.Unsteady_Land","text":"Unsteady(model,topModel,mesh,el,aero;getLinearizedMatrices=false)\n\nExecutable function for transient analysis. Provides the interface of various external module with transient structural dynamics analysis capability.\n\n# Input\n* `inputs::Model`: see ?Model\n* `topModel::FEAModel`: see ?OWENSFEA.FEAModel\n* `mesh::Mesh`: see ?OWENSFEA.Mesh\n* `el::El`: see ?OWENSFEA.El\n* `bin::Bin`: see ?Bin\n* `aero::function`: Fexternal, Fdof = aero(t) where Fexternal is the force on each affected mesh dof and Fdof is the corresponding DOFs affected\n* `getLinearizedMatrices::Bool`: Flag to save the linearized matrices\n* `elStorage::ElStorage.ElStorage`: Optional object containing stored element matrices\n* `u_s::Array{<:float}`: Optional warm start of top deflections, of length Nnodes x Ndof\n\n\n# Output\n* `t`: time array\n* `aziHist`: azimuthal history array\n* `OmegaHist`: rotational speed array history\n* `OmegaDotHist`: rotational acceleration array history\n* `gbHist`: gearbox position history array\n* `gbDotHist`: gearbox velocity history array\n* `gbDotDotHist`: gearbox acceleration history array\n* `FReactionHist`: Nodal reaction 6dof forces history\n* `rigidDof`:\n* `genTorque`: generator torque history\n* `genPower`: generator power history\n* `torqueDriveShaft`: driveshaft torque history\n* `uHist`: mesh displacement history for each dof\n* `epsilon_x_hist`: strain history for eps_xx_0 for each dof\n* `epsilon_y_hist`: strain history for eps_xx_z for each dof\n* `epsilon_z_hist`: strain history for eps_xx_y for each dof\n* `kappa_x_hist`: strain history for gam_xz_0 for each dof\n* `kappa_y_hist`: strain history for gam_xz_y for each dof\n* `kappa_z_hist`: strain history for gam_xy_0 for each dof\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.calcHydroResidual-NTuple{5, Any}","page":"API Reference","title":"OWENS.calcHydroResidual","text":"calc_hydro_residual(new_accels, new_hydro_frcs, md_frc, u, FMultiplier)\n\nInternal, finds the residual of the platform accelerations/forces when adding in new values from HydroDyn, MoorDyn, and OWENSFEA.\n\nInput\n\nnew_accels::Vector{<:float}: the new platform accelerations in the inertial reference frame from OWENSFEA (m/s/s)\nnew_hydro_frcs::Vector{<:float}: the new platform hydro forces in the inertial reference frame from HydroDyn (N)\nmd_frc::Vector{<:float}: the mooring forces at the platform in the inertial reference frame from MoorDyn (N)\nu::Vector{<:float}: input vector containing platform loads and accelerations prior to the new additions\nFMultiplier::Number: scaling factor used to make the loads/accelerations in the same magnitude for the Jacobians\n\nOutput\n\nu_resid: vector containing residual between the input u and the new load/accelerations\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.calculateDriveShaftReactionTorque-NTuple{5, Any}","page":"API Reference","title":"OWENS.calculateDriveShaftReactionTorque","text":"calculateDriveShaftReactionTorque(driveShaftProps,thetaRotor,thetaGB,thetaDotRotor,thetaDotGB)\n\nInternal, calculates reaction torque of driveshaft\n\n#Input\n\ndriveShaftProps: object containing driveshaft properties\nthetaRotor: azimuth position of rotor/rotor shaft (rad)\nthetaGB: azimuth position of gearbox shaft (rad)\nthetaDotRotor: angular velocity of rotor/rotor shaft (rad/s)\nthetaDotGB: angular velocity of gearbox shaft (rad/s)\n\n#Output\n\ntorque: reaction torque of drive shaft\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.calculateElementOrientation-Tuple{Any}","page":"API Reference","title":"OWENS.calculateElementOrientation","text":"calculateElementOrientation(mesh)\n\nCalculates the orientation of elements in a mesh.\n\n#Input\n\nmesh::OWENSFEA.Mesh see ?OWENSFEA.Mesh object containing mesh data\n\n#Output\n\nelOr::OWENSFEA.Ort see ?OWENSFEA.Ort object containing element orientation data\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.calculatePsiTheta-Tuple{Any}","page":"API Reference","title":"OWENS.calculatePsiTheta","text":"calculatePsiTheta(v)\n\nCalculates the orientation of a single element. A local element frame is related to a hub frame through a transformation matrix CHtoE (transforming a vector from an element frame E to a global frame H) such that CHtoE = [M2(Theta)]*[M3(Psi)]. Here [M2( )] is a direction cosine matrix about a 2 axis and [M3( )] is a direction cosine matrix about a 3 axis.\n\n#Input\n\nv: vector from node 1 to node 2 of an element\n\n#Output\n\nPsi: \"3\" angle for element orientation (deg)\nTheta: \"2\" angle for element orientation (deg)\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.count_cycles-Tuple{Vector{Float64}, Vector{Float64}}","page":"API Reference","title":"OWENS.count_cycles","text":"Count the cycles from the data \n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.createGeneralTransformationMatrix-Tuple{Any, Any}","page":"API Reference","title":"OWENS.createGeneralTransformationMatrix","text":"createGeneralTransformationMatrix(angleArray,axisArray)\n\nCalculates the transformation matrix assocaited with a general Euler rotation sequence.\n\n#Input\n\nangleArray: = array of angles for Euler rotation sequence\naxisArray: = array of axis of rotatoins for Euler rotation\n\n#Output\n\ndcmTotal: = transformation matrix of specified euler rotation sequence\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.createInitCondArray-Tuple{Any, Any, Any}","page":"API Reference","title":"OWENS.createInitCondArray","text":"setInitConditions(initDisps, numNodes, numDOFPerNode)\n\nCreates the formatted initial conditions array needed by OWENSFEA\n\n#Input\n\ninitDisps: an array of length numDOFPerNode specifying the initial displacement of each DOF\nnumNodes: the number of nodes in the given mesh\nnumDOFPerNode: the number of unconstrained degrees of freedom calculated in each node\n\n#Output\n\ninitCond: 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.\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.createSingleRotationDCM-Tuple{Any, Any}","page":"API Reference","title":"OWENS.createSingleRotationDCM","text":"Creates a direction cosine matrix (dcm) associated with a rotation of angleDeg about axisNum.\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.create_arcus_mesh-Tuple{}","page":"API Reference","title":"OWENS.create_arcus_mesh","text":"createarcusmesh(;Ht = 15.0, Hb = 147.148-15.0, #blade height R = 54.014, # m bade radius nblade = 3, ntelem = 30, #tower elements nbelem = 30, #blade elements ncelem = 4, strutmountpoint = 0.01, # This puts struts at top and bottom bshapex = zeros(nbelem+1), #Blade shape, magnitude is irrelevant, scaled based on height and radius above bshapez = zeros(nbelem+1), jointtype = 0, cablesconnectedtobladebase = true, angularOffset = 0.0)\n\nARCUS mesh configuration: no tower between blades, no struts, but cables from top center attaching to specified blade mount point at base\n\n#Inputs\n\nHt::float: height of tower before blades attach (m)\nHb::float: blade height (m)\nR::float: bade radius (m)\nnblade::int: number of blades\nntelem::int: number of tower elements\nnbelem::int: number of blade elements\nncelem::int: number of strut elements\nc_mount_ratio::float: factor of blade height where the struts attach on both top and bottom\nbshapex::Array{<:float}: Blade shape, magnitude is irrelevant, scaled based on height and radius above\nbshapez::Array{<:float}: Blade shape, magnitude is irrelevant, scaled based on height and radius above\njoint_type::int: 0 is fixed, 1 is about x-axis, 2 is y-axis, etc\ncables_connected_to_blade_base::bool: = true,\nangularOffset::float: (rad) angular offset of mesh generation, typically used to match CACTUS input. Value of 0 puts blade 1 at the \"north\" position and the others populate counterclockwise when looking down\n\n#Outputs\n\nmymesh::OWENSFEA.Mesh: see ?OWENSFEA.Mesh\nort::OWENSFEA.Ort: see ?OWENSFEA.Ort\nmyjoint:Array{<:float}: see ?OWENSFEA.FEAModel.joint\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.create_hawt_biwing_mesh-Tuple{}","page":"API Reference","title":"OWENS.create_hawt_biwing_mesh","text":"createhawtbiwingmesh(;Ht = 15.0, Hb = 147.148-15.0, #blade height R = 54.014, # m bade radius nblade = 3, ntelem = 30, #tower elements nbelem = 30, #blade elements ncelem = 4, strutmountpoint = 0.01, # This puts struts at top and bottom bshapex = zeros(nbelem+1), #Blade shape, magnitude is irrelevant, scaled based on height and radius above bshapez = zeros(nbelem+1), jointtype = 0, cablesconnectedtoblade_base = true, angularOffset = 0.0)\n\n#Inputs\n\nHt::float: height of tower before blades attach (m)\nHb::float: blade height (m)\nR::float: bade radius (m)\nnblade::int: number of blades\nntelem::int: number of tower elements\nnbelem::int: number of blade elements\nncelem::int: number of strut elements\nc_mount_ratio::float: factor of blade height where the struts attach on both top and bottom\nbshapex::Array{<:float}: Blade shape, magnitude is irrelevant, scaled based on height and radius above\nbshapez::Array{<:float}: Blade shape, magnitude is irrelevant, scaled based on height and radius above\njoint_type::int: 0 is fixed, 1 is about x-axis, 2 is y-axis, etc\ncables_connected_to_blade_base::bool: = true,\nangularOffset::float: (rad) angular offset of mesh generation, typically used to match CACTUS input. Value of 0 puts blade 1 at the \"north\" position and the others populate counterclockwise when looking down\n\n#Outputs\n\nmymesh::OWENSFEA.Mesh: see ?OWENSFEA.Mesh\nort::OWENSFEA.Ort: see ?OWENSFEA.Ort\nmyjoint:Array{<:float}: see ?OWENSFEA.FEAModel.joint\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.create_hawt_mesh-Tuple{}","page":"API Reference","title":"OWENS.create_hawt_mesh","text":"createhawtmesh(;Ht = 15.0, Hb = 147.148-15.0, #blade height R = 54.014, # m bade radius nblade = 3, ntelem = 30, #tower elements nbelem = 30, #blade elements ncelem = 4, strutmountpoint = 0.01, # This puts struts at top and bottom bshapex = zeros(nbelem+1), #Blade shape, magnitude is irrelevant, scaled based on height and radius above bshapez = zeros(nbelem+1), jointtype = 0, cablesconnectedtobladebase = true, angularOffset = 0.0)\n\nARCUS mesh configuration: no tower between blades, no struts, but cables from top center attaching to specified blade mount point at base\n\n#Inputs\n\nHt::float: height of tower before blades attach (m)\nHb::float: blade height (m)\nR::float: bade radius (m)\nnblade::int: number of blades\nntelem::int: number of tower elements\nnbelem::int: number of blade elements\nncelem::int: number of strut elements\nc_mount_ratio::float: factor of blade height where the struts attach on both top and bottom\nbshapex::Array{<:float}: Blade shape, magnitude is irrelevant, scaled based on height and radius above\nbshapez::Array{<:float}: Blade shape, magnitude is irrelevant, scaled based on height and radius above\njoint_type::int: 0 is fixed, 1 is about x-axis, 2 is y-axis, etc\ncables_connected_to_blade_base::bool: = true,\nangularOffset::float: (rad) angular offset of mesh generation, typically used to match CACTUS input. Value of 0 puts blade 1 at the \"north\" position and the others populate counterclockwise when looking down\n\n#Outputs\n\nmymesh::OWENSFEA.Mesh: see ?OWENSFEA.Mesh\nort::OWENSFEA.Ort: see ?OWENSFEA.Ort\nmyjoint:Array{<:float}: see ?OWENSFEA.FEAModel.joint\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.create_mesh_struts-Tuple{}","page":"API Reference","title":"OWENS.create_mesh_struts","text":"return mymesh, myort, myjoint, AD15bldNdIdxRng, AD15bldElIdxRng = createmeshstruts(;Ht = 15.0, Hb = 147.148-15.0, #blade height R = 54.014, # m bade radius AD15hubR = 2.0, nblade = 3, ntelem = 30, #tower elements nbelem = 30, #blade elements nselem = 4, struttwrmountpointbot = 0.01, # This puts struts at top and bottom struttwrmountpointtop = 0.99, # This puts struts at top and bottom strutbldmountpointbot = 0.01, # This puts struts at top and bottom strutbldmountpointtop = 0.99, # This puts struts at top and bottom bshapex = zeros(nbelem+1), #Blade shape, magnitude is irrelevant, scaled based on height and radius above bshapez = zeros(nbelem+1), bshapey = zeros(nbelem+1), # but magnitude for this is relevant angularOffset = 0.0, #Blade shape, magnitude is irrelevant, scaled based on height and radius above AD15_ccw = false, verbosity=0, # 0 nothing, 1 basic, 2 lots: amount of printed information connectBldTips2Twr =true)\n\nStandard Mesh Matching 5MW, 34m configurations\n\n#Inputs\n\nHt::float: height of tower before blades attach (m)\nHb::float: blade height (m)\nR::float: bade radius (m)\nnblade::int: number of blades\nntelem::int: number of tower elements\nnbelem::int: number of blade elements\nnselem::int: number of strut elements\nstrut_twr_mountpointbot::float = 0.01, # factor of blade height where the bottom strut attaches on the tower\nstrut_twr_mountpointtop::float = 0.99, # factor of blade height where the top strut attaches on the tower\nstrut_bld_mountpointbot::float = 0.01, # factor of blade height where the bottom strut attaches on the blade\nstrut_bld_mountpointtop::float = 0.99, # factor of blade height where the top strut attaches on the blade\nbshapex::Array{<:float}: Blade shape, magnitude is irrelevant, scaled based on height and radius above\nbshapez::Array{<:float}: Blade shape, magnitude is irrelevant, scaled based on height and radius above\nbshapey::Array{<:float}: Blade shape, magnitude IS relevant #TODO: resolve this\nangularOffset::float: (rad) angular offset of mesh generation, typically used to match CACTUS input. Value of 0 puts blade 1 at the \"north\" position and the others populate counterclockwise when looking down\nAD15_ccw::boolean: Use AD15 convention of VAWT counter-clockwise with blade root at top (blade points down)\nAD15hubR::float: AD15 has a hub radius, so the struts do not go all the way to the center of the axis of rotation, while the structural mesh does.\n\nverbosity::int: 0 nothing, 1 basic, 2 lots: amount of printed information\n\nconnectBldTips2Twr::book: True for Darrieus style, false for H-VAWT, but the blade shapes should be appropriate\n\n#Outputs\n\nmymesh::OWENSFEA.Mesh: see ?OWENSFEA.Mesh\nmyort::OWENSFEA.Ort: see ?OWENSFEA.Ort\nmyjoint:Array{<:float}: see ?OWENSFEA.FEAModel.joint\nAD15bldNdIdxRng: indices for start and end of all blades for AD15 (includes struts). Note that strut start nodes may be inside the strut (strut connects to tower, AD15 blade connects to hub wich is a few nodes away from tower)\nAD15bldElIdxRng: range of elements for start and end of all AD15 blades (includes struts)\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.externalForcing-NTuple{4, Any}","page":"API Reference","title":"OWENS.externalForcing","text":"externalForcing(time,timeArray,ForceValHist,ForceDof)\n\nInternal, linear time interpolation on the input forces (ForceValHist) for each specified ForceDof\n\nThis function specifies external forcing for a transient analysis. Fexternal is a vector of loads and Fdof is a corresponding vector of degrees of freedom the concentrated loads in Fexternal correspond to. The input time allows for arbitrary time varying loads The global degree of freedom number corresponding with the local degree of freedom of a node may be calculated by: globalDOFNumber = (nodeNumber-1)*6 + localDOFnumber The localDOFnumber may range from 1 to 6 such that 1 corresponds to a force in \"x direction\" of the co-rotating hub frame. 2 and 3 corresponds to a force in the \"y\" and \"z directions\" respectively. 4, 5, and 6 correspond to a moment about the \"x\", \"y\", and \"z\" directions respectively.\n\n#Input\n\ntime: Current time\ntimeArray: time associated with ForceValHist\nForceValHist: Forces for each time for each Dof\nForceDof: Dofs within ForceValHist\n\n#Output\n\nFexternal: vector of external loads (forces/moments)\nFdof: vector of corresponding DOF numbers to apply loads to\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.extrap_pred_vals-NTuple{4, Any}","page":"API Reference","title":"OWENS.extrap_pred_vals","text":"extrap_pred_vals(curr_vals, ts, t_out, interp_order)\n\nInternal, calculates predicted values at t_out based on previous values at earlier times.\n\nInput\n\ncurr_vals::Vector{<:float}: input values\nts::Vector{<:float}: time values corresponding to curr_vals. Left to right, times go from earliest to most recent.\nt_out::float: time for values to be extrapolated tocp\ninterp_order::int: order of the spline fit for the extrapolation, 0 flat, 1 linear, 2 quadratic\n\nOutput\n\npred_vals: extrapolated values at t_out\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.find_boundary_vals-Tuple{Vector{OWENS.Cycle}}","page":"API Reference","title":"OWENS.find_boundary_vals","text":"Find the minimum and maximum mean value and maximum range from a vector of cycles\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.find_range-Union{Tuple{T}, Tuple{Vector{T}, Any}} where T<:Real","page":"API Reference","title":"OWENS.find_range","text":"Returns the range index where the value is found \n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.frame_convert-Tuple{Any, Any}","page":"API Reference","title":"OWENS.frame_convert","text":"frame_convert(init_frame_vals, trans_mat)\n\nInternal, transfers 6 DOFs element-wise to a new reference frame\n\nInput\n\ninit_frame_vals::Vector{<:float}: Values in 6 degrees of freedom in the initial reference frame\ntrans_mat::Array{<:float}: Transformation matrix to the output reference frame\n\nOutput\n\nout_frame_vals: Values in 6 degrees of freedom in the output reference frame\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.generateOutputFilename-Tuple{Any, Any}","page":"API Reference","title":"OWENS.generateOutputFilename","text":"Internal, generates an output file name depending on the analysis type\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.getGustVel-NTuple{6, Any}","page":"API Reference","title":"OWENS.getGustVel","text":"time::TF: in seconds\nnominalVinf::TF: Nominal velocity used to calculate the IEC gust size (m/s)\nR::TF: Turbine Radius (m)\nG_amp::TF: IEC gust amplitude (m/s)\ngustT::TF: IEC gust duration (s)\ngustDelayT::TF: IEC gust delay time\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.getOWENSPreCompOutput-Tuple{Any}","page":"API Reference","title":"OWENS.getOWENSPreCompOutput","text":"getOWENSPreCompOutput(numadIn;yscale=1.0,plyprops = plyproperties())\n\nTakes numad formatted inputs for composite layup and material properties and runs them through OWENSPreComp\n\n#Inputs\n\nnumadIn::NuMad: see ?NuMad inputs\nyscale::float: airfoil thickness scaling\nplyprops::plyproperties(): see ?plyproperties for input material properties\n\n#Outputs\n\nprecompoutput::OWENSPreComp.Input: see ?OWENSPreComp.Input\nprecompinput::OWENSPreComp.properties: see ?OWENSPreComp.properties\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.getRotorPosSpeedAccelAtTime-NTuple{4, Any}","page":"API Reference","title":"OWENS.getRotorPosSpeedAccelAtTime","text":"getRotorPosSpeedAccelAtTime(t0,time,aziInit)\n\nUses the user defined function rotorSpeedProfile() to get the azimuth, speed, and acceleration of the rotor.\n\n#Input\n\nt0 time at which azimuth integration is beginning\ntime current time that position, velocity, and acceleration are being requested\naziInit initial rotor azimuth angle integration will begin at\n\n#Output\n\nrotorAzimuth azimuth position of rotor (rad) at time\nrotorSpeed rotor speed (Hz) at time\nrotorAcceleration rotor acceleration (Hz/s) at time\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.getSectPropsFromOWENSPreComp-Tuple{Any, Any, Any}","page":"API Reference","title":"OWENS.getSectPropsFromOWENSPreComp","text":"getSectPropsFromOWENSPreComp(usedUnitSpan,numadIn,precompoutput;GX=false,precompinputs=nothing)\n\nArranges the precomp output into the sectional properties required by OWENSFEA\n\n#Inputs\n\nusedUnitSpan::Array{<:float}: Array specifying the relative (0-1) mesh z locations where the sectional properties are actually called for (interpolation)\nnumadIn::NuMAD: see ?NuMAD\nprecompoutput::OWENSPreComp.properties: see ?OWENSPreComp.properties\nGX::bool: optional specifies if GX outputs should be output\nprecompinputs: optional\n\n#Outputs\n\nsectionPropsArray::SectionPropsArray: see ?OWENSFEA.SectionPropsArray, if !GX bool\nstiff: if GX bool\nmass: if GX bool\n\nstiff, mass\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.mapACDMS-NTuple{5, Any}","page":"API Reference","title":"OWENS.mapACDMS","text":"mapACDMS(t,mesh,el)\n\nmap OWENSAero forces to OWENS mesh dofs\n\nInputs\n\nt::float: time at which to get the loads (can be called repeatedly at the same time or for large time gaps, will infill run as needed)\nmesh::OWENSFEA.Mesh: see ?OWENSFEA.Mesh\nmesh::OWENSFEA.El: see ?OWENSFEA.El\n\nOutputs:\n\nForceValHist::Array(<:float): Force or moment (N, N-m) at the time corresponding to the time specified\nForceDof::Array(<:int): DOF numbers cooresponding to forces (i.e. mesh element 1 has dofs 1-6, 2 has dofs 7-12, etc)\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.mapAD15-NTuple{4, Any}","page":"API Reference","title":"OWENS.mapAD15","text":"mapAD15(t,mesh)\n\nmap AD15 forces to OWENS mesh dofs\n\nInputs\n\nt::float: time at which to get the loads (can be called repeatedly at the same time or for large time gaps, will infill run as needed)\nmesh::OWENSFEA.Mesh: see ?OWENSFEA.Mesh\nmesh::OWENSFEA.El: see ?OWENSFEA.El\n\nOutputs:\n\nForceValHist::Array(<:float): Force or moment (N, N-m) at the time corresponding to the time specified\nForceDof::Array(<:int): DOF numbers cooresponding to forces (i.e. mesh element 1 has dofs 1-6, 2 has dofs 7-12, etc)\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.mapCactusLoadsFile-NTuple{6, Any}","page":"API Reference","title":"OWENS.mapCactusLoadsFile","text":"Internal, takes cactus loads and geometry and OWENS mesh and maps the loads to the blades' FEA dofs\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.my_getABD!","page":"API Reference","title":"OWENS.my_getABD!","text":"my_getABD(matid::AbstractArray{<:Integer,1}, nply::AbstractArray{<:Integer,1}, tply::AbstractArray{<:Real,1}, theta::AbstractArray{<:Real,1}, q::AbstractArray{<:AbstractArray{<:Real,2},1}), offset::Real\n\nmy_getABD(lam::Laminate, q::AbstractArray{<:AbstractArray{<:Real,2},1}), offset::Real\n\nReturns A, B, and D matrices\n\nArguments:\n\nmatid::AbstractArray{<:Integer,1}: material id of each lamina\nnply::AbstractArray{<:Integer,1}: number of plies in each lamina\ntply::AbstractArray{<:Real,1}: thickness of a ply (m) in each lamina\ntheta::AbstractArray{<:Real,1}: orientation (deg) of each lamina\nq::AbstractArray{<:AbstractArray{<:Real,2}}: Stiffness matrix of each lamina\noffset::Real: Optional, used if neutral axis is not centered on the ply. If used, specify distance from neutral axis to upper surface (m).\n\n\n\n\n\n","category":"function"},{"location":"reference/reference/#OWENS.my_getplystrain","page":"API Reference","title":"OWENS.my_getplystrain","text":"my_getplystrain(nply::AbstractArray{<:Integer,1}, tply::AbstractArray{<:Real,1}, theta::AbstractArray{<:Real,1}, resultantstrain::AbstractArray{<:Real,1}, offset::Real)\n\nmy_getplystrain(lam::Laminate, resultantstrain::AbstractArray{<:Real,1}, offset::Real)\n\nOptional Argument\n\noffset::Real: Optional, used if neutral axis is not centered on the ply. If used, specify distance from neutral axis to upper surface (m).\n\nCalculates strains in each ply aligned with principal material direction.\n\n\n\n\n\n","category":"function"},{"location":"reference/reference/#OWENS.my_getz","page":"API Reference","title":"OWENS.my_getz","text":"getz(tply::AbstractArray{<:Real,1}, nply::AbstractArray{<:Integer,1}, offset::Real)\n\ngetz(lam::Laminate, offset::Real)\n\nReturns a laminate's z-coordinates (coordinates of top and bottom of laminas) given the thickness of plies in each lamina and the number of plies in each lamina. Offset is optional, defaults to 0.0, is the distance from the neutal axis to the upper ply if the laminate is not centered about the neutral axis of a beam.\n\n\n\n\n\n","category":"function"},{"location":"reference/reference/#OWENS.mywrite_vtk-NTuple{5, Any}","page":"API Reference","title":"OWENS.mywrite_vtk","text":"mywrite_vtk(name, assembly::Assembly, [state::AssemblyState, ]λ::Number,\n eigenstate::AssemblyState; scaling=1.0, mode_scaling=1.0, cycles=1,\n steps=100)\n\nWrite a series of files corresponding to the elastic motion of the assembly about the deformed state encoded in state defined by the eigenvalue λ and the eigenvector encoded in eigenstate over the time period specified by time.\n\nThe steady-state deflections can be scaled with scaling and the eigenmode deflections can be scaled using mode_scaling.\n\nThe current time is encoded in the metadata tag \"time\"\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.mywrite_vtk-Tuple{Any, Any}","page":"API Reference","title":"OWENS.mywrite_vtk","text":"mywrite_vtk(name, assembly::Assembly; kwargs...)\nmywrite_vtk(name, assembly::Assembly, state::AssemblyState; kwargs...)\nmywrite_vtk(name, assembly::Assembly, history::Vector{<:AssemblyState}], dt;\n kwargs...)\n\nWrite the deformed geometry (and associated data) to a VTK file for visualization using ParaView.\n\nThe state argument may be omitted to write the original geometry to a VTK file without any associated data.\n\nIf the solution time history is provided, the time step must also be provided\n\nKeyword Arguments\n\nsections = nothing: Cross section geometry corresponding to each point, defined in a frame aligned with the body frame but centered around the corresponding point. Defined as an array with shape (3, ncross, np) where ncross is the number of points in each cross section and np is the number of points.\nscaling=1.0: Parameter to scale the deflections (only valid if state is provided)\nmetadata=Dict(): Dictionary of metadata for the file(s)\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.omegaSpecCheck-NTuple{4, Any}","page":"API Reference","title":"OWENS.omegaSpecCheck","text":"Internal, gets specified rotor speed at time\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.owens-Tuple{Any, Any}","page":"API Reference","title":"OWENS.owens","text":"owens(owensfile,analysisType;\n delta_t=2e-3,\n numTS=100,\n tocp=[0.0,1.1],\n Omegaocp=[0.0,1.0],\n OmegaInit=0.0,\n OmegaGenStart=0.0,\n usingRotorSpeedFunction=false,\n nlOn=true,\n Omega=0.0,\n turbineStartup=0,\n spinUpOn=false,\n numModesToExtract=20,\n displInitGuess=0.0,\n airDensity=1.2041,\n aeroElasticOn = false,\n guessFreq = 0,\n gravityOn = true,\n generatorOn = false,\n omegaControl = false,\n iterationType = \"NR\", # nlParams\n adaptiveLoadSteppingFlag = true,\n tolerance = 1.0000e-06,\n maxIterations = 50,\n maxNumLoadSteps = 20,\n minLoadStepDelta = 0.0500,\n minLoadStep = 0.0500,\n prescribedLoadStep = 0.0,\n elementOrder = 1,\n numDofPerNode = 6,\n hydroOn = false,\n platformTurbineConnectionNodeNumber = 1,\n JgearBox =0.0,\n gearRatio = 1.0,\n gearBoxEfficiency = 1.0,\n useGeneratorFunction = false,\n generatorProps = 0.0,\n driveTrainOn = false)\n\nOriginal serial and file reading method of running an analysis.\n\n#Inputs See ?OWENS.Model and ?OWENSFEA.FEAModel\n\n#Outputs See ?OWENS.Unsteady, ?OWENSFEA.Modal\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.plotMesh-NTuple{7, Any}","page":"API Reference","title":"OWENS.plotMesh","text":"plotMesh plots a mesh with various orthographic and isometric views plotMesh(mesh,colorstring,meshSeg)\n\nThis function plots a mesh in a 3D with isometric view.\n\n#Input\n\nmesh: object containing mesh data\ncolorstring: string containing color for plotting\nmeshSeg: array containing number of elements per mesh segment\nax1: handle to the 1 plot\nax2: handle to the 2 plot\nax3: handle to the 3 plot\nax4: handle to the 4 plot\n\n#Output NONE\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.rainflow-Tuple{Any}","page":"API Reference","title":"OWENS.rainflow","text":"rainflow(signal;nbins_range=10,nbins_mean=10)\n\nConvenience function that returns the binned cycles with the corresponding ranges and means\n\nInputs\n\nsignal::Array{<:Real,1}: data input\nnbins_range::Array{<:Int,1}: Number of bins for range\nnbins_mean::Array{<:Int,1}: Number of bins for mean\nm` : Wohler exponent (default is 3)\nTeq` : The equivalent number of load cycles (default is 1, but normally the time duration in seconds is used)\n\nOutputs:\n\nNcycles::Array{<:Real,2}: Summed/binned cycles with columns corresponding to mean levels and rows corresponding to range levels\nmeanIntervals::Array{<:Real,1}: Mean levels corresponging with bins columns\nrangeIntervals::Array{<:Real,1}: Range levels corresponging with bins rows\nequivalentLoad::Array{<:Real,1}: Design equivalent load for each mean level\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.readBCdata-Tuple{Any, Any, Any}","page":"API Reference","title":"OWENS.readBCdata","text":"readBCdata(bcfilename,numNodes,numDofPerNode)\n\nThis function reads the boundray condition file and stores data in the boundary condition object.\n\n#Input\n\nbcfilename::string: string containing boundary condition filename\nnumNodes::int: number of nodes in structural model\nnumDofPerNode::int: number of degrees of freedom per node\n\n#Output\n\nBC::OWENSFEA.BC_struct: see OWENSFEA.BC_struct, object containing boundary condition data\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.readBladeData-Tuple{Any}","page":"API Reference","title":"OWENS.readBladeData","text":"readBladeData(filename)\n\nThis function reads blade data from file\n\n#Input\n\nfilename::string: string containing /path/to/bladedata.bld\n\n#Output\n\nbladeData::BladeData: see ?BladeData object containing blade data\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.readCactusGeom-Tuple{Any}","page":"API Reference","title":"OWENS.readCactusGeom","text":"Internal, reads cactus .geom file and stores each column in an array within the CactusGeom struct\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.readElementData-NTuple{4, Any}","page":"API Reference","title":"OWENS.readElementData","text":"readElementData(numElements,elfile,ortfile,bldfile\n\nReads element data and stores data in the element data object.\n\n#Input\n\nnumElements::int: number of elements in structural mesh\nelfile::string: element data path/to/filename\nortfile::string: element orientation path/to/filename\nbldfile::string: blade data path/to/filename\n\n#Output\n\nel::OWENSFEA.El: see OWENSFEA.El element data object\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.readGeneratorProps-Tuple{Any}","page":"API Reference","title":"OWENS.readGeneratorProps","text":"readGeneratorProps(generatorfilename)\n\nThis function reads generator properties from file.\n\n#Input\n\ngeneratorfilenanme::string: = string containing path/to/generatorfile\n\n#Output\n\ngenprops: = model object containing generator properties\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.readMesh-Tuple{Any}","page":"API Reference","title":"OWENS.readMesh","text":"readMesh(filename)\n\nReads the mesh file and stores data in the mesh object.\n\ninput:\n\nfilename::string string containing mesh path/to/filename.mesh\n\noutput:\n\nmesh::OWENSFEA.Mesh see OWENSFEA.Mesh\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.readNuMadGeomCSV-Tuple{Any}","page":"API Reference","title":"OWENS.readNuMadGeomCSV","text":"readNuMadGeomCSV(NuMadgeomxlscsv_file)\n\nParameters defining the rotor (apply to all sections).\n\nArguments\n\nNuMad_geom_xlscsv_file::String: name of the numad excel CSV file being read (!!! THE NUMAD TAB MUST BE SAVED AS A CSV FOR THIS TO WORK !!!)\n\nReturns\n\nOutput::NuMad: numad structure as defined in the NuMad structure docstrings.\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.readNuMadMaterialsCSV-Tuple{Any}","page":"API Reference","title":"OWENS.readNuMadMaterialsCSV","text":"readNuMadMaterialsCSV(NuMadmaterialsxlscsv_file)\n\nParameters defining the rotor materials.\n\nArguments\n\nNuMad_materials_xlscsv_file::String: name of the numad excel CSV file being read (!!! THE NUMAD TAB MUST BE SAVED AS A CSV FOR THIS TO WORK !!!)\n\nReturns\n\nOutput::plyproperties: plyproperties structure as defined in the plyproperties structure docstrings.\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.readResultsModalOut-Tuple{Any, Any}","page":"API Reference","title":"OWENS.readResultsModalOut","text":"Internal, reads modal file and returns freq, damp, and modeshapes\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.rigidBodyRotation-NTuple{5, Any}","page":"API Reference","title":"OWENS.rigidBodyRotation","text":"rigidBodyRotation(B1,B2,B3,AngleArray,AxisArray)\n\nPerforms a coordinate transformation from a local body \"B\"(element) frame to a common hub frame \"H\" via a 3-2-3 euler rotation sequence\n\n#Input\n\nB1: array containing body frame 1 coordinates of points to be mapped to the hub frame\nB2: array containing body frame 2 coordinates of points to be mapped to the hub frame\nB3: array containing body frame 3 coordinates of points to be mapped to the hub frame\nAngleArray: Array of angles for Euler rotation sequence\nAxisArray: Array of axes for Euler rotation sequence\n\n#Output\n\nH1: array containg hub frame 1 coordinates of points mapped to the hub frame from body frame\nH2: array containg hub frame 2 coordinates of points mapped to the hub frame from body frame\nH3: array containg hub frame 3 coordinates of points mapped to the hub frame from body frame\n\nThat is CHtoB = [M3(SweepAngle)][M2(Theta)][M3(Psi)];\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.runDLC-Tuple{Any, Any, Any}","page":"API Reference","title":"OWENS.runDLC","text":"runDLC(DLCs,Inp,path; Vinfrange=LinRange(5,20,16), IECstd=\"\"2\"\", WindChar=\"\"A\"\", WindClass=1, turbsimpath=\"./turbsimfiles\", templatefile=\"./templateTurbSim.inp\", pathtoturbsim=\"../../openfast/build/modules/turbsim/turbsim\", NumGridZ=100, NumGridY=100, Vref=10.0, Vdesign=11.0, grid_oversize=1.1, regenWindFiles=false)\n\n# Input\n* `DLCs`: [\"1_1\",\"1_2\"]\n* `Inp::MasterInput`: see ?OWENS.MasterInput\n* `path`: desired path to run everything\n* `Vinf_range`: =LinRange(5,20,16),\n* `IEC_std`: =\"\"2\"\",\n* `WindChar`: =\"\"A\"\",\n* `WindClass`: =1,\n* `turbsimpath`: =\"./turbsimfiles\", path where it dumps the turbsim files\n* `templatefile`: =\"./template_files/templateTurbSim.inp\",\n* `pathtoturbsim`: =\"../../openfast/build/modules/turbsim/turbsim\",\n* `NumGrid_Z`: =100,\n* `NumGrid_Y`: =100,\n* `Vref`: =10.0,\n* `Vdesign`: =11.0, # Design or rated speed\n* `grid_oversize`: =1.1,\n* `regenWindFiles`: =false\n\n# Output\n* `nothing`:\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.simpleGenerator-Tuple{Any, Any}","page":"API Reference","title":"OWENS.simpleGenerator","text":"simpleGenerator(generatorProps,genSpeed)\n\nCaclulates generator torque for simple induction generator\n\n#Input\n\ngeneratorProps object containing generator properties, see ?model\ngenSpeed::float generator speed (Hz)\n\n#Output\n\ngenTorque::float generator torque\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.sort_peaks","page":"API Reference","title":"OWENS.sort_peaks","text":"This function sorts out points where the slope changes sign\n\n\n\n\n\n","category":"function"},{"location":"reference/reference/#OWENS.sum_cycles-Union{Tuple{T}, Tuple{Vector{OWENS.Cycle}, Union{StepRangeLen{T}, Vector{T}}, Union{StepRangeLen{T}, Vector{T}}}} where T<:Real","page":"API Reference","title":"OWENS.sum_cycles","text":"Sums the cycle count given intervals of rangeintervals and meanintervals. The rangeintervals and meanintervals are given in fraction of range size\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.timeIntegrateSubSystem-NTuple{8, Any}","page":"API Reference","title":"OWENS.timeIntegrateSubSystem","text":"timeIntegrateSubSystem(M,K,C,F,delta_t,u,udot,uddot)\n\nInternal, performs integration of a system using the Newmark-Beta method (constant-average acceleration sceheme).\n\n#Input\n\nM: system mass matrix\nK: system sttiffness matrix\nC: system damping matrix\nF: system force vector\ndelta_t: time step\nu: displacement at beginning of time step\nudot: velocity at beginning of time step\nuddot: acceleration at beginning of time step\n\n#Output\n\nunp1: displacement at end of time step\nudotnp1: velocity at end of time step\nuddotnp1: acceleration at end of time step\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.transMat-Tuple{Any, Any, Any}","page":"API Reference","title":"OWENS.transMat","text":"transMat(theta1, theta2, theta3)\n\nInternal, 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.\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.trapezoidalRule-NTuple{4, Any}","page":"API Reference","title":"OWENS.trapezoidalRule","text":"Internal, simple trapezoidal rule integration\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.updateRotorRotation-NTuple{9, Any}","page":"API Reference","title":"OWENS.updateRotorRotation","text":"updateRotorRotation updates rotor rotation\n\nupdateRotorRotation(Irotor,Crotor,Krotor,shaftTorque,genTorque,azi_s,Omega_s,OmegaDot_s,delta_t)\n\nInternal, updates the rotor rotation given rotor properties and external torques\n\n#Input\n\nIrotor: rotor inertia\nCrotor: arbitrary rotor damping\nKrotor: arbitrary rotor stiffness\nshaftTorque: torque from external forces on rotor\ngenTorque: torque from generator\nazi_s: rotor azimuth (rad) at beginning of time step\nOmega_s: rotor speed (Hz) at beginning of time step\nOmegaDot_s: rotor acceleration (Hz/s) at beginning of time step\ndelta_t: time step\n\n#Output\n\nazi_sp1: rotor azimuth (rad) at end of time step\nOmega_sp1: rotor speed (Hz/s) at end of time step\nOmegaDot_sp1: rotor acceleration (Hz/s) at end of time step\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.userDefinedRotorSpeedProfile-Tuple{Any}","page":"API Reference","title":"OWENS.userDefinedRotorSpeedProfile","text":"Internal, unused, userDefinedRotorSpeedProfile\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.viz-Tuple{Any}","page":"API Reference","title":"OWENS.viz","text":"viz(;mesh=[],meshFile=\"none\",resultsFile=\"none\",selectedMode=10,sf=10)\n\nPlots 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\n\n#Input\n\nmesh::OWENSFEA.Mesh: Mesh struct, See ?OWENSFEA.Mesh\nmeshFile::String: optional string containing mesh file name\nresultsFile::String: optional string containing results file name\nselectedMode::Int: integer denoting selected mode to plot\nsf::Float: scale factor for mode shape displacements\n\n#Output None\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.writeOwensNDL-NTuple{4, Any}","page":"API Reference","title":"OWENS.writeOwensNDL","text":"writeOwensNDL(fileRoot, nodes, cmkType, cmkValues)\n\nwrites a nodal input file\n\n#Intput\n\nfileRoot::string: string path to desired location with name but no extension\nnodes::int: node numbers for C/M/K\ncmkType::string: \"C\" \"M\" or \"K\"\ncmkValues::float: C/M/K value\n\n#Output\n\nnone:\n\n\n\n\n\n","category":"method"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"OWENS X is outwards on blade, y is trailing edge always","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"Struts, CCW, z is inwards, y trailing, and CW z is outwards","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"Aerodyn ","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"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.","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"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. ","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"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.","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"(Image: ){width=\"4.917280183727034in\" height=\"4.585993000874891in\"}(Image: ){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.","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"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.","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"(Image: ){width=\"5.595138888888889in\" height=\"4.875694444444444in\"}(Image: ){width=\"5.737141294838145in\" height=\"5.283430664916885in\"}","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"If we add 30 degrees of rotation to the yaw, this is what it looks like.","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"(Image: ){width=\"4.91704615048119in\" height=\"4.992732939632546in\"}","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"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.","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"(Image: ){width=\"4.382957130358705in\" height=\"4.783430664916885in\"}(Image: ){width=\"5.226388888888889in\" height=\"4.833333333333333in\"}","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"(Image: ){width=\"4.406944444444444in\" height=\"3.9298611111111112in\"}If we add 30 degrees of roll, this is what it looks like:","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"(Image: ){width=\"5.124857830271216in\" height=\"4.771802274715661in\"}","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"(Image: ){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.","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"(Image: ){width=\"4.095165135608049in\" height=\"4.388081802274716in\"}","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"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.","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"# apply the twist rotation, which is about the x (1) axis","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"myvec = myvec*[1.0 0.0 0.0","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"0.0 cosd(Twistdel) sind(Twistdel)","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"0.0 -sind(Twistdel) cosd(Twistdel)]","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"# apply theta rotation, which is the tilt angle, or about the y (2) axis in global","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"myvec = myvec*[cosd(Thetadel) 0.0 -sind(Thetadel)","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"0.0 1.0 0.0","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"sind(Thetadel) 0.0 cosd(Thetadel)]","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"# apply Psi rotation, which is about Z (3) axis in global","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"myvec = myvec*[cosd(Psidel) sind(Psidel) 0.0","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"-sind(Psidel) cosd(Psidel) 0.0","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"0.0 0.0 1.0]","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"author:","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"Kevin R. Moore","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"bibliography:","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"ac_sources.bib","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"title: Offshore Wind Energy Simulator (OWENS) Glue Code Basic Theory, Frames of Reference, and Inter-Module Coupling Methods –-","category":"page"},{"location":"OWENS_Dev_Guide/#Introduction","page":"Developer Guide","title":"Introduction","text":"","category":"section"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/#Contributing","page":"Developer Guide","title":"Contributing","text":"","category":"section"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/#Glue-Code-Basic-Theory","page":"Developer Guide","title":"Glue Code Basic Theory","text":"","category":"section"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"::: algorithm ::: spacing 1.18","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"::: algorithmic Initialize simulation (all module parameters, meshing, composite properties, etc) Initialize displacements and forces as 0","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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_textguess with the calculated displacements ::: :::","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"[]{#alg:Transient label=\"alg:Transient\"} :::","category":"page"},{"location":"OWENS_Dev_Guide/#Global-Frame-of-Reference","page":"Developer Guide","title":"Global Frame of Reference","text":"","category":"section"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"(Image: 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%\"}","category":"page"},{"location":"OWENS_Dev_Guide/#InflowWind-and-TurbSim-Velocity-Inflow","page":"Developer Guide","title":"InflowWind and TurbSim Velocity Inflow","text":"","category":"section"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"This is how it is defined in the manual, despite inverting the positive direction of rotation compared to standard notation.","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"(Image: 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%\"}","category":"page"},{"location":"OWENS_Dev_Guide/#OWENSAero-Aerodynamics-(AC-and-DMS)","page":"Developer Guide","title":"OWENSAero Aerodynamics (AC and DMS)","text":"","category":"section"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"(Image: 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%\"}","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/#OWENSFEA-Structures","page":"Developer Guide","title":"OWENSFEA Structures","text":"","category":"section"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"::: center Name Rotation Axis OWENS Angle Names –––- –––––––- –––––––––- Roll about X Twist Pitch about Y Theta Yaw about Z Psi","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":": Module Level of Detail in This Document :::","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"This is almost consistent between blades and struts (have a +90 rotation on struts for some reason that I haven't sorted out yet).","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"The Mesh matches the global frame of reference of x, y, and z. Element length is the length along the element.","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/#Composites","page":"Developer Guide","title":"Composites","text":"","category":"section"},{"location":"OWENS_Dev_Guide/#Hydrodynamics","page":"Developer Guide","title":"Hydrodynamics","text":"","category":"section"},{"location":"OWENS_Dev_Guide/#Mooring","page":"Developer Guide","title":"Mooring","text":"","category":"section"},{"location":"OWENS_Dev_Guide/#Coupling-Methods","page":"Developer Guide","title":"Coupling Methods","text":"","category":"section"},{"location":"OWENS_Dev_Guide/#Inflow-Aero","page":"Developer Guide","title":"Inflow - Aero","text":"","category":"section"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/#Aero-Turbine-Structure","page":"Developer Guide","title":"Aero - Turbine Structure","text":"","category":"section"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/#Turbine-Structure-Platform-Structure","page":"Developer Guide","title":"Turbine Structure - Platform Structure","text":"","category":"section"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"Same as Aero-Structure","category":"page"},{"location":"OWENS_Dev_Guide/#Hydro-Platform-Structure-Mooring","page":"Developer Guide","title":"Hydro - Platform Structure - Mooring","text":"","category":"section"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"Same as Aero-Structure","category":"page"},{"location":"OWENS_Dev_Guide/#Structures-Composites","page":"Developer Guide","title":"Structures - Composites","text":"","category":"section"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/#Controllers-Control-Elements","page":"Developer Guide","title":"Controllers - Control Elements","text":"","category":"section"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"Direct: Controllers provide reactionary inputs to control inputs in real time based on dynamics.","category":"page"},{"location":"#OWENS-(Offshore-Wind-ENergy-Simulator)","page":"Home","title":"OWENS (Offshore Wind ENergy Simulator)","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"This repository is based on the original structural dynamics solver by Brian Owens (see dissertation: http://hdl.handle.net/1969.1/151813). The original code has been translated to Julia and revised for simplicity and performance while maintaining accuracy. GXBeam.jl has also been integrated in beta form for geometrically exact beam solutions The aerodynamics are provided by the OWENSAero.jl module (https://gitlab.sandia.gov/8821-vawt-tools/OWENSAero.jl) in addition to a coupling to the OpenFAST AeroDyn module.","category":"page"},{"location":"#Documentation","page":"Home","title":"Documentation","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"In Work: Documentation can be found in the docs folder along with the validation paper(s).","category":"page"},{"location":"","page":"Home","title":"Home","text":"-\tAll of the functions have docstrings describing the i/o and function purpose, which can be accessed by: * import module * ? module.function() \t\t\t\t -\tA 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.","category":"page"},{"location":"#Software-License","page":"Home","title":"Software License","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"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.","category":"page"},{"location":"","page":"Home","title":"Home","text":"See Copyright.txt file for more information","category":"page"},{"location":"setup/#Installation-Instructions","page":"Installation","title":"Installation Instructions","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"The OWENS software has been developed and designed to operate in the paradigm similar to modern open source software, leveraging tools such as the terminal, git, public software repositories, and automated package management both for the operating system and the programming language. Before attempting these instructions, if you are not familiar with these types of tools, please consider becoming familiar with them prior to proceeding. Here are some of the first google hits for guides:","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"https://www.redhat.com/sysadmin/beginners-guide-vim\nhttps://www.freecodecamp.org/news/the-beginners-guide-to-git-github/\nhttps://www.howtogeek.com/63997/how-to-install-programs-in-ubuntu-in-the-command-line/","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"Future distributions are planned to also include a precompiled binary for each of the three major operating systems, with the aspiration of being able to reduce the required knowledge to the OWENS inputs, outputs, and operation. Until then, here are installation instructions for the three major operating systems. ORDER OF OPERATIONS AND DETAILS ARE IMPORTANT FOR A SUCCESSFUL BUILD, DO NOT SKIP STEPS","category":"page"},{"location":"setup/#Windows","page":"Installation","title":"Windows","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"At this stage in the software's maturity, it is recommended to use mac or linux environments unless the user is experienced with compiled software development in a windows environment. The WSL (windows subsystem for linux) can also be installed (https://allthings.how/how-to-use-linux-terminal-in-windows-11/) and can be set up to run via just the terminal or also set up to use the graphical capabilities of your machine, and the memory can be mapped back and forth as described in the link above.","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"Install julia, paraview, and visual studio manually by downloading the windows executables for","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"https://julialang.org/downloads/\nhttps://www.paraview.org/download/\nhttps://visualstudio.microsoft.com/downloads/","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"Also download OpenFAST:","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"https://github.com/OpenFAST/openfast","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"Be sure julia is on your path, and follow the windows compilation instructions for the openfast Inflowwind, AeroDyn, MoorDyn and HydroDyn libraries. Installation is otherwise the same as the Linux instructions below","category":"page"},{"location":"setup/#Mac","page":"Installation","title":"Mac","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"Essentially the same installation as Linux except we recommend using the homebrew package manager, so exchange all \"apt-get\" with \"brew\" ","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"brew install git\nbrew install wget\nbrew install vim\nbrew install cmake\nbrew install gfortran\nbrew install build-essential\nbrew install openblas\nbrew install lapack","category":"page"},{"location":"setup/#Linux","page":"Installation","title":"Linux","text":"","category":"section"},{"location":"setup/#Install/Update-Required-Compilers-and-Programs,-if-you-already-have-an-environment-that-can-build-OpenFAST,-then-these-should-already-be-installed.","page":"Installation","title":"Install/Update Required Compilers and Programs, if you already have an environment that can build OpenFAST, then these should already be installed.","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"apt-get update -y\napt-get install git -y\napt-get install wget -y\napt-get install vim -y\napt-get install cmake -y\napt-get install gfortran -y\napt-get install build-essential -y\napt-get install libblas-dev liblapack-dev -y","category":"page"},{"location":"setup/#Install-julia","page":"Installation","title":"Install julia","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"cd ~\ncurl -fsSL https://install.julialang.org | sh","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"in your ~/.bashrc file (.zshrc on Mac), tell julia to use the command line git by inserting the following:","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"export JULIAPKGUSECLIGIT=true","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"Additionally, if you are not finding that your path is being appended to, you can instead create an alias by also appending to the ~/.bashrc","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"alias julia=\"path/to/your/julia-1.x.x/bin/julia\"","category":"page"},{"location":"setup/#Proxy-Setup","page":"Installation","title":"Proxy Setup","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"If you are using a proxy, be sure that the proxy variables are declared/exported in your .bash_profile or .bashrc or the equivalent","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"http_proxy, https_proxy, HTTP_PROXY, HTTPS_PROXY, no_proxy, NO_PROXY\ngit config --global http.proxy http://user:nopass@proxy.yourorg:number\ngit config --global https.proxy http://user:nopass@proxy.yourorg:number\nexport JULIA_SSL_CA_ROOTS_PATH=\"\"\nexport JULIA_SSL_NO_VERIFY_HOSTS=\"*.yourorgurl\"\nexport JULIA_PKG_USE_CLI_GIT=true","category":"page"},{"location":"setup/#Test-That-Julia-Runs","page":"Installation","title":"Test That Julia Runs","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"the following should get you in and out of the julia interactive repl","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"julia \nexit()","category":"page"},{"location":"setup/#Set-up-SSH-Keys","page":"Installation","title":"Set up SSH Keys","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"# Note that for installation behind the Sandia network, you will need to be on the network and follow additional instructions at https://wiki.sandia.gov/pages/viewpage.action?pageId=227381234#SandiaProxyConfiguration,Troubleshooting&HTTPS/SSLinterception-SSLCertificate.1\n# Make ssh keys and put in the correct places\n# Go to your gihub account settings\n# left side, SSH and GPG keys\n# new ssh key\n# name: owensrepos # or whatever you'd like\n# back in the linux terminal\nssh-keygen -t rsa -m PEM -C username@youremail.gov\n# enter, enter, enter (i.e. use defaults)\ncd ~\nls -a\ncd .ssh\nvim id_rsa.pub\n#copy the contents to github.com (User icon > Settings > SSH and GPG > New SSH Key) and paste them back in your browser to the ssh key box and create the key\n# esc : q enter # to get out of vim\ncd ~","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"Additionally, if you find that your ssh is erroring when you try to install packages, try editing your ~/.ssh/config and add:","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"Host *\nPubkeyAcceptedAlgorithms +ssh-rsa\nPubkeyAcceptedAlgorithms +ssh-ed25519","category":"page"},{"location":"setup/#Install-Optional-OpenFAST-Dependices","page":"Installation","title":"Install Optional OpenFAST Dependices","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"mkdir coderepos\ncd coderepos\n# Install openfast coupled libraries !NOTE!: if you change the location of the compiled libraries, you may need to update the rpath variable, or recompile.\ngit clone --depth 1 git@github.com:andrew-platt/openfast.git\n# if this errors, you can clone git@github.com:OpenFAST/openfast.git it just doesn't have the latest updates from Andy, but the interface should be the same and should run.\ncd openfast\ngit remote set-branches origin '*'\ngit fetch --depth 1 origin f/ADI_c_binding_multiRotor\ngit checkout f/ADI_c_binding_multiRotor\nmkdir build\ncd build\n# can also add -DOPENMP=ON if desired for acceleration of OLAF\n# you can rebuild later by removing the build folder and following these instructions again.\ncmake -DBUILD_SHARED_LIBS=ON ..\nmake ifw_c_binding\n# make moordyn_c_binding\n# make hydrodyn_c_binding\nmake aerodyn_inflow_c_binding\nmake aerodyn_driver\nmake turbsim\ncd ../../","category":"page"},{"location":"setup/#Brief-Julia-Primer","page":"Installation","title":"Brief Julia Primer","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"Now open the julia interactive repl and run the following blocks, obviously a multi-line block should be entered as one.","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"julia","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"\nprintln(\"This is intended just to get you rolling, comprehensive documentation can be found at https://docs.julialang.org/en/v1/\")\nprintln(\"More detail on major differences between codes can be found at https://docs.julialang.org/en/v1/manual/noteworthy-differences/\")\n\n###############################################################\n###############################################################\n###############################################################\n\nprintln(\"#####################\")\nprintln(\"Basic Data Handling\")\nprintln(\"#####################\")\n# Create a multidimensional array\nnewMatrix = zeros(2,3)\n# Mutate the contents\nnewMatrix[1,2] = 1.0\n\n#Create New Scalar\nnewScalar = 5.0\n\nprintln(\"Print the first matrix\")\n# Print the contents and observe the mutation\nfor irow = 1:length(newMatrix[:,1])\n println(newMatrix[irow,:])\nend\n\n# Copy the newMatrix and scalar\nnewMatrix2 = newMatrix\nnewScalar2 = newScalar\n# Mutate the second matrix and scalar\nnewMatrix[1,2] = 2.0\nnewScalar2 = 2.0\n\n#Make a printing function inline\nfunction printme(matrix, scalar)\n for irow = 1:length(matrix[:,1])\n println(matrix[irow,:])\n end\n println(\"Scalar: $scalar\")\nend\n\nprintln(\"Printing the second matrix and scalar\")\nprintme(newMatrix2,newScalar2)\nprintln(\"Printing the first matrix again\")\nprintme(newMatrix,newScalar)\nif newMatrix[1,2] == newMatrix2[1,2]\n println(\"B=A references the arrays\")\n println(\"B=copy(A) breaks the reference and does a true copy\")\n println(\"B=deepcopy(A) is needed if it is a multi-level type, like a struct or dictionary\")\n println(\"However, scalars are not linked. This is because a scalar is directly looking at a memory element, while arrays are pointing to the memory elements\")\nend\n\n###############################################################\n###############################################################\n###############################################################\n\nprintln(\"\\n#####################\")\nprintln(\"Scope of Functions\")\nprintln(\"#####################\")\n\n\nfunction coolfunction(input1,input2; mykeyname=\"default\",mykeyname2=5.0)\n if mykeyname==\"default\"\n return input1.+input2[1,1,1], 1.0\n else\n input2[1,1,1] = 1.0 # Since arrays are always passed by reference, we can mutate it here and it will be mutated above\n return input1.+mykeyname2, 0.0\n end\nend\n\noutputs = coolfunction(ones(3).*5,zeros(4,5,2)) \nprintln(\"use the defaults for the optional args and dump the output into a tuple\")\nprintln(\"First output $(outputs[1]), Second output $(outputs[2])\")\n\nprintln(\"supply the optional args and dump the output into newly allocated items\")\nmyinput = zeros(4,5,2)\nmykeyname = \"notdefault\"\ntestinput = 5.0\noutputs1, output2 = coolfunction(ones(3).*5,myinput;mykeyname,mykeyname2=testinput)\nprintln(\"First output $(outputs1), Second output $(output2)\")\n\nprintln(\"now show that myinput was mutated within the function since it was passed by reference\")\nprintln(myinput)\n\n\n###############################################################\n###############################################################\n###############################################################\n\nprintln(\"\\n#####################\")\nprintln(\"Types\")\nprintln(\"#####################\")\n\nfirst = 1.0\nprintln(typeof(first))\n\nsecond = 2\nprintln(typeof(second))\n\n###############################################################\n###############################################################\n###############################################################\n\nprintln(\"\\n#####################\")\nprintln(\"Structs\")\nprintln(\"#####################\")\n\nmutable struct mystruct\n coolterm1\n othercoolterm\nend\n\nnewStruct = mystruct(1.0,2.0)\n\nprintln(newStruct.coolterm1)\nprintln(newStruct.othercoolterm)\n\n###############################################################\n###############################################################\n###############################################################\n\nprintln(\"\\n#####################\")\nprintln(\"Package Manager with Standard Packages\")\nprintln(\"#####################\")\n\nusing Pkg\nPkg.add(\"PyPlot\") #Note, this will take a while (maybe 10 min depending on your connection) since it is pulling conda and installing it behind the ~/.julia folder \n# if you want to use your already installed python, you can instead run\n# ENV[\"PYTHON\"] = \"path to your desired python install\"\n# Pkg.add(\"PyCall\")\n# Pkg.add(\"PyPlot\")\n\nPkg.add(\"DelimitedFiles\")\n\nimport PyPlot\nimport DelimitedFiles\n\nx = [1; 2; 3; 4];\n\ny = [5; 6; 7; 8];\n\nopen(\"delim_file.txt\", \"w\") do io\n DelimitedFiles.writedlm(io, [x y])\n end\n\ndata = DelimitedFiles.readdlm(\"delim_file.txt\", '\\t', Int, '\\n')\n\nPyPlot.figure()\nPyPlot.plot(data[:,1],data[:,2],label=\"data\")\nPyPlot.xlabel(\"x\")\nPyPlot.ylabel(\"y\")\nPyPlot.legend()\n\nthisFilesPath = splitdir(@__FILE__)[1]\n\nPyPlot.savefig(\"$(thisFilesPath)/saveme.pdf\",transparent = true)\n\nrun(`rm $(thisFilesPath)/saveme.pdf`) #system run\nrm(\"delim_file.txt\") # julia's function that does the same thing\n\n###############################################################\n###############################################################\n###############################################################","category":"page"},{"location":"setup/#OWENS-Installation","page":"Installation","title":"OWENS Installation","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"These steps require privileges to each package through github. This should be setup by an existing Owens code contributor.","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"\nusing Pkg\n\nprintln(\"\\n#####################\")\nprintln(\"Install OWENS\")\nprintln(\"#####################\")\n\nPkg.add(\"Statistics\");Pkg.add(\"Dierckx\");Pkg.add(\"QuadGK\");Pkg.add(\"FLOWMath\");Pkg.add(\"HDF5\");Pkg.add(\"ImplicitAD\");Pkg.add(\"GXBeam\");\nPkg.add(PackageSpec(url=\"https://github.com/byuflowlab/Composites.jl.git\"))\nPkg.add(PackageSpec(url=\"git@github.com:sandialabs/OWENSPreComp.jl.git\"))\nPkg.add(PackageSpec(url=\"git@github.com:sandialabs/OWENSOpenFASTWrappers.jl.git\"))\nPkg.add(PackageSpec(url=\"git@github.com:sandialabs/OWENSAero.jl.git\"))\nPkg.add(PackageSpec(url=\"git@github.com:sandialabs/OWENSFEA.jl.git\"))\nPkg.add(PackageSpec(url=\"git@github.com:sandialabs/OWENS.jl.git\"))\n\n# Install PyPlot if not already installed\nPkg.add(\"PyPlot\") #Note, this will take a while (maybe 10 min depending on your connection) since it is pulling conda and installing it behind the ~/.julia folder \n# if you want to use your already installed python, you can instead run\n# ENV[\"PYTHON\"] = \"path to your desired python install\"\n# Pkg.add(\"PyCall\")\n# Pkg.add(\"PyPlot\")\n","category":"page"},{"location":"setup/#Testing-Your-Build-of-OWENS","page":"Installation","title":"Testing Your Build of OWENS","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"clone the owens repository which contains example run scripts, the turbine mesh generator","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"git clone git@github.com:sandialabs/OWENS.jl","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"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: ","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"adi_lib = \"path/to/openfast/build/modules/libraryfolder/libraryname\"","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"cd OWENS.jl/test\njulia SNL34mVAWTNormalOperation.jl","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"You can visualize the output vtk/vtu/pvd paraview files with paraview, install paraview via apt-get -y install paraview","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"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","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"julia","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":" include(\"path/to/file.jl\")","category":"page"},{"location":"setup/#Visual-Studio-Code-IDE","page":"Installation","title":"Visual Studio Code IDE","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"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/setup/OWENSJuliaVS.code-profile). ","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"With the sample profile loaded into VSCode, If you want to clear out all the variables and restart do ","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"cmd-j cmd-k,","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"if you want to clear out the console ","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"cmd-j cmd-c","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"open the workspace ","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"cmd-j cmd-w","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"run highlighted code ","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"shift-enter","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"run the currently selected file","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"cmd-shift-enter","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"You can also use the gui buttons.","category":"page"},{"location":"setup/#VSCode-Julia-Debugger","page":"Installation","title":"VSCode Julia Debugger","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"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.","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"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:","category":"page"},{"location":"setup/#Install-custom-repositories-you-want-to-develop","page":"Installation","title":"Install custom repositories you want to develop","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"start Julia from the cloned directory and use the command:","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"] dev .","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"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","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"alternatively, instead of using or import to get access to the module, within julia","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"include(\"path/to/module.jl/source/module.jl\")","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"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.","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"You can also install a specific branch of a remote repository package without having to clone the repo and checkout the branch:","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"using Pkg\nPkg.add(url = \"git@github.com:sandialabs/OWENS.jl.git\", rev = \"dev\")","category":"page"}] +[{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"EditURL = \"../literate/B_detailedInputs.jl\"","category":"page"},{"location":"examples/B_detailedInputs/#simple2","page":"Detailed Inputs","title":"Detailed Inputs","text":"","category":"section"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"In this example, we show the second level of what is going on behind the precompiled binary This would be appropriate if you need more customization in the run and design parameters than the input file currently allows, but your design still fits within the setupOWENS helper function etc.","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"tip: Tip\nThis example is also available as a Jupyter notebook todo: get link working:","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"First we import the packages. If \"using\" was employed, then all of the functions of the packages specified would be made available, but \"import\" requires PackageName.FunctionName to be used unless the function was explicitely exported in the package. If \"include(\"filepath/filename.jl)\" is used, that is the same as copying and pasting. Please see the respective page on YAML input (TODO) for a description of the YAML inputs","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"import OWENS\nimport OWENSAero","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"import PyPlot","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"path = runpath = \"/home/runner/work/OWENS.jl/OWENS.jl/docs/src/literate\" #splitdir(@__FILE__)[1]\n\nInp = OWENS.MasterInput(\"$runpath/sampleOWENS.yml\")\n\nnothing","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"Unpack inputs, or you could directly input them here and bypass the file","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"verbosity = 1\n\nanalysisType = Inp.analysisType\nturbineType = Inp.turbineType\neta = Inp.eta\nNbld = Inp.Nbld\ntowerHeight = Inp.towerHeight\nrho = Inp.rho\nVinf = Inp.Vinf\ncontrolStrategy = Inp.controlStrategy\nRPM = Inp.RPM\nNslices = Inp.Nslices\nntheta = Inp.ntheta\nstructuralModel = Inp.structuralModel\nntelem = Inp.ntelem\nnbelem = Inp.nbelem\nncelem = Inp.ncelem\nnselem = Inp.nselem\nifw = Inp.ifw\nWindType = Inp.WindType\nAModel = Inp.AModel\nwindINPfilename = \"$(path)$(Inp.windINPfilename)\"\nifw_libfile = Inp.ifw_libfile\nif ifw_libfile == \"nothing\"\n ifw_libfile = nothing\nend\nBlade_Height = Inp.Blade_Height\nBlade_Radius = Inp.Blade_Radius\nnumTS = Inp.numTS\ndelta_t = Inp.delta_t\nNuMad_geom_xlscsv_file_twr = \"$(path)$(Inp.NuMad_geom_xlscsv_file_twr)\"\nNuMad_mat_xlscsv_file_twr = \"$(path)$(Inp.NuMad_mat_xlscsv_file_twr)\"\nNuMad_geom_xlscsv_file_bld = \"$(path)$(Inp.NuMad_geom_xlscsv_file_bld)\"\nNuMad_mat_xlscsv_file_bld = \"$(path)$(Inp.NuMad_mat_xlscsv_file_bld)\"\nNuMad_geom_xlscsv_file_strut = \"$(path)$(Inp.NuMad_geom_xlscsv_file_strut)\"\nNuMad_mat_xlscsv_file_strut = \"$(path)$(Inp.NuMad_mat_xlscsv_file_strut)\"\nadi_lib = Inp.adi_lib\nif adi_lib == \"nothing\"\n adi_lib = nothing\nend\nadi_rootname = \"$(path)$(Inp.adi_rootname)\"\n\nB = Nbld\nR = Blade_Radius#177.2022*0.3048 #m\nH = Blade_Height#1.02*R*2 #m\n\nshapeZ = collect(LinRange(0,H,Nslices+1))\nshapeX = R.*(1.0.-4.0.*(shapeZ/H.-.5).^2)#shapeX_spline(shapeZ)\n\nnothing","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"Call the helper function that builds the mesh, calculates the sectional properties, and aligns the sectional properties to the mesh elements,","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"mymesh,myel,myort,myjoint,sectionPropsArray,mass_twr, mass_bld,\nstiff_twr, stiff_bld,bld_precompinput,\nbld_precompoutput,plyprops_bld,numadIn_bld,lam_U_bld,lam_L_bld,\ntwr_precompinput,twr_precompoutput,plyprops_twr,numadIn_twr,lam_U_twr,lam_L_twr,aeroForces,deformAero,\nmass_breakout_blds,mass_breakout_twr,system,assembly,sections,AD15bldNdIdxRng, AD15bldElIdxRng = OWENS.setupOWENS(OWENSAero,path;\n rho,\n Nslices,\n ntheta,\n RPM,\n Vinf,\n eta,\n B,\n H,\n R,\n shapeZ,\n shapeX,\n ifw,\n WindType,\n delta_t,\n numTS,\n adi_lib,\n adi_rootname,\n windINPfilename,\n ifw_libfile,\n NuMad_geom_xlscsv_file_twr,# = \"$path/data/NuMAD_Geom_SNL_5MW_ARCUS_Cables.csv\",\n NuMad_mat_xlscsv_file_twr,# = \"$path/data/NuMAD_Materials_SNL_5MW_D_TaperedTower.csv\",\n NuMad_geom_xlscsv_file_bld,# = \"$path/data/NuMAD_Geom_SNL_5MW_ARCUS.csv\",\n NuMad_mat_xlscsv_file_bld,# = \"$path/data/NuMAD_Materials_SNL_5MW_D_Carbon_LCDT_ThickFoils_ThinSkin.csv\",\n NuMad_geom_xlscsv_file_strut,\n NuMad_mat_xlscsv_file_strut,\n Ht=towerHeight,\n ntelem,\n nbelem,\n ncelem,\n nselem,\n joint_type = 0,\n c_mount_ratio = 0.05,\n AModel, #AD, DMS, AC\n DSModel=\"BV\",\n RPI=true,\n cables_connected_to_blade_base = true,\n meshtype = turbineType)\n\nnothing","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"Optionally, we can run the finite element solver with gemetrically exact beam theory via GXBeam.jl this requires that the OWENS style inputs are converted to the GXBeam inputs. This interface also includes the ability to output VTK files, which can be viewed in paraview. We have adapted this interface to work with OWENS inputs as well.","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"nothing","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"If the sectional properties material files includes cost information, that is combined with the density to estimate the overall material cost of of materials in the blades","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"if verbosity>0\n\n println(\"\\nBlades' Mass Breakout\")\n for (i,name) in enumerate(plyprops_bld.names)\n println(\"$name $(mass_breakout_blds[i]) kg, $(plyprops_bld.costs[i]) \\$/kg: \\$$(mass_breakout_blds[i]*plyprops_bld.costs[i])\")\n end\n\n println(\"\\nTower Mass Breakout\")\n for (i,name) in enumerate(plyprops_twr.names)\n println(\"$name $(mass_breakout_twr[i]) kg, $(plyprops_twr.costs[i]) \\$/kg: \\$$(mass_breakout_twr[i]*plyprops_twr.costs[i])\")\n end\n\n println(\"Total Material Cost Blades: \\$$(sum(mass_breakout_blds.*plyprops_bld.costs))\")\n println(\"Total Material Cost Tower: \\$$(sum(mass_breakout_twr.*plyprops_twr.costs))\")\n println(\"Total Material Cost: \\$$(sum(mass_breakout_blds.*plyprops_bld.costs)+ sum(mass_breakout_twr.*plyprops_twr.costs))\")\n\nend\n\nnothing","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"Here we apply the boundary conditions. For this case, with a regular cantelever tower, the tower base node which is 1 is constrained in all 6 degrees of freedom to have a displacement of 0. You can change this displacement to allow for things like pretension, and you can apply boundary conditions to any node.","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"pBC = [1 1 0\n1 2 0\n1 3 0\n1 4 0\n1 5 0\n1 6 0]\n\nnothing","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"There are inputs for the overall coupled simulation, please see the api reference for specifics on all the options","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"if AModel==\"AD\"\n AD15On = true\nelse\n AD15On = false\nend\n\ninputs = OWENS.Inputs(;analysisType = structuralModel,\ntocp = [0.0,100000.1],\nOmegaocp = [RPM,RPM] ./ 60,\ntocp_Vinf = [0.0,100000.1],\nVinfocp = [Vinf,Vinf],\nnumTS,\ndelta_t,\nAD15On,\naeroLoadsOn = 2)\n\nnothing","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"Then there are inputs for the finite element models, also, please see the api reference for specifics on the options (TODO: ensure that this is propogated to the docs)","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"feamodel = OWENS.FEAModel(;analysisType = structuralModel,\noutFilename = \"none\",\njoint = myjoint,\nplatformTurbineConnectionNodeNumber = 1,\npBC,\nnlOn = true,\nnumNodes = mymesh.numNodes,\nRayleighAlpha = 0.05,\nRayleighBeta = 0.05,\niterationType = \"DI\")\n\nnothing","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"Here is where we actually call the unsteady simulation and where owens pulls the aero and structural solutions together and propogates things in time.","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"println(\"Running Unsteady\")\nt, aziHist,OmegaHist,OmegaDotHist,gbHist,gbDotHist,gbDotDotHist,FReactionHist,\nFTwrBsHist,genTorque,genPower,torqueDriveShaft,uHist,uHist_prp,epsilon_x_hist,epsilon_y_hist,\nepsilon_z_hist,kappa_x_hist,kappa_y_hist,kappa_z_hist = OWENS.Unsteady_Land(inputs;system,assembly,\ntopModel=feamodel,topMesh=mymesh,topEl=myel,aero=aeroForces,deformAero)\n\nnothing","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"Like described above, we can output vtk files viewable in paraview. Here it is done for each time step and shows the deformations. Additionaly, there is a method to input custom values and have them show up on the vtk surface mesh for example, strain, or reaction force, etc. This is described in more detail in the api reference for the function and: TODO","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"println(\"Saving VTK time domain files\")\nOWENS.OWENSFEA_VTK(\"$path/vtk/SNLARCUS5MW_timedomain_TNBnltrue\",t,uHist,system,assembly,sections;scaling=1,azi=aziHist)\n\nnothing","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"This helper function looks through all the loads and picks out the worst case safety factor in each of the stacks of composite lamina it also calculates analytical simply supported buckling safety factors","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"##########################################\n#### Ultimate Failure #####\n##########################################\n\nmassOwens,stress_U,SF_ult_U,SF_buck_U,stress_L,SF_ult_L,SF_buck_L,stress_TU,SF_ult_TU,\nSF_buck_TU,stress_TL,SF_ult_TL,SF_buck_TL,topstrainout_blade_U,topstrainout_blade_L,\ntopstrainout_tower_U,topstrainout_tower_LtopDamage_blade_U,\ntopDamage_blade_L,topDamage_tower_U,topDamage_tower_L = OWENS.extractSF(bld_precompinput,\nbld_precompoutput,plyprops_bld,numadIn_bld,lam_U_bld,lam_L_bld,\ntwr_precompinput,twr_precompoutput,plyprops_twr,numadIn_twr,lam_U_twr,lam_L_twr,\nmymesh,myel,myort,Nbld,epsilon_x_hist,kappa_y_hist,kappa_z_hist,epsilon_z_hist,\nkappa_x_hist,epsilon_y_hist;verbosity, #Verbosity 0:no printing, 1: summary, 2: summary and spanwise worst safety factor # epsilon_x_hist_1,kappa_y_hist_1,kappa_z_hist_1,epsilon_z_hist_1,kappa_x_hist_1,epsilon_y_hist_1,\nLE_U_idx=1,TE_U_idx=6,SparCapU_idx=3,ForePanelU_idx=2,AftPanelU_idx=5,\nLE_L_idx=1,TE_L_idx=6,SparCapL_idx=3,ForePanelL_idx=2,AftPanelL_idx=5,\nTwr_LE_U_idx=1,Twr_LE_L_idx=1,\nAD15bldNdIdxRng,AD15bldElIdxRng,strut_precompoutput=nothing) #TODO: add in ability to have material safety factors and load safety factors\n\nnothing","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"","category":"page"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"This page was generated using Literate.jl.","category":"page"},{"location":"VAWTGenUserGuide/#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.","page":"Legacy VAWTGen Guide","title":"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.","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Version 1.0 User GuideBrian C. OwensWind Energy TechnologiesSandia National LaboratoriesNovember 7, 2013Contents","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Introduction 1","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Overview of VAWTGen Mesh Generator 1","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Demonstration 3","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Conventions Employed in Creating a Model with VAWTGen 5","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Structural and aerodynamic description of components 5","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Caveats of creating a VAWT configuration in VAWTGen 7","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Coordinate system 7","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Tower component 7","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Blade component 7","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Blade component 8","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"VAWTGen Input File 9","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"VAWTGen Command Line Execution 10","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"VAWTGen Graphical Output 11","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"VAWTGen Output Files 15","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"OWENS Main Input File (.owens) 15","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Mesh File (.mesh) 16","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Element Property File (.el) 16","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Element Orientation File (.ort) 17","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Joint File (.jnt) 17","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Boundary Conditions File (.bc) 17","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Blade Data File (.bld) 18","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Output File (.out) 18","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Future Versions 18","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"References 19","category":"page"},{"location":"VAWTGenUserGuide/#Introduction","page":"Legacy VAWTGen Guide","title":"Introduction","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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.","category":"page"},{"location":"VAWTGenUserGuide/#Overview-of-VAWTGen-Mesh-Generator","page":"Legacy VAWTGen Guide","title":"Overview of VAWTGen Mesh Generator","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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.","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"(Image: ){width=\"2.5990562117235347in\" height=\"1.453332239720035in\"}","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"[]{#_bookmark2 .anchor}Figure 1 Illustrations of V, H, and Darrieus VAWT configurationsVAWTGen 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 ablade 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.","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"(Image: C:\\\\Users\\\\bcowens\\\\Desktop\\\\meshGenFlow.png){width=\"4.016800087489064in\" height=\"2.6266666666666665in\"}","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"[]{#_bookmark3 .anchor}Figure 2 Input and output of VAWTGen mesh generatorOutput 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 andprovides 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.","category":"page"},{"location":"VAWTGenUserGuide/#Demonstration","page":"Legacy VAWTGen Guide","title":"Demonstration","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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.(Image: C:\\\\Users\\\\bcowens\\\\Desktop\\\\export_fig\\\\Vvawt.png){width=\"1.8892694663167104in\" height=\"3.2266666666666666in\"} (Image: 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","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"(Image: C:\\\\Users\\\\bcowens\\\\Desktop\\\\export_fig\\\\dar3swept.png){width=\"1.02086176727909in\" height=\"3.3866666666666667in\"}(Image: C:\\\\Users\\\\bcowens\\\\Desktop\\\\export_fig\\\\dar3strut.png){width=\"0.8588167104111986in\" height=\"3.3866666666666667in\"}","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"+–––––––––––––––––+–––––––––––––––––-+ | > []{#bookmark7 | > []{#bookmark8 .anchor}Figure | | > .anchor}Figure 5 Wireframe | > 6 Wireframe of Strutted | | > of Swept Darrieus VAWT** | > Darrieus VAWT** | +==================================+===================================+ +–––––––––––––––––+–––––––––––––––––-+","category":"page"},{"location":"VAWTGenUserGuide/#Conventions-Employed-in-Creating-a-Model-with-VAWTGen","page":"Legacy VAWTGen Guide","title":"Conventions Employed in Creating a Model with VAWTGen","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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","category":"page"},{"location":"VAWTGenUserGuide/#Structural-and-aerodynamic-description-of-components","page":"Legacy VAWTGen Guide","title":"Structural and aerodynamic description of components","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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.","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"+––––––+–––+–––––-+–-+–––+–-+–––-+–––-+––+ | > (-) | * | > | | > | | > * | > ** | ** | | > (-) | *(de | (kg/m) | | **( | | *(Nm\\ | (N) | (- | | | g)** | > | | Nm\\^ | | ^2)** | | ** | | | | (Nm\\^2)** | | 2)** | | | | | +============+======+===========+===+======+===+=======+=======+====+ | > ) (kg | > | **(m) | * | ( | > | > ** | | | | > m) (kg | m) | | * | m) | | (m)** | | | | | > ( | | ( | | * | | | | | | m)** | | m | | * | | | | | | | | ) | | ( | | | | | | | | * | | m | | | | | | | | * | | ) | | | | | | | | | | * | | | | | | | | | | * | | | | +––––––+–––+–––––-+–-+–––+–-+–––-+–––-+––+","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"+––-+––+–––-+–––+––––––––-+––––-+––––+––+ | > | | 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 | | | | | | | | | ** | | | | | | | +––-+––+–––-+–––+––––––––-+––––-+––––+––+","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Caveats of blade structural description in VAWTGen are described below.","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"(Image: ){width=\"4.046369203849519e-3in\" height=\"0.15120188101487314in\"}The alpha column describing bend-twist coupling is not currently employed in the analysis.(Image: ){width=\"4.046369203849519e-3in\" height=\"0.15120188101487314in\"}\nFor blades, the reference axis is assumed to pass through the quarter chord. The blade may be shaped by using the PrecrvRef and PreswpRef parameters.\nVAWTGen 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.\nEdgewise elastic axis and mass center offsets are positive towards the trailing edge of the blade section.\nFlapwise elastic axis and mass center offsets are positive in the direction outward from the machine center.\nUnder these assumptions, positive structural twist twists the leading edge inwards towards the machine center.\nAll other structural properties are the same as that specified in the FAST manual[1].","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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(Image: ){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.","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"+––––––-+–––––-+––––––-+–––-+–––+–––––––+ | > | 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** | | +––––––-+–––––-+––––––-+–––-+–––+–––––––+","category":"page"},{"location":"VAWTGenUserGuide/#Caveats-of-creating-a-VAWT-configuration-in-VAWTGen","page":"Legacy VAWTGen Guide","title":"Caveats of creating a VAWT configuration in VAWTGen","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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.","category":"page"},{"location":"VAWTGenUserGuide/#Coordinate-system","page":"Legacy VAWTGen Guide","title":"Coordinate system","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"The following coordinate system z-axis is along the tower axis, and x- and y-axes are in the plane of rotation.","category":"page"},{"location":"VAWTGenUserGuide/#Tower-component","page":"Legacy VAWTGen Guide","title":"Tower component","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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.","category":"page"},{"location":"VAWTGenUserGuide/#Blade-component","page":"Legacy VAWTGen Guide","title":"Blade component","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"The blade components are positioned using the following input parameters:","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Number of blades\nBlade length\nBlade root elevation from tower base elevation (z= 0)\nBlade 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)\nBlade theta orientation a (degrees, rotation about the y-axis)\nBlade sweep angle (degrees, rotation about an intermediate \"2-axis\" a positive angle sweeps the blade away from the direction of rotation)","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Notes:","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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.\nBlades will be positioned with equal azimuth spacing of the blade root dictated by the specified number of blades.\nUnder 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.\nThis 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.","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"[]{#_bookmark15 .anchor}Strut componentThe strut components (which can provide a structural component between the tower and blade connection) are positioned using the following input parameters:","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Fraction of tower span for strut placement\nFraction of blade span for strut placement","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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.","category":"page"},{"location":"VAWTGenUserGuide/#VAWTGen-Input-File","page":"Legacy VAWTGen Guide","title":"VAWTGen Input File","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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.","category":"page"},{"location":"VAWTGenUserGuide/#VAWTGen-Command-Line-Execution","page":"Legacy VAWTGen Guide","title":"VAWTGen Command Line Execution","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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:","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"+––––+––––––––+––––––––––––––––––––––+ | > \\>\\> | | | | > 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, | | +––––+––––––––+––––––––––––––––––––––+","category":"page"},{"location":"VAWTGenUserGuide/#VAWTGen-Graphical-Output","page":"Legacy VAWTGen Guide","title":"VAWTGen Graphical Output","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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 MeshElement Orientation Visualization(Image: ){width=\"2.202673884514436in\" height=\"2.950511811023622in\"}(Image: ){width=\"2.1219225721784776in\" height=\"2.6937674978127735in\"}403530252015","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"10","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"5","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"0","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"1 0-1","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"-15","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"15","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"1050-5-10x[]{#_bookmark19 .anchor}Figure 7. Finite element mesh with node numbering Figure 8. Finite element mesh with element orientationsVisualization of OWENS Output using VAWTGenA 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 ResultsThe 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 ResultsThe 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.mA 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 ResultsA 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.","category":"page"},{"location":"VAWTGenUserGuide/#VAWTGen-Output-Files","page":"Legacy VAWTGen Guide","title":"VAWTGen Output Files","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"The following output files are generated to serve as input for the OWENS analysis tool:","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"OWENS main input file (.owens)\nBeam mesh file (.mesh)\nElement property file (.el)\nElement orientation file (.ort)\nJoint file (.jnt)\nBoundary conditions file (.bc)\nBlade data file (.bld)","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"Additionally, a log file describing the junctions of various structural components is generated in a .out output file.","category":"page"},{"location":"VAWTGenUserGuide/#OWENS-Main-Input-File-(.owens)","page":"Legacy VAWTGen Guide","title":"OWENS Main Input File (.owens)","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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].","category":"page"},{"location":"VAWTGenUserGuide/#Mesh-File-(.mesh)","page":"Legacy VAWTGen Guide","title":"Mesh File (.mesh)","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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:","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"+––––-+–––––+–––-+–––––––-+–––––––––––-+ | > 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 | | | | | > ... | | | | | +––––-+–––––+–––-+–––––––-+–––––––––––-+","category":"page"},{"location":"VAWTGenUserGuide/#Element-Property-File-(.el)","page":"Legacy VAWTGen Guide","title":"Element Property File (.el)","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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:","category":"page"},{"location":"VAWTGenUserGuide/#Element-Orientation-File-(.ort)","page":"Legacy VAWTGen Guide","title":"Element Orientation File (.ort)","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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.","category":"page"},{"location":"VAWTGenUserGuide/#Joint-File-(.jnt)","page":"Legacy VAWTGen Guide","title":"Joint File (.jnt)","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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.","category":"page"},{"location":"VAWTGenUserGuide/#Boundary-Conditions-File-(.bc)","page":"Legacy VAWTGen Guide","title":"Boundary Conditions File (.bc)","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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:","category":"page"},{"location":"VAWTGenUserGuide/#Blade-Data-File-(.bld)","page":"Legacy VAWTGen Guide","title":"Blade Data File (.bld)","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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:","category":"page"},{"location":"VAWTGenUserGuide/#Output-File-(.out)","page":"Legacy VAWTGen Guide","title":"Output File (.out)","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"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.","category":"page"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"+–-+–––-+––+–––––––––––––––––––––––––-+ | 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 | | +–-+–––-+––+–––––––––––––––––––––––––-+ | \\ | | | | | . | | | | | . | | | | | . | | | | +–-+–––-+––+–––––––––––––––––––––––––-+","category":"page"},{"location":"VAWTGenUserGuide/#Future-Versions","page":"Legacy VAWTGen Guide","title":"Future Versions","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"There are no planned future developments for VAWTGen. Future developments or modifications will be considered as analysis needs arise.","category":"page"},{"location":"VAWTGenUserGuide/#References","page":"Legacy VAWTGen Guide","title":"References","text":"","category":"section"},{"location":"VAWTGenUserGuide/","page":"Legacy VAWTGen Guide","title":"Legacy VAWTGen Guide","text":"OWENS User Guide\nJonkman, J.M., and Buhl, M. L., 2005, FAST User's Guide, National Renewable Energy Laboratory, NREL/EL- 500-38230.","category":"page"},{"location":"legacyUserGuide/#TODO:-condense-and-update-this-with-the-latest-updates","page":"Legacy User Guide","title":"TODO: condense and update this with the latest updates","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"subtitle: | Version 1.0","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"User Guide","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"*Brian C. Owens\n *","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Wind Energy Technologies\n Sandia National Laboratories","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"*November 11, 2013\n * title: | Offshore Wind Energy Simulation","category":"page"},{"location":"legacyUserGuide/#Analysis-Tool:-OWENS","page":"Legacy User Guide","title":"Analysis Tool: OWENS","text":"","category":"section"},{"location":"legacyUserGuide/#Contents-{#contents-.TOC-Heading}","page":"Legacy User Guide","title":"Contents {#contents .TOC-Heading}","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Introduction 1","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Overview of OWENS Model Formulation 1","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Basic Formulation Concepts 1","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Equations of Motion 2","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Overview of OWENS Analysis Framework 4","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"OWENS Installation 7","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Platform dynamics software interface 7","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"OWENS Command Line Execution 8","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Static Analysis Execution 8","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Modal Analysis Execution 8","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Creating Campbell Diagrams of a VAWT Configuration 9","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Transient Analysis Execution 11","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Specified rotor speed profile 11","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Forced start-up mode using generator 11","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Self-starting turbine mode 12","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Transient Analysis Execution Using Reduced Order Model 12","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"OWENS Input Files 13","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"OWENS Main Input File (.owens) 14","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Mesh File (.mesh) 15","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Element Property File (.el) 15","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Element Orientation File (.ort) 16","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Joint File (.jnt) 16","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Concentrated Nodal Terms File 16","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Boundary Conditions File (.bc) 17","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Platform Simulation File (.plat) 17","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Initial Conditions File 18","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Blade Data File (.bld) 18","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Aerodynamic Loads File 18","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Drivetrain Properties File 18","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Generator Properties File 19","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"OWENS Output Files 20","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Static Analysis Output 20","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Modal Analysis Output 20","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Transient Analysis Output 21","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"References 21","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Appendix A: Mapping from local nodal DOF numbering to global DOF numbering 22","category":"page"},{"location":"legacyUserGuide/#Introduction","page":"Legacy User Guide","title":"Introduction","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"This user guide presents instructions for using the Offshore Wind ENergy Simulation (OWENS) analysis tool. This structural dynamics finite element analysis tool is intended to be used for the analysis of vertical-axis wind turbine (VAWT) on a floating platform, and is used in conjunction with the VAWTGen mesh generator described in a separate user manual[1]. An overview of the OWENS analysis tool is presented. The execution, analysis modes, input files, and resulting output files for OWENS are discussed in detail. Visualization options for modal and transient analysis are also presented. Version 1.0 of OWENS presents a structural dynamics tool for modal and transient analysis of an arbitrary VAWT structure affixed to a floating platform. Simple drivetrain and generator modules are also present in this version. Future work will implement fully coupled hydrodynamic, aerodynamic, and more robust nonlinear formulations.","category":"page"},{"location":"legacyUserGuide/#","page":"Legacy User Guide","title":"","text":"","category":"section"},{"location":"legacyUserGuide/#Overview-of-OWENS-Model-Formulation","page":"Legacy User Guide","title":"Overview of OWENS Model Formulation","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The fundamental requirements of the aeroelastic analysis tool for off-shore VAWTs necessitates a flexible framework capable of considering arbitrary configuration geometries, arbitrary loading scenarios, and the ability to interface with various modules that account for the interaction of the environment and power generation hardware with the turbine structure. The finite element method provides a means to satisfy these general requirements. If a sufficiently robust element is developed, a mesh (collection of elements) of an arbitrary VAWT configuration may be constructed via a mesh generator. The ability to capture various couplings and provide an accurate representation of turbine behavior will depend on the robustness of the element formulation.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The finite element method requires boundary conditions to be imposed on the elements by specifying loads or displacements at discrete points (nodes) in the mesh. These boundary conditions provide a clear interface between aerodynamic and hydrodynamic modules that impart forces on the turbine. With boundary conditions specified, unspecified displacements and loads may be calculated. Next, displacement motions of the turbine may be provided to aerodynamic and hydrodynamic modules to calculate loads on the turbine. This gives rise to mutual causation because in reality loads and displacements are intricately connected. Iterative procedures, however, often allow for a convergence to be reached, eliminating this issue for all practical purposes.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The subsections that follow will present basic formulation concepts for the OWENS analysis tool.","category":"page"},{"location":"legacyUserGuide/#Basic-Formulation-Concepts","page":"Legacy User Guide","title":"Basic Formulation Concepts","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Basic formulation concepts will be discussed before describing components of the proposed formulation in detail. As stated earlier, the finite element method is utilized for its robustness and flexibility. A robust element formulation will become the foundation of the aeroelastic analysis tool. Analysis of the dynamic response of the turbine is challenging because of rotating components. Because almost all structural components of the turbine will be rotating at some rotor speed (𝛺), it is convenient to perform the formulation in a rotating reference frame. Such a frame is capable of capturing rotational effects, including centrifugal stiffening/softening and Coriolis effects.","category":"page"},{"location":"legacyUserGuide/#Equations-of-Motion","page":"Legacy User Guide","title":"Equations of Motion","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Equations of motion for the platform are developed by treating the platform as a rigid body, whereas the turbine is treated as a rotating deformable body. Motions of discrete points on the turbine can be expressed as the sum of the turbine motion (deformation and rigid rotor rotation) and the platform motion (rigid). Expressions for the velocities of the platform and for an arbitrary point on the turbine are shown below:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"oversetV_platform = frac_^(N)d dtoversetR_PN = dotU_1widehatn_1 + dotU_2widehatn_2 + dotU_3widehatn_3","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"oversetomega_platform = omega_1widehatp_1 + omega_2widehatp_2 + omega_3widehatp_3","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"oversetv = oversetV_platform + lbrack(oversetomega_platform + Omegawidehath_3) times oversetrrbrack + frac_^(H)d dtoversetr","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"(Image: figs/userguide1.png){width=\"2.3in\" height=\"2.28in\"}","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Figure 1 Illustration of frames, position vectors, and angular velocities","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Figure 1 presents an illustration of the frames, angular velocities, and positions vectors that will be described. Here, U~i~ represents the displacement components of the platform center of mass, and 𝜔~i~ represents the angular velocity components of the platform. The inertial frame is represented by the n~i~ coordinate axes, the platform frame is represented by the p~i~ coordinate axes, and the rotating hub frame is represented by the h~i\\ ~coordinate axes. The vector r defines the position of an arbitrary point on the turbine with respect to the hub frame origin. The time derivative of this vector is taken within the hub frame and is essentially the time derivative of turbine deformations. The platform and hub frame origins are coincident, and there is no translational velocity of the hub frame relative to the turbine frame. Hamilton's principle relates the variation of kinetic energy (T) and potential energy (V), and virtual work of non-conservative forces (δW~np­~) to formulate equations of motion. Hamilton's extended principle is written simply as:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"deltaint_t_1^t_2leftlbrack T(t) - V(t) rightrbrack dt +int_t_1^t_2delta W_np = 0","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The kinetic energy of the system may be written compactly as:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"T_system = T_platform + T_turbine","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"T_platform = frac12M_platformoversetV_platform bullet oversetV_platform + frac12(oversetomega_platform)^Tlbrack Jrbrackoversetomega_platform","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"T_turbine = frac12int_V^rhooversetv bullet oversetvdV","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The platform kinetic energy is decomposed into two parts, translational kinetic energy and rotational kinetic energy (where [J] is the moment of inertia tensor for the platform). The turbine (which will be represented by a collection of elements) kinetic energy is expressed in terms of the volume integral of the turbine density and the velocity of infinitesimal points in the turbine (as developed earlier).","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Note that the quantities described above may be represented or \"coordinatized\" in any frame. Indeed, some vectors were expressed in the inertial (n~i~) frame, and others in the rotating hub (h~i~) frame. Because the rotating turbine represents the bulk of the modeling effort, the implementation of the equations of motion will be coordinatized in the hub frame. Platform motions and forces, however, are described in the inertial or platform frames. Therefore, transformations between the various frames are performed where necessary.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"In the development of equations of motion, one can choose to retain the rotor angular velocity/acceleration (Omega) and platform angular velocity/acceleration (omega_i) as degrees of freedom in the resulting system of equations or as specified parameters. Retaining these terms as degrees of freedom is undesirable because it adds significant complexity to the formulation and introduces a significant number of nonlinear terms. More critically, however, is that the analysis tool must be interfaced with independent modules for aerodynamics, hydrodynamics, and generator dynamics that will affect these rotational motion quantities. Therefore, it is not possible to retain these variables as degrees of freedom in the model formulation without losing the ability to interface generic modules. Accordingly, these variables will be retained as specified motion parameters. The value of these parameters will be updated by post-processing routines after gathering information from the aforementioned modules and turbine motions.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The resulting equations of motion for a floating turbine structure will be of the following form (hyperbolic):","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"lbrack Mrbrackleft ddotU right + lbrack Crbrackleft dotU right + lbrack Krbrackleft U right = left F right","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"This can be decomposed to show contributions from the turbine and platform and show couplings between the two:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"beginbmatrix\nM_TT M_TP \nM_PT M_PP\nendbmatrixbeginBmatrix\nddotU_T \nddotU_P\nendBmatrix + beginbmatrix\nC_TT C_TP \nC_PT C_PP\nendbmatrixbeginBmatrix\ndotU_T \ndotU_P\nendBmatrix + beginbmatrix\nK_TT K_TP \nK_PT K_PP\nendbmatrixbeginBmatrix\nU_T \nU_P\nendBmatrix = beginBmatrix\nF_T \nF_P\nendBmatrix","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#-2","page":"Legacy User Guide","title":"","text":"","category":"section"},{"location":"legacyUserGuide/#Overview-of-OWENS-Analysis-Framework","page":"Legacy User Guide","title":"Overview of OWENS Analysis Framework","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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].","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"(Image: figs/userguide2.png){width=\"8.1578947944007in\" height=\"5.019896106736658in\"}","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Figure Analysis framework for the OWENS toolkit","category":"page"},{"location":"legacyUserGuide/#OWENS-Installation","page":"Legacy User Guide","title":"OWENS Installation","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The OWENS analysis software should be installed by adding the following directories to the MATLAB path:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"OWENS\\source\nOWENS\\source\\commonSource\nOWENS\\source\\modalSource\nOWENS\\source\\transientSource\nOWENS\\source\\utilitySource\nOWENS\\serverFiles","category":"page"},{"location":"legacyUserGuide/#Platform-dynamics-software-interface","page":"Legacy User Guide","title":"Platform dynamics software interface","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"%sets system commands to launch wavEC software","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"hydroLaunchScript = \\'/home/bcowens/work/OWENSsingle/launchPlatformCode\\';","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"%sysCallString = [matlabPath,\\' -sd \\',hydroCodeDirectory,\\' -r \\',hydroCodeExec,\\' &\\'];","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"sysCallString = [\\'bash \\',hydroLaunchScript,\\' &\\'];","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"disp(\\'launching WAVEC\\'); %launch wavEC depending on pc or unix environment","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"if(ispc());","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"system(sysCallString);","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"end","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"if(isunix())","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"unix(sysCallString);\nend","category":"page"},{"location":"legacyUserGuide/#OWENS-Command-Line-Execution","page":"Legacy User Guide","title":"OWENS Command Line Execution","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#Static-Analysis-Execution","page":"Legacy User Guide","title":"Static Analysis Execution","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The static analysis capability of OWENS is executed as follows:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"owens(inputFile,'S',rotorSpeed,nonlinearBool,dispGuess);","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"For example:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"owens('vawt.owens','S',0.5,true);","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#Modal-Analysis-Execution","page":"Legacy User Guide","title":"Modal Analysis Execution","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The modal analysis capability of OWENS is executed as follows:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"owens(inputFile,'M',rotorSpeed,spinUpBool,numModesOutput,dispGuess);","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"For example:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"owens('vawt.owens','M',0.0,true,40);","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#Creating-Campbell-Diagrams-of-a-VAWT-Configuration","page":"Legacy User Guide","title":"Creating Campbell Diagrams of a VAWT Configuration","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"[freq] = campDiagramGen(inputFileName,outputFileName,rotorSpeedArray,spinUpOn,numModes)","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"campDiagPlotter(resultsFileName,numModesToPlot,numPerRevLines,minRPMplot,maxRPMplot)","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"(Image: figs/userguide3.png){width=\"5.829861111111111in\" height=\"4.254861111111111in\"}","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Figure 3 Example of a Campbell diagram","category":"page"},{"location":"legacyUserGuide/#Transient-Analysis-Execution","page":"Legacy User Guide","title":"Transient Analysis Execution","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The transient analysis capability of OWENS is executed as follows:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"owens(inputFile,'TNB',timeStep,numTimeSteps,nlBool,turbineOperationParams...);","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#Specified-rotor-speed-profile","page":"Legacy User Guide","title":"Specified rotor speed profile","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"An arbitrary VAWT configuration may be subjected to an arbitrary, specified rotor speed profile using the following command line execution.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"owens('vawt.owens','TNB',1.0e-3,40000,true,0,[0.0 5.0 30.0],[0.0 0.5 0.5]);","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#Forced-start-up-mode-using-generator","page":"Legacy User Guide","title":"Forced start-up mode using generator","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"owens('vawt.owens','T',1.0e-3,40000,true,1,0.0);","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#Self-starting-turbine-mode","page":"Legacy User Guide","title":"Self-starting turbine mode","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"owens('vawt.owens','T',1.0e-3,40000,true 2,0.0,1.05);","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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 \\.mat such as \"vawt.mat\". Table 1 provides a listing with output description, variable name, and size of the output.","category":"page"},{"location":"legacyUserGuide/#Transient-Analysis-Execution-Using-Reduced-Order-Model","page":"Legacy User Guide","title":"Transient Analysis Execution Using Reduced Order Model","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The transient analysis capability with a reduced order model of OWENS is executed as follows:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"owens(inputFile,'ROM',timeStep,numTimeSteps,numModesForROM,nlBool,turbineOperationParams...);","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#OWENS-Input-Files","page":"Legacy User Guide","title":"OWENS Input Files","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"OWENS main input file (.owens)\nBeam mesh file (.mesh)\nElement property file (.el)\nElement orientation file (.ort)\nJoint file (.jnt)\nConcentrated nodal term file (.ndl)\nBoundary conditions file (.bc)\nPlatform simulation file (.plat)\nInitial conditions file (.ic)\nBlade data file (.bld)\nAerodynamic loads file\nDriveshaft file (.ds)\nGenerator properties file (.gen)","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#OWENS-Main-Input-File-(.owens)","page":"Legacy User Guide","title":"OWENS Main Input File (.owens)","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The OWENS main input file is generated by VAWTGen with the following format:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"vawt.mesh\nvawt.el\nvawt.ort\nvawt.jnt\n[concentrated nodal terms file]\nvawt.bc\n0 vawt.plat\n[initial conditions file]\n0 vawt.bld [aero loads file]\n0 [drivetrain property file]\n[generator property file]\n0.0 0.0","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"lbrack Crbrack = alphalbrack Mrbrack + betalbrack Krbrack","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#Mesh-File-(.mesh)","page":"Legacy User Guide","title":"Mesh File (.mesh)","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"numNodes numElements\nnodeNum xCoord yCoord zCoord\nnodeNum xCoord yCoord zCoord\nnodeNum xCoord yCoord zCoord\n...\nelementNum numNodesPerElement localNodeNum1 localNodeNum2\nelementNum numNodesPerElement localNodeNum1 localNodeNum2\nelementNum numNodesPerElement localNodeNum1 localNodeNum2\n...\nnumberOfStructuralComponents numElementsComponent1 .... numElementsComponentN","category":"page"},{"location":"legacyUserGuide/#Element-Property-File-(.el)","page":"Legacy User Guide","title":"Element Property File (.el)","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Element1, Node 1: [blade fraction] [aeroCenter] [structuralTwist] [MassPerLength] [FlapwiseStiffness] [EdgewiseStiffness] [TorsionalStiffness] [AxialStiffness] [alphaCouplingFactor] [FlapwiseInertia] [EdgewiseInertia] [Precurve] [PreSweep] [FlapwiseCGoffset] [EdgewiseCGOffset] [FlapwiseEAOffset] [EdgewiseEAOffset] ...\nElement1, Node 2: [blade fraction] [aeroCenter] [structuralTwist] [MassPerLength] [FlapwiseStiffness] [EdgewiseStiffness] [TorsionalStiffness] [AxialStiffness] [alphaCouplingFactor] [FlapwiseInertia] [EdgewiseInertia] [Precurve] [PreSweep] [FlapwiseCGoffset] [EdgewiseCGOffset] [FlapwiseEAOffset] [EdgewiseEAOffset] ...","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"...","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"...\nElement n, Node 1: [blade fraction] [aeroCenter] [structuralTwist] [MassPerLength] [FlapwiseStiffness] [EdgewiseStiffness] [TorsionalStiffness] [AxialStiffness] [alphaCouplingFactor] [FlapwiseInertia] [EdgewiseInertia] [Precurve] [PreSweep] [FlapwiseCGoffset] [EdgewiseCGOffset] [FlapwiseEAOffset] [EdgewiseEAOffset] ...","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Element n, Node 2: [blade fraction] [aeroCenter] [structuralTwist] [MassPerLength] [FlapwiseStiffness] [EdgewiseStiffness] [TorsionalStiffness] [AxialStiffness] [alphaCouplingFactor] [FlapwiseInertia] [EdgewiseInertia] [Precurve] [PreSweep] [FlapwiseCGoffset] [EdgewiseCGOffset] [FlapwiseEAOffset] [EdgewiseEAOffset] ...","category":"page"},{"location":"legacyUserGuide/#Element-Orientation-File-(.ort)","page":"Legacy User Guide","title":"Element Orientation File (.ort)","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"elNum theta3 theta2 theta1 length xOffset yOffset zOffset","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#Joint-File-(.jnt)","page":"Legacy User Guide","title":"Joint File (.jnt)","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"jointNumber masterNode slaveNode jointType jointMass 0.0 ... jointPsi jointTheta","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#Concentrated-Nodal-Terms-File","page":"Legacy User Guide","title":"Concentrated Nodal Terms File","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"74 M 1 254.0\n81 K 3 1.0e6\n92 F 2 2000.0","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"nodeNum termType localDOFNum value","category":"page"},{"location":"legacyUserGuide/#Boundary-Conditions-File-(.bc)","page":"Legacy User Guide","title":"Boundary Conditions File (.bc)","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"6\n1 1 0.000000\n1 2 0.000000\n1 3 0.000000\n1 4 0.000000\n1 5 0.000000\n1 6 0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"nodeNum localDOFNum value","category":"page"},{"location":"legacyUserGuide/#Platform-Simulation-File-(.plat)","page":"Legacy User Guide","title":"Platform Simulation File (.plat)","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The platform simulation file specifies parameters required for an external platform dynamics simulation. An example, annotated platform file is shown below.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"1 0 0 0 0 0 :active platform DOFs (surge, sway, heave, roll, pitch, yaw)","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0.0 0.0 0.0 0.0 0.0 :initial conditions for platform DOFs","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0 :drag damping flag (1 = on, 0 = off)","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"1 :mooring flag (1 = on, 0 = off)","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0 :gravity flag (1 = on, 0 = off)","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0 :plot flag (1 = on, 0 = off)","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0 :radiation damping flag (1 = on, 0 = off)","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"1 :node number for platform turbine connection","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"1 :platform turbine yaw interaction (0 = free spinning tower, 1 = fixed tower, 2 = generator reaction torque applied to platform)","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"3500 :platform server port","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"4500 :platform client port","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#Initial-Conditions-File","page":"Legacy User Guide","title":"Initial Conditions File","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"60 1 0.1\n51 2 -0.4\nnodeNum localDOFNum value","category":"page"},{"location":"legacyUserGuide/#Blade-Data-File-(.bld)","page":"Legacy User Guide","title":"Blade Data File (.bld)","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"bladeNum nodeDistance nodeNum elementNum quarterChordCoord1 quarterChordCoord2 quarterChordCoord3 sectionNormalVec1 sectionNormalVec2 sectionNormalVec3 sectionTangentVec1 sectionTangentVec2 sectionTangentVec3 sectionChord sectionAirfoilNumber [place holder not used]","category":"page"},{"location":"legacyUserGuide/#Aerodynamic-Loads-File","page":"Legacy User Guide","title":"Aerodynamic Loads File","text":"","category":"section"},{"location":"legacyUserGuide/#Drivetrain-Properties-File","page":"Legacy User Guide","title":"Drivetrain Properties File","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"1.0e8 1e6 1000.0 :drivetrain spring constant, damping constant, MOI\n1.0 1.0 :gear ratio, gear box efficiency","category":"page"},{"location":"legacyUserGuide/#Generator-Properties-File","page":"Legacy User Guide","title":"Generator Properties File","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"2.09e4 :generator rated torque\n1.0 :zero torque generator speed (in Hz)\n2.0 :pull out ratio\n5.0 :generator rated slip percentage","category":"page"},{"location":"legacyUserGuide/#OWENS-Output-Files","page":"Legacy User Guide","title":"OWENS Output Files","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"This section describes the output files generated by the OWENS analysis software. Output is different for the static, modal, and transient analysis types.","category":"page"},{"location":"legacyUserGuide/#Static-Analysis-Output","page":"Legacy User Guide","title":"Static Analysis Output","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/#Modal-Analysis-Output","page":"Legacy User Guide","title":"Modal Analysis Output","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"MODE # 1","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Frequency: 9.941364e-001:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Damping 3.576857e-014:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0 deg Mode Shape:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Ux Uy Uz thetax thetay thetaz","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"-0.000000 -0.000000 -0.000000 -0.000000 0.000833 -0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0.000627 0.000000 0.000000 -0.000000 0.000819 0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0.001235 0.000000 0.000000 -0.000000 0.000780 0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0.001819 0.000000 0.000000 -0.000000 0.000713 0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0.002353 0.000000 0.000000 -0.000000 0.000620 0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0.002669 0.000000 0.000000 -0.000000 0.000557 0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0.002948 0.000000 0.000000 -0.000000 0.000497 0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0.003196 0.000000 0.000000 -0.000000 0.000437 0.000000\n...\n90 deg Mode Shape:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Ux Uy Uz thetax thetay thetaz","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"-0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"-0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"...","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Mode #2","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"...","category":"page"},{"location":"legacyUserGuide/#-3","page":"Legacy User Guide","title":"","text":"","category":"section"},{"location":"legacyUserGuide/#Transient-Analysis-Output","page":"Legacy User Guide","title":"Transient Analysis Output","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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 \\.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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Transient analysis output may be visualized using VAWTGen visualization capabilities[1].","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Table 1. OWENS Transient Output","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Output Variable Name (units) Size –––––––––––- –––––––––––- –––––––––––- Time t (s) 1 x numTimeSteps","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Nodal displacements uHist (m or rad) numDOF x numTimeSteps","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Generator torque genTorque (N-m) 1 x numTimeSteps","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Generator power genPower (W) 1 x numTimeSteps","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Rotor position aziHist (rad) 1 x numTimeSteps","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Rotor speed OmegaHist (Hz) 1 x numTimeSteps","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Rotor acceleration OmegaDotHist (Hz/s) 1x numTimetSteps","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Gearbox position gbHist (rad) 1 x numTimeSteps","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Gearbox speed gbDotHist (Hz) 1 x numTimeSteps","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Gearbox acceleration gbDotDotHist (Hz/s) 1 x numTimeSteps","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Driveshaft torque torqueDriveShaft (N-m) 1 x numTimeSteps","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Platform degrees of rigidDof (m or rad) 6 x numTimeSteps freedom ","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"Turbine base reaction FReactionHist (N or 6 x numTimeSteps force N-m) –––––––––––––––––––––––––––––––––––-","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":": Default static nonlinear analysis parameters","category":"page"},{"location":"legacyUserGuide/#References","page":"Legacy User Guide","title":"References","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"VAWTGen Manual\nWavEC manual\nJonkman, J.M., and Buhl, M. L., 2005, FAST User's Guide, National Renewable Energy Laboratory, NREL/EL-500-38230.","category":"page"},{"location":"legacyUserGuide/#Appendix-A:-Mapping-from-local-nodal-DOF-numbering-to-global-DOF-numbering","page":"Legacy User Guide","title":"Appendix A: Mapping from local nodal DOF numbering to global DOF numbering","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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\".","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"globalDOFNum = (nodeNum-1)*6 + localDOFNum","category":"page"},{"location":"legacyUserGuide/#Appendix-B:-Nonlinear-Static-Analysis-Parameters","page":"Legacy User Guide","title":"Appendix B: Nonlinear Static Analysis Parameters","text":"","category":"section"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"The nonlinear parameter file has the following format for adaptive load stepping in nonlinear iteration:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"NR :iteration type, NR = Newton Raphson, DI = Direct Iteration","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"1.0e-6 :tolerance for nonlinear iteration convergence","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"5 :maximum number of iterations per load step","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0 :integer denoting load steps (0 for adaptive), otherwise, number of load steps followed by values","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"20 :maximum number of load steps","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0.3 :minimum load step","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"0.1 :minimum delta load step","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"If desired, the user may specify a prescribed loadstepping profile for nonlinear iteration with the following file format:","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"NR :iteration type, NR = Newton Raphson, DI = Direct Iteration","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"1.0e-6 :tolerance for nonlinear iteration convergence","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"20 :maximum number of iterations per load step","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"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.","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"By default, the nonlinear iteration parameters are those listed in Table","category":"page"},{"location":"legacyUserGuide/","page":"Legacy User Guide","title":"Legacy User Guide","text":"\nParameter Value –––––––––––––––––- –––––––––––––––––- Nonlinear Iteration Tolerance 1.0e-6\nIteration Type Newton Raphson\nLoads Stepping Algorithm Adaptive\nMax Iterations Per Load Step 50\nMax Number of Load Steps 20\nMinimum Load Step 0.05\nMinimum Load Step Delta 0.05","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"EditURL = \"../literate/C_customizablePreprocessing.jl\"","category":"page"},{"location":"examples/C_customizablePreprocessing/#simple3","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"","category":"section"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"In this example, we show the third level of what is going on behind the precompiled binary This includes all of the second, but also breaks out the setupOWENS function. This would be a good starting point if you need to make modifications to use a unique mesh generation function, change how sectional properties are input, or adapt for a unique design an properly map the sectional properties to each element and apply unique boundary conditions, etc.","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"tip: Tip\nThis example is also available as a Jupyter notebook todo: get link working:","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"This example is the same as example B except that the setupOWENS function is broken out and each step defined","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"import OWENS\nimport OWENSFEA\nimport OWENSAero\nimport QuadGK\nimport FLOWMath\nimport PyPlot","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"PyPlot.pygui(true)","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"import OWENSOpenFASTWrappers\n\n\npath = runpath = \"/home/runner/work/OWENS.jl/OWENS.jl/docs/src/literate\" #splitdir(@__FILE__)[1]\n\nInp = OWENS.MasterInput(\"$runpath/sampleOWENS.yml\")\n\nnothing","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"Unpack inputs, or you could directly input them here and bypass the file","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"verbosity = 1\n\nanalysisType = Inp.analysisType\nturbineType = Inp.turbineType\neta = Inp.eta\nNbld = Inp.Nbld\ntowerHeight = Inp.towerHeight\nrho = Inp.rho\nVinf = Inp.Vinf\ncontrolStrategy = Inp.controlStrategy\nRPM = Inp.RPM\nNslices = Inp.Nslices\nntheta = Inp.ntheta\nstructuralModel = Inp.structuralModel\nntelem = Inp.ntelem\nnbelem = Inp.nbelem\nncelem = Inp.ncelem\nnselem = Inp.nselem\nifw = Inp.ifw\nWindType = Inp.WindType\nAModel = Inp.AModel\nwindINPfilename = \"$(path)$(Inp.windINPfilename)\"\nifw_libfile = Inp.ifw_libfile\nif ifw_libfile == \"nothing\"\n ifw_libfile = nothing\nend\nBlade_Height = Inp.Blade_Height\nBlade_Radius = Inp.Blade_Radius\nnumTS = Inp.numTS\ndelta_t = Inp.delta_t\nNuMad_geom_xlscsv_file_twr = \"$(path)$(Inp.NuMad_geom_xlscsv_file_twr)\"\nNuMad_mat_xlscsv_file_twr = \"$(path)$(Inp.NuMad_mat_xlscsv_file_twr)\"\nNuMad_geom_xlscsv_file_bld = \"$(path)$(Inp.NuMad_geom_xlscsv_file_bld)\"\nNuMad_mat_xlscsv_file_bld = \"$(path)$(Inp.NuMad_mat_xlscsv_file_bld)\"\nNuMad_geom_xlscsv_file_strut = \"$(path)$(Inp.NuMad_geom_xlscsv_file_strut)\"\nNuMad_mat_xlscsv_file_strut = \"$(path)$(Inp.NuMad_mat_xlscsv_file_strut)\"\nadi_lib = Inp.adi_lib\nif adi_lib == \"nothing\"\n adi_lib = nothing\nend\nadi_rootname = \"$(path)$(Inp.adi_rootname)\"\n\nprintln(\"Set up Turbine\")\n\nAD15On = true\nB = Nbld\nR = Blade_Radius#177.2022*0.3048 #m\nH = Blade_Height#1.02*R*2 #m\n\nshapeZ = collect(LinRange(0,H,Nslices+1))\nshapeX = R.*(1.0.-4.0.*(shapeZ/H.-.5).^2)\n\n\nstack_layers_bld = nothing\nstack_layers_scale = [1.0,1.0]\nchord_scale = [1.0,1.0]\nthickness_scale = [1.0,1.0]\nHt=towerHeight\nstrut_mountpointbot = 0.11\nstrut_mountpointtop = 0.11\njoint_type = 0\nc_mount_ratio = 0.05\nangularOffset = -pi/2\nif AModel==\"AD\" #TODO: unify flag\n AD15On=true #AD for AeroDyn, DMS for double multiple streamtube, AC for actuator cylinder\nelse\n AD15On=false\nend\nDSModel=\"BV\"\nRPI=true\ncables_connected_to_blade_base = true\nmeshtype = \"Darrieus\"\n\nnothing","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"Here is where we take the inputs from setupOWENS and break out what is going on behind the function. We do some intermediate calculations on the blade shape and angles","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"Nstrutperbld = 2 #TODO: generalize and propogate\n\nNbld = B\nH = maximum(shapeZ) #m,\nR = maximum(shapeX) #m,\nomega = RPM / 60 * 2 * pi\ntsr = omega*R/Vinf\n\nnothing","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"Here we set up the mesh using one of the pre-made meshing functions. For this case, there is a function for the ARCUS, as well as for towered VAWTs where you can have an arbitrary blade shape with connected struts, and if the blade tips touch the tower, then you can tell it to constrain them to the tower thus allowing for both H-VAWT and Darrieus designs.","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"#########################################\n### Set up mesh\n#########################################\nif meshtype == \"ARCUS\" #TODO, for all of these propogate the AeroDyn additional output requirements\n mymesh,myort,myjoint = OWENS.create_arcus_mesh(;Ht,\n Hb = H, #blade height\n R, # m bade radius\n nblade = Nbld,\n ntelem, #tower elements\n nbelem, #blade elements\n ncelem,\n c_mount_ratio,\n bshapex = shapeX, #Blade shape, magnitude is irrelevant, scaled based on height and radius above\n bshapez = shapeZ,\n joint_type, #hinged about y axis\n cables_connected_to_blade_base,\n angularOffset) #Blade shape, magnitude is irrelevant, scaled based on height and radius above\nelseif meshtype == \"Darrieus\" || meshtype == \"H-VAWT\"\n\n if meshtype == \"Darrieus\"\n connectBldTips2Twr = true\n else\n connectBldTips2Twr = false\n end\n\n mymesh, myort, myjoint, AD15bldNdIdxRng, AD15bldElIdxRng = OWENS.create_mesh_struts(;Ht,\n Hb = H, #blade height\n R, # m bade radius\n AD15hubR=2.0,\n nblade = Nbld,\n ntelem, #tower elements\n nbelem, #blade elements\n nselem,\n strut_twr_mountpointbot = strut_mountpointbot, # This puts struts at top and bottom\n strut_twr_mountpointtop = strut_mountpointtop, # This puts struts at top and bottom\n strut_bld_mountpointbot = strut_mountpointbot, # This puts struts at top and bottom\n strut_bld_mountpointtop = strut_mountpointtop, # This puts struts at top and bottom\n bshapex = shapeX, #Blade shape, magnitude is irrelevant, scaled based on height and radius above\n bshapez = shapeZ,\n bshapey = zeros(nbelem+1), # but magnitude for this is relevant\n angularOffset, #Blade shape, magnitude is irrelevant, scaled based on height and radius above\n AD15_ccw = true,\n verbosity=0, # 0 nothing, 1 basic, 2 lots: amount of printed information\n connectBldTips2Twr)\nelse #TODO unify with HAWT\n error(\"please choose a valid mesh type (Darrieus, H-VAWT, ARCUS)\")\nend\n\nnTwrElem = Int(mymesh.meshSeg[1])\nif contains(NuMad_mat_xlscsv_file_bld,\"34m\") #TODO: this is really odd,\n nTwrElem = Int(mymesh.meshSeg[1])+1\nend\n\nnothing","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"Here is a way that you can visualize the nodal numbers of the mesh","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"PyPlot.figure()\nPyPlot.plot(mymesh.x,mymesh.z,\"b-\")\n for myi = 1:length(mymesh.x)\n PyPlot.text(mymesh.x[myi].+rand()/30,mymesh.z[myi].+rand()/30,\"$myi\",ha=\"center\",va=\"center\")\n PyPlot.draw()\n #sleep(0.1)\n end\nPyPlot.xlabel(\"x\")\nPyPlot.ylabel(\"y\")","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"This is where the sectional properties for the tower are either read in from the file, or are directly input and could be manuplated here in the script","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"#########################################\n### Set up Sectional Properties\n#########################################\n\nif !isnothing(NuMad_geom_xlscsv_file_twr)\n numadIn_twr = OWENS.readNuMadGeomCSV(NuMad_geom_xlscsv_file_twr)\nelse\n n_web = 0\n n_stack = 2\n n_segments = 2\n span = [0.0, 6.607421057, 13.21484211, 19.82226317, 26.42968423, 33.03710529, 39.64452634, 46.2519474, 52.85936846, 59.46678951, 66.07421057, 72.68163163, 79.28905268, 85.89647374, 92.5038948, 99.11131586, 105.7187369, 112.326158, 118.933579, 125.5410001, 132.1484211]\n airfoil = [\"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\", \"circular\"]\n te_type = [\"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\", \"round\"]\n twist_d = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n chord = [10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 0.25, 0.25, 0.25]\n xoffset = [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]\n aerocenter = [0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25]\n stack_mat_types = [8, 2]\n stack_layers = [70 3; 70 3; 70 3; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03; 30.303 3.03]\n segments = [-1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0; -1.0 0.0 1.0]\n DPtypes = [\"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"; \"\" \"\" \"\"]\n skin_seq = [Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2]); Seq([2, 1, 2]) Seq([2, 1, 2])]\n web_seq = Array{Seq, 2}(undef, length(twist_d),0) #can be any number of stack nums, so we have to make non-square containers\n web_dp = Array{Seq, 2}(undef, length(twist_d),0) #this is fixed size square, but it's easier to do it this way\n\n numadIn_twr = NuMad(n_web,n_stack,n_segments,span,airfoil,te_type,twist_d,chord,xoffset,aerocenter,stack_mat_types,stack_layers,segments,DPtypes,skin_seq,web_seq,web_dp)\nend\n\n#Add the full path\nfor (i,airfoil) in enumerate(numadIn_twr.airfoil)\n numadIn_twr.airfoil[i] = \"$path/airfoils/$airfoil\"\nend\n\nnothing","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"Here is where the material properties for the tower are either read in from the file, or directly input","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"if !isnothing(NuMad_mat_xlscsv_file_twr)\n plyprops_twr = OWENS.readNuMadMaterialsCSV(NuMad_mat_xlscsv_file_twr)\nelse\n names = [\"CLA_5500\", \"CBX_2400\", \"ETLX_2400\", \"Airex_C70_55\", \"EBX_2400_x10\", \"ETLX_2400_x10\", \"Airex_C70_55_x10\", \"CFP-baseline\"]\n plies = [Composites.Material{Float64}(9.824e10, 5.102e9, 4.274e9, 0.3, 1540.0, 8.75634139e8, 5.92949102e8, 1.0e8, 1.0e8, 1.0e8, 0.00066), Composites.Material{Float64}(1.4931e10, 1.4931e10, 2.389e10, 0.3, 1530.0, 4.55053962e8, 4.55053962e8, 1.0e8, 1.0e8, 1.0e8, 0.0008100000000000001), Composites.Material{Float64}(2.0333e10, 9.305e9, 4.756e9, 0.3, 1900.0, 5.30896289e8, 5.30896289e8, 1.0e8, 1.0e8, 1.0e8, 0.00066), Composites.Material{Float64}(4.5e7, 4.5e7, 2.2e7, 0.2, 59.0, 1.0e8, 1.0e8, 1.0e8, 1.0e8, 1.0e8, 0.001), Composites.Material{Float64}(9.824e11, 5.102e10, 4.274e10, 0.3, 15300.0, 4.55053962e9, 4.55053962e9, 1.0e8, 1.0e8, 1.0e8, 7.000000000000001e-5), Composites.Material{Float64}(1.4931e11, 1.4931e11, 2.389e11, 0.3, 19000.0, 5.30896289e9, 5.30896289e9, 1.0e8, 1.0e8, 1.0e8, 8.0e-5), Composites.Material{Float64}(2.03335e11, 9.3051e10, 4.756e10, 0.2, 590.0, 1.0e9, 1.0e9, 1.0e8, 1.0e8, 1.0e8, 7.000000000000001e-5), Composites.Material{Float64}(1.576e11, 9.1e9, 3.3e9, 0.263, 1600.0, 2.236e9, 1.528e9, 1.0e8, 1.0e8, 1.0e8, 0.00066)]\n plyprops_twr = OWENS.plyproperties(names,plies)\nend","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"Then this is where precomp.jl is called to get first the precomp outputs, then formatting those into the OWENS format, and then in the GXBeam.jl format for if GXBeam is used as the structural solver.","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"twr_precompoutput,twr_precompinput,lam_U_twr,lam_L_twr,lam_W_twr = OWENS.getOWENSPreCompOutput(numadIn_twr;plyprops = plyprops_twr)\nsectionPropsArray_twr = OWENS.getSectPropsFromOWENSPreComp(LinRange(0,1,nTwrElem),numadIn_twr,twr_precompoutput;precompinputs=twr_precompinput)\nstiff_twr, mass_twr = OWENS.getSectPropsFromOWENSPreComp(LinRange(0,1,nTwrElem),numadIn_twr,twr_precompoutput;GX=true)\n\nnothing","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"For the blades, we repeat what was done for the tower, but also include some simple design options for scaling thicknesses,","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"if !isnothing(NuMad_geom_xlscsv_file_bld)\n numadIn_bld = OWENS.readNuMadGeomCSV(NuMad_geom_xlscsv_file_bld)\nelse\n n_web = 1\n n_stack = 7\n n_segments = 12\n span = [0.0, 6.607, 13.215, 19.822, 26.43, 33.037, 39.645, 46.252, 52.859, 59.467, 66.074, 72.682, 79.289, 85.896, 92.504, 99.111, 105.719, 112.326, 118.934, 125.541, 132.148]\n airfoil = [\"circular\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\"]\n te_type = [\"round\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\"]\n twist_d = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n chord = [10.0, 10.0, 9.0, 8.0, 8.0, 7.0, 7.0, 6.0, 6.0, 6.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0]\n xoffset = [0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3]\n aerocenter = [0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2]\n stack_mat_types = [8, 2, 4, 8, 8, 8, 4]\n if isnothing(stack_layers_bld)\n stack_layers = [30.0 2.0 15.0 25.0 25.0 2.0 13.0; 15.0 2.0 10.0 13.0 11.0 2.0 11.0; 10.0 1.0 8.0 10.0 10.0 2.0 10.0; 8.0 1.0 6.0 9.0 10.0 1.0 9.0; 7.0 1.0 5.0 8.0 9.0 1.0 7.0; 6.0 1.0 4.0 8.0 9.0 1.0 6.0; 6.0 1.0 4.0 8.0 8.0 1.0 5.0; 6.0 1.0 4.0 7.0 7.0 1.0 5.0; 7.0 1.0 3.0 6.0 6.0 1.0 5.0; 8.0 1.0 3.0 6.0 6.0 1.0 5.0; 8.0 1.0 3.0 6.0 6.0 1.0 5.0; 7.0 1.0 3.0 6.0 6.0 1.0 5.0; 7.0 1.0 3.0 6.0 6.0 2.0 5.0; 7.0 1.0 3.0 6.0 6.0 2.0 5.0; 7.0 1.0 3.0 7.0 8.0 3.0 5.0; 7.0 2.0 3.0 9.0 12.0 3.0 6.0; 10.0 3.0 4.0 11.0 15.0 3.0 6.0; 12.0 3.0 4.0 13.0 15.0 3.0 6.0; 12.0 3.0 4.0 15.0 15.0 3.0 6.0; 12.0 3.0 4.0 15.0 15.0 3.0 6.0; 10.0 1.0 4.0 10.0 12.0 1.0 5.0]\n else\n stack_layers = stack_layers_bld\n end\n segments = [-1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0]\n DPtypes = [\"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"]\n skin_seq = [Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2])]\n web_seq = [Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]);;]\n web_dp = [Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]);;]\n\n numadIn_bld = NuMad(n_web,n_stack,n_segments,span,airfoil,te_type,twist_d,chord,xoffset,aerocenter,stack_mat_types,stack_layers,segments,DPtypes,skin_seq,web_seq,web_dp)\nend\nfor icol = 1:length(numadIn_bld.stack_layers[1,:])\n numadIn_bld.stack_layers[:,icol] .*= LinRange(stack_layers_scale[1],stack_layers_scale[2],length(numadIn_bld.chord))\nend\nnumadIn_bld.chord .*= LinRange(chord_scale[1],chord_scale[2],length(numadIn_bld.chord))\n\nfor (i,airfoil) in enumerate(numadIn_bld.airfoil)\n numadIn_bld.airfoil[i] = \"$path/airfoils/$airfoil\"\nend\n\nif !isnothing(NuMad_mat_xlscsv_file_bld)\n plyprops_bld = OWENS.readNuMadMaterialsCSV(NuMad_mat_xlscsv_file_bld)\nelse\n names = [\"CLA_5500\", \"CBX_2400\", \"ETLX_2400\", \"Airex_C70_55\", \"EBX_2400_x10\", \"ETLX_2400_x10\", \"Airex_C70_55_x10\", \"CFP-baseline\"]\n plies = [Composites.Material{Float64}(9.824e10, 5.102e9, 4.274e9, 0.3, 1540.0, 8.75634139e8, 5.92949102e8, 1.0e8, 1.0e8, 1.0e8, 0.00066), Composites.Material{Float64}(1.4931e10, 1.4931e10, 2.389e10, 0.3, 1530.0, 4.55053962e8, 4.55053962e8, 1.0e8, 1.0e8, 1.0e8, 0.0008100000000000001), Composites.Material{Float64}(2.0333e10, 9.305e9, 4.756e9, 0.3, 1900.0, 5.30896289e8, 5.30896289e8, 1.0e8, 1.0e8, 1.0e8, 0.00066), Composites.Material{Float64}(4.5e7, 4.5e7, 2.2e7, 0.2, 59.0, 1.0e8, 1.0e8, 1.0e8, 1.0e8, 1.0e8, 0.001), Composites.Material{Float64}(9.824e11, 5.102e10, 4.274e10, 0.3, 15300.0, 4.55053962e9, 4.55053962e9, 1.0e8, 1.0e8, 1.0e8, 7.000000000000001e-5), Composites.Material{Float64}(1.4931e11, 1.4931e11, 2.389e11, 0.3, 19000.0, 5.30896289e9, 5.30896289e9, 1.0e8, 1.0e8, 1.0e8, 8.0e-5), Composites.Material{Float64}(2.03335e11, 9.3051e10, 4.756e10, 0.2, 590.0, 1.0e8, 1.0e8, 1.0e8, 1.0e8, 1.0e8, 7.000000000000001e-5), Composites.Material{Float64}(1.576e11, 9.1e9, 3.3e9, 0.263, 1600.0, 2.236e9, 1.528e9, 1.0e8, 1.0e8, 1.0e8, 0.00066)]\n plyprops_bld = OWENS.plyproperties(names,plies)\nend\n\nbld1start = Int(mymesh.structuralNodeNumbers[1,1]) #Get blade spanwise position\nbld1end = Int(mymesh.structuralNodeNumbers[1,end])\nspanpos = [0.0;cumsum(sqrt.(diff(mymesh.x[bld1start:bld1end]).^2 .+ diff(mymesh.z[bld1start:bld1end]).^2))]\n\nif length(thickness_scale)==2\n yscale = collect(LinRange(thickness_scale[1],thickness_scale[2],length(numadIn_bld.span)))\nelseif length(thickness_scale)==length(numadIn_bld.span)\n yscale = thickness_scale\nend\n\nbld_precompoutput,bld_precompinput,lam_U_bld,lam_L_bld,lam_W_bld = OWENS.getOWENSPreCompOutput(numadIn_bld;yscale,plyprops = plyprops_bld)\nsectionPropsArray_bld = OWENS.getSectPropsFromOWENSPreComp(spanpos,numadIn_bld,bld_precompoutput;precompinputs=bld_precompinput)\nstiff_bld, mass_bld = OWENS.getSectPropsFromOWENSPreComp(spanpos,numadIn_bld,bld_precompoutput;GX=true)\n\nnothing","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"Similarly for the struts, we do what was done for the blades","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"if !isnothing(NuMad_geom_xlscsv_file_strut)\n numadIn_strut = OWENS.readNuMadGeomCSV(NuMad_geom_xlscsv_file_strut)\nelse\n n_web = 1\n n_stack = 7\n n_segments = 12\n span = [0.0, 6.607, 13.215, 19.822, 26.43, 33.037, 39.645, 46.252, 52.859, 59.467, 66.074, 72.682, 79.289, 85.896, 92.504, 99.111, 105.719, 112.326, 118.934, 125.541, 132.148]\n airfoil = [\"circular\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\", \"NACA_0021\"]\n te_type = [\"round\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\", \"sharp\"]\n twist_d = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n chord = [10.0, 10.0, 9.0, 8.0, 8.0, 7.0, 7.0, 6.0, 6.0, 6.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0]\n xoffset = [0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3]\n aerocenter = [0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2]\n stack_mat_types = [8, 2, 4, 8, 8, 8, 4]\n if isnothing(stack_layers_strut)\n stack_layers = [30.0 2.0 15.0 25.0 25.0 2.0 13.0; 15.0 2.0 10.0 13.0 11.0 2.0 11.0; 10.0 1.0 8.0 10.0 10.0 2.0 10.0; 8.0 1.0 6.0 9.0 10.0 1.0 9.0; 7.0 1.0 5.0 8.0 9.0 1.0 7.0; 6.0 1.0 4.0 8.0 9.0 1.0 6.0; 6.0 1.0 4.0 8.0 8.0 1.0 5.0; 6.0 1.0 4.0 7.0 7.0 1.0 5.0; 7.0 1.0 3.0 6.0 6.0 1.0 5.0; 8.0 1.0 3.0 6.0 6.0 1.0 5.0; 8.0 1.0 3.0 6.0 6.0 1.0 5.0; 7.0 1.0 3.0 6.0 6.0 1.0 5.0; 7.0 1.0 3.0 6.0 6.0 2.0 5.0; 7.0 1.0 3.0 6.0 6.0 2.0 5.0; 7.0 1.0 3.0 7.0 8.0 3.0 5.0; 7.0 2.0 3.0 9.0 12.0 3.0 6.0; 10.0 3.0 4.0 11.0 15.0 3.0 6.0; 12.0 3.0 4.0 13.0 15.0 3.0 6.0; 12.0 3.0 4.0 15.0 15.0 3.0 6.0; 12.0 3.0 4.0 15.0 15.0 3.0 6.0; 10.0 1.0 4.0 10.0 12.0 1.0 5.0]\n else\n stack_layers = stack_layers_strut\n end\n segments = [-1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0; -1.0 -0.95 -0.5 -0.3 -0.1 -0.095 0.0 0.095 0.1 0.3 0.5 0.95 1.0]\n DPtypes = [\"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"; \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"]\n skin_seq = [Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2]); Seq([2, 5, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 1, 2]) Seq([2, 1, 2]) Seq([2, 3, 2]) Seq([2, 4, 2]) Seq([2, 4, 2]) Seq([2, 3, 2]) Seq([2, 5, 2])]\n web_seq = [Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]); Seq([6, 7, 6]);;]\n web_dp = [Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]); Seq([9, 3, 3, 9]);;]\n\n numadIn_strut = NuMad(n_web,n_stack,n_segments,span,airfoil,te_type,twist_d,chord,xoffset,aerocenter,stack_mat_types,stack_layers,segments,DPtypes,skin_seq,web_seq,web_dp)\nend\nfor icol = 1:length(numadIn_strut.stack_layers[1,:])\n numadIn_strut.stack_layers[:,icol] .*= LinRange(stack_layers_scale[1],stack_layers_scale[2],length(numadIn_strut.chord))\nend\nnumadIn_strut.chord .*= LinRange(chord_scale[1],chord_scale[2],length(numadIn_strut.chord))\n\nfor (i,airfoil) in enumerate(numadIn_strut.airfoil)\n numadIn_strut.airfoil[i] = \"$path/airfoils/$airfoil\"\nend\n\nif !isnothing(NuMad_mat_xlscsv_file_strut)\n plyprops_strut = OWENS.readNuMadMaterialsCSV(NuMad_mat_xlscsv_file_strut)\nelse\n names = [\"CLA_5500\", \"CBX_2400\", \"ETLX_2400\", \"Airex_C70_55\", \"EBX_2400_x10\", \"ETLX_2400_x10\", \"Airex_C70_55_x10\", \"CFP-baseline\"]\n plies = [Composites.Material{Float64}(9.824e10, 5.102e9, 4.274e9, 0.3, 1540.0, 8.75634139e8, 5.92949102e8, 1.0e8, 1.0e8, 1.0e8, 0.00066), Composites.Material{Float64}(1.4931e10, 1.4931e10, 2.389e10, 0.3, 1530.0, 4.55053962e8, 4.55053962e8, 1.0e8, 1.0e8, 1.0e8, 0.0008100000000000001), Composites.Material{Float64}(2.0333e10, 9.305e9, 4.756e9, 0.3, 1900.0, 5.30896289e8, 5.30896289e8, 1.0e8, 1.0e8, 1.0e8, 0.00066), Composites.Material{Float64}(4.5e7, 4.5e7, 2.2e7, 0.2, 59.0, 1.0e8, 1.0e8, 1.0e8, 1.0e8, 1.0e8, 0.001), Composites.Material{Float64}(9.824e11, 5.102e10, 4.274e10, 0.3, 15300.0, 4.55053962e9, 4.55053962e9, 1.0e8, 1.0e8, 1.0e8, 7.000000000000001e-5), Composites.Material{Float64}(1.4931e11, 1.4931e11, 2.389e11, 0.3, 19000.0, 5.30896289e9, 5.30896289e9, 1.0e8, 1.0e8, 1.0e8, 8.0e-5), Composites.Material{Float64}(2.03335e11, 9.3051e10, 4.756e10, 0.2, 590.0, 1.0e8, 1.0e8, 1.0e8, 1.0e8, 1.0e8, 7.000000000000001e-5), Composites.Material{Float64}(1.576e11, 9.1e9, 3.3e9, 0.263, 1600.0, 2.236e9, 1.528e9, 1.0e8, 1.0e8, 1.0e8, 0.00066)]\n plyprops_strut = OWENS.plyproperties(names,plies)\nend\n\n#TODO: not straight struts\nspanpos = LinRange(0,1,nselem+1)#[0.0;cumsum(sqrt.(diff(mymesh.x[strut1start:strut1end]).^2 .+ diff(mymesh.z[strut1start:strut1end]).^2))]\n\nif length(thickness_scale)==2\n yscale = collect(LinRange(thickness_scale[1],thickness_scale[2],length(numadIn_strut.span)))\nelseif length(thickness_scale)==length(numadIn_strut.span)\n yscale = thickness_scale\nend\n\nstrut_precompoutput,strut_precompinput,lam_U_strut,lam_L_strut,lam_W_strut = OWENS.getOWENSPreCompOutput(numadIn_strut;yscale,plyprops = plyprops_strut)\nsectionPropsArray_strut = OWENS.getSectPropsFromOWENSPreComp(spanpos,numadIn_strut,strut_precompoutput;precompinputs=strut_precompinput)\nstiff_strut, mass_strut = OWENS.getSectPropsFromOWENSPreComp(spanpos,numadIn_strut,strut_precompoutput;GX=true)\n\nnothing","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"Here we combine the section properties into an array matching the mesh elements","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"bldssecprops = collect(Iterators.flatten(fill(sectionPropsArray_bld, Nbld)))\nstrutssecprops = collect(Iterators.flatten(fill(sectionPropsArray_strut, Nstrutperbld*Nbld)))\n\nif meshtype == \"ARCUS\"\n cable_secprop = sectionPropsArray_twr[end]\n Nremain = sum(Int,mymesh.meshSeg[Nbld+1+1:end]) #strut elements remain\n sectionPropsArray = [fill(sectionPropsArray_twr[1],length(sectionPropsArray_twr));bldssecprops; fill(cable_secprop,Nremain)]#;sectionPropsArray_str;sectionPropsArray_str;sectionPropsArray_str;sectionPropsArray_str]\n\n stiff_blds = collect(Iterators.flatten(fill(stiff_bld, Nbld))) # GXBeam sectional properties\n stiff_cables = fill(stiff_twr[end],Nremain)\n stiff_array = [stiff_twr; stiff_blds; stiff_cables]\n\n mass_blds = collect(Iterators.flatten(fill(mass_bld, Nbld)))\n mass_cables = fill(mass_twr[end],Nremain)\n mass_array = [mass_twr; mass_blds; mass_cables]\nelse\n sectionPropsArray = [sectionPropsArray_twr; bldssecprops; strutssecprops]#;sectionPropsArray_str;sectionPropsArray_str;sectionPropsArray_str;sectionPropsArray_str]\n\n stiff_blds = collect(Iterators.flatten(fill(stiff_bld, Nbld))) # GXBeam sectional properties\n stiff_struts = collect(Iterators.flatten(fill(stiff_strut, Nstrutperbld*Nbld)))\n stiff_array = [stiff_twr; stiff_blds; stiff_struts]\n\n mass_blds = collect(Iterators.flatten(fill(mass_bld, Nbld)))\n mass_struts = collect(Iterators.flatten(fill(mass_strut, Nstrutperbld*Nbld)))\n mass_array = [mass_twr; mass_blds; mass_struts]\nend\nrotationalEffects = ones(mymesh.numEl) #TODO: non rotating tower, or rotating blades\n\nmyel = OWENSFEA.El(sectionPropsArray,myort.Length,myort.Psi_d,myort.Theta_d,myort.Twist_d,rotationalEffects) #store data in element object\nsystem, assembly, sections = OWENS.owens_to_gx(mymesh,myort,myjoint,sectionPropsArray,stiff_array,mass_array)\n\nnothing","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"Set up the OWENSAero aerodynamics if used","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"if !AD15On\n #########################################\n ### Set up aero forces\n #########################################\n ### translate from blade span to blade height between the numad definition and the vertical slice positions\n ### First get the angles from the overall geometry npoints and go to the numad npoints\n delta_xs = shapeX[2:end] - shapeX[1:end-1]\n delta_zs = shapeZ[2:end] - shapeZ[1:end-1]\n delta3D = atan.(delta_xs./delta_zs)\n delta3D_spl = FLOWMath.akima(shapeZ[1:end-1]./maximum(shapeZ[1:end-1]), delta3D,LinRange(0,1,length(numadIn_bld.span)-1))\n\n bld_height_numad = cumsum(diff(numadIn_bld.span).*(1.0.-abs.(sin.(delta3D_spl)))) # now convert the numad span to a height\n\n chord = FLOWMath.akima(bld_height_numad./maximum(bld_height_numad), numadIn_bld.chord,LinRange(0,1,Nslices)) # now we can use it to access the numad data\n airfoils = fill(\"nothing\",Nslices)\n\n for (iheight_numad,height_numad) in enumerate(bld_height_numad./maximum(bld_height_numad)) # Discretely assign the airfoils\n for (iheight,height_slices) in enumerate(collect(LinRange(0,1,Nslices)))\n if airfoils[iheight]==\"nothing\" && height_slices<=height_numad\n airfoils[iheight] = \"$(numadIn_bld.airfoil[iheight_numad]).dat\"\n end\n end\n end\n\n OWENSAero.setupTurb(shapeX,shapeZ,B,chord,tsr,Vinf;AModel,DSModel,\n afname = airfoils, #TODO: map to the numad input\n rho,\n eta,\n ifw, #TODO: propogate WindType\n turbsim_filename = windINPfilename,\n ifw_libfile,\n tau = [1e-5,1e-5],\n ntheta,\n Nslices,\n RPI)\n\n aeroForcesACDMS(t,azi) = OWENS.mapACDMS(t,azi,mymesh,myel,OWENSAero.AdvanceTurbineInterpolate;alwaysrecalc=true)\n deformAeroACDMS = OWENSAero.deformTurb\nend\nnothing","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"Set up AeroDyn if used Here we create AeroDyn the files, first by specifying the names, then by creating the files Then by initializing AeroDyn and grabbing the backend functionality with a function handle","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"if AD15On\n ad_input_file=\"$path/ADInputFile_SingleTurbine2.dat\"\n ifw_input_file=\"$path/IW2.dat\"\n blade_filename=\"$path/blade2.dat\"\n lower_strut_filename=\"$path/lower_arm2.dat\"\n upper_strut_filename=\"$path/upper_arm2.dat\"\n OLAF_filename = \"$path/OLAF2.dat\"\n\n NumADBldNds = NumADStrutNds = 10\n\n bldchord_spl = FLOWMath.akima(numadIn_bld.span./maximum(numadIn_bld.span), numadIn_bld.chord,LinRange(0,1,NumADBldNds))\n\n airfoil_filenames = fill(\"nothing\",NumADBldNds) # Discretely assign the airfoils #TODO: separate out struts\n for (ispan_numad,span_numad) in enumerate(numadIn_bld.span./maximum(numadIn_bld.span))\n for (ispan,span_slices) in enumerate(collect(LinRange(0,1,NumADBldNds)))\n if airfoil_filenames[ispan]==\"nothing\" && span_slices<=span_numad\n airfoil_filenames[ispan] = \"$(numadIn_bld.airfoil[ispan_numad]).dat\"\n end\n end\n end\n\n if meshtype == \"ARCUS\"\n blade_filenames = [blade_filename for i=1:Nbld]\n blade_chords = [bldchord_spl for i=1:Nbld]\n blade_Nnodes = [NumADBldNds for i=1:Nbld]\n else\n blade_filenames = [[blade_filename for i=1:Nbld];[lower_strut_filename for i=1:Nbld];[upper_strut_filename for i=1:Nbld]]\n strutchord_spl = FLOWMath.akima(numadIn_strut.span./maximum(numadIn_strut.span), numadIn_strut.chord,LinRange(0,1,NumADStrutNds))\n blade_chords = [[bldchord_spl for i=1:Nbld];[strutchord_spl for i=1:Nbld];[strutchord_spl for i=1:Nbld]]\n blade_Nnodes = [[NumADBldNds for i=1:Nbld];[NumADStrutNds for i=1:Nbld];[NumADStrutNds for i=1:Nbld]]\n end\n\n OWENSOpenFASTWrappers.writeADinputFile(ad_input_file,blade_filenames,airfoil_filenames,OLAF_filename)\n\n NumADBody = length(AD15bldNdIdxRng[:,1])\n bld_len = zeros(NumADBody)\n for (iADBody,filename) in enumerate(blade_filenames)\n strt_idx = AD15bldNdIdxRng[iADBody,1]\n end_idx = AD15bldNdIdxRng[iADBody,2]\n if end_idx0\n\n println(\"\\nBlades' Mass Breakout\")\n for (i,name) in enumerate(plyprops_bld.names)\n println(\"$name $(mass_breakout_blds[i]) kg, $(plyprops_bld.costs[i]) \\$/kg: \\$$(mass_breakout_blds[i]*plyprops_bld.costs[i])\")\n end\n\n println(\"\\nTower Mass Breakout\")\n for (i,name) in enumerate(plyprops_twr.names)\n println(\"$name $(mass_breakout_twr[i]) kg, $(plyprops_twr.costs[i]) \\$/kg: \\$$(mass_breakout_twr[i]*plyprops_twr.costs[i])\")\n end\n\n println(\"Total Material Cost Blades: \\$$(sum(mass_breakout_blds.*plyprops_bld.costs))\")\n println(\"Total Material Cost Tower: \\$$(sum(mass_breakout_twr.*plyprops_twr.costs))\")\n println(\"Total Material Cost: \\$$(sum(mass_breakout_blds.*plyprops_bld.costs)+ sum(mass_breakout_twr.*plyprops_twr.costs))\")\n\nend\n\npBC = [1 1 0\n1 2 0\n1 3 0\n1 4 0\n1 5 0\n1 6 0]\n\ninputs = OWENS.Inputs(;analysisType = structuralModel,\ntocp = [0.0,100000.1],\nOmegaocp = [RPM,RPM] ./ 60,\ntocp_Vinf = [0.0,100000.1],\nVinfocp = [Vinf,Vinf],\nnumTS,\ndelta_t,\nAD15On,\naeroLoadsOn = 2)\n\nfeamodel = OWENS.FEAModel(;analysisType = structuralModel,\noutFilename = \"none\",\njoint = myjoint,\nplatformTurbineConnectionNodeNumber = 1,\npBC,\nnlOn = true,\nnumNodes = mymesh.numNodes,\nRayleighAlpha = 0.05,\nRayleighBeta = 0.05,\niterationType = \"DI\")\n\nprintln(\"Running Unsteady\")\nif AD15On\n t, aziHist,OmegaHist,OmegaDotHist,gbHist,gbDotHist,gbDotDotHist,FReactionHist,\n FTwrBsHist,genTorque,genPower,torqueDriveShaft,uHist,uHist_prp,epsilon_x_hist,epsilon_y_hist,\n epsilon_z_hist,kappa_x_hist,kappa_y_hist,kappa_z_hist = OWENS.Unsteady_Land(inputs;system,assembly,\n topModel=feamodel,topMesh=mymesh,topEl=myel,aero=aeroForcesAD,deformAero=deformAeroAD)\nelse\n t, aziHist,OmegaHist,OmegaDotHist,gbHist,gbDotHist,gbDotDotHist,FReactionHist,\n FTwrBsHist,genTorque,genPower,torqueDriveShaft,uHist,uHist_prp,epsilon_x_hist,epsilon_y_hist,\n epsilon_z_hist,kappa_x_hist,kappa_y_hist,kappa_z_hist = OWENS.Unsteady_Land(inputs;system,assembly,\n topModel=feamodel,topMesh=mymesh,topEl=myel,aero=aeroForcesACDMS,deformAero=deformAeroACDMS)\nend\n\nif AD15On #TODO: move this into the run functions\n OWENSOpenFASTWrappers.endTurb()\nend\n\nprintln(\"Saving VTK time domain files\")\nOWENS.OWENSFEA_VTK(\"$path/vtk/SNLARCUS5MW_timedomain_TNBnltrue\",t,uHist,system,assembly,sections;scaling=1,azi=aziHist)\n\n\n##########################################\n#### Ultimate Failure #####\n##########################################\n\nmassOwens,stress_U,SF_ult_U,SF_buck_U,stress_L,SF_ult_L,SF_buck_L,stress_TU,SF_ult_TU,\nSF_buck_TU,stress_TL,SF_ult_TL,SF_buck_TL,topstrainout_blade_U,topstrainout_blade_L,\ntopstrainout_tower_U,topstrainout_tower_LtopDamage_blade_U,\ntopDamage_blade_L,topDamage_tower_U,topDamage_tower_L = OWENS.extractSF(bld_precompinput,\nbld_precompoutput,plyprops_bld,numadIn_bld,lam_U_bld,lam_L_bld,\ntwr_precompinput,twr_precompoutput,plyprops_twr,numadIn_twr,lam_U_twr,lam_L_twr,\nmymesh,myel,myort,Nbld,epsilon_x_hist,kappa_y_hist,kappa_z_hist,epsilon_z_hist,\nkappa_x_hist,epsilon_y_hist;verbosity, #Verbosity 0:no printing, 1: summary, 2: summary and spanwise worst safety factor # epsilon_x_hist_1,kappa_y_hist_1,kappa_z_hist_1,epsilon_z_hist_1,kappa_x_hist_1,epsilon_y_hist_1,\nLE_U_idx=1,TE_U_idx=6,SparCapU_idx=3,ForePanelU_idx=2,AftPanelU_idx=5,\nLE_L_idx=1,TE_L_idx=6,SparCapL_idx=3,ForePanelL_idx=2,AftPanelL_idx=5,\nTwr_LE_U_idx=1,Twr_LE_L_idx=1,\nAD15bldNdIdxRng,AD15bldElIdxRng,strut_precompoutput=nothing,strut_precompinput,plyprops_strut,numadIn_strut,lam_U_strut,lam_L_strut) #TODO: add in ability to have material safety factors and load safety factors\n\nnothing","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"This page was generated using Literate.jl.","category":"page"},{"location":"examples/A_simplyRunningOWENS/","page":"Simply Running OWENS","title":"Simply Running OWENS","text":"EditURL = \"../literate/A_simplyRunningOWENS.jl\"","category":"page"},{"location":"examples/A_simplyRunningOWENS/#simple1","page":"Simply Running OWENS","title":"Simply Running OWENS","text":"","category":"section"},{"location":"examples/A_simplyRunningOWENS/","page":"Simply Running OWENS","title":"Simply Running OWENS","text":"In this example, we show the first level of what is going on behind the precompiled binary Running julia directly with this as a starting point could make things like automating many runs in a way that is not compatible with the current interface, but your design design fits.","category":"page"},{"location":"examples/A_simplyRunningOWENS/","page":"Simply Running OWENS","title":"Simply Running OWENS","text":"OWENS is comprised of many building blocks. These series of examples progressively shows the internals of several of the key building blocks a new user might employ for their projects. Fundamentally, OWENS has been built to be as generalizable as possible. The lowest level of building blocks enable this, however, there are many common use cases for which helper functions have been developed, such as for meshing certain standard architectures and calculating and applying sectional properties to these architectures. The figure below summarizes this at a high level. TODO: yml file definition and inputs expanded","category":"page"},{"location":"examples/A_simplyRunningOWENS/","page":"Simply Running OWENS","title":"Simply Running OWENS","text":"(Image: )","category":"page"},{"location":"examples/A_simplyRunningOWENS/","page":"Simply Running OWENS","title":"Simply Running OWENS","text":"tip: Tip\nThis example is also available as a Jupyter notebook todo: get link working:","category":"page"},{"location":"examples/A_simplyRunningOWENS/","page":"Simply Running OWENS","title":"Simply Running OWENS","text":"import OWENS\n\nrunpath = \"/home/runner/work/OWENS.jl/OWENS.jl/docs/src/literate\" #splitdir(@__FILE__)[1]\n\nInp = OWENS.MasterInput(\"/home/runner/work/OWENS.jl/OWENS.jl/docs/src/literate/sampleOWENS.yml\")\n\nOWENS.runOWENS(Inp,runpath)","category":"page"},{"location":"examples/A_simplyRunningOWENS/","page":"Simply Running OWENS","title":"Simply Running OWENS","text":"","category":"page"},{"location":"examples/A_simplyRunningOWENS/","page":"Simply Running OWENS","title":"Simply Running OWENS","text":"This page was generated using Literate.jl.","category":"page"},{"location":"reference/reference/","page":"API Reference","title":"API Reference","text":"CurrentModule = OWENS","category":"page"},{"location":"reference/reference/#Index","page":"API Reference","title":"Index","text":"","category":"section"},{"location":"reference/reference/","page":"API Reference","title":"API Reference","text":"","category":"page"},{"location":"reference/reference/#Types-and-functions","page":"API Reference","title":"Types and functions","text":"","category":"section"},{"location":"reference/reference/","page":"API Reference","title":"API Reference","text":"Modules = [OWENS]","category":"page"},{"location":"reference/reference/#OWENS.Bin","page":"API Reference","title":"OWENS.Bin","text":"Inputs pointing to the file paths of compiled binaries of external libraries\n\n\n\n\n\n","category":"type"},{"location":"reference/reference/#OWENS.Blade","page":"API Reference","title":"OWENS.Blade","text":"Internal, struct containing the CACTUS geometry file data for a blade\n\n\n\n\n\n","category":"type"},{"location":"reference/reference/#OWENS.BladeData","page":"API Reference","title":"OWENS.BladeData","text":"Internal, struct containing blade specific data and location within the mesh\n\n\n\n\n\n","category":"type"},{"location":"reference/reference/#OWENS.CactusGeom","page":"API Reference","title":"OWENS.CactusGeom","text":"Internal, struct containing the CACTUS geometry file data\n\n\n\n\n\n","category":"type"},{"location":"reference/reference/#OWENS.DriveShaftProps","page":"API Reference","title":"OWENS.DriveShaftProps","text":"Internal, driveshaft stiffness k and damping c\n\n\n\n\n\n","category":"type"},{"location":"reference/reference/#OWENS.Inputs-Tuple{}","page":"API Reference","title":"OWENS.Inputs","text":"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, )\n\nModel inputs for OWENS coupled analysis, struct\n\nInputs\n\nanalysisType::string: Newmark Beta time stepping \"TNB\", Dean time stepping \"TD\", modal \"M\"\nturbineStartup::int: 1 forced start-up using generator as motor, 2 self-starting mode, 0 specified rotor speed mode\")\nusingRotorSpeedFunction::bool: use user specified rotor speed profile function\ntocp::Array{<:float}: = time points for rotor speed profile (s)\ntocp_Vinf::Array{<:float}: = time points for specified Vinf profile (s)\nnumTS::int: total number of timesteps to run\ndelta_t::float: timestep interval (s)\nOmegaocp::Array{<:float}: = rotor speed points for rotor speed profile (Hz)\nVinfocp::Array{<:float}: = rotor speed points for specified Vinf profile (Hz)\naeroLoadsOn::bool: #0 off, 1 one way, 1.5 one way with deformation from last timestep, 2 two way\nAD15On::bool: flag to use AD15 for aero\ndriveTrainOn::bool: flag to include drivetrain effects\ngeneratorOn::bool: flag to include generator effects\nhydroOn::bool: flag to include platform coupling\ninterpOrder::int: order used for extrapolating inputs and states, 0 flat, 1 linear, 2 quadratic\nhd_input_file::string: file path to the HydroDyn .dat input file\nmd_input_file::string: file path to the MoorDyn .dat input file\nJgearBox::float: gearbox intertia, standard SI units\ngearRatio::float: gearbox gear ratio\ngearBoxEfficiency::float: gearbox efficiency (typically 0-1)\nuseGeneratorFunction::bool: = flag to use user specified generator profile\ngeneratorProps::float: not used, should clean up\nratedTorque::float: Generator rated max torque\nzeroTorqueGenSpeed::float: rated generator speed (minus slippage)\npulloutRatio::float: Fraction of the min/max torque that the generator engages/disengages\nratedGenSlipPerc::float: extra speed from slipping?\nOmegaGenStart::float: speed (Hz) at which generator would kick in\nomegaControl::bool: false for fixed speed, true for dynamic\nOmegaInit::float: initial rotor speed (Hz)\naeroloadfile::string: string of the name and path for the cactus aeroloads if using the old serial owens call\nowensfile::string: string of the name and path for the owens input file if using the old serial owens call\npotflowfile::string: string of the prefix and path for the directory containing the potential flow files from WAMIT (required by HydroDyn)\noutFilename::string: path and name of output file, will be overwritten if already exists\nnumDofPerNode::int: number of degrees of freedom per node\nbladeData::BladeData: see ?BladeData, only used if calling the old serial owens function\ndriveShaftProps::DriveShaftProps: see ?DriveShaftProps\nTOl::float: gauss-seidel iteration tolerance\nMAXITER::int: gauss-seidel maximum iterations\niterwarnings::bool: iteration warnings flag\n\nOutputs:\n\nOWENS.Inputs:\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.Iteration_Parameters","page":"API Reference","title":"OWENS.Iteration_Parameters","text":"Internal, gauss-seidel iteration parameters \n\n\n\n\n\n","category":"type"},{"location":"reference/reference/#OWENS.NuMad","page":"API Reference","title":"OWENS.NuMad","text":"NuMad(nweb,nstack,nsegments,span,airfoil,tetype,twistd,chord,xoffset,aerocenter,stackmattypes,stacklayers,segments,DPtypes,skin,webstack,webdp)\n\nParameters defining the blade composite layup. See NuMad user guide SAND2012_7028 appendix B for more details\n\nArguments\n\nn_web::Int64: number of shear webs\nn_stack::Int64: number of predefined composite stacks\nn_segments::Int64: number of segments around the airfoil\nspan::Vector{Float64}: span-wise position\nairfoil::Vector{String}: airfoil name\nte_type::Vector{String}: trailing edge type\ntwist_d::Vector{Float64}: twist_d in degrees\nchord::Vector{Float64}: chord length\nxoffset::Vector{Float64}: The distance from the “nose” of a station to the blade reference axis.\naerocenter::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.\nstack_mat_types::Vector{Int64}: Material numbers used that correspond to each stack number\nstack_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)\nsegments::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\nDPtypes::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 positoin, second corresponds to section number\nskin_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\nweb_seq::Array{Seq,2}: same format and meaning as skin sequence, but for the webs with the second index corresponding to the web number\nweb_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.\n\n\n\n\n\n","category":"type"},{"location":"reference/reference/#OWENS.Strut","page":"API Reference","title":"OWENS.Strut","text":"Internal, struct containing the CACTUS geometry file data for a strut\n\n\n\n\n\n","category":"type"},{"location":"reference/reference/#OWENS.plyproperties-Tuple{}","page":"API Reference","title":"OWENS.plyproperties","text":"Struct containing\n\nmaterial names\n\nComposites.Material structs for each material name - see ?Composites.Material\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.Unsteady-Tuple{Any}","page":"API Reference","title":"OWENS.Unsteady","text":"Unsteady(model,topModel,mesh,el,aero;getLinearizedMatrices=false)\n\nExecutable function for transient analysis. Provides the interface of various external module with transient structural dynamics analysis capability.\n\n# Input\n* `inputs::Inputs`: see ?Inputs\n* `topModel::FEAModel`: see ?OWENSFEA.FEAModel\n* `mesh::Mesh`: see ?OWENSFEA.Mesh\n* `el::El`: see ?OWENSFEA.El\n* `bin::Bin`: see ?Bin\n* `aero::function`: Fexternal, Fdof = aero(t) where Fexternal is the force on each affected mesh dof and Fdof is the corresponding DOFs affected\n* `getLinearizedMatrices::Bool`: Flag to save the linearized matrices\n* `elStorage::ElStorage.ElStorage`: Optional object containing stored element matrices\n* `u_s::Array{<:float}`: Optional warm start of top deflections, of length Nnodes x Ndof\n\n\n# Output\n* `t`: time array\n* `aziHist`: azimuthal history array\n* `OmegaHist`: rotational speed array history\n* `OmegaDotHist`: rotational acceleration array history\n* `gbHist`: gearbox position history array\n* `gbDotHist`: gearbox velocity history array\n* `gbDotDotHist`: gearbox acceleration history array\n* `FReactionHist`: Nodal reaction 6dof forces history\n* `rigidDof`:\n* `genTorque`: generator torque history\n* `genPower`: generator power history\n* `torqueDriveShaft`: driveshaft torque history\n* `uHist`: mesh displacement history for each dof\n* `epsilon_x_hist`: strain history for eps_xx_0 for each dof\n* `epsilon_y_hist`: strain history for eps_xx_z for each dof\n* `epsilon_z_hist`: strain history for eps_xx_y for each dof\n* `kappa_x_hist`: strain history for gam_xz_0 for each dof\n* `kappa_y_hist`: strain history for gam_xz_y for each dof\n* `kappa_z_hist`: strain history for gam_xy_0 for each dof\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.Unsteady_Land-Tuple{Any}","page":"API Reference","title":"OWENS.Unsteady_Land","text":"Unsteady(model,topModel,mesh,el,aero;getLinearizedMatrices=false)\n\nExecutable function for transient analysis. Provides the interface of various external module with transient structural dynamics analysis capability.\n\n# Input\n* `inputs::Model`: see ?Model\n* `topModel::FEAModel`: see ?OWENSFEA.FEAModel\n* `mesh::Mesh`: see ?OWENSFEA.Mesh\n* `el::El`: see ?OWENSFEA.El\n* `bin::Bin`: see ?Bin\n* `aero::function`: Fexternal, Fdof = aero(t) where Fexternal is the force on each affected mesh dof and Fdof is the corresponding DOFs affected\n* `getLinearizedMatrices::Bool`: Flag to save the linearized matrices\n* `elStorage::ElStorage.ElStorage`: Optional object containing stored element matrices\n* `u_s::Array{<:float}`: Optional warm start of top deflections, of length Nnodes x Ndof\n\n\n# Output\n* `t`: time array\n* `aziHist`: azimuthal history array\n* `OmegaHist`: rotational speed array history\n* `OmegaDotHist`: rotational acceleration array history\n* `gbHist`: gearbox position history array\n* `gbDotHist`: gearbox velocity history array\n* `gbDotDotHist`: gearbox acceleration history array\n* `FReactionHist`: Nodal reaction 6dof forces history\n* `rigidDof`:\n* `genTorque`: generator torque history\n* `genPower`: generator power history\n* `torqueDriveShaft`: driveshaft torque history\n* `uHist`: mesh displacement history for each dof\n* `epsilon_x_hist`: strain history for eps_xx_0 for each dof\n* `epsilon_y_hist`: strain history for eps_xx_z for each dof\n* `epsilon_z_hist`: strain history for eps_xx_y for each dof\n* `kappa_x_hist`: strain history for gam_xz_0 for each dof\n* `kappa_y_hist`: strain history for gam_xz_y for each dof\n* `kappa_z_hist`: strain history for gam_xy_0 for each dof\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.calcHydroResidual-NTuple{5, Any}","page":"API Reference","title":"OWENS.calcHydroResidual","text":"calc_hydro_residual(new_accels, new_hydro_frcs, md_frc, u, FMultiplier)\n\nInternal, finds the residual of the platform accelerations/forces when adding in new values from HydroDyn, MoorDyn, and OWENSFEA.\n\nInput\n\nnew_accels::Vector{<:float}: the new platform accelerations in the inertial reference frame from OWENSFEA (m/s/s)\nnew_hydro_frcs::Vector{<:float}: the new platform hydro forces in the inertial reference frame from HydroDyn (N)\nmd_frc::Vector{<:float}: the mooring forces at the platform in the inertial reference frame from MoorDyn (N)\nu::Vector{<:float}: input vector containing platform loads and accelerations prior to the new additions\nFMultiplier::Number: scaling factor used to make the loads/accelerations in the same magnitude for the Jacobians\n\nOutput\n\nu_resid: vector containing residual between the input u and the new load/accelerations\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.calculateDriveShaftReactionTorque-NTuple{5, Any}","page":"API Reference","title":"OWENS.calculateDriveShaftReactionTorque","text":"calculateDriveShaftReactionTorque(driveShaftProps,thetaRotor,thetaGB,thetaDotRotor,thetaDotGB)\n\nInternal, calculates reaction torque of driveshaft\n\n#Input\n\ndriveShaftProps: object containing driveshaft properties\nthetaRotor: azimuth position of rotor/rotor shaft (rad)\nthetaGB: azimuth position of gearbox shaft (rad)\nthetaDotRotor: angular velocity of rotor/rotor shaft (rad/s)\nthetaDotGB: angular velocity of gearbox shaft (rad/s)\n\n#Output\n\ntorque: reaction torque of drive shaft\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.calculateElementOrientation-Tuple{Any}","page":"API Reference","title":"OWENS.calculateElementOrientation","text":"calculateElementOrientation(mesh)\n\nCalculates the orientation of elements in a mesh.\n\n#Input\n\nmesh::OWENSFEA.Mesh see ?OWENSFEA.Mesh object containing mesh data\n\n#Output\n\nelOr::OWENSFEA.Ort see ?OWENSFEA.Ort object containing element orientation data\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.calculatePsiTheta-Tuple{Any}","page":"API Reference","title":"OWENS.calculatePsiTheta","text":"calculatePsiTheta(v)\n\nCalculates the orientation of a single element. A local element frame is related to a hub frame through a transformation matrix CHtoE (transforming a vector from an element frame E to a global frame H) such that CHtoE = [M2(Theta)]*[M3(Psi)]. Here [M2( )] is a direction cosine matrix about a 2 axis and [M3( )] is a direction cosine matrix about a 3 axis.\n\n#Input\n\nv: vector from node 1 to node 2 of an element\n\n#Output\n\nPsi: \"3\" angle for element orientation (deg)\nTheta: \"2\" angle for element orientation (deg)\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.count_cycles-Tuple{Vector{Float64}, Vector{Float64}}","page":"API Reference","title":"OWENS.count_cycles","text":"Count the cycles from the data \n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.createGeneralTransformationMatrix-Tuple{Any, Any}","page":"API Reference","title":"OWENS.createGeneralTransformationMatrix","text":"createGeneralTransformationMatrix(angleArray,axisArray)\n\nCalculates the transformation matrix assocaited with a general Euler rotation sequence.\n\n#Input\n\nangleArray: = array of angles for Euler rotation sequence\naxisArray: = array of axis of rotatoins for Euler rotation\n\n#Output\n\ndcmTotal: = transformation matrix of specified euler rotation sequence\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.createInitCondArray-Tuple{Any, Any, Any}","page":"API Reference","title":"OWENS.createInitCondArray","text":"setInitConditions(initDisps, numNodes, numDOFPerNode)\n\nCreates the formatted initial conditions array needed by OWENSFEA\n\n#Input\n\ninitDisps: an array of length numDOFPerNode specifying the initial displacement of each DOF\nnumNodes: the number of nodes in the given mesh\nnumDOFPerNode: the number of unconstrained degrees of freedom calculated in each node\n\n#Output\n\ninitCond: 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.\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.createSingleRotationDCM-Tuple{Any, Any}","page":"API Reference","title":"OWENS.createSingleRotationDCM","text":"Creates a direction cosine matrix (dcm) associated with a rotation of angleDeg about axisNum.\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.create_arcus_mesh-Tuple{}","page":"API Reference","title":"OWENS.create_arcus_mesh","text":"createarcusmesh(;Ht = 15.0, Hb = 147.148-15.0, #blade height R = 54.014, # m bade radius nblade = 3, ntelem = 30, #tower elements nbelem = 30, #blade elements ncelem = 4, strutmountpoint = 0.01, # This puts struts at top and bottom bshapex = zeros(nbelem+1), #Blade shape, magnitude is irrelevant, scaled based on height and radius above bshapez = zeros(nbelem+1), jointtype = 0, cablesconnectedtobladebase = true, angularOffset = 0.0)\n\nARCUS mesh configuration: no tower between blades, no struts, but cables from top center attaching to specified blade mount point at base\n\n#Inputs\n\nHt::float: height of tower before blades attach (m)\nHb::float: blade height (m)\nR::float: bade radius (m)\nnblade::int: number of blades\nntelem::int: number of tower elements\nnbelem::int: number of blade elements\nncelem::int: number of strut elements\nc_mount_ratio::float: factor of blade height where the struts attach on both top and bottom\nbshapex::Array{<:float}: Blade shape, magnitude is irrelevant, scaled based on height and radius above\nbshapez::Array{<:float}: Blade shape, magnitude is irrelevant, scaled based on height and radius above\njoint_type::int: 0 is fixed, 1 is about x-axis, 2 is y-axis, etc\ncables_connected_to_blade_base::bool: = true,\nangularOffset::float: (rad) angular offset of mesh generation, typically used to match CACTUS input. Value of 0 puts blade 1 at the \"north\" position and the others populate counterclockwise when looking down\n\n#Outputs\n\nmymesh::OWENSFEA.Mesh: see ?OWENSFEA.Mesh\nort::OWENSFEA.Ort: see ?OWENSFEA.Ort\nmyjoint:Array{<:float}: see ?OWENSFEA.FEAModel.joint\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.create_hawt_biwing_mesh-Tuple{}","page":"API Reference","title":"OWENS.create_hawt_biwing_mesh","text":"createhawtbiwingmesh(;Ht = 15.0, Hb = 147.148-15.0, #blade height R = 54.014, # m bade radius nblade = 3, ntelem = 30, #tower elements nbelem = 30, #blade elements ncelem = 4, strutmountpoint = 0.01, # This puts struts at top and bottom bshapex = zeros(nbelem+1), #Blade shape, magnitude is irrelevant, scaled based on height and radius above bshapez = zeros(nbelem+1), jointtype = 0, cablesconnectedtoblade_base = true, angularOffset = 0.0)\n\n#Inputs\n\nHt::float: height of tower before blades attach (m)\nHb::float: blade height (m)\nR::float: bade radius (m)\nnblade::int: number of blades\nntelem::int: number of tower elements\nnbelem::int: number of blade elements\nncelem::int: number of strut elements\nc_mount_ratio::float: factor of blade height where the struts attach on both top and bottom\nbshapex::Array{<:float}: Blade shape, magnitude is irrelevant, scaled based on height and radius above\nbshapez::Array{<:float}: Blade shape, magnitude is irrelevant, scaled based on height and radius above\njoint_type::int: 0 is fixed, 1 is about x-axis, 2 is y-axis, etc\ncables_connected_to_blade_base::bool: = true,\nangularOffset::float: (rad) angular offset of mesh generation, typically used to match CACTUS input. Value of 0 puts blade 1 at the \"north\" position and the others populate counterclockwise when looking down\n\n#Outputs\n\nmymesh::OWENSFEA.Mesh: see ?OWENSFEA.Mesh\nort::OWENSFEA.Ort: see ?OWENSFEA.Ort\nmyjoint:Array{<:float}: see ?OWENSFEA.FEAModel.joint\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.create_hawt_mesh-Tuple{}","page":"API Reference","title":"OWENS.create_hawt_mesh","text":"createhawtmesh(;Ht = 15.0, Hb = 147.148-15.0, #blade height R = 54.014, # m bade radius nblade = 3, ntelem = 30, #tower elements nbelem = 30, #blade elements ncelem = 4, strutmountpoint = 0.01, # This puts struts at top and bottom bshapex = zeros(nbelem+1), #Blade shape, magnitude is irrelevant, scaled based on height and radius above bshapez = zeros(nbelem+1), jointtype = 0, cablesconnectedtobladebase = true, angularOffset = 0.0)\n\nARCUS mesh configuration: no tower between blades, no struts, but cables from top center attaching to specified blade mount point at base\n\n#Inputs\n\nHt::float: height of tower before blades attach (m)\nHb::float: blade height (m)\nR::float: bade radius (m)\nnblade::int: number of blades\nntelem::int: number of tower elements\nnbelem::int: number of blade elements\nncelem::int: number of strut elements\nc_mount_ratio::float: factor of blade height where the struts attach on both top and bottom\nbshapex::Array{<:float}: Blade shape, magnitude is irrelevant, scaled based on height and radius above\nbshapez::Array{<:float}: Blade shape, magnitude is irrelevant, scaled based on height and radius above\njoint_type::int: 0 is fixed, 1 is about x-axis, 2 is y-axis, etc\ncables_connected_to_blade_base::bool: = true,\nangularOffset::float: (rad) angular offset of mesh generation, typically used to match CACTUS input. Value of 0 puts blade 1 at the \"north\" position and the others populate counterclockwise when looking down\n\n#Outputs\n\nmymesh::OWENSFEA.Mesh: see ?OWENSFEA.Mesh\nort::OWENSFEA.Ort: see ?OWENSFEA.Ort\nmyjoint:Array{<:float}: see ?OWENSFEA.FEAModel.joint\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.create_mesh_struts-Tuple{}","page":"API Reference","title":"OWENS.create_mesh_struts","text":"return mymesh, myort, myjoint, AD15bldNdIdxRng, AD15bldElIdxRng = createmeshstruts(;Ht = 15.0, Hb = 147.148-15.0, #blade height R = 54.014, # m bade radius AD15hubR = 2.0, nblade = 3, ntelem = 30, #tower elements nbelem = 30, #blade elements nselem = 4, struttwrmountpointbot = 0.01, # This puts struts at top and bottom struttwrmountpointtop = 0.99, # This puts struts at top and bottom strutbldmountpointbot = 0.01, # This puts struts at top and bottom strutbldmountpointtop = 0.99, # This puts struts at top and bottom bshapex = zeros(nbelem+1), #Blade shape, magnitude is irrelevant, scaled based on height and radius above bshapez = zeros(nbelem+1), bshapey = zeros(nbelem+1), # but magnitude for this is relevant angularOffset = 0.0, #Blade shape, magnitude is irrelevant, scaled based on height and radius above AD15_ccw = false, verbosity=0, # 0 nothing, 1 basic, 2 lots: amount of printed information connectBldTips2Twr =true)\n\nStandard Mesh Matching 5MW, 34m configurations\n\n#Inputs\n\nHt::float: height of tower before blades attach (m)\nHb::float: blade height (m)\nR::float: bade radius (m)\nnblade::int: number of blades\nntelem::int: number of tower elements\nnbelem::int: number of blade elements\nnselem::int: number of strut elements\nstrut_twr_mountpointbot::float = 0.01, # factor of blade height where the bottom strut attaches on the tower\nstrut_twr_mountpointtop::float = 0.99, # factor of blade height where the top strut attaches on the tower\nstrut_bld_mountpointbot::float = 0.01, # factor of blade height where the bottom strut attaches on the blade\nstrut_bld_mountpointtop::float = 0.99, # factor of blade height where the top strut attaches on the blade\nbshapex::Array{<:float}: Blade shape, magnitude is irrelevant, scaled based on height and radius above\nbshapez::Array{<:float}: Blade shape, magnitude is irrelevant, scaled based on height and radius above\nbshapey::Array{<:float}: Blade shape, magnitude IS relevant #TODO: resolve this\nangularOffset::float: (rad) angular offset of mesh generation, typically used to match CACTUS input. Value of 0 puts blade 1 at the \"north\" position and the others populate counterclockwise when looking down\nAD15_ccw::boolean: Use AD15 convention of VAWT counter-clockwise with blade root at top (blade points down)\nAD15hubR::float: AD15 has a hub radius, so the struts do not go all the way to the center of the axis of rotation, while the structural mesh does.\n\nverbosity::int: 0 nothing, 1 basic, 2 lots: amount of printed information\n\nconnectBldTips2Twr::book: True for Darrieus style, false for H-VAWT, but the blade shapes should be appropriate\n\n#Outputs\n\nmymesh::OWENSFEA.Mesh: see ?OWENSFEA.Mesh\nmyort::OWENSFEA.Ort: see ?OWENSFEA.Ort\nmyjoint:Array{<:float}: see ?OWENSFEA.FEAModel.joint\nAD15bldNdIdxRng: indices for start and end of all blades for AD15 (includes struts). Note that strut start nodes may be inside the strut (strut connects to tower, AD15 blade connects to hub wich is a few nodes away from tower)\nAD15bldElIdxRng: range of elements for start and end of all AD15 blades (includes struts)\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.externalForcing-NTuple{4, Any}","page":"API Reference","title":"OWENS.externalForcing","text":"externalForcing(time,timeArray,ForceValHist,ForceDof)\n\nInternal, linear time interpolation on the input forces (ForceValHist) for each specified ForceDof\n\nThis function specifies external forcing for a transient analysis. Fexternal is a vector of loads and Fdof is a corresponding vector of degrees of freedom the concentrated loads in Fexternal correspond to. The input time allows for arbitrary time varying loads The global degree of freedom number corresponding with the local degree of freedom of a node may be calculated by: globalDOFNumber = (nodeNumber-1)*6 + localDOFnumber The localDOFnumber may range from 1 to 6 such that 1 corresponds to a force in \"x direction\" of the co-rotating hub frame. 2 and 3 corresponds to a force in the \"y\" and \"z directions\" respectively. 4, 5, and 6 correspond to a moment about the \"x\", \"y\", and \"z\" directions respectively.\n\n#Input\n\ntime: Current time\ntimeArray: time associated with ForceValHist\nForceValHist: Forces for each time for each Dof\nForceDof: Dofs within ForceValHist\n\n#Output\n\nFexternal: vector of external loads (forces/moments)\nFdof: vector of corresponding DOF numbers to apply loads to\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.extrap_pred_vals-NTuple{4, Any}","page":"API Reference","title":"OWENS.extrap_pred_vals","text":"extrap_pred_vals(curr_vals, ts, t_out, interp_order)\n\nInternal, calculates predicted values at t_out based on previous values at earlier times.\n\nInput\n\ncurr_vals::Vector{<:float}: input values\nts::Vector{<:float}: time values corresponding to curr_vals. Left to right, times go from earliest to most recent.\nt_out::float: time for values to be extrapolated tocp\ninterp_order::int: order of the spline fit for the extrapolation, 0 flat, 1 linear, 2 quadratic\n\nOutput\n\npred_vals: extrapolated values at t_out\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.find_boundary_vals-Tuple{Vector{OWENS.Cycle}}","page":"API Reference","title":"OWENS.find_boundary_vals","text":"Find the minimum and maximum mean value and maximum range from a vector of cycles\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.find_range-Union{Tuple{T}, Tuple{Vector{T}, Any}} where T<:Real","page":"API Reference","title":"OWENS.find_range","text":"Returns the range index where the value is found \n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.frame_convert-Tuple{Any, Any}","page":"API Reference","title":"OWENS.frame_convert","text":"frame_convert(init_frame_vals, trans_mat)\n\nInternal, transfers 6 DOFs element-wise to a new reference frame\n\nInput\n\ninit_frame_vals::Vector{<:float}: Values in 6 degrees of freedom in the initial reference frame\ntrans_mat::Array{<:float}: Transformation matrix to the output reference frame\n\nOutput\n\nout_frame_vals: Values in 6 degrees of freedom in the output reference frame\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.generateOutputFilename-Tuple{Any, Any}","page":"API Reference","title":"OWENS.generateOutputFilename","text":"Internal, generates an output file name depending on the analysis type\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.getGustVel-NTuple{6, Any}","page":"API Reference","title":"OWENS.getGustVel","text":"time::TF: in seconds\nnominalVinf::TF: Nominal velocity used to calculate the IEC gust size (m/s)\nR::TF: Turbine Radius (m)\nG_amp::TF: IEC gust amplitude (m/s)\ngustT::TF: IEC gust duration (s)\ngustDelayT::TF: IEC gust delay time\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.getOWENSPreCompOutput-Tuple{Any}","page":"API Reference","title":"OWENS.getOWENSPreCompOutput","text":"getOWENSPreCompOutput(numadIn;yscale=1.0,plyprops = plyproperties())\n\nTakes numad formatted inputs for composite layup and material properties and runs them through OWENSPreComp\n\n#Inputs\n\nnumadIn::NuMad: see ?NuMad inputs\nyscale::float: airfoil thickness scaling\nplyprops::plyproperties(): see ?plyproperties for input material properties\n\n#Outputs\n\nprecompoutput::OWENSPreComp.Input: see ?OWENSPreComp.Input\nprecompinput::OWENSPreComp.properties: see ?OWENSPreComp.properties\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.getRotorPosSpeedAccelAtTime-NTuple{4, Any}","page":"API Reference","title":"OWENS.getRotorPosSpeedAccelAtTime","text":"getRotorPosSpeedAccelAtTime(t0,time,aziInit)\n\nUses the user defined function rotorSpeedProfile() to get the azimuth, speed, and acceleration of the rotor.\n\n#Input\n\nt0 time at which azimuth integration is beginning\ntime current time that position, velocity, and acceleration are being requested\naziInit initial rotor azimuth angle integration will begin at\n\n#Output\n\nrotorAzimuth azimuth position of rotor (rad) at time\nrotorSpeed rotor speed (Hz) at time\nrotorAcceleration rotor acceleration (Hz/s) at time\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.getSectPropsFromOWENSPreComp-Tuple{Any, Any, Any}","page":"API Reference","title":"OWENS.getSectPropsFromOWENSPreComp","text":"getSectPropsFromOWENSPreComp(usedUnitSpan,numadIn,precompoutput;GX=false,precompinputs=nothing)\n\nArranges the precomp output into the sectional properties required by OWENSFEA\n\n#Inputs\n\nusedUnitSpan::Array{<:float}: Array specifying the relative (0-1) mesh z locations where the sectional properties are actually called for (interpolation)\nnumadIn::NuMAD: see ?NuMAD\nprecompoutput::OWENSPreComp.properties: see ?OWENSPreComp.properties\nGX::bool: optional specifies if GX outputs should be output\nprecompinputs: optional\n\n#Outputs\n\nsectionPropsArray::SectionPropsArray: see ?OWENSFEA.SectionPropsArray, if !GX bool\nstiff: if GX bool\nmass: if GX bool\n\nstiff, mass\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.mapACDMS-NTuple{5, Any}","page":"API Reference","title":"OWENS.mapACDMS","text":"mapACDMS(t,mesh,el)\n\nmap OWENSAero forces to OWENS mesh dofs\n\nInputs\n\nt::float: time at which to get the loads (can be called repeatedly at the same time or for large time gaps, will infill run as needed)\nmesh::OWENSFEA.Mesh: see ?OWENSFEA.Mesh\nmesh::OWENSFEA.El: see ?OWENSFEA.El\n\nOutputs:\n\nForceValHist::Array(<:float): Force or moment (N, N-m) at the time corresponding to the time specified\nForceDof::Array(<:int): DOF numbers cooresponding to forces (i.e. mesh element 1 has dofs 1-6, 2 has dofs 7-12, etc)\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.mapAD15-NTuple{4, Any}","page":"API Reference","title":"OWENS.mapAD15","text":"mapAD15(t,mesh)\n\nmap AD15 forces to OWENS mesh dofs\n\nInputs\n\nt::float: time at which to get the loads (can be called repeatedly at the same time or for large time gaps, will infill run as needed)\nmesh::OWENSFEA.Mesh: see ?OWENSFEA.Mesh\nmesh::OWENSFEA.El: see ?OWENSFEA.El\n\nOutputs:\n\nForceValHist::Array(<:float): Force or moment (N, N-m) at the time corresponding to the time specified\nForceDof::Array(<:int): DOF numbers cooresponding to forces (i.e. mesh element 1 has dofs 1-6, 2 has dofs 7-12, etc)\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.mapCactusLoadsFile-NTuple{6, Any}","page":"API Reference","title":"OWENS.mapCactusLoadsFile","text":"Internal, takes cactus loads and geometry and OWENS mesh and maps the loads to the blades' FEA dofs\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.my_getABD!","page":"API Reference","title":"OWENS.my_getABD!","text":"my_getABD(matid::AbstractArray{<:Integer,1}, nply::AbstractArray{<:Integer,1}, tply::AbstractArray{<:Real,1}, theta::AbstractArray{<:Real,1}, q::AbstractArray{<:AbstractArray{<:Real,2},1}), offset::Real\n\nmy_getABD(lam::Laminate, q::AbstractArray{<:AbstractArray{<:Real,2},1}), offset::Real\n\nReturns A, B, and D matrices\n\nArguments:\n\nmatid::AbstractArray{<:Integer,1}: material id of each lamina\nnply::AbstractArray{<:Integer,1}: number of plies in each lamina\ntply::AbstractArray{<:Real,1}: thickness of a ply (m) in each lamina\ntheta::AbstractArray{<:Real,1}: orientation (deg) of each lamina\nq::AbstractArray{<:AbstractArray{<:Real,2}}: Stiffness matrix of each lamina\noffset::Real: Optional, used if neutral axis is not centered on the ply. If used, specify distance from neutral axis to upper surface (m).\n\n\n\n\n\n","category":"function"},{"location":"reference/reference/#OWENS.my_getplystrain","page":"API Reference","title":"OWENS.my_getplystrain","text":"my_getplystrain(nply::AbstractArray{<:Integer,1}, tply::AbstractArray{<:Real,1}, theta::AbstractArray{<:Real,1}, resultantstrain::AbstractArray{<:Real,1}, offset::Real)\n\nmy_getplystrain(lam::Laminate, resultantstrain::AbstractArray{<:Real,1}, offset::Real)\n\nOptional Argument\n\noffset::Real: Optional, used if neutral axis is not centered on the ply. If used, specify distance from neutral axis to upper surface (m).\n\nCalculates strains in each ply aligned with principal material direction.\n\n\n\n\n\n","category":"function"},{"location":"reference/reference/#OWENS.my_getz","page":"API Reference","title":"OWENS.my_getz","text":"getz(tply::AbstractArray{<:Real,1}, nply::AbstractArray{<:Integer,1}, offset::Real)\n\ngetz(lam::Laminate, offset::Real)\n\nReturns a laminate's z-coordinates (coordinates of top and bottom of laminas) given the thickness of plies in each lamina and the number of plies in each lamina. Offset is optional, defaults to 0.0, is the distance from the neutal axis to the upper ply if the laminate is not centered about the neutral axis of a beam.\n\n\n\n\n\n","category":"function"},{"location":"reference/reference/#OWENS.mywrite_vtk-NTuple{5, Any}","page":"API Reference","title":"OWENS.mywrite_vtk","text":"mywrite_vtk(name, assembly::Assembly, [state::AssemblyState, ]λ::Number,\n eigenstate::AssemblyState; scaling=1.0, mode_scaling=1.0, cycles=1,\n steps=100)\n\nWrite a series of files corresponding to the elastic motion of the assembly about the deformed state encoded in state defined by the eigenvalue λ and the eigenvector encoded in eigenstate over the time period specified by time.\n\nThe steady-state deflections can be scaled with scaling and the eigenmode deflections can be scaled using mode_scaling.\n\nThe current time is encoded in the metadata tag \"time\"\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.mywrite_vtk-Tuple{Any, Any}","page":"API Reference","title":"OWENS.mywrite_vtk","text":"mywrite_vtk(name, assembly::Assembly; kwargs...)\nmywrite_vtk(name, assembly::Assembly, state::AssemblyState; kwargs...)\nmywrite_vtk(name, assembly::Assembly, history::Vector{<:AssemblyState}], dt;\n kwargs...)\n\nWrite the deformed geometry (and associated data) to a VTK file for visualization using ParaView.\n\nThe state argument may be omitted to write the original geometry to a VTK file without any associated data.\n\nIf the solution time history is provided, the time step must also be provided\n\nKeyword Arguments\n\nsections = nothing: Cross section geometry corresponding to each point, defined in a frame aligned with the body frame but centered around the corresponding point. Defined as an array with shape (3, ncross, np) where ncross is the number of points in each cross section and np is the number of points.\nscaling=1.0: Parameter to scale the deflections (only valid if state is provided)\nmetadata=Dict(): Dictionary of metadata for the file(s)\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.omegaSpecCheck-NTuple{4, Any}","page":"API Reference","title":"OWENS.omegaSpecCheck","text":"Internal, gets specified rotor speed at time\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.owens-Tuple{Any, Any}","page":"API Reference","title":"OWENS.owens","text":"owens(owensfile,analysisType;\n delta_t=2e-3,\n numTS=100,\n tocp=[0.0,1.1],\n Omegaocp=[0.0,1.0],\n OmegaInit=0.0,\n OmegaGenStart=0.0,\n usingRotorSpeedFunction=false,\n nlOn=true,\n Omega=0.0,\n turbineStartup=0,\n spinUpOn=false,\n numModesToExtract=20,\n displInitGuess=0.0,\n airDensity=1.2041,\n aeroElasticOn = false,\n guessFreq = 0,\n gravityOn = true,\n generatorOn = false,\n omegaControl = false,\n iterationType = \"NR\", # nlParams\n adaptiveLoadSteppingFlag = true,\n tolerance = 1.0000e-06,\n maxIterations = 50,\n maxNumLoadSteps = 20,\n minLoadStepDelta = 0.0500,\n minLoadStep = 0.0500,\n prescribedLoadStep = 0.0,\n elementOrder = 1,\n numDofPerNode = 6,\n hydroOn = false,\n platformTurbineConnectionNodeNumber = 1,\n JgearBox =0.0,\n gearRatio = 1.0,\n gearBoxEfficiency = 1.0,\n useGeneratorFunction = false,\n generatorProps = 0.0,\n driveTrainOn = false)\n\nOriginal serial and file reading method of running an analysis.\n\n#Inputs See ?OWENS.Model and ?OWENSFEA.FEAModel\n\n#Outputs See ?OWENS.Unsteady, ?OWENSFEA.Modal\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.plotMesh-NTuple{7, Any}","page":"API Reference","title":"OWENS.plotMesh","text":"plotMesh plots a mesh with various orthographic and isometric views plotMesh(mesh,colorstring,meshSeg)\n\nThis function plots a mesh in a 3D with isometric view.\n\n#Input\n\nmesh: object containing mesh data\ncolorstring: string containing color for plotting\nmeshSeg: array containing number of elements per mesh segment\nax1: handle to the 1 plot\nax2: handle to the 2 plot\nax3: handle to the 3 plot\nax4: handle to the 4 plot\n\n#Output NONE\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.rainflow-Tuple{Any}","page":"API Reference","title":"OWENS.rainflow","text":"rainflow(signal;nbins_range=10,nbins_mean=10)\n\nConvenience function that returns the binned cycles with the corresponding ranges and means\n\nInputs\n\nsignal::Array{<:Real,1}: data input\nnbins_range::Array{<:Int,1}: Number of bins for range\nnbins_mean::Array{<:Int,1}: Number of bins for mean\nm` : Wohler exponent (default is 3)\nTeq` : The equivalent number of load cycles (default is 1, but normally the time duration in seconds is used)\n\nOutputs:\n\nNcycles::Array{<:Real,2}: Summed/binned cycles with columns corresponding to mean levels and rows corresponding to range levels\nmeanIntervals::Array{<:Real,1}: Mean levels corresponging with bins columns\nrangeIntervals::Array{<:Real,1}: Range levels corresponging with bins rows\nequivalentLoad::Array{<:Real,1}: Design equivalent load for each mean level\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.readBCdata-Tuple{Any, Any, Any}","page":"API Reference","title":"OWENS.readBCdata","text":"readBCdata(bcfilename,numNodes,numDofPerNode)\n\nThis function reads the boundray condition file and stores data in the boundary condition object.\n\n#Input\n\nbcfilename::string: string containing boundary condition filename\nnumNodes::int: number of nodes in structural model\nnumDofPerNode::int: number of degrees of freedom per node\n\n#Output\n\nBC::OWENSFEA.BC_struct: see OWENSFEA.BC_struct, object containing boundary condition data\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.readBladeData-Tuple{Any}","page":"API Reference","title":"OWENS.readBladeData","text":"readBladeData(filename)\n\nThis function reads blade data from file\n\n#Input\n\nfilename::string: string containing /path/to/bladedata.bld\n\n#Output\n\nbladeData::BladeData: see ?BladeData object containing blade data\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.readCactusGeom-Tuple{Any}","page":"API Reference","title":"OWENS.readCactusGeom","text":"Internal, reads cactus .geom file and stores each column in an array within the CactusGeom struct\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.readElementData-NTuple{4, Any}","page":"API Reference","title":"OWENS.readElementData","text":"readElementData(numElements,elfile,ortfile,bldfile\n\nReads element data and stores data in the element data object.\n\n#Input\n\nnumElements::int: number of elements in structural mesh\nelfile::string: element data path/to/filename\nortfile::string: element orientation path/to/filename\nbldfile::string: blade data path/to/filename\n\n#Output\n\nel::OWENSFEA.El: see OWENSFEA.El element data object\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.readGeneratorProps-Tuple{Any}","page":"API Reference","title":"OWENS.readGeneratorProps","text":"readGeneratorProps(generatorfilename)\n\nThis function reads generator properties from file.\n\n#Input\n\ngeneratorfilenanme::string: = string containing path/to/generatorfile\n\n#Output\n\ngenprops: = model object containing generator properties\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.readMesh-Tuple{Any}","page":"API Reference","title":"OWENS.readMesh","text":"readMesh(filename)\n\nReads the mesh file and stores data in the mesh object.\n\ninput:\n\nfilename::string string containing mesh path/to/filename.mesh\n\noutput:\n\nmesh::OWENSFEA.Mesh see OWENSFEA.Mesh\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.readNuMadGeomCSV-Tuple{Any}","page":"API Reference","title":"OWENS.readNuMadGeomCSV","text":"readNuMadGeomCSV(NuMadgeomxlscsv_file)\n\nParameters defining the rotor (apply to all sections).\n\nArguments\n\nNuMad_geom_xlscsv_file::String: name of the numad excel CSV file being read (!!! THE NUMAD TAB MUST BE SAVED AS A CSV FOR THIS TO WORK !!!)\n\nReturns\n\nOutput::NuMad: numad structure as defined in the NuMad structure docstrings.\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.readNuMadMaterialsCSV-Tuple{Any}","page":"API Reference","title":"OWENS.readNuMadMaterialsCSV","text":"readNuMadMaterialsCSV(NuMadmaterialsxlscsv_file)\n\nParameters defining the rotor materials.\n\nArguments\n\nNuMad_materials_xlscsv_file::String: name of the numad excel CSV file being read (!!! THE NUMAD TAB MUST BE SAVED AS A CSV FOR THIS TO WORK !!!)\n\nReturns\n\nOutput::plyproperties: plyproperties structure as defined in the plyproperties structure docstrings.\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.readResultsModalOut-Tuple{Any, Any}","page":"API Reference","title":"OWENS.readResultsModalOut","text":"Internal, reads modal file and returns freq, damp, and modeshapes\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.rigidBodyRotation-NTuple{5, Any}","page":"API Reference","title":"OWENS.rigidBodyRotation","text":"rigidBodyRotation(B1,B2,B3,AngleArray,AxisArray)\n\nPerforms a coordinate transformation from a local body \"B\"(element) frame to a common hub frame \"H\" via a 3-2-3 euler rotation sequence\n\n#Input\n\nB1: array containing body frame 1 coordinates of points to be mapped to the hub frame\nB2: array containing body frame 2 coordinates of points to be mapped to the hub frame\nB3: array containing body frame 3 coordinates of points to be mapped to the hub frame\nAngleArray: Array of angles for Euler rotation sequence\nAxisArray: Array of axes for Euler rotation sequence\n\n#Output\n\nH1: array containg hub frame 1 coordinates of points mapped to the hub frame from body frame\nH2: array containg hub frame 2 coordinates of points mapped to the hub frame from body frame\nH3: array containg hub frame 3 coordinates of points mapped to the hub frame from body frame\n\nThat is CHtoB = [M3(SweepAngle)][M2(Theta)][M3(Psi)];\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.run34m-NTuple{6, Any}","page":"API Reference","title":"OWENS.run34m","text":"run34m(inputs,feamodel,mymesh,myel,aeroForces,deformAero;steady=true,system=nothing,assembly=nothing,VTKFilename=\"./outvtk\")\n\nhelper function that rearranges the outputs into the expected 34m output # Input * inputs::Model: see ?Model * topModel::FEAModel: see ?OWENSFEA.FEAModel * mesh::Mesh: see ?OWENSFEA.Mesh * el::El: see ?OWENSFEA.El * aeroForces::function: Fexternal, Fdof = aero(t) where Fexternal is the force on each affected mesh dof and Fdof is the corresponding DOFs affected * deformAero::function: see deformTurb(azi;newOmega=-1,newVinf=-1,bldx=-1,bldz=-1,bld_twist=-1,steady=false) * steady::bool: run steadystate with no aero or not * system: see ?GXBeam.System * assembly: see ?GXBeam.Assembly * VTKFilename::string: Unused: path and name of VTK output\n\n# Output\n* `eps_x`: strain history for eps_xx_0 for (Nbld,N_ts,mymesh.meshSeg[2]+1)\n* `eps_y`: strain history for eps_xx_z like above\n* `eps_z`: strain history for eps_xx_y like above\n* `kappa_x`: strain history for gam_xz_0 like above\n* `kappa_y`: strain history for gam_xz_y like above\n* `kappa_z`: strain history for gam_xy_0 like above\n* `t`: time array\n* `FReactionHist`: Nodal reaction 6dof forces history\n* `OmegaHist`: rotational speed array history\n* `genTorque`: generator torque history\n* `torqueDriveShaft`: driveshaft torque history\n* `aziHist`: azimuthal history array\n* `uHist`: mesh displacement history for each dof\n* `epsilon_x_hist`: strain history for eps_xx_0 for each dof\n* `epsilon_y_hist`: strain history for eps_xx_z for each dof\n* `epsilon_z_hist`: strain history for eps_xx_y for each dof\n* `kappa_x_hist`: strain history for gam_xz_0 for each dof\n* `kappa_y_hist`: strain history for gam_xz_y for each dof\n* `kappa_z_hist`: strain history for gam_xy_0 for each dof\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.runDLC-Tuple{Any, Any, Any}","page":"API Reference","title":"OWENS.runDLC","text":"runDLC(DLCs,Inp,path; Vinfrange=LinRange(5,20,16), IECstd=\"\"2\"\", WindChar=\"\"A\"\", WindClass=1, turbsimpath=\"./turbsimfiles\", templatefile=\"./templateTurbSim.inp\", pathtoturbsim=\"../../openfast/build/modules/turbsim/turbsim\", NumGridZ=100, NumGridY=100, Vref=10.0, Vdesign=11.0, grid_oversize=1.1, regenWindFiles=false)\n\n# Input\n* `DLCs`: [\"1_1\",\"1_2\"]\n* `Inp::MasterInput`: see ?OWENS.MasterInput\n* `path`: desired path to run everything\n* `Vinf_range`: =LinRange(5,20,16),\n* `IEC_std`: =\"\"2\"\",\n* `WindChar`: =\"\"A\"\",\n* `WindClass`: =1,\n* `turbsimpath`: =\"./turbsimfiles\", path where it dumps the turbsim files\n* `templatefile`: =\"./template_files/templateTurbSim.inp\",\n* `pathtoturbsim`: =\"../../openfast/build/modules/turbsim/turbsim\",\n* `NumGrid_Z`: =100,\n* `NumGrid_Y`: =100,\n* `Vref`: =10.0,\n* `Vdesign`: =11.0, # Design or rated speed\n* `grid_oversize`: =1.1,\n* `regenWindFiles`: =false\n\n# Output\n* `nothing`:\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.simpleGenerator-Tuple{Any, Any}","page":"API Reference","title":"OWENS.simpleGenerator","text":"simpleGenerator(generatorProps,genSpeed)\n\nCaclulates generator torque for simple induction generator\n\n#Input\n\ngeneratorProps object containing generator properties, see ?model\ngenSpeed::float generator speed (Hz)\n\n#Output\n\ngenTorque::float generator torque\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.sort_peaks","page":"API Reference","title":"OWENS.sort_peaks","text":"This function sorts out points where the slope changes sign\n\n\n\n\n\n","category":"function"},{"location":"reference/reference/#OWENS.sum_cycles-Union{Tuple{T}, Tuple{Vector{OWENS.Cycle}, Union{StepRangeLen{T}, Vector{T}}, Union{StepRangeLen{T}, Vector{T}}}} where T<:Real","page":"API Reference","title":"OWENS.sum_cycles","text":"Sums the cycle count given intervals of rangeintervals and meanintervals. The rangeintervals and meanintervals are given in fraction of range size\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.timeIntegrateSubSystem-NTuple{8, Any}","page":"API Reference","title":"OWENS.timeIntegrateSubSystem","text":"timeIntegrateSubSystem(M,K,C,F,delta_t,u,udot,uddot)\n\nInternal, performs integration of a system using the Newmark-Beta method (constant-average acceleration sceheme).\n\n#Input\n\nM: system mass matrix\nK: system sttiffness matrix\nC: system damping matrix\nF: system force vector\ndelta_t: time step\nu: displacement at beginning of time step\nudot: velocity at beginning of time step\nuddot: acceleration at beginning of time step\n\n#Output\n\nunp1: displacement at end of time step\nudotnp1: velocity at end of time step\nuddotnp1: acceleration at end of time step\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.transMat-Tuple{Any, Any, Any}","page":"API Reference","title":"OWENS.transMat","text":"transMat(theta1, theta2, theta3)\n\nInternal, 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.\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.trapezoidalRule-NTuple{4, Any}","page":"API Reference","title":"OWENS.trapezoidalRule","text":"Internal, simple trapezoidal rule integration\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.updateRotorRotation-NTuple{9, Any}","page":"API Reference","title":"OWENS.updateRotorRotation","text":"updateRotorRotation updates rotor rotation\n\nupdateRotorRotation(Irotor,Crotor,Krotor,shaftTorque,genTorque,azi_s,Omega_s,OmegaDot_s,delta_t)\n\nInternal, updates the rotor rotation given rotor properties and external torques\n\n#Input\n\nIrotor: rotor inertia\nCrotor: arbitrary rotor damping\nKrotor: arbitrary rotor stiffness\nshaftTorque: torque from external forces on rotor\ngenTorque: torque from generator\nazi_s: rotor azimuth (rad) at beginning of time step\nOmega_s: rotor speed (Hz) at beginning of time step\nOmegaDot_s: rotor acceleration (Hz/s) at beginning of time step\ndelta_t: time step\n\n#Output\n\nazi_sp1: rotor azimuth (rad) at end of time step\nOmega_sp1: rotor speed (Hz/s) at end of time step\nOmegaDot_sp1: rotor acceleration (Hz/s) at end of time step\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.userDefinedRotorSpeedProfile-Tuple{Any}","page":"API Reference","title":"OWENS.userDefinedRotorSpeedProfile","text":"Internal, unused, userDefinedRotorSpeedProfile\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.viz-Tuple{Any}","page":"API Reference","title":"OWENS.viz","text":"viz(;mesh=[],meshFile=\"none\",resultsFile=\"none\",selectedMode=10,sf=10)\n\nPlots 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\n\n#Input\n\nmesh::OWENSFEA.Mesh: Mesh struct, See ?OWENSFEA.Mesh\nmeshFile::String: optional string containing mesh file name\nresultsFile::String: optional string containing results file name\nselectedMode::Int: integer denoting selected mode to plot\nsf::Float: scale factor for mode shape displacements\n\n#Output None\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.writeOwensNDL-NTuple{4, Any}","page":"API Reference","title":"OWENS.writeOwensNDL","text":"writeOwensNDL(fileRoot, nodes, cmkType, cmkValues)\n\nwrites a nodal input file\n\n#Intput\n\nfileRoot::string: string path to desired location with name but no extension\nnodes::int: node numbers for C/M/K\ncmkType::string: \"C\" \"M\" or \"K\"\ncmkValues::float: C/M/K value\n\n#Output\n\nnone:\n\n\n\n\n\n","category":"method"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"OWENS X is outwards on blade, y is trailing edge always","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"Struts, CCW, z is inwards, y trailing, and CW z is outwards","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"Aerodyn ","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"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.","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"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. ","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"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.","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"(Image: ){width=\"4.917280183727034in\" height=\"4.585993000874891in\"}(Image: ){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.","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"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.","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"(Image: ){width=\"5.595138888888889in\" height=\"4.875694444444444in\"}(Image: ){width=\"5.737141294838145in\" height=\"5.283430664916885in\"}","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"If we add 30 degrees of rotation to the yaw, this is what it looks like.","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"(Image: ){width=\"4.91704615048119in\" height=\"4.992732939632546in\"}","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"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.","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"(Image: ){width=\"4.382957130358705in\" height=\"4.783430664916885in\"}(Image: ){width=\"5.226388888888889in\" height=\"4.833333333333333in\"}","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"(Image: ){width=\"4.406944444444444in\" height=\"3.9298611111111112in\"}If we add 30 degrees of roll, this is what it looks like:","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"(Image: ){width=\"5.124857830271216in\" height=\"4.771802274715661in\"}","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"(Image: ){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.","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"(Image: ){width=\"4.095165135608049in\" height=\"4.388081802274716in\"}","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"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.","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"# apply the twist rotation, which is about the x (1) axis","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"myvec = myvec*[1.0 0.0 0.0","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"0.0 cosd(Twistdel) sind(Twistdel)","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"0.0 -sind(Twistdel) cosd(Twistdel)]","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"# apply theta rotation, which is the tilt angle, or about the y (2) axis in global","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"myvec = myvec*[cosd(Thetadel) 0.0 -sind(Thetadel)","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"0.0 1.0 0.0","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"sind(Thetadel) 0.0 cosd(Thetadel)]","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"# apply Psi rotation, which is about Z (3) axis in global","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"myvec = myvec*[cosd(Psidel) sind(Psidel) 0.0","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"-sind(Psidel) cosd(Psidel) 0.0","category":"page"},{"location":"FramesOfReference/","page":"Frames of Reference","title":"Frames of Reference","text":"0.0 0.0 1.0]","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"author:","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"Kevin R. Moore","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"bibliography:","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"ac_sources.bib","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"title: Offshore Wind Energy Simulator (OWENS) Glue Code Basic Theory, Frames of Reference, and Inter-Module Coupling Methods –-","category":"page"},{"location":"OWENS_Dev_Guide/#Introduction","page":"Developer Guide","title":"Introduction","text":"","category":"section"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/#Contributing","page":"Developer Guide","title":"Contributing","text":"","category":"section"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/#Glue-Code-Basic-Theory","page":"Developer Guide","title":"Glue Code Basic Theory","text":"","category":"section"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"::: algorithm ::: spacing 1.18","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"::: algorithmic Initialize simulation (all module parameters, meshing, composite properties, etc) Initialize displacements and forces as 0","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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_textguess with the calculated displacements ::: :::","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"[]{#alg:Transient label=\"alg:Transient\"} :::","category":"page"},{"location":"OWENS_Dev_Guide/#Global-Frame-of-Reference","page":"Developer Guide","title":"Global Frame of Reference","text":"","category":"section"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"(Image: 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%\"}","category":"page"},{"location":"OWENS_Dev_Guide/#InflowWind-and-TurbSim-Velocity-Inflow","page":"Developer Guide","title":"InflowWind and TurbSim Velocity Inflow","text":"","category":"section"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"This is how it is defined in the manual, despite inverting the positive direction of rotation compared to standard notation.","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"(Image: 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%\"}","category":"page"},{"location":"OWENS_Dev_Guide/#OWENSAero-Aerodynamics-(AC-and-DMS)","page":"Developer Guide","title":"OWENSAero Aerodynamics (AC and DMS)","text":"","category":"section"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"(Image: 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%\"}","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/#OWENSFEA-Structures","page":"Developer Guide","title":"OWENSFEA Structures","text":"","category":"section"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"::: center Name Rotation Axis OWENS Angle Names –––- –––––––- –––––––––- Roll about X Twist Pitch about Y Theta Yaw about Z Psi","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":": Module Level of Detail in This Document :::","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"This is almost consistent between blades and struts (have a +90 rotation on struts for some reason that I haven't sorted out yet).","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"The Mesh matches the global frame of reference of x, y, and z. Element length is the length along the element.","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/#Composites","page":"Developer Guide","title":"Composites","text":"","category":"section"},{"location":"OWENS_Dev_Guide/#Hydrodynamics","page":"Developer Guide","title":"Hydrodynamics","text":"","category":"section"},{"location":"OWENS_Dev_Guide/#Mooring","page":"Developer Guide","title":"Mooring","text":"","category":"section"},{"location":"OWENS_Dev_Guide/#Coupling-Methods","page":"Developer Guide","title":"Coupling Methods","text":"","category":"section"},{"location":"OWENS_Dev_Guide/#Inflow-Aero","page":"Developer Guide","title":"Inflow - Aero","text":"","category":"section"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/#Aero-Turbine-Structure","page":"Developer Guide","title":"Aero - Turbine Structure","text":"","category":"section"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/#Turbine-Structure-Platform-Structure","page":"Developer Guide","title":"Turbine Structure - Platform Structure","text":"","category":"section"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"Same as Aero-Structure","category":"page"},{"location":"OWENS_Dev_Guide/#Hydro-Platform-Structure-Mooring","page":"Developer Guide","title":"Hydro - Platform Structure - Mooring","text":"","category":"section"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"Same as Aero-Structure","category":"page"},{"location":"OWENS_Dev_Guide/#Structures-Composites","page":"Developer Guide","title":"Structures - Composites","text":"","category":"section"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"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.","category":"page"},{"location":"OWENS_Dev_Guide/#Controllers-Control-Elements","page":"Developer Guide","title":"Controllers - Control Elements","text":"","category":"section"},{"location":"OWENS_Dev_Guide/","page":"Developer Guide","title":"Developer Guide","text":"Direct: Controllers provide reactionary inputs to control inputs in real time based on dynamics.","category":"page"},{"location":"#OWENS-(Offshore-Wind-ENergy-Simulator)","page":"Home","title":"OWENS (Offshore Wind ENergy Simulator)","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"This repository is based on the original structural dynamics solver by Brian Owens (see dissertation: http://hdl.handle.net/1969.1/151813). The original code has been translated to Julia and revised for simplicity and performance while maintaining accuracy. GXBeam.jl has also been integrated in beta form for geometrically exact beam solutions The aerodynamics are provided by the OWENSAero.jl module (https://gitlab.sandia.gov/8821-vawt-tools/OWENSAero.jl) in addition to a coupling to the OpenFAST AeroDyn module.","category":"page"},{"location":"#Documentation","page":"Home","title":"Documentation","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"In Work: Documentation can be found in the docs folder along with the validation paper(s).","category":"page"},{"location":"","page":"Home","title":"Home","text":"-\tAll of the functions have docstrings describing the i/o and function purpose, which can be accessed by: * import module * ? module.function() \t\t\t\t -\tA 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.","category":"page"},{"location":"#Software-License","page":"Home","title":"Software License","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"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.","category":"page"},{"location":"","page":"Home","title":"Home","text":"See Copyright.txt file for more information","category":"page"},{"location":"setup/#Installation-Instructions","page":"Installation","title":"Installation Instructions","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"The OWENS software has been developed and designed to operate in the paradigm similar to modern open source software, leveraging tools such as the terminal, git, public software repositories, and automated package management both for the operating system and the programming language. Before attempting these instructions, if you are not familiar with these types of tools, please consider becoming familiar with them prior to proceeding. Here are some of the first google hits for guides:","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"https://www.redhat.com/sysadmin/beginners-guide-vim\nhttps://www.freecodecamp.org/news/the-beginners-guide-to-git-github/\nhttps://www.howtogeek.com/63997/how-to-install-programs-in-ubuntu-in-the-command-line/","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"Future distributions are planned to also include a precompiled binary for each of the three major operating systems, with the aspiration of being able to reduce the required knowledge to the OWENS inputs, outputs, and operation. Until then, here are installation instructions for the three major operating systems. ORDER OF OPERATIONS AND DETAILS ARE IMPORTANT FOR A SUCCESSFUL BUILD, DO NOT SKIP STEPS","category":"page"},{"location":"setup/#Windows","page":"Installation","title":"Windows","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"At this stage in the software's maturity, it is recommended to use mac or linux environments unless the user is experienced with compiled software development in a windows environment. The WSL (windows subsystem for linux) can also be installed (https://allthings.how/how-to-use-linux-terminal-in-windows-11/) and can be set up to run via just the terminal or also set up to use the graphical capabilities of your machine, and the memory can be mapped back and forth as described in the link above.","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"Install julia, paraview, and visual studio manually by downloading the windows executables for","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"https://julialang.org/downloads/\nhttps://www.paraview.org/download/\nhttps://visualstudio.microsoft.com/downloads/","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"Also download OpenFAST:","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"https://github.com/OpenFAST/openfast","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"Be sure julia is on your path, and follow the windows compilation instructions for the openfast Inflowwind, AeroDyn, MoorDyn and HydroDyn libraries. Installation is otherwise the same as the Linux instructions below","category":"page"},{"location":"setup/#Mac","page":"Installation","title":"Mac","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"Essentially the same installation as Linux except we recommend using the homebrew package manager, so exchange all \"apt-get\" with \"brew\" ","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"brew install git\nbrew install wget\nbrew install vim\nbrew install cmake\nbrew install gfortran\nbrew install build-essential\nbrew install openblas\nbrew install lapack","category":"page"},{"location":"setup/#Linux","page":"Installation","title":"Linux","text":"","category":"section"},{"location":"setup/#Install/Update-Required-Compilers-and-Programs,-if-you-already-have-an-environment-that-can-build-OpenFAST,-then-these-should-already-be-installed.","page":"Installation","title":"Install/Update Required Compilers and Programs, if you already have an environment that can build OpenFAST, then these should already be installed.","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"apt-get update -y\napt-get install git -y\napt-get install wget -y\napt-get install vim -y\napt-get install cmake -y\napt-get install gfortran -y\napt-get install build-essential -y\napt-get install libblas-dev liblapack-dev -y","category":"page"},{"location":"setup/#Install-julia","page":"Installation","title":"Install julia","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"cd ~\ncurl -fsSL https://install.julialang.org | sh","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"in your ~/.bashrc file (.zshrc on Mac), tell julia to use the command line git by inserting the following:","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"export JULIAPKGUSECLIGIT=true","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"Additionally, if you are not finding that your path is being appended to, you can instead create an alias by also appending to the ~/.bashrc","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"alias julia=\"path/to/your/julia-1.x.x/bin/julia\"","category":"page"},{"location":"setup/#Proxy-Setup","page":"Installation","title":"Proxy Setup","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"If you are using a proxy, be sure that the proxy variables are declared/exported in your .bash_profile or .bashrc or the equivalent","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"http_proxy, https_proxy, HTTP_PROXY, HTTPS_PROXY, no_proxy, NO_PROXY\ngit config --global http.proxy http://user:nopass@proxy.yourorg:number\ngit config --global https.proxy http://user:nopass@proxy.yourorg:number\nexport JULIA_SSL_CA_ROOTS_PATH=\"\"\nexport JULIA_SSL_NO_VERIFY_HOSTS=\"*.yourorgurl\"\nexport JULIA_PKG_USE_CLI_GIT=true","category":"page"},{"location":"setup/#Test-That-Julia-Runs","page":"Installation","title":"Test That Julia Runs","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"the following should get you in and out of the julia interactive repl","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"julia \nexit()","category":"page"},{"location":"setup/#Set-up-SSH-Keys","page":"Installation","title":"Set up SSH Keys","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"# Note that for installation behind the Sandia network, you will need to be on the network and follow additional instructions at https://wiki.sandia.gov/pages/viewpage.action?pageId=227381234#SandiaProxyConfiguration,Troubleshooting&HTTPS/SSLinterception-SSLCertificate.1\n# Make ssh keys and put in the correct places\n# Go to your gihub account settings\n# left side, SSH and GPG keys\n# new ssh key\n# name: owensrepos # or whatever you'd like\n# back in the linux terminal\nssh-keygen -t rsa -m PEM -C username@youremail.gov\n# enter, enter, enter (i.e. use defaults)\ncd ~\nls -a\ncd .ssh\nvim id_rsa.pub\n#copy the contents to github.com (User icon > Settings > SSH and GPG > New SSH Key) and paste them back in your browser to the ssh key box and create the key\n# esc : q enter # to get out of vim\ncd ~","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"Additionally, if you find that your ssh is erroring when you try to install packages, try editing your ~/.ssh/config and add:","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"Host *\nPubkeyAcceptedAlgorithms +ssh-rsa\nPubkeyAcceptedAlgorithms +ssh-ed25519","category":"page"},{"location":"setup/#Install-Optional-OpenFAST-Dependices","page":"Installation","title":"Install Optional OpenFAST Dependices","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"mkdir coderepos\ncd coderepos\n# Install openfast coupled libraries !NOTE!: if you change the location of the compiled libraries, you may need to update the rpath variable, or recompile.\ngit clone --depth 1 git@github.com:andrew-platt/openfast.git\n# if this errors, you can clone git@github.com:OpenFAST/openfast.git it just doesn't have the latest updates from Andy, but the interface should be the same and should run.\ncd openfast\ngit remote set-branches origin '*'\ngit fetch --depth 1 origin f/ADI_c_binding_multiRotor\ngit checkout f/ADI_c_binding_multiRotor\nmkdir build\ncd build\n# can also add -DOPENMP=ON if desired for acceleration of OLAF\n# you can rebuild later by removing the build folder and following these instructions again.\ncmake -DBUILD_SHARED_LIBS=ON ..\nmake ifw_c_binding\n# make moordyn_c_binding\n# make hydrodyn_c_binding\nmake aerodyn_inflow_c_binding\nmake aerodyn_driver\nmake turbsim\ncd ../../","category":"page"},{"location":"setup/#Brief-Julia-Primer","page":"Installation","title":"Brief Julia Primer","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"Now open the julia interactive repl and run the following blocks, obviously a multi-line block should be entered as one.","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"julia","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"\nprintln(\"This is intended just to get you rolling, comprehensive documentation can be found at https://docs.julialang.org/en/v1/\")\nprintln(\"More detail on major differences between codes can be found at https://docs.julialang.org/en/v1/manual/noteworthy-differences/\")\n\n###############################################################\n###############################################################\n###############################################################\n\nprintln(\"#####################\")\nprintln(\"Basic Data Handling\")\nprintln(\"#####################\")\n# Create a multidimensional array\nnewMatrix = zeros(2,3)\n# Mutate the contents\nnewMatrix[1,2] = 1.0\n\n#Create New Scalar\nnewScalar = 5.0\n\nprintln(\"Print the first matrix\")\n# Print the contents and observe the mutation\nfor irow = 1:length(newMatrix[:,1])\n println(newMatrix[irow,:])\nend\n\n# Copy the newMatrix and scalar\nnewMatrix2 = newMatrix\nnewScalar2 = newScalar\n# Mutate the second matrix and scalar\nnewMatrix[1,2] = 2.0\nnewScalar2 = 2.0\n\n#Make a printing function inline\nfunction printme(matrix, scalar)\n for irow = 1:length(matrix[:,1])\n println(matrix[irow,:])\n end\n println(\"Scalar: $scalar\")\nend\n\nprintln(\"Printing the second matrix and scalar\")\nprintme(newMatrix2,newScalar2)\nprintln(\"Printing the first matrix again\")\nprintme(newMatrix,newScalar)\nif newMatrix[1,2] == newMatrix2[1,2]\n println(\"B=A references the arrays\")\n println(\"B=copy(A) breaks the reference and does a true copy\")\n println(\"B=deepcopy(A) is needed if it is a multi-level type, like a struct or dictionary\")\n println(\"However, scalars are not linked. This is because a scalar is directly looking at a memory element, while arrays are pointing to the memory elements\")\nend\n\n###############################################################\n###############################################################\n###############################################################\n\nprintln(\"\\n#####################\")\nprintln(\"Scope of Functions\")\nprintln(\"#####################\")\n\n\nfunction coolfunction(input1,input2; mykeyname=\"default\",mykeyname2=5.0)\n if mykeyname==\"default\"\n return input1.+input2[1,1,1], 1.0\n else\n input2[1,1,1] = 1.0 # Since arrays are always passed by reference, we can mutate it here and it will be mutated above\n return input1.+mykeyname2, 0.0\n end\nend\n\noutputs = coolfunction(ones(3).*5,zeros(4,5,2)) \nprintln(\"use the defaults for the optional args and dump the output into a tuple\")\nprintln(\"First output $(outputs[1]), Second output $(outputs[2])\")\n\nprintln(\"supply the optional args and dump the output into newly allocated items\")\nmyinput = zeros(4,5,2)\nmykeyname = \"notdefault\"\ntestinput = 5.0\noutputs1, output2 = coolfunction(ones(3).*5,myinput;mykeyname,mykeyname2=testinput)\nprintln(\"First output $(outputs1), Second output $(output2)\")\n\nprintln(\"now show that myinput was mutated within the function since it was passed by reference\")\nprintln(myinput)\n\n\n###############################################################\n###############################################################\n###############################################################\n\nprintln(\"\\n#####################\")\nprintln(\"Types\")\nprintln(\"#####################\")\n\nfirst = 1.0\nprintln(typeof(first))\n\nsecond = 2\nprintln(typeof(second))\n\n###############################################################\n###############################################################\n###############################################################\n\nprintln(\"\\n#####################\")\nprintln(\"Structs\")\nprintln(\"#####################\")\n\nmutable struct mystruct\n coolterm1\n othercoolterm\nend\n\nnewStruct = mystruct(1.0,2.0)\n\nprintln(newStruct.coolterm1)\nprintln(newStruct.othercoolterm)\n\n###############################################################\n###############################################################\n###############################################################\n\nprintln(\"\\n#####################\")\nprintln(\"Package Manager with Standard Packages\")\nprintln(\"#####################\")\n\nusing Pkg\nPkg.add(\"PyPlot\") #Note, this will take a while (maybe 10 min depending on your connection) since it is pulling conda and installing it behind the ~/.julia folder \n# if you want to use your already installed python, you can instead run\n# ENV[\"PYTHON\"] = \"path to your desired python install\"\n# Pkg.add(\"PyCall\")\n# Pkg.add(\"PyPlot\")\n\nPkg.add(\"DelimitedFiles\")\n\nimport PyPlot\nimport DelimitedFiles\n\nx = [1; 2; 3; 4];\n\ny = [5; 6; 7; 8];\n\nopen(\"delim_file.txt\", \"w\") do io\n DelimitedFiles.writedlm(io, [x y])\n end\n\ndata = DelimitedFiles.readdlm(\"delim_file.txt\", '\\t', Int, '\\n')\n\nPyPlot.figure()\nPyPlot.plot(data[:,1],data[:,2],label=\"data\")\nPyPlot.xlabel(\"x\")\nPyPlot.ylabel(\"y\")\nPyPlot.legend()\n\nthisFilesPath = splitdir(@__FILE__)[1]\n\nPyPlot.savefig(\"$(thisFilesPath)/saveme.pdf\",transparent = true)\n\nrun(`rm $(thisFilesPath)/saveme.pdf`) #system run\nrm(\"delim_file.txt\") # julia's function that does the same thing\n\n###############################################################\n###############################################################\n###############################################################","category":"page"},{"location":"setup/#OWENS-Installation","page":"Installation","title":"OWENS Installation","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"These steps require privileges to each package through github. This should be setup by an existing Owens code contributor.","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"\nusing Pkg\n\nprintln(\"\\n#####################\")\nprintln(\"Install OWENS\")\nprintln(\"#####################\")\n\nPkg.add(\"Statistics\");Pkg.add(\"Dierckx\");Pkg.add(\"QuadGK\");Pkg.add(\"FLOWMath\");Pkg.add(\"HDF5\");Pkg.add(\"ImplicitAD\");Pkg.add(\"GXBeam\");\nPkg.add(PackageSpec(url=\"https://github.com/byuflowlab/Composites.jl.git\"))\nPkg.add(PackageSpec(url=\"git@github.com:sandialabs/OWENSPreComp.jl.git\"))\nPkg.add(PackageSpec(url=\"git@github.com:sandialabs/OWENSOpenFASTWrappers.jl.git\"))\nPkg.add(PackageSpec(url=\"git@github.com:sandialabs/OWENSAero.jl.git\"))\nPkg.add(PackageSpec(url=\"git@github.com:sandialabs/OWENSFEA.jl.git\"))\nPkg.add(PackageSpec(url=\"git@github.com:sandialabs/OWENS.jl.git\"))\n\n# Install PyPlot if not already installed\nPkg.add(\"PyPlot\") #Note, this will take a while (maybe 10 min depending on your connection) since it is pulling conda and installing it behind the ~/.julia folder \n# if you want to use your already installed python, you can instead run\n# ENV[\"PYTHON\"] = \"path to your desired python install\"\n# Pkg.add(\"PyCall\")\n# Pkg.add(\"PyPlot\")\n","category":"page"},{"location":"setup/#Testing-Your-Build-of-OWENS","page":"Installation","title":"Testing Your Build of OWENS","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"clone the owens repository which contains example run scripts, the turbine mesh generator","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"git clone git@github.com:sandialabs/OWENS.jl","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"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: ","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"adi_lib = \"path/to/openfast/build/modules/libraryfolder/libraryname\"","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"cd OWENS.jl/test\njulia SNL34mVAWTNormalOperation.jl","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"You can visualize the output vtk/vtu/pvd paraview files with paraview, install paraview via apt-get -y install paraview","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"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","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"julia","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":" include(\"path/to/file.jl\")","category":"page"},{"location":"setup/#Visual-Studio-Code-IDE","page":"Installation","title":"Visual Studio Code IDE","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"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/setup/OWENSJuliaVS.code-profile). ","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"With the sample profile loaded into VSCode, If you want to clear out all the variables and restart do ","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"cmd-j cmd-k,","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"if you want to clear out the console ","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"cmd-j cmd-c","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"open the workspace ","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"cmd-j cmd-w","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"run highlighted code ","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"shift-enter","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"run the currently selected file","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"cmd-shift-enter","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"You can also use the gui buttons.","category":"page"},{"location":"setup/#VSCode-Julia-Debugger","page":"Installation","title":"VSCode Julia Debugger","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"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.","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"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:","category":"page"},{"location":"setup/#Install-custom-repositories-you-want-to-develop","page":"Installation","title":"Install custom repositories you want to develop","text":"","category":"section"},{"location":"setup/","page":"Installation","title":"Installation","text":"start Julia from the cloned directory and use the command:","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"] dev .","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"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","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"alternatively, instead of using or import to get access to the module, within julia","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"include(\"path/to/module.jl/source/module.jl\")","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"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.","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"You can also install a specific branch of a remote repository package without having to clone the repo and checkout the branch:","category":"page"},{"location":"setup/","page":"Installation","title":"Installation","text":"using Pkg\nPkg.add(url = \"git@github.com:sandialabs/OWENS.jl.git\", rev = \"dev\")","category":"page"}] } diff --git a/dev/setup/index.html b/dev/setup/index.html index 6d95e17b..f5b47c36 100644 --- a/dev/setup/index.html +++ b/dev/setup/index.html @@ -241,4 +241,4 @@ # Pkg.add("PyPlot")

Testing Your Build of OWENS

clone the owens repository which contains example run scripts, the turbine mesh generator

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/test
 julia SNL34mVAWTNormalOperation.jl

You can visualize the output vtk/vtu/pvd paraview files with paraview, install paraview via apt-get -y 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/setup/OWENSJuliaVS.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")