From 5a19ffbb70db4dfa951a76bb74adc436fae56d9e Mon Sep 17 00:00:00 2001 From: "Documenter.jl" Date: Fri, 20 Sep 2024 17:59:33 +0000 Subject: [PATCH] build based on 5f5c4c9 --- dev/.documenter-siteinfo.json | 2 +- dev/FramesOfReference/index.html | 2 +- dev/OWENS_Dev_Guide/index.html | 2 +- dev/VAWTGenUserGuide/index.html | 2 +- dev/assets/youtube_demo_image.png | Bin 0 -> 583712 bytes dev/examples/A_simplyRunningOWENS.ipynb | 18 +++---- dev/examples/A_simplyRunningOWENS/index.html | 20 ++++---- dev/examples/B_detailedInputs.ipynb | 8 +-- dev/examples/B_detailedInputs/index.html | 10 ++-- .../C_customizablePreprocessing.ipynb | 48 +++++++++--------- .../C_customizablePreprocessing/index.html | 10 ++-- dev/examples/turbsimfiles/DLC1_1Vinf10.0.bts | Bin 3556973 -> 3556973 bytes dev/examples/turbsimfiles/DLC1_1Vinf10.0.sum | 4 +- dev/getting_started/index.html | 2 +- dev/index.html | 18 ++++++- dev/installation/index.html | 2 +- dev/legacyUserGuide/index.html | 2 +- dev/reference/reference/index.html | 2 +- dev/reference/referenceAero/index.html | 2 +- dev/reference/referenceFEA/index.html | 2 +- .../referenceOpenFASTWrappers/index.html | 2 +- dev/reference/referencePreComp/index.html | 2 +- dev/search_index.js | 2 +- 23 files changed, 90 insertions(+), 72 deletions(-) create mode 100644 dev/assets/youtube_demo_image.png diff --git a/dev/.documenter-siteinfo.json b/dev/.documenter-siteinfo.json index fefa757f..8c037755 100644 --- a/dev/.documenter-siteinfo.json +++ b/dev/.documenter-siteinfo.json @@ -1 +1 @@ -{"documenter":{"julia_version":"1.10.5","generation_timestamp":"2024-09-13T20:16:32","documenter_version":"1.7.0"}} \ No newline at end of file +{"documenter":{"julia_version":"1.10.5","generation_timestamp":"2024-09-20T17:58:36","documenter_version":"1.7.0"}} \ No newline at end of file diff --git a/dev/FramesOfReference/index.html b/dev/FramesOfReference/index.html index 6d07c3d9..949a9b00 100644 --- a/dev/FramesOfReference/index.html +++ b/dev/FramesOfReference/index.html @@ -1,2 +1,2 @@ -- · OWENS.jl

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

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

Aerodyn

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

myvec = myvec*[1.0 0.0 0.0

0.0 cosd(Twistdel) sind(Twistdel)

0.0 -sind(Twistdel) cosd(Twistdel)]

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

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

0.0 1.0 0.0

sind(Thetadel) 0.0 cosd(Thetadel)]

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

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

-sind(Psidel) cosd(Psidel) 0.0

0.0 0.0 1.0]

+- · OWENS.jl

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

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

Aerodyn

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

myvec = myvec*[1.0 0.0 0.0

0.0 cosd(Twistdel) sind(Twistdel)

0.0 -sind(Twistdel) cosd(Twistdel)]

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

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

0.0 1.0 0.0

sind(Thetadel) 0.0 cosd(Thetadel)]

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

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

-sind(Psidel) cosd(Psidel) 0.0

0.0 0.0 1.0]

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

author:

  • Kevin R. Moore

bibliography:

  • ac_sources.bib

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

Introduction

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

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

Contributing

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

Glue Code Basic Theory

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

::: algorithm ::: spacing 1.18

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

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

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

Global Frame of Reference

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

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

InflowWind and TurbSim Velocity Inflow

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

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

OWENSAero Aerodynamics (AC and DMS)

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

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

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

OWENSFEA Structures

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

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

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

: Module Level of Detail in This Document :::

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

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

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

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

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

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

Composites

Hydrodynamics

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.

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

OWENSFEA Structures

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

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

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

: Module Level of Detail in This Document :::

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

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

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

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

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

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

Composites

Hydrodynamics

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 4994c814..9695c35d 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/assets/youtube_demo_image.png b/dev/assets/youtube_demo_image.png new file mode 100644 index 0000000000000000000000000000000000000000..50408b79a38f1a2e2131a599420b7dc5a0cf367d GIT binary patch literal 583712 zcmZVl1ymhDvn~v8JVAoH27(3IxVyW%!$yOYR^`rKeM3^3TaMh7AITM{=x8ANk5BZ#a7*9z!t%C3GsP-9s2@vTTXT8i7ixc zv{W$&=j#hnT|7Ao&f5zCo0^fxQ>D=aK{oVb5NH}V6-Tu}S2Fq6UI)CD5E80N%|HG( z`upRiqtVX@R*{aYP|2Tn_HzGFLNH%!bs`_t8uzb5_I{1d*Nw@1m++D08*nlYeT?8r zzqqXV!no(IWsT7OCe+f_A-66`AddVMFMO7;pJ@Hy!=^2TA#fMK(PI1+0fDD*&tWft zQX&6SC_Zci%2?v>>!Duz#d{fdAu$-QxK)G9_sVe?3Tj*6B{H%>lHi2=>T7%XjMAv? z*FXF31Y6v=JGLlORDlOYXb|?VnQ3evaBWsT&|IWOi%B`3ng2yv!%R!sTwWgV{U7}a z02O8hfc-~7{VN3j3IG6;7z#l6S7ZDuV)@YjR|@N$5A%O%=+OTt3ag4rOaH4?K~837 zcFvaeE=a$i|Nb+zXr-p*q9rfK1G2YeG&Z$2F=OvaCwxhJj`sg#jI@qh3B6S0S-0}zW>ty|C9WW$Nz=Y`X3}SGaKjshW;Z{dFf`GEgv`u_^W|B3T|asLHc0Fe*)|2jZvx|H0h}f5rtCPg<_H9?W6VFzyNWBV&U}cGK-GGH@}B0)K$DO zfR+>GY;CuYqPzc_FK4dz?~hz>JL8x8no*QNkz|i%_SC`>y~vG=SiGat*!>@rnMG*M zth376>2WO!sg|cUaR;&Y>2-{QYp)_~Z0zC%EoibS%a*pMTN_VWT6&RJ5yv!~&0@~Z z)??Q;t_>LCqqJB>8BUp5S%qTSNb@>avM~*M;pG~sCZ3+$h@rQAt|Tgesn`l^j90xi}-@Cw(bMnx={_yz5*?- zK*`-}sR5RZ(mA{vRwPHCYCOzQePunnNTebpN53D;xtXgNKvzDZKj+?{@-}8W!gmv! z?pM>fAxV>?N9J7J=unY}MEbfw|59>(i8n;{l}5bvPFCD21vLu?p+_gD z;k5_*N9WejIr``@`XO3&j9_Pk$)P+!ZsOgh5=+Yx682gk<81Dax%`agL>Hwde_50W zgYGgtqimcCK~Xhpt?1IBg(J)Jh>P*8om>RcSa$&jLq3;H-)V50dcp3Gh6v^_&vbO# zi+*pMJ0C9=AE>Cn>7KKdlin8V*;09Cc6Mx5R+o(wHPbI#@T0emqBiRtlr3LuVoMJW zw9NH>z#Vn7kS1X!HCXMIE;U+_MNSQkoyleMyT`taR4CF#MKSa96T|4jo9qt7>}f|1 z4-b1B99x(i{YGPJ&Q4fNajJVW;^(kgLgPhnmjF3aJh4E^A71%x+}#9HR%biEa@a0O zJ+KeRA{a_L=Y>j!_+{i|ntkCcyYB4lEK;c$KmvB5Q7dM*8863b!0dA>88k4MEcTpF zH#ZX_8k*K>n(Um3jeQv(SlZ8^N!BUy7qwPPEd{xlZcu03>@RWE2Wl#^HFJUoUR|<1 z?_8pD^TG*KE7fe|_zFL%2CAqyW!~Q14Py9m3NRfaL(DC4+BXsXb=NW# zTauoc9sDJob*-(ShM$KJiMg+9ldBu8hBd`fe}{HO7&6Gh8ROnOxO_3hg&@cyYq&6T z7n(GA6WQx!xhtbd`x(dm%rXSw}VBFFTSl}n=NjSOLA&5QOXBH zqh(bqh*K|487!j>whufU8SsFIj|`3&ToBtfW+`W*u?bcChQ|cT^ahFVlv;tHu{w2tmb^JvKqJ^o-jP4 zdu(JgC}LFikZJxjK1WbgP(ZZaJ?;n&ZUxso*u}|rdKIqlkjA}j%wFA=8OGe#s`zYC zKw`T|J19$a%J4p9eqr;t<9;{2{F(s_#33QJnvs8kJ9+mKy@;wWwoEWkz0P3+Gc zUne2!=&e%=devh!!gR9tmzw#k%*;C!+3K-*218V3-&AQ~l^>1X=&wT$SZLnh^QA(8$a?@!d{!Uu}?jd8={sch01flbTmv%?o;d z&wcs>YT$~EHl5H1?w=H$KLH6q7G{MzwB#e8%96$ zeCS^>Y`(?f+4f-Jq8dhvDw4*q0(0Z8qGs!{Z!-vhN93p09x?^Y4Y4K#BJA<1uiYvK zm66!f$9Ddfid{F77qLC>7hGOPTG?Lj&0NoOSLt|}Q6=r6G@?jw&%?<#+45PPJG_GT zQfGdX6K!f8@q3C5k!w%CN3RAI1@Mt@D}s?NC~L$KDqbq^o2c9%n>eJeOP!!yUw!6z zE`o+Wb(feD^0x-PpOb$upEPTP^N#Yg7lGHrD>Ya<&A5yMqlP>Lhlb)fD7Zy~U-SKO z+ozof7ES?v);2bBjmq7>GWSF!S|?aNZDAS(6*sErH7=;uqbEHZ?S1r1WX;%XvObpA zN9Vko=Q!t9$YU&A1Hr0g@OwVkAv0-a2b0>Is*;kD9S5$Erzn}!x4U9! z%=)>hfk(~(k=@dxHBZ5tlRwPAx^TTpff%HJ5o*z*ZpSg4YW%k|()pfg_nr!lDp0`W zEDXCQ4r&l(@ZS3S@QctoBV-fq!rq2{Hq7h{&4u~|Vo&*aPyQV0vUPLf>*CL5%=&cQ z5pmHatYSz{DbVeDx^Q%SEWL?#h}aK>qG&o zPU$xah~rs}P)vg}GSXZUoi!EY&aC@XRYB4WHWYYFGrazsbs`{3%~6-&?c6a8ZWVx# z`&xHj@3Ag0%sZDbs@o2Jdzb}2)l~F0!_-6p^RCqMdUvl9Ag>dTe;<6@le3*=k9OE> zUDEw{c!^k%oR5^!3fJ0*dT+`Jwj^ zeD^#RCO{-e3$Oz3{#qVnQ&G%~xS_0pO)NoPCL zP|KNcRN*C#sqV@ekq64wKk2Wwh>iY!O3xvQTP|k%Wtxv3l*bqoi()&iauf}Xa(Y5H z*s?EyRgl5O%#AhgL?}WMD&WjLLF~)^Lv`0k+*$f_60O;A#}n;*;*8nFCmpUod@x^w zs|tR_C_?2zsQ?^{z1d5Y1esJ;Kv284ms9OpmW<*rwdd&F!~h}I1}zcCTE-!&zQA`> zdr7EvB5Ff!Lfpx`GDv3Aj{PO4g&)gk>H^15MaFwhOzJ&6^077`q(V!GTTcvMM@%{o zMvlh#>HZdQ;o3SA>!im6Y%8AX?76m5Kfym&R|jbk)OSTXtk~*u4x|bkp&D6;@`hUI ze&w+L5mkFXbYw{H`IxhgmKfVsTcRW;%lC=a6Cf+ej}T z)tZbm2#Yu%l{g^t1$7O5^Sai3u(rE(=yt|L4jC0ZSkdq}Runf_Wavj#T0{)v#n=P+ z1BpSnSSQVU9-y`)+?9S>_Au0ip*2ePDOP;>ifb3aF(Zmk{IW_ek}uVn7@z~Cm#vwT zqd#1qm7P73d)Q77{3-B}4P*eA78MmmaMPUqz#ydkYzVt|r=oy5K?-O1<(`fCflMFP z69g?;3JZnje423x1eD~bNjJB)QY(#iJbC#FR2zC>%#XdW`6R1XF_9i*G(^keixy!A zc;Lf$*W&lgE)fNMWm{Z}J_!)DXmln*j;uZxJ3e-CTb_t%3SMiXN0+iO0Tpcx% z%#=+r?RR&_bp7OH6y2KbklXXT&xE})mCG2XDXZYP6@COi>F(p@Ms>} zr+moe6!7!uW#mSd{s7&&v*zg%?qIwsPc4tBo3VXTjhV^26@3QfV4!eKpfn$COu-m6 ze$DLIPPuIOo@!*vtgNp>#!y`hg%U8ou>iv$H?ZW1J^ww_2FQnH<^*q~9Wq`k_0(&S zo2Ld_mS0D(OE+Gd(q%CCS2!#dXJs#av%|vPX1#@YW15H}jd38Ms7?$)sQ+?c-_p)n z9)4hq9>B*?H@#(+{_v_6;;9=xe8r80;}zY5fmPqSC`0*dV32f#(N_o!H8!q5-J_4MErT`O68=Jv}K ztndBMkL10JEOS?8(1oYSHs$yDyJy+tc0(t2yc_0<F%;*1n73JyU_)$*=36qg zCMF={@M=v&G=sk@yK=x|ZCP^F5=e>D?_l_DzJ#1-vyI5~HoFJZVM9*FOBwx?O zHYn@2U-jE$k_d1DeOC*8pOWq#bu&id8S>FcRqD1eMk-7q!BfTi#6ayHXAwHdD!P!!(%NM#7ib&&N6Em9Kz z@wWHjQKxY1NqgmU0R7VLBR$ML{WRn_cOI_hSpi48-QY0F*$Ya@;tP{k;QMGF$qBTf zlx>l3)a}jd8vT~Bs14~FPL6HP6y(6;t{v0yy?Jzu7}@xQ77zGQ-I#v3lSN_MIMz(V z0ckbEaltvPWR5z+!&|~y?cf*`a`(^X;=-yU<{_O09I;=}7QhVarozElok4Hyyt3^o z`g1=J0K9PypVotD*+w@Bs&g8>mhJbzeCcJR=EIPgF)`#kf?$O4l8&?=mx$AbBQ@-5 zMHMB?E$1S!E^I?bA)}6u%M^~UB?Wl=?AY`8LL#YrRkxx;olTx)<_!iar5%syrsO#r zV{4n;-tLLJ3-VKa_xe3P+!t-Tu>(=L9y<}HbNfzxU2l3H>lQbVCwos~OV{Ug!$mwM zZB)a5f3(x{^C{7=!tl6ZLqp(1yNkj&o{oq1@VzeF=qVa(t$N}Gc6-&4bioDcVV{jR zn~}}gw7Q$gyX$)2JKD}g>ywgy!75UT@UuRRdm74N=FyL782k+2$E7F8XCI1lEGvu% z)%VU0njq+aKdxpq+WPZqBgo3RtuF`NCmqdDUGvcU@z!9!*^{1=6H}Jw$HQQ!{oc9x zc5$nM`&=aWT*T$LBSuix3F+az0Buk8Xp;KePD}3689vFJNPA`pwX8Bi| z`xWcD!KEdw$}q1`qp*&SU+z$sG9AARpp#mFiVM?+zLTd}AE~{%apHShe9yuW-h@-E z7G)MYe+x8=rshcIOD8Pxr{Y81e>=qH^hn|VGZoA%-yXG8I?)jQ<66)Df*-O-d4^;K z?ioAvxqh4$L#-|@w03J;ljbj&SEYxYCVDnb@FP_aWpsWf2@=}ZA zHS)}G6VMORTH&w420hW^6^uC-@-htfXiGv+{MrF!N*arBy#0)H#+&XgWH1HG;-)8K zL|)eF-su8}ik!xuSl(0ahOULTcBT_(=gURJ1^m;DBFOq}W?am1hiNUJ^sm{`f)e_Oe zFg6?gm9Jwm?k2*aO>0&Rz-8HUWiQe!=kZiQV9Gefv{7IsrSQ+d7E!9B)VQroVs?3N zZd2<|Dqn+TolNiHtJTUDgEDT8@%cfsEn9u>Qa{q1q>wFy=Yll^0(tV8APxB&vQ`}z zF|+X{CC^nGu*jUocUQUWCv{c#84=9BI2wDfFe*&h*L1H{?Bt{WWev%IC1JP23pbAL z=sAB=hPzE?xXd01aGGA+#80Z`8?bur1pI|Z`%OSzM@Wq?X0m0OtdGagO0tChw(5O_ zqZL`pa32B+2vSg2i`3O2ymH}23waCpRutv9^Vb@0w5Wjz^wP5-=8f4_`Y@nkv%H3b zdSM^=!j#&=!74C_e&m2`95pP&Ou11rIecY+{DzLqo8f4uu%<^$Bzq&I8xi|=JF9>?lUOo5=x{C zVn`~Y4pt-=c&supdN7q7AZtwCU&!tem`j3$2lWS+y0E63!3&Cj z2kJs%6>LHf(i5Ok)}K-KnuJ(=uChE1S2~pSE0w@D#G^LwX(g~h{bxqYNubmRu<(<+ z{MgW!=ydpN%lbSeBI`@BZt1bYzGjYqa1G>|(ObV^m)b)PHKyG%9&78KA3aNL7NRYcQo00fJ!)A|vF`_M z{#&`}17@ZL9Hg!5ezI&W2=KRDZ{cJnU2KJLdPsQMs?qi+^$2YaH9IrSA|g=42>i%F zES-g&Fp6}~CZBhaHRsa%)}3u^*xoKG-2_Q2#R15}E~)ToO!cq;I0kbjo6P)(@17N= zRW?>_YnFa8bcj<7S)Mk0=H)unB3&n&1T;Fjc!&RcwSJgE0h^-M&yj_>8##JvYy$L7w!5m z5t+TEx{?-eMR@jReFLvuH;Cze-COte%Z~C~Y%9@6HezihFiNOvSh@~rzn5RNSisAL zt#H@Ii3rj~*+RO6k#&Dh{_`^4w7)2lXnt38Qs(pnH|Gq@c18zRvsve#z@E^1!Vu2b z(oA{pelAS9geIBCjZbaJkNM|t2r8tSCfDaOos!A{es@^=e7zZShGTpc0~!3JV?9tG zq`Cfl>Bh&*DZV+h!R2?^+~xtV^qGW_Uj|C^adTz4r=Uu1m97GynEq$?YAXr6dwn%J zU0<9>?rQpFZf`UCWkMIBkW?|gVA=WVH!E;}X+t3iG<6_C=Y@C;PeLXxO}M~8SSLqf zKwEwh>}A!>Tv_nqEcoF3nQt0Nbfc)D>Ix{R66$|$ZPef7Kp(>h>w8Bmo&Zxns^ zJ9|z$FGn8xxm=EvkiUExTHUyBc})AbHl)(No)vtX{XD=G5;mmxHm5k~|5o?G9s_ar ze{e4wWXeN7LR+f$hy6ix;}cDL8%k^MzQM^Djzq?PH>c|O`gnEwl*3Br|F2TA$J{j7w6~lY$nSst7;$7dGZIepYAk2P7LK; zfB`i1PmuTZURk4w&1YSIItDV&kL^EUv#z#0FSmgRBvNmCK2NYw)&BPu{;4OX`Zuqt zUth0sPbnepfohX}=7Kp*ux&1gZ|LhS7P844=SGe{xHId$D=Bby$LN5K=>lVRxVJ^$ zaEoEv=Q(rFK&KQaV`F3Di&UeV_~%C^qeoFE@rMQ;Jh9LO_xFw6fypO|ABQ*3gmr_u z+&-*#LQpviaKgB&vy7-XJfrkWnb~FI^2>ZR`48s2!c%#DMlwcpC%ugDGMd+L-AK(} z;o@i35ZtZII5jHJ2R(fBhJuyCrr7DR?d;~Kuq|ovo3SDj*W<$tsD$9OxLxmR`bM_- zbgKxq@(yNa76v2jsdF)H1dU84cO=*(x8Y#@bTxTHg$RdIb-T1^%P>&zDrc)hJAFmJ zR9TnMCDiJS8h!6#a@{(a3mmG>wdHn}>2AE1EX|dd5yqk7M&!bQA2Ov39nu=UAdHSR z0MI5YVB_|`7s^nheir*|x_wEE`e*9C(bfD*RK(qpr6lKZw69H*cI2ereMMVzLqmNr zQoY3ZsZ60;zO8fwAA7PHvt^p2l?&AhvmD38nvAo{E*A5I8a2vOjXdE_igS_U<=>lz z?b;XB-h$NQKjQ60j@x??ZJ^28^6U;Q>i#~5fgp5K@tOxt3&wXlZ)$+8`N8vLBp2E` zOtd771iw)#e7>)q(b#GyL6L>OWHR0O)eHy-ZjZth`Yk+299G9l`|X>+8?}D3pxYU; z5J>Z^-_~jIV02oe6Rl(g&t+dLpF_l6)&nahZZ~l2hp&7+_}-i%JFa_kQNb>_ubEib z`@{EPXjMC6soR2ytgVgBCD7J4=ZetqS<F4wtOa9yD?t1LI(s$&Qc+8{zi(ET26}VFrasO3 zx8NWtsRH~toFRSWgv^vMZ>i~=rq;pKw~|GJ6f6vcJ)#=doVzp2)lb*|jpEL?a>Yl- z$qt>k6%jsKqx-Yb7W(o#0$q$oDbb;Ad0i6SN!_HO5J_Jy)yWca`FR!nx(SmT6u=c) zul_P7@b5j(n(bkJ2AqKC#IS>X4$Rq*Zb8D~GXWj*mp-;g$qeZbwacA5^n2&j>v#Gl zmgR^taajZa#!V+86AL>}1j2-zP6P1D8#lVMh;UI6?=A6GcwLAUV7uLk1Xz=|2`oXC zWk8cXaX6x+;{r0q(86Tv@h@_=m9VyWsVwB`+CkmImy;00=)yk?T@VM625hK$@EY(D z?$R&}Lg(ftJxVvqmqJlkxnV#QH1;{{jzA;35{m2QfZzG_68|aKTt z$9vI(6OPf3eqwX3urc%E9|Ch_H~gUUf*Ec;iM6yrVa2FRf=J>98HMT)oqcg0EHzz9 zK$`Ww8L`B?smTMUQgc{M~n%wrJfplM2p>9W-qv)jok=xAM z(4qzK=|9mOAOF%mo|zEw_|SLozR*G(x*lJ50Y!g*Pn6>I-%#V@RB%{-44=9&tjkD6 zq%Zi@UsS@!yYr-ecKE68a`$U+f*;25RKIg6h_kOnyakV)Y=4QdJlj4WMPRny!NYD;XY4ad3}4RQd}YY@(ZcD|$d)nGmWQ=AMll z`+NIQxG{r(FXhnqQRYDxt@|wkT^?CQ_STwR*8>f0uv@I$J0=7Hk|v1@)zX{=ZjIMGsVm-fVsk$fj!b zI}_jkZ4kkmTUba9$P7k6r81J>e%T5}9h%7DO|q+=u1@<&7Q`~|l$a}ISaF**R{)m< z`<<H9XR0usC66{cVU^56dq*s=WH_X7-%GH-goH=P$6GJ;)4rB0 zFx4#gJ@>Gtb-LB>w6)aQ%j)FbV60?vc7k4|o^dnSV+0bP=={ z0AoghZ6KOH>kv!y*b-k9jRXT8!6;TD-shy^pu-q=EkZ_1as}1u%Ebxf{($cdR>P4Zepl28U37>8>c5p|wfsnaPDt%Y=W&$AuAkk2hw{!U@ z5o#Iwi@cUX@%D{Z~dDM8#C#-d_G{z`@7-EO8F&e3AVRQKMIH3g~wY5 zv`YmSDFYjz=w;9^!b@Z5V0@IZjK}Rq)w0$Q)1ZvfdA8a?YcSm;S(le3 zW!0r|k@Sg5nK8B-@kduP#l=Zy&b)>Y$4Ti-RC%$$T#}#R!093K*h>a(ZrpZ*<4Gm% z^r^@pRb-D-6l_I5l`tnX)ihBuO3QFgvA(X1qdPFbD1#xWy3J}z6aRzq*#hyoi;tO< z6?=>Z&$#x7!SEvwsh;u0@o7ZfV@6)A{w2U{UDl2S&-)7z^P{9x8DzJoB5djb(#{j zYpp{FFW_vOW?csdC}VFj#vPj*xmCAlq(ME$(-^CWS8-5O{xBTCLXf&IOdvsc;w#PJ za_zsg55ku~Y{Y=(Q7eOem&~-(^AvYECxZk;t*0ay0Xsq`pHUh&Vx~odpN{x_N+gtd zOpKG{WTWJ|=@V(zjyNDkjL;uM4OCrl2%Rj7o#d;W9RS}BygZ2`Zb;vKldw!7+sN=;8Zg$5Hvp;|Nd+f-IkZPXh9{yicgm=pfch?HCLvgFXM*I`>88$L9qjc zQv}jY*tx^OC;70}O4s2I70SNbW03yu!#;9={ghaI9pj|m+jZwR9W3i*Z+^Nz6qDmf z7_e~B=`IdYFhNPBHYp94tbJet&Mv4u^Wa0@COE$WsS+AQEX;^}CTXsLrN8FeYwa`& z)%#)xD6Is)Yr(7&)q^9p_f;nv%{u1ormE`o*&UG`Qhl}vta}*# zp_d^4OTK=?wqT#!h>1^!N$3;U!w8N~fH6BKdQm}7Xfnr)ca>wO7+*AQ2Jo4&z60n` zE7z{QP90}anC*CRQbG2YoTdo9y8p!8>>l-P3YC($-@{4prAd$wnwR@8g+o5|07V=h z#>ZaXYtmAWulF??kJqgwbnF`WZQlE=zl;I(!Hae8z4d3M@Q@ID z=5RcF0$<~TqBnxJo7#JcNc}7niTG8*!Ken2=P=z@fvv6siw4B< zKR6M>3`NKp3Si!k^WLpaUh-at^W=Of>!}`%ND1<$YxJNoVq=Wrd{$0LU$+o214<8X zdf!?7AFng-v z>~{vg3azk_34lEUfXR+9#(jDN6MxxQEb^29XDgDRL8(y+;{QBkrouLtx_t{iX^L47q{Ct|pm1rojo0Ad{Fivu`~>!u-SDymHD8FXlm^X%cdYR5!Gb2~z$8`ifM3@>fqc z*Vkh6(CW@TLVepxFBQ=)@>0u0*JU73*K4PR*mhda6j+sOVrnArQwOwE4A-I{hxX`3 zLP4O3@WP~-SW{Q+(X9p=bAv38fA2>CK|vaT@7Hxhw@H(`HO!I$BfW{x@v$1=SJNU^ zJDggd5$u*p!KD01ZJ#>BaI&DjZoEzTD%WcKdvy&02$T@ZH}95e12Th#htr;Yx)E!g z`CTdAmKRskR(QYyyIzB2A7|OeCnwSpMTi4g2}IQ68o}Ta24L4Ih8C$B3&j60ccdJ` zxq_i;$Qh$|Xq@rfy0c9USchQ(ZMeFiYKkYuu_mFEF-^{D4 zXk%IZfkk49N)Kb40Qk{Jr3~ypa{Rd=fB< zT`jHt%eKLSJE0eup}fvg0pqHDu)c(oW)bcV|7nAF3O9#vwE!x;+b3pK&5{5>O91!j zGP~T-@Fcvepi4Hbhb4GVCTwwi8*G!!mP>qN-d7Z}ZWFBILbz^2*FN z8Jv#$FgOboAesHsbT!i++z?@_X1AM3PBntjph-1UW`t!B+Y`9eXd-Rpxv@E`GTNk2l47?5+A|rIjJKu@ z^iRIm8CJ&+{?^^fZoINMV!732M6@+8enZ8w?_C7e?S*ufwQ}8lGVBViH1Dt`Je}eF z(~G32y>Ed_KDzE~cL0)<@XukKicp?Zg5!I5d9doVB6da!2JU`(K-Zo2PG1C}85o?NrwOx=(LjX0>-&aqI=4H8&$p-8r{`310Z1 zCfxE-kw|u$_>}uTRixH~HZ;}Xc(p6r8$-E54O&Qwgl~@Ri`R*{a?jZzU%Tsq`1e3P ze*4C&(7fMS)&mo#-M%2c`u40EO=8ERh@^ndG-aaWg1xu+!}P<{ZrP?`yd7%=R*?rU zbY@{s>i2XntfXJgy1Hw<+Y?7rfVb(xe@PJL>W%6FEHN`F09V`mEb%0vyoEm$N9ejC&{tqD}w_?`c^+O zG%|E6G zM0dr}#S?|5`SYExC-JY$qmNBmOh439M_Vmd+&66Q}_ycATK?@ zyHN{)n~Xhd3ZqioXy3Z9D5Ln>D~V^uvajHov|rBr?J2VwCs6ws`^WveOYd*J9}l~O zxQ595?Zr^t?#QpFvIH|Q!(1v}D9iAtHL=u6X6wY>R-;~@c0TDyQ=j+;vDrP$Iy2Pe z^(9Vz_VTPFQ53KsS=hDkJFrMBi({(`iw9(Gl>?zlVGzE2>${r#c%4l8YGb(Pxhjyf znG#2Jqrcwz^oEZL%Onb+X>h0pe=O~ZW%GK{-`9s5*x1E!pN*s2)R23v9|YEXw#+nR zR`%6O==|ATb@79=j*(h@i|SpA^ra(MpD~6y;DH&uX#EB zSE6xb+Bh!z_Y6;lGxqy|8>lfUV%f57yGZrr0TCRjQ(xe;)y4*dC>uS0ZnHSDM}AU% zNIiaU`J|O}VFKMjzW(Lv`~D$rv^oHab-G4~HJ5K(%?Pp2qCzGcTF*2?wnF8c<_{9n z8hVC$%gmX?_HMWlfnc!!qO1GB2OG1nSm6GU&dpz<*T6bTpah~Dgy%9T2> ze~Ryc&TVZ-%C{z-r9_q=Wn)HJ#PgsIq_CmGtNgQD zy$3vD-ae8l$)udgb!}HDltNd~YywX>Rt`0&Hkc)1&U^y+Y}R&P9hSv`O;a#sFR^I0 zD>pW!l2Wy#Rg<@-I~w;i zz_7Ghu!-X{63bxYJuOiquVurpy(n%3hm)f4g4+|%6GFm|Qi}&#cT%V$X#j+59%W^c?`G9PJkytR@zH^zmTVGLeO+q)GIC-Kwr= z^5gFi^O2(>g;4;1jLkmCDL%Ml_Tg_oMP06`F5w2+*d%qHPqY`Fnjc&4Hd`E$g~GsB zzq}lYMiB?A(=(J2%?6E(i5U98++UQ|W(u`8kLqb@@rUeTTg~lb()U{<@ z+eU%MF?a5V`V#}e#PON4>LWEC2$*>mei7|IA4UrEiNm`A zl5UOE`>cYdK(A!;rl-&lA7akA=06g(KI4zaiwWzCFQ3eGyLNN#TsYpXM!2Wy+Y#Ru z!=o90_3?7SDVfN-i=O5^WjZSg%5Eo^^=g8kwxumAdNO zD=#mwwXwX^&LZ9bMzKtxO_)9T1sZr4TIS4^*E=GwI`QH2V9+}7spD@RY~`z+K@buZ zib+2liV=!MYv*4uTfMwz&-HI2EGEO&zj#_&_DJ2{B%XT-zna0Aert`prw{%g52C0j z{+M`=4-T-};Uo{2&jtzbLSuJgEV?7z?D_h@=4?}lA zkWFI2d;Pb-O7y(PJ>2EQGnR22ovmwYcz`)fH5J(#v-q%v(xE8nvr;5`QCNy@>lrG{ zzvWlJ*b?`O%238M?;!Jh(jZ_cHpxH`-o}ldIE(1h?M;k|0`*4PYyybhmg~UN@81EI zI%(^kt^;3aCc8HbkH#LaxliRDbq(3k>wD~hLYpPRt)Jij#=S~;y*GeKWZ80ND2B<4dnjMJ}2e)G!e7 zQTA@PCzcsw3mMEf_Iz&|z>BX>ZBww4Ld%fA^nQiWc>z8|3hUvF4Ic!iCQa|B(ZpjZ99Fl3zFHk=&;xv zSu@WBjr+68rQ)95&T{`;n~H#V>hyG7ji7z+xYcNli(k60f8G5P2KV4SS91FvO!=;| zWD*d~JEGiA_bbfw$7LJ*t+^GDIS03ag2e7;D|p`A&6S>>(T~En>~D6wi?W)}CLzOr z2h4h?{GGe_aonHRi29LG2ZKqws1KBV4wSC-Vg$W+OtQW9_2@y#w@BQbi0L{xpHWjX zyf|lw&Ki+aRy`kX)L*5z6206T&LO%NC$XpkOX!_m4zvaW(!NTukMe1!zhYy{z|fYZ z;30X179l!#Kq+oYPgj;_OHEYW={NL=;IJ=4QIp+xFAr-3FA!g@*t{p3Uw4jcPxpZy z+mC4=A4j4(66jM6nT9eeq%z0x!BH=aWP8co8VuQT1~>cD=*_n#YD}_-b7?^pvOB4B zUE{4g_4>S=bVRoo9*gUZr1oIegHNb|BNY{AKPlom73Fv1o(RKA$S#Em`5MH8D2T&k z!(_q;BEGZ50OAPpQxoDmef1Y!s{0zg*v;Aq2hK$)!W*yO@W{5dG*l*9|B+r0#J3D^ z)Fzn-i$^VOzqKPAOt9BlZ$Q(PtijO`a8FnN zq`Ox6F*(2g6fO;vjVm&w+kYq?tDDOR+6!Ew%RMNXae;yvoXu^q+Z^G-GCAz4X&WPr zr51d^xX%A7@WLCH0LLHULxbr~M;ad;wUS?zG&_o|*?P@TsKwseHi$cjEpL(gG|Vkx zN=?d1d7R|CS7#j3aG25gTYPU|i?R+5Y*kXOhd&WhPKR3eOor0Qs=7Sb%MO&-4qn54+3+c~+e$FV36ZpMMX zrv7K`?iOtJCfjh1-D4-M`({3Tr*svYJ}kyZ<>|YpYQ{a8_A-)?|LgE@YUDQx1q;y^g2di0XciV@j8K#nTZBRNL?Mk?lF053RJjr0#aH zUQ%wKpIcoZW@c`J&WqJtlRFO)J&H1Y#;>~9NzW=RST@pBy>;^=x4WFL7A5nV>8b`N zoY_~I_B4aBQzKSooh_(CeG400iVjCexZCR<=Twta6)|B|5xpj2 zz^3_ROs&J|5ZLZH*&h?LS=F&OQrtyyEc-0;))Tt>aSzqG;0fja487WC8^1V6JNRdV z;vA5~>!_eu^vD&oF{E_Gub4_l^UGo~_m)wqh%?0OsA1cFC}H|WB!2jHeW!9U^4X*( zzVfSWkJs}7A1!bD%$SVz8=z`@R$qPZ*_Dq&-GjNi;5<^f8b$y!XcaU17!R zTmH?{q`$x$V?be9wC_pkw|)*YMFoV| z@+eB)B$#1Rlt3vredF%m>5T|X>YYXZx5Zts|0@{Na({uAKcP#K$MOFISwN=0``SPK zr~fp8kmg|>Y==OiTL6FecYin0cVdv8~EifB)X^{oYic|L`CFLjn%f!vw;N z%i~r=y^Qqu5y%vb^clA@+HcaQb&&Sls%2d)H*e3)^r83IUI8W-Nt*Ezh7%zNh{bte zUz{Df2mm$|;~bt-#gN|2;YhKyi6P+;{gKEQacevOYebVQcl@Dg)Zp!!WuhH3?U#k zhb$ZPCRb<8Qe(sbl0m2uE9FtT1a z9@PuI0D!Rag+l64g~_7_50V1Rucx;?x>{k56ad|3iOBu1-$s;^;>vaYI{sjDh%$6F3uXo|9IxpqX81-!Ps*FbSD;BL=Xb1hk%x zY}bIPr(g{~J0PvR*8gy2s8nXIPMP@SFIufD)>-ntI)z)MMd`nioH$pSoF4K1{7Qb; z+VA;YX)IH|+-Dw1nXxwM%aw<1izr-iX&TR_VmtuI)73B)`*(NYii*-wn~sSqZGF9t zS29@RgTl$vr}ASoWju))B*hCiW={Be?ckZ%dY~uTT3Tb`0!OirEXJL??~UeNj9FEn zCGRVS3}zz|uiK_8&h;s8Z~e9GGYppxoBBHAZ4d5=Z+o~oc6FVN4x*kk7DiL<##CBj zo62zjs8R=BHXLDmY3gKf+K~%19smG907*naR5e%wTez-_S2l{*mT~nJ@1LHSj9>bt zUyA?ZfBPHp9Y6aM@w>!$nFVY-jjQ^3PI;Pgh5?^m8xiBidOTsoW|%nRoXlZ-7( z1jS^WJSKN$dMd4|NOQ&H;s*eMab(OIbsM)*)(etc$;?Vz|F6p2d0bYzyJyqtmBJ^V zQ||jr`$APR`0N&|0tR$50n0VQ)4Zd8wnsslZ(Fmp)ore?LH1mB#Z#a(0-HM6ZbUF) zUu;%}7BnhkM-8|rE}|T39>U}R3-n6M7!aT`%+TOQxwU-P}Wl-+3?=qTdQM{#+(YMD5`8~0J$AP+Fg$x%+I-W@#5vUG%|*_F&2(i@I)^_-%qj6#MYz*N!u>1a7 zV&K;P6z?h-wDgt6zuSD?XmV@~u738!Lh1A4sEWEs*b z^pRgm*T2y}W(My7d^&ODEGxFdaqhyo*!SSx*mUb=e#<;1QXfJvY2k!+Ta)X~&u_F^ zSDv?iZ)$_DDB~GO(a!5lN zeF^f*#wulWEq&Oc)Q8MX^Ox>QDy|fs{ARem#Ny4+nG5mC(?{a$%a>y65-al4oEFlb z#c@nor@39%KdURBZo2*-LFWQOd>Lf5hZWNuySBxB58VkLo{96L7m~+W0W>}Hx6Js) z68r|=@-#HcyF?C2YpJWt^^47_&%D(jw*C3s^9Qe~JLLwqpL4)jK9qX{c|8Y&obUNP zZe{uTpa1#z#b5lz#0T7ps!{FMA$hO5gkBTUwJ*!@d4URfo`G?VH6tjXv8{pcec%86 z-=92x^t|wQPgwfsM?ac8KJ;GE5O*t>TWoRw;U>D_FZmW1LeNvt9~$s3Y=qYo0qyj{ zcQJJmP4h5-&(QCGApt;>czzmxQ@~d+&$vAZm23f-K1-gsjGxoglQ{KW`JV6jp0o|l zzW(GVKbe3Q0SfhN0XL67*ZV||6?F}_em(NYBMG2zob+%}=M&Vcr;8hPR6dsZeSXgY zIJe~q@aP>Q{dnEHrJ+1YKe^nHu6!v6z2D!Ahhsjy7ch!n%k`emh|wE zu6#+e>X3p((x5t^<$I6$dyjyPboo<1^;2nEmi^`L2DH`#>c@Zl$5T8i!5zU$+oC6x zL8brUKm3O&Kl5>0nLv>Fu0@0PiPzWa*StTZck|!2Z7cU`Pe3C)-2sTw`!#92 zS9m14xiW2?8l~&pdoy)jCyTc(zsWt|nCPu@@wJNy%c!!jUT$#5f-+V+C-c8_=7I6#00W}W0`#bnc2EPD z&@xX})tS_3RUf4wJ9-(f0)ke$8l-{feF8mhwOC|-bc(Zz;nYZeHIS)kjO;3bQI_%4 z>B9xzNnZn0nqno?SPr7LMOOYqtF&OtG_VarrOY*USVEi_d6Xmn)%aAIaI&;vAZK1C zuF}+#xT}RKG%6spIsL>R8|EJ`n#m1P(mPh)!(?)WO8_U+OU!KTl!{&TlWoWfryW<_ z@Op(Z_kIGF;Z(DOAd?LM6D199lo8u6GMz@!tky{~Imgq8_>UlT6h6x^OI^L}NP3fh z00qRH_{?K}81q|jZ*Rlf=lopk+H`w7wC5doIuH*8pe5_LRPm%(=;|x;l`isruWw80 zo0WR`RB9PxxtYDv2ewnE&Qan*pTtLL5=9b#ksB5ezK3z0{XlkqS9#lML5|MTbL-M{d2arxqS+o8H3B_e4IWv6lczzPl2{t2{_u- z*Nx%^D8mCj=ZSEhl=j-WY*kKS=y>E~l9#pC`~19dg%D^f!rv40oQDm}H9g_q20k|QcB8yVdzm7s5}|^rK-XpWW|FJ;Qt%?^_4L#P0bOyO?`h#gpf-#R zf~O`uC7T%1lqVMWP2ks2cT1E0MF!pMCIELCK4DP!X+V-CjwsLKN@O*W4)f&dko}_q zQr|z0nF7+$Y-JUi5MeULSSChI4Zx+sppU_iILL*Q>xjR@eWM&TJ`G>vLB8pA#fmJS zdpIep9meYvU1H0?D1BVWRD|%8iCjLs5Qaj|&sd;q;%Vq^adQo!R4?K;MwpOy% z5F~%(6!t!!sOL&^65k)^6t$kd4bi{3KTcnGjiCDk-p2#V71kz!8S_YgQ*P1MUhxR$-^^sLzeTEyr@(o4J+XhC#7_B^|E2OgP28(fu0=X zS1`ys_bEG^m(HQseaHs2@4!DP^bFJ~uAr&(Q~PhA+*S3ts^c{L zlN7vRe_r+2sw{8ns{>J&%ujs+F_(4h%5SMQEBE5qg$Em_fIfXR&b-7b_euEh0`r6b z>u_4ej7OcA>HhU<$aOqnnD{Ggl@@?FaWAW}HDZi$ICk(<9C`LQf!v4j8ZI+e0qQk; zSdm;mtykW4o}jOr;Tv5n7!BUOJ#N2ucWm9o@#=tnI}dD&!CP;|@k0;Kd`xI7lVrm{ zH~K7dGkGYX4@0AAy98BG$yRZ+3sN_%Q@p&z`6?|dZ%oc5^#P4%7lPzF>LvmM-s8Mh zhH88(M}PU3fB6a+<7q_#JNdRP7w)`Y!_}=hIUtnFHOum4J(MRJ^Xfku7|zv zc%e~m+!h1zdfn|k9&v4)9^b9Mo)?z!@sEEz1&`JcHCbjpSJQ?6!GCP8qm}VijGOrh z^h!>!RB1#8xp>2-+ZZeMQd0q*6=+w|BKGJq_oHFL12RB8EohOSaEffv&+ouM#+18 z`Ml$4QtuW3(Q8IvPTCPbk+$;sd7pIR7`y#R`uNZP`9CN6QqR*H$Ay`pp`rAUi;(^{@@Q1(6MXRu9VNC zk3O2-1;qZ|-}`$BD6?)~{NfiANM<<(mG%TML7-Eovf$3vBhS~i_nrtS7F(;~a}@o;)ojR|#z}PAG#E9*3ag?wFF+ODfKd7&RI< z0vGcJgOz&uQ3W9dX7#INg%?f=EWCjD2R+hd$gKu?qNKtS*rUPXJ~DwIthP1+tb&-P zpg{;xmF*drp@MirXIJ$1f@V_oEamceI;z&-iBnT}U1+>90p}% zxD!*?Jge-yTb*)MK0TX$|zciUeI|1}HdDz~lt zW|>zmc=3j*5fHAz;Nnot2{5!3prL37Q5A`R_21uI+>_zIu3gi~Ix{BfDR zf@~5{YY{`a6{ApZf>8wVFamK7j{(7qsVTfl@OX2j#jTa6&zu2-nTQJ`mk8#Yd04Gg zUS7`XcgN4VOixcH0BMes@jBR^q=0ox*J-@B&Lg0PM@9hy0AvYZxqv55CtfElWlmS3 zOa;3u7AmOu3S=%sSC^N6_jmp$VwoqlLOP*|ZJ=EndSZT@zL;QjN(!QrH3W+Yy=_zC>&;iJRYdN0{{yxuu>g=bJ2x>1N-;K&h5Kn2tYLR40C%Jz`gG9 z+~|FIa_n!E%-h;J%iQ*(4B$^RK&Oq#Q%I+Kz>hUDLY0nAgi;ITv>`Ni4{YRFRy}5? zp^s?{nWI;px~aNQ8C_wYef4DAbK5O(U~?bdD)+_c8N3nMTGukLCFp2)+;SW`3i!AeyI#Kj)VeQMlK&gL|>`TjXubCP15jsWSn|;r4*-R(Lk(pZ?EGmPhW1()+$Tbdhsiwn}5vi`9R>FY|F+2@=2YuoM1CgMsC?%ExJIY%F)xsU-P z@-YovQ$CjkVodUA7tivf7f&vqea3dFb7@Sw70YBE<}YaDy{3HZE#KdKSHJKGb-{r8 z`s4wa-GZbyh4<;5;e0rQZt<(X`m5=)c_=$I=6&A#^7hr2nJVxm{Hf3T4Q0nLx!pl< zt~z%qnikG*qU=^85TMVIkt12*1UBuOqKh+98w&$X)zK)mFS1Sk<~Z5E_Tw8#`M3!hxsYgC z0yTniZXFY#6Yz2T^D@m}9Zi72@-16{(08A&r$u8kdC%&)<#Z*m(x# z(0r|f_e$@+Tc0li@wp@ZOxh%uf*QQ=j@&>LS}-Uv}Pa-j^poo42n# z)&K4_zYAswx|pYBT3_qoX-L|%Eg#U3ytj!tS;ix;h~3=WL(IZbC!kMX%n%PU zuvJ<(k-4W2vAHj1TflaSAY6=gCWCxe4Z{ z@oKPSw=5Wxv=v0vNpD4GQJkk>R%5J~F0zWAv0H_CHo;t}HCV9#%z8$DB77NunpU3Z zl}z!;S-5?0vs1)QT$xaQSTFIDF@@};G_je2-d?Y8t@o%~bVTX0z>O$D^pCN8$UzB2 zjN@4Gk-12^ih|(S{rBCAVc(X)r|B?aongQfcLBLC8GiGLQ}(MMrvoOB}gASL75d^1SPg+hXUY-uUXLUjZ$J z!LstJd#@v)8R4q*T1ncKhMhOQ>XW~%PN|Muo}L`XAf1X%Vj2msED#r~g(Kg4yZR&n zJm4k~6o5a()oMnWou1;9Bj(}EG{~*i`x{I$2dkrUZXFatDhGN}=p8bT=YrcQ7jPGC zWDH9vQ5T2K<67Dsog5Wes8L6NT|GNgXyg^9ywBIGj;9bw+f@|&F}BCF8GmNmM!ZZq zqj5(u&f?}jO`9|T1XI#bQ%`$c1}FdN*w7uDcA)gM5<_KSDn>4j64VYaDp;ZOBI6az zo4QKK@Kk12r*s$f@!kn&ahg7@si48fWDDRW$>7amYpoc~+?zdN#i$oeZ$~ie6WNBc zI0o=?j`5q}hity)rCR>Abd&d)#*%>FFh~CKAYUPq|5X2 zGAG$^T{^V?EUU_Quhn!V@ZuXvKHwbBc#g7Ucz6WQ8C+I5oveNABKZ>E%h*5l4N6ZT zk67vI?!+62xmpDzm1C7@qerJ-z{5vRHaU@C>{@e?AFoQzk7?$?3r9}JS6)6EoA7?y z@Xm*$s}qk>=3o2Z_6W8ix*hW5*-Oj;6n<8e_4?}Fygho(L*saX3H~HHNJ8E5_jNUI zxT;{j*q3=7a~Jvi`|5lBo{cko$8+g3C8i;#4L+CnB#Q(s06kS>^uVZ#oUAr}wi4CJ z3%uj)Gb$j%(bxl>7)Tg(kUKuR2~fR4@2d(=Jbq=MHK3PS=5$fVRq_U6ug#8D;@Fet zq3OxEa6DDjL86#tL|9$i^iC>&gdwcuW1V%pxf9G z9(j1q&0koI!F%!WxOaQBZ)k$IVK~!RdB>ZT1oJ$7(m9*FVjNHYsjsY_7>XD4@;l+4Zs^4@Hb8oSgLl_7az64LHxV@A3fbs;}W>+qvob|BeSmM+H2QFV=Z6kQ6}bfvJ8#O{JT#plk&9IXP?OpY@hS_)k$4rb@E>8 z;r18&1ssh4vjGF*A`+D!{SIPhvXWUXJ;Ny4+_XP&>m`Q19_bf4e9x=!`i?Hf~l8|r`e`s#8l)B0HtUnWCIxaI!xEOu8M8eUI%`=q_=65k*&z9*?gT=<$?}2A086@JtF_;5iivqdvD1(265y zqA)|{;IA^u1(2u-lyqY|v=Q$^0XvHa!^p_R7--#2nJ@$taDgU23k1!PZ-o`{v~3JQ z+}Tc`tm)hs$rRWen`zL8jW(>G_>H!tyr{c+mbX(il#$n;5}>$o;sGDxdD|oSuwJrX z69|79sKSBZvzcUxp3|3#89gYr7{%EFeHrfv?xs8Dv>nnrjzy2HB%Qt z1;TB&-In(HDcIb`VW~}(pzrzy% zEKuzd49);n=G~4E?dt7E7lqKFlZ$6?J7r~Zy=vtG!aBL?ETEw)_4mwvPyE1ld=!we zF}`^Csd!}nJLAYx$LJ&UJ7}>J!GB=aPJ*mPoIH964<}YT?R+aiFIb@M_0#HPnF^6y z(5?Qx{(DwGa$*jt^cs+QL5&!rY0I{O*gm*5%57|UWG)V|rR($wym=NzyVNe+0@v~pBs zX7E!!&r4%@e_yXI^kNc6sh#rjy@we{oP#7r{2GHoz;`da?B z%y^rV{gb6DAJW$=-{_wvVx9?J%e#h{(ZldO)?Jtb8u`-7T9lIKd-c0?P$8J_#dDmB z0r1m6;Pe(epDKV_0`TTZLssg=+(?h>(n}fe30Nj%iU$%3zP(_6{!MLJDJu0vx$*WWxjqRh?*Jb8UbQbY?<1A|mN^xf5qe`+~XvQ3q zUVYstdB=r|WAV91zZSi%#rW`jcSrku`=g!HxX^0hLyK|z^cg_V8RAYg0uIf@EqiZ^ z{rew)R~?Q|eCDwjI&W}D`G4X>$Sa)G1ys%NFZ-O^MQuZ~N2`Ao*{0|T+|o?Qe0?~i6YbQD`LI z!K6wcN0jEXB<(Yo)10AC=#P_!F2!XQkuGt{<^G3InxPF~L7sB1yg4bGV|hCqudGEm z53+Viobdj7Tk}tEj6PD0$xxXixKwoU%zyN!x`zDBK-mk(7rUi0QHc|;9*@J%9f{YD zoQt^;qV9*0jg1bUO($ZVKXM^vFED2b zY~RebEj=iWsgqF%ZBK}Z==4SLysi+E3w<~9Gn=L#7j*Okos`V$ZI!~>gVds=m4wp%;{tG z^*8d}JoLs9bjS_w`sY`dVVzB0_m#I{^?QC#y7`;w57l>psu8_VI_kj)Zw?l(=3d0Z z=Pbmf5e!e{zI3`I?bWX`1=6oxiVaOH@=cDQYa;*CP29~~a^O?ELatTNUkNBctFykk zQSi6ri-01uT1AO!x8t5vDnsyC&wg= zjHT9Sq8f>pzQHozy8VBA4`g)6*fQ>JCsuvZwqrz--Ci>Ov3!7qEW=tff(>YosWTaZ zK@T2zfetoB7@+ZdJmGvE-BeF<*9b~_;us7_)Myd+Zns61Au@p-rJjiLtY8fV8Rc1n z#$(wTN9>3W|+_`yjE2Kv|W!O8eA{X6xPl^D4%;- zxh6)z468KDYyp_}MJ$QA1>L3C%c}qvQ1RXyF>yN46TB9gaIAySwsnL*_vK8)!JEZH zVPu@3XdFX3iE%rOqE+BDh(-bcgT<4Ng6P`RfRf>0XGvuh)r-7G*iy2@V0-K|eyP{3 zc0Kd!xTR&uz@B)dn4FRG7{xK}r5CmI4^uvGw!9Qfl6b;yv zNXe2lwk1O#XE>Z0&eD5zS9k4uRaWl%p6Tz4o00i4>t$9}*V4;mRK0xn-5WRJ#EBCp zPMkRB#KkriXPA7luqf6E&?CFLVnE?l#iO`vA`VB-(G$3;l%byo;1LT5w40kDA<+Uk z5?$~;^q?>P@jv|EV`^{`KlXno-Z=77ynNuL_;3HG|BI$e6SdL7pn37|-ne(;8jJ3` zOtjDxh$twULN-a_Jnu|Y(q*+*GM(s_)!NEnc0963#+W?1c6Sov0tzibC*Yus9q8_f z_Lvx&CYUB}I*g-P7Mw-DR4aWe_v~C4jEh71U5mS7?X?t5#O7&&4muf=izsz5;*NPH zm{AlPON>dGNLKP#Qzfl!RCDeNpDS3`F_xxK%nE7Zejnt;}@;Rwmx3 z;N_ZspM2$196NkGMsaHz!+o$D-dzjNw#+Nnuf)3_yqAOxgGO7ou3X8|Ss=HZTu=g^ z;L|TDRtU6Tf7J1Z&UE32b!c$^}qOoKVmFQ$1lA8GK!pb0zsq1KoNBHHoJVV;|VPDx_bzS zf9|!|jaAl}6Gx+^?Z?H~piRz4MUob53QchMKdOqv{I z@v?-gA8j{ITRtUomi(SQ<9lh5>-!{6Y*;|^KYV*8E(~3c(K`ci>KuF)OOGYyOKGa0 z=8XWB?h2ZhAas+kXk8(s*>nn}x_dTrF8}0qO!iI2NfzJ>CNFrd zTme2}|H-$&7iG%lbmg?O9HF_L>!Hx?Z<_Kizki)rdDr8?O?Wfbyybb7X>v6`;?kKE zX^#AbOb1;C7F^#{Hx%zP{UvHtjmG`&ATdNe5;ji*&!&}lv+FTId&~O=9yMaDy=J1a> zChTP4M*n$`f%NBC^Sg#kfHM4P5=G7&d_B#JY0NR_@V=Lc?wxa&-|_$R+piBA=IT4AgF@wu@0G1<@0GgZR%JnOBjOW9C7xL$pdl(|6dEc54;w+QBb z6U{Gclja>!I&?B>cAtsi#$C~Q{8i!+B4>T@M=?J!0B_r9*7#)5$O}h_b2~pa8-2{- zTsyjyP#b}+WTFOHo@J}A$zW4V=JU8EOe|vEfu?Gbcp)xoTG>6; zY)Lnj`B{R7vfww+&@2K{5)76nT-lk3aYs%|6$5E1z~oM;K0NS*fuSkRlhd{u=>Eq)rpd=61hA;mVXjPA7wc+4>r2NfUw#ws$|e z8+|wX5`L*ZO1H+N{F7er&LS3^+Zol<>ismCk;!(>E%tIcjo%1Ft68cRAp?~8J1KbD zlEM8<#e_hqa0M51rj*y+ctL_Aq$#7Kd@s$aAY*yeQra~EC{IQZC9^E%2g{h8Hh0F@ z948nZnu;ALnnoTB#1OGbesmt8OV!3Kro;%^_L_dtP*oya8>o=j-LoUwckT%yF2-=v zPU2#)^9GI05Tweb$YzL;7SiHzIadt}$FY&&_~-xRcX1OOiT~uk`1R;+>YyG;WSY{( z$ zv@ouhK%mMXPe|(O#CI8_)@jm=DO46Rwo+^E3-elsxSX3M#u0I878d%Vlk&Q7(P~0D z*xJk(OK6nqkUuSyQ7+?hG(rrJ!M;I`*JV*N#x8AA^w@*EkUD1hnmak!EbSx}tJGx zsQTIuD6g4?XfbE4#vyWy31=}u*23xs#%{8(8;VPp4eq`WM~)oeI9viOGdUhVemspC zefPJP7vH)Z z7e8cNvS4*7El(ZBvSJax1b2c83lo(J7Lfbixd7e*q0XQ)Rg`tH8R{7tMpcz7W_ znm5DlyQ?YpW#UDt?-)1B<)>%7=8l!hn?-2m?v=q9<%F`P#`Z*ix+vbfb}#Oa_F~!T zcxDk!KhKQ93z??v+al%f)w2lb$fQg)g{$X&T z;AU1RAQaZB&$ZTGU}G64)G>u1_|e;!qwX>SA(}|zaw(q~_e=2wu`RA$xsAe>V~xjV z;4jXfx?ag!P*Q*()B+Ywa^YavSn2UMDSrIsQ!OPLM!xI2Gl(S{3gJ-{NyKg}aaxD; zFYd*wt+YQKvEK01NoBa}SMJ2M2RGRMGMFtj0@KtG^V^Kr+N?*`Lgbt#?I_RAbF$`x zTkcT$@m;D#H*h)E~zhn=c+4tOum=DKP{MZ{g3x;2f0bZTuU4~UB%1LkFI+VZqd!; zfU~5OY0(EBps*stFdwFMK+0gh%d=KqFZeglGHy1)pZD{#oY#so{wwbl5N-XhW%#iS z;m&2{vh%n1bH1FXS}plm&RZ={<-N-M`F^f5|E~63El;(3)!yCgp5x8=QCZZq)pl%D zro7Ir{Q235nCiuSUL|Aa& z(c5=FYZ#!@)VnmH%SiJatV}sgMX?)1Il2BamT%Idu=(yGI=Xo+utv=DjGMg9W@)_v zk1%=ANgW^7ZY&@X%G2T<;b0bNz`>(X;1TQ|^V^KMpm7^!SqLkz8I!>UDvHE{(ZCbS z>^l3N%x9KCN1bU$MvESW$R^70i1&VWTNYU8mzm5}J~VTjxP(25ux!-n`chvSxSq^a zi?z=P@j%A$qpfSg2R65Q`CG+@E@6fBgik9l!!HS57lc24i|F|HY0I?Dvs8;Kf)l_> z%GYb(UwOQIp<+fWgGC2F0?gbTxKk)e^*&s`?Vd!Kd+(#+IFABBF(;iUL^a}27}kKX zuEGqJw=-mZ8zjtnCuiN^espqyp!<>nNS@RlWpPrJYTJZj6%rY#y9&m<$h#J+5D1M6 z&ca;Q`x2j~ha4Iob8QES1;kO=L)Ur#{a6_0G^|;C<1v{|f);Jc?NJznq9m{+Xi7ib z1c9As>4|}c9_(IN1mhks3&C$J3JXDzq=j6zcT_0qc42h>QBK$S&A;(m@n8P>ugB8A z_>;IlHXr}-pZ`+q=`P1x@4n3>f}qUH(obQv1X#<3RhGG2Rr+%9iJwPJWetlp%H`>)TLuHK5=?Q#%H}Mp!`1pxmf25@$xLZy@-f8e}a7=9tv-5#oc4DV4CU0R@@i=ey$*JHG? ztrNFU;uVz|S%mPP(SnkPMFG3UQ=CLK4lZU#*~vgj#dgQ?ILtLGs{ul_u{?t?-2m;9{tFUql)M}NH(cpBM38HHnJ(ugX`6O6f^e*t|hlU z@sJi&EY8j6$MKf?*PZM#R%s0=UsMRqu)}ff+D-D6V(;F)>D^4Tn}GK4BdiXm;Q2SO z2pRapHwnmmGmh-*K=Dir9Cl{hVcW}T9rv&z_~`r<7S)&HkI&x+U$k<0o>*XksS->} zI$=oh?^vMcv17YT`M2MWOWS7t47YP;&Qk!&ID!`r64Pt+Pq30>(?tQWNG{}w+W~yF zD8~z?;fSihzIZgVpu&%t-eY1IOB<~U(?D10uyOL;iqg{Dn{#^~wIwj+Tq+nD?*s6? z67wQ$nZgq5qYtjb3#dmwtE~87!8S*L{@NPcf8a%1OO=pp{)Xdg2@8@@f(F-M1+(QU z9xAq?PA+wa|LB9uartBV3FQ?{1V6N!i&?B}wC+(Uaqa4zxXqXe0s|NQC3Uk&<>?x@ za%$DG2AL1lyEk+gWlWL-aH&cr<3LuJ|EplO zI})(VHDwwq`nRH$4?*G$U2aDPIImDkTxiX}*Eto+zx=BhwCQFl2>nCY}i=K;ZxD=kLaF*H}!lV_rkhRbg8@hKiC_{$|)8E_x+P zwF}2+u>o1A7B;P;S^>}CUg}fI&EJ((RJ&LC{PS^5XQ@c$pM1ixmYkUF!`zQ+FPEDo z-;@rd6Rl&U$JLkCe7YHLiW&|Y7=Q1((flHGw(lGYpU!AF_N8dx@Q0d@ z@i5pV?&0I&!oDqGR@gW>ObkFmnKW_m!`x})5BTxicq|NFjU9a-7Vx12a6@Z5eNHg| zv1xgzY#;}dWh5gExfm0&yh(Rlbu@Zm)nQCikIU*ThX}bDqwz&6YkOZz-c-=5ilNq4 z;;eDB@E9HkDc-UIhLck*GoM0o11Gr5QL!g>82o1jMZwH0Rw1}cm60BjNT?u&GDhnH z19M7f9%WcsHbF8tGcMyP?uyEz0TeuaDtR=`MhIx21umMW5I(gKXlr%17NO2#b?Z?M z;5LvLnd=;PrU;hT)Wmls*XEIeao)A?di@}`3}i}9IYN-4o?_1CZ<2x@pD@z<3d=Nq z(TPQC3%aLB`Fm}-25FvkXDbC1RoJecZ|z$f|0)=~6O;nc!>$bL-;@CwpTg4^Duc7F z&-XaLRTLTd-$h?#Dt032cWw%u-M7dIIOX1}obb{VBh3e5l760naZSY~XvEz&GSN?v zI2UVE?$1RQM)L#}9cb);!FI(ci>?L~HS@#$Md0M+o?ZL)=D)0Mi2>nhMc*eD$AkO- zb^Oi$?r+8a_&0wYQkjiTVsHH5dq0dD*RP=V66y)aDvcAhyCfIQ z{+?mAH;Y1S9t)d$_N!Td z4r?ZvnRH_8Fi$1Z5=d*5lIHjRgQnQedt_AxqLg;C7W|Pfe8Dp~zS7BS;5}Q6Y}RD< z{UOd$3S|D{@BSoiq3n41)w3vgZpGz~uCpkIzv1RuCYYdQYcZI{_hyA|@GOsg`^zzO z?%cWLdUfsEwItLTd*{fJBT0d6USp9>;kG4>wzhS|v17*)-FT|w<;$1SuAe8CSf1lj z<@eU9B?ntjG{wbBAA@sGhg*yjCr-r4lPBXl-}z30GsBf};BVoUmpc~n^Gehu zd^4{Wg0D(jtt1_w%$k5t5kRj%z(wNDm2a=VHjjz6Zff;ap>DHmK6w2X{o+`W{9F~8%O@!Iy}dqu9t`CBN=ac`rJ2ls~)k1!}b zL+P0$@tqaV)yC>GsdT$g$i{6(Q}Oq4QBo)erM}hipUCfV3wnGPoJ5nFi*1pjJh5f zt$k)FnwdvRGovws?`>IQ0eK~IfiTj9mOnTfO&ymu3 zH!&iFszw%%nlYDP&>rRN4y?z5dwzWKuLXozG^I1#pT~+}$L_r`!tUP`i@jp{FHkCx zE8tcRP@kw7Go|{dht{Rv>il{5Q2z9A3x6EaN&8PR#n9Slcv(kLe=?gFQBNV|LA}+Y za(=CPp4KEFzEu#eFE0f$q?xWK#JHzixSQA1!BO3ZUyQ--6Zl7SB;~?rj9z#zYWwbD zIaV-9)P+@>B-X@Z`<{alM=+l(wcxr%jD!ALF@5ucD5F(xq)c*EeSf2ymRt0Q?_syV zBJtR%6Y-z_)xQ=mzw}Dnx^p{z`yc(I_~SqNE{Z*9+ZGisq$1O44$CxEtq#i*KkIQ+ zEwA^|B4fEccRLH=U-6#>K#JAEqJYT;!#&1~b`~f<><3z*V)aRraON?T;D(7b!4DdB z*F&jPMlt7+e10`Hht3JjT{r%@9B}WMW~bg(aav%) z1q|;!!GhpPVgDk(FP}>jNophCtaZv{iPPvQVeeL$@Y*k$Eytk`{fI-AwcSoX>G-9)E8=vFwHi=-xA*eB%pV@cv(N1k0BOUMA8QaH_L z3Pn#B2QVz)X)yfZkE8P{C%@&B5S}6kazfk2qB>^UcCi8LIu03T_XdUPXhOf8@n(d$Z`i88SBj0zuvG8;BV zaxwgYr<+d@H)eEvj7>!JCV%ervrBU*bUa$U7D7_lV~i5ka*2!#Hd^0Mj*b@2CqRhS zObA^K6%~t3cZiHBG08g~&D=nIpAqleW1(ZfA z5Ypxq+}Q1`!%D0SaqAvX$?!HRqw>D>xqvNpSN)|wqiz)}P#GjG3_gQkO<-<^bG4Bfl>$Pq&uwJ@?+v#V*09Z&1=?nl=rp4hV zNmED{UY=I*(>^h}0P&MgYsvoZ)zBx-Rqs^eH}l}!!09zuFnW};dCXhTrwiF?Z&j=1 zvwTmgH}s*im2Hw^6r2l=1dEXFz*16d+1?_L`D}m2fQw+QEC148`b+WJYp=z(zx|!~ z+Sk64Ci#Ex5B@>o7kPnLy!%Q2I+rq7(s(F(uPCYDFQ2s3Pv<>h_OqN+2&5#wm+`)Q z=d=GM?A3XcO2Hzneg3FjtJ30uBjdGC|LR7p!uqr6WF z$M$>M7}&C|2o)Q!mE4aE0(+;zy-+F$TLxz+57(%L0I3w@PO+v#(U z0hK*9=so)S@KiyUGLr(uBU7hM0{Ypo1n6Lz345avjr%y}QL$q<08jZYHpY=Pd9FOF z5~##y3J)!HFvia-8NoT7#KVrPDOu;Ri$8Bgyy#AmFVA^uQVFv%lshVX3_z$ts22Yg z1=L0gR!QS=*gj8|JwTZ%mt6 zKKiU{$?(Y*XATsHiIaR5dj0mk_ntK6G9Oir%kyW$3LaJS^V?M_aFK=6Vv%0h1gOrz z;0y~9V!bR2yDpX7Dc=fK&>7+$G9NhMBs@adlxY94dk$TtG4aY|0RR91KmbWZK~yM2 zR6O_19DAo&q!ognZip&3M}`MkxB{UAhsteBid~bKZAC$wT)KGH8e!{-9t#tP{$-$7 zEDG{TA?cw{L3~XcI3yOg(`?M^0wB&Rl2f&{2n0W>%&jkgyZe(-2;Dz$TXHwxaXv21qTfsnD z!@90TcjAV$7VND}oVd&hv>F>As`HF*WJpioQfD(iOK2SQFio6r?mJ12=eaa8j-f&g zr;C;-!|*)D?2ac z@X;>;V6FEBo?T-bAjyjqtwRd(=WD}cqgREQl|?E@`=nF6CFa4NAbM!LnWK6#>qFVA zXZ@Vs6(c$6!r-DuOdD6GSSGquav>xRjZagEciGQ+W9%ecLvX&Eu0=ENyV(3hi9*zj zW1CjIzPzjI@xz*Ur&D93QEEuAO2ni>!BD)i*Hx8+}PG46|iIo ziu-vCtflk(#?$y-UA7kEsMh!qMGriU;;WXCdNpyr<(e4lh3kpgGaeHaBpi8HD)YTZ zrEE2knC4^k$)igCd_R{?H+O3)@a~u{6l<03)uM+nUJPa)$jM2JsYIE%%PL>_99}Q7 z;UGokfU|P1g5qf9nl>_4;TQQh>}d7PmUfs zV}-tj#Gc5h7|Z$BXX9I#Dq*a=t^#io9>jje@@JzJ1r)-xUc#_F1(zzgnt3wpMOzC? zxO~s=jDsre=jm$7d@sM7-&@U5T$wND&CfQ<`=~ne`%n9OJ$#m5?cU?oD{jQU?WMfs z`5fVr-=9`nsd_tYV_+KtpCb$umhGzm>$#Ho?&{sAdX<#Z@-F#c!N1)6U6CuEYGvDn zeL5I0CJ%>LanOh7w(3=q!XRiYgMP&j6?#J{qw66v#i3Lxdpx~dnNmehcHcISN}qYk zNN(@wQ&Jp1^ehA#M=V zkQHjBW9$q8sw1|DCPfB^oX5>(lB1yw&|JrF-LgDOURRlERL8Z) z7tc)3pp{xaLJvy|C**~SxDU#(tD^KqUE{#;V=4xtLblcd-hK4@zE?fvQdh@#QGTwc z`ddFecNLxTaq=t5k!55R>kpRY%P5luR@NjNpeW&+{91|?HeyAog+8F@jmKHM`-UYI zOSR(tbZ1%SOJ$KG{Zv_*a;s+IUe3-~S#CmAs4XKada7pF@Mf;S+E=hwQCF@t=kvSB zyE#M~R=DAV)iEL*{wuInjH{v#Gc+3(@|X`&t57Hvt)qviV6_hKuKp^ni%u(^R6eU- zv3>G*inr?Jd{OR-3$^|^4$emH%9zdH>+_}lVoa>|P?58snf19ppTBe4SK?Gbi>cjw z7b4i|jN{~1JgaCc1r)r_7+VC*by&-$?7dH_lL zSojZW%dKjY0r=N}M40APDy_cVVHlTerP~FD+b9;l#P;>4>)v`W(i^g)M1Kp=tv;lol}>rtL4 za?r#q%yCpKwm~%%SdVhXI3~VR!u4y3SSOz4u5w3(jDeN~OeKzSfszFeN*)_;Fd_lK zT%+hT+yFejy}i8^llDoDV4dO!cukauKu&CfNg6WeG4Qx^O{?tLLVEf;rH`&uBK&Dj zidA2%uwj*g;!k_;Znu9M1KSwb#=tfPwlT1cfo%+IV_+Kt+Zgz~Vn7AR^I9jX=*a8i zYD$mIaJXKvliy!|e|;G_pC_|EPi0STtKaH7^2x9no=P}#A81`aiSEPr#3j9;(81K; zuCC?1VJvFVEqDU*B4w7)n=Gc2nU|uqjg!pLjWl^IyPIG>Qz3?~#K6pYXf!r9Buk)@ zu2@>()DmQJ5rvCJ>AGb#VU^?YoeNm|EG($F!ITI$El1KSwb#=tfP zwlT1cfo%+IV_+Kt&jSOllU*CDM97MU$EmlP!eT4$TbJ*u)KCHPIH__?y}tg+XVuD7 zA7Bg{+r0kWYWbhWJ?rsfy~((Rw&(U&D?dG(N2P;$8Z3MaP+8l+@#|RfETVzZcdW%o&nR*TJpIcO{P8#MUOD)w&UqG+i4pE+Zfo!z%~Z9F|dt+Z47K<;K?ztBL6KH^}Gc4 zCx`seB~-Spa$%w@Ydd|Ozbi}go}avs$>n?!H;2k{KMU7+k@RWF^5Rh3+6UWd8v|m% z@%4EgTf*-rTe^Ibv6XquC!q-6O_nN*t8C@7m2w=18>P*j**@#c-%kSjM)j}1FFe*` z`^0lrY;6W-QkGCq9lDl!^&{v?_=?u%QZzSm$PY)X&tdSQ0;jp9HJUhCYg`?SA$L&Z zs3R$3u)}}C@L-ICm(~0tiXaSWCefjIuFl*nF?~FaScYcQ=a!b1Xz6UFVB+*pfKi-h zv7~|P5n#C{#-}Dz-e%mbW~OFR0OlqXH)YI(Y@C6E7O1GEh5$lX_%xwaDiM^~fXs^o zbT&4SiW?P1nkAJ`3K`)=7-j)RS1tinX*4&(H1KSwb#=tfPJ{=5fDlC6GAU(BOZCh@i3ll$;_wvFh=c$x4 zz0UXZcjfb^2IO-tNF02cNgRF=@c3!s@QYTr*FyxIgaiIqaA3L*#(cNS(H8eG49R`$Z6o1uEvJC z=xpN!%)H!XXqqH=5L%=$@=f|Ol>rZk#8OAC(GrRs-cP4(E#Y5A<%?80yD)_n4^}p) zXW9s^tP*EvbcFajQ>mX-F3rQx>!~NXeHrK(WzPcUOm&o}iIRb#Q8UG&j31@XqmqMB z1aC9xM`7yIdH#3<;M0Mzs8w29t4%f_LE0pz{OXl1?AX$tvs6-X5RCYl|PRv^V52sVSkePZS&R_OHWc$ z^>;I_KTQ~_L$-bQ)51V0xzZGISu=eI%QlTXx<|xOCC(oG#*^pB_4)lIedM~&)!^C{ zVRiU&U4B1SB73>MHhD`K>-hE8--u&J4#hwFr@tGg&weTH-@Ow*dh6X79>=0*Ib2Q+ zI+z;tCnJ;SO_nCnyA<)2J@Bfnr9CEUh<}WSmIgQ)(3B>pCs4#Rq#!=i)05HCh;|7d zF@rMezSWLfRa;FSxq@3;Tz~` zHC5s{m#-qTU{IC4o*>}W1undPK1o>Yl4nt)?X}#DkIL3ojyIn_i~64r27g*=sa>jt zSFY{D%C-}*KlQY3xdrz#@00cGv!TmMs2~42v29zprfKY&)7%9D-^o3Elt+7I4bC(y ztCnwxCuu*AkII~DuPf)GwNJKxebz8gIWJ^dv5OZW2zxrwhQBizI2UlgIOSsNt=Wtw z3IS9zb2rb}?9$~unK2_5Emx67a)x2$Zmxgj!3xYiNmII~c+4r}=DZJo%PSU)5x~DB zf-P^TIn8(y>teFDE?`-~!%8tC$I1$8ZEq`V7T9B)`Ma33eDqkGB+JDXW7C3YP`Q!V z12sDSlPGtNlSr13QQZ*a)DSy{P7@znlM7Ng>;Cw5Mpuc=N0lmCxJwQ8qc{>*DN zGkB)FLeu*>HbM)^DY6vT=J&pQ`tUiJvus? zHexN!`<~q5yFSbBK3vnYyJPFh^ic`x|Kx7)gjI>pdNzEGA!>++Pb1m?dT`CoLId=* zv{5Ac(~pGt=_ZcM0g6ml(h;Zh)UZKLXb#set7A6LVTqeO1EAAr2Ve3s+)6MCSY*wX z#!VhCo75`*6~TU0rgA;)aSbS6{FL$Sd?AcAjMs*yMi%Au#6cOy_~A)7PGxJK?X|q* zNs>Km3DrlVMix9r$&fOw??~TWuK!sps;#G(S65rR{`cyW<*NetHMdzapmfj7@xesc*G^F0i6zWWogIG zJ!#U^m(CzRDpjTzm`Jg(NlF+hl+c?A$lQezr_AIdB1R{s2);}JBJvH5j$yGw;ADU% zUJ!#GYah;lubK6TFd|4ZBIaS-p8VC(+6F){B&~4ByTqRwErimfiZ376wJ_SUaet^w zf3zjdoA_|>dXg`!N8)pm)b-3`%be)8k`!%fKt>b6iyDB<>6%_;5To3pfV@zu;UqAn znR%EeT>-K=VGQn1$m*)qP|D`X4B)nvxJYe1ZPBy4hwH{9tc(ngVXie8!$afATB?@G zWg!VL_-yk|f-ylSgsTZsT>bHwS599>_a;Jj!hPxwh~5a^%OiKitV|T;v^s(0J6rn} z(nKG88_Q`LdMQDO2Bh+&w#wbC^(7hsDos}|WK$^?CIy%_#({KeolYhyXUtptR;|b{ zXtIXDcv~B^*Fe^yb z)*7@tx501UU47pZ@pPwDA!s1=A%#1o^ zkjBkW^o#J-fy5FMxB=CLZ;=Iak%zB}I*M!GU7KXMnZa$w1lPXx^nN{(;Xl2qKDCl+ zS*eQoh1zAlhLT-MT3tHQWAu08FLa~J6y!7dCDUDX(8XQuzubrB%>DS;z^!!Yhs^_! zuqvJx+|w48XnP$vT0qIZB>gH7bAOeN#SbMg*qU5yFi$xK7^R6%rK}tLasG5+=3KOq zK(iiC8GjoT`MJBjzI~s?1~@)cc*^tB6ibJfGJP)tEQ_n-k7H$#v7}5?%F-V5!Q&+5 z6BqCvWKq4pm!hMiH4YrvpAN$q?jK|kF_RX#zUPUj(z7r*f0(4vVuP$0-5#G>&#s_{ zWVkWcv7?;~i*fVny_guK-lWM{3$=%4B;L-6eGq==$Y-jH@ zeXIp#ikm)5Gjwy5X3( zpT!lhWxTCaP~}3|K;gn5mxd%59v+H1LJ*uhc`W++dShT<3}KoLPvq7H6<~>1BA;<+ z$@u6{%*;)&L0XPuhYrS#n|EUb6Z>|QFLZVcjf^876T{JWoM(Z3b!IPsvCWN*jq&o! zFDE6=*w|Q7*yNZs&ER0?&Yek_V_xr%6C*RzlFFVA1b_2r4fF21@20Q_`FWKlKk==E zGfG*YuWi;6eYJaE4?EF&;)CNI8J>;mebjx+_OrGuN0MPNn86uWb--34w#TV6 zCt`ATJZ@dP9g8?nIQu(;W!fu*M*HHEq=NT6{3bk-dKfx! zr2;VHXZ^bw5~UV-Q6ZxPH~4LDYl<_ckH`H7y>b2K9mq!>B=3Ege%6=!WWO!HS}NLK z&v@J2(-CJ+?TZ_iuf~;I!|*G3X7efMvon@pdkt+2C1YKt*CcqS-?*7jslJDUQOJe_g#oWP3|1;tLX74_$VQ8p_nkO z;G1g+Iav>hm8~Y;=_0_<$pbyHql_OLZfLSZnR$wYEdiujU@RzsgyB}-Tzov~k?$y@ zHmIi(u7|P!pKfs--HmbjrDJi7Pv`#DWW^+Hj3X4>x_l=-diQeN`1meIsd<_iiB4E; zS+yD*KpR2y5ER7?ib+Bc1xt9k*E!KH=rTuJ6)sJl$hM^A5&b7|=Ec)i1gN5-wSN=z z%l+g)tU+5gFo_jdO2D+fl}#+5Y7w|+(n)9La)7Q1+|tWNI1qOV4@pqwI=3Nn zEC-wu$h3j3QoEs9PK9GQQm1d%5g@BEW}z8B5JOT%I?optQ5jmli`ojN#?LA#X}(i` zk)OV;sh!8-t%N3*iQBeYF6~)bl=h@|=!Q8?VQ`vp<~VdbS`OrzQUbF|U8}c*%RVn& z$dHP*664cg=@SXJt4gQh4Kat%4gO1}Drmj=n7>ugcu3*m6S4lbd(l zMOLxl-C!G+PfppzI-~~dz%fuo;^|1b`-(2Cl(r7dCNrv^)J;&`_y364&RD~g}!*qDm?!%(o{Pn5K@ZE-C%TXhJjwNg4?ajrL7yernft@T!%6w$ zJ!wfkqWt8yN%{B2jT=c(v}ezrbnjXJalvPDfxEx~D?7m5u`~PQg>wgDY<42X-yKUa zH=S!9PPtcBpJaY1sk(67d#EQ~{+Uy8f8cgJ=(``oeG_1uhvLypRZ=lNR_CcawyI>^ z;1+OMG)$nmy*ZAaJsii*?v08031rV3SgX*Mq>TXY%i}L8f1q#wtxtK;yZ-*;{Co%^k%uUMZCdy-(L#;H+d-eAte&sG{p~+Y z`jKD#wO@@>$4|toUwI?NR{lHx!+#%#4;_lX@i%@mor2!j*qp-Tw4pqAGo#eqy(5N( z204XmhDBeY(5OfG(%j6+TLk-=V#1pB=yMjtF8F5Pb)&Qh_iK zt$V;U$Fnj_5t>;e;%Rz3<=4eXq>&^S$(W>EO3_s>k#x-#4IujF?W2W4of|QUb=8szkD5lX zmUC>3pk@6=MQ<@+X{)r-xuYZYV>UOARoac~w<%NFgmo+FVQ&tesCL=%infXT z*0%Q8e_$^=jKgvFeqV~rp2mnK?Z9Y>3AeOqMR5#&D&Wsmgy zMNb7a6n~wPmyDq%J=t{V!v&K3C9S`hoOOYinHosD)WZoCExLT$BrEdhbo$%)`H*>plv^{ zz(7`x7o&vJLgBfnI^iU`PQLbHoJ4Uk zJlP+OZ`L#KOeI%)*{AJxd}*KJxDkiVt>xIcuPu(haUkY*jK}SF??wO3`!P7yhrA~j zVxx%6=HJY!CzZw+aVK)$k%Q5)_i#*g9*W+EV=++bib>kBz!=pUS0!vM-;H(TZyJsR zC{K5`l%utNA^Ps#rLSCI6m<%(AF8jKwA9i4YG~jAAq$q`#OeKU=%quklR59&gQggn zLD|%BI{KRS#&BIH_=GYj(3W+#kFvPk73GO{V*lCQvFk)vl-n2L-qrr-ebA2pj%*5_ zE%=An6AHgq`%)g@hUYDIZu4$*rj5++1l()$DyL;dPrmOxckO$7QFblMH$HnB$+|M{ zQtr^&v4o;JSu7#PG&I)6k)wO!m9HF+&I1i`diF^4Vr_K~nWknDbB|?(`6?{-#=}YW z%P5TQUG4GWYsX{nnXag34BWi2E5=4H#}bwzg|&biVMT9>58)GUUW>Q<5$4BB_6q?{ z*?c>2bXS~wuWjExP%&0CkD zPn9USWcgj@fBD|i|CSFr-#%*03BTi~jkS;Mkay;>CV@lM_-|re%bI5qLl!qUqy?n` zTVnZI*2s6pkp~`))3t4tK7F_HJ>fAd&IJ0FyZ7&~9%IHs*<-yb8Eu=JO&(@-^Ty3I zw+g14^`4||93NeHv%I0>DxadT_jW@ZROzx z7nH<%m>L6nPuqiNjiG2+7=^$=D663aD|zOT3Kyf9Hq;{oGFWQ5dC~s`92*q>&~1sS z0Sl>P=MKf`*H1>n?xh%~&N+f7&8yL-BgJt;b2;`L?~Iq2G)Esy#K7$VoX47}Es@?s zIE9M*sccWCeCe`&Yrd>;# zk<1HeTcQ&bkoD|D?naP1^U}%KvwuhY7Zws9Y`K}(_7g|_PI>KSJU>(F*mpwEn;uxDqwu`O<2zm(#vIrggcjrVm) zaraoksxqJX)9%P}pL(6~?K8)ozt{7UoTq?%^S@4x(oW(HlxH0o2J1-InOCL-hGPS& zN3l64O_$qZp?()y$Nk_V(;otje2KO#fR`!wU3s=Qy302yuN?R8-r(EuSmd{kjZ%hX zeI9@N5nh#Kd-v{L!A<2mIiGFulau#Nxs6`uyzB3a=lpJd&+mNC{HDsXiaSr|@A`V4 zPN`41l-z}U&n~eLs_%)Kmc7g)Y_zbcCAy8DquO2GHa9;L3zK7PXx)ijJiI@99XSwL zWw~D-1zk1#`%dly!BK#|cke!n42y$ONi|9SL@82uOaMO+$ zsBMjbnwI49mn@Lr3C8}KE%(F;7Cg0`%232zsM~{lGK-vWA07xm#pDCr>?03=0>t_wV0N^OO8l zSo>MeJWi6b-FVx{Cfw;)PQ{MHT`|)z5(iK3iBq=@$J^tVW9$Lz8s<eaLu)2&W8>{I*XappN;&VAv0C+?+>JGhgW4(#8bc+>5>_wfLjCze%h z96_EwfhAIHyT?7ViT%p47`!tYm)^gD_$Ez3-f@*R3u`NsK3DEFL_eWE#;2I4>sU9gOAMd1=5jo^F_RMY zcXu_$D=3a$JJk@o>n=pgF2>-wg}8HXAwIs1vH@N|wgijs7_VwSIMGs8`9fTabLk=D zu_*j8{tBC8Rj{m!GM88j?A^a7e)dZp@yhOA){PhA!eoD@lz=2P4YHEF~$YS6&Y&!amwcVO;RHPLPQj-kqj+7H1-JY7{ z0jkoqX*q~^WEtmU%|v)?)CZ~sYC z#)UX9(bv1N=GlLCf1LjE>EsXnp#M(Pbu32DL3VL)AC%VUWatdc0HSnJYD0^9s4e!K z`BLoI(;XMyxf-`F_Qn{o1Vo7_Ox(P4*PxjN>qm;8^Zr2X$X5_Pl&H_8!|A@BH{e+_`cm22na;=*DOO zKhWW(41F1&9i6lTbN92a9*;w(_Tmazj*o6nM(5tfXzgM_Dy~(~C?K=LQPMiDy#XPV z9kZ7as1BE-`<>3X^da@%B_04l(`(ku;?m1%%DtGCJi2M_*w;x}N8{X!2QeG$j^435 z(TZhR6HIR&D>hccsQ^_|H871by-HgaBn{|>rbSQwz1djJG?Owv#Xpra{S=G+%oOF~OCAZ=V7bS_sP16&FC0PE zYlcU|(dbKiSJV3%1aR|~V>DXnvo@5`9i9EqGYeZLn9K)q<8q%U#47yxJKr;}d{}`r zPq03dC!6v!`HrcwA95M#!502xy7Alc3T0zarezh%NomeStZq^i%4ZJc*XYtNEI5v0 zv9O;-nF=Tt#<(098*aW9OF`Npzv)cevwy>3eekg(tVQvR(Pw=PJu= ze-@ZCzH+<#z5ZGLo%PUR&xLsI$I3juTX5{! z7$z>j{oB2<8|#pXnTh!DoeOdEV>aLJ53pf@%VgTcmv#`w9ZS48jlA^W!5~2zKZ^1C z;W+)J6KU=o>>rH@;@G6Q=BJ~!gB`&V8*I(Q@xjWX zrIq7dwdQoDOUi%8m-8Kb0*10QIy%JbENrc4JA4JKD*!XQOWtm#$%US82=q)F@+ecZ{HPiJAWBteuR5C>Kuc ztBZqe`(p{$k^YMhSfn3_$%Rr(-g&?#T|(0awHJH??v-N1oFYERD{q{Ro&!5$xPBbP z(k%0GXUsgnYK9VwTeL)j=bYnE0Begd10IH09CRJrgR${IOtCT9w!1C9gmqN?OgVn| zqYEhA*lAvwqveTfaZ!l_`9S6g;w6vMd@p}f$V$q*u-dbgOk23{ed~0dR-xl!*^{G3&qm_kiu55Rf z5u_vO$#$d2IIus?y>r7JIC1hYAr`PEVQtXa-4QRnaV`dXr{m*Mtgld>bhLM2 z(a_DJ_Fjs+p=H34BS+G;bqkNY{&C?baIwr0M96a5w{Kr^)3bl}AJ~`5bxmXt_5J&I z5#Q)U>>(`0Vm;%wycm0r?2I$#PM~ZXkG@+Yl%kAWiT_;k!{64Ct#|KYC1?NZV(2== z%|&UW0iJgM{ypy15)`&GzQo4u-tMtzVQo`dn8wnmCSJy^@5;brT)u%D9P1dmX(gp0 zSIg~an(s^Nz%%>n;?;BeV*slM*d4Nqb6hb#lslwL zVHD@mfUb{u{74^}W>x^$@IqL?JFpgOk(_ZUcA$hmz~=Ct9XgZUkA~7H59eb)*7>K7 zcE_Dj;@BoWscZp{PW(E*|NOsgze)b!9Av7L(bA0#{%Ek_>&i)cb~VP&{mg-AZh*f{ z)W)UTl!ub!ul$w&Fn;kD|6+Xq`){M5L&4U%7$1LhHO`zl8~^El_G@wW-0Ao`f9JnR zN>|q(mHod#wNHH8zEvqj^vu8?A14W){h}4;WLNOT*BhVfTUnv`H*3m{cSRRY=YQy52~`A^Cm2E3ZJB908o4+1PWXi!BY;MXJ8 z3CfAcNhzBztxPe9)Q_yZK5t6*{RLvg-c$r1)9v09oQ_+E0-RnEgMbD2KrSO;S7(R~>4C_Yk13jD`{+ya5ccscDo z2$}6;2qWcqwfksv!hkPfE`R4re@u>oOYodb4cF96QOhuCuHVvGpLTyv(EcN5_OWxz zVrOwYcAwr6U)lK@?PX^~Azteq>a9Tlt79xKBJ{THXS{dKMFUFTbDhT#Xq)5eo6T|e zBg~r#U|B=I6@B0su?PLE;=)CFUYKWEB*U7N>21x;$M}&M>0`X|g~}=$5#w|8--D$C zEJ9Ak(9(YRGbbU^|8F3C9pBv$|K|G_;=u^x47bVJnrW2XZLxFdqv&k81{vK;<39IA zqQMF*Wo1Rht(4z<@?rbdNyv|7*ym2Z@_?-h8kJ>NUgtVInMPsGiPCy`DfuGty)mR=@!<*t}o+7TrdxkpeifB95vynp^;d~hF5T#F?s`6t2OEPS|| zNuY&!Z4yh=`DNjfLMuU9b8Q=S%@U5R=*k%~AIzra8L#=icoKKM??hiYmsytiE8nU7 zopJ3>lR{m_jb;1UP7h;%WfJ3}9D}t409`m0V~d^4IgPQiu|B@}Gy7uX{`GkG#$eo= zD3mPq%mWJuzH`porAsJYSU_w6xAs$Z*UP5j4@09wL99cB$w4eqChm>Il}lHm@9Kl- zuJ4XHWR$zpqsTZaW>jDTi;E}zHM6+U&AAaF^u}AaqMpr)UB_AMJmA0z)@P+UTpKnf z*<^|0G^6Xv2!ij2Z@wMv2Rox(m$06O*n#VLNBbS{fhDJNLn;iKVt!Dq+<_vfql-8i zSOHCp4aL2_yD@cZE{1P%&;jaR#(qX{Jt0jA$3w7|`V-7HEP z(GhgVA}&C+z+}~F8my?Z@-ktc{+ve8zx?q<7LssfFF~2A17H)<|Fbb7c-vtWx3XI?bpfuQ1m6~8cnDV| zG;4mO2iD)oW>XV!K+j{nJYL!#M_JsDvi7+A=Edm0Hyqsr9UtWY6O}FE%QiX(+`D%# z;p6DhqltG4oBY$~mbELH9)}v{dV{6tvFvEii59p5+Z}J2)C}p^&2S0n~p-SD5W`p zxl(!ZaIZL55n7BwfHH z`gGy#*g1XrbfR1P;&I2oa`PX?(K4{jD8;8n=i-O&-jB|&;5LU0eE0s%`0@MY7#Qh> zKUjjajcoOpa<}#tWm-Q@S1l zy^C>Y#7(eTEKuG^2LfEWcq!g}`%?7w^`msS9Up$QixPe*UOe|w>_JI+|G|BD70O0g zpTlg+V=@8rSbwAoLvJ7g%BTAQG$L zlf?Kj)<;t-i#aTDQUF=1?;w(O6YgEQ(#!zl0^johH%}*cBA4cpo`&MilmsA?Z6N?( zithu1o5y5A*Rffyla)sWfmBZ3c4$6oax2I#5NintZU}GV%)5sD8czd2#fKz7hX7l# z(_0s#CH(R**__9myT-UOE`}4viqi7m^;1|LY<`;*sM1Le9D_EG;06{Fv6N5-Se}BA z<3XXawh?^sZ-JoM6G3Ab`IRmez6vSA2OFkbzu$#0paKTY#BW3i7C7uCGqBTc zcmh>|gl(aa!yEv{YI|2xaTsinyJkaNPD&xbGmwB=p64NAmCT=)&D52m+m4M-`uc% zAK32WFC30jobGV$XOCm|iEvaim?q05`r-uj*Gv*Dnn?!KvpZGvgKgL4Nh`3$dR_0> z?T6-Dn;PQF-~3V>+;JfO~6Jzt3 zr?a@&f1G=?-FOkHXA#)x75b(S^o-kti5K;c#bVubG_vdU^4HHq7eOH3E?tc47dUZc zM4{s0+P!1@J32A3WwHO2Z@v<32N4)Bkse2hqnY{6BVDoU5In#!nk>nHLS+x-rTrkf zWd?=UJVL92MyU;)y}UOL?K^S){AINFw8d>yAa}RJ32%K$6Eru4XS1He;$DW`VbX5@xXRQU*JEz(1koy6K}k_H-7og)CcRgSZaDHe*arnW3mP% zIc_X-@Z|FRT`U)t`5O7{ANwh%{5vlu@_oO(*VEI(F3&HfN#=(?{9#hQyD)X^|Jtwp zTKv%;{ZZPTcvRn4mb?C1`f;)G)vtavzV)qdCBauA=F+80Y4S6FqAQfd$-R*_EWq2` zRh+DAi@}=1F|mMU4N9H;-A(cD|H^?lwI^c#zSrX3|9vO!aN^4BVk_gY8@eAy33faA z=+~y>lruEap>+OmQZUyP*hzSO@}5GM{Lpq}+-7_V_v^2}9^d%JH`0P$LHax2`A%A7 znLp>tW&6HmdEamG@TDh_LK5S?(b@- zFUo)>P#z3nt$F?j7n#$p6Q^Q4jvnZU1N#o~ejf{}2lTfkU}?mhq!rCREV6eo_H^gE zi>2kv)I#jI-xb66uvErM)3LugiXX1sIYxJ=I|zq^eb77mbxq94Ed+b+B;acs@ju!P z@(7LT4qX6pK#jiyI;TYD#zp4ursmcpCw%YUe2*RX2MDVVVh&4~`7sva#28v)XUhW* zR?}KOp7By5c4O-<7Rv4WVxVbH3@`@{5i@9aCntf8^vA%pThUe18Dq>@nyI%p0ncb} zJh*->_P)@LOY>3;bAZTT!%=M&V*xY!=;5FX;zuA&FuPWt9GzDbqegH?x^`nOW?7u} z)}W~Ar*F%HSo|>WkGJCb&CV$GCS+O^{i>2k*=^#%t@sdr@xcTNfdx)@U1%g|^E~cv z{W01*Odq(3vvG0^%O|y%QE`#SxNjsnTOR98>6;D9W5&X>s9>vWo|wyRaS^86{6++`IoEZa=sY zU;4^R;Fy?7ST-%PY1Vt=K7EFQY?jkz*}QTyXfs%p^BgA^E=)wz-rCrAvL~G|Wjls@ zhvM1=lo=yHC5DLr06+jqL_t*YIxSE+h93DfTOFxTae;IeOE4AP!YMD_Y7)o(Q{Erw z8{(+rp*R``;>7G>ti6e+#lbB1Z{Lpx*G8im9&il2ba(fp_0PeB2a{q)WtcFilsSI< zc!EvKDEszNJR-wsTb(1^Q1RP$bAQ^mS_?TBTw^ES7+VW$W=t{OuU@|zP5mX}CA|!9 zLSp0o#Mo54_mlTye%zL+KF>)Cr%MioW59^B?!er9Sw;qHg4sJOB^@!;RRLwFB~|o9&~}!29QK z#`J;Kn0mRJv8htNA#U`}$4}nB8-p`l%-`*Jk+eb!tl?Pn&Vn~_r7}!q)OGOVVmRad zar)pPgm6Q;)s3sSw;vwa8x3cgnKuZ)&cEr!vAB6}DK1?^8;^qe5}OQ51JSf}4MiSfbI(cQ8P0Js z)LU`n@QHL1;0@-FQR104VYqSj%qbKV5%2u)-MD!9Vyeq{GIeYeyQ+DX$#Jie+CJYb z$&U>wqs6<2LCvrlRgr$?Xls1qt5_259f^*5+^46o@SG=3)2UPO!IjDQ?oY19)!PK1 z$KurSAkSa|1gE*fH?LQi#BEmARKh6C9@LOd9S1IF?j1Y26AyU6iF6vl=;h>?QzxRO zj_A~q=YtPFjQ{2D|9xER_9fo)(Z?UBG3sVZdpmPE?sY1mOEWMtJGQlnBhk^o&7f$R zCLr+)W)CubgETi2G_MP5pNYvew08?_GS@AlDSGUz0TelfVRl4=2!;HP)lK#fqbmaz+s>j4PwN7?@lk5lJPZH6!j( z9b1V|XKNSIIxtMY1aHolX=59UX!q6-#+jHjRn~Xwx*h#{^q*`_^5Cp+@2fG6G>=Mx-QJj@wpfd!9 z@|b!31>14^X{0a9z&%H$P5}A?DqPLe9s@8I47+IidPwXWCu2437d}4E$rhMtLu>O` zRW0IgTtdJdM0;7ns$@x5L2;2%!Wj5Kq@w>znAO$d!|w??6BDCx_sWClz0WbH2$x#4 ztV|lqZ?FBTOFIwstthT~#^T7!`=f!~koj5^7__mUG8z&5r|D2A88dBg&48>y;g^mV zr(ep=sAGurqyMHI(T8At;lc%AAP6ORbJtTPSniEVZ0IsKJTi#?>gA~4N$@$wQX?nh zxy5iN;-imm#BI!or;Lx~S-44A zw6^8`veYSXJcJMX#~*wgFSH&;5li{(SW2stx?Rq*TY?3h@w8S`p?+J$%YH5{M)das{+<*bx=`Y07uh*C@!W z)KQcsJt`N$#KHL8Z(qjkfE^$BkZ4V`CcW{gmc(Z@oSI+W;zXm;#}j45zxRLs=YKv4 zsqPf|TQ@MRPZZP@WYc^AZ_2Tp>__uCp}G5EQt&jtivfjd^Z5Dt*T0^2bXAPF7_skN z=-3#AzF8~^#^I55D0ftV`B4?N2UpJD_>YJSvNRe0{GScSYp?B#U;Ty7_}zbXB`%HV z-d3m?i7c1GZ4|@Gk)3&yP(7S%%SJe=%x(M3o0Gp?VEyth|8hDu**3oM#v8!(TG~Ao zmkMbLGA;y63Jc;U2&+Q$CG))g};SI;U^2f;>Blfl8Art?7dvBLZP_!y)SN3 zOv5Sy_r@s#$W9Sc1uOLUb6@L>pM9}D{_y|(h!|-{Iuu1H^fNq&0;d07qN{5k+=xD`g2sX0F-N#aB`M&=ss%b)tU^l} zgU%GX(`os;zzJS=n)b&8N*$ba;`*KIafmth!jCUuw$7$u`@tBl-N9xI))%!q8KemH zAHEaq^V6~WNC$E37O>*$z+JODW?MO(Y%hli-1#ULfXf3ZswKy^n@d`1)wkk`)^Rij zTMxyJdKT8mfK8Jlxa}c3A(+iO&$8*`5zq;KWGgNH8hP*9STk-+d)UNjihAUSo*G=B zy5J?f?;@|c*-0JBao}Zra{N1w?Pk+e1wmz!b~1mEAE@Z=f`_^&o*-00qZ?0OeuE>b zPsfMn&nGLC^YCB!#p9&RkL0=X2kBLqcLQ)tyTGfS*P6g?+Vc-6DE za1PMDLD^PIC+kt^Ev!D3Lxi%Pp)rni|-=Y(d$C zC4g3-)+K(#m%LL&lU7kG-{iZdt@2XK@S}pocF40;+N*3a{*d%xzYcKiX1NL!V{Ogj zVp2zc5F3Kp_|T3ec$z2rF5p60T2cw&te769>y7?czw(rQpVtibxAh)4xG&mK=v=vc zWm$Qk=zxm|mR6JOkWR5Eo&~0c62c%+$D$e99|AWQE_?_-#2RhqF8I<=++S9h3cvKaRs63) zR$NIJCUIf=9Z`$GH-%ECx4$l~b3HzayF9#edJc|7`_o!YDFeI!cH)AL2fF03l5poS z=Zn&__wtzZTKaJAe|UVYR%Jf>)Nk{7ZL)3E@RFnwpE2;}7{I-3;$C9y`_)%=MjO2N zqbt2}``#W-M=Qne{BOU5Lg5z5o!2=o{AZxm>v8b#L6p|V;~)Oc@5Mj)z5f-xqibE( zZs4Ri`LU=w!yr7F*8H|jexx}+!mW(rckYkP+H1My-6;9YIxRz62J19@3S2Bs9zPVn z{Ee1)>EL_OxOfkz4lHc@YvSS!6hW=CarW2?D0?Hm#W=q>#af**q~UZjq?;d%#S}kw zqsqBoiFf<1GP#!4xTR!2@tK-oV*?;reI*&Kt)nf?A-2JHr&yEKSPSEoNpPHFL6Axu3L`d8&>IO&9(&1LbAg||ThEED$wtLs^ z)no zPa8u>=x4{UYtMl=aDqt_t>2uBXp}t*D4doSC*t}=gatH-FC5w#r;qPs$CCvY@EK1@ zCC?2V$SMO9_( zTi4S2-aum`z*QuN)R;q260Ol_w45W$_QUue@T=!v;EO!x*pGgY#*+OYA8Bao=nN%N zLy60fBDeqq(C7ud?_K-8s1l6|~BoVH_pPwYSi&{*0qW z?=7OK6q$`DlLQY61C&$-tGsk!Av~JD$EjNPI41SkaQMXGusHoNy!!pu!wP}-+NDkU zUpG5rDy}2Utd{V>hxWhll`jxCXf&)&Erlzuza4J8eJ@Pho(V-v8avp{vk%k=On&d{bSeYvw8iUJ23CbaAW)? z0k5ASw!+Ccp}fHk(Dkb~8G|yyRF2rUMXk_ID?Z@QfBM<*u}^+13Kw^--wu~vzZS;c zo(jv4oNyf9Xx&x`us}e!8>a47AcSP$S6+ZUe zU;p)AN5zB-7!@}v8RQr4kY2ugIeh-}pO0lIv^nAb)nENpd~V(wH*Un;78ODMRvPJ{Oz~j2v=@Tg?qEb@S9&a z!^sQ?sf?$jgiTZvIkR)3h>giRyC)~$dK~TchBTTLFfJ0Vuq)%DPhroU^)Gzk3*qZu z|9TX#zw(u@M0^?x;R;nl1(A~OJDj@d@e3N`N>bl`OyW#x4-@Eh<6oA;!GI7 z|NZZW*I$14+ZuXYK?bPIK6mnZQ^~Zg#>1kxL*8Abv zbH^E5$C(#9Sj;?P;dPXFYq~SevFmQ!5S6RUKP;BVkqrzq9akH)asMgVzqrOoXx7VXRQQ2@;LK+PWBqiPzJyI7M6_ty7PL zpL4jt(CiG#4^Hfg?-TQg-H8LlRcR-*KpBgl=1Dlg5tDQamgS2b2cxCeOvjnn&7G~- z31MB`$-GlCu2;&PibJj_A*ao9aK{=Ob1K*?$PjFqgfhywjqZnxDdt6FTls-l*_su1 z@{wk^l8=7;;~z(H{$=`kDO|h%2$whF_aT?eV_ARU&aKeTg6fq|eI_nQuQ1-_rH_-M z91fhi2*^v%pFbZJ>$)NdyNY}j!djTfzqMewbqj@JY!Ey4$RBV?s&pgOn|$Kt6~FgA z2Pf>X{6j(E8X%XYWW_UN?>Ss5E?js!@;&De;Z~_F|8ql8C5f=9$W{rn|Kuhwxg~`v z{A{aoE$>GaD$VoTdFb-xOJQV`)4HB{HeA1cJ<1!ojp9yN^5WdN>v588l3(ZK=7oIO zw%DhFSaCy+wHaW=wBZhMl>b~%i~TfTC5t-WsAf#rcm1n^>aDlligUP1E9V21SSkUJ z9^o`P(eT(i;e4h_wU68aVyFntw|nd9@7k|r%8`USyHqL? z-;9`MVPy>0G_1&wr+eFpF^1@X_!Ij<(2D8l25vpwoHyg=L$E! zq>sJkmMo8C8r_>FT?dNuO56xuTt%UU0YaILk#*$9#aSB4b+I^yh4udz{_)%2g%%G1 z2QH7--wyxV|Nbh52wEt*Nekj=i+z+nd{tBK8{u;ttFZOkcB&6hCbF&4y&HOw-l~0) z%Xr*x$CCAF%_F@TE=JJ$h);L^bYD1qa0x~I74pnR<;dCNhr_YsC$Xj*U8&`pBpYT zmsapqLy@C@a0f_Nd1FAfipP*KAT@zffiOaVw!vO@Q2}xZfnyyDgH{-W2!sq-oGxQY zg2f2;t*nEFxRLDf+aAwuiot?GmV=~3Jrx8i30*d2V>61*{b69xv^&bqqBOE8$`%EbHARvLiHhk`T z4)mbGtc2sA_*i(hb0v&aFza5r7*4b;g-?%mhYhT~RtT0jIoB61m5Sjq@jl#Lkiml~ zK!~DqBTyIs;9#*FZe5r}!2(S@m?TKC%7fN0hxzoai(|}53Y$U=T2QRH=-1L~5SO7M zJA3yR?}fL2b|pN#`Y5bTW0g|EI*0bdn(E176NY$9IyAGv?#2p=spV@kVIF2ReSbN8 zoS=IhY?LoPSPj>IJ{DRqdoM79MqR2_H?&E2zVpvw$EeZSdtL{T<=cM+GXg)sMUA-wq6^Wo^R!=Xr9ZoS5lsqy4% z^HYX`4m*pTSm2BvBzQG3h8AuW!yD}0-MaVyA)EkoXxCeu zFTEYEzkQ!$RXJf|jolxZT{2-z{hun|zi_b)*!aW#uY_YmE8+S6o8fS4Pk5vC9*hs( zfWpTZQ(N{^Ou+Ca7q2o-KQ4G(B+F=P8R^b?KCE}#>4Dzlr|`HHCd%*r!y^=ujJve~ z+#paU|MVW#3Xj60B?Pe;sF@M8xtM)?yyOYY$=Hcnb9#kf6>$m{`VZSr@@bV6uMv3e zbD#TMbjeb9R+*tSkbzn?l-R(_^&5A>pWJ2+g4Zr`a?TGg&xCh4DtU=r>M|C7 zFe~z^1Ot!aC9)*{#EYf~azYhu=c31QkSJ*DAa+J)6hmZ`&ab z{MdGPx6hn86O}*T{N^{KVDyPkd?MmmT&QGIU{s-FAE{(Jd-iO6M1=W!28cnc#@^C}BC z*QK%IaN8?I`hri%!{Nqkxj8qpKGS?vb$6 zK0x4QcJo2#O3PqaWD_j9cOz@SRhgO-9kgKmu|nYY6%;;h5vrV!GL$2i+Hw6F#O06q zyRzo83Dp6-MC_!I>|cLvjWKDZe!Mw;U3AM6ROl5rS@DIBe=ba5F>?>uqiyg&ICK1k zFm>haFfsRto%OTu)$`%aH{XcX2(f~F{E=Vf`duK%$5mKp(I6jIfubTntHU$!n&T&q zhZz=|E;#LPTaw5X+$+1-N@R)p_Ur?cC}PL*;#@DjDa(yfzC2Z?415_@d9Dg^7l&>D zsAzG+LB1wW-EaMF&_#M>{Mj1&nPW>Lf3Qytb>JLn9yh92Szy_A>lH`BV{-hOT)#YS z%JZmr&ncIi+Y#4AE)b)fmglKdr?Og9iY4qzShRtDNsn`pdw$D*RPf~X`TN|tbJd0S z3fIp>* z32ba1l^mX8+yc>Qh;Z!qv5517(1M?Nlzk7e@DX3)HREs3#>WhfZxiJMkS>Pur<257 zeeV3>@ULE~gcpuXhXIts^H^8*qWJ6TD}|rmX$cR z`H*nSf9yYDH=p#F+qE5T!EBB4zwbIO>yzauLy156l`e^E7`q%G7V2>}MF$9P(YoOY zkW4wu`2(#Jv}G=Q{MqjCy`S7iZ^0oo#MB+>!=;aDrK9&yR4!61R^;eW&}-z4`ue)_ zZ($Hl;c%SgujHA<__gvP-yH@|6U5R|$zA4Mky}7s>3|-5 zZ*E@qag7B~Q)9s}i|cK{BgPCQ*G@qzm`j$}6;e~x-7^5fP`a>y?csW1mLsz9$L+uh zWCg^pqabNF7&DV<7j}gefGk27PHF;Nz%*AkEIY|Qwu53k7CKk!9TZi#pkTEEVC}?C zi2^biXV3bAT;XS`n>74gDHeZt36?26(2Xv4`D1?bI@!$ zTShO#*8~y<%7Zzqe=z8ZgV?F85gd){s@4b&mu5=g^3Se?=i1JM4&tt?wJVg#kX80{ zz`#&?T%QV)3l#$P9t{f}4;gb0Xd6dLZj3W0A6Y zIjX#km@S3kA}5!ie89}MWdr43b$X$y$ktt`H%sD`ZM!ggpOZ$Wmk36Q`SpoIXazC- z#IH9hN-QWQ7(Calnntd4go{7A8gAaZ&2jW-cnM_Lsb3Lv5#tA`JtSMBX+z`&2%@w?Ym|gU#aSiR z5A#KUDlg-@c4H>IIkz0Lce>iul zJzRSSSLG#q{W)dhrK4C&VyQR7*mTlOxy6YefBV^FPFy!m!schcDd$y)`P;w!+lV(8 zD=zL-(73p=P2$+R;xX5uFstIsZv{Wga3|jJ;62}0P;x`W-FR{Pt#5rR;?&(^1xWiM z@1O~@f|Pw?f9AUO+m>IZeD-Rb@9k6iy90BUXHE|w-)u0?Of&bih3C%?G4HO1@wXnq zl0Ab|8NiQk?=R(k6Q6!|<3~~csTOM=n>WVG<9eES2%chk?i{Do5G1z9XSO+eb1y4<7-kp9BhE|BtMF8jZ zzN2Be^9ZMN9YB`E8mO(06P)^R`(S~{L|$ehX(!%fE1QM!*vuW{GO8q~!>uaJ=iT+i zdIzU3#+ZVGDksaaVJ>81>ue;+an4)7>ZyN`Ke*7f?L1$@)vN%F$|%Z2i6f-HzFjRO zUfI`~&T#=dl6 z@}6^meISo;$3G?W#T@A;@H_uUMN51D9_bVBRw*~)G-Yo5*Sbt9%2b$HuW+bbaYLXD z{K%8mu?}#ajq@@2mF=T^AF);KeoD4TTwY`xE4!*NvJ8uoFkC|#L&vyH zs*@_riTCe4NHoK9d5R$@G7t5&{im&QkN}q!U3~Y%wMzFOO5x50WMbC7@FUJ~z+;7Y zNhk|Wj&e8xr=KkWn@W=UmhBgYOatQ9k8+dqxJpeGzsfs~L*r*TuPaOa^rt`FQG6~( zJow4my<{cWxy4AU`U@$lMe@p8$_lcvVOyanp-&JV$5prP-4<8Q>(8Use zzG`XkV#?BLr5Qqm$9AgtP>G=xp$Z?{?YQ=yGLd<-cs6F3W3E}Uowm18^1d>ovX64! zEIe(N_-X}Wk`CabRa%**>>_PemQ>axlnh1(?MlfzL8OGz*MHjHz4;6Tiu3`n|MBC<}My3Mt@F;H9 z-jn5);fd-@^x~LDv9pYuR~aLm*gxzL^&y87k*3NJU>2(g$y)I!0Q%8~b{bbMW61RP z61#+G)eCgWD(0iDR?cqd28e1y7;2{^bVF!13985ac7*LgPNC{l3y4)v5v^4Tt#}-W z3{?He3cXB}a92Ch!Q4)n27fLvfC~&FiN|--;NM9vG9!t^_a7@!*)*0tx5D#b28F^} z8_EMZN#vSxAVLGQwU>#H&^i_{-r@m_b|0Nt4~tVrCuY9)*+u5`z;N(IPIeeUc>~cZ ztSxft*~Cl{s~vh{( zllZfve2Cgmn961kTUI3Cau|O!9m)^NQLC+{xJ$v?i4EmR7t#5hcVuH9j9hRr1ci5Jazse1egowq*1v6q2_%ra>;_FxgaS}uYKV-*C8v>pR z%P#t<2)(bN%~u#uXiOB8Fkt(&eCb69)8tMe#fG(%5K`{q+BI=2GHm_bg+E&&L1d`_ zaH0#?JD0DbnI+B%{@Dh-EYNmi4)r03D~PNbzp1w3^mY`$y)>Aou2w71SqE)u!OCa; z(OP(C`gRx^Ark!(${iTDQ>|7-noP%+=?4RCKDaiX7>M3>Wdvx(i%NnH#w$G!4m2B2 zOsHD*6Mlh1@O5V#`gnxp7Bs%j@yHeGbAL3WB^Rz>rorw_s@VAda$7OaxFG5e?i5-j`h8#9eb2i5 z*vCFs=*~Xw?gl9!xC1MF_^$1X?=!ayFz5Vt|N2;X`&dW#!E58;OaIMDls$#;fBfZS zxHX4@m7T-1i|d>sqmk~!Q4N3MSA7x&KaZ0#-W1{tKCPvWg4?hE`mcwNee7dVxUoHH zE?$j_m>kz5wF`l|Mz~RkP^t54zxHbcQ2cRRbSMxezC+Afo+%t!pVz+YN4Gl#D{<+f zF5}qm592tJ*D9_$FS^QOpDTR+QzPLlC+z&Ezg`G~2ZzJ&fAvtf{N^J9gA(v|qn~l5 zLOs56oZ6kCvH>4Q#Ef=iH+N=i*E`WB`owXsTS=A+W9iI~@sTgb#WdeG8a|Oq zq+agJFO&QPxN z9JEpBJQT)zi7SO0{s4zD$P1UTR#PSu56lYHnrlnnx)uhL^y-*5$zQ$iqD!9OwRBbc z+kUZZ*4L3c`a8K2(ROKY6>(rQbo&%f5O;UbT5X3J9i4DMFJ*IL%R&Y!|z5@wV5QQ4#Qh4p5f z#)psjC&TTx<=ZDJ@J*hC6l>&90p&~D)#nF!W4!?D8iB<^d^fFS5&*mRf<>epxz6-f zh>9k8OKNIvZ?%o!K3Yg}+gPX@$mbRlH%y&B*tk!$pG#}R47m zp%TR8T%9dm>}vD`ISy*50<= zwz_$!GFL_FZpkvUwM=e*ZGNAt#FR$}lzi3sK_!b;KI$a&>hYh7O6Qi8R>L#L;mw>5 z{?<(_`j`lfm0BX)iNWeUc*=R$I_>tol5(Q5>9)js@)r$d+^lRP5cvt*#yom`hz+JXFST*FTD6dlzk1-+}GC|T{3Unyczjg!C-%p zWmAwewgJJeGr&4HYEC~q7m6fFI|w~#YmLBq?VLu`O-vtZjY#UIbK9A)J*CUY(?*w{o8ufJ z+@K`TM(IfeQs#4%4!EXp(!vtENlOS6;y`xqg5RVIPdAnw-E>M9iXo>%3AQm5@s*~3 zoH{(IY<=xOczC5h+?`}V9Kt-X6Jc!wpSwqej@!>R{X|%-Ge~1;&MCke$r(w)bg*Kv9 z&W$Z_q~M!j@a#bN#Pc3Mi@?NMzLlLMl^mK+7UINL6=*0wF$OSH2a*HU-Qo$%KFj#N zqbH6N!8%HonMcIkfhnNZi-G=<@I)gcv(vgqx3w8NgAbZj>V|xn#|U7J-|z{{DBrn^ z|0E{W;zc2TTasqDcLFod8#f?$lrpq}e<%^Snwf$|DVvbMXlJEOF-isCN#RW`>ij&~ zTCCVMP>{skM>LvJc{kepgQLSRkD16c6nA2OROu(f;ZDQQFhM5?j9nzwQLLYiG^q2& z$_7WhqR0~l7-+;@q;si_1ugd~C|@Th78t9J@~9nwGv>MV^y$nqA-4mf}fLu z?mf0SFc1z&lDKvf^5Z1tB>e|}@CR}6k_A-zNItDHK`RuMG4_uNhBw}LBf52|@Ns_ep3m~f z@_pZr*Kr4)x)flv9`Y0`7bEU|>F#A6y}g{~fm!X?7%ra-jcieB6t-^=twv)w^0v9`c#DDq6A6^f~f9qWMAO9^U9dcURh0EjNo8P~H zrAV3^;$p*j?=e`4ePVy)zS$jL?j|Ps7WX-MQt7FahvU)Hi%Sax#k`M8*J*Y;vFw0i z??1qd8+pnN6KNv7n}ts4ZmX_<=f;{4Ne0%Z!@@eJ9&`=jdIbdhZ$-XrSzSafZ3a-4$3)0gqCpFc z!&c^I1`fw{jGT2xWtp%pD|x-d7FkP(a%WLYU$yRg=P z8t*j!lW8?>u=-vVhWtk4#oV*2>~%L~m6KGGtl=5pVH2LJ>kfa5mf4XX3Bm5kcDm6M zVdtG9u2RLgt4-ugtp${YBrN2qSUH!6z1JCxn;+Q&s&y@ScdcCi#*e0HVrHw_Z z3Y8VsO(iyO{)?UgLKopM@SN1}LLCKl!D`cMprT*C6c#f3O0b9o3*vPR|wkRT1v@sJtc zj0xp!UA&$oB^)cuB$*>_zEV)!2<>Gf<;A0+a^zDSjzVmu*QY}7!>(|AoKur9c(~q8 z>^*2-ci#wK6<3K~_79DHD;$1YJLy7s{5bL2Xru9zlzX(ub;In|ty^({zeO9n*JFR} zHAbS!le*$(E{$3orKB2y6M8qLb$yV>|j<9a$l#(!jURax%TsgvQ)|NPIx7k~AO;q$-p`S8E~hyM`n+`biBe*IG~ zMb4qwlGZqD#L`jA6KAE_<+cEbr zw9h_dAk(3ZX=t+&iK#wmg4K_?m&Y2dW1Uk%Vq9;xe5{t3tjk3AFT9{~)zS!8vxIGC^CCwYL=qKGcPK@h|dXlSIDQz=@A3t-U45<(FHc^7fVx=$dZ z6%=NG5R+emQV)*wqt4SYP#9VQs_@keD&CoX(yGU1aoDV5}VPBd#O6l33P)uQmz z)7OnDyQXtH>&=DH^61yQ#DXUU=JHM&%5i`Z{L1nxa&5TK%M*7~8Q$FR2Xa-G%w^ z@DM?5v2eo5D8Ucxw9BA)z9W3x;M17lxkKrqv%dU#NQG%zJ0h*9z);K#a$;Z^e5_!Xx!7`$#iR;-#slt` z$3~#*!ER0xnh%dq!WL2RdL%bCh^Ty6Tw+bRzC1?xjQU-05&^6J*^R!%o3Q&`TV8%g z_*Hgg{J4`P4!y4skm)<_M!^ddkjx`ru-z(m6o!1?cYLk_)c4HicOEO=7q^yg*|}cJ z&SloZSlh-A!}U6Ieh~}F#a6}%aamk6xPLr|wfgbH2y!LdRoL)Y#)a1%W=BNl24?21 zxX==uv$WQH^Qj&`xqs{L*Z-FHyV!NUuz%!((n=4fW_B@0x^w6*w$EHh_hBvSX4^7W z*IGYI2hL|5j0=@NQJ{oBDrYrIX%0wSH|5EB(>-UrxR~nd<77}y!s6u84K~M+JW*z_ zF|UDFfpi&qmnK5X^xYWHHmz<|i*?q#659e&L}5pGFZ}EOdt>oP5)QywHx! z;-(qZGTxC}Sb4qqlOJp5 z6yALI-aTM5r;V;cF1*xv>gcg>bhw|*1YE(75@58SQ#}_8Vd_37_AU}k{1J;ILIkM9 zvrWyCZ5=r<7>*u3g1lP{hlf$&9Av@2j?Bi<)+_Ay-Jd9hhXgP$QjYCT3LZ;LFPq1g|_+AfBaj0G9W-vCm=^>ygvb zGt!-kKgyI4`0wJ^UGxKlt{8v#0N%nw#R_6PCc19S#h` zxIyc&tIMRJP%&v8XhtpUMPag>n9x=wTXppCQdRkQW z&^B?=#hT9dXAIWPdQ|r#tyD~pHoUB4VVc09cN8|TA$tbkSg&OUe) zroM3@9KJCZesyd%RB)4d1I5Iv(C3@PHT5|7Ar|Xpl!dd%s3~|amohGl84OLw@fIk-ODHr2EuQC`2~(5 z9}830mc#L$=W+62ZO;Kr>nP$|*bL|*4r!6O$#H&r;BfdhUMe#vP*#bj*2V@#90Lrr zD8WNl%6^&O>85I2LECA{GK}(!?Nmm5_0?CCXGhGj`=5*h%U3QEmpNIU_x(sap2BEj z39}zwK0h4(hcC5<&z`zV7tau17!RcgF;ELLo;j~yUJC!ue_ao+-F+Ev16BAavNSZH zf@DD#xk4(Rd*a*v$uMO&{EjqH?KkBwEqa#NpmaT`KE(qz{^0k2KfH>Cb{VWW6ZP_5UN<5rD)UcKwv=uV{`(GF;Wm)aY4v9&v@V236=y4})9hHx;l`zPhXJcN`J)&8EWbBc%zM;mm%AJY zU>-|XK`4%@7QQ{Is*DC*@lL$ho-~d4S6IALo46Z6q>Z$1Q(2b5=39-a=HhWSOPMzd zaN%c>sivB`V#UByt-Ze1%>ulLWu_ck0)p`Hh>!JaB9~y_YJ*qNESZaBlAMGJi!?Bq zad6V^S9-@OCq9dRy|Fe`O)+zPSCHFaA`d5|Ap|a? z5O(3=7_{zO?)JL3e$|$}b+^&gR!h=VYMs|x*h}wOrl!-G#`C1tsML?dJqTJ}g?gTe zm;Q-6E5ukUZD7%Y(82Q(lW(O(w>apIU8pt|G#$hwE3=r~tB+hzIwo^I@$R+rf(jUu zzulF|$^OYnWr8WcFYT+SbE21){Ox34tE@9`Z5di~dC#(pEs)F8x+l>=qH~E-(YU~3 zsEtKX!G#-fwmhXw#m;@K`X0@sKz>DcB%@%+EQ8fxfq6mG^x|VEdK?FS#6=@I6lU+6 zC*v){?zhURTB{oK`%(Ggv)a5~+kT&$#GN?L^=4Os{M+Df(1Q`cAo7QNA|NyN&CgI zv-^80<=GfxK2oV}{vLt@bh7AnlVFjPh~j1mvX8FzOD!wp=MV?paVL2N*LoKwz0BJl zjIpw!HHtkLXN`tk83Tz{$4TO?j2PwvH|CrdI}EJI`?CZGUYmLpS~}<9AzCS8!NF!; zAFy?zbaJysO9&5wu&vG!X<3@;PGvU$!3hqUi({WMJK1b1!?VB^ZAWRzM;uPg!JiPe zi?~mh`4kC~yp9~%XM8~xhR!_;&PAM{8Dr=m%dNWsf}krOXp|CsWT*VtKfGVy{R5o# zHO+=x7x4)PR_;favI3iqvpuK76!Nhx@}paHXN5)O)SYmk4TU;Np4oOR1=&dJTznLk zIQes(xQ3ChRFA)I1dKG{qC|mT9-7CnaJeYbP3hxUFpf8~-Yy*3u7k=JpvnnG!hA~(6!17{?HCP=6v2J#`lU6B?*#xZ;DG_e^85_t^zS-rkY36wcMpZ1b#8>&4di@W>4igFMk@~R*U8%9)QO|e z{vnQ^zY`u{t;}tb(lr`9}3y zm@-`E5!Nm?WsV*h4W~wi!YUSG6EnCZyJ+T_|B8&27Q$vwF|lG+!@v2`+0fhhkSA=` zu%2l>#isI$h49T+Ieg$Mi&o`!mb5A5+U)P7Sdiw7!N?c);C0ZHF`<``JaFM@%Eli{I)50s+%vqvs zL#2tFeDLTnmM{bH#KLG80M1nUNMF_(sRkU{?)nsQPn-Ht9-lmOBCbgW;H}3`9|_0K zaT3`o%Iy-?(M$;ycq5TMLqBV?F6Idj5b0(e{p_K^&^6K<9|3!b8R>C&amd0V=u zPnoYNQ^{NWR*tfrej2@F83o52^4JFad~kFiyznp2hrSn&hnpNOGrKkwI#(x%V@iL* zUkj|;+K`dDslFq+>mh66!LziY0$gP|bwwqQC5!Va4FhlHb6WFw+MsgI_rCYND35qh zg&TjKPO4jbmMtx1x1?;9m1FYG`jqSRe(ViEvTN3eL3{PiQuxkmc#N>2@WK%cnV4S_ z#URtsw->LihHt$d!u3bYLrg1TJn}*d+f0pVYx8mSLVhotxj(!uZ0a$T>zrflFF)d- z9olh@eMrnAyV?*1{q$)+2a#OBV*4^-J{~-HrN0;(002M$NklPfB@kXlhxC#L=i@tC<^q$uJd2+@Xrt6NA#CT?n&`*YO^3Q=N*K z>dl7b?dPVQ83XCkW-W;-2vjO=oU~hEnx0~&`75dicJ06ern;R7HU0fq`&3wr5FERV zHnCWQOr7WfGJ?EI<(a98Q-#hB0v0a0s}F@6W2qB@YvW!;Gg&@8EbiOc;ougN3H39O zdwUT$#Xk$i3T}C;>~^v?On8cQOZGW=y&Wp~s;G45q%A5A&1>7~cW6rg`nZ6!4l~AK zF`zcvNBb?ycGynGgmk&}oc22oV3r0tR{&S& z_qq6pN}AZ7{n4iRJJ=zPQ%!Z2jm!#^2uD&XiBE=w%mgK>!E$Z8Ce<>cOmUvjcjnyL z=&IvFG)^3`ZGhJxxd3*oy0AAj>#yzDF(V(~NtjH3eLpA5X;xOw^HKYjt+>N${04bw z^tlFg8%VWLJq$kG`*wV3&CrdjL>r3|_f+D9#a|j`8&T~|GU|J=|Z<8txGIZ zJ}#Zrrba?ZzL)FS{#!cnBQ4u-cpYxWof`{`afD=outqMxu+jZfnl411pYnF1=;BEeJb=ZIeZ1c!ZlnA}pT&1z5gg+aW!*l)q2xohEaI67Jir;qlA z7irt;?{MN63%ez75Ko4RTom5H?+%nh2XW!})fYG|XW@3ZvhXO}ohCOfW*g;k%7x#= zlHH(_Zg$du{iy}dIg~hgr(Ve951Bt+zi}fx|I#br>RX($g*DO9XU>S6m}l(HgK*>0 z#c+HW3y8aSVsPf|G%7(iPvXeGqW(VfO{E@-X@zN-#!Koyu<(-K?o<6n|KK|0NaQ*O7`1zF$U?0bW z0NFOmI+5d3-cJ0dTH;7xp5Wx8j)`!x7kBq{PV=JgRC2k=dYcp0j&l;vsoqnx2@6bj zYVF;GlBlp7S=Azxlk<)p30J!o!nH}POptlCHmj9AeKXIt)n-O8JR$HPH1`sUf#u})2jSI4vpnU*LMZ-k@mkHS&L>cP(Y9Go%@c4;HAu2u^y)}hT-ef`$) z!D-O+JO|06VggsgjQ#V}&$$kv3kyaGb?ate5PmU$x@CY( z6b^zgN%Ixr0k-#nLEx9))~DERZpZH7p%6qRb04@GVx800kAg{S59DyyidYg3Vexh1 z>@ntNlvxxIX^MVu!`|>8eS}+Rqb)BS8Y1p#XLt*j?RnOnC3&WbTIt5seJ#>!0CRnN z0RH>zE2mL(@&Jqdv*%BTmOd8UH&?@JKmJ)b`{Mby9$RI+$fxG9CTfFkcVQqgO8xxKfkhDnzkL-!YR!IWtbDbrnXQOM7g`KmF4`Mdg*Uk!=#rKl`&ki*K0k zan|Tm7%aCoJl`@K21oI*RL&b+SV|q0b@N%-$6F;{5IyE_3)#M zYvE_Nh!fY2@^9ogCo(@|%B3XcqCL8F8wj~gxgRo|&I3Jc-hAPUUkG>Z+}V65%G-`8 z##{>C?0iL>#px+LoukMvw|N6JS8m$ZsYhlb~AN2`lt4t z_^{?rq)E!?#vLm5?Y3u;j8Q_+7b+ra>bAE%c|b*|V5^PI@ufE5lyeh%XbWPm1h5KZ zwJzIXycfa@x~t=9VfuPIF0|(B$70XVMD+Nk-5g& zZ=dH0Cr@Ct&ug#6N9|ZnyV%+wJEgL*Gw=q(<+EGwyeC(nbNRjLL?V0Et#o_QWUc zac5lPxL`|-0>;B2H16Jik}kH>XXAI3d)kS9**(Zy+%XW{W{U)1*6PZgVWEqb7uCgp z^jO4AQF`xYe(3M-2?N9I;9}iT=thcI0CM#Uy8tU((w=Tq1GqGHyRn2NbsMq)4G;5E zxDwLtWRZ(p=MahDa{)~2E~MD`?<7W6JFX;M?2uM)U05N`+sXpgNbEA|f)$fDOW&V>42{ln3szNnD0P_!xFij z`Ky4tyH*72D4oi<^rYqSRz0;>wX%R4T>S&If1oq`+b?pu$|2k*d)RE8;snFX(_yaT z1Pfd74^ohim?ZfaP#Qj4;k2BtN;rSI6rRUIaC(k-Vs|>ic*kgXR9*^`xXl_wH=Z0C zdDHf>?$~v4;=E`)Gy7XBMU&68yt{n)3cIw&!}BMPhMO1P4A(Bc!Ny!~bRpk>2F@Hm zf+dj_fW&t=dNdwVkgWl0+uZD0OXZQlUR)UthF^W9HGKNHjc~B*VmQ+^AHMj!SQO?o z_a_=)XTJ?=n>W_N0Lq>|Hlg~-5M<9VI4#)R~=yxsI zt=IX#%(y!{G8jJn%E8dqGe!+bIT7g>9J%=E>7EQD-H*a&4zV+TxDdXJ3(`MbDq|G} zKj-vPRffB#G_G58fX0=Hkk@LehQnBE96^~Gl^)Ww^&?l6IN7lm z7qUK-RWn1Y;WP{W;ohU+jfolDnNSp`*3cr?6=0KBjsMi9@`0x<^#9pIhr{`if$$t| z9LMfH^4z=7jUsLy7o}CkspJ>wmiN{cp+hx6>+{TL1hT~yyQ_uxmC%1+L&E^MTIhI~ zOPbktB47H-yh%mJVceHq#;WT$7LR8ij)em(WaH_}xNa`D$s^?fiFX?Ma|s2@@|v6p zcVT2m>&&TuOs&^Q2_>#j?#&kDy@}DD07F1NAxM=g##$vT{B7_ z#=flRN=cqhHgh(xIPV1`lS89n_}sDZ2FmJNOUUpjp3{oT_jck!_zIjfee_urUC>$I zsFqI94s(Q-LqjJ=!`+{Zg;&4zqwwO%vyACNnCR;YKSi!T1dki#wBzHfp}QvMa5rra z3*h4su7#bfsV3n~Q}PV(?N-}vN&NazURGZ4S{|L}5&LXEDfUw}ujN=q<~1rBva+GR zEZ5_QXzP(*Aq)VA2wh#i9^U@xYgV~jE8%yx{5{Ft4lIAp4Z+d%7;@()D z-Kr$MKRUNv^7UF64f@`Lht0XO=i)PEVvTL&e_qcKMkiZl%iDG1)7#iMm&#@~6zis`bw*8ccU^2Jm@Sh&7`1I>&ggAOslcTK6Fr(<+M8QY8xl z>D~zhW=e;zP=-4T75w7kJr=gosiXo4#K_nE?D%BD$=#d@pcZNQ*v_)82s~fnF-MThu&xvIeXQ>uZL)g%S>?ehiorODtt2Lu3{29{m(Sb@jQF8-CKYZ5r!+0I zvsv3i*3!-d>$`g;^XhK3L{LZR)Z)dQ_l0eM;Nh0vz)2i@khbSX4p@M{?ni61S2TJ(^T5M6-SbM(}7_#!TCH z^%FNK>};XF<b1GmV=+00P_{MOTXhk;C$iY)z+Fb1M&N{p7t@}{Q zB@Ac@#HnKl#eG-|9O@_ZK*t04BJNRB_u&TvVTF2WA#m_Ue91N;$FZO*aqRop#KZ9N zarzMDPxs(jnCV<)fiQtf)g<^$oFuJ-#p3oP50$4nml~(S`B7z$3m2dH(Us%7|M2bb z@{1n}=diYIp?{^s7LJ;4qx_pUu2bj+0oZ?qV6N%Z9#7-jYxh4x(u-xt3(uYjpZWOF z@Yz?U!r=O)&|SJ7&J5!a9IY#IPRES2K<$NraP5kxdoH7hW8uV_p$8F8xlJjhgTZB+ z>)Y!yXQZ4&sVQNUa_HAik%b$y3F)7|$&#sUwGf6Dus&KzYXaM+ z)rbQFkv$BsZt3S|7qLa%us(6*Xqaj{7#8kLvT3-rnUWzfaIIGQ&cVlUxi~R86gpRC zLmzGz=a5N_%)~IG?QD1hMS4$J9NjaD7KTh%Dk4*1jq1q9ry}OrU~Oh6ME5%}=@_cE zBbUOB&7`8y7)>Ww_;xK#hu)dVaGEhR%=q3|Y748ZfmoU*Yb(|-CZ)w?l*$XGUKaSs z66!GgkRrbjNbYOV4z%(9UVl9C%SE)j$2qvt?nXScMwP8vIx(h4=4Zkv9tO#&kUCTf zy0InQU{&QNbvOO4f_(JI!SKS#6XD^_+wr7n8Ko zfD);Ux67@o_rvuIcf*~__fhKMO>%23oa`nJAbm8mJQtqn>^bzWd-k<%;)`PDbE+?%h!=_ zORL;#l%#(Zc5MUTh!{{a>*L|l>+giS*Cs;GGV#=KX7NjA`8G=Z z$#CJq#V|}eR0LhWdX2fiJ^b*Wet;|E1Lic8qV$9Fqj6;m?j$(ajjF$)hMonaRv@cb z??_gwXrPjH0in0l+_NZW=^B+h&bw;IbPqDwNlu))xX4uW9ak&sX+Zrf3RU#b74csT z;H=pegl7<1HCrVbU&8lXC6ZPKMVS5?4YkI;0ibd4)Fct7#f6hvCYqYZ4KH&MZ7}0* z7A=yZ8sF_Kz+dKM$A#?(m(s>1deUTBvE7U@F=MoOHT$Y>#B~dnHZme7EbCfl0BI&% zgt_Tz(E=W16dNd7)UGE*nRpcT<|z`sdEx+wa}s?Cu`x*9NpxVUSTd5mgIC2yJc1O) zDd|_xY#LbD)0x`Z|0C`hkk%!orBsEG@fKk-D}BTNDwBtr=(pH5 z3%2s=E7bzFeI9Sb`Vaym>2HafpMwaL~1Ed}2H*t~3u! zeUjgb#qRoNzXIs4g*@g%`|Kl?Hpzj0+3fF(1N+MUuTH{=6!wiC`&(YSUw*sqg5RTz zsg>#PX4B%>N)`Ade{z-POCNdS))=Ve6gh9RZ}E}^uzGsi@l3x^bW&_*!h4R*g>OLXGGpmk0Q76`k6YqNarK^mTxsxGC60LWeX z^B{W^+2E_NYn`^ka=ZCX|CuwGCwO<2c#X#I@t}a^*<}lyN`rh zW4Ca#H>OY}+`D@(Tz~aOxbx1#unhi?Q2BsE3U~3NJRH$d1CEBehg zS;RPH$g2kxv;k2IB^A@{3kC#^W55+G~B% zY<)i*g%sUC4Gv1AHj>Fi$KpUD7_4S&=uY9fi-qvl7~CAreQO3h4l-R8oNXV za8A}1PbS-0ZO*deyA?}%WmPSE*1?ICrlLwb7id?3fuk{jhYxi?Cypsj2qvxHQeE#p@~jTmuBs}!U=dcisRv(p~3JkIiCGF`1Z(yhv8WWe-N5I4&Oe3 zh0jBH(gLT|sXUYiq$K>?Q|=S*I)?r2cYWGR{>tx|&o#11K9ld)m*;Q0s)AB=4J)p@ zbMTcSR(s2X;jpv}20h>c4i^7$0Y;@a-jP@Fvg06GT=9ed&K%8>a5QT}{hYZQ%(dm4 z&$immW@T^YhkmB9%&DN{SNBliw|w*AhnA6Ua3ApRV>7Y!E*ohWMb z3y(h85U8hWb+fzDib>)kyZtHwL`2!+BmqojthTm;0!nBvJtd-2L93^mk(huuRodi} zkF0nVlXwgQ3F_oPHui}pd}*F6$5eA}Ct(%D>qQ2;2$9G)7%Yt3sO)f1SGmn5CM`#o z0+F`EYGN~2& zTsU!2S38W{orS1`v1qHL{ua!X5!u2#rqV_BvlfLxqLz`OtWh}u&x)|;R@a~{-`e)= zM3)9^&Y2*ii|IR+donZ`gZKTIPwNtQ*iAl*T@b&0#v5GcPcFCmxY1WEDCbWZoZMGY zE~Y@ssg6{p&y5MCnvu3U`7jQml@IqpA^lW^ce8D=f|{E1Z(*~2+w0Et7}!$n>sI?M z!o2P%yF)7D@|NNOXZB^VB@g!pRC_EAD8^ z(0z%FjcR-8qYHsvXV&EW&caL6CJi80@}A?Li45GEHnm1Sj-K+$N8D(n!KnYa@4;x%1y(KI>Fta_Rf-)+6Rwp)j?kxDSWnR~4_ zoib%ih_vyd;qwMKTf=fx;XTQ5*13C1IcN**GajECZ|}T$4Y}(`ID7utur#s4$)xkd zzqEnQ84U;g7MS;m6uIJ93i?rlC z{l*(_>>(Q~hX!`%r^Anz9)yK)0s<3|_%qK9gey1J!&^5D>RJVg???xDY7_LtZvaLhMT?qH6L=tE@!VZBaRT_4eIR!qU78m%`S=qtG4; zL;C#@0C-6GZ^lx~C5}qqD^1S!Qj8od8+DBMON!N(jeKT5vmFV{dGhQ3Yf3 zOB%RKj2m4V3&X@m8a;%i7FL4PG0vv_B1#GoAE}vkRNxuQl;46iN2hIc%@z-pu^xVN z;7CQ;cC*8`+P+z7-9=oBaL+Ym>=VY0ebC1DIx#~h0P^R$O`+{+Wnrw0Ztuut7`~hs z1?(6K7*q5e_~)y49)w%)g>@cMO2e_2LFi%~tn1+ItM|g%Jx)dHgO6&df@M={iSHF! zj%ACnWlP{!i^dqk%R?Vf(%%8*JMenxVvW;lJHW>Rd~4G15Uf#K=fEHRXpB}BK3lz+ zA$WhjN|aZ%XmDkGN+_f8*umpUm4fZ@dQ=jtkqG^#{8bsYRvAHK?=| z^ZYW(MU~$gYQ(T2C^U_&I*A34>o_rOAL|h^jFq5mE0wT*rM{jn;wqJ>Fb*!5hkl!$ z%2GlRqZLj!LPIN>T?gD0LD=*MWsFDW+NH)9EwJXzx@);CS9#OQpeX=M1tjSjBai~1 zwT_K!!4EU~p`!#sy%7Teio_N2^kU)D#pwq~)90=IpD*)&;y46+q*}RDmH0l){4{-yQ!Mh_DFxV zJFeA7+rETN=95nJ+V&{^*jfnWy0`LJhl0N}5bIW|p}Yi#0URyY9@{-7OS#(eeIxz0 ze*Ra}R-Vlqzz~%|uGvx z@4uUKgcIE^$w17OK1=+QrM1PVWGOo@BEPYIj0;X*&$OG1QdrbIxNQ;M%vwSPPbUFF zyV#jG-kgGJ+Q`UnZ2yks$={jZoa4$YMvAy5AQqv`pn8Kqv)FYGODRDRe^!y^g06%W z&pfdz<~T`7%a=~#8n{6c3)-C5ePOepTwu*NWg}lGL#}Ay!@{lwnXt86xe+TL6iAN8 zD7&z@R_o9La$2zHS?6r-7-LICk0ny)X0^N488gTBMS-7&j^CIF%UHA!C?zb8vFSB_ zA+!!+1wL{jtoIxV%Pj-3j^5%7r*7TnG_G4L0H?#lH?fYn{{RbsagOjlhVrhLKEQQc z89XjDnP-JNLFmnWrzm=w8=1Vsd|&pITRvJe*gX5%lL>X*a`B;p(fB_u1WeLlvqgzG zwePiBo?KiHKfgYR``Sjh@c`MP>v;J43yhO!k*%BzEyN}uDI$A3`^-QXDs+WeT-R1y zKk%`KSLym$HiH*9emN=%kt>xRTqx$`)n*?7v+a`PS8?4Rr|;8<(G`p%un7fmYj!pK zcpOU&&Sy$=kjj$2jafBbI2$f;z>J8CJtj9!`Z>+%Psb z7QE301U?Phk~TwWi;jf1z+<>|G_k&^WYxm1F2n z9>kh~_&u-Rdl=^MDu}0Xfp3!r04;3LpO_j9hu*qI{7=>l9O@D`@aepc_0BNGvE=eE z>1HS0Lrc0vVTvqePFsw5qL50~x|GL;F;uQyycw=ud55(t@lCK4gY}`j z;eBXnoiXOdyy_*_0!CLg<->bA=<6|Jl);h1ePDZ&bu?$|g=sdEjoGt6%#`Tr=KC}& z_kSHY@7Yh=WfG^htu}ctDL88HdJTmZ+r#)JVzr^bYYT&{;ky`vc>WmX13DLOSCEo{ zO3vt!P#wr|^+*PLMvFgYpP1V&PJPYK_c6I1v8{eL<9Dfg=>|ZdiMU}RfAoQH0&^>K zO?US&w2a;YKG(|bx*=U0Q=Uqm7fid?(YT?$qdvs`$$gY*U&Xyj{B|w#uzZQe4gjV> zPCL9`=<<8f5*Iy75BieP(UGY1ceA9EO_xFVejleHc6Y-O*nqIiF7znqW!8CM#Cc|S zkfa&n(h??#Xiyy_1+<%mb_56rczS+{%4~#e3o|z)j9vetx&2 zsh81K(E7UQbeAH|807Z_l{y7Yuh>;uB`{fs0iJljf`TAM(vLzzs?R~~M-c2BVR<}7 z4=<5aLalSmXKaT+1E}SR%$ySa@;m+q$>y;7Cro)^TrG)GtSi;(-*lA<_lfnn%+HL{ zdnWN7;f}xd`Xh0qJkSB)I}EosBJx|yq^b;uFj{|Nr0y7`I#Z7Hw^}UaZC&kzCMhIT zN+iOrZ)Nq3Dzj)@R_!~v26yzddcoASI{D-$_20H%>!HT^GVHkye|znBerAbaLps?^ z(6aRt2PY5M?fK1^-nV`S?auaZ7PfgI)@xI3joyziRBxKo_NO=Mb8assX?i^zR3Xftn860Y`dPOJ^U>uG?x=JniU%z-5XxyjucO5VF_a3h;3f8+P=163#Iov&T-8NQ5oU^G` z7Y3IX+acIKzT>>kLeP_A)>g}GDjARwg^ly~UR6`FWg8!0X$hH#!j#p@EU2^+0u&PU zWdINsvOJ;8l=;XCi~2=^G8f|sVJah%b&d;xt(Prpw`AFAo^^w!%*ND)n?%grt?g_e zB8Nr+({}MsYnBZFT*vyrjk`A5U=q~0F&BUB{wFod_9a=ORBQbXwfRTkg6kCBQ5U#_fjJT$`eG>hDeOLO7T*aQj=Vw%m3gG;R|>;M;| z?=Fc(EZ>65+!Ahk zx2K9>nni#ADAq&7oGEL8t~s%7u}hI5TQHxvgEFj0OvgLOcLe~5mR3lMT7AqxgAbv{ zqAqy85f|?9a>pO7)Mtoka*>U#DK=K$M(LRP1__jlC20Byn$BcgKnmhdnLRv?V1d4gBG*!@6W@u{SJn z3^?X2B8!rM1d^t3>WJQZJzo>=}Ifpc-p?hxU9g8ItZ9Iy~Omp)?B}B_zqYc|?buQ)o`M zRes00SC?Ita03GaQQ>2r73jH-xUIrcW%}d7V2IPLE`gH+Ev19-<2Wkan zQwOF>9u4lPRURFzxm^FyaF|tdiiR{zp_y@HbirUyH2L}3*S@xOb6-~gLdpb?$Y5VD z?#NU>uy$m4>>CNT=C3^&w7Zr1WF5Onvas zJ%!*G7X$UYww4dqUfY74*ZcW8x6CC9G5KyG8>7+EGY)prv_?kHpW2ifXc>CmbkCQckFcW!3)wewACmXusbTm;=?Mu z@j5}$s*;0|B34u#Y$bo!Cdadorhh)krRAEX(KNOqP_-||+^#nh9aB#ecZy_VX}i- zQVwyi;yux1?OW+O^IaA5Qrx4lht%tVIaLgl#m-hrOQ=Ni$hvFUPPs5=}vasrn`HcWb`sHlYmnVh&B*CMGfz;Vw^_z%V= zIf8RG^j1xYdOQ{rg^&RSdoUSZMeDW1q|$Z(1r3u!5z{A+dG6x5er+XoH(Fjbm0c1I^c}ubC)M_hFFkhiDa*x&ZDbX&tzLV2-RGOB_B!2kG5T&&#Dt0| zEJqqcU*E#|+R|cvuUz$SHT@l7Y5KJKfHp^(t6EQSw^ku&CJYrw2{&HuOVJZw@g0>s z{@9`uf7PaBv6Sksy}xyx-_76oi3QhUi(Zb3q5OP14dlC30^R(%b&(Vj3E|CDZUmce0*t+^^7^Xw_N3#Z?$$=#VNu^!MW8ES=TDX^y?2k08z-sFm8V zNZjT5aPQtd^fle+bOtebq;U&G7&oqnisA~UT!ttcIzXTz2mFM`i>-&zp#u~&oCt!k zXh0#!3C{Wq|P1p9%^dk1$m`Rl!uVi&MPR#K+Sf0Iq;# zQ1nZK$n@Nj;*1*<_13(j205jArcu59^y?`Go?_rB2A*QzDF&Wm;3)<^G#F6ssa+;y zImia?_UzpwAn!;jP<~)Zp?0(WT0Fde5ar$Q$E`tu+y!e?7Hz`(xTUNK9;n)h&NT;q@>6-Nb+Z|pXpA7()q*5IzCpCx|M zsCy0{I~hiY4~G73P8%R!rGjrX@q2m+oNR2KTtN?jOb~CUf{T^M0($C}3Llj<>TL@6 zTz4KIYPqKd%%N>sGUka&9Yb&7GKLb!v*a~RTGyfnt(L=lgNSV z0*RgS&(bkszAj}Lye$m1zw5F-{rMCFPciTm15YvVA;Z8^p8p~1&|iq=G+Ph}+-}d_ z9q{$ET>tysmA=onRhn#5`0Vq&cad#>vYU9{j{9_?rtt)~%ck!Fl*fKm*dMq4+V*<= zH2sodU^_Yfk~ZQg*zW}fGOw;3+uqB(q1iaEAN}z}#413#4ON~{iEZ81*{t68qRsC| z85xiH`*G^XZOzK}jQd=M&wb{1jFpGpqd*|^RpQl^QQR18xqZDO9O&mz0L-q6@$@b& zfY7CocV%@2OP;=P@Wk<`+?k!7rhhl0CzJ}G9xQ?S3DKjar`AG+HG-iTG2fSU6Yc6n zTZB?(ZhnCnJhzGVJQx)+t@yI`^!4DD#c2tvOVJltbE0T=#N^gXROsv2xXW6(m z;_>vMf%3$F4YgC4?X=uj{q+5r{``KtHoQMDJV~kcznDw1eSHbY)e)^J zmyTxjDc#wPit69Uzqe}6clQ2%l6Uql^+|JNXm(g;)D&nQPS$RKxtdHnE_2B{@x7JR zJdKj?>^4FI|pn@^_om57a9@-ffx9-p}oA z_Wb?4FOIE0e_K~0c)aJo=&psu%?5+C2ahXB-;g?bI;rz8evt8f22tR|SXn4`^pY|# zzg|@u*LX^oF35Upd760-vE&NqUbGS_tfCz<#*RV7RxtTlT$O_F00^|RzqK#T5GPKH{4$ADO z95+OYj!S&TP~qSj%E>+igf`kVCPT5|9*=IY=CTOmB!=#8&WY#vux_+o`t>H?)a^_r zBl1atGT9ODb!s-C9P( zV&EwTo?_tr$3X4;yq}r={fFqisUf%P{cY3G(9k}?6`l-J?JL6f{=!&W+b_;_ZgV4? z>>tWhO1))N!s%AY#_-u*X3P;YY~|XXW3ONJb?%kl=LxR;)3CpX?$>U1PAI6BDRL71Uj_zF= z*?1DAr_fopr~YscdveQIVyow8$~OjscQAfvc6%wtDbA zCPWaLV6{_N=%5fPaQ3@VqBp3_fM}f@$tRGya}5k|JQ$R+M8IZa^UTgIpncN6tQ?PL z@1)U1j#TgI?h8F#9OVx1Me-J-uUR_9t4K648&TjSE)_r?X9vD$P$il$tv??3n4b9*o8g#<`K=p7_TwIHIatGl9D)@4!o>|)tP zKl`^TD6VBKhz&smQ4x?L3MefkfzU%ph4kFq-uw6e&73*+J>}keZV0XmXOeT@Ht)>5 z&$MU$PZ`~udO1^5%9egelV{QM@MgFduJ`3JTX{%7nrC{P=(B8PNspf`PPTiKrJL=Y z=YMa!(x#L~k$n5bx|EBQr_a9-`4sXLcu`V--nF-V<@vn3cf=&e@xtDI#dzuY`{R9M z`u%Jr+xrq_OKswE`loxJV=k#j<3vmNx63tIf@t>1oBky56(LHBzvJ|xCL)D*5?o7K zis6#T=?R2qQ#;}xA-6!D;Y*@#P>y|5mT0P+kC&T&=AWkK9Ikj4&WZhef=|o+P5jXc zLBdxpO1M@S);8R!JSz`e&}2kA(SdE? zt_F-{Xh2)YOD_gLJOwhjDp#cx6qLxP&!E%raXUXsg9lA3cHTmx2XLpaZ%}E(t)jNt zrcIx2#pQDPtZ}ict6j=6(zYo`X!lfFwe=2;T6?zu75V0=tf{w(LUlN0Fsuv*v@2Gr z;sXx#YOAkeAyQT4rPf`jLdJyFNs|YZO69bE0X6;o^2MV@!anuADiCT#g99Uauh^v% z*GD<6o~~Zenz%CM5>Nzoh)NRMx_igW^4&AkFCeLJ!mZ3gg#~l6aQ*jw92*k-bVYgH z!q`n-43+6UZ(n>-wlpb8G=!3cdlS8r{%&|D9J9R}p5=N>&m*LnUd|9NJkK@#sl*F; zq`wo*Gd)i9S^9fir^nA0C)>Tr(#`hH^S_t9w6xZ-Cl0_&WCaqP4|xjYDUd4#_O@UD z&-AnLa^2gn$c;+rsb?!i`n~jba?6QW=_%#<=HBO+YYu-u@y7esY_tn;vpviHMd6L` zH1{{d8xtMzZ}9gTvMqg~20!+^^?*kxJ#@iiCW~~=_a&V?N6NPA?2-kv6Ib$uY{a5` zMl#d`Lf#ztiU1sN9iHjbh43s~=Z|>`Av#aVgVae#K6NxYaRjUIhqLfmV(b zVA$ClK{@7FjF>u=@=aXuNzCLT+3jpzt+>+~w6&Iin7G{MbaeJup)i}FAsw~$inALQ zYClDKF)r;J6Ueh`cZ=-6It0@6Sz~RLOt{M2R%E?>Lo)N~wf^3IAx|=~lE0r(nO_x` z77M_UW9LEn>XBcc_8#r=E8PbgAm0pezXT0N7y!*GO@bf8g+6Ux#nJvd`-yZH|i=SgwiD=J1g{kHD zzb*D;^cnB@c=!2!S~AapGctpJl6imc?!aLGy@uRM2ABfKLu~)^oO3p)XfMAMEgn)A zf9~lesEMt@CHm(YOMuj%*iJ<&06i0pO{AO;c?#qykf*>)hXVN3!S4>cZ3%>trB$JG zzKo;gF8NRPSP14^-V6>GI`}v)D$=!ZlhGo-?kbY?6~2Gi6&+KqK3Pr`2tq0a-%%>g z)M{9^cu3wsj!Mf*q=8f9oHloM^;ld;Q@=nM)P=fqJs?e>(IK`^$1AiF62dE@E{#A* zss#FoUOq~A!WA<)_xBa$Y@U_z~^Qu@(8aeXr zJStNvG>IDP>aAY3Un7J48n5MSNXXNOGVj&%5rI57cgA+CSQ7xQKvBPRO|={m$@6oc z?8Zvt+I>srU8oKfDsE?|RAXhL6?cr0x3(P-Sk&3krhKIpB+v-Q&3&@}ipRAdJX^fs zaA=_0*|8N!Ysk-Ld{S!2m60SKA%F1k!}Zito$*~h zTmS$-07*naRQemPY9xILd3%DxUim;dLs>^vm#HDVMeJ~%8e=L~+3SY1lcfQpOw?t1 zo@4p573!#LA#)AnJ5l|PeZRiaajrgPw9NoB$I6#$j#G&@_U&VDiS5#D@((l%O}1yzczbgmtp!>Upm9v#FB*I}TX%T}hJJ4{$nl-AItug}`|glLh!d_~%E!>= z15I2#i6Hx|jrfjACAdk828&NO*Kq$vgb&{qvP-`X_g{?17wTI>yGf_nSg%u+Cm!yz zwv?V(+I47ZX}41@)8jmE`Y@&`QU0ZTCm+wVzrmOn{Xo8lkW!Xtgv2@VUD4Z$n!DPPlf7{ty0nKD6Q8K=Xb5 z38?Lhs8XM22VBqh42ky{Wgfo}S0^=&l1)cVBG00gpoTuhCaj^NNxbpZ0^nnuDur&gQ+ zN=;mV^tKSarmjML6-rYL+V~&7r6`M>h^y~_y!vv4y!KUHrKUq!MDD~-ESB1{Lx2;& z4`raQrj{j?Y2P1R=_rs|L|IvhL!OIDWjCrF{kl3poT(eH{=M&WA4@URQMB%O8m^=D zIQCZlEYK*>Z(mV_^k|oix%>$9S)>=~Z8OvnarR|7LRub_m6U_Q;(tqE+)-Iw*GiT- zbu38UPM-MhgPzbhO4nqR=XnxMlk-5+m)rg&!X)jlqxXm`z?1YC%8f z2JV5rZZ}!5;3v}>Y5bIHAvdZ_W=wBTg~a5`r$>d5BW8gja>lPXH7*_YfuA+APH0qx zZQq7HTA@=v>h0;5M1Vy(+pgohSz1GqL=-BgN@)f4=y{p6edadKvrhRA8rG!WrA0zC z0Nk*xSdS1fwjE;vnkYcPhK2_B4ij()OkROW3HQ>EEKXWlT8wSch#%hPd~XBg^}vCc z7y$@!qb-g`OcBy7{dbJ%umCmzES_0l!3@*5w>f6MC-N&Gbr-NE(87T#aaj$j5f$o( zc7~jLyT;-e+F{uP4gmVeVYk4ILH&l=MU5i6f<+6L8;e1#@K%gAp=;<1eQ3l0PKAy( z@)a(S3E(YWB<(UW5@l*Dxa3%jbSDz|MU?T>9F0sRLwrV>J3?bCc+%46R{o1l-- zH~)9E1?Cu;R42CXq)+n=xdyr;-`X$m8Bl&-hiE$q^+qm?-d>}U{-zN}H$(lt5M>}o zH$Q0HAs?6_#@)i!fxt<9cMWwpiawsd~6ZQa>og{9S2R6gCd>}ax{!8+T%yTf+v*d>9F zcKDU=PTvonM?vzh<|&Y;K%N3GLJB130x3-tYaPirOMq8qo<_?@1G$?+5T^I_`AxB6 zg*w;#IMCatwX*nIx!dV%Z5Q7sw>m|#%F;R=FsM^wa2#fESPQZC_Ly6!R#h_@!xS_5 zYf&$5ty%yHUn^#MiNQ@&anJ$=@tLc)Z>6IE8o_Dtz^Xp%=Qv`-Uamn1&bwGGw_Q`FAq zj|CVMfF35#K%B9ssb@%3swG7N?13mOHjsw6B`*b3{!E&j`oI+dX-turlnOUFLkIE< z%#n{X^}jHvfM;>hPX}>D0w|Q_sB>=T7viYI7D_S`7r=rx6sB$bMiUx8Q_pqm4L@-w z7*ByZaiNAVBX|WbEEID>TT?3oc#?cb+Ftkxms*%;QKC3l_KnC9pr2@J3(XUPh0y`>zi#7n`P8_rqh*MHhDl}E5 zi2_SUwRhgI=rSlr=7Xv~4?u->m90=?goB0&p43I8eM1}6^#D|;C+Y(A?U0e-{Qsy^#zXM z-t$TKg@0G`j{11xv}snW#jgsjwXkOZ)Kn)9>e%d@xog)B8)%l+S87Mj0c+jeW(7mES&Bbdp+hdY9|4sR;FOfG2?Vo~Xr{Kt7Nn^_ z%BYJ|Q&lEGk_W~a7kkARwY5u7B+X$zR^^^|GA3+A1zJCm}rX|J>(QrjfG)6;5iC`R8QJ^B*1{LHJvv>n|CcH59$ zgn@PC6zP&cGZH27JFbl>4)bVvRgE=FpQ-YSPZU4d*48TUr$gn1$DjB@-U4+ogO924hE9P(ujhMoan4EHB~JN0Q|1Q4YFd^C28PcG1= zC-pTIcIW|(Hm|YA4qsGg`^}gk-qGx#$J(t$ej6kni%`qIotpB*SM>H0Y1+@3)nM~y z*V!ZFa7(j9O;x2;O2`netgLbiR~CLf zGN&40%P-8e*kw!Vm&H{Tj-F`UXlbAYwaludbu%C)MyUz#>9wsp){B8z%UahhbQ#T= zi$S0I#9T0@mx=Kha$u3RbQh>oRwi&sljo>_g$`*1b?okxwh*dIr49r_>I?YL)86Jj zqD19PpW0zk_-H!bwS$W``zePy?qH40_;#CS(=btxw%lnwW@`Y*%-?RSWEa zd4frpEU)b4V8SOaOn|&;6pM7WSQ~T_P~`^!1@^$4dj?&Lo~+_)(IS@I!^#0|Lf-&!VBmRPNIB8?5uHj@KLBTd zRP@IY0f+!-0EcdoLq>ZUcoQbLuD0H4Wfw}H92!ymb*uihh$<}8fC|s zqfR7i|1|S{BubXk&<{BRq>?{J%EZr28fq`x=Q^qt#4XuOz5t*AjR|A)am#d#dIL66I$#Ag8sija zuvq}YV3`}kCQNuQ9@1u*Zx9f$bEvB!3aEu|h2|oJGc3jdF-rvoHPlJaQxmtUQfUAe zXl!yOC-M~|@LZUbgie0mb?q-ych+)^wE*65)AWnzcyjpRhdcg+_DY}P`vK(ucQ9!t zeu)673I_lI`k*CEyMRxVzzk+nW6`L_BKWkCKJWX*Y5wquYJWaVM4S-EvnJC7RL-0= zQ}d9dlbV;9kKDQPWo~!5tIC+83x!M|MAD3}Z1kL})ZB^WvaDEY?V67pr%#hFf==7C zag&pDh9XT=BFY@vDMxrXXak)X=Qz4L_a8UzU*a$(p_$Xz*l6?T&$o5!*4d67JKXpM zeJ2V$Ck^=35I2l_6TO%E4B80dL6D+4g>6*xx7w;wJ7n=pJM*LkRx`TJn%CW8`!Akm zuR3v>m5ZPJ%j2!KyF-zw9`_#U_@I^%PO~31FCm142U{?=){Z%3o-LWBwrkJWfwe_; z;QpO9yST%q?=NBB$a-75z1-%DMl<4%T7Px3Ejnt6&8RK4l~3%p9lKZyXk16IDIUQW zD0{Z~yLk%aDUheYOMwEKf;5LnaY6ITD0B9Rw06YX6l)&u6Cc$jfe>?JWtIHy=pNWe zX=$a#{VJ=fsqxy|T9j&O?tq?R))erLirXejq|T0B`SIy>iX}4B5d$ZNx=RaKn3T#2 zZMQB}p?*oEU<#1PjL7~LN6t82X5k+zl;m)ClXXk#g4W4^G=Y$4_4ajW;+8f}b)AzA z^=hkj=9qplKA8IqYEfFMG?>s?&=+cfRw0R7u^17@2!KeburP81l7J0LE1_HO*5H6H zOJKtE40)D^X}6ecS!A*puB~qnupo&bl%|00kYGUEwZ93o(=LL+WMHB*UVw2}wQ7~E zSh2#kZr$n_O{7Ms>%v^XWT4$NZ{9q6*|HPul+#YOs`4raB%o&Hv@QU1^zEv5S0?-y z!Q%h^`Wx+$6^}Y8AsQ63X3nyIJO2VNC`=UJmrED!W3rd>uDkBC<;#~lCI?!~oHfHf z{;3a1^Fnp4-PAA_i%Z?MvQi6lr2fha$)Ns=VT1uAeY57K7W>MVF0-B6cDY3y-*v$S z|7Npb?9}L}6D6-OYHQZ4vHR}3-!1UCGhP7IWFY|~r zm$X2_VF58uJo%*EaP3XDM{2}q+W{1_Bnt(mIgeR5Oop;{p>H<}{ z)6O`>PCo5KwJ(8T`u<8S&XIUpfgE6|T^EWlw24>=pvj2cbI<*@{JsZm$M&6K0(aW3 zolQ=20uW@zjA^!b@nSpfm=o-vgO+A3j&E`P5zUg|o2OTU2jGEO91@NG^rt&)^}`SA zIg51|Hnm;ag1*`R{6d;7{NM^5bFB!jujmLcgml}p`!1{GpW}}|-i{UxCky0LURG`m z)27?>>9ds9uq3Z-YFBf`AbRZ#Kq|C(y5uwr_3vs8Si7~&UQ0`}`ZqqXMBBu-PL^M` z=X?)!9v48zc!J4V&=MnlFjE+NSD>O6SeROPrrR%~X|S}r%n+@W%%{2Dx%lFX?TIIz zNJg)#tFtS9a=Fc!J5&A9kF$)UXrj6Hos1bhflyN;7IhRBG=MqK3ebabX-E?ZG$6&N zpMKizzyJP3|MOZnfHF~lgnk`NVW&@@ZVMJHa0{Pk3DeJU_78ZARAO*Y;J)gs&(*uM z1esU#oUzl_#n{`S9kaj+06XRRTL#xxT!xu#z}14jh2Uq6@oUXRn&KayGJvjrPFJ2CM#fXJm4(mvISxpJUVYSw65iis0%1=Cg}n|c!nI^Z;XRM+bN4Cjbi zC=8=hgyczbW*bkw^PTS);|kwSUxEJ^)qGqi+OT_SZ@;dUxcg@DYBXQy!?;7kDwWxM zNtraZn*gQIOp-4}GIyVyJV}-z^(2!v$v!Pw;Jam1^(6ii;v^E~odV6JJq~C_OP37Y zeCFCa?<86>-yx8`TxMYKqn;)qPk*JCCk%jK@L|x#jej~a&g2@HUjTUa?Ac?B7A?}8 zK0})7yIpz{r9)f#tzI)^o3?A6 zfV46~kEziiA3INhJO%O;crj4`%tHzTn%5B4qru%H+=De6);}mOlxiL8CSuKpC`Qz3 zo@XA|t#xLXcHzQbTZPu5rJ6$-uThfdAJBS8f}G9IJ|`{NdZk^UiC&2oXaUgOEy=$e z`wa99i$Rh!UM~(Jbsim**;S33s7H|iDWUQr0T^N?x}^<-eOOF|EUS%Vet$>Aub-l}CG_MER*0Hl)SjfEFUCF0qJ4(nLJc zVTuaVGm|EZ7ZwYXEd-cc-TOKsJ%Wuw4Hln4{BTgMM`MX6GV$_0;-NJVa#p-VfNA)} zFMeSFDKJjiLc8qF`4M0i02D6$TCtsV&a3VG_x_92tZKx3sxrlV^1V35j)}1;Ko3{B z{^7T`+NO1zc|93UJL6P4VBrDU9W8k)al%Jr1{Q5sTyaIR93jSGM=Y^_e9P1>ejk!>$0bV+va`=VOU#rs!4hPGHlP3e z7aY@>5_yUj`z@YlZ$JMnYD3h4{;3h69^cm5V(SId)@kVcIvB7)b@6myQpr|MtX;&aU@VfY>;b=1p=KO zTK%y7;5$FI#~*zv`EK;2Tg>dXt=sM4haRAZq~-K)w5US9G-Sr2 zXkZ+GX=e}(ZNulx7!Zva&iB4tAqB>TDA2=we1ENZdW{`?j@%tz3)#JPT-7MX1V=sy4X&+k<~MZ%3~+#BEcMw>l*cKGDv zk#aNk0Qx6Q_(W(HKaAPqjoXxyA7eXhpC5f8Xq6;0$nk`Csc*)ylY$KO9LH~*C`jdHZ4*G z`cUL47u&rAcOXKb2Em8(bN{&(uc5I}qB>~_OY=#*Qok0*acLZtmr0t}FFvai9z)<& zmw++>EeKv>0;GH(gRwB)c)}QS$|7lcJ+$Z?IsWfsA5`SD9)j4e@j3JCGQw@w8 z&<_(X>Hy%Iaf~!43Owgs;=-?TPX3f@vUfweG2#M%@t;o>s9Gx!^I-YsId$1mt1fJ^ z=IyJkQ(D?f=T}*Y$+zV2CaalIY3)bNvvz5&Etm6a$#c~t=mD-5B$CfwezHTec}8Q6 zEnQe=FFRQD>)dEPO&vCWf&4CwG}EMQQ0+tt%QhtbwXsg^yr4tt33l+6HgVI_cG!NE zw*P3c^{Wg+vJcq0ORf<50KmvM)LZs4Bnp^6`T0#oL3>BvY{BtTwso79EfoH(q>wnN&^6;j$L6JOR)UE}zV zc(IreVM>~4VK9*Nj#`f<7W~=NNFxDM3C)uM{c6hOx29A!;L@}~f{#{Djns&WWM2(K z&my9vNG2=FthaYSzyf>3BacACLJJH{PQAU-B2l3V3rnq`vD7*wi6ebXO!^13mAe2S zOkSKag(k$pVuq?>h|u<=-#F%Q^W~ia~W4#sjHRG!NYp zgMpec-;o+_zx{T*>Z+^U!Y%d5bc=hr$K zvU^fld8O(|9=*|$=$C!FG+EI4f)Rs$!{RhnEngi;!Jkf_K10u0FsmGitat9*u~!So z^u(K+_sEY^r(;kl157?`Y}49jGk~7(?hU{Dy}kV9FPE0jk;(D|rZ2=vKc+wDdbCi$ zn>d z&|jQ;_Bv_kxGz4>2f6eo{IJvrU2dEqjUFu+TC^iypMc+T0Xvk{^(og5)W39t@u5%V zRWS0E0yn2iI}Lwft$Vc8$V4os^aW@s;kN^=E60#07-{H-8AmkGJTdWtX;<&^j}l{p z16ZPw_tE)yAaHGcjTTqZv=L2;Dg~DJi6Iu))2{_zkGS$@o?h?TJqy-_3l`}6kjf^T zb55m$2E`hm87I+%n=YRdb@g?wi?+73+Kz48Z09q(_PU=w_uO;F?~Xg}u#-+Y$$^;o zwIEQ|FfIX#@C*K?SftY?(nDDMQ0@=_gt&$d9LEEQLi}t;(hX^6dp_Ph=*AClIfM}{ z%1b0EVXe|5&5{w#VIC$3G5!Weh)YP2DFp_k|BaE)$9n<)qG3}tv(XCV4`;AQ8e>}I zIZZ-}msp@C3p#~z&_14h_F1Q4LftP|Kp$Y&ro_iH@##b1VBlK-1k~7NCPn^=!!yOj zxqo3y^{2UujVFA|1W3?aFVLr0&i=j7OJkLUI#UV}Iy;&}d$OkWi+R9w30|n9OZ-u3 zy>y-=aqE?dugbf7^Cs~({bJP27A>5oxu()Ohh%moUSpse6F5oiV1&}bc;iW+4Sj^4 zqmnBhK&NQKPtXq9k4O(GCytZ*hx)Ceh8xIa-^%&UObVcbi$cHrC+tFWE6WVW=GWP%?rXwz7vv2H{fYyhALLVBf9*2{bc^*jxrs3@x+bD(P} ziJZm`JdLYA&6`_c4V7&+ES~w$1=SWCl0Qysb8T~5bD^!>Ve$*4l*F6NkSu4;v=W&B>kOE%38fEi06A3Ar&%AC+PZ zfDxlQW??an-_siEtwlSb$MM^t(c5X&lxx8RHspL-NSg=EnsOmZMJ3u8&bTMJx!YY1mZ{|rA&ZNagk?^2W7+00u0kECbu#HMocsgy^>bM zs6G;NEhhXTY5$a#$Hg3J7cfmMOrS$rxW%+3J77zCVA6!~36p2~^XN5c@pB789eah4 z#R}!;M4W`*rrS?>x=K!c-Y*Ic@J1zpD{-JtNb}ljuXP$d;d*b6ovMUO|ML==(Dm6{ z&V8Hgo~2&S0#&{T0{C{+u}9gxcix|p#p;J2wRfKXPJuAcNX#SLPqO4h=BukC@Rc3egrB7FqKu7iP4l3>t6Za>FATaHfm%z&lam7t@9@zS;MQzfEm}} zhaaKq)I3wmlZ-y)6U@U(1s3*8^9&6eoK(fcw_*l2QTYD%eqdMp_=m}2<;s*r(?pAB zSW+~6CzZ?Gut>~tXP-Kr@?Wv?A-m#7KZ{1s`J6uStQN@=fj#Mo(K1y{u2$K-uB}bZ zCSHIrS$~3#rShQw*i$Ujxm5!Zcxz*0z1nf7br0-TpAzJ(^0L?((EwDWc2!ebCCRmz zP)P!-O`Tg*l#^!5K4(5&2;F+-JUEf4uF_$qWuU=pg&X*T13b zu|A!AIKc^vWI%W(lA4-YnL{>Mv976`N{#2`@^!T@zMF6R>tFwB_&NIMM?Y%E9CJ*f zRJ2-_82-rO4*xylwXyLQO~j|14z$wwc=5&~1^tZ>j^oA4ybrwt&DBP=7%i);R{t+o zooNxRsv8z)DZ7`Bc!Q8yDmT@ z$}ixjn&l;zTp|#tt{877bT3g~j{Fs%@ZVD$#Ck)K4V&HY8iY={X2heJ<+l>H4{_V6J z7w;3duV4IeyX)o~lX)C{{E_ypD}QXg^2Il-vPw+mG;z@ANDt$UCyX%!+5-KA@85F6PrgC5gg?1yfK{LBVyiKhZ;m&`U7)B(5HF7rH*&@GBGA(y$I%@i!kk<6v z^XMO*`#AJ^0*-m5&8YdRM3P3d4C%|X6*m1KRptrq(UyqsG_G~zTS8wat&pBhlUM$H z^1t+b(h7Ygn)c*x`xv~#mAkbCpUN6eJeNG`c1_Ws7ixeXq$XMN()I!cgG%FXB&4H+J+rv_FQv;q|f+09BVD9x#zF)6v$H`Pl1;L z1w3zzwE-?D7?trwSgCmuHzaOnN(qcu`!fDBpARwjXpWDM2(!@~jj{}GIfjMXRN;qN z?+**~DbTtZ*D%#`K_bN&Ke>`gx%{IHXadHh3MuyLU8Y}{3E&%|Ta#SBc2+8rj}LZfKq}HLiIR8= zD`deX#<>9CMNAjF36&}zBu*?MJX0q|K+zyXbh;XE(U9Im{G>uQ`0T)0v@+H=`z3(V zCSeLg;yNcjerm8;j%(s9)VYf9!gbeOH!jeFrqi*<9&1M)d8FI<3&sYGn(cDrx8lJE z|Hns)CAue;+CX&8YpI>L=x0{_YZ2OMC>9hYXl1ie-N0C7mrQ5`PV;sI%6 zvDDnpdDGcqNVUDXW1gjbR3WVzG4uu5-8d!7wtoG3`@_wDu+vUEJ$Y~MPG}r3ifAUN zzo@LO?XC9ZFMl;-(aOU5+;_jpPC0X#EjVC-z>RKucKvhq=UeY~zfNf=h2ZKeTugeT zW_|5anty%IyX2trNg9tMJBte>u>_tI);zV=o_ajhwCscvUuOI5x1R%SozEWLPYWlU za6;N0f9d*!;=|~cO9QM(jx+JSgBDohv^r-t(Jk#AN`O;Td_K`Xdn8rF?4_z&{xLLA zwYBb%G7r1+$&5k$V;}+SX3cbxoAe#VszFJ?Ay1k7PSgmXuB=v@mE&wQXQF}lI4%u4 zcJYjRd|Ng^Ir{G2o}x#boI(ACsb+leQiU@trUc<0xIeibUs`Rvk;a%?vo z4Y}?b6Mcts2X3oRJAXhrvi$O9t9mGU@$K1y@2AJAuKmIWlT3C=#OW z^rbJ^``-6Hd(ByAh0k(P>Eq-^n+R&rbjpD~f>p%1t|FCfFIF-w~VlW%zxmS=X& z9h#@m9xD}q;hoUqyGFY?sSl1IsZbGJe-oDi3((s)Y^|MxdKEs1-`)l#%zrf$zHvkv zL|w|auenoD<`jl6d=B_UJ|LYdW9Stol?E(+P#NkT^$M$MZapoKPKpNH3#}k|e zvvc54M;+z*1w0cbMqTok0#8#gD5v}aBZu*Y$ha(iW?0NjfdDypD|{)oHg{+&2X^-S z&Y;SQ#uU3^0!N2>^IsP&`9$Zm2mdDh2S6TSK#zFBY6*y(pGHSB(OvTw<1gGJT3Tpp zQr~1M1AvqgX@ZN%#w|uV z-wH!p^kbh!KgXWd*Ol6$1E<-d`PEj?wZj(9?YHUbcWXCk{!@E7WR3)@8lwipD?PH= z?3R^ANru{2~6v-*%;vS^`aqb(WwJ$)ht98f@S|BqtX%P(zyxF*A&~ATh z#2$QV#CCK_cp^6hfTe>2@&zd^zdmXA4HtCE1YSP-0<4?#B`6} zo!oh$N2Pj(ArK$02RkS}4^G=dc;cx8gb}m7Cx7Co#o4#!AG1 z`JarD=Q;5cGmLh|kYhqgwm`xBjyM9Ov@nOcV23h7r>-e~m9{Qpa)&km2-jS5jeDN{ zXW6o4_VJH@+(~}YpB=5N&pGED+qq-Aec=mVkQ3)^=~3+4-~75AcEk}LB$8TIKl_`j zVjJqF+5QLaZyVQdOuj?CJiKbP;Y?S;Q%7rntRz>KjEUKbCfSW+??xWE)BEpv&<;9$ zf2AQdSPLp`!{$gltU6&=DH;yWHiy+d?!Eio^w;f3F_{i6g8`c);NRozZ-0AAES1{T zAv<89!0KctK5ec{CA5FIYR)l$jyX_kXV)-5I5rfWEL?TfFJ)eGvg!mC_NfLf zI#G(&cA@+OP;mrS-e^|s+0&eoV0}ZK{rvZr+k%C2#SqHm24F~x*ue)cbq=}D|F?JB zRaac=7X2)mr%5X=8YZS5R2o|@o&Ji`?etfk>K4P;^2fz!;b4=6fn(-GtZT0PRR-Ae z&*#2XejQG=&h{4dZFc6GI9Fdj@`h1nS3Q|y3jD+8MO#OU)oQ1pVKI7ai_0R0g;(RW z84lcW{q+37kG@L_C4AysHmhs9_1^X!)taGn`%IU$v42bmk2xp z=&5Z4*%l?_zo0;7kg35t2p$kq$~Psx%tc{f+&6(deOAGRr5InifhBuKc>A3oWix4t80~3}LC2{!N)Nxx=`~c!tRu;~(0LyLauDZ;l36 zx;FWqU>x*7ZE6}v9({zpUlZv>$tu?*~i;h>Ppz7NuxrNMjW33%-G0SZIyC`9hur zT2or+uenL%KqNGMzk=Kdp~n5WyOpGy(@GIQ50Dp)M=Vb--=A0@6VmDJ zZtjCWz9yr2h;vZeuB{U=ras*&5W%`>+xxBzY%Ndw04&x(rtw7ATAVUMm&$CB@c9DqLcA&&36mL%yXbb*3qp`T_fCJ^paYUUO zQ@`@^27#mP${)=l%~@I`WByxJ4zCnV!M|TBX0LltT9V?)7`6a<9KS*aX#wz)4=&rnp@hJDVeLatte;Dxv!MRrEzRyh%D!1y39px4u zP;Y0x{2-fGJ7P^6m)nkKHrmo9(>3SM)xg`X?-S2DT4qmdYPH)|4%j_Umsv-@w(cE; zr=@*|#>6=}j^E}-1=v(;x7LFWm|@c@ngu|1Xx!_uzTqO3MA^VO1G2Y}=mbmLR%sUuNV>(&9My7Q)G6SpMNU(3To@NZ2GG>f+T;Ki$-b<< zPTSuqeD$ke%h1f>{@G`rZ5Lj6;kb;1bFQa~n=@;UU2^Hy1o(W>);|3VuOqhnH3?Uuh?tbi8XAqb!tFPmXcY-!P>U4{f6H?EHDY zYWc(VFYg!Q$ihW!Ay$k;9ngSOSb}+Wp12R*JLbTcYr@N3rX8#NY1-fHche&IcU8UQ z6XZ^`2^R6lgSm&zI^}UGIxdJ*#%EM`O4uQ9<-h**ukCGbJI}Rae>b(P$bQ(imGV>5wtU#K-$KJ85%bjaQyr9y9({@7uT54-qIv+wN9FV_1ekrISo`X ztFEmRNThLOD~ndZJL)u=w=R<*v&?~cr|TEX*=mKDQ+6pC642vYZt~^i3GX;94M)+j z*6q4aGFI*<)CH-)xN^qWM*t{cAVw051JrWSu0q;P^siy5XU|5(~e!%+19C)*lkA+<<-Zk>O8m|O}k7QQKeN<{g?kBeCG^+aCVO^TLG}|lZu>ug&n@9VyIhwn&k6*x$+xRj3 zlMs*G91yRg@9wTe`$!;|PFSEm?fN1+A8GDRj0--}-v1>hwk#)LmN_ya09t|m1~|cd zM?KRQ*$K2sCP}?=d|p|u_Qm|Bd9_0hV>{$9S-6o%C(Q&$zwmV~xh#J&pVMxA%_s$( zkH{2j=N|DAWsPdjmExu1R;xbHE#L=#c=fe7_DyYrlsl&Fs0*c`MBTdbkX2@OS;{na zi#7p}gD?TWr&?f&rvvRpTg*$N2w;r%A3>Xr42oy$!azpEh z#*~mhN9u&JF$$df-2Gq2=IWF(NZje_Nh6l(vC<(<3u7^;2mB zJ=aoYk8kL-r?$#x)iCP-=t^G+rO7Nyc#=QnDUhc?o&qms3b5A2zZz!E2%~y>rF1e> zDNW!?C;VvHv(4rUJ7}0zFD)Kv>}sBrlQb#8XaLna)tWPzn=qLj9+b6@6l=upXs#_6 zp3-Jr@}M6p78AlQKjm7GVRi+d!B$=alH}sV7O1W!NPN5{`wC z#th1DOp{DHI^`RpOcNRlTZi^*Ck!OXb<%n$lcWg~9T*6}1SWrce^hG0SHkw7Vv1le z$~B2H6|^glUNLS2P%a@w*a)fR2)X$ znRh7Ld+xc%)~{($^jJ~CmxU(+<3n$k<#Df=T zvBJ-5poodrGZ<>PaJ`5 z-sN##esBPK00={yi6%*T#uhG~QqkwRpQo1wbH_S4U9PLImahXjua-Ld^qJFa`m9E4 zm{BjFM@%uypBC`>+4{FUw~7w{z!C`~B~K z@7@fH2zONb^er=S)P*0D1&j%>!(`aiAEpcHOkf1X0)d=nkc&G`VJ5guzRVY)91}!M zdz4OVm04+_p@jx0^`y%eETrciMm|qD{gv4@CP5u?klrBy2EX=}J=UgQujXP8j;Y_O z{=>iV3Y(c%_L#(Trhu4p*G;!r?M#7}!KM~ssLtr;?g$*DYt>_*eXjXr&wcDJIkD)* zbP%mvG+Nl@t_J~?_!U=9S2+?GsgJd`_t=hIEw**rZrjn+?5_Kz;m26z7$2AP)Jqq> z3m}WdYe7sKRg_k%EIrbik$^ybPFRjKIcu#(AgbV3ktn@Ssl}toE1<=Xk5JG58~fti z&zQUL2Z)vobm`QwL)w=f=u!5f3k+swN0-Xi>&o3PFu11!0N4Y=m>i?28OD*RQpU%R zbPk=mcA>lhw46DVcuHs5tFloOGp0{-ear2ln0R$;mh;~~)pGC_fFR%uz&CAXswq(u zXoA!3*?o57#*HqC!w)~)=FFLsY}<*1vmT&1`A-B4g%|nsVd9H~IN->{J^}jbB68DB zUiqV`)vjGt`Y{P>esZB$T0v!+xKR-v7Gu?|iLykXMNwSwG@&rz;lQw4+k9fD786p1 z^FCCaQF+E^%Se~h_r?6Ms{kt^mMebI@27j1cP4JqBF$U^L`5~Yv2mK-LnX>DbZ~ly z*% zUb83dR>~zN8Y}KwWv88Xs+bW;Z?xA!bYVcrNq6M~4@oj8+we#@{0IOm<*UZA_pE6o zL7h^S09~l+%SDy01^T!`CLF3%uHZo@iI13C2>mIf3vnDXMptlY zbJRU09eM!LW!gEv>>=C_$8532o^{KA%<|>SorYMa2B97_LKFb{4nO=DsctW|xpUcq zeYSv(Mh#YC=0I-}0nL!EZp;~4UH?KO5JtbHwcRnZ-Q69|>=WnB%a=bWA5u>y%)-1@ z;jCG+Y~H;2+OmG3e*0T}z1Ok}>GPem8GuT53XID%j5g_iAyznYpW2B&4U`LUayydm z1ER~ety`7%u(p-2v9n(D3Yj$?rX7iBqf`xlOqyKJ+8wvuDRVV>+?NT^u_qj3M;&{l z8_^iNF{!)l=G!GTW^3dsNxY@45eW>|ciwrY?u^w7kLzR-i?5D}0!5%H0M-=&)>Ajq zmgE|h&_aQ289`BsW%A*CRPh1hwk5xi`uBhTcYDu!-eXPDPK*Xjz25YuH@S(2`_RMD zggVm-7!V@(e&C?p&w1}52a+xMSBZvL1XXVP3&IvH%1qg*o#1_^#1ok1cCEs>NROScu-e3Q8o9)`Z zRp4B=cC49gixw@C$>zbfV8Mb3%QVqL7Uq-}A8U+Tn6qHZz5fA=Z1F)$?U2I`myqBH z?SeNm*%Vl`LsPE_%YqWHP~cdiTDNW6W)IwVzrdefIs7ZOQ#H;<`_NNQJ!N;@eV6Up zxm$g-!+k&f3_uz%&uQVR-7&&5&_D&}(Iu{VqIRwg6jds}E$cc4Pwo`Z(C5r}8Z@U;e<#2EziG@tA#}wqyPXw07*naR8HA(ih6I`pM zhSk-!RJ48l>s}|*CjihuFTWO|sey9gcpRY#?VEZ*GXrL7+O%oT2ihTr9&E3gdzwI{ z5o;E+HOhikbx(G-SP(*)1Po)89uof&-_?BFEQ30;7rPW zL!&gzYsqGpNNw!k`kLx*0Gdlkb>4aB*{nHplW(kA@t|GztE+9(hV|AWjUF~9I80#4 zp=#5|pKzl1t|HM%>geLP;JILY1yhb?@I1}{SzwH*Gqk8UPc+p?sZ;84Yrhow9dM z#>PiB#O$eU(rg<*vq~Dz`YtH#{4PzkT>1EU3gjt}r@)Jl0-lGHwGwlm(`-kWrOg#I z>9CniT}_qMYDe>7;WY!|Nd}~y%4w8F(@-RrF&EpajFaje;Ca8%rp#h}8z&oHq z$$3c<&$R1>3PzkkF+@&nNsDI?Vuv`S_SriTKPH4 zPr=kR#F+}v6Kx+%_$+ojOU2BlNmj%`%@<}!kKDo(WhUk1%-Q^6E1HVgD_-%6)Eil@ z#!4I>N`po;Kq@qM-dx+dWovlgj?3@A-(L3*ZVK$}?4l%uHN77C9R>Y)HPt$tz#^O1D*V^yY*2K4hnzeu@}Vu^UPk+LENFkpFw% z-OHn|xbu^io#@&|c4x!m6e=T?)En+C)d9dFOb^U~FAMQ#1^lvqGL8J)bKfFugKxPw z;SY89#y7rEpuxOwE2m?D9Bm4Jbl@C)r5Ny2jbnxuTN^iSN=f5^dmpp|mo7+Fh5ruy z<%CA%i=Fb$gcthm^nk>Z{x%{tJ%B)o+gu&_Jc#WjwxfDBDszI2kSqfXmn&FClyC!p z>t{dvnOhjaET@M@S3hPq-EedA_Nix_YM=e$7wn*=hpWnD20;4yh5>wb3Fs-;Zat*4 zbLX>S=qogMsjs)}v^~4p>?fBipBry>&yxuzPM&@`Rhte6=pX*@haJ!n;?fre#7N`w zsZutsm;uE!=A?(n=O^2Eh~pMW;bM{_`F-`PUrpI9h*$1Y-~Ih9*D7t=t!`*>44850 ze}2<${LL7xX3w2v_pQF$4dg_;=4aR0mp}WJadTx+aoJ_x$aqef@gas*ReA`E3bZ0e z<a+qb{{ZCfi^M8mpu>yqsnFym97`jmjLB@USMgBV-@%4iY- zjmjsKq)w&ULL4|~*Vdi(gD+faf4S+elWYSf9tKc z+7(w^5iLr}x$gs)rQG8p^nnV2M`6sl@~W%s-g{JrL}+Pgvwyqb0=ruGe|62(8SVMu zhaPgg3Z{u6puK@lsue3%jJu#`Y(nFgaNYGs*k`}?8Ecq-u=p2tEG?DLqF?Q&#(s6h zRd(s8zYvnnI0E*3?F(PexF5bPy?{Db!W6%mN4e7$WggK-xI&I!g4AybSM(1+762Z=apq3| zyfCK0UHBI5Naenf5fPpiTB3Csb10@_X}&ElFOd`C8Irzs8T2A8_{Q-<$cLk=4@Gq8 zroW&%g0V+4xIptprRGa^-8%KyS$5Fe0^9h+Ew){(+@kr7Hh=DH=cl1yR8n2-oVw<@ z0=s=hr`^A{Qb13m4Hn3JQ2BYzDLtc!uU*+3t>t7~QsHOT_ga(fvRP$4@;4=(U-QSj z8I`s`+rHP!kI=GXD{Se!PAeVVU|V+Yvduj*SC&?5>rk1kT+?G~w@RoxSfg(Oyn|;) z!*U!NOkA}5(>w+86v$KHMMnYV4|WhH49RD0g?yv3i4?-OxaOX!3jCmIlOnC__zA3# zaF6+%-A0Gqh6knMr$?o{!d%8C6=>!53-}q*`!V@Ijuk0FT!2kXZxUamMKx?;!aCBok%bw<8HG(Zb=_<4?$l`|yg@P6Fd*&y1(09h)A{ zDEC|6`qqra;Ug=baC9Iq7Jm*3P#KXhIPkEA_~RTBiQ`4@AX*Ft z3=+R71s@+o6Gj!^Ny7phaq{f|ADC5@Drl{U7xGG8X?d{dJp1g|*g|Q6L<4pDlb`$~ zdTY}2(7pg2@eRf9Aw$~L1kIKO3m0U(f6Xtim(=oEM>D<##s*g!ea{q}~O^I4_72-p+0Wd^uKQw~kAww4Y_7iE6hFKsIM5CZgy2I_>i#lQ-HT3ROQ zBtH$3&RjDZd4lureeZk8{G-v1aoRf6l=9Vo2}fO^Uqu68H-WnAm#N3LtvjNRb3SM6 z0>H=?ct*QtjHE5&Kdo9@D%VcaZe`l(j(WiFNjAsWl#j7Im{S1oPZnPL+SfYGfb@81 zMG#o%P!4|V0$C(2(o&g`ZP>KIKKQ{8PYU#ebRT)-5&PK3K4uR;oH`zb=h0&Tyuv-M z0dfE^#@kUW#HHLHzvz=P$7yqY8I!b6e*B^gpeMu+$G`mLFLv?87rVt^xHr+!_q9(> zsjvM}i{vv;KHl#9(;Z4$i%8W^p&ag3)mK>U49(+>#a7Xv9WiG}N+i?9Xh6X7hd=zm zJ|@5{9q5V1;~cQ=GoSg4-SMYC(VX264O`|10%Me4=EiJ;{Fq&E#@p;KHwt9&k6oN> ze^?;js@>_>p)!Q=+HrV3-jR0REEVUNG+>9tixdb>%~UoBd}># zdi0#G$Lrq#Gzf_hk3iod0BATfSuUW71a&)hx7fdb@>6!hZ-0{&=pkx)2xINN_uZSQ zf1iGOJg#wi9S!ugE2U9;=4q#706o!ooNwE<)!uNsp(0KdmU)P`;;jP%y3UEPO>%g2_v!_WwajDeK$-y=DI{`^F_K&2sB})B}gMZ z=AX#|`B0AW_*I?*C>0J1?oqzA>c>YOKHH95tetMVAG3=7C+*awf?&-_<7r`d}O@<&K7HswpN#X^4zs@kAR*oTd!%Y zM}C8>fH_F;nHV?bV8<&?R*?MjJO%O;$W!1YKmpd={G4NEglN**>6hiyfPUrD<|z;C7Z^e2gf$HtX zW_#G#y|-ww#I9NRBB)d*HBxZ~?C}5qUZTAkEOuml%G_ymsE{lgIwYOlBQ^Y9+0P@< z>eZHD{gUbrYk}M=|37Wo0f?O-NDt{qg%(`Z0+`B6yaPEVyr$-6$6yvHpGHZmX3m^0 z32v>*Bk8pMc_z~{HcYZC!a4G8Zb6K(X0btOD-Gxe@WZso5e5{ECCt0{UhXlW4~bx_ zR%JRSW+$w2Z6m+80ouLlRjneo#=c&h zf~XV%3!`X2vjsDSbe}PsH*B$8a^5QHxICdXCQ~jc9kAbj@)6|~35%C379Fwc_B$b! zYxj&KBjpM-R;tKrKn3j>B_SUty{6&$^r02gBP+PBGo&0r8 z6Ub98$H2YvFVZh_#0HhWM4CLmw+r6=FZRsZwdu)BddZ*1l6dCsbe2K%L?j#`SNFd4M7OSUd#)CK^B6`PEln?X(cmpDjE2Wp>dg zKdOF{SPJ{f^3mLR>Kh{(tb01;IJUdrnW?2d&Hbvev2onUjA@LInE2p-4RbNf4p0L{ zyRchhzc=AcO#-_0X%{24DA)Fo#!eQ<=XElLNe^oi^&7@$;t>!i{OON>v=3bP;SBA@ z^fc110Uz! zGFcewYg6w7J0*zt_(wiyzx~biZVVn4vOFXq%OF1qY5YIAcLi~dgunjvulBv~e?LPA z5Q&m=vJE_6d|4vUb^f7l|^#aoeJyx!M)IRai57=61piMP| zvG%tDiAXWmaLX;XYIo9$G-rCV-^t#?#Py>eywC~QN(3s@%hw|sO$eJD?}xgzf~%&< z5{oY zojbl$ZKtEPQ^KuL+tWH~J9op6R_L2!Hmi2nmM!VE!{#(w)yM`bDd@LnxAobR8;4}N zHPas5RA_6T!$pKZNAV<4zCEV`!U;7pM%mYLRz<)~BHTFIbhBDO=<-i0wJMv^YUd;U_U#0J}*Dpb~??k;!uMAeKSIC>EGdr}E?Z8i0a#(bD0F$rO_~ z>7!LNG$iSq7LsVlq=)_X+b?n}S0;#QkGT9~`(2~miNw&L5*z~Gvuo!LTXf(eeX$r6 zF$pkj(*)A&f8c@Im1}*7YCE>=w9T8IwK+59DzyYNq^F@YEIOhg_@Ovb>eUZD^icGX z-S?Lj_LlSJIvOcg(!P-f0JejY($hdOAHej_eV zZXtj>W%3gO64@_=GA_ml@TR0p;1A!Xy2DIoq+5$rA)Bqcu~$zGb0!-pczCTcYQ`Q_3b3I7R)XO?T0`7p_8blm+6>e$e@LLyT3fg7nXEt^W)^3ib(Vl(20dx#sJ#qGQ>MSS(~)VQH(eveYph`6 zK>s7~7dnSUfV(-)pPO&K*_lnHKR#X>ZeRK8e+qEYAe%@RiKNYUU?~ovX(t_RV`EQ9hF!R9NKlW)%I-n0{TQB2bX=ST1l_V_i+cqc1FX5lj_BVl z0QtM$&IBFs8*=V>|16V^BW%{}nYLx~R(tG`$7F(YjR1${WcJh-fJ!!>Cdo)?CsA;L zN0`50)(X(DY12lT#@yrQs>pk{-S)@Gl|P*(GtRSK_ePm9)Y*o$Pue|yxjUoJVBYiY zcfZ?7^D`3Ajfwi&(MKOGA1nts$NWs{j|kLy?9tWsz`gfmBz3*CA zhpVr&O;4qoTONGGLi_aR&b4#SIMS*#ChgchXgA%u+OE9zPj>%<9;9PYAHo@DoZ;%1 zya@QD*&{w6g!Dc@J7R8}DPLh#b<=IIP#}+(n;~gnFkeQ)wk^*_FU1g5$t?PCX%%Zx zy5=e6yGP>({mAb?#dsSH3l}bwKe&_K_&0m@Z1)IXNPqtGpHs}Kc(7-8lU*$^?c%Ro ztknDl7Rz37hMgw||LRm4mxk?6H{NbLw~uN2pgnr#D^Jr{4n?Uje%ig$_3r?bjg8ZK zIC0P%QK)e@E}pGl8lFG=?l)8X{e_p0JpLqGvh+|p;NZg?h_PYK6SjWMW7>!zQ@91N zj&Lg7q%5SBUb;QfjE)BU+`Q%O@3ceZb84FeT6f%bi!^@5G`on~uetlbzx_@7(pN5V z+8+pi;A@;_kN6@qo*6@+&Qt^QDS!*_GZq2vRLO@_Oh8Y8B&dD6cUr@o`8MaoQzS%@ z3H|C-woPVQ`yX&;BCo2DHMw&fS|2PyEPtp z*nB&5k<4xTmTMQnAvVTjJ>s{v>};`G@yGieK2N-!9BIo>P)SjzO)Hf)p@aY} zO+7YP+F-?XOYM>6&9-JM8a;*9-KQ;s1@xfh&zd10@)XEZAWwlj1u`js`x|^1mTDc1 z&>4#==KnI`6a5;4*|E|IqZ!yWmZHsrG6eolo#Lr5i}n^d#h0}eI1KBMN`XE#60(iz zeH3%zY`H#K3NRznhN22d4@#Wl)0Hd0|$@ zB1m5+pEc4t(iAo}U2*0o4kl0*uGuEeOmc=hVgm(8Rci8b!Oe;Swe;PTjqhV(Qn4KX zWF~DDEvonI8Czt8l)S`ktYqPS`jHr(b>m5h@7Wcus--;@1$&6q(z06`NDKVpQRM;V z(%frDAAM8`*hAb0A6RMs_z&|qRq!wiXE3ZAH*VxK8SoQCIN`(-?8iU(aq>PVs~&j7 z-tyKr*=S-B*ej5yUnWSMs?WdPk-5lt*@-7gYXH=+L?A@m0SGWNfmt8>*0F5x2XVs< zH;mngoKY1{3qed2T2(JUb(u{0YQ#k$vRDA9c)I^i>w2 zH{WoZ-6fix`ARYQ=e^B2`*vx#h`#Ql?_@iNAEo7x9vT^FSCp$^;#8b%jCqdKGlqIO zzIy8F=#x2f6k>2srf z=085=>OZ^(qkqX)zGPqen*30xpxB>QRMiRmsTM8!?Aw=p!#Oq%@i~&udoFm7Gs8nW z#s$55l7Kq`<~L|pB+H(|!YKPthQll@|qNcOELv~Zw>W=B=|1Z2zWZ)_FKw_$+6i%)l*n94d+ND1{)~XAXlR^SZ&&>0b2hhLTDvqe z32|mLme{|%5yhuS;d@eVuWkV7((n>ll)qaSfF>x_mK_dH;6IeY7p_C-tQumGu9cJcrFw8rZJ z4LAe#tOPbuu!mjyF1YY~`6!fThWaMsekK$j&0+HM5%sZA{eCAc%bnY|ro4bz{<|)` z$j~ zx?V+yVfMj~USuEpfV4ob{zXc1zrN;byZEzTbP`J*plLlM&G1%fmhEnm>AlRll7n{2 zo8wY?tQN0%`xWl-CJRk>E>h zzfk7o2u8~^*N`ss$|Vqwu{1h=Mc?CosoLI*njSlJVX=+06-YC9tId|Vb6q`V$sL9- z{XzM+d~9=p-T1(WJ+!IF_Vm{Zd{tkN=yX)`59#oav4C-4uY*kI*$#N~wpM{qrS@EF zvGcFDbiUav34>!pJ!05OtW*5rL+e|tBi3L~Y#FtU+a!$Zrz|pkQ})tBP87kHjSEVZ z8`To8<_~!aApzTCeE86F`kffIpx$aG!vhB5(-}q2LhkCOBs9>(!21CYL+0 z3ayz@hLH7**2m4-eG3q%L~~k+Ho%$DBTdz5jo#-hem+pyMC}K=|88x)$>M+s1BSdr zQpG+^wCs{Hpa~Jjs`&I7(Jm>y0(Jm+K#}SjW~w0CflG{Yhy3vrh`Fl*5R#@$ZE=m# zE0o5L?8;=efM!o&9HdGg7n7QK0on+DQu08Hp6NroI)BI$&1)f%aRb{s3s{DDA*N`USv`7Cw|w zSE}xeKpL3v&}aPPu~vh54-3%r@aa!~+Hi`T($6$zK#x80Me+LAy#59&15Gw>TyMYl*-z86G4eU?*yCLH4n-d;o!RSO|9ZE;#<6ZR z+;PVpT9BP5hO|lx0r{B`2#sT5SV~Mbqk*~ubYMVa+#`-i;X^n^Ur3x|4oSXYp%9_~ z^nChafF8_7v@I_nxyDI=LUt0w{Eqr!$Gd2N5l4!T$?RZ(;!y~djbV_IJM+cp3pt$o zFV2ie{vi8hWd$W7pPHF8U~akN#X!Q*9Ssc%gkv08KRDS8A$Y587ZK_`nCE z$+&aOThBS?9K+dcw(#m#zgoNceNbbMv=7mKN(9VfX`jJKZn(c;!-jC0a-6KM5g8g_ zZY-tUL|-*~?Q32wW+3LayN@RL$3Na~=U@0PYn)Rrra*HAZCS^#z>UTY=V*$tLt%Ox z=#5V-b_9#=h(#T4mRZ}PrH5IpqE?IK3Te@Z5fKRe?9)$$WZiMmAq$+g)aVExIb#!x zPc8eT)xz(XBbV5MCC4P6rMx_a3w-PKYVlj7Mdz>p`9f*uI4uy@w=)x(yWjryg>QUc z{0>{7%cfoL#x!=blVDs<%z*$1mt1m*Yje3c^aljL{r20OmZN)FfADG8E9R@MbHFNV zXUb{3_$k#RLavZUh#QWKuI_Jhm5lJYKNEsoeR1_x`pWS4eAjI5JcQwAs3-14Hj)q13}LEiySK<(6k{F z0x|l>&)jAfbdTMkMeGbonh42~g~fR>dFB-tU6r{ZY=qg(_W-BdP;k;Zv$q zGKh!Q1)uVBP^@JGRW`o#CpdZjj*Z@U+Q`}90 zhwr=;%A0R^b6dtAUg+>L^ix0e(^8T83y-S^$j1J1nqSiQVfPB65EV1e!i2e_jiKjn z=$^gt{j)SN{h<{D?@Se|?Dz1O|1m7qr6c~(b zFxgy9YCb%9{IpI$r`-Ic+G$$l%q@Fq$S^Mqk0bXUbVsBHcku3e+#&rAYaAasaJM^n z;2tl56{g?nJ>}uXyr5q+*N%AR3yf}l@xXXyo@|Aac>3^}aS{*VrilK>rZL{vaM6xB zEn^KA;a)9I_b{BOKlxDai}y#y^G3oGp74Z3MvuWjswN31*Is+A&!=kmensE1A9aHf z6sZ6kBqTJa>JPzPCu0qm{Pf4SgFQb(Oq!%IaPxosr=NqFhcyL=!765_2nCy~g5urd zC6x(7C(h`xG_=9fp7u0*T)TQn8<@<@zlzQ1Kq9BH&E_}^M-Cj9gs9f#3gZzk5^@Qu zYiTtv`l3fPfaY+%Eva%Lpmz7r2qJv4WijDp95%Ny=Q2g9ZvuftVGT*9B!zO^(Eey=ABy?Hs<`;JqJf!Y$0JkN?vLBoR|rg#*+>AO0x!m`6Qa-z_O4 z8T{>9k)({=!&gg-lGc!HsGBOJ9C{6Szb7+~rOmzt7$C&9A$ohwc^gcxH|995LyevaB1yJi@%j z*oN`khX}mtvwHTV%gK>IR*b0L!koNX-0D`oc#|8NJmhw%pOj7>bt|`i#*KgTR<|Dy zSq~B&B@y{Ksi6{JM6VYZXV9sXn>6Os^q$SQpmpgkF-$)Gxfyr+9j6s3Rc-YNJhBwT zaQg4NSKUWH-{Zb;r*kvQ<05Ir=+VER>-wsQQd+M{>%Pa^o~Td_^1PeY!Ryx#%(`#f zQ*}3enK}-+a(<_~{h;WETUVq~)+?JmIjQ^(xD}*}JoNf_iWj!^+QlKJ&nX5{45S#i zI5EIlXeMO3HGguL0G$p!$)P?r;-G=i%s`cygA#vyrnD=f9hS7Njf_vYeLBn<>K8vj z>qfT@;t-mdnm+5MbYPO1k&YKkjWg0SKXdAgS7pL55Z-A}7vVG&;vKs+*yn)&M`de8 z1+x*y?!?sOtn7E(=f3gHJKT}O_vyV{RI8#atWYrH<6{0u%_q|xxvk9VWRgvU5w9%5 zJfniaLd-p4vV5G@IX!FB1|<|<(G(MIBHA@`M3n24U9dbNCBcISDZYn#ps$}JPLfR2 z1H^-Dm{-`lKm{irSiH9*u&IiN8Hr%gu&Zj=9v!ju%cEIVGQ3)U-NPQifta2 z*81|=<>NxQ4|&K#)*k6x*oBCPn{K>W2$vy2soX(IqwaxQ+IaZR?|hUP4hvq2M$M%F zgU3=u1gkx5_DY8a@3@Tak?jFbz~}>ECSf?4wuy&`$wQxs-b~2IBd7TBfJ#u3v{pPF z&-6pm($`S`!(uv^Hj?JyYLEB4=iTmwFMOdND@ibjqn#=DSAOMJyb;P)=@R2rwl`F% zzKY~hK}^Z{xmnN95gn-@#OR~hL@bNRGN*SiFPnne$hQ-1wbouyswD43&wJkUnn2Ve z*n~zC5H_Z+yY8v=SG7BAGc1XKo)XjesO)A;NX7keLGuen1ht&PYXcR-3~aF$QM1>hw5~ zQP)_t4L>ojGAA=%&=={?wxGm;(dU^LHxppk!~+stVZh!=JRl)~DlI<(b%l`^uS?u6 z5Z}}3SVroI@z*ZUe|F0#YZ$QK_PW=-E|Llm-oTyxNC&RyZ*hr-xQ!r#*~wS~zJ>6f zR(Wc|7&v_Bh&yv~(w)5TlskKT%1xe}cBf<~2DR5PfP>e`8(9c5d~f$=-_4%6!o+|W zsmSAIMa+w?!j!AbopP67ab=jy9XoQ;{lbs`t~-82l6;5e-Q5T0+`YO#e7qpFCWaoW zs5;CEzOey7Cl5jdsx%Wi!I~KCb32A*|EjNB25hx<`#HK1$n~%K3HPvvT;)dlb8e^7 zPRIl3t`S{zkF=C()tI4!C!=AK4t|atlwn;RRGc|-#GO8J%$+=P!krRcP98Zeb>znR zfT0$#&nT37#Oo4&Ze2O*1YSo(vzP*R->V)|Ef;DwdI2=SE8l zZd44zUa9!?h-o&yJnQy%72UV*-R*XYrhw^r^ypC!E6(6;`j}b-=Z1iO0m_RfdlB~eCU#mK7 zI9_n2w<(&V+nqeSA`e?r?!XB#bb24=irM{crgEkG+M!-|yWF!EBz3e>mAy+z@rz2^ za8YT76ay&+QVcxMFu)9pSqcrm$yY9YNw7TgiQr z=E>54Rx=H<2>$=JC$nQjo%NBPCLktj5bj@|)nsI@sl%%2SrUTdbO z$-uK1E}FpM79rl-CC*bub|7GQV7H~DMUf3kacNOk5e)L6)hA*?rF#jQK5fji6FFBL zC~1QsyFfZkM|FXXI~Bx^&%7$Nyv!+XB%M%Iy-MlvoeC4Z=>turk5qHfs4;5}AqEe^|Hp)>O(I!b@|Ni~%;SYa! z(yJgYB3>}ET$EZ&Ui}bND*8$`%TMqjr^go0wbF1Lmjqa3c|C`V&TMdt^BA`d7X}-iW@>ec*#1ayLuTB)-8l_;=rZ zx8HES;~npi3-Z>Ulq`KzfwfQ5DB#3iDt;2}M!JT+%Ui_UP1Kz+6hA#)gV$o;5UOmD zmQ63x46Q;q9?P0&u9Y3AKmW5oZAcFDcU}@&W!bJ^Tv7BH8G#MMdgX*^xqsTzp632q zE`7s5-C+W|>VG^LZGO=8-ro(zEeOVorpxxM#iUgh|gF7ltUG>`;V_5GJVIlaIPs zFv(GSwreM2E!^B%KD$0uW8kl1V*qB)f_p1bbJPn7x=(OTP`q)0S(*7)&F z`8th&83>O25MsOuKHtkm6EWy8jO*0v2cQ33sQ_b)T=S=XYe6u)>X*;mI8N8nw79YU zIV473Jd~vVT$)BDp2Hk{Z8S;vWKDuc+OT`Cin>M^B^m9vxj?^zX&Ps$B1L@dW4}}L zv6vn;&=JnGoa))WKB{WfGw?CkABK3}4c~?LzMo0@moY=zAZ2%PzY@UZ-Td zUv=EIt9cDPcI-aoqlZK_ijTW?V!X zEp|`doh`|62=;jd92`Lx(SP|C!QzxUY)X;FKze3!YSJ^6@Wz1zNl~XMEWoIyK!}0>bnqb( zdSNW-T~dfInn`JhV?k!~#^T7yGYqCMP)*P*4a>pc#7^r#5H7Ddw7_{-Cy;pSFJra-_&8yR@4Iq zAfM9Lr+%PvOX?TP1ypYuPpsEqMJQN%M0x=gkvP%%$xnXL8&Ad1=6b>U2b<(oF#s_F ztg$4u$C8(Df&c{n6B9e!&;8ubxmUd6dhZte6aV&aiBbm;oPY2Kf8cJo;fD2!PJEBr z7AKy|GLG&$uAU3(<9?&9dm}CrGq;EgnPDX9#1*oknsEr@3Iad0^K$II6KXHi5FdoJxmd-P3K)h?GU<~D zc2sHq*KgLMkr=D83VEIW0JHAv;lTr z`1wL=>&^E)^BL~OPyM_5<~JK{yB#`opL^^7|1S5w_y2=?%2Q;V`TL)vd8KyHq8e_V zoe`mO>^*ZOKjwy3;n1N&?n^pQ!2mZ019 zlYYKcrld8zTXpDBJ9H!Iz+%A!RSUFIJTOPDeZVF$!&v59n7jDJ88di~E9xL942H8X zjy^-%3=K&-GB&5j$8JNu*hBEidZX{x|AOevBZoz#>TqpHwgsRY;{n1q#8>?NR-S!( zYh8flR}Zv})(ZxXLS#cyYphaLWqJUk+2rFul0yXhu8qu{=z!Y#-J754q~Fn(=7mZSGp@qkjGn6HI-$Btq=I6Y{=Q zKH-LPMR)A9)PqYf$fz^5!Hyuo*UaCge^Lyj7)UXYVxTn!SW~c@JRl7t_LgWrvHBo^ z-y^{W1Zoh%VgJc`jBpOp=Q^_RCL*AJ&~}-Zpay%My!OdUI@l@}7i61vmz&tNN9yi6 zwW!KqVxJ@wMtX<6#KeLaKM?FIIvr#2^Xf9%c*BT6lxR$+LxZZ6ch#Vn|3Cc>|_`$9pzr8x1VV5N5Lylfrfd%nx9(P_|yMqjxY(8aH=Q=@5L|5t0bS zk(zBCNKopD6b+IrFhE9!Cp?qs-h1y|EB@}g?-3rCysab_+ONo{U>NrA-|v}R#0k<` zK-vctFbfdRU;3~AcHi|~-{sZx4&HmXN#)3lJX5d6&=k@5dV^09;i^m`HdZ9zR9TG- zBu7jvbpi)_1@A-R>qy7R3WLm9Slc9hyxAx`Y@{%aWSmWU$O&Qk;#Cs79SZ zW>Se0@u;q}3-rx+K+-MTU`$Wy6cw8SKIlwe^Febtl8$Qz6$jn$+*D3&EHY{OjfxtA zwun62G-UN{*ccN%)rsb$w^1B*$8hZ<9`VRnq6iz?I|3Su07by(w?T9@0y>9JoPLMx zPf;vRFkCHw=Xe@>ccEO9=YsWHH#uM9S8ZmjHA0Aaeptz0w4Lv|B-jSC%7Md`H#BYyLNj(o2*`~ z5{z@mBJ7q$>?cM?(pa{2Lpg#Ep#ISY-%p&uE11@}8^;S@xNZcQ+umj?%goA}jv_Wv zW4S>=f)b@ju6Nr)+Po~bnA4f5R8l=Bw`-lG)}CDW>0NU_+dAEY?XcsL-szEA@3fd_ z@sQMh@ibd~4lp24!iaEyL19=vQK-qU`GmwG*-k5JofYi?7Hzz5y}l70!GWhW4NbCC z>~UW`A}?W5B`e7gr>pj;7PW@)H83o|n6Y|W+*YrAI0zA37E>Q&KSH+fPM#{dQ<5}a zk&T|H>u3bZ(Ew|2B&B5OYuVCEih&dZDF#vuBx67{0`n$XHeIsK*58j;VKhi&lv(_b zg@sv}ox!|L-fKHWyb`VC;-MfMgKahMoCv8?35KAN1kYl4$0gn)=W%(l%!q#=E|K)z zbt*qHG~oL4ITZv@0T7b|pk>*ch)(n}Zc=uAre*9$FT_2PdtMn`?iEL>M~f8PC>Fmn zvO#g=$WeFSk>m3AbW+~A7UZ>ON`_p|$YAA+mn8iuSGotOtrY` z0;j`Bo79%t+Tzaw9}yQw_k=20K*MMgs$3TEdKHFiuDK?BT)Pil-&*9CzVu~}XEw^W z+|q1}v7Ks{^crp|!qGn&;}UnxXM7eBT=KxqZXD6K}V; zMVD7gp$zxz6V=by`^BAZzRioapksc9^80NO<*A5*?y{+ok zEIii1yiPhC0V3-u-VuM{7k|Nh<};seS4ao%qVLlbxP@Ra1SCKgxc!aa_zkb>yBS6g z6@onw{S04q+y+Gjbx)2B5_EKHbH|jVkm7+kJw%tk*B{Tg@PDoKRTupSx6S=bbNYrt z<9G3dnj!Z1a5R9&!V4m-RTHdu%rxP}Gs>i{1ilEiR{4i*`9mf26N81jvZTTa65TJA zv4bXwo~~T9&g-dOOFe|0m&a`h)PT03K4NhBGW6y0j=L(=vQi2AJYwRjPT2K9y&%HM z1=60XRT@$Zq!>ssaG_&BQ>W%t%;79cVt7u%HcMI`i(cpkAsRH1knrizRlY1GJR{bS ze(d{-GNHr%e_3{VaMRAdWpo5vKO?e_H|xH6=K**0*eQA3l(b7lx?U3c)#NREJ0fz* z;wE`Rw4BJwR*eU)#kr`{7$h1vS%6^oCk(0}wtev4v8sIL_H zet>w|w{M^O!WX{KkeH47i(mZWhPaJBAlVTQY>r?~L?PO^*3(eusyqQbMy`uLT#we> zm%scaxgdUmR~tg?JPfVu?FPF6Oe)mK!f%3Dd*A!s=YHpRerFRO(Rl^vC#Y_G{No>QDCdZbcWy1z z>tLJgHT)z3=52F|Bq^TtjovoHu{v1MafVUra++ZojHK&&k@hxxpJ@>o6`@6w7wYT-_#=fYYuhYA84ZqWRgz0X+`R4G^-(MwF(J;Ww z#_knshy`%{q8Gi$9y`7=Pr~TgtlCw_1#M%()?;8}g(QsuX3F}E06bzk?J12p*RM@8 zTvWC3^7WFJyx2>{eC~6%c(tcEEDku{_6Kiw!=oeHz^IGrU9V03E-W{SZSgLMhN1iB zH^13S@P+xgXZ>M)=I{sAM3a8PPSb${2ja;+=2@`<@J&nkSnU7+KmbWZK~!nBGa~F0 zt@~NMHubyYS{M^Pd>fzB!*|X1$t8GpfN)8uU7E9=hnQN88cME@iin9}v{6H%Ek9T( zNU5R7rI9Pd@Gp{I#(cDAHTjZ^p;s?98PE0iTe*wDt~D4!wDKY20Y_1>bXzGh&6{E% z#XyRIZ($7hy=-kU;l5k^7JgN!e?!;u3iB;Yv$#+9wiu-ul~)=mmxy<=;xf8l5rYUP zIHOXDMk0tj@Kjdhm6{)#TG-&tPD=d&Zcwf)`#MNYz|4_x)4{<3w`12XPo&`IeRf8w zT{5iKD?%M_M4a|4izq5BiGj14lUe`?LH52ECl4|Vq{68sM)(%y7sc2Sqek$e#U0)D zS=TQY?tBaj8ZO=QJ#y{XCDC9pi_kqo)dP=1h}3!=U@?3!U=%HIwkYzhb%-y95J4ew zTjxxE^PmSksObgj92gqy#O6y==32z3KJ}@lS1?r83otDpHbbc(Q^)!*dCv-oK2BL5 z@rXyX1c{ff|NPJYTzh|9MmX`f!FSzt*IjGz+)(cM3Js)0XWgKwsz3H)Kjwbvmwu@M zKiFcp{r212ZrqyywTX!LJxluC-~HW9%pTNPEPdE!mS-c^t@Lj;--zpns)8{Qjl zys-%dq2YLYi6m*r=%nv$hS_8AE~e|b9s~7xk~=2Kc9W&juv4oM9ovP+-Mja=pZ@8e zaj$;$Yusl({b~0Rc_9qjn{t@%-u13`xxe^}zi255v|aUS52q17cuZss4Fhxys=&{A z&T|sid)9Gmur&r~mMDfx)GqbA#6s`g1x}R-NjV~-HTU~?K`x;y8+on?&u`wLh zr=z?r0Eci|BuR{pml=oC_`cTJYmnk;6AReJ$i}*CBj9yF-QVB2PIVseug_OMxR?;1 z_Sy5_TJ?S!G4WyIz|gOt*(4zuG&W%HKzm@Pc2xp7<-GValI|&qzp^R@N>03$g6#5O z&ZAcho&Np-H??@yO9*-OE=h>)+&STeaAXq*m)_ziiTRQhkW4<~tvB~e6sRJ`3kCMc zI&@xAIC};!k8JZuVrNzH-pDcPBdT0Rio1B~T9y%^Ia!oO>W6;=f|Kvd$s?CM2Pqw5 zyHnFszA|GYV{UY4R29J+m^e~mAa!M>_p5YpxD@TW^Zk+#l_xJr1NF!&m5NnpTvX!C zR+oyYzcIwxwf?5FJ2ouj4F?JL*nxq8u$jPy@!-LOOwR04d;Pzgfq(VY zSGy-a`N`fpS6Bj`xspyox2vv{g|{H!Me1Ks>2}YzBz;d<$4>4;7~#F;rTkXkgwfZq zy^&ynshi}9&ftaD_-2lG7&MNTmsAcCg-8*05;`phSgml7R8Fh3-~avJ?@&)d{Ui)* z3LpB=hkE-~VSLhkE7(bCTgAok*ecydDxLf=UnGY8UyEItbrFbWmBl*peA+V)39RKfu~7VCyB!9GE)@wqzy2Qxy#j&6W{=fjv<)k7?g1 zlRDVC!wxdMl$~0KyTun78{g?|8u!Y^4>sT6*9>=K@2BdHNpPcDl>;qF1Z5}W_Oh?H z-wh28xtxqB!}#eFV*nMbqU`cyRT!JT!^e(#OVPVTq<4#(1nq*J7zAonDq2X7tX8Ch zEk@7c!lGv!Wo1wZ!_0{2bc>OM?|3RumIMF-{8i~{6AvQ-W=>Y#mWuO|7ShMEY3Pz} z^q?$L%aOd)xO&An630s)yhb+xL+}h~cJAaA?6gypSwp9G({_29qy)vxv{d7&B!Qc=4k$rc9s#d@&9^y}SY zq|}%@mKODub46gHLKzRlwfZK$AJ?)Lz|W_3D*wFaJ)oBR;8LTiRd#nc{O2 zW6|o8lzuC5N#kgv;}kDU@wtdPJ?&{vOJt%lpN0XcFyLHFx#z3cKd+%H^fSu+I9UlM!kDJdH!zwYSo4HACnQ=-~KxX!V^*eK+ivwyw0wpT?&cNHLINV51mde)5Oh zvQ@k+b*zl+p{?zK#M@vUv@}cAMOTVBWj62!2ju-r1QFi0aE-bu zJG!5nn-}azAGjA2;KUmyF}$9i0Z3(-wC-Q+i=VOp3} z?QnuR*#7ALMw6Q#YV&qnc1y$Rcuk2)mbG3ommYu_sgnDs)dF@W@GV_DH?ihm2zCcVQuYsIiK zvrI>SqsWMZk2n7D<>S+%aji%txc8klD9>OZKE(SkHp7M_`Z|- zq;Y)z^s}gT@qR{ZV}DHkiuj=tslZhyd6OY-J~mW~-#nBw=lQ^Zt@Rw9VN(mnrp2vS zpRJC)_28%PQw*dSNHGv%fHe*t3Ug0JULN6Z%t|w7Swb|Uqk|H@$-1I6qVP(d%Z$+M|m}BswiCCeiTVs#{ppo>g8zM`8Gg@pI{=dtG5^(VLse zj!o=xr_N4!k5@yQAWI_hSCu)}BZ&i9Ozz6`c_v2BWqCI@A8j}|vC8AAN2*(1m#iES ziZddVmc``Z2lFN`Pg~i%(&pv8Kpd)7F^ljqFpLzDq%NN zHq+Px>aI!(M4rCN<%p2N`gAC*0FvU9bgRkTi2o4Tt?paFc+k;V z@7&-1?cYila;N*DANnD0$06xt$l!3r_R$AF_`xvB-y@xs^c_tJHxZEpx79ZR{<+V6 zuKU-2{nrLhNt}+o=RNOnKmOxC-m(Vt>9@V@Z4LQIeBE`|c_v~!W2cAZF&Ue1k;n6NB{OFJVs2?Lq@33EmWMjCw!Uh^{u2HkxYS^y!59_fWKEkx&eNsMb zzkKXtA8QyhjJ5Z^_q}b^f*ETt7P*GuDNlKd+qZ9D5Y^0lu$NUadkUFh9oWF+ks(0O zVrAte4?os(5g)EmvQv?6xqHaX_cStvF%EyKaHjgqk>9Ju5m zO)!Zc+_|62S|}_oy4&tJ<{t9@J$fy!)y+z#QEj;@SK0A;C+3~lEt`Ua5|>_Bdwt)r zlL>hvh8TFd<;H(=@BZ_5uBEq|#q6%Nd|)-xBPSFU9iEkDY^% zo*JDPb7y4s;Oz8_cXHL;C6DGg9VDs1LD}r-7gH$ToAZayg~EcH*Fo|8+>A`=i(!Kp z(V_^cxf91^C#NcR=(tl~_L4ON!(z-xg{mqsp`H10f2z&N;K<0Zm-Io!3j@!KlH!?~ zn)UX2dZfAq<3_fi-F#UjV>PF5&_}2?k_&O&O1mO;tfApSU$JRP51l!E%1@}{W8;$E zDT%A4$_j2)c7SAe+J7W2*jKZh)<%RDCqE#}CR-+Cn|v)UL^yGrKG{32;Y4o8xA$RQ z?qQt#{LlZqXY9l$e;6*WeeG+#cr;8Q4335YDH+7{Kl;&+HZWBz4Q2o0FaDx0!{R!* zVt6@Z_Qdnx2?uGa^#W2taqnJX9&qxcCq2pIJB)94pM*!^4A1erhEvOD?Mb@$JK`)I z_ZAF(Ja0TL{quz{e4+cZKl?Mwns`mBt9dRvbLNcu(?9)F_mPi$#Ie~z)IU^Dp$-u7 zANtUTnl^S624fI=FiB-3R%U~d@oy%(;U@_c5;xC$<})3(Xu^Q44L0RJ`?EjW)R!>k zjbuy6C?qecnJ|cwzU}@f$NEe79d_UDou#pBJneO2V8N7#tCC^Q2gx_uv(pfV9p+17 z8Y2;b1ffa&AmPDjK1|>34iL?uqyYEy0VIr=Z@>Xkjy4wJ((YHorM6uSE4Ra)U1!VV?SG$AXs2gZLbl~gmL+}4f_naU3X`dPPm=xz8VrEF>l}L1C)X|80C@Ylm@XM((Mr)jRr% z#=lAL&qY6LEH!;fF>qmE00}Y1hmC1y4}Pp=1f%_pCgGX%JhRqVynPMt_$BQ#LRjRp zGA(aKvKeZsC*GoA^Zwp}ObElm>Kr1?2sC-No55l;x=^9;-+xV(!8%iHPq#`CAo z+lv8f2T$kvwOurVcpTjlk||37rX(Io6L<;6J1mg-vPeK#OScD((~??RLyQNbs!p7rBbybf9-g`Dwm~- zrBk~VuU;ixGEHiuBmLgaPPc&fsnBjQeo(X8d&wTRV^khi4j+vyNN3dvMcfpZas9RA zUAp(?@@``14sRC-HLxWSNZlF16%!~ghSGvg(@vfc(?=fwgMzU*H$UrU7gyZq4%Jg) zO|DBG!%*we2SCU`41p{V2lor6iXkz)GC32NnC-{2P53Mbq~~XYg7*f4d%`0h`AE5y zeTm<|M=|xkC#2E^^8l3w>V}J977FSJQ;hm01?s~_8nvK}28^F3+5Ry&s71uT!QO>e zm_~y#rrpZjHWEY|-Bc!(`!E0UFKwAhVV$@Khe!ypakOA?!CO4=&fasiiPPf3^w^?d z)1G96($X1>@HuW{2Zjd>9e&s~VxvyI*$AT=mL!f&-H`+Vr(u7ya?aH?2@hdeuXx2P zygC+)gfM*alb`gq9wT-$WusT5dth$G zZDS#of&CtSTMc*tiwC^MVJH^-!+4>5<`yKz5L@5Q023n4i0BkP%x>IouNRPF#ETL0 zrUm*E<$nJ2pLg`NOE10D&!x=kY<|Hz{Vr7fVEiUAdy@L4m2)9nU;gr!dr78Hx`}$B z&IL0IyAw!J(8e%$T8%Xrv`urf4sm=ClcRPQJ?pQIJmf)Bs)#jW*IrmUm?n&!N`lQE zaw8cO0-c+k_8_1eKK)Ps+x_1Uzt=tVF;8_@Uj1;lWABxsDN63}UAMb0e&)ljurO=I z`Ro2`9_9LnN4+x$V0%W2fUDYW|3ep9LLa9bS)9-$M;wT)k2FNa8|8HuUsMV!bLg?$fsR0Fez*bn@{>)qGB z@E`6wpZsjMIDOh3IdHo>pt8@NK3U6^bOHA@HV;G&#F##elCHkGSwfFKPoH4yGylR+ zrR|ZnggHu}T{haU&uKsNwMze_7&!kJh>s0udl;vT7k=z-II!iOcgzR2XW-fP1<~AB zS7Rm}rYnfIJmh0+vJWAiyj(XDHky7Tuph{2!}-zLnk#g>G5)|k_hFlZGuqQ=3*M2> z;8`Cb9dXuv#1kw%_XZny7OYHzXZbB3@dk^0md;=RlY7g@J$;Z6_C?EQ<#M$+uH-iu zVVd;*{>6Z`K~~Hi=99VEc`$_xFdxJ5-*L+tjE_-qAC1s-X)SWN)_oMm92pu5#my{3cSyUX+qq5+_%n`>(@2m3SRS?4{^7z#waV94- zG7MUn57@VX@MlBKsXBGTeni-r4WV{rvWAhwk9z`}aR_c3IF{C~@h*VG0+T-{aY+F< z5ayi(z6Dp{obqlaprRFbnH|Ex(^jkR2-8syR7Ae;g)fBBYxgj@I)Ss6K{u_^+r$&5 zZFLXxi8f|JBv@Wxx7*;_1RCZG>jNCx5W~AjYqbht9@6kkUu(4yhDeVyN|InhfSWPe zco|9QHxrixm$;;OgAYz|C;rEO{KsC}&*Hh#ui0$#YZt!fd%nj@^;`($w5#W4-!X4s zr;BkLdb&Zi23uTz_=kV!nSGmuPd=Czc+sQphXF|zeio>U&07|CzOFDh>DQ=^bP^!M zk>J5)b!Z2PyhzRQi@U&1f@|}5(z^>e4(2+>{c$~xWNjE|Qy4sPDV{J5_s@97GaQW5 z<`8W>BBn>Uu^5>5W~Hu2nqa(O`%^r5F>I?3F>e9hayIV#ZO|K~iE-VbNKY{+^$33(#2QhftLpl`ti*@G{pZJ8Ie@VwUCfH`3d`N+Fc#G6F z3?rBU>^V@)XU%8*A)nEvonoOKebgz8G+i?WXa{RQ=1=B780Z|t(r(bN>?@3JAU$ot zo{&C)IxRFj{lVVx-e3}E@xW#;if2)zo=L}E3XKX5v7lir@Gjm@cqX0zd>nmn$Yt|B zLIThLFoF1S__KHKUN1a=2g{ppzS-|zsSgKY)_<*jRyJ4iTUmAu->3KYF9xg)XfvXnA)oDY z6XQc}d}KiTTI}~Iy%{FpBBHEU#+@N*;7W~%qRQ%87Ncf(ME>2CZdS~mg@rMJ&A6RA z##~X%m1Ri{WkqqSkBT{j7$rJu;y#Hx)hByCFqvRPX{r`z88Q+RN^BwDSs7rQbg`+# z<_d!W$rL8vuYBbzK8+#LnvZ9Y$^a%W1KYT$Oy&$U7(S$n=QSAN70)6Ja-?_;$xF{> z0vkG{1orLQx0&od58s0e_PFbGUb6Yxh{01BI<1&J*NQmZXu$3WxMbqlO0WrxZ{Hz0CdI@BLm&i9q0Qbt4E2+RerZ&l?SlbC}f_V`eVh zNO;`i9_Q^HVe=?%Z>$qI%;hk=FV+Cw*nq(BV*TngK)C+IPy9qn`$h=%M6)i0WJFA^ z!PXp*?H|>94m)ZL9{-Yij&77w^IT=M(Ln!Ney#su_>RXs+3noB&z(7bD2#4gF3ozPc%T}e2JFb3T+=3eugfA0S9 zbuV#?k}O^?unBzA@BA?G0Jm^lCJN#f2aS+Ca9$0MV*<9N}Bx!9w5!RvIeG+}vE`9p0GYlAgOPfHqbNGam zEQ}uZIM_bKSqkk(+d@O}W50ws2GYUo;V_th)CFzJet^K0ya)*(QOh2JeJ5H1q~*{Y zo1mCKfZ4IZCoR)6*@yi3D{g8{UtdPJb~i%HYfC1Dpialo0?pj5WHWw^P&Kd(L`%_eCz zt%wdOEPR{MvIUf9-uda&pOqsH{M)_4vpv3%< z$kFWlf(m!C$s-r;BE%r7c1!997wqWQFNmqKBqByhU7sX@%BYUXPLICQ8*LCuEu z5K>Iu+ymG0+2C8RJ3QeDPjIMFG00gk?zrO)53gN52tycCNF^ny9<K&6A8>Kko z;kxUt^WW7fUpyXl0PN4;B0LNjjik;SU7Xku1Cxo>GYvza9o|zW6C4vUxU&h8$&E>k zACoA7_M@&yM9`)-VUmybg_{qj-0DJl?lG>-#7I4D^9)>0-I=IaCK4ZWor4QpE zjNbLGce(ey?|t5-Hj--b{$=U;9yZ)CF2VIi!nrJmZ;vwsY0p-;<~zdBE-mR8|FkJ; zRJ5f9`bWHsjlu>Nj1UZ8!w85=_*hxgA<4dvz3=1-!NPoWqvlWR|M7f$595Gw!8}Tt zFa#kyAa3Yen+^0Cm}aWkBFC#+iGWUl^OM!e;OeEK{2?xa;)=OShTw zIIW|d=|{KScAKBKT8%a813tr`}y803~vygR1PcFELkwJIaB^h_@=&A_lemA7$ADZOlKm2^Rch@J}+kfj9 z+<~t*O88I#`sH(9@PqEEeV4nt?wi+v5QYjfP4f_ad|b?)$(eay#-OB#N5^#X&$!jE zO9WBG_VPR?_prx2$-VU-zvTY*Pu}D{_puKq+T>v@eBbvy+ua~LO0>n_eBgs?ILT@} zj7Z!%qk}4uS!?nB2BhoT7`sSy(f3<1`cQ{uV~Mm6bBxU^@p+AYVec9Xt3REKepZJr z23@S5bvkC)$dEUbh&2Xu2><@LhbBnF#fbr<=ZtZ~Gqe}ug7xW^TW;}E5zt^f!|1^y zEAOEz*{GAAA9Nx8l63}eq%eqh53P3Kzybe`K1&&__vA^#g@Xaw1v&-V0!AH>F7?P1M<21B}+ zx>&!(wkoix59LvB+c&XihPI&2X*mBFpdIKNt|Eps63Q@6s!}~w{IayGIBd#_(X(qp z4qL?RsjRNZ2(z@Ol%=#J#&a&?cI_MxZJ_ql;Svtadq;=79cB)=pw(7IgH)BT>-pdF zxGIIgJtC~gwRu^ciAt1ZAZS&LAEa*RNT_qc_(7)(&QiaK8S+-dtnp%TnP~G|mCyJA z!5iooF)4~|S>C#E#a;roj0qK$9)e7O+{#i(dFkll!b*2-MMP#!oxZ3+vnu9Lk95x# zrP{S)_g<&!$gWRO9k*BY?emg7Kkx%T;0bdEBwmu}+}OW?lS!Rz6UH+H1k4_|sSHX6 z4uh9xCUJhG-|WQAq(MDkC;*ExVIn~EFkqQ@_V3^C@x0xCm;fl3@@Nx?Kg!)`;QQfh zBc2K#n6To64aI6G54fpl4C-KsmFJ~tl>R@XKaFiGbUQDh;V{C76c|x>c%FQeAEwk#9P0i zKcQ9w&Y85SH{Zbb(!U@UV3Yxy1%_{;K1|dQ@YIpEvwrF;wvB&)PkpH$c;kCE6R00J zXK?~1ixBw3wJ)}&fWIAKyUXEw@4owPUtijeG1#uI^bHnX7E4RJUfYn~`XFuIiunR; z7FuA_{_W}!$0hv+VuUszAL9Z-rJY@*IE;(wnQ;vRpSg(fLEACr7;ns>8=0dwi}(9G zpS2JDjX8y}M&GirMt@|}v0lG{jN=DS0ir?6r<*KP-Bc;31-{@OeC4IC+_y`TFp}b} zg^1Zh9wd8YTSmlzD~N!suDDaPMOTzZ%t7gXk4}i$BbZG=g=MQHcg^K_H!bg;|N8My zxzlIFBW78;C+|5hg|g_8B^Zr?mcqK?Bm?Sui5AB zxli6H7NlM-nxP^(WGp9wxH>08)TiC>K)<_OYs#@Ri*9OJ^OWkkTN1`QC$jF&183aA zDv~`p;VP0?LMqB9s(mD$xsDw^;7%R7!*u~*yY^^(T6Kpd z%75E!U-atfyy6|mVc!?!Wkp`lo3w}a+Ls^5BX zzx~_4y^{RM~t`ZD8&egsX)q2D*Y@eRLDKzk9#`oTt<%`syJFOo=KaBvL$3GK$( z%y?to<@&@YKGD7S#V_{h=$mY~kq&{Txap>wJiQ1k=)G{iaRH*}0aGRVg3$-ep-AGJ zsyKawc10_LegH$n7(X~iU_W`I4!xk;=?~0jFj}ySisxPCXXt#^XZjTqLonpoM{w|q zb_i#`$TKu(C~oxEz&HJbPRS8yF?e2WQciHG#YAM6C-_EFGswFlsG=# z7(5JKIGPyigfU=~FU<)| zi{r|~&SXx2NMcYyP?L^)G{9yC0~5? z;)JPU?M53x$il&9ax-R+P1f{30`FPG>65f0n`ur6!3Swz5K$ia!XN1gl*@$7J2v2K zBrP5|FrG+b!~lyu<&Ykt6gXV@9^BWn35QukJbjb0>0?GbP%plj373Vz@WJ;H`2Ot- z;FRBX1iqc$xe6>lFr&A#9Pr5|nEwUYQLDaor;8e7J z!%=`CF_hckmglDY+@)T<#%Q1nm^}5Mcgjahk4}{?y?n2{K4|R~A>o0w7(4!*QtaHb z*L~M_f4__hW?e}hsfMy8clDKHZm>^;h@ke0-;x!y+1VvGu_NzxNM%bji#sg|pS*~Z z6&(gmNmz4LHg$H120((EU9XCO$}frWRa|l1UJZ>J@Hr;YBMh|oE?luc_?kz$hhFnA z*S$RHa$?pDW(v}aA5>X7(9+yp5wSF&wdN|>hA1u--Rz2NX@M``i-`matzCc-&yT>G z!5l>YgHYp{wFzbp>zl1zHb$7AEN;EN5wF8m`dJ(n&zl`HtfzZLci61F(eFsA%Vy%B zWz%r+Vt}y#-A8}op7CRwTMpfjmW5FRJ%+>_8-DW$2@Pk5VcgRPfy3D15RhkR0@T#m z^s`y#J>@Y*`K?DQT)ddQcxrC69W)tjX6?!zkM^a_m^+zEVUW;f&{fP`w6)R9Fjshw zWDc|!a|3+``#jd(z=lR-56a#Tnjgjs`vuBj|3JTk*+@Smj`T1hVZ6Y+VQyz%Ks*8X zcsix-z(E>`E2?6^LDPZqfybJ_KE(tTs1Ist#M9T=n~)A;|8|f-8gP{M)$`k@tql-z z$w+N$LI+U!-im}=5N@cdPe{^7nom>OA5UqIiU)K0r{|T3(UTFaR1`f^En`jx8gIgl z>OhWtv&bE(g-Ojzc7F1j0|y6&To&$7r799kCt?|$h*^NJ!<`puTWntO1HZCblHul} zfM|0g$r>bp3Y4M%Y1GKa2DJq>2uw>Cq3A;lUxf43qzNN#$fR;xsAmiZ;;| zU9(~iagQVtoqkoFKF{V!AJ-2t)vZZb`9%9^uqdtauu+D?ifASS4aN@xfB{S==Et)k z)CLEWKa)I2W8g9Ab6U>8vOIiGIuO9Z_6Nf&6DJ&K@Xim04uN(eFsU)YF*(y#OoX%* zj3FjtBg$-I2d=@kHU}4)*eGgqr4<#10~5A@J}JG43MSihic!85_)I)!NYI!&LZOEGZ% zF~DeIZmHKKd3;#{-r7A^`w0e59+2*mfha{izh+G_bINitt~FNE+K`M6jto`hsZ)#+ z>6c%*X9qQN^NY(`_bZZ;85d)x>dsEjyRlI@PS6?;Ez+HrzB$D4iVk8lPwKqM^+=~Z zC;L9!!$N^&kC#x~l}azo*Att9%cT`pTFr?TDT~m_%2C9MTU-|N7L_VVD@C6HBgU9L z5gj9NEdzMa_Rp8gq1c{F_KH60*8$TJouEb1noCQ|q9=}NA;S@Bloni)w~kZ)(DDzs zhJa_|z(#;|1{#I6h@bjiKrmXKxtI2&{b_6Z5`BX{0KLvT>t{&e zB0;o&|9)@q8wQOr<6#tXAdNr*0eDCRu{WU(Frk1)y@5wP*soB3e!OQtL7q@LAEpiY zfX92jl{mf!*n9_T26Gze>}TKME0g{?Zy2CmXm5xS_$x@~3=GmvTI2N&TZHp-^Wv*4 zy5&NoX*19_;Bvi^BovJ^AP?%JBQoOLhn*(+LRNiX(w#VdQW8JXV%oFIt9z~1=%Fme zkkJ!^yVNBj3iYTR;}ep$=@Fr%QzR8wmCyFcGxMI{g7E0o?HKgv`376m8N>_-%fo=+-h!pG=k&Tc41iN6O7II#X(yX3dB=}-umD4Z$&ok~Y4R~i zGvSdBVi*{};s3D`oL>dC{D4%}A zqz|)){si$rAg`Sez^vju>5#et9_5pt`WY^Wr#uThr(ydr5XbLEA*b!JQH*t#KJ4?I z;BIZW~L-(jSF-O&>sf4O% z9#)!>p`804`*w-hp#vgK>1R%#Qa(xANOGkI>0q5HRaB=H9SluQRop|a$hdn?h#4cN z4&94Y5wvnT@Sq8o(R*o*OK*KnG{B%vsQMItspf2@V{fI?FI3I5f_Lfe9jre})5*}|J-=Z@F8(IcbMu8h^ zg<6bWvPQ5zu};`pN!)tjVjfd#C|U0#)AuO`T3~?jVq*Z>jvurnbQjVR{1`{9=^y^^ zhdmTF)NHz;$M``%+7Af~>}o;R!PEf`DlyQ7z+jV2S_|R5#iiHtg8|wS^9u+Cp!I>u z6#WBxI7sY3lcSa(X zAQ?noLHfq_p4e-nJ}_ud-=!Spd-kZDYdr4LOC=7-Fu1I?5*>zN z<$ZhiNS$j``^acMLojAp9=YJzg4Dda z#i7Cg^!S80Qxf4WhMsD$VYqgO#4}zS(}occfcYYlN-<6 z8!X^a9`RN#aIHU)m$C`;4bt%p4Bi2g^1^ypdYjOJN1T-pY~p}NnM~|fXJ3&1*tgho zdfgZXXd4UM)6ZDM!*;j#={3c`w;~2$9eAdNt}t9+*mMo-a7#VATxns-jr7WnUT$1A zdj|9-V)H~S2iz$<)}8q<58&ay8|N zp)(~(V0o9&LDFhjbDnJb%r5A+oOgT1^X}U(A9P>4XVRUX)10mYrva_~J9J{j>D8PF z+POu|qq6-oE{6}p{SZcFF?1?Y^}=&S+3g%rd13^eII|#|J*uRbECaYH)oIs~PQ-Gu z`!_GzqbORXEVrgo8h69JB9wHXG&M6Ne_Wc|yO8*SaIr6pe{6)8E`4Lq>b%RBqz)%> z>nu`2%0sqQm0c0-QqIUdYHq|8vv@pXBgju{hL}nN6{*cv<-nq<(_C+}C&Ijy8ozQ- zz?#5X!FtxhWlx^{5Z*9+Mdl@pN=<=CT7)uR_5KqG?%fy%r=kgy{6b z{DRz|&bx7S92Mi$th%Km)+fWu6Pa;MfN}vQ`#Cvz=o*wEX7y9=4<4XBI@MZIM}|1W zJ^Reetnb+3@rYX`?i8wAvcuC|?G{lcDH{kOO}In)sER7D{wUow+{ek7vpTi+X2FMv z3566H?1 z^h>2n^PU(JoCpy|uzak?Nc~{v#xsiiGk0x*bg*G;OfQt(wB~PkE|krok4PFfBPrdk z>DnCXp=Lys4vGkuPWntyDqTe}Vx$@_0-~_6B4R}nm?};(x?;`1)K|O=`DCZ4B{dY$ zqxu7T>8uU|q~2Ba&k-%KShP7`-@7EKOU=XN0j9QiZbpov^1`y_U>#8Ta`Z^OXC%j5nNAG0cL-0!3VO>SPs2siks0ITpMYe&6Cy>V8 z`-p}=tUJtCHkZZcF5-!^^{ydv`jBGa0gM6m1N;ca&@p-s8VuTu`0&8b#uM+kXXDJ~ z8=B5&R?_ohKM~TC4`5VZ(4S6Q!pxyPX)k`X9q|~(Cmvdyco=(@24)F#y0tZo72erl zE+0)^^04ouf6z}z4Ba~}p89ZQ`7@*x?$iVC=%AR0B2U7!ma>3p|DCSN3C(1)YWPTq zStOOXMyOR4)L|>)%nZnj1)i~b)j>J&Lm!<^M_1_;lV_=0YFV-xEkS8{1=H!9I-(~Y zC0f)a4_t`&R9Dr3i>q!)`tli7kPn0DQz+^bN-zfp<Q)!Kl2!!vOv z{z$u82=6U#n9tI+x*GiW`*?i#%)Qky%x876cPtckZ~1w)d-8^P46ePmykQyX{njy% zgx93Ft(TNSNHK6>VIW#1wNf$*!SulXo)4Nsy}Fpn^>xx?mn3MA+9^nl`|wFI(if-QQU#_C znMfe%81nfLFia$|L#^#i^kpK2{5qjnThn!we6g=LbPGD>oQy?`97reOLrfMtg_6#H zp3e(Ij6!Q4%xy!U446ftMS3JEE#uSGs=OQOTRgKzFjs{yBzyb;m0(A(l*#`GZnW0% zhB`&{YAB@PAzUlKzdc(b;vo89_Sk!SmtIp0JdiN}%@rP~anHViF~mFe4g~HQJ2rl} zl9r7=Y1wCx&jNA$EI;>YxNtE*`@j?l+sWv0YE8TyzS8c-Brzrr?@14gFxcLcc*{>( zVDPg*oR!c188tHA8$7EE@QCA?vboxUHqQo|vf}lj&sqSs)tNZbhJDq(&(f#Y^Miq? z&FYNC9@+iF!#Oq&E8>M9!Q3_2F9%w(%Ok1gG9J1laSe|J)pK!MB-tbBLosx4e$^+Z zSQF!;GQlGTktC$cs9%ZJgD*2BfgANw?B+-;Oc@p>>ILHkQMR2sCd6Qgq;+8E6eRVd z@}mh+lw4UrVAQOZd)<E9Fs=MMwtd#+B$!ue}^E7|%0M_CBKl$Pf`KLy)}6&)UN zfK-%Yim7QitCB|5fS5qb62gJemz5#ItnBr$?ngF$GLn#%O&g=0+`5 z3sf2~Qt7m+mMVf^S)w$e7S`VS8yF{ROc~0pGeDxdI&7FMT}m6p)Z-(7D3V3xM{FP7 z*I{vA{|4?Fq1bbnDuNsSZ7kE{OQ0G{vQn&`QCVW2>13`TI;tRiV!uJmpBjV4a)c$d zyElT}uIeDBEGQ4UH4B*CEMi!?}c#mA8BQi#)w2PAHLHZ^un>)P}&@Y3}VhAl4WtdisA`CBg zOI(Q$$xB+NUj`T9z9adA*iw(USe!)mNp%bTG?+d!GCFko?O%0Y{PI_n2Cf&Rq{yp) zKn$A*OXiyi3;=#%V{8UankU6Tih=Ww0SG=su+xxY;DL+*)-)tdGF6EI>)-|EO~jl4 zE3g^#6B8w3S-@)HF?vP~OcKF0<_&SJL*rW*I+ViCf|W{2ORYGIR%|_W@O}*r>R*b- zGnfyS+88?2UFCY_QDmQpWOe3^!Q{#>f@4rfOQ@%ho*Vxf11ExD%$|Ch;A2$p2sUL! zc=Zy{-WC$?^iTLDSk3%H`X|Leih&JdAf($-W%=}{Kkbd!8eP9(fN6#l1K*+;uyyBK z^z$z0&tje;Af*F+)hCG@gl^{M3$DLUjm>+E6Pp zjkC~GR(k9zOJYZSnL&{|nXK&eh5nusZ~mex`mPhpZ$P+^ypDvMm$~m zoMIrwK#GC$i2<8qaT$R*oSf$Dq2U2BZe)u`ypKrmMfMN9@QrMS^>({nN$Ye;<$Xy! zlUb>K$yb{^aN&?jYG9?Ro0*m8(Qfz{@-!-VISJhCkilke&rgI#_N16PxlE38KUcVbIG3F-WBVKlP6tK5<-JAJOl|kH#h56CH*t351*JA zmxR!qJ9hMl+_OusT_4%oCl`5Iz*xh&nojn%)@-(j(E$7i78k$wFVjCM22u=M@EEWO z^@6Wxtb+Gfy={(5D$m}i=%k`4CZFxS-oJu7#=JxUKa88P26uLP>wOXlHhL!W|}9(K#GAB1KWuKKQ}=* zh#**%@JnHFL8f#td9xzEORt1!`dxlhd>HXRdgO^KFQFU+ab{-m*0${O5|F{IdbJ`R z%jC3wmzSE?u01>4pgf)SOPZ%!>rPn`MAI|VE;}wp4h996q|VhPiJaVkq+2A3Gte(D zSzgR2GL(4w)MBoNo*;uEJluJ~rm+b4)#j zy(1?6ezWg@WqIQ;V7`!+6mJp zW!BVNi1CKa0h>SSZ!XR|V-lQ;+QX0;A0O9AtVyPCtrT!heQ_twcsD85?f3@ZaX45S!HF>vlNfUrxS7&{XaBa+~e z8kP(*FG~<6FR2|2EsHIpxn0^%@&(Z^v6|9~3^ot$@V1VTmRyiq_Mt%pcH|{pnpypQ zc!QIqXJ%ExGExJRs@L4yj7;hvjgub`cWBHl$u(#u zJpGdLx$KI|#4(a+kQNv(mZ<_}rN&j3RL;^$(M?UAmEmQ%3zLLTZ@yQB38pwxeS<@u zQ&qu!k8A-g%Str%G_VP@urM#Sjy_1~CeNPr-YW7k_Pk@~4)3K4n>{d%d?H=WRba6& z&lau9U}0*t7{wQ@IE+^L;_1@o6ay&+wig48J;t{Yg5g+=kIV2Kwcvd`&T1Ftji+h% z&fs#5=QG$wz!znO|6B&j!3aN_hOo}(vdry-%_fI>vmRZH_1{ih7%X%3N}I+5{S7=> zzcZYL@%G-{#bLys4OTqfo;!tO>A8k5=Z_dffNHN2F@i0 zu(g9na%p6_;@q4&Ey0@Jo?bUNGAI*;Fxs_ukrOTEOH{lDhWcF&7wcm2jEu>qayBQ1 zkj&>u*v6;T{EAIu*=F{(kw+yolU?=30#~Hp)hlATD%C16ajFYqxX4(th-i!`&qxFa zk6SraW?r7V=B8)dirjgX#JIsXJaEe^B7ro?BJI;9zpE&A zaI%JD5#ndWF^dJyETUf5%@=5?8&Bio<;0)sxzf8711Sd1HwGA=Hb(85RHvkONpbPK z?b2-K9n6bm8Cz?W*9d6p5#Gn^wcay?H^e;Gi!m63z7?J}@=aU8<3`Ha&a_E&ZntR- z@zm;mqxB2nP@nAzz-u9heKX1lj* zm_EI~Ffb6d4daqIojzs#D|`==g6E`nVL#-{EFZKhYefj#-jObzFU%XhXVlWa!@S(H zHpJJVB$&Wz6@bIH@#Bz}wT5|{gA8Et3(IW)N#SntGQuJ#9Hj*_x%7b~;JIKo70u!rau)V_q*j#`8>%dkB3!Y1B1wk}!?NwuKO}J^*Xv>?2~JiX zzlt!4q;JL~jnq#M_JQOxzOP?Kh{Oo$6LSezg@Rm;;hjtG1_pb?fD+4#U@KDewB^6l zgOlOQFTdO~cx(}4al^n{tCJGa!4P7R<+ono^o1V_9E&rH9rH8D| zDF!x%0V4|AEVb#mVhW+(Z#k|wFn;Dpd_ZA!{Vo>uX^>mo~F|>NN3+t&)xp66W9i`leFziOW$rc251}m8Ek8>_;agxOUE@# zV{pSbBbdXuc)ttZ;T=Xm!y?woAl+vBR9Hp>@ZcNTrHSVWpEsK?gpuB-7)UXYVqhZ} z*e+HCaA3?7mKJ1AXHj#ka|3l~b$5LP=^_(uRU=&sHRi zv*N}wqf)nxBqfmwD#$EPj~rd)Bt?l(&b)+e#DD3PO`Ro0tSV!-+c`1eW@H?>suPGI zF<_9U$%(1cBNypzpvxN(DvS98^JZ{B9=bAFw=5T58Ho_}NE8W%1-{@{%5wXKAt8w# z^-A0b?_5Rsd`BWE1CgWjIzMwIJ@*XAJ+jI{@@GjBJ1f#N!+jWjZtzKo5Hd41mnam+?WM%<|E7M+w4={U0o1he45=-In>uMj=sf9)1Q-T{B- z&YkYy!GrFSOD^$nPoF;RMOk5>L7eZ~x6i|ZL6(LT11Sc!7XyCkXfs1IPGNd5hgsmX z)FekXLsVLE-SRBhg*AHx;B*4B-JHUFVfCbr{47u=!KO;eBQ1ICd!iK4-*`Fk=P>Pd z-&2;hKYmZboXU?le&ER4ja#SCcJ<}k4JO|X4tO@EI&(j5Zjw!?7TBqCyJ8IvFiB57 z0&5rT3|xJJ;K~iA;PcG)v}4>+SJDxHYjxwEA8kk)E3-#x&#PKrlNdVfZ~}bmJA60Z z9FWkZe!yxjr^l;wvp%;A;dfHLm9e5S@Wu(=4Yzz7IJ9xl3NC3#%Qxeo!2+Vn!0eJ= z_zH(6q95o)QQzk;KN|s-t9}J8^#yJitlr?6)3u5}9jo`zFm3$aV1mQ2oq-j$2Y4XZ zxAVST2>WlVbd*gx+LN-@gV_qs{S_a_Nm#DcJ;Yh~{zACl);g-2`tGa#8g+%J{rLU} z2T}h}6Sr^Irgletj4@zvBh1C|>dRzl(v2TMf|C@;N1u(4nWVH~9Qjb)GMt6)lI}_0 zDsB8-n2vX8NHLIN;DLjIt&aI{{@4iC)~7H!gJv@pCUcm+x<%{YxN1c_nTlw;9?@o9 znPIul>UOIc3C)O?lFLUbT&ohM>Ft+|Wtq$w5Dz6MFI+u6dABIDHoR zjCe8GWx4FaWqP$QC=^!#EuL&iy?%DS7Clph00K~m^)o!7Uc(}XQs+^_sCeC zJ_tiXl6P^H6}c9ZDp_G+QJPvHK*TM+zNC|8q@Dy_*X}z*Y5P=k7>F|?(8BvxIU%fI z;6PlV`o#ihL^p&NF!@1H0*^&{`1e9^+_i9N9o(jFRz*+A3ppL1S`G%x^ZjWj24ohBK)І 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

fGSC2K@#y^Ks$9i4Ol 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 Y0lzTF?Avknt^fc407*qoM6N<$f=~8Be*gdg literal 0 HcmV?d00001 diff --git a/dev/examples/A_simplyRunningOWENS.ipynb b/dev/examples/A_simplyRunningOWENS.ipynb index f066aa28..c9a13fc7 100644 --- a/dev/examples/A_simplyRunningOWENS.ipynb +++ b/dev/examples/A_simplyRunningOWENS.ipynb @@ -53,11 +53,11 @@ " - Architecture: 64 bit\n", " - Precision: double\n", " - OpenMP: Yes, number of threads: 4/4\n", - " - Date: Sep 13 2024\n", - " - Time: 19:58:37\n", + " - Date: Sep 20 2024\n", + " - Time: 17:40:56\n", " Execution Info:\n", - " - Date: 09/13/2024\n", - " - Time: 20:05:10+0000\n", + " - Date: 09/20/2024\n", + " - Time: 17:47:19+0000\n", "\n", " Running ADI.\n", " Running AeroDyn.\n", @@ -256,7 +256,7 @@ " Writing statistics to summary file\n", " Generating AeroDyn binary time-series file \"./turbsimfiles/DLC1_1Vinf10.0.bts\"\n", "\n", - " Processing complete. 24.195 CPU seconds used.\n", + " Processing complete. 24.511 CPU seconds used.\n", "\n", " TurbSim terminated normally.\n", "\n", @@ -286,11 +286,11 @@ " - Architecture: 64 bit\n", " - Precision: double\n", " - OpenMP: Yes, number of threads: 4/4\n", - " - Date: Sep 13 2024\n", - " - Time: 19:58:37\n", + " - Date: Sep 20 2024\n", + " - Time: 17:40:56\n", " Execution Info:\n", - " - Date: 09/13/2024\n", - " - Time: 20:07:31+0000\n", + " - Date: 09/20/2024\n", + " - Time: 17:49:39+0000\n", "\n", " Running ADI.\n", " Running AeroDyn.\n", diff --git a/dev/examples/A_simplyRunningOWENS/index.html b/dev/examples/A_simplyRunningOWENS/index.html index 3c7ad904..10465fc0 100644 --- a/dev/examples/A_simplyRunningOWENS/index.html +++ b/dev/examples/A_simplyRunningOWENS/index.html @@ -32,11 +32,11 @@ - Architecture: 64 bit - Precision: double - OpenMP: Yes, number of threads: 4/4 - - Date: Sep 13 2024 - - Time: 19:58:37 + - Date: Sep 20 2024 + - Time: 17:40:56 Execution Info: - - Date: 09/13/2024 - - Time: 20:11:31+0000 + - Date: 09/20/2024 + - Time: 17:53:35+0000 Running ADI. Running AeroDyn. @@ -236,7 +236,7 @@ Writing statistics to summary file Generating AeroDyn binary time-series file "./turbsimfiles/DLC1_1Vinf10.0.bts" - Processing complete. 23.883 CPU seconds used. + Processing complete. 24.681 CPU seconds used. TurbSim terminated normally. @@ -266,11 +266,11 @@ - Architecture: 64 bit - Precision: double - OpenMP: Yes, number of threads: 4/4 - - Date: Sep 13 2024 - - Time: 19:58:37 + - Date: Sep 20 2024 + - Time: 17:40:56 Execution Info: - - Date: 09/13/2024 - - Time: 20:13:03+0000 + - Date: 09/20/2024 + - Time: 17:55:08+0000 Running ADI. Running AeroDyn. @@ -407,4 +407,4 @@ Maximum Damage per hr: 0.14693877554749607 At composite station 12 of 21 at lam 1 of 1 -Mass of Turbine: 208897.3537787773 kg


This page was generated using Literate.jl.

+Mass of Turbine: 208897.3537787773 kg

This page was generated using Literate.jl.

diff --git a/dev/examples/B_detailedInputs.ipynb b/dev/examples/B_detailedInputs.ipynb index a928f1a6..14738056 100644 --- a/dev/examples/B_detailedInputs.ipynb +++ b/dev/examples/B_detailedInputs.ipynb @@ -147,11 +147,11 @@ " - Architecture: 64 bit\n", " - Precision: double\n", " - OpenMP: Yes, number of threads: 4/4\n", - " - Date: Sep 13 2024\n", - " - Time: 19:58:37\n", + " - Date: Sep 20 2024\n", + " - Time: 17:40:56\n", " Execution Info:\n", - " - Date: 09/13/2024\n", - " - Time: 20:08:39+0000\n", + " - Date: 09/20/2024\n", + " - Time: 17:50:46+0000\n", "\n", " Running ADI.\n", " Running AeroDyn.\n", diff --git a/dev/examples/B_detailedInputs/index.html b/dev/examples/B_detailedInputs/index.html index 5dc38fc2..30a66d69 100644 --- a/dev/examples/B_detailedInputs/index.html +++ b/dev/examples/B_detailedInputs/index.html @@ -130,11 +130,11 @@ - Architecture: 64 bit - Precision: double - OpenMP: Yes, number of threads: 4/4 - - Date: Sep 13 2024 - - Time: 19:58:37 + - Date: Sep 20 2024 + - Time: 17:40:56 Execution Info: - - Date: 09/13/2024 - - Time: 20:14:11+0000 + - Date: 09/20/2024 + - Time: 17:56:15+0000 Running ADI. Running AeroDyn. @@ -296,4 +296,4 @@ Minimum Safety Factor on tower Surface: 4.663274990042032 At time 0.04s at composite station 1 of 21 at lam 1 of 1 Maximum Damage per hr: 0.1469387755538469 -At composite station 13 of 21 at lam 1 of 1

This page was generated using Literate.jl.

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

This page was generated using Literate.jl.

diff --git a/dev/examples/C_customizablePreprocessing.ipynb b/dev/examples/C_customizablePreprocessing.ipynb index 0ab2b920..8bd0e02a 100644 --- a/dev/examples/C_customizablePreprocessing.ipynb +++ b/dev/examples/C_customizablePreprocessing.ipynb @@ -73,7 +73,7 @@ " libbrotlidec-1.1.0 | hb9d3cd8_2 32 KB conda-forge\n", " libbrotlienc-1.1.0 | hb9d3cd8_2 275 KB conda-forge\n", " libclang-cpp18.1-18.1.8 |default_hf981a13_4 18.3 MB conda-forge\n", - " libclang13-18.1.8 |default_h9def88c_4 10.5 MB conda-forge\n", + " libclang13-19.1.0 |default_h9c6a7e4_0 11.3 MB conda-forge\n", " libcups-2.3.3 | h4637d8d_4 4.3 MB conda-forge\n", " libdeflate-1.21 | h4bc722e_0 69 KB conda-forge\n", " libdrm-2.4.123 | hb9d3cd8_0 296 KB conda-forge\n", @@ -84,10 +84,11 @@ " libglx-1.7.0 | ha4b6fd6_0 77 KB conda-forge\n", " libjpeg-turbo-3.0.0 | hd590300_1 604 KB conda-forge\n", " libllvm18-18.1.8 | h8b73ec9_2 36.5 MB conda-forge\n", + " libllvm19-19.1.0 | ha7bfdaf_0 38.3 MB conda-forge\n", " libpciaccess-0.18 | hd590300_0 28 KB conda-forge\n", " libpng-1.6.44 | hadc24fc_0 284 KB conda-forge\n", " libpq-16.4 | h2d7952a_1 2.4 MB conda-forge\n", - " libtiff-4.6.0 | h46a8edc_4 276 KB conda-forge\n", + " libtiff-4.7.0 | h6565414_0 418 KB conda-forge\n", " libwebp-base-1.4.0 | hd590300_0 429 KB conda-forge\n", " libxcb-1.16 | hb9d3cd8_1 386 KB conda-forge\n", " libxkbcommon-1.7.0 | h2c5496b_1 579 KB conda-forge\n", @@ -101,7 +102,7 @@ " pcre2-10.44 | hba22ea6_2 930 KB conda-forge\n", " pillow-10.4.0 | py312h56024de_1 40.7 MB conda-forge\n", " pixman-0.43.2 | h59595ed_0 378 KB conda-forge\n", - " pthread-stubs-0.4 | h36c2ea0_1001 5 KB conda-forge\n", + " pthread-stubs-0.4 | hb9d3cd8_1002 8 KB conda-forge\n", " pyparsing-3.1.4 | pyhd8ed1ab_0 88 KB conda-forge\n", " pyside6-6.7.2 | py312h91f0f75_3 10.1 MB conda-forge\n", " python-dateutil-2.9.0 | pyhd8ed1ab_0 218 KB conda-forge\n", @@ -118,8 +119,8 @@ " xcb-util-wm-0.4.2 | hb711507_0 50 KB conda-forge\n", " xkeyboard-config-2.42 | h4ab18f5_0 380 KB conda-forge\n", " xorg-fixesproto-5.0 | h7f98852_1002 9 KB conda-forge\n", - " xorg-inputproto-2.3.2 | h7f98852_1002 19 KB conda-forge\n", - " xorg-kbproto-1.0.7 | h7f98852_1002 27 KB conda-forge\n", + " xorg-inputproto-2.3.2 | hb9d3cd8_1003 22 KB conda-forge\n", + " xorg-kbproto-1.0.7 | hb9d3cd8_1003 30 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", " xorg-libx11-1.8.9 | hb711507_1 813 KB conda-forge\n", @@ -131,13 +132,13 @@ " xorg-libxrender-0.9.11 | hd590300_0 37 KB conda-forge\n", " xorg-libxtst-1.2.5 | h4bc722e_0 32 KB conda-forge\n", " xorg-libxxf86vm-1.1.5 | hb9d3cd8_2 18 KB conda-forge\n", - " xorg-recordproto-1.14.2 | h7f98852_1002 8 KB conda-forge\n", - " xorg-renderproto-0.11.1 | h7f98852_1002 9 KB conda-forge\n", - " xorg-xextproto-7.3.0 | h0b41bf4_1003 30 KB conda-forge\n", - " xorg-xproto-7.0.31 | h7f98852_1007 73 KB conda-forge\n", + " xorg-recordproto-1.14.2 | hb9d3cd8_1003 10 KB conda-forge\n", + " xorg-renderproto-0.11.1 | hb9d3cd8_1003 12 KB conda-forge\n", + " xorg-xextproto-7.3.0 | hb9d3cd8_1004 30 KB conda-forge\n", + " xorg-xproto-7.0.31 | hb9d3cd8_1008 72 KB conda-forge\n", " zlib-1.3.1 | h4ab18f5_1 91 KB conda-forge\n", " ------------------------------------------------------------\n", - " Total: 201.0 MB\n", + " Total: 240.2 MB\n", "\n", "The following NEW packages will be INSTALLED:\n", "\n", @@ -168,7 +169,7 @@ " libbrotlidec conda-forge/linux-64::libbrotlidec-1.1.0-hb9d3cd8_2 \n", " libbrotlienc conda-forge/linux-64::libbrotlienc-1.1.0-hb9d3cd8_2 \n", " libclang-cpp18.1 conda-forge/linux-64::libclang-cpp18.1-18.1.8-default_hf981a13_4 \n", - " libclang13 conda-forge/linux-64::libclang13-18.1.8-default_h9def88c_4 \n", + " libclang13 conda-forge/linux-64::libclang13-19.1.0-default_h9c6a7e4_0 \n", " libcups conda-forge/linux-64::libcups-2.3.3-h4637d8d_4 \n", " libdeflate conda-forge/linux-64::libdeflate-1.21-h4bc722e_0 \n", " libdrm conda-forge/linux-64::libdrm-2.4.123-hb9d3cd8_0 \n", @@ -179,10 +180,11 @@ " libglx conda-forge/linux-64::libglx-1.7.0-ha4b6fd6_0 \n", " libjpeg-turbo conda-forge/linux-64::libjpeg-turbo-3.0.0-hd590300_1 \n", " libllvm18 conda-forge/linux-64::libllvm18-18.1.8-h8b73ec9_2 \n", + " libllvm19 conda-forge/linux-64::libllvm19-19.1.0-ha7bfdaf_0 \n", " libpciaccess conda-forge/linux-64::libpciaccess-0.18-hd590300_0 \n", " libpng conda-forge/linux-64::libpng-1.6.44-hadc24fc_0 \n", " libpq conda-forge/linux-64::libpq-16.4-h2d7952a_1 \n", - " libtiff conda-forge/linux-64::libtiff-4.6.0-h46a8edc_4 \n", + " libtiff conda-forge/linux-64::libtiff-4.7.0-h6565414_0 \n", " libwebp-base conda-forge/linux-64::libwebp-base-1.4.0-hd590300_0 \n", " libxcb conda-forge/linux-64::libxcb-1.16-hb9d3cd8_1 \n", " libxkbcommon conda-forge/linux-64::libxkbcommon-1.7.0-h2c5496b_1 \n", @@ -196,7 +198,7 @@ " pcre2 conda-forge/linux-64::pcre2-10.44-hba22ea6_2 \n", " pillow conda-forge/linux-64::pillow-10.4.0-py312h56024de_1 \n", " pixman conda-forge/linux-64::pixman-0.43.2-h59595ed_0 \n", - " pthread-stubs conda-forge/linux-64::pthread-stubs-0.4-h36c2ea0_1001 \n", + " pthread-stubs conda-forge/linux-64::pthread-stubs-0.4-hb9d3cd8_1002 \n", " pyparsing conda-forge/noarch::pyparsing-3.1.4-pyhd8ed1ab_0 \n", " pyside6 conda-forge/linux-64::pyside6-6.7.2-py312h91f0f75_3 \n", " python-dateutil conda-forge/noarch::python-dateutil-2.9.0-pyhd8ed1ab_0 \n", @@ -213,8 +215,8 @@ " xcb-util-wm conda-forge/linux-64::xcb-util-wm-0.4.2-hb711507_0 \n", " xkeyboard-config conda-forge/linux-64::xkeyboard-config-2.42-h4ab18f5_0 \n", " xorg-fixesproto conda-forge/linux-64::xorg-fixesproto-5.0-h7f98852_1002 \n", - " xorg-inputproto conda-forge/linux-64::xorg-inputproto-2.3.2-h7f98852_1002 \n", - " xorg-kbproto conda-forge/linux-64::xorg-kbproto-1.0.7-h7f98852_1002 \n", + " xorg-inputproto conda-forge/linux-64::xorg-inputproto-2.3.2-hb9d3cd8_1003 \n", + " xorg-kbproto conda-forge/linux-64::xorg-kbproto-1.0.7-hb9d3cd8_1003 \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", " xorg-libx11 conda-forge/linux-64::xorg-libx11-1.8.9-hb711507_1 \n", @@ -226,10 +228,10 @@ " xorg-libxrender conda-forge/linux-64::xorg-libxrender-0.9.11-hd590300_0 \n", " xorg-libxtst conda-forge/linux-64::xorg-libxtst-1.2.5-h4bc722e_0 \n", " xorg-libxxf86vm conda-forge/linux-64::xorg-libxxf86vm-1.1.5-hb9d3cd8_2 \n", - " xorg-recordproto conda-forge/linux-64::xorg-recordproto-1.14.2-h7f98852_1002 \n", - " xorg-renderproto conda-forge/linux-64::xorg-renderproto-0.11.1-h7f98852_1002 \n", - " xorg-xextproto conda-forge/linux-64::xorg-xextproto-7.3.0-h0b41bf4_1003 \n", - " xorg-xproto conda-forge/linux-64::xorg-xproto-7.0.31-h7f98852_1007 \n", + " xorg-recordproto conda-forge/linux-64::xorg-recordproto-1.14.2-hb9d3cd8_1003 \n", + " xorg-renderproto conda-forge/linux-64::xorg-renderproto-0.11.1-hb9d3cd8_1003 \n", + " xorg-xextproto conda-forge/linux-64::xorg-xextproto-7.3.0-hb9d3cd8_1004 \n", + " xorg-xproto conda-forge/linux-64::xorg-xproto-7.0.31-hb9d3cd8_1008 \n", " zlib conda-forge/linux-64::zlib-1.3.1-h4ab18f5_1 \n", "\n", "\n", @@ -985,11 +987,11 @@ " - Architecture: 64 bit\n", " - Precision: double\n", " - OpenMP: Yes, number of threads: 4/4\n", - " - Date: Sep 13 2024\n", - " - Time: 19:58:37\n", + " - Date: Sep 20 2024\n", + " - Time: 17:40:56\n", " Execution Info:\n", - " - Date: 09/13/2024\n", - " - Time: 20:10:09+0000\n", + " - Date: 09/20/2024\n", + " - Time: 17:52:14+0000\n", "\n", " Running ADI.\n", " Running AeroDyn.\n", diff --git a/dev/examples/C_customizablePreprocessing/index.html b/dev/examples/C_customizablePreprocessing/index.html index 803fe3e4..239ea0eb 100644 --- a/dev/examples/C_customizablePreprocessing/index.html +++ b/dev/examples/C_customizablePreprocessing/index.html @@ -656,11 +656,11 @@ - Architecture: 64 bit - Precision: double - OpenMP: Yes, number of threads: 4/4 - - Date: Sep 13 2024 - - Time: 19:58:37 + - Date: Sep 20 2024 + - Time: 17:40:56 Execution Info: - - Date: 09/13/2024 - - Time: 20:15:19+0000 + - Date: 09/20/2024 + - Time: 17:57:23+0000 Running ADI. Running AeroDyn. @@ -835,4 +835,4 @@ Minimum Safety Factor on tower Surface: 4.331286121960899 At time 0.035s at composite station 1 of 21 at lam 1 of 1 Maximum Damage per hr: 0.14693877554749607 -At composite station 12 of 21 at lam 1 of 1

This page was generated using Literate.jl.

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

This page was generated using Literate.jl.

diff --git a/dev/examples/turbsimfiles/DLC1_1Vinf10.0.bts b/dev/examples/turbsimfiles/DLC1_1Vinf10.0.bts index 4bc27de4f3c4fc1340b14bb019cedbc0b3e81087..ec374e01b19aba3928bde587fb3b7a651aec4026 100644 GIT binary patch delta 200 zcmWN=O;$kx0D#e>Ql$K(D2W%M@ap~1Ip$W-3L2Ojv;l)})}V=9d{YZ(85Us=b7T#kUAFzX64Dbscz}64#3MY$6FkK;EZ{j_;3Zz+HQwMY z7O{kPSjKy--~&G56Fy@VYgoq@jPMm3*u*z{#}>A+gI)Z<9`-TDPyE6JQw*5l0KeD% GY)1cSk5kbA diff --git a/dev/examples/turbsimfiles/DLC1_1Vinf10.0.sum b/dev/examples/turbsimfiles/DLC1_1Vinf10.0.sum index 8875d8f9..25a7e1a4 100644 --- a/dev/examples/turbsimfiles/DLC1_1Vinf10.0.sum +++ b/dev/examples/turbsimfiles/DLC1_1Vinf10.0.sum @@ -1,5 +1,5 @@ -This summary file was generated by TurbSim (from OpenFAST--128-NOTFOUND) on 13-Sep-2024 at 20:12:39. +This summary file was generated by TurbSim (from OpenFAST--128-NOTFOUND) on 20-Sep-2024 at 17:54:43. Runtime Options: @@ -321,4 +321,4 @@ U-component (X) statistics from the interpolated hub point: TI = 8.8494 % -Processing complete. 23.883 CPU seconds used. +Processing complete. 24.681 CPU seconds used. diff --git a/dev/getting_started/index.html b/dev/getting_started/index.html index 4915aed1..d2d66990 100644 --- a/dev/getting_started/index.html +++ b/dev/getting_started/index.html @@ -1,2 +1,2 @@ -nothing yet · OWENS.jl
+nothing yet · OWENS.jl
diff --git a/dev/index.html b/dev/index.html index 688f028d..a22c6888 100644 --- a/dev/index.html +++ b/dev/index.html @@ -1,2 +1,18 @@ -Home · OWENS.jl

OWENS (Onshore/Offshore Wind/Water ENergy Simulator)

This package is for experienced researchers and analyists with both software and engineering experience who need generalized flexibility and performance that is 100% open source and is compatible with gradient based optimization with automatic gradients in process. If you want a windows compatible GUI, please use QBlade.

OWENS is an ontology, or way of coupling modular aerodynamic, structural, hydrodynamic, and controls packages. It was originally based on the structural dynamics solver by Brian Owens (see dissertation: http://hdl.handle.net/1969.1/151813). However, it has been rewritten into the Julia programming language, modularized, and many of the issues related to aerodynamic coupling and floating dynamics solved, with extensive expansion into other areas and features to provide a seamless and automated process that takes in high level design details and does all of the preprocessing, running, and post processing that is normally done under different roofs or by different manual processes. This was done with the intent of enabling fast, parametric design. We have many of the modules propogating automatic gradients, however this is still a future challenge to solve well.

Here are several examples of OWENS use cases, current and past, including the Sandia 34m research turbine.

SNL34m.{#fig:34m width="50%"}

Then here is an example of a helical design. Note that arbitrary numbers of struts can be specified in the automatic meshing functions. You can also write your own generalized mesh using the internal building blocks, but it is not thouroughly documented.

helical.{#fig:34m width="50%"}

The generalized meshing was modified to include HAWT concepts, like this bi-wing concept. OWENS is capable of axial flow turbines/HAWTs, but it is not a mature feature, and no where near as developed as OpenFAST (i.e. for regular HAWTs it is recommended to use that software).

biwing.{#fig:34m width="50%"}

Then, floating turbines are a possibility, though this feature adds another dimension to the nonlinear time stepping convergance and in turn a fair amount of time. Future work is to make this general interface and functionality an easy to use feature (right now it needs a high level of experience to use).

arcus.{#fig:34m width="50%"}

OWENS under the hood

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

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

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

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

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

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

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

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

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

<img src="./assets/OWENS_Processes.png" alt="drawing" width="400"/>

Installation

Please follow the instructions on the setup page

Documentation

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

Software License

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

See Copyright.txt file for more information

+Home · OWENS.jl

OWENS (Onshore/Offshore Wind/Water ENergy Simulator)

This package is for experienced researchers and analyists with both software and engineering experience who need generalized flexibility and performance that is 100% open source and is compatible with gradient based optimization with automatic gradients in process. If you want a windows compatible GUI, please use QBlade.

OWENS is an ontology, or way of coupling modular aerodynamic, structural, hydrodynamic, and controls packages. It was originally based on the structural dynamics solver by Brian Owens (see dissertation: http://hdl.handle.net/1969.1/151813). However, it has been rewritten into the Julia programming language, modularized, and many of the issues related to aerodynamic coupling and floating dynamics solved, with extensive expansion into other areas and features to provide a seamless and automated process that takes in high level design details and does all of the preprocessing, running, and post processing that is normally done under different roofs or by different manual processes. This was done with the intent of enabling fast, parametric design. We have many of the modules propogating automatic gradients, however this is still a future challenge to solve well.

<p><br></p>

+ +

Here are several examples of OWENS use cases, current and past, including the Sandia 34m research turbine.

+ img +

Then here is an example of a helical design. Note that arbitrary numbers of struts can be specified in the automatic meshing functions. You can also write your own generalized mesh using the internal building blocks, but it is not thouroughly documented.

+ img +

The generalized meshing was modified to include HAWT concepts, like this bi-wing concept. OWENS is capable of axial flow turbines/HAWTs, but it is not a mature feature, and no where near as developed as OpenFAST (i.e. for regular HAWTs it is recommended to use that software).

+ img +

Then, floating turbines are a possibility, though this feature adds another dimension to the nonlinear time stepping convergance and in turn a fair amount of time. Future work is to make this general interface and functionality an easy to use feature (right now it needs a high level of experience to use).

+ img +

OWENS under the hood

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

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

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

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

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

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

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

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

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

+ img +

Installation

Please follow the instructions on the setup page

Documentation

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

Software License

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

See Copyright.txt file for more information

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

Testing Your Build of OWENS

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

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

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

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

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

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

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

Visual Studio Code IDE

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

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

cmd-j cmd-k,

if you want to clear out the console

cmd-j cmd-c

open the workspace

cmd-j cmd-w

run highlighted code

shift-enter

run the currently selected file

cmd-shift-enter

You can also use the gui buttons.

VSCode Julia Debugger

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

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

Install custom repositories you want to develop

start Julia from the cloned directory and use the command:

] dev .

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

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

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

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

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

using Pkg
-Pkg.add(url = "git@github.com:sandialabs/OWENS.jl.git", rev = "dev")
+Pkg.add(url = "git@github.com:sandialabs/OWENS.jl.git", rev = "dev") diff --git a/dev/legacyUserGuide/index.html b/dev/legacyUserGuide/index.html index 7759ea5e..de4e3269 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:

  • OWENS\source

  • OWENS\source\commonSource

  • OWENS\source\modalSource

  • OWENS\source\transientSource

  • OWENS\source\utilitySource

  • OWENS\serverFiles

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:

  • OWENS main input file (.owens)

  • Beam mesh file (.mesh)

  • Element property file (.el)

  • Element orientation file (.ort)

  • Joint file (.jnt)

  • Concentrated nodal term file (.ndl)

  • Boundary conditions file (.bc)

  • Platform simulation file (.plat)

  • Initial conditions file (.ic)

  • Blade data file (.bld)

  • Aerodynamic loads file

  • Driveshaft file (.ds)

  • Generator properties file (.gen)

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:

  • OWENS\source

  • OWENS\source\commonSource

  • OWENS\source\modalSource

  • OWENS\source\transientSource

  • OWENS\source\utilitySource

  • OWENS\serverFiles

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:

  • OWENS main input file (.owens)

  • Beam mesh file (.mesh)

  • Element property file (.el)

  • Element orientation file (.ort)

  • Joint file (.jnt)

  • Concentrated nodal term file (.ndl)

  • Boundary conditions file (.bc)

  • Platform simulation file (.plat)

  • Initial conditions file (.ic)

  • Blade data file (.bld)

  • Aerodynamic loads file

  • Driveshaft file (.ds)

  • Generator properties file (.gen)

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

OWENS Main Input File (.owens)

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

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

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

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

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

Mesh File (.mesh)

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

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

Element Property File (.el)

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

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

...

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

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

Element Orientation File (.ort)

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

elNum theta3 theta2 theta1 length xOffset yOffset zOffset

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

Joint File (.jnt)

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

jointNumber masterNode slaveNode jointType jointMass 0.0 ... jointPsi jointTheta

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

Concentrated Nodal Terms File

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

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

nodeNum termType localDOFNum value

Boundary Conditions File (.bc)

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

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

nodeNum localDOFNum value

Platform Simulation File (.plat)

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

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

0.0 0.0 0.0 0.0 0.0 :initial conditions for platform DOFs

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

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

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

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

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

1 :node number for platform turbine connection

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

3500 :platform server port

4500 :platform client port

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

Initial Conditions File

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

60 1 0.1
51 2 -0.4
nodeNum localDOFNum value

Blade Data File (.bld)

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

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

Aerodynamic Loads File

Drivetrain Properties File

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

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

Generator Properties File

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

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

OWENS Output Files

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

Static Analysis Output

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

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

MODE # 1

Frequency: 9.941364e-001:

Damping 3.576857e-014:

0 deg Mode Shape:

Ux Uy Uz thetax thetay thetaz

-0.000000 -0.000000 -0.000000 -0.000000 0.000833 -0.000000

0.000627 0.000000 0.000000 -0.000000 0.000819 0.000000

0.001235 0.000000 0.000000 -0.000000 0.000780 0.000000

0.001819 0.000000 0.000000 -0.000000 0.000713 0.000000

0.002353 0.000000 0.000000 -0.000000 0.000620 0.000000

0.002669 0.000000 0.000000 -0.000000 0.000557 0.000000

0.002948 0.000000 0.000000 -0.000000 0.000497 0.000000

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

Ux Uy Uz thetax thetay thetaz

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

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

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

-0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000

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

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

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

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

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

...

Mode #2

...

Transient Analysis Output

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

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

Table 1. OWENS Transient Output


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

Nodal displacements uHist (m or rad) numDOF x numTimeSteps

Generator torque genTorque (N-m) 1 x numTimeSteps

Generator power genPower (W) 1 x numTimeSteps

Rotor position aziHist (rad) 1 x numTimeSteps

Rotor speed OmegaHist (Hz) 1 x numTimeSteps

Rotor acceleration OmegaDotHist (Hz/s) 1x numTimetSteps

Gearbox position gbHist (rad) 1 x numTimeSteps

Gearbox speed gbDotHist (Hz) 1 x numTimeSteps

Gearbox acceleration gbDotDotHist (Hz/s) 1 x numTimeSteps

Driveshaft torque torqueDriveShaft (N-m) 1 x numTimeSteps

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

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

: Default static nonlinear analysis parameters

References

  1. VAWTGen Manual

  2. WavEC manual

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

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

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

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

globalDOFNum = (nodeNum-1)*6 + localDOFNum

Appendix B: Nonlinear Static Analysis Parameters

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

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

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

1.0e-6 :tolerance for nonlinear iteration convergence

5 :maximum number of iterations per load step

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

20 :maximum number of load steps

0.3 :minimum load step

0.1 :minimum delta load step

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

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

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

1.0e-6 :tolerance for nonlinear iteration convergence

20 :maximum number of iterations per load step

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

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

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


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

    Iteration Type Newton Raphson

    Loads Stepping Algorithm Adaptive

    Max Iterations Per Load Step 50

    Max Number of Load Steps 20

    Minimum Load Step 0.05

    Minimum Load Step Delta 0.05

diff --git a/dev/reference/reference/index.html b/dev/reference/reference/index.html index d4066102..4a63d804 100644 --- a/dev/reference/reference/index.html +++ b/dev/reference/reference/index.html @@ -141,4 +141,4 @@ * `regenWindFiles`: =false # Output -* `nothing`:
OWENS.simpleGeneratorMethod
simpleGenerator(generatorProps,genSpeed)

Caclulates generator torque for simple induction generator

#Input

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

#Output

  • genTorque::float generator torque
OWENS.sort_peaksFunction

This function sorts out points where the slope changes sign

OWENS.sum_cyclesMethod

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

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

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

#Input

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

#Output

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

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

OWENS.updateRotorRotationMethod

updateRotorRotation updates rotor rotation

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

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

#Input

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

#Output

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

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

#Input

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

#Output None

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

writes a nodal input file

#Intput

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

#Output

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

Caclulates generator torque for simple induction generator

#Input

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

#Output

  • genTorque::float generator torque
OWENS.sort_peaksFunction

This function sorts out points where the slope changes sign

OWENS.sum_cyclesMethod

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

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

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

#Input

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

#Output

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

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

OWENS.updateRotorRotationMethod

updateRotorRotation updates rotor rotation

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

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

#Input

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

#Output

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

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

#Input

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

#Output None

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

writes a nodal input file

#Intput

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

#Output

  • none:
diff --git a/dev/reference/referenceAero/index.html b/dev/reference/referenceAero/index.html index 6746c19e..d4f20e62 100644 --- a/dev/reference/referenceAero/index.html +++ b/dev/reference/referenceAero/index.html @@ -1,4 +1,4 @@ OWENSAero · OWENS.jl

OWENSAero

Types and functions

OWENSAero.EnvironmentType

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

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

Inputs

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

Outputs:

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

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

Inputs

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

Outputs:

  • none:
OWENSAero.UnsteadyParamsType

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

Contains specications for turbine slice unsteady inputs

Inputs

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

Outputs:

  • none:
OWENSAero.ACMethod

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

see ?steady for detailed i/o description

Double multiple streamtube model

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

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

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

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

see ?steady for detailed i/o description

Double multiple streamtube model

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

calls inflow wind init

Inputs

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

Outputs:

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

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

Inputs

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

Outputs:

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

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

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

Inputs

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

Outputs:

  • none:
OWENSAero.matrixAssembleMethod

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

OWENSAero.pIntMethod

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

OWENSAero.radialforceMethod

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

OWENSAero.readaerodynMethod
readaerodyn(filename)

create airfoil lookup for a file with only one reynolds number

Inputs

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

Outputs:

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

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

Inputs

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

Outputs:

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

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

Inputs

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

Outputs:

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

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

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

Inputs

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

Outputs:

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

Calculates steady state aerodynamics for a single VAWT slice

Inputs

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

Outputs:

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

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

Inputs

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

Outputs:

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

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

Double multiple streamtube individual streamtube calculation

Output:

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

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

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

Inputs

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

Outputs:

  • none:
OWENSAero.UnsteadyParamsType

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

Contains specications for turbine slice unsteady inputs

Inputs

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

Outputs:

  • none:
OWENSAero.ACMethod

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

see ?steady for detailed i/o description

Double multiple streamtube model

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

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

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

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

see ?steady for detailed i/o description

Double multiple streamtube model

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

calls inflow wind init

Inputs

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

Outputs:

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

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

Inputs

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

Outputs:

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

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

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

Inputs

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

Outputs:

  • none:
OWENSAero.matrixAssembleMethod

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

OWENSAero.pIntMethod

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

OWENSAero.radialforceMethod

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

OWENSAero.readaerodynMethod
readaerodyn(filename)

create airfoil lookup for a file with only one reynolds number

Inputs

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

Outputs:

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

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

Inputs

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

Outputs:

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

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

Inputs

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

Outputs:

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

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

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

Inputs

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

Outputs:

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

Calculates steady state aerodynamics for a single VAWT slice

Inputs

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

Outputs:

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

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

Inputs

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

Outputs:

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

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

Double multiple streamtube individual streamtube calculation

Output:

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

diff --git a/dev/reference/referenceFEA/index.html b/dev/reference/referenceFEA/index.html index 79c39ae0..bddcd466 100644 --- a/dev/reference/referenceFEA/index.html +++ b/dev/reference/referenceFEA/index.html @@ -28,4 +28,4 @@ maxNumLoadSteps = 20, minLoadStepDelta = 0.0500, minLoadStep = 0.0500, - prescribedLoadStep = 0.0)

Model inputs for FEA analysis, struct

Inputs

  • analysisType::string: Newmark Beta time stepping "TNB", Dean time stepping "TD", modal "M", and stiff "stiff" (where the forces are just directly mapped, the displacements and strains set to 0 and the structures not run)
  • initCond::Array{<:float}: Initial conditions Nx3 matrix consisting of nodeNumber, local DOF (1-6), and displacement value
  • aeroElasticOn::Bool: Include simplified flutter calculataions in the timoshenko element matrices
  • guessFreq::float: aeroelastic starting guess, only used if aeroElasticOn
  • airDensity::float: working fluid density
  • gravityOn::Bool orArray{<:float}: vector of 3 or flag to include distributed gravity acceleration (9.81m/s) in the negative z-direction
  • nlOn::Bool: flag for solver to calculate deflection induced stiffness changes and associated convergance to the coupled solution
  • spinUpOn::Bool: flag to perform a static analysis (warm start) prior to performing modal analysis
  • outFilename::string: /path/to/desired/output/filename if it doesn't exist already it is created, if exists, is overwritten
  • RayleighAlpha::float: Rayleigh alpha damping used in timoshenko beam damping matrix
  • RayleighBeta::float: Rayleigh beta damping used in timoshenko beam damping matrix
  • elementOrder::int: order of element: 1 linear, 2 quadratic
  • joint::Array{<:float}: jointNumber masterNode slaveNode jointType (0 weld/fixed, 1 pinned, 2 hinge along local "2", 3 hinge about local "1", 4 hinge along "3", 5 rigid bar constraint) jointMass 0.0 jointPsi jointTheta
  • platformTurbineConnectionNodeNumber::int: node at which reaction forces are calculated
  • jointTransform: not used as an input, is calculated, local transform between dependent and active DOFs for nodes associated with a particular joint
  • reducedDOFList::Array{<:int}: not used as an input, is calculated, map of original DOF numbering to reduced DOF numbering
  • numDOFPerNode::int: number of degrees of freedom per node
  • numNodes::int: total number of nodes in the mesh
  • numModes::int: number of modes to calculate
  • nlParams::NlParams: optional there in case the Nlparams struct is passed in, should be cleaned up since redundant
  • alpha::float64: optional newmark beta alpha parameter,If TD, use 0.25
  • gamma::float64: optional newmark beta gamma parameter, if static, use 0. If hydro, use 1.0
  • pBC::Array{<:float}: Nx3 array consisting of node, local dof, specified displacement value for the boundary condition
  • nodalTerms: Concentrated nodal terms, should be replaced with the nodal input data array and the calc done internally
  • iterationType::string: FEA displacement update calculation, Newton Raphson "NR", Direct Iteration "DI"
  • adaptiveLoadSteppingFlag: Unused, should be removed
  • tolerance::float: FEA total mesh unsteady analysis convergence tolerance for a timestep
  • maxIterations: FEA total mesh unsteady analysis convergence max iterations for a timestep
  • maxNumLoadSteps: used in static (steady state) analysis
  • minLoadStepDelta: used in static (steady state) analysis
  • minLoadStep: used in static (steady state) analysis
  • prescribedLoadStep: used in static (steady state) analysis
  • predef::Bool: will update the elStorage array if passed into Unsteady() with the nonlinear strain stiffening, to be used for subsequent analyses

Outputs:

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

Struct with mesh definition

Inputs

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

Outputs:

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

See ?FEAModel

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

Struct with element orientation

Inputs

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

Outputs:

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

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

Inputs

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

Outputs:

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

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

#Input

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

#Output

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

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

#Input

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

#Output

  • freqSorted: array of sorted(by frequency) modal frequencies
  • dampSorted: array of sorted(by frequency) modal damping ratios
  • imagCompSignSorted: array of sorted(by frequency) of imaginarycomponentSign array
  • U_x_0: see ?Modal outputs
  • U_y_0: see ?Modal outputs
  • U_z_0: see ?Modal outputs
  • theta_x_0: see ?Modal outputs
  • theta_y_0: see ?Modal outputs
  • theta_z_0: see ?Modal outputs
  • U_x_90: see ?Modal outputs
  • U_y_90: see ?Modal outputs
  • U_z_90: see ?Modal outputs
  • theta_x_90: see ?Modal outputs
  • theta_y_90: see ?Modal outputs
  • theta_z_90: see ?Modal outputs
OWENSFEA.applyBCMethod
applyBC(Kg,Fg,BC,u,iterationType,numDofPerNode)

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

#Input

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

#Output

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

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

Inputs

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

Outputs:

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

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

#Input

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

#Output

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

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

OWENSFEA.applyConstraintsVecMethod

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

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

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

#Input

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

#Output

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

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

Inputs

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

Outputs:

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

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

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

#Inputs

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

#Outputs

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

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

OWENSFEA.calculateBCMapMethod

calculateBCMap(numpBC,pBC,numDofPerNode,reducedDofList)

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

#Input

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

#Output

  • elStorage map for boundary conditions between full and reduced dof list
OWENSFEA.calculateLambdaMethod
calculateLambda(theta1,theta2,theta3)

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

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

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

OWENSFEA.calculateLoadVecFromDistForceMethod

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

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

#Input

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

#Output

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

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

#Input

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

#Output

  • rom object containing reduced order model data
OWENSFEA.calculateROMGyricMethod

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

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

#Input

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

#Output

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

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

#Input

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

#Output

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

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

OWENSFEA.calculateShapeFunctionsMethod

calculateShapeFunctions(elementOrder,xi,x)

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

#Input

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

#Output

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

calculateStructureMassProps(elStorage)

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

#Input

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

#Output

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

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

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

Internal, performs nonlinear element calculations.

#Inputs

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

#Outputs

  • ElOutput: see ?ElOutput
OWENSFEA.calculateTimoshenkoElementNLSSMethod
calculateTimoshenkoElementNLSS(elinput)

Performs selective nonlinear element calculations. Only stiffness matrix contributions are evaluate. No other calculations are performed to facilitate efficiency gains.

#Input

  • elinput: object containing element input

#Output

  • eloutput: object containing element data
OWENSFEA.calculateTimoshenkoElementStrainMethod
calculateTimoshenkoElementStrain(elementOrder,nlOn,xloc,sectionProps,sweepAngle,coneAngle,rollAngle,aeroSweepAngle,disp)

Internal, calculates element strain for a Timoshenko element

#Outputs

  • ElStrain: See ?ElStrain
OWENSFEA.constructReducedDispVecFromEigVecMethod
constructReducedDispVecFromEigVec(vec1,reducedDOFList,BC)

Internal, This function takes the original mode shape and modifies it to account for boundary conditions

Inputs

  • vec1:
  • reducedDOFList:
  • BC:

Outputs:

  • vec1Red:
OWENSFEA.createJointTransformMethod

createJointTransform(joint,numNodes,numDofPerNode)

Internal, calculates the JointTransform of a structural system.

#Input

  • joint: object containing joint data
  • numModes: number of nodes in mesh
  • numDofPerNode: number of degrees of freedom per node

#Output

  • jointTransform: joint transformation matrix
  • reducedDOF: map of original DOF numbering to reduced DOF numbering
OWENSFEA.createTdaMethod

Internal, creates a constraint transformation matrix for a single joint. Tda is this matrix, dDOF contains a listing of dependent global DOFs associated with this joint, and aDOF contains a listing of active global DOFs associated with this joint.

OWENSFEA.extractFreqDampMethod
extractFreqDamp(val,vec,numDOFPerNode,jointTransform,reducedDOFList,BC,analysisType)

Internal, calculates the eigenvalues and vectors of a structural dynamic system

Inputs

  • val: eigenvalue
  • vec: eigenvector
  • numDOFPerNode: number of degrees of freedom per node
  • jointTransform: joint transformation matrix from reduced to full DOF list
  • reducedDOFList: listing of reduced DOFs
  • BC: boundary condition object containing boundary condition info
  • analysisType: analysis type

Outputs:

  • freq: modal frequency
  • damp: modal damping
  • phase1: in phase mode shape (real part of mode shape)
  • phase2: out of phase mode shape (imaginary part of mode shape)
  • sortedModes: total, complex mode shape
OWENSFEA.extractdaInfoMethod

Internal, gets the total number of DOFs in the model, active number of DOFs in the model, and a list of slave DOFs that will be eliminated by joint constraints.

OWENSFEA.findElementsAssociatedWithNodeNumberMethod
findElementsAssociatedWithNodeNumber(nodeNum,conn,jointData)

Internal, finds elements associated with a node number through mesh connectivity or joint constraints

#Input

  • nodeNum node number joint constraints are desired at
  • conn object containing mesh connectivity
  • jointData object containing joint information

#Output

  • elList array containing a list of element numbers associated with nodeNum
  • localNode array containing the local node number that correspond to nodeNum in the list of associated elements
OWENSFEA.getGPMethod
getGP(numGP)

Internal, defines gauss point coordinates in a local element frame and the associated weights for Gaussian quadrature numerical integration.

#Input

  • numGP: number of quad points used for integration

#Output

  • xi: list of quad point coordinates in local element frame
  • weight: associated weights for quad point coordinate
OWENSFEA.initialElementCalculationsMethod
initialElementCalculations(feamodel,el,mesh)

performs initial element calculation for use later in analysis for efficiency gains.

Inputs

  • feamodel::FEAmodel: see ?Feamodel
  • el::El: see ?El
  • mesh::Mesh: see ?Mesh

Outputs:

  • elStorage:ElStorage: see ?ElStorage
OWENSFEA.makeBCdataMethod
makeBCdata(pBC,numNodes,numDofPerNode,reducedDOFList,jointTransform)

Internal, usese the pBC matrix and calculates/stores boundary condition data

#Input

  • pBC See ?FEAModel.pBC
  • numNodes number of nodes in structural model
  • numDofPerNode number of degrees of freedom per node
  • reducedDOFList joint transformation matrix from reduced to full DOF list
  • jointTransform listing of reduced DOFs

#Output

  • BC:BC_struct see ?BC_struct
OWENSFEA.mapMatrixNonSymMethod

Internal, function to form total stifness matrix and transform to desired DOF mapping

OWENSFEA.mapVectorMethod

Internal, forms total force vector and transform to desired DOF mapping

OWENSFEA.modalMethod
modal(feamodel,mesh,el;Omega=0.0,displ=zeros(mesh.numNodes*6),OmegaStart=0.0,returnDynMatrices=false)

Modal analysis

Inputs

  • feamodel::FEAModel: see ?FEAModel
  • mesh::Mesh: see ?Mesh
  • el::El: see ?El
  • Omega::float: Rotational rate in Hz
  • displ::Array{<:float}: zeros(mesh.numNodes*6) initial (warm start) displacements for each dof
  • OmegaStart::float: rotor speed (Hz) from previous analysis if stepping through various rotor speeds, may be useful in load stepping
  • returnDynMatrices::Bool: Flag to save linearized K/C/M matrices for the design

Outputs:

  • freq::Array{<:float}: sorted modal frequencies (Hz)
  • damp::Array{<:float}: sorted modal damping
  • imagCompSign::Array{<:float}: sign of imaginary component of eigenvalues
  • U_x_0::Array{<:float}: NnodesxNmodes in-phase mode shape x
  • U_y_0::Array{<:float}: NnodesxNmodes in-phase mode shape y
  • U_z_0::Array{<:float}: NnodesxNmodes in-phase mode shape z
  • theta_x_0::Array{<:float}: NnodesxNmodes in-phase mode shape rotation about x
  • theta_y_0::Array{<:float}: NnodesxNmodes in-phase mode shape rotation about y
  • theta_z_0::Array{<:float}: NnodesxNmodes in-phase mode shape rotation about z
  • U_x_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape x
  • U_y_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape y
  • U_z_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape z
  • theta_x_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape rotation about x
  • theta_y_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape rotation about y
  • theta_z_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape rotation about z
OWENSFEA.reducedOrderModelMethod

reducedOrderModel(elStorage,feamodel,mesh,el,displ)

This function executes a reduced order model analysis.

#Input

  • elStorage object containing stored element matrices
  • feamodel object containing feamodel information
  • mesh object containing mesh information
  • el object containing element information
  • displ displacement vector for use in pre-stressed analysis

#Output

  • rom object containing a reduced order feamodel
OWENSFEA.setInitialConditionsMethod
setInitialConditions(initCond,u,numDOFPerNode)

sets initial conditions

#Input

  • initCond: array containing initial conditions initCond(i,1) node number for init cond i initCond(i,2) local DOF number for init cond i initCond(i,3) value for init cond i
  • u: displacement vector for each dof
  • numDOFPerNode: number of degrees of freedom per node

#Output

  • u: displacement vector modified for initial conditions
OWENSFEA.setPrescribedConditionsMethod
prescribed_conditions = setPrescribedConditions(mesh;pBC=zeros(2,2),Fexternal=[],ForceDof=[])

Internal, maps OWENS boundary conditions and applied forces to the GXBeam PrescribedConditions input

#Input

  • mesh::FEAModel.mesh: Input turbine mesh
  • pBC::FEAModel.BC.pBC: Boundary conditions
  • Fexternal::Array{Float64}: Applied forces to the mesh, 1D array ordered node 1 Dof 1-6, node 2 Dof 1-2, etc.
  • ForceDof::Array{Float64}: Degrees of freedom aligned with Fexternal, currently is unused, assumes Fexternal uses the full DOF array.

#Output

  • prescribed_conditions::GXBeam.PrescribedConditions: the boundary conditions/applied forces used by GXBeam see ?GXBeam.PrescribedConditions
OWENSFEA.staticAnalysisMethod

staticAnalysis(feamodel,mesh,el,displ,Omega,OmegaStart,elStorage; reactionNodeNumber=1, OmegaDot=0.0, Fdof=[1], Fexternal=[0.0])

This function performs a static analysis and returns displacement values and a flag denoting successful/unsuccessful analysis

#Inputs

  • feamodel: object containing feamodel information
  • mesh: object containing mesh information
  • el: object containing element information
  • displ: displacement vector for use in pre-stressed analysis
  • Omega: rotor speed (Hz)
  • OmegaStart: rotor speed (Hz) from previous analysis if stepping through various rotor speeds, may be useful in load stepping
  • elStorage: previously calculated element system matrices
  • reactionNodeNumber::Int: optional, node at which to calculate reaction force
  • OmegaDot::Float: Steady State Rotational Acceleration
  • Fdof::Array{<:Int}: Global Dofs where Fexternal is acting, where max dof = nelem*ndof
  • Fexternal{<:Float}: Forces or moments associated with the Fdofs specified

#Outputs

  • displ: vector of displacemetns
  • staticAnalysisSuccessful: boolean flag denoting successful static analysis
OWENSFEA.structuralDynamicsTransientMethod
structuralDynamicsTransient(feamodel,mesh,el,dispData,Omega,OmegaDot,time,delta_t,elStorage,Fexternal,Fdof,CN2H,rbData)

performs unsteady structural dynamics analysis

Inputs

  • feamodel::: object containing feamodel data
  • mesh::: object containing mesh data
  • el::: object containing element data
  • dispData::: object containing displacement data
  • Omega::: rotor speed (Hz)
  • OmegaDot::: rotor acceleratin (Hz)
  • time::: current simulation time
  • delta_t::: time step size
  • elStorage::: object containing stored element data
  • Fexternal::: vector containing external force values
  • Fdof::: vector containing global DOF numbering associated with external force values
  • CN2H::: transformation matrix from inertial frame to hub frame
  • rbData::: vector containing rigid body displacement, velocity, and acceleration

Outputs:

  • elStrain::ElStrain: see ?ElStrain strain for element at end of time step
  • dispOut::DispOut: see ?DispOut displacement data at end of time step
  • FReaction_sp1::: vector containing reaction force at turbine base at end of time step
OWENSFEA.structuralDynamicsTransientROMMethod
structuralDynamicsTransientROM(feamodel,mesh,el,dispData,Omega,OmegaDot,time,delta_t,elStorage,rom,Fexternal,Fdof,CN2H,rbData)

Performs transient structural dynamics analysis using a reduced order feamodel (ROM).

#Input

  • feamodel: object containing feamodel data
  • mesh: object containing mesh data
  • el: object containing element data
  • dispData: object containing displacement data
  • Omega: rotor speed (Hz)
  • OmegaDot: rotor acceleratin (Hz)
  • time: current simulation time
  • delta_t: time step size
  • elStorage: object containing stored element data
  • rom: object containing reduced order feamodel represnetation
  • Fexternal: vector containing external force values
  • Fdof: vector containing global DOF numbering associated with external force values
  • CN2H: transformation matrix from inertial frame to hub frame
  • rbData: vector containing rigid body displacement, velocity, and acceleration

#Output

  • dispOut: object containing displacement data at end of time step
  • FReaction_sp1: vector containing reaction force at turbine base at end of time step
OWENSFEA.timeIntegrateSubSystemEffMethod

timeIntegrateSubSystemEff(M,K,C,F,timeInt,u,udot,uddot)

Performs integration of a system using the Newmark-Beta method(constant-average acceleration sceheme). The integration parameters are calculated before hand and store in the timeInt object.

#Input

  • M system mass matrix
  • K system sttiffness matrix
  • C system damping matrix
  • F system force vector
  • timeInt object containing time integraton parameters
  • u displacement at beginning of time step
  • udot velocity at beginning of time step
  • uddot acceleration at beginning of time step

#Output

  • unp1: displacement at end of time step
  • udotnp1: velocity at end of time step
  • uddotnp1: acceleration at end of time step
OWENSFEA.updateLoadStepMethod
updateLoadStep(iterationCount,loadStepParams,loadStep,loadStepPrev,loadStepCount,displCopy,displ)

Updates the load stepping parameter whether through means of adaptive loadstepping or a specified load step profile.

#Input

  • iterationCount number of iterations for current load step
  • loadStepParams struct containing load step parameters
  • loadStep load step value for current load step
  • loadStepPrev load step value for previous load st ep
  • loadStepCount number of load steps performed up to this point
  • displPrev converged displacement vector form previous load step
  • displ displacement vector at current load step

#Output

  • loadStep new load step value
  • loadStepPrev load step value for previous load step
  • displ most up to date displacement vector in load stepping procedure
  • displPrev displacement vector at end of previous load step
  • staticAnalysisSuccessful boolean flag, true if load step was completed successfully
  • staticAnalysisComplete boolean flag, true if analysis is complete
+ prescribedLoadStep = 0.0)

Model inputs for FEA analysis, struct

Inputs

  • analysisType::string: Newmark Beta time stepping "TNB", Dean time stepping "TD", modal "M", and stiff "stiff" (where the forces are just directly mapped, the displacements and strains set to 0 and the structures not run)
  • initCond::Array{<:float}: Initial conditions Nx3 matrix consisting of nodeNumber, local DOF (1-6), and displacement value
  • aeroElasticOn::Bool: Include simplified flutter calculataions in the timoshenko element matrices
  • guessFreq::float: aeroelastic starting guess, only used if aeroElasticOn
  • airDensity::float: working fluid density
  • gravityOn::Bool orArray{<:float}: vector of 3 or flag to include distributed gravity acceleration (9.81m/s) in the negative z-direction
  • nlOn::Bool: flag for solver to calculate deflection induced stiffness changes and associated convergance to the coupled solution
  • spinUpOn::Bool: flag to perform a static analysis (warm start) prior to performing modal analysis
  • outFilename::string: /path/to/desired/output/filename if it doesn't exist already it is created, if exists, is overwritten
  • RayleighAlpha::float: Rayleigh alpha damping used in timoshenko beam damping matrix
  • RayleighBeta::float: Rayleigh beta damping used in timoshenko beam damping matrix
  • elementOrder::int: order of element: 1 linear, 2 quadratic
  • joint::Array{<:float}: jointNumber masterNode slaveNode jointType (0 weld/fixed, 1 pinned, 2 hinge along local "2", 3 hinge about local "1", 4 hinge along "3", 5 rigid bar constraint) jointMass 0.0 jointPsi jointTheta
  • platformTurbineConnectionNodeNumber::int: node at which reaction forces are calculated
  • jointTransform: not used as an input, is calculated, local transform between dependent and active DOFs for nodes associated with a particular joint
  • reducedDOFList::Array{<:int}: not used as an input, is calculated, map of original DOF numbering to reduced DOF numbering
  • numDOFPerNode::int: number of degrees of freedom per node
  • numNodes::int: total number of nodes in the mesh
  • numModes::int: number of modes to calculate
  • nlParams::NlParams: optional there in case the Nlparams struct is passed in, should be cleaned up since redundant
  • alpha::float64: optional newmark beta alpha parameter,If TD, use 0.25
  • gamma::float64: optional newmark beta gamma parameter, if static, use 0. If hydro, use 1.0
  • pBC::Array{<:float}: Nx3 array consisting of node, local dof, specified displacement value for the boundary condition
  • nodalTerms: Concentrated nodal terms, should be replaced with the nodal input data array and the calc done internally
  • iterationType::string: FEA displacement update calculation, Newton Raphson "NR", Direct Iteration "DI"
  • adaptiveLoadSteppingFlag: Unused, should be removed
  • tolerance::float: FEA total mesh unsteady analysis convergence tolerance for a timestep
  • maxIterations: FEA total mesh unsteady analysis convergence max iterations for a timestep
  • maxNumLoadSteps: used in static (steady state) analysis
  • minLoadStepDelta: used in static (steady state) analysis
  • minLoadStep: used in static (steady state) analysis
  • prescribedLoadStep: used in static (steady state) analysis
  • predef::Bool: will update the elStorage array if passed into Unsteady() with the nonlinear strain stiffening, to be used for subsequent analyses

Outputs:

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

Struct with mesh definition

Inputs

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

Outputs:

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

See ?FEAModel

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

Struct with element orientation

Inputs

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

Outputs:

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

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

Inputs

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

Outputs:

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

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

#Input

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

#Output

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

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

#Input

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

#Output

  • freqSorted: array of sorted(by frequency) modal frequencies
  • dampSorted: array of sorted(by frequency) modal damping ratios
  • imagCompSignSorted: array of sorted(by frequency) of imaginarycomponentSign array
  • U_x_0: see ?Modal outputs
  • U_y_0: see ?Modal outputs
  • U_z_0: see ?Modal outputs
  • theta_x_0: see ?Modal outputs
  • theta_y_0: see ?Modal outputs
  • theta_z_0: see ?Modal outputs
  • U_x_90: see ?Modal outputs
  • U_y_90: see ?Modal outputs
  • U_z_90: see ?Modal outputs
  • theta_x_90: see ?Modal outputs
  • theta_y_90: see ?Modal outputs
  • theta_z_90: see ?Modal outputs
OWENSFEA.applyBCMethod
applyBC(Kg,Fg,BC,u,iterationType,numDofPerNode)

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

#Input

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

#Output

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

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

Inputs

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

Outputs:

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

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

#Input

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

#Output

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

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

OWENSFEA.applyConstraintsVecMethod

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

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

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

#Input

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

#Output

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

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

Inputs

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

Outputs:

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

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

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

#Inputs

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

#Outputs

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

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

OWENSFEA.calculateBCMapMethod

calculateBCMap(numpBC,pBC,numDofPerNode,reducedDofList)

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

#Input

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

#Output

  • elStorage map for boundary conditions between full and reduced dof list
OWENSFEA.calculateLambdaMethod
calculateLambda(theta1,theta2,theta3)

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

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

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

OWENSFEA.calculateLoadVecFromDistForceMethod

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

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

#Input

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

#Output

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

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

#Input

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

#Output

  • rom object containing reduced order model data
OWENSFEA.calculateROMGyricMethod

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

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

#Input

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

#Output

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

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

#Input

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

#Output

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

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

OWENSFEA.calculateShapeFunctionsMethod

calculateShapeFunctions(elementOrder,xi,x)

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

#Input

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

#Output

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

calculateStructureMassProps(elStorage)

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

#Input

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

#Output

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

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

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

Internal, performs nonlinear element calculations.

#Inputs

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

#Outputs

  • ElOutput: see ?ElOutput
OWENSFEA.calculateTimoshenkoElementNLSSMethod
calculateTimoshenkoElementNLSS(elinput)

Performs selective nonlinear element calculations. Only stiffness matrix contributions are evaluate. No other calculations are performed to facilitate efficiency gains.

#Input

  • elinput: object containing element input

#Output

  • eloutput: object containing element data
OWENSFEA.calculateTimoshenkoElementStrainMethod
calculateTimoshenkoElementStrain(elementOrder,nlOn,xloc,sectionProps,sweepAngle,coneAngle,rollAngle,aeroSweepAngle,disp)

Internal, calculates element strain for a Timoshenko element

#Outputs

  • ElStrain: See ?ElStrain
OWENSFEA.constructReducedDispVecFromEigVecMethod
constructReducedDispVecFromEigVec(vec1,reducedDOFList,BC)

Internal, This function takes the original mode shape and modifies it to account for boundary conditions

Inputs

  • vec1:
  • reducedDOFList:
  • BC:

Outputs:

  • vec1Red:
OWENSFEA.createJointTransformMethod

createJointTransform(joint,numNodes,numDofPerNode)

Internal, calculates the JointTransform of a structural system.

#Input

  • joint: object containing joint data
  • numModes: number of nodes in mesh
  • numDofPerNode: number of degrees of freedom per node

#Output

  • jointTransform: joint transformation matrix
  • reducedDOF: map of original DOF numbering to reduced DOF numbering
OWENSFEA.createTdaMethod

Internal, creates a constraint transformation matrix for a single joint. Tda is this matrix, dDOF contains a listing of dependent global DOFs associated with this joint, and aDOF contains a listing of active global DOFs associated with this joint.

OWENSFEA.extractFreqDampMethod
extractFreqDamp(val,vec,numDOFPerNode,jointTransform,reducedDOFList,BC,analysisType)

Internal, calculates the eigenvalues and vectors of a structural dynamic system

Inputs

  • val: eigenvalue
  • vec: eigenvector
  • numDOFPerNode: number of degrees of freedom per node
  • jointTransform: joint transformation matrix from reduced to full DOF list
  • reducedDOFList: listing of reduced DOFs
  • BC: boundary condition object containing boundary condition info
  • analysisType: analysis type

Outputs:

  • freq: modal frequency
  • damp: modal damping
  • phase1: in phase mode shape (real part of mode shape)
  • phase2: out of phase mode shape (imaginary part of mode shape)
  • sortedModes: total, complex mode shape
OWENSFEA.extractdaInfoMethod

Internal, gets the total number of DOFs in the model, active number of DOFs in the model, and a list of slave DOFs that will be eliminated by joint constraints.

OWENSFEA.findElementsAssociatedWithNodeNumberMethod
findElementsAssociatedWithNodeNumber(nodeNum,conn,jointData)

Internal, finds elements associated with a node number through mesh connectivity or joint constraints

#Input

  • nodeNum node number joint constraints are desired at
  • conn object containing mesh connectivity
  • jointData object containing joint information

#Output

  • elList array containing a list of element numbers associated with nodeNum
  • localNode array containing the local node number that correspond to nodeNum in the list of associated elements
OWENSFEA.getGPMethod
getGP(numGP)

Internal, defines gauss point coordinates in a local element frame and the associated weights for Gaussian quadrature numerical integration.

#Input

  • numGP: number of quad points used for integration

#Output

  • xi: list of quad point coordinates in local element frame
  • weight: associated weights for quad point coordinate
OWENSFEA.initialElementCalculationsMethod
initialElementCalculations(feamodel,el,mesh)

performs initial element calculation for use later in analysis for efficiency gains.

Inputs

  • feamodel::FEAmodel: see ?Feamodel
  • el::El: see ?El
  • mesh::Mesh: see ?Mesh

Outputs:

  • elStorage:ElStorage: see ?ElStorage
OWENSFEA.makeBCdataMethod
makeBCdata(pBC,numNodes,numDofPerNode,reducedDOFList,jointTransform)

Internal, usese the pBC matrix and calculates/stores boundary condition data

#Input

  • pBC See ?FEAModel.pBC
  • numNodes number of nodes in structural model
  • numDofPerNode number of degrees of freedom per node
  • reducedDOFList joint transformation matrix from reduced to full DOF list
  • jointTransform listing of reduced DOFs

#Output

  • BC:BC_struct see ?BC_struct
OWENSFEA.mapMatrixNonSymMethod

Internal, function to form total stifness matrix and transform to desired DOF mapping

OWENSFEA.mapVectorMethod

Internal, forms total force vector and transform to desired DOF mapping

OWENSFEA.modalMethod
modal(feamodel,mesh,el;Omega=0.0,displ=zeros(mesh.numNodes*6),OmegaStart=0.0,returnDynMatrices=false)

Modal analysis

Inputs

  • feamodel::FEAModel: see ?FEAModel
  • mesh::Mesh: see ?Mesh
  • el::El: see ?El
  • Omega::float: Rotational rate in Hz
  • displ::Array{<:float}: zeros(mesh.numNodes*6) initial (warm start) displacements for each dof
  • OmegaStart::float: rotor speed (Hz) from previous analysis if stepping through various rotor speeds, may be useful in load stepping
  • returnDynMatrices::Bool: Flag to save linearized K/C/M matrices for the design

Outputs:

  • freq::Array{<:float}: sorted modal frequencies (Hz)
  • damp::Array{<:float}: sorted modal damping
  • imagCompSign::Array{<:float}: sign of imaginary component of eigenvalues
  • U_x_0::Array{<:float}: NnodesxNmodes in-phase mode shape x
  • U_y_0::Array{<:float}: NnodesxNmodes in-phase mode shape y
  • U_z_0::Array{<:float}: NnodesxNmodes in-phase mode shape z
  • theta_x_0::Array{<:float}: NnodesxNmodes in-phase mode shape rotation about x
  • theta_y_0::Array{<:float}: NnodesxNmodes in-phase mode shape rotation about y
  • theta_z_0::Array{<:float}: NnodesxNmodes in-phase mode shape rotation about z
  • U_x_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape x
  • U_y_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape y
  • U_z_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape z
  • theta_x_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape rotation about x
  • theta_y_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape rotation about y
  • theta_z_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape rotation about z
OWENSFEA.reducedOrderModelMethod

reducedOrderModel(elStorage,feamodel,mesh,el,displ)

This function executes a reduced order model analysis.

#Input

  • elStorage object containing stored element matrices
  • feamodel object containing feamodel information
  • mesh object containing mesh information
  • el object containing element information
  • displ displacement vector for use in pre-stressed analysis

#Output

  • rom object containing a reduced order feamodel
OWENSFEA.setInitialConditionsMethod
setInitialConditions(initCond,u,numDOFPerNode)

sets initial conditions

#Input

  • initCond: array containing initial conditions initCond(i,1) node number for init cond i initCond(i,2) local DOF number for init cond i initCond(i,3) value for init cond i
  • u: displacement vector for each dof
  • numDOFPerNode: number of degrees of freedom per node

#Output

  • u: displacement vector modified for initial conditions
OWENSFEA.setPrescribedConditionsMethod
prescribed_conditions = setPrescribedConditions(mesh;pBC=zeros(2,2),Fexternal=[],ForceDof=[])

Internal, maps OWENS boundary conditions and applied forces to the GXBeam PrescribedConditions input

#Input

  • mesh::FEAModel.mesh: Input turbine mesh
  • pBC::FEAModel.BC.pBC: Boundary conditions
  • Fexternal::Array{Float64}: Applied forces to the mesh, 1D array ordered node 1 Dof 1-6, node 2 Dof 1-2, etc.
  • ForceDof::Array{Float64}: Degrees of freedom aligned with Fexternal, currently is unused, assumes Fexternal uses the full DOF array.

#Output

  • prescribed_conditions::GXBeam.PrescribedConditions: the boundary conditions/applied forces used by GXBeam see ?GXBeam.PrescribedConditions
OWENSFEA.staticAnalysisMethod

staticAnalysis(feamodel,mesh,el,displ,Omega,OmegaStart,elStorage; reactionNodeNumber=1, OmegaDot=0.0, Fdof=[1], Fexternal=[0.0])

This function performs a static analysis and returns displacement values and a flag denoting successful/unsuccessful analysis

#Inputs

  • feamodel: object containing feamodel information
  • mesh: object containing mesh information
  • el: object containing element information
  • displ: displacement vector for use in pre-stressed analysis
  • Omega: rotor speed (Hz)
  • OmegaStart: rotor speed (Hz) from previous analysis if stepping through various rotor speeds, may be useful in load stepping
  • elStorage: previously calculated element system matrices
  • reactionNodeNumber::Int: optional, node at which to calculate reaction force
  • OmegaDot::Float: Steady State Rotational Acceleration
  • Fdof::Array{<:Int}: Global Dofs where Fexternal is acting, where max dof = nelem*ndof
  • Fexternal{<:Float}: Forces or moments associated with the Fdofs specified

#Outputs

  • displ: vector of displacemetns
  • staticAnalysisSuccessful: boolean flag denoting successful static analysis
OWENSFEA.structuralDynamicsTransientMethod
structuralDynamicsTransient(feamodel,mesh,el,dispData,Omega,OmegaDot,time,delta_t,elStorage,Fexternal,Fdof,CN2H,rbData)

performs unsteady structural dynamics analysis

Inputs

  • feamodel::: object containing feamodel data
  • mesh::: object containing mesh data
  • el::: object containing element data
  • dispData::: object containing displacement data
  • Omega::: rotor speed (Hz)
  • OmegaDot::: rotor acceleratin (Hz)
  • time::: current simulation time
  • delta_t::: time step size
  • elStorage::: object containing stored element data
  • Fexternal::: vector containing external force values
  • Fdof::: vector containing global DOF numbering associated with external force values
  • CN2H::: transformation matrix from inertial frame to hub frame
  • rbData::: vector containing rigid body displacement, velocity, and acceleration

Outputs:

  • elStrain::ElStrain: see ?ElStrain strain for element at end of time step
  • dispOut::DispOut: see ?DispOut displacement data at end of time step
  • FReaction_sp1::: vector containing reaction force at turbine base at end of time step
OWENSFEA.structuralDynamicsTransientROMMethod
structuralDynamicsTransientROM(feamodel,mesh,el,dispData,Omega,OmegaDot,time,delta_t,elStorage,rom,Fexternal,Fdof,CN2H,rbData)

Performs transient structural dynamics analysis using a reduced order feamodel (ROM).

#Input

  • feamodel: object containing feamodel data
  • mesh: object containing mesh data
  • el: object containing element data
  • dispData: object containing displacement data
  • Omega: rotor speed (Hz)
  • OmegaDot: rotor acceleratin (Hz)
  • time: current simulation time
  • delta_t: time step size
  • elStorage: object containing stored element data
  • rom: object containing reduced order feamodel represnetation
  • Fexternal: vector containing external force values
  • Fdof: vector containing global DOF numbering associated with external force values
  • CN2H: transformation matrix from inertial frame to hub frame
  • rbData: vector containing rigid body displacement, velocity, and acceleration

#Output

  • dispOut: object containing displacement data at end of time step
  • FReaction_sp1: vector containing reaction force at turbine base at end of time step
OWENSFEA.timeIntegrateSubSystemEffMethod

timeIntegrateSubSystemEff(M,K,C,F,timeInt,u,udot,uddot)

Performs integration of a system using the Newmark-Beta method(constant-average acceleration sceheme). The integration parameters are calculated before hand and store in the timeInt object.

#Input

  • M system mass matrix
  • K system sttiffness matrix
  • C system damping matrix
  • F system force vector
  • timeInt object containing time integraton parameters
  • u displacement at beginning of time step
  • udot velocity at beginning of time step
  • uddot acceleration at beginning of time step

#Output

  • unp1: displacement at end of time step
  • udotnp1: velocity at end of time step
  • uddotnp1: acceleration at end of time step
OWENSFEA.updateLoadStepMethod
updateLoadStep(iterationCount,loadStepParams,loadStep,loadStepPrev,loadStepCount,displCopy,displ)

Updates the load stepping parameter whether through means of adaptive loadstepping or a specified load step profile.

#Input

  • iterationCount number of iterations for current load step
  • loadStepParams struct containing load step parameters
  • loadStep load step value for current load step
  • loadStepPrev load step value for previous load st ep
  • loadStepCount number of load steps performed up to this point
  • displPrev converged displacement vector form previous load step
  • displ displacement vector at current load step

#Output

  • loadStep new load step value
  • loadStepPrev load step value for previous load step
  • displ most up to date displacement vector in load stepping procedure
  • displPrev displacement vector at end of previous load step
  • staticAnalysisSuccessful boolean flag, true if load step was completed successfully
  • staticAnalysisComplete boolean flag, true if analysis is complete
diff --git a/dev/reference/referenceOpenFASTWrappers/index.html b/dev/reference/referenceOpenFASTWrappers/index.html index 0c3bff4f..53a67e9f 100644 --- a/dev/reference/referenceOpenFASTWrappers/index.html +++ b/dev/reference/referenceOpenFASTWrappers/index.html @@ -1,2 +1,2 @@ -OWENSOpenFASTWrappers · OWENS.jl

OWENSOpenFASTWrappers

Types and functions

OWENSOpenFASTWrappers.EnvironmentType

Environment(rho::TF1, dt::TF2, steplast::TAI) Environment(rho) = Environment(rho)

Contains specications for turbine environment/operating conditions as well as some backend memory

Inputs

  • rho::TF1: Working fluid density (kg/m^3)
  • dt::TF2: timestep for ADI
  • num_channels::TI1: number of output channels from AD15
  • steplast::TAI: prior simulation step index, used for unsteady wake propogation

Outputs:

  • none:
OWENSOpenFASTWrappers.StructureType

Structure

Contains the position and orientation info passed to AD15. These positions are all in global and include the turbine RefPos.

Inputs:

  • hubPos::TAF1:
  • hubOrient::TAF2:
  • hubVel::TAF3:
  • hubAcc::TAF4:
  • nacPos::TAF5:
  • nacOrient::TAF6:
  • nacVel::TAF7:
  • nacAcc::TAF8:
  • rootPos::TAF9:
  • rootOrient::TAF10:
  • rootVel::TAF11:
  • rootAcc::TAF12:
  • meshPos::TAF13:
  • meshOrient::TAF14:
  • meshVel::TAF15:
  • meshAcc::TAF16:

Outputs:

  • none:
OWENSOpenFASTWrappers.adiCalcOutputMethod
adiCalcOutput( )

calls AeroDynInflowC_CalcOutput to calculate resulting loads. Call this only after SetRotorMotion on all rotors/turbines.

Inputs:

time::c_double: current timestep

  • num_channels::int: number of output channels
OWENSOpenFASTWrappers.adiGetRotorLoadsMethod
adiGetRotorLoads(iturb; )

Gets the loads for a single turbine rotor

Inputs:

  • iturb::int: required, current turbine number

Outputs:

  • meshFrcMom::Array(float): loads from ADI at mesh nodes
OWENSOpenFASTWrappers.adiInitMethod
adiInit( output_root_name ; )

calls aerodyninflowinit to initialize AeroDyn and InflowWind together

Inputs:

  • ad_input_file_passed::int: flag to indicate the AD15 input file is passed as a string 0=false, 1=true (set to false if passing input file name instead, NOT SUPPORTED YET)

  • ad_input_file::string: name of input file for AD15 – this is read by julia and passed to AD15

  • ifw_input_file_passed::int: flag to indicate the InflowWind input file is passed as a string 0=false, 1=true (set to false if passing input file name instead, NOT SUPPORTED YET)

  • ifw_input_file::string: name of input file for InflowWind – this is read by julia and passed to InflowWind

  • gravity::float: optional, gravity value (default: 9.80665 m/s^2)

  • defFldDens::float: optional, air density (default: 1.225 kg/m^3)

  • defKinVisc::float: optional, kinematic viscosity of working fluid (default: 1.464E-05 m^2/s)

  • defSpdSound::float: optional, speed of sound in working fluid (default: 335.0 m/s)

  • defPatm::float: optional, atmospheric pressure (default: 103500.0 Pa) [used only for an MHK turbine cavitation check]

  • defPvap::float: optional, vapour pressure of working fluid (default: 1700.0 Pa) [used only for an MHK turbine cavitation check]

  • WtrDpth::float: optional, water depth (default: 0.0 m) [used only for an MHK turbine]

  • MSL2SWL::float: optional, offset between still-water level and mean sea level (default: 0.0 m) [positive upward, used only for an MHK turbine]

  • storeHHVel::int: optional, internal parameter for adi_library. Exposed for convenience, but not needed. [0=false, 1=true]

  • WrVTK::int: optional, write VTK output files at all timesteps to visualize AeroDyn 15 meshes [0 none (default), 1 ref, 2 motion]

  • WrVTK_Type::int: optional, write VTK output files as [1 surfaces (default), 2 lines, 3 both]

  • VTKNacDim::Array(float*6) optional, Nacelle Dimension for VTK visualization x0,y0,z0,Lx,Ly,Lz (m)

  • VTKHubRad::float: optional, HubRadius for VTK visualization (m)

  • wrOuts::int: optional, file format for writing outputs [0 none (default), 1 txt, 2 binary, 3 both]

  • DT_Outs::float64: optional, timestep for outputs to file [0.0 (default) for every timestep]

  • interp_order::int: optional, interpolation order used internally [1 first order (default), 2 second order]

  • dt::float64: required, timestep for AD15 (needed for setting internal constants)

  • t_max::float: required, total expected simulation time – used only for setting VTK counter width

Outputs:

  • num_channels::int: number of output channels
  • channel_names::string: string of output channel names from ADI
  • channel_units::string: string of output channel units from ADI
OWENSOpenFASTWrappers.adiPreInitMethod
adiPreInit(adilib_filename numTurbines transposeDCM)

Does some pre-initializing of the ADI library to setup arrays for each turbine

Inputs:

  • adilib_filename::string: path and name of AeroDyn-Inflow dynamic library
  • numTurbines::int: required, number of turbines to setup ADI to handle
  • transposeDCM::int: required, transpose DCM internally in ADI to match calling code convention for direction cosine matrices (default: 1==true)
OWENSOpenFASTWrappers.adiSetRotorMotionMethod
adiSetRotorMotion(iturb; )

Sets the motions for a single turbine rotor

Inputs:

  • iturb::int: required, current turbine number

  • HubPos::Array(float): required, (x,y,z) position of hub

  • HubOrient::Array(float): required, orientation of hub as 9 element vector of flattened DCM

  • HubVel::Array(float): required, (TVx,TVy,TVz,RVx,RVy,RVz) velocity of hub, does not include rotational velocity, so this is extra like from a platform

  • HubAcc::Array(float): required, (TAx,TAy,TAz,RAx,RAy,RAz) acceleration of hub, does not include rotational accel, so this is extra like from a platform

  • NacPos::Array(float): required, (x,y,z) position of nacelle

  • NacOrient::Array(float): required, orientation of nacelle as 9 element vector of flattened DCM

  • NacVel::Array(float): required, (TVx,TVy,TVz,RVx,RVy,RVz) velocity of nacelle

  • NacAcc::Array(float): required, (TAx,TAy,TAz,RAx,RAy,RAz) acceleration of nacelle

  • RootPos::Array(float): required, size (numBlades,3) position vectors of roots

  • RootOrient::Array(float): required, size (numBlades,9) orientation DCMs flattened to array of 9 element vectors

  • RootVel::Array(float): required, size (numBlades,6) velocity vectors of roots

  • RootAcc::Array(float): required, size (numBlades,6) acceleration vectors of roots

  • numMeshNodes::Array(int): required, number of structural mesh points (total across all blades)

  • MeshPos::Array(float): required, size (sum(numMeshNodes),3) position vectors of mesh points

  • MeshOrient::Array(float): required, size (sum(numMeshNodes),9) orientation DCMs flattened to array of 9 element vectors

  • MeshVel::Array(float): required, size (sum(numMeshNodes),6) velocity vectors of mesh points

  • MeshAcc::Array(float): required, size (sum(numMeshNodes),6) acceleration vectors of mesh points

Outputs:

  • none:
OWENSOpenFASTWrappers.adiSetupRotorMethod
adiSetupRotor(iturb; )

Sets the initial locations of a single rotor (root orientations/positions etc)

Inputs:

  • iturb::int: required, current turbine number

  • isHAWT::bool: required, false: VAWT or cross-flow turbine, true: HAWT

  • intTurbPos::Array(float): required, (x,y,z) position of turbine

  • initHubPos::Array(float): required, (x,y,z) position of hub

  • initHubOrient::Array(float): required, orientation of hub as 9 element vector of flattened DCM

  • initNacellePos::Array(float): required, (x,y,z) position of nacelle

  • initNacelleOrient::Array(float): required, orientation of nacelle as 9 element vector of flattened DCM

  • numBlades::int: required, number of blades

  • initRootPos::Array(float): required, size (numBlades,3) position vectors of roots

  • initRootOrient::Array(float): required, size (numBlades,9) orientation DCMs flattened to array of 9 element vectors

  • numMeshNodes::Array(int): required, number of structural mesh points (total across all blades)

  • initMeshPos::Array(float): required, size (sum(numMeshNodes),3) position vectors of mesh points

  • initMeshOrient::Array(float): required, size (sum(numMeshNodes),9) orientation DCMs flattened to array of 9 element vectors

OWENSOpenFASTWrappers.adiUpdateStatesMethod
adiUpdateStates( )

calls AeroDynInflowC_UpdateStates to step ADI forward to the next timestep Call this only after SetRotorMotion on all rotors/turbines.

Inputs:

time::c_double: current timestep

time_next::c_double: next timestep

OWENSOpenFASTWrappers.advanceAD15Method
advanceAD15(t_new;ts=2*pi/(turbine.omega[1]*turbine.ntheta))

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

Inputs

  • t_new::float: new time (s); will run from last time specified from the last call, to the current time specified, or from t=ts if the first time called
  • mesh::: OWENSFEA mesh for the turbine structure
  • azi::: hub azimuth (radians)
  • dt::float: optional timestep

Outputs:

  • n_steps: number timesteps taken
  • Fx: Array(sum(numMeshNodes),ntheta) Turbine Fx (N)
  • Fy: Array(sum(numMeshNodes),ntheta) Turbine Fy (N)
  • Fz: Array(sum(numMeshNodes),ntheta) Turbine Fz (N)
  • Mx: Array(sum(numMeshNodes),ntheta) Turbine Mx (N-m)
  • My: Array(sum(numMeshNodes),ntheta) Turbine My (N-m)
  • Mz: Array(sum(numMeshNodes),ntheta) Turbine Mz (N-m)
OWENSOpenFASTWrappers.createGeneralTransformationMatrixMethod

createGeneralTransformationMatrix(angleArray,axisArray)

Calculates the transformation matrix assocaited with a general Euler rotation sequence.

#Input

  • angleArray: = array of angles for Euler rotation sequence
  • axisArray: = array of axis of rotations for Euler rotation

#Output

  • dcmTotal: = transformation matrix of specified euler rotation sequence
OWENSOpenFASTWrappers.deformAD15Method
deformAD15(u_j,udot_j,uddot_j,azi,Omega_rad,OmegaDot_rad,hubPos,hubAngle,hubVel,hubAcc)

Sets the inputs for AD15.

Inputs

  • u_j: mesh displacements – in hub coordinates, (m,rad)
  • udot_j: mesh velocity – in hub coordinates, (m/s,rad/s)
  • uddot_j: mesh velocity – in hub coordinates, (m/s,rad/s)
  • azi: current azimuth (rad)
  • Omega_rad: angular velocity of hub about hub axis (rad/s)
  • OmegaDot_rad: angular acceleration of hub about hub axis (rad/s^2)
  • hubPos: current global hubPos (x,y,z) vector (m)
  • hubAngle: 3 angle set for hub orientation (rad), no rotation from spinning
  • hubVel: hub velocity in global coords, 6-vector (m/s,rad/s), does not include rotational velocity, so this is extra like from a platform
  • hubAcc: hub acceleration in global coords, 6-vector (m/s^2,rad/s^2), does not include rotational accel, so this is extra like from a platform
OWENSOpenFASTWrappers.frame_convertMethod

frameconvert(initframevals, transmat)

Internal, transfers 6 DOFs element-wise to a new reference frame

Input

  • init_frame_vals::Vector{<:float}: Values in 6 degrees of freedom in the initial reference frame
  • trans_mat::Array{<:float}: Transformation matrix to the output reference frame

Output

  • out_frame_vals: Values in 6 degrees of freedom in the output reference frame
OWENSOpenFASTWrappers.getAD15MeshDCMMethod

getAD15MeshDCM(turbine,u_j,azi,hubAngle)

Extract the mesh points orientations for all the AD15 blades ordering here is important 1. root to tip of blades, in blade order 2. root to tip of bottom struts, in blade order 3. root to tip of top struts, in blade order

Inputs

  • turbine: turbine data storage
  • u_j: mesh displacements – in hub coordinates, (m,rad)
  • azi: current azimuth (rad)
  • hubAngle: 3 angle set for hub orientation (rad), no rotation from spinning

#FIXME: add averaging of orientations to get nodes within blade/strut

OWENSOpenFASTWrappers.getAD15MeshPosMethod

getAD15MeshPos(turbine,u_j,azi,nacPos,hubPos,hubAngle)

Extract the mesh points for all the AD15 blades ordering here is important 1. root to tip of blades, in blade order 2. root to tip of bottom struts, in blade order 3. root to tip of top struts, in blade order

Inputs

  • turbine: turbine data storage
  • u_j: mesh displacements – in hub coordinates, (m,rad)
  • azi: current azimuth (rad)
  • hubPos: current global hubPos (x,y,z) vector (m)
  • nacPos: current global nacPos (x,y,z) vector (m)
  • hubAngle: 3 angle set for hub orientation (rad) , no rotation from spinning
OWENSOpenFASTWrappers.getAD15MeshVelAccMethod

getAD15MeshVelAcc(turbine,meshPos,udotj,uddotj,azi,Omegarad,OmegaDotrad,nacPos,hubPos,hubAngle,hubVel,hubAcc)

Extract the mesh velocities and accelerations for all the AD15 blades ordering here is important 1. root to tip of blades, in blade order 2. root to tip of bottom struts, in blade order 3. root to tip of top struts, in blade order

Inputs

  • turbine: turbine data storage
  • rootPos: root positions from call to getAD15MeshPos
  • u_j: mesh displacements – in hub coordinates, (m,rad)
  • udot_j: mesh velocity – in hub coordinates, (m/s,rad/s)
  • uddot_j: mesh velocity – in hub coordinates, (m/s,rad/s)
  • azi: current azimuth (rad)
  • Omega_rad: angular velocity of hub about hub axis (rad/s)
  • OmegaDot_rad: angular acceleration of hub about hub axis (rad/s^2)
  • hubPos: current global hubPos (x,y,z) vector (m)
  • nacPos: current global nacPos (x,y,z) vector (m)
  • hubAngle: 3 angle set for hub orientation (rad), no rotation from spinning
  • hubVel: hub velocity in global coords (m/s,rad/s), does not include rotational velocity, so this is extra like from a platform
  • hubAcc: hub acceleration in global coords (m/s^2,rad/s^2), does not include rotational accel, so this is extra like from a platform
OWENSOpenFASTWrappers.getRootDCMMethod

getRootDCM(turbine,u_j,azi,hubAngle)

Note on angles The OWENSFEA mesh in OWENS uses +X as the blade/strut long axis. In AeroDyn, the blade axis is +Z. So for transforming the blades from OWENSFEA mesh coordinates, first rotate by -90 degrees about Y, then do the 3,2,1 coordinate transforms with (Twist,Theta,Psi) = (Rz,Ry,Rx) = (Yaw,Pitch,Roll) Psid – rotation about Z axis – Yaw (Rz) – degrees Thetad – rotation about Y axis – Pitch (Ry) – degrees Twist_d – rotation about X axis – Roll (Rx) – degrees The rotation sequence is Roll –> Pitch –> Yaw. In rotation matrix form, it is R = RzRyRx (a [3,2,1] matrix order).

Inputs

  • turbine: turbine data storage
  • u_j: mesh displacements – in hub coordinates, (m,rad)
  • azi: current azimuth (rad)
  • hubAngle: 3 angle set for hub orientation (rad), no rotation from spinning

#FIXME: add averaging of orientations to get nodes within blade/strut

OWENSOpenFASTWrappers.getRootPosMethod

getRootPos(turbine,u_j,azi,nacPos,hubPos,hubAngle)

Extract the root positions for all ADI blades

Inputs

  • turbine: turbine data storage
  • u_j: mesh displacements – in hub coordinates, (m,rad)
  • azi: current azimuth (rad)
  • nacPos: current global nacPos (x,y,z) vector (m)
  • hubPos: current global hubPos (x,y,z) vector (m)
  • hubAngle: 3 angle set for hub orientation (rad), no rotation from spinning
OWENSOpenFASTWrappers.getRootVelAccMethod

getRootVelAcc(turbine,rootPos,udotj,uddotj,azi,Omegarad,OmegaDotrad,nacPos,hubPos,hubAngle,hubVel,hubAcc)

Extract the root velocities and accelerations for all ADI blades

Inputs

  • turbine: turbine data storage
  • rootPos: root positions from call to getRootPos
  • azi: current azimuth (rad)
  • Omega_rad: angular velocity of hub about hub axis (rad/s)
  • OmegaDot_rad: angular acceleration of hub about hub axis (rad/s^2)
  • nacPos: current global nacPos (x,y,z) vector (m)
  • hubPos: current global hubPos (x,y,z) vector (m)
  • hubAngle: 3 angle set for hub orientation (rad) , no rotation from spinning
  • hubVel: hub velocity in global coords, 6-vector (m/s,rad/s), does not include rotational velocity, so this is extra like from a platform
  • hubAcc: hub acceleration in global coords, 6-vector (m/s^2,rad/s^2), does not include rotational accel, so this is extra like from a platform
OWENSOpenFASTWrappers.ifwcalcoutputMethod
ifwcalcoutput(position,time)

calls inflow wind clacoutput

Inputs

  • position::Array(float): x, y, z sample position (m)
  • time::float: sample time (s)

Outputs:

  • velocities: x, y, z velocity at sample position
OWENSOpenFASTWrappers.ifwinitMethod
ifwinit(inflowlib_filename ;HWindSpeed=6.87,turbsim_filename="path/test.bts")

calls inflow wind init

Inputs

  • inflowlib_filename::string: path and name of inflow-wind dynamic library
  • HWindSpeed::float: optional, backup steady windspeed (m/s)
  • turbsim_filename::string: path and name of turbsim data e.g. "path/test.bts"

Outputs:

  • none:
OWENSOpenFASTWrappers.setupTurbMethod

setupTurb(adilib,adinputfile,ifwinputfile,adirootname,bldx,bldz,B; rho = 1.225, gravity = 9.80665, defKinVisc = 1.464E-05, defSpdSound = 335.0, defPatm = 103500.0, defPvap = 1700.0, WtrDpth = 0.0, MSL2SWL = 0.0, storeHHVel = 0, #false transposeDCM= 1, #true WrVTK = 2, WrVTKType = 3, VTKNacDim = [-.10 ,-.10 ,-.10 ,.2 ,.2 ,.2], VTKHubRad = 1.0, adinstrut = 2, adidt = 0.05, aditmax = 10, adiwrOuts = 0, adiDT_Outs = 0.0, isHAWT = false, # false: VAWT or cross-flow turbine, true: HAWT numTurbines = 1)

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

Inputs

  • adi_lib: path to adi library (.so, .dylib, .dll)
  • ad_input_file: input file for aerodyn15
  • ifw_input_file: input file for inflow wind
  • adi_rootname: rootname for vtk outputs
  • bld_x: Blade x shape
  • bld_z: Blade z shape
  • B: Number of blades
  • rho: working fluid density (kg/m^3)
  • gravity: Gravitational acceleration (m/s^2)
  • defKinVisc: Kinematic viscosity of working fluid (m^2/s)
  • defSpdSound: Speed of sound in working fluid (m/s)
  • defPatm: Atmospheric pressure (Pa) [used only for an MHK turbine cavitation check]
  • defPvap: Vapour pressure of working fluid (Pa) [used only for an MHK turbine cavitation check]
  • WtrDpth: Water depth (m)
  • MSL2SWL: Offset between still-water level and mean sea level (m) [positive upward]
  • storeHHVel: unused here
  • transposeDCM: 0=false, 1=true transpose DCM internally for calculations
  • WrVTK: write VTK files from adi to directory adi-vtk [0 none, 1 ref, 2 motion]
  • WrVTK_Type: write VTK files from adi to directory adi-vtk [1 surface, 2 lines, 3 both]
  • VTKNacDim: Nacelle Dimension for VTK visualization x0,y0,z0,Lx,Ly,Lz (m)
  • VTKHubRad: HubRadius for VTK visualization (m)
  • adi_wrOuts: file format to write to
  • adi_DT_Outs: output timestep to write at
  • adi_nstrut: createmeshstruts is hard coded for 2 struts per blade
  • adi_dt: timestep
  • adi_tmax: maximum time
  • hubPos: hub position in global coordinates, 3-vector (m). NOTE: AD15 assumes a different hub location than OWENS
  • hubAngle: hub axis angle, 3-vector (deg), no rotation from spinning
  • nacPos: nacelle position in global coordinates, 3-vector (m). NOTE: AD15 assumes a different hub location than OWENS
  • nacAngle: nacelle axis angle, 3-vector (deg)
  • numTurbines: number of turbines
  • isHAWT: # false: VAWT or cross-flow turbine, true: HAWT

Outputs:

  • none:
OWENSOpenFASTWrappers.transMatMethod

transMat(theta1, theta2, theta3)

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

+OWENSOpenFASTWrappers · OWENS.jl

OWENSOpenFASTWrappers

Types and functions

OWENSOpenFASTWrappers.EnvironmentType

Environment(rho::TF1, dt::TF2, steplast::TAI) Environment(rho) = Environment(rho)

Contains specications for turbine environment/operating conditions as well as some backend memory

Inputs

  • rho::TF1: Working fluid density (kg/m^3)
  • dt::TF2: timestep for ADI
  • num_channels::TI1: number of output channels from AD15
  • steplast::TAI: prior simulation step index, used for unsteady wake propogation

Outputs:

  • none:
OWENSOpenFASTWrappers.StructureType

Structure

Contains the position and orientation info passed to AD15. These positions are all in global and include the turbine RefPos.

Inputs:

  • hubPos::TAF1:
  • hubOrient::TAF2:
  • hubVel::TAF3:
  • hubAcc::TAF4:
  • nacPos::TAF5:
  • nacOrient::TAF6:
  • nacVel::TAF7:
  • nacAcc::TAF8:
  • rootPos::TAF9:
  • rootOrient::TAF10:
  • rootVel::TAF11:
  • rootAcc::TAF12:
  • meshPos::TAF13:
  • meshOrient::TAF14:
  • meshVel::TAF15:
  • meshAcc::TAF16:

Outputs:

  • none:
OWENSOpenFASTWrappers.adiCalcOutputMethod
adiCalcOutput( )

calls AeroDynInflowC_CalcOutput to calculate resulting loads. Call this only after SetRotorMotion on all rotors/turbines.

Inputs:

time::c_double: current timestep

  • num_channels::int: number of output channels
OWENSOpenFASTWrappers.adiGetRotorLoadsMethod
adiGetRotorLoads(iturb; )

Gets the loads for a single turbine rotor

Inputs:

  • iturb::int: required, current turbine number

Outputs:

  • meshFrcMom::Array(float): loads from ADI at mesh nodes
OWENSOpenFASTWrappers.adiInitMethod
adiInit( output_root_name ; )

calls aerodyninflowinit to initialize AeroDyn and InflowWind together

Inputs:

  • ad_input_file_passed::int: flag to indicate the AD15 input file is passed as a string 0=false, 1=true (set to false if passing input file name instead, NOT SUPPORTED YET)

  • ad_input_file::string: name of input file for AD15 – this is read by julia and passed to AD15

  • ifw_input_file_passed::int: flag to indicate the InflowWind input file is passed as a string 0=false, 1=true (set to false if passing input file name instead, NOT SUPPORTED YET)

  • ifw_input_file::string: name of input file for InflowWind – this is read by julia and passed to InflowWind

  • gravity::float: optional, gravity value (default: 9.80665 m/s^2)

  • defFldDens::float: optional, air density (default: 1.225 kg/m^3)

  • defKinVisc::float: optional, kinematic viscosity of working fluid (default: 1.464E-05 m^2/s)

  • defSpdSound::float: optional, speed of sound in working fluid (default: 335.0 m/s)

  • defPatm::float: optional, atmospheric pressure (default: 103500.0 Pa) [used only for an MHK turbine cavitation check]

  • defPvap::float: optional, vapour pressure of working fluid (default: 1700.0 Pa) [used only for an MHK turbine cavitation check]

  • WtrDpth::float: optional, water depth (default: 0.0 m) [used only for an MHK turbine]

  • MSL2SWL::float: optional, offset between still-water level and mean sea level (default: 0.0 m) [positive upward, used only for an MHK turbine]

  • storeHHVel::int: optional, internal parameter for adi_library. Exposed for convenience, but not needed. [0=false, 1=true]

  • WrVTK::int: optional, write VTK output files at all timesteps to visualize AeroDyn 15 meshes [0 none (default), 1 ref, 2 motion]

  • WrVTK_Type::int: optional, write VTK output files as [1 surfaces (default), 2 lines, 3 both]

  • VTKNacDim::Array(float*6) optional, Nacelle Dimension for VTK visualization x0,y0,z0,Lx,Ly,Lz (m)

  • VTKHubRad::float: optional, HubRadius for VTK visualization (m)

  • wrOuts::int: optional, file format for writing outputs [0 none (default), 1 txt, 2 binary, 3 both]

  • DT_Outs::float64: optional, timestep for outputs to file [0.0 (default) for every timestep]

  • interp_order::int: optional, interpolation order used internally [1 first order (default), 2 second order]

  • dt::float64: required, timestep for AD15 (needed for setting internal constants)

  • t_max::float: required, total expected simulation time – used only for setting VTK counter width

Outputs:

  • num_channels::int: number of output channels
  • channel_names::string: string of output channel names from ADI
  • channel_units::string: string of output channel units from ADI
OWENSOpenFASTWrappers.adiPreInitMethod
adiPreInit(adilib_filename numTurbines transposeDCM)

Does some pre-initializing of the ADI library to setup arrays for each turbine

Inputs:

  • adilib_filename::string: path and name of AeroDyn-Inflow dynamic library
  • numTurbines::int: required, number of turbines to setup ADI to handle
  • transposeDCM::int: required, transpose DCM internally in ADI to match calling code convention for direction cosine matrices (default: 1==true)
OWENSOpenFASTWrappers.adiSetRotorMotionMethod
adiSetRotorMotion(iturb; )

Sets the motions for a single turbine rotor

Inputs:

  • iturb::int: required, current turbine number

  • HubPos::Array(float): required, (x,y,z) position of hub

  • HubOrient::Array(float): required, orientation of hub as 9 element vector of flattened DCM

  • HubVel::Array(float): required, (TVx,TVy,TVz,RVx,RVy,RVz) velocity of hub, does not include rotational velocity, so this is extra like from a platform

  • HubAcc::Array(float): required, (TAx,TAy,TAz,RAx,RAy,RAz) acceleration of hub, does not include rotational accel, so this is extra like from a platform

  • NacPos::Array(float): required, (x,y,z) position of nacelle

  • NacOrient::Array(float): required, orientation of nacelle as 9 element vector of flattened DCM

  • NacVel::Array(float): required, (TVx,TVy,TVz,RVx,RVy,RVz) velocity of nacelle

  • NacAcc::Array(float): required, (TAx,TAy,TAz,RAx,RAy,RAz) acceleration of nacelle

  • RootPos::Array(float): required, size (numBlades,3) position vectors of roots

  • RootOrient::Array(float): required, size (numBlades,9) orientation DCMs flattened to array of 9 element vectors

  • RootVel::Array(float): required, size (numBlades,6) velocity vectors of roots

  • RootAcc::Array(float): required, size (numBlades,6) acceleration vectors of roots

  • numMeshNodes::Array(int): required, number of structural mesh points (total across all blades)

  • MeshPos::Array(float): required, size (sum(numMeshNodes),3) position vectors of mesh points

  • MeshOrient::Array(float): required, size (sum(numMeshNodes),9) orientation DCMs flattened to array of 9 element vectors

  • MeshVel::Array(float): required, size (sum(numMeshNodes),6) velocity vectors of mesh points

  • MeshAcc::Array(float): required, size (sum(numMeshNodes),6) acceleration vectors of mesh points

Outputs:

  • none:
OWENSOpenFASTWrappers.adiSetupRotorMethod
adiSetupRotor(iturb; )

Sets the initial locations of a single rotor (root orientations/positions etc)

Inputs:

  • iturb::int: required, current turbine number

  • isHAWT::bool: required, false: VAWT or cross-flow turbine, true: HAWT

  • intTurbPos::Array(float): required, (x,y,z) position of turbine

  • initHubPos::Array(float): required, (x,y,z) position of hub

  • initHubOrient::Array(float): required, orientation of hub as 9 element vector of flattened DCM

  • initNacellePos::Array(float): required, (x,y,z) position of nacelle

  • initNacelleOrient::Array(float): required, orientation of nacelle as 9 element vector of flattened DCM

  • numBlades::int: required, number of blades

  • initRootPos::Array(float): required, size (numBlades,3) position vectors of roots

  • initRootOrient::Array(float): required, size (numBlades,9) orientation DCMs flattened to array of 9 element vectors

  • numMeshNodes::Array(int): required, number of structural mesh points (total across all blades)

  • initMeshPos::Array(float): required, size (sum(numMeshNodes),3) position vectors of mesh points

  • initMeshOrient::Array(float): required, size (sum(numMeshNodes),9) orientation DCMs flattened to array of 9 element vectors

OWENSOpenFASTWrappers.adiUpdateStatesMethod
adiUpdateStates( )

calls AeroDynInflowC_UpdateStates to step ADI forward to the next timestep Call this only after SetRotorMotion on all rotors/turbines.

Inputs:

time::c_double: current timestep

time_next::c_double: next timestep

OWENSOpenFASTWrappers.advanceAD15Method
advanceAD15(t_new;ts=2*pi/(turbine.omega[1]*turbine.ntheta))

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

Inputs

  • t_new::float: new time (s); will run from last time specified from the last call, to the current time specified, or from t=ts if the first time called
  • mesh::: OWENSFEA mesh for the turbine structure
  • azi::: hub azimuth (radians)
  • dt::float: optional timestep

Outputs:

  • n_steps: number timesteps taken
  • Fx: Array(sum(numMeshNodes),ntheta) Turbine Fx (N)
  • Fy: Array(sum(numMeshNodes),ntheta) Turbine Fy (N)
  • Fz: Array(sum(numMeshNodes),ntheta) Turbine Fz (N)
  • Mx: Array(sum(numMeshNodes),ntheta) Turbine Mx (N-m)
  • My: Array(sum(numMeshNodes),ntheta) Turbine My (N-m)
  • Mz: Array(sum(numMeshNodes),ntheta) Turbine Mz (N-m)
OWENSOpenFASTWrappers.createGeneralTransformationMatrixMethod

createGeneralTransformationMatrix(angleArray,axisArray)

Calculates the transformation matrix assocaited with a general Euler rotation sequence.

#Input

  • angleArray: = array of angles for Euler rotation sequence
  • axisArray: = array of axis of rotations for Euler rotation

#Output

  • dcmTotal: = transformation matrix of specified euler rotation sequence
OWENSOpenFASTWrappers.deformAD15Method
deformAD15(u_j,udot_j,uddot_j,azi,Omega_rad,OmegaDot_rad,hubPos,hubAngle,hubVel,hubAcc)

Sets the inputs for AD15.

Inputs

  • u_j: mesh displacements – in hub coordinates, (m,rad)
  • udot_j: mesh velocity – in hub coordinates, (m/s,rad/s)
  • uddot_j: mesh velocity – in hub coordinates, (m/s,rad/s)
  • azi: current azimuth (rad)
  • Omega_rad: angular velocity of hub about hub axis (rad/s)
  • OmegaDot_rad: angular acceleration of hub about hub axis (rad/s^2)
  • hubPos: current global hubPos (x,y,z) vector (m)
  • hubAngle: 3 angle set for hub orientation (rad), no rotation from spinning
  • hubVel: hub velocity in global coords, 6-vector (m/s,rad/s), does not include rotational velocity, so this is extra like from a platform
  • hubAcc: hub acceleration in global coords, 6-vector (m/s^2,rad/s^2), does not include rotational accel, so this is extra like from a platform
OWENSOpenFASTWrappers.frame_convertMethod

frameconvert(initframevals, transmat)

Internal, transfers 6 DOFs element-wise to a new reference frame

Input

  • init_frame_vals::Vector{<:float}: Values in 6 degrees of freedom in the initial reference frame
  • trans_mat::Array{<:float}: Transformation matrix to the output reference frame

Output

  • out_frame_vals: Values in 6 degrees of freedom in the output reference frame
OWENSOpenFASTWrappers.getAD15MeshDCMMethod

getAD15MeshDCM(turbine,u_j,azi,hubAngle)

Extract the mesh points orientations for all the AD15 blades ordering here is important 1. root to tip of blades, in blade order 2. root to tip of bottom struts, in blade order 3. root to tip of top struts, in blade order

Inputs

  • turbine: turbine data storage
  • u_j: mesh displacements – in hub coordinates, (m,rad)
  • azi: current azimuth (rad)
  • hubAngle: 3 angle set for hub orientation (rad), no rotation from spinning

#FIXME: add averaging of orientations to get nodes within blade/strut

OWENSOpenFASTWrappers.getAD15MeshPosMethod

getAD15MeshPos(turbine,u_j,azi,nacPos,hubPos,hubAngle)

Extract the mesh points for all the AD15 blades ordering here is important 1. root to tip of blades, in blade order 2. root to tip of bottom struts, in blade order 3. root to tip of top struts, in blade order

Inputs

  • turbine: turbine data storage
  • u_j: mesh displacements – in hub coordinates, (m,rad)
  • azi: current azimuth (rad)
  • hubPos: current global hubPos (x,y,z) vector (m)
  • nacPos: current global nacPos (x,y,z) vector (m)
  • hubAngle: 3 angle set for hub orientation (rad) , no rotation from spinning
OWENSOpenFASTWrappers.getAD15MeshVelAccMethod

getAD15MeshVelAcc(turbine,meshPos,udotj,uddotj,azi,Omegarad,OmegaDotrad,nacPos,hubPos,hubAngle,hubVel,hubAcc)

Extract the mesh velocities and accelerations for all the AD15 blades ordering here is important 1. root to tip of blades, in blade order 2. root to tip of bottom struts, in blade order 3. root to tip of top struts, in blade order

Inputs

  • turbine: turbine data storage
  • rootPos: root positions from call to getAD15MeshPos
  • u_j: mesh displacements – in hub coordinates, (m,rad)
  • udot_j: mesh velocity – in hub coordinates, (m/s,rad/s)
  • uddot_j: mesh velocity – in hub coordinates, (m/s,rad/s)
  • azi: current azimuth (rad)
  • Omega_rad: angular velocity of hub about hub axis (rad/s)
  • OmegaDot_rad: angular acceleration of hub about hub axis (rad/s^2)
  • hubPos: current global hubPos (x,y,z) vector (m)
  • nacPos: current global nacPos (x,y,z) vector (m)
  • hubAngle: 3 angle set for hub orientation (rad), no rotation from spinning
  • hubVel: hub velocity in global coords (m/s,rad/s), does not include rotational velocity, so this is extra like from a platform
  • hubAcc: hub acceleration in global coords (m/s^2,rad/s^2), does not include rotational accel, so this is extra like from a platform
OWENSOpenFASTWrappers.getRootDCMMethod

getRootDCM(turbine,u_j,azi,hubAngle)

Note on angles The OWENSFEA mesh in OWENS uses +X as the blade/strut long axis. In AeroDyn, the blade axis is +Z. So for transforming the blades from OWENSFEA mesh coordinates, first rotate by -90 degrees about Y, then do the 3,2,1 coordinate transforms with (Twist,Theta,Psi) = (Rz,Ry,Rx) = (Yaw,Pitch,Roll) Psid – rotation about Z axis – Yaw (Rz) – degrees Thetad – rotation about Y axis – Pitch (Ry) – degrees Twist_d – rotation about X axis – Roll (Rx) – degrees The rotation sequence is Roll –> Pitch –> Yaw. In rotation matrix form, it is R = RzRyRx (a [3,2,1] matrix order).

Inputs

  • turbine: turbine data storage
  • u_j: mesh displacements – in hub coordinates, (m,rad)
  • azi: current azimuth (rad)
  • hubAngle: 3 angle set for hub orientation (rad), no rotation from spinning

#FIXME: add averaging of orientations to get nodes within blade/strut

OWENSOpenFASTWrappers.getRootPosMethod

getRootPos(turbine,u_j,azi,nacPos,hubPos,hubAngle)

Extract the root positions for all ADI blades

Inputs

  • turbine: turbine data storage
  • u_j: mesh displacements – in hub coordinates, (m,rad)
  • azi: current azimuth (rad)
  • nacPos: current global nacPos (x,y,z) vector (m)
  • hubPos: current global hubPos (x,y,z) vector (m)
  • hubAngle: 3 angle set for hub orientation (rad), no rotation from spinning
OWENSOpenFASTWrappers.getRootVelAccMethod

getRootVelAcc(turbine,rootPos,udotj,uddotj,azi,Omegarad,OmegaDotrad,nacPos,hubPos,hubAngle,hubVel,hubAcc)

Extract the root velocities and accelerations for all ADI blades

Inputs

  • turbine: turbine data storage
  • rootPos: root positions from call to getRootPos
  • azi: current azimuth (rad)
  • Omega_rad: angular velocity of hub about hub axis (rad/s)
  • OmegaDot_rad: angular acceleration of hub about hub axis (rad/s^2)
  • nacPos: current global nacPos (x,y,z) vector (m)
  • hubPos: current global hubPos (x,y,z) vector (m)
  • hubAngle: 3 angle set for hub orientation (rad) , no rotation from spinning
  • hubVel: hub velocity in global coords, 6-vector (m/s,rad/s), does not include rotational velocity, so this is extra like from a platform
  • hubAcc: hub acceleration in global coords, 6-vector (m/s^2,rad/s^2), does not include rotational accel, so this is extra like from a platform
OWENSOpenFASTWrappers.ifwcalcoutputMethod
ifwcalcoutput(position,time)

calls inflow wind clacoutput

Inputs

  • position::Array(float): x, y, z sample position (m)
  • time::float: sample time (s)

Outputs:

  • velocities: x, y, z velocity at sample position
OWENSOpenFASTWrappers.ifwinitMethod
ifwinit(inflowlib_filename ;HWindSpeed=6.87,turbsim_filename="path/test.bts")

calls inflow wind init

Inputs

  • inflowlib_filename::string: path and name of inflow-wind dynamic library
  • HWindSpeed::float: optional, backup steady windspeed (m/s)
  • turbsim_filename::string: path and name of turbsim data e.g. "path/test.bts"

Outputs:

  • none:
OWENSOpenFASTWrappers.setupTurbMethod

setupTurb(adilib,adinputfile,ifwinputfile,adirootname,bldx,bldz,B; rho = 1.225, gravity = 9.80665, defKinVisc = 1.464E-05, defSpdSound = 335.0, defPatm = 103500.0, defPvap = 1700.0, WtrDpth = 0.0, MSL2SWL = 0.0, storeHHVel = 0, #false transposeDCM= 1, #true WrVTK = 2, WrVTKType = 3, VTKNacDim = [-.10 ,-.10 ,-.10 ,.2 ,.2 ,.2], VTKHubRad = 1.0, adinstrut = 2, adidt = 0.05, aditmax = 10, adiwrOuts = 0, adiDT_Outs = 0.0, isHAWT = false, # false: VAWT or cross-flow turbine, true: HAWT numTurbines = 1)

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

Inputs

  • adi_lib: path to adi library (.so, .dylib, .dll)
  • ad_input_file: input file for aerodyn15
  • ifw_input_file: input file for inflow wind
  • adi_rootname: rootname for vtk outputs
  • bld_x: Blade x shape
  • bld_z: Blade z shape
  • B: Number of blades
  • rho: working fluid density (kg/m^3)
  • gravity: Gravitational acceleration (m/s^2)
  • defKinVisc: Kinematic viscosity of working fluid (m^2/s)
  • defSpdSound: Speed of sound in working fluid (m/s)
  • defPatm: Atmospheric pressure (Pa) [used only for an MHK turbine cavitation check]
  • defPvap: Vapour pressure of working fluid (Pa) [used only for an MHK turbine cavitation check]
  • WtrDpth: Water depth (m)
  • MSL2SWL: Offset between still-water level and mean sea level (m) [positive upward]
  • storeHHVel: unused here
  • transposeDCM: 0=false, 1=true transpose DCM internally for calculations
  • WrVTK: write VTK files from adi to directory adi-vtk [0 none, 1 ref, 2 motion]
  • WrVTK_Type: write VTK files from adi to directory adi-vtk [1 surface, 2 lines, 3 both]
  • VTKNacDim: Nacelle Dimension for VTK visualization x0,y0,z0,Lx,Ly,Lz (m)
  • VTKHubRad: HubRadius for VTK visualization (m)
  • adi_wrOuts: file format to write to
  • adi_DT_Outs: output timestep to write at
  • adi_nstrut: createmeshstruts is hard coded for 2 struts per blade
  • adi_dt: timestep
  • adi_tmax: maximum time
  • hubPos: hub position in global coordinates, 3-vector (m). NOTE: AD15 assumes a different hub location than OWENS
  • hubAngle: hub axis angle, 3-vector (deg), no rotation from spinning
  • nacPos: nacelle position in global coordinates, 3-vector (m). NOTE: AD15 assumes a different hub location than OWENS
  • nacAngle: nacelle axis angle, 3-vector (deg)
  • numTurbines: number of turbines
  • isHAWT: # false: VAWT or cross-flow turbine, true: HAWT

Outputs:

  • none:
OWENSOpenFASTWrappers.transMatMethod

transMat(theta1, theta2, theta3)

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

diff --git a/dev/reference/referencePreComp/index.html b/dev/reference/referencePreComp/index.html index 40a1fcfd..5e37dafb 100644 --- a/dev/reference/referencePreComp/index.html +++ b/dev/reference/referencePreComp/index.html @@ -13,4 +13,4 @@ n_pliesW::Array{Int64,1}, t_lamW::Array{<:Real,1}, tht_lamW::Array{<:Real,1}, mat_lamW::Array{Int64,1})

Calculates span-variant structural properties for composite blades

Inputs

  • chord::Real: section chord length (m)
  • tw_aero_d::Real: section twist angle (deg)
  • tw_prime_d::Real: derivative of section twist angle w.r.t. span location (deg/m)
  • le_loc::Real: leading edge location relative to reference axis (normalized by chord)
  • xnode::Array{<:Real,1}: x airfoil coordinates starting at leading edge traversing upper surface and back around lower surface
  • ynode::Array{<:Real,1}: y airfoil coordinates starting at leading edge traversing upper surface and back around lower surface
  • e1::Array{<:Real,1}: E1
  • e2::Array{<:Real,1}: E2
  • g12::Array{<:Real,1}: G12
  • anu12::Array{<:Real,1}: Nu12
  • density::Array{<:Real,1}: density
  • xsec_nodeU::Array{<:Real,1}: upper surface normalized chord location of sector boundaries
  • n_laminaU::Array{Int64,1}: upper surface number of lamina in each sector
  • n_pliesU::Array{Int64,1}: upper surface number of plies
  • t_lamU::Array{<:Real,1}: upper surface ply thickness (m) for the lamina
  • tht_lamU::Array{<:Real,1}: upper surface orientation (deg) for the lamina
  • mat_lamU::Array{Int64,1}: upper surface material id for the lamina
  • xsec_nodeL::Array{<:Real,1}: lower surface normalized chord location of sector boundaries
  • n_laminaL::Array{Int64,1}: lower surface number of lamina in each sector
  • n_pliesL::Array{Int64,1}: lower surface number of plies
  • t_lamL::Array{<:Real,1}: lower surface ply thickness (m) for the lamina
  • tht_lamL::Array{<:Real,1}: lower surface orientation (deg) for the lamina
  • mat_lamL::Array{Int64,1}: lower surface material id for the lamina
  • loc_web::Array{<:Real,1}: web normalized chord location of sector boundaries
  • n_laminaW::Array{Int64,1}: web number of lamina in each sector
  • n_pliesW::Array{Int64,1}: web number of plies
  • t_lamW::Array{<:Real,1}: web ply thickness (m) for the lamina
  • tht_lamW::Array{<:Real,1}: web orientation (deg) for the lamina
  • mat_lamW::Array{Int64,1}: web material id for the lamina

Outputs:

  • eifbar: ei_flap, Section flap bending stiffness about the YE axis (Nm2)
  • eilbar: ei_lag, Section lag (edgewise) bending stiffness about the XE axis (Nm2)
  • gjbar: gj, Section torsion stiffness (Nm2)
  • eabar: ea, Section axial stiffness (N)
  • eiflbar: s_fl, Coupled flap-lag stiffness with respect to the XE-YE frame (Nm2)
  • sfbar: s_af, Coupled axial-flap stiffness with respect to the XE-YE frame (Nm)
  • slbar: s_al, Coupled axial-lag stiffness with respect to the XE-YE frame (Nm.)
  • sftbar: s_ft, Coupled flap-torsion stiffness with respect to the XE-YE frame (Nm2)
  • sltbar: s_lt, Coupled lag-torsion stiffness with respect to the XE-YE frame (Nm2)
  • satbar: s_at, Coupled axial-torsion stiffness (Nm)
  • z_sc: x_sc, X-coordinate of the shear-center offset with respect to the XR-YR axes (m)
  • y_sc: y_sc, Chordwise offset of the section shear-center with respect to the reference frame, XR-YR (m)
  • ztc_ref: x_tc, X-coordinate of the tension-center offset with respect to the XR-YR axes (m)
  • ytc_ref: y_tc, Chordwise offset of the section tension-center with respect to the XR-YR axes (m)
  • mass: mass, Section mass per unit length (Kg/m)
  • iflap_eta: flap_iner, Section flap inertia about the YG axis per unit length (Kg-m)
  • ilag_zeta: lag_iner, Section lag inertia about the XG axis per unit length (Kg-m)
  • tw_iner_d: twinerd, Orientation of the section principal inertia axes with respect the blade reference plane, θ (deg)
  • zcm_ref: x_cm, X-coordinate of the center-of-mass offset with respect to the XR-YR axes (m)
  • ycm_ref: y_cm, Chordwise offset of the section center of mass with respect to the XR-YR axes (m)
  • n_af_nodes: number of airfoil nodes
  • n_materials: number of materials
  • n_sctU: number of sectors on upper
  • n_sctL: number of sectors on lower
  • nwebin: number of webs
  • n_laminaTotalU: total number of lamina on upper
  • n_laminaTotalL: total number of lamina on lower
  • n_laminaTotalW: total number of lamina on webs
OWENSPreComp.propertiesMethod
properties(pc_input::Input)

Calculates span-variant structural properties for composite blades. Holds all inputs and outputs to properties function in structs

OWENSPreComp.q_barsMethod
q_bars(mat, thp, density, q11, q22, q12, q66)

Arguments

  • mat: material id
  • thp: ply orientation
  • density:
  • q11:
  • q22:
  • q12:
  • q66:

Outputs

  • qbar11:
  • qbar22:
  • qbar12:
  • qbar16:
  • qbar26:
  • qbar66:
  • rho_m:
OWENSPreComp.readcompositesectionMethod

readcompositesection(fname::String,locw::Array{Float64,1})

Reads a composite section input file. Returns locU, nlaminaU, npliesU, tU, thetaU, matidxU, locL, nlaminaL, npliesL, tL, thetaL, matidxL, locW, nlaminaW, npliesW, tW, thetaW, mat_idxW

OWENSPreComp.readmainMethod

readmain("fname::String")

Reads a main OWENSPreComp input file. Returns sloc,leloc,chord,twaero,afshapefile,intstrfile, ibspstn,obspstn,ibchloc,obchloc

OWENSPreComp.readmaterialsFunction

readmaterials(fname = "materials.inp")

reads material properties from OWENSPreComp materials input file fname returns e1,e2,g12,nu12,rho,name

OWENSPreComp.readprofileMethod

readprofile(filename::String, numHeaderlines::Int64, LEtoLE::Bool) Reads precomp profile file. Returns xu, yu, xl, yl

OWENSPreComp.readsectorsfromfileMethod

readsectorsfromfile(f::IOStream, n_sector::Int64)

Reads OWENSPreComp sector. Returns nlamina,nplies, t, theta, mat_idx

OWENSPreComp.seg_infoMethod
seg_info(ch, rle, nseg, nseg_u, nseg_p, xnode_u, ynode_u,
 xnode_l, ynode_l, ndl1, ndu1, loc_web, weby_u, weby_l, n_scts,
-xsec_node)

NOTE: coord transformation from xaf-yaf to yre-zref and seg info

OWENSPreComp.tw_rateMethod
tw_rate(naf, sloc, tw_aero)

Arguments

  • naf: no of blade stations
  • sloc: vector of station locations
  • tw_aero_d: vector of twist distribution in degrees

Outputs

  • th_prime_d: vector of twist rates in degrees
+xsec_node)

NOTE: coord transformation from xaf-yaf to yre-zref and seg info

OWENSPreComp.tw_rateMethod
tw_rate(naf, sloc, tw_aero)

Arguments

  • naf: no of blade stations
  • sloc: vector of station locations
  • tw_aero_d: vector of twist distribution in degrees

Outputs

  • th_prime_d: vector of twist rates in degrees
diff --git a/dev/search_index.js b/dev/search_index.js index 4843742f..4512b27c 100644 --- a/dev/search_index.js +++ b/dev/search_index.js @@ -1,3 +1,3 @@ var documenterSearchIndex = {"docs": -[{"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":"reference/referenceFEA/#OWENSFEA","page":"OWENSFEA","title":"OWENSFEA","text":"","category":"section"},{"location":"reference/referenceFEA/","page":"OWENSFEA","title":"OWENSFEA","text":"CurrentModule = OWENS","category":"page"},{"location":"reference/referenceFEA/#Types-and-functions","page":"OWENSFEA","title":"Types and functions","text":"","category":"section"},{"location":"reference/referenceFEA/","page":"OWENSFEA","title":"OWENSFEA","text":"Modules = [OWENS.OWENSFEA]","category":"page"},{"location":"reference/referenceFEA/#OWENSFEA.BC_struct","page":"OWENSFEA","title":"OWENSFEA.BC_struct","text":"Internal, boundary condition data, see ?FEAModel for pBC\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.ConcNDL1D","page":"OWENSFEA","title":"OWENSFEA.ConcNDL1D","text":"Internal, NodalTerms node number, local dof (diagonal), and value\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.ConcNDL2D","page":"OWENSFEA","title":"OWENSFEA.ConcNDL2D","text":"Internal, NodalTerms node number, local dof1, local dof2, and value\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.DispData","page":"OWENSFEA","title":"OWENSFEA.DispData","text":"Internal, displacement, velocity, and acceleration for each element\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.DispOut","page":"OWENSFEA","title":"OWENSFEA.DispOut","text":"DispOut(elStrain,displ_sp1,displddot_sp1,displdot_sp1)\n\nInternal, displacement, velocity, and acceleration for each element\n\nInputs\n\nelStrain: Not used, should be removed from this struct\n`displ_sp1::Array{<:float}: displacement position for each dof\n`displddot_sp1::Array{<:float}: displacement acceleration for each dof\n`displdot_sp1::Array{<:float}: displacement velocity for each dof\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.El","page":"OWENSFEA","title":"OWENSFEA.El","text":"Internal, see ?Ort and ?SectionPropsArray\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.ElInput","page":"OWENSFEA","title":"OWENSFEA.ElInput","text":"Internal, inputs to Timoshenko element, inputs given by FEAModel struct and mesh\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.ElOutput","page":"OWENSFEA","title":"OWENSFEA.ElOutput","text":"Internal, timoshenko element output matrices\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.ElStorage","page":"OWENSFEA","title":"OWENSFEA.ElStorage","text":"Internal, Timoshenko element matrices\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.ElStrain","page":"OWENSFEA","title":"OWENSFEA.ElStrain","text":"ElStrain(eps_xx_0,eps_xx_z,eps_xx_y,gam_xz_0,gam_xz_y,gam_xy_0,gam_xy_z)\n\nStruct containing element straing\n\nInputs\n\nepsilon_x::float: epsilon_x strain in the x direction\nepsilon_y::float: epsilon_y strain in the y direction\nepsilon_z::float: epsilon_z strain in the z direction\nkappa_x::float: kappa_x curvature in the x direction\nkappa_y::float: kappa_y curvature in the y direction\nkappa_z::float: kappa_z curvature in the z direction\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.FEAModel-Tuple{}","page":"OWENSFEA","title":"OWENSFEA.FEAModel","text":"FEAModel(;analysisType = \"TNB\",\n initCond = [],\n aeroElasticOn = false,\n guessFreq = 0.0,\n airDensity=1.2041,\n gravityOn = true,\n nlOn = false,\n spinUpOn = false,\n outFilename = \"none\",\n RayleighAlpha = 0.0,\n RayleighBeta = 0.0,\n elementOrder = 1,\n joint = [0,0],\n platformTurbineConnectionNodeNumber = 1,\n jointTransform = 0.0,\n reducedDOFList = zeros(Int,2),\n numDOFPerNode = 6,\n numNodes = 0,\n numModes = 20,\n nlParams = 0,\n pBC = 0,\n nodalTerms = 0.0,\n iterationType = \"NR\",\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\nModel inputs for FEA analysis, struct\n\nInputs\n\nanalysisType::string: Newmark Beta time stepping \"TNB\", Dean time stepping \"TD\", modal \"M\", and stiff \"stiff\" (where the forces are just directly mapped, the displacements and strains set to 0 and the structures not run)\ninitCond::Array{<:float}: Initial conditions Nx3 matrix consisting of nodeNumber, local DOF (1-6), and displacement value\naeroElasticOn::Bool: Include simplified flutter calculataions in the timoshenko element matrices\nguessFreq::float: aeroelastic starting guess, only used if aeroElasticOn\nairDensity::float: working fluid density\ngravityOn::Bool orArray{<:float}: vector of 3 or flag to include distributed gravity acceleration (9.81m/s) in the negative z-direction\nnlOn::Bool: flag for solver to calculate deflection induced stiffness changes and associated convergance to the coupled solution\nspinUpOn::Bool: flag to perform a static analysis (warm start) prior to performing modal analysis\noutFilename::string: /path/to/desired/output/filename if it doesn't exist already it is created, if exists, is overwritten\nRayleighAlpha::float: Rayleigh alpha damping used in timoshenko beam damping matrix\nRayleighBeta::float: Rayleigh beta damping used in timoshenko beam damping matrix\nelementOrder::int: order of element: 1 linear, 2 quadratic\njoint::Array{<:float}: jointNumber masterNode slaveNode jointType (0 weld/fixed, 1 pinned, 2 hinge along local \"2\", 3 hinge about local \"1\", 4 hinge along \"3\", 5 rigid bar constraint) jointMass 0.0 jointPsi jointTheta\nplatformTurbineConnectionNodeNumber::int: node at which reaction forces are calculated\njointTransform: not used as an input, is calculated, local transform between dependent and active DOFs for nodes associated with a particular joint\nreducedDOFList::Array{<:int}: not used as an input, is calculated, map of original DOF numbering to reduced DOF numbering\nnumDOFPerNode::int: number of degrees of freedom per node\nnumNodes::int: total number of nodes in the mesh\nnumModes::int: number of modes to calculate\nnlParams::NlParams: optional there in case the Nlparams struct is passed in, should be cleaned up since redundant\nalpha::float64: optional newmark beta alpha parameter,If TD, use 0.25\ngamma::float64: optional newmark beta gamma parameter, if static, use 0. If hydro, use 1.0\npBC::Array{<:float}: Nx3 array consisting of node, local dof, specified displacement value for the boundary condition\nnodalTerms: Concentrated nodal terms, should be replaced with the nodal input data array and the calc done internally\niterationType::string: FEA displacement update calculation, Newton Raphson \"NR\", Direct Iteration \"DI\"\nadaptiveLoadSteppingFlag: Unused, should be removed\ntolerance::float: FEA total mesh unsteady analysis convergence tolerance for a timestep\nmaxIterations: FEA total mesh unsteady analysis convergence max iterations for a timestep\nmaxNumLoadSteps: used in static (steady state) analysis\nminLoadStepDelta: used in static (steady state) analysis\nminLoadStep: used in static (steady state) analysis\nprescribedLoadStep: used in static (steady state) analysis\npredef::Bool: will update the elStorage array if passed into Unsteady() with the nonlinear strain stiffening, to be used for subsequent analyses\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.Mesh","page":"OWENSFEA","title":"OWENSFEA.Mesh","text":"Mesh(nodeNum,numEl,numNodes,x,y,z,elNum,conn,type,meshSeg,structuralSpanLocNorm,structuralNodeNumbers,structuralElNumbers)\n\nStruct with mesh definition\n\nInputs\n\nnodeNum::Array{<:int}: Number mapping of nodes (typically 1:Nnodes)\nnumEl::int: total number of elements\nnumNodes::int: total number of nodes\nx::Array{<:float}: Nodal x position\ny::Array{<:float}: Nodal y position\nz::Array{<:float}: Nodal z position\nelNum::Array{<:int}: Number mapping of elements (typically 1:Nelements)\nconn::Array{<:int}: Nelemx2 connectivity between nodes, gaps between joints (which are defined in the joints)\ntype::Array{<:int}: 0-blade 1-tower 2-strut\nmeshSeg::Array{<:int}: number of nodes within each segment, with segments consisting of tower, blade 1 2 etc, struts\nstructuralSpanLocNorm::Array{<:float}: Should be named heigh loc norm - unitized position along the blade height, used for aeroload mapping\nstructuralNodeNumbers::Array{<:int}: Node numbers associated with blades for aero loads mapping\nstructuralElNumbers::Array{<:int}: Element numbers associated with blades for aero loads mapping\nnonRotating::Array{<:int}: size(Nsections,numNodes) where nsections are the number of sections of the mesh that are non-rotating, like if for some reason you had two towers, or if you had multiple guy wires\nhubNodeNum::int: Node number where the rotating part of the turbine starts, assumes meshing always starts with tower, then blades, etc.\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.NlParams","page":"OWENSFEA","title":"OWENSFEA.NlParams","text":"NlParams(iterationType,adaptiveLoadSteppingFlag,tolerance,maxIterations,maxNumLoadSteps,minLoadStepDelta,minLoadStep,prescribedLoadStep)\n\nSee ?FEAModel\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.NodalTerms","page":"OWENSFEA","title":"OWENSFEA.NodalTerms","text":"Internal, see ?FEAModel for NodalTerms\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.Ort","page":"OWENSFEA","title":"OWENSFEA.Ort","text":"Ort(Psi_d,Theta_d,Twist_d,Length,elNum,Offset)\n\nStruct with element orientation\n\nInputs\n\nPsi_d::Array{<:float}: length NumEl, element rotation about 3 in global FOR (deg) These angles are used to transform from the global coordinate frame to the local element/joint frame via a 3-2 Euler rotation sequence.\nTheta_d::Array{<:float}: length NumEl, element rotation about 2 (deg)\nTwist_d::Array{<:float}: length NumEl, element twist (deg)\nLength::Array{<:float}: length NumEl, element length (m)\nelNum::Array{<:float}: Element number the other arrays are associated with\nOffset::Array{<:float}: hub frame coordinate of node 1 of the element\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.ROM","page":"OWENSFEA","title":"OWENSFEA.ROM","text":"Internal, ROM data\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.SectionPropsArray","page":"OWENSFEA","title":"OWENSFEA.SectionPropsArray","text":"SectionPropsArray(ac,twist,rhoA,EIyy,EIzz,GJ,EA,rhoIyy,rhoIzz,rhoJ,zcm,ycm,a,EIyz,alpha1,alpha2,alpha3,alpha4,alpha5,alpha6,rhoIyz,b,a0,aeroCenterOffset,xaf,yaf)\n\nStruct with element sectional properties, each component is a 1x2 array with distributed properties\n\nInputs\n\nac::Array{<:float}: aerodynamic center, used in flutter approximation\ntwist::Array{<:float}: element twist (rad)\nrhoA::Array{<:float}: rho * A in standard SI units\nEIyy::Array{<:float}: E * Iyy\nEIzz::Array{<:float}: E * Izz\nGJ::Array{<:float}: G * J\nEA::Array{<:float}: E * A\nrhoIyy::Array{<:float}: rho * Iyy\nrhoIzz::Array{<:float}: rho * Izz\nrhoJ::Array{<:float}: rho * J\nzcm::Array{<:float}: z location of center of mass\nycm::Array{<:float}: y location of center of mass\na::Array{<:float}: possibly lift slope\nEIyz::Array{<:float}: E * Iyz\nalpha1::Array{<:float}: #This is always 0 in the element file, and it is unclear what it is used for since I can't find it being used in the code\nalpha2::Array{<:float}: doesn't appear to be used\nalpha3::Array{<:float}: doesn't appear to be used\nalpha4::Array{<:float}: doesn't appear to be used\nalpha5::Array{<:float}: doesn't appear to be used\nalpha6::Array{<:float}: doesn't appear to be used\nrhoIyz::Array{<:float}: rho * Iyz\nb::Array{<:float}: used in flutter approximation, possibly a chord or thickness value\na0::Array{<:float}: zero lift angle of attack, used in flutter approximation\naeroCenterOffset::Array{<:float}: doesn't appear to be used\nxaf::Array{<:float}: x airfoil coordinates (to scale)\nyaf::Array{<:float}: y airfoil coordinates (to scale)\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.TimeInt","page":"OWENSFEA","title":"OWENSFEA.TimeInt","text":"Internal, time integration terms\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.ConcMassAssociatedWithElement-NTuple{5, Any}","page":"OWENSFEA","title":"OWENSFEA.ConcMassAssociatedWithElement","text":"ConcMassAssociatedWithElement(conn,joint,nodalMassTerms,nodalStiffnessTerms,nodalLoads)\n\nCompiles concentrated mass, stiffness, and load associated with a node from both ndl and joint files. The mod* variables are passed back with these terms removed to prevent duplicate application of shared nodal terms between elements\n\n#Input\n\nconn connectivity list for element\njoint joint array for nodal terms\nnodalMassTerms listing of concentrated nodal mass terms\nnodalStiffnessTerms listing of concentrated nodal stiffness terms\nnodalLoads listing of concentrated nodal loads terms\n\n#Output\n\nmass array of concentrated mass associated with element\nstiff array of concentrated stiffness associated with element\nload array of concentrated loads associated with element\nmodJoint modified joint object removing nodal terms that have/will be applied to the element calculations\nmodNodalMassTerms modified nodal mass object removing nodal terms that have/will be applied to the element calculations\nmodalStiffnessTerms modified nodal stiffness object removing nodal terms that have/will be applied to the element calculations\nmodNodalLoads modified nodal loads object removing nodal terms that have/will be applied to the element calculations\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.ModalOutput-NTuple{6, Any}","page":"OWENSFEA","title":"OWENSFEA.ModalOutput","text":"writeOutput(freq,damp,phase1,phase2,imagComponentSign,fid)\n\nInternal, writes an output file and or formats an output for modal analysis.\n\n#Input\n\nfreq: array of modal frequencies\ndamp: array of modal damping ratios\nphase1: array of in phase mode shapes\nphase2: array of out of phase mode shapes\nimagComponentSign: array of sign of imaginary components\nfid: file identifier for output\n\n#Output\n\nfreqSorted: array of sorted(by frequency) modal frequencies\ndampSorted: array of sorted(by frequency) modal damping ratios\nimagCompSignSorted: array of sorted(by frequency) of imaginarycomponentSign array\nU_x_0: see ?Modal outputs\nU_y_0: see ?Modal outputs\nU_z_0: see ?Modal outputs\ntheta_x_0: see ?Modal outputs\ntheta_y_0: see ?Modal outputs\ntheta_z_0: see ?Modal outputs\nU_x_90: see ?Modal outputs\nU_y_90: see ?Modal outputs\nU_z_90: see ?Modal outputs\ntheta_x_90: see ?Modal outputs\ntheta_y_90: see ?Modal outputs\ntheta_z_90: see ?Modal outputs\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.adaptiveLoadStepping-NTuple{4, Any}","page":"OWENSFEA","title":"OWENSFEA.adaptiveLoadStepping","text":"Internal, performs updates a loadstep adaptively, see ?updateLoadStep\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.applyBC-NTuple{4, Any}","page":"OWENSFEA","title":"OWENSFEA.applyBC","text":"applyBC(Kg,Fg,BC,u,iterationType,numDofPerNode)\n\nInternal, applies boundary conditions to the stiffness matrix and load vector for a static analysis.\n\n#Input\n\nKg assembled global stiffness matrix\nFg assembled global load vector\nBC struct of boundary condition information\nu global displacement vector\niterationType for nonlinear analysis, not used in BLAST\nnumDofPerNode number of degrees of freedom per node\n\n#Output\n\nKg global stiffness matrix with boundary conditions\nFg global load vector with boundary condition\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.applyBCModal-Tuple{Any, Any, Any}","page":"OWENSFEA","title":"OWENSFEA.applyBCModal","text":"applyBCModal(K,BC,numDofPerNode)\n\nInternal, applies boundary conditions to a system matrix for modal analysis\n\nInputs\n\nK: assembled global system matrix\nBC: struct of boundary condition information\nnumDofPerNode: number of degrees of freedom per node\n\nOutputs:\n\nKnew global system matrix with boundary conditions\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.applyConcentratedTerms-Tuple{Any, Any}","page":"OWENSFEA","title":"OWENSFEA.applyConcentratedTerms","text":"applyConcentratedTerms(numNodes, numDOFPerNode; filename=\"none\",data=[1 \"M6\" 1 1 0.0], jointData=[])\n\nInternal, applies 6x6 concentrated nodal terms from user input.\n\n#Input\n\nfilename: string containing nodal terms filename\ndata: Nx5 or Nx4 array matching general [1 \"M6\" 1 1 0.0] or diagonal only [1 \"M\" 1 0.0] aligning with node, Type, dof, value, where type is M,C,K, or F\n\n#Output\n\nnodalTerms::NodalTerms: see ?NodalTerms object containing concentrated nodal data\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.applyConstraints-Tuple{Any, Any}","page":"OWENSFEA","title":"OWENSFEA.applyConstraints","text":"Internal, this function transforms a matrix by the transformation matrix to enforce joint constraints\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.applyConstraintsVec-Tuple{Any, Any}","page":"OWENSFEA","title":"OWENSFEA.applyConstraintsVec","text":"Internal, this function transforms a vector by the transformation matrix to enforce joint constraints\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.assembly!-NTuple{7, Any}","page":"OWENSFEA","title":"OWENSFEA.assembly!","text":"assembly(Ke,Fe,conn,numNodesPerEl,numDOFPerNode,Kg,Fg)\n\nInternal, assembles the element matrix and load vector into the global system of equations\n\n#Input\n\nKe: element matrix\nFe: element vector\nconn: element connectivity\nnumNodesPerEl: number of nodes per element\nnumDofPerNode: number of degrees of freedom per node\nKg: global system matrix\nFg: global load vector\n\n#Output\n\nKg: global system matrix with assembled element\nFg: global load vector with assembled element\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.assemblyMatrixOnly-NTuple{5, Any}","page":"OWENSFEA","title":"OWENSFEA.assemblyMatrixOnly","text":"assemblyMatrixOnly(Ke,conn,numNodesPerEl,numDOFPerNode,Kg)\n\nInternal, assembles the element matrix into the global system of equations\n\nInputs\n\nKe: element matrix\nconn: element connectivity\nnumNodesPerEl: number of nodes per element\nnumDofPerNode: number of degrees of freedom per node\nKg: global system matrix\n\nOutputs:\n\nKg: global system matrix with assembled element\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.autoCampbellDiagram-NTuple{6, Any}","page":"OWENSFEA","title":"OWENSFEA.autoCampbellDiagram","text":"frequencies = autoCampbellDiagram(FEAinputs,mymesh,myel,system,assembly; minRPM = 0.0, maxRPM = 40.0, NRPM = 9, # int vtksavename = nothing, saveModes = [1,3,5], #must be int saveRPM = [1,3,5], #must be int mode_scaling = 500.0, )\n\nAutomated Campbell Diagram Generator, this function runs the model with centrifugal stiffening for the specified RPM levels. If FEAinputs.analysisType == \"GX\" and vtksavename are specified, it will output paraview mode shape files at the specified save name. \n\n#Inputs\n\nFEAinputs::OWENSFEA.FEAModel: The FEA modeling options\nmymesh::OWENSFEA.Mesh: a previously generated turbine mesh\nmyel::OWENSFEA.El: the element properties associated with that mesh\nsystem::GXBeam.System: the converted GXBeam system from the mesh and el\nassembly::GXBeam.AssemblyState: the converted GXBeam assembly from the mesh and el\nsections::Array{Float64, 3}: the 3D point cloud to be converted to VTK format\nminRPM::Float64: minimum RPM to be run, e.x. 0.0\nmaxRPM::Float64: maximum RPM to be run e.x. 40.0\nNRPM::Int64: number of linear discretizations of RPM e.x. 9 must be int\nvtksavename::string: filename (with path if desired) of the VTK outputs if GX. Set to \"nothing\" to not save.\nsaveModes::Array{Int64}: The modes to save in the VTK outputs e.x. [1,3,5] must be int\nsaveRPM::Array{Int64}: The RPMs to save in the VTK outputs e.x. [1,3,5] must be int\nmode_scaling::Float64: The mode scaling in the VTK outputs e.x. 500.0\n\n#Outputs\n\nfrequency::Array{Float64}: The output modal frequencies\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calcUnorm-Tuple{Any, Any}","page":"OWENSFEA","title":"OWENSFEA.calcUnorm","text":"This function calculates a relative norm between two vectors: unew and uold\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateBCMap-NTuple{4, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateBCMap","text":"calculateBCMap(numpBC,pBC,numDofPerNode,reducedDofList)\n\nInternal, creates a boundary condition map between full and reduced dof listing as a result of constraints.\n\n#Input\n\nnumpBC number of boundary conditions\npBC array of boundary condition data\nnumDofPerNode number of degrees of freedom per node\nreducedDofList array of reduced DOF numbering\n\n#Output\n\nelStorage map for boundary conditions between full and reduced dof list\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateElement1!-NTuple{5, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateElement1!","text":"Internal, general routine to calculate an element matrix\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateElementMass-NTuple{14, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateElementMass","text":"Internal, calculates element mass properties.\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateLambda-Tuple{Any, Any, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateLambda","text":"calculateLambda(theta1,theta2,theta3)\n\nThis function calculates a transformation matrix to transform the element degree of freedom vector (12 DOFs) from the hub frame to the element frame. The transformation matrix is constructed via the direction cosine matrices of a 3-2-1 Euler rotation sequence.\n\n#Input *theta1::float: angle (rad) of rotation for 1st rotation of 3-2-1 sequence *theta2::float: angle (rad) of rotation for 2nd rotation of 3-2-1 sequence *theta3::float: angle (rad) of rotation for 3rd rotation of 3-2-1 sequence\n\n#Output *lambda::Array{<:float}: 12 x 12 transformation matrix\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateLoadVecFromDistForce-NTuple{10, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateLoadVecFromDistForce","text":"calculateLoadVecFromDistForce(elementOrder,x,xloc,twist,sweepAngle,coneAngle,rollAngle,extDistF2Node,extDistF3Node,extDistF4Node)\n\nTakes in a global 6dof distributed force at two nodal points and returns the 6dof force in the element FOR\n\n#Input\n\nelementOrder:::\nx::Array{<:float}: mesh x-position\nxloc::Array{<:float}: local x-position [0 elLength]\ntwist::Array{<:float}: element twist angle (rad)\nsweepAngle::Array{<:float}: element sweep angle (rad)\nconeAngle::Array{<:float}: element cone angle (rad)\nrollAngle::Array{<:float}: element roll angle (rad)\nextDistF2Node::Array{<:float}: turbine Tangential force\nextDistF3Node::Array{<:float}: turbine Normal force\nextDistF4Node::Array{<:float}: turbine M25 moment\n\n#Output\n\nFe::Array{float}: 6x1 Force on element in element FOR\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateROM-NTuple{7, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateROM","text":"calculateROM(model,mesh,el,displ,omegaVec,omegaDotVec,elStorage,countedNodes)\n\nThis function calculates a reduced order model for a conventional structural dynamics system (parked, non-rotating)\n\n#Input\n\nmodel object containing model data\nmesh object containing mesh data\nel object containing elementdata\ndispl displacement vector\nrbData: vector containing rigid body displacement, velocity, and acceleration\nelStorage object containing stored element data\ncountedNodes prevents applied nodal terms from double counting\n\n#Output\n\nrom object containing reduced order model data\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateROMGyric-NTuple{8, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateROMGyric","text":"calculateROMGyric(feamodel,mesh,el,displ,omegaVec,omegaDotVec,elStorage,rom0,countedNodes)\n\nCalculates a reduced order feamodel with rotational/ rigid body motion effects\n\n#Input\n\nfeamodel: object containing feamodel data\nmesh: object containing mesh data\nel: object containing elementdata\ndispl: displacement vector\nrbData: vector of hub frame accel (1-3), angular velocity components (4-6), and angular accleration (7-9)\nelStorage: object containing stored element data\nrom0: object containing parked/conventional reduced order feamodel\ncountedNodes: prevents applied nodal terms from double counting\n\n#Output\n\nrom: object containing reduced order feamodel data\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateReactionForceAtNode-NTuple{13, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateReactionForceAtNode","text":"calculateReactionForceAtNode(nodeNum,model,mesh,el,elStorage,timeInt,dispData,displ_iter,rbData,Omega,OmegaDot,CN2H,countedNodes)\n\nInternal, calculates the reaction force at a node by post processing all element associated with a node through connectivity or joint constraints.\n\n#Input\n\nnodeNum: node number joint constraints are desired at\nmodel: object containing model data\nmesh: object containing mesh data\nelStorage: object containing stored element data\nel: object containing element data\ntimeInt: object containing time integration parameters\ndispData: object containing displacement data\ndispl_iter: converged displacement solution\nrbData: vector containing rigid body displacement, velocity, and acceleration\nOmega: rotor speed (Hz)\nOmegaDot: rotor acceleratin (Hz)\nCN2H: transformation matrix from inertial frame to hub frame\ncountedNodes: prevents nodal terms from being double counted\n\n#Output\n\ncummulativeForce: vector containing reaction force at nodeNum\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateReducedDOFVector-Tuple{Any, Any, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateReducedDOFVector","text":"Internal, searches over all DOFs in a structural model and determines and returns \"dofVector\" containing only unconstrained DOFs\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateShapeFunctions-Tuple{Any, Any, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateShapeFunctions","text":"calculateShapeFunctions(elementOrder,xi,x)\n\nThis function calculates the Lagrange shape function, shape function derivative, and Jacobian to map between the local element domain and physical length of the element. The shape function derivative is defined with respect to the physical length domain. The shape functions may be linear or quadratic in order.\n\n#Input\n\nelementOrder order of element: 1 linear, 2 quadratic\nxi guass point values to evaluate shape functions at\nx nodal coordinates in physical length domain\n\n#Output\n\nN shape function value at specified gauss points\np_N_x shape function derivative w.r.t physical length domain at specified gauss points\nJac Jacobian for mat between local element domain and physical length domain.\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateStrainForElements-NTuple{8, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateStrainForElements","text":"Internal calculates element strains\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateStructureMassProps-Tuple{Any}","page":"OWENSFEA","title":"OWENSFEA.calculateStructureMassProps","text":"calculateStructureMassProps(elStorage)\n\nThis function caclulates structural mass properties of the finite element mesh (mass, moment of inertia, mass center) about the origin of the mesh coordinate system.\n\n#Input\n\nelStorage::ElStorage see ?ElStorage, object containing arrays of stored element information\n\n#Output\n\nstructureMass::float mass of structure\nstructureMOI::float moment of inertia tensor of structgure\nstructureMassCenter::float center of mass of structure\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateTimoshenkoElementInitialRun-NTuple{14, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateTimoshenkoElementInitialRun","text":"calculateTimoshenkoElementInitialRun(elementOrder,modalFlag,xloc,sectionProps,sweepAngle,coneAngle,rollAngle,aeroSweepAngle,x,y,z,concMassFlag,concMass,Omega)\n\nInternal, see ?initialElementCalculations, performs initial element calculations and stores them for later use and efficiency gains.\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateTimoshenkoElementNL-Tuple{Any, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateTimoshenkoElementNL","text":"calculateTimoshenkoElementNL(input,elStorage;predef=nothing)\n\nInternal, performs nonlinear element calculations.\n\n#Inputs\n\ninput::ElInput: see ?ElInput\nelStorage::ElStorage: see ?ElStorage\npredef::Bool: optional, if true, mutates ElStorage to include the nonlinear strain stiffening\n\n#Outputs\n\nElOutput: see ?ElOutput\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateTimoshenkoElementNLSS-Tuple{Any}","page":"OWENSFEA","title":"OWENSFEA.calculateTimoshenkoElementNLSS","text":"calculateTimoshenkoElementNLSS(elinput)\n\nPerforms selective nonlinear element calculations. Only stiffness matrix contributions are evaluate. No other calculations are performed to facilitate efficiency gains.\n\n#Input\n\nelinput: object containing element input\n\n#Output\n\neloutput: object containing element data\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateTimoshenkoElementStrain-NTuple{9, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateTimoshenkoElementStrain","text":"calculateTimoshenkoElementStrain(elementOrder,nlOn,xloc,sectionProps,sweepAngle,coneAngle,rollAngle,aeroSweepAngle,disp)\n\nInternal, calculates element strain for a Timoshenko element\n\n#Outputs\n\nElStrain: See ?ElStrain\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateVec1!-NTuple{4, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateVec1!","text":"Internal, general routine to calculate an element vector\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.constructReducedDispVecFromEigVec-Tuple{Any, Any, Any}","page":"OWENSFEA","title":"OWENSFEA.constructReducedDispVecFromEigVec","text":"constructReducedDispVecFromEigVec(vec1,reducedDOFList,BC)\n\nInternal, This function takes the original mode shape and modifies it to account for boundary conditions\n\nInputs\n\nvec1:\nreducedDOFList:\nBC:\n\nOutputs:\n\nvec1Red:\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.constructReducedDispVectorMap-NTuple{6, Any}","page":"OWENSFEA","title":"OWENSFEA.constructReducedDispVectorMap","text":"Internal, creates a map of unconstrained DOFs between a full listing and reduced listing (after constraints have been applied)\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.createJointTransform-Tuple{Any, Any, Any}","page":"OWENSFEA","title":"OWENSFEA.createJointTransform","text":"createJointTransform(joint,numNodes,numDofPerNode)\n\nInternal, calculates the JointTransform of a structural system.\n\n#Input\n\njoint: object containing joint data\nnumModes: number of nodes in mesh\nnumDofPerNode: number of degrees of freedom per node\n\n#Output\n\njointTransform: joint transformation matrix\nreducedDOF: map of original DOF numbering to reduced DOF numbering\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.createTda-NTuple{6, Any}","page":"OWENSFEA","title":"OWENSFEA.createTda","text":"Internal, creates a constraint transformation matrix for a single joint. Tda is this matrix, dDOF contains a listing of dependent global DOFs associated with this joint, and aDOF contains a listing of active global DOFs associated with this joint.\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.determineActiveDofsFromSlaveNode-Tuple{Any, Any}","page":"OWENSFEA","title":"OWENSFEA.determineActiveDofsFromSlaveNode","text":"Internal, determines the local master DOF associated with a local slave DOF.\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.extractFreqDamp-NTuple{7, Any}","page":"OWENSFEA","title":"OWENSFEA.extractFreqDamp","text":"extractFreqDamp(val,vec,numDOFPerNode,jointTransform,reducedDOFList,BC,analysisType)\n\nInternal, calculates the eigenvalues and vectors of a structural dynamic system\n\nInputs\n\nval: eigenvalue\nvec: eigenvector\nnumDOFPerNode: number of degrees of freedom per node\njointTransform: joint transformation matrix from reduced to full DOF list\nreducedDOFList: listing of reduced DOFs\nBC: boundary condition object containing boundary condition info\nanalysisType: analysis type\n\nOutputs:\n\nfreq: modal frequency\ndamp: modal damping\nphase1: in phase mode shape (real part of mode shape)\nphase2: out of phase mode shape (imaginary part of mode shape)\nsortedModes: total, complex mode shape\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.extractdaInfo-Tuple{Any, Any, Any}","page":"OWENSFEA","title":"OWENSFEA.extractdaInfo","text":"Internal, gets the total number of DOFs in the model, active number of DOFs in the model, and a list of slave DOFs that will be eliminated by joint constraints.\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.findElementsAssociatedWithNodeNumber-Tuple{Any, Any, Any}","page":"OWENSFEA","title":"OWENSFEA.findElementsAssociatedWithNodeNumber","text":"findElementsAssociatedWithNodeNumber(nodeNum,conn,jointData)\n\nInternal, finds elements associated with a node number through mesh connectivity or joint constraints\n\n#Input\n\nnodeNum node number joint constraints are desired at\nconn object containing mesh connectivity\njointData object containing joint information\n\n#Output\n\nelList array containing a list of element numbers associated with nodeNum\nlocalNode array containing the local node number that correspond to nodeNum in the list of associated elements\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.getElementConcTerms!-NTuple{7, Any}","page":"OWENSFEA","title":"OWENSFEA.getElementConcTerms!","text":"Internal, gets the concentrated terms without double counting\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.getGP-Tuple{Any}","page":"OWENSFEA","title":"OWENSFEA.getGP","text":"getGP(numGP)\n\nInternal, defines gauss point coordinates in a local element frame and the associated weights for Gaussian quadrature numerical integration.\n\n#Input\n\nnumGP: number of quad points used for integration\n\n#Output\n\nxi: list of quad point coordinates in local element frame\nweight: associated weights for quad point coordinate\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.getNodeMaps-NTuple{7, Any}","page":"OWENSFEA","title":"OWENSFEA.getNodeMaps","text":"Internal, gets node mapping\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.initialElementCalculations-Tuple{Any, Any, Any}","page":"OWENSFEA","title":"OWENSFEA.initialElementCalculations","text":"initialElementCalculations(feamodel,el,mesh)\n\nperforms initial element calculation for use later in analysis for efficiency gains.\n\nInputs\n\nfeamodel::FEAmodel: see ?Feamodel\nel::El: see ?El\nmesh::Mesh: see ?Mesh\n\nOutputs:\n\nelStorage:ElStorage: see ?ElStorage\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.interpolateVal-Tuple{Any, Any}","page":"OWENSFEA","title":"OWENSFEA.interpolateVal","text":"Internal, linear interpolation\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.linearAnalysisModal-NTuple{6, Any}","page":"OWENSFEA","title":"OWENSFEA.linearAnalysisModal","text":"Internal, see ?modal\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.makeBCdata-NTuple{5, Any}","page":"OWENSFEA","title":"OWENSFEA.makeBCdata","text":"makeBCdata(pBC,numNodes,numDofPerNode,reducedDOFList,jointTransform)\n\nInternal, usese the pBC matrix and calculates/stores boundary condition data\n\n#Input\n\npBC See ?FEAModel.pBC\nnumNodes number of nodes in structural model\nnumDofPerNode number of degrees of freedom per node\nreducedDOFList joint transformation matrix from reduced to full DOF list\njointTransform listing of reduced DOFs\n\n#Output\n\nBC:BC_struct see ?BC_struct\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.mapMatrixNonSym-Tuple{Any}","page":"OWENSFEA","title":"OWENSFEA.mapMatrixNonSym","text":"Internal, function to form total stifness matrix and transform to desired DOF mapping\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.mapMatrixNonSym2-NTuple{36, Any}","page":"OWENSFEA","title":"OWENSFEA.mapMatrixNonSym2","text":"Internal, function to form total stifness matrix and transform to desired DOF mapping\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.mapVector-Tuple{Any}","page":"OWENSFEA","title":"OWENSFEA.mapVector","text":"Internal, forms total force vector and transform to desired DOF mapping\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.modal-Tuple{Any, Any, Any}","page":"OWENSFEA","title":"OWENSFEA.modal","text":"modal(feamodel,mesh,el;Omega=0.0,displ=zeros(mesh.numNodes*6),OmegaStart=0.0,returnDynMatrices=false)\n\nModal analysis\n\nInputs\n\nfeamodel::FEAModel: see ?FEAModel\nmesh::Mesh: see ?Mesh\nel::El: see ?El\nOmega::float: Rotational rate in Hz\ndispl::Array{<:float}: zeros(mesh.numNodes*6) initial (warm start) displacements for each dof\nOmegaStart::float: rotor speed (Hz) from previous analysis if stepping through various rotor speeds, may be useful in load stepping\nreturnDynMatrices::Bool: Flag to save linearized K/C/M matrices for the design\n\nOutputs:\n\nfreq::Array{<:float}: sorted modal frequencies (Hz)\ndamp::Array{<:float}: sorted modal damping\nimagCompSign::Array{<:float}: sign of imaginary component of eigenvalues\nU_x_0::Array{<:float}: NnodesxNmodes in-phase mode shape x\nU_y_0::Array{<:float}: NnodesxNmodes in-phase mode shape y\nU_z_0::Array{<:float}: NnodesxNmodes in-phase mode shape z\ntheta_x_0::Array{<:float}: NnodesxNmodes in-phase mode shape rotation about x\ntheta_y_0::Array{<:float}: NnodesxNmodes in-phase mode shape rotation about y\ntheta_z_0::Array{<:float}: NnodesxNmodes in-phase mode shape rotation about z\nU_x_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape x\nU_y_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape y\nU_z_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape z\ntheta_x_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape rotation about x\ntheta_y_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape rotation about y\ntheta_z_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape rotation about z\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.reducedOrderModel-NTuple{5, Any}","page":"OWENSFEA","title":"OWENSFEA.reducedOrderModel","text":"reducedOrderModel(elStorage,feamodel,mesh,el,displ)\n\nThis function executes a reduced order model analysis.\n\n#Input\n\nelStorage object containing stored element matrices\nfeamodel object containing feamodel information\nmesh object containing mesh information\nel object containing element information\ndispl displacement vector for use in pre-stressed analysis\n\n#Output\n\nrom object containing a reduced order feamodel\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.setInitialConditions-Tuple{Any, Any, Any}","page":"OWENSFEA","title":"OWENSFEA.setInitialConditions","text":"setInitialConditions(initCond,u,numDOFPerNode)\n\nsets initial conditions\n\n#Input\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\nu: displacement vector for each dof\nnumDOFPerNode: number of degrees of freedom per node\n\n#Output\n\nu: displacement vector modified for initial conditions\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.setPrescribedConditions-Tuple{Any}","page":"OWENSFEA","title":"OWENSFEA.setPrescribedConditions","text":"prescribed_conditions = setPrescribedConditions(mesh;pBC=zeros(2,2),Fexternal=[],ForceDof=[])\n\nInternal, maps OWENS boundary conditions and applied forces to the GXBeam PrescribedConditions input\n\n#Input\n\nmesh::FEAModel.mesh: Input turbine mesh\npBC::FEAModel.BC.pBC: Boundary conditions\nFexternal::Array{Float64}: Applied forces to the mesh, 1D array ordered node 1 Dof 1-6, node 2 Dof 1-2, etc.\nForceDof::Array{Float64}: Degrees of freedom aligned with Fexternal, currently is unused, assumes Fexternal uses the full DOF array.\n\n#Output\n\nprescribed_conditions::GXBeam.PrescribedConditions: the boundary conditions/applied forces used by GXBeam see ?GXBeam.PrescribedConditions\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.staticAnalysis-NTuple{7, Any}","page":"OWENSFEA","title":"OWENSFEA.staticAnalysis","text":"staticAnalysis(feamodel,mesh,el,displ,Omega,OmegaStart,elStorage; reactionNodeNumber=1, OmegaDot=0.0, Fdof=[1], Fexternal=[0.0])\n\nThis function performs a static analysis and returns displacement values and a flag denoting successful/unsuccessful analysis\n\n#Inputs\n\nfeamodel: object containing feamodel information\nmesh: object containing mesh information\nel: object containing element information\ndispl: displacement vector for use in pre-stressed analysis\nOmega: rotor speed (Hz)\nOmegaStart: rotor speed (Hz) from previous analysis if stepping through various rotor speeds, may be useful in load stepping\nelStorage: previously calculated element system matrices\nreactionNodeNumber::Int: optional, node at which to calculate reaction force\nOmegaDot::Float: Steady State Rotational Acceleration\nFdof::Array{<:Int}: Global Dofs where Fexternal is acting, where max dof = nelem*ndof\nFexternal{<:Float}: Forces or moments associated with the Fdofs specified\n\n#Outputs\n\ndispl: vector of displacemetns\nstaticAnalysisSuccessful: boolean flag denoting successful static analysis\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.structuralDynamicsTransient-NTuple{13, Any}","page":"OWENSFEA","title":"OWENSFEA.structuralDynamicsTransient","text":"structuralDynamicsTransient(feamodel,mesh,el,dispData,Omega,OmegaDot,time,delta_t,elStorage,Fexternal,Fdof,CN2H,rbData)\n\nperforms unsteady structural dynamics analysis\n\nInputs\n\nfeamodel::: object containing feamodel data\nmesh::: object containing mesh data\nel::: object containing element data\ndispData::: object containing displacement data\nOmega::: rotor speed (Hz)\nOmegaDot::: rotor acceleratin (Hz)\ntime::: current simulation time\ndelta_t::: time step size\nelStorage::: object containing stored element data\nFexternal::: vector containing external force values\nFdof::: vector containing global DOF numbering associated with external force values\nCN2H::: transformation matrix from inertial frame to hub frame\nrbData::: vector containing rigid body displacement, velocity, and acceleration\n\nOutputs:\n\nelStrain::ElStrain: see ?ElStrain strain for element at end of time step\ndispOut::DispOut: see ?DispOut displacement data at end of time step\nFReaction_sp1::: vector containing reaction force at turbine base at end of time step\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.structuralDynamicsTransientROM-NTuple{14, Any}","page":"OWENSFEA","title":"OWENSFEA.structuralDynamicsTransientROM","text":"structuralDynamicsTransientROM(feamodel,mesh,el,dispData,Omega,OmegaDot,time,delta_t,elStorage,rom,Fexternal,Fdof,CN2H,rbData)\n\nPerforms transient structural dynamics analysis using a reduced order feamodel (ROM).\n\n#Input\n\nfeamodel: object containing feamodel data\nmesh: object containing mesh data\nel: object containing element data\ndispData: object containing displacement data\nOmega: rotor speed (Hz)\nOmegaDot: rotor acceleratin (Hz)\ntime: current simulation time\ndelta_t: time step size\nelStorage: object containing stored element data\nrom: object containing reduced order feamodel represnetation\nFexternal: vector containing external force values\nFdof: vector containing global DOF numbering associated with external force values\nCN2H: transformation matrix from inertial frame to hub frame\nrbData: vector containing rigid body displacement, velocity, and acceleration\n\n#Output\n\ndispOut: object containing displacement data at end of time step\nFReaction_sp1: vector containing reaction force at turbine base at end of time step\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.timeIntegrateSubSystemEff-NTuple{8, Any}","page":"OWENSFEA","title":"OWENSFEA.timeIntegrateSubSystemEff","text":"timeIntegrateSubSystemEff(M,K,C,F,timeInt,u,udot,uddot)\n\nPerforms integration of a system using the Newmark-Beta method(constant-average acceleration sceheme). The integration parameters are calculated before hand and store in the timeInt object.\n\n#Input\n\nM system mass matrix\nK system sttiffness matrix\nC system damping matrix\nF system force vector\ntimeInt object containing time integraton parameters\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/referenceFEA/#OWENSFEA.updateLoadStep-NTuple{7, Any}","page":"OWENSFEA","title":"OWENSFEA.updateLoadStep","text":"updateLoadStep(iterationCount,loadStepParams,loadStep,loadStepPrev,loadStepCount,displCopy,displ)\n\nUpdates the load stepping parameter whether through means of adaptive loadstepping or a specified load step profile.\n\n#Input\n\niterationCount number of iterations for current load step\nloadStepParams struct containing load step parameters\nloadStep load step value for current load step\nloadStepPrev load step value for previous load st ep\nloadStepCount number of load steps performed up to this point\ndisplPrev converged displacement vector form previous load step\ndispl displacement vector at current load step\n\n#Output\n\nloadStep new load step value\nloadStepPrev load step value for previous load step\ndispl most up to date displacement vector in load stepping procedure\ndisplPrev displacement vector at end of previous load step\nstaticAnalysisSuccessful boolean flag, true if load step was completed successfully\nstaticAnalysisComplete boolean flag, true if analysis is complete\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers","text":"","category":"section"},{"location":"reference/referenceOpenFASTWrappers/","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers","text":"CurrentModule = OWENS","category":"page"},{"location":"reference/referenceOpenFASTWrappers/#Types-and-functions","page":"OWENSOpenFASTWrappers","title":"Types and functions","text":"","category":"section"},{"location":"reference/referenceOpenFASTWrappers/","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers","text":"Modules = [OWENS.OWENSOpenFASTWrappers]","category":"page"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.Environment","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.Environment","text":"Environment(rho::TF1, dt::TF2, steplast::TAI) Environment(rho) = Environment(rho)\n\nContains specications for turbine environment/operating conditions as well as some backend memory\n\nInputs\n\nrho::TF1: Working fluid density (kg/m^3)\ndt::TF2: timestep for ADI\nnum_channels::TI1: number of output channels from AD15\nsteplast::TAI: prior simulation step index, used for unsteady wake propogation\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.Structure","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.Structure","text":"Structure\n\nContains the position and orientation info passed to AD15. These positions are all in global and include the turbine RefPos.\n\nInputs:\n\nhubPos::TAF1:\nhubOrient::TAF2:\nhubVel::TAF3:\nhubAcc::TAF4:\nnacPos::TAF5:\nnacOrient::TAF6:\nnacVel::TAF7:\nnacAcc::TAF8:\nrootPos::TAF9:\nrootOrient::TAF10:\nrootVel::TAF11:\nrootAcc::TAF12:\nmeshPos::TAF13:\nmeshOrient::TAF14:\nmeshVel::TAF15:\nmeshAcc::TAF16:\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.adiCalcOutput-Tuple{Any, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.adiCalcOutput","text":"adiCalcOutput( )\n\ncalls AeroDynInflowC_CalcOutput to calculate resulting loads. Call this only after SetRotorMotion on all rotors/turbines.\n\nInputs:\n\ntime::c_double: current timestep\n\nnum_channels::int: number of output channels\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.adiGetRotorLoads-Tuple{Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.adiGetRotorLoads","text":"adiGetRotorLoads(iturb; )\n\nGets the loads for a single turbine rotor\n\nInputs:\n\niturb::int: required, current turbine number\n\nOutputs:\n\nmeshFrcMom::Array(float): loads from ADI at mesh nodes\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.adiInit-Tuple{Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.adiInit","text":"adiInit( output_root_name ; )\n\ncalls aerodyninflowinit to initialize AeroDyn and InflowWind together\n\nInputs:\n\nad_input_file_passed::int: flag to indicate the AD15 input file is passed as a string 0=false, 1=true (set to false if passing input file name instead, NOT SUPPORTED YET)\nad_input_file::string: name of input file for AD15 – this is read by julia and passed to AD15\nifw_input_file_passed::int: flag to indicate the InflowWind input file is passed as a string 0=false, 1=true (set to false if passing input file name instead, NOT SUPPORTED YET)\nifw_input_file::string: name of input file for InflowWind – this is read by julia and passed to InflowWind\ngravity::float: optional, gravity value (default: 9.80665 m/s^2)\ndefFldDens::float: optional, air density (default: 1.225 kg/m^3)\ndefKinVisc::float: optional, kinematic viscosity of working fluid (default: 1.464E-05 m^2/s)\ndefSpdSound::float: optional, speed of sound in working fluid (default: 335.0 m/s)\ndefPatm::float: optional, atmospheric pressure (default: 103500.0 Pa) [used only for an MHK turbine cavitation check]\ndefPvap::float: optional, vapour pressure of working fluid (default: 1700.0 Pa) [used only for an MHK turbine cavitation check]\nWtrDpth::float: optional, water depth (default: 0.0 m) [used only for an MHK turbine]\nMSL2SWL::float: optional, offset between still-water level and mean sea level (default: 0.0 m) [positive upward, used only for an MHK turbine]\nstoreHHVel::int: optional, internal parameter for adi_library. Exposed for convenience, but not needed. [0=false, 1=true]\nWrVTK::int: optional, write VTK output files at all timesteps to visualize AeroDyn 15 meshes [0 none (default), 1 ref, 2 motion]\nWrVTK_Type::int: optional, write VTK output files as [1 surfaces (default), 2 lines, 3 both]\nVTKNacDim::Array(float*6) optional, Nacelle Dimension for VTK visualization x0,y0,z0,Lx,Ly,Lz (m)\nVTKHubRad::float: optional, HubRadius for VTK visualization (m)\nwrOuts::int: optional, file format for writing outputs [0 none (default), 1 txt, 2 binary, 3 both]\nDT_Outs::float64: optional, timestep for outputs to file [0.0 (default) for every timestep]\ninterp_order::int: optional, interpolation order used internally [1 first order (default), 2 second order]\ndt::float64: required, timestep for AD15 (needed for setting internal constants)\nt_max::float: required, total expected simulation time – used only for setting VTK counter width\n\nOutputs:\n\nnum_channels::int: number of output channels\nchannel_names::string: string of output channel names from ADI\nchannel_units::string: string of output channel units from ADI\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.adiPreInit-Tuple{Any, Any, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.adiPreInit","text":"adiPreInit(adilib_filename numTurbines transposeDCM)\n\nDoes some pre-initializing of the ADI library to setup arrays for each turbine\n\nInputs:\n\nadilib_filename::string: path and name of AeroDyn-Inflow dynamic library\nnumTurbines::int: required, number of turbines to setup ADI to handle\ntransposeDCM::int: required, transpose DCM internally in ADI to match calling code convention for direction cosine matrices (default: 1==true)\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.adiSetRotorMotion-NTuple{18, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.adiSetRotorMotion","text":"adiSetRotorMotion(iturb; )\n\nSets the motions for a single turbine rotor\n\nInputs:\n\niturb::int: required, current turbine number\nHubPos::Array(float): required, (x,y,z) position of hub\nHubOrient::Array(float): required, orientation of hub as 9 element vector of flattened DCM\nHubVel::Array(float): required, (TVx,TVy,TVz,RVx,RVy,RVz) velocity of hub, does not include rotational velocity, so this is extra like from a platform\nHubAcc::Array(float): required, (TAx,TAy,TAz,RAx,RAy,RAz) acceleration of hub, does not include rotational accel, so this is extra like from a platform\nNacPos::Array(float): required, (x,y,z) position of nacelle\nNacOrient::Array(float): required, orientation of nacelle as 9 element vector of flattened DCM\nNacVel::Array(float): required, (TVx,TVy,TVz,RVx,RVy,RVz) velocity of nacelle\nNacAcc::Array(float): required, (TAx,TAy,TAz,RAx,RAy,RAz) acceleration of nacelle\nRootPos::Array(float): required, size (numBlades,3) position vectors of roots\nRootOrient::Array(float): required, size (numBlades,9) orientation DCMs flattened to array of 9 element vectors\nRootVel::Array(float): required, size (numBlades,6) velocity vectors of roots\nRootAcc::Array(float): required, size (numBlades,6) acceleration vectors of roots\nnumMeshNodes::Array(int): required, number of structural mesh points (total across all blades)\nMeshPos::Array(float): required, size (sum(numMeshNodes),3) position vectors of mesh points\nMeshOrient::Array(float): required, size (sum(numMeshNodes),9) orientation DCMs flattened to array of 9 element vectors\nMeshVel::Array(float): required, size (sum(numMeshNodes),6) velocity vectors of mesh points\nMeshAcc::Array(float): required, size (sum(numMeshNodes),6) acceleration vectors of mesh points\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.adiSetupRotor-Tuple{Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.adiSetupRotor","text":"adiSetupRotor(iturb; )\n\nSets the initial locations of a single rotor (root orientations/positions etc)\n\nInputs:\n\niturb::int: required, current turbine number\nisHAWT::bool: required, false: VAWT or cross-flow turbine, true: HAWT\nintTurbPos::Array(float): required, (x,y,z) position of turbine\ninitHubPos::Array(float): required, (x,y,z) position of hub\ninitHubOrient::Array(float): required, orientation of hub as 9 element vector of flattened DCM\ninitNacellePos::Array(float): required, (x,y,z) position of nacelle\ninitNacelleOrient::Array(float): required, orientation of nacelle as 9 element vector of flattened DCM\nnumBlades::int: required, number of blades\ninitRootPos::Array(float): required, size (numBlades,3) position vectors of roots\ninitRootOrient::Array(float): required, size (numBlades,9) orientation DCMs flattened to array of 9 element vectors\nnumMeshNodes::Array(int): required, number of structural mesh points (total across all blades)\ninitMeshPos::Array(float): required, size (sum(numMeshNodes),3) position vectors of mesh points\ninitMeshOrient::Array(float): required, size (sum(numMeshNodes),9) orientation DCMs flattened to array of 9 element vectors\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.adiUpdateStates-Tuple{Any, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.adiUpdateStates","text":"adiUpdateStates( )\n\ncalls AeroDynInflowC_UpdateStates to step ADI forward to the next timestep Call this only after SetRotorMotion on all rotors/turbines.\n\nInputs:\n\ntime::c_double: current timestep\n\ntime_next::c_double: next timestep\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.advanceAD15-Tuple{Any, Any, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.advanceAD15","text":"advanceAD15(t_new;ts=2*pi/(turbine.omega[1]*turbine.ntheta))\n\nRuns a previously initialized aero model (see ?setupTurb) in the unsteady mode (can be repeateadly called, or called for a specific time, or repeatedly called for sections of time)\n\nInputs\n\nt_new::float: new time (s); will run from last time specified from the last call, to the current time specified, or from t=ts if the first time called\nmesh::: OWENSFEA mesh for the turbine structure\nazi::: hub azimuth (radians)\ndt::float: optional timestep\n\nOutputs:\n\nn_steps: number timesteps taken\nFx: Array(sum(numMeshNodes),ntheta) Turbine Fx (N)\nFy: Array(sum(numMeshNodes),ntheta) Turbine Fy (N)\nFz: Array(sum(numMeshNodes),ntheta) Turbine Fz (N)\nMx: Array(sum(numMeshNodes),ntheta) Turbine Mx (N-m)\nMy: Array(sum(numMeshNodes),ntheta) Turbine My (N-m)\nMz: Array(sum(numMeshNodes),ntheta) Turbine Mz (N-m)\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.createGeneralTransformationMatrix-Tuple{Any, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.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 rotations 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/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.createSingleRotationDCM-Tuple{Any, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.createSingleRotationDCM","text":"createSingleRotationDCM(angleDeg,axisNum)\n\nCreates a direction cosine matrix (dcm) associated with a rotation of angleDeg about axisNum.\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.deformAD15-NTuple{10, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.deformAD15","text":"deformAD15(u_j,udot_j,uddot_j,azi,Omega_rad,OmegaDot_rad,hubPos,hubAngle,hubVel,hubAcc)\n\nSets the inputs for AD15.\n\nInputs\n\nu_j: mesh displacements – in hub coordinates, (m,rad)\nudot_j: mesh velocity – in hub coordinates, (m/s,rad/s)\nuddot_j: mesh velocity – in hub coordinates, (m/s,rad/s)\nazi: current azimuth (rad)\nOmega_rad: angular velocity of hub about hub axis (rad/s)\nOmegaDot_rad: angular acceleration of hub about hub axis (rad/s^2)\nhubPos: current global hubPos (x,y,z) vector (m)\nhubAngle: 3 angle set for hub orientation (rad), no rotation from spinning\nhubVel: hub velocity in global coords, 6-vector (m/s,rad/s), does not include rotational velocity, so this is extra like from a platform\nhubAcc: hub acceleration in global coords, 6-vector (m/s^2,rad/s^2), does not include rotational accel, so this is extra like from a platform\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.endTurb-Tuple{}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.endTurb","text":"End ADI and clear data\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.frame_convert-Tuple{Any, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.frame_convert","text":"frameconvert(initframevals, transmat)\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/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.getAD15MeshDCM-NTuple{4, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.getAD15MeshDCM","text":"getAD15MeshDCM(turbine,u_j,azi,hubAngle)\n\nExtract the mesh points orientations for all the AD15 blades ordering here is important 1. root to tip of blades, in blade order 2. root to tip of bottom struts, in blade order 3. root to tip of top struts, in blade order\n\nInputs\n\nturbine: turbine data storage\nu_j: mesh displacements – in hub coordinates, (m,rad)\nazi: current azimuth (rad)\nhubAngle: 3 angle set for hub orientation (rad), no rotation from spinning\n\n#FIXME: add averaging of orientations to get nodes within blade/strut\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.getAD15MeshPos-NTuple{6, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.getAD15MeshPos","text":"getAD15MeshPos(turbine,u_j,azi,nacPos,hubPos,hubAngle)\n\nExtract the mesh points for all the AD15 blades ordering here is important 1. root to tip of blades, in blade order 2. root to tip of bottom struts, in blade order 3. root to tip of top struts, in blade order\n\nInputs\n\nturbine: turbine data storage\nu_j: mesh displacements – in hub coordinates, (m,rad)\nazi: current azimuth (rad)\nhubPos: current global hubPos (x,y,z) vector (m)\nnacPos: current global nacPos (x,y,z) vector (m)\nhubAngle: 3 angle set for hub orientation (rad) , no rotation from spinning\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.getAD15MeshVelAcc-NTuple{12, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.getAD15MeshVelAcc","text":"getAD15MeshVelAcc(turbine,meshPos,udotj,uddotj,azi,Omegarad,OmegaDotrad,nacPos,hubPos,hubAngle,hubVel,hubAcc)\n\nExtract the mesh velocities and accelerations for all the AD15 blades ordering here is important 1. root to tip of blades, in blade order 2. root to tip of bottom struts, in blade order 3. root to tip of top struts, in blade order\n\nInputs\n\nturbine: turbine data storage\nrootPos: root positions from call to getAD15MeshPos\nu_j: mesh displacements – in hub coordinates, (m,rad)\nudot_j: mesh velocity – in hub coordinates, (m/s,rad/s)\nuddot_j: mesh velocity – in hub coordinates, (m/s,rad/s)\nazi: current azimuth (rad)\nOmega_rad: angular velocity of hub about hub axis (rad/s)\nOmegaDot_rad: angular acceleration of hub about hub axis (rad/s^2)\nhubPos: current global hubPos (x,y,z) vector (m)\nnacPos: current global nacPos (x,y,z) vector (m)\nhubAngle: 3 angle set for hub orientation (rad), no rotation from spinning\nhubVel: hub velocity in global coords (m/s,rad/s), does not include rotational velocity, so this is extra like from a platform\nhubAcc: hub acceleration in global coords (m/s^2,rad/s^2), does not include rotational accel, so this is extra like from a platform\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.getAD15numMeshNodes-Tuple{Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.getAD15numMeshNodes","text":"getAD15numMeshNodes(bladeIdx)\n\nFind the number of mesh points we will pass\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.getRootDCM-NTuple{4, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.getRootDCM","text":"getRootDCM(turbine,u_j,azi,hubAngle)\n\nNote on angles The OWENSFEA mesh in OWENS uses +X as the blade/strut long axis. In AeroDyn, the blade axis is +Z. So for transforming the blades from OWENSFEA mesh coordinates, first rotate by -90 degrees about Y, then do the 3,2,1 coordinate transforms with (Twist,Theta,Psi) = (Rz,Ry,Rx) = (Yaw,Pitch,Roll) Psid – rotation about Z axis – Yaw (Rz) – degrees Thetad – rotation about Y axis – Pitch (Ry) – degrees Twist_d – rotation about X axis – Roll (Rx) – degrees The rotation sequence is Roll –> Pitch –> Yaw. In rotation matrix form, it is R = RzRyRx (a [3,2,1] matrix order).\n\nInputs\n\nturbine: turbine data storage\nu_j: mesh displacements – in hub coordinates, (m,rad)\nazi: current azimuth (rad)\nhubAngle: 3 angle set for hub orientation (rad), no rotation from spinning\n\n#FIXME: add averaging of orientations to get nodes within blade/strut\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.getRootPos-NTuple{6, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.getRootPos","text":"getRootPos(turbine,u_j,azi,nacPos,hubPos,hubAngle)\n\nExtract the root positions for all ADI blades\n\nInputs\n\nturbine: turbine data storage\nu_j: mesh displacements – in hub coordinates, (m,rad)\nazi: current azimuth (rad)\nnacPos: current global nacPos (x,y,z) vector (m)\nhubPos: current global hubPos (x,y,z) vector (m)\nhubAngle: 3 angle set for hub orientation (rad), no rotation from spinning\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.getRootVelAcc-NTuple{12, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.getRootVelAcc","text":"getRootVelAcc(turbine,rootPos,udotj,uddotj,azi,Omegarad,OmegaDotrad,nacPos,hubPos,hubAngle,hubVel,hubAcc)\n\nExtract the root velocities and accelerations for all ADI blades\n\nInputs\n\nturbine: turbine data storage\nrootPos: root positions from call to getRootPos\nazi: current azimuth (rad)\nOmega_rad: angular velocity of hub about hub axis (rad/s)\nOmegaDot_rad: angular acceleration of hub about hub axis (rad/s^2)\nnacPos: current global nacPos (x,y,z) vector (m)\nhubPos: current global hubPos (x,y,z) vector (m)\nhubAngle: 3 angle set for hub orientation (rad) , no rotation from spinning\nhubVel: hub velocity in global coords, 6-vector (m/s,rad/s), does not include rotational velocity, so this is extra like from a platform\nhubAcc: hub acceleration in global coords, 6-vector (m/s^2,rad/s^2), does not include rotational accel, so this is extra like from a platform\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.ifwcalcoutput-Tuple{Any, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.ifwcalcoutput","text":"ifwcalcoutput(position,time)\n\ncalls inflow wind clacoutput\n\nInputs\n\nposition::Array(float): x, y, z sample position (m)\ntime::float: sample time (s)\n\nOutputs:\n\nvelocities: x, y, z velocity at sample position\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.ifwend-Tuple{}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.ifwend","text":"ifwend()\n\ncalls inflow wind end function and cleanup\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.ifwinit-Tuple{}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.ifwinit","text":"ifwinit(inflowlib_filename ;HWindSpeed=6.87,turbsim_filename=\"path/test.bts\")\n\ncalls inflow wind init\n\nInputs\n\ninflowlib_filename::string: path and name of inflow-wind dynamic library\nHWindSpeed::float: optional, backup steady windspeed (m/s)\nturbsim_filename::string: path and name of turbsim data e.g. \"path/test.bts\"\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.setRotorMotion-Tuple{Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.setRotorMotion","text":"setRotorMotion(iturb,turbstruct\n\nSet the rotor motion for one turbine\n\nInputs\n\niturb::int: required, current turbine number\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.setupTurb-NTuple{12, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.setupTurb","text":"setupTurb(adilib,adinputfile,ifwinputfile,adirootname,bldx,bldz,B; rho = 1.225, gravity = 9.80665, defKinVisc = 1.464E-05, defSpdSound = 335.0, defPatm = 103500.0, defPvap = 1700.0, WtrDpth = 0.0, MSL2SWL = 0.0, storeHHVel = 0, #false transposeDCM= 1, #true WrVTK = 2, WrVTKType = 3, VTKNacDim = [-.10 ,-.10 ,-.10 ,.2 ,.2 ,.2], VTKHubRad = 1.0, adinstrut = 2, adidt = 0.05, aditmax = 10, adiwrOuts = 0, adiDT_Outs = 0.0, isHAWT = false, # false: VAWT or cross-flow turbine, true: HAWT numTurbines = 1)\n\nInitializes aerodynamic models and sets up backend persistent memory to simplify intermittent calling within coupled solver loops\n\nInputs\n\nadi_lib: path to adi library (.so, .dylib, .dll)\nad_input_file: input file for aerodyn15\nifw_input_file: input file for inflow wind\nadi_rootname: rootname for vtk outputs\nbld_x: Blade x shape\nbld_z: Blade z shape\nB: Number of blades\nrho: working fluid density (kg/m^3)\ngravity: Gravitational acceleration (m/s^2)\ndefKinVisc: Kinematic viscosity of working fluid (m^2/s)\ndefSpdSound: Speed of sound in working fluid (m/s)\ndefPatm: Atmospheric pressure (Pa) [used only for an MHK turbine cavitation check]\ndefPvap: Vapour pressure of working fluid (Pa) [used only for an MHK turbine cavitation check]\nWtrDpth: Water depth (m)\nMSL2SWL: Offset between still-water level and mean sea level (m) [positive upward]\nstoreHHVel: unused here\ntransposeDCM: 0=false, 1=true transpose DCM internally for calculations\nWrVTK: write VTK files from adi to directory adi-vtk [0 none, 1 ref, 2 motion]\nWrVTK_Type: write VTK files from adi to directory adi-vtk [1 surface, 2 lines, 3 both]\nVTKNacDim: Nacelle Dimension for VTK visualization x0,y0,z0,Lx,Ly,Lz (m)\nVTKHubRad: HubRadius for VTK visualization (m)\nadi_wrOuts: file format to write to\nadi_DT_Outs: output timestep to write at\nadi_nstrut: createmeshstruts is hard coded for 2 struts per blade\nadi_dt: timestep\nadi_tmax: maximum time\nhubPos: hub position in global coordinates, 3-vector (m). NOTE: AD15 assumes a different hub location than OWENS\nhubAngle: hub axis angle, 3-vector (deg), no rotation from spinning\nnacPos: nacelle position in global coordinates, 3-vector (m). NOTE: AD15 assumes a different hub location than OWENS\nnacAngle: nacelle axis angle, 3-vector (deg)\nnumTurbines: number of turbines\nisHAWT: # false: VAWT or cross-flow turbine, true: HAWT\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.transMat-Tuple{Any, Any, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.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","page":"OWENS","title":"OWENS","text":"","category":"section"},{"location":"reference/reference/","page":"OWENS","title":"OWENS","text":"CurrentModule = OWENS","category":"page"},{"location":"reference/reference/#Index","page":"OWENS","title":"Index","text":"","category":"section"},{"location":"reference/reference/","page":"OWENS","title":"OWENS","text":"","category":"page"},{"location":"reference/reference/#Types-and-functions","page":"OWENS","title":"Types and functions","text":"","category":"section"},{"location":"reference/reference/","page":"OWENS","title":"OWENS","text":"Modules = [OWENS]","category":"page"},{"location":"reference/reference/#OWENS.Bin","page":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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\nss_input_file::string: file path to the HydroDyn sea states 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":"OWENS","title":"OWENS.Iteration_Parameters","text":"Internal, gauss-seidel iteration parameters \n\n\n\n\n\n","category":"type"},{"location":"reference/reference/#OWENS.NuMad","page":"OWENS","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 position, 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":"OWENS","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":"OWENS","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.OWENSVTK-NTuple{17, Any}","page":"OWENS","title":"OWENS.OWENSVTK","text":"OWENSVTK(savename,t,uHist,system,assembly,sections,aziHist,mymesh,myel,epsilon_x_hist,epsilon_y_hist,epsilon_z_hist,kappa_x_hist,kappa_y_hist,kappa_z_hist,FReactionHist)\n\nFormats and outputs OWENS data into VTK format\n\n#Intput\n\n#Output\n\nnone:\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.Unsteady-Tuple{Any}","page":"OWENS","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 (s)\n* `aziHist`: azimuthal history array \n* `OmegaHist`: rotational speed array history (hz)\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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","title":"OWENS.create_arcus_mesh","text":"createarcusmesh(;Htwrbase = 15.0, Hbld = 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\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\nHtwr_base::float: height of tower before blades attach (m)\nHbld::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":"OWENS","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":"OWENS","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":"OWENS","title":"OWENS.create_mesh_struts","text":"mymesh, myort, myjoint, AD15bldNdIdxRng, AD15bldElIdxRng = createmeshstruts(;Htwrbase = 15.0, Htwrblds = 147.148-15.0, Hbld = 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, struttwrmountpoint = [0.01,0.5,0.9], strutbldmountpoint = [0.01,0.5,0.9], 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\nHtwr_base::float: height of tower before blades attach (m)\nHtwr_blds::float: height of the tower once the blades attach (m)\nHbld::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_mountpoint::float = [0.01,0.5,0.9], # factor of blade height where the bottom strut attaches on the tower # This puts struts at top and bottom, as a fraction of the blade position\nstrut_bld_mountpoint::float = [0.01,0.5,0.9], # factor of blade height where the bottom strut attaches on the blade # This puts struts at bottom 0, mid 0.5, and top 1.0 as a fraction of the blade position\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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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.Output: see ?OWENSPreComp.Input\nprecompinput::OWENSPreComp.Input: see ?OWENSPreComp.properties\nlam_U::Composites.Laminate: laminate stacks used for post processing, size (nstations, nupper chorwise stations), upper surface, see ?Composites.Laminate\nlam_L::Composites.Laminate: laminate stacks used for post processing, size (nstations, nlower chorwise stations), lower surface, see ?Composites.Laminate\nlam_W::Composites.Laminate: laminate stacks used for post processing, size (nstations, nwebs), shear webs, see ?Composites.Laminate\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.getRotorPosSpeedAccelAtTime-NTuple{4, Any}","page":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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{OrderedCollections.OrderedDict{Symbol, Any}}","page":"OWENS","title":"OWENS.readNuMadGeomCSV","text":"readNuMadGeomCSV(NuMadgeomfile)\n\nParameters defining the rotor (apply to all sections).\n\nArguments\n\nNuMad_geom_file::String: name of the numad excel CSV file being read (!!! THE NUMAD TAB MUST BE SAVED AS A CSV FOR THIS TO WORK !!!)\nNuMad_geom_file::OrderedCollections.OrderedDict{Symbol, Any}: Alternatively, the already loaded in dictionary of windio inputs\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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","title":"OWENS.userDefinedRotorSpeedProfile","text":"Internal, unused, userDefinedRotorSpeedProfile\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.viz-Tuple{Any}","page":"OWENS","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":"OWENS","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":"installation/#Installation-Instructions","page":"Installation","title":"Installation Instructions","text":"","category":"section"},{"location":"installation/","page":"Installation","title":"Installation","text":"The OWENS software has been developed and designed to highly flexible and 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":"installation/","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":"installation/","page":"Installation","title":"Installation","text":"In short, you should be able to compile OpenFAST on your system before attempting this.","category":"page"},{"location":"installation/","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":"installation/#Windows","page":"Installation","title":"Windows","text":"","category":"section"},{"location":"installation/","page":"Installation","title":"Installation","text":"At this stage in the software's maturity, please use mac or linux environments unless the user is highly experienced with compiled software development in a windows environment. Installation and troubleshooting on a dedicated unix based system is at least 1/10th that of Windows (also why every supercomputer uses linux...) 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. However, this adds several levels of complexity, and you WILL run into machine based issues until we finish the pipeline for windows download and run precompiled binaries.","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"Install julia, paraview, and visual studio manually by downloading/installing the windows versions for each:","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"https://julialang.org/downloads/\nhttps://www.paraview.org/download/\nhttps://visualstudio.microsoft.com/downloads/","category":"page"},{"location":"installation/","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":"installation/","page":"Installation","title":"Installation","text":"When setting up ssh keys, be sure to follow the windows specific instructions https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent and note that you may have to use id_ecdsa keys.","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"Set up the environment variables below and be sure Julia is also on the path (https://www.wikihow.com/Create-an-Environment-Variable-in-Windows-10)","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"Install the OWENS custom dependices as listed below.","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"If you wish to use the openfast libraries, follow the windows compilation instructions for the openfast Inflowwind, AeroDyn, MoorDyn and HydroDyn libraries. Also note that you will need to change the library paths in the top level OWENS scripts to match the resulting libraries' locations.","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"Set up VS code as also described below.","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"Windows notes: details are key, hash mismatch may mean that you are behind a proxy and the proxy isn't setup correctly. For visual studio, the default installation and recommendations should work. If importing the provided vs-code profile, the quick keys may need to be remapped to control from cmd. ","category":"page"},{"location":"installation/#Mac","page":"Installation","title":"Mac","text":"","category":"section"},{"location":"installation/","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":"installation/","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":"installation/#Linux","page":"Installation","title":"Linux","text":"","category":"section"},{"location":"installation/","page":"Installation","title":"Installation","text":"Install/Update Required Compilers and Programs; If you already have an environment that can build OpenFAST, then these should already be installed.","category":"page"},{"location":"installation/","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":"installation/#Install-julia","page":"Installation","title":"Install julia","text":"","category":"section"},{"location":"installation/","page":"Installation","title":"Installation","text":"cd ~\ncurl -fsSL https://install.julialang.org | sh","category":"page"},{"location":"installation/","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":"installation/","page":"Installation","title":"Installation","text":"export JULIAPKGUSECLIGIT=true","category":"page"},{"location":"installation/","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":"installation/","page":"Installation","title":"Installation","text":"alias julia=\"path/to/your/julia-1.x.x/bin/julia\"","category":"page"},{"location":"installation/#Environment-Variables","page":"Installation","title":"Environment Variables","text":"","category":"section"},{"location":"installation/","page":"Installation","title":"Installation","text":"If you are using a proxy, be sure that the proxy variables are also declared/exported in your .bash_profile or .bashrc or the equivalent","category":"page"},{"location":"installation/","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":"installation/#Test-That-Julia-Runs","page":"Installation","title":"Test That Julia Runs","text":"","category":"section"},{"location":"installation/","page":"Installation","title":"Installation","text":"the following should get you in and out of the julia interactive repl","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"julia \nexit()","category":"page"},{"location":"installation/#Set-up-SSH-Keys","page":"Installation","title":"Set up SSH Keys","text":"","category":"section"},{"location":"installation/","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":"installation/","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":"installation/","page":"Installation","title":"Installation","text":"Host *\nPubkeyAcceptedAlgorithms +ssh-rsa\nPubkeyAcceptedAlgorithms +ssh-ed25519","category":"page"},{"location":"installation/#Install-Optional-OpenFAST-Dependices","page":"Installation","title":"Install Optional OpenFAST Dependices","text":"","category":"section"},{"location":"installation/","page":"Installation","title":"Installation","text":"If your system is already set up such that it is capable of compiling OpenFAST, and you are on mac or linux, then you may skip this and rely on the automatically compiled version that are created when the OWENSOpenFAST libraries are installed by Julia. mkdir coderepos cd coderepos # Install openfast coupled libraries !NOTE!: if you change the location of the compiled libraries, you may need to update the rpath variable, or recompile. git clone –depth 1 git@github.com:andrew-platt/openfast.git # 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. cd openfast git remote set-branches origin '*' git fetch –depth 1 origin f/ADIcbindingmultiRotor git checkout f/ADIcbindingmultiRotor mkdir build cd build # can also add -DOPENMP=ON if desired for acceleration of OLAF # you can rebuild later by removing the build folder and following these instructions again. cmake -DBUILDSHAREDLIBS=ON .. make ifwcbinding # make moordyncbinding # make hydrodyncbinding make aerodyninflowcbinding make aerodyndriver make turbsim cd ../../","category":"page"},{"location":"installation/#Brief-Julia-Primer","page":"Installation","title":"Brief Julia Primer","text":"","category":"section"},{"location":"installation/","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":"installation/","page":"Installation","title":"Installation","text":"julia","category":"page"},{"location":"installation/","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":"installation/#OWENS-Installation","page":"Installation","title":"OWENS Installation","text":"","category":"section"},{"location":"installation/","page":"Installation","title":"Installation","text":"These steps require a secure download, such as through the SSH keys detailed above, to avoid man-in-the-middle attacks. ","category":"page"},{"location":"installation/","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":"installation/#Testing-Your-Build-of-OWENS","page":"Installation","title":"Testing Your Build of OWENS","text":"","category":"section"},{"location":"installation/","page":"Installation","title":"Installation","text":"clone the owens repository which contains example scripts that will setup and run example turbines from end to end","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"git clone git@github.com:sandialabs/OWENS.jl","category":"page"},{"location":"installation/","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":"installation/","page":"Installation","title":"Installation","text":"adi_lib = \"path/to/openfast/build/modules/libraryfolder/libraryname\"","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"cd OWENS.jl/examples/literate/\njulia B_detailedInputs.jl","category":"page"},{"location":"installation/","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 # or on mac, brew install paraview","category":"page"},{"location":"installation/","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":"installation/","page":"Installation","title":"Installation","text":"julia","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":" include(\"path/to/file.jl\")","category":"page"},{"location":"installation/#Visual-Studio-Code-IDE","page":"Installation","title":"Visual Studio Code IDE","text":"","category":"section"},{"location":"installation/","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/OWENS.code-profile). ","category":"page"},{"location":"installation/","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":"installation/","page":"Installation","title":"Installation","text":"cmd-j cmd-k,","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"if you want to clear out the console ","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"cmd-j cmd-c","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"open the workspace ","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"cmd-j cmd-w","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"run highlighted code ","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"shift-enter","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"run the currently selected file","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"cmd-shift-enter","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"You can also use the gui buttons.","category":"page"},{"location":"installation/#VSCode-Julia-Debugger","page":"Installation","title":"VSCode Julia Debugger","text":"","category":"section"},{"location":"installation/","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":"installation/","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":"installation/#Install-custom-repositories-you-want-to-develop","page":"Installation","title":"Install custom repositories you want to develop","text":"","category":"section"},{"location":"installation/","page":"Installation","title":"Installation","text":"start Julia from the cloned directory and use the command:","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"] dev .","category":"page"},{"location":"installation/","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":"installation/","page":"Installation","title":"Installation","text":"alternatively, instead of using or import to get access to the module, within julia","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"include(\"path/to/module.jl/source/module.jl\")","category":"page"},{"location":"installation/","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":"installation/","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":"installation/","page":"Installation","title":"Installation","text":"using Pkg\nPkg.add(url = \"git@github.com:sandialabs/OWENS.jl.git\", rev = \"dev\")","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"OWENS X is outwards on blade, y is trailing edge always","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"Struts, CCW, z is inwards, y trailing, and CW z is outwards","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"Aerodyn ","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","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":"-","title":"-","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":"-","title":"-","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":"-","title":"-","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":"-","title":"-","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":"-","title":"-","text":"(Image: ){width=\"5.595138888888889in\" height=\"4.875694444444444in\"}(Image: ){width=\"5.737141294838145in\" height=\"5.283430664916885in\"}","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"If we add 30 degrees of rotation to the yaw, this is what it looks like.","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"(Image: ){width=\"4.91704615048119in\" height=\"4.992732939632546in\"}","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","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":"-","title":"-","text":"(Image: ){width=\"4.382957130358705in\" height=\"4.783430664916885in\"}(Image: ){width=\"5.226388888888889in\" height=\"4.833333333333333in\"}","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","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":"-","title":"-","text":"(Image: ){width=\"5.124857830271216in\" height=\"4.771802274715661in\"}","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","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":"-","title":"-","text":"(Image: ){width=\"4.095165135608049in\" height=\"4.388081802274716in\"}","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","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":"-","title":"-","text":"# apply the twist rotation, which is about the x (1) axis","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"myvec = myvec*[1.0 0.0 0.0","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"0.0 cosd(Twistdel) sind(Twistdel)","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"0.0 -sind(Twistdel) cosd(Twistdel)]","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"# apply theta rotation, which is the tilt angle, or about the y (2) axis in global","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"myvec = myvec*[cosd(Thetadel) 0.0 -sind(Thetadel)","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"0.0 1.0 0.0","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"sind(Thetadel) 0.0 cosd(Thetadel)]","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"# apply Psi rotation, which is about Z (3) axis in global","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"myvec = myvec*[cosd(Psidel) sind(Psidel) 0.0","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"-sind(Psidel) cosd(Psidel) 0.0","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"0.0 0.0 1.0]","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"EditURL = \"../../../examples/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\n#### PyPlot.pygui(true)\nimport OWENSOpenFASTWrappers\n\n\nrunpath = path = \"/home/runner/work/OWENS.jl/OWENS.jl/examples/literate\" # to run locally, change to splitdir(@__FILE__)[1]\n# runpath = path = 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)\nshapeY = zeros(Nslices+1)\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]\nHtwr_base=towerHeight\nstrut_mountpointbot = 0.11\nstrut_mountpointtop = 0.89\njoint_type = 0\nc_mount_ratio = 0.05\nangularOffset = -pi/2\ncustommesh = nothing\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\nstrut_twr_mountpoint = [0.25,0.75]\nstrut_bld_mountpoint = [0.25,0.75]\nNbld = B\nH = maximum(shapeZ) #m,\nHtwr_blds = H\nAD15hubR = 0.1\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\" && custommesh == nothing #TODO, for all of these propogate the AeroDyn additional output requirements\n mymesh,myort,myjoint, AD15bldNdIdxRng, AD15bldElIdxRng = OWENS.create_arcus_mesh(;Htwr_base,\n Hbld = 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 AD15_ccw = true,\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\") && custommesh == nothing\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(;Htwr_base,\n Htwr_blds,\n Hbld = H, #blade height\n R, # m bade radius\n AD15hubR, #TODO: hook up with AD15 file generation\n nblade = Nbld,\n ntelem, #tower elements\n nbelem, #blade elements\n nselem,\n strut_twr_mountpoint,\n strut_bld_mountpoint,\n bshapex = shapeX, #Blade shape, magnitude is irrelevant, scaled based on height and radius above\n bshapez = shapeZ,\n bshapey = shapeY, # 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)\nelseif custommesh != nothing\n mymesh, myort, myjoint, AD15bldNdIdxRng, AD15bldElIdxRng = custommesh(;Htwr_base,\n Htwr_blds,\n Hbld = H, #blade height\n R, # m bade radius\n AD15hubR, #TODO: hook up with AD15 file generation\n nblade = Nbld,\n ntelem, #tower elements\n nbelem, #blade elements\n nselem,\n strut_twr_mountpoint,\n strut_bld_mountpoint,\n bshapex = shapeX, #Blade shape, magnitude is irrelevant, scaled based on height and radius above\n bshapez = shapeZ,\n bshapey = shapeY, # 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 )\nelse #TODO unify with HAWT\n error(\"please choose a valid mesh type (Darrieus, H-VAWT, ARCUS)\")\nend\n\nnTwrElem = Int(mymesh.meshSeg[1])\ntry\n if contains(NuMad_mat_xlscsv_file_bld,\"34m\") || meshtype == \"ARCUS\" #TODO: this is really odd,\n nTwrElem = Int(mymesh.meshSeg[1])+1\n end\ncatch\n nTwrElem = Int(mymesh.meshSeg[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()\nfor icon = 1:length(mymesh.conn[:,1])\n idx1 = mymesh.conn[icon,1]\n idx2 = mymesh.conn[icon,2]\n PyPlot.plot3D([mymesh.x[idx1],mymesh.x[idx2]],[mymesh.y[idx1],mymesh.y[idx2]],[mymesh.z[idx1],mymesh.z[idx2]],\"k.-\")\n PyPlot.text3D(mymesh.x[idx1].+rand()/30,mymesh.y[idx1].+rand()/30,mymesh.z[idx1].+rand()/30,\"$idx1\",ha=\"center\",va=\"center\")\n #### sleep(0.1)\nend\n\nfor ijoint = 1:length(myjoint[:,1])\n idx2 = Int(myjoint[ijoint,2])\n idx1 = Int(myjoint[ijoint,3])\n PyPlot.plot3D([mymesh.x[idx1],mymesh.x[idx2]],[mymesh.y[idx1],mymesh.y[idx2]],[mymesh.z[idx1],mymesh.z[idx2]],\"r.-\")\n PyPlot.text3D(mymesh.x[idx1].+rand()/30,mymesh.y[idx1].+rand()/30,mymesh.z[idx1].+rand()/30,\"$idx1\",color=\"r\",ha=\"center\",va=\"center\")\n PyPlot.text3D(mymesh.x[idx2].+rand()/30,mymesh.y[idx2].+rand()/30,mymesh.z[idx2].+rand()/30,\"$idx2\",color=\"r\",ha=\"center\",va=\"center\")\n #### sleep(0.1)\nend\nPyPlot.xlabel(\"x\")\nPyPlot.ylabel(\"y\")\nPyPlot.zlabel(\"z\")","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;section=:tower)\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;section=:blade)\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":"numadIn_strut = Array{OWENS.NuMad, 1}(undef, Nstrutperbld)\nstrut_precompoutput = Array{Array{OWENS.OWENSPreComp.Output, 1},1}(undef, Nstrutperbld)\nstrut_precompinput = Array{Array{OWENS.OWENSPreComp.Input, 1},1}(undef, Nstrutperbld)\nplyprops_strut = Array{OWENS.plyproperties, 1}(undef, Nstrutperbld)\nlam_U_strut = Array{Array{OWENS.Composites.Laminate, 2}}(undef, Nstrutperbld)\nlam_L_strut = Array{Array{OWENS.Composites.Laminate, 2}}(undef, Nstrutperbld)\nlam_W_strut = Array{Array{OWENS.Composites.Laminate, 2}}(undef, Nstrutperbld)\nsectionPropsArray_strut = Array{Array{OWENSFEA.SectionPropsArray, 1}}(undef, Nstrutperbld)\nstiff_strut = Array{Array{Array{Float64,2}, 1},1}(undef, Nstrutperbld)\nmass_strut = Array{Array{Array{Float64,2}, 1},1}(undef, Nstrutperbld)\nfor istrut = 1:Nstrutperbld\n if !isnothing(NuMad_geom_xlscsv_file_strut)\n if typeof(NuMad_geom_xlscsv_file_strut)==String\n numadIn_strut[istrut] = OWENS.readNuMadGeomCSV(NuMad_geom_xlscsv_file_strut)\n elseif typeof(NuMad_geom_xlscsv_file_strut) == OrderedCollections.OrderedDict{Symbol, Any}\n if length(NuMad_geom_xlscsv_file_strut[:components][:struts])==1\n numadIn_strut[istrut] = OWENS.readNuMadGeomCSV(NuMad_geom_xlscsv_file_strut;section=:struts,subsection=1)\n else\n numadIn_strut[istrut] = OWENS.readNuMadGeomCSV(NuMad_geom_xlscsv_file_strut;section=:struts,subsection=istrut)\n end\n else\n numadIn_strut[istrut] = OWENS.readNuMadGeomCSV(NuMad_geom_xlscsv_file_strut[istrut])\n end\n else\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[istrut] = 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)\n end\n for icol = 1:length(numadIn_strut[istrut].stack_layers[1,:])\n numadIn_strut[istrut].stack_layers[:,icol] .*= LinRange(stack_layers_scale[1],stack_layers_scale[2],length(numadIn_strut[istrut].chord))\n end\n #### numadIn_strut[istrut].chord .*= LinRange(chord_scale[1],chord_scale[2],length(numadIn_strut[istrut].chord))\n\n for (i,airfoil) in enumerate(numadIn_strut[istrut].airfoil)\n numadIn_strut[istrut].airfoil[i] = \"$path/airfoils/$airfoil\"\n end\n\n if !isnothing(NuMad_mat_xlscsv_file_strut)\n plyprops_strut[istrut] = OWENS.readNuMadMaterialsCSV(NuMad_mat_xlscsv_file_strut)\n else\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[istrut] = OWENS.plyproperties(names,plies)\n end\n\n #### TODO: not straight struts\n spanpos = LinRange(0,1,nselem+1)#[0.0;cumsum(sqrt.(diff(mymesh.x[strut1start:strut1end]).^2 .+ diff(mymesh.z[strut1start:strut1end]).^2))]\n\n if length(thickness_scale)==2\n yscale = collect(LinRange(thickness_scale[1],thickness_scale[2],length(numadIn_strut[istrut].span)))\n elseif length(thickness_scale)==length(numadIn_strut[istrut].span)\n yscale = thickness_scale\n end\n\n strut_precompoutput[istrut],strut_precompinput[istrut],lam_U_strut[istrut],lam_L_strut[istrut],lam_W_strut[istrut] = OWENS.getOWENSPreCompOutput(numadIn_strut[istrut];yscale,plyprops = plyprops_strut[istrut])\n sectionPropsArray_strut[istrut] = OWENS.getSectPropsFromOWENSPreComp(spanpos,numadIn_strut[istrut],strut_precompoutput[istrut];precompinputs=strut_precompinput[istrut])\n stiff_strut[istrut], mass_strut[istrut] = OWENS.getSectPropsFromOWENSPreComp(spanpos,numadIn_strut[istrut],strut_precompoutput[istrut];GX=true)\nend\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)))\n#### strutssecprops = collect(Iterators.flatten(fill(sectionPropsArray_strut, Nstrutperbld*Nbld)))\n\nif meshtype == \"ARCUS\"\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)))\n stiff_array = [stiff_twr; stiff_blds]#; stiff_struts]\n\n mass_blds = collect(Iterators.flatten(fill(mass_bld, Nbld)))\n mass_array = [mass_twr; mass_blds]#; mass_struts]\n\n for icable = 1:Nbld\n sectionPropsArray = [sectionPropsArray; sectionPropsArray_strut[1]]\n stiff_array = [stiff_array;stiff_strut[1]]\n mass_array = [mass_array;mass_strut[1]]\n end\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)))\n stiff_array = [stiff_twr; stiff_blds]#; stiff_struts]\n\n mass_blds = collect(Iterators.flatten(fill(mass_bld, Nbld)))\n mass_array = [mass_twr; mass_blds]#; mass_struts]\n\n for istrut = 1:Nstrutperbld\n for ibld = 1:Nbld\n global sectionPropsArray = [sectionPropsArray; sectionPropsArray_strut[istrut]]\n global stiff_array = [stiff_array;stiff_strut[istrut]]\n global mass_array = [mass_array;mass_strut[istrut]]\n end\n end\nend\nrotationalEffects = ones(mymesh.numEl) #TODO: non rotating tower, or rotating blades\n\nif length(sectionPropsArray)Nbld # 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 BlCrvAC=zeros(blade_Nnodes[iADBody])\n BlSwpAC=zeros(blade_Nnodes[iADBody])\n BlCrvAng=zeros(blade_Nnodes[iADBody])\n BlTwist=zeros(blade_Nnodes[iADBody])\n BlChord=blade_chords[iADBody]\n BlAFID=collect((iADBody-1)*NumADStrutNds+1:iADBody*NumADStrutNds)\n end\n OWENSOpenFASTWrappers.writeADbladeFile(filename;NumBlNds=blade_Nnodes[iADBody],BlSpn,BlCrvAC,BlSwpAC,BlCrvAng,BlTwist,BlChord,BlAFID)\n end\n\n OWENSOpenFASTWrappers.writeOLAFfile(OLAF_filename;nNWPanel=200,nFWPanels=10)\n\n OWENSOpenFASTWrappers.writeIWfile(Vinf,ifw_input_file;windINPfilename)\n\n OWENSOpenFASTWrappers.setupTurb(adi_lib,ad_input_file,ifw_input_file,adi_rootname,[shapeX],[shapeZ],[B],[Htwr_base],[mymesh],[myort],[AD15bldNdIdxRng],[AD15bldElIdxRng];\n rho = rho,\n adi_dt = delta_t,\n adi_tmax= numTS*delta_t,\n omega = [omega],\n adi_wrOuts = 1, # write output file [0 none, 1 txt, 2 binary, 3 both]\n adi_DT_Outs = delta_t, # output frequency\n numTurbines = 1,\n refPos=[[0,0,0]],\n hubPos=[[0,0,0.0]],\n hubAngle=[[0,0,0]],\n nacPos=[[0,0,0]],\n adi_nstrut=[Nstrutperbld],\n adi_debug=0,\n isHAWT = false # true for HAWT, false for crossflow or VAWT\n )\n\n aeroForcesAD(t,azi) = OWENS.mapAD15(t,azi,[mymesh],OWENSOpenFASTWrappers.advanceAD15;alwaysrecalc=true,verbosity=1)\n deformAeroAD=OWENSOpenFASTWrappers.deformAD15\nend\n\nnothing","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"Calculate mass breakout of each material","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"mass_breakout_bld = OWENS.get_material_mass(plyprops_bld,numadIn_bld)\nmass_breakout_blds = mass_breakout_bld.*length(mymesh.structuralNodeNumbers[:,1])\nmass_breakout_twr = OWENS.get_material_mass(plyprops_twr,numadIn_twr;int_start=0.0,int_stop=Htwr_base)\n\n################################\n##### End setupOWENS\n################################\n\nnothing","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"Then the rest of this example is the same as example B","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","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\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":"reference/referencePreComp/#OWENSPreComp","page":"OWENSPreComp","title":"OWENSPreComp","text":"","category":"section"},{"location":"reference/referencePreComp/","page":"OWENSPreComp","title":"OWENSPreComp","text":"CurrentModule = OWENS","category":"page"},{"location":"reference/referencePreComp/#Types-and-functions","page":"OWENSPreComp","title":"Types and functions","text":"","category":"section"},{"location":"reference/referencePreComp/","page":"OWENSPreComp","title":"OWENSPreComp","text":"Modules = [OWENS.OWENSPreComp]","category":"page"},{"location":"reference/referencePreComp/#OWENSPreComp.Input","page":"OWENSPreComp","title":"OWENSPreComp.Input","text":"Struct for holding inputs to OWENSPreComp.properties()\n\n\n\n\n\n","category":"type"},{"location":"reference/referencePreComp/#OWENSPreComp.Output","page":"OWENSPreComp","title":"OWENSPreComp.Output","text":"Struct type for holding outputs of OWENSPreComp.properties()\n\n\n\n\n\n","category":"type"},{"location":"reference/referencePreComp/#OWENSPreComp.input","page":"OWENSPreComp","title":"OWENSPreComp.input","text":"Struct for holding inputs to OWENSPreComp.properties()\n\n\n\n\n\n","category":"type"},{"location":"reference/referencePreComp/#OWENSPreComp.embed_ls-NTuple{4, Any}","page":"OWENSPreComp","title":"OWENSPreComp.embed_ls","text":"embed_ls(x, nodes_l, xnode_l, ynode_l)\n\npurpose: embed a node in the lower-surface airfoil section nodes NOTE: nodal x coordinates must be in ascending order\n\nArguments:\n\nx::Real: x-coordinate of node to be embedded in the l-surf\nnodes_l::Int: no of current nodes on the lower surface\nxnode_l::Array{<:Real,1}: x-nodes on lower surface\nynode_l::Array{<:Real,1}: y-nodes on lower surface\n\nOutputs:\n\nnodes_l: revised no of current nodes on lower surface\nxnode_l: x-nodes on lower surface\nynode_l: y-nodes on lower surface\ny: y-coordinate of node embedded in the l-surf\nnewnode : number of the embedded node\n\n\n\n\n\n","category":"method"},{"location":"reference/referencePreComp/#OWENSPreComp.embed_us-Tuple{Real, Int64, Any, Any}","page":"OWENSPreComp","title":"OWENSPreComp.embed_us","text":"embed_us(x, nodes_u, xnode_u, ynode_u)\n\npurpose: embed a node in the upper-surface airfoil section nodes NOTE: nodal x coordinates must be in ascending order\n\nArguments:\n\nx::Real: x-coordinate of node to be embedded in the u-surf\nnodes_u::Int: no of current nodes on the upper surface\nxnode_u::Array{<:Real,1}: x-nodes on upper surface\nynode_u::Array{<:Real,1}: y-nodes on upper surface\n\nOutputs:\n\nnodes_u: revised no of current nodes on upper surface\nxnode_u: x-nodes on upper surface\nynode_u: y-nodes on upper surface\ny: y-coordinate of node embedded in the u-surf\nnewnode : number of the embedded node\n\n\n\n\n\n","category":"method"},{"location":"reference/referencePreComp/#OWENSPreComp.properties-Tuple{Real, Real, Real, Real, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}}","page":"OWENSPreComp","title":"OWENSPreComp.properties","text":"properties(chord::Array{<:Real,1}, tw_aero_d::Array{<:Real,1},\ntw_prime_d::Array{<:Real,1}, le_loc::Real, xnode::Array{<:Real,1},\nynode::Array{<:Real,1}, e1::Array{<:Real,1}, e2::Array{<:Real,1},\ng12::Array{<:Real,1}, anu12::Array{<:Real,1}, density::Array{<:Real,1},\nxsec_nodeU::Array{<:Real,1}, n_laminaU::Array{Int64,1},\nn_pliesU::Array{Int64,1}, t_lamU::Array{<:Real,1},\ntht_lamU::Array{<:Real,1}, mat_lamU::Array{Int64,1},\nxsec_nodeL::Array{<:Real,1}, n_laminaL::Array{Int64,1},\nn_pliesL::Array{Int64,1}, t_lamL::Array{<:Real,1},\ntht_lamL::Array{<:Real,1}, mat_lamL::Array{Int64,1},\nloc_web::Array{<:Real,1}, n_laminaW::Array{Int64,1},\nn_pliesW::Array{Int64,1}, t_lamW::Array{<:Real,1},\ntht_lamW::Array{<:Real,1}, mat_lamW::Array{Int64,1})\n\nCalculates span-variant structural properties for composite blades\n\nInputs\n\nchord::Real: section chord length (m)\ntw_aero_d::Real: section twist angle (deg)\ntw_prime_d::Real: derivative of section twist angle w.r.t. span location (deg/m)\nle_loc::Real: leading edge location relative to reference axis (normalized by chord)\nxnode::Array{<:Real,1}: x airfoil coordinates starting at leading edge traversing upper surface and back around lower surface\nynode::Array{<:Real,1}: y airfoil coordinates starting at leading edge traversing upper surface and back around lower surface\ne1::Array{<:Real,1}: E1\ne2::Array{<:Real,1}: E2\ng12::Array{<:Real,1}: G12\nanu12::Array{<:Real,1}: Nu12\ndensity::Array{<:Real,1}: density\nxsec_nodeU::Array{<:Real,1}: upper surface normalized chord location of sector boundaries\nn_laminaU::Array{Int64,1}: upper surface number of lamina in each sector\nn_pliesU::Array{Int64,1}: upper surface number of plies\nt_lamU::Array{<:Real,1}: upper surface ply thickness (m) for the lamina\ntht_lamU::Array{<:Real,1}: upper surface orientation (deg) for the lamina\nmat_lamU::Array{Int64,1}: upper surface material id for the lamina\nxsec_nodeL::Array{<:Real,1}: lower surface normalized chord location of sector boundaries\nn_laminaL::Array{Int64,1}: lower surface number of lamina in each sector\nn_pliesL::Array{Int64,1}: lower surface number of plies\nt_lamL::Array{<:Real,1}: lower surface ply thickness (m) for the lamina\ntht_lamL::Array{<:Real,1}: lower surface orientation (deg) for the lamina\nmat_lamL::Array{Int64,1}: lower surface material id for the lamina\nloc_web::Array{<:Real,1}: web normalized chord location of sector boundaries\nn_laminaW::Array{Int64,1}: web number of lamina in each sector\nn_pliesW::Array{Int64,1}: web number of plies\nt_lamW::Array{<:Real,1}: web ply thickness (m) for the lamina\ntht_lamW::Array{<:Real,1}: web orientation (deg) for the lamina\nmat_lamW::Array{Int64,1}: web material id for the lamina\n\nOutputs:\n\neifbar: ei_flap, Section flap bending stiffness about the YE axis (Nm2)\neilbar: ei_lag, Section lag (edgewise) bending stiffness about the XE axis (Nm2)\ngjbar: gj, Section torsion stiffness (Nm2)\neabar: ea, Section axial stiffness (N)\neiflbar: s_fl, Coupled flap-lag stiffness with respect to the XE-YE frame (Nm2)\nsfbar: s_af, Coupled axial-flap stiffness with respect to the XE-YE frame (Nm)\nslbar: s_al, Coupled axial-lag stiffness with respect to the XE-YE frame (Nm.)\nsftbar: s_ft, Coupled flap-torsion stiffness with respect to the XE-YE frame (Nm2)\nsltbar: s_lt, Coupled lag-torsion stiffness with respect to the XE-YE frame (Nm2)\nsatbar: s_at, Coupled axial-torsion stiffness (Nm)\nz_sc: x_sc, X-coordinate of the shear-center offset with respect to the XR-YR axes (m)\ny_sc: y_sc, Chordwise offset of the section shear-center with respect to the reference frame, XR-YR (m)\nztc_ref: x_tc, X-coordinate of the tension-center offset with respect to the XR-YR axes (m)\nytc_ref: y_tc, Chordwise offset of the section tension-center with respect to the XR-YR axes (m)\nmass: mass, Section mass per unit length (Kg/m)\niflap_eta: flap_iner, Section flap inertia about the YG axis per unit length (Kg-m)\nilag_zeta: lag_iner, Section lag inertia about the XG axis per unit length (Kg-m)\ntw_iner_d: twinerd, Orientation of the section principal inertia axes with respect the blade reference plane, θ (deg)\nzcm_ref: x_cm, X-coordinate of the center-of-mass offset with respect to the XR-YR axes (m)\nycm_ref: y_cm, Chordwise offset of the section center of mass with respect to the XR-YR axes (m)\nn_af_nodes: number of airfoil nodes\nn_materials: number of materials\nn_sctU: number of sectors on upper\nn_sctL: number of sectors on lower\nnwebin: number of webs\nn_laminaTotalU: total number of lamina on upper\nn_laminaTotalL: total number of lamina on lower\nn_laminaTotalW: total number of lamina on webs\n\n\n\n\n\n","category":"method"},{"location":"reference/referencePreComp/#OWENSPreComp.properties-Union{Tuple{OWENSPreComp.Input{R}}, Tuple{R}} where R<:Real","page":"OWENSPreComp","title":"OWENSPreComp.properties","text":"properties(pc_input::Input)\n\nCalculates span-variant structural properties for composite blades. Holds all inputs and outputs to properties function in structs\n\n\n\n\n\n","category":"method"},{"location":"reference/referencePreComp/#OWENSPreComp.q_bars-NTuple{7, Any}","page":"OWENSPreComp","title":"OWENSPreComp.q_bars","text":"q_bars(mat, thp, density, q11, q22, q12, q66)\n\nArguments\n\nmat: material id\nthp: ply orientation\ndensity:\nq11:\nq22:\nq12:\nq66:\n\nOutputs\n\nqbar11:\nqbar22:\nqbar12:\nqbar16:\nqbar26:\nqbar66:\nrho_m:\n\n\n\n\n\n","category":"method"},{"location":"reference/referencePreComp/#OWENSPreComp.readcompositesection-Tuple{String, Vector{Float64}}","page":"OWENSPreComp","title":"OWENSPreComp.readcompositesection","text":"readcompositesection(fname::String,locw::Array{Float64,1})\n\nReads a composite section input file. Returns locU, nlaminaU, npliesU, tU, thetaU, matidxU, locL, nlaminaL, npliesL, tL, thetaL, matidxL, locW, nlaminaW, npliesW, tW, thetaW, mat_idxW\n\n\n\n\n\n","category":"method"},{"location":"reference/referencePreComp/#OWENSPreComp.readmain-Tuple{String}","page":"OWENSPreComp","title":"OWENSPreComp.readmain","text":"readmain(\"fname::String\")\n\nReads a main OWENSPreComp input file. Returns sloc,leloc,chord,twaero,afshapefile,intstrfile, ibspstn,obspstn,ibchloc,obchloc\n\n\n\n\n\n","category":"method"},{"location":"reference/referencePreComp/#OWENSPreComp.readmaterials","page":"OWENSPreComp","title":"OWENSPreComp.readmaterials","text":"readmaterials(fname = \"materials.inp\")\n\nreads material properties from OWENSPreComp materials input file fname returns e1,e2,g12,nu12,rho,name\n\n\n\n\n\n","category":"function"},{"location":"reference/referencePreComp/#OWENSPreComp.readprecompprofile-Tuple{String}","page":"OWENSPreComp","title":"OWENSPreComp.readprecompprofile","text":"readprecompprofile(filename::String) Reads precomp profile file. Returns xu, yu, xl, yl\n\n\n\n\n\n","category":"method"},{"location":"reference/referencePreComp/#OWENSPreComp.readprofile-Tuple{String, Int64, Bool}","page":"OWENSPreComp","title":"OWENSPreComp.readprofile","text":"readprofile(filename::String, numHeaderlines::Int64, LEtoLE::Bool) Reads precomp profile file. Returns xu, yu, xl, yl\n\n\n\n\n\n","category":"method"},{"location":"reference/referencePreComp/#OWENSPreComp.readsectorsfromfile-Tuple{IOStream, Int64}","page":"OWENSPreComp","title":"OWENSPreComp.readsectorsfromfile","text":"readsectorsfromfile(f::IOStream, n_sector::Int64)\n\nReads OWENSPreComp sector. Returns nlamina,nplies, t, theta, mat_idx\n\n\n\n\n\n","category":"method"},{"location":"reference/referencePreComp/#OWENSPreComp.seg_info-NTuple{16, Any}","page":"OWENSPreComp","title":"OWENSPreComp.seg_info","text":"seg_info(ch, rle, nseg, nseg_u, nseg_p, xnode_u, ynode_u,\nxnode_l, ynode_l, ndl1, ndu1, loc_web, weby_u, weby_l, n_scts,\nxsec_node)\n\nNOTE: coord transformation from xaf-yaf to yre-zref and seg info\n\n\n\n\n\n","category":"method"},{"location":"reference/referencePreComp/#OWENSPreComp.tw_rate-Tuple{Any, Any, Any}","page":"OWENSPreComp","title":"OWENSPreComp.tw_rate","text":"tw_rate(naf, sloc, tw_aero)\n\nArguments\n\nnaf: no of blade stations\nsloc: vector of station locations\ntw_aero_d: vector of twist distribution in degrees\n\nOutputs\n\nth_prime_d: vector of twist rates in degrees\n\n\n\n\n\n","category":"method"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"EditURL = \"../../../examples/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\n#### import PyPlot\nrunpath = path = \"/home/runner/work/OWENS.jl/OWENS.jl/examples/literate\" # to run locally, change to splitdir(@__FILE__)[1]\n# runpath = path = splitdir(@__FILE__)[1]\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 Htwr_base=towerHeight,\n strut_twr_mountpoint = [0.2,0.8],\n strut_bld_mountpoint = [0.2,0.8],\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\nif AD15On #TODO: move this into the run functions\n OWENS.OWENSOpenFASTWrappers.endTurb()\nend\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":"examples/A_simplyRunningOWENS/","page":"Simply Running OWENS","title":"Simply Running OWENS","text":"EditURL = \"../../../examples/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 = path = \"/home/runner/work/OWENS.jl/OWENS.jl/examples/literate\" # to run locally, change to splitdir(@__FILE__)[1]\n# runpath = path = splitdir(@__FILE__)[1]\n\nInp = OWENS.MasterInput(\"$runpath/sampleOWENS.yml\")\n\nOWENS.runOWENS(Inp,runpath)","category":"page"},{"location":"examples/A_simplyRunningOWENS/","page":"Simply Running OWENS","title":"Simply Running OWENS","text":"Here is an example of using the same model against the automated DLC run script. Note that for a setup cutom to a specific design, you'll want to go to the B level to get all of the detailed inputs correct One of these is the controller where a discon controller library can be coupled instead of the specified RPM control.","category":"page"},{"location":"examples/A_simplyRunningOWENS/","page":"Simply Running OWENS","title":"Simply Running OWENS","text":"simulated_time = 2.0 #seconds\nDLCs = [\"1_1\"] #\"normal\"\n#### DLCs = [\"1_3\"] #\"normal\"\n#### DLCs = [\"1_4\"] #\"normal\"\n#### DLCs = [\"1_5\"] #\"normal\"\n#### DLCs = [\"2_1\"] #\"freewheelatNormalOperatingRPM\"\n#### DLCs = [\"2_3\"] #\"freewheelatNormalOperatingRPM\"\n#### DLCs = [\"3_1\"] #\"startup\"\n#### DLCs = [\"3_2\"] #\"startup\"\n#### DLCs = [\"3_3\"] #\"startup\"\n#### DLCs = [\"4_1\"] #\"shutdown\"\n#### DLCs = [\"4_2\"] #\"shutdown\"\n#### DLCs = [\"5_1\"] #\"emergencyshutdown\"\n#### DLCs = [\"6_1\"] #\"parked\"\n#### DLCs = [\"6_2\"] #\"parked_idle\"\n#### DLCs = [\"6_4\"] #\"parked\"\n#### DLCs = [\"7_1\"] #\"parked\"\n#### DLCs = [\"2_3\",\"3_1\",\"3_2\",\"3_3\",\"4_1\",\"4_2\",\"5_1\"]\n\nOWENS.runDLC(DLCs,Inp,runpath;\n IEC_std=\"\\\"1-ED3\\\"\",\n WindChar=\"\\\"A\\\"\",\n WindClass=1,\n NumGrid_Z=38,\n NumGrid_Y=26,\n Vdesign=11.0,\n grid_oversize=1.25,\n Vinf_range=[10.0],#LinRange(4,24,21),\n regenWindFiles=true,\n delta_t_turbsim=0.05,\n simtime_turbsim=30.0,\n pathtoturbsim=\"$(OWENS.OWENSOpenFASTWrappers.OFWpath)/../deps/openfast/build/modules/turbsim/turbsim\",\n runScript=OWENS.runOWENS)\n\nnothing","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":"getting_started/#nothing-yet","page":"nothing yet","title":"nothing yet","text":"","category":"section"},{"location":"reference/referenceAero/#OWENSAero","page":"OWENSAero","title":"OWENSAero","text":"","category":"section"},{"location":"reference/referenceAero/","page":"OWENSAero","title":"OWENSAero","text":"CurrentModule = OWENS","category":"page"},{"location":"reference/referenceAero/#Types-and-functions","page":"OWENSAero","title":"Types and functions","text":"","category":"section"},{"location":"reference/referenceAero/","page":"OWENSAero","title":"OWENSAero","text":"Modules = [OWENS.OWENSAero]","category":"page"},{"location":"reference/referenceAero/#OWENSAero.Environment","page":"OWENSAero","title":"OWENSAero.Environment","text":"Environment(rho::TF,mu::TF,Vx::TAF #Vinf is Vx,Vy::TAF,Vz::TAF,Vtwist::TAF,windangle::TF #radians,DSModel::TS,AModel::TS,awwarm::TVF,steplast::TAI,idxRPI::TAI,Vwakeold::TVF2,BVDynamicFlagL::TAI,BVDynamicFlagD::TAI,alphalast::TAF2,suction::TB) Environment(rho,mu,Vx,Vy,Vz,Vtwist,windangle,DSModel,AModel,awwarm) = Environment(rho,mu,Vx,Vy,Vz,Vtwist,windangle,DSModel,AModel,awwarm,zeros(Int,1),zeros(Int,length(Vx)),deepcopy(Vx),zeros(Int,1),zeros(Int,1),zeros(Real,1),false) Environment(rho,mu,Vx,DSModel,AModel,awwarm) = Environment(rho,mu,Vx,zeros(Real,size(Vx)),zeros(Real,size(Vx)),zeros(Real,size(Vx)),0.0,DSModel,AModel,awwarm,zeros(Int,1),zeros(Int,length(Vx)),deepcopy(Vx),zeros(Int,1),zeros(Int,1),zeros(Real,1),false)\n\nContains specications for turbine slice environment/operating conditions as well as some backend memory for dynamic stall and unsteady calculations\n\nInputs\n\nrho::TF: Working fluid density (kg/m^3)\nmu::TF: Working fluid viscosity (standard SI units)\nV_x::TAF Vinf is Vx for simple simulations (m/s), array corresponding to each azimuthal position\nV_y::TAF: y input velocity (m/s), array corresponding to each azimuthal position\nV_z::TAF: z input velocity (m/s), array corresponding to each azimuthal position\nV_twist::TAF: rotational velocity from active twist (rad/s), array corresponding to each azimuthal position\nwindangle::TF: angle of mean oncoming wind (rad)\nDSModel::TS: dynamic stall model (\"BV\" or \"none\" or \"LB\" - once it is finished)\nAModel::TS: aero model used (\"DMS\" or \"AC\")\naw_warm::TVF: warm start induction factor array, first half corresponding to u, second half to v\nsteplast::TAI: prior simulation step index, used for unsteady wake propogation\nidx_RPI::TAI: used to specify the azimuthal indices needed for a partial solve (i.e. not every azimuthal index), such as is used in the RPI method\nV_wake_old::TVF2: Prior step's mean wake velocity (m/s)\nBV_DynamicFlagL::TAI: Boeing-vertol dynamic stall lift flag\nBV_DynamicFlagD::TAI: Boeing-vertol dynamic stall drag flag\nalpha_last::TAF2: Boeing-vertol dynamic stall prior step's angle of attack\nsuction::TB: DMS flag for alternate induction model\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceAero/#OWENSAero.Turbine","page":"OWENSAero","title":"OWENSAero.Turbine","text":"Turbine(R::TF,r::TAF,z::TF,chord::TAF3,twist::TAF5,delta::TAF,omega::TAF4,B::TI,af::TFN,ntheta::TI,r_delta_influence::TB,centerX::TAF2,centerY::TAF2)\nTurbine(R,r,z,chord,twist,delta,omega,B,af,ntheta,r_delta_infl) = Turbine(R,r,z,chord,twist,delta,omega,B,af,ntheta,r_delta_infl,zeros(Real,size(R)),zeros(Real,size(R)))\nTurbine(R,r,chord,twist,delta,omega,B,af,ntheta,r_delta_infl) = Turbine(R,r,1.0,chord,twist,delta,omega,B,af,ntheta,r_delta_infl,zeros(Real,size(R)),zeros(Real,size(R)))\n\nContains specications for turbine slice (geometry, location, airfoil)\n\nInputs\n\nR::TF: Nominal turbine radius (m)\nr::TAF: Array of local radaii corresponding to each azimuthal position for the slice, allows for active blade deformation (m)\nz::TF: Vertical location of slice (only used when calling inflow-wind turbulent input)(m)\nchord::TAF3: Array of chord corresponding to each azimuthal position, allows for active blade deformation (m)\ntwist::TAF5: Array of blade twist corresponding to each azimuthal position, allows for active blade deformation (rad)\ndelta::TAF: Array of blade slope corresponding to each azimuthal position, allows for active blade deformation (rad)\nomega::TAF4: Array of rotational rate corresponding to each azimuthal position, allows for active blade deformation (rad/s)\nB::TI: Number of blades\naf::TFN: Airfoil function - see tests for example of how to create\nntheta::TI: Number of azimuthal discretizations\nr_delta_influence::TB: Specification of whether local radius and blade slope are used in the influence coefficients for the actuator cylinder method\ncenterX::TAF2: Turbine center x location (only used if multiple turbines are modeled)\ncenterY::TAF2: Turbine center y location (only used if multiple turbines are modeled)\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceAero/#OWENSAero.UnsteadyParams","page":"OWENSAero","title":"OWENSAero.UnsteadyParams","text":"UnsteadyParams(RPI::TB,tau::TAF,ifw::TB,IECgust::TB,nominalVinf::TF,G_amp::TF,gustX0::TF,gustT::TF) UnsteadyParams(RPI,tau,ifw) = UnsteadyParams(RPI,tau,ifw,false,1.0,0.0,1.0,1.0)\n\nContains specications for turbine slice unsteady inputs\n\nInputs\n\nRPI::TB: Flag to specify if RPI is being used\ntau::TAF: Unsteady method wake propogation weighting [3.0,0.3]\nifw::TB: Flag to specify if inflow-wind is being used\nIECgust::TB: Flag to specify if the simple sin-cos gust profile in the x-direction will be used\nnominalVinf::TF: Nominal velocity used to calculate the IEC gust size (m/s)\nG_amp::TF: IEC gust amplitude (m/s)\ngustX0::TF: IEC gust normalized starting point (x-location divided by reference radius)\ngustT::TF: IEC gust duration (s)\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceAero/#OWENSAero.AC-Tuple{Any, Any}","page":"OWENSAero","title":"OWENSAero.AC","text":"AC(turbines, env; w=zeros(Real,2turbines[1].ntheta), idx_RPI=1:2turbine.ntheta, solve=true, ifw=false)\n\nsee ?steady for detailed i/o description\n\nDouble multiple streamtube model\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.AyIJ-NTuple{5, Any}","page":"OWENSAero","title":"OWENSAero.AyIJ","text":"integrand used for computing AIJ\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.Ayintegrand-NTuple{5, Any}","page":"OWENSAero","title":"OWENSAero.Ayintegrand","text":"integrand used for computing Ay\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.Boeing_Vertol-NTuple{11, Any}","page":"OWENSAero","title":"OWENSAero.Boeing_Vertol","text":"Boeing_Vertol(af,alpha,adotnorm,umach,Re,aoaStallPos,aoaStallNeg,AOA0,tc,BV_DynamicFlagL,BV_DynamicFlagD; family_factor = 0.0)\n\nBoeing-Vertol Dynamic Stall Model. All angles are in rad unless explicitely stated otherwise (e.g. alpha_d) Arguments\n\naf::airfoil_data4D: airfoil function callable by: CL, CD, CM = af(aoa,Re,mach,family_factor)\nalpha::Float64: Static Angle of Attack (at 0.75 chord)\nadotnorm::Float64: Normalized Change in Angle of Attack adotc/(2U)\numach::Float64: Blade mach number\nRe::Float64: Blade Reynolds number\naoaStallPos::Float64: Positive Stall Angle (onset)\naoaStallNeg::Float64: Negative Stall Angle (onset)\nAOA0::Float64: Zero Lift AOA\ntc::Float64: Thickness to chord ratio\nBV_DynamicFlagL::Int: lagged dynamic stall state for lift\nBV_DynamicFlagD::Int: lagged dynamic stall state for drag\nfamily_factor::float64: factor indexing airfoil family, if used\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.DMS-Tuple{Any, Any}","page":"OWENSAero","title":"OWENSAero.DMS","text":"DMS(turbine, env; w=0, idx_RPI=1:turbine.ntheta, solve=true)\n\nsee ?steady for detailed i/o description\n\nDouble multiple streamtube model\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.DxII-Tuple{Any}","page":"OWENSAero","title":"OWENSAero.DxII","text":"integrand used for computing DxII\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.DxIJ-NTuple{5, Any}","page":"OWENSAero","title":"OWENSAero.DxIJ","text":"integrand used for computing DxIJ\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.Dxintegrand-NTuple{5, Any}","page":"OWENSAero","title":"OWENSAero.Dxintegrand","text":"integrand used for computing Dx\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.Unsteady_Step-NTuple{4, Any}","page":"OWENSAero","title":"OWENSAero.Unsteady_Step","text":"Unsteady_Step(turbine,env,us_param,mystep)\n\ncalls inflow wind init\n\nInputs\n\nturbine::Turbine: turbine input for slice see ?Turbine\nenv::Env: environment input for slice see ?Env\nus_param::UnsteadyParams: unsteady inputs for slice see ?UnsteadyParams\nmystep::int: continuous index cooresponding to the azimuthal discretation - i.e. for ntheta of 30 step 1 is the first step of rev 1, sep 31 is the first step of rev 2, etc. Keeps track of temporal locaion\n\nOutputs:\n\nCP: This slice's coefficient of performance at this step\nTh: This slice's thrust coefficient at this step\nQ: Torque (N0m) at this step\nRp: Radial force per height (N) at this step\nTp: Tangential force per height (N) at this step\nZp: Vertical force per height (N) at this step\nVloc: Local velocity array for each azimuthal position (includes induction) (m/s) at this step\nCD: This slice's drag coefficient at this step\nCT: This slice's thrust coefficient (should equal drag, but may no depending on usage or solver status) at this step\namean: Mean turbine induction in the streamwise direction at this step\nastar: Solved induction factors for each azimuthal location. First half are streamwise (u), second are cross-steam (v) at this step\nalpha: Local angle of attack array for each azimuthal position (includes induction) (rad) at this step\ncl: Local lift coefficient used for each azimuthal position at this step\ncd_af: Local drag coefficient used for each azimuthal position at this step\nthetavec: Azimuthal location of each discretization (rad)\nRe: Reynolds number for each azimuthal position at this step\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.WxII-Tuple{Any}","page":"OWENSAero","title":"OWENSAero.WxII","text":"integrand used for computing WxII\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.WxIJ-Tuple{Any, Any, Any}","page":"OWENSAero","title":"OWENSAero.WxIJ","text":"integrand used for computing WxIJ\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.advanceTurb-Tuple{Any}","page":"OWENSAero","title":"OWENSAero.advanceTurb","text":"advanceTurb(tnew;ts=2*pi/(turbslices[1].omega[1]*turbslices[1].ntheta))\n\nRuns a previously initialized aero model (see ?setupTurb) in the unsteady mode (can be repeateadly called, or called for a specific time, or repeatedly called for sections of time)\n\nInputs\n\ntnew::float: new time (s); will run from last time specified from the last call, to the current time specified, or from t=ts if the first time called\nts::float: optional, desired timestep. Will run at finer timesteps than the azimuthal discretization without interfering with wake propogation. While possible, it is not recommended to run with timesteps larger than the azimuthal discretization (hence the optional nature and automatic calculation)\n\nOutputs:\n\nCP: Turbine coefficient of performance\nRp: Array(B,Nslices,nsteps) of radial force (N) where nsteps = max(1,round(Int,(tnew-timelast)/ts))\nTp: Array(B,Nslices,n_steps) of tangential force (N)\nZp: Array(B,Nslices,n_steps) of vertical force (N)\nalpha: Array(B,Nslices,n_steps) of angle of attack (rad)\ncl: Array(B,Nslices,n_steps) of airfoil cl used\ncd_af: Array(B,Nslices,n_steps) of airfoil cd used\nVloc: Array(B,Nslices,n_steps) of airfoil local velocity used\nRe: Array(B,Nslices,n_steps) of airfoil Reynolds number used\nthetavec: Azimuthal discretization location (rad)\nntheta: number of azimuthal discretizations used\nFx_base: Array(ntheta)Turbine base Fx (N)\nFy_base: Array(ntheta)Turbine base Fy (N)\nFz_base: Array(ntheta)Turbine base Fz (N)\nMx_base: Array(ntheta)Turbine base Mx (N-m)\nMy_base: Array(ntheta)Turbine base My (N-m)\nMz_base: Array(ntheta)Turbine base Mz (N-m)\npower: Array(ntheta)Turbine power (watts)\npower2: Turbine average power for the revolution (watts)\ntorque: Array(ntheta)Turbine torque (N-m) (alternative calculation method from Mz-base)\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.deformTurb-Tuple{Any}","page":"OWENSAero","title":"OWENSAero.deformTurb","text":"deformTurb(azi;newOmega=-1,newVinf=-1,bldx=-1, bldz=-1, bld_twist=-1, steady=false)\n\nEquivalent to an update states call, mutating the internal aerodynamic inputs within the unsteady model.\n\nInputs\n\nazi: Current azimuth position of the turbine in radians (continuously growing with numbers of revolutions)\nbld_x: Blade structural x shape, size(NBlade,any), any as it is splined against bld_z and the aero discretization\nbld_z: Blade structural z shape, size(NBlade,any), any as it is splined against bld_x and the aero discretization\nbld_twist: Blade structural twist, size(NBlade,any), any as it is splined against bld_z and the aero discretization. Note that in the calcs, this will be in addition to the aero twist offset already applied in initialization.\naccel_flap_in: Blade structural acceleration in the flap direction, size(NBlade,any), any as it is splined against bld_z and the aero discretization\naccel_edge_in: Blade structural acceleration in the edge direction, size(NBlade,any), any as it is splined against bld_z and the aero discretization\nsteady::bool: if steady is true, it just updates a single step. TODO: verify this is correct\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.matrixAssemble-NTuple{5, Any}","page":"OWENSAero","title":"OWENSAero.matrixAssemble","text":"Internal, assembles the matrices of multiple turbine systems into a combined system centerX, centerY: array of x,y coordinates for centers of the VAWTs in the farm radii: corresponding array of their radii\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.pInt-Tuple{Any, Any}","page":"OWENSAero","title":"OWENSAero.pInt","text":"Internal, integration for a periodic function where end points don't reach ends (uses trapezoidal method)\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.panelIntegration-NTuple{6, Any}","page":"OWENSAero","title":"OWENSAero.panelIntegration","text":"applies for both Ay and Rx depending on which function ifunc(x, y, phi) is passed in\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.precomputeMatrices-NTuple{4, Any}","page":"OWENSAero","title":"OWENSAero.precomputeMatrices","text":"Internal, precomputes influence coefficient matricies and saves them as HDF5 files\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.radialforce-NTuple{5, Any}","page":"OWENSAero","title":"OWENSAero.radialforce","text":"Internal, calculates the radial force used in the residual function as well as the turbine performance when converged\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.readaerodyn-Tuple{Any}","page":"OWENSAero","title":"OWENSAero.readaerodyn","text":"readaerodyn(filename)\n\ncreate airfoil lookup for a file with only one reynolds number\n\nInputs\n\nfilename::string: file path/name to airfoil file formatted like in the test folder\n\nOutputs:\n\naf::function: cl, cd = af(alpha,re,mach) with alpha in rad\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.readaerodyn_BV-Tuple{Any}","page":"OWENSAero","title":"OWENSAero.readaerodyn_BV","text":"readaerodyn_BV(filename)\n\ncreate airfoil lookup function with boeing vertol dynamic stall model for a file with only one reynolds number\n\nInputs\n\nfilename::string: file path/name to airfoil file formatted like in the test folder\n\nOutputs:\n\naf::function: cl, cd = afBV(alpha,Re,M,env,Vtwist,c,dt,U;solvestep=false) with alpha in rad, OWENSAero.Env, V_twist in rad/s, c chord in m, dt in sec, U Vloc in m/s, solvestep true during solve loop\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.readaerodyn_BV_NEW-Tuple{Any}","page":"OWENSAero","title":"OWENSAero.readaerodyn_BV_NEW","text":"readaerodyn_BV_NEW(filename;DSModel=\"BV\")\n\nfor a file with multiple reynolds numbers create airfoil lookup function with boeing vertol dynamic stall model and wrap interpolation\n\nInputs\n\nfilename::string: file path/name to airfoil file formatted like in the test folder\nDSModel::string: \"BV\" or \"none\"\n\nOutputs:\n\naf::function: cl, cd = afBV(alpha,Re,M,env,Vtwist,c,dt,U;solvestep=false) with alpha in rad, OWENSAero.Env, V_twist in rad/s, c chord in m, dt in sec, U Vloc in m/s, solvestep true during solve loop\naf::function: cl, cd = af(alpha,re,mach) with alpha in rad\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.residual-NTuple{6, Any}","page":"OWENSAero","title":"OWENSAero.residual","text":"Internal, sets up the residual function\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.setupTurb-NTuple{6, Any}","page":"OWENSAero","title":"OWENSAero.setupTurb","text":"setupTurb(bldx,bldz,B,chord,omega,Vinf; Height = maximum(bldz), Radius = maximum(bldx), eta = 0.25, twist = 0.0, #or array{Float,Nslices} rho = 1.225, mu = 1.7894e-5, RPI = true, tau = [0.3,3.0], ntheta = 30, Nslices = 30, #TODO: make this different from ntheta ifw = false, DSModel = \"BV\", AModel = \"DMS\", windangleD = 0.0, afname = \"(path)/airfoils/NACA0015RE3E5.dat\", #TODO: analytical airfoil as default turbsimfilename = \"(path)/data/ifw/turbDLC1p313mps330mseed1.bts\", ifwlibfile = joinpath(dirname(@FILE), \"../bin/libifwcbinding\"), AMflag = false, buoyflag = false, rotAccelflag = false, AMCoeffCa = 1.0)\n\nInitializes aerodynamic models and sets up backend persistent memory to simplify intermittent calling within coupled solver loops\n\nInputs\n\nbld_x: Blade x shape\nbld_z: Blade z shape\nB: Number of blades\nchord: chord length (m)\nomega: rotation rate in rad/s. size(1) or size(ntheta), pass in an array(Real,ntheta) when propogating automatic gradients\nVinf: Inflow velocity\nHeight: turbine total height (m) typically maximum(bldz) unless only the shape and not size of bldz is being used\nRadius: turbine nominal radius (m) typically maximum(bldx) unless only shape and not size of bldx is used\neta: blade mount point ratio, i.e. 0.25 would be at the quarter chord\ntwist: 0.0, #or array{Float,Nslices}\nrho: working fluid density (kg/m^3)\nmu: working fluid dynamic viscosity (Pa*s)\nRPI: RPI method flag\ntau: Unsteady wake propogation time constants [0.3,3.0],\nntheta: Number of azimuthal discretizations\nNslices: Number of vertical slices of the turbine\nifw: flag for inflow wind\nDSModel: Dynamic stall model \"BV\" or \"none\" or \"LB\" when we get it working\nAModel: Aerodynamic model \"DMS\" or \"AC\"\nwindangle_D: Inflow wind angle (degrees)\nafname: airfoil path and name e.g. \"(path)/airfoils/NACA0015RE3E5.dat\"\nturbsim_filename: turbsim path and name e.g. \"(path)/data/ifw/turbDLC1p313mps330mseed1.bts\",\nifw_libfile: inflow wind dynamic library location e.g. joinpath(dirname(@FILE), \"../../../openfast/build/modules/inflowwind/libifwcbinding\"))\nAM_flag::bool: flag to turn on added mass effects\nbuoy_flag::bool: flag to turn on buoyancy forces\nrotAccel_flag::bool: flag to turn on the rotational acceleration portion of added mass for a crossflow turbine\nAM_Coeff_Ca::float: added mass coefficient, typically 1.0\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.steady-Tuple{Any, Any}","page":"OWENSAero","title":"OWENSAero.steady","text":"steady(turbine::Turbine, env::Env; w=zeros(Real,2*turbine.ntheta), idx_RPI=1:2*turbine.ntheta,solve=true,ifw=false)\n\nCalculates steady state aerodynamics for a single VAWT slice\n\nInputs\n\nturbine::Turbine: Turbine struct, see ?Turbine for details\nenv::Env: Env struct, see ?Env for details\nw::Array(<:Real): Optional, used if solve=false, induction factor array, first half corresponding to u, second half to v\nidx_RPI::Array(<:Int): Optional, used to specify the azimuthal indices needed for a partial solve (i.e. not every azimuthal index), such as is used in the RPI method\nsolve::Bool: Optional, False is used when you want the model outputs for a given set of induction factors without resolving them.\nifw::Bool: Optional, used to tell the Vinf lookup to attempt to use the dynamic inflow wind library, requires preprocessing as is shown in the test cases.\n\nOutputs:\n\nCP: This slice's coefficient of performance\nTh: This slice's thrust coefficient\nQ: Torque (N0m)\nRp: Radial force per height (N)\nTp: Tangential force per height (N)\nZp: Vertical force per height (N)\nVloc: Local velocity array for each azimuthal position (includes induction) (m/s)\nCD: This slice's drag coefficient\nCT: This slice's thrust coefficient (should equal drag, but may no depending on usage or solver status)\namean: Mean turbine induction in the streamwise direction\nastar: Solved induction factors for each azimuthal location. First half are streamwise (u), second are cross-steam (v)\nalpha: Local angle of attack array for each azimuthal position (includes induction) (rad)\ncl: Local lift coefficient used for each azimuthal position\ncd_af: Local drag coefficient used for each azimuthal position\nthetavec: Azimuthal location of each discretization (rad)\nRe: Reynolds number for each azimuthal position\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.steadyTurb-Tuple{}","page":"OWENSAero","title":"OWENSAero.steadyTurb","text":"steadyTurb(omega,Vinf)\n\nRuns a previously initialized aero model (see ?setupTurb) in the steady state mode\n\nInputs\n\nomega::float: turbine rotation rate (rad/s)\nVinf::float: turbine steady inflow velocity (m/s)\n\nOutputs:\n\nCP: Turbine coefficient of performance\nRp: Array(B,Nslices,ntheta) of radial force (N)\nTp: Array(B,Nslices,ntheta) of tangential force (N)\nZp: Array(B,Nslices,ntheta) of vertical force (N)\nalpha: Array(B,Nslices,ntheta) of angle of attack (rad)\ncl: Array(B,Nslices,ntheta) of airfoil cl used\ncd_af: Array(B,Nslices,ntheta) of airfoil cd used\nVloc: Array(B,Nslices,ntheta) of airfoil local velocity used\nRe: Array(B,Nslices,ntheta) of airfoil Reynolds number used\nthetavec: Azimuthal discretization location (rad)\nntheta: number of azimuthal discretizations used\nFx_base: Array(ntheta)Turbine base Fx (N)\nFy_base: Array(ntheta)Turbine base Fy (N)\nFz_base: Array(ntheta)Turbine base Fz (N)\nMx_base: Array(ntheta)Turbine base Mx (N-m)\nMy_base: Array(ntheta)Turbine base My (N-m)\nMz_base: Array(ntheta)Turbine base Mz (N-m)\npower: Array(ntheta)Turbine power (watts)\npower2: Turbine average power for the revolution (watts)\ntorque: Array(ntheta)Turbine torque (N-m) (alternative calculation method from Mz-base)\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.streamtube-NTuple{4, Any}","page":"OWENSAero","title":"OWENSAero.streamtube","text":"INTERNAL streamtube(a,theta,turbine,env;output_all=false,Vxwake=nothing,solvestep=false)\n\nDouble multiple streamtube individual streamtube calculation\n\nOutput:\n\nif outputall return Th, Q, Rp, Tp, Zp, Vloc, CD, CT, alpha, cl, cdaf, Re else return CD-CT # Residual, section 2.4 end\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.trapz-Tuple{Any, Any}","page":"OWENSAero","title":"OWENSAero.trapz","text":"Internal, trapezoidal integration of y w.r.t. x\n\n\n\n\n\n","category":"method"},{"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/","page":"Developer Guide","title":"Developer Guide","text":"Aerodynamics forces are radial inward positive and tangential in direction of rotation positive. So, the blade local accelerations in the radial will be outward positive and in the tangential will be in the opposite direction of rotation for a CCW rotor. CW rotors are still in work and would need to have the local frame of reference rotation verified. Therefor, for the added mass equations, the forces should be negated. ","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-(Onshore/Offshore-Wind/Water-ENergy-Simulator)","page":"Home","title":"OWENS (Onshore/Offshore Wind/Water ENergy Simulator)","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"(Image: ) (Image: )","category":"page"},{"location":"","page":"Home","title":"Home","text":"This package is for experienced researchers and analyists with both software and engineering experience who need generalized flexibility and performance that is 100% open source and is compatible with gradient based optimization with automatic gradients in process. If you want a windows compatible GUI, please use QBlade. ","category":"page"},{"location":"","page":"Home","title":"Home","text":"OWENS is an ontology, or way of coupling modular aerodynamic, structural, hydrodynamic, and controls packages. It was originally based on the structural dynamics solver by Brian Owens (see dissertation: http://hdl.handle.net/1969.1/151813). However, it has been rewritten into the Julia programming language, modularized, and many of the issues related to aerodynamic coupling and floating dynamics solved, with extensive expansion into other areas and features to provide a seamless and automated process that takes in high level design details and does all of the preprocessing, running, and post processing that is normally done under different roofs or by different manual processes. This was done with the intent of enabling fast, parametric design. We have many of the modules propogating automatic gradients, however this is still a future challenge to solve well. ","category":"page"},{"location":"","page":"Home","title":"Home","text":"Here are several examples of OWENS use cases, current and past, including the Sandia 34m research turbine.","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: SNL34m.){#fig:34m width=\"50%\"}","category":"page"},{"location":"","page":"Home","title":"Home","text":"Then here is an example of a helical design. Note that arbitrary numbers of struts can be specified in the automatic meshing functions. You can also write your own generalized mesh using the internal building blocks, but it is not thouroughly documented.","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: helical.){#fig:34m width=\"50%\"}","category":"page"},{"location":"","page":"Home","title":"Home","text":"The generalized meshing was modified to include HAWT concepts, like this bi-wing concept. OWENS is capable of axial flow turbines/HAWTs, but it is not a mature feature, and no where near as developed as OpenFAST (i.e. for regular HAWTs it is recommended to use that software).","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: biwing.){#fig:34m width=\"50%\"}","category":"page"},{"location":"","page":"Home","title":"Home","text":"Then, floating turbines are a possibility, though this feature adds another dimension to the nonlinear time stepping convergance and in turn a fair amount of time. Future work is to make this general interface and functionality an easy to use feature (right now it needs a high level of experience to use).","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: arcus.){#fig:34m width=\"50%\"}","category":"page"},{"location":"#OWENS-under-the-hood","page":"Home","title":"OWENS under the hood","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"The OWENS.jl package contains functions and interfaces related to the ontology (how everything comes together, forms a wind turbine, and operates like a wind turbine), with preprocessing and postprocessing helper functions. These include automated meshing functions, sectional property mapping, two-way loads mapping, generalized torque and direct mesh controls, algorithms for two-way coupling and time stepping, fatigue and design equivalent load calculation, and all of the ontology and coupling to the other packages used.","category":"page"},{"location":"","page":"Home","title":"Home","text":"OWENSPrecomp.jl is a translation of Precomp and calculates the sectional properties","category":"page"},{"location":"","page":"Home","title":"Home","text":"Composites.jl provides classical laminate theory definitions used for both pre and post processing","category":"page"},{"location":"","page":"Home","title":"Home","text":"OWENSFEA.jl is one of the structural models including a Timoshenko beam solver in the linear and nonlinear steady, modal, time domain, and reduced order modal domains.","category":"page"},{"location":"","page":"Home","title":"Home","text":"GXBeam.jl has also been integrated for geometrically exact beam solutions of the same above","category":"page"},{"location":"","page":"Home","title":"Home","text":"The aerodynamics are provided by the OWENSAero.jl module, or optionally OpenFAST OLAF via OWENSOpenFASTWrappers.jl","category":"page"},{"location":"","page":"Home","title":"Home","text":"Floating dynamics are provided by OWENSOpenFASTWrappers.jl and the HydroDyn and MoorDyn libraries","category":"page"},{"location":"","page":"Home","title":"Home","text":"Turbulent inflow is provided by OWENSOpenFASTWrappers.jl and the inflowwind and turbsim libraries","category":"page"},{"location":"","page":"Home","title":"Home","text":"Rainflow counting was provided by Rainflow.jl, however, this package became orphained and was pulled into the OWENS code base.","category":"page"},{"location":"","page":"Home","title":"Home","text":"\"drawing\"","category":"page"},{"location":"#Installation","page":"Home","title":"Installation","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Please follow the instructions on the setup page","category":"page"},{"location":"#Documentation","page":"Home","title":"Documentation","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"-\tAll of the functions have docstrings describing the i/o and function purpose, which can be accessed the docs site or by: * import module * ? module.function() \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, or by optionally loading the provided VS code profile in the OWENS.jl/docs folder. This VS code profile will also set up the julia environment and other useful packages and key bindings, and can be modified as desired.","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":"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":"reference/referenceFEA/#OWENSFEA","page":"OWENSFEA","title":"OWENSFEA","text":"","category":"section"},{"location":"reference/referenceFEA/","page":"OWENSFEA","title":"OWENSFEA","text":"CurrentModule = OWENS","category":"page"},{"location":"reference/referenceFEA/#Types-and-functions","page":"OWENSFEA","title":"Types and functions","text":"","category":"section"},{"location":"reference/referenceFEA/","page":"OWENSFEA","title":"OWENSFEA","text":"Modules = [OWENS.OWENSFEA]","category":"page"},{"location":"reference/referenceFEA/#OWENSFEA.BC_struct","page":"OWENSFEA","title":"OWENSFEA.BC_struct","text":"Internal, boundary condition data, see ?FEAModel for pBC\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.ConcNDL1D","page":"OWENSFEA","title":"OWENSFEA.ConcNDL1D","text":"Internal, NodalTerms node number, local dof (diagonal), and value\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.ConcNDL2D","page":"OWENSFEA","title":"OWENSFEA.ConcNDL2D","text":"Internal, NodalTerms node number, local dof1, local dof2, and value\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.DispData","page":"OWENSFEA","title":"OWENSFEA.DispData","text":"Internal, displacement, velocity, and acceleration for each element\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.DispOut","page":"OWENSFEA","title":"OWENSFEA.DispOut","text":"DispOut(elStrain,displ_sp1,displddot_sp1,displdot_sp1)\n\nInternal, displacement, velocity, and acceleration for each element\n\nInputs\n\nelStrain: Not used, should be removed from this struct\n`displ_sp1::Array{<:float}: displacement position for each dof\n`displddot_sp1::Array{<:float}: displacement acceleration for each dof\n`displdot_sp1::Array{<:float}: displacement velocity for each dof\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.El","page":"OWENSFEA","title":"OWENSFEA.El","text":"Internal, see ?Ort and ?SectionPropsArray\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.ElInput","page":"OWENSFEA","title":"OWENSFEA.ElInput","text":"Internal, inputs to Timoshenko element, inputs given by FEAModel struct and mesh\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.ElOutput","page":"OWENSFEA","title":"OWENSFEA.ElOutput","text":"Internal, timoshenko element output matrices\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.ElStorage","page":"OWENSFEA","title":"OWENSFEA.ElStorage","text":"Internal, Timoshenko element matrices\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.ElStrain","page":"OWENSFEA","title":"OWENSFEA.ElStrain","text":"ElStrain(eps_xx_0,eps_xx_z,eps_xx_y,gam_xz_0,gam_xz_y,gam_xy_0,gam_xy_z)\n\nStruct containing element straing\n\nInputs\n\nepsilon_x::float: epsilon_x strain in the x direction\nepsilon_y::float: epsilon_y strain in the y direction\nepsilon_z::float: epsilon_z strain in the z direction\nkappa_x::float: kappa_x curvature in the x direction\nkappa_y::float: kappa_y curvature in the y direction\nkappa_z::float: kappa_z curvature in the z direction\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.FEAModel-Tuple{}","page":"OWENSFEA","title":"OWENSFEA.FEAModel","text":"FEAModel(;analysisType = \"TNB\",\n initCond = [],\n aeroElasticOn = false,\n guessFreq = 0.0,\n airDensity=1.2041,\n gravityOn = true,\n nlOn = false,\n spinUpOn = false,\n outFilename = \"none\",\n RayleighAlpha = 0.0,\n RayleighBeta = 0.0,\n elementOrder = 1,\n joint = [0,0],\n platformTurbineConnectionNodeNumber = 1,\n jointTransform = 0.0,\n reducedDOFList = zeros(Int,2),\n numDOFPerNode = 6,\n numNodes = 0,\n numModes = 20,\n nlParams = 0,\n pBC = 0,\n nodalTerms = 0.0,\n iterationType = \"NR\",\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\nModel inputs for FEA analysis, struct\n\nInputs\n\nanalysisType::string: Newmark Beta time stepping \"TNB\", Dean time stepping \"TD\", modal \"M\", and stiff \"stiff\" (where the forces are just directly mapped, the displacements and strains set to 0 and the structures not run)\ninitCond::Array{<:float}: Initial conditions Nx3 matrix consisting of nodeNumber, local DOF (1-6), and displacement value\naeroElasticOn::Bool: Include simplified flutter calculataions in the timoshenko element matrices\nguessFreq::float: aeroelastic starting guess, only used if aeroElasticOn\nairDensity::float: working fluid density\ngravityOn::Bool orArray{<:float}: vector of 3 or flag to include distributed gravity acceleration (9.81m/s) in the negative z-direction\nnlOn::Bool: flag for solver to calculate deflection induced stiffness changes and associated convergance to the coupled solution\nspinUpOn::Bool: flag to perform a static analysis (warm start) prior to performing modal analysis\noutFilename::string: /path/to/desired/output/filename if it doesn't exist already it is created, if exists, is overwritten\nRayleighAlpha::float: Rayleigh alpha damping used in timoshenko beam damping matrix\nRayleighBeta::float: Rayleigh beta damping used in timoshenko beam damping matrix\nelementOrder::int: order of element: 1 linear, 2 quadratic\njoint::Array{<:float}: jointNumber masterNode slaveNode jointType (0 weld/fixed, 1 pinned, 2 hinge along local \"2\", 3 hinge about local \"1\", 4 hinge along \"3\", 5 rigid bar constraint) jointMass 0.0 jointPsi jointTheta\nplatformTurbineConnectionNodeNumber::int: node at which reaction forces are calculated\njointTransform: not used as an input, is calculated, local transform between dependent and active DOFs for nodes associated with a particular joint\nreducedDOFList::Array{<:int}: not used as an input, is calculated, map of original DOF numbering to reduced DOF numbering\nnumDOFPerNode::int: number of degrees of freedom per node\nnumNodes::int: total number of nodes in the mesh\nnumModes::int: number of modes to calculate\nnlParams::NlParams: optional there in case the Nlparams struct is passed in, should be cleaned up since redundant\nalpha::float64: optional newmark beta alpha parameter,If TD, use 0.25\ngamma::float64: optional newmark beta gamma parameter, if static, use 0. If hydro, use 1.0\npBC::Array{<:float}: Nx3 array consisting of node, local dof, specified displacement value for the boundary condition\nnodalTerms: Concentrated nodal terms, should be replaced with the nodal input data array and the calc done internally\niterationType::string: FEA displacement update calculation, Newton Raphson \"NR\", Direct Iteration \"DI\"\nadaptiveLoadSteppingFlag: Unused, should be removed\ntolerance::float: FEA total mesh unsteady analysis convergence tolerance for a timestep\nmaxIterations: FEA total mesh unsteady analysis convergence max iterations for a timestep\nmaxNumLoadSteps: used in static (steady state) analysis\nminLoadStepDelta: used in static (steady state) analysis\nminLoadStep: used in static (steady state) analysis\nprescribedLoadStep: used in static (steady state) analysis\npredef::Bool: will update the elStorage array if passed into Unsteady() with the nonlinear strain stiffening, to be used for subsequent analyses\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.Mesh","page":"OWENSFEA","title":"OWENSFEA.Mesh","text":"Mesh(nodeNum,numEl,numNodes,x,y,z,elNum,conn,type,meshSeg,structuralSpanLocNorm,structuralNodeNumbers,structuralElNumbers)\n\nStruct with mesh definition\n\nInputs\n\nnodeNum::Array{<:int}: Number mapping of nodes (typically 1:Nnodes)\nnumEl::int: total number of elements\nnumNodes::int: total number of nodes\nx::Array{<:float}: Nodal x position\ny::Array{<:float}: Nodal y position\nz::Array{<:float}: Nodal z position\nelNum::Array{<:int}: Number mapping of elements (typically 1:Nelements)\nconn::Array{<:int}: Nelemx2 connectivity between nodes, gaps between joints (which are defined in the joints)\ntype::Array{<:int}: 0-blade 1-tower 2-strut\nmeshSeg::Array{<:int}: number of nodes within each segment, with segments consisting of tower, blade 1 2 etc, struts\nstructuralSpanLocNorm::Array{<:float}: Should be named heigh loc norm - unitized position along the blade height, used for aeroload mapping\nstructuralNodeNumbers::Array{<:int}: Node numbers associated with blades for aero loads mapping\nstructuralElNumbers::Array{<:int}: Element numbers associated with blades for aero loads mapping\nnonRotating::Array{<:int}: size(Nsections,numNodes) where nsections are the number of sections of the mesh that are non-rotating, like if for some reason you had two towers, or if you had multiple guy wires\nhubNodeNum::int: Node number where the rotating part of the turbine starts, assumes meshing always starts with tower, then blades, etc.\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.NlParams","page":"OWENSFEA","title":"OWENSFEA.NlParams","text":"NlParams(iterationType,adaptiveLoadSteppingFlag,tolerance,maxIterations,maxNumLoadSteps,minLoadStepDelta,minLoadStep,prescribedLoadStep)\n\nSee ?FEAModel\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.NodalTerms","page":"OWENSFEA","title":"OWENSFEA.NodalTerms","text":"Internal, see ?FEAModel for NodalTerms\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.Ort","page":"OWENSFEA","title":"OWENSFEA.Ort","text":"Ort(Psi_d,Theta_d,Twist_d,Length,elNum,Offset)\n\nStruct with element orientation\n\nInputs\n\nPsi_d::Array{<:float}: length NumEl, element rotation about 3 in global FOR (deg) These angles are used to transform from the global coordinate frame to the local element/joint frame via a 3-2 Euler rotation sequence.\nTheta_d::Array{<:float}: length NumEl, element rotation about 2 (deg)\nTwist_d::Array{<:float}: length NumEl, element twist (deg)\nLength::Array{<:float}: length NumEl, element length (m)\nelNum::Array{<:float}: Element number the other arrays are associated with\nOffset::Array{<:float}: hub frame coordinate of node 1 of the element\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.ROM","page":"OWENSFEA","title":"OWENSFEA.ROM","text":"Internal, ROM data\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.SectionPropsArray","page":"OWENSFEA","title":"OWENSFEA.SectionPropsArray","text":"SectionPropsArray(ac,twist,rhoA,EIyy,EIzz,GJ,EA,rhoIyy,rhoIzz,rhoJ,zcm,ycm,a,EIyz,alpha1,alpha2,alpha3,alpha4,alpha5,alpha6,rhoIyz,b,a0,aeroCenterOffset,xaf,yaf)\n\nStruct with element sectional properties, each component is a 1x2 array with distributed properties\n\nInputs\n\nac::Array{<:float}: aerodynamic center, used in flutter approximation\ntwist::Array{<:float}: element twist (rad)\nrhoA::Array{<:float}: rho * A in standard SI units\nEIyy::Array{<:float}: E * Iyy\nEIzz::Array{<:float}: E * Izz\nGJ::Array{<:float}: G * J\nEA::Array{<:float}: E * A\nrhoIyy::Array{<:float}: rho * Iyy\nrhoIzz::Array{<:float}: rho * Izz\nrhoJ::Array{<:float}: rho * J\nzcm::Array{<:float}: z location of center of mass\nycm::Array{<:float}: y location of center of mass\na::Array{<:float}: possibly lift slope\nEIyz::Array{<:float}: E * Iyz\nalpha1::Array{<:float}: #This is always 0 in the element file, and it is unclear what it is used for since I can't find it being used in the code\nalpha2::Array{<:float}: doesn't appear to be used\nalpha3::Array{<:float}: doesn't appear to be used\nalpha4::Array{<:float}: doesn't appear to be used\nalpha5::Array{<:float}: doesn't appear to be used\nalpha6::Array{<:float}: doesn't appear to be used\nrhoIyz::Array{<:float}: rho * Iyz\nb::Array{<:float}: used in flutter approximation, possibly a chord or thickness value\na0::Array{<:float}: zero lift angle of attack, used in flutter approximation\naeroCenterOffset::Array{<:float}: doesn't appear to be used\nxaf::Array{<:float}: x airfoil coordinates (to scale)\nyaf::Array{<:float}: y airfoil coordinates (to scale)\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.TimeInt","page":"OWENSFEA","title":"OWENSFEA.TimeInt","text":"Internal, time integration terms\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceFEA/#OWENSFEA.ConcMassAssociatedWithElement-NTuple{5, Any}","page":"OWENSFEA","title":"OWENSFEA.ConcMassAssociatedWithElement","text":"ConcMassAssociatedWithElement(conn,joint,nodalMassTerms,nodalStiffnessTerms,nodalLoads)\n\nCompiles concentrated mass, stiffness, and load associated with a node from both ndl and joint files. The mod* variables are passed back with these terms removed to prevent duplicate application of shared nodal terms between elements\n\n#Input\n\nconn connectivity list for element\njoint joint array for nodal terms\nnodalMassTerms listing of concentrated nodal mass terms\nnodalStiffnessTerms listing of concentrated nodal stiffness terms\nnodalLoads listing of concentrated nodal loads terms\n\n#Output\n\nmass array of concentrated mass associated with element\nstiff array of concentrated stiffness associated with element\nload array of concentrated loads associated with element\nmodJoint modified joint object removing nodal terms that have/will be applied to the element calculations\nmodNodalMassTerms modified nodal mass object removing nodal terms that have/will be applied to the element calculations\nmodalStiffnessTerms modified nodal stiffness object removing nodal terms that have/will be applied to the element calculations\nmodNodalLoads modified nodal loads object removing nodal terms that have/will be applied to the element calculations\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.ModalOutput-NTuple{6, Any}","page":"OWENSFEA","title":"OWENSFEA.ModalOutput","text":"writeOutput(freq,damp,phase1,phase2,imagComponentSign,fid)\n\nInternal, writes an output file and or formats an output for modal analysis.\n\n#Input\n\nfreq: array of modal frequencies\ndamp: array of modal damping ratios\nphase1: array of in phase mode shapes\nphase2: array of out of phase mode shapes\nimagComponentSign: array of sign of imaginary components\nfid: file identifier for output\n\n#Output\n\nfreqSorted: array of sorted(by frequency) modal frequencies\ndampSorted: array of sorted(by frequency) modal damping ratios\nimagCompSignSorted: array of sorted(by frequency) of imaginarycomponentSign array\nU_x_0: see ?Modal outputs\nU_y_0: see ?Modal outputs\nU_z_0: see ?Modal outputs\ntheta_x_0: see ?Modal outputs\ntheta_y_0: see ?Modal outputs\ntheta_z_0: see ?Modal outputs\nU_x_90: see ?Modal outputs\nU_y_90: see ?Modal outputs\nU_z_90: see ?Modal outputs\ntheta_x_90: see ?Modal outputs\ntheta_y_90: see ?Modal outputs\ntheta_z_90: see ?Modal outputs\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.adaptiveLoadStepping-NTuple{4, Any}","page":"OWENSFEA","title":"OWENSFEA.adaptiveLoadStepping","text":"Internal, performs updates a loadstep adaptively, see ?updateLoadStep\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.applyBC-NTuple{4, Any}","page":"OWENSFEA","title":"OWENSFEA.applyBC","text":"applyBC(Kg,Fg,BC,u,iterationType,numDofPerNode)\n\nInternal, applies boundary conditions to the stiffness matrix and load vector for a static analysis.\n\n#Input\n\nKg assembled global stiffness matrix\nFg assembled global load vector\nBC struct of boundary condition information\nu global displacement vector\niterationType for nonlinear analysis, not used in BLAST\nnumDofPerNode number of degrees of freedom per node\n\n#Output\n\nKg global stiffness matrix with boundary conditions\nFg global load vector with boundary condition\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.applyBCModal-Tuple{Any, Any, Any}","page":"OWENSFEA","title":"OWENSFEA.applyBCModal","text":"applyBCModal(K,BC,numDofPerNode)\n\nInternal, applies boundary conditions to a system matrix for modal analysis\n\nInputs\n\nK: assembled global system matrix\nBC: struct of boundary condition information\nnumDofPerNode: number of degrees of freedom per node\n\nOutputs:\n\nKnew global system matrix with boundary conditions\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.applyConcentratedTerms-Tuple{Any, Any}","page":"OWENSFEA","title":"OWENSFEA.applyConcentratedTerms","text":"applyConcentratedTerms(numNodes, numDOFPerNode; filename=\"none\",data=[1 \"M6\" 1 1 0.0], jointData=[])\n\nInternal, applies 6x6 concentrated nodal terms from user input.\n\n#Input\n\nfilename: string containing nodal terms filename\ndata: Nx5 or Nx4 array matching general [1 \"M6\" 1 1 0.0] or diagonal only [1 \"M\" 1 0.0] aligning with node, Type, dof, value, where type is M,C,K, or F\n\n#Output\n\nnodalTerms::NodalTerms: see ?NodalTerms object containing concentrated nodal data\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.applyConstraints-Tuple{Any, Any}","page":"OWENSFEA","title":"OWENSFEA.applyConstraints","text":"Internal, this function transforms a matrix by the transformation matrix to enforce joint constraints\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.applyConstraintsVec-Tuple{Any, Any}","page":"OWENSFEA","title":"OWENSFEA.applyConstraintsVec","text":"Internal, this function transforms a vector by the transformation matrix to enforce joint constraints\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.assembly!-NTuple{7, Any}","page":"OWENSFEA","title":"OWENSFEA.assembly!","text":"assembly(Ke,Fe,conn,numNodesPerEl,numDOFPerNode,Kg,Fg)\n\nInternal, assembles the element matrix and load vector into the global system of equations\n\n#Input\n\nKe: element matrix\nFe: element vector\nconn: element connectivity\nnumNodesPerEl: number of nodes per element\nnumDofPerNode: number of degrees of freedom per node\nKg: global system matrix\nFg: global load vector\n\n#Output\n\nKg: global system matrix with assembled element\nFg: global load vector with assembled element\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.assemblyMatrixOnly-NTuple{5, Any}","page":"OWENSFEA","title":"OWENSFEA.assemblyMatrixOnly","text":"assemblyMatrixOnly(Ke,conn,numNodesPerEl,numDOFPerNode,Kg)\n\nInternal, assembles the element matrix into the global system of equations\n\nInputs\n\nKe: element matrix\nconn: element connectivity\nnumNodesPerEl: number of nodes per element\nnumDofPerNode: number of degrees of freedom per node\nKg: global system matrix\n\nOutputs:\n\nKg: global system matrix with assembled element\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.autoCampbellDiagram-NTuple{6, Any}","page":"OWENSFEA","title":"OWENSFEA.autoCampbellDiagram","text":"frequencies = autoCampbellDiagram(FEAinputs,mymesh,myel,system,assembly; minRPM = 0.0, maxRPM = 40.0, NRPM = 9, # int vtksavename = nothing, saveModes = [1,3,5], #must be int saveRPM = [1,3,5], #must be int mode_scaling = 500.0, )\n\nAutomated Campbell Diagram Generator, this function runs the model with centrifugal stiffening for the specified RPM levels. If FEAinputs.analysisType == \"GX\" and vtksavename are specified, it will output paraview mode shape files at the specified save name. \n\n#Inputs\n\nFEAinputs::OWENSFEA.FEAModel: The FEA modeling options\nmymesh::OWENSFEA.Mesh: a previously generated turbine mesh\nmyel::OWENSFEA.El: the element properties associated with that mesh\nsystem::GXBeam.System: the converted GXBeam system from the mesh and el\nassembly::GXBeam.AssemblyState: the converted GXBeam assembly from the mesh and el\nsections::Array{Float64, 3}: the 3D point cloud to be converted to VTK format\nminRPM::Float64: minimum RPM to be run, e.x. 0.0\nmaxRPM::Float64: maximum RPM to be run e.x. 40.0\nNRPM::Int64: number of linear discretizations of RPM e.x. 9 must be int\nvtksavename::string: filename (with path if desired) of the VTK outputs if GX. Set to \"nothing\" to not save.\nsaveModes::Array{Int64}: The modes to save in the VTK outputs e.x. [1,3,5] must be int\nsaveRPM::Array{Int64}: The RPMs to save in the VTK outputs e.x. [1,3,5] must be int\nmode_scaling::Float64: The mode scaling in the VTK outputs e.x. 500.0\n\n#Outputs\n\nfrequency::Array{Float64}: The output modal frequencies\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calcUnorm-Tuple{Any, Any}","page":"OWENSFEA","title":"OWENSFEA.calcUnorm","text":"This function calculates a relative norm between two vectors: unew and uold\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateBCMap-NTuple{4, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateBCMap","text":"calculateBCMap(numpBC,pBC,numDofPerNode,reducedDofList)\n\nInternal, creates a boundary condition map between full and reduced dof listing as a result of constraints.\n\n#Input\n\nnumpBC number of boundary conditions\npBC array of boundary condition data\nnumDofPerNode number of degrees of freedom per node\nreducedDofList array of reduced DOF numbering\n\n#Output\n\nelStorage map for boundary conditions between full and reduced dof list\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateElement1!-NTuple{5, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateElement1!","text":"Internal, general routine to calculate an element matrix\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateElementMass-NTuple{14, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateElementMass","text":"Internal, calculates element mass properties.\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateLambda-Tuple{Any, Any, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateLambda","text":"calculateLambda(theta1,theta2,theta3)\n\nThis function calculates a transformation matrix to transform the element degree of freedom vector (12 DOFs) from the hub frame to the element frame. The transformation matrix is constructed via the direction cosine matrices of a 3-2-1 Euler rotation sequence.\n\n#Input *theta1::float: angle (rad) of rotation for 1st rotation of 3-2-1 sequence *theta2::float: angle (rad) of rotation for 2nd rotation of 3-2-1 sequence *theta3::float: angle (rad) of rotation for 3rd rotation of 3-2-1 sequence\n\n#Output *lambda::Array{<:float}: 12 x 12 transformation matrix\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateLoadVecFromDistForce-NTuple{10, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateLoadVecFromDistForce","text":"calculateLoadVecFromDistForce(elementOrder,x,xloc,twist,sweepAngle,coneAngle,rollAngle,extDistF2Node,extDistF3Node,extDistF4Node)\n\nTakes in a global 6dof distributed force at two nodal points and returns the 6dof force in the element FOR\n\n#Input\n\nelementOrder:::\nx::Array{<:float}: mesh x-position\nxloc::Array{<:float}: local x-position [0 elLength]\ntwist::Array{<:float}: element twist angle (rad)\nsweepAngle::Array{<:float}: element sweep angle (rad)\nconeAngle::Array{<:float}: element cone angle (rad)\nrollAngle::Array{<:float}: element roll angle (rad)\nextDistF2Node::Array{<:float}: turbine Tangential force\nextDistF3Node::Array{<:float}: turbine Normal force\nextDistF4Node::Array{<:float}: turbine M25 moment\n\n#Output\n\nFe::Array{float}: 6x1 Force on element in element FOR\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateROM-NTuple{7, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateROM","text":"calculateROM(model,mesh,el,displ,omegaVec,omegaDotVec,elStorage,countedNodes)\n\nThis function calculates a reduced order model for a conventional structural dynamics system (parked, non-rotating)\n\n#Input\n\nmodel object containing model data\nmesh object containing mesh data\nel object containing elementdata\ndispl displacement vector\nrbData: vector containing rigid body displacement, velocity, and acceleration\nelStorage object containing stored element data\ncountedNodes prevents applied nodal terms from double counting\n\n#Output\n\nrom object containing reduced order model data\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateROMGyric-NTuple{8, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateROMGyric","text":"calculateROMGyric(feamodel,mesh,el,displ,omegaVec,omegaDotVec,elStorage,rom0,countedNodes)\n\nCalculates a reduced order feamodel with rotational/ rigid body motion effects\n\n#Input\n\nfeamodel: object containing feamodel data\nmesh: object containing mesh data\nel: object containing elementdata\ndispl: displacement vector\nrbData: vector of hub frame accel (1-3), angular velocity components (4-6), and angular accleration (7-9)\nelStorage: object containing stored element data\nrom0: object containing parked/conventional reduced order feamodel\ncountedNodes: prevents applied nodal terms from double counting\n\n#Output\n\nrom: object containing reduced order feamodel data\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateReactionForceAtNode-NTuple{13, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateReactionForceAtNode","text":"calculateReactionForceAtNode(nodeNum,model,mesh,el,elStorage,timeInt,dispData,displ_iter,rbData,Omega,OmegaDot,CN2H,countedNodes)\n\nInternal, calculates the reaction force at a node by post processing all element associated with a node through connectivity or joint constraints.\n\n#Input\n\nnodeNum: node number joint constraints are desired at\nmodel: object containing model data\nmesh: object containing mesh data\nelStorage: object containing stored element data\nel: object containing element data\ntimeInt: object containing time integration parameters\ndispData: object containing displacement data\ndispl_iter: converged displacement solution\nrbData: vector containing rigid body displacement, velocity, and acceleration\nOmega: rotor speed (Hz)\nOmegaDot: rotor acceleratin (Hz)\nCN2H: transformation matrix from inertial frame to hub frame\ncountedNodes: prevents nodal terms from being double counted\n\n#Output\n\ncummulativeForce: vector containing reaction force at nodeNum\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateReducedDOFVector-Tuple{Any, Any, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateReducedDOFVector","text":"Internal, searches over all DOFs in a structural model and determines and returns \"dofVector\" containing only unconstrained DOFs\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateShapeFunctions-Tuple{Any, Any, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateShapeFunctions","text":"calculateShapeFunctions(elementOrder,xi,x)\n\nThis function calculates the Lagrange shape function, shape function derivative, and Jacobian to map between the local element domain and physical length of the element. The shape function derivative is defined with respect to the physical length domain. The shape functions may be linear or quadratic in order.\n\n#Input\n\nelementOrder order of element: 1 linear, 2 quadratic\nxi guass point values to evaluate shape functions at\nx nodal coordinates in physical length domain\n\n#Output\n\nN shape function value at specified gauss points\np_N_x shape function derivative w.r.t physical length domain at specified gauss points\nJac Jacobian for mat between local element domain and physical length domain.\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateStrainForElements-NTuple{8, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateStrainForElements","text":"Internal calculates element strains\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateStructureMassProps-Tuple{Any}","page":"OWENSFEA","title":"OWENSFEA.calculateStructureMassProps","text":"calculateStructureMassProps(elStorage)\n\nThis function caclulates structural mass properties of the finite element mesh (mass, moment of inertia, mass center) about the origin of the mesh coordinate system.\n\n#Input\n\nelStorage::ElStorage see ?ElStorage, object containing arrays of stored element information\n\n#Output\n\nstructureMass::float mass of structure\nstructureMOI::float moment of inertia tensor of structgure\nstructureMassCenter::float center of mass of structure\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateTimoshenkoElementInitialRun-NTuple{14, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateTimoshenkoElementInitialRun","text":"calculateTimoshenkoElementInitialRun(elementOrder,modalFlag,xloc,sectionProps,sweepAngle,coneAngle,rollAngle,aeroSweepAngle,x,y,z,concMassFlag,concMass,Omega)\n\nInternal, see ?initialElementCalculations, performs initial element calculations and stores them for later use and efficiency gains.\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateTimoshenkoElementNL-Tuple{Any, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateTimoshenkoElementNL","text":"calculateTimoshenkoElementNL(input,elStorage;predef=nothing)\n\nInternal, performs nonlinear element calculations.\n\n#Inputs\n\ninput::ElInput: see ?ElInput\nelStorage::ElStorage: see ?ElStorage\npredef::Bool: optional, if true, mutates ElStorage to include the nonlinear strain stiffening\n\n#Outputs\n\nElOutput: see ?ElOutput\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateTimoshenkoElementNLSS-Tuple{Any}","page":"OWENSFEA","title":"OWENSFEA.calculateTimoshenkoElementNLSS","text":"calculateTimoshenkoElementNLSS(elinput)\n\nPerforms selective nonlinear element calculations. Only stiffness matrix contributions are evaluate. No other calculations are performed to facilitate efficiency gains.\n\n#Input\n\nelinput: object containing element input\n\n#Output\n\neloutput: object containing element data\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateTimoshenkoElementStrain-NTuple{9, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateTimoshenkoElementStrain","text":"calculateTimoshenkoElementStrain(elementOrder,nlOn,xloc,sectionProps,sweepAngle,coneAngle,rollAngle,aeroSweepAngle,disp)\n\nInternal, calculates element strain for a Timoshenko element\n\n#Outputs\n\nElStrain: See ?ElStrain\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.calculateVec1!-NTuple{4, Any}","page":"OWENSFEA","title":"OWENSFEA.calculateVec1!","text":"Internal, general routine to calculate an element vector\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.constructReducedDispVecFromEigVec-Tuple{Any, Any, Any}","page":"OWENSFEA","title":"OWENSFEA.constructReducedDispVecFromEigVec","text":"constructReducedDispVecFromEigVec(vec1,reducedDOFList,BC)\n\nInternal, This function takes the original mode shape and modifies it to account for boundary conditions\n\nInputs\n\nvec1:\nreducedDOFList:\nBC:\n\nOutputs:\n\nvec1Red:\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.constructReducedDispVectorMap-NTuple{6, Any}","page":"OWENSFEA","title":"OWENSFEA.constructReducedDispVectorMap","text":"Internal, creates a map of unconstrained DOFs between a full listing and reduced listing (after constraints have been applied)\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.createJointTransform-Tuple{Any, Any, Any}","page":"OWENSFEA","title":"OWENSFEA.createJointTransform","text":"createJointTransform(joint,numNodes,numDofPerNode)\n\nInternal, calculates the JointTransform of a structural system.\n\n#Input\n\njoint: object containing joint data\nnumModes: number of nodes in mesh\nnumDofPerNode: number of degrees of freedom per node\n\n#Output\n\njointTransform: joint transformation matrix\nreducedDOF: map of original DOF numbering to reduced DOF numbering\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.createTda-NTuple{6, Any}","page":"OWENSFEA","title":"OWENSFEA.createTda","text":"Internal, creates a constraint transformation matrix for a single joint. Tda is this matrix, dDOF contains a listing of dependent global DOFs associated with this joint, and aDOF contains a listing of active global DOFs associated with this joint.\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.determineActiveDofsFromSlaveNode-Tuple{Any, Any}","page":"OWENSFEA","title":"OWENSFEA.determineActiveDofsFromSlaveNode","text":"Internal, determines the local master DOF associated with a local slave DOF.\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.extractFreqDamp-NTuple{7, Any}","page":"OWENSFEA","title":"OWENSFEA.extractFreqDamp","text":"extractFreqDamp(val,vec,numDOFPerNode,jointTransform,reducedDOFList,BC,analysisType)\n\nInternal, calculates the eigenvalues and vectors of a structural dynamic system\n\nInputs\n\nval: eigenvalue\nvec: eigenvector\nnumDOFPerNode: number of degrees of freedom per node\njointTransform: joint transformation matrix from reduced to full DOF list\nreducedDOFList: listing of reduced DOFs\nBC: boundary condition object containing boundary condition info\nanalysisType: analysis type\n\nOutputs:\n\nfreq: modal frequency\ndamp: modal damping\nphase1: in phase mode shape (real part of mode shape)\nphase2: out of phase mode shape (imaginary part of mode shape)\nsortedModes: total, complex mode shape\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.extractdaInfo-Tuple{Any, Any, Any}","page":"OWENSFEA","title":"OWENSFEA.extractdaInfo","text":"Internal, gets the total number of DOFs in the model, active number of DOFs in the model, and a list of slave DOFs that will be eliminated by joint constraints.\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.findElementsAssociatedWithNodeNumber-Tuple{Any, Any, Any}","page":"OWENSFEA","title":"OWENSFEA.findElementsAssociatedWithNodeNumber","text":"findElementsAssociatedWithNodeNumber(nodeNum,conn,jointData)\n\nInternal, finds elements associated with a node number through mesh connectivity or joint constraints\n\n#Input\n\nnodeNum node number joint constraints are desired at\nconn object containing mesh connectivity\njointData object containing joint information\n\n#Output\n\nelList array containing a list of element numbers associated with nodeNum\nlocalNode array containing the local node number that correspond to nodeNum in the list of associated elements\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.getElementConcTerms!-NTuple{7, Any}","page":"OWENSFEA","title":"OWENSFEA.getElementConcTerms!","text":"Internal, gets the concentrated terms without double counting\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.getGP-Tuple{Any}","page":"OWENSFEA","title":"OWENSFEA.getGP","text":"getGP(numGP)\n\nInternal, defines gauss point coordinates in a local element frame and the associated weights for Gaussian quadrature numerical integration.\n\n#Input\n\nnumGP: number of quad points used for integration\n\n#Output\n\nxi: list of quad point coordinates in local element frame\nweight: associated weights for quad point coordinate\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.getNodeMaps-NTuple{7, Any}","page":"OWENSFEA","title":"OWENSFEA.getNodeMaps","text":"Internal, gets node mapping\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.initialElementCalculations-Tuple{Any, Any, Any}","page":"OWENSFEA","title":"OWENSFEA.initialElementCalculations","text":"initialElementCalculations(feamodel,el,mesh)\n\nperforms initial element calculation for use later in analysis for efficiency gains.\n\nInputs\n\nfeamodel::FEAmodel: see ?Feamodel\nel::El: see ?El\nmesh::Mesh: see ?Mesh\n\nOutputs:\n\nelStorage:ElStorage: see ?ElStorage\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.interpolateVal-Tuple{Any, Any}","page":"OWENSFEA","title":"OWENSFEA.interpolateVal","text":"Internal, linear interpolation\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.linearAnalysisModal-NTuple{6, Any}","page":"OWENSFEA","title":"OWENSFEA.linearAnalysisModal","text":"Internal, see ?modal\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.makeBCdata-NTuple{5, Any}","page":"OWENSFEA","title":"OWENSFEA.makeBCdata","text":"makeBCdata(pBC,numNodes,numDofPerNode,reducedDOFList,jointTransform)\n\nInternal, usese the pBC matrix and calculates/stores boundary condition data\n\n#Input\n\npBC See ?FEAModel.pBC\nnumNodes number of nodes in structural model\nnumDofPerNode number of degrees of freedom per node\nreducedDOFList joint transformation matrix from reduced to full DOF list\njointTransform listing of reduced DOFs\n\n#Output\n\nBC:BC_struct see ?BC_struct\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.mapMatrixNonSym-Tuple{Any}","page":"OWENSFEA","title":"OWENSFEA.mapMatrixNonSym","text":"Internal, function to form total stifness matrix and transform to desired DOF mapping\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.mapMatrixNonSym2-NTuple{36, Any}","page":"OWENSFEA","title":"OWENSFEA.mapMatrixNonSym2","text":"Internal, function to form total stifness matrix and transform to desired DOF mapping\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.mapVector-Tuple{Any}","page":"OWENSFEA","title":"OWENSFEA.mapVector","text":"Internal, forms total force vector and transform to desired DOF mapping\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.modal-Tuple{Any, Any, Any}","page":"OWENSFEA","title":"OWENSFEA.modal","text":"modal(feamodel,mesh,el;Omega=0.0,displ=zeros(mesh.numNodes*6),OmegaStart=0.0,returnDynMatrices=false)\n\nModal analysis\n\nInputs\n\nfeamodel::FEAModel: see ?FEAModel\nmesh::Mesh: see ?Mesh\nel::El: see ?El\nOmega::float: Rotational rate in Hz\ndispl::Array{<:float}: zeros(mesh.numNodes*6) initial (warm start) displacements for each dof\nOmegaStart::float: rotor speed (Hz) from previous analysis if stepping through various rotor speeds, may be useful in load stepping\nreturnDynMatrices::Bool: Flag to save linearized K/C/M matrices for the design\n\nOutputs:\n\nfreq::Array{<:float}: sorted modal frequencies (Hz)\ndamp::Array{<:float}: sorted modal damping\nimagCompSign::Array{<:float}: sign of imaginary component of eigenvalues\nU_x_0::Array{<:float}: NnodesxNmodes in-phase mode shape x\nU_y_0::Array{<:float}: NnodesxNmodes in-phase mode shape y\nU_z_0::Array{<:float}: NnodesxNmodes in-phase mode shape z\ntheta_x_0::Array{<:float}: NnodesxNmodes in-phase mode shape rotation about x\ntheta_y_0::Array{<:float}: NnodesxNmodes in-phase mode shape rotation about y\ntheta_z_0::Array{<:float}: NnodesxNmodes in-phase mode shape rotation about z\nU_x_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape x\nU_y_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape y\nU_z_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape z\ntheta_x_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape rotation about x\ntheta_y_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape rotation about y\ntheta_z_90::Array{<:float}: NnodesxNmodes out-of-phase mode shape rotation about z\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.reducedOrderModel-NTuple{5, Any}","page":"OWENSFEA","title":"OWENSFEA.reducedOrderModel","text":"reducedOrderModel(elStorage,feamodel,mesh,el,displ)\n\nThis function executes a reduced order model analysis.\n\n#Input\n\nelStorage object containing stored element matrices\nfeamodel object containing feamodel information\nmesh object containing mesh information\nel object containing element information\ndispl displacement vector for use in pre-stressed analysis\n\n#Output\n\nrom object containing a reduced order feamodel\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.setInitialConditions-Tuple{Any, Any, Any}","page":"OWENSFEA","title":"OWENSFEA.setInitialConditions","text":"setInitialConditions(initCond,u,numDOFPerNode)\n\nsets initial conditions\n\n#Input\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\nu: displacement vector for each dof\nnumDOFPerNode: number of degrees of freedom per node\n\n#Output\n\nu: displacement vector modified for initial conditions\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.setPrescribedConditions-Tuple{Any}","page":"OWENSFEA","title":"OWENSFEA.setPrescribedConditions","text":"prescribed_conditions = setPrescribedConditions(mesh;pBC=zeros(2,2),Fexternal=[],ForceDof=[])\n\nInternal, maps OWENS boundary conditions and applied forces to the GXBeam PrescribedConditions input\n\n#Input\n\nmesh::FEAModel.mesh: Input turbine mesh\npBC::FEAModel.BC.pBC: Boundary conditions\nFexternal::Array{Float64}: Applied forces to the mesh, 1D array ordered node 1 Dof 1-6, node 2 Dof 1-2, etc.\nForceDof::Array{Float64}: Degrees of freedom aligned with Fexternal, currently is unused, assumes Fexternal uses the full DOF array.\n\n#Output\n\nprescribed_conditions::GXBeam.PrescribedConditions: the boundary conditions/applied forces used by GXBeam see ?GXBeam.PrescribedConditions\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.staticAnalysis-NTuple{7, Any}","page":"OWENSFEA","title":"OWENSFEA.staticAnalysis","text":"staticAnalysis(feamodel,mesh,el,displ,Omega,OmegaStart,elStorage; reactionNodeNumber=1, OmegaDot=0.0, Fdof=[1], Fexternal=[0.0])\n\nThis function performs a static analysis and returns displacement values and a flag denoting successful/unsuccessful analysis\n\n#Inputs\n\nfeamodel: object containing feamodel information\nmesh: object containing mesh information\nel: object containing element information\ndispl: displacement vector for use in pre-stressed analysis\nOmega: rotor speed (Hz)\nOmegaStart: rotor speed (Hz) from previous analysis if stepping through various rotor speeds, may be useful in load stepping\nelStorage: previously calculated element system matrices\nreactionNodeNumber::Int: optional, node at which to calculate reaction force\nOmegaDot::Float: Steady State Rotational Acceleration\nFdof::Array{<:Int}: Global Dofs where Fexternal is acting, where max dof = nelem*ndof\nFexternal{<:Float}: Forces or moments associated with the Fdofs specified\n\n#Outputs\n\ndispl: vector of displacemetns\nstaticAnalysisSuccessful: boolean flag denoting successful static analysis\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.structuralDynamicsTransient-NTuple{13, Any}","page":"OWENSFEA","title":"OWENSFEA.structuralDynamicsTransient","text":"structuralDynamicsTransient(feamodel,mesh,el,dispData,Omega,OmegaDot,time,delta_t,elStorage,Fexternal,Fdof,CN2H,rbData)\n\nperforms unsteady structural dynamics analysis\n\nInputs\n\nfeamodel::: object containing feamodel data\nmesh::: object containing mesh data\nel::: object containing element data\ndispData::: object containing displacement data\nOmega::: rotor speed (Hz)\nOmegaDot::: rotor acceleratin (Hz)\ntime::: current simulation time\ndelta_t::: time step size\nelStorage::: object containing stored element data\nFexternal::: vector containing external force values\nFdof::: vector containing global DOF numbering associated with external force values\nCN2H::: transformation matrix from inertial frame to hub frame\nrbData::: vector containing rigid body displacement, velocity, and acceleration\n\nOutputs:\n\nelStrain::ElStrain: see ?ElStrain strain for element at end of time step\ndispOut::DispOut: see ?DispOut displacement data at end of time step\nFReaction_sp1::: vector containing reaction force at turbine base at end of time step\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.structuralDynamicsTransientROM-NTuple{14, Any}","page":"OWENSFEA","title":"OWENSFEA.structuralDynamicsTransientROM","text":"structuralDynamicsTransientROM(feamodel,mesh,el,dispData,Omega,OmegaDot,time,delta_t,elStorage,rom,Fexternal,Fdof,CN2H,rbData)\n\nPerforms transient structural dynamics analysis using a reduced order feamodel (ROM).\n\n#Input\n\nfeamodel: object containing feamodel data\nmesh: object containing mesh data\nel: object containing element data\ndispData: object containing displacement data\nOmega: rotor speed (Hz)\nOmegaDot: rotor acceleratin (Hz)\ntime: current simulation time\ndelta_t: time step size\nelStorage: object containing stored element data\nrom: object containing reduced order feamodel represnetation\nFexternal: vector containing external force values\nFdof: vector containing global DOF numbering associated with external force values\nCN2H: transformation matrix from inertial frame to hub frame\nrbData: vector containing rigid body displacement, velocity, and acceleration\n\n#Output\n\ndispOut: object containing displacement data at end of time step\nFReaction_sp1: vector containing reaction force at turbine base at end of time step\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceFEA/#OWENSFEA.timeIntegrateSubSystemEff-NTuple{8, Any}","page":"OWENSFEA","title":"OWENSFEA.timeIntegrateSubSystemEff","text":"timeIntegrateSubSystemEff(M,K,C,F,timeInt,u,udot,uddot)\n\nPerforms integration of a system using the Newmark-Beta method(constant-average acceleration sceheme). The integration parameters are calculated before hand and store in the timeInt object.\n\n#Input\n\nM system mass matrix\nK system sttiffness matrix\nC system damping matrix\nF system force vector\ntimeInt object containing time integraton parameters\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/referenceFEA/#OWENSFEA.updateLoadStep-NTuple{7, Any}","page":"OWENSFEA","title":"OWENSFEA.updateLoadStep","text":"updateLoadStep(iterationCount,loadStepParams,loadStep,loadStepPrev,loadStepCount,displCopy,displ)\n\nUpdates the load stepping parameter whether through means of adaptive loadstepping or a specified load step profile.\n\n#Input\n\niterationCount number of iterations for current load step\nloadStepParams struct containing load step parameters\nloadStep load step value for current load step\nloadStepPrev load step value for previous load st ep\nloadStepCount number of load steps performed up to this point\ndisplPrev converged displacement vector form previous load step\ndispl displacement vector at current load step\n\n#Output\n\nloadStep new load step value\nloadStepPrev load step value for previous load step\ndispl most up to date displacement vector in load stepping procedure\ndisplPrev displacement vector at end of previous load step\nstaticAnalysisSuccessful boolean flag, true if load step was completed successfully\nstaticAnalysisComplete boolean flag, true if analysis is complete\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers","text":"","category":"section"},{"location":"reference/referenceOpenFASTWrappers/","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers","text":"CurrentModule = OWENS","category":"page"},{"location":"reference/referenceOpenFASTWrappers/#Types-and-functions","page":"OWENSOpenFASTWrappers","title":"Types and functions","text":"","category":"section"},{"location":"reference/referenceOpenFASTWrappers/","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers","text":"Modules = [OWENS.OWENSOpenFASTWrappers]","category":"page"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.Environment","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.Environment","text":"Environment(rho::TF1, dt::TF2, steplast::TAI) Environment(rho) = Environment(rho)\n\nContains specications for turbine environment/operating conditions as well as some backend memory\n\nInputs\n\nrho::TF1: Working fluid density (kg/m^3)\ndt::TF2: timestep for ADI\nnum_channels::TI1: number of output channels from AD15\nsteplast::TAI: prior simulation step index, used for unsteady wake propogation\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.Structure","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.Structure","text":"Structure\n\nContains the position and orientation info passed to AD15. These positions are all in global and include the turbine RefPos.\n\nInputs:\n\nhubPos::TAF1:\nhubOrient::TAF2:\nhubVel::TAF3:\nhubAcc::TAF4:\nnacPos::TAF5:\nnacOrient::TAF6:\nnacVel::TAF7:\nnacAcc::TAF8:\nrootPos::TAF9:\nrootOrient::TAF10:\nrootVel::TAF11:\nrootAcc::TAF12:\nmeshPos::TAF13:\nmeshOrient::TAF14:\nmeshVel::TAF15:\nmeshAcc::TAF16:\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.adiCalcOutput-Tuple{Any, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.adiCalcOutput","text":"adiCalcOutput( )\n\ncalls AeroDynInflowC_CalcOutput to calculate resulting loads. Call this only after SetRotorMotion on all rotors/turbines.\n\nInputs:\n\ntime::c_double: current timestep\n\nnum_channels::int: number of output channels\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.adiGetRotorLoads-Tuple{Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.adiGetRotorLoads","text":"adiGetRotorLoads(iturb; )\n\nGets the loads for a single turbine rotor\n\nInputs:\n\niturb::int: required, current turbine number\n\nOutputs:\n\nmeshFrcMom::Array(float): loads from ADI at mesh nodes\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.adiInit-Tuple{Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.adiInit","text":"adiInit( output_root_name ; )\n\ncalls aerodyninflowinit to initialize AeroDyn and InflowWind together\n\nInputs:\n\nad_input_file_passed::int: flag to indicate the AD15 input file is passed as a string 0=false, 1=true (set to false if passing input file name instead, NOT SUPPORTED YET)\nad_input_file::string: name of input file for AD15 – this is read by julia and passed to AD15\nifw_input_file_passed::int: flag to indicate the InflowWind input file is passed as a string 0=false, 1=true (set to false if passing input file name instead, NOT SUPPORTED YET)\nifw_input_file::string: name of input file for InflowWind – this is read by julia and passed to InflowWind\ngravity::float: optional, gravity value (default: 9.80665 m/s^2)\ndefFldDens::float: optional, air density (default: 1.225 kg/m^3)\ndefKinVisc::float: optional, kinematic viscosity of working fluid (default: 1.464E-05 m^2/s)\ndefSpdSound::float: optional, speed of sound in working fluid (default: 335.0 m/s)\ndefPatm::float: optional, atmospheric pressure (default: 103500.0 Pa) [used only for an MHK turbine cavitation check]\ndefPvap::float: optional, vapour pressure of working fluid (default: 1700.0 Pa) [used only for an MHK turbine cavitation check]\nWtrDpth::float: optional, water depth (default: 0.0 m) [used only for an MHK turbine]\nMSL2SWL::float: optional, offset between still-water level and mean sea level (default: 0.0 m) [positive upward, used only for an MHK turbine]\nstoreHHVel::int: optional, internal parameter for adi_library. Exposed for convenience, but not needed. [0=false, 1=true]\nWrVTK::int: optional, write VTK output files at all timesteps to visualize AeroDyn 15 meshes [0 none (default), 1 ref, 2 motion]\nWrVTK_Type::int: optional, write VTK output files as [1 surfaces (default), 2 lines, 3 both]\nVTKNacDim::Array(float*6) optional, Nacelle Dimension for VTK visualization x0,y0,z0,Lx,Ly,Lz (m)\nVTKHubRad::float: optional, HubRadius for VTK visualization (m)\nwrOuts::int: optional, file format for writing outputs [0 none (default), 1 txt, 2 binary, 3 both]\nDT_Outs::float64: optional, timestep for outputs to file [0.0 (default) for every timestep]\ninterp_order::int: optional, interpolation order used internally [1 first order (default), 2 second order]\ndt::float64: required, timestep for AD15 (needed for setting internal constants)\nt_max::float: required, total expected simulation time – used only for setting VTK counter width\n\nOutputs:\n\nnum_channels::int: number of output channels\nchannel_names::string: string of output channel names from ADI\nchannel_units::string: string of output channel units from ADI\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.adiPreInit-Tuple{Any, Any, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.adiPreInit","text":"adiPreInit(adilib_filename numTurbines transposeDCM)\n\nDoes some pre-initializing of the ADI library to setup arrays for each turbine\n\nInputs:\n\nadilib_filename::string: path and name of AeroDyn-Inflow dynamic library\nnumTurbines::int: required, number of turbines to setup ADI to handle\ntransposeDCM::int: required, transpose DCM internally in ADI to match calling code convention for direction cosine matrices (default: 1==true)\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.adiSetRotorMotion-NTuple{18, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.adiSetRotorMotion","text":"adiSetRotorMotion(iturb; )\n\nSets the motions for a single turbine rotor\n\nInputs:\n\niturb::int: required, current turbine number\nHubPos::Array(float): required, (x,y,z) position of hub\nHubOrient::Array(float): required, orientation of hub as 9 element vector of flattened DCM\nHubVel::Array(float): required, (TVx,TVy,TVz,RVx,RVy,RVz) velocity of hub, does not include rotational velocity, so this is extra like from a platform\nHubAcc::Array(float): required, (TAx,TAy,TAz,RAx,RAy,RAz) acceleration of hub, does not include rotational accel, so this is extra like from a platform\nNacPos::Array(float): required, (x,y,z) position of nacelle\nNacOrient::Array(float): required, orientation of nacelle as 9 element vector of flattened DCM\nNacVel::Array(float): required, (TVx,TVy,TVz,RVx,RVy,RVz) velocity of nacelle\nNacAcc::Array(float): required, (TAx,TAy,TAz,RAx,RAy,RAz) acceleration of nacelle\nRootPos::Array(float): required, size (numBlades,3) position vectors of roots\nRootOrient::Array(float): required, size (numBlades,9) orientation DCMs flattened to array of 9 element vectors\nRootVel::Array(float): required, size (numBlades,6) velocity vectors of roots\nRootAcc::Array(float): required, size (numBlades,6) acceleration vectors of roots\nnumMeshNodes::Array(int): required, number of structural mesh points (total across all blades)\nMeshPos::Array(float): required, size (sum(numMeshNodes),3) position vectors of mesh points\nMeshOrient::Array(float): required, size (sum(numMeshNodes),9) orientation DCMs flattened to array of 9 element vectors\nMeshVel::Array(float): required, size (sum(numMeshNodes),6) velocity vectors of mesh points\nMeshAcc::Array(float): required, size (sum(numMeshNodes),6) acceleration vectors of mesh points\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.adiSetupRotor-Tuple{Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.adiSetupRotor","text":"adiSetupRotor(iturb; )\n\nSets the initial locations of a single rotor (root orientations/positions etc)\n\nInputs:\n\niturb::int: required, current turbine number\nisHAWT::bool: required, false: VAWT or cross-flow turbine, true: HAWT\nintTurbPos::Array(float): required, (x,y,z) position of turbine\ninitHubPos::Array(float): required, (x,y,z) position of hub\ninitHubOrient::Array(float): required, orientation of hub as 9 element vector of flattened DCM\ninitNacellePos::Array(float): required, (x,y,z) position of nacelle\ninitNacelleOrient::Array(float): required, orientation of nacelle as 9 element vector of flattened DCM\nnumBlades::int: required, number of blades\ninitRootPos::Array(float): required, size (numBlades,3) position vectors of roots\ninitRootOrient::Array(float): required, size (numBlades,9) orientation DCMs flattened to array of 9 element vectors\nnumMeshNodes::Array(int): required, number of structural mesh points (total across all blades)\ninitMeshPos::Array(float): required, size (sum(numMeshNodes),3) position vectors of mesh points\ninitMeshOrient::Array(float): required, size (sum(numMeshNodes),9) orientation DCMs flattened to array of 9 element vectors\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.adiUpdateStates-Tuple{Any, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.adiUpdateStates","text":"adiUpdateStates( )\n\ncalls AeroDynInflowC_UpdateStates to step ADI forward to the next timestep Call this only after SetRotorMotion on all rotors/turbines.\n\nInputs:\n\ntime::c_double: current timestep\n\ntime_next::c_double: next timestep\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.advanceAD15-Tuple{Any, Any, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.advanceAD15","text":"advanceAD15(t_new;ts=2*pi/(turbine.omega[1]*turbine.ntheta))\n\nRuns a previously initialized aero model (see ?setupTurb) in the unsteady mode (can be repeateadly called, or called for a specific time, or repeatedly called for sections of time)\n\nInputs\n\nt_new::float: new time (s); will run from last time specified from the last call, to the current time specified, or from t=ts if the first time called\nmesh::: OWENSFEA mesh for the turbine structure\nazi::: hub azimuth (radians)\ndt::float: optional timestep\n\nOutputs:\n\nn_steps: number timesteps taken\nFx: Array(sum(numMeshNodes),ntheta) Turbine Fx (N)\nFy: Array(sum(numMeshNodes),ntheta) Turbine Fy (N)\nFz: Array(sum(numMeshNodes),ntheta) Turbine Fz (N)\nMx: Array(sum(numMeshNodes),ntheta) Turbine Mx (N-m)\nMy: Array(sum(numMeshNodes),ntheta) Turbine My (N-m)\nMz: Array(sum(numMeshNodes),ntheta) Turbine Mz (N-m)\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.createGeneralTransformationMatrix-Tuple{Any, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.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 rotations 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/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.createSingleRotationDCM-Tuple{Any, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.createSingleRotationDCM","text":"createSingleRotationDCM(angleDeg,axisNum)\n\nCreates a direction cosine matrix (dcm) associated with a rotation of angleDeg about axisNum.\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.deformAD15-NTuple{10, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.deformAD15","text":"deformAD15(u_j,udot_j,uddot_j,azi,Omega_rad,OmegaDot_rad,hubPos,hubAngle,hubVel,hubAcc)\n\nSets the inputs for AD15.\n\nInputs\n\nu_j: mesh displacements – in hub coordinates, (m,rad)\nudot_j: mesh velocity – in hub coordinates, (m/s,rad/s)\nuddot_j: mesh velocity – in hub coordinates, (m/s,rad/s)\nazi: current azimuth (rad)\nOmega_rad: angular velocity of hub about hub axis (rad/s)\nOmegaDot_rad: angular acceleration of hub about hub axis (rad/s^2)\nhubPos: current global hubPos (x,y,z) vector (m)\nhubAngle: 3 angle set for hub orientation (rad), no rotation from spinning\nhubVel: hub velocity in global coords, 6-vector (m/s,rad/s), does not include rotational velocity, so this is extra like from a platform\nhubAcc: hub acceleration in global coords, 6-vector (m/s^2,rad/s^2), does not include rotational accel, so this is extra like from a platform\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.endTurb-Tuple{}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.endTurb","text":"End ADI and clear data\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.frame_convert-Tuple{Any, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.frame_convert","text":"frameconvert(initframevals, transmat)\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/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.getAD15MeshDCM-NTuple{4, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.getAD15MeshDCM","text":"getAD15MeshDCM(turbine,u_j,azi,hubAngle)\n\nExtract the mesh points orientations for all the AD15 blades ordering here is important 1. root to tip of blades, in blade order 2. root to tip of bottom struts, in blade order 3. root to tip of top struts, in blade order\n\nInputs\n\nturbine: turbine data storage\nu_j: mesh displacements – in hub coordinates, (m,rad)\nazi: current azimuth (rad)\nhubAngle: 3 angle set for hub orientation (rad), no rotation from spinning\n\n#FIXME: add averaging of orientations to get nodes within blade/strut\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.getAD15MeshPos-NTuple{6, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.getAD15MeshPos","text":"getAD15MeshPos(turbine,u_j,azi,nacPos,hubPos,hubAngle)\n\nExtract the mesh points for all the AD15 blades ordering here is important 1. root to tip of blades, in blade order 2. root to tip of bottom struts, in blade order 3. root to tip of top struts, in blade order\n\nInputs\n\nturbine: turbine data storage\nu_j: mesh displacements – in hub coordinates, (m,rad)\nazi: current azimuth (rad)\nhubPos: current global hubPos (x,y,z) vector (m)\nnacPos: current global nacPos (x,y,z) vector (m)\nhubAngle: 3 angle set for hub orientation (rad) , no rotation from spinning\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.getAD15MeshVelAcc-NTuple{12, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.getAD15MeshVelAcc","text":"getAD15MeshVelAcc(turbine,meshPos,udotj,uddotj,azi,Omegarad,OmegaDotrad,nacPos,hubPos,hubAngle,hubVel,hubAcc)\n\nExtract the mesh velocities and accelerations for all the AD15 blades ordering here is important 1. root to tip of blades, in blade order 2. root to tip of bottom struts, in blade order 3. root to tip of top struts, in blade order\n\nInputs\n\nturbine: turbine data storage\nrootPos: root positions from call to getAD15MeshPos\nu_j: mesh displacements – in hub coordinates, (m,rad)\nudot_j: mesh velocity – in hub coordinates, (m/s,rad/s)\nuddot_j: mesh velocity – in hub coordinates, (m/s,rad/s)\nazi: current azimuth (rad)\nOmega_rad: angular velocity of hub about hub axis (rad/s)\nOmegaDot_rad: angular acceleration of hub about hub axis (rad/s^2)\nhubPos: current global hubPos (x,y,z) vector (m)\nnacPos: current global nacPos (x,y,z) vector (m)\nhubAngle: 3 angle set for hub orientation (rad), no rotation from spinning\nhubVel: hub velocity in global coords (m/s,rad/s), does not include rotational velocity, so this is extra like from a platform\nhubAcc: hub acceleration in global coords (m/s^2,rad/s^2), does not include rotational accel, so this is extra like from a platform\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.getAD15numMeshNodes-Tuple{Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.getAD15numMeshNodes","text":"getAD15numMeshNodes(bladeIdx)\n\nFind the number of mesh points we will pass\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.getRootDCM-NTuple{4, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.getRootDCM","text":"getRootDCM(turbine,u_j,azi,hubAngle)\n\nNote on angles The OWENSFEA mesh in OWENS uses +X as the blade/strut long axis. In AeroDyn, the blade axis is +Z. So for transforming the blades from OWENSFEA mesh coordinates, first rotate by -90 degrees about Y, then do the 3,2,1 coordinate transforms with (Twist,Theta,Psi) = (Rz,Ry,Rx) = (Yaw,Pitch,Roll) Psid – rotation about Z axis – Yaw (Rz) – degrees Thetad – rotation about Y axis – Pitch (Ry) – degrees Twist_d – rotation about X axis – Roll (Rx) – degrees The rotation sequence is Roll –> Pitch –> Yaw. In rotation matrix form, it is R = RzRyRx (a [3,2,1] matrix order).\n\nInputs\n\nturbine: turbine data storage\nu_j: mesh displacements – in hub coordinates, (m,rad)\nazi: current azimuth (rad)\nhubAngle: 3 angle set for hub orientation (rad), no rotation from spinning\n\n#FIXME: add averaging of orientations to get nodes within blade/strut\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.getRootPos-NTuple{6, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.getRootPos","text":"getRootPos(turbine,u_j,azi,nacPos,hubPos,hubAngle)\n\nExtract the root positions for all ADI blades\n\nInputs\n\nturbine: turbine data storage\nu_j: mesh displacements – in hub coordinates, (m,rad)\nazi: current azimuth (rad)\nnacPos: current global nacPos (x,y,z) vector (m)\nhubPos: current global hubPos (x,y,z) vector (m)\nhubAngle: 3 angle set for hub orientation (rad), no rotation from spinning\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.getRootVelAcc-NTuple{12, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.getRootVelAcc","text":"getRootVelAcc(turbine,rootPos,udotj,uddotj,azi,Omegarad,OmegaDotrad,nacPos,hubPos,hubAngle,hubVel,hubAcc)\n\nExtract the root velocities and accelerations for all ADI blades\n\nInputs\n\nturbine: turbine data storage\nrootPos: root positions from call to getRootPos\nazi: current azimuth (rad)\nOmega_rad: angular velocity of hub about hub axis (rad/s)\nOmegaDot_rad: angular acceleration of hub about hub axis (rad/s^2)\nnacPos: current global nacPos (x,y,z) vector (m)\nhubPos: current global hubPos (x,y,z) vector (m)\nhubAngle: 3 angle set for hub orientation (rad) , no rotation from spinning\nhubVel: hub velocity in global coords, 6-vector (m/s,rad/s), does not include rotational velocity, so this is extra like from a platform\nhubAcc: hub acceleration in global coords, 6-vector (m/s^2,rad/s^2), does not include rotational accel, so this is extra like from a platform\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.ifwcalcoutput-Tuple{Any, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.ifwcalcoutput","text":"ifwcalcoutput(position,time)\n\ncalls inflow wind clacoutput\n\nInputs\n\nposition::Array(float): x, y, z sample position (m)\ntime::float: sample time (s)\n\nOutputs:\n\nvelocities: x, y, z velocity at sample position\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.ifwend-Tuple{}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.ifwend","text":"ifwend()\n\ncalls inflow wind end function and cleanup\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.ifwinit-Tuple{}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.ifwinit","text":"ifwinit(inflowlib_filename ;HWindSpeed=6.87,turbsim_filename=\"path/test.bts\")\n\ncalls inflow wind init\n\nInputs\n\ninflowlib_filename::string: path and name of inflow-wind dynamic library\nHWindSpeed::float: optional, backup steady windspeed (m/s)\nturbsim_filename::string: path and name of turbsim data e.g. \"path/test.bts\"\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.setRotorMotion-Tuple{Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.setRotorMotion","text":"setRotorMotion(iturb,turbstruct\n\nSet the rotor motion for one turbine\n\nInputs\n\niturb::int: required, current turbine number\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.setupTurb-NTuple{12, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.setupTurb","text":"setupTurb(adilib,adinputfile,ifwinputfile,adirootname,bldx,bldz,B; rho = 1.225, gravity = 9.80665, defKinVisc = 1.464E-05, defSpdSound = 335.0, defPatm = 103500.0, defPvap = 1700.0, WtrDpth = 0.0, MSL2SWL = 0.0, storeHHVel = 0, #false transposeDCM= 1, #true WrVTK = 2, WrVTKType = 3, VTKNacDim = [-.10 ,-.10 ,-.10 ,.2 ,.2 ,.2], VTKHubRad = 1.0, adinstrut = 2, adidt = 0.05, aditmax = 10, adiwrOuts = 0, adiDT_Outs = 0.0, isHAWT = false, # false: VAWT or cross-flow turbine, true: HAWT numTurbines = 1)\n\nInitializes aerodynamic models and sets up backend persistent memory to simplify intermittent calling within coupled solver loops\n\nInputs\n\nadi_lib: path to adi library (.so, .dylib, .dll)\nad_input_file: input file for aerodyn15\nifw_input_file: input file for inflow wind\nadi_rootname: rootname for vtk outputs\nbld_x: Blade x shape\nbld_z: Blade z shape\nB: Number of blades\nrho: working fluid density (kg/m^3)\ngravity: Gravitational acceleration (m/s^2)\ndefKinVisc: Kinematic viscosity of working fluid (m^2/s)\ndefSpdSound: Speed of sound in working fluid (m/s)\ndefPatm: Atmospheric pressure (Pa) [used only for an MHK turbine cavitation check]\ndefPvap: Vapour pressure of working fluid (Pa) [used only for an MHK turbine cavitation check]\nWtrDpth: Water depth (m)\nMSL2SWL: Offset between still-water level and mean sea level (m) [positive upward]\nstoreHHVel: unused here\ntransposeDCM: 0=false, 1=true transpose DCM internally for calculations\nWrVTK: write VTK files from adi to directory adi-vtk [0 none, 1 ref, 2 motion]\nWrVTK_Type: write VTK files from adi to directory adi-vtk [1 surface, 2 lines, 3 both]\nVTKNacDim: Nacelle Dimension for VTK visualization x0,y0,z0,Lx,Ly,Lz (m)\nVTKHubRad: HubRadius for VTK visualization (m)\nadi_wrOuts: file format to write to\nadi_DT_Outs: output timestep to write at\nadi_nstrut: createmeshstruts is hard coded for 2 struts per blade\nadi_dt: timestep\nadi_tmax: maximum time\nhubPos: hub position in global coordinates, 3-vector (m). NOTE: AD15 assumes a different hub location than OWENS\nhubAngle: hub axis angle, 3-vector (deg), no rotation from spinning\nnacPos: nacelle position in global coordinates, 3-vector (m). NOTE: AD15 assumes a different hub location than OWENS\nnacAngle: nacelle axis angle, 3-vector (deg)\nnumTurbines: number of turbines\nisHAWT: # false: VAWT or cross-flow turbine, true: HAWT\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceOpenFASTWrappers/#OWENSOpenFASTWrappers.transMat-Tuple{Any, Any, Any}","page":"OWENSOpenFASTWrappers","title":"OWENSOpenFASTWrappers.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","page":"OWENS","title":"OWENS","text":"","category":"section"},{"location":"reference/reference/","page":"OWENS","title":"OWENS","text":"CurrentModule = OWENS","category":"page"},{"location":"reference/reference/#Index","page":"OWENS","title":"Index","text":"","category":"section"},{"location":"reference/reference/","page":"OWENS","title":"OWENS","text":"","category":"page"},{"location":"reference/reference/#Types-and-functions","page":"OWENS","title":"Types and functions","text":"","category":"section"},{"location":"reference/reference/","page":"OWENS","title":"OWENS","text":"Modules = [OWENS]","category":"page"},{"location":"reference/reference/#OWENS.Bin","page":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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\nss_input_file::string: file path to the HydroDyn sea states 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":"OWENS","title":"OWENS.Iteration_Parameters","text":"Internal, gauss-seidel iteration parameters \n\n\n\n\n\n","category":"type"},{"location":"reference/reference/#OWENS.NuMad","page":"OWENS","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 position, 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":"OWENS","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":"OWENS","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.OWENSVTK-NTuple{17, Any}","page":"OWENS","title":"OWENS.OWENSVTK","text":"OWENSVTK(savename,t,uHist,system,assembly,sections,aziHist,mymesh,myel,epsilon_x_hist,epsilon_y_hist,epsilon_z_hist,kappa_x_hist,kappa_y_hist,kappa_z_hist,FReactionHist)\n\nFormats and outputs OWENS data into VTK format\n\n#Intput\n\n#Output\n\nnone:\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.Unsteady-Tuple{Any}","page":"OWENS","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 (s)\n* `aziHist`: azimuthal history array \n* `OmegaHist`: rotational speed array history (hz)\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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","title":"OWENS.create_arcus_mesh","text":"createarcusmesh(;Htwrbase = 15.0, Hbld = 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\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\nHtwr_base::float: height of tower before blades attach (m)\nHbld::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":"OWENS","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":"OWENS","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":"OWENS","title":"OWENS.create_mesh_struts","text":"mymesh, myort, myjoint, AD15bldNdIdxRng, AD15bldElIdxRng = createmeshstruts(;Htwrbase = 15.0, Htwrblds = 147.148-15.0, Hbld = 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, struttwrmountpoint = [0.01,0.5,0.9], strutbldmountpoint = [0.01,0.5,0.9], 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\nHtwr_base::float: height of tower before blades attach (m)\nHtwr_blds::float: height of the tower once the blades attach (m)\nHbld::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_mountpoint::float = [0.01,0.5,0.9], # factor of blade height where the bottom strut attaches on the tower # This puts struts at top and bottom, as a fraction of the blade position\nstrut_bld_mountpoint::float = [0.01,0.5,0.9], # factor of blade height where the bottom strut attaches on the blade # This puts struts at bottom 0, mid 0.5, and top 1.0 as a fraction of the blade position\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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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.Output: see ?OWENSPreComp.Input\nprecompinput::OWENSPreComp.Input: see ?OWENSPreComp.properties\nlam_U::Composites.Laminate: laminate stacks used for post processing, size (nstations, nupper chorwise stations), upper surface, see ?Composites.Laminate\nlam_L::Composites.Laminate: laminate stacks used for post processing, size (nstations, nlower chorwise stations), lower surface, see ?Composites.Laminate\nlam_W::Composites.Laminate: laminate stacks used for post processing, size (nstations, nwebs), shear webs, see ?Composites.Laminate\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.getRotorPosSpeedAccelAtTime-NTuple{4, Any}","page":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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{OrderedCollections.OrderedDict{Symbol, Any}}","page":"OWENS","title":"OWENS.readNuMadGeomCSV","text":"readNuMadGeomCSV(NuMadgeomfile)\n\nParameters defining the rotor (apply to all sections).\n\nArguments\n\nNuMad_geom_file::String: name of the numad excel CSV file being read (!!! THE NUMAD TAB MUST BE SAVED AS A CSV FOR THIS TO WORK !!!)\nNuMad_geom_file::OrderedCollections.OrderedDict{Symbol, Any}: Alternatively, the already loaded in dictionary of windio inputs\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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","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":"OWENS","title":"OWENS.userDefinedRotorSpeedProfile","text":"Internal, unused, userDefinedRotorSpeedProfile\n\n\n\n\n\n","category":"method"},{"location":"reference/reference/#OWENS.viz-Tuple{Any}","page":"OWENS","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":"OWENS","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":"installation/#Installation-Instructions","page":"Installation","title":"Installation Instructions","text":"","category":"section"},{"location":"installation/","page":"Installation","title":"Installation","text":"The OWENS software has been developed and designed to highly flexible and 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":"installation/","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":"installation/","page":"Installation","title":"Installation","text":"In short, you should be able to compile OpenFAST on your system before attempting this.","category":"page"},{"location":"installation/","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":"installation/#Windows","page":"Installation","title":"Windows","text":"","category":"section"},{"location":"installation/","page":"Installation","title":"Installation","text":"At this stage in the software's maturity, please use mac or linux environments unless the user is highly experienced with compiled software development in a windows environment. Installation and troubleshooting on a dedicated unix based system is at least 1/10th that of Windows (also why every supercomputer uses linux...) 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. However, this adds several levels of complexity, and you WILL run into machine based issues until we finish the pipeline for windows download and run precompiled binaries.","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"Install julia, paraview, and visual studio manually by downloading/installing the windows versions for each:","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"https://julialang.org/downloads/\nhttps://www.paraview.org/download/\nhttps://visualstudio.microsoft.com/downloads/","category":"page"},{"location":"installation/","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":"installation/","page":"Installation","title":"Installation","text":"When setting up ssh keys, be sure to follow the windows specific instructions https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent and note that you may have to use id_ecdsa keys.","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"Set up the environment variables below and be sure Julia is also on the path (https://www.wikihow.com/Create-an-Environment-Variable-in-Windows-10)","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"Install the OWENS custom dependices as listed below.","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"If you wish to use the openfast libraries, follow the windows compilation instructions for the openfast Inflowwind, AeroDyn, MoorDyn and HydroDyn libraries. Also note that you will need to change the library paths in the top level OWENS scripts to match the resulting libraries' locations.","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"Set up VS code as also described below.","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"Windows notes: details are key, hash mismatch may mean that you are behind a proxy and the proxy isn't setup correctly. For visual studio, the default installation and recommendations should work. If importing the provided vs-code profile, the quick keys may need to be remapped to control from cmd. ","category":"page"},{"location":"installation/#Mac","page":"Installation","title":"Mac","text":"","category":"section"},{"location":"installation/","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":"installation/","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":"installation/#Linux","page":"Installation","title":"Linux","text":"","category":"section"},{"location":"installation/","page":"Installation","title":"Installation","text":"Install/Update Required Compilers and Programs; If you already have an environment that can build OpenFAST, then these should already be installed.","category":"page"},{"location":"installation/","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":"installation/#Install-julia","page":"Installation","title":"Install julia","text":"","category":"section"},{"location":"installation/","page":"Installation","title":"Installation","text":"cd ~\ncurl -fsSL https://install.julialang.org | sh","category":"page"},{"location":"installation/","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":"installation/","page":"Installation","title":"Installation","text":"export JULIAPKGUSECLIGIT=true","category":"page"},{"location":"installation/","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":"installation/","page":"Installation","title":"Installation","text":"alias julia=\"path/to/your/julia-1.x.x/bin/julia\"","category":"page"},{"location":"installation/#Environment-Variables","page":"Installation","title":"Environment Variables","text":"","category":"section"},{"location":"installation/","page":"Installation","title":"Installation","text":"If you are using a proxy, be sure that the proxy variables are also declared/exported in your .bash_profile or .bashrc or the equivalent","category":"page"},{"location":"installation/","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":"installation/#Test-That-Julia-Runs","page":"Installation","title":"Test That Julia Runs","text":"","category":"section"},{"location":"installation/","page":"Installation","title":"Installation","text":"the following should get you in and out of the julia interactive repl","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"julia \nexit()","category":"page"},{"location":"installation/#Set-up-SSH-Keys","page":"Installation","title":"Set up SSH Keys","text":"","category":"section"},{"location":"installation/","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":"installation/","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":"installation/","page":"Installation","title":"Installation","text":"Host *\nPubkeyAcceptedAlgorithms +ssh-rsa\nPubkeyAcceptedAlgorithms +ssh-ed25519","category":"page"},{"location":"installation/#Install-Optional-OpenFAST-Dependices","page":"Installation","title":"Install Optional OpenFAST Dependices","text":"","category":"section"},{"location":"installation/","page":"Installation","title":"Installation","text":"If your system is already set up such that it is capable of compiling OpenFAST, and you are on mac or linux, then you may skip this and rely on the automatically compiled version that are created when the OWENSOpenFAST libraries are installed by Julia. mkdir coderepos cd coderepos # Install openfast coupled libraries !NOTE!: if you change the location of the compiled libraries, you may need to update the rpath variable, or recompile. git clone –depth 1 git@github.com:andrew-platt/openfast.git # 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. cd openfast git remote set-branches origin '*' git fetch –depth 1 origin f/ADIcbindingmultiRotor git checkout f/ADIcbindingmultiRotor mkdir build cd build # can also add -DOPENMP=ON if desired for acceleration of OLAF # you can rebuild later by removing the build folder and following these instructions again. cmake -DBUILDSHAREDLIBS=ON .. make ifwcbinding # make moordyncbinding # make hydrodyncbinding make aerodyninflowcbinding make aerodyndriver make turbsim cd ../../","category":"page"},{"location":"installation/#Brief-Julia-Primer","page":"Installation","title":"Brief Julia Primer","text":"","category":"section"},{"location":"installation/","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":"installation/","page":"Installation","title":"Installation","text":"julia","category":"page"},{"location":"installation/","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":"installation/#OWENS-Installation","page":"Installation","title":"OWENS Installation","text":"","category":"section"},{"location":"installation/","page":"Installation","title":"Installation","text":"These steps require a secure download, such as through the SSH keys detailed above, to avoid man-in-the-middle attacks. ","category":"page"},{"location":"installation/","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":"installation/#Testing-Your-Build-of-OWENS","page":"Installation","title":"Testing Your Build of OWENS","text":"","category":"section"},{"location":"installation/","page":"Installation","title":"Installation","text":"clone the owens repository which contains example scripts that will setup and run example turbines from end to end","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"git clone git@github.com:sandialabs/OWENS.jl","category":"page"},{"location":"installation/","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":"installation/","page":"Installation","title":"Installation","text":"adi_lib = \"path/to/openfast/build/modules/libraryfolder/libraryname\"","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"cd OWENS.jl/examples/literate/\njulia B_detailedInputs.jl","category":"page"},{"location":"installation/","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 # or on mac, brew install paraview","category":"page"},{"location":"installation/","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":"installation/","page":"Installation","title":"Installation","text":"julia","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":" include(\"path/to/file.jl\")","category":"page"},{"location":"installation/#Visual-Studio-Code-IDE","page":"Installation","title":"Visual Studio Code IDE","text":"","category":"section"},{"location":"installation/","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/OWENS.code-profile). ","category":"page"},{"location":"installation/","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":"installation/","page":"Installation","title":"Installation","text":"cmd-j cmd-k,","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"if you want to clear out the console ","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"cmd-j cmd-c","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"open the workspace ","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"cmd-j cmd-w","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"run highlighted code ","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"shift-enter","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"run the currently selected file","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"cmd-shift-enter","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"You can also use the gui buttons.","category":"page"},{"location":"installation/#VSCode-Julia-Debugger","page":"Installation","title":"VSCode Julia Debugger","text":"","category":"section"},{"location":"installation/","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":"installation/","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":"installation/#Install-custom-repositories-you-want-to-develop","page":"Installation","title":"Install custom repositories you want to develop","text":"","category":"section"},{"location":"installation/","page":"Installation","title":"Installation","text":"start Julia from the cloned directory and use the command:","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"] dev .","category":"page"},{"location":"installation/","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":"installation/","page":"Installation","title":"Installation","text":"alternatively, instead of using or import to get access to the module, within julia","category":"page"},{"location":"installation/","page":"Installation","title":"Installation","text":"include(\"path/to/module.jl/source/module.jl\")","category":"page"},{"location":"installation/","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":"installation/","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":"installation/","page":"Installation","title":"Installation","text":"using Pkg\nPkg.add(url = \"git@github.com:sandialabs/OWENS.jl.git\", rev = \"dev\")","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"OWENS X is outwards on blade, y is trailing edge always","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"Struts, CCW, z is inwards, y trailing, and CW z is outwards","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"Aerodyn ","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","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":"-","title":"-","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":"-","title":"-","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":"-","title":"-","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":"-","title":"-","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":"-","title":"-","text":"(Image: ){width=\"5.595138888888889in\" height=\"4.875694444444444in\"}(Image: ){width=\"5.737141294838145in\" height=\"5.283430664916885in\"}","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"If we add 30 degrees of rotation to the yaw, this is what it looks like.","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"(Image: ){width=\"4.91704615048119in\" height=\"4.992732939632546in\"}","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","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":"-","title":"-","text":"(Image: ){width=\"4.382957130358705in\" height=\"4.783430664916885in\"}(Image: ){width=\"5.226388888888889in\" height=\"4.833333333333333in\"}","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","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":"-","title":"-","text":"(Image: ){width=\"5.124857830271216in\" height=\"4.771802274715661in\"}","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","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":"-","title":"-","text":"(Image: ){width=\"4.095165135608049in\" height=\"4.388081802274716in\"}","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","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":"-","title":"-","text":"# apply the twist rotation, which is about the x (1) axis","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"myvec = myvec*[1.0 0.0 0.0","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"0.0 cosd(Twistdel) sind(Twistdel)","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"0.0 -sind(Twistdel) cosd(Twistdel)]","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"# apply theta rotation, which is the tilt angle, or about the y (2) axis in global","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"myvec = myvec*[cosd(Thetadel) 0.0 -sind(Thetadel)","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"0.0 1.0 0.0","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"sind(Thetadel) 0.0 cosd(Thetadel)]","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"# apply Psi rotation, which is about Z (3) axis in global","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"myvec = myvec*[cosd(Psidel) sind(Psidel) 0.0","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"-sind(Psidel) cosd(Psidel) 0.0","category":"page"},{"location":"FramesOfReference/","page":"-","title":"-","text":"0.0 0.0 1.0]","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"EditURL = \"../../../examples/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\n#### PyPlot.pygui(true)\nimport OWENSOpenFASTWrappers\n\n\nrunpath = path = \"/home/runner/work/OWENS.jl/OWENS.jl/examples/literate\" # to run locally, change to splitdir(@__FILE__)[1]\n# runpath = path = 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)\nshapeY = zeros(Nslices+1)\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]\nHtwr_base=towerHeight\nstrut_mountpointbot = 0.11\nstrut_mountpointtop = 0.89\njoint_type = 0\nc_mount_ratio = 0.05\nangularOffset = -pi/2\ncustommesh = nothing\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\nstrut_twr_mountpoint = [0.25,0.75]\nstrut_bld_mountpoint = [0.25,0.75]\nNbld = B\nH = maximum(shapeZ) #m,\nHtwr_blds = H\nAD15hubR = 0.1\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\" && custommesh == nothing #TODO, for all of these propogate the AeroDyn additional output requirements\n mymesh,myort,myjoint, AD15bldNdIdxRng, AD15bldElIdxRng = OWENS.create_arcus_mesh(;Htwr_base,\n Hbld = 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 AD15_ccw = true,\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\") && custommesh == nothing\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(;Htwr_base,\n Htwr_blds,\n Hbld = H, #blade height\n R, # m bade radius\n AD15hubR, #TODO: hook up with AD15 file generation\n nblade = Nbld,\n ntelem, #tower elements\n nbelem, #blade elements\n nselem,\n strut_twr_mountpoint,\n strut_bld_mountpoint,\n bshapex = shapeX, #Blade shape, magnitude is irrelevant, scaled based on height and radius above\n bshapez = shapeZ,\n bshapey = shapeY, # 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)\nelseif custommesh != nothing\n mymesh, myort, myjoint, AD15bldNdIdxRng, AD15bldElIdxRng = custommesh(;Htwr_base,\n Htwr_blds,\n Hbld = H, #blade height\n R, # m bade radius\n AD15hubR, #TODO: hook up with AD15 file generation\n nblade = Nbld,\n ntelem, #tower elements\n nbelem, #blade elements\n nselem,\n strut_twr_mountpoint,\n strut_bld_mountpoint,\n bshapex = shapeX, #Blade shape, magnitude is irrelevant, scaled based on height and radius above\n bshapez = shapeZ,\n bshapey = shapeY, # 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 )\nelse #TODO unify with HAWT\n error(\"please choose a valid mesh type (Darrieus, H-VAWT, ARCUS)\")\nend\n\nnTwrElem = Int(mymesh.meshSeg[1])\ntry\n if contains(NuMad_mat_xlscsv_file_bld,\"34m\") || meshtype == \"ARCUS\" #TODO: this is really odd,\n nTwrElem = Int(mymesh.meshSeg[1])+1\n end\ncatch\n nTwrElem = Int(mymesh.meshSeg[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()\nfor icon = 1:length(mymesh.conn[:,1])\n idx1 = mymesh.conn[icon,1]\n idx2 = mymesh.conn[icon,2]\n PyPlot.plot3D([mymesh.x[idx1],mymesh.x[idx2]],[mymesh.y[idx1],mymesh.y[idx2]],[mymesh.z[idx1],mymesh.z[idx2]],\"k.-\")\n PyPlot.text3D(mymesh.x[idx1].+rand()/30,mymesh.y[idx1].+rand()/30,mymesh.z[idx1].+rand()/30,\"$idx1\",ha=\"center\",va=\"center\")\n #### sleep(0.1)\nend\n\nfor ijoint = 1:length(myjoint[:,1])\n idx2 = Int(myjoint[ijoint,2])\n idx1 = Int(myjoint[ijoint,3])\n PyPlot.plot3D([mymesh.x[idx1],mymesh.x[idx2]],[mymesh.y[idx1],mymesh.y[idx2]],[mymesh.z[idx1],mymesh.z[idx2]],\"r.-\")\n PyPlot.text3D(mymesh.x[idx1].+rand()/30,mymesh.y[idx1].+rand()/30,mymesh.z[idx1].+rand()/30,\"$idx1\",color=\"r\",ha=\"center\",va=\"center\")\n PyPlot.text3D(mymesh.x[idx2].+rand()/30,mymesh.y[idx2].+rand()/30,mymesh.z[idx2].+rand()/30,\"$idx2\",color=\"r\",ha=\"center\",va=\"center\")\n #### sleep(0.1)\nend\nPyPlot.xlabel(\"x\")\nPyPlot.ylabel(\"y\")\nPyPlot.zlabel(\"z\")","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;section=:tower)\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;section=:blade)\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":"numadIn_strut = Array{OWENS.NuMad, 1}(undef, Nstrutperbld)\nstrut_precompoutput = Array{Array{OWENS.OWENSPreComp.Output, 1},1}(undef, Nstrutperbld)\nstrut_precompinput = Array{Array{OWENS.OWENSPreComp.Input, 1},1}(undef, Nstrutperbld)\nplyprops_strut = Array{OWENS.plyproperties, 1}(undef, Nstrutperbld)\nlam_U_strut = Array{Array{OWENS.Composites.Laminate, 2}}(undef, Nstrutperbld)\nlam_L_strut = Array{Array{OWENS.Composites.Laminate, 2}}(undef, Nstrutperbld)\nlam_W_strut = Array{Array{OWENS.Composites.Laminate, 2}}(undef, Nstrutperbld)\nsectionPropsArray_strut = Array{Array{OWENSFEA.SectionPropsArray, 1}}(undef, Nstrutperbld)\nstiff_strut = Array{Array{Array{Float64,2}, 1},1}(undef, Nstrutperbld)\nmass_strut = Array{Array{Array{Float64,2}, 1},1}(undef, Nstrutperbld)\nfor istrut = 1:Nstrutperbld\n if !isnothing(NuMad_geom_xlscsv_file_strut)\n if typeof(NuMad_geom_xlscsv_file_strut)==String\n numadIn_strut[istrut] = OWENS.readNuMadGeomCSV(NuMad_geom_xlscsv_file_strut)\n elseif typeof(NuMad_geom_xlscsv_file_strut) == OrderedCollections.OrderedDict{Symbol, Any}\n if length(NuMad_geom_xlscsv_file_strut[:components][:struts])==1\n numadIn_strut[istrut] = OWENS.readNuMadGeomCSV(NuMad_geom_xlscsv_file_strut;section=:struts,subsection=1)\n else\n numadIn_strut[istrut] = OWENS.readNuMadGeomCSV(NuMad_geom_xlscsv_file_strut;section=:struts,subsection=istrut)\n end\n else\n numadIn_strut[istrut] = OWENS.readNuMadGeomCSV(NuMad_geom_xlscsv_file_strut[istrut])\n end\n else\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[istrut] = 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)\n end\n for icol = 1:length(numadIn_strut[istrut].stack_layers[1,:])\n numadIn_strut[istrut].stack_layers[:,icol] .*= LinRange(stack_layers_scale[1],stack_layers_scale[2],length(numadIn_strut[istrut].chord))\n end\n #### numadIn_strut[istrut].chord .*= LinRange(chord_scale[1],chord_scale[2],length(numadIn_strut[istrut].chord))\n\n for (i,airfoil) in enumerate(numadIn_strut[istrut].airfoil)\n numadIn_strut[istrut].airfoil[i] = \"$path/airfoils/$airfoil\"\n end\n\n if !isnothing(NuMad_mat_xlscsv_file_strut)\n plyprops_strut[istrut] = OWENS.readNuMadMaterialsCSV(NuMad_mat_xlscsv_file_strut)\n else\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[istrut] = OWENS.plyproperties(names,plies)\n end\n\n #### TODO: not straight struts\n spanpos = LinRange(0,1,nselem+1)#[0.0;cumsum(sqrt.(diff(mymesh.x[strut1start:strut1end]).^2 .+ diff(mymesh.z[strut1start:strut1end]).^2))]\n\n if length(thickness_scale)==2\n yscale = collect(LinRange(thickness_scale[1],thickness_scale[2],length(numadIn_strut[istrut].span)))\n elseif length(thickness_scale)==length(numadIn_strut[istrut].span)\n yscale = thickness_scale\n end\n\n strut_precompoutput[istrut],strut_precompinput[istrut],lam_U_strut[istrut],lam_L_strut[istrut],lam_W_strut[istrut] = OWENS.getOWENSPreCompOutput(numadIn_strut[istrut];yscale,plyprops = plyprops_strut[istrut])\n sectionPropsArray_strut[istrut] = OWENS.getSectPropsFromOWENSPreComp(spanpos,numadIn_strut[istrut],strut_precompoutput[istrut];precompinputs=strut_precompinput[istrut])\n stiff_strut[istrut], mass_strut[istrut] = OWENS.getSectPropsFromOWENSPreComp(spanpos,numadIn_strut[istrut],strut_precompoutput[istrut];GX=true)\nend\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)))\n#### strutssecprops = collect(Iterators.flatten(fill(sectionPropsArray_strut, Nstrutperbld*Nbld)))\n\nif meshtype == \"ARCUS\"\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)))\n stiff_array = [stiff_twr; stiff_blds]#; stiff_struts]\n\n mass_blds = collect(Iterators.flatten(fill(mass_bld, Nbld)))\n mass_array = [mass_twr; mass_blds]#; mass_struts]\n\n for icable = 1:Nbld\n sectionPropsArray = [sectionPropsArray; sectionPropsArray_strut[1]]\n stiff_array = [stiff_array;stiff_strut[1]]\n mass_array = [mass_array;mass_strut[1]]\n end\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)))\n stiff_array = [stiff_twr; stiff_blds]#; stiff_struts]\n\n mass_blds = collect(Iterators.flatten(fill(mass_bld, Nbld)))\n mass_array = [mass_twr; mass_blds]#; mass_struts]\n\n for istrut = 1:Nstrutperbld\n for ibld = 1:Nbld\n global sectionPropsArray = [sectionPropsArray; sectionPropsArray_strut[istrut]]\n global stiff_array = [stiff_array;stiff_strut[istrut]]\n global mass_array = [mass_array;mass_strut[istrut]]\n end\n end\nend\nrotationalEffects = ones(mymesh.numEl) #TODO: non rotating tower, or rotating blades\n\nif length(sectionPropsArray)Nbld # 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 BlCrvAC=zeros(blade_Nnodes[iADBody])\n BlSwpAC=zeros(blade_Nnodes[iADBody])\n BlCrvAng=zeros(blade_Nnodes[iADBody])\n BlTwist=zeros(blade_Nnodes[iADBody])\n BlChord=blade_chords[iADBody]\n BlAFID=collect((iADBody-1)*NumADStrutNds+1:iADBody*NumADStrutNds)\n end\n OWENSOpenFASTWrappers.writeADbladeFile(filename;NumBlNds=blade_Nnodes[iADBody],BlSpn,BlCrvAC,BlSwpAC,BlCrvAng,BlTwist,BlChord,BlAFID)\n end\n\n OWENSOpenFASTWrappers.writeOLAFfile(OLAF_filename;nNWPanel=200,nFWPanels=10)\n\n OWENSOpenFASTWrappers.writeIWfile(Vinf,ifw_input_file;windINPfilename)\n\n OWENSOpenFASTWrappers.setupTurb(adi_lib,ad_input_file,ifw_input_file,adi_rootname,[shapeX],[shapeZ],[B],[Htwr_base],[mymesh],[myort],[AD15bldNdIdxRng],[AD15bldElIdxRng];\n rho = rho,\n adi_dt = delta_t,\n adi_tmax= numTS*delta_t,\n omega = [omega],\n adi_wrOuts = 1, # write output file [0 none, 1 txt, 2 binary, 3 both]\n adi_DT_Outs = delta_t, # output frequency\n numTurbines = 1,\n refPos=[[0,0,0]],\n hubPos=[[0,0,0.0]],\n hubAngle=[[0,0,0]],\n nacPos=[[0,0,0]],\n adi_nstrut=[Nstrutperbld],\n adi_debug=0,\n isHAWT = false # true for HAWT, false for crossflow or VAWT\n )\n\n aeroForcesAD(t,azi) = OWENS.mapAD15(t,azi,[mymesh],OWENSOpenFASTWrappers.advanceAD15;alwaysrecalc=true,verbosity=1)\n deformAeroAD=OWENSOpenFASTWrappers.deformAD15\nend\n\nnothing","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"Calculate mass breakout of each material","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"mass_breakout_bld = OWENS.get_material_mass(plyprops_bld,numadIn_bld)\nmass_breakout_blds = mass_breakout_bld.*length(mymesh.structuralNodeNumbers[:,1])\nmass_breakout_twr = OWENS.get_material_mass(plyprops_twr,numadIn_twr;int_start=0.0,int_stop=Htwr_base)\n\n################################\n##### End setupOWENS\n################################\n\nnothing","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","text":"Then the rest of this example is the same as example B","category":"page"},{"location":"examples/C_customizablePreprocessing/","page":"Customizable Preprocessing","title":"Customizable Preprocessing","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\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":"reference/referencePreComp/#OWENSPreComp","page":"OWENSPreComp","title":"OWENSPreComp","text":"","category":"section"},{"location":"reference/referencePreComp/","page":"OWENSPreComp","title":"OWENSPreComp","text":"CurrentModule = OWENS","category":"page"},{"location":"reference/referencePreComp/#Types-and-functions","page":"OWENSPreComp","title":"Types and functions","text":"","category":"section"},{"location":"reference/referencePreComp/","page":"OWENSPreComp","title":"OWENSPreComp","text":"Modules = [OWENS.OWENSPreComp]","category":"page"},{"location":"reference/referencePreComp/#OWENSPreComp.Input","page":"OWENSPreComp","title":"OWENSPreComp.Input","text":"Struct for holding inputs to OWENSPreComp.properties()\n\n\n\n\n\n","category":"type"},{"location":"reference/referencePreComp/#OWENSPreComp.Output","page":"OWENSPreComp","title":"OWENSPreComp.Output","text":"Struct type for holding outputs of OWENSPreComp.properties()\n\n\n\n\n\n","category":"type"},{"location":"reference/referencePreComp/#OWENSPreComp.input","page":"OWENSPreComp","title":"OWENSPreComp.input","text":"Struct for holding inputs to OWENSPreComp.properties()\n\n\n\n\n\n","category":"type"},{"location":"reference/referencePreComp/#OWENSPreComp.embed_ls-NTuple{4, Any}","page":"OWENSPreComp","title":"OWENSPreComp.embed_ls","text":"embed_ls(x, nodes_l, xnode_l, ynode_l)\n\npurpose: embed a node in the lower-surface airfoil section nodes NOTE: nodal x coordinates must be in ascending order\n\nArguments:\n\nx::Real: x-coordinate of node to be embedded in the l-surf\nnodes_l::Int: no of current nodes on the lower surface\nxnode_l::Array{<:Real,1}: x-nodes on lower surface\nynode_l::Array{<:Real,1}: y-nodes on lower surface\n\nOutputs:\n\nnodes_l: revised no of current nodes on lower surface\nxnode_l: x-nodes on lower surface\nynode_l: y-nodes on lower surface\ny: y-coordinate of node embedded in the l-surf\nnewnode : number of the embedded node\n\n\n\n\n\n","category":"method"},{"location":"reference/referencePreComp/#OWENSPreComp.embed_us-Tuple{Real, Int64, Any, Any}","page":"OWENSPreComp","title":"OWENSPreComp.embed_us","text":"embed_us(x, nodes_u, xnode_u, ynode_u)\n\npurpose: embed a node in the upper-surface airfoil section nodes NOTE: nodal x coordinates must be in ascending order\n\nArguments:\n\nx::Real: x-coordinate of node to be embedded in the u-surf\nnodes_u::Int: no of current nodes on the upper surface\nxnode_u::Array{<:Real,1}: x-nodes on upper surface\nynode_u::Array{<:Real,1}: y-nodes on upper surface\n\nOutputs:\n\nnodes_u: revised no of current nodes on upper surface\nxnode_u: x-nodes on upper surface\nynode_u: y-nodes on upper surface\ny: y-coordinate of node embedded in the u-surf\nnewnode : number of the embedded node\n\n\n\n\n\n","category":"method"},{"location":"reference/referencePreComp/#OWENSPreComp.properties-Tuple{Real, Real, Real, Real, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}, AbstractVector{<:Real}}","page":"OWENSPreComp","title":"OWENSPreComp.properties","text":"properties(chord::Array{<:Real,1}, tw_aero_d::Array{<:Real,1},\ntw_prime_d::Array{<:Real,1}, le_loc::Real, xnode::Array{<:Real,1},\nynode::Array{<:Real,1}, e1::Array{<:Real,1}, e2::Array{<:Real,1},\ng12::Array{<:Real,1}, anu12::Array{<:Real,1}, density::Array{<:Real,1},\nxsec_nodeU::Array{<:Real,1}, n_laminaU::Array{Int64,1},\nn_pliesU::Array{Int64,1}, t_lamU::Array{<:Real,1},\ntht_lamU::Array{<:Real,1}, mat_lamU::Array{Int64,1},\nxsec_nodeL::Array{<:Real,1}, n_laminaL::Array{Int64,1},\nn_pliesL::Array{Int64,1}, t_lamL::Array{<:Real,1},\ntht_lamL::Array{<:Real,1}, mat_lamL::Array{Int64,1},\nloc_web::Array{<:Real,1}, n_laminaW::Array{Int64,1},\nn_pliesW::Array{Int64,1}, t_lamW::Array{<:Real,1},\ntht_lamW::Array{<:Real,1}, mat_lamW::Array{Int64,1})\n\nCalculates span-variant structural properties for composite blades\n\nInputs\n\nchord::Real: section chord length (m)\ntw_aero_d::Real: section twist angle (deg)\ntw_prime_d::Real: derivative of section twist angle w.r.t. span location (deg/m)\nle_loc::Real: leading edge location relative to reference axis (normalized by chord)\nxnode::Array{<:Real,1}: x airfoil coordinates starting at leading edge traversing upper surface and back around lower surface\nynode::Array{<:Real,1}: y airfoil coordinates starting at leading edge traversing upper surface and back around lower surface\ne1::Array{<:Real,1}: E1\ne2::Array{<:Real,1}: E2\ng12::Array{<:Real,1}: G12\nanu12::Array{<:Real,1}: Nu12\ndensity::Array{<:Real,1}: density\nxsec_nodeU::Array{<:Real,1}: upper surface normalized chord location of sector boundaries\nn_laminaU::Array{Int64,1}: upper surface number of lamina in each sector\nn_pliesU::Array{Int64,1}: upper surface number of plies\nt_lamU::Array{<:Real,1}: upper surface ply thickness (m) for the lamina\ntht_lamU::Array{<:Real,1}: upper surface orientation (deg) for the lamina\nmat_lamU::Array{Int64,1}: upper surface material id for the lamina\nxsec_nodeL::Array{<:Real,1}: lower surface normalized chord location of sector boundaries\nn_laminaL::Array{Int64,1}: lower surface number of lamina in each sector\nn_pliesL::Array{Int64,1}: lower surface number of plies\nt_lamL::Array{<:Real,1}: lower surface ply thickness (m) for the lamina\ntht_lamL::Array{<:Real,1}: lower surface orientation (deg) for the lamina\nmat_lamL::Array{Int64,1}: lower surface material id for the lamina\nloc_web::Array{<:Real,1}: web normalized chord location of sector boundaries\nn_laminaW::Array{Int64,1}: web number of lamina in each sector\nn_pliesW::Array{Int64,1}: web number of plies\nt_lamW::Array{<:Real,1}: web ply thickness (m) for the lamina\ntht_lamW::Array{<:Real,1}: web orientation (deg) for the lamina\nmat_lamW::Array{Int64,1}: web material id for the lamina\n\nOutputs:\n\neifbar: ei_flap, Section flap bending stiffness about the YE axis (Nm2)\neilbar: ei_lag, Section lag (edgewise) bending stiffness about the XE axis (Nm2)\ngjbar: gj, Section torsion stiffness (Nm2)\neabar: ea, Section axial stiffness (N)\neiflbar: s_fl, Coupled flap-lag stiffness with respect to the XE-YE frame (Nm2)\nsfbar: s_af, Coupled axial-flap stiffness with respect to the XE-YE frame (Nm)\nslbar: s_al, Coupled axial-lag stiffness with respect to the XE-YE frame (Nm.)\nsftbar: s_ft, Coupled flap-torsion stiffness with respect to the XE-YE frame (Nm2)\nsltbar: s_lt, Coupled lag-torsion stiffness with respect to the XE-YE frame (Nm2)\nsatbar: s_at, Coupled axial-torsion stiffness (Nm)\nz_sc: x_sc, X-coordinate of the shear-center offset with respect to the XR-YR axes (m)\ny_sc: y_sc, Chordwise offset of the section shear-center with respect to the reference frame, XR-YR (m)\nztc_ref: x_tc, X-coordinate of the tension-center offset with respect to the XR-YR axes (m)\nytc_ref: y_tc, Chordwise offset of the section tension-center with respect to the XR-YR axes (m)\nmass: mass, Section mass per unit length (Kg/m)\niflap_eta: flap_iner, Section flap inertia about the YG axis per unit length (Kg-m)\nilag_zeta: lag_iner, Section lag inertia about the XG axis per unit length (Kg-m)\ntw_iner_d: twinerd, Orientation of the section principal inertia axes with respect the blade reference plane, θ (deg)\nzcm_ref: x_cm, X-coordinate of the center-of-mass offset with respect to the XR-YR axes (m)\nycm_ref: y_cm, Chordwise offset of the section center of mass with respect to the XR-YR axes (m)\nn_af_nodes: number of airfoil nodes\nn_materials: number of materials\nn_sctU: number of sectors on upper\nn_sctL: number of sectors on lower\nnwebin: number of webs\nn_laminaTotalU: total number of lamina on upper\nn_laminaTotalL: total number of lamina on lower\nn_laminaTotalW: total number of lamina on webs\n\n\n\n\n\n","category":"method"},{"location":"reference/referencePreComp/#OWENSPreComp.properties-Union{Tuple{OWENSPreComp.Input{R}}, Tuple{R}} where R<:Real","page":"OWENSPreComp","title":"OWENSPreComp.properties","text":"properties(pc_input::Input)\n\nCalculates span-variant structural properties for composite blades. Holds all inputs and outputs to properties function in structs\n\n\n\n\n\n","category":"method"},{"location":"reference/referencePreComp/#OWENSPreComp.q_bars-NTuple{7, Any}","page":"OWENSPreComp","title":"OWENSPreComp.q_bars","text":"q_bars(mat, thp, density, q11, q22, q12, q66)\n\nArguments\n\nmat: material id\nthp: ply orientation\ndensity:\nq11:\nq22:\nq12:\nq66:\n\nOutputs\n\nqbar11:\nqbar22:\nqbar12:\nqbar16:\nqbar26:\nqbar66:\nrho_m:\n\n\n\n\n\n","category":"method"},{"location":"reference/referencePreComp/#OWENSPreComp.readcompositesection-Tuple{String, Vector{Float64}}","page":"OWENSPreComp","title":"OWENSPreComp.readcompositesection","text":"readcompositesection(fname::String,locw::Array{Float64,1})\n\nReads a composite section input file. Returns locU, nlaminaU, npliesU, tU, thetaU, matidxU, locL, nlaminaL, npliesL, tL, thetaL, matidxL, locW, nlaminaW, npliesW, tW, thetaW, mat_idxW\n\n\n\n\n\n","category":"method"},{"location":"reference/referencePreComp/#OWENSPreComp.readmain-Tuple{String}","page":"OWENSPreComp","title":"OWENSPreComp.readmain","text":"readmain(\"fname::String\")\n\nReads a main OWENSPreComp input file. Returns sloc,leloc,chord,twaero,afshapefile,intstrfile, ibspstn,obspstn,ibchloc,obchloc\n\n\n\n\n\n","category":"method"},{"location":"reference/referencePreComp/#OWENSPreComp.readmaterials","page":"OWENSPreComp","title":"OWENSPreComp.readmaterials","text":"readmaterials(fname = \"materials.inp\")\n\nreads material properties from OWENSPreComp materials input file fname returns e1,e2,g12,nu12,rho,name\n\n\n\n\n\n","category":"function"},{"location":"reference/referencePreComp/#OWENSPreComp.readprecompprofile-Tuple{String}","page":"OWENSPreComp","title":"OWENSPreComp.readprecompprofile","text":"readprecompprofile(filename::String) Reads precomp profile file. Returns xu, yu, xl, yl\n\n\n\n\n\n","category":"method"},{"location":"reference/referencePreComp/#OWENSPreComp.readprofile-Tuple{String, Int64, Bool}","page":"OWENSPreComp","title":"OWENSPreComp.readprofile","text":"readprofile(filename::String, numHeaderlines::Int64, LEtoLE::Bool) Reads precomp profile file. Returns xu, yu, xl, yl\n\n\n\n\n\n","category":"method"},{"location":"reference/referencePreComp/#OWENSPreComp.readsectorsfromfile-Tuple{IOStream, Int64}","page":"OWENSPreComp","title":"OWENSPreComp.readsectorsfromfile","text":"readsectorsfromfile(f::IOStream, n_sector::Int64)\n\nReads OWENSPreComp sector. Returns nlamina,nplies, t, theta, mat_idx\n\n\n\n\n\n","category":"method"},{"location":"reference/referencePreComp/#OWENSPreComp.seg_info-NTuple{16, Any}","page":"OWENSPreComp","title":"OWENSPreComp.seg_info","text":"seg_info(ch, rle, nseg, nseg_u, nseg_p, xnode_u, ynode_u,\nxnode_l, ynode_l, ndl1, ndu1, loc_web, weby_u, weby_l, n_scts,\nxsec_node)\n\nNOTE: coord transformation from xaf-yaf to yre-zref and seg info\n\n\n\n\n\n","category":"method"},{"location":"reference/referencePreComp/#OWENSPreComp.tw_rate-Tuple{Any, Any, Any}","page":"OWENSPreComp","title":"OWENSPreComp.tw_rate","text":"tw_rate(naf, sloc, tw_aero)\n\nArguments\n\nnaf: no of blade stations\nsloc: vector of station locations\ntw_aero_d: vector of twist distribution in degrees\n\nOutputs\n\nth_prime_d: vector of twist rates in degrees\n\n\n\n\n\n","category":"method"},{"location":"examples/B_detailedInputs/","page":"Detailed Inputs","title":"Detailed Inputs","text":"EditURL = \"../../../examples/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\n#### import PyPlot\nrunpath = path = \"/home/runner/work/OWENS.jl/OWENS.jl/examples/literate\" # to run locally, change to splitdir(@__FILE__)[1]\n# runpath = path = splitdir(@__FILE__)[1]\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 Htwr_base=towerHeight,\n strut_twr_mountpoint = [0.2,0.8],\n strut_bld_mountpoint = [0.2,0.8],\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\nif AD15On #TODO: move this into the run functions\n OWENS.OWENSOpenFASTWrappers.endTurb()\nend\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":"examples/A_simplyRunningOWENS/","page":"Simply Running OWENS","title":"Simply Running OWENS","text":"EditURL = \"../../../examples/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 = path = \"/home/runner/work/OWENS.jl/OWENS.jl/examples/literate\" # to run locally, change to splitdir(@__FILE__)[1]\n# runpath = path = splitdir(@__FILE__)[1]\n\nInp = OWENS.MasterInput(\"$runpath/sampleOWENS.yml\")\n\nOWENS.runOWENS(Inp,runpath)","category":"page"},{"location":"examples/A_simplyRunningOWENS/","page":"Simply Running OWENS","title":"Simply Running OWENS","text":"Here is an example of using the same model against the automated DLC run script. Note that for a setup cutom to a specific design, you'll want to go to the B level to get all of the detailed inputs correct One of these is the controller where a discon controller library can be coupled instead of the specified RPM control.","category":"page"},{"location":"examples/A_simplyRunningOWENS/","page":"Simply Running OWENS","title":"Simply Running OWENS","text":"simulated_time = 2.0 #seconds\nDLCs = [\"1_1\"] #\"normal\"\n#### DLCs = [\"1_3\"] #\"normal\"\n#### DLCs = [\"1_4\"] #\"normal\"\n#### DLCs = [\"1_5\"] #\"normal\"\n#### DLCs = [\"2_1\"] #\"freewheelatNormalOperatingRPM\"\n#### DLCs = [\"2_3\"] #\"freewheelatNormalOperatingRPM\"\n#### DLCs = [\"3_1\"] #\"startup\"\n#### DLCs = [\"3_2\"] #\"startup\"\n#### DLCs = [\"3_3\"] #\"startup\"\n#### DLCs = [\"4_1\"] #\"shutdown\"\n#### DLCs = [\"4_2\"] #\"shutdown\"\n#### DLCs = [\"5_1\"] #\"emergencyshutdown\"\n#### DLCs = [\"6_1\"] #\"parked\"\n#### DLCs = [\"6_2\"] #\"parked_idle\"\n#### DLCs = [\"6_4\"] #\"parked\"\n#### DLCs = [\"7_1\"] #\"parked\"\n#### DLCs = [\"2_3\",\"3_1\",\"3_2\",\"3_3\",\"4_1\",\"4_2\",\"5_1\"]\n\nOWENS.runDLC(DLCs,Inp,runpath;\n IEC_std=\"\\\"1-ED3\\\"\",\n WindChar=\"\\\"A\\\"\",\n WindClass=1,\n NumGrid_Z=38,\n NumGrid_Y=26,\n Vdesign=11.0,\n grid_oversize=1.25,\n Vinf_range=[10.0],#LinRange(4,24,21),\n regenWindFiles=true,\n delta_t_turbsim=0.05,\n simtime_turbsim=30.0,\n pathtoturbsim=\"$(OWENS.OWENSOpenFASTWrappers.OFWpath)/../deps/openfast/build/modules/turbsim/turbsim\",\n runScript=OWENS.runOWENS)\n\nnothing","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":"getting_started/#nothing-yet","page":"nothing yet","title":"nothing yet","text":"","category":"section"},{"location":"reference/referenceAero/#OWENSAero","page":"OWENSAero","title":"OWENSAero","text":"","category":"section"},{"location":"reference/referenceAero/","page":"OWENSAero","title":"OWENSAero","text":"CurrentModule = OWENS","category":"page"},{"location":"reference/referenceAero/#Types-and-functions","page":"OWENSAero","title":"Types and functions","text":"","category":"section"},{"location":"reference/referenceAero/","page":"OWENSAero","title":"OWENSAero","text":"Modules = [OWENS.OWENSAero]","category":"page"},{"location":"reference/referenceAero/#OWENSAero.Environment","page":"OWENSAero","title":"OWENSAero.Environment","text":"Environment(rho::TF,mu::TF,Vx::TAF #Vinf is Vx,Vy::TAF,Vz::TAF,Vtwist::TAF,windangle::TF #radians,DSModel::TS,AModel::TS,awwarm::TVF,steplast::TAI,idxRPI::TAI,Vwakeold::TVF2,BVDynamicFlagL::TAI,BVDynamicFlagD::TAI,alphalast::TAF2,suction::TB) Environment(rho,mu,Vx,Vy,Vz,Vtwist,windangle,DSModel,AModel,awwarm) = Environment(rho,mu,Vx,Vy,Vz,Vtwist,windangle,DSModel,AModel,awwarm,zeros(Int,1),zeros(Int,length(Vx)),deepcopy(Vx),zeros(Int,1),zeros(Int,1),zeros(Real,1),false) Environment(rho,mu,Vx,DSModel,AModel,awwarm) = Environment(rho,mu,Vx,zeros(Real,size(Vx)),zeros(Real,size(Vx)),zeros(Real,size(Vx)),0.0,DSModel,AModel,awwarm,zeros(Int,1),zeros(Int,length(Vx)),deepcopy(Vx),zeros(Int,1),zeros(Int,1),zeros(Real,1),false)\n\nContains specications for turbine slice environment/operating conditions as well as some backend memory for dynamic stall and unsteady calculations\n\nInputs\n\nrho::TF: Working fluid density (kg/m^3)\nmu::TF: Working fluid viscosity (standard SI units)\nV_x::TAF Vinf is Vx for simple simulations (m/s), array corresponding to each azimuthal position\nV_y::TAF: y input velocity (m/s), array corresponding to each azimuthal position\nV_z::TAF: z input velocity (m/s), array corresponding to each azimuthal position\nV_twist::TAF: rotational velocity from active twist (rad/s), array corresponding to each azimuthal position\nwindangle::TF: angle of mean oncoming wind (rad)\nDSModel::TS: dynamic stall model (\"BV\" or \"none\" or \"LB\" - once it is finished)\nAModel::TS: aero model used (\"DMS\" or \"AC\")\naw_warm::TVF: warm start induction factor array, first half corresponding to u, second half to v\nsteplast::TAI: prior simulation step index, used for unsteady wake propogation\nidx_RPI::TAI: used to specify the azimuthal indices needed for a partial solve (i.e. not every azimuthal index), such as is used in the RPI method\nV_wake_old::TVF2: Prior step's mean wake velocity (m/s)\nBV_DynamicFlagL::TAI: Boeing-vertol dynamic stall lift flag\nBV_DynamicFlagD::TAI: Boeing-vertol dynamic stall drag flag\nalpha_last::TAF2: Boeing-vertol dynamic stall prior step's angle of attack\nsuction::TB: DMS flag for alternate induction model\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceAero/#OWENSAero.Turbine","page":"OWENSAero","title":"OWENSAero.Turbine","text":"Turbine(R::TF,r::TAF,z::TF,chord::TAF3,twist::TAF5,delta::TAF,omega::TAF4,B::TI,af::TFN,ntheta::TI,r_delta_influence::TB,centerX::TAF2,centerY::TAF2)\nTurbine(R,r,z,chord,twist,delta,omega,B,af,ntheta,r_delta_infl) = Turbine(R,r,z,chord,twist,delta,omega,B,af,ntheta,r_delta_infl,zeros(Real,size(R)),zeros(Real,size(R)))\nTurbine(R,r,chord,twist,delta,omega,B,af,ntheta,r_delta_infl) = Turbine(R,r,1.0,chord,twist,delta,omega,B,af,ntheta,r_delta_infl,zeros(Real,size(R)),zeros(Real,size(R)))\n\nContains specications for turbine slice (geometry, location, airfoil)\n\nInputs\n\nR::TF: Nominal turbine radius (m)\nr::TAF: Array of local radaii corresponding to each azimuthal position for the slice, allows for active blade deformation (m)\nz::TF: Vertical location of slice (only used when calling inflow-wind turbulent input)(m)\nchord::TAF3: Array of chord corresponding to each azimuthal position, allows for active blade deformation (m)\ntwist::TAF5: Array of blade twist corresponding to each azimuthal position, allows for active blade deformation (rad)\ndelta::TAF: Array of blade slope corresponding to each azimuthal position, allows for active blade deformation (rad)\nomega::TAF4: Array of rotational rate corresponding to each azimuthal position, allows for active blade deformation (rad/s)\nB::TI: Number of blades\naf::TFN: Airfoil function - see tests for example of how to create\nntheta::TI: Number of azimuthal discretizations\nr_delta_influence::TB: Specification of whether local radius and blade slope are used in the influence coefficients for the actuator cylinder method\ncenterX::TAF2: Turbine center x location (only used if multiple turbines are modeled)\ncenterY::TAF2: Turbine center y location (only used if multiple turbines are modeled)\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceAero/#OWENSAero.UnsteadyParams","page":"OWENSAero","title":"OWENSAero.UnsteadyParams","text":"UnsteadyParams(RPI::TB,tau::TAF,ifw::TB,IECgust::TB,nominalVinf::TF,G_amp::TF,gustX0::TF,gustT::TF) UnsteadyParams(RPI,tau,ifw) = UnsteadyParams(RPI,tau,ifw,false,1.0,0.0,1.0,1.0)\n\nContains specications for turbine slice unsteady inputs\n\nInputs\n\nRPI::TB: Flag to specify if RPI is being used\ntau::TAF: Unsteady method wake propogation weighting [3.0,0.3]\nifw::TB: Flag to specify if inflow-wind is being used\nIECgust::TB: Flag to specify if the simple sin-cos gust profile in the x-direction will be used\nnominalVinf::TF: Nominal velocity used to calculate the IEC gust size (m/s)\nG_amp::TF: IEC gust amplitude (m/s)\ngustX0::TF: IEC gust normalized starting point (x-location divided by reference radius)\ngustT::TF: IEC gust duration (s)\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"type"},{"location":"reference/referenceAero/#OWENSAero.AC-Tuple{Any, Any}","page":"OWENSAero","title":"OWENSAero.AC","text":"AC(turbines, env; w=zeros(Real,2turbines[1].ntheta), idx_RPI=1:2turbine.ntheta, solve=true, ifw=false)\n\nsee ?steady for detailed i/o description\n\nDouble multiple streamtube model\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.AyIJ-NTuple{5, Any}","page":"OWENSAero","title":"OWENSAero.AyIJ","text":"integrand used for computing AIJ\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.Ayintegrand-NTuple{5, Any}","page":"OWENSAero","title":"OWENSAero.Ayintegrand","text":"integrand used for computing Ay\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.Boeing_Vertol-NTuple{11, Any}","page":"OWENSAero","title":"OWENSAero.Boeing_Vertol","text":"Boeing_Vertol(af,alpha,adotnorm,umach,Re,aoaStallPos,aoaStallNeg,AOA0,tc,BV_DynamicFlagL,BV_DynamicFlagD; family_factor = 0.0)\n\nBoeing-Vertol Dynamic Stall Model. All angles are in rad unless explicitely stated otherwise (e.g. alpha_d) Arguments\n\naf::airfoil_data4D: airfoil function callable by: CL, CD, CM = af(aoa,Re,mach,family_factor)\nalpha::Float64: Static Angle of Attack (at 0.75 chord)\nadotnorm::Float64: Normalized Change in Angle of Attack adotc/(2U)\numach::Float64: Blade mach number\nRe::Float64: Blade Reynolds number\naoaStallPos::Float64: Positive Stall Angle (onset)\naoaStallNeg::Float64: Negative Stall Angle (onset)\nAOA0::Float64: Zero Lift AOA\ntc::Float64: Thickness to chord ratio\nBV_DynamicFlagL::Int: lagged dynamic stall state for lift\nBV_DynamicFlagD::Int: lagged dynamic stall state for drag\nfamily_factor::float64: factor indexing airfoil family, if used\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.DMS-Tuple{Any, Any}","page":"OWENSAero","title":"OWENSAero.DMS","text":"DMS(turbine, env; w=0, idx_RPI=1:turbine.ntheta, solve=true)\n\nsee ?steady for detailed i/o description\n\nDouble multiple streamtube model\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.DxII-Tuple{Any}","page":"OWENSAero","title":"OWENSAero.DxII","text":"integrand used for computing DxII\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.DxIJ-NTuple{5, Any}","page":"OWENSAero","title":"OWENSAero.DxIJ","text":"integrand used for computing DxIJ\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.Dxintegrand-NTuple{5, Any}","page":"OWENSAero","title":"OWENSAero.Dxintegrand","text":"integrand used for computing Dx\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.Unsteady_Step-NTuple{4, Any}","page":"OWENSAero","title":"OWENSAero.Unsteady_Step","text":"Unsteady_Step(turbine,env,us_param,mystep)\n\ncalls inflow wind init\n\nInputs\n\nturbine::Turbine: turbine input for slice see ?Turbine\nenv::Env: environment input for slice see ?Env\nus_param::UnsteadyParams: unsteady inputs for slice see ?UnsteadyParams\nmystep::int: continuous index cooresponding to the azimuthal discretation - i.e. for ntheta of 30 step 1 is the first step of rev 1, sep 31 is the first step of rev 2, etc. Keeps track of temporal locaion\n\nOutputs:\n\nCP: This slice's coefficient of performance at this step\nTh: This slice's thrust coefficient at this step\nQ: Torque (N0m) at this step\nRp: Radial force per height (N) at this step\nTp: Tangential force per height (N) at this step\nZp: Vertical force per height (N) at this step\nVloc: Local velocity array for each azimuthal position (includes induction) (m/s) at this step\nCD: This slice's drag coefficient at this step\nCT: This slice's thrust coefficient (should equal drag, but may no depending on usage or solver status) at this step\namean: Mean turbine induction in the streamwise direction at this step\nastar: Solved induction factors for each azimuthal location. First half are streamwise (u), second are cross-steam (v) at this step\nalpha: Local angle of attack array for each azimuthal position (includes induction) (rad) at this step\ncl: Local lift coefficient used for each azimuthal position at this step\ncd_af: Local drag coefficient used for each azimuthal position at this step\nthetavec: Azimuthal location of each discretization (rad)\nRe: Reynolds number for each azimuthal position at this step\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.WxII-Tuple{Any}","page":"OWENSAero","title":"OWENSAero.WxII","text":"integrand used for computing WxII\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.WxIJ-Tuple{Any, Any, Any}","page":"OWENSAero","title":"OWENSAero.WxIJ","text":"integrand used for computing WxIJ\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.advanceTurb-Tuple{Any}","page":"OWENSAero","title":"OWENSAero.advanceTurb","text":"advanceTurb(tnew;ts=2*pi/(turbslices[1].omega[1]*turbslices[1].ntheta))\n\nRuns a previously initialized aero model (see ?setupTurb) in the unsteady mode (can be repeateadly called, or called for a specific time, or repeatedly called for sections of time)\n\nInputs\n\ntnew::float: new time (s); will run from last time specified from the last call, to the current time specified, or from t=ts if the first time called\nts::float: optional, desired timestep. Will run at finer timesteps than the azimuthal discretization without interfering with wake propogation. While possible, it is not recommended to run with timesteps larger than the azimuthal discretization (hence the optional nature and automatic calculation)\n\nOutputs:\n\nCP: Turbine coefficient of performance\nRp: Array(B,Nslices,nsteps) of radial force (N) where nsteps = max(1,round(Int,(tnew-timelast)/ts))\nTp: Array(B,Nslices,n_steps) of tangential force (N)\nZp: Array(B,Nslices,n_steps) of vertical force (N)\nalpha: Array(B,Nslices,n_steps) of angle of attack (rad)\ncl: Array(B,Nslices,n_steps) of airfoil cl used\ncd_af: Array(B,Nslices,n_steps) of airfoil cd used\nVloc: Array(B,Nslices,n_steps) of airfoil local velocity used\nRe: Array(B,Nslices,n_steps) of airfoil Reynolds number used\nthetavec: Azimuthal discretization location (rad)\nntheta: number of azimuthal discretizations used\nFx_base: Array(ntheta)Turbine base Fx (N)\nFy_base: Array(ntheta)Turbine base Fy (N)\nFz_base: Array(ntheta)Turbine base Fz (N)\nMx_base: Array(ntheta)Turbine base Mx (N-m)\nMy_base: Array(ntheta)Turbine base My (N-m)\nMz_base: Array(ntheta)Turbine base Mz (N-m)\npower: Array(ntheta)Turbine power (watts)\npower2: Turbine average power for the revolution (watts)\ntorque: Array(ntheta)Turbine torque (N-m) (alternative calculation method from Mz-base)\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.deformTurb-Tuple{Any}","page":"OWENSAero","title":"OWENSAero.deformTurb","text":"deformTurb(azi;newOmega=-1,newVinf=-1,bldx=-1, bldz=-1, bld_twist=-1, steady=false)\n\nEquivalent to an update states call, mutating the internal aerodynamic inputs within the unsteady model.\n\nInputs\n\nazi: Current azimuth position of the turbine in radians (continuously growing with numbers of revolutions)\nbld_x: Blade structural x shape, size(NBlade,any), any as it is splined against bld_z and the aero discretization\nbld_z: Blade structural z shape, size(NBlade,any), any as it is splined against bld_x and the aero discretization\nbld_twist: Blade structural twist, size(NBlade,any), any as it is splined against bld_z and the aero discretization. Note that in the calcs, this will be in addition to the aero twist offset already applied in initialization.\naccel_flap_in: Blade structural acceleration in the flap direction, size(NBlade,any), any as it is splined against bld_z and the aero discretization\naccel_edge_in: Blade structural acceleration in the edge direction, size(NBlade,any), any as it is splined against bld_z and the aero discretization\nsteady::bool: if steady is true, it just updates a single step. TODO: verify this is correct\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.matrixAssemble-NTuple{5, Any}","page":"OWENSAero","title":"OWENSAero.matrixAssemble","text":"Internal, assembles the matrices of multiple turbine systems into a combined system centerX, centerY: array of x,y coordinates for centers of the VAWTs in the farm radii: corresponding array of their radii\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.pInt-Tuple{Any, Any}","page":"OWENSAero","title":"OWENSAero.pInt","text":"Internal, integration for a periodic function where end points don't reach ends (uses trapezoidal method)\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.panelIntegration-NTuple{6, Any}","page":"OWENSAero","title":"OWENSAero.panelIntegration","text":"applies for both Ay and Rx depending on which function ifunc(x, y, phi) is passed in\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.precomputeMatrices-NTuple{4, Any}","page":"OWENSAero","title":"OWENSAero.precomputeMatrices","text":"Internal, precomputes influence coefficient matricies and saves them as HDF5 files\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.radialforce-NTuple{5, Any}","page":"OWENSAero","title":"OWENSAero.radialforce","text":"Internal, calculates the radial force used in the residual function as well as the turbine performance when converged\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.readaerodyn-Tuple{Any}","page":"OWENSAero","title":"OWENSAero.readaerodyn","text":"readaerodyn(filename)\n\ncreate airfoil lookup for a file with only one reynolds number\n\nInputs\n\nfilename::string: file path/name to airfoil file formatted like in the test folder\n\nOutputs:\n\naf::function: cl, cd = af(alpha,re,mach) with alpha in rad\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.readaerodyn_BV-Tuple{Any}","page":"OWENSAero","title":"OWENSAero.readaerodyn_BV","text":"readaerodyn_BV(filename)\n\ncreate airfoil lookup function with boeing vertol dynamic stall model for a file with only one reynolds number\n\nInputs\n\nfilename::string: file path/name to airfoil file formatted like in the test folder\n\nOutputs:\n\naf::function: cl, cd = afBV(alpha,Re,M,env,Vtwist,c,dt,U;solvestep=false) with alpha in rad, OWENSAero.Env, V_twist in rad/s, c chord in m, dt in sec, U Vloc in m/s, solvestep true during solve loop\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.readaerodyn_BV_NEW-Tuple{Any}","page":"OWENSAero","title":"OWENSAero.readaerodyn_BV_NEW","text":"readaerodyn_BV_NEW(filename;DSModel=\"BV\")\n\nfor a file with multiple reynolds numbers create airfoil lookup function with boeing vertol dynamic stall model and wrap interpolation\n\nInputs\n\nfilename::string: file path/name to airfoil file formatted like in the test folder\nDSModel::string: \"BV\" or \"none\"\n\nOutputs:\n\naf::function: cl, cd = afBV(alpha,Re,M,env,Vtwist,c,dt,U;solvestep=false) with alpha in rad, OWENSAero.Env, V_twist in rad/s, c chord in m, dt in sec, U Vloc in m/s, solvestep true during solve loop\naf::function: cl, cd = af(alpha,re,mach) with alpha in rad\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.residual-NTuple{6, Any}","page":"OWENSAero","title":"OWENSAero.residual","text":"Internal, sets up the residual function\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.setupTurb-NTuple{6, Any}","page":"OWENSAero","title":"OWENSAero.setupTurb","text":"setupTurb(bldx,bldz,B,chord,omega,Vinf; Height = maximum(bldz), Radius = maximum(bldx), eta = 0.25, twist = 0.0, #or array{Float,Nslices} rho = 1.225, mu = 1.7894e-5, RPI = true, tau = [0.3,3.0], ntheta = 30, Nslices = 30, #TODO: make this different from ntheta ifw = false, DSModel = \"BV\", AModel = \"DMS\", windangleD = 0.0, afname = \"(path)/airfoils/NACA0015RE3E5.dat\", #TODO: analytical airfoil as default turbsimfilename = \"(path)/data/ifw/turbDLC1p313mps330mseed1.bts\", ifwlibfile = joinpath(dirname(@FILE), \"../bin/libifwcbinding\"), AMflag = false, buoyflag = false, rotAccelflag = false, AMCoeffCa = 1.0)\n\nInitializes aerodynamic models and sets up backend persistent memory to simplify intermittent calling within coupled solver loops\n\nInputs\n\nbld_x: Blade x shape\nbld_z: Blade z shape\nB: Number of blades\nchord: chord length (m)\nomega: rotation rate in rad/s. size(1) or size(ntheta), pass in an array(Real,ntheta) when propogating automatic gradients\nVinf: Inflow velocity\nHeight: turbine total height (m) typically maximum(bldz) unless only the shape and not size of bldz is being used\nRadius: turbine nominal radius (m) typically maximum(bldx) unless only shape and not size of bldx is used\neta: blade mount point ratio, i.e. 0.25 would be at the quarter chord\ntwist: 0.0, #or array{Float,Nslices}\nrho: working fluid density (kg/m^3)\nmu: working fluid dynamic viscosity (Pa*s)\nRPI: RPI method flag\ntau: Unsteady wake propogation time constants [0.3,3.0],\nntheta: Number of azimuthal discretizations\nNslices: Number of vertical slices of the turbine\nifw: flag for inflow wind\nDSModel: Dynamic stall model \"BV\" or \"none\" or \"LB\" when we get it working\nAModel: Aerodynamic model \"DMS\" or \"AC\"\nwindangle_D: Inflow wind angle (degrees)\nafname: airfoil path and name e.g. \"(path)/airfoils/NACA0015RE3E5.dat\"\nturbsim_filename: turbsim path and name e.g. \"(path)/data/ifw/turbDLC1p313mps330mseed1.bts\",\nifw_libfile: inflow wind dynamic library location e.g. joinpath(dirname(@FILE), \"../../../openfast/build/modules/inflowwind/libifwcbinding\"))\nAM_flag::bool: flag to turn on added mass effects\nbuoy_flag::bool: flag to turn on buoyancy forces\nrotAccel_flag::bool: flag to turn on the rotational acceleration portion of added mass for a crossflow turbine\nAM_Coeff_Ca::float: added mass coefficient, typically 1.0\n\nOutputs:\n\nnone:\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.steady-Tuple{Any, Any}","page":"OWENSAero","title":"OWENSAero.steady","text":"steady(turbine::Turbine, env::Env; w=zeros(Real,2*turbine.ntheta), idx_RPI=1:2*turbine.ntheta,solve=true,ifw=false)\n\nCalculates steady state aerodynamics for a single VAWT slice\n\nInputs\n\nturbine::Turbine: Turbine struct, see ?Turbine for details\nenv::Env: Env struct, see ?Env for details\nw::Array(<:Real): Optional, used if solve=false, induction factor array, first half corresponding to u, second half to v\nidx_RPI::Array(<:Int): Optional, used to specify the azimuthal indices needed for a partial solve (i.e. not every azimuthal index), such as is used in the RPI method\nsolve::Bool: Optional, False is used when you want the model outputs for a given set of induction factors without resolving them.\nifw::Bool: Optional, used to tell the Vinf lookup to attempt to use the dynamic inflow wind library, requires preprocessing as is shown in the test cases.\n\nOutputs:\n\nCP: This slice's coefficient of performance\nTh: This slice's thrust coefficient\nQ: Torque (N0m)\nRp: Radial force per height (N)\nTp: Tangential force per height (N)\nZp: Vertical force per height (N)\nVloc: Local velocity array for each azimuthal position (includes induction) (m/s)\nCD: This slice's drag coefficient\nCT: This slice's thrust coefficient (should equal drag, but may no depending on usage or solver status)\namean: Mean turbine induction in the streamwise direction\nastar: Solved induction factors for each azimuthal location. First half are streamwise (u), second are cross-steam (v)\nalpha: Local angle of attack array for each azimuthal position (includes induction) (rad)\ncl: Local lift coefficient used for each azimuthal position\ncd_af: Local drag coefficient used for each azimuthal position\nthetavec: Azimuthal location of each discretization (rad)\nRe: Reynolds number for each azimuthal position\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.steadyTurb-Tuple{}","page":"OWENSAero","title":"OWENSAero.steadyTurb","text":"steadyTurb(omega,Vinf)\n\nRuns a previously initialized aero model (see ?setupTurb) in the steady state mode\n\nInputs\n\nomega::float: turbine rotation rate (rad/s)\nVinf::float: turbine steady inflow velocity (m/s)\n\nOutputs:\n\nCP: Turbine coefficient of performance\nRp: Array(B,Nslices,ntheta) of radial force (N)\nTp: Array(B,Nslices,ntheta) of tangential force (N)\nZp: Array(B,Nslices,ntheta) of vertical force (N)\nalpha: Array(B,Nslices,ntheta) of angle of attack (rad)\ncl: Array(B,Nslices,ntheta) of airfoil cl used\ncd_af: Array(B,Nslices,ntheta) of airfoil cd used\nVloc: Array(B,Nslices,ntheta) of airfoil local velocity used\nRe: Array(B,Nslices,ntheta) of airfoil Reynolds number used\nthetavec: Azimuthal discretization location (rad)\nntheta: number of azimuthal discretizations used\nFx_base: Array(ntheta)Turbine base Fx (N)\nFy_base: Array(ntheta)Turbine base Fy (N)\nFz_base: Array(ntheta)Turbine base Fz (N)\nMx_base: Array(ntheta)Turbine base Mx (N-m)\nMy_base: Array(ntheta)Turbine base My (N-m)\nMz_base: Array(ntheta)Turbine base Mz (N-m)\npower: Array(ntheta)Turbine power (watts)\npower2: Turbine average power for the revolution (watts)\ntorque: Array(ntheta)Turbine torque (N-m) (alternative calculation method from Mz-base)\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.streamtube-NTuple{4, Any}","page":"OWENSAero","title":"OWENSAero.streamtube","text":"INTERNAL streamtube(a,theta,turbine,env;output_all=false,Vxwake=nothing,solvestep=false)\n\nDouble multiple streamtube individual streamtube calculation\n\nOutput:\n\nif outputall return Th, Q, Rp, Tp, Zp, Vloc, CD, CT, alpha, cl, cdaf, Re else return CD-CT # Residual, section 2.4 end\n\n\n\n\n\n","category":"method"},{"location":"reference/referenceAero/#OWENSAero.trapz-Tuple{Any, Any}","page":"OWENSAero","title":"OWENSAero.trapz","text":"Internal, trapezoidal integration of y w.r.t. x\n\n\n\n\n\n","category":"method"},{"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/","page":"Developer Guide","title":"Developer Guide","text":"Aerodynamics forces are radial inward positive and tangential in direction of rotation positive. So, the blade local accelerations in the radial will be outward positive and in the tangential will be in the opposite direction of rotation for a CCW rotor. CW rotors are still in work and would need to have the local frame of reference rotation verified. Therefor, for the added mass equations, the forces should be negated. ","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-(Onshore/Offshore-Wind/Water-ENergy-Simulator)","page":"Home","title":"OWENS (Onshore/Offshore Wind/Water ENergy Simulator)","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"(Image: ) (Image: )","category":"page"},{"location":"","page":"Home","title":"Home","text":"Documentation: sandialabs.github.io/OWENS.jl/\nCode: github.com/sandialabs/OWENS.jl","category":"page"},{"location":"","page":"Home","title":"Home","text":"This package is for experienced researchers and analyists with both software and engineering experience who need generalized flexibility and performance that is 100% open source and is compatible with gradient based optimization with automatic gradients in process. If you want a windows compatible GUI, please use QBlade. ","category":"page"},{"location":"","page":"Home","title":"Home","text":"OWENS is an ontology, or way of coupling modular aerodynamic, structural, hydrodynamic, and controls packages. It was originally based on the structural dynamics solver by Brian Owens (see dissertation: http://hdl.handle.net/1969.1/151813). However, it has been rewritten into the Julia programming language, modularized, and many of the issues related to aerodynamic coupling and floating dynamics solved, with extensive expansion into other areas and features to provide a seamless and automated process that takes in high level design details and does all of the preprocessing, running, and post processing that is normally done under different roofs or by different manual processes. This was done with the intent of enabling fast, parametric design. We have many of the modules propogating automatic gradients, however this is still a future challenge to solve well. ","category":"page"},{"location":"","page":"Home","title":"Home","text":"


","category":"page"},{"location":"","page":"Home","title":"Home","text":"
\n \n
","category":"page"},{"location":"","page":"Home","title":"Home","text":"Here are several examples of OWENS use cases, current and past, including the Sandia 34m research turbine.","category":"page"},{"location":"","page":"Home","title":"Home","text":"

\n \"img\"\n

","category":"page"},{"location":"","page":"Home","title":"Home","text":"Then here is an example of a helical design. Note that arbitrary numbers of struts can be specified in the automatic meshing functions. You can also write your own generalized mesh using the internal building blocks, but it is not thouroughly documented.","category":"page"},{"location":"","page":"Home","title":"Home","text":"

\n \"img\"\n

","category":"page"},{"location":"","page":"Home","title":"Home","text":"The generalized meshing was modified to include HAWT concepts, like this bi-wing concept. OWENS is capable of axial flow turbines/HAWTs, but it is not a mature feature, and no where near as developed as OpenFAST (i.e. for regular HAWTs it is recommended to use that software).","category":"page"},{"location":"","page":"Home","title":"Home","text":"

\n \"img\"\n

","category":"page"},{"location":"","page":"Home","title":"Home","text":"Then, floating turbines are a possibility, though this feature adds another dimension to the nonlinear time stepping convergance and in turn a fair amount of time. Future work is to make this general interface and functionality an easy to use feature (right now it needs a high level of experience to use).","category":"page"},{"location":"","page":"Home","title":"Home","text":"

\n \"img\"\n

","category":"page"},{"location":"#OWENS-under-the-hood","page":"Home","title":"OWENS under the hood","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"The OWENS.jl package contains functions and interfaces related to the ontology (how everything comes together, forms a wind turbine, and operates like a wind turbine), with preprocessing and postprocessing helper functions. These include automated meshing functions, sectional property mapping, two-way loads mapping, generalized torque and direct mesh controls, algorithms for two-way coupling and time stepping, fatigue and design equivalent load calculation, and all of the ontology and coupling to the other packages used.","category":"page"},{"location":"","page":"Home","title":"Home","text":"OWENSPrecomp.jl is a translation of Precomp and calculates the sectional properties","category":"page"},{"location":"","page":"Home","title":"Home","text":"Composites.jl provides classical laminate theory definitions used for both pre and post processing","category":"page"},{"location":"","page":"Home","title":"Home","text":"OWENSFEA.jl is one of the structural models including a Timoshenko beam solver in the linear and nonlinear steady, modal, time domain, and reduced order modal domains.","category":"page"},{"location":"","page":"Home","title":"Home","text":"GXBeam.jl has also been integrated for geometrically exact beam solutions of the same above","category":"page"},{"location":"","page":"Home","title":"Home","text":"The aerodynamics are provided by the OWENSAero.jl module, or optionally OpenFAST OLAF via OWENSOpenFASTWrappers.jl","category":"page"},{"location":"","page":"Home","title":"Home","text":"Floating dynamics are provided by OWENSOpenFASTWrappers.jl and the HydroDyn and MoorDyn libraries","category":"page"},{"location":"","page":"Home","title":"Home","text":"Turbulent inflow is provided by OWENSOpenFASTWrappers.jl and the inflowwind and turbsim libraries","category":"page"},{"location":"","page":"Home","title":"Home","text":"Rainflow counting was provided by Rainflow.jl, however, this package became orphained and was pulled into the OWENS code base.","category":"page"},{"location":"","page":"Home","title":"Home","text":"

\n \"img\"\n

","category":"page"},{"location":"#Installation","page":"Home","title":"Installation","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Please follow the instructions on the setup page","category":"page"},{"location":"#Documentation","page":"Home","title":"Documentation","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"-\tAll of the functions have docstrings describing the i/o and function purpose, which can be accessed the docs site or by: * import module * ? module.function() \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, or by optionally loading the provided VS code profile in the OWENS.jl/docs folder. This VS code profile will also set up the julia environment and other useful packages and key bindings, and can be modified as desired.","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"}] }

Mq{suSG2zSfN&bd zu?$JrD1X@h`3VPDDvfi`+%^Wm&)@__4eiG`LSn=gAYOh(J;M4#R_aO2EovPEMtFuh zADe7z9vFjG(GRc{;_OMI52{dJCxxnNQ9p|xbSOEAoH8X+I)v4?@H0A8G)gtf0Fq-g zXo`NUOd8_O$20hSx;R)+ym5XpHK({v!8!riN%~7I2!)jZq)LGWYn0Wy$i$7WMra5i z+I*hiJ#5iD=mDcSrgpLbLj`0He^Wsi|MK=N)Z@)o0(9Z`kTy~!k*tXaLSPAvYKdKxWgo6q;}s?k;f|7v zfqtw(7mccY{K81Gtg^iix8V9Avjom#frXm7j@|dbuY2)+GjueQ`K3lS&ho8y#4jPoGuT}?c84EMyYjwC8!uY6GT3@vaA`uP%$3qv@AQBX z#nub0O?cvr$^PkDP25jsv)HN`w{X$v8~1CRK~#6!Mcp);P}Y zmk$)D13p2>qtv&HwBrX}8+q3?ce+R2U&J{&Qw`}^?$@k_1UzrfGS50&8hdKLZZW8z z&xlX=(*D%PZ*ISV1s2Z1N%xb{gDwO{iT`5<6CfrSEdQJg{tOUjrVryL%)*S%b!<;d z-4jY$0=3)MiGi&Y%DMdrzS!bDsr)!D8rR;REQiZtS%jANH><}6d0%lBuarRih4^q< zE7dG!d0SZK@xm+`X=)b`j&RVE5X^mt>_ciGRW%;w1gKiNHaF&WxUo75KHk4{<)RSt ziJqoQU@*Hb8?qQJN;g=Ho?Hl~Tq8UL39M#q*yOCKifnmoh z0p@fOj`{!wVb*0GEdB+I#`^f-GZ+EbxOgVd7(i$OFj7Ze=^C9Y7TrJq0gPZ4MZUhk z5)#Y^fGGS_SQlnH3T}b`0vAI7ouMGnkp3Yjb#NGcU<1<@G?ga+51RM%1ZL>>+|oko zp@lKR$*sO+S^zLZ%4G0FNiPPSpRN709Y740+#K#5I;dHav5%aOn|3O~uqw~h zV}lO!Hg*OLgN>LOfPr-?g}L+wV&I5meF&ZbEC}Sd1?k2c^{J6!+FHbUE+7=`S=9Ea zDFjM$3RnmdpjkwD42t5Kf3|?0tt+KopR>obZ8^V@8SPhGW9+p6LA;d5>9!ynnUPdq zuK~yj@SuXl2l-!bw>1lqKhK56QQUrXKxW%XugfbpIH#HqzT8EZa9dCIz(+SjZPpHdy( zwR)5O)G*DO(kA3&$45&P3h-_#L_1gGjo^G&!^`+@0n=jGyrjamcID!Urld%(_7N>o_8sA@IJCz{BK{nGVR{GJ6-*? zYtp-a=XcUaKmJiPbq*k#FQs1*I{k_(KF2%7dj|c~(7)xjTSL1@C(FJoW6-T{UVB~o z(1(6E{jWdzLww$>;@ju6^o?&`o9?@RSGwX~uS_5Qz5kg${)vwQo^9gtVI^IS)7?Ao zx`Wq=vE<#~cxL%ed3R?nox+C&7;%VOzo!#uytDl~)^2Sdhv)H5Pv?!}sq*H(KPw zp`6b4>s*KXfxisGe^+w>)k?kiYr|`_tPVnu+C8Ci2eay6&m4|_;5QwFgz&}>cQn#M zcJ!8oq6jm|gg+42QDq20LMGL2cEa=jm|cK24h{|3F6yttLb;*4Erxs-d7=Q{B2x$? zqE(!`BiBGRRuE|WF>N0XcuppCM}7>y3i zVFt(}80fIr)(4Bo0G(*e;YWq`2l!t>o@on;uwkVG-oXHQiZYt`2=+8_^o!iZ%AY?y zHm|sbI*9Td=hO!f;O^W!vY6jPcJRWvuJ>bMr0J6V#~cEHC~L_G0GO;8;V>g2X@D%J zrgj~fQfCt`B6Co$qNGkyb^I71wM8bTiL6ndw2S6hxNuJ&&o(r z$)3M+#&{-i!EN0>L3@#RprCy&^ z@m-^wDEJo7X%jgXbg;+$0RUJG(QvkeaBom&gZ>$=HVODqrv_Iw0GKRnE0-d}LdP+} zGC|t_aMbz9&%u6fJ%RA60Ad$oMjl3Er_D#$tghCN?+*0};MMT=)IG_-nlhQr-E@3<4E!e|MhA^){& zz7f%JI|M-a{`YT4x8Hs@;o2{RZuJOd{lEkF^PYCl#^04b{prsThW#njb9&lK^rTyF zy)_ma6W(#&0O;FEKmN&$IC1_l&tWRNbLYNaJ&^vtPyS!}@YFE-GP2dZ_ud<1x#RXb z)BpKD|1Um)o&xEVlT5?D%$vO2xjADiqsv{ji; zC&(7cII>UzY`JU038qszlnc!on56(ufG*J#6EO`3_(Ekes0Pk|oSVbci;5cTipY?4 z!hC>mi_1&+=%L?wmew4r1*24e8PIu?B8qCq0zh*J98?gUH58+oMBZ1b3fpsbSB!>G zrALTq-rx(3u6U=Q^O z+W1f5X@~|!OAIB`*LR)8=M2)y>{zY4j<(2y6Zy#GqB}qla+{y40Y=o+nBboG z$)Ugo-59Mqg_zi!f8j+DdO4T1Nz0q4G!FPCe+@ZJFhEDsf)w7)y_td^W)3h%B+L%+ z6=09D8~vdUs-|DwvoL+Kla!0+#7+1A!hek!1u>LC&7(ByHySLKi}Di0Hu;|$^PEif zKeUgyp(YP9EdW63vjk)h=ZIee1y?C<#>ugislzjj|r0Srnpidu~3HCI2 z2Yf&D-J>(j5e~g4m|#uP3hir-Mc@%Neou9 z^i^Qe_tv*AdY>NHwGS|95B=b`1bthqA#`kRAIzbqU4Dl=dE%3cD}7z$=izuWO+%A! zTldW4{n=E`OZjpy-fQxkN*<5%?*tH1u#&b<^)x&7Q+=$}_$mq9Dq@FSiT=?c2KwsLnPNe0&*?{)-FqX&$U)1piyx%+c)R zHO@bpjH7^qqaXbBjM&9e;OR5DDO9y7R zd=KEL53?VSchH&>pe1GOr3MaSvZlSkU8C%SxjenqG#=d=Bqz4mzgCT837c>D91?OSzRQJ|v0lZyh*2W~6{ z7{CItC(whIPSV#&V*z3aDzGqTu|8x0-k5NW#r0&g5BUMP0=cD6c=G`vxz)5t06*$- zxFA=o$GvsTzFdsrRRygO7N#!h0gdc~(VSeG_K{U4$TORmc{Komj4LV( zB^)p&N=6MoK}OV2vt)wFR~Ol3Vytq&gPP8F!9=vP@1Sx$HWHY42F|0EwUn1~;(#`@ z28nZ`@{8aA`67>C14FTC&pBwL+O77rn`-3bdeJ{oteVO{n&*=mXjyM=Y=(K7ra2Me ziuNoP^Ract%AP&|W;NN+Q$AF~2bLL42Ij&T1;jK@k_>7`*>4T~6*g-w;-R6*u`!IP zC}-#S&%Hd~%ZCLXtShoxBKHBIQ#SxU|3gybw=>Y0Co4Fo0#HOP1E2xf3#_PtCRGf@ zKRinUNo6pEcR~ug18Ns1ya)P!>JN#pMc#S+Ju!?4o1t!23eK6g*6@h}VvUT50K2 z*_`kFH2Ll;6KXQ?l9#*$XVQd5BN<*?Uq)&xDLWOJ#j@piT1AxiTDe!i8|y8}`(8Is zkwM?^hBvTw8l`Klx#o~M%Kcd<$EBXxZ||Gey0`afd%oH8BORA|9;)3Vl|R|8&%OsI zTi>hxK0Xxiw_rr9^1FRBT6HdsxsiEAldW}vSh*FU$RO^^3<0RaW)R2D8R9BB`5z(^ zZNj_zWZdiy(-Nk}*^hFbX9U~b=#iN;$4oSR)s@w_kulJK0*&g+LmG8**CcCBb1ogq z0r)sIZ=yCdFj^Olxuw=>Ex;5TXz5@NO#^*8fQ*Geq3SbikviSzFxrH>3wD_KC_17L zCo^^@AoB|t0y|Q};U@iog<6qpa%(;=2VOt+RDQ_idwa=py-cjz@1G3knXV6yE{^MH zjG>IX(5HNt>nG~B{XE*Z$~X!`+dht?mEE5AWIR9GyHaRV#`Rdz!n(J&XSqQyHbAkJ*(% z-q^6+2xa=8(Xn#Y&Y)>Zxb6+jotP(GY@45cC=ObsvJ`TfNfUZE)ker)4Ho#b^J?Uw zfWU*oUk~~1?mKS-L_xzs?P`<4C0}ZIOcWG3cJt4Vq0!{v*-4@P~4-Oa^7+lS>mMB=?S^{??NC_6!wp_^5b*z)Z@rO zcCM6%pKondo%2AG={uPF6c0TY&b3*JDy0WGdh?7$*Ji?6>_7VcDndo;9nPz~TA^4*VGPv9_18}oJAUup~}RWpYXQ>(1TRaBlP140Yo*V zHkv$6;o6s#NwABPHyyey;m}z|p&Am?Fgr=uppm}^5xf=+k|QS?h?>gzLx0=e(Nej8 zw8`{n2|TFX9FeQ&g9Frr zETW47cqsO%4N=D|$93;8Ovkt=RmiT!iyB5Ts92O~&O)C>030ZF4A6WIxrT+ELyyHV z-?J$k<m zP|qzzxO0U&?uX#XeE}o^0_8#d`Pj|`C(>am#(9p;#S@e^2%rLG(pu2Sf6)%#4ouCF z0Fy!_i$C$)6-sqHEe+IiktRWB`2k>46Cu{RvaIU6Vorr_X%!U9<5X+LjYtz9N{2cF zCl(FL=QV(jWcNABDD$QN&*Jn%ATk6Xk5*zJ2LSU;0wI`|i7ma&~cg z;~U?YcJADne)OXsrR%P{jzBew>2ZnuD=o{bo zM!NCF8)Hs#UQ#}@{+GS%WdSN(b=6hrr$7DaQGp)cEz6yE-g%*wB=}UNiUJh{9$g9u z^xSdB9Wj@e^~xg!37z_f;3^wvi4L3mj@k4vcEbpsqFF5riuS}+oD<>K%%ek;bn48Z z@_G4#z>eDkPMa+@dXyjr%wzILw;!7Ockc}(Xlaqqq}J}v3g}ITogO1s^bj7@@Ug)h zJ&TIvPO1`jPc1NHHN7Hohs9ZVPx9vOm%>!UP(gzdmNb^~4ceKVI z$9s-bM^DncEata2FH?{PvkU1E1h;2A%(-QX@Oa4WqwwaEKMP}rlzP-pX2)TB{xD4* zmwuE+rI9-?s_V+w4@uC`ohs$c*~fhFv3pbmmDzW3HuoVl#^g|FU_Z<8p}8KLGuxYO z)3L9vt{(9n@jX&-kS>1fck5yGSCUN0Q>as@b+i$d9X8+Lbrv!9^I^4nw92b{6$L5^ zJSG$f8N``#I$y>-$)DLpW@&i#_bj-RliVJG2k>PQzCaXPtc4GA_k@+UzI0r^cjkAX z(Zfa*bHot&BcfmtZApMf>0tz@QsaDxW=S7#$Bio^Th&-xtI0FbRLi`Y0I3zEwhxiB z`Uobq&LSYhqL>4VaQv{)mjQ^6kuoxG!Q2UX2&0wY9cr2gxWH`zFqqR3${K`bS1To= zXhi>kCmaL0qJM(y`u_=^B|2qh8%^yGXkp!vn15l?97+TJ&hU$gQK|HWc;*>luir#| z+Jw(p`y!#TCAxsyCJ0z?BaWqE1_BDbqf)dL&W?Z_>&j|m5&S?pu)(co>5bvW0VGfQ z<^nS6A`5-Yz?Yi_)}LiIWk|a%crgwq+0NnK7IG_K(3BsOQQ%3#r_!^C_DcEC2)6|F z*f;Apgn5H^9crMjpqt> z!%N9MXdY%qJQLq7HN%YdR!1X8n$>BqjkcD7MRdv?+D9=U+Y;nMZpI&z?~#oQNRDWv zi8)vcph<`)BB{lDVB1-nDie-g#`yC)Le`@s^BkHo?GC;6#GOswZy!L6shrRBD2V^y zam?g+#E1T#l!4#KmYmRr26v9FAtFBGoSg)mRzK~D=;IFbK!*-Mj2%x!JChL z>|^QXn+Z3Msn?~KUYh>oPyQr*^rIh5&v?c&((Sk39$G;HIRZkjeB~WS!MAkO02oHkmhqU%*HP@H~&@1@bZ{PB&vl2wg3(ks6y_;v~yNU|fV@ zwbUqvX|=GjYO#SOYNE{59P~F4ny@LS5i1J2TPj;)q2*S_X{Vvuj8G+@qb;@0+^l${ zaDkvDBUI2cd}qIpHV_O?Ag7MG*1}>tb+HL|2d7INVfzf{(dm#vTAu-g>MH6-gW>(@ zw3UT)&e^BKVA+*JI2)q2)L~n$%}!YeRav5But#GAa#)3syqGS6r4y$F{e6n-BI%^zIDv0t&BGG0sB ze}Mym4cjlteyHmDG@@6y^DA;w% zC~(XaDC{_Z3{G75^V2;fl{|-BjJd)&AkPEN%KB>Y7d}AyX4qUpqXyqI%&%>2zcu+` z;oW22YAtY&^Nj-l!D##H`^50-HRl+$CHNcKKGp|-)5CXR=@w{TZm`fyNMaTgXCZBBKDrAWQ`)<<1&rJuwGSMqr1DobIuhcP#A4)zCx< z&f&o2H<)%wpFFRT*Tp>jpmGO|HjbNQX!Fp2Q%zydJ~3|!>O|C1t_KiM7%Xiz7FsMq zcZb%}jvXs$eqk;`W%r;{2}Q2i)+okBd5P>Invn>=)YW`}3i?mE=owE>Km5^8=!?LW z4{-Vrp>qqcUkPZ#>-0S$oH15S@AJcUJXTH{%0<&-q@w9H%F*Ark7hWT`LFK*uh|ag z+!y4k!51M(0437N{_7tHsEu*>jL0u-a&=ME0);0OP{SeH7d3f&cib@@0ghR>nlxSu zjiHb$<;S@5h9+HT;%%d1NvDXU1>cd&D}<|!G^9U0WiaKjKmYST4E?Cte0eBlcr^9lBR_OqW&U;N@1 z(@S6a(sa>97lk?4r$7Dakh=teF2DTpC~u$qm`^!T-#xBd1c{W%1eXpci+N4+4P{!> z)^CFA`8S=%wf4|@<_Nm$w^=}H&mfCIe8bN z`(2I?UpImt{nXaJ0dpQ1odFuTL&!*=i%-dklSzatvw)93Hb2(C{YQNGwhp~o%K0Nb z)?_^I@a+VPrfq#Qr310z_)+@{;fVq2UT>XiP}Gh^v~xO zqp}vCEN6TvYnqB68`nMOhWC6@;at*8Gs(K8g@T1lr99K^6Ry|GJ>OINW?8R!Uhd6Q zeO!lStbQv%*e?NIGB{PE5oCh*H|(j2qDz!*Qd$Cyru>QJej$4f{&dZ0ML**EHo{gm*|TN{xR|o+XL`> z1vlCNFd71&2r{UtqJTvRQ|98unEMp{!W>Cwz=YKnNU?9jShXA7H1qEOvzYrOm9kcj zW-3#m7{F2p;&ft~J+2p$I{ykc3AU6ZZ`Pd3w14$L1~H@v_34~A$^^(jgEq?l!zIo1 z*Vl>MA^24COxrQc`W*7!ppUES_B?VL+CR!X0!sEsx><~CjcCg%=#%x(kIXRPckl>J zys~p;1XWDcjN~LAwVxJn0TL!_(ndN^_ax*lztM_8R*deEKm0^Gn0$dR-vs-TY0c8j zyF4?VThN@H(w=R|$CY8!Qg>5DZ6gXiUX^?iI4ke+@7W(0Wr*1SrYLmAC`CS|bieCInMe`xNdIh8WCa+8`qZ++`q zBd^!=>vP2wSETp7?|tbH|L_k(E9ZtAZivl9H6!hPipG?@gM(jY(m)2-3G2XKs+q8|@^@Dw>(oraI7@)`8&Ilt+yfs|w0C9Y#{0Xiw0He|3 zDmb1UgI}($8WnU*B=ob$kG3*C2M6#y->ty_cRX`MgUByEVhc=g5KL9ZC{o14N5*-y zb%@1~7C?(^PiKB%CpN|miR^?PcYe`tLlcL`TU1!{&pgMSRSt?nAUXCE`3+}ahlGM-=~A_ z?5wE>3hQoXFFkgC^}5&3%|nuPF1SMNjxeLSil^^28W@^36LY+UbNtvm~2M<{LHzaZ4=6L`Ic1uQTWM^bH8Wb zd;auzN8aPdr@mMJlBYEI4af`6?Rf2oFDln^c<%<+d`sV{Q*4jQy@TRPyZK#hDDTIk zG^uD5Aj~!=&|`U*eP0$^E1OnM=YlEW(P4V}_nk~D#{qm99JDc;-~7gQ`s^n@mu9Eo znf!A=aEVZ8vtES;XUp6P<67!^iDH`D4F?(yTq6hSK+i>4#KZG)@S^9n8!lDR%4N=P z%4E-E(Pzgj1||S1TG#|QKz_SBSY3?hkI)|`Ogyyl!!y9LMH6O4u1<4Rw%qlp*Ihwj zS|guU+GeQ~cTh>}oiK~$d7Cn32y}bdndUAkb|^@6+JFf3=*j}})H-P7l5+;^0vI7f z=-U%Zcm!~q$Z~-17TWF-rIKK+U20~T0V<#qwRHN!9sA1YsRdFjQ(8#ZaYqg5K<^4O z9Y6xICq7XSG#GbM=(^-GsVZ8Vk{&8J?pgD@v?|eg{ktyFv*p5wcZvoJzb?nekkmvx;IQ8$yXx zwH@e3o`KVlrSMLc)2(<1yjS#HX`K3wt(*6yp2~h0DHbu_`sx)7GL`R(K?7X zM;hBJIr~1z%S}vd&+^zx*=`o{k*st6=H&~(}z4etoI)LR(2+bhdhWpY6ZzJ$3WvJm)z9qUk58gnC)tE9uMq`n{5`&&u-` zyx;|)Kk8S>_gT^#*LLuPCp;l^V0m8hDrt>V@{EVopOSz5c}Y{xznt3-XyN7i_{c{- z67R$n7A^;rruV(?eE}BkFXM9g`(D+JU;XM=r@#OEzYnV~-*cT_$ACZa6F(6^rtPyl zE40?jYtA2t15DVr4yQBeSlVfyVmx>z#Ez21v0x6D9@|_lcV(*+x-M+eqaA zbttGbOwlTL(VEhj*flgj4ccf7J_TW1zl?;Vf&elIxV|5a9~TmGr}FWm0CfGcCPw6t zg)O7u1&Ynua22p;2!U<<`e4FJ8GWQ(7L3ML@WMPkkdWWfV188p_O#|;~x`9*%tKfY~6>>;tTe}s_0Qs@S+L|00;PG35p+C zz0C5_8NGhLT>HG3gzCGb9=|H$qJwoV@k*Y4?B4UbbOiNy7iGc?^%NDeH8{PDV&zXm z^%2gpovrFn&TwlZ-OdheGY0ePM9xP(z_2>TD-&nFW3JywGR)g=WtURsvy0MEcNMntfKE!sQTC3U!)fOLB^4lM z#%^(QEWeg;$hZOW`gNR`qlQxKd4)h3Y&w3+vGjjG{N8l>+?jM6O3?Q{&O+N>Ob7P$vL-@TD_i z@I1$oLj^{kJm=^u7XTo=!J$}-zQp7ZtIlJi2;2n5gv1O`WIScYyQQ^_Aduh!fCEd* zyU693X~Qaa#*!?pG3a3foKer2G2qt0urp}tGIQif_@Y6v(o%Pdp5snVDjwlD7)u{+ zIp@I*CxV!*B_Ay}G_UUHu$h0cs}cH-fKWun33LDxq>)9A{UAuWysUm6h#~DDxMFgT&!5ici(wJ2AnTGr~PPwUula*4_Z(-G7`W}E4BnRzI zT-aG7-rxb1Mdy0XN!-)?9*3#EN(C{A#zSY*cU2*)nYv-9SZq0yx#e0W(8tbR+ph9XZ+t zA`nkLDYf0!eKN;N2{1Eu;DR4L^2|Vw^`H$wNu;cj=S+AK_1|~1JZz3v%>i{l^$GQ- z*S_|(VcDZ)&PPA`(crauhPtKtyOX8c+uPxU`PYB_*JFv*2S511^b5c63+Xq0<2Pbl z^vO?tGMp@{v%UWHuMZthKR^HSFaHvH-fLd-n)J+PJ~QIJ``zzOI)k=+Er8Sq)o=dp z@BS{v41yB^0`C0vYrpnuL5G$@mQi%HQeo-zXL~NXQ8^l?=!F7IFMjch!*WPVC0!Rh z?|ILQY;+Fo%f1(PC{f_!l@ zDJFf4#bnM9LzzRX%UGH!S1_Q#x_Qi4G-R>53TfxgoeGlC1GqG23Rn~yh!Vz4vJbI;;pF4f$5E}!@DSt8{U&KR}*a5SJSvd4T3TH z4Vt24xgA<>3EElLEdsK;f$1ZPk7me*Fh_?nX_F^@On!`ZHhzS51_i9~Zqv;Dc;dSZgOXp!8-Y>yCN+=(-NAojp&+BnY-2F$h>_gLG-qk?oPrQRu zw2^hHyo_?UN~3%n>}Ze1Ae=1QBk$8T^s0Dil14i}I~zMJ>+bA_vljA1dgPOJDqxWJ z3Z2%w)XjL_x1Ac-JYC*nXKF`i9wnIOa&`21$=5WOjt>*4Pt4E}PZPakbgp;&@7<|` z6U^0PN7ClT{h+9u>G+Y`)4jLfn(oE&Ev#0~zlNYqKDg_H!e8Y-8;sDo1%$ ze_r_SvCdcH*W=~%x$XJaA&fxoge?I7=M(>(?!Oy{p3L}epr~&>ag>(moPee2fc!>s zx}3+wf9vnh^Fm|&{>7=9I}HaK4%}=GI1zC9&(}`#fvGSbd+jN5bc&xIm8kV?6dd#i zEk|8KB#5&BK<=X_xGQImK6rqRHJh;XmOe6eI?`XxnBGUAr+0*5x%vgmnoyMleEM#q z?NFNm_yPyaE&&?zOlu1*OYDc`VOIKAIfD^G#`pkO6eToLd;Y2xgsLci?GM^I;h; za@hPMrA&!BTDUqMI%4RH&|8%&SG45O(nYXJ(QIitJD!t1v_#&EI-ce;L7$bWkeSf^ z1b(EMJSz-{TyuH69CDLSyu09uf1pp0#rjD+c}Zba5zjc!%fx)w`jKOCda$>{`$fwG z073@^=#h*W^b9bgZ@ZOx#MK(W_fK6YKb$pdy~T~mlv&mx5F%FYEotMPlalVdCdJa9 zcd9~vArGzB(44~;Ri}k@uhv7sN$I2Ta21eAzW8s{>f+nYoonWRRygjgrM~5W+a0ge zGt@b?g!rRB`lA?x`^~!~OaDHC0)jQ3KjkS;34K-{J?i;d>bOkHfw{YJX({AU;702l z(+aj&#_#>!?}Zi17x7E@(?9*wq2s>sjc<&6UiiWnhQFSo`v~+1_>^mphUkl`@A_i> z%+DxWh3nEmJyVcMzd!2H0wV$n#X3Zgz&d~W)1MBjBK39kcy(-dDSOe2UKBfqN$)FO z@rv|`PkbUQoV>3d>wU{JKX)W6pp6zp^1yh~U>wIb)=8c^5h_ULxS+1{7TQmoI1zl- zf01;XkMw8-C0L?9?E6wT{>Oj($KZ)e?h2@*Zmm9SeeS&T&Zv{+YoTRYK^Wh^?@}JR zOPX}ZW8a^^TLFBeUn{Kw(x|Iz^<`W^I>$O?Jm<2&uYK)nk*D_x;AFj|*LPxk0j4|d zxFg<+6T@1M8ONX=E?{WevQA#B>r1cq&EL4zRq)R7m4KyA!v(CgO0(`|%vJKOx0TYC zqQK_QfgF%uTDp#~Y;}^!pfpE3{tlqYnE*-{(79yn1PqZYB`!&$Nxz>)$}pF2`*<90^n z!D^6}XGeYP@KNY*rL&voK+r_=u*f*GoyIsyLOTqlP$A8i47n;p(wvniKV;7ZEF7Sh z4#2^<_btOt!p_M!-WR~|L-d&+ryWByFycFa_uP)jPReURf%*q4hxdnT<(Xg~RZc6+ zbg6XTj}o(~4ut}=#8lr3mOdkv_WAx-iK8Rlvv%V0K_#vV)<=P2XJ)-mo;(@!+gaHG z+eWN|d@!B>nfx-YovVV;^AgvNUcqA=`Q>{up5Vr{*0s>O|7bhq8>w)osJTOIR;;uyY)OScYZarTrQvHS;K*b z12=#J)#qzJ=c&uF_#aBfmE@i+deA>e6F1cdWV35lU8&3Lvn^b9V#PdkgEaQqY$YS zg`7fpqA)rxfg=Xy)`dJAoO2m^iGFeK3%f*vPNo(z3b5J1`mJihRSF9cBKGk<~@(*ClSy)3{g$12`;JR>-x-l;C@ z_{DqDW_j|*F^nLOWj*z&PfcG02ogXsjk>8|$Rs^4NrHr!}G=KZ>NhAqbyQe zU-MfoMgRi%$ophEz-D^N+W1vWi~4{);`;m}Xz$q$T{ zh$4p?!VF3elu74%Ql@G21UPDWWtp8MoVgR!X~#$B?Aw%IkL%cW-6YmVjWVjm;bsKh zn;+u}RtTC-QFW{^j;Ax5_knodo6elY0TMHjIuBF}&^*_*`NCU;E_rDOW8Fn#1u*=u z4Wh4hiV6|WeddQ=Ixz)L>8OHtq$!=X@f9{cmrpk{gbGLf26Wn*%&)@}9W{0stgnGS zuF$Z*rlQ6)>+Lv}(t+~=o$)ra+U4bss8NUEz z^2rWdo(b-lkNmKMGv3VzxwTm*-mujjE~g`pxh)<0{O8ggXD}%RoZLLRn$8?Ol(s=V zT~p~`p&oo!(&u|rAo;U?DhUcZfgab4%L_YaXE_vvwnGJ;@7;U04Lf;vZcxyQ=-Z(? zJ0c%k`)eA7gy}{06;KL+o5i1cJ)<9S=9~s&C)ERyzWrNoO;7qicci<%`v1~bzVwyU znH}PLR&lDQY|a}FG#vP5;6V9obB~zCv3+B`>KV`OI{ZmkzkI)EIDQ2TPviBPjoXJx)&b z0Ne4T0ubcPn3E}NH>yGwTdbq(Ag|nFonFadKV@ey1_O)?B53tPUpwI!K4h>$(W=N@ zL-8Dh-lKmP`Zn~J*sLN3=F}X`Zovdd591J{ihw`RuX&7PusMw*=Bx=$u8V>uhY` z6OH4LCCU?=R9hD(eboQ7JqaoW&EQ86Zv}!j>So0V@-Rr_J{*Pr@Pc@P7id$^NhJR0 zr%2yCF0?bR^YVZQJh$dySp>?Y+kjxSTC^tW7G*xRGkI*{NW-Z#d0n0v868bJO&0Hk zIC1XLwn83qERu!3$)K7V$1Eyz%OPJ^fJH#nga`C09Lb9&7jP%l##lc(xU zhN7pHV|nJWfH~z}J&tL;Z>Z~gC64!tKIiiSWR!B%(F#4r)w<@*Z+>&=Zu(m(dY$=| zpYcjK=w5kNj)lHLzY~Y*kxmZ2?QL(1afuc^>Y)N0>YD-!j#r#$bQzcyCR z?|GDt0-~r-TdwH^SuD$R(ku_9!Ezms2pE-dgyS@6^xCwZOS?R>KBkk$<|V(>$pwbA z`cZ!u)G>d@DBhQ6Wo%YFr+n)Kg;yFbg0+6OiNnjiDM@DE|27u z_qFtK%w(_)$yeX0`oDC35r9pA&i7VmC~YnhRez+d2@lMH!lf4P$T3dtr@f0DpkG(c zTx(DY`CsYeN+;(i!r?RH$_d6WVFAl~66~2FkFc{y+dED&FpmsyUujPV5R&z&i|M-HzBeVQ)s(lB-zyvN7HLuWZO+nsA+C=Z%Cqj&`~V5Y3yCkn5XzZa#m44J7HY~P#yhWaR+b0%#z?*~*6 zb>n%cE&yHSWqWP#qw!<%Lo<|)&X2ovT6Uri_Wh{saEcHSwD4m#o=cR<$7wu2SUZ@K zU%g}X`Hc=XII5vauBywd9}cxQx6@G+qiqzzyScy3%;u8qlb7LJaT`(FhgbDbKpR0F zJ1^^K$7LsKM=!rTx4w3g@=kuqBSR4srt!W!mPgjxqraOK(7hrEV(GtO%A5r8BjT{-oVHTX*?VmS_oP*(RJJu){CU-SxqD z?)z7m`4cQMUj>LfbvD2@Vn?swuw5yvdPEcn{FXUz zogL=e)>6WLTbX2U;6OJIc9kSd;h+Z~Rpu;D<(ZZe6U>q4$bBt9+Rj|5%#Q%^CuhUx zMrXql{N3yT6l;mm>SNJ^9rcu5kSt+JAH0}mS)s**0D^s754~iDM&!<(3Mq%>{DB72 zsE@>b6^*=1Nj*mk44!i2Jb;Ag(E>oqa*Yg19}ex|mvDrxV@F65%k#N9LI4iLDM64s zFR{vZoX`pf$Xv=Bcki-q49g-37F&yzyp z{IJNQNNGNTGk`07taj%B5n6pu(1GLy63}AFmp5PPCEBG zIY13*ltSSjL6l5+R1Axm0C{*1ydXy~WWY}vq+d`8OJfLg^qkA)Jip6|=hEQw2+)DP z($NYFI+TN!7J>6tykoM_3WsYQGrPq)+FIzof;<{($!2m5YUj`(8C{oOQI5EhPqir1 z3AIZHZ5MJ(pef|77DIrIsm+o?zo8D_%tBw4yHQ@W3jst)^SD2l2Kt(C<2axWrjF!T z$9E)u3y;gQGEwGriBt4-uT5KmY2#g&8yrnn5Br~&GCf+B!DFGr0l&JQ4tPzgMR&c- z{ducX?hmGO{Gjgrec$(eF~O+rD8O;@Vgwmr?>-I;gxxrullG?g9RmYN^LMN%do7%8;@nor0%bdYdrJuXRyxdvh}eCbVP0Ft~msE-Tc7>w(4`Dt2pcj@)I zJ{B>b@;*x)N_{+9U#){2<2Zp^f_lD_xYpINfMZ4ZXWqUO^R-Ua*|C#+@tJvgbj;w- zF@Ru~KvJonN8`!+(!NT$&G9lEsKf=WF}i2(pwJ-jm8Z#+xKD(Yo2yY!>dK9o?7 zyj@zY&$}s@iI{|Q7W(LMl0+YJVg1VzcJZ1%*vpx-+vrTJJYp&QaKJc}F=|ga%5iC^ zZ#`ueRR}*iHew2Ji&Gnhg1_%Nd8~C@FRv1z0N1&p0&oXZN#W+5P%;32R3ZdNj;Svs`Myz(H^Ku|tpkT$eVm*{bKmz>+jaUM<#K%KZgqc}LwooR#4kf~) zr@@R1J50R=Q(SAbE!sFi8VCe;x5k4s?(V^w;2zxF-QC>@?(XjHPH+eiEI4`WbL!sv z{=lkQ_1TyXn_59WJ zXV!I$$7>H=-7-nRO%GZUgEqaG;kv-O+gg}7fm_DwbN9`%TO~txvyP<~BAW}tsl@rX zVOO-n+m#`~XY!x~9AlPJd8Y zdf!yoFz~h7-9wQWe{y2__9$f2M=_T_+h%87$_&8J0u5zW&Amc9ZCzg_N zf0$=5FRra)U)fv&^B|KMUagy6h0kV|EbeHfG6yVfj7`kkyd#qw#P`M?l{RD6SO-!i zxg9=B5PF|Kfeto{=y*$w;fPME~&o8Lo5PZ?peiAw#6IOz7<{Jz$TG zd?YWY#1P1pk56AH20vMWG$*NkY=C@Dag)}bgut`fHxlb7JFEOTUh!b02_m{E`98ov zjEJW5arV^m0i3FBmi(8kX&keJ-B$NBNuh=tLMldqMKA7UAj2a*KgGW|H@aBfES;Oa$1QMXM2xntd8nl+{QW(x-N{WK#4&cjpKY>J zv6r*v%zp@sP=J2_)$8Av%PMwSQou2WL{0_ekWW~ag1xvzE& z{wVSyYu zBY?98rk&5P=*IOq!OSIeF=09iN8VM2GI3n<7TqxoAA8?zOjb9+=Z40Y&B=P?^G)A% zFy<+wZ$hyTJXZuvt+fwv5XW(7AiGg_!zadvTdf~EvCLQ_+I$&Pwp`&^MEF7Cu$ z$ovz!nJxB$-}ju6)|siQFd}}+7o?qV-rTKc5@xtU#^TYf?|wf>yjV1`pEvI6)HA<1 zsrjTa?H?y9o)*W*S)5@DziSk0jrf&3cldtkJ-j>jPRDrEIO+x4IBA%jA3cNaM%0yU zuK}IVv^Gd#(ACK9#aa9vE4`s%;7C(*>}0iV0Ct^;fw8%Twdl0a@!Hy{T{G6_BFED` z3{c;fH|q2VO8dEhKe9W|1eJ-nnE|~k2O{(@mUDI)gr_vvJBeEaw>0!MYpplLSlr{% z^juB`cYlcp&<@Gj%2Q#fnD|^xl@j33T71f>aQWCGj|UQ>n4={+rCSs|GNZRy-`VV2 zCDU>h<8#*3=AA^?PjPNz@BY5$!tFBe;^IPiGjtok_p%qhxK4*?zWTH}28prvy7X3t z_{Yo(CqebNZ(v~iJMuuPukfy5u&wH?EZi-VF7<~UGW%Y1CMT^64^Zwu& ziNnirLu5wV^Y!wQ=;?`mTDK2@LY)0~j_(%>4qhhI6q(;CeS*+(T;MHJK$P{TD%2u@ ziP=r_!ng3?e(1;?;%;}?cz7K~4}e4SHR=hVExPFn3(gGIFHeL60Z=dzb^ShQ=EVMY zYY#@;z2DYuUZ?HkVGV(zfI3Cd1IKh1+;^D~NognedxZ<@RKU1zF)n&$5DHTOTcJoJ0OZK}t zMp)#Tv<3((9b%K+!l@!bp*lsPRY^hya&xdy`(3+!oz-yzjo)$N4!PIVWqeQpPGIIV zHSQjDt=m{(_$S9h@OC?z+mZW7ETPMmVGz^zXF#vNlm-cF6-hX~Q%>ecrBc6qKgW^1 zpbUOE64ZrsYSZ91zRuNrWMn48ljX{+b(`W*jPCQFpWjYePPcNo{`}H@jJrEWB)18Y zb@X^Q^^?(A^z`FDt7ETP$wDbsSS?fLbuwd%D7MwSjY_8^gdvOuupHkMMKcBoTCd-W zRB%W&Z_0f_vh94ylNl$66{5b7Z_OuE8o4RG)C$-Mdv4k(Y0u!bX`7Tj{}KpJ>vIZu z+ev!3alKeeM!5Y_`8c)nIwf_d-E*&Iw{^v68zBW7`%wzg2WswuYD{~lv=_93dh1het^ivziGZQq!fKOq!xjXcGp@_4*L zDwlKvwh#p7XAN)N&*Fq9+>twIDM-Ck>N0JLPA}t#Nbt(=S3zO=K5F3#wmrI53Ul(j zeX*YtS(78y%T*QkOnG5W88v_;%!;#Rcvp%un^^$YvM{)+lvK%` z2AaR5NrCBD<$>8q_KIsy!p=_`#VPml)yG(EyN``p^JFI*XPw5Trd23`oF|Uz5$s&Z zxG`zh8uXX^qybBU#hWpih-RcjBh2}*$>^gTM1u}h)56E7rJ?kQ1E+VSRuh3Umeu1k z$MGmp%mQ$={9;ZSMeIe|X4lQ8KbQMk9*>C?OWjhf07Kb?11U5Fq+r2=CJ4SxNs|Hc z=wZVPT56 z960dXrqqu%D|bg+cf3mhpVeXd{)+Z|r_nAQNZms?LeK+mK`T7^KhLfGT>YsXLlplY zZ{+2Vex+Tq;?t^25M`vh&EURapL`1@TJdCxm3-wv-g!X`z>Zb|KQkVySm&ztFkMNR zSP>e1d{m%-7YpR z>%+;+DfUJ%R}+kTqGc7cbdOChgES?~`{+(EnXMyCdmEnwte}46NW?q-ovm^-dNLA^ zx*C0^7lSQ@br$=*^+i~iLD1=QDKl}ZEgc^gO91Ec)H6K_oO6!U8q&OBNJSy9Kau;s z4dRjWM@IpO?wZe|*P-KjL{?U-vdCkh+>WrN z1UH3K(NF4*b!&xT2Vq-D{L>g^G(-^+Ru0}toS~e1k#!j~sv;@-7U(8QP-+n`V z9cD-E2|g`|!MKO!q4fST^knc>bBL6dkKm#iL%6SHoPKi!o!2KHFBFrkrq7(I@`#fASI9@7{$q$?m~2EpXH5|B9LPfZdJWc=G9=!mPm3`lLz3 zVB+Ck0~92v;%>`a%}Vb&+Roz5CGB8yC|A{Rj7%#5rxOElp;N%HOf{49*n(;*(kjC) zkta`=J}zH?T8Y$eSAYFVF;4RQ%RRlbhc7gm0vHT<*o1PQGpb4bHt`M3r7h(-SA9zX z<^5vk-TK5kMYWRSH^bSp(j8HwqXk>+n|BmAzwhO2?JSDPh^>0&AaG`p71czJOc2(4 z@dYGGT;_^wn6~T&4LWN&`#BsBf0Zc_`K2#Rq(X8c?ik)#&vzIH@cBDi%pERcP0@W$ zUZ@EH;|?1?SU@S2>HfO=5IMv=Ud_$YC&%*o*IXy40~RWaO`z@)vYvW#nCOJFzBnc; zaJ1)0V+Ci3q*%Okm%?BjqEdb8{CdH@;OWFi@p$CHv1Jijg^1Ddh9r@(R;*>YvE_XjoqC4@a~LYocYVLSB74L zzYV7SMt@eXFZ7R$6?A^^Oq|OqLM-0GrDCqYzzyh`@gSW$>K2xtF}KB)wR#m0)D`Oz zLku4j_+9*Jp0RBJp&(HJ;rbF>9A4S)>^hio)~HIZod0{TP0|bG!E!BJtLi65It^Pa zvrzaL)>`NHh;1G{9pGVQ)ZNsO?Xo&16Tfa~iZT`h_;S}55!_n6j$^()6dIei04ux} ztxQe?IG)q2NvJ6K$>ktONYIn-HEOT?Pc)c14KJGq22gjwd5#x0S3iO`BwIp(HgQwP zmE`7v?lW54@JI9k2GsZzk1ys=l$H8Yg46Za9O93`tL={(_;BtVnfdaLJ5ta0+<-}U zoGNR1`^6A!Ni*=0VL;y#^x2hQqHXr)K)oe$u}31`%=NVEsifP+Am2{@sM)!7t=t4= zFWm|fv2c}xHDQe`joL|)FH+#=@wbHT@2STxu`UV2bY7sDEjyOf)83g(t&Q=qI zSwCN(dskMV7)Qh$Y2s^GxRtJR`ZPX7**QJHyR=k34c5nx%!-Mwo1&3=FKQwI*S}I8 zoyY9Fo*3T2sq6$VxtXCN+M$!f56{_GUSxE@Puygi`-|MOjd9utgJ=rv@A)?X7ZW|O#pW|#D{ zU#KL?H#J{ETnv&0{FlqxP2ujq1Qw@lYTz!g1Kk-gstu|>70h;YC{>t>PS5=H;TK^n z54~zp$Plz|oU-1k)}+ov)PxVe14`LE5p$pP)6zz+3jZ#Exlzi#gbfJXiY9V9+4%mU z{oWah?N;v}CcpxMm|H_9NH)v#d{_l zj0;ZbF%{2j()m?bzT}|6EF`<(q}lkZ(7|simK3}Fca|-MEtKL!D6BU-7T$-{RPeyH z_MeTTH$P$A&Kb{tO5271x;mJ9!N)+su<%vAwK(mQgo_?zeg7Hx&SDN`+d) zMtwzQd4rB@T*&9eiz!w7&5$>>8V|MS0m0V++)iYG`B#;3I_sgvV&XH&0Fkp9CTn_o z*>?f1q{12bic8!bvvAEJy3OxWkH&VqP4c#$@s|E6_4u$o>DYT8Z*oO1 zT=nuN3679tZ&6T!=^pV-sc}wtBw>HT*u72i=<23Y+m=7%x9C6R%Df)^AAP(|Z4^6n zQ@kW*7AEd=L@;?ilORhA$3WC*O{%8urf6mpYAH>mWs`nWSb+xqVO%4E=xCF{{cH6z zg*4QLx|7J^^iO83Slmq6^)8rz>>NbOjiMHeRYw3J9{P6vsUY^?$5`81^2J+FiWi!g z^tZ?K;%==wo>1?_+Db=d6~d;na3rnNA8Vn!1_0@nK1(@Sw3B)-(O}s|%Lq_6LA1TS zwVM&90q}#4YhueUCVUlE$Y$rrhw>u31F$)HO z5=Ui(4Liu5@A-N?J@aoK8xv_kdu<`DI`cArlI>-(7n)2WLzX*B@sf1_BAC||5x<01 zuV3(SWUwIg(1q5aqjvEA9U;8q&1t!YzeZ1XLinN67riSr!t&LFrOIB`?4qfY)-Tik zQ1w*k+#(RC)5h%k*M*Hd{#*)v0m4Ee#>GVxFJ6b?9pOGUv~tmK&)M7d4^Bp##RGCf zdmNp+;OtzdwZ@^&D9%R4ve^nT*dP4wB~&nlvw5aipyA&oZee}a#)@#&;qJVbhRN{7 zF7DLUe<*)-EKFNZDMdy7-U%YRjaitB0!d5p`TDesm8U>DYuN=+i6iz&p955v{_lEh zPF5w|Nxau)7U#>huC^P2o5IiotQo#R4O15Xpyovh4LkQ_aA+d^1|t#i)elhTFe8ra z;HYP7C$#h3#wB+jsYhSbm(Q>sP!XDimj@U`2c0~sa;j0xc4;;7M2~0% z(fl~GT(M7-3qM93%^tuguLEH5bZa!*_Y+D)44)LE@6N;uj05Mip~9Ygw>+i8G(qBF zCXyFpGnCg+{(_CQb#(P20@64Za@g1VXxDAZUoveA9fdvBwArb9&dxr!%K*4A8vd3R z_$N3%)8>BOjfTZ~4kXqiuV+b-%_qUfCafc+p|=L~{*W9=kRxq2;-WVN6~oz0yH+}E zqWTo_qI1z}si57g3rfsXuT} z>UTUT^bT5(HUF_^uBFEd$+%A^a^_tZ*Osj>lhZ7<@ZRSgvyR{t(S=lea&H&!kUT7v z#nm|~71*Wx2{ILaNv9;zC5Xj_H9zHu5b*teL#5U!3_L@lJX{INoPnazT6)=B-~7~| z_kO4c6r?*7I3s`tUAmlk@1Ocg=rR3A_2^%T7SL`?u=l*`vfalYOTk9C0iM96Z9gx! zl-D(t4A=b5NGS(mwjmiZ{E+VkNd8K=>WFw_GOT zIo5`5&<2t~enkAUuqA#1Wrgp$aVp% znDpzldXV?{g1>uGYg3`g^Mb>Ok~w?V1I)MbUn_#fw#moC*K5Kv$V9_m-K_bl^nO#y ze9(h_E8i}vxVXE_&Uqj^wbn0H4PBA>%4bRw&M6}sB%?SCPiXD%D-b1Z1v=FHDZo-c z(-K0t+Mqs&URFUG>Q{ZznAhgAq(F=qAI302q3SMl>BcGl>n7Y$Cb$#%SPQ1RZ>*;0 z@*yd{Se0m0P*wip$(r;?H4URCak%V zvpFq)U2IohQf9|KN?@SrOhIZ6jdx%O;;eI`a2k3HQ7p5H?}%}R<7d+(aa{TJ5)T z;)0od;)0N*CH5O6rINvWG6S^HPd|-a7B%(z@BUB(^rn)Hha$xP^-4d!Wzia2IZjEx zy05*%JAb6L(MEIc#W*OEyKvgOE|Ot3FYztf&7Fe_Dhu5DIJQtRb=GE$bk4jqU#2oL z0hA|b-&;{8AGl1^=NXfFWof&bhiZ4je=V_R`OTNpq>@=fgG**_R--^FOiK7Q8EeW! zp&Hf!p9`x#6kQlW5C;UN)!p;-c)L)~aRQVnHEb1oQLYaC;yv5_cTnHbi!H~hivH_OlP>9u#^&)NH4p2){y ze+&R&3z9-ioBS|)UxpiR{Ny$e)mk)KNZD7~N7kZNr?Xy1DsNZPP$zR}Et?)V^91&A?`0Ez1}Z*gn}m1M+R#1HQDx^cKS(z zugI3FD!OhDdu~*Uur6mQ{PT3Qrlx~op0D-kV9@+Uwm+uFj$-cBj=~z-raIIjd$JZjJbGz zySgyR3oab$8794@>F=3m)zD@EIMKfom=i}QGq;a;OD{l{Q3_yNx{QU zWI*)*$6U`iwD$%p9|gO%Ael(>)OJs1pacMso5V{gcy#9cm0fWRF?gC*IP%ar|WR)JP= z!nUdfR?UlqsSeo}5yQV({0VX*mFrLvSlw!;?dXs8t0OQK?Rs5vNgmRmaPrYBBV}0r zVYj4KPii6PRW>HzIAfqm*-NzDA?jHD+lfZHW+I(0334*-tLB)g`%R{pA;vw3#e;-5 z+|cO+)Fy_1JgbpCX*Zw~d;bVcgczleOoM;y&Q2zD!qKXP8ih6=t&-Z>hsZ6gz5cp{@}-;&lWz@!sl6-@Y!5Pm<^s;8*8;+g;Jhi?_v2+-vT(ni#136a3bLOi z+9Xy{Dd@!Z{DA)PX?!rFrD($B<+*NduKIZ`8Djl{DxC<)Cv0&q{5ax?bl-*QsG6dD>fbUv-5+a=T=Nxk4J& z(;hCWmt9%eids?zyJpt$&j0;uW95gw#eY+Z4B)^E{HYWpn=jegp=H)~gW@ecHeS^j zI5&kW7+76Gp2~+2N+{;sAB!dsqE6a*)f{hJkZ14G=a}3@7hHiG&c{2dq2w%V*LXA= zw33c1U&$-C-+`)$0GCHGIxyoKARrbm4g_fRXc5VQHn}xsld*ul4 zt~2Sog=h5XKnB0Md2X54UsC6UNO*(Fle_Sqm5xx-eN!9`-qqwWW zDvs^@$JnKH4~B@=vR5kHMk6!bRC)Va*K`y39(udieEJ`Gi$3s=&Y|zY#0h`1cY zeBK#Bkiulxh!7tD&hN@4gJX(i_kK(-Xs(kiH3*d_1fDjhL_2~Sw!U-IBR2~zRuRl^S} zc0$nL-TOY~=%sNx!GAKl^Bk(P671!=GX$mNBgYiU&ED_;b^%vqcpcVl?Bh{-CnnHI z0F8DDhfroi$+pd?XPs~>Oq6xoFVvspYkAb8FOkyo6$)*x*H^kZn}7Z7c#7w)z}&E6>TD~(Qtdq;4>LWBlRTn3x9}ujzwwoZ*{1A7Rn>&NTN@!(GIa%Z>$afTna@ity9*3R(_2R z-gf{$35MLX@DD*WQRuKyvz%USP9^_RAipG%+5!DZ_MY+(-mi|*W6p9rY2~dInXvIF zty_LLzqGvj)+kRD5K$66C^~6ig}@6VfN6u2zWz+D(r(hUZ-ou zE9cMZE1+Q~h#%k#+VMXQ=6Z2g>cw_9eEodY_bdMJOa5P_q<{KL4Rob@y`p1Kls2Po zAW;!CePpXDF}e&x80{oC+KzS+s0+o1Z!w7`AH38Ct;{obtl4ma3q*}<$_ zRM#nSR%29~riC8fUa|*_^1+Q3$l8c`C0eW44!S`{hg#wB77#*sMijeVdH*O!hJQjk z>7q|+h%*=T{yeMmPC5pwp=2;(X45FKvWGohhq_^4WYY@Tk;{^B#-Y0-6aR+WhhI%x z=x?R3p_lkR05h?UT=L*5Ab*t5lKpK0Lrpc>WQ!s$b)s)_0+khdPAFZcU)>9vP2~|) zH@*8H9#6RWk22(dW}F}n*8TdgHOz^fYLW&N-Z#Nj$#-b-lHxAdE9h4xU_PcwN=AOB zH+Ou-)8NbBFW8X$!3Y%1?PIY$Toz>=Gc0CZlIko5j6$nw?Cgh=Vi6S$X%n# zm6g^iaQRWY&#*t9C)C9CY{qhq?o7@Hu)JY(=593uiYBx0 z0h@Ld9s5?aWoXsF`lY5Hsk3}H(svg-*POMLe*JSJH%hd#NOVIyNk@jT4W&4=Muj1>xupcKw$g zF2~nsxm6R(MolAj#!7d)o0eXOBlKyQtG>g{C?YVgH=`{cx+0W`gq1wE(O7ayFUZfI zbNi)~min>-FT#&L-jWA{tFU$v^S41>44NQ9yABlLd#=uoVd|$Wexteb5Hx7a*F!0i zUeYztrV$;t1q~Ac@)KNI?|~}H2`F!rPjYM9`1AM%GzT#+%5)b9l6ZX3Sq3eQ@{7r{ z&+E(~!OZ;_bPn)VGo~39xhz1#%i<7qkMI!B{R!)MMD9EIs7X^%yM~MKtZ97(d~#NjWH+BO4qp7+)cU!^ z9F9eN%Z)}oeNl*L_||)Z!nF|^-GIDifJviXHnXg4Spds)+n@_B;NXS{0%HM+EmY^v zngYmGdNR&X_%0Z~5YGd)jY;A86I(aKjY40apZRuofadXWijR@~hElTm>c0si#oO=m zT6r#HD+*#_da8P^hU%q%QdqpnKOrUi>!i>j9h{2(KwmyS2nSkwXYuMFI(&K*gL?tU z{6^Q9t5S;*@YY1eTWlwsmNj$sj#YE~rG;t3iI9cKqu5cp93`hDIzx6LYN#j7X8@aTc`4F+frtmVu*NB+S%p2u{gE<(3!*i_|snq zCKFPti4@z+ByS`==!f#t4d*kOy1gmHrD2~m}23G+;0Sv&khGY+O* zT<5U`uh2pnxV?0RSIJ0!F6x`mO~!wl{2-v0)blbP&)XMZYP6|N-RUqW5)BGKL}=4v zQ^s|T_^nsqHE6tw#eBqlztwE@$;v+2d!38z7yFJF}OT^8b~46Re95Lw_>18*VT+2(=y zO|T2<-!;6kWfZ$KR?o@Dr_Lmhd)Q;O&~jrw+Wldm&4p@rld!o=I09N*Gq%C`QLCmN6d)IHF|n?#Aj^V!nb!R= zBPi|^?7Q0%Lm=y|gJ}4_tY3t3COnImik zDcAj;@Gx{X;_03d%M2mwPN_W#_xu*k_k7v-1vdX&rCD|z{P=(olChUMlD!x5_&%o* zA3U{LlJszT^R{Hb8@#^gy;*$5#Q6t2)f&i*}co_vB})-BJn77 z*R=z`-JxD3zfkFpHJ?Q3Uiqs3;u!f4qW&;2LPdaehK$ZG8{$}=I8LgzCAA?d1p@sm zw}ySUanG}>F&!fCoGSLvU%nkOrPL{CPHM4r3WZV_j3)7@3kLSF$#%y1dQ;QG8pJj8 zNzz`|9!4RljP`$vNvZ+9!#^(L8U66yp>y3k*@FYWJbe;Fn#gMNY)h25nu}@aQ>dSCeY)^xs;@N-l)aUmw=82KdF-X*lhTVO0CsR?iIRDi$-bmHFuMi@A8+a4Bk z2PzF_*x%@X!V#MOPBe%+TSQ@OF)?7Dkf+HA$Y||z92b!c2P4^V_j9t)y7peIJ3Av? z`$a-K;c4rSPhwZ&kXLtWv6yW~67zkP;V-NGwnqw(o-Jmq3YaG>la!#P4LGLfPx!4I z8u^6%Q2*8R=Wj|MWKHyu3c(gv-&Oro%# z(OD4UsoW2q0Eqx0upVcIyXD&FUShwvhv;*70;VyX*IIE+u}9OO{4;0m-wIz{D;%9> z%+Y8&Aoj65XJMWa8;)jNsj{at%65a`q&Q)*Gm#CXS^8~?Kd2+sK~okjj92qGN&4Cy z!GYuY9o8YzQtP$T*{Pw8(f~qt3T_&q{Sxx*=5|^EV(9^63%_LS9`r@Ze{j8~etZE^ z%XH=xY*^a91jXtq{nF;c!rd25m@)Zldvuk#jiw1-mzfbZ7K8zY?%Ra6ObCCwi!-(5 z5%H~(UdH9gjjiLCl-c|Z(?uJ!LOI0PLeElSzYF$v zA4$lXBKx8z(j#X&EnJ~-7iA|bagPB=7k*Pta0Yj&?2=`c9{BwT24!qifWlUY!Gtrv zQm#>CKOQ#!xUN}biiXC*`Zzjed15m)fx%E=4N+4Wx*HSB zIl42c9BtqYz``wNj>)v27Vox+1L5~<&34uyHPgVHm0N$Fw+6#^EB9b&(?=e>{mQn; z#0^eC;zBkSrImWgL;q4HM-iB?bXu7aXt${J`at7k6Mp${(|nU9Hs%Wy)m-B zt5jnqCj2S?C{t2`i|cqStMeWDgw`E8cYt{kiOFRdL9i^WBR2y&OlI0A+0Dt`hL>6RnN`EsV2&4nKOB19Vh`NT9T^P#n@K`Kt1E_z_(GF^1fcHjiO{lZm$yVH-azTj!2J~`r0SiYxt8} z4UAIsP2BUN)a%hHoSP4)ur#Ab6sRB3dc_6Vy)-nm8_z4O0#C+oRXg7Hc6IZk2>GA!yRaV zq8XN`_Bf}SYA>E#@yj)yg7>#!wPNn&XW5oGOB4O|6k9U&7yVHuOuWYW$2*XJOYo`+prGuKORgl=l{KsV-2QKqS|4q@u#PZ;yj9Xh z*z~*Est8sBjoEzJ{6QT?C`sI_QP~gOdCO;R|)xx+|?w}^b%tY@?KYSe-O1(VK4cmx{;ahmv;wN99Bnf+lE!c8Ee4JANGv8PZYtSE*9P_apaYkcp)rN)xeBae$gSwb zB`SU$IYbu$O{@>Oz3A_TDWDQiTn;}oW_ose{yMvxdyS%yg{_7b^QVI*SRQf3x|4-| z&Kp+m6e?%9sy9h|kB%@=>O{XmMot5$kER(8wU6?RH_7$!O{^3!P`_}8=n+pY!YLQz zEElW5AG%VDDZ!B-B-y@TH(D$-f3@X`xR8?9*b&reaY3l8r^XV?jKmjziKyC#vNP;( zQ)vp{04}fy3q#TONt~JI82=7n-H>U`iKw4a@y0m`tuG6&jJ6f6pv9qvpWT0Zv@e4z z_&TrQV%q%?M!CHqKX(J&7Mj;ZB5xnnhjl$8JPmHFSZ zzFSXd=cgAE4VNg`aGEPe`lU2)6kDJ84)A5cyP!oQ)4j+I; z;ecl{K;usyIP(gJw%g?-g=4*li%k9Mg(cw3J(jX95l!KwVY6tBvhAqty(pam6-hlPK@0~_xEfZgU8HS|gxE!x@lT;c zeIYx4;aexj0y$;7TxR4~KkS6uhY!}Gq%!(LteTbHPoor>@2W@C1v&zkC#@$ij6y@e zuUgWD7gLSh{4&~pJT^bu#KhpP(qYyHP z?qdt6qKc-lhwVvZ9JL+%>fn~b*^+*7T2=D*=DM*-Q=S(9W}G!;nE+&9R4+5_ox`CU zxdwf=VQ#piLhC1@WNzk4OY1YGOhPF!!uste%nyIIW*Y%?zwWCaASDbg8aP=)B?OW{ zWEp4~dC}{|B*q`80K_0l&g%!R`_P1X{oO0$_O_h?5|Fk* zih0DggRMEX9J1Pzt;wV?3xlPO-EQY;adG}fOnYmt?m%}<=hTC4lJs9+cag^eQNIj8 z>ywB0csA0`JJ8m{)1n~T=ltX^Uum|OV9Gq(GyYDr!g!}lr_`Wt@x|qEPmYKAVV}&k zV902zFga!?@M5tXj-VB|OZRx@y`j37sz(IoSW)#SnLrzvV?-_FtMY_KNm}1@3tI>Z zr9faax7_&OG2Vwxmk%Kca>hGObF4;vq819QsU7UfUS81|Z;H<4DMC|Ul8hl%xR?St z@#t)k7N!-Q83{yV?UO7w;!ZfliMt15dti~9;-vEEnE7JG87vJ<{X`=C*VvuTd+sN+ zu;~%xIE-G%-A>@(iNImeAEU*O)hi0Kyc9ZMDxTY58OB+(_w8qtHHKEn%Z$yCi(yh+ ziXCpzZ61}}V5nsUHwFZiEM2}Il;|{DMKS9 zP_5w}NeK`W+hlGpi9ob)X&60=PbeQK+ESuy2D;GCuk96fNQF9qmDMAHDZq_`V#`J8 z@Z%66!%RlbVr;=>Ja26drL%nm8N~4;q$SzO)K&6nnO6R1aNzhYK_<8JYM?fMbFN`cBoeP{wvl8DYTTYu*{mQe;L zqo(68c?QTcF*_JC#6dq{g5hDDMDX%P;P54W3sHRraL1*Js0FKwOYq@Y|Iy8}n(yPc z9ce%*z@@r*C_*x6VPYO&t)-?g#X99F=MvTfe6o-2WdErKd};$m;{XuK%;WjWVP#+{ z)pay>6Jw_o^#gw#hVvs96S^~##=GY^BXN}}E;2>TK|;6(m*_WO@mcc|;Ja?XzY^^B zY`!rL7!mnSk91Bly=x|fx3P(agM`;B*_}E>)fKW9#)9b)ZpJ3Y+1#k7jx17!$%#|= zp)+!j#z({bGOVO9G%7eYGO<2Q3(=rx*)5LM`^8|3Kz_Et$`7?oIkq+0g{NIqw zpHHVdo0#z|#HB7}B*tnqgZ?=WKJYIGUZW7-@*Z4Z1KJ|Af8oyD-Jd6z@$Wd)5X$WOi{c1U_l_s46UKPTLbfbyvSxU?9CWO$ZS`X)1n*MiR4hXk!)7jKw?D%Sy`ol3J}H*pI0=)T z>E5A0(fQ|wWS@$}NEA9Wt8c3qES-u#!GQg@53bgL9vd2Im?d1+?krFQge5A@2zR#% zQ7sjoaLGxludYA*0g%{t^?_)EF0nRQLz~FB(@%QG~ z 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�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%0DhK1s@nNrRx4UtOc`njESVIjb7UkB}-jWLL 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�~}k1OjJF*d)}@|VeABSegz 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