diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 835c623f..dcfa528b 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,5 +1,6 @@ Delete the text explanations below these headers and replace them with information about your PR. Please first consult the [developer guide](https://weis.readthedocs.io/en/latest/how_to_contribute_code.html) to make sure your PR follows all code, testing, and documentation conventions. +If this PR is for a new release, do not forget to update the RAFT version in `pyproject.toml`! ## Purpose Explain the goal of this pull request. If it addresses an existing issue be sure to link to it. Describe the big picture of your changes here, perhaps using a bullet list if multiple changes are done to accomplish a single goal. If it accomplishes multiple goals, it may be best to create separate PR's for each. diff --git a/designs/FOCTT_example.yaml b/designs/FOCTT_example.yaml index dd5ce7f1..82933bf7 100644 --- a/designs/FOCTT_example.yaml +++ b/designs/FOCTT_example.yaml @@ -1063,7 +1063,7 @@ turbine: dlsMax : 5.0 # maximum node splitting section amount; can't be 0 name : tower # [-] an identifier (no longer has to be number) - type : 1 # [-] + type : rigid # [-] rA : [ 0, 0, -33.5] # [m] end A coordinates rB : [ 0, 0, -2.5] # [m] and B coordinates shape : circ # [-] circular or rectangular @@ -1089,7 +1089,7 @@ platform: members: # list all members here - name : upper_column # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [ 0, 0, -2.5] # [m] end A coordinates rB : [ 0, 0, 9] # [m] and B coordinates shape : circ # [-] circular or rectangular @@ -1111,7 +1111,7 @@ platform: - name : mooring_fins # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [ 0, 10, -2.15] # [m] end A coordinates rB : [ 0, -10, -2.15] # [m] and B coordinates shape : circ # [-] circular or rectangular diff --git a/designs/OC3spar.yaml b/designs/OC3spar.yaml index e8d6d912..a9d23acd 100644 --- a/designs/OC3spar.yaml +++ b/designs/OC3spar.yaml @@ -1033,7 +1033,7 @@ turbine: tower: # (could remove some entries that don't apply for the tower) name : tower # [-] an identifier (no longer has to be number) - type : 1 # [-] + type : rigid # [-] rA : [ 0, 0, 10] # [m] end A coordinates rB : [ 0, 0, 87.6] # [m] and B coordinates shape : circ # [-] circular or rectangular @@ -1074,7 +1074,7 @@ platform: members: # list all members here - name : center_spar # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [ 0, 0, -120] # [m] end A coordinates rB : [ 0, 0, 10] # [m] and B coordinates shape : circ # [-] circular or rectangular diff --git a/designs/OC4semi.yaml b/designs/OC4semi.yaml index 220c72da..c268bc05 100644 --- a/designs/OC4semi.yaml +++ b/designs/OC4semi.yaml @@ -1030,7 +1030,7 @@ turbine: tower: # (could remove some entries that don't apply for the tower) name : tower # [-] an identifier (no longer has to be number) - type : 1 # [-] + type : rigid # [-] rA : [ 0, 0, 10] # [m] end A coordinates rB : [ 0, 0, 87.6] # [m] and B coordinates shape : circ # [-] circular or rectangular diff --git a/designs/RM1_Floating.yaml b/designs/RM1_Floating.yaml index 02616119..621651ce 100644 --- a/designs/RM1_Floating.yaml +++ b/designs/RM1_Floating.yaml @@ -685,7 +685,7 @@ turbine: nacelle: dlsMax : 2.0 # maximum node splitting section amount; can't be 0 name : nacelle # [-] an identifier (no longer has to be number) - type : 1 # [-] type (used for platform members vs. other members) + type : rigid # [-] type (used for platform members vs. other members) rA : [4.5478, 0, -25.2] # [m] end A coordinates rB : [-3.6878, 0, -25.2] # [m] end B coordinates shape : rect # [-] circular or rectangular @@ -703,7 +703,7 @@ turbine: tower: dlsMax : 2.0 # maximum node splitting section amount; can't be 0 name : tower # [-] an identifier (no longer has to be number) - type : 1 # [-] type (used for platform members vs. other members) + type : rigid # [-] type (used for platform members vs. other members) rA : [ 0, 0, -24.0] # [m] end A coordinates rB : [ 0, 0, -9.0] # [m] end B coordinates shape : circ # [-] circular or rectangular @@ -728,7 +728,7 @@ platform: members: # list all members here - name : column-E # [-] an identifier (no longer has to be number) - type : 2 # [-] type (used for platform members vs. other members) + type : rigid # [-] type (used for platform members vs. other members) rA : [ 28.0, 0.0, -10.0] # [m] end A coordinates rB : [ 28.0, 0.0, 6.0] # [m] end B coordinates shape : circ # [-] circular or rectangular @@ -749,7 +749,7 @@ platform: cap_d_in : [0] # [m] the diameter of the "cut-out" circle (0 means it's continuous) - name : column-W # [-] an identifier (no longer has to be number) - type : 2 # [-] type (used for platform members vs. other members) + type : rigid # [-] type (used for platform members vs. other members) rA : [ -28.0, 0.0, -10.0] # [m] end A coordinates rB : [ -28.0, 0.0, 6.0] # [m] end B coordinates shape : circ # [-] circular or rectangular @@ -770,7 +770,7 @@ platform: cap_d_in : [0] # [m] the diameter of the "cut-out" circle (0 means it's continuous) - name : column-S # [-] an identifier (no longer has to be number) - type : 2 # [-] type (used for platform members vs. other members) + type : rigid # [-] type (used for platform members vs. other members) rA : [ 0.0, -12.0, -10.0] # [m] end A coordinates rB : [ 0.0, -12.0, 6.0] # [m] end B coordinates shape : circ # [-] circular or rectangular @@ -791,7 +791,7 @@ platform: cap_d_in : [0] # [m] the diameter of the "cut-out" circle (0 means it's continuous) - name : column-N # [-] an identifier (no longer has to be number) - type : 2 # [-] type (used for platform members vs. other members) + type : rigid # [-] type (used for platform members vs. other members) rA : [ 0.0, 12.0, -10.0] # [m] end A coordinates rB : [ 0.0, 12.0, 6.0] # [m] end B coordinates shape : circ # [-] circular or rectangular @@ -815,7 +815,7 @@ platform: - name : upper_brace-NE # [-] an identifier (no longer has to be number) - type : 2 # [-] type (used for platform members vs. other members) + type : rigid # [-] type (used for platform members vs. other members) rA : [ 3.67658, 10.4243, 4.5] # [m] end A coordinates rB : [ 24.3234, 1.57568, 4.5] # [m] end B coordinates shape : circ # [-] circular or rectangular @@ -831,7 +831,7 @@ platform: rho_shell : 7850 # [kg/m^3] the material density of the shell - name : upper_brace-SE # [-] an identifier (no longer has to be number) - type : 2 # [-] type (used for platform members vs. other members) + type : rigid # [-] type (used for platform members vs. other members) rA : [ 3.67658, -10.4243, 4.5] # [m] end A coordinates rB : [ 24.3234, -1.57568, 4.5] # [m] end B coordinates shape : circ # [-] circular or rectangular @@ -847,7 +847,7 @@ platform: rho_shell : 7850 # [kg/m^3] the material density of the shell - name : upper_brace-SW # [-] an identifier (no longer has to be number) - type : 2 # [-] type (used for platform members vs. other members) + type : rigid # [-] type (used for platform members vs. other members) rA : [-3.67658, -10.4243, 4.5] # [m] end A coordinates rB : [-24.3234, -1.57568, 4.5] # [m] end B coordinates shape : circ # [-] circular or rectangular @@ -863,7 +863,7 @@ platform: rho_shell : 7850 # [kg/m^3] the material density of the shell - name : upper_brace-NW # [-] an identifier (no longer has to be number) - type : 2 # [-] type (used for platform members vs. other members) + type : rigid # [-] type (used for platform members vs. other members) rA : [-3.67658, 10.4243, 4.5] # [m] end A coordinates rB : [-24.3234, 1.57568, 4.5] # [m] end B coordinates shape : circ # [-] circular or rectangular @@ -882,7 +882,7 @@ platform: - name : lower_brace-NE # [-] an identifier (no longer has to be number) - type : 2 # [-] type (used for platform members vs. other members) + type : rigid # [-] type (used for platform members vs. other members) rA : [ 3.67658, 10.4243, -8.5] # [m] end A coordinates rB : [ 24.3234, 1.57568, -8.5] # [m] end B coordinates shape : circ # [-] circular or rectangular @@ -898,7 +898,7 @@ platform: rho_shell : 7850 # [kg/m^3] the material density of the shell - name : lower_brace-SE # [-] an identifier (no longer has to be number) - type : 2 # [-] type (used for platform members vs. other members) + type : rigid # [-] type (used for platform members vs. other members) rA : [ 3.67658,-10.4243, -8.5] # [m] end A coordinates rB : [ 24.3234,-1.57568, -8.5] # [m] end B coordinates shape : circ # [-] circular or rectangular @@ -914,7 +914,7 @@ platform: rho_shell : 7850 # [kg/m^3] the material density of the shell - name : lower_brace-SW # [-] an identifier (no longer has to be number) - type : 2 # [-] type (used for platform members vs. other members) + type : rigid # [-] type (used for platform members vs. other members) rA : [-3.67658,-10.4243, -8.5] # [m] end A coordinates rB : [-24.3234,-1.57568, -8.5] # [m] end B coordinates shape : circ # [-] circular or rectangular @@ -930,7 +930,7 @@ platform: rho_shell : 7850 # [kg/m^3] the material density of the shell - name : lower_brace-NW # [-] an identifier (no longer has to be number) - type : 2 # [-] type (used for platform members vs. other members) + type : rigid # [-] type (used for platform members vs. other members) rA : [-3.67658, 10.4243, -8.5] # [m] end A coordinates rB : [-24.3234, 1.57568, -8.5] # [m] end B coordinates shape : circ # [-] circular or rectangular @@ -949,7 +949,7 @@ platform: - name : upper_tower_brace # [-] an identifier (no longer has to be number) - type : 2 # [-] type (used for platform members vs. other members) + type : rigid # [-] type (used for platform members vs. other members) rA : [ 0.0, -8.0, 4.5] # [m] end A coordinates rB : [ 0.0, 8.0, 4.5] # [m] end B coordinates shape : circ # [-] circular or rectangular @@ -965,7 +965,7 @@ platform: rho_shell : 7850 # [kg/m^3] the material density of the shell - name : lower_tower_brace # [-] an identifier (no longer has to be number) - type : 2 # [-] type (used for platform members vs. other members) + type : rigid # [-] type (used for platform members vs. other members) rA : [ 0.0, -8.0, -8.5] # [m] end A coordinates rB : [ 0.0, 8.0, -8.5] # [m] end B coordinates shape : circ # [-] circular or rectangular @@ -981,7 +981,7 @@ platform: rho_shell : 7850 # [kg/m^3] the material density of the shell - name : diag_tower_brace-S # [-] an identifier (no longer has to be number) - type : 2 # [-] type (used for platform members vs. other members) + type : rigid # [-] type (used for platform members vs. other members) rA : [ 0.0, -8.0, 4.5] # [m] end A coordinates rB : [ 0.0, 0.0, -8.5] # [m] end B coordinates shape : circ # [-] circular or rectangular @@ -997,7 +997,7 @@ platform: rho_shell : 7850 # [kg/m^3] the material density of the shell - name : diag_tower_brace-N # [-] an identifier (no longer has to be number) - type : 2 # [-] type (used for platform members vs. other members) + type : rigid # [-] type (used for platform members vs. other members) rA : [ 0.0, 8.0, 4.5] # [m] end A coordinates rB : [ 0.0, 0.0, -8.5] # [m] end B coordinates shape : circ # [-] circular or rectangular @@ -1016,7 +1016,7 @@ platform: - name : heave_plate-E # [-] an identifier (no longer has to be number) - type : 2 # [-] type (used for platform members vs. other members) + type : rigid # [-] type (used for platform members vs. other members) rA : [ 28.0, 0.0, -10.5] # [m] end A coordinates rB : [ 28.0, 0.0, -10.0] # [m] end B coordinates shape : circ # [-] circular or rectangular @@ -1035,7 +1035,7 @@ platform: cap_d_in : [0] # [m] the diameter of the "cut-out" circle (0 means it's continuous) - name : heave_plate-W # [-] an identifier (no longer has to be number) - type : 2 # [-] type (used for platform members vs. other members) + type : rigid # [-] type (used for platform members vs. other members) rA : [ -28.0, 0.0, -10.5] # [m] end A coordinates rB : [ -28.0, 0.0, -10.0] # [m] end B coordinates shape : circ # [-] circular or rectangular @@ -1054,7 +1054,7 @@ platform: cap_d_in : [0] # [m] the diameter of the "cut-out" circle (0 means it's continuous) - name : heave_plate-S # [-] an identifier (no longer has to be number) - type : 2 # [-] type (used for platform members vs. other members) + type : rigid # [-] type (used for platform members vs. other members) rA : [ 0.0, -12.0, -10.5] # [m] end A coordinates rB : [ 0.0, -12.0, -10.0] # [m] end B coordinates shape : circ # [-] circular or rectangular @@ -1073,7 +1073,7 @@ platform: cap_d_in : [0] # [m] the diameter of the "cut-out" circle (0 means it's continuous) - name : heave_plate-N # [-] an identifier (no longer has to be number) - type : 2 # [-] type (used for platform members vs. other members) + type : rigid # [-] type (used for platform members vs. other members) rA : [ 0.0, 12.0, -10.5] # [m] end A coordinates rB : [ 0.0, 12.0, -10.0] # [m] end B coordinates shape : circ # [-] circular or rectangular diff --git a/designs/Vertical_cylinder.yaml b/designs/Vertical_cylinder.yaml index c584b85a..41d3322d 100644 --- a/designs/Vertical_cylinder.yaml +++ b/designs/Vertical_cylinder.yaml @@ -29,7 +29,7 @@ platform: members: # list all members here - name : vertical_cylinder # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [0,0,-1] # [m] end A coordinates rB : [0,0,1] # [m] and B coordinates shape : circ # [-] circular or rectangular diff --git a/designs/VolturnUS-S.yaml b/designs/VolturnUS-S.yaml index e0a2ae2c..c09c906b 100644 --- a/designs/VolturnUS-S.yaml +++ b/designs/VolturnUS-S.yaml @@ -7,6 +7,8 @@ settings: # global Settings max_freq : 0.40 # [Hz] highest frequency to consider XiStart : 0 # sets initial amplitude of each DOF for all frequencies nIter : 10 # sets how many iterations to perform in Model.solveDynamics() + staticsMod : 0 # sets hydrostatic stiffness approach in Model.solveStaticss (0) constant stiffness matrix or (1) nonlinear + forcingMod : 0 # sets forcing approach in Model.solveStatics: (0) constant or (1) updated each time site: water_depth : 200 # [m] uniform water depth @@ -1058,7 +1060,7 @@ turbine: dlsMax : 5.0 # maximum node splitting section amount; can't be 0 name : tower # [-] an identifier (no longer has to be number) - type : 1 # [-] + type : rigid # [-] rA : [ 0, 0, 15] # [m] end A coordinates rB : [ 0, 0, 144.582] # [m] and B coordinates shape : circ # [-] circular or rectangular @@ -1089,7 +1091,7 @@ platform: members: # list all members here - name : center_column # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [ 0, 0, -20] # [m] end A coordinates rB : [ 0, 0, 15] # [m] and B coordinates shape : circ # [-] circular or rectangular @@ -1111,7 +1113,7 @@ platform: - name : outer_column # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [51.75, 0, -20] # [m] end A coordinates rB : [51.75, 0, 15] # [m] and B coordinates heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) @@ -1137,7 +1139,7 @@ platform: - name : pontoon # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [ 5 , 0, -16.5] # [m] end A coordinates rB : [ 45.5, 0, -16.5] # [m] and B coordinates heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) @@ -1158,7 +1160,7 @@ platform: - name : upper_support # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [ 5 , 0, 14.545] # [m] end A coordinates rB : [ 45.5, 0, 14.545] # [m] and B coordinates heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) diff --git a/designs/VolturnUS-S_farm.yaml b/designs/VolturnUS-S_farm.yaml index fe196b56..68502f2e 100644 --- a/designs/VolturnUS-S_farm.yaml +++ b/designs/VolturnUS-S_farm.yaml @@ -1083,7 +1083,7 @@ turbine: dlsMax : 5.0 # maximum node splitting section amount; can't be 0 name : tower # [-] an identifier (no longer has to be number) - type : 1 # [-] + type : rigid # [-] rA : [ 0, 0, 15] # [m] end A coordinates rB : [ 0, 0, 144.582] # [m] and B coordinates shape : circ # [-] circular or rectangular @@ -1114,7 +1114,7 @@ platform: members: # list all members here - name : center_column # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [ 0, 0, -20] # [m] end A coordinates rB : [ 0, 0, 15] # [m] and B coordinates shape : circ # [-] circular or rectangular @@ -1136,7 +1136,7 @@ platform: - name : outer_column # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [51.75, 0, -20] # [m] end A coordinates rB : [51.75, 0, 15] # [m] and B coordinates heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) @@ -1162,7 +1162,7 @@ platform: - name : pontoon # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [ 5 , 0, -16.5] # [m] end A coordinates rB : [ 45.5, 0, -16.5] # [m] and B coordinates heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) @@ -1183,7 +1183,7 @@ platform: - name : upper_support # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [ 5 , 0, 14.545] # [m] end A coordinates rB : [ 45.5, 0, 14.545] # [m] and B coordinates heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) diff --git a/docs/usage.rst b/docs/usage.rst index d0d54133..e5472354 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -141,7 +141,9 @@ Modeling Settings max_freq : 0.40 # [Hz] highest frequency to consider XiStart : 0 # sets initial amplitude of each DOF for all frequencies nIter : 10 # sets how many iterations to perform in Model.solveDynamics() - + staticsMod : 0 # sets hydrostatic stiffness approach in Model.solveStaticss (0) constant stiffness matrix or (1) nonlinear + forcingMod : 0 # sets forcing approach in Model.solveStatics: (0) constant or (1) updated each time + Site Characteristics ^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/IEA-15-240-RWT-UMaineSemi_MoorDyn.dat b/examples/IEA-15-240-RWT-UMaineSemi_MoorDyn.dat new file mode 100644 index 00000000..351e6223 --- /dev/null +++ b/examples/IEA-15-240-RWT-UMaineSemi_MoorDyn.dat @@ -0,0 +1,61 @@ +--------------------- MoorDyn Input File ------------------------------------ +IEA 15 MW offshore reference model on UMaine VolturnUS-S semi-submersible floating platform mooring model- C. Allen UMaine +FALSE Echo - echo the input file data (flag) +----------------------- LINE TYPES ------------------------------------------ +Name Diam MassDen EA BA/-zeta EI Cd Ca CdAx CaAx +(-) (m) (kg/m) (N) (N-s/-) (-) (-) (-) (-) (-) +main 0.333 685.00 3.27E+09 -1.0 0 2.0 0.82 0.4 0.27 +---------------------- POINTS -------------------------------- +ID Type X Y Z M V CdA CA +(-) (-) (m) (m) (m) (kg) (m^3) (m^2) (-) +1 Vessel -58.000 0.000 -14.000 0 0 0 0 +2 Fixed -837.600 0.000 -200.000 0 0 0 0 +3 Vessel 29.000 50.229 -14.000 0 0 0 0 +4 Fixed 418.800 725.383 -200.000 0 0 0 0 +5 Vessel 29.000 -50.229 -14.000 0 0 0 0 +6 Fixed 418.800 -725.383 -200.000 0 0 0 0 +---------------------- LINES -------------------------------------- +ID LineType AttachA AttachB UnstrLen NumSegs Outputs +(-) (-) (-) (-) (m) (-) (-) +1 main 2 1 850.00 50 - +2 main 4 3 850.00 50 - +3 main 6 5 850.00 50 - +---------------------- SOLVER OPTIONS --------------------------------------- +0.001 dtM - time step to use in mooring integration (s) +3.0e6 kbot - bottom stiffness (Pa/m) +3.0e5 cbot - bottom damping (Pa-s/m) +1.0 dtIC - time interval for analyzing convergence during IC gen (s) +60.0 TmaxIC - max time for ic gen (s) +4.0 CdScaleIC - factor by which to scale drag coefficients during dynamic relaxation (-) +0.001 threshIC - threshold for IC convergence (-) +------------------------ OUTPUTS -------------------------------------------- +FairTen1 +FairTen2 +FairTen3 +AnchTen1 +AnchTen2 +AnchTen3 +Con1fx +Con3fx +Con5fx +Con1fy +Con3fy +Con5fy +Con1fz +Con3fz +Con5fz +Con2fx +Con4fx +Con6fx +Con2fy +Con4fy +Con6fy +Con2fz +Con4fz +Con6fz +fx +fy +fz +END +------------------------- need this line -------------------------------------- + diff --git a/examples/OC4semi-RAFT_QTF.yaml b/examples/OC4semi-RAFT_QTF.yaml index cb52faff..51c74127 100644 --- a/examples/OC4semi-RAFT_QTF.yaml +++ b/examples/OC4semi-RAFT_QTF.yaml @@ -1032,7 +1032,7 @@ turbine: tower: # (could remove some entries that don't apply for the tower) name : tower # [-] an identifier (no longer has to be number) - type : 1 # [-] + type : rigid # [-] rA : [ 0, 0, 10] # [m] end A coordinates rB : [ 0, 0, 87.6] # [m] and B coordinates shape : circ # [-] circular or rectangular @@ -1076,7 +1076,7 @@ platform: members: # list all members here - name : main_column # [-] an identifier (no longer has to be number) - type : 2 # [-] (1=turbine, >1=substructure, for now) + type : rigid # [-] (1=turbine, >1=substructure, for now) rA : [ 0, 0, -20] # [m] end A coordinates rB : [ 0, 0, 10] # [m] and B coordinates shape : circ # [-] circular or rectangular @@ -1100,7 +1100,7 @@ platform: - name : offset_column # [-] an identifier (no longer has to be number) - type : 3 # [-] (1=turbine, >1=substructure, for now) + type : rigid # [-] (1=turbine, >1=substructure, for now) rA : [ 28.86 , 0, -20] # [m] end A coordinates rB : [ 28.86 , 0, 12] # [m] and B coordinates heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) diff --git a/examples/OC4semi-WAMIT_Coefs.yaml b/examples/OC4semi-WAMIT_Coefs.yaml index 025ad781..8b427964 100644 --- a/examples/OC4semi-WAMIT_Coefs.yaml +++ b/examples/OC4semi-WAMIT_Coefs.yaml @@ -1032,7 +1032,7 @@ turbine: tower: # (could remove some entries that don't apply for the tower) name : tower # [-] an identifier (no longer has to be number) - type : 1 # [-] + type : rigid # [-] rA : [ 0, 0, 10] # [m] end A coordinates rB : [ 0, 0, 87.6] # [m] and B coordinates shape : circ # [-] circular or rectangular @@ -1075,7 +1075,7 @@ platform: members: # list all members here - name : main_column # [-] an identifier (no longer has to be number) - type : 2 # [-] (1=turbine, >1=substructure, for now) + type : rigid # [-] (1=turbine, >1=substructure, for now) rA : [ 0, 0, -20] # [m] end A coordinates rB : [ 0, 0, 10] # [m] and B coordinates shape : circ # [-] circular or rectangular @@ -1099,7 +1099,7 @@ platform: - name : offset_column # [-] an identifier (no longer has to be number) - type : 3 # [-] (1=turbine, >1=substructure, for now) + type : rigid # [-] (1=turbine, >1=substructure, for now) rA : [ 28.86 , 0, -20] # [m] end A coordinates rB : [ 28.86 , 0, 12] # [m] and B coordinates heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) diff --git a/examples/VolturnUS-S-flexible_example.yaml b/examples/VolturnUS-S-flexible_example.yaml new file mode 100644 index 00000000..91c92614 --- /dev/null +++ b/examples/VolturnUS-S-flexible_example.yaml @@ -0,0 +1,1283 @@ +type: input file for RAFT +name: IEA 15 MW with VolturnUS-S steel semi with flexible tower and flexible pontoons +comments: This is a quick example to demonstrate cases with flexible members + + +settings: # global Settings + min_freq : 0.001 # [Hz] lowest frequency to consider, also the frequency bin width + max_freq : 0.20 # [Hz] highest frequency to consider + XiStart : 0 # sets initial amplitude of each DOF for all frequencies + nIter : 4 # sets how many iterations to perform in Model.solveDynamics() + +site: + water_depth : 200 # [m] uniform water depth + rho_water : 1025.0 # [kg/m^3] water density + rho_air : 1.225 # [kg/m^3] air density + mu_air : 1.81e-05 # air dynamic viscosity + shearExp : 0.12 # shear exponent + +cases: + + keys : [wind_speed, wind_heading, turbulence, turbine_status, yaw_misalign, wave_spectrum, wave_period, wave_height, wave_heading ] + data : # m/s deg % or e.g. IIB_NTM string deg string (s) (m) (deg) + - [ 0, 0, 0, operating, 0, JONSWAP, 12, 6, 0 ] + + +turbine: + + mRNA : 1001505.907 # [kg] RNA mass: m_blades = 3*68076.969 = 204230.907 kg (from ED.sum), m_yawbearing = 100000 kg, m_hub = 190000 kg, m_nacelle = 507275 kg + IxRNA : 0 # [kg-m2] RNA moment of inertia about local x axis (assumed to be identical to rotor axis for now, as approx) [kg-m^2] + IrRNA : 0 # [kg-m2] RNA moment of inertia about local y or z axes [kg-m^2] + xCG_RNA : -7.27 # [m] x location of RNA center of mass [m]: xg_blades = -13.0 m, xg_hub = -11.0 m, xg_nac = -4.99 m, xg_yaw = 0.0 m + hHub : 150.0 # [m] hub height above water line [m] + #rRNA : [0,0, 148.742] # [m] Can use the position of the RNA reference point (which the RNA yaws about) with respect to the FOWT reference point. If also providing hHub, the z coord be overwritten. + Fthrust : 1500.0E3 # [N] temporary thrust force to use + + I_drivetrain: 318628138.0 # full rotor + drivetrain inertia as felt on the high-speed shaft + + nBlades : 3 # number of blades + Zhub : 150.0 # hub height [m] + Rhub : 3.97 # hub radius [m] + precone : -4.0 # [deg] + shaft_tilt : -6.0 # [deg] + overhang : -12.0313 # [m] + aeroServoMod : 1 # 0 aerodynamics off; 1 aerodynamics on + + + blade: + precurveTip : -3.9999999999999964 # + presweepTip : 0.0 # + Rtip : 120.96999999936446 # rotor radius + + # r chord theta precurve presweep + geometry: + - [ 8.004, 5.228, 15.474, 0.035, 0.000 ] + - [ 12.039, 5.321, 14.692, 0.084, 0.000 ] + - [ 16.073, 5.458, 13.330, 0.139, 0.000 ] + - [ 20.108, 5.602, 11.644, 0.192, 0.000 ] + - [ 24.142, 5.718, 9.927, 0.232, 0.000 ] + - [ 28.177, 5.767, 8.438, 0.250, 0.000 ] + - [ 32.211, 5.713, 7.301, 0.250, 0.000 ] + - [ 36.246, 5.536, 6.232, 0.246, 0.000 ] + - [ 40.280, 5.291, 5.230, 0.240, 0.000 ] + - [ 44.315, 5.035, 4.348, 0.233, 0.000 ] + - [ 48.349, 4.815, 3.606, 0.218, 0.000 ] + - [ 52.384, 4.623, 2.978, 0.178, 0.000 ] + - [ 56.418, 4.432, 2.423, 0.100, 0.000 ] + - [ 60.453, 4.245, 1.924, 0.000, 0.000 ] + - [ 64.487, 4.065, 1.467, -0.112, 0.000 ] + - [ 68.522, 3.896, 1.056, -0.244, 0.000 ] + - [ 72.556, 3.735, 0.692, -0.415, 0.000 ] + - [ 76.591, 3.579, 0.355, -0.620, 0.000 ] + - [ 80.625, 3.425, 0.019, -0.846, 0.000 ] + - [ 84.660, 3.268, -0.358, -1.080, 0.000 ] + - [ 88.694, 3.112, -0.834, -1.330, 0.000 ] + - [ 92.729, 2.957, -1.374, -1.602, 0.000 ] + - [ 96.763, 2.800, -1.848, -1.895, 0.000 ] + - [ 100.798, 2.637, -2.136, -2.202, 0.000 ] + - [ 104.832, 2.464, -2.172, -2.523, 0.000 ] + - [ 108.867, 2.283, -2.108, -2.864, 0.000 ] + - [ 112.901, 2.096, -1.953, -3.224, 0.000 ] + - [ 116.936, 1.902, -1.662, -3.605, 0.000 ] + # station(rel) airfoil name + airfoils: + - [ 0.00000, circular ] + - [ 0.02000, circular ] + - [ 0.15000, SNL-FFA-W3-500 ] + - [ 0.24517, FFA-W3-360 ] + - [ 0.32884, FFA-W3-330blend ] + - [ 0.43918, FFA-W3-301 ] + - [ 0.53767, FFA-W3-270blend ] + - [ 0.63821, FFA-W3-241 ] + - [ 0.77174, FFA-W3-211 ] + - [ 1.00000, FFA-W3-211 ] + + + airfoils: + - name : circular # + relative_thickness : 1.0 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00010, 0.35000, -0.00010 ] + - [ 179.9087, 0.00010, 0.35000, -0.00010 ] + - name : SNL-FFA-W3-500 # + relative_thickness : 0.5 # + data: # alpha c_l c_d c_m + - [ -179.9660, 0.00000, 0.08440, 0.00000 ] + - [ -170.0000, 0.44190, 0.08440, 0.31250 ] + - [ -160.0002, 0.88370, 0.12680, 0.28310 ] + - [ -149.9998, 0.96740, 0.29270, 0.26320 ] + - [ -139.9999, 0.78010, 0.49700, 0.20480 ] + - [ -130.0001, 0.62930, 0.71610, 0.19320 ] + - [ -120.0003, 0.47850, 0.92460, 0.20080 ] + - [ -109.9999, 0.31890, 1.09850, 0.21360 ] + - [ -100.0000, 0.15530, 1.21820, 0.22210 ] + - [ -90.0002, 0.00000, 1.27070, 0.21980 ] + - [ -79.9998, -0.15530, 1.21820, 0.19600 ] + - [ -70.0000, -0.31890, 1.09850, 0.16350 ] + - [ -60.0001, -0.47840, 0.92460, 0.12850 ] + - [ -49.9997, -0.62930, 0.71610, 0.09650 ] + - [ -39.9999, -0.78010, 0.49700, 0.07160 ] + - [ -30.0001, -0.96740, 0.29270, 0.05220 ] + - [ -20.0002, -1.02810, 0.14990, -0.00630 ] + - [ -19.7499, -1.02430, 0.14720, -0.00890 ] + - [ -19.2502, -1.00520, 0.14470, -0.00990 ] + - [ -18.9999, -0.99710, 0.14330, -0.01050 ] + - [ -18.7500, -1.00520, 0.14030, -0.01100 ] + - [ -18.5002, -0.99950, 0.13860, -0.01160 ] + - [ -18.2499, -0.99080, 0.13730, -0.01200 ] + - [ -18.0000, -0.98150, 0.13600, -0.01260 ] + - [ -17.4998, -0.97640, 0.13220, -0.01350 ] + - [ -17.2500, -0.97050, 0.13060, -0.01390 ] + - [ -17.0002, -0.96550, 0.12900, -0.01430 ] + - [ -16.7498, -0.96620, 0.12680, -0.01470 ] + - [ -16.5000, -0.95440, 0.12580, -0.01510 ] + - [ -16.2502, -0.94440, 0.12460, -0.01550 ] + - [ -15.9998, -0.94050, 0.12290, -0.01580 ] + - [ -15.7500, -0.94330, 0.12060, -0.01610 ] + - [ -15.5002, -0.93300, 0.11950, -0.01640 ] + - [ -15.2498, -0.92110, 0.11850, -0.01680 ] + - [ -14.7502, -0.91580, 0.11500, -0.01730 ] + - [ -14.4998, -0.90700, 0.11380, -0.01750 ] + - [ -14.2500, -0.89590, 0.11270, -0.01780 ] + - [ -14.0002, -0.89260, 0.11100, -0.01810 ] + - [ -13.7498, -0.88080, 0.11000, -0.01840 ] + - [ -13.5000, -0.87220, 0.10890, -0.01860 ] + - [ -13.2502, -0.86600, 0.10750, -0.01880 ] + - [ -12.9998, -0.86260, 0.10590, -0.01880 ] + - [ -12.7500, -0.84890, 0.10510, -0.01920 ] + - [ -12.5002, -0.83630, 0.10420, -0.01940 ] + - [ -12.2498, -0.83630, 0.10230, -0.01940 ] + - [ -12.0000, -0.82710, 0.10130, -0.01960 ] + - [ -11.7502, -0.81410, 0.10040, -0.01980 ] + - [ -11.4998, -0.80040, 0.09970, -0.02000 ] + - [ -11.0002, -0.78900, 0.09710, -0.01990 ] + - [ -10.7498, -0.78620, 0.09560, -0.01960 ] + - [ -10.5000, -0.77470, 0.09480, -0.01940 ] + - [ -10.2502, -0.77010, 0.09400, -0.01840 ] + - [ -9.9998, -0.76740, 0.09250, -0.01830 ] + - [ -9.7500, -0.75060, 0.09170, -0.01920 ] + - [ -9.5002, -0.72900, 0.09120, -0.02050 ] + - [ -9.2498, -0.70950, 0.09020, -0.02240 ] + - [ -9.0000, -0.68550, 0.08950, -0.02470 ] + - [ -8.7502, -0.65900, 0.08910, -0.02670 ] + - [ -8.4998, -0.63190, 0.08870, -0.02870 ] + - [ -8.2500, -0.60190, 0.08790, -0.03200 ] + - [ -8.0002, -0.57180, 0.08750, -0.03450 ] + - [ -7.7498, -0.54240, 0.08730, -0.03670 ] + - [ -7.5000, -0.50980, 0.08680, -0.03990 ] + - [ -7.2502, -0.47670, 0.08640, -0.04300 ] + - [ -6.9998, -0.44540, 0.08620, -0.04530 ] + - [ -6.7500, -0.41420, 0.08600, -0.04760 ] + - [ -6.5002, -0.37910, 0.08560, -0.05100 ] + - [ -6.2498, -0.34600, 0.08530, -0.05380 ] + - [ -6.0000, -0.31440, 0.08520, -0.05600 ] + - [ -5.7502, -0.28170, 0.08500, -0.05860 ] + - [ -5.4998, -0.24610, 0.08470, -0.06190 ] + - [ -5.2500, -0.21330, 0.08460, -0.06440 ] + - [ -5.0002, -0.18270, 0.08450, -0.06630 ] + - [ -4.7498, -0.14940, 0.08430, -0.06880 ] + - [ -4.5000, -0.11580, 0.08420, -0.07150 ] + - [ -4.2502, -0.08370, 0.08400, -0.07370 ] + - [ -3.9998, -0.05290, 0.08400, -0.07560 ] + - [ -3.7500, -0.02250, 0.08390, -0.07740 ] + - [ -3.5002, 0.00890, 0.08380, -0.07930 ] + - [ -3.2498, 0.03920, 0.08380, -0.08110 ] + - [ -3.0000, 0.06860, 0.08380, -0.08260 ] + - [ -2.7502, 0.09740, 0.08380, -0.08380 ] + - [ -2.4998, 0.12600, 0.08380, -0.08520 ] + - [ -2.2500, 0.15550, 0.08380, -0.08670 ] + - [ -2.0002, 0.18530, 0.08380, -0.08830 ] + - [ -1.7498, 0.21460, 0.08370, -0.08970 ] + - [ -1.5000, 0.24300, 0.08370, -0.09100 ] + - [ -1.2502, 0.27130, 0.08380, -0.09210 ] + - [ -0.9998, 0.30060, 0.08380, -0.09360 ] + - [ -0.7500, 0.32950, 0.08380, -0.09490 ] + - [ -0.5002, 0.35780, 0.08380, -0.09610 ] + - [ -0.2498, 0.38570, 0.08380, -0.09720 ] + - [ 0.0000, 0.41350, 0.08380, -0.09830 ] + - [ 0.2298, 0.44250, 0.08390, -0.09950 ] + - [ 0.4698, 0.47150, 0.08390, -0.10080 ] + - [ 0.7002, 0.50030, 0.08390, -0.10190 ] + - [ 0.9402, 0.52860, 0.08400, -0.10290 ] + - [ 1.1700, 0.55670, 0.08400, -0.10400 ] + - [ 1.3997, 0.58500, 0.08410, -0.10500 ] + - [ 1.6398, 0.61350, 0.08410, -0.10610 ] + - [ 1.8701, 0.64170, 0.08420, -0.10720 ] + - [ 2.1102, 0.66970, 0.08420, -0.10820 ] + - [ 2.3400, 0.69750, 0.08430, -0.10910 ] + - [ 2.5697, 0.72510, 0.08430, -0.11000 ] + - [ 2.8098, 0.75280, 0.08440, -0.11090 ] + - [ 3.0401, 0.78070, 0.08450, -0.11190 ] + - [ 3.2802, 0.80830, 0.08460, -0.11280 ] + - [ 3.5099, 0.83580, 0.08460, -0.11370 ] + - [ 3.7403, 0.86310, 0.08470, -0.11460 ] + - [ 3.9798, 0.89020, 0.08470, -0.11530 ] + - [ 4.2101, 0.91730, 0.08480, -0.11610 ] + - [ 4.4502, 0.94440, 0.08490, -0.11700 ] + - [ 4.6799, 0.97130, 0.08500, -0.11780 ] + - [ 4.9102, 0.99810, 0.08510, -0.11850 ] + - [ 5.1497, 1.02490, 0.08520, -0.11920 ] + - [ 5.3801, 1.05150, 0.08530, -0.11990 ] + - [ 5.6201, 1.07790, 0.08530, -0.12060 ] + - [ 5.8499, 1.10410, 0.08540, -0.12120 ] + - [ 6.0802, 1.13020, 0.08560, -0.12180 ] + - [ 6.3197, 1.15600, 0.08570, -0.12240 ] + - [ 6.5501, 1.18180, 0.08580, -0.12300 ] + - [ 6.7901, 1.20760, 0.08590, -0.12350 ] + - [ 7.0199, 1.23340, 0.08600, -0.12400 ] + - [ 7.2502, 1.25890, 0.08610, -0.12450 ] + - [ 7.4903, 1.28410, 0.08620, -0.12500 ] + - [ 7.7200, 1.30880, 0.08640, -0.12540 ] + - [ 7.9601, 1.33310, 0.08650, -0.12570 ] + - [ 8.1899, 1.35700, 0.08670, -0.12590 ] + - [ 8.4202, 1.38100, 0.08690, -0.12620 ] + - [ 8.6603, 1.40540, 0.08700, -0.12650 ] + - [ 8.8900, 1.42950, 0.08710, -0.12670 ] + - [ 9.1198, 1.45310, 0.08730, -0.12700 ] + - [ 9.8801, 1.51540, 0.08790, -0.12650 ] + - [ 10.6398, 1.57490, 0.08860, -0.12560 ] + - [ 11.4001, 1.61510, 0.08950, -0.12140 ] + - [ 12.1501, 1.64430, 0.09120, -0.11630 ] + - [ 12.9099, 1.68240, 0.09300, -0.11330 ] + - [ 13.6702, 1.71460, 0.09540, -0.11070 ] + - [ 14.4202, 1.73620, 0.09890, -0.10800 ] + - [ 15.1799, 1.76270, 0.10240, -0.10630 ] + - [ 15.9403, 1.77060, 0.10760, -0.10420 ] + - [ 16.6903, 1.76390, 0.11440, -0.10250 ] + - [ 17.4500, 1.76040, 0.12110, -0.10130 ] + - [ 18.2097, 1.72510, 0.13100, -0.10010 ] + - [ 18.9701, 1.70350, 0.13990, -0.09980 ] + - [ 19.7201, 1.67840, 0.14920, -0.10010 ] + - [ 20.4798, 1.65050, 0.15910, -0.10160 ] + - [ 21.2401, 1.62270, 0.16910, -0.10360 ] + - [ 21.9901, 1.60670, 0.17780, -0.10640 ] + - [ 22.7499, 1.59720, 0.18580, -0.10990 ] + - [ 23.5102, 1.58920, 0.19370, -0.11360 ] + - [ 24.2602, 1.58150, 0.20140, -0.11800 ] + - [ 25.0199, 1.55630, 0.21350, -0.12490 ] + - [ 25.7802, 1.52720, 0.22670, -0.13250 ] + - [ 26.5302, 1.49820, 0.23990, -0.14000 ] + - [ 27.2900, 1.46910, 0.25310, -0.14760 ] + - [ 28.0497, 1.44010, 0.26630, -0.15510 ] + - [ 28.8100, 1.41100, 0.27950, -0.16270 ] + - [ 29.5600, 1.38200, 0.29270, -0.17030 ] + - [ 30.3198, 1.36220, 0.30780, -0.17400 ] + - [ 31.0801, 1.34240, 0.32300, -0.17770 ] + - [ 31.8301, 1.32250, 0.33810, -0.18150 ] + - [ 32.5898, 1.30270, 0.35320, -0.18520 ] + - [ 33.3502, 1.28290, 0.36840, -0.18890 ] + - [ 34.1002, 1.26310, 0.38350, -0.19260 ] + - [ 34.8599, 1.24330, 0.39870, -0.19640 ] + - [ 35.6202, 1.22340, 0.41380, -0.20010 ] + - [ 36.3800, 1.20360, 0.42890, -0.20390 ] + - [ 37.1300, 1.18380, 0.44410, -0.20760 ] + - [ 37.8903, 1.16400, 0.45920, -0.21130 ] + - [ 38.6500, 1.14420, 0.47430, -0.21500 ] + - [ 39.4000, 1.12430, 0.48950, -0.21880 ] + - [ 40.1598, 1.10640, 0.50520, -0.22180 ] + - [ 40.9201, 1.09050, 0.52140, -0.22420 ] + - [ 41.6701, 1.07450, 0.53760, -0.22660 ] + - [ 42.4298, 1.05860, 0.55380, -0.22890 ] + - [ 43.1901, 1.04260, 0.57010, -0.23130 ] + - [ 43.9401, 1.02670, 0.58630, -0.23370 ] + - [ 44.6999, 1.01070, 0.60250, -0.23610 ] + - [ 45.4602, 0.99480, 0.61880, -0.23840 ] + - [ 46.2199, 0.97880, 0.63500, -0.24080 ] + - [ 46.9699, 0.96280, 0.65120, -0.24320 ] + - [ 47.7302, 0.94690, 0.66750, -0.24550 ] + - [ 48.4900, 0.93090, 0.68370, -0.24790 ] + - [ 49.2400, 0.91500, 0.69990, -0.25030 ] + - [ 49.9997, 0.89900, 0.71610, -0.25270 ] + - [ 60.0001, 0.68360, 0.92460, -0.28330 ] + - [ 70.0000, 0.45560, 1.09850, -0.31560 ] + - [ 79.9998, 0.22190, 1.21820, -0.34820 ] + - [ 90.0002, 0.00000, 1.27070, -0.37730 ] + - [ 100.0000, -0.15530, 1.21820, -0.38770 ] + - [ 109.9999, -0.31890, 1.09850, -0.38650 ] + - [ 120.0003, -0.47840, 0.92460, -0.38060 ] + - [ 130.0001, -0.62930, 0.71610, -0.38030 ] + - [ 139.9999, -0.78010, 0.49700, -0.40320 ] + - [ 149.9998, -0.96740, 0.29270, -0.48540 ] + - [ 160.0002, -0.88370, 0.12680, -0.53250 ] + - [ 170.0000, -0.44180, 0.08440, -0.39060 ] + - [ 179.9660, 0.00000, 0.08440, 0.00000 ] + - name : FFA-W3-211 # + relative_thickness : 0.211 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.02464, 0.00000 ] + - [ -177.7143, 0.05403, 0.02534, 0.09143 ] + - [ -175.4286, 0.10805, 0.02742, 0.18286 ] + - [ -173.1429, 0.16208, 0.03088, 0.27429 ] + - [ -170.8572, 0.21610, 0.03570, 0.36571 ] + - [ -168.5716, 0.27013, 0.05599, 0.39192 ] + - [ -166.2857, 0.32415, 0.08143, 0.37898 ] + - [ -164.0000, 0.37818, 0.11112, 0.36605 ] + - [ -161.7145, 0.43220, 0.14485, 0.35312 ] + - [ -159.4284, 0.48623, 0.18242, 0.34768 ] + - [ -157.1428, 0.54025, 0.22359, 0.36471 ] + - [ -154.8573, 0.59428, 0.26810, 0.38175 ] + - [ -152.5714, 0.64830, 0.31566, 0.39878 ] + - [ -150.2857, 0.70233, 0.36597, 0.41581 ] + - [ -148.0000, 0.75635, 0.41871, 0.41955 ] + - [ -143.8571, 0.73188, 0.51941, 0.42287 ] + - [ -139.7143, 0.70655, 0.62488, 0.42632 ] + - [ -135.5714, 0.67760, 0.73293, 0.43163 ] + - [ -131.4286, 0.64333, 0.84130, 0.43694 ] + - [ -127.2857, 0.60277, 0.94773, 0.44389 ] + - [ -123.1429, 0.55550, 1.05001, 0.45171 ] + - [ -119.0000, 0.50156, 1.14600, 0.45897 ] + - [ -114.8571, 0.44131, 1.23371, 0.46448 ] + - [ -110.7143, 0.37542, 1.31129, 0.46998 ] + - [ -106.5714, 0.30482, 1.37714, 0.47096 ] + - [ -102.4286, 0.23063, 1.42988, 0.47101 ] + - [ -98.2857, 0.15413, 1.46842, 0.46824 ] + - [ -94.1429, 0.07675, 1.49196, 0.46149 ] + - [ -90.0000, 0.00000, 1.50000, 0.45474 ] + - [ -85.8571, -0.07675, 1.49196, 0.44026 ] + - [ -81.7143, -0.15413, 1.46842, 0.42578 ] + - [ -77.5714, -0.23063, 1.42988, 0.40821 ] + - [ -73.4286, -0.30482, 1.37714, 0.38846 ] + - [ -69.2857, -0.37542, 1.31129, 0.36815 ] + - [ -65.1429, -0.44131, 1.23371, 0.34519 ] + - [ -61.0000, -0.50156, 1.14600, 0.32223 ] + - [ -56.8571, -0.55550, 1.05001, 0.29864 ] + - [ -52.7143, -0.60277, 0.94773, 0.27486 ] + - [ -48.5714, -0.64333, 0.84130, 0.25128 ] + - [ -44.4286, -0.67760, 0.73293, 0.22810 ] + - [ -40.2857, -0.70655, 0.62488, 0.20491 ] + - [ -36.1429, -0.73188, 0.51941, 0.15416 ] + - [ -32.0000, -0.75635, 0.41871, 0.10137 ] + - [ -28.0000, -0.85636, 0.28691, 0.06527 ] + - [ -24.0000, -1.18292, 0.13960, 0.01647 ] + - [ -20.0000, -1.23596, 0.08345, -0.00352 ] + - [ -18.0000, -1.22536, 0.06509, -0.00672 ] + - [ -16.0000, -1.20476, 0.04888, -0.00881 ] + - [ -14.0000, -1.18332, 0.03417, -0.01101 ] + - [ -12.0000, -1.10093, 0.02132, -0.02269 ] + - [ -10.0000, -0.88209, 0.01386, -0.04397 ] + - [ -8.0000, -0.62981, 0.01075, -0.05756 ] + - [ -6.0000, -0.37670, 0.00882, -0.06747 ] + - [ -4.0000, -0.12177, 0.00702, -0.07680 ] + - [ -2.0000, 0.12810, 0.00663, -0.08283 ] + - [ -1.0000, 0.25192, 0.00664, -0.08534 ] + - [ 0.0000, 0.37535, 0.00670, -0.08777 ] + - [ 1.0000, 0.49828, 0.00681, -0.09011 ] + - [ 2.0000, 0.62052, 0.00698, -0.09234 ] + - [ 3.0000, 0.74200, 0.00720, -0.09447 ] + - [ 4.0000, 0.86238, 0.00751, -0.09646 ] + - [ 5.0000, 0.98114, 0.00796, -0.09828 ] + - [ 6.0000, 1.09662, 0.00872, -0.09977 ] + - [ 7.0000, 1.20904, 0.00968, -0.10095 ] + - [ 8.0000, 1.31680, 0.01097, -0.10163 ] + - [ 9.0000, 1.42209, 0.01227, -0.10207 ] + - [ 10.0000, 1.52361, 0.01369, -0.10213 ] + - [ 11.0000, 1.61988, 0.01529, -0.10174 ] + - [ 12.0000, 1.70937, 0.01717, -0.10087 ] + - [ 13.0000, 1.78681, 0.01974, -0.09936 ] + - [ 14.0000, 1.84290, 0.02368, -0.09720 ] + - [ 15.0000, 1.85313, 0.03094, -0.09410 ] + - [ 16.0000, 1.80951, 0.04303, -0.09144 ] + - [ 18.0000, 1.66033, 0.07730, -0.09242 ] + - [ 20.0000, 1.56152, 0.11202, -0.09871 ] + - [ 24.0000, 1.43327, 0.18408, -0.11770 ] + - [ 28.0000, 1.29062, 0.27589, -0.14566 ] + - [ 32.0000, 1.08050, 0.41871, -0.18266 ] + - [ 36.1429, 1.04554, 0.51941, -0.20913 ] + - [ 40.2857, 1.00936, 0.62488, -0.23534 ] + - [ 44.4286, 0.96801, 0.73293, -0.25784 ] + - [ 48.5714, 0.91904, 0.84130, -0.28035 ] + - [ 52.7143, 0.86109, 0.94773, -0.30163 ] + - [ 56.8571, 0.79357, 1.05001, -0.32226 ] + - [ 61.0000, 0.71651, 1.14600, -0.34247 ] + - [ 65.1429, 0.63044, 1.23371, -0.36135 ] + - [ 69.2857, 0.53632, 1.31129, -0.38024 ] + - [ 73.4286, 0.43546, 1.37714, -0.39704 ] + - [ 77.5714, 0.32947, 1.42988, -0.41341 ] + - [ 81.7143, 0.22019, 1.46842, -0.42844 ] + - [ 85.8571, 0.10965, 1.49196, -0.44159 ] + - [ 90.0000, 0.00000, 1.50000, -0.45474 ] + - [ 94.1429, -0.07675, 1.49196, -0.46149 ] + - [ 98.2857, -0.15413, 1.46842, -0.46824 ] + - [ 102.4286, -0.23063, 1.42988, -0.47101 ] + - [ 106.5714, -0.30482, 1.37714, -0.47096 ] + - [ 110.7143, -0.37542, 1.31129, -0.46998 ] + - [ 114.8571, -0.44131, 1.23371, -0.46448 ] + - [ 119.0000, -0.50156, 1.14600, -0.45897 ] + - [ 123.1429, -0.55550, 1.05001, -0.45171 ] + - [ 127.2857, -0.60277, 0.94773, -0.44389 ] + - [ 131.4286, -0.64333, 0.84130, -0.43694 ] + - [ 135.5714, -0.67760, 0.73293, -0.43163 ] + - [ 139.7143, -0.70655, 0.62488, -0.42632 ] + - [ 143.8571, -0.73188, 0.51941, -0.42287 ] + - [ 148.0000, -0.75635, 0.41871, -0.41955 ] + - [ 150.2857, -0.70233, 0.36597, -0.41581 ] + - [ 152.5714, -0.64830, 0.31566, -0.39878 ] + - [ 154.8571, -0.59428, 0.26810, -0.38175 ] + - [ 157.1429, -0.54025, 0.22359, -0.36471 ] + - [ 159.4286, -0.48623, 0.18242, -0.34768 ] + - [ 161.7143, -0.43220, 0.14485, -0.37026 ] + - [ 164.0000, -0.37818, 0.11112, -0.40605 ] + - [ 166.2857, -0.32415, 0.08143, -0.44184 ] + - [ 168.5714, -0.27013, 0.05599, -0.47763 ] + - [ 170.8571, -0.21610, 0.03570, -0.45714 ] + - [ 173.1429, -0.16208, 0.03088, -0.34286 ] + - [ 175.4286, -0.10805, 0.02742, -0.22857 ] + - [ 177.7143, -0.05403, 0.02534, -0.11429 ] + - [ 179.9087, 0.00000, 0.02464, 0.00000 ] + - name : FFA-W3-241 # + relative_thickness : 0.241 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.01178, 0.00000 ] + - [ -177.7143, 0.05818, 0.01248, 0.09143 ] + - [ -175.4286, 0.11636, 0.01460, 0.18286 ] + - [ -173.1429, 0.17453, 0.01811, 0.27429 ] + - [ -170.8572, 0.23271, 0.02300, 0.36571 ] + - [ -168.5716, 0.29089, 0.02922, 0.39568 ] + - [ -166.2857, 0.34907, 0.05382, 0.38876 ] + - [ -164.0000, 0.40725, 0.08379, 0.38184 ] + - [ -161.7145, 0.46542, 0.11786, 0.37492 ] + - [ -159.4284, 0.52360, 0.15581, 0.37408 ] + - [ -157.1428, 0.58178, 0.19740, 0.39148 ] + - [ -154.8573, 0.63996, 0.24237, 0.40888 ] + - [ -152.5714, 0.69814, 0.29043, 0.42628 ] + - [ -150.2857, 0.75631, 0.34128, 0.44368 ] + - [ -148.0000, 0.81449, 0.39460, 0.44537 ] + - [ -143.8571, 0.77925, 0.49645, 0.44436 ] + - [ -139.7143, 0.74511, 0.60319, 0.44360 ] + - [ -135.5714, 0.70881, 0.71263, 0.44609 ] + - [ -131.4286, 0.66835, 0.82249, 0.44858 ] + - [ -127.2857, 0.62253, 0.93051, 0.45370 ] + - [ -123.1429, 0.57080, 1.03447, 0.46020 ] + - [ -119.0000, 0.51307, 1.13222, 0.46633 ] + - [ -114.8571, 0.44965, 1.22176, 0.47130 ] + - [ -110.7143, 0.38115, 1.30123, 0.47627 ] + - [ -106.5714, 0.30846, 1.36903, 0.47705 ] + - [ -102.4286, 0.23266, 1.42376, 0.47695 ] + - [ -98.2857, 0.15503, 1.46433, 0.47409 ] + - [ -94.1429, 0.07698, 1.48990, 0.46732 ] + - [ -90.0000, 0.00000, 1.50000, 0.46055 ] + - [ -85.8571, -0.07698, 1.48990, 0.44509 ] + - [ -81.7143, -0.15503, 1.46433, 0.42964 ] + - [ -77.5714, -0.23266, 1.42376, 0.41125 ] + - [ -73.4286, -0.30846, 1.36903, 0.39081 ] + - [ -69.2857, -0.38115, 1.30123, 0.36988 ] + - [ -65.1429, -0.44965, 1.22176, 0.34663 ] + - [ -61.0000, -0.51307, 1.13222, 0.32339 ] + - [ -56.8571, -0.57080, 1.03447, 0.29984 ] + - [ -52.7143, -0.62253, 0.93051, 0.27618 ] + - [ -48.5714, -0.66835, 0.82249, 0.25280 ] + - [ -44.4286, -0.70881, 0.71263, 0.22992 ] + - [ -40.2857, -0.74511, 0.60319, 0.20705 ] + - [ -36.1429, -0.77925, 0.49645, 0.14561 ] + - [ -32.0000, -0.81449, 0.39460, 0.08131 ] + - [ -28.0000, -1.07781, 0.22252, 0.04592 ] + - [ -24.0000, -1.12692, 0.15159, 0.01901 ] + - [ -20.0000, -1.14480, 0.09699, 0.00063 ] + - [ -18.0000, -1.12797, 0.07744, -0.00342 ] + - [ -16.0000, -1.09392, 0.06122, -0.00587 ] + - [ -14.0000, -1.05961, 0.04667, -0.00652 ] + - [ -12.0000, -1.03121, 0.03302, -0.00755 ] + - [ -10.0000, -0.93706, 0.02027, -0.02243 ] + - [ -8.0000, -0.67380, 0.01168, -0.05583 ] + - [ -6.0000, -0.40391, 0.00918, -0.07159 ] + - [ -4.0000, -0.14226, 0.00839, -0.08123 ] + - [ -2.0000, 0.11580, 0.00810, -0.08892 ] + - [ -1.0000, 0.24382, 0.00808, -0.09235 ] + - [ 0.0000, 0.37113, 0.00813, -0.09556 ] + - [ 1.0000, 0.49766, 0.00824, -0.09857 ] + - [ 2.0000, 0.62334, 0.00842, -0.10139 ] + - [ 3.0000, 0.74798, 0.00867, -0.10403 ] + - [ 4.0000, 0.87137, 0.00901, -0.10645 ] + - [ 5.0000, 0.99320, 0.00945, -0.10863 ] + - [ 6.0000, 1.11325, 0.00998, -0.11057 ] + - [ 7.0000, 1.23037, 0.01070, -0.11214 ] + - [ 8.0000, 1.34496, 0.01153, -0.11337 ] + - [ 9.0000, 1.45407, 0.01269, -0.11396 ] + - [ 10.0000, 1.55911, 0.01396, -0.11403 ] + - [ 11.0000, 1.65779, 0.01545, -0.11336 ] + - [ 12.0000, 1.74834, 0.01724, -0.11187 ] + - [ 13.0000, 1.82666, 0.01961, -0.10935 ] + - [ 14.0000, 1.88831, 0.02293, -0.10606 ] + - [ 15.0000, 1.92579, 0.02795, -0.10238 ] + - [ 16.0000, 1.92722, 0.03609, -0.09887 ] + - [ 18.0000, 1.80055, 0.06534, -0.09497 ] + - [ 20.0000, 1.63088, 0.10459, -0.09996 ] + - [ 24.0000, 1.43345, 0.19148, -0.12589 ] + - [ 28.0000, 1.28805, 0.28629, -0.15453 ] + - [ 32.0000, 1.16356, 0.39460, -0.18396 ] + - [ 36.1429, 1.11321, 0.49645, -0.21099 ] + - [ 40.2857, 1.06444, 0.60319, -0.23768 ] + - [ 44.4286, 1.01259, 0.71263, -0.25992 ] + - [ 48.5714, 0.95478, 0.82249, -0.28216 ] + - [ 52.7143, 0.88932, 0.93051, -0.30323 ] + - [ 56.8571, 0.81542, 1.03447, -0.32368 ] + - [ 61.0000, 0.73296, 1.13222, -0.34380 ] + - [ 65.1429, 0.64236, 1.22176, -0.36292 ] + - [ 69.2857, 0.54450, 1.30123, -0.38204 ] + - [ 73.4286, 0.44065, 1.36903, -0.39944 ] + - [ 77.5714, 0.33237, 1.42376, -0.41648 ] + - [ 81.7143, 0.22148, 1.46433, -0.43231 ] + - [ 85.8571, 0.10997, 1.48990, -0.44643 ] + - [ 90.0000, 0.00000, 1.50000, -0.46055 ] + - [ 94.1429, -0.07698, 1.48990, -0.46732 ] + - [ 98.2857, -0.15503, 1.46433, -0.47409 ] + - [ 102.4286, -0.23266, 1.42376, -0.47695 ] + - [ 106.5714, -0.30846, 1.36903, -0.47705 ] + - [ 110.7143, -0.38115, 1.30123, -0.47627 ] + - [ 114.8571, -0.44965, 1.22176, -0.47130 ] + - [ 119.0000, -0.51307, 1.13222, -0.46633 ] + - [ 123.1429, -0.57080, 1.03447, -0.46020 ] + - [ 127.2857, -0.62253, 0.93051, -0.45370 ] + - [ 131.4286, -0.66835, 0.82249, -0.44858 ] + - [ 135.5714, -0.70881, 0.71263, -0.44609 ] + - [ 139.7143, -0.74511, 0.60319, -0.44360 ] + - [ 143.8571, -0.77925, 0.49645, -0.44436 ] + - [ 148.0000, -0.81449, 0.39460, -0.44537 ] + - [ 150.2857, -0.75631, 0.34128, -0.44368 ] + - [ 152.5714, -0.69814, 0.29043, -0.42628 ] + - [ 154.8571, -0.63996, 0.24237, -0.40888 ] + - [ 157.1429, -0.58178, 0.19740, -0.39148 ] + - [ 159.4286, -0.52360, 0.15581, -0.37408 ] + - [ 161.7143, -0.46542, 0.11786, -0.39207 ] + - [ 164.0000, -0.40725, 0.08379, -0.42184 ] + - [ 166.2857, -0.34907, 0.05382, -0.45162 ] + - [ 168.5714, -0.29089, 0.02922, -0.48139 ] + - [ 170.8571, -0.23271, 0.02300, -0.45714 ] + - [ 173.1429, -0.17453, 0.01811, -0.34286 ] + - [ 175.4286, -0.11636, 0.01460, -0.22857 ] + - [ 177.7143, -0.05818, 0.01248, -0.11429 ] + - [ 179.9087, 0.00000, 0.01178, 0.00000 ] + - name : FFA-W3-270blend # + relative_thickness : 0.27 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.01545, 0.00000 ] + - [ -177.7143, 0.06213, 0.01611, 0.09143 ] + - [ -175.4286, 0.12426, 0.01807, 0.18286 ] + - [ -173.1429, 0.18639, 0.02133, 0.27429 ] + - [ -170.8572, 0.24852, 0.02587, 0.36571 ] + - [ -168.5716, 0.31064, 0.03289, 0.39874 ] + - [ -166.2857, 0.37277, 0.05681, 0.39672 ] + - [ -164.0000, 0.43490, 0.08471, 0.39470 ] + - [ -161.7145, 0.49703, 0.11643, 0.39268 ] + - [ -159.4284, 0.55916, 0.15176, 0.39544 ] + - [ -157.1428, 0.62129, 0.19048, 0.41254 ] + - [ -154.8573, 0.68342, 0.23234, 0.42964 ] + - [ -152.5714, 0.74555, 0.27708, 0.44674 ] + - [ -150.2857, 0.80768, 0.32441, 0.46384 ] + - [ -148.0000, 0.86981, 0.37404, 0.46186 ] + - [ -143.8571, 0.81660, 0.46882, 0.45335 ] + - [ -139.7143, 0.76812, 0.56814, 0.44523 ] + - [ -135.5714, 0.72040, 0.66995, 0.44237 ] + - [ -131.4286, 0.67095, 0.77214, 0.43951 ] + - [ -127.2857, 0.61828, 0.87258, 0.44072 ] + - [ -123.1429, 0.56158, 0.96921, 0.44407 ] + - [ -119.0000, 0.50057, 1.06002, 0.44739 ] + - [ -114.8571, 0.43540, 1.14315, 0.45063 ] + - [ -110.7143, 0.36655, 1.21688, 0.45387 ] + - [ -106.5714, 0.29475, 1.27969, 0.45377 ] + - [ -102.4286, 0.22098, 1.33030, 0.45298 ] + - [ -98.2857, 0.14639, 1.36768, 0.44973 ] + - [ -94.1429, 0.07227, 1.39107, 0.44302 ] + - [ -90.0000, 0.00000, 1.40000, 0.43630 ] + - [ -85.8571, -0.07227, 1.39107, 0.42180 ] + - [ -81.7143, -0.14639, 1.36768, 0.40730 ] + - [ -77.5714, -0.22098, 1.33030, 0.39020 ] + - [ -73.4286, -0.29475, 1.27969, 0.37125 ] + - [ -69.2857, -0.36655, 1.21688, 0.35190 ] + - [ -65.1429, -0.43540, 1.14315, 0.33068 ] + - [ -61.0000, -0.50057, 1.06002, 0.30945 ] + - [ -56.8571, -0.56158, 0.96921, 0.28815 ] + - [ -52.7143, -0.61828, 0.87258, 0.26684 ] + - [ -48.5714, -0.67095, 0.77214, 0.24576 ] + - [ -44.4286, -0.72040, 0.66995, 0.22512 ] + - [ -40.2857, -0.76812, 0.56814, 0.20447 ] + - [ -36.1429, -0.81660, 0.46882, 0.13957 ] + - [ -32.0000, -0.86981, 0.37404, 0.07138 ] + - [ -28.0000, -1.09837, 0.21880, 0.04400 ] + - [ -24.0000, -1.08339, 0.15982, 0.02166 ] + - [ -20.0000, -1.06990, 0.10744, 0.00422 ] + - [ -18.0000, -1.05454, 0.08690, -0.00035 ] + - [ -16.0000, -1.03432, 0.06844, -0.00334 ] + - [ -14.0000, -1.08360, 0.04733, -0.00283 ] + - [ -12.0000, -1.09489, 0.03085, -0.00556 ] + - [ -10.0000, -0.92665, 0.01984, -0.02952 ] + - [ -8.0000, -0.69676, 0.01439, -0.04822 ] + - [ -6.0000, -0.43628, 0.01155, -0.06483 ] + - [ -4.0000, -0.16252, 0.01026, -0.07919 ] + - [ -2.0000, 0.10709, 0.00976, -0.09041 ] + - [ -1.0000, 0.23993, 0.00967, -0.09517 ] + - [ 0.0000, 0.37158, 0.00968, -0.09953 ] + - [ 1.0000, 0.50210, 0.00976, -0.10355 ] + - [ 2.0000, 0.63139, 0.00993, -0.10725 ] + - [ 3.0000, 0.75951, 0.01016, -0.11068 ] + - [ 4.0000, 0.88638, 0.01045, -0.11385 ] + - [ 5.0000, 1.01172, 0.01082, -0.11673 ] + - [ 6.0000, 1.13430, 0.01140, -0.11923 ] + - [ 7.0000, 1.25536, 0.01198, -0.12145 ] + - [ 8.0000, 1.37379, 0.01267, -0.12328 ] + - [ 9.0000, 1.48841, 0.01353, -0.12460 ] + - [ 10.0000, 1.59782, 0.01460, -0.12526 ] + - [ 11.0000, 1.70005, 0.01597, -0.12505 ] + - [ 12.0000, 1.79190, 0.01777, -0.12370 ] + - [ 13.0000, 1.86782, 0.02035, -0.12093 ] + - [ 14.0000, 1.92687, 0.02385, -0.11725 ] + - [ 15.0000, 1.90901, 0.03236, -0.10931 ] + - [ 16.0000, 1.88548, 0.04259, -0.10525 ] + - [ 18.0000, 1.72106, 0.07672, -0.10292 ] + - [ 20.0000, 1.54737, 0.11914, -0.11017 ] + - [ 24.0000, 1.37176, 0.20189, -0.13431 ] + - [ 28.0000, 1.33611, 0.27981, -0.15777 ] + - [ 32.0000, 1.24258, 0.37404, -0.18432 ] + - [ 36.1429, 1.16657, 0.46882, -0.21002 ] + - [ 40.2857, 1.09731, 0.56814, -0.23531 ] + - [ 44.4286, 1.02914, 0.66995, -0.25508 ] + - [ 48.5714, 0.95850, 0.77214, -0.27485 ] + - [ 52.7143, 0.88325, 0.87258, -0.29346 ] + - [ 56.8571, 0.80225, 0.96921, -0.31145 ] + - [ 61.0000, 0.71510, 1.06002, -0.32925 ] + - [ 65.1429, 0.62200, 1.14315, -0.34641 ] + - [ 69.2857, 0.52364, 1.21688, -0.36357 ] + - [ 73.4286, 0.42107, 1.27969, -0.37949 ] + - [ 77.5714, 0.31569, 1.33030, -0.39517 ] + - [ 81.7143, 0.20913, 1.36768, -0.40983 ] + - [ 85.8571, 0.10324, 1.39107, -0.42306 ] + - [ 90.0000, 0.00000, 1.40000, -0.43630 ] + - [ 94.1429, -0.07227, 1.39107, -0.44302 ] + - [ 98.2857, -0.14639, 1.36768, -0.44973 ] + - [ 102.4286, -0.22098, 1.33030, -0.45298 ] + - [ 106.5714, -0.29475, 1.27969, -0.45377 ] + - [ 110.7143, -0.36655, 1.21688, -0.45387 ] + - [ 114.8571, -0.43540, 1.14315, -0.45063 ] + - [ 119.0000, -0.50057, 1.06002, -0.44739 ] + - [ 123.1429, -0.56158, 0.96921, -0.44407 ] + - [ 127.2857, -0.61828, 0.87258, -0.44072 ] + - [ 131.4286, -0.67095, 0.77214, -0.43951 ] + - [ 135.5714, -0.72040, 0.66995, -0.44237 ] + - [ 139.7143, -0.76812, 0.56814, -0.44523 ] + - [ 143.8571, -0.81660, 0.46882, -0.45335 ] + - [ 148.0000, -0.86981, 0.37404, -0.46186 ] + - [ 150.2857, -0.80768, 0.32441, -0.46384 ] + - [ 152.5714, -0.74555, 0.27708, -0.44674 ] + - [ 154.8571, -0.68342, 0.23234, -0.42964 ] + - [ 157.1429, -0.62129, 0.19048, -0.41254 ] + - [ 159.4286, -0.55916, 0.15176, -0.39544 ] + - [ 161.7143, -0.49703, 0.11643, -0.40982 ] + - [ 164.0000, -0.43490, 0.08471, -0.43470 ] + - [ 166.2857, -0.37277, 0.05681, -0.45958 ] + - [ 168.5714, -0.31064, 0.03289, -0.48445 ] + - [ 170.8571, -0.24852, 0.02587, -0.45714 ] + - [ 173.1429, -0.18639, 0.02133, -0.34286 ] + - [ 175.4286, -0.12426, 0.01807, -0.22857 ] + - [ 177.7143, -0.06213, 0.01611, -0.11429 ] + - [ 179.9087, 0.00000, 0.01545, 0.00000 ] + - name : FFA-W3-301 # + relative_thickness : 0.301 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.02454, 0.00000 ] + - [ -177.7143, 0.06508, 0.02514, 0.09143 ] + - [ -175.4286, 0.13016, 0.02694, 0.18286 ] + - [ -173.1429, 0.19525, 0.02993, 0.27429 ] + - [ -170.8572, 0.26033, 0.03408, 0.36571 ] + - [ -168.5716, 0.32541, 0.03938, 0.40085 ] + - [ -166.2857, 0.39049, 0.05910, 0.40220 ] + - [ -164.0000, 0.45557, 0.08495, 0.40356 ] + - [ -161.7145, 0.52066, 0.11433, 0.40492 ] + - [ -159.4284, 0.58574, 0.14704, 0.41010 ] + - [ -157.1428, 0.65082, 0.18290, 0.42678 ] + - [ -154.8573, 0.71590, 0.22166, 0.44345 ] + - [ -152.5714, 0.78098, 0.26309, 0.46013 ] + - [ -150.2857, 0.84607, 0.30692, 0.47680 ] + - [ -148.0000, 0.91115, 0.35287, 0.47162 ] + - [ -143.8571, 0.84257, 0.44061, 0.45656 ] + - [ -139.7143, 0.78187, 0.53255, 0.44202 ] + - [ -135.5714, 0.72448, 0.62677, 0.43452 ] + - [ -131.4286, 0.66755, 0.72131, 0.42701 ] + - [ -127.2857, 0.60928, 0.81421, 0.42483 ] + - [ -123.1429, 0.54868, 0.90355, 0.42544 ] + - [ -119.0000, 0.48530, 0.98748, 0.42634 ] + - [ -114.8571, 0.41915, 1.06425, 0.42813 ] + - [ -110.7143, 0.35056, 1.13227, 0.42992 ] + - [ -106.5714, 0.28017, 1.19015, 0.42916 ] + - [ -102.4286, 0.20881, 1.23669, 0.42788 ] + - [ -98.2857, 0.13754, 1.27093, 0.42444 ] + - [ -94.1429, 0.06751, 1.29218, 0.41794 ] + - [ -90.0000, 0.00000, 1.30000, 0.41144 ] + - [ -85.8571, -0.06751, 1.29218, 0.39804 ] + - [ -81.7143, -0.13754, 1.27093, 0.38464 ] + - [ -77.5714, -0.20881, 1.23669, 0.36892 ] + - [ -73.4286, -0.28017, 1.19015, 0.35157 ] + - [ -69.2857, -0.35056, 1.13227, 0.33391 ] + - [ -65.1429, -0.41915, 1.06425, 0.31474 ] + - [ -61.0000, -0.48530, 0.98748, 0.29557 ] + - [ -56.8571, -0.54868, 0.90355, 0.27653 ] + - [ -52.7143, -0.60928, 0.81421, 0.25754 ] + - [ -48.5714, -0.66755, 0.72131, 0.23873 ] + - [ -44.4286, -0.72448, 0.62677, 0.22027 ] + - [ -40.2857, -0.78187, 0.53255, 0.20181 ] + - [ -36.1429, -0.84257, 0.44061, 0.13644 ] + - [ -32.0000, -0.91115, 0.35287, 0.06760 ] + - [ -28.0000, -1.10349, 0.21721, 0.04231 ] + - [ -24.0000, -1.10737, 0.15629, 0.02026 ] + - [ -20.0000, -1.11815, 0.10335, 0.00407 ] + - [ -18.0000, -1.12332, 0.08180, 0.00017 ] + - [ -16.0000, -1.11865, 0.06331, -0.00167 ] + - [ -14.0000, -1.11620, 0.04718, -0.00120 ] + - [ -12.0000, -1.09588, 0.03280, -0.00463 ] + - [ -10.0000, -0.91767, 0.02351, -0.02494 ] + - [ -8.0000, -0.69311, 0.01793, -0.04304 ] + - [ -6.0000, -0.45396, 0.01431, -0.05868 ] + - [ -4.0000, -0.17779, 0.01242, -0.07601 ] + - [ -2.0000, 0.10480, 0.01160, -0.09121 ] + - [ -1.0000, 0.24383, 0.01143, -0.09763 ] + - [ 0.0000, 0.38111, 0.01138, -0.10341 ] + - [ 1.0000, 0.51660, 0.01143, -0.10861 ] + - [ 2.0000, 0.65044, 0.01156, -0.11333 ] + - [ 3.0000, 0.78267, 0.01177, -0.11762 ] + - [ 4.0000, 0.91326, 0.01204, -0.12154 ] + - [ 5.0000, 1.04207, 0.01239, -0.12510 ] + - [ 6.0000, 1.16873, 0.01283, -0.12828 ] + - [ 7.0000, 1.29296, 0.01338, -0.13104 ] + - [ 8.0000, 1.41390, 0.01406, -0.13332 ] + - [ 9.0000, 1.53088, 0.01488, -0.13503 ] + - [ 10.0000, 1.64208, 0.01592, -0.13599 ] + - [ 11.0000, 1.74568, 0.01726, -0.13605 ] + - [ 12.0000, 1.83887, 0.01908, -0.13514 ] + - [ 13.0000, 1.91764, 0.02169, -0.13322 ] + - [ 14.0000, 1.97413, 0.02572, -0.13020 ] + - [ 15.0000, 1.99916, 0.03222, -0.12641 ] + - [ 16.0000, 1.99377, 0.04157, -0.12265 ] + - [ 18.0000, 1.91720, 0.06731, -0.11675 ] + - [ 20.0000, 1.73683, 0.10526, -0.11652 ] + - [ 24.0000, 1.47321, 0.19229, -0.13790 ] + - [ 28.0000, 1.36017, 0.27449, -0.16242 ] + - [ 32.0000, 1.30164, 0.35287, -0.18463 ] + - [ 36.1429, 1.20367, 0.44061, -0.20894 ] + - [ 40.2857, 1.11695, 0.53255, -0.23276 ] + - [ 44.4286, 1.03498, 0.62677, -0.25011 ] + - [ 48.5714, 0.95364, 0.72131, -0.26746 ] + - [ 52.7143, 0.87040, 0.81421, -0.28365 ] + - [ 56.8571, 0.78383, 0.90355, -0.29923 ] + - [ 61.0000, 0.69329, 0.98748, -0.31472 ] + - [ 65.1429, 0.59878, 1.06425, -0.32988 ] + - [ 69.2857, 0.50080, 1.13227, -0.34505 ] + - [ 73.4286, 0.40024, 1.19015, -0.35942 ] + - [ 77.5714, 0.29831, 1.23669, -0.37363 ] + - [ 81.7143, 0.19648, 1.27093, -0.38702 ] + - [ 85.8571, 0.09644, 1.29218, -0.39923 ] + - [ 90.0000, 0.00000, 1.30000, -0.41144 ] + - [ 94.1429, -0.06751, 1.29218, -0.41794 ] + - [ 98.2857, -0.13754, 1.27093, -0.42444 ] + - [ 102.4286, -0.20881, 1.23669, -0.42788 ] + - [ 106.5714, -0.28017, 1.19015, -0.42916 ] + - [ 110.7143, -0.35056, 1.13227, -0.42992 ] + - [ 114.8571, -0.41915, 1.06425, -0.42813 ] + - [ 119.0000, -0.48530, 0.98748, -0.42634 ] + - [ 123.1429, -0.54868, 0.90355, -0.42544 ] + - [ 127.2857, -0.60928, 0.81421, -0.42483 ] + - [ 131.4286, -0.66755, 0.72131, -0.42701 ] + - [ 135.5714, -0.72448, 0.62677, -0.43452 ] + - [ 139.7143, -0.78187, 0.53255, -0.44202 ] + - [ 143.8571, -0.84257, 0.44061, -0.45656 ] + - [ 148.0000, -0.91115, 0.35287, -0.47162 ] + - [ 150.2857, -0.84607, 0.30692, -0.47680 ] + - [ 152.5714, -0.78098, 0.26309, -0.46013 ] + - [ 154.8571, -0.71590, 0.22166, -0.44345 ] + - [ 157.1429, -0.65082, 0.18290, -0.42678 ] + - [ 159.4286, -0.58574, 0.14704, -0.41010 ] + - [ 161.7143, -0.52066, 0.11433, -0.42206 ] + - [ 164.0000, -0.45557, 0.08495, -0.44356 ] + - [ 166.2857, -0.39049, 0.05910, -0.46506 ] + - [ 168.5714, -0.32541, 0.03938, -0.48656 ] + - [ 170.8571, -0.26033, 0.03408, -0.45714 ] + - [ 173.1429, -0.19525, 0.02993, -0.34286 ] + - [ 175.4286, -0.13016, 0.02694, -0.22857 ] + - [ 177.7143, -0.06508, 0.02514, -0.11429 ] + - [ 179.9087, 0.00000, 0.02454, 0.00000 ] + - name : FFA-W3-330blend # + relative_thickness : 0.33 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.03169, 0.00000 ] + - [ -177.7143, 0.06960, 0.03228, 0.09143 ] + - [ -175.4286, 0.13920, 0.03406, 0.18286 ] + - [ -173.1429, 0.20880, 0.03702, 0.27429 ] + - [ -170.8572, 0.27841, 0.04114, 0.36571 ] + - [ -168.5716, 0.34801, 0.04638, 0.40308 ] + - [ -166.2857, 0.41761, 0.05732, 0.40801 ] + - [ -164.0000, 0.48721, 0.08319, 0.41294 ] + - [ -161.7145, 0.55681, 0.11258, 0.41788 ] + - [ -159.4284, 0.62641, 0.14533, 0.42586 ] + - [ -157.1428, 0.69601, 0.18121, 0.44302 ] + - [ -154.8573, 0.76562, 0.22000, 0.46017 ] + - [ -152.5714, 0.83522, 0.26146, 0.47732 ] + - [ -150.2857, 0.90482, 0.30532, 0.49447 ] + - [ -148.0000, 0.97442, 0.35131, 0.48743 ] + - [ -143.8571, 0.89412, 0.43913, 0.46839 ] + - [ -139.7143, 0.82382, 0.53115, 0.44996 ] + - [ -135.5714, 0.75845, 0.62546, 0.43985 ] + - [ -131.4286, 0.69477, 0.72010, 0.42974 ] + - [ -127.2857, 0.63079, 0.81310, 0.42589 ] + - [ -123.1429, 0.56532, 0.90255, 0.42535 ] + - [ -119.0000, 0.49783, 0.98659, 0.42528 ] + - [ -114.8571, 0.42823, 1.06348, 0.42673 ] + - [ -110.7143, 0.35680, 1.13162, 0.42817 ] + - [ -106.5714, 0.28412, 1.18963, 0.42745 ] + - [ -102.4286, 0.21103, 1.23629, 0.42628 ] + - [ -98.2857, 0.13851, 1.27067, 0.42303 ] + - [ -94.1429, 0.06775, 1.29204, 0.41683 ] + - [ -90.0000, 0.00000, 1.30000, 0.41063 ] + - [ -85.8571, -0.06775, 1.29204, 0.39752 ] + - [ -81.7143, -0.13851, 1.27067, 0.38441 ] + - [ -77.5714, -0.21103, 1.23629, 0.36905 ] + - [ -73.4286, -0.28412, 1.18963, 0.35212 ] + - [ -69.2857, -0.35680, 1.13162, 0.33491 ] + - [ -65.1429, -0.42823, 1.06348, 0.31634 ] + - [ -61.0000, -0.49783, 0.98659, 0.29777 ] + - [ -56.8571, -0.56532, 0.90255, 0.27947 ] + - [ -52.7143, -0.63079, 0.81310, 0.26125 ] + - [ -48.5714, -0.69477, 0.72010, 0.24322 ] + - [ -44.4286, -0.75845, 0.62546, 0.22556 ] + - [ -40.2857, -0.82382, 0.53115, 0.20789 ] + - [ -36.1429, -0.89412, 0.43913, 0.13731 ] + - [ -32.0000, -0.97442, 0.35131, 0.06280 ] + - [ -28.0000, -1.16308, 0.20648, 0.03905 ] + - [ -24.0000, -1.14892, 0.15001, 0.01853 ] + - [ -20.0000, -1.09451, 0.10600, 0.00441 ] + - [ -18.0000, -1.05801, 0.08732, -0.00061 ] + - [ -16.0000, -1.02281, 0.07051, -0.00342 ] + - [ -14.0000, -0.99810, 0.05474, -0.00401 ] + - [ -12.0000, -0.98515, 0.04052, -0.00272 ] + - [ -10.0000, -0.89583, 0.02929, -0.01198 ] + - [ -8.0000, -0.67539, 0.02207, -0.03458 ] + - [ -6.0000, -0.43247, 0.01735, -0.05466 ] + - [ -4.0000, -0.15881, 0.01473, -0.07425 ] + - [ -2.0000, 0.13456, 0.01362, -0.09270 ] + - [ -1.0000, 0.28014, 0.01339, -0.10074 ] + - [ 0.0000, 0.42386, 0.01330, -0.10802 ] + - [ 1.0000, 0.56519, 0.01333, -0.11450 ] + - [ 2.0000, 0.70410, 0.01345, -0.12028 ] + - [ 3.0000, 0.84071, 0.01366, -0.12546 ] + - [ 4.0000, 0.97500, 0.01397, -0.13011 ] + - [ 5.0000, 1.10680, 0.01437, -0.13425 ] + - [ 6.0000, 1.23603, 0.01486, -0.13793 ] + - [ 7.0000, 1.36223, 0.01547, -0.14108 ] + - [ 8.0000, 1.48424, 0.01623, -0.14363 ] + - [ 9.0000, 1.60097, 0.01718, -0.14545 ] + - [ 10.0000, 1.71010, 0.01841, -0.14636 ] + - [ 11.0000, 1.80957, 0.02010, -0.14635 ] + - [ 12.0000, 1.89473, 0.02258, -0.14544 ] + - [ 13.0000, 1.95698, 0.02671, -0.14378 ] + - [ 14.0000, 1.98576, 0.03380, -0.14185 ] + - [ 15.0000, 1.99260, 0.04333, -0.14004 ] + - [ 16.0000, 1.99617, 0.05354, -0.13823 ] + - [ 18.0000, 1.96398, 0.07706, -0.13351 ] + - [ 20.0000, 1.81179, 0.11169, -0.13135 ] + - [ 24.0000, 1.56073, 0.19103, -0.14660 ] + - [ 28.0000, 1.46798, 0.27199, -0.17242 ] + - [ 32.0000, 1.39203, 0.35131, -0.19417 ] + - [ 36.1429, 1.27731, 0.43913, -0.21792 ] + - [ 40.2857, 1.17689, 0.53115, -0.24115 ] + - [ 44.4286, 1.08350, 0.62546, -0.25734 ] + - [ 48.5714, 0.99253, 0.72010, -0.27354 ] + - [ 52.7143, 0.90112, 0.81310, -0.28862 ] + - [ 56.8571, 0.80760, 0.90255, -0.30311 ] + - [ 61.0000, 0.71119, 0.98659, -0.31757 ] + - [ 65.1429, 0.61175, 1.06348, -0.33194 ] + - [ 69.2857, 0.50971, 1.13162, -0.34631 ] + - [ 73.4286, 0.40589, 1.18963, -0.36014 ] + - [ 77.5714, 0.30146, 1.23629, -0.37385 ] + - [ 81.7143, 0.19788, 1.27067, -0.38681 ] + - [ 85.8571, 0.09679, 1.29204, -0.39872 ] + - [ 90.0000, 0.00000, 1.30000, -0.41063 ] + - [ 94.1429, -0.06775, 1.29204, -0.41683 ] + - [ 98.2857, -0.13851, 1.27067, -0.42303 ] + - [ 102.4286, -0.21103, 1.23629, -0.42628 ] + - [ 106.5714, -0.28412, 1.18963, -0.42745 ] + - [ 110.7143, -0.35680, 1.13162, -0.42817 ] + - [ 114.8571, -0.42823, 1.06348, -0.42673 ] + - [ 119.0000, -0.49783, 0.98659, -0.42528 ] + - [ 123.1429, -0.56532, 0.90255, -0.42535 ] + - [ 127.2857, -0.63079, 0.81310, -0.42589 ] + - [ 131.4286, -0.69477, 0.72010, -0.42974 ] + - [ 135.5714, -0.75845, 0.62546, -0.43985 ] + - [ 139.7143, -0.82382, 0.53115, -0.44996 ] + - [ 143.8571, -0.89412, 0.43913, -0.46839 ] + - [ 148.0000, -0.97442, 0.35131, -0.48743 ] + - [ 150.2857, -0.90482, 0.30532, -0.49447 ] + - [ 152.5714, -0.83522, 0.26146, -0.47732 ] + - [ 154.8571, -0.76562, 0.22000, -0.46017 ] + - [ 157.1429, -0.69601, 0.18121, -0.44302 ] + - [ 159.4286, -0.62641, 0.14533, -0.42586 ] + - [ 161.7143, -0.55681, 0.11258, -0.43502 ] + - [ 164.0000, -0.48721, 0.08319, -0.45294 ] + - [ 166.2857, -0.41761, 0.05732, -0.47087 ] + - [ 168.5714, -0.34801, 0.04638, -0.48880 ] + - [ 170.8571, -0.27841, 0.04114, -0.45714 ] + - [ 173.1429, -0.20880, 0.03702, -0.34286 ] + - [ 175.4286, -0.13920, 0.03406, -0.22857 ] + - [ 177.7143, -0.06960, 0.03228, -0.11429 ] + - [ 179.9087, 0.00000, 0.03169, 0.00000 ] + - name : FFA-W3-360 # + relative_thickness : 0.36 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.03715, 0.00000 ] + - [ -177.7143, 0.07178, 0.03774, 0.09143 ] + - [ -175.4286, 0.14356, 0.03951, 0.18286 ] + - [ -173.1429, 0.21534, 0.04245, 0.27429 ] + - [ -170.8572, 0.28713, 0.04653, 0.36571 ] + - [ -168.5716, 0.35891, 0.05174, 0.40313 ] + - [ -166.2857, 0.43069, 0.06068, 0.40814 ] + - [ -164.0000, 0.50247, 0.08651, 0.41315 ] + - [ -161.7145, 0.57425, 0.11586, 0.41816 ] + - [ -159.4284, 0.64603, 0.14856, 0.42627 ] + - [ -157.1428, 0.71781, 0.18439, 0.44370 ] + - [ -154.8573, 0.78960, 0.22313, 0.46114 ] + - [ -152.5714, 0.86138, 0.26453, 0.47857 ] + - [ -150.2857, 0.93316, 0.30832, 0.49600 ] + - [ -148.0000, 1.00494, 0.35424, 0.48830 ] + - [ -143.8571, 0.91898, 0.44192, 0.46784 ] + - [ -139.7143, 0.84406, 0.53379, 0.44803 ] + - [ -135.5714, 0.77483, 0.62793, 0.43697 ] + - [ -131.4286, 0.70790, 0.72238, 0.42591 ] + - [ -127.2857, 0.64116, 0.81520, 0.42150 ] + - [ -123.1429, 0.57335, 0.90444, 0.42058 ] + - [ -119.0000, 0.50388, 0.98826, 0.42024 ] + - [ -114.8571, 0.43261, 1.06493, 0.42168 ] + - [ -110.7143, 0.35981, 1.13285, 0.42312 ] + - [ -106.5714, 0.28603, 1.19061, 0.42258 ] + - [ -102.4286, 0.21209, 1.23704, 0.42163 ] + - [ -98.2857, 0.13899, 1.27116, 0.41864 ] + - [ -94.1429, 0.06787, 1.29229, 0.41277 ] + - [ -90.0000, 0.00000, 1.30000, 0.40690 ] + - [ -85.8571, -0.06787, 1.29229, 0.39426 ] + - [ -81.7143, -0.13899, 1.27116, 0.38162 ] + - [ -77.5714, -0.21209, 1.23704, 0.36676 ] + - [ -73.4286, -0.28603, 1.19061, 0.35033 ] + - [ -69.2857, -0.35981, 1.13285, 0.33362 ] + - [ -65.1429, -0.43261, 1.06493, 0.31561 ] + - [ -61.0000, -0.50388, 0.98826, 0.29759 ] + - [ -56.8571, -0.57335, 0.90444, 0.27989 ] + - [ -52.7143, -0.64116, 0.81520, 0.26230 ] + - [ -48.5714, -0.70790, 0.72238, 0.24491 ] + - [ -44.4286, -0.77483, 0.62793, 0.22794 ] + - [ -40.2857, -0.84406, 0.53379, 0.21097 ] + - [ -36.1429, -0.91898, 0.44192, 0.13525 ] + - [ -32.0000, -1.00494, 0.35424, 0.05517 ] + - [ -28.0000, -1.11306, 0.20494, 0.03211 ] + - [ -24.0000, -1.05425, 0.15434, 0.01268 ] + - [ -20.0000, -0.98247, 0.10967, -0.00282 ] + - [ -18.0000, -0.94173, 0.09249, -0.00741 ] + - [ -16.0000, -0.89333, 0.07597, -0.01107 ] + - [ -14.0000, -0.85472, 0.06054, -0.01250 ] + - [ -12.0000, -0.82348, 0.04641, -0.01177 ] + - [ -10.0000, -0.79541, 0.03441, -0.01082 ] + - [ -8.0000, -0.63650, 0.02548, -0.02769 ] + - [ -6.0000, -0.39095, 0.01994, -0.05107 ] + - [ -4.0000, -0.13071, 0.01653, -0.07148 ] + - [ -2.0000, 0.16173, 0.01507, -0.09179 ] + - [ -1.0000, 0.31121, 0.01477, -0.10119 ] + - [ 0.0000, 0.45956, 0.01465, -0.10988 ] + - [ 1.0000, 0.60566, 0.01466, -0.11776 ] + - [ 2.0000, 0.74868, 0.01481, -0.12477 ] + - [ 3.0000, 0.88862, 0.01507, -0.13098 ] + - [ 4.0000, 1.02544, 0.01544, -0.13648 ] + - [ 5.0000, 1.15878, 0.01593, -0.14130 ] + - [ 6.0000, 1.28822, 0.01654, -0.14540 ] + - [ 7.0000, 1.41282, 0.01731, -0.14875 ] + - [ 8.0000, 1.53090, 0.01831, -0.15118 ] + - [ 9.0000, 1.64065, 0.01963, -0.15262 ] + - [ 10.0000, 1.73926, 0.02150, -0.15310 ] + - [ 11.0000, 1.81971, 0.02445, -0.15254 ] + - [ 12.0000, 1.87065, 0.02966, -0.15121 ] + - [ 13.0000, 1.89221, 0.03770, -0.14969 ] + - [ 14.0000, 1.87910, 0.04824, -0.14562 ] + - [ 15.0000, 1.88111, 0.05838, -0.14358 ] + - [ 16.0000, 1.86359, 0.06992, -0.14095 ] + - [ 18.0000, 1.73324, 0.10166, -0.13711 ] + - [ 20.0000, 1.59357, 0.13916, -0.14082 ] + - [ 24.0000, 1.46708, 0.21002, -0.15693 ] + - [ 28.0000, 1.44834, 0.28200, -0.17979 ] + - [ 32.0000, 1.43563, 0.35424, -0.20147 ] + - [ 36.1429, 1.31283, 0.44192, -0.22409 ] + - [ 40.2857, 1.20580, 0.53379, -0.24619 ] + - [ 44.4286, 1.10690, 0.62793, -0.26133 ] + - [ 48.5714, 1.01129, 0.72238, -0.27648 ] + - [ 52.7143, 0.91594, 0.81520, -0.29062 ] + - [ 56.8571, 0.81907, 0.90444, -0.30424 ] + - [ 61.0000, 0.71982, 0.98826, -0.31787 ] + - [ 65.1429, 0.61801, 1.06493, -0.33154 ] + - [ 69.2857, 0.51401, 1.13285, -0.34522 ] + - [ 73.4286, 0.40862, 1.19061, -0.35846 ] + - [ 77.5714, 0.30299, 1.23704, -0.37161 ] + - [ 81.7143, 0.19855, 1.27116, -0.38405 ] + - [ 85.8571, 0.09695, 1.29229, -0.39547 ] + - [ 90.0000, 0.00000, 1.30000, -0.40690 ] + - [ 94.1429, -0.06787, 1.29229, -0.41277 ] + - [ 98.2857, -0.13899, 1.27116, -0.41864 ] + - [ 102.4286, -0.21209, 1.23704, -0.42163 ] + - [ 106.5714, -0.28603, 1.19061, -0.42258 ] + - [ 110.7143, -0.35981, 1.13285, -0.42312 ] + - [ 114.8571, -0.43261, 1.06493, -0.42168 ] + - [ 119.0000, -0.50388, 0.98826, -0.42024 ] + - [ 123.1429, -0.57335, 0.90444, -0.42058 ] + - [ 127.2857, -0.64116, 0.81520, -0.42150 ] + - [ 131.4286, -0.70790, 0.72238, -0.42591 ] + - [ 135.5714, -0.77483, 0.62793, -0.43697 ] + - [ 139.7143, -0.84406, 0.53379, -0.44803 ] + - [ 143.8571, -0.91898, 0.44192, -0.46784 ] + - [ 148.0000, -1.00494, 0.35424, -0.48830 ] + - [ 150.2857, -0.93316, 0.30832, -0.49600 ] + - [ 152.5714, -0.86138, 0.26453, -0.47857 ] + - [ 154.8571, -0.78960, 0.22313, -0.46114 ] + - [ 157.1429, -0.71781, 0.18439, -0.44370 ] + - [ 159.4286, -0.64603, 0.14856, -0.42627 ] + - [ 161.7143, -0.57425, 0.11586, -0.43530 ] + - [ 164.0000, -0.50247, 0.08651, -0.45315 ] + - [ 166.2857, -0.43069, 0.06068, -0.47100 ] + - [ 168.5714, -0.35891, 0.05174, -0.48884 ] + - [ 170.8571, -0.28713, 0.04653, -0.45714 ] + - [ 173.1429, -0.21534, 0.04245, -0.34286 ] + - [ 175.4286, -0.14356, 0.03951, -0.22857 ] + - [ 177.7143, -0.07178, 0.03774, -0.11429 ] + - [ 179.9087, 0.00000, 0.03715, 0.00000 ] + + + + pitch_control: + GS_Angles: [0.06019804, 0.08713416, 0.10844806, 0.12685912, 0.14339822, 0.1586021 , 0.17279614, 0.18618935, 0.19892772, 0.21111989, 0.22285021, 0.23417256, 0.2451469 , 0.25580691, 0.26619545, 0.27632495, 0.28623134, 0.29593266, 0.30544521, 0.314779 , 0.32395154, 0.33297489, 0.3418577 , 0.35060844, 0.35923641, 0.36774807, 0.37614942, 0.38444655, 0.39264363, 0.40074407] + GS_Kp: [-0.9394215 , -0.80602855, -0.69555026, -0.60254912, -0.52318192, -0.45465531, -0.39489024, -0.34230736, -0.29568537, -0.25406506, -0.2166825 , -0.18292183, -0.15228099, -0.12434663, -0.09877533, -0.0752794 , -0.05361604, -0.0335789 , -0.01499149, 0.00229803, 0.01842102, 0.03349169, 0.0476098 , 0.0608629 , 0.07332812, 0.0850737 , 0.0961602 , 0.10664158, 0.11656607, 0.12597691] + GS_Ki: [-0.07416547, -0.06719673, -0.0614251 , -0.05656651, -0.0524202 , -0.04884022, -0.04571796, -0.04297091, -0.04053528, -0.03836094, -0.03640799, -0.03464426, -0.03304352, -0.03158417, -0.03024826, -0.02902079, -0.02788904, -0.02684226, -0.02587121, -0.02496797, -0.02412567, -0.02333834, -0.02260078, -0.02190841, -0.0212572 , -0.02064359, -0.0200644 , -0.01951683, -0.01899836, -0.01850671] + Fl_Kp: -9.35 + wt_ops: + v: [3.0, 3.266896551724138, 3.533793103448276, 3.800689655172414, 4.067586206896552, 4.334482758620689, 4.601379310344828, 4.868275862068966, 5.135172413793104, 5.402068965517241, 5.6689655172413795, 5.935862068965518, 6.2027586206896554, 6.469655172413793, 6.736551724137931, 7.00344827586207, 7.270344827586207, 7.537241379310345, 7.804137931034483, 8.071034482758622, 8.337931034482759, 8.604827586206897, 8.871724137931036, 9.138620689655173, 9.405517241379311, 9.672413793103448, 9.939310344827586, 10.206206896551725, 10.473103448275863, 10.74, 11.231724137931035, 11.723448275862069, 12.215172413793104, 12.706896551724139, 13.198620689655172, 13.690344827586207, 14.182068965517242, 14.673793103448276, 15.16551724137931, 15.657241379310346, 16.14896551724138, 16.640689655172416, 17.13241379310345, 17.624137931034483, 18.11586206896552, 18.607586206896553, 19.099310344827586, 19.591034482758623, 20.082758620689653, 20.57448275862069, 21.066206896551726, 21.557931034482756, 22.049655172413793, 22.54137931034483, 23.03310344827586, 23.524827586206897, 24.016551724137933, 24.508275862068963, 25.0] + pitch_op: [-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, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, 3.57152, 5.12896, 6.36736, 7.43866, 8.40197, 9.28843, 10.1161, 10.8974, 11.641, 12.3529, 13.038, 13.6997, 14.3409, 14.9642, 15.5713, 16.1639, 16.7435, 17.3109, 17.8673, 18.4136, 18.9506, 19.4788, 19.9989, 20.5112, 21.0164, 21.5147, 22.0067, 22.4925, 22.9724] + omega_op: [2.1486, 2.3397, 2.5309, 2.722, 2.9132, 3.1043, 3.2955, 3.4866, 3.6778, 3.8689, 4.0601, 4.2512, 4.4424, 4.6335, 4.8247, 5.0159, 5.207, 5.3982, 5.5893, 5.7805, 5.9716, 6.1628, 6.3539, 6.5451, 6.7362, 6.9274, 7.1185, 7.3097, 7.5008, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56] + gear_ratio: 1 + torque_control: + VS_KP: -38609162.66552 + VS_KI: -4588245.18720 + + + tower: # (could remove some entries that don't apply for the tower) + dlsMax : 5.0 # maximum node splitting section amount; can't be 0 + + name : tower # [-] an identifier (no longer has to be number) + type : beam # [-] + rA : [ 0, 0, 15] # [m] end A coordinates + rB : [ 0, 0, 144.582] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + E : 210e9 # [Pa] Young's modulus + G : 80e9 # [Pa] shear modulus + + # --- outer shell including hydro--- + stations : [ 15, 28, 28.001, 41, 41.001, 54, 54.001, 67, 67.001, 80, 80.001, 93, 93.001, 106, 106.001, 119, 119.001, 132, 132.001, 144.582 ] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : [ 10, 9.964, 9.964, 9.967, 9.967, 9.927, 9.927, 9.528, 9.528, 9.149, 9.149, 8.945, 8.945, 8.735, 8.735, 8.405, 8.405, 7.321, 7.321, 6.5 ] # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : [ 0.082954, 0.082954, 0.083073, 0.083073, 0.082799, 0.082799, 0.0299, 0.0299, 0.027842, 0.027842, 0.025567, 0.025567, 0.022854, 0.022854, 0.02025, 0.02025, 0.018339, 0.018339, 0.021211, 0.021211 ] # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 0.0 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 0.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + # (neglecting axial coefficients for now) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] material density + +# This section describes the joints used to connect the members of the platform, including the tower +# If the platform is entirely made of flexible members connected by cantilever joints, you can omit this section. RAFT will assume that all members are connected by cantilever joints to the origin of the platform (local [0,0,0] ) +joints: + # For now, we need a joint at the origin because some effects are still not properly accounted at node level (potential flow hydro and moorings) + - name : origin + type : cantilever # 'cantilever' or 'ball' + location : [0, 0, 0] + members : ['tower', 'center_column', 'upper_support'] # Names of the members that are connected by this joint + + - name : pontoon_inner + type : cantilever + location : [5, 0, -16.5] + members : ['pontoon', 'center_column'] + heading : [60, 180, 300] # Can use heading symmetry similar to platform members + + - name : pontoon_outer + type : cantilever + location : [45.5, 0, -16.5] + members : ['pontoon', 'outer_column'] + heading : [60, 180, 300] + +platform: + + potModMaster : 1 # [int] master switch for potMod variables; 0=keeps all member potMod vars the same, 1=turns all potMod vars to False (no HAMS), 2=turns all potMod vars to True (no strip) + dlsMax : 5.0 # maximum node splitting section amount for platform members; can't be 0 + qtfPath : 'IEA-15-240-RWT-UMaineSemi.12d' # path to the qtf file for the platform + + # additional_effects: + # # This is an optional input that allows the user to specify lumped mean loads or lumped inertia properties + # # in addition (or instead of) the effects computed elsewhere. + # # For example, the user can specify the lumped inertial properties of the whole platform instead of the distributed inertia properties of each member. + # - type : mean_load + # location : [0.0, 0.0, 0.0] # [m] coordinates of the location where the load is applied + # load : [0.0, 0.0, 0.0, 0.0, 2.5e8, 0.0] # [N, N*m] force and moment applied at the location + + # # - type : point_inertia + # # mass : 1.7754e+7 # [kg] + # # moments_of_inertia: [1.251E+10, 1.251E+10, 2.367E+10, 0, 0, 0] # Jxx, Jyy, Jzz, Jxy, Jxz, Jyz [kg*m^2] + # # location : [0, 0, -14.94] # + + members: # list all members here + + - name : center_column # [-] an identifier (no longer has to be number) + type : rigid # [-] + rA : [ 0, 0, -20] # [m] end A coordinates + rB : [ 0, 0, 15] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + # --- outer shell including hydro--- + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 10.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 0.6 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 0.93 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.6 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 1.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + # --- handling of end caps or any internal structures if we need them --- + cap_stations : [ 0 ] # [m] location along member of any inner structures (in same scaling as set by 'stations') + cap_t : [ 0.001 ] # [m] thickness of any internal structures + cap_d_in : [ 0 ] # [m] inner diameter of internal structures (0 for full cap/bulkhead, >0 for a ring shape) + + + - name : outer_column # [-] an identifier (no longer has to be number) + type : rigid # [-] + rA : [51.75, 0, -20] # [m] end A coordinates + rB : [51.75, 0, 15] # [m] and B coordinates + heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + # --- outer shell including hydro--- + stations : [0, 35] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 12.5 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 0.6 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 0.93 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 1.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.7 # value of 3.0 gives more heave response # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + # --- ballast --- + l_fill : 1.4 # [m] + rho_fill : 5000 # [kg/m3] + # --- handling of end caps or any internal structures if we need them --- + cap_stations : [ 0 ] # [m] location along member of any inner structures (in same scaling as set by 'stations') + cap_t : [ 0.001 ] # [m] thickness of any internal structures + cap_d_in : [ 0 ] # [m] inner diameter of internal structures (0 for full cap/bulkhead, >0 for a ring shape) + + + - name : pontoon # [-] an identifier (no longer has to be number) + type : beam # [-] + rA : [ 5 , 0, -16.5] # [m] end A coordinates + rB : [ 45.5, 0, -16.5] # [m] and B coordinates + heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) + shape : rect # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : False # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + E : 210e9 # [Pa] Young's modulus + G : 80e9 # [Pa] shear modulus + # --- outer shell including hydro--- + stations : [0, 40.5] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : [12.4, 7.0] # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : [1.5, 2.2 ] # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : [2.2, 0.2 ] # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + l_fill : 40.5 # [m] + rho_fill : 1025.0 # [kg/m3] + + + - name : upper_support # [-] an identifier (no longer has to be number) + type : rigid # [-] + rA : [ 5 , 0, 14.545] # [m] end A coordinates + rB : [ 45.5, 0, 14.545] # [m] and B coordinates + heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : False # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + # --- outer shell including hydro--- + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 0.91 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.01 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 0.0 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 0.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + +mooring: + water_depth: 200 # [m] uniform water depth + # tol : 0.05 # Optional, tolerance for the equilibrium solver of the mooring system + + points: + - name: line1_anchor + type: fixed + location: [-837, 0.0, -200.0] + anchor_type: drag_embedment + + - name: line2_anchor + type: fixed + location: [418, 725, -200.0] + anchor_type: drag_embedment + + - name: line3_anchor + type: fixed + location: [418, -725, -200.0] + anchor_type: drag_embedment + + - name: line1_vessel + type: vessel + location: [-58, 0.0, -14.0] + + - name: line2_vessel + type: vessel + location: [29, 50, -14.0] + + - name: line3_vessel + type: vessel + location: [29, -50, -14.0] + + lines: + - name: line1 + endA: line1_anchor + endB: line1_vessel + type: chain + length: 850 + + - name: line2 + endA: line2_anchor + endB: line2_vessel + type: chain + length: 850 + + - name: line3 + endA: line3_anchor + endB: line3_vessel + type: chain + length: 850 + + line_types: + - name: chain + diameter: 0.185 + mass_density: 685.0 + stiffness: 3270e6 + breaking_load: 1e8 + cost: 100.0 + transverse_added_mass: 1.0 + tangential_added_mass: 0.0 + transverse_drag: 1.6 + tangential_drag: 0.1 + + anchor_types: + - name: drag_embedment + mass: 1e3 + cost: 1e4 + max_vertical_load: 0.0 + max_lateral_load: 1e5 + \ No newline at end of file diff --git a/examples/VolturnUS-S_example.yaml b/examples/VolturnUS-S_example.yaml index 31ce2340..bbe120cf 100644 --- a/examples/VolturnUS-S_example.yaml +++ b/examples/VolturnUS-S_example.yaml @@ -1063,12 +1063,18 @@ turbine: dlsMax : 5.0 # maximum node splitting section amount; can't be 0 name : tower # [-] an identifier (no longer has to be number) - type : 1 # [-] + type : rigid # [-] rA : [ 0, 0, 15] # [m] end A coordinates rB : [ 0, 0, 144.582] # [m] and B coordinates shape : circ # [-] circular or rectangular gamma : 0.0 # [deg] twist angle about the member's z-axis + # # If you want a flexible tower instead, you can use the following (remember to comment the type above) + # # If only the tower is flexible, you don't need to do anything else. If you want a flexible platform as well, then you would need to specify joints + # type : beam # [-] + # E : 210e12 # [Pa] Young's modulus + # G : 80e12 # [Pa] shear modulus + # --- outer shell including hydro--- stations : [ 15, 28, 28.001, 41, 41.001, 54, 54.001, 67, 67.001, 80, 80.001, 93, 93.001, 106, 106.001, 119, 119.001, 132, 132.001, 144.582 ] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB d : [ 10, 9.964, 9.964, 9.967, 9.967, 9.927, 9.927, 9.528, 9.528, 9.149, 9.149, 8.945, 8.945, 8.735, 8.735, 8.405, 8.405, 7.321, 7.321, 6.5 ] # [m] diameters if circular or side lengths if rectangular (can be pairs) @@ -1104,7 +1110,7 @@ platform: members: # list all members here - name : center_column # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [ 0, 0, -20] # [m] end A coordinates rB : [ 0, 0, 15] # [m] and B coordinates shape : circ # [-] circular or rectangular @@ -1126,7 +1132,7 @@ platform: - name : outer_column # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [51.75, 0, -20] # [m] end A coordinates rB : [51.75, 0, 15] # [m] and B coordinates heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) @@ -1152,7 +1158,7 @@ platform: - name : pontoon # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [ 5 , 0, -16.5] # [m] end A coordinates rB : [ 45.5, 0, -16.5] # [m] and B coordinates heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) @@ -1173,7 +1179,7 @@ platform: - name : upper_support # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [ 5 , 0, 14.545] # [m] end A coordinates rB : [ 45.5, 0, 14.545] # [m] and B coordinates heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) diff --git a/examples/VolturnUS-S_withBEM_intersectMesh.yaml b/examples/VolturnUS-S_withBEM_intersectMesh.yaml index 6f29cb57..59a9ad8a 100644 --- a/examples/VolturnUS-S_withBEM_intersectMesh.yaml +++ b/examples/VolturnUS-S_withBEM_intersectMesh.yaml @@ -1060,7 +1060,7 @@ turbine: dlsMax : 5.0 # maximum node splitting section amount; can't be 0 name : tower # [-] an identifier (no longer has to be number) - type : 1 # [-] + type : rigid # [-] rA : [ 0, 0, 15] # [m] end A coordinates rB : [ 0, 0, 144.582] # [m] and B coordinates shape : circ # [-] circular or rectangular @@ -1095,7 +1095,7 @@ platform: members: # list all members here - name : center_column # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [ 0, 0, -20] # [m] end A coordinates rB : [ 0, 0, 15] # [m] and B coordinates shape : circ # [-] circular or rectangular @@ -1119,7 +1119,7 @@ platform: - name : outer_column # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [51.75, 0, -20] # [m] end A coordinates rB : [51.75, 0, 15] # [m] and B coordinates heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) @@ -1147,7 +1147,7 @@ platform: - name : pontoon # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [ 5 , 0, -16.5] # [m] end A coordinates rB : [ 45.5, 0, -16.5] # [m] and B coordinates heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) @@ -1170,7 +1170,7 @@ platform: - name : upper_support # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [ 5 , 0, 14.545] # [m] end A coordinates rB : [ 45.5, 0, 14.545] # [m] and B coordinates heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) diff --git a/examples/example-LumpedMassMoorings.yaml b/examples/example-LumpedMassMoorings.yaml new file mode 100644 index 00000000..87f731f4 --- /dev/null +++ b/examples/example-LumpedMassMoorings.yaml @@ -0,0 +1,1185 @@ +type: input file for RAFT +name: IEA 15 MW with VolturnUS-S steel semi +comments: This is a quick example that includes potential flow BEM hydrodynamics with PyHAMS and different wave headings. + + +settings: # global Settings + min_freq : 0.001 # [Hz] lowest frequency to consider, also the frequency bin width + max_freq : 0.20 # [Hz] highest frequency to consider + XiStart : 0 # sets initial amplitude of each DOF for all frequencies + nIter : 4 # sets how many iterations to perform in Model.solveDynamics() + +site: + water_depth : 200 # [m] uniform water depth + rho_water : 1025.0 # [kg/m^3] water density + rho_air : 1.225 # [kg/m^3] air density + mu_air : 1.81e-05 # air dynamic viscosity + shearExp : 0.12 # shear exponent + +cases: + + keys : [wind_speed, wind_heading, turbulence, turbine_status, yaw_misalign, wave_spectrum, wave_period, wave_height, wave_heading ] + data : # m/s deg % or e.g. IIB_NTM string deg string (s) (m) (deg) + - [ 8, 0, 0, operating, 0, JONSWAP, 12, 6, 0 ] + + +turbine: + + mRNA : 991000 # [kg] RNA mass + IxRNA : 0 # [kg-m2] RNA moment of inertia about local x axis (assumed to be identical to rotor axis for now, as approx) [kg-m^2] + IrRNA : 0 # [kg-m2] RNA moment of inertia about local y or z axes [kg-m^2] + xCG_RNA : 0 # [m] x location of RNA center of mass [m] (Actual is ~= -0.27 m) + hHub : 150.0 # [m] hub height above water line [m] + Fthrust : 1500.0E3 # [N] temporary thrust force to use + + I_drivetrain: 318628138.0 # full rotor + drivetrain inertia as felt on the high-speed shaft + + nBlades : 3 # number of blades + Zhub : 150.0 # hub height [m] + Rhub : 3.97 # hub radius [m] + precone : 4.0 # [deg] + shaft_tilt : 6.0 # [deg] + overhang : -12.0313 # [m] + aeroMod : 1 # 0 aerodynamics off; 1 aerodynamics on + + + blade: + precurveTip : -3.9999999999999964 # + presweepTip : 0.0 # + Rtip : 120.96999999936446 # rotor radius + + # r chord theta precurve presweep + geometry: + - [ 8.004, 5.228, 15.474, 0.035, 0.000 ] + - [ 12.039, 5.321, 14.692, 0.084, 0.000 ] + - [ 16.073, 5.458, 13.330, 0.139, 0.000 ] + - [ 20.108, 5.602, 11.644, 0.192, 0.000 ] + - [ 24.142, 5.718, 9.927, 0.232, 0.000 ] + - [ 28.177, 5.767, 8.438, 0.250, 0.000 ] + - [ 32.211, 5.713, 7.301, 0.250, 0.000 ] + - [ 36.246, 5.536, 6.232, 0.246, 0.000 ] + - [ 40.280, 5.291, 5.230, 0.240, 0.000 ] + - [ 44.315, 5.035, 4.348, 0.233, 0.000 ] + - [ 48.349, 4.815, 3.606, 0.218, 0.000 ] + - [ 52.384, 4.623, 2.978, 0.178, 0.000 ] + - [ 56.418, 4.432, 2.423, 0.100, 0.000 ] + - [ 60.453, 4.245, 1.924, 0.000, 0.000 ] + - [ 64.487, 4.065, 1.467, -0.112, 0.000 ] + - [ 68.522, 3.896, 1.056, -0.244, 0.000 ] + - [ 72.556, 3.735, 0.692, -0.415, 0.000 ] + - [ 76.591, 3.579, 0.355, -0.620, 0.000 ] + - [ 80.625, 3.425, 0.019, -0.846, 0.000 ] + - [ 84.660, 3.268, -0.358, -1.080, 0.000 ] + - [ 88.694, 3.112, -0.834, -1.330, 0.000 ] + - [ 92.729, 2.957, -1.374, -1.602, 0.000 ] + - [ 96.763, 2.800, -1.848, -1.895, 0.000 ] + - [ 100.798, 2.637, -2.136, -2.202, 0.000 ] + - [ 104.832, 2.464, -2.172, -2.523, 0.000 ] + - [ 108.867, 2.283, -2.108, -2.864, 0.000 ] + - [ 112.901, 2.096, -1.953, -3.224, 0.000 ] + - [ 116.936, 1.902, -1.662, -3.605, 0.000 ] + # station(rel) airfoil name + airfoils: + - [ 0.00000, circular ] + - [ 0.02000, circular ] + - [ 0.15000, SNL-FFA-W3-500 ] + - [ 0.24517, FFA-W3-360 ] + - [ 0.32884, FFA-W3-330blend ] + - [ 0.43918, FFA-W3-301 ] + - [ 0.53767, FFA-W3-270blend ] + - [ 0.63821, FFA-W3-241 ] + - [ 0.77174, FFA-W3-211 ] + - [ 1.00000, FFA-W3-211 ] + + + airfoils: + - name : circular # + relative_thickness : 1.0 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00010, 0.35000, -0.00010 ] + - [ 179.9087, 0.00010, 0.35000, -0.00010 ] + - name : SNL-FFA-W3-500 # + relative_thickness : 0.5 # + data: # alpha c_l c_d c_m + - [ -179.9660, 0.00000, 0.08440, 0.00000 ] + - [ -170.0000, 0.44190, 0.08440, 0.31250 ] + - [ -160.0002, 0.88370, 0.12680, 0.28310 ] + - [ -149.9998, 0.96740, 0.29270, 0.26320 ] + - [ -139.9999, 0.78010, 0.49700, 0.20480 ] + - [ -130.0001, 0.62930, 0.71610, 0.19320 ] + - [ -120.0003, 0.47850, 0.92460, 0.20080 ] + - [ -109.9999, 0.31890, 1.09850, 0.21360 ] + - [ -100.0000, 0.15530, 1.21820, 0.22210 ] + - [ -90.0002, 0.00000, 1.27070, 0.21980 ] + - [ -79.9998, -0.15530, 1.21820, 0.19600 ] + - [ -70.0000, -0.31890, 1.09850, 0.16350 ] + - [ -60.0001, -0.47840, 0.92460, 0.12850 ] + - [ -49.9997, -0.62930, 0.71610, 0.09650 ] + - [ -39.9999, -0.78010, 0.49700, 0.07160 ] + - [ -30.0001, -0.96740, 0.29270, 0.05220 ] + - [ -20.0002, -1.02810, 0.14990, -0.00630 ] + - [ -19.7499, -1.02430, 0.14720, -0.00890 ] + - [ -19.2502, -1.00520, 0.14470, -0.00990 ] + - [ -18.9999, -0.99710, 0.14330, -0.01050 ] + - [ -18.7500, -1.00520, 0.14030, -0.01100 ] + - [ -18.5002, -0.99950, 0.13860, -0.01160 ] + - [ -18.2499, -0.99080, 0.13730, -0.01200 ] + - [ -18.0000, -0.98150, 0.13600, -0.01260 ] + - [ -17.4998, -0.97640, 0.13220, -0.01350 ] + - [ -17.2500, -0.97050, 0.13060, -0.01390 ] + - [ -17.0002, -0.96550, 0.12900, -0.01430 ] + - [ -16.7498, -0.96620, 0.12680, -0.01470 ] + - [ -16.5000, -0.95440, 0.12580, -0.01510 ] + - [ -16.2502, -0.94440, 0.12460, -0.01550 ] + - [ -15.9998, -0.94050, 0.12290, -0.01580 ] + - [ -15.7500, -0.94330, 0.12060, -0.01610 ] + - [ -15.5002, -0.93300, 0.11950, -0.01640 ] + - [ -15.2498, -0.92110, 0.11850, -0.01680 ] + - [ -14.7502, -0.91580, 0.11500, -0.01730 ] + - [ -14.4998, -0.90700, 0.11380, -0.01750 ] + - [ -14.2500, -0.89590, 0.11270, -0.01780 ] + - [ -14.0002, -0.89260, 0.11100, -0.01810 ] + - [ -13.7498, -0.88080, 0.11000, -0.01840 ] + - [ -13.5000, -0.87220, 0.10890, -0.01860 ] + - [ -13.2502, -0.86600, 0.10750, -0.01880 ] + - [ -12.9998, -0.86260, 0.10590, -0.01880 ] + - [ -12.7500, -0.84890, 0.10510, -0.01920 ] + - [ -12.5002, -0.83630, 0.10420, -0.01940 ] + - [ -12.2498, -0.83630, 0.10230, -0.01940 ] + - [ -12.0000, -0.82710, 0.10130, -0.01960 ] + - [ -11.7502, -0.81410, 0.10040, -0.01980 ] + - [ -11.4998, -0.80040, 0.09970, -0.02000 ] + - [ -11.0002, -0.78900, 0.09710, -0.01990 ] + - [ -10.7498, -0.78620, 0.09560, -0.01960 ] + - [ -10.5000, -0.77470, 0.09480, -0.01940 ] + - [ -10.2502, -0.77010, 0.09400, -0.01840 ] + - [ -9.9998, -0.76740, 0.09250, -0.01830 ] + - [ -9.7500, -0.75060, 0.09170, -0.01920 ] + - [ -9.5002, -0.72900, 0.09120, -0.02050 ] + - [ -9.2498, -0.70950, 0.09020, -0.02240 ] + - [ -9.0000, -0.68550, 0.08950, -0.02470 ] + - [ -8.7502, -0.65900, 0.08910, -0.02670 ] + - [ -8.4998, -0.63190, 0.08870, -0.02870 ] + - [ -8.2500, -0.60190, 0.08790, -0.03200 ] + - [ -8.0002, -0.57180, 0.08750, -0.03450 ] + - [ -7.7498, -0.54240, 0.08730, -0.03670 ] + - [ -7.5000, -0.50980, 0.08680, -0.03990 ] + - [ -7.2502, -0.47670, 0.08640, -0.04300 ] + - [ -6.9998, -0.44540, 0.08620, -0.04530 ] + - [ -6.7500, -0.41420, 0.08600, -0.04760 ] + - [ -6.5002, -0.37910, 0.08560, -0.05100 ] + - [ -6.2498, -0.34600, 0.08530, -0.05380 ] + - [ -6.0000, -0.31440, 0.08520, -0.05600 ] + - [ -5.7502, -0.28170, 0.08500, -0.05860 ] + - [ -5.4998, -0.24610, 0.08470, -0.06190 ] + - [ -5.2500, -0.21330, 0.08460, -0.06440 ] + - [ -5.0002, -0.18270, 0.08450, -0.06630 ] + - [ -4.7498, -0.14940, 0.08430, -0.06880 ] + - [ -4.5000, -0.11580, 0.08420, -0.07150 ] + - [ -4.2502, -0.08370, 0.08400, -0.07370 ] + - [ -3.9998, -0.05290, 0.08400, -0.07560 ] + - [ -3.7500, -0.02250, 0.08390, -0.07740 ] + - [ -3.5002, 0.00890, 0.08380, -0.07930 ] + - [ -3.2498, 0.03920, 0.08380, -0.08110 ] + - [ -3.0000, 0.06860, 0.08380, -0.08260 ] + - [ -2.7502, 0.09740, 0.08380, -0.08380 ] + - [ -2.4998, 0.12600, 0.08380, -0.08520 ] + - [ -2.2500, 0.15550, 0.08380, -0.08670 ] + - [ -2.0002, 0.18530, 0.08380, -0.08830 ] + - [ -1.7498, 0.21460, 0.08370, -0.08970 ] + - [ -1.5000, 0.24300, 0.08370, -0.09100 ] + - [ -1.2502, 0.27130, 0.08380, -0.09210 ] + - [ -0.9998, 0.30060, 0.08380, -0.09360 ] + - [ -0.7500, 0.32950, 0.08380, -0.09490 ] + - [ -0.5002, 0.35780, 0.08380, -0.09610 ] + - [ -0.2498, 0.38570, 0.08380, -0.09720 ] + - [ 0.0000, 0.41350, 0.08380, -0.09830 ] + - [ 0.2298, 0.44250, 0.08390, -0.09950 ] + - [ 0.4698, 0.47150, 0.08390, -0.10080 ] + - [ 0.7002, 0.50030, 0.08390, -0.10190 ] + - [ 0.9402, 0.52860, 0.08400, -0.10290 ] + - [ 1.1700, 0.55670, 0.08400, -0.10400 ] + - [ 1.3997, 0.58500, 0.08410, -0.10500 ] + - [ 1.6398, 0.61350, 0.08410, -0.10610 ] + - [ 1.8701, 0.64170, 0.08420, -0.10720 ] + - [ 2.1102, 0.66970, 0.08420, -0.10820 ] + - [ 2.3400, 0.69750, 0.08430, -0.10910 ] + - [ 2.5697, 0.72510, 0.08430, -0.11000 ] + - [ 2.8098, 0.75280, 0.08440, -0.11090 ] + - [ 3.0401, 0.78070, 0.08450, -0.11190 ] + - [ 3.2802, 0.80830, 0.08460, -0.11280 ] + - [ 3.5099, 0.83580, 0.08460, -0.11370 ] + - [ 3.7403, 0.86310, 0.08470, -0.11460 ] + - [ 3.9798, 0.89020, 0.08470, -0.11530 ] + - [ 4.2101, 0.91730, 0.08480, -0.11610 ] + - [ 4.4502, 0.94440, 0.08490, -0.11700 ] + - [ 4.6799, 0.97130, 0.08500, -0.11780 ] + - [ 4.9102, 0.99810, 0.08510, -0.11850 ] + - [ 5.1497, 1.02490, 0.08520, -0.11920 ] + - [ 5.3801, 1.05150, 0.08530, -0.11990 ] + - [ 5.6201, 1.07790, 0.08530, -0.12060 ] + - [ 5.8499, 1.10410, 0.08540, -0.12120 ] + - [ 6.0802, 1.13020, 0.08560, -0.12180 ] + - [ 6.3197, 1.15600, 0.08570, -0.12240 ] + - [ 6.5501, 1.18180, 0.08580, -0.12300 ] + - [ 6.7901, 1.20760, 0.08590, -0.12350 ] + - [ 7.0199, 1.23340, 0.08600, -0.12400 ] + - [ 7.2502, 1.25890, 0.08610, -0.12450 ] + - [ 7.4903, 1.28410, 0.08620, -0.12500 ] + - [ 7.7200, 1.30880, 0.08640, -0.12540 ] + - [ 7.9601, 1.33310, 0.08650, -0.12570 ] + - [ 8.1899, 1.35700, 0.08670, -0.12590 ] + - [ 8.4202, 1.38100, 0.08690, -0.12620 ] + - [ 8.6603, 1.40540, 0.08700, -0.12650 ] + - [ 8.8900, 1.42950, 0.08710, -0.12670 ] + - [ 9.1198, 1.45310, 0.08730, -0.12700 ] + - [ 9.8801, 1.51540, 0.08790, -0.12650 ] + - [ 10.6398, 1.57490, 0.08860, -0.12560 ] + - [ 11.4001, 1.61510, 0.08950, -0.12140 ] + - [ 12.1501, 1.64430, 0.09120, -0.11630 ] + - [ 12.9099, 1.68240, 0.09300, -0.11330 ] + - [ 13.6702, 1.71460, 0.09540, -0.11070 ] + - [ 14.4202, 1.73620, 0.09890, -0.10800 ] + - [ 15.1799, 1.76270, 0.10240, -0.10630 ] + - [ 15.9403, 1.77060, 0.10760, -0.10420 ] + - [ 16.6903, 1.76390, 0.11440, -0.10250 ] + - [ 17.4500, 1.76040, 0.12110, -0.10130 ] + - [ 18.2097, 1.72510, 0.13100, -0.10010 ] + - [ 18.9701, 1.70350, 0.13990, -0.09980 ] + - [ 19.7201, 1.67840, 0.14920, -0.10010 ] + - [ 20.4798, 1.65050, 0.15910, -0.10160 ] + - [ 21.2401, 1.62270, 0.16910, -0.10360 ] + - [ 21.9901, 1.60670, 0.17780, -0.10640 ] + - [ 22.7499, 1.59720, 0.18580, -0.10990 ] + - [ 23.5102, 1.58920, 0.19370, -0.11360 ] + - [ 24.2602, 1.58150, 0.20140, -0.11800 ] + - [ 25.0199, 1.55630, 0.21350, -0.12490 ] + - [ 25.7802, 1.52720, 0.22670, -0.13250 ] + - [ 26.5302, 1.49820, 0.23990, -0.14000 ] + - [ 27.2900, 1.46910, 0.25310, -0.14760 ] + - [ 28.0497, 1.44010, 0.26630, -0.15510 ] + - [ 28.8100, 1.41100, 0.27950, -0.16270 ] + - [ 29.5600, 1.38200, 0.29270, -0.17030 ] + - [ 30.3198, 1.36220, 0.30780, -0.17400 ] + - [ 31.0801, 1.34240, 0.32300, -0.17770 ] + - [ 31.8301, 1.32250, 0.33810, -0.18150 ] + - [ 32.5898, 1.30270, 0.35320, -0.18520 ] + - [ 33.3502, 1.28290, 0.36840, -0.18890 ] + - [ 34.1002, 1.26310, 0.38350, -0.19260 ] + - [ 34.8599, 1.24330, 0.39870, -0.19640 ] + - [ 35.6202, 1.22340, 0.41380, -0.20010 ] + - [ 36.3800, 1.20360, 0.42890, -0.20390 ] + - [ 37.1300, 1.18380, 0.44410, -0.20760 ] + - [ 37.8903, 1.16400, 0.45920, -0.21130 ] + - [ 38.6500, 1.14420, 0.47430, -0.21500 ] + - [ 39.4000, 1.12430, 0.48950, -0.21880 ] + - [ 40.1598, 1.10640, 0.50520, -0.22180 ] + - [ 40.9201, 1.09050, 0.52140, -0.22420 ] + - [ 41.6701, 1.07450, 0.53760, -0.22660 ] + - [ 42.4298, 1.05860, 0.55380, -0.22890 ] + - [ 43.1901, 1.04260, 0.57010, -0.23130 ] + - [ 43.9401, 1.02670, 0.58630, -0.23370 ] + - [ 44.6999, 1.01070, 0.60250, -0.23610 ] + - [ 45.4602, 0.99480, 0.61880, -0.23840 ] + - [ 46.2199, 0.97880, 0.63500, -0.24080 ] + - [ 46.9699, 0.96280, 0.65120, -0.24320 ] + - [ 47.7302, 0.94690, 0.66750, -0.24550 ] + - [ 48.4900, 0.93090, 0.68370, -0.24790 ] + - [ 49.2400, 0.91500, 0.69990, -0.25030 ] + - [ 49.9997, 0.89900, 0.71610, -0.25270 ] + - [ 60.0001, 0.68360, 0.92460, -0.28330 ] + - [ 70.0000, 0.45560, 1.09850, -0.31560 ] + - [ 79.9998, 0.22190, 1.21820, -0.34820 ] + - [ 90.0002, 0.00000, 1.27070, -0.37730 ] + - [ 100.0000, -0.15530, 1.21820, -0.38770 ] + - [ 109.9999, -0.31890, 1.09850, -0.38650 ] + - [ 120.0003, -0.47840, 0.92460, -0.38060 ] + - [ 130.0001, -0.62930, 0.71610, -0.38030 ] + - [ 139.9999, -0.78010, 0.49700, -0.40320 ] + - [ 149.9998, -0.96740, 0.29270, -0.48540 ] + - [ 160.0002, -0.88370, 0.12680, -0.53250 ] + - [ 170.0000, -0.44180, 0.08440, -0.39060 ] + - [ 179.9660, 0.00000, 0.08440, 0.00000 ] + - name : FFA-W3-211 # + relative_thickness : 0.211 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.02464, 0.00000 ] + - [ -177.7143, 0.05403, 0.02534, 0.09143 ] + - [ -175.4286, 0.10805, 0.02742, 0.18286 ] + - [ -173.1429, 0.16208, 0.03088, 0.27429 ] + - [ -170.8572, 0.21610, 0.03570, 0.36571 ] + - [ -168.5716, 0.27013, 0.05599, 0.39192 ] + - [ -166.2857, 0.32415, 0.08143, 0.37898 ] + - [ -164.0000, 0.37818, 0.11112, 0.36605 ] + - [ -161.7145, 0.43220, 0.14485, 0.35312 ] + - [ -159.4284, 0.48623, 0.18242, 0.34768 ] + - [ -157.1428, 0.54025, 0.22359, 0.36471 ] + - [ -154.8573, 0.59428, 0.26810, 0.38175 ] + - [ -152.5714, 0.64830, 0.31566, 0.39878 ] + - [ -150.2857, 0.70233, 0.36597, 0.41581 ] + - [ -148.0000, 0.75635, 0.41871, 0.41955 ] + - [ -143.8571, 0.73188, 0.51941, 0.42287 ] + - [ -139.7143, 0.70655, 0.62488, 0.42632 ] + - [ -135.5714, 0.67760, 0.73293, 0.43163 ] + - [ -131.4286, 0.64333, 0.84130, 0.43694 ] + - [ -127.2857, 0.60277, 0.94773, 0.44389 ] + - [ -123.1429, 0.55550, 1.05001, 0.45171 ] + - [ -119.0000, 0.50156, 1.14600, 0.45897 ] + - [ -114.8571, 0.44131, 1.23371, 0.46448 ] + - [ -110.7143, 0.37542, 1.31129, 0.46998 ] + - [ -106.5714, 0.30482, 1.37714, 0.47096 ] + - [ -102.4286, 0.23063, 1.42988, 0.47101 ] + - [ -98.2857, 0.15413, 1.46842, 0.46824 ] + - [ -94.1429, 0.07675, 1.49196, 0.46149 ] + - [ -90.0000, 0.00000, 1.50000, 0.45474 ] + - [ -85.8571, -0.07675, 1.49196, 0.44026 ] + - [ -81.7143, -0.15413, 1.46842, 0.42578 ] + - [ -77.5714, -0.23063, 1.42988, 0.40821 ] + - [ -73.4286, -0.30482, 1.37714, 0.38846 ] + - [ -69.2857, -0.37542, 1.31129, 0.36815 ] + - [ -65.1429, -0.44131, 1.23371, 0.34519 ] + - [ -61.0000, -0.50156, 1.14600, 0.32223 ] + - [ -56.8571, -0.55550, 1.05001, 0.29864 ] + - [ -52.7143, -0.60277, 0.94773, 0.27486 ] + - [ -48.5714, -0.64333, 0.84130, 0.25128 ] + - [ -44.4286, -0.67760, 0.73293, 0.22810 ] + - [ -40.2857, -0.70655, 0.62488, 0.20491 ] + - [ -36.1429, -0.73188, 0.51941, 0.15416 ] + - [ -32.0000, -0.75635, 0.41871, 0.10137 ] + - [ -28.0000, -0.85636, 0.28691, 0.06527 ] + - [ -24.0000, -1.18292, 0.13960, 0.01647 ] + - [ -20.0000, -1.23596, 0.08345, -0.00352 ] + - [ -18.0000, -1.22536, 0.06509, -0.00672 ] + - [ -16.0000, -1.20476, 0.04888, -0.00881 ] + - [ -14.0000, -1.18332, 0.03417, -0.01101 ] + - [ -12.0000, -1.10093, 0.02132, -0.02269 ] + - [ -10.0000, -0.88209, 0.01386, -0.04397 ] + - [ -8.0000, -0.62981, 0.01075, -0.05756 ] + - [ -6.0000, -0.37670, 0.00882, -0.06747 ] + - [ -4.0000, -0.12177, 0.00702, -0.07680 ] + - [ -2.0000, 0.12810, 0.00663, -0.08283 ] + - [ -1.0000, 0.25192, 0.00664, -0.08534 ] + - [ 0.0000, 0.37535, 0.00670, -0.08777 ] + - [ 1.0000, 0.49828, 0.00681, -0.09011 ] + - [ 2.0000, 0.62052, 0.00698, -0.09234 ] + - [ 3.0000, 0.74200, 0.00720, -0.09447 ] + - [ 4.0000, 0.86238, 0.00751, -0.09646 ] + - [ 5.0000, 0.98114, 0.00796, -0.09828 ] + - [ 6.0000, 1.09662, 0.00872, -0.09977 ] + - [ 7.0000, 1.20904, 0.00968, -0.10095 ] + - [ 8.0000, 1.31680, 0.01097, -0.10163 ] + - [ 9.0000, 1.42209, 0.01227, -0.10207 ] + - [ 10.0000, 1.52361, 0.01369, -0.10213 ] + - [ 11.0000, 1.61988, 0.01529, -0.10174 ] + - [ 12.0000, 1.70937, 0.01717, -0.10087 ] + - [ 13.0000, 1.78681, 0.01974, -0.09936 ] + - [ 14.0000, 1.84290, 0.02368, -0.09720 ] + - [ 15.0000, 1.85313, 0.03094, -0.09410 ] + - [ 16.0000, 1.80951, 0.04303, -0.09144 ] + - [ 18.0000, 1.66033, 0.07730, -0.09242 ] + - [ 20.0000, 1.56152, 0.11202, -0.09871 ] + - [ 24.0000, 1.43327, 0.18408, -0.11770 ] + - [ 28.0000, 1.29062, 0.27589, -0.14566 ] + - [ 32.0000, 1.08050, 0.41871, -0.18266 ] + - [ 36.1429, 1.04554, 0.51941, -0.20913 ] + - [ 40.2857, 1.00936, 0.62488, -0.23534 ] + - [ 44.4286, 0.96801, 0.73293, -0.25784 ] + - [ 48.5714, 0.91904, 0.84130, -0.28035 ] + - [ 52.7143, 0.86109, 0.94773, -0.30163 ] + - [ 56.8571, 0.79357, 1.05001, -0.32226 ] + - [ 61.0000, 0.71651, 1.14600, -0.34247 ] + - [ 65.1429, 0.63044, 1.23371, -0.36135 ] + - [ 69.2857, 0.53632, 1.31129, -0.38024 ] + - [ 73.4286, 0.43546, 1.37714, -0.39704 ] + - [ 77.5714, 0.32947, 1.42988, -0.41341 ] + - [ 81.7143, 0.22019, 1.46842, -0.42844 ] + - [ 85.8571, 0.10965, 1.49196, -0.44159 ] + - [ 90.0000, 0.00000, 1.50000, -0.45474 ] + - [ 94.1429, -0.07675, 1.49196, -0.46149 ] + - [ 98.2857, -0.15413, 1.46842, -0.46824 ] + - [ 102.4286, -0.23063, 1.42988, -0.47101 ] + - [ 106.5714, -0.30482, 1.37714, -0.47096 ] + - [ 110.7143, -0.37542, 1.31129, -0.46998 ] + - [ 114.8571, -0.44131, 1.23371, -0.46448 ] + - [ 119.0000, -0.50156, 1.14600, -0.45897 ] + - [ 123.1429, -0.55550, 1.05001, -0.45171 ] + - [ 127.2857, -0.60277, 0.94773, -0.44389 ] + - [ 131.4286, -0.64333, 0.84130, -0.43694 ] + - [ 135.5714, -0.67760, 0.73293, -0.43163 ] + - [ 139.7143, -0.70655, 0.62488, -0.42632 ] + - [ 143.8571, -0.73188, 0.51941, -0.42287 ] + - [ 148.0000, -0.75635, 0.41871, -0.41955 ] + - [ 150.2857, -0.70233, 0.36597, -0.41581 ] + - [ 152.5714, -0.64830, 0.31566, -0.39878 ] + - [ 154.8571, -0.59428, 0.26810, -0.38175 ] + - [ 157.1429, -0.54025, 0.22359, -0.36471 ] + - [ 159.4286, -0.48623, 0.18242, -0.34768 ] + - [ 161.7143, -0.43220, 0.14485, -0.37026 ] + - [ 164.0000, -0.37818, 0.11112, -0.40605 ] + - [ 166.2857, -0.32415, 0.08143, -0.44184 ] + - [ 168.5714, -0.27013, 0.05599, -0.47763 ] + - [ 170.8571, -0.21610, 0.03570, -0.45714 ] + - [ 173.1429, -0.16208, 0.03088, -0.34286 ] + - [ 175.4286, -0.10805, 0.02742, -0.22857 ] + - [ 177.7143, -0.05403, 0.02534, -0.11429 ] + - [ 179.9087, 0.00000, 0.02464, 0.00000 ] + - name : FFA-W3-241 # + relative_thickness : 0.241 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.01178, 0.00000 ] + - [ -177.7143, 0.05818, 0.01248, 0.09143 ] + - [ -175.4286, 0.11636, 0.01460, 0.18286 ] + - [ -173.1429, 0.17453, 0.01811, 0.27429 ] + - [ -170.8572, 0.23271, 0.02300, 0.36571 ] + - [ -168.5716, 0.29089, 0.02922, 0.39568 ] + - [ -166.2857, 0.34907, 0.05382, 0.38876 ] + - [ -164.0000, 0.40725, 0.08379, 0.38184 ] + - [ -161.7145, 0.46542, 0.11786, 0.37492 ] + - [ -159.4284, 0.52360, 0.15581, 0.37408 ] + - [ -157.1428, 0.58178, 0.19740, 0.39148 ] + - [ -154.8573, 0.63996, 0.24237, 0.40888 ] + - [ -152.5714, 0.69814, 0.29043, 0.42628 ] + - [ -150.2857, 0.75631, 0.34128, 0.44368 ] + - [ -148.0000, 0.81449, 0.39460, 0.44537 ] + - [ -143.8571, 0.77925, 0.49645, 0.44436 ] + - [ -139.7143, 0.74511, 0.60319, 0.44360 ] + - [ -135.5714, 0.70881, 0.71263, 0.44609 ] + - [ -131.4286, 0.66835, 0.82249, 0.44858 ] + - [ -127.2857, 0.62253, 0.93051, 0.45370 ] + - [ -123.1429, 0.57080, 1.03447, 0.46020 ] + - [ -119.0000, 0.51307, 1.13222, 0.46633 ] + - [ -114.8571, 0.44965, 1.22176, 0.47130 ] + - [ -110.7143, 0.38115, 1.30123, 0.47627 ] + - [ -106.5714, 0.30846, 1.36903, 0.47705 ] + - [ -102.4286, 0.23266, 1.42376, 0.47695 ] + - [ -98.2857, 0.15503, 1.46433, 0.47409 ] + - [ -94.1429, 0.07698, 1.48990, 0.46732 ] + - [ -90.0000, 0.00000, 1.50000, 0.46055 ] + - [ -85.8571, -0.07698, 1.48990, 0.44509 ] + - [ -81.7143, -0.15503, 1.46433, 0.42964 ] + - [ -77.5714, -0.23266, 1.42376, 0.41125 ] + - [ -73.4286, -0.30846, 1.36903, 0.39081 ] + - [ -69.2857, -0.38115, 1.30123, 0.36988 ] + - [ -65.1429, -0.44965, 1.22176, 0.34663 ] + - [ -61.0000, -0.51307, 1.13222, 0.32339 ] + - [ -56.8571, -0.57080, 1.03447, 0.29984 ] + - [ -52.7143, -0.62253, 0.93051, 0.27618 ] + - [ -48.5714, -0.66835, 0.82249, 0.25280 ] + - [ -44.4286, -0.70881, 0.71263, 0.22992 ] + - [ -40.2857, -0.74511, 0.60319, 0.20705 ] + - [ -36.1429, -0.77925, 0.49645, 0.14561 ] + - [ -32.0000, -0.81449, 0.39460, 0.08131 ] + - [ -28.0000, -1.07781, 0.22252, 0.04592 ] + - [ -24.0000, -1.12692, 0.15159, 0.01901 ] + - [ -20.0000, -1.14480, 0.09699, 0.00063 ] + - [ -18.0000, -1.12797, 0.07744, -0.00342 ] + - [ -16.0000, -1.09392, 0.06122, -0.00587 ] + - [ -14.0000, -1.05961, 0.04667, -0.00652 ] + - [ -12.0000, -1.03121, 0.03302, -0.00755 ] + - [ -10.0000, -0.93706, 0.02027, -0.02243 ] + - [ -8.0000, -0.67380, 0.01168, -0.05583 ] + - [ -6.0000, -0.40391, 0.00918, -0.07159 ] + - [ -4.0000, -0.14226, 0.00839, -0.08123 ] + - [ -2.0000, 0.11580, 0.00810, -0.08892 ] + - [ -1.0000, 0.24382, 0.00808, -0.09235 ] + - [ 0.0000, 0.37113, 0.00813, -0.09556 ] + - [ 1.0000, 0.49766, 0.00824, -0.09857 ] + - [ 2.0000, 0.62334, 0.00842, -0.10139 ] + - [ 3.0000, 0.74798, 0.00867, -0.10403 ] + - [ 4.0000, 0.87137, 0.00901, -0.10645 ] + - [ 5.0000, 0.99320, 0.00945, -0.10863 ] + - [ 6.0000, 1.11325, 0.00998, -0.11057 ] + - [ 7.0000, 1.23037, 0.01070, -0.11214 ] + - [ 8.0000, 1.34496, 0.01153, -0.11337 ] + - [ 9.0000, 1.45407, 0.01269, -0.11396 ] + - [ 10.0000, 1.55911, 0.01396, -0.11403 ] + - [ 11.0000, 1.65779, 0.01545, -0.11336 ] + - [ 12.0000, 1.74834, 0.01724, -0.11187 ] + - [ 13.0000, 1.82666, 0.01961, -0.10935 ] + - [ 14.0000, 1.88831, 0.02293, -0.10606 ] + - [ 15.0000, 1.92579, 0.02795, -0.10238 ] + - [ 16.0000, 1.92722, 0.03609, -0.09887 ] + - [ 18.0000, 1.80055, 0.06534, -0.09497 ] + - [ 20.0000, 1.63088, 0.10459, -0.09996 ] + - [ 24.0000, 1.43345, 0.19148, -0.12589 ] + - [ 28.0000, 1.28805, 0.28629, -0.15453 ] + - [ 32.0000, 1.16356, 0.39460, -0.18396 ] + - [ 36.1429, 1.11321, 0.49645, -0.21099 ] + - [ 40.2857, 1.06444, 0.60319, -0.23768 ] + - [ 44.4286, 1.01259, 0.71263, -0.25992 ] + - [ 48.5714, 0.95478, 0.82249, -0.28216 ] + - [ 52.7143, 0.88932, 0.93051, -0.30323 ] + - [ 56.8571, 0.81542, 1.03447, -0.32368 ] + - [ 61.0000, 0.73296, 1.13222, -0.34380 ] + - [ 65.1429, 0.64236, 1.22176, -0.36292 ] + - [ 69.2857, 0.54450, 1.30123, -0.38204 ] + - [ 73.4286, 0.44065, 1.36903, -0.39944 ] + - [ 77.5714, 0.33237, 1.42376, -0.41648 ] + - [ 81.7143, 0.22148, 1.46433, -0.43231 ] + - [ 85.8571, 0.10997, 1.48990, -0.44643 ] + - [ 90.0000, 0.00000, 1.50000, -0.46055 ] + - [ 94.1429, -0.07698, 1.48990, -0.46732 ] + - [ 98.2857, -0.15503, 1.46433, -0.47409 ] + - [ 102.4286, -0.23266, 1.42376, -0.47695 ] + - [ 106.5714, -0.30846, 1.36903, -0.47705 ] + - [ 110.7143, -0.38115, 1.30123, -0.47627 ] + - [ 114.8571, -0.44965, 1.22176, -0.47130 ] + - [ 119.0000, -0.51307, 1.13222, -0.46633 ] + - [ 123.1429, -0.57080, 1.03447, -0.46020 ] + - [ 127.2857, -0.62253, 0.93051, -0.45370 ] + - [ 131.4286, -0.66835, 0.82249, -0.44858 ] + - [ 135.5714, -0.70881, 0.71263, -0.44609 ] + - [ 139.7143, -0.74511, 0.60319, -0.44360 ] + - [ 143.8571, -0.77925, 0.49645, -0.44436 ] + - [ 148.0000, -0.81449, 0.39460, -0.44537 ] + - [ 150.2857, -0.75631, 0.34128, -0.44368 ] + - [ 152.5714, -0.69814, 0.29043, -0.42628 ] + - [ 154.8571, -0.63996, 0.24237, -0.40888 ] + - [ 157.1429, -0.58178, 0.19740, -0.39148 ] + - [ 159.4286, -0.52360, 0.15581, -0.37408 ] + - [ 161.7143, -0.46542, 0.11786, -0.39207 ] + - [ 164.0000, -0.40725, 0.08379, -0.42184 ] + - [ 166.2857, -0.34907, 0.05382, -0.45162 ] + - [ 168.5714, -0.29089, 0.02922, -0.48139 ] + - [ 170.8571, -0.23271, 0.02300, -0.45714 ] + - [ 173.1429, -0.17453, 0.01811, -0.34286 ] + - [ 175.4286, -0.11636, 0.01460, -0.22857 ] + - [ 177.7143, -0.05818, 0.01248, -0.11429 ] + - [ 179.9087, 0.00000, 0.01178, 0.00000 ] + - name : FFA-W3-270blend # + relative_thickness : 0.27 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.01545, 0.00000 ] + - [ -177.7143, 0.06213, 0.01611, 0.09143 ] + - [ -175.4286, 0.12426, 0.01807, 0.18286 ] + - [ -173.1429, 0.18639, 0.02133, 0.27429 ] + - [ -170.8572, 0.24852, 0.02587, 0.36571 ] + - [ -168.5716, 0.31064, 0.03289, 0.39874 ] + - [ -166.2857, 0.37277, 0.05681, 0.39672 ] + - [ -164.0000, 0.43490, 0.08471, 0.39470 ] + - [ -161.7145, 0.49703, 0.11643, 0.39268 ] + - [ -159.4284, 0.55916, 0.15176, 0.39544 ] + - [ -157.1428, 0.62129, 0.19048, 0.41254 ] + - [ -154.8573, 0.68342, 0.23234, 0.42964 ] + - [ -152.5714, 0.74555, 0.27708, 0.44674 ] + - [ -150.2857, 0.80768, 0.32441, 0.46384 ] + - [ -148.0000, 0.86981, 0.37404, 0.46186 ] + - [ -143.8571, 0.81660, 0.46882, 0.45335 ] + - [ -139.7143, 0.76812, 0.56814, 0.44523 ] + - [ -135.5714, 0.72040, 0.66995, 0.44237 ] + - [ -131.4286, 0.67095, 0.77214, 0.43951 ] + - [ -127.2857, 0.61828, 0.87258, 0.44072 ] + - [ -123.1429, 0.56158, 0.96921, 0.44407 ] + - [ -119.0000, 0.50057, 1.06002, 0.44739 ] + - [ -114.8571, 0.43540, 1.14315, 0.45063 ] + - [ -110.7143, 0.36655, 1.21688, 0.45387 ] + - [ -106.5714, 0.29475, 1.27969, 0.45377 ] + - [ -102.4286, 0.22098, 1.33030, 0.45298 ] + - [ -98.2857, 0.14639, 1.36768, 0.44973 ] + - [ -94.1429, 0.07227, 1.39107, 0.44302 ] + - [ -90.0000, 0.00000, 1.40000, 0.43630 ] + - [ -85.8571, -0.07227, 1.39107, 0.42180 ] + - [ -81.7143, -0.14639, 1.36768, 0.40730 ] + - [ -77.5714, -0.22098, 1.33030, 0.39020 ] + - [ -73.4286, -0.29475, 1.27969, 0.37125 ] + - [ -69.2857, -0.36655, 1.21688, 0.35190 ] + - [ -65.1429, -0.43540, 1.14315, 0.33068 ] + - [ -61.0000, -0.50057, 1.06002, 0.30945 ] + - [ -56.8571, -0.56158, 0.96921, 0.28815 ] + - [ -52.7143, -0.61828, 0.87258, 0.26684 ] + - [ -48.5714, -0.67095, 0.77214, 0.24576 ] + - [ -44.4286, -0.72040, 0.66995, 0.22512 ] + - [ -40.2857, -0.76812, 0.56814, 0.20447 ] + - [ -36.1429, -0.81660, 0.46882, 0.13957 ] + - [ -32.0000, -0.86981, 0.37404, 0.07138 ] + - [ -28.0000, -1.09837, 0.21880, 0.04400 ] + - [ -24.0000, -1.08339, 0.15982, 0.02166 ] + - [ -20.0000, -1.06990, 0.10744, 0.00422 ] + - [ -18.0000, -1.05454, 0.08690, -0.00035 ] + - [ -16.0000, -1.03432, 0.06844, -0.00334 ] + - [ -14.0000, -1.08360, 0.04733, -0.00283 ] + - [ -12.0000, -1.09489, 0.03085, -0.00556 ] + - [ -10.0000, -0.92665, 0.01984, -0.02952 ] + - [ -8.0000, -0.69676, 0.01439, -0.04822 ] + - [ -6.0000, -0.43628, 0.01155, -0.06483 ] + - [ -4.0000, -0.16252, 0.01026, -0.07919 ] + - [ -2.0000, 0.10709, 0.00976, -0.09041 ] + - [ -1.0000, 0.23993, 0.00967, -0.09517 ] + - [ 0.0000, 0.37158, 0.00968, -0.09953 ] + - [ 1.0000, 0.50210, 0.00976, -0.10355 ] + - [ 2.0000, 0.63139, 0.00993, -0.10725 ] + - [ 3.0000, 0.75951, 0.01016, -0.11068 ] + - [ 4.0000, 0.88638, 0.01045, -0.11385 ] + - [ 5.0000, 1.01172, 0.01082, -0.11673 ] + - [ 6.0000, 1.13430, 0.01140, -0.11923 ] + - [ 7.0000, 1.25536, 0.01198, -0.12145 ] + - [ 8.0000, 1.37379, 0.01267, -0.12328 ] + - [ 9.0000, 1.48841, 0.01353, -0.12460 ] + - [ 10.0000, 1.59782, 0.01460, -0.12526 ] + - [ 11.0000, 1.70005, 0.01597, -0.12505 ] + - [ 12.0000, 1.79190, 0.01777, -0.12370 ] + - [ 13.0000, 1.86782, 0.02035, -0.12093 ] + - [ 14.0000, 1.92687, 0.02385, -0.11725 ] + - [ 15.0000, 1.90901, 0.03236, -0.10931 ] + - [ 16.0000, 1.88548, 0.04259, -0.10525 ] + - [ 18.0000, 1.72106, 0.07672, -0.10292 ] + - [ 20.0000, 1.54737, 0.11914, -0.11017 ] + - [ 24.0000, 1.37176, 0.20189, -0.13431 ] + - [ 28.0000, 1.33611, 0.27981, -0.15777 ] + - [ 32.0000, 1.24258, 0.37404, -0.18432 ] + - [ 36.1429, 1.16657, 0.46882, -0.21002 ] + - [ 40.2857, 1.09731, 0.56814, -0.23531 ] + - [ 44.4286, 1.02914, 0.66995, -0.25508 ] + - [ 48.5714, 0.95850, 0.77214, -0.27485 ] + - [ 52.7143, 0.88325, 0.87258, -0.29346 ] + - [ 56.8571, 0.80225, 0.96921, -0.31145 ] + - [ 61.0000, 0.71510, 1.06002, -0.32925 ] + - [ 65.1429, 0.62200, 1.14315, -0.34641 ] + - [ 69.2857, 0.52364, 1.21688, -0.36357 ] + - [ 73.4286, 0.42107, 1.27969, -0.37949 ] + - [ 77.5714, 0.31569, 1.33030, -0.39517 ] + - [ 81.7143, 0.20913, 1.36768, -0.40983 ] + - [ 85.8571, 0.10324, 1.39107, -0.42306 ] + - [ 90.0000, 0.00000, 1.40000, -0.43630 ] + - [ 94.1429, -0.07227, 1.39107, -0.44302 ] + - [ 98.2857, -0.14639, 1.36768, -0.44973 ] + - [ 102.4286, -0.22098, 1.33030, -0.45298 ] + - [ 106.5714, -0.29475, 1.27969, -0.45377 ] + - [ 110.7143, -0.36655, 1.21688, -0.45387 ] + - [ 114.8571, -0.43540, 1.14315, -0.45063 ] + - [ 119.0000, -0.50057, 1.06002, -0.44739 ] + - [ 123.1429, -0.56158, 0.96921, -0.44407 ] + - [ 127.2857, -0.61828, 0.87258, -0.44072 ] + - [ 131.4286, -0.67095, 0.77214, -0.43951 ] + - [ 135.5714, -0.72040, 0.66995, -0.44237 ] + - [ 139.7143, -0.76812, 0.56814, -0.44523 ] + - [ 143.8571, -0.81660, 0.46882, -0.45335 ] + - [ 148.0000, -0.86981, 0.37404, -0.46186 ] + - [ 150.2857, -0.80768, 0.32441, -0.46384 ] + - [ 152.5714, -0.74555, 0.27708, -0.44674 ] + - [ 154.8571, -0.68342, 0.23234, -0.42964 ] + - [ 157.1429, -0.62129, 0.19048, -0.41254 ] + - [ 159.4286, -0.55916, 0.15176, -0.39544 ] + - [ 161.7143, -0.49703, 0.11643, -0.40982 ] + - [ 164.0000, -0.43490, 0.08471, -0.43470 ] + - [ 166.2857, -0.37277, 0.05681, -0.45958 ] + - [ 168.5714, -0.31064, 0.03289, -0.48445 ] + - [ 170.8571, -0.24852, 0.02587, -0.45714 ] + - [ 173.1429, -0.18639, 0.02133, -0.34286 ] + - [ 175.4286, -0.12426, 0.01807, -0.22857 ] + - [ 177.7143, -0.06213, 0.01611, -0.11429 ] + - [ 179.9087, 0.00000, 0.01545, 0.00000 ] + - name : FFA-W3-301 # + relative_thickness : 0.301 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.02454, 0.00000 ] + - [ -177.7143, 0.06508, 0.02514, 0.09143 ] + - [ -175.4286, 0.13016, 0.02694, 0.18286 ] + - [ -173.1429, 0.19525, 0.02993, 0.27429 ] + - [ -170.8572, 0.26033, 0.03408, 0.36571 ] + - [ -168.5716, 0.32541, 0.03938, 0.40085 ] + - [ -166.2857, 0.39049, 0.05910, 0.40220 ] + - [ -164.0000, 0.45557, 0.08495, 0.40356 ] + - [ -161.7145, 0.52066, 0.11433, 0.40492 ] + - [ -159.4284, 0.58574, 0.14704, 0.41010 ] + - [ -157.1428, 0.65082, 0.18290, 0.42678 ] + - [ -154.8573, 0.71590, 0.22166, 0.44345 ] + - [ -152.5714, 0.78098, 0.26309, 0.46013 ] + - [ -150.2857, 0.84607, 0.30692, 0.47680 ] + - [ -148.0000, 0.91115, 0.35287, 0.47162 ] + - [ -143.8571, 0.84257, 0.44061, 0.45656 ] + - [ -139.7143, 0.78187, 0.53255, 0.44202 ] + - [ -135.5714, 0.72448, 0.62677, 0.43452 ] + - [ -131.4286, 0.66755, 0.72131, 0.42701 ] + - [ -127.2857, 0.60928, 0.81421, 0.42483 ] + - [ -123.1429, 0.54868, 0.90355, 0.42544 ] + - [ -119.0000, 0.48530, 0.98748, 0.42634 ] + - [ -114.8571, 0.41915, 1.06425, 0.42813 ] + - [ -110.7143, 0.35056, 1.13227, 0.42992 ] + - [ -106.5714, 0.28017, 1.19015, 0.42916 ] + - [ -102.4286, 0.20881, 1.23669, 0.42788 ] + - [ -98.2857, 0.13754, 1.27093, 0.42444 ] + - [ -94.1429, 0.06751, 1.29218, 0.41794 ] + - [ -90.0000, 0.00000, 1.30000, 0.41144 ] + - [ -85.8571, -0.06751, 1.29218, 0.39804 ] + - [ -81.7143, -0.13754, 1.27093, 0.38464 ] + - [ -77.5714, -0.20881, 1.23669, 0.36892 ] + - [ -73.4286, -0.28017, 1.19015, 0.35157 ] + - [ -69.2857, -0.35056, 1.13227, 0.33391 ] + - [ -65.1429, -0.41915, 1.06425, 0.31474 ] + - [ -61.0000, -0.48530, 0.98748, 0.29557 ] + - [ -56.8571, -0.54868, 0.90355, 0.27653 ] + - [ -52.7143, -0.60928, 0.81421, 0.25754 ] + - [ -48.5714, -0.66755, 0.72131, 0.23873 ] + - [ -44.4286, -0.72448, 0.62677, 0.22027 ] + - [ -40.2857, -0.78187, 0.53255, 0.20181 ] + - [ -36.1429, -0.84257, 0.44061, 0.13644 ] + - [ -32.0000, -0.91115, 0.35287, 0.06760 ] + - [ -28.0000, -1.10349, 0.21721, 0.04231 ] + - [ -24.0000, -1.10737, 0.15629, 0.02026 ] + - [ -20.0000, -1.11815, 0.10335, 0.00407 ] + - [ -18.0000, -1.12332, 0.08180, 0.00017 ] + - [ -16.0000, -1.11865, 0.06331, -0.00167 ] + - [ -14.0000, -1.11620, 0.04718, -0.00120 ] + - [ -12.0000, -1.09588, 0.03280, -0.00463 ] + - [ -10.0000, -0.91767, 0.02351, -0.02494 ] + - [ -8.0000, -0.69311, 0.01793, -0.04304 ] + - [ -6.0000, -0.45396, 0.01431, -0.05868 ] + - [ -4.0000, -0.17779, 0.01242, -0.07601 ] + - [ -2.0000, 0.10480, 0.01160, -0.09121 ] + - [ -1.0000, 0.24383, 0.01143, -0.09763 ] + - [ 0.0000, 0.38111, 0.01138, -0.10341 ] + - [ 1.0000, 0.51660, 0.01143, -0.10861 ] + - [ 2.0000, 0.65044, 0.01156, -0.11333 ] + - [ 3.0000, 0.78267, 0.01177, -0.11762 ] + - [ 4.0000, 0.91326, 0.01204, -0.12154 ] + - [ 5.0000, 1.04207, 0.01239, -0.12510 ] + - [ 6.0000, 1.16873, 0.01283, -0.12828 ] + - [ 7.0000, 1.29296, 0.01338, -0.13104 ] + - [ 8.0000, 1.41390, 0.01406, -0.13332 ] + - [ 9.0000, 1.53088, 0.01488, -0.13503 ] + - [ 10.0000, 1.64208, 0.01592, -0.13599 ] + - [ 11.0000, 1.74568, 0.01726, -0.13605 ] + - [ 12.0000, 1.83887, 0.01908, -0.13514 ] + - [ 13.0000, 1.91764, 0.02169, -0.13322 ] + - [ 14.0000, 1.97413, 0.02572, -0.13020 ] + - [ 15.0000, 1.99916, 0.03222, -0.12641 ] + - [ 16.0000, 1.99377, 0.04157, -0.12265 ] + - [ 18.0000, 1.91720, 0.06731, -0.11675 ] + - [ 20.0000, 1.73683, 0.10526, -0.11652 ] + - [ 24.0000, 1.47321, 0.19229, -0.13790 ] + - [ 28.0000, 1.36017, 0.27449, -0.16242 ] + - [ 32.0000, 1.30164, 0.35287, -0.18463 ] + - [ 36.1429, 1.20367, 0.44061, -0.20894 ] + - [ 40.2857, 1.11695, 0.53255, -0.23276 ] + - [ 44.4286, 1.03498, 0.62677, -0.25011 ] + - [ 48.5714, 0.95364, 0.72131, -0.26746 ] + - [ 52.7143, 0.87040, 0.81421, -0.28365 ] + - [ 56.8571, 0.78383, 0.90355, -0.29923 ] + - [ 61.0000, 0.69329, 0.98748, -0.31472 ] + - [ 65.1429, 0.59878, 1.06425, -0.32988 ] + - [ 69.2857, 0.50080, 1.13227, -0.34505 ] + - [ 73.4286, 0.40024, 1.19015, -0.35942 ] + - [ 77.5714, 0.29831, 1.23669, -0.37363 ] + - [ 81.7143, 0.19648, 1.27093, -0.38702 ] + - [ 85.8571, 0.09644, 1.29218, -0.39923 ] + - [ 90.0000, 0.00000, 1.30000, -0.41144 ] + - [ 94.1429, -0.06751, 1.29218, -0.41794 ] + - [ 98.2857, -0.13754, 1.27093, -0.42444 ] + - [ 102.4286, -0.20881, 1.23669, -0.42788 ] + - [ 106.5714, -0.28017, 1.19015, -0.42916 ] + - [ 110.7143, -0.35056, 1.13227, -0.42992 ] + - [ 114.8571, -0.41915, 1.06425, -0.42813 ] + - [ 119.0000, -0.48530, 0.98748, -0.42634 ] + - [ 123.1429, -0.54868, 0.90355, -0.42544 ] + - [ 127.2857, -0.60928, 0.81421, -0.42483 ] + - [ 131.4286, -0.66755, 0.72131, -0.42701 ] + - [ 135.5714, -0.72448, 0.62677, -0.43452 ] + - [ 139.7143, -0.78187, 0.53255, -0.44202 ] + - [ 143.8571, -0.84257, 0.44061, -0.45656 ] + - [ 148.0000, -0.91115, 0.35287, -0.47162 ] + - [ 150.2857, -0.84607, 0.30692, -0.47680 ] + - [ 152.5714, -0.78098, 0.26309, -0.46013 ] + - [ 154.8571, -0.71590, 0.22166, -0.44345 ] + - [ 157.1429, -0.65082, 0.18290, -0.42678 ] + - [ 159.4286, -0.58574, 0.14704, -0.41010 ] + - [ 161.7143, -0.52066, 0.11433, -0.42206 ] + - [ 164.0000, -0.45557, 0.08495, -0.44356 ] + - [ 166.2857, -0.39049, 0.05910, -0.46506 ] + - [ 168.5714, -0.32541, 0.03938, -0.48656 ] + - [ 170.8571, -0.26033, 0.03408, -0.45714 ] + - [ 173.1429, -0.19525, 0.02993, -0.34286 ] + - [ 175.4286, -0.13016, 0.02694, -0.22857 ] + - [ 177.7143, -0.06508, 0.02514, -0.11429 ] + - [ 179.9087, 0.00000, 0.02454, 0.00000 ] + - name : FFA-W3-330blend # + relative_thickness : 0.33 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.03169, 0.00000 ] + - [ -177.7143, 0.06960, 0.03228, 0.09143 ] + - [ -175.4286, 0.13920, 0.03406, 0.18286 ] + - [ -173.1429, 0.20880, 0.03702, 0.27429 ] + - [ -170.8572, 0.27841, 0.04114, 0.36571 ] + - [ -168.5716, 0.34801, 0.04638, 0.40308 ] + - [ -166.2857, 0.41761, 0.05732, 0.40801 ] + - [ -164.0000, 0.48721, 0.08319, 0.41294 ] + - [ -161.7145, 0.55681, 0.11258, 0.41788 ] + - [ -159.4284, 0.62641, 0.14533, 0.42586 ] + - [ -157.1428, 0.69601, 0.18121, 0.44302 ] + - [ -154.8573, 0.76562, 0.22000, 0.46017 ] + - [ -152.5714, 0.83522, 0.26146, 0.47732 ] + - [ -150.2857, 0.90482, 0.30532, 0.49447 ] + - [ -148.0000, 0.97442, 0.35131, 0.48743 ] + - [ -143.8571, 0.89412, 0.43913, 0.46839 ] + - [ -139.7143, 0.82382, 0.53115, 0.44996 ] + - [ -135.5714, 0.75845, 0.62546, 0.43985 ] + - [ -131.4286, 0.69477, 0.72010, 0.42974 ] + - [ -127.2857, 0.63079, 0.81310, 0.42589 ] + - [ -123.1429, 0.56532, 0.90255, 0.42535 ] + - [ -119.0000, 0.49783, 0.98659, 0.42528 ] + - [ -114.8571, 0.42823, 1.06348, 0.42673 ] + - [ -110.7143, 0.35680, 1.13162, 0.42817 ] + - [ -106.5714, 0.28412, 1.18963, 0.42745 ] + - [ -102.4286, 0.21103, 1.23629, 0.42628 ] + - [ -98.2857, 0.13851, 1.27067, 0.42303 ] + - [ -94.1429, 0.06775, 1.29204, 0.41683 ] + - [ -90.0000, 0.00000, 1.30000, 0.41063 ] + - [ -85.8571, -0.06775, 1.29204, 0.39752 ] + - [ -81.7143, -0.13851, 1.27067, 0.38441 ] + - [ -77.5714, -0.21103, 1.23629, 0.36905 ] + - [ -73.4286, -0.28412, 1.18963, 0.35212 ] + - [ -69.2857, -0.35680, 1.13162, 0.33491 ] + - [ -65.1429, -0.42823, 1.06348, 0.31634 ] + - [ -61.0000, -0.49783, 0.98659, 0.29777 ] + - [ -56.8571, -0.56532, 0.90255, 0.27947 ] + - [ -52.7143, -0.63079, 0.81310, 0.26125 ] + - [ -48.5714, -0.69477, 0.72010, 0.24322 ] + - [ -44.4286, -0.75845, 0.62546, 0.22556 ] + - [ -40.2857, -0.82382, 0.53115, 0.20789 ] + - [ -36.1429, -0.89412, 0.43913, 0.13731 ] + - [ -32.0000, -0.97442, 0.35131, 0.06280 ] + - [ -28.0000, -1.16308, 0.20648, 0.03905 ] + - [ -24.0000, -1.14892, 0.15001, 0.01853 ] + - [ -20.0000, -1.09451, 0.10600, 0.00441 ] + - [ -18.0000, -1.05801, 0.08732, -0.00061 ] + - [ -16.0000, -1.02281, 0.07051, -0.00342 ] + - [ -14.0000, -0.99810, 0.05474, -0.00401 ] + - [ -12.0000, -0.98515, 0.04052, -0.00272 ] + - [ -10.0000, -0.89583, 0.02929, -0.01198 ] + - [ -8.0000, -0.67539, 0.02207, -0.03458 ] + - [ -6.0000, -0.43247, 0.01735, -0.05466 ] + - [ -4.0000, -0.15881, 0.01473, -0.07425 ] + - [ -2.0000, 0.13456, 0.01362, -0.09270 ] + - [ -1.0000, 0.28014, 0.01339, -0.10074 ] + - [ 0.0000, 0.42386, 0.01330, -0.10802 ] + - [ 1.0000, 0.56519, 0.01333, -0.11450 ] + - [ 2.0000, 0.70410, 0.01345, -0.12028 ] + - [ 3.0000, 0.84071, 0.01366, -0.12546 ] + - [ 4.0000, 0.97500, 0.01397, -0.13011 ] + - [ 5.0000, 1.10680, 0.01437, -0.13425 ] + - [ 6.0000, 1.23603, 0.01486, -0.13793 ] + - [ 7.0000, 1.36223, 0.01547, -0.14108 ] + - [ 8.0000, 1.48424, 0.01623, -0.14363 ] + - [ 9.0000, 1.60097, 0.01718, -0.14545 ] + - [ 10.0000, 1.71010, 0.01841, -0.14636 ] + - [ 11.0000, 1.80957, 0.02010, -0.14635 ] + - [ 12.0000, 1.89473, 0.02258, -0.14544 ] + - [ 13.0000, 1.95698, 0.02671, -0.14378 ] + - [ 14.0000, 1.98576, 0.03380, -0.14185 ] + - [ 15.0000, 1.99260, 0.04333, -0.14004 ] + - [ 16.0000, 1.99617, 0.05354, -0.13823 ] + - [ 18.0000, 1.96398, 0.07706, -0.13351 ] + - [ 20.0000, 1.81179, 0.11169, -0.13135 ] + - [ 24.0000, 1.56073, 0.19103, -0.14660 ] + - [ 28.0000, 1.46798, 0.27199, -0.17242 ] + - [ 32.0000, 1.39203, 0.35131, -0.19417 ] + - [ 36.1429, 1.27731, 0.43913, -0.21792 ] + - [ 40.2857, 1.17689, 0.53115, -0.24115 ] + - [ 44.4286, 1.08350, 0.62546, -0.25734 ] + - [ 48.5714, 0.99253, 0.72010, -0.27354 ] + - [ 52.7143, 0.90112, 0.81310, -0.28862 ] + - [ 56.8571, 0.80760, 0.90255, -0.30311 ] + - [ 61.0000, 0.71119, 0.98659, -0.31757 ] + - [ 65.1429, 0.61175, 1.06348, -0.33194 ] + - [ 69.2857, 0.50971, 1.13162, -0.34631 ] + - [ 73.4286, 0.40589, 1.18963, -0.36014 ] + - [ 77.5714, 0.30146, 1.23629, -0.37385 ] + - [ 81.7143, 0.19788, 1.27067, -0.38681 ] + - [ 85.8571, 0.09679, 1.29204, -0.39872 ] + - [ 90.0000, 0.00000, 1.30000, -0.41063 ] + - [ 94.1429, -0.06775, 1.29204, -0.41683 ] + - [ 98.2857, -0.13851, 1.27067, -0.42303 ] + - [ 102.4286, -0.21103, 1.23629, -0.42628 ] + - [ 106.5714, -0.28412, 1.18963, -0.42745 ] + - [ 110.7143, -0.35680, 1.13162, -0.42817 ] + - [ 114.8571, -0.42823, 1.06348, -0.42673 ] + - [ 119.0000, -0.49783, 0.98659, -0.42528 ] + - [ 123.1429, -0.56532, 0.90255, -0.42535 ] + - [ 127.2857, -0.63079, 0.81310, -0.42589 ] + - [ 131.4286, -0.69477, 0.72010, -0.42974 ] + - [ 135.5714, -0.75845, 0.62546, -0.43985 ] + - [ 139.7143, -0.82382, 0.53115, -0.44996 ] + - [ 143.8571, -0.89412, 0.43913, -0.46839 ] + - [ 148.0000, -0.97442, 0.35131, -0.48743 ] + - [ 150.2857, -0.90482, 0.30532, -0.49447 ] + - [ 152.5714, -0.83522, 0.26146, -0.47732 ] + - [ 154.8571, -0.76562, 0.22000, -0.46017 ] + - [ 157.1429, -0.69601, 0.18121, -0.44302 ] + - [ 159.4286, -0.62641, 0.14533, -0.42586 ] + - [ 161.7143, -0.55681, 0.11258, -0.43502 ] + - [ 164.0000, -0.48721, 0.08319, -0.45294 ] + - [ 166.2857, -0.41761, 0.05732, -0.47087 ] + - [ 168.5714, -0.34801, 0.04638, -0.48880 ] + - [ 170.8571, -0.27841, 0.04114, -0.45714 ] + - [ 173.1429, -0.20880, 0.03702, -0.34286 ] + - [ 175.4286, -0.13920, 0.03406, -0.22857 ] + - [ 177.7143, -0.06960, 0.03228, -0.11429 ] + - [ 179.9087, 0.00000, 0.03169, 0.00000 ] + - name : FFA-W3-360 # + relative_thickness : 0.36 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.03715, 0.00000 ] + - [ -177.7143, 0.07178, 0.03774, 0.09143 ] + - [ -175.4286, 0.14356, 0.03951, 0.18286 ] + - [ -173.1429, 0.21534, 0.04245, 0.27429 ] + - [ -170.8572, 0.28713, 0.04653, 0.36571 ] + - [ -168.5716, 0.35891, 0.05174, 0.40313 ] + - [ -166.2857, 0.43069, 0.06068, 0.40814 ] + - [ -164.0000, 0.50247, 0.08651, 0.41315 ] + - [ -161.7145, 0.57425, 0.11586, 0.41816 ] + - [ -159.4284, 0.64603, 0.14856, 0.42627 ] + - [ -157.1428, 0.71781, 0.18439, 0.44370 ] + - [ -154.8573, 0.78960, 0.22313, 0.46114 ] + - [ -152.5714, 0.86138, 0.26453, 0.47857 ] + - [ -150.2857, 0.93316, 0.30832, 0.49600 ] + - [ -148.0000, 1.00494, 0.35424, 0.48830 ] + - [ -143.8571, 0.91898, 0.44192, 0.46784 ] + - [ -139.7143, 0.84406, 0.53379, 0.44803 ] + - [ -135.5714, 0.77483, 0.62793, 0.43697 ] + - [ -131.4286, 0.70790, 0.72238, 0.42591 ] + - [ -127.2857, 0.64116, 0.81520, 0.42150 ] + - [ -123.1429, 0.57335, 0.90444, 0.42058 ] + - [ -119.0000, 0.50388, 0.98826, 0.42024 ] + - [ -114.8571, 0.43261, 1.06493, 0.42168 ] + - [ -110.7143, 0.35981, 1.13285, 0.42312 ] + - [ -106.5714, 0.28603, 1.19061, 0.42258 ] + - [ -102.4286, 0.21209, 1.23704, 0.42163 ] + - [ -98.2857, 0.13899, 1.27116, 0.41864 ] + - [ -94.1429, 0.06787, 1.29229, 0.41277 ] + - [ -90.0000, 0.00000, 1.30000, 0.40690 ] + - [ -85.8571, -0.06787, 1.29229, 0.39426 ] + - [ -81.7143, -0.13899, 1.27116, 0.38162 ] + - [ -77.5714, -0.21209, 1.23704, 0.36676 ] + - [ -73.4286, -0.28603, 1.19061, 0.35033 ] + - [ -69.2857, -0.35981, 1.13285, 0.33362 ] + - [ -65.1429, -0.43261, 1.06493, 0.31561 ] + - [ -61.0000, -0.50388, 0.98826, 0.29759 ] + - [ -56.8571, -0.57335, 0.90444, 0.27989 ] + - [ -52.7143, -0.64116, 0.81520, 0.26230 ] + - [ -48.5714, -0.70790, 0.72238, 0.24491 ] + - [ -44.4286, -0.77483, 0.62793, 0.22794 ] + - [ -40.2857, -0.84406, 0.53379, 0.21097 ] + - [ -36.1429, -0.91898, 0.44192, 0.13525 ] + - [ -32.0000, -1.00494, 0.35424, 0.05517 ] + - [ -28.0000, -1.11306, 0.20494, 0.03211 ] + - [ -24.0000, -1.05425, 0.15434, 0.01268 ] + - [ -20.0000, -0.98247, 0.10967, -0.00282 ] + - [ -18.0000, -0.94173, 0.09249, -0.00741 ] + - [ -16.0000, -0.89333, 0.07597, -0.01107 ] + - [ -14.0000, -0.85472, 0.06054, -0.01250 ] + - [ -12.0000, -0.82348, 0.04641, -0.01177 ] + - [ -10.0000, -0.79541, 0.03441, -0.01082 ] + - [ -8.0000, -0.63650, 0.02548, -0.02769 ] + - [ -6.0000, -0.39095, 0.01994, -0.05107 ] + - [ -4.0000, -0.13071, 0.01653, -0.07148 ] + - [ -2.0000, 0.16173, 0.01507, -0.09179 ] + - [ -1.0000, 0.31121, 0.01477, -0.10119 ] + - [ 0.0000, 0.45956, 0.01465, -0.10988 ] + - [ 1.0000, 0.60566, 0.01466, -0.11776 ] + - [ 2.0000, 0.74868, 0.01481, -0.12477 ] + - [ 3.0000, 0.88862, 0.01507, -0.13098 ] + - [ 4.0000, 1.02544, 0.01544, -0.13648 ] + - [ 5.0000, 1.15878, 0.01593, -0.14130 ] + - [ 6.0000, 1.28822, 0.01654, -0.14540 ] + - [ 7.0000, 1.41282, 0.01731, -0.14875 ] + - [ 8.0000, 1.53090, 0.01831, -0.15118 ] + - [ 9.0000, 1.64065, 0.01963, -0.15262 ] + - [ 10.0000, 1.73926, 0.02150, -0.15310 ] + - [ 11.0000, 1.81971, 0.02445, -0.15254 ] + - [ 12.0000, 1.87065, 0.02966, -0.15121 ] + - [ 13.0000, 1.89221, 0.03770, -0.14969 ] + - [ 14.0000, 1.87910, 0.04824, -0.14562 ] + - [ 15.0000, 1.88111, 0.05838, -0.14358 ] + - [ 16.0000, 1.86359, 0.06992, -0.14095 ] + - [ 18.0000, 1.73324, 0.10166, -0.13711 ] + - [ 20.0000, 1.59357, 0.13916, -0.14082 ] + - [ 24.0000, 1.46708, 0.21002, -0.15693 ] + - [ 28.0000, 1.44834, 0.28200, -0.17979 ] + - [ 32.0000, 1.43563, 0.35424, -0.20147 ] + - [ 36.1429, 1.31283, 0.44192, -0.22409 ] + - [ 40.2857, 1.20580, 0.53379, -0.24619 ] + - [ 44.4286, 1.10690, 0.62793, -0.26133 ] + - [ 48.5714, 1.01129, 0.72238, -0.27648 ] + - [ 52.7143, 0.91594, 0.81520, -0.29062 ] + - [ 56.8571, 0.81907, 0.90444, -0.30424 ] + - [ 61.0000, 0.71982, 0.98826, -0.31787 ] + - [ 65.1429, 0.61801, 1.06493, -0.33154 ] + - [ 69.2857, 0.51401, 1.13285, -0.34522 ] + - [ 73.4286, 0.40862, 1.19061, -0.35846 ] + - [ 77.5714, 0.30299, 1.23704, -0.37161 ] + - [ 81.7143, 0.19855, 1.27116, -0.38405 ] + - [ 85.8571, 0.09695, 1.29229, -0.39547 ] + - [ 90.0000, 0.00000, 1.30000, -0.40690 ] + - [ 94.1429, -0.06787, 1.29229, -0.41277 ] + - [ 98.2857, -0.13899, 1.27116, -0.41864 ] + - [ 102.4286, -0.21209, 1.23704, -0.42163 ] + - [ 106.5714, -0.28603, 1.19061, -0.42258 ] + - [ 110.7143, -0.35981, 1.13285, -0.42312 ] + - [ 114.8571, -0.43261, 1.06493, -0.42168 ] + - [ 119.0000, -0.50388, 0.98826, -0.42024 ] + - [ 123.1429, -0.57335, 0.90444, -0.42058 ] + - [ 127.2857, -0.64116, 0.81520, -0.42150 ] + - [ 131.4286, -0.70790, 0.72238, -0.42591 ] + - [ 135.5714, -0.77483, 0.62793, -0.43697 ] + - [ 139.7143, -0.84406, 0.53379, -0.44803 ] + - [ 143.8571, -0.91898, 0.44192, -0.46784 ] + - [ 148.0000, -1.00494, 0.35424, -0.48830 ] + - [ 150.2857, -0.93316, 0.30832, -0.49600 ] + - [ 152.5714, -0.86138, 0.26453, -0.47857 ] + - [ 154.8571, -0.78960, 0.22313, -0.46114 ] + - [ 157.1429, -0.71781, 0.18439, -0.44370 ] + - [ 159.4286, -0.64603, 0.14856, -0.42627 ] + - [ 161.7143, -0.57425, 0.11586, -0.43530 ] + - [ 164.0000, -0.50247, 0.08651, -0.45315 ] + - [ 166.2857, -0.43069, 0.06068, -0.47100 ] + - [ 168.5714, -0.35891, 0.05174, -0.48884 ] + - [ 170.8571, -0.28713, 0.04653, -0.45714 ] + - [ 173.1429, -0.21534, 0.04245, -0.34286 ] + - [ 175.4286, -0.14356, 0.03951, -0.22857 ] + - [ 177.7143, -0.07178, 0.03774, -0.11429 ] + - [ 179.9087, 0.00000, 0.03715, 0.00000 ] + + + + pitch_control: + GS_Angles: [0.06019804, 0.08713416, 0.10844806, 0.12685912, 0.14339822, 0.1586021 , 0.17279614, 0.18618935, 0.19892772, 0.21111989, 0.22285021, 0.23417256, 0.2451469 , 0.25580691, 0.26619545, 0.27632495, 0.28623134, 0.29593266, 0.30544521, 0.314779 , 0.32395154, 0.33297489, 0.3418577 , 0.35060844, 0.35923641, 0.36774807, 0.37614942, 0.38444655, 0.39264363, 0.40074407] + GS_Kp: [-0.9394215 , -0.80602855, -0.69555026, -0.60254912, -0.52318192, -0.45465531, -0.39489024, -0.34230736, -0.29568537, -0.25406506, -0.2166825 , -0.18292183, -0.15228099, -0.12434663, -0.09877533, -0.0752794 , -0.05361604, -0.0335789 , -0.01499149, 0.00229803, 0.01842102, 0.03349169, 0.0476098 , 0.0608629 , 0.07332812, 0.0850737 , 0.0961602 , 0.10664158, 0.11656607, 0.12597691] + GS_Ki: [-0.07416547, -0.06719673, -0.0614251 , -0.05656651, -0.0524202 , -0.04884022, -0.04571796, -0.04297091, -0.04053528, -0.03836094, -0.03640799, -0.03464426, -0.03304352, -0.03158417, -0.03024826, -0.02902079, -0.02788904, -0.02684226, -0.02587121, -0.02496797, -0.02412567, -0.02333834, -0.02260078, -0.02190841, -0.0212572 , -0.02064359, -0.0200644 , -0.01951683, -0.01899836, -0.01850671] + Fl_Kp: -9.35 + wt_ops: + v: [3.0, 3.266896551724138, 3.533793103448276, 3.800689655172414, 4.067586206896552, 4.334482758620689, 4.601379310344828, 4.868275862068966, 5.135172413793104, 5.402068965517241, 5.6689655172413795, 5.935862068965518, 6.2027586206896554, 6.469655172413793, 6.736551724137931, 7.00344827586207, 7.270344827586207, 7.537241379310345, 7.804137931034483, 8.071034482758622, 8.337931034482759, 8.604827586206897, 8.871724137931036, 9.138620689655173, 9.405517241379311, 9.672413793103448, 9.939310344827586, 10.206206896551725, 10.473103448275863, 10.74, 11.231724137931035, 11.723448275862069, 12.215172413793104, 12.706896551724139, 13.198620689655172, 13.690344827586207, 14.182068965517242, 14.673793103448276, 15.16551724137931, 15.657241379310346, 16.14896551724138, 16.640689655172416, 17.13241379310345, 17.624137931034483, 18.11586206896552, 18.607586206896553, 19.099310344827586, 19.591034482758623, 20.082758620689653, 20.57448275862069, 21.066206896551726, 21.557931034482756, 22.049655172413793, 22.54137931034483, 23.03310344827586, 23.524827586206897, 24.016551724137933, 24.508275862068963, 25.0] + pitch_op: [-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, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, 3.57152, 5.12896, 6.36736, 7.43866, 8.40197, 9.28843, 10.1161, 10.8974, 11.641, 12.3529, 13.038, 13.6997, 14.3409, 14.9642, 15.5713, 16.1639, 16.7435, 17.3109, 17.8673, 18.4136, 18.9506, 19.4788, 19.9989, 20.5112, 21.0164, 21.5147, 22.0067, 22.4925, 22.9724] + omega_op: [2.1486, 2.3397, 2.5309, 2.722, 2.9132, 3.1043, 3.2955, 3.4866, 3.6778, 3.8689, 4.0601, 4.2512, 4.4424, 4.6335, 4.8247, 5.0159, 5.207, 5.3982, 5.5893, 5.7805, 5.9716, 6.1628, 6.3539, 6.5451, 6.7362, 6.9274, 7.1185, 7.3097, 7.5008, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56] + gear_ratio: 1 + torque_control: + VS_KP: -38609162.66552 + VS_KI: -4588245.18720 + + + tower: # (could remove some entries that don't apply for the tower) + dlsMax : 5.0 # maximum node splitting section amount; can't be 0 + + name : tower # [-] an identifier (no longer has to be number) + type : rigid # [-] + rA : [ 0, 0, 15] # [m] end A coordinates + rB : [ 0, 0, 144.582] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + + # --- outer shell including hydro--- + stations : [ 15, 28, 28.001, 41, 41.001, 54, 54.001, 67, 67.001, 80, 80.001, 93, 93.001, 106, 106.001, 119, 119.001, 132, 132.001, 144.582 ] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : [ 10, 9.964, 9.964, 9.967, 9.967, 9.927, 9.927, 9.528, 9.528, 9.149, 9.149, 8.945, 8.945, 8.735, 8.735, 8.405, 8.405, 7.321, 7.321, 6.5 ] # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : [ 0.082954, 0.082954, 0.083073, 0.083073, 0.082799, 0.082799, 0.0299, 0.0299, 0.027842, 0.027842, 0.025567, 0.025567, 0.022854, 0.022854, 0.02025, 0.02025, 0.018339, 0.018339, 0.021211, 0.021211 ] # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 0.0 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 0.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + # (neglecting axial coefficients for now) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] material density + + + + + + + +platform: + + potModMaster : 1 # [int] master switch for potMod variables; 0=keeps all member potMod vars the same, 1=turns all potMod vars to False (no HAMS), 2=turns all potMod vars to True (no strip) + dlsMax : 5.0 # maximum node splitting section amount for platform members; can't be 0 + qtfPath : 'IEA-15-240-RWT-UMaineSemi.12d' # path to the qtf file for the platform + + members: # list all members here + + - name : center_column # [-] an identifier (no longer has to be number) + type : rigid # [-] + rA : [ 0, 0, -20] # [m] end A coordinates + rB : [ 0, 0, 15] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + # --- outer shell including hydro--- + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 10.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 0.6 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 0.93 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.6 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 1.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + # --- handling of end caps or any internal structures if we need them --- + cap_stations : [ 0 ] # [m] location along member of any inner structures (in same scaling as set by 'stations') + cap_t : [ 0.001 ] # [m] thickness of any internal structures + cap_d_in : [ 0 ] # [m] inner diameter of internal structures (0 for full cap/bulkhead, >0 for a ring shape) + + + - name : outer_column # [-] an identifier (no longer has to be number) + type : rigid # [-] + rA : [51.75, 0, -20] # [m] end A coordinates + rB : [51.75, 0, 15] # [m] and B coordinates + heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + # --- outer shell including hydro--- + stations : [0, 35] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 12.5 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 0.6 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 0.93 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 1.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.7 # value of 3.0 gives more heave response # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + # --- ballast --- + l_fill : 1.4 # [m] + rho_fill : 5000 # [kg/m3] + # --- handling of end caps or any internal structures if we need them --- + cap_stations : [ 0 ] # [m] location along member of any inner structures (in same scaling as set by 'stations') + cap_t : [ 0.001 ] # [m] thickness of any internal structures + cap_d_in : [ 0 ] # [m] inner diameter of internal structures (0 for full cap/bulkhead, >0 for a ring shape) + + + - name : pontoon # [-] an identifier (no longer has to be number) + type : rigid # [-] + rA : [ 5 , 0, -16.5] # [m] end A coordinates + rB : [ 45.5, 0, -16.5] # [m] and B coordinates + heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) + shape : rect # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : False # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + # --- outer shell including hydro--- + stations : [0, 40.5] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : [12.4, 7.0] # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : [1.5, 2.2 ] # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : [2.2, 0.2 ] # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + l_fill : 40.5 # [m] + rho_fill : 1025.0 # [kg/m3] + + + - name : upper_support # [-] an identifier (no longer has to be number) + type : rigid # [-] + rA : [ 5 , 0, 14.545] # [m] end A coordinates + rB : [ 45.5, 0, 14.545] # [m] and B coordinates + heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : False # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + # --- outer shell including hydro--- + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 0.91 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.01 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 0.0 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 0.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + + +mooring: + water_depth: 200 # [m] uniform water depth + moorMod : 1 # 0: quasi-static mooring model (stiffness only); 1: quasi-static mooring model for body dynamics (stiffness only), post-processing of line tensions using lumped mass (stiffness, inertia and damping); 2: both body dynamics and mooring tensions solved using lumped mass + file: 'IEA-15-240-RWT-UMaineSemi_MoorDyn.dat' \ No newline at end of file diff --git a/examples/example_from_yaml.py b/examples/example_from_yaml.py index 2c142d1e..e4caf011 100644 --- a/examples/example_from_yaml.py +++ b/examples/example_from_yaml.py @@ -27,7 +27,7 @@ def run_example(plot_flag = False): model.plotResponses() # Visualize the system in its most recently evaluated mean offset position - model.plot() + model.plot(plot_frame=True) # flag plot_frame is used to plot the structural nodes and rigid links that are part of the structure. The default is False plt.show() diff --git a/pyproject.toml b/pyproject.toml index 8f24a627..e33345cd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "OpenRAFT" -version = "1.5.0" +version = "2.0.0" description = "RAFT: Response Amplitudes of Floating Turbines" readme = "README.md" requires-python = ">=3.9" @@ -17,6 +17,7 @@ maintainers = [ {name = "Matthew Hall", email = "matthew.hall@nrel.gov"}, {name = "Stein Housner", email = "stein.housner@nrel.gov"}, {name = "Daniel Zalkind", email = "daniel.zalkind@nrel.gov"}, + {name = "Lucas Carmo", email = "lucas.carmo@nrel.gov"}, ] classifiers = [ # Optional # How mature is this project? Common values are diff --git a/raft/helpers.py b/raft/helpers.py index ca8f0ef3..cc055789 100644 --- a/raft/helpers.py +++ b/raft/helpers.py @@ -61,6 +61,89 @@ def FrustumVCV(dA, dB, H, rtn=0): return V elif rtn==2: return hc + +def FrustumMOI(dA, dB, H, p): + '''returns the radial and axial moments of inertia of a potentially tapered circular member about the end node. + Previously used equations found in a HydroDyn paper, now it uses newly derived ones. Ask Stein for reference if needed''' + if H==0: # if there's no height, mainly refering to no ballast, there shouldn't be any extra MoI + I_rad = 0 # radial MoI about end node [kg-m^2] + I_ax = 0 # axial MoI about axial axis [kg-m^2] + else: + if dA==dB: # if it's a cylinder + r1 = dA/2 # bottom radius [m] + r2 = dB/2 # top radius [m] + I_rad = (1/12)*(p*H*np.pi*r1**2)*(3*r1**2 + 4*H**2) # radial MoI about end node [kg-m^2] + I_ax = (1/2)*p*np.pi*H*r1**4 # axial MoI about axial axis [kg-m^2] + else: # if it's a tapered cylinder (frustum) + r1 = dA/2 # bottom radius [m] + r2 = dB/2 # top radius [m] + I_rad = (1/20)*p*np.pi*H*(r2**5 - r1**5)/(r2 - r1) + (1/30)*p*np.pi*H**3*(r1**2 + 3*r1*r2 + 6*r2**2) # radial MoI about end node [kg-m^2] + I_ax = (1/10)*p*np.pi*H*(r2**5-r1**5)/(r2-r1) # axial MoI about axial axis [kg-m^2] + + return I_rad, I_ax + +def RectangularFrustumMOI(La, Wa, Lb, Wb, H, p): + '''returns the moments of inertia about the end node of a cuboid that can be tapered. + - Inputs the lengths and widths at the top and bottom of the cuboid, as well as the height and material density. + - L is the side length along the local x-direction, W is the side length along the local y-direction. + - Does not work for members that are not symmetrical about the axial axis. + - Works for cases when it is a perfect cuboid, a truncated pyramid, and a truncated triangular prism + - Equations derived by hand, ask Stein for reference if needed''' + + if H==0: # if there's no height, mainly refering to no ballast, there shouldn't be any extra MoI + Ixx = 0 # MoI around the local x-axis about the end node [kg-m^2] + Iyy = 0 # MoI around the local y-axis about the end node [kg-m^2] + Izz = 0 # MoI around the local z-axis about the axial axis [kg-m^2] + else: + if La==Lb and Wa==Wb: # if it's a cuboid + L = La # length of the cuboid (La=Lb) [m] + W = Wa # width of the cuboid (Wa=Wb) [m] + M = p*L*W*H # mass of the cuboid [kg] + + Ixx = (1/12)*M*(W**2 + 4*H**2) # MoI around the local x-axis about the end node [kg-m^2] + Iyy = (1/12)*M*(L**2 + 4*H**2) # MoI around the local y-axis about the end node [kg-m^2] + Izz = (1/12)*M*(L**2 + W**2) # MoI around the local z-axis about the axial axis [kg-m^2] + + elif La!=Lb and Wa!=Wb: # if it's a truncated pyramid for both side lengths + + x2 = (1/12)*p* ( (Lb-La)**3*H*(Wb/5 + Wa/20) + (Lb-La)**2*La*H*(3*Wb/4 + Wa/4) + \ + (Lb-La)*La**2*H*(Wb + Wa/2) + La**3*H*(Wb/2 + Wa/2) ) + + y2 = (1/12)*p* ( (Wb-Wa)**3*H*(Lb/5 + La/20) + (Wb-Wa)**2*Wa*H*(3*Lb/4 + La/4) + \ + (Wb-Wa)*Wa**2*H*(Lb + La/2) + Wa**3*H*(Lb/2 + La/2) ) + + z2 = p*( Wb*Lb/5 + Wa*Lb/20 + La*Wb/20 + Wa*La*(1/30) ) * H**3 + + Ixx = y2+z2 # MoI around the local x-axis about the end node [kg-m^2] + Iyy = x2+z2 # MoI around the local y-axis about the end node [kg-m^2] + Izz = x2+y2 # MoI around the local z-axis about the axial axis [kg-m^2] + + elif La==Lb and Wa!=Wb: # if it's a truncated triangular prism where only the lengths are the same on top and bottom + L = La # length of the truncated triangular prism [m] + + x2 = (1/24)*p*(L**3)*H*(Wb+Wa) + y2 = (1/48)*p*L*H*( Wb**3 + Wa*Wb**2 + Wa**2*Wb + Wa**3 ) + z2 = (1/12)*p*L*(H**3)*( 3*Wb + Wa ) + + Ixx = y2+z2 # MoI around the local x-axis about the end node [kg-m^2] + Iyy = x2+z2 # MoI around the local y-axis about the end node [kg-m^2] + Izz = x2+y2 # MoI around the local z-axis about the axial axis [kg-m^2] + + elif La!=Lb and Wa==Wb: # if it's a truncated triangular prism where only the widths are the same on top and bottom + W = Wa # width of the truncated triangular prism [m] + + x2 = (1/48)*p*W*H*( Lb**3 + La*Lb**2 + La**2*Lb + La**3 ) + y2 = (1/24)*p*(W**3)*H*(Lb+La) + z2 = (1/12)*p*W*(H**3)*( 3*Lb + La ) + + Ixx = y2+z2 # MoI around the local x-axis about the end node [kg-m^2] + Iyy = x2+z2 # MoI around the local y-axis about the end node [kg-m^2] + Izz = x2+y2 # MoI around the local z-axis about the axial axis [kg-m^2] + + else: + raise ValueError('You either have inconsistent inputs, or you are trying to calculate the MoI of a member that is not supported') + + return Ixx, Iyy, Izz def getKinematics(r, Xi, ws): @@ -678,8 +761,11 @@ def JONSWAP(ws, Hs, Tp, Gamma=None): def getRAO(Xi, zeta): '''Calculates the response amplitude operator (RAO). - It is simply the reponse (motion, load, anything) for unitary wave amplitude. - Xi can have any number of dimensions, but the last dimension must be the same length as zeta. + It is simply the reponse (motion, load, anything) for unitary wave amplitude. + + Inputs: + Xi: Motions amplitudes with any number of dimensions, but the last dimension must be the same length as zeta. + zeta: Wave amplitudes. Must be a 1D array. ''' # Check if zeta is a 1D array if len(zeta.shape) != 1: @@ -697,6 +783,37 @@ def getRAO(Xi, zeta): RAO[..., idx] = Xi[..., idx] / zeta[idx] return RAO +def getLineEndsRAO(line, ms, w, Xi, S, rBody): + '''Compute the RAOs of the ends of a MoorPy line object + Inputs + line: MoorPy line object + ms: MoorPy system object + w: Frequency vector of length nw [rad/s] + Xi: List with nFOWTs arrays, each with size 6 x nFreq arrays, corresponding to the motion amplitudes of the fowts in the array [m] and [rad] + S: Wave spectrum vector with length nw [m] + rBody: List of arrays with the x,y,z position of the bodies in the array [m] - len(rBody) = nFOWTs + ''' + zeta = np.sqrt(2*S*(w[1]-w[0])) # Wave amplitude + + # End A of the line + RAO_A = np.zeros([3, len(w)]) + endA = [point for point in ms.pointList if all(point.r==line.rA)][0] # find the point that correspond to the line's end A + for ibody, body in enumerate(ms.bodyList): + if endA.number in body.attachedP: + fowtRAO = getRAO(Xi[ibody], zeta) + RAO_A, _, _ = getKinematics(endA.r - rBody[ibody], fowtRAO, w) + break + + # End B of the line + RAO_B = np.zeros([3, len(w)]) + endB = [point for point in ms.pointList if all(point.r==line.rB)][0] # find the point that correspond to the line's end A + for ibody, body in enumerate(ms.bodyList): + if endB.number in body.attachedP: + fowtRAO = getRAO(Xi[ibody], zeta) + RAO_B, _, _ = getKinematics(endB.r - rBody[ibody], fowtRAO, w) + break + + return RAO_A, RAO_B def printMat(mat): '''Print a matrix''' @@ -940,6 +1057,73 @@ def convertIEAturbineYAML2RAFT(fname_turbine): return d +def getWeightOfPointMass(mass, dR, g=9.81): + ''' Returns the 6-component weight load and the (6,6) weight stiffness matrix matrix with respect to the reference point (RP). + This matrix is usually included in the hydrostatic stiffness matrix in naval architecture. + + Parameters + ---------- + mass : float + mass associated to the point [kg] + dR : array(3,) + vector from the reference point (RP) to the center of mass of the point, dR = rCOG - rRP [m] + g : float, optional + gravitational acceleration [m/s^2] + ''' + + W = translateForce3to6DOF( np.array([0,0, -g*mass]), dR) + + C = np.zeros([6,6]) + C[3, 3] += -mass*g*dR[2] # Overturning roll moment + C[4, 4] += -mass*g*dR[2] # Overturning pitch moment + # C[3, 5] += mass*g*dR[0] # Neglecting these components for now + # C[4, 5] += mass*g*dR[1] + + return W, C + +def getMassAndCenterOfBeam(M, r): + ''' Returns the mass and center of gravity of a beam member given its mass matrix M and position vector r. + The center of gravity is given in the same coordinate system as the position vector r. + + Parameters + ---------- + M : array(nDOF, nDOF) + Mass matrix of the beam member, where nDOF is the number of degrees of freedom (6xNnodes for a 3D beam). + r : array(nDOF,) + Position vector of the nodes of the beam member, (x, y, z, rotation x, rotation y, rotation z) for each node. + Rotations are not used but need the proper vector size to match the dimensions of M + ''' + # Check if M is a 2D array + if not isinstance(M, np.ndarray) or M.ndim != 2: + raise ValueError("Mass matrix M must be a 2D array.") + + # Check if M is square + if M.shape[0] != M.shape[1]: + raise ValueError("Mass matrix M must be square.") + + # Check if r is a 1D array with the same length as M's rows or columns + if not isinstance(r, np.ndarray) or r.ndim != 1 or r.shape[0] != M.shape[0]: + raise ValueError("Position vector r must be a 1D array with the same dofs as M.") + + nDOF = M.shape[0] # Number of degrees of freedom + + # To get the mass and center of gravity, we apply unit translational acceleration in the X, Y, and Z directions to all nodes (beam moving as a rigid body) + X_aux, Y_aux, Z_aux = np.zeros((nDOF)), np.zeros((nDOF)), np.zeros((nDOF)) + X_aux[::6] = 1 + Y_aux[1::6] = 1 + Z_aux[2::6] = 1 + + # The mass is simply the sum of any of the product of M by any _aux displacement vector + mass = np.sum((M @ X_aux)*X_aux) + + # For the COG, we first multiply the translation vector the position of each node to act as weights to the weighted average that results in the COG + center_X = np.sum(M @ (r * X_aux) * X_aux) / mass if mass != 0 else 0 # center of mass in the X direction [m] + center_Y = np.sum(M @ (r * Y_aux) * Y_aux) / mass if mass != 0 else 0 # center of mass in the Y direction [m] + center_Z = np.sum(M @ (r * Z_aux) * Z_aux) / mass if mass != 0 else 0 # center of mass in the Z direction [m] + center = np.array([center_X, center_Y, center_Z]) # center of mass [m] + + return mass, center + # ----- additional helper functions from Joep van der Spek ----- diff --git a/raft/omdao_raft.py b/raft/omdao_raft.py index 49f659d1..19b87007 100644 --- a/raft/omdao_raft.py +++ b/raft/omdao_raft.py @@ -143,6 +143,11 @@ def setup(self): self.add_input("mu_air", val=1.81e-5, units="kg/(m*s)", desc="Dynamic viscosity of air") self.add_input("shear_exp", val=0.2, desc="Shear exponent of the wind.") self.add_input('rated_rotor_speed', val=0.0, units='rpm', desc='rotor rotation speed at rated') + + for k in range(modeling_opt['floating']['rigid_bodies']['n_bodies']): + self.add_input(f"rigid_body_{k}_node", val=np.zeros(3), units="m", desc=f"location of rigid body {k}") + self.add_input(f"rigid_body_{k}_mass", val=0.0, units="kg", desc=f"point mass of rigid body {k}") + self.add_input(f"rigid_body_{k}_inertia", val=np.zeros(3), units="kg*m**2", desc=f"inertia of rigid body {k}") # member inputs for i in range(1, nmembers + 1): @@ -209,8 +214,8 @@ def setup(self): self.add_input(m_name+'CaEnd', val=0.0, desc='End axial added mass coefficient') else: self.add_input(m_name+'CdEnd', val=np.zeros(mnpts), desc='End axial drag coefficient') - self.add_input(m_name+'CaEnd', val=np.zeros(mnpts), desc='End axial added mass coefficient') - + self.add_input(m_name+'CaEnd', val=np.zeros(mnpts), desc='End axial added mass coefficient') + self.add_input(m_name+'rho_shell', val=0.0, units='kg/m**3', desc='Material density') # optional self.add_input(m_name+'l_fill', val=np.zeros(mnpts_lfill), units='m', desc='Fill heights of ballast in each section') @@ -426,7 +431,7 @@ def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): # Tower design['turbine']['tower'] = {} design['turbine']['tower']['name'] = 'tower' - design['turbine']['tower']['type'] = 1 + design['turbine']['tower']['type'] = 'rigid' design['turbine']['tower']['rA'] = inputs['turbine_tower_rA'] design['turbine']['tower']['rB'] = inputs['turbine_tower_rB'] # RAFT always wants rA below rB, this needs to be flipped for MHKs @@ -505,6 +510,10 @@ def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): # Platform members design['platform'] = {} design['platform']['potModMaster'] = int(modeling_opt['potential_model_override']) + # potFirstOrder needs to be 1 to read pre-existing WAMIT-like file + if design['platform']['potModMaster'] == 3: + design['platform']['potFirstOrder'] = 1 + design['platform']['hydroPath'] = modeling_opt['BEM_dir'] design['platform']['dlsMax'] = float(modeling_opt['dls_max']) design['platform']["intersectMesh"] = intersectMesh if intersectMesh==1: @@ -513,6 +522,20 @@ def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): else: design['platform']['characteristic_length_min'] = 1.0 design['platform']['characteristic_length_max'] = 3.0 + + # Add rigid bodies (add external loads here, too, someday) + additional_effects = [] + for k in range(modeling_opt['floating']['rigid_bodies']['n_bodies']): + add_eff = {} + add_eff['type'] = 'point_inertia' + add_eff['location'] = inputs[f"rigid_body_{k}_node"] + add_eff['mass'] = float(inputs[f"rigid_body_{k}_mass"][0]) + add_eff['moments_of_inertia'] = np.r_[inputs[f"rigid_body_{k}_inertia"],0.0,0.0,0.0] # RAFT expects 6D inertia vector + additional_effects.append(add_eff) + + if additional_effects: + design['platform']['additional_effects'] = additional_effects + # lowest BEM freq needs to be just below RAFT min_freq because of interpolation in RAFT if float(modeling_opt['min_freq_BEM']) >= modeling_opt['min_freq']: modeling_opt['min_freq_BEM'] = modeling_opt['min_freq'] - 1e-7 @@ -540,7 +563,7 @@ def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): extensionA = np.linalg.norm(rA_0-rA) extensionB = np.linalg.norm(rB_0-rB) design['platform']['members'][i]['name'] = m_name - design['platform']['members'][i]['type'] = i + 2 + design['platform']['members'][i]['type'] = 'rigid' design['platform']['members'][i]['rA'] = rA design['platform']['members'][i]['rB'] = rB design['platform']['members'][i]['extensionA'] = extensionA @@ -826,7 +849,8 @@ def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): # use only first rotor/turbine case_metrics = [cm[0] for cm in results['case_metrics'].values()] stat = np.squeeze(np.array([cm[iout] for cm in case_metrics])) - outputs['stats_'+iout][case_mask] = stat + if np.any(case_mask): + outputs['stats_'+iout][case_mask] = stat # Other case outputs # for n in ['wind_PSD','wave_PSD']: @@ -844,13 +868,14 @@ def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): outputs["yaw_period"] = outputs["rigid_body_periods"][5] # Compute some aggregate outputs manually - outputs['Max_Offset'] = np.sqrt(outputs['stats_surge_max'][case_mask]**2 + outputs['stats_sway_max'][case_mask]**2).max() - outputs['heave_avg'] = outputs['stats_heave_avg'][case_mask].mean() - outputs['Max_PtfmPitch'] = outputs['stats_pitch_max'][case_mask].max() - outputs['Std_PtfmPitch'] = outputs['stats_pitch_std'][case_mask].mean() - outputs['max_nac_accel'] = outputs['stats_AxRNA_std'][case_mask].max() - outputs['rotor_overspeed'] = (outputs['stats_omega_max'][case_mask].max() - inputs['rated_rotor_speed']) / inputs['rated_rotor_speed'] - outputs['max_tower_base'] = outputs['stats_Mbase_max'][case_mask].max() + if np.any(case_mask): + outputs['Max_Offset'] = np.sqrt(outputs['stats_surge_max'][case_mask]**2 + outputs['stats_sway_max'][case_mask]**2).max() + outputs['heave_avg'] = outputs['stats_heave_avg'][case_mask].mean() + outputs['Max_PtfmPitch'] = outputs['stats_pitch_max'][case_mask].max() + outputs['Std_PtfmPitch'] = outputs['stats_pitch_std'][case_mask].mean() + outputs['max_nac_accel'] = outputs['stats_AxRNA_max'][case_mask].max() + outputs['rotor_overspeed'] = (outputs['stats_omega_max'][case_mask].max() - inputs['rated_rotor_speed']) / inputs['rated_rotor_speed'] + outputs['max_tower_base'] = outputs['stats_Mbase_max'][case_mask].max() # Combined outputs for OpenFAST outputs['platform_displacement'] = model.fowtList[0].V diff --git a/raft/raft_fowt.py b/raft/raft_fowt.py index 1cf56dce..9bbf0924 100644 --- a/raft/raft_fowt.py +++ b/raft/raft_fowt.py @@ -9,7 +9,9 @@ from raft.helpers import * from raft.raft_member import Member from raft.raft_rotor import Rotor +from raft.raft_node import Node import moorpy as mp +from moorpy.helpers import lines2ss, transformPosition # Attempt to import pygmsh and meshmagick with warnings if not installed try: @@ -58,11 +60,15 @@ def __init__(self, design, w, mpb, depth=600, x_ref=0, y_ref=0, heading_adjust=0 print("Making FOWT") # basic setup - self.nDOF = 6 - self.nw = len(w) # number of frequencies - self.Xi0 = np.zeros( self.nDOF) # mean offsets of platform from its reference point [m, rad] - self.Xi = np.zeros([self.nDOF, self.nw], dtype=complex) # complex response amplitudes as a function of frequency [m, rad] - self.heading_adjust = heading_adjust # rotation to the heading of the platform and mooring system to be applied [deg] + self.nw = len(w) # number of frequencies + self.heading_adjust = heading_adjust # rotation to the heading of the platform and mooring system to be applied [deg] + + # Lists of components used to describe the FOWT + self.memberList = [] # list of member objects + self.rotorList = [] # list of rotor objects + self.nodeList = [] # list of node objects + self.jointList = [] # list of joint dictionaries + self.rigidLinkList = {'id': [], 'node1': [], 'node2': []} # Dict of lists instead of list of dicts because this does not come from the input file, so easier to check what the keys are self.design = design self.intersectMesh = design['platform'].get('intersectMesh', 0) # Default to 0 (no intersection mesh) @@ -77,7 +83,15 @@ def __init__(self, design, w, mpb, depth=600, x_ref=0, y_ref=0, heading_adjust=0 # position in the array self.x_ref = x_ref # reference x position of the FOWT in the array [m] self.y_ref = y_ref # reference y position of the FOWT in the array [m] - self.r6 = np.zeros(6) # mean position/orientation in absolute/array coordinates [m,rad] + self.r6 = np.zeros(6) # rigid body position/orientation in absolute/array coordinates [m,rad] TODO: replace this by the rigid-body node + + # Check if we have repeated member names + # TODO: Only if we have joints? Or always? And do we even need this? + # Check later after structural capabilities are working and we have tests + if 'platform' in design: + member_names = [m['name'] for m in design['platform']['members']] + if len(member_names) != len(set(member_names)): + raise Exception("Member names must be unique. Please check the input data.") # Platform lumped inertias self.pointInertias = [] @@ -104,10 +118,6 @@ def __init__(self, design, w, mpb, depth=600, x_ref=0, y_ref=0, heading_adjust=0 self.pointLoads.append({'f': np.zeros(6), 'r': np.zeros(3)}) # load and position of each point load to be added to the platform self.pointLoads[-1]['f'] = getFromDict(additional_effect, 'load', shape=6, default=np.zeros(6)) # load vector [N, N-m] self.pointLoads[-1]['r'] = getFromDict(additional_effect, 'location', shape=3, default=[0,0,0]) # position where the load is applied [m] - - self.f0_additional = np.zeros([6], dtype=float) - for pointLoad in self.pointLoads: - self.f0_additional += transformForce(pointLoad['f'], offset=pointLoad['r']) # count number of platform members self.nplatmems = 0 @@ -152,16 +162,11 @@ def __init__(self, design, w, mpb, depth=600, x_ref=0, y_ref=0, heading_adjust=0 self.nrotors = 0 # this will ensure RAFT doesn't set up or look for any Rotor objects self.ntowers = 0 - # note: RNA descriptions are not defined because there is no turbine - - - self.rotorList = [] + # note: RNA descriptions are not defined because there is no turbine self.depth = depth - self.w = np.array(w) - self.dw = w[1]-w[0] # frequency increment [rad/s] - + self.dw = w[1]-w[0] # frequency increment [rad/s] self.k = np.array([waveNumber(w, self.depth) for w in self.w]) # wave number [m/rad] self.rho_water = getFromDict(design['site'], 'rho_water', default=1025.0) @@ -175,10 +180,62 @@ def __init__(self, design, w, mpb, depth=600, x_ref=0, y_ref=0, heading_adjust=0 self.dz_BEM = getFromDict(design['platform'], 'dz_BEM', default=3.0) self.da_BEM = getFromDict(design['platform'], 'da_BEM', default=2.0) + # Create list of joint DATA from the input data. + # Actual joints are created when creating the members. + # + # If no joint data is specified, we create a single joint entry at the origin to rigidly connect all members to it. + # We can only do this if all platform members are rigid. + self.joint_data = [] + if 'joints' in design: + self.joint_data = design['joints'] + + # Check if we have repeated joint names in the data dictionary. + # We can have repeated joint names in the joints list due to headings but not in the joint_data dictionary + joint_names = [j['name'] for j in self.joint_data] + if len(joint_names) != len(set(joint_names)): + raise Exception("Joint names must be unique. Please check the input data.") + else: + j_member_names = [] # To store the names of the members which will be connected to the virtual joint + j_location = [0, 0, 0] # Place the joint at the origin + + # Add platform members to the list of members connected to the tower + check if any of the platform members is flexible, which would require joints to be specified + if 'platform' in design: + for m in design['platform']['members']: + if m['type' ] == 'beam': + raise Exception("To model platforms with flexible members, RAFT needs joints in the input data.") + j_member_names.append(m['name']) + + # Add towers to the list of members connected to the joint + if 'turbine' in design: + if 'tower' in design['turbine']: + j_member_names += [m['name'] for m in design['turbine']['tower']] # Add all towers to the list of members connected to the joint + self.joint_data.append({'name': 'origin_joint', 'type': 'cantilever', 'location': j_location, 'members': j_member_names}) + + + # Check consistency between joints and members + # In particular, check if headings in joints are consistent with the headings in the connected members + for j_data in self.joint_data: + for m_name in j_data['members']: # Loop all the members that are connected to this joint + # Check if the member is in the list of tower members, in which case they don't have headings + if 'turbine' in design and 'tower' in design['turbine']: + if m_name in [m['name'] for m in design['turbine']['tower']]: + continue - # member-based platform description - self.memberList = [] # list of member objects + # Check if the member is in the list of platform members + m = [m for m in design['platform']['members'] if m['name'] == m_name] + if len(m) == 0: + raise Exception(f"Member {m_name} not found in the list of members. Please check the input data.") + else: + m = m[0] + # A single joint/member can be connected to multiple members/joints + # But if the user provides a list of headings for both, they must have the same length + if 'heading' in j_data.keys() and 'heading' in m.keys(): + if len(j_data['heading']) != 1 and len(m['heading']) != 1: + if len(j_data['heading']) != len(m['heading']): + raise Exception(f"Joint '{j_data['name']}' has {len(j_data['heading'])} headings, but connected member '{m_name}' has {len(m['heading'])} headings. Please check the input data.") + + # member-based platform description for mi in design['platform']['members']: # prepare member info @@ -198,21 +255,91 @@ def __init__(self, design, w, mpb, depth=600, x_ref=0, y_ref=0, heading_adjust=0 headings = [headings] # if only one heading is specified, then just create one member for heading in headings: - self.memberList.append(Member(mi, self.nw, heading=heading+heading_adjust, part_of='platform')) + self.memberList.append(Member(mi, self.nw, heading=heading+heading_adjust, part_of='platform', first_node_id=len(self.nodeList))) + self.nodeList += self.memberList[-1].nodeList self.memberList[-1].headings = headings # Storing a copy of headings at each member to use it in model.adjustBallast - # add tower(s) and nacelle(s) to member list if applicable if 'turbine' in design: if 'tower' in design['turbine']: for mem in design['turbine']['tower']: - self.memberList.append(Member(mem, self.nw, part_of='tower')) + self.memberList.append(Member(mem, self.nw, part_of='tower', first_node_id=len(self.nodeList))) + self.nodeList += self.memberList[-1].nodeList if 'nacelle' in design['turbine']: for mem in design['turbine']['nacelle']: - self.memberList.append(Member(mem, self.nw, part_of='nacelle')) + self.memberList.append(Member(mem, self.nw, part_of='nacelle', first_node_id=len(self.nodeList))) + self.nodeList += self.memberList[-1].nodeList #TODO: consider putting the tower somewhere else rather than in end of memberList <<< + # Create joints + for j_data in self.joint_data: + j_headings = getFromDict(j_data, 'heading', shape=-1, default=0.) + if np.isscalar(j_headings): + j_headings = [j_headings] + + for count_heading, j_heading in enumerate(j_headings): + this_joint = self.addJoint(j_data, heading=j_heading) + + for member_name in this_joint['members']: + # Find the members with this name. We already know this is a non-empty list because we checked above + members = [m for m in self.memberList if m.name == member_name] + + # If a single member with this name (i.e., a single heading), attach it to the joint + if len(members) == 1: + self.attachMemberToJoint(members[0], this_joint) + continue + + # If multiple members but a single joint heading, attach all members to the joint + if len(j_headings) == 1: + for m in members: + self.attachMemberToJoint(m, this_joint) + + # If multiple members and multiple joint headings, we attach the member corresponding to the heading of this joint + # We already checked above if the number of headings of the joint is the same as the number of headings of the connected members (when both are lists) + else: + this_member = members[count_heading] + self.attachMemberToJoint(this_member, this_joint) + + # build Rotor list + # Each rotor is connected to the top of its corresponding tower by a cantilever joint + towerList = [m for m in self.memberList if m.part_of == 'tower'] + for ir in range(self.nrotors): + self.rotorList.append(Rotor(design['turbine'], self.w, ir, node_id=len(self.nodeList))) + self.nodeList += self.rotorList[-1].nodeList # add the rotor nodes to the node list + towerTopJoint = self.addJoint({'name': 'tower2rotor', 'type': 'cantilever', 'location': self.rotorList[ir].r_RRP, 'members': []}) # Do not need the members list in the joint data because we will provide the members directly + + self.attachMemberToJoint(towerList[ir], towerTopJoint) # attach the tower to the joint + self.attachMemberToJoint(self.rotorList[-1], towerTopJoint) # attach the rotor to the tower top joint + + + # Define a node to be used as a reference for rigid body motions + # TODO: For now, using the node that is the closest to (0,0,0). + # In the future, let the user pick a node + self.rigidBodyNode = min(self.nodeList, key=lambda n: np.linalg.norm(n.r0[0:3])) + # print(f"Rigid body motions correspond to node located at {self.rigidBodyNode.r0[0:3]} wrt the PRP.") + + # Move this node to be the first node in the list. + # TODO: Only doing this now for compatibility with previous code. Remove lines later. + # if len(self.joint_data) == 1 and self.joint_data[0]['name'] == 'origin_joint': + if self.rigidBodyNode.member is None or self.rigidBodyNode.member.type == 'rigid': + self.nodeList.remove(self.rigidBodyNode) + self.nodeList.insert(0, self.rigidBodyNode) + for i, n in enumerate(self.nodeList): # Reset the id of all nodes to be their index in the list. TODO: maybe just assign the ids here instead at node creation. I think I just need to set them before reduceDOF() and computeTransformationMatrix(), but not sure + n.id = i + + # Store the list of nodes of the FOWT in each node for reference + # And initialize the inertia and flexibility stiffness matrices of each node + self.nFullDOF = sum([n.nDOF for n in self.nodeList]) # total number of DOFs of the structure (including virtual nodes created by rigid links) + for n in self.nodeList: + n.nodeList = self.nodeList + + self.reduceDOF() # evaluate the set of reduced dofs + self.Xi0 = np.zeros( self.nDOF) # mean offsets of platform from its reference point [m, rad] + self.Xi = np.zeros([self.nDOF, self.nw], dtype=complex) # complex response amplitudes as a function of frequency [m, rad] + self.rReducedDOF = np.zeros(self.nDOF) # position of the platform in the reduced dofs + # array-level mooring system connection + # TODO: Will need to be connected to nodes instead of the body self.body = mpb # reference to Body in mooring system corresponding to this turbine # this FOWT's own MoorPy system (may not be used) @@ -220,6 +347,7 @@ def __init__(self, design, w, mpb, depth=600, x_ref=0, y_ref=0, heading_adjust=0 self.ms = mp.System() self.ms.parseYAML(design['mooring']) + self.moorMod = getFromDict(design['mooring'], 'moorMod', default=0, dtype=int) self.ms_tol = getFromDict(design['mooring'], 'tol', dtype=float, default=0.05) # mooring system tolerance for solving equilibrium # ensure proper setup with one coupled Body tied to this FOWT @@ -241,18 +369,15 @@ def __init__(self, design, w, mpb, depth=600, x_ref=0, y_ref=0, heading_adjust=0 else: self.ms = None + self.moorMod = 0 - self.F_moor0 = np.zeros(6) # mean mooring forces in a given scenario - self.C_moor = np.zeros([6,6]) # mooring stiffness matrix in a given scenario + self.F_moor0 = np.zeros(self.nDOF) # mean mooring forces in a given scenario + self.C_moor = np.zeros([self.nDOF,self.nDOF]) # mooring stiffness matrix in a given scenario if 'yaw_stiffness' in design['platform']: self.yawstiff = design['platform']['yaw_stiffness'] # If you're modeling OC3 spar, for example, import the manual yaw stiffness needed by the bridle config else: self.yawstiff = 0 - - # build Rotor list - for ir in range(self.nrotors): - self.rotorList.append(Rotor(design['turbine'], self.w, ir)) # initialize mean force arrays to zero, so the model can work before we calculate excitation self.f_aero0 = np.zeros([6, self.nrotors]) @@ -265,10 +390,10 @@ def __init__(self, design, w, mpb, depth=600, x_ref=0, y_ref=0, heading_adjust=0 # initialize BEM arrays, whether or not a BEM solver is used # __, __, nWaveHeadings = getUniqueCaseHeadings(design['cases']['keys'], design['cases']['data']) # identify how many wave headings need to be preprocessed - self.A_BEM = np.zeros([6,6,self.nw], dtype=float) # hydrodynamic added mass matrix [kg, kg-m, kg-m^2] - self.B_BEM = np.zeros([6,6,self.nw], dtype=float) # wave radiation drag matrix [kg, kg-m, kg-m^2] - #self.X_BEM = np.zeros([self.nWaves, 6, self.nw], dtype=complex) # linaer wave excitation force/moment coefficients vector [N, N-m] - #self.F_BEM = np.zeros([self.nWaves, 6, self.nw], dtype=complex) # linaer wave excitation force/moment complex amplitudes vector [N, N-m] + self.A_BEM = np.zeros([self.nDOF,self.nDOF,self.nw], dtype=float) # hydrodynamic added mass matrix [kg, kg-m, kg-m^2] + self.B_BEM = np.zeros([self.nDOF,self.nDOF,self.nw], dtype=float) # wave radiation drag matrix [kg, kg-m, kg-m^2] + #self.X_BEM = np.zeros([self.nWaves, self.nDOF, self.nw], dtype=complex) # linaer wave excitation force/moment coefficients vector [N, N-m] + #self.F_BEM = np.zeros([self.nWaves, self.nDOF, self.nw], dtype=complex) # linaer wave excitation force/moment complex amplitudes vector [N, N-m] # <<< TODO: Set maximum of amount of headingsm for X_BEM and F_BEM and use interpolation of hydrodynamics. Or not? # First-order linear hydro input file options (preexisting files option) @@ -311,17 +436,350 @@ def __init__(self, design, w, mpb, depth=600, x_ref=0, y_ref=0, heading_adjust=0 self.outFolderQTF = design['platform']['outFolderQTF'] - def setPosition(self, r6): - '''Updates the FOWT's (mean) position including all components. + def addJoint(self, this_joint_data, heading=0., tol=1e-3): + ''' Add a joint to the list of joints. + Also returns the joint data as a dictionary with the following fields: + [id, r, type, name, heading, members] - r6 : float array - 6 DOF absolute position of FOWT [m, rad] + PARAMETERS + ---------- + this_joint_data: Dictionary with fields 'name', 'type', and 'location' + Data corresponding to this joint, as provided in the `joint` section of the yaml file. + eps: float + olerance for comparing joint position + heading: float + Z rotation around (x,y)=(0,0) in the the local frame of the FOWT. ''' + r = np.array(this_joint_data['location']) + r = applyHeadingToPoint(r, heading=heading) + + # Check if an equivalent joint already exists + for joint in self.jointList: + if joint['name'] == this_joint_data['name']: + # Compare position + existing_position = np.array(joint['r']) + if np.linalg.norm(existing_position - r) <= tol: + # Joint already exists, return it instead of adding a new one + return joint + + j_id = len(self.jointList) + joint = {} + joint['id'] = j_id + joint['r'] = r.copy() + joint['name'] = this_joint_data['name'] + joint['type'] = this_joint_data['type'] + joint['heading'] = heading + joint['members'] = this_joint_data['members'] + + self.jointList.append(joint) + return joint + + def attachMemberToJoint(self, member, joint, tol=1e-3): + ''' + Attach the member to the joint by assigning joint_id and joint_type to a member's node. + + For rigid elements, which correspond to a single node, this is done by + 1. Assigning the joint to the node if the joint and node are within the tolerance + 2. Creating two extra nodes connected by a rigid link. One of the rigid-link nodes is attached to the joint, while the other is cantilevered to the member node. + + Same thing for flexible elements, but we use the end node that is the closest to the joint + + PARAMETERS + ---------- + member: Member object + Member to be attached to the joint + joint: dict + Joint dictionary, as returned by addJoint() and stored in self.jointList + tol: float + Tolerance for comparing joint position and node position [m] + ''' + # print(f"Attaching member {member.name} to joint {joint['name']}") + + # Get the node that will be connected to the joint + # - Rigid members have only one node, so we use that node + # - Flexible members have several nodes. We use the end one that is closest to the joint + if member.type == 'rigid' or member.type == 'rotor': + node = member.nodeList[0] + dist = np.linalg.norm(node.r0[0:3] - joint['r']) + elif member.type == 'beam': + nA = member.nodeList[0] + dA = np.linalg.norm(nA.r0[0:3] - joint['r']) + + nB = member.nodeList[-1] + dB = np.linalg.norm(nB.r0[0:3] - joint['r']) + + node, dist = (nA, dA) if dA < dB else (nB,dB) + else: + raise Exception(f"Member type {member.type} not supported.") - # if offset provided, set things according to those positions, otherwise zero it - self.r6 = r6 - self.Xi0 = self.r6 - np.array([self.x_ref, self.y_ref, 0, 0, 0, 0]) + # If the joint and node are close enough, just connect them by the joint + if dist <= tol: + node.joint_id = joint['id'] + node.joint_type = joint['type'] + # Otherwise, we need to create a rigid link between the joint and the node + # TODO: Each rigid links create two dummy nodes that increase the size of the system. + # This does not impact computation time, as expensive computations are performed in the reduced dofs, + # but it would be nice to find a different way to join nodes with a geommetric offset. + else: + # Add two new nodes: one at the joint location, and one at the member's node location + newNodeA = Node(len(self.nodeList) , joint['r'] , self.nw, member=None, end_node=True) + newNodeB = Node(len(self.nodeList)+1, node.r0[0:3], self.nw, member=None, end_node=True) + + # Add a rigid link between the two nodes + self.rigidLinkList['id'].append(len(self.rigidLinkList['id'])) # Don't think we need an id, could use the index in the list instead + self.rigidLinkList['node1'].append(newNodeA) + self.rigidLinkList['node2'].append(newNodeB) + + # newNodeA is connected to the joint + newNodeA.joint_id = joint['id'] + newNodeA.joint_type = joint['type'] + newNodeA.rigid_link_id = self.rigidLinkList['id'][-1] + self.nodeList.append(newNodeA) + + # Node B is attached to the other node. Use the same joint as node if it already has one, otherwise create a new cantilever joint for the connection + if node.joint_id is not None: + jointB = [j for j in self.jointList if j['id'] == node.joint_id][0] + else: + j_data = {'name': f"joint4rigidLink", 'type': 'cantilever', 'location': newNodeB.r0[0:3].tolist(), 'members': []} # We won't use members for rigid-link joints + jointB = self.addJoint(j_data) + newNodeB.joint_id = jointB['id'] + newNodeB.joint_type = jointB['type'] + newNodeB.rigid_link_id = self.rigidLinkList['id'][-1] + node.joint_id = jointB['id'] + node.joint_type = jointB['type'] + self.nodeList.append(newNodeB) + + def reduceDOF(self): + ''' + Find reduced set of dofs of the structure. + They are stored in self.reducedDOF, a list where each element is a sublist of the form [node_id, dof_index]. + Where dof_index can be (0,1,2,3,4,5) corresponding to (x,y,z,roll,pitch,yaw) of a node. + ''' + if len(self.nodeList) < 1: + raise Exception("No nodes in the structure. Cannot compute reduced dofs.") + + # Reset dofs of all nodes + for n in self.nodeList: + n.reducedDOF = None + n.T = None + n.T_aux = None + n.parentNode_id = None + + # We will loop all nodes based on the connected nodes + queue = [] # Store the nodes that still need to be processed + visited = set() # Store the nodes that have been processed (to avoid repeating nodes) + queue.append(self.nodeList[0]) # We will start with the first node of the list + + while queue: + node = queue.pop(0) + + # If this node does not have reducedDOF, assign its own dofs + if node.reducedDOF is None: + node.reducedDOF = [] + for i in range(node.nDOF): + node.reducedDOF.append([node.id, i]) + node.T_aux = np.eye(node.nDOF) + node.parentNode_id = node.id + visited.add(node.id) + + # Attach the node connected by a rigid link (if it exists) + rigidConnectedNode = node.getRigidConnectedNode() + if (rigidConnectedNode is not None) and (rigidConnectedNode.id not in visited): + rigidConnectedNode.attachToNode(node, rigid_link=True) + queue.append(rigidConnectedNode) + visited.add(rigidConnectedNode.id) + + # Attach the nodes connected by the joint + connectedNodes = node.getNodesConnectedByJoint() + for n in connectedNodes: + if n.id not in visited: + n.attachToNode(node) + queue.append(n) + visited.add(n.id) + + # If this is the end of a flexible member, we need to add the other nodes to the queue + if node.member and node.member.type == 'beam' and node.end_node: + for n in node.member.nodeList: + if (n.id != node.id) and (n.id not in visited): + queue.append(n) + + # Check if we visited all nodes + if len(visited) != len(self.nodeList): + # Find nodes that were not visited + unvisited_nodes = [n.id for n in self.nodeList if n.id not in visited] + raise Exception(f"Could not reach all nodes from the first node. Please check the connectivity of the structure. Unvisited node ids: {unvisited_nodes}") + + # Get unique dofs of the whole structure + reducedDOF = [] + for n in self.nodeList: + if n.reducedDOF is not None: + for dof in n.reducedDOF: + if dof not in reducedDOF: + reducedDOF.append(dof) + self.reducedDOF = reducedDOF + self.nDOF = len(self.reducedDOF) # number of reduced dofs needed to describe the structure + self.computeTransformationMatrix() + + def computeTransformationMatrix(self): + ''' + Compute the transformation matrix T that transforms from the reduced degrees of freedom + to the full degrees of freedom, fullDOF = T @ reducedDOF. + + The transformation matrix is stored in self.T, which is a (nFullDOF, nReducedDOF) matrix. + ''' + self.T = np.zeros((self.nFullDOF, self.nDOF)) + + row0 = 0 + for n in self.nodeList: + n.setT(self.reducedDOF) + self.T[row0:row0+n.nDOF, :] = n.T + row0 += n.nDOF + return self.T + + def computeDerivativeTransformationMatrix(self): + '''Compute the derivative of the transformation matrix T with respect to the reduced degrees of freedom. + + The derivative is stored in self.dT, which is a (nFullDOF, nReducedDOF, nReducedDOF) matrix. + ''' + import copy + + self.dT = np.zeros((self.nFullDOF, self.nDOF, self.nDOF)) + + # Create a deep copy to avoid modifying the original object + fowt_temp = copy.deepcopy(self) + + # Only need to do the derivative for rotational dofs and end nodes + # Translations and motions of internal nodes do not change the transformation matrix + for i, dof in enumerate(self.reducedDOF): + if dof[1] > 2 and self.nodeList[dof[0]].end_node: + reducedDisp = np.zeros(self.nDOF) + reducedDisp[i] = 1.0 + + # Use the temporary copy for computations + fowt_temp.setNodesPosition(fowt_temp.rReducedDOF + reducedDisp, linear=True) + fowt_temp.reduceDOF() + self.dT[:, :, i] = fowt_temp.T - self.T # Compute the derivative + + # Reset the temporary copy to original state for next iteration + fowt_temp = copy.deepcopy(self) + + return self.dT + + def setNodesPosition(self, reducedXi0, linear=False): + '''Set the mean displacements, node.Xi0, and positions, node.r, of all the nodes + of the structure based on the displacements in the reduced degrees of freedom. + + PARAMETERS + ---------- + reducedXi0 : (nReducedDoF,) float array + Mean displacements of the FOWT in the reduced degrees of freedom [m, rad] + linear: bool, optional + If True, the displacements are obtained using linear relations. This option + does not preserve distance between nodes connected by rigid links. + ''' + # If setting the displacement using linear relations, we can simply use the T matrix stored in each node + # This does not preserve the lengths of rigid links but should be good enough for small rotations + if linear: + for n in self.nodeList: + n.setDisplacementLinear(reducedXi0) + else: + # Otherwise, set nodes' displacement using nonlinear relations. More work but preserves the lenghts of rigid links. + # The nonlinearities arise from the rotations of rigid links, which include sin and cos. + self.nodeList[0].setDisplacementLinear(reducedXi0) # The first node is always the first of the reduced dofs, so we simply use the linear relation + + # The remaining nodes depend on how they are connected to the previous node + # We will loop all nodes in the same way as in reduceDOF() + queue = [] # Store the nodes that still need to be processed + visited = set() # Store the nodes that have been processed (to avoid repeating nodes) + queue.append(self.nodeList[0]) # We will start with the first node of the list + visited.add(self.nodeList[0].id) + + while queue: + node = queue.pop(0) + + # We just loop through the end nodes. Internal nodes are taken care based on their end nodes + if not node.end_node: + continue + + # Deal with the node connected by a rigid link (if it exists) + rigidConnectedNode = node.getRigidConnectedNode() + if (rigidConnectedNode is not None) and (rigidConnectedNode.id != node.parentNode_id) and (rigidConnectedNode.id not in visited): + dx = rigidConnectedNode.r0[0] - node.r0[0] + dy = rigidConnectedNode.r0[1] - node.r0[1] + dz = rigidConnectedNode.r0[2] - node.r0[2] + + # Get rotation (displacement part, not including initial value) around node. x, y, and z components + rotation = (node.T @ reducedXi0)[-3:] + rotMat = rotationMatrix(*rotation) - np.eye(3) # Remove identity matrix to get the displacement only + + # RigidConnectedNode has the same rotation but the translation accounts for the distance between both nodes + rigidConnectedNode.Xi0 = node.Xi0.copy() + rigidConnectedNode.Xi0[0:rigidConnectedNode.nTransDOF] += rotMat @ np.array([dx, dy, dz]) + + queue.append(rigidConnectedNode) + visited.add(rigidConnectedNode.id) + + # Deal with the nodes connected by the joint + connectedNodes = node.getNodesConnectedByJoint() + for n in connectedNodes: + if (n.id != node.parentNode_id) and (n.id not in visited): + n.Xi0 = node.Xi0.copy() # Assign the same displacements to the connected nodes + if n.joint_type == "ball": # But if ball joint, overried rotation with the node's own rotation + n.Xi0[-3:] = (n.T @ reducedXi0)[-3:] + queue.append(n) + visited.add(n.id) + + # If this node is part of a flexible element, we need to set the displacement of the other nodes (remember that we are looping through the end nodes) + # We do that by adding the difference between the nonlinear and linear displacements of the end node to the linear displacement of the other nodes + if node.member and node.member.type == 'beam': + # We need to add the other end to the queue to visit the nodes that are connected to it. + # Only do that if the other end wasn't visited yet - it could have been visited by nodes connected to the other side of the flexible member. + for n in [node.member.nodeList[0], node.member.nodeList[-1]]: + if (n.id != node.id) and (n.id not in visited): + queue.append(n) + + disp = node.Xi0 # Nonlinear displacement of the end node + disp_lin = node.T @ reducedXi0 # Linear displacement of the end node + dR = disp - disp_lin # Difference between nonlinear and linear displacements + for n in node.member.nodeList: + if n.id != node.id and (n.id not in visited): + n.setDisplacementLinear(reducedXi0) # Start by setting the displacement linearly + n.Xi0 += dR # then we add the difference between nonlinear and linear displacements of the first node + visited.add(n.id) + + for n in self.nodeList: + n.r = n.r0 + n.Xi0 + + def setPosition(self, rReducedDOF): + '''Updates the FOWT's (mean) position including all components. + + PARAMETERS + ---------- + rReducedDOF : (nDOF, ) float array + Mean positions along the reduced dofs of the FOWT [m, rad]. + For a fully rigid FOWT, this is a 6-dof array with the position and attitude of the PRP. + ''' + # if offset provided, set things according to those positions, otherwise zero it + self.rReducedDOF = rReducedDOF + initial_displacement = np.zeros(self.nDOF) # Initialize the displacement vector in the reduced dofs + for i, dof in enumerate(self.reducedDOF): + initial_displacement[i] += self.x_ref if dof[1] == 0 else 0 # If this is a translation in the X direction (Global dof 0) + initial_displacement[i] += self.y_ref if dof[1] == 1 else 0 # If this is a translation in the Y direction (Global dof 1) + self.Xi0 = self.rReducedDOF - initial_displacement + + # Set the position of all nodes + # rReducedDOF can be interpreted as a displacement in the reduced degrees of freedom, as the r0's of the nodes are wrt the platform + self.setNodesPosition(rReducedDOF) + self.reduceDOF() # Recompute the transformation matrix + self.computeDerivativeTransformationMatrix() # Also compute the derivative of the transformation matrix, which is used to compute the stiffness matrices + + # Compute motions of the PRP (the intersection of the tower centerline and the mean waterline) + # as a rigid body transformation from the rigidBodyNode to the PRP + rotMat = rotationMatrix(*self.rigidBodyNode.Xi0[-3:]) + self.r6 = self.rigidBodyNode.r.copy() + self.r6[:3] += rotMat @ (-self.rigidBodyNode.r0[:3]) + # calculate and save a rotation/orientation matrix self.Rmat = rotationMatrix(*self.r6[3:]) # rotation matrix for fowt orientation @@ -329,18 +787,26 @@ def setPosition(self, r6): if self.ms: self.ms.bodyList[0].setPosition(self.r6) - for rot in self.rotorList: - rot.setPosition(r6=self.r6) + for rot in self.rotorList: + rot.setPosition() for mem in self.memberList: - mem.setPosition(r6=self.r6) + mem.setPosition() + mem.computeStiffnessMatrix_FE() # Recompute stiffness matrix at the updated position # solve the mooring system equilibrium of this FOWT's own MoorPy system if self.ms: self.ms.solveEquilibrium(tol=self.ms_tol) - self.C_moor = self.ms.getCoupledStiffnessA() - self.F_moor0 = self.ms.bodyList[0].getForces(lines_only=True) - + if self.moorMod == 0 or self.moorMod == 1: + C_moor = self.ms.getCoupledStiffnessA(lines_only=True) + elif self.moorMod == 2: + self.ms.updateSystemDynamicMatrices() + _, _, _, C_moor = self.ms.getCoupledDynamicMatrices(lines_only=True) + + # For now, we will just lump the mooring forces and stiffness at the first 6 dofs + self.C_moor[:6, :6] = translateMatrix6to6DOF(C_moor, self.ms.bodyList[0].r6[:3] - self.nodeList[self.reducedDOF[0][0]].r[:3]) # This isn't right because this matrix translation doesn't account for the geometric stiffness + self.F_moor0[:6] = transformForce(self.ms.bodyList[0].getForces(lines_only=True), offset=self.ms.bodyList[0].r6[:3] - self.nodeList[self.reducedDOF[0][0]].r[:3]) + def calcStatics(self): '''Computes the static properties of the FOWT in terms of mass and hydrostatic-related @@ -351,25 +817,40 @@ def calcStatics(self): rho = self.rho_water g = self.g - # structure-related arrays - self.M_struc = np.zeros([6,6]) # structure/static mass/inertia matrix [kg, kg-m, kg-m^2] - self.B_struc = np.zeros([6,6]) # structure damping matrix [N-s/m, N-s, N-s-m] (may not be used) - self.C_struc = np.zeros([6,6]) # structure effective stiffness matrix [N/m, N, N-m] - self.W_struc = np.zeros([6]) # static weight vector [N, N-m] - - # hydrostatic arrays - self.C_hydro = np.zeros([6,6]) # hydrostatic stiffness matrix [N/m, N, N-m] - self.W_hydro = np.zeros(6) # buoyancy force/moment vector [N, N-m] <<<<< not used yet - + # structure-related arrays - in the reduced set of dofs + self.M_struc = np.zeros([self.nDOF,self.nDOF]) # structure/static mass/inertia matrix [kg, kg-m, kg-m^2] + self.B_struc = np.zeros([self.nDOF,self.nDOF]) # structure damping matrix [N-s/m, N-s, N-s-m] (may not be used) + self.C_struc = np.zeros([self.nDOF,self.nDOF]) # structure effective stiffness matrix [N/m, N, N-m] + self.W_struc = np.zeros([self.nDOF]) # static weight vector [N, N-m] + self.C_elast = np.zeros([self.nDOF,self.nDOF]) # structure elastic stiffness matrix [N/m, N, N-m] + + # structure-related arrays - in the full set of dofs + # Transformed into the reduced set of dofs using the transformation matrix + M_struc_fullDOF = np.zeros([self.nFullDOF,self.nFullDOF]) + B_struc_fullDOF = np.zeros([self.nFullDOF,self.nFullDOF]) + C_struc_fullDOF = np.zeros([self.nFullDOF,self.nFullDOF]) + W_struc_fullDOF = np.zeros([self.nFullDOF]) + C_elast_fullDOF = np.zeros([self.nFullDOF,self.nFullDOF]) + + # hydrostatic arrays - in the reduced set of dofs + self.C_hydro = np.zeros([self.nDOF,self.nDOF]) # hydrostatic stiffness matrix [N/m, N, N-m] + self.W_hydro = np.zeros(self.nDOF) # buoyancy force/moment vector [N, N-m] <<<<< not used yet + + C_hydro_fullDOF = np.zeros([self.nFullDOF,self.nFullDOF]) + W_hydro_fullDOF = np.zeros(self.nFullDOF) + + # Additional user-defined constant force + # self.f0_additional = np.zeros([6], dtype=float) + self.f0_additional = np.zeros(self.nFullDOF) # Initialize the additional force vector in full dofs + f0_additional_fullDOF = np.zeros(self.nFullDOF) # Initialize the additional force vector in full dofs # --------------- add in linear hydrodynamic coefficients here if applicable -------------------- #[as in load them] <<<<<<<<<<<<<<<<<<<<< # --------------- Get general geometry properties including hydrostatics ------------------------ - # initialize some variables for running totals VTOT = 0. # Total underwater volume of all members combined - m_all = 0. # Total mass of all members [kg] + m_all = 0. # Total mass of all members [kg] AWP_TOT = 0. # Total waterplane area of all members [m^2] IWPx_TOT = 0 # Total waterplane moment of inertia of all members about x axis [m^4] IWPy_TOT = 0 # Total waterplane moment of inertia of all members about y axis [m^4] @@ -378,32 +859,45 @@ def calcStatics(self): m_center_sum = np.zeros(3) # product of each member's mass multiplied by its center of mass [kg-m] (Only considers the shell mass right now) self.m_sub = 0 # total mass of just the members that make up the substructure [kg] - self.C_struc_sub = np.zeros([6,6]) # substructure effective stiffness matrix [N/m, N, N-m] - self.M_struc_sub = np.zeros([6,6]) # total mass matrix of just the substructure about the PRP + self.C_struc_sub = np.zeros([self.nDOF,self.nDOF]) # substructure effective stiffness matrix [N/m, N, N-m] + self.M_struc_sub = np.zeros([self.nDOF,self.nDOF]) # total mass matrix of just the substructure about the PRP + self.W_struc_sub = np.zeros(self.nDOF) # weight vector of just the substructure [N, N-m] m_sub_sum = 0 # product of each substructure member's mass and CG, to be used to find the total substructure CG [kg-m] - self.m_shell = 0 # total mass of the shells/steel of the members in the substructure [kg] + self.m_shell = 0 # total mass of the shells/steel of the members in the substructure [kg] mballast = [] # list to store the mass of the ballast in each of the substructure members [kg] pballast = [] # list to store the density of ballast in each of the substructure members [kg] self.mtower = np.zeros(self.ntowers) # assume that the whole tower will always be one member self.rCG_tow = [] - memberList = [mem for mem in self.memberList if mem.name != 'nacelle'] - # loop through each member + C_struc_sub_fullDOF = np.zeros([self.nFullDOF,self.nFullDOF]) + M_struc_sub_fullDOF = np.zeros([self.nFullDOF,self.nFullDOF]) + W_struc_sub_fullDOF = np.zeros(self.nFullDOF) + + # loop through each member that's not part of the nacelle + memberList = [mem for mem in self.memberList if mem.part_of != 'nacelle'] for i,mem in enumerate(memberList): + # Find the indices of the first and last nodes of the member to fill the _fullDOF matrices + iFirst = mem.nodeList[ 0].id * mem.nodeList[0].nDOF + iLast = (mem.nodeList[-1].id + 1) * mem.nodeList[0].nDOF # Assuming all nodes have the same dofs, namely 6 # calculate member's orientation information (stored in the member and used in later steps) - mem.setPosition(r6=self.r6) # <<< is this redundant, assume fowt.setPosition has been called? + mem.setPosition() # <<< is this redundant, assume fowt.setPosition has been called? + + C_elast_fullDOF[iFirst:iLast, iFirst:iLast] += mem.computeStiffnessMatrix_FE() # note: quantities in the following section are relative to the PRP (but with global direcions) # ---------------------- get member's mass and inertia properties ------------------------------ # get member mass and inertia info (including mem.M_struc) <<< still split between converting to PRP in or out of these functions - mass, center, m_shell, mfill, pfill = mem.getInertia(rPRP=self.r6[:3]) + mass, center, m_shell, mfill, pfill = mem.getInertia() + W = mem.getWeight(g=g) # Using zeros because mem.cog is about the PRP # Calculate the mass matrix of the FOWT about the PRP - self.W_struc += translateForce3to6DOF( np.array([0,0, -g*mass]), center ) # weight vector - self.M_struc += mem.M_struc # mass/inertia matrix about the PRP - + W_struc_fullDOF[iFirst:iLast] += W # weight vector + M_struc_fullDOF[iFirst:iLast, iFirst:iLast] += mem.M_struc # mass/inertia matrix + C_struc_fullDOF[iFirst:iLast, iFirst:iLast] += mem.C_struc # part of the hydrostatic stiffness that is due to weight + + center += mem.nodeList[0].r0[:3] # Update center position to be wrt the PRP m_center_sum += center*mass # product sum of the mass and center of mass to find the total center of mass [kg-m] # Tower calculations @@ -412,22 +906,27 @@ def calcStatics(self): self.rCG_tow.append(center) # center of mass of the tower from the PRP [m] # Substructure calculations else: + M_struc_sub_fullDOF[iFirst:iLast, iFirst:iLast] += mem.M_struc # mass matrix of the substructure about the PRP + C_struc_sub_fullDOF[iFirst:iLast, iFirst:iLast] += mem.C_struc + W_struc_sub_fullDOF[iFirst:iLast] += W # weight vector of the substructure [N, N-m] + self.m_sub += mass # mass of the substructure - self.M_struc_sub += mem.M_struc # mass matrix of the substructure about the PRP m_sub_sum += center*mass # product sum of the substructure members and their centers of mass [kg-m] - self.m_shell += m_shell # mass of the substructure shell material [kg] - mballast.extend(mfill) # list of ballast masses in each substructure member (list of lists) [kg] - pballast.extend(pfill) # list of ballast densities in each substructure member (list of lists) [kg/m^3] + self.m_shell += m_shell # mass of the substructure shell material [kg] + mballast.extend(mfill) # list of ballast masses in each substructure member (list of lists) [kg] + pballast.extend(pfill) # list of ballast densities in each substructure member (list of lists) [kg/m^3] # -------------------- get each member's buoyancy/hydrostatic properties ----------------------- - - Fvec, Cmat, V_UW, r_CB, AWP, IWP, xWP, yWP = mem.getHydrostatics(rho=self.rho_water, g=self.g, rPRP=self.r6[:3]) + Fvec, Cmat, V_UW, r_CB, AWP, IWP, xWP, yWP = mem.getHydrostatics(rho=self.rho_water, g=self.g) # add to fowt's mean force vector and stiffness matrix - self.W_hydro += Fvec # translateForce3to6DOF( np.array([0,0, Fz]), mem.rA ) # buoyancy vector - self.C_hydro += Cmat # translateMatrix6to6DOF(Cmat, mem.rA) # hydrostatic stiffness matrix + W_hydro_fullDOF[iFirst:iLast] += Fvec # translateForce3to6DOF( np.array([0,0, Fz]), mem.rA ) # buoyancy vector + C_hydro_fullDOF[iFirst:iLast, iFirst:iLast] += Cmat # translateMatrix6to6DOF(Cmat, mem.rA) # hydrostatic stiffness matrix - # convert other metrics to also be about the PRP (platform reference point) + # convert metrics to be about the PRP (platform reference point) + r_CB += mem.nodeList[0].r0[:3] + xWP += mem.nodeList[0].r0[0] + yWP += mem.nodeList[0].r0[1] VTOT += V_UW # add to total underwater volume of all members combined AWP_TOT += AWP IWPx_TOT += IWP + AWP*yWP**2 @@ -448,6 +947,9 @@ def calcStatics(self): raise ValueError("The azimuths of the blades need to be equally spaced apart") for k,afmem in enumerate(rotor.bladeMemberList): # for each airfoil member in the bladeMemberList + # Find the indices of the first and last nodes of the member to fill the _fullDOF matrices + iFirst = afmem.nodeList[ 0].id * afmem.nodeList[0].nDOF + iLast = (afmem.nodeList[-1].id + 1) * afmem.nodeList[0].nDOF # Assuming all nodes have the same dofs, namely 6 # store original positions of the airfoil member about the original rotor axis rA_OG = afmem.rA0 @@ -477,12 +979,16 @@ def calcStatics(self): # >>>>>> can be used later if actual rectangular mass properties are desired other than mRNA <<<<<<<< # calculate hydrostatic properties of the blade (sub)member and add them to the system matrices - Fvec, Cmat, V_UW, r_CB, AWP, IWP, xWP, yWP = afmem.getHydrostatics(rho=self.rho_water, g=self.g, rPRP=self.r6[:3]) + Fvec, Cmat, V_UW, r_CB, AWP, IWP, xWP, yWP = afmem.getHydrostatics(rho=self.rho_water, g=self.g) # outputs of getHydrostatics should already be about the PRP - self.W_hydro += Fvec # buoyancy vector - self.C_hydro += Cmat # hydrostatic stiffness matrix + W_hydro_fullDOF[iFirst:iLast] += Fvec # buoyancy vector + C_hydro_fullDOF[iFirst:iLast, iFirst:iLast] += Cmat # hydrostatic stiffness matrix + # convert metrics to be about the PRP (platform reference point) + r_CB += mem.nodeList[0].r0[:3] + xWP += mem.nodeList[0].r0[0] + yWP += mem.nodeList[0].r0[1] VTOT += V_UW # add to total underwater volume of all members combined AWP_TOT += AWP IWPx_TOT += IWP + AWP*yWP**2 @@ -501,15 +1007,21 @@ def calcStatics(self): nacelleMemberList = [mem for mem in self.memberList if mem.name == 'nacelle'] # include only hydrostatic properties of nacelles (inertia properties are stored in mRNA/IxRNA/IrRNA and used below) for mem in nacelleMemberList: + # Find the indices of the first and last nodes of the member to fill the _fullDOF matrices + iFirst = mem.nodeList[ 0].id * mem.nodeList[0].nDOF + iLast = (mem.nodeList[-1].id + 1) * mem.nodeList[0].nDOF # Assuming all nodes have the same dofs, namely 6 # call getHydroStatics for nacelles - Fvec, Cmat, V_UW, r_CB, AWP, IWP, xWP, yWP = mem.getHydrostatics(rho=self.rho_water, g=self.g, rPRP=self.r6[:3]) + Fvec, Cmat, V_UW, r_CB, AWP, IWP, xWP, yWP = mem.getHydrostatics(rho=self.rho_water, g=self.g) # add to fowt's mean force vector and stiffness matrix - self.W_hydro += Fvec # translateForce3to6DOF( np.array([0,0, Fz]), mem.rA ) # buoyancy vector - self.C_hydro += Cmat # translateMatrix6to6DOF(Cmat, mem.rA) # hydrostatic stiffness matrix + W_hydro_fullDOF[iFirst:iLast] += Fvec # translateForce3to6DOF( np.array([0,0, Fz]), mem.rA ) # buoyancy vector + C_hydro_fullDOF[iFirst:iLast, iFirst:iLast] += Cmat # translateMatrix6to6DOF(Cmat, mem.rA) # hydrostatic stiffness matrix - # convert other metrics to also be about the PRP (platform reference point) + # convert metrics to be about the PRP (platform reference point) + r_CB += mem.nodeList[0].r0[:3] + xWP += mem.nodeList[0].r0[0] + yWP += mem.nodeList[0].r0[1] VTOT += V_UW # add to total underwater volume of all members combined AWP_TOT += AWP IWPx_TOT += IWP + AWP*yWP**2 @@ -520,50 +1032,198 @@ def calcStatics(self): # ------------------------- include RNA properties ----------------------------- for i, rotor in enumerate(self.rotorList): + # Find the indices of the first and last nodes of the member to fill the _fullDOF matrices + iFirst = rotor.nodeList[ 0].id * rotor.nodeList[0].nDOF + iLast = (rotor.nodeList[-1].id + 1) * rotor.nodeList[0].nDOF # Assuming all nodes have the same dofs, namely 6 # create mass/inertia matrix Mmat = np.diag([rotor.mRNA, rotor.mRNA, rotor.mRNA, rotor.IxRNA, rotor.IrRNA, rotor.IrRNA]) # Rotate RNA mass matrix into the global orientation - Mmat = rotateMatrix6(Mmat, rotor.R_q) + Mmat = rotateMatrix6(Mmat, rotor.R_q) + + # now convert everything to be about the RNA reference point and add to global vectors/matrices + rotor_W, rotor_C_struc = getWeightOfPointMass(rotor.mRNA, rotor.r_CG_rel - rotor.r_RRP_rel, g=g) # get weight vector and effective stiffness matrix of the rotor + W_struc_fullDOF[iFirst:iLast] += rotor_W # weight vector + M_struc_fullDOF[iFirst:iLast, iFirst:iLast] += translateMatrix6to6DOF(Mmat, rotor.r_CG_rel - rotor.r_RRP_rel) # mass/inertia matrix + C_struc_fullDOF[iFirst:iLast, iFirst:iLast] += rotor_C_struc - # now convert everything to be about PRP (platform reference point) and add to global vectors/matrices - self.W_struc += translateForce3to6DOF(np.array([0,0, -g*rotor.mRNA]), rotor.r_CG_rel ) # weight vector - self.M_struc += translateMatrix6to6DOF(Mmat, rotor.r_CG_rel) # mass/inertia matrix m_center_sum += rotor.r_CG_rel*rotor.mRNA - # ------------------------- include point inertia properties ----------------------------- - for ip, pointInertia in enumerate(self.pointInertias): - self.M_struc += translateMatrix6to6DOF(pointInertia['inertia'], pointInertia['r']) - self.W_struc += translateForce3to6DOF( np.array([0,0, -g*pointInertia['m']]), pointInertia['r'] ) + for ip, pointInertia in enumerate(self.pointInertias): + # Find node that is nearest to pointInertia['r'] + closest_node = min(self.nodeList, key=lambda n: np.linalg.norm(n.r0[:3] - pointInertia['r'])) # using r0 because pointInertia['r'] is in the platform reference frame + iFirst = closest_node.id * closest_node.nDOF + iLast = (closest_node.id + 1) * closest_node.nDOF + + point_W, point_C_struc = getWeightOfPointMass(pointInertia['m'], pointInertia['r']-closest_node.r0[:3], g=g) # get weight vector and effective stiffness matrix of the point inertia. + W_struc_fullDOF[iFirst:iLast] += point_W + M_struc_fullDOF[iFirst:iLast, iFirst:iLast] += translateMatrix6to6DOF(pointInertia['inertia'], pointInertia['r']-closest_node.r0[:3]) + C_struc_fullDOF[iFirst:iLast, iFirst:iLast] += point_C_struc + m_center_sum += pointInertia['r']*pointInertia['m'] self.m_sub += pointInertia['m'] - self.M_struc_sub += translateMatrix6to6DOF(pointInertia['inertia'], pointInertia['r']) # mass matrix of the substructure about the PRP + M_struc_sub_fullDOF[iFirst:iLast, iFirst:iLast] += translateMatrix6to6DOF(pointInertia['inertia'], pointInertia['r']-closest_node.r0[:3]) # mass matrix of the substructure about the PRP + C_struc_sub_fullDOF[iFirst:iLast, iFirst:iLast] += point_C_struc + W_struc_sub_fullDOF[iFirst:iLast] += point_W # weight vector of the substructure [N, N-m] m_sub_sum += pointInertia['r']*pointInertia['m'] # product sum of the substructure members and their centers of mass [kg-m] + # ------------------------- include user-specified mean loads ----------------------------- + for ip, pointLoad in enumerate(self.pointLoads): + # Find node that is nearest to pointLoad['r'] + closest_node = min(self.nodeList, key=lambda n: np.linalg.norm(n.r0[:3] - pointLoad['r'])) + iFirst = closest_node.id * closest_node.nDOF + iLast = (closest_node.id + 1) * closest_node.nDOF + f0_additional_fullDOF[iFirst:iLast] += transformForce(pointLoad['f'], offset=pointLoad['r']-closest_node.r0[:3]) # add the user-specified mean load to the additional force vector + + # ----- internal loads at end nodes of flexible members + # Used for the geometric stiffness of flexible members. + # I think the proper way would be to first compute the internal loads and then compute the geometric stiffness. But this hackish approach seems to work. + # + # Check if the end nodes of the member are not in the reducedDOF list, in which + # case we need to add the contribution of their internal forces to the geometric stiffness + W_internal_endNodes_struc_fullDOF, W_internal_endNodes_hydro_fullDOF = np.zeros(self.nFullDOF), np.zeros(self.nFullDOF) + for mem in memberList: + if mem.type == 'beam': + includeEndA = (mem.nodeList[0].id not in [dof[0] for dof in self.reducedDOF]) + includeEndB = (mem.nodeList[-1].id not in [dof[0] for dof in self.reducedDOF]) + FweightA, FweightB = np.zeros(6), np.zeros(6) + FbuoyancyA, FbuoyancyB = np.zeros(6), np.zeros(6) + if includeEndA and includeEndB: # In this case, we will just split the loads between nodes (assuming cantilevered both ends) + FweightA, _ = getWeightOfPointMass(mem.mass/2, mem.rCoG-mem.nodeList[ 0].r[:3], g=g) + FweightB, _ = getWeightOfPointMass(mem.mass/2, mem.rCoG-mem.nodeList[-1].r[:3], g=g) + FbuoyancyA = transformForce(np.array([0,0, self.rho_water*g*mem.V/2]), offset=mem.rCB-mem.nodeList[ 0].r[:3]) + FbuoyancyB = transformForce(np.array([0,0, self.rho_water*g*mem.V/2]), offset=mem.rCB-mem.nodeList[-1].r[:3]) + + elif includeEndA: + FweightA, _ = getWeightOfPointMass(mem.mass, mem.rCoG-mem.nodeList[0].r[:3], g=g) + FbuoyancyA = transformForce(np.array([0,0, self.rho_water*g*mem.V]), offset=mem.rCB-mem.nodeList[0].r[:3]) + + elif includeEndB: + FweightB, _ = getWeightOfPointMass(mem.mass, mem.rCoG-mem.nodeList[-1].r[:3], g=g) + FbuoyancyB = transformForce(np.array([0,0, self.rho_water*g*mem.V]), offset=mem.rCB-mem.nodeList[-1].r[:3]) + + iFirstEndA, iLastEndA = mem.nodeList[ 0].id * mem.nodeList[ 0].nDOF, (mem.nodeList[ 0].id + 1) * mem.nodeList[ 0].nDOF + iFirstEndB, iLastEndB = mem.nodeList[-1].id * mem.nodeList[-1].nDOF, (mem.nodeList[-1].id + 1) * mem.nodeList[-1].nDOF + + W_internal_endNodes_struc_fullDOF[iFirstEndA:iLastEndA] += FweightA + W_internal_endNodes_struc_fullDOF[iFirstEndB:iLastEndB] += FweightB + W_internal_endNodes_hydro_fullDOF[iFirstEndA:iLastEndA] += FbuoyancyA + W_internal_endNodes_hydro_fullDOF[iFirstEndB:iLastEndB] += FbuoyancyB + + # ------------------------- Transform quantities above to the reduced set of dofs ----------------------------- + self.M_struc = self.T.T @ M_struc_fullDOF @ self.T + self.M_struc_sub = self.T.T @ M_struc_sub_fullDOF @ self.T + self.C_hydro = self.T.T @ C_hydro_fullDOF @ self.T + self.C_struc = self.T.T @ C_struc_fullDOF @ self.T + self.C_struc_sub = self.T.T @ C_struc_sub_fullDOF @ self.T + self.C_elast = self.T.T @ C_elast_fullDOF @ self.T + self.W_struc = self.T.T @ W_struc_fullDOF + self.W_hydro = self.T.T @ W_hydro_fullDOF + self.f0_additional = self.T.T @ f0_additional_fullDOF + self.W_struc_internal = self.T.T @ W_internal_endNodes_struc_fullDOF + self.W_hydro_internal = self.T.T @ W_internal_endNodes_hydro_fullDOF + + + # Geometric stiffness of flexible members (due to internal loads) + # Following the approach from Lee et al, 2024, 'On the correction of hydrostatic stiffness for discrete-module-based hydroelasticity analysis of vertically arrayed modules' + # doi.org/10.1016/j.engstruct.2024.118710 + def _compute_geom_stiffness(member, force): + """ + Internal helper to compute geometric stiffness for flexible members + """ + # Get force acting on each node of the flexible member + Wnodes = np.zeros([len(member.nodeList), 6]) + for inode, node in enumerate(member.nodeList): + Wnodes[inode, :] = node.T @ force # I'm not sure if we can do this + + # Compute geometric stiffness by assuming that the body is in equilibrium to get the internal forces + K_geom = np.zeros([member.nDOF, member.nDOF]) # Initialize geometric stiffness matrix for the member + for inode, node in enumerate(member.nodeList): + W_after = np.sum(Wnodes[inode+1:, :], axis=0) + # W_before = np.sum(Wnodes[:inode, :], axis=0) + W_before = -W_after - Wnodes[inode, :] + + r_before, r_after = np.zeros(3), np.zeros(3) + if inode != 0: + r_before = (mem.nodeList[inode].r[:3] + mem.nodeList[inode-1].r[:3])/2 - mem.nodeList[inode].r[:3] + if inode != len(mem.nodeList)-1: + r_after = (mem.nodeList[inode].r[:3] + mem.nodeList[inode+1].r[:3])/2 - mem.nodeList[inode].r[:3] + + K_node = np.zeros([6, 6]) + K_node[3, 3] = (W_after[2] * r_after[2] + W_before[2] * r_before[2]) + (W_after[1] * r_after[1] + W_before[1] * r_before[1]) + K_node[4, 4] = (W_after[2] * r_after[2] + W_before[2] * r_before[2]) + (W_after[0] * r_after[0] + W_before[0] * r_before[0]) + K_node[5, 5] = (W_after[1] * r_after[1] + W_before[1] * r_before[1]) + (W_after[0] * r_after[0] + W_before[0] * r_before[0]) + K_node[3, 4] = -W_after[1] * r_after[0] - W_before[1] * r_before[0] + K_node[3, 5] = -W_after[2] * r_after[0] - W_before[2] * r_before[0] + K_node[4, 5] = -W_after[2] * r_after[1] - W_before[2] * r_before[1] + K_node[4, 3] = -W_after[0] * r_after[1] - W_before[0] * r_before[1] + K_node[5, 4] = -W_after[0] * r_after[2] - W_before[0] * r_before[2] + K_node[5, 3] = -W_after[1] * r_after[2] - W_before[1] * r_before[2] + + K_geom[inode*node.nDOF:(inode+1)*node.nDOF, inode*node.nDOF:(inode+1)*node.nDOF] = K_node + + return K_geom + + K_geom_struc_fullDOF, K_geom_hydro_fullDOF = np.zeros([self.nFullDOF,self.nFullDOF]), np.zeros([self.nFullDOF,self.nFullDOF]) + for mem in memberList: + if mem.type == 'beam': + iFirst = mem.nodeList[ 0].id * mem.nodeList[0].nDOF + iLast = (mem.nodeList[-1].id + 1) * mem.nodeList[0].nDOF + K_geom_struc_fullDOF[iFirst:iLast, iFirst:iLast] = _compute_geom_stiffness(mem, self.W_struc+self.W_struc_internal) + K_geom_hydro_fullDOF[iFirst:iLast, iFirst:iLast] = _compute_geom_stiffness(mem, self.W_hydro+self.W_hydro_internal) + + self.C_struc += self.T.T @ K_geom_struc_fullDOF @ self.T + self.C_hydro += self.T.T @ K_geom_hydro_fullDOF @ self.T + + #--- Geommetric stiffness due to the variation of the transformation matrix + C_hydro_geom = np.zeros([self.nDOF,self.nDOF]) + C_struc_geom = np.zeros([self.nDOF,self.nDOF]) + C_struc_sub_geom = np.zeros([self.nDOF,self.nDOF]) + for i in range(self.nDOF): + for j in range(self.nDOF): + dT = self.dT[:,:,j].T + C_hydro_geom[i,j] = -dT[i,:] @ (W_hydro_fullDOF + W_internal_endNodes_hydro_fullDOF) + C_struc_geom[i,j] = -dT[i,:] @ (W_struc_fullDOF + W_internal_endNodes_struc_fullDOF) + C_struc_sub_geom[i,j] = -dT[i,:] @ W_struc_sub_fullDOF + self.C_hydro += C_hydro_geom + self.C_struc += C_struc_geom + self.C_struc_sub += C_struc_sub_geom + + + # Make the matrices symmetric. They should be, as the _fullDOF matrices are symmetric, but the matrix products + # above can introduce numerical errors because some elements are usually many orders of magnitude larger than others. + self.M_struc = (self.M_struc + self.M_struc.T) / 2 + self.M_struc_sub = (self.M_struc_sub + self.M_struc_sub.T) / 2 + self.C_hydro = (self.C_hydro + self.C_hydro.T) / 2 + self.C_struc = (self.C_struc + self.C_struc.T) / 2 + self.C_struc_sub = (self.C_struc_sub + self.C_struc_sub.T) / 2 + self.C_elast = (self.C_elast + self.C_elast.T) / 2 # ----------- process inertia-related totals ---------------- - - m_all = self.M_struc[0,0] # total mass of all the members - rCG_all = m_center_sum/m_all # total CG of all the members - + # To get the mass, we apply an unit translational acceleration in the X direction. This makes the whole FOWT translate as a single rigid body + Xhelper = np.array([1 if dof[1] == 0 else 0 for dof in self.reducedDOF]) + m_all = sum((self.M_struc @ Xhelper) * Xhelper) # Do an element-wise multiplication by Xhelper to remove couplings with other dofs + + # Should we compute this in a similar way as the helper function getMassAndCenterOfBeam()? + rCG_all = m_center_sum/m_all # total CG of all the members self.rCG = rCG_all - self.rCG_sub = m_sub_sum/self.m_sub # solve for just the substructure mass and CG - - + self.rCG_sub = m_sub_sum/self.m_sub # solve for just the substructure mass and CG # get principal moments of inertia (about CG) # note: these are likely only useful in the unrotated frame, i.e. # the first time calcStatics is called. + # TODO: Not sure about the best way to deal with these when nDOF>6. Maybe Craig-Bampton keeping the first 6 dofs? + # For now, just using the first 6 dofs but knowing that it is wrong for nDOF>6 # the mass matrix of the substructure about the substruc's CM - M_sub = translateMatrix6to6DOF(self.M_struc_sub, -self.rCG_sub) # -rCG_sub due to convention of the function + M_sub = translateMatrix6to6DOF(self.M_struc_sub[:6,:6], -self.rCG_sub) # -rCG_sub due to convention of the function # overall structure mass matrix about its CM - M_all = translateMatrix6to6DOF(self.M_struc, -self.rCG) + M_all = translateMatrix6to6DOF(self.M_struc[:6,:6], -self.rCG) # could check that off-diagonals are approximately zero as an error check @@ -592,12 +1252,6 @@ def calcStatics(self): else: zMeta = rCB_TOT[2] + IWPx_TOT/VTOT # add center of buoyancy and BM=I/v to get z elevation of metecenter [m] (have to pick one direction for IWP) - self.C_struc[3,3] = -m_all*g*rCG_all[2] - self.C_struc[4,4] = -m_all*g*rCG_all[2] - - self.C_struc_sub[3,3] = -self.m_sub*g*self.rCG_sub[2] - self.C_struc_sub[4,4] = -self.m_sub*g*self.rCG_sub[2] - # add relevant properties to this turbine's MoorPy Body # >>> should double check proper handling of mean weight and buoyancy forces throughout model <<< if self.body: # note: this is likely unused now <<< @@ -790,17 +1444,19 @@ def calcBEM(self, dw=0, wMax=0, wInf=10.0, dz=0, da=0, dh=0, headings=[0], meshD def readHydro(self): '''Read preexisting WAMIT-style .1 and .3 files and use as the FOWT's added mass, damping, and excitation matrices. This is as an alternative - to PyHAMS or strip theory, and is done when potFirstOrder == 1/True.''' - import pyhams.pyhams as ph + to PyHAMS or strip theory, and is done when potFirstOrder == 1/True. + We still need to work on multibody BEM excitation in the future + For now, just lumping it at the first 6 reduced dofs of the structure + ''' + import pyhams.pyhams as ph + # read the preexisting WAMIT-style output files addedMass, damping, w1 = ph.read_wamit1(self.hydroPath+'.1', TFlag=True) # first two entries in frequency dimension are expected to be zero-frequency then infinite frequency M, P, R, I, w3, heads = ph.read_wamit3(self.hydroPath+'.3', TFlag=True) # The Tflag means that the first column is in units of periods, not frequencies, and therefore the first set (-1) becomes zero-frequency and the second set is infinite # process and sort headings and sort frequencies - R_unsorted = R.copy() - I_unsorted = I.copy() self.BEM_headings = np.array(heads)%(360) # save headings in range of 0-360 [deg] # interpole to the frequencies RAFT is using sorted_indices = np.argsort(self.BEM_headings) self.BEM_headings = self.BEM_headings[sorted_indices] @@ -818,29 +1474,32 @@ def readHydro(self): # note: fEx tensors are sized according to [nHeadings, 6 DOFs, frequencies] # copy results over to the FOWT's coefficient arrays - self.A_BEM = self.rho_water * addedMassInterp - self.B_BEM = self.w * self.rho_water * dampingInterp - X_BEM_temp = self.rho_water * self.g * (fExRealInterp + 1j*fExImagInterp) - - # transform excitation coefficients so that DOFs are always relative to incident wave heading rather than global frame - self.X_BEM = np.zeros_like(X_BEM_temp) + # For now, we will just lump at the first 6 dofs. Assuming coefficients computed wrt (0,0,0) + for iw in range(self.nw): + self.A_BEM[:6, :6, iw] = translateMatrix6to6DOF( self.rho_water * addedMassInterp[:,:,iw], -self.nodeList[self.reducedDOF[0][0]].r0[:3]) + self.B_BEM[:6, :6, iw] = translateMatrix6to6DOF(self.w[iw] * self.rho_water * dampingInterp[:,:,iw], -self.nodeList[self.reducedDOF[0][0]].r0[:3]) # Transform excitation coefficients so that DOFs are always # relative to incident wave heading rather than global frame, # for accurate magnitudes when interpolating between directions. - self.X_BEM = np.zeros_like(X_BEM_temp) - + X_BEM_temp = self.rho_water * self.g * (fExRealInterp + 1j*fExImagInterp) + X_BEM = np.zeros_like(X_BEM_temp) + self.X_BEM = np.zeros((X_BEM_temp.shape[0], self.nDOF, X_BEM_temp.shape[2]), dtype=complex) + for ih in range(len(self.BEM_headings)): sin_heading = np.sin(np.radians(self.BEM_headings[ih])) cos_heading = np.cos(np.radians(self.BEM_headings[ih])) - self.X_BEM[ih,0,:] = cos_heading * X_BEM_temp[ih,0,:] + sin_heading * X_BEM_temp[ih,1,:] - self.X_BEM[ih,1,:] = -sin_heading * X_BEM_temp[ih,0,:] + cos_heading * X_BEM_temp[ih,1,:] - self.X_BEM[ih,2,:] = X_BEM_temp[ih,2,:] - self.X_BEM[ih,3,:] = cos_heading * X_BEM_temp[ih,3,:] + sin_heading * X_BEM_temp[ih,4,:] - self.X_BEM[ih,4,:] = -sin_heading * X_BEM_temp[ih,3,:] + cos_heading * X_BEM_temp[ih,4,:] - self.X_BEM[ih,5,:] = X_BEM_temp[ih,5,:] + X_BEM[ih,0,:] = cos_heading * X_BEM_temp[ih,0,:] + sin_heading * X_BEM_temp[ih,1,:] + X_BEM[ih,1,:] = -sin_heading * X_BEM_temp[ih,0,:] + cos_heading * X_BEM_temp[ih,1,:] + X_BEM[ih,2,:] = X_BEM_temp[ih,2,:] + X_BEM[ih,3,:] = cos_heading * X_BEM_temp[ih,3,:] + sin_heading * X_BEM_temp[ih,4,:] + X_BEM[ih,4,:] = -sin_heading * X_BEM_temp[ih,3,:] + cos_heading * X_BEM_temp[ih,4,:] + X_BEM[ih,5,:] = X_BEM_temp[ih,5,:] + for iw in range(self.nw): + self.X_BEM[ih, :6, iw] = transformForce(X_BEM[ih,:,iw], offset= -self.nodeList[self.reducedDOF[0][0]].r[:3]) + # HAMS results error checks >>> any more we should have? <<< if np.isnan(self.A_BEM).any(): raise Exception("NaN values detected in HAMS calculations for added mass. Check the geometry.") @@ -855,6 +1514,8 @@ def readHydro(self): def calcTurbineConstants(self, case, ptfm_pitch=0): '''This computes turbine linear terms (excluding hydrodynamic added mass and inertial excitation, which are handled by getHydroConstants). + Loads and matrices are wrt to the rotor node location. + case dictionary of case information @@ -866,15 +1527,15 @@ def calcTurbineConstants(self, case, ptfm_pitch=0): turbine_status = getFromDict(case, 'turbine_status', shape=0, dtype=str, default='operating') # initialize arrays (can remain zero if aerodynamics are disabled) - self.A_aero = np.zeros([6,6,self.nw,self.nrotors]) # frequency-dependent aero-servo added mass matrix - self.B_aero = np.zeros([6,6,self.nw,self.nrotors]) # frequency-dependent aero-servo damping matrix - self.f_aero = np.zeros([6, self.nw,self.nrotors], dtype=complex) # dynamice excitation force and moment amplitude spectra - self.f_aero0 = np.zeros([6, self.nrotors]) # mean aerodynamic forces and moments + self.A_aero = np.zeros([self.nDOF,self.nDOF,self.nw,self.nrotors]) # frequency-dependent aero-servo added mass matrix + self.B_aero = np.zeros([self.nDOF,self.nDOF,self.nw,self.nrotors]) # frequency-dependent aero-servo damping matrix + self.f_aero = np.zeros([self.nDOF, self.nw,self.nrotors], dtype=complex) # dynamice excitation force and moment amplitude spectra + self.f_aero0 = np.zeros([self.nDOF, self.nrotors]) # mean aerodynamic forces and moments #todo: reorder above so that w is last index <<< - self.B_gyro = np.zeros([6,6,self.nrotors]) # rotor gyroscopic damping matrix + self.B_gyro = np.zeros([self.nDOF,self.nDOF,self.nrotors]) # rotor gyroscopic damping matrix self.cav = [0] - + if turbine_status == 'operating': for ir, rot in enumerate(self.rotorList): @@ -890,20 +1551,17 @@ def calcTurbineConstants(self, case, ptfm_pitch=0): if rot.aeroServoMod > 0 and speed > 0.0: # Get mean aero forces and fore-aft coefficients - # Note: these are about hub coordinate in global orientation. + # Note: these are about the rotor's node in global orientation. f_aero0, f_aero, a_aero, b_aero = rot.calcAero(case, current=current) # get values about hub - # convert coefficients to platform reference frame and populate tensor slice for this rotor - for iw in range(self.nw): - self.A_aero[:,:,iw,ir] = translateMatrix6to6DOF(a_aero[:,:,iw], rot.r_hub_rel) - self.B_aero[:,:,iw,ir] = translateMatrix6to6DOF(b_aero[:,:,iw], rot.r_hub_rel) - - # convert forces to platform reference frame - self.f_aero0[:,ir] = transformForce(f_aero0, offset=rot.r_hub_rel) # mean forces and moments - + # Transform quantities to the reduced set of dofs + T = rot.nodeList[0].T # transformation matrix from the reduced set of dofs of the FOWT to the 6 dofs of the rotor node + self.f_aero0[:,ir] = T.T @ f_aero0 # mean forces and moments for iw in range(self.nw): - self.f_aero[:,iw,ir] = transformForce(f_aero[:,iw], offset=rot.r_hub_rel) # excitation - + self.A_aero[:,:,iw,ir] = T.T @ a_aero[:,:,iw] @ T + self.B_aero[:,:,iw,ir] = T.T @ b_aero[:,:,iw] @ T + self.f_aero[:,iw,ir] = T.T @ f_aero[:,iw] # convert excitation forces to the reduced set of dofs + # calculate cavitation of the rotor (platform motions should already be accounted for in the CCBlade object after running calcAero) if rot.r3[2] < 0: # if submerged self.cav = rot.calcCavitation(case) # TO-DO: wire this to be a result/output, then uncomment <<< @@ -917,9 +1575,10 @@ def calcTurbineConstants(self, case, ptfm_pitch=0): # rotating inertia vector [kg-m^2 * rad/s = N-m-s] IO_rotor = rot.I_drivetrain * Omega_rotor - GyroDampingMatrix = getH(IO_rotor) + GyroDampingMatrix = np.zeros((6, 6)) + GyroDampingMatrix[3:, 3:] = getH(IO_rotor) - self.B_gyro[3:, 3:, ir] = GyroDampingMatrix + self.B_gyro[:, :, ir] = T.T @ GyroDampingMatrix @ T # note, gyroscopic effect is purely rotational so no translation adjustment needed @@ -935,13 +1594,16 @@ def calcHydroConstants(self): rho = self.rho_water g = self.g - # --------------------- get constant hydrodynamic values along each member ----------------------------- - - self.A_hydro_morison = np.zeros([6,6]) # hydrodynamic added mass matrix, from only Morison equation [kg, kg-m, kg-m^2] + # --------------------- get constant hydrodynamic values along each member ----------------------------- + self.A_hydro_morison = np.zeros([self.nDOF, self.nDOF]) # hydrodynamic added mass matrix, from only Morison equation [kg, kg-m, kg-m^2] + A_hydro_morison_fullDOF = np.zeros([self.nFullDOF, self.nFullDOF]) # same but in the full set of dofs # loop through each member for i,mem in enumerate(self.memberList): + # Find the indices of the first and last nodes of the member to fill the _fullDOF matrices + iFirst = mem.nodeList[ 0].id * mem.nodeList[0].nDOF + iLast = (mem.nodeList[-1].id + 1) * mem.nodeList[0].nDOF # Assuming all nodes have the same dofs, namely 6 # get member added mass matrix about PRP (also saves each member's inertial excitation coefficients) if mem.MCF: @@ -949,23 +1611,24 @@ def calcHydroConstants(self): else: k_array = None - A_hydro_i = mem.calcHydroConstants(r_ref=self.r6[:3], rho=rho, g=g, k_array=k_array) - self.A_hydro_morison += A_hydro_i # add to FOWT added mass matrix + A_hydro_morison_fullDOF[iFirst:iLast, iFirst:iLast] += mem.calcHydroConstants(rho=rho, g=g, k_array=k_array) # ----- Get hydrodynamic contributions from any underwater rotors ------ for i, rot in enumerate(self.rotorList): + iFirst = rot.nodeList[ 0].id * rot.nodeList[0].nDOF + iLast = (rot.nodeList[-1].id + 1) * rot.nodeList[0].nDOF # compute rotor hydro added mass/inertia properties A_hydro_i, I_hydro_i = rot.calcHydroConstants(rho=rho, g=g) + A_hydro_morison_fullDOF[iFirst:iLast, iFirst:iLast] += A_hydro_i - # make relative to PRP and add to system added mass matrix - self.A_hydro_morison += translateMatrix6to6DOF(A_hydro_i, rot.r3-self.r6[:3]) + self.A_hydro_morison = self.T.T @ A_hydro_morison_fullDOF @ self.T # transform to the reduced set of dofs def getStiffness(self): '''Sums up all the stiffness effects on a FOWT.''' - C_tot = np.zeros([6,6]) # total stiffness matrix [N/m, N, N-m] + C_tot = np.zeros([self.nDOF, self.nDOF]) # total stiffness matrix [N/m, N, N-m] # add in mooring stiffness from MoorPy system C_tot += self.C_moor @@ -976,12 +1639,11 @@ def getStiffness(self): if self.body: C_tot += self.body.getStiffness() # in future should make an analytic body function for this - C_tot += self.C_struc + self.C_hydro # stiffness + C_tot += self.C_struc + self.C_hydro + self.C_elast # stiffness return C_tot - - def solveEigen(self, display=0): + def solveEigen(self, display=0, outPath=None): '''Compute the natural frequencies and mode shapes of the FOWT. This considers the FOWT and any attached mooring lines, but it does not account for coupling with other FOWTs as could occur @@ -990,8 +1652,8 @@ def solveEigen(self, display=0): Returns ------- - fns : array - List of natural frequencies [Hz]. + wns : array + List of natural frequencies [rad/s]. modes : 2D array List of mode shapes (eigenvectors) corresponding to the natural frequencies. @@ -1012,37 +1674,53 @@ def solveEigen(self, display=0): if len(message) > 0: raise RuntimeError('System matrices computed by RAFT have one or more small or negative diagonals: '+message) - # calculate natural frequencies (using eigen analysis to get proper values for pitch and roll - otherwise would need to base about CG if using diagonal entries only) - eigenvals, eigenvectors = np.linalg.eig(np.linalg.solve(M_tot, C_tot)) # <<< need to sort this out so it gives desired modes, some are currently a bit messy + # For rigid FOWTs, using the old method for now + if self.nDOF == 6: + # calculate natural frequencies (using eigen analysis to get proper values for pitch and roll - otherwise would need to base about CG if using diagonal entries only) + eigenvals, eigenvectors = np.linalg.eig(np.linalg.solve(M_tot, C_tot)) # <<< need to sort this out so it gives desired modes, some are currently a bit messy - if any(eigenvals <= 0.0): - raise RuntimeError("Error: zero or negative system eigenvalues detected.") + if any(eigenvals <= 0.0): + raise RuntimeError("Error: zero or negative system eigenvalues detected.") - # sort to normal DOF order based on which DOF is largest in each eigenvector - ind_list = [] - for i in range(5,-1, -1): - vec = np.abs(eigenvectors[i,:]) # look at each row (DOF) at a time (use reverse order to pick out rotational DOFs first) + # sort to normal DOF order based on which DOF is largest in each eigenvector + ind_list = [] + for i in range(5,-1, -1): + vec = np.abs(eigenvectors[i,:]) # look at each row (DOF) at a time (use reverse order to pick out rotational DOFs first) - for j in range(6): # now do another loop in case the index was claimed previously + for j in range(6): # now do another loop in case the index was claimed previously - ind = np.argmax(vec) # find the index of the vector with the largest value of the current DOF + ind = np.argmax(vec) # find the index of the vector with the largest value of the current DOF - if ind in ind_list: # if a previous vector claimed this DOF, set it to zero in this vector so that we look at the other vectors - vec[ind] = 0.0 - else: - ind_list.append(ind) # if it hasn't been claimed before, assign this vector to the DOF - break + if ind in ind_list: # if a previous vector claimed this DOF, set it to zero in this vector so that we look at the other vectors + vec[ind] = 0.0 + else: + ind_list.append(ind) # if it hasn't been claimed before, assign this vector to the DOF + break - ind_list.reverse() # reverse the index list since we made it in reverse order + ind_list.reverse() # reverse the index list since we made it in reverse order - fns = np.sqrt(eigenvals[ind_list])/2.0/np.pi # apply sorting to eigenvalues and convert to natural frequency in Hz - modes = eigenvectors[:,ind_list] # apply sorting to eigenvectors + fns = np.sqrt(eigenvals[ind_list])/2.0/np.pi # apply sorting to eigenvalues and convert to natural frequency in Hz + modes = eigenvectors[:,ind_list] # apply sorting to eigenvectors + else: + eigenvals, eigenvectors = np.linalg.eig(np.linalg.solve(M_tot, C_tot)) + + # Sort in ascending order of eigenvals + sorted_indices = np.argsort(eigenvals) + eigenvals = eigenvals[sorted_indices] + eigenvectors = eigenvectors[:, sorted_indices] + + fns = np.sqrt(eigenvals)/2.0/np.pi + modes = eigenvectors + + if isinstance(outPath, str): + self.write_modes_json(outPath, fns, modes) + if display > 0: print("") print("--------- Natural frequencies and mode shapes -------------") print("Mode 1 2 3 4 5 6") - print("Fn (Hz)"+"".join([f"{fn:10.4f}" for fn in fns])) + print("Fn (Hz)"+"".join([f"{fn:10.4f}" for fn in fns[:6]])) print("") for i in range(6): print(f"DOF {i+1} "+"".join([f"{modes[i,j]:10.4f}" for j in range(6)])) @@ -1075,7 +1753,7 @@ def calcHydroExcitation(self, case, memberList=[]): self.beta = deg2rad(case['wave_heading']) # array of wave headings. Input in [deg], but the code uses [rad] - self.zeta = np.zeros([self.nWaves,self.nw], dtype=complex) + self.zeta = np.zeros([self.nWaves,self.nw]) # make wave spectrum for each heading self.S = np.zeros([self.nWaves,self.nw]) @@ -1107,13 +1785,15 @@ def calcHydroExcitation(self, case, memberList=[]): # ----- calculate potential-flow wave excitation force ----- - self.F_BEM = np.zeros([self.nWaves,6,self.nw], dtype=complex) - self.F_hydro_iner = np.zeros([self.nWaves, 6, self.nw],dtype=complex) # inertia excitation force/moment complex amplitudes vector [N, N-m] + self.F_BEM = np.zeros([self.nWaves,self.nDOF,self.nw], dtype=complex) + self.F_BEM_fullDOF = np.zeros([self.nWaves,self.nFullDOF,self.nw], dtype=complex) + self.F_hydro_iner = np.zeros([self.nWaves, self.nDOF, self.nw],dtype=complex) # inertia excitation force/moment complex amplitudes vector [N, N-m] + self.F_hydro_iner_fullDOF = np.zeros([self.nWaves, self.nFullDOF, self.nw],dtype=complex) # Same but in full DOFs # BEM-based wave excitation force on platform for each wave heading # (will be zero if only using strip theory). Includes wave heading interpolation. - if self.potMod or self.potModMaster in [2,3]: - + # TODO: currently lumping at the first 6dofs. Should implement multi-body solution in the future + if self.potMod or self.potModMaster in [2,3]: for ih in range(self.nWaves): # phase offset due to FOWT position in array @@ -1166,19 +1846,23 @@ def calcHydroExcitation(self, case, memberList=[]): X_BEM_ih[5,:] = X_prime[5,:] # multiply excitation coefficients by wave elevation to get excitation forces and moments for this wave heading - self.F_BEM[ih,:,:] = X_BEM_ih * self.zeta[ih,:] * phase_offset + self.F_BEM_fullDOF[ih, :6, :] = X_BEM_ih * self.zeta[ih,:] * phase_offset # ----- strip-theory wave excitation force ----- # loop through each member to compute strip-theory contributions # This also saves the save wave kinematics over each member. - for i,mem in enumerate(memberList): - self.F_hydro_iner += mem.calcHydroExcitation(self.zeta, self.beta, self.w, self.depth, k=self.k, r_ref=self.r6[:3]) - + for i,mem in enumerate(memberList): + iFirst = mem.nodeList[ 0].id * mem.nodeList[0].nDOF + iLast = (mem.nodeList[-1].id + 1) * mem.nodeList[-1].nDOF + self.F_hydro_iner_fullDOF[:, iFirst:iLast, :] += mem.calcHydroExcitation(self.zeta, self.beta, self.w, self.depth, k=self.k) # ----- inertial excitation on rotor(s) ----- for i, rot in enumerate(self.rotorList): if rot.r3[2] < 0: # if submerged + # Find the indices of the first and last nodes of the member to fill the _fullDOF matrices + iFirst = rot.nodeList[ 0].id * rot.nodeList[0].nDOF + iLast = (rot.nodeList[-1].id + 1) * rot.nodeList[0].nDOF # Assuming all nodes have the same dofs, namely 6 # get wave kinematics spectra given a certain wave spectrum and location # for each wave direction, calculate the hub wave kinematics @@ -1196,8 +1880,12 @@ def calcHydroExcitation(self, case, memberList=[]): f3 = np.matmul( I_hydro[:3,:3], rot.ud[ih,:,i] ) # Forces due to acceleration f6 = translateForce3to6DOF(f3, rot.r3 - self.r6[:3]) # Translate to about PRP (induces some moments) f6[3:] += np.matmul( I_hydro[3:,:3], rot.ud[ih,:,i] ) # Add moments due to acceleration + self.F_hydro_iner_fullDOF[ih, iFirst:iLast, i] += f6 # add to the full DOF matrix - self.F_hydro_iner[ih,:,i] += f6 + # transform to the reduced set of dofs + for ih in range(self.nWaves): + self.F_BEM[ih, :, :] = self.T.T @ self.F_BEM_fullDOF[ih, :, :] + self.F_hydro_iner[ih, :, :] = self.T.T @ self.F_hydro_iner_fullDOF[ih, :, :] def calcHydroLinearization(self, Xi): @@ -1208,22 +1896,37 @@ def calcHydroLinearization(self, Xi): Currently hard-coded to only consider the first seastate/heading. Xi : complex array - system response (just for this FOWT) - displacement and rotation complex amplitudes [m, rad] + system response (just for this FOWT) - displacement and rotation complex amplitudes + in the reduced dofs of the FOWT [m, rad] ''' # The linearized coefficients to be calculated - B_hydro_drag = np.zeros([6,6]) # hydrodynamic damping matrix (just linearized viscous drag for now) [N-s/m, N-s, N-s-m] - - F_hydro_drag = np.zeros([6,self.nw],dtype=complex) # excitation force/moment complex amplitudes vector [N, N-m] + B_hydro_drag = np.zeros([self.nDOF,self.nDOF]) # hydrodynamic damping matrix (just linearized viscous drag for now) [N-s/m, N-s, N-s-m] + F_hydro_drag = np.zeros([self.nDOF,self.nw],dtype=complex) # excitation force/moment complex amplitudes vector [N, N-m] + B_hydro_drag_fullDOF = np.zeros([self.nFullDOF,self.nFullDOF]) # same but in full dofs + F_hydro_drag_fullDOF = np.zeros([self.nFullDOF,self.nw],dtype=complex) ih = 0 # we will only consider the first sea state in this linearization process # loop through each member for mem in self.memberList: - mem_B_hydro_drag, mem_F_hydro_drag = mem.calcHydroLinearization(self.w, ih=ih, Xi=Xi, rho=self.rho_water, r_ref=self.r6[:3]) - B_hydro_drag += mem_B_hydro_drag # add to global damping matrix for Morison members - F_hydro_drag += mem_F_hydro_drag # add to global excitation vector (frequency dependent) + # Find the indices of the first and last nodes of the member to fill the _fullDOF matrices + iFirst = mem.nodeList[ 0].id * mem.nodeList[0].nDOF + iLast = (mem.nodeList[-1].id + 1) * mem.nodeList[0].nDOF # Assuming all nodes have the same dofs, namely 6 + + # Compute the displacements of each structural node + Xi_nodes = np.zeros((mem.nDOF, len(self.w)), dtype=complex) + for inode, node in enumerate(mem.nodeList): + Xi_nodes[inode*node.nDOF:inode*node.nDOF+node.nDOF, :] = node.T @ Xi + + B_hydro_drag_member, F_hydro_drag_member = mem.calcHydroLinearization(self.w, ih=ih, Xi_nodes=Xi_nodes, rho=self.rho_water) + B_hydro_drag_fullDOF[iFirst:iLast, iFirst:iLast] = B_hydro_drag_member + F_hydro_drag_fullDOF[iFirst:iLast, :] = F_hydro_drag_member + + B_hydro_drag += self.T.T @ B_hydro_drag_fullDOF @ self.T # add to damping matrix for Morison members in the reduced set of dofs + for iw in range(self.nw): + F_hydro_drag[:,iw] += self.T.T @ F_hydro_drag_fullDOF[:,iw] # add to global excitation vector (frequency dependent) in the reduced set of dofs # save the arrays internally in case there's ever a need for the FOWT to solve it's own latest dynamics or for visualization self.B_hydro_drag = B_hydro_drag @@ -1241,26 +1944,24 @@ def calcDragExcitation(self, ih): index of wave case being evaluated here ''' - - F_hydro_drag = np.zeros([6,self.nw],dtype=complex) # excitation force/moment complex amplitudes vector [N, N-m] - + self.F_hydro_drag = np.zeros([self.nDOF,self.nw],dtype=complex) # excitation force/moment complex amplitudes vector [N, N-m] + self.F_hydro_drag_fullDOF = np.zeros([self.nFullDOF,self.nw],dtype=complex) for mem in self.memberList: # loop through each member - F_hydro_drag += mem.calcDragExcitation(ih, r_ref=self.r6[:3]) + iFirst = mem.nodeList[ 0].id * mem.nodeList[0].nDOF + iLast = (mem.nodeList[-1].id + 1) * mem.nodeList[0].nDOF + self.F_hydro_drag_fullDOF[iFirst:iLast, :] += mem.calcDragExcitation(ih) - self.F_hydro_drag = F_hydro_drag + for iw in range(self.nw): + self.F_hydro_drag[:,iw] += self.T.T @ self.F_hydro_drag_fullDOF[:,iw] - return F_hydro_drag + return self.F_hydro_drag def calcCurrentLoads(self, case): '''method to calculate the "static" current loads on each member and save as a current force Uses a simple power law relationship to calculate the current velocity as a function of member node depth''' - - rho = self.rho_water - g = self.g - - D_hydro = np.zeros(6) # create variable to hold the total drag force + D_hydro_fullDOF = np.zeros(self.nFullDOF) # same but in full dofs # extract current variables out of the case dictionary speed = getFromDict(case, 'current_speed', shape=0, default=0.0) @@ -1274,11 +1975,14 @@ def calcCurrentLoads(self, case): # loop through each member for mem in self.memberList: - D_hydro += mem.calcCurrentLoads(self.depth, speed=speed, heading=heading, Zref=Zref, shearExp_water=self.shearExp_water, rho=self.rho_water, g=self.g, r_ref=self.r6[:3]) - - self.D_hydro = D_hydro # save hydro drag forces/moments to FOWT for later access + iFirst = mem.nodeList[ 0].id * mem.nodeList[0].nDOF + iLast = (mem.nodeList[-1].id + 1) * mem.nodeList[0].nDOF + D_hydro_fullDOF[iFirst:iLast] += mem.calcCurrentLoads(self.depth, speed=speed, heading=heading, Zref=Zref, shearExp_water=self.shearExp_water, rho=self.rho_water, g=self.g) + + # transform to the reduced set of dofs + self.D_hydro = self.T.T @ D_hydro_fullDOF - return D_hydro + return self.D_hydro def calcQTF_slenderBody(self, waveHeadInd, Xi0=None, verbose=False, iCase=None, iWT=None): @@ -1295,6 +1999,7 @@ def calcQTF_slenderBody(self, waveHeadInd, Xi0=None, verbose=False, iCase=None, # TODO: I think a lot of the calculations below should be moved to the member class # TODO: Add references to the equations in our paper once it's published # TODO: Using waveHeadInd is useful within the software, but perhaps it would be also useful to have an option to specify the wave heading? + # Big TODO: This doesn't work with flexible/multibody FOWTs yet # In case the body is fixed if Xi0 is None: @@ -1304,6 +2009,12 @@ def calcQTF_slenderBody(self, waveHeadInd, Xi0=None, verbose=False, iCase=None, beta = self.beta[waveHeadInd] self.heads_2nd = [beta] # Need this one to print the QTF whead = f"{np.degrees(beta)%360:.2f}".replace('.', 'p') # String with heading in range of 0-360 [deg] for output files + + # Initialize qtf that will be used by the solver + self.qtf = np.zeros([len(self.w1_2nd), len(self.w2_2nd), 1, self.nDOF], dtype=complex) # Need this fourth dimension for conformity with the case where the QTFs are read from a file + if self.nDOF > 6: + print("Function calcQTF_slenderBody() is not implemented for flexible/multibody FOWTs yet. Considering null qtf matrices for now.") + return # Resample Xi0, which is input in the same frequency as the first-order loads, to the frequencies of the 2nd order hydrodynamic forces. # We don't use the same frequencies as the 1st order loads, self.w, for the QTFs because it would be too expensive. @@ -1331,22 +2042,19 @@ def calcQTF_slenderBody(self, waveHeadInd, Xi0=None, verbose=False, iCase=None, # First-order forces, which are used to compute Pinkster's IV term # They are taken as F_1stOrder = Mass * Acceleration_1stOrder F1st = np.zeros([self.nDOF, len(self.w1_2nd)], dtype=complex) - F1st[0:3,:] = self.M_struc[0,0] * (-self.w1_2nd**2 * Xi[0:3,:]) - F1st[3:6,:] = np.matmul(self.M_struc[3:,3:], (-self.w1_2nd**2 * Xi[3:,:])) - - # Initialize qtf that will actually be used by the solver - self.qtf = np.zeros([len(self.w1_2nd), len(self.w2_2nd), 1, self.nDOF], dtype=complex) # Need this fourth dimension for conformity with the case where the QTFs are read from a file + F1st = np.matmul(self.M_struc, (-self.w1_2nd**2 * Xi)) if verbose: print(f" Computing QTF for heading {beta:.2f}") # We start with the force component due to rotation of first-order wave forces (force component IV from Pinkster (1979)). # This component depends on the forces on the whole body, hence it is outside of the member loop below. + # TODO: Need to change this for multibody/flexible FOWTs for i1 in range(len(self.w1_2nd)): for i2 in range(i1, len(self.w2_2nd)): if self.w2_2nd[i2] < self.w1_2nd[i1]: # We don't need to fill the whole matrix, only the upper triangle continue - F_rotN = np.zeros(6, dtype='complex') + F_rotN = np.zeros(self.nDOF, dtype='complex') F_rotN[0:3] = 0.25 * (np.cross(Xi[3:,i1], np.conj(F1st[0:3,i2])) + np.cross(np.conj(Xi[3:,i2]), F1st[0:3,i1])) F_rotN[3: ] = 0.25 * (np.cross(Xi[3:,i1], np.conj(F1st[3: ,i2])) + np.cross(np.conj(Xi[3:,i2]), F1st[3: ,i1])) self.qtf[i1,i2,waveHeadInd,:] = F_rotN @@ -1544,6 +2252,41 @@ def calcHydroForce_2ndOrd(self, beta, S0, iCase=None, iWT=None, interpMode='qtf' return f_mean, f + def evaluateStiffnessMatrix(self): + if len(self.nodeList) == 0: + raise Exception("No nodes in the structure. Cannot compute stiffness matrix.") + nDOF = self.nodeList[0].nDOF # Number of dofs of a single node + + # Stiffness matrix of the whole 6*Nnodes system of equations + self.Kfull = np.zeros([len(self.nodeList)*nDOF, len(self.nodeList)*nDOF]) + + # Node's external stiffness - will be hydrostatics, mooring, etc in the future + for i, node in enumerate(self.nodeList): + self.Kfull[i*nDOF:(i+1)*nDOF, i*nDOF:(i+1)*nDOF] = node.K + + # Internal stiffness for flexible members + # TODO: Make this directly from node? Store the rows of the matrix in the node + for m in self.memberList: + m.computeStiffnessMatrix() # Make sure the stiffness matrix is computed + if m.type == 'beam': + col_first = m.nodeList[0].id*nDOF # ID of the first node of the member + col_last = (m.nodeList[-1].id+1)*nDOF # ID of the last node of the member + for n in m.nodeList: + # Assign the rows of m.K that correspond to this node to matrix self.Kfull + i = n.id # Node of the current member - Index in the matrix with all nodes + i_m = i - m.nodeList[0].id # Index of the node in the member list of nodes + self.Kfull[i*nDOF:(i+1)*nDOF, col_first:col_last] += m.K[i_m*nDOF:(i_m+1)*nDOF, :] + return self.Kfull + + def updateMooringDynamicMatrices(self, Xi, S): + '''Update matrices from mooring dynamics + Inputs + Xi: 6 x Nfreq array with the motion amplitudes of the fowt + S: 1 x Nfreq array with the wave spectrum + ''' + for line in self.ms.lineList: + RAO_A, RAO_B = getLineEndsRAO(line, self.ms, self.w, [Xi], S, [self.r6[:3]]) # Need Xi and r6 within a list + line.updateLumpedMass(self.w, S, self.depth, kbot=0, cbot=0, RAO_A=RAO_A.T, RAO_B=RAO_B.T) # Need to transpose RAO_fl so that it is in the right shape (nFreq x 3) def saveTurbineOutputs(self, results, case): '''Calculate and store output metrics of the FOWT response at the current load case. @@ -1553,96 +2296,156 @@ def saveTurbineOutputs(self, results, case): at a different heading). Results are computed by RMS summing across these excitation sources. ''' - self.Xi0 = self.r6 - np.array([self.x_ref, self.y_ref,0,0,0,0]) # FOWT's mean offset vector [m, rad] + # Get motions of the PRP based on the motions of the rigidBodyNode + Xi0_PRP = self.r6 - np.array([self.x_ref, self.y_ref,0,0,0,0]) # FOWT's mean offset vector [m, rad] + + Xi_rigidBodyNode = self.Xi_fullDOF[:, self.rigidBodyNode.id:self.rigidBodyNode.id+6, :] + Xi_PRP = np.zeros_like(Xi_rigidBodyNode) + for ih in range(Xi_PRP.shape[0]): + for iw in range(Xi_PRP.shape[2]): + Xi_PRP[ih,:3, iw] = Xi_rigidBodyNode[ih,:3,iw] + SmallRotate(-self.rigidBodyNode.r0, Xi_rigidBodyNode[ih,3:,iw]) + Xi_PRP[ih,3:, iw] = Xi_rigidBodyNode[ih,3:,iw] # platform motions - results['surge_avg'] = self.Xi0[0] - results['surge_std'] = getRMS(self.Xi[:,0,:]) - results['surge_max'] = self.Xi0[0] + 3*results['surge_std'] - results['surge_min'] = self.Xi0[0] - 3*results['surge_std'] - results['surge_PSD'] = getPSD(self.Xi[:,0,:], self.dw) - results['surge_RA' ] = self.Xi[:,0,:] - - results['sway_avg'] = self.Xi0[1] - results['sway_std'] = getRMS(self.Xi[:,1,:]) - results['sway_max'] = self.Xi0[1] + 3*results['sway_std'] - results['sway_min'] = self.Xi0[1] - 3*results['sway_std'] - results['sway_PSD'] = getPSD(self.Xi[:,1,:], self.dw) - results['sway_RA' ] = self.Xi[:,1,:] - - results['heave_avg'] = self.Xi0[2] - results['heave_std'] = getRMS(self.Xi[:,2,:]) - results['heave_max'] = self.Xi0[2] + 3*results['heave_std'] - results['heave_min'] = self.Xi0[2] - 3*results['heave_std'] - results['heave_PSD'] = getPSD(self.Xi[:,2,:], self.dw) - results['heave_RA' ] = self.Xi[:,2,:] - - roll_deg = rad2deg(self.Xi[:,3,:]) - results['roll_avg'] = rad2deg(self.Xi0[3]) + results['surge_avg'] = Xi0_PRP[0] + results['surge_std'] = getRMS(Xi_PRP[:,0,:]) + results['surge_max'] = Xi0_PRP[0] + 3*results['surge_std'] + results['surge_min'] = Xi0_PRP[0] - 3*results['surge_std'] + results['surge_PSD'] = getPSD(Xi_PRP[:,0,:], self.dw) + results['surge_RA' ] = Xi_PRP[:,0,:] + + results['sway_avg'] = Xi0_PRP[1] + results['sway_std'] = getRMS(Xi_PRP[:,1,:]) + results['sway_max'] = Xi0_PRP[1] + 3*results['sway_std'] + results['sway_min'] = Xi0_PRP[1] - 3*results['sway_std'] + results['sway_PSD'] = getPSD(Xi_PRP[:,1,:], self.dw) + results['sway_RA' ] = Xi_PRP[:,1,:] + + results['heave_avg'] = Xi0_PRP[2] + results['heave_std'] = getRMS(Xi_PRP[:,2,:]) + results['heave_max'] = Xi0_PRP[2] + 3*results['heave_std'] + results['heave_min'] = Xi0_PRP[2] - 3*results['heave_std'] + results['heave_PSD'] = getPSD(Xi_PRP[:,2,:], self.dw) + results['heave_RA' ] = Xi_PRP[:,2,:] + + roll_deg = rad2deg(Xi_PRP[:,3,:]) + results['roll_avg'] = rad2deg(Xi0_PRP[3]) results['roll_std'] = getRMS(roll_deg) - results['roll_max'] = rad2deg(self.Xi0[3]) + 3*results['roll_std'] - results['roll_min'] = rad2deg(self.Xi0[3]) - 3*results['roll_std'] + results['roll_max'] = rad2deg(Xi0_PRP[3]) + 3*results['roll_std'] + results['roll_min'] = rad2deg(Xi0_PRP[3]) - 3*results['roll_std'] results['roll_PSD'] = getPSD(roll_deg, self.dw) - results['roll_RA' ] = rad2deg(self.Xi[:,3,:]) + results['roll_RA' ] = rad2deg(Xi_PRP[:,3,:]) - pitch_deg = rad2deg(self.Xi[:,4,:]) - results['pitch_avg'] = rad2deg(self.Xi0[4]) + pitch_deg = rad2deg(Xi_PRP[:,4,:]) + results['pitch_avg'] = rad2deg(Xi0_PRP[4]) results['pitch_std'] = getRMS(pitch_deg) - results['pitch_max'] = rad2deg(self.Xi0[4]) + 3*results['pitch_std'] - results['pitch_min'] = rad2deg(self.Xi0[4]) - 3*results['pitch_std'] + results['pitch_max'] = rad2deg(Xi0_PRP[4]) + 3*results['pitch_std'] + results['pitch_min'] = rad2deg(Xi0_PRP[4]) - 3*results['pitch_std'] results['pitch_PSD'] = getPSD(pitch_deg, self.dw) - results['pitch_RA' ] = rad2deg(self.Xi[:,4,:]) + results['pitch_RA' ] = rad2deg(Xi_PRP[:,4,:]) - yaw_deg = rad2deg(self.Xi[:,5,:]) - results['yaw_avg'] = rad2deg(self.Xi0[5]) + yaw_deg = rad2deg(Xi_PRP[:,5,:]) + results['yaw_avg'] = rad2deg(Xi0_PRP[5]) results['yaw_std'] = getRMS(yaw_deg) - results['yaw_max'] = rad2deg(self.Xi0[5]) + 3*results['yaw_std'] - results['yaw_min'] = rad2deg(self.Xi0[5]) - 3*results['yaw_std'] + results['yaw_max'] = rad2deg(Xi0_PRP[5]) + 3*results['yaw_std'] + results['yaw_min'] = rad2deg(Xi0_PRP[5]) - 3*results['yaw_std'] results['yaw_PSD'] = getPSD(yaw_deg, self.dw) - results['yaw_RA' ] = rad2deg(self.Xi[:,5,:]) + results['yaw_RA' ] = rad2deg(Xi_PRP[:,5,:]) # ----- turbine-level mooring outputs (similar code as array-level) ----- - if self.ms: + if self.ms: + self.ms = lines2ss(self.ms) # convert composite lines to subsystem nLines = len(self.ms.lineList) - T_moor_amps = np.zeros([self.nWaves+1, 2*nLines, self.nw], dtype=complex) # mooring tension amplitudes for each excitation source and line end + T_moor_amps = np.zeros([self.nWaves+1, 2*nLines, self.nw], dtype=complex) # mooring tension amplitudes for each wave component and each line end + T_moor_psd = np.zeros([2*nLines, self.nw], dtype=float) + T_moor_std = np.zeros([2*nLines], dtype=float) C_moor, J_moor = self.ms.getCoupledStiffness(lines_only=True, tensions=True) # get stiffness matrix and tension jacobian matrix - T_moor = self.ms.getTensions() # get line end mean tensions + T_moor = self.ms.getTensions() # get line end mean tensions + if self.moorMod == 0: + for ih in range(self.nWaves+1): + for iw in range(self.nw): + T_moor_amps[ih,:,iw] = np.matmul(J_moor, Xi_PRP[ih,:,iw]) # FFT of mooring tensions # TODO: account for nDOF > 6 + + for iT in range(2*nLines): + T_moor_psd[iT,:] = getPSD(T_moor_amps[:,iT,:], self.w[0]) # PSD in N^2/(rad/s) + T_moor_std[iT] = getRMS(T_moor_amps[:,iT,:]) - for ih in range(self.nWaves+1): - for iw in range(self.nw): - T_moor_amps[ih,:,iw] = np.matmul(J_moor, self.Xi[ih,:,iw]) # FFT of mooring tensions - + else: + for il, line in enumerate(self.ms.lineList): + for ih in range(self.nWaves): + RAO_A, RAO_B = getLineEndsRAO(line, self.ms, self.w, [Xi_PRP[ih,:,:]], self.S[ih,:], [self.r6[:3]]) # Need Xi and r6 within a list + T_nodes_amp, _, _, _, _, _, _, _ = line.dynamicSolve(self.w, self.S[ih,:], RAO_A=RAO_A.T, RAO_B=RAO_B.T, depth=self.depth, kbot=0,cbot=0, tol = 0.01, conv_time=False) + + # Tension at the end nodes of the line + T_moor_amps[ih, il, :] += T_nodes_amp[:,0] + T_moor_amps[ih, il+nLines,:] += T_nodes_amp[:,-1] + + # Compute PSD and std from the different wave component + for iT in range(2*nLines): + T_moor_psd[iT,:] = getPSD(T_moor_amps[:,iT,:], self.w[1]-self.w[0]) + T_moor_std[iT] = getRMS(T_moor_amps[:,iT,:]) + + results['Tmoor_avg'] = T_moor results['Tmoor_std'] = np.zeros(2*nLines) results['Tmoor_max'] = np.zeros(2*nLines) results['Tmoor_min'] = np.zeros(2*nLines) results['Tmoor_PSD'] = np.zeros([ 2*nLines, self.nw]) for iT in range(2*nLines): - TRMS = getRMS(T_moor_amps[:,iT,:]) # estimated mooring line RMS tension [N] + TRMS = T_moor_std[iT] results['Tmoor_std'][iT] = TRMS results['Tmoor_max'][iT] = T_moor[iT] + 3*TRMS results['Tmoor_min'][iT] = T_moor[iT] - 3*TRMS results['Tmoor_PSD'][iT, :] = (getPSD(T_moor_amps[:,iT,:], self.w[0])) # PSD in N^2/(rad/s) - # hub fore-aft displacement amplitude and acceleration (used as an approximation in a number of outputs) - XiHub = np.zeros([self.Xi.shape[0], self.nrotors, self.nw], dtype=complex) + # hub displacement amplitude and acceleration + XiHub = np.zeros([self.Xi.shape[0], 6*self.nrotors, self.nw], dtype=complex) + results['AxRNA_std'] = np.zeros(self.nrotors) results['AxRNA_PSD'] = np.zeros([self.nw, self.nrotors]) results['AxRNA_avg'] = np.zeros(self.nrotors) results['AxRNA_max'] = np.zeros(self.nrotors) results['AxRNA_min'] = np.zeros(self.nrotors) + + results['AyRNA_std'] = np.zeros(self.nrotors) + results['AyRNA_PSD'] = np.zeros([self.nw, self.nrotors]) + results['AyRNA_avg'] = np.zeros(self.nrotors) + results['AyRNA_max'] = np.zeros(self.nrotors) + results['AyRNA_min'] = np.zeros(self.nrotors) + + results['AzRNA_std'] = np.zeros(self.nrotors) + results['AzRNA_PSD'] = np.zeros([self.nw, self.nrotors]) + results['AzRNA_avg'] = np.zeros(self.nrotors) + results['AzRNA_max'] = np.zeros(self.nrotors) + results['AzRNA_min'] = np.zeros(self.nrotors) for ir, rotor in enumerate(self.rotorList): - XiHub[:,ir,:] = self.Xi[:,0,:] + rotor.r_rel[2]*self.Xi[:,4,:] # planar approximation; to improve <<< - - # nacelle acceleration - results['AxRNA_std'][ir] = getRMS(XiHub[:,ir,:]*self.w**2) - results['AxRNA_PSD'][:,ir] = (getPSD(XiHub[:,ir,:]*self.w**2, self.dw)) - results['AxRNA_avg'][ir] = abs(np.sin(self.Xi0[4])*9.81) # @Matt check this! - results['AxRNA_max'][ir] = results['AxRNA_avg'][ir]+3*results['AxRNA_std'][ir] - results['AxRNA_min'][ir] = results['AxRNA_avg'][ir]-3*results['AxRNA_std'][ir] - - # tower base bending moment >>> should three-dimensionalize this <<< + XiHub[:,ir*6:(ir+1)*6,:] = self.Xi_fullDOF[:, rotor.nodeList[0].id*6:(rotor.nodeList[0].id+1)*6, :] # get the hub motion + + # nacelle acceleration in the global X direction + results['AxRNA_std'][ir] = getRMS(XiHub[:,ir*6,:]*self.w**2) + results['AxRNA_PSD'][:,ir] = getPSD(XiHub[:,ir*6,:]*self.w**2, self.dw) + results['AxRNA_avg'][ir] = abs(np.sin(rotor.nodeList[0].r[4])*self.g) # @Matt check this! + results['AxRNA_max'][ir] = results['AxRNA_avg'][ir]+3*results['AxRNA_std'][ir] + results['AxRNA_min'][ir] = results['AxRNA_avg'][ir]-3*results['AxRNA_std'][ir] + + # nacelle acceleration in the global Y direction + results['AyRNA_std'][ir] = getRMS(XiHub[:,ir*6+1,:]*self.w**2) + results['AyRNA_PSD'][:,ir] = getPSD(XiHub[:,ir*6+1,:]*self.w**2, self.dw) + results['AyRNA_avg'][ir] = abs(np.sin(rotor.nodeList[0].r[3])*self.g) + results['AyRNA_max'][ir] = results['AyRNA_avg'][ir]+3*results['AyRNA_std'][ir] + results['AyRNA_min'][ir] = results['AyRNA_avg'][ir]-3*results['AyRNA_std'][ir] + + # nacelle acceleration in the global Z direction + results['AzRNA_std'][ir] = getRMS(XiHub[:,ir*6+2,:]*self.w**2) + results['AzRNA_PSD'][:,ir] = getPSD(XiHub[:,ir*6+2,:]*self.w**2, self.dw) + results['AzRNA_avg'][ir] = abs(self.g) + results['AzRNA_max'][ir] = results['AzRNA_avg'][ir]+3*results['AzRNA_std'][ir] + results['AzRNA_min'][ir] = results['AzRNA_avg'][ir]-3*results['AzRNA_std'][ir] + + + # tower base bending moment + # TODO: should we compute the loads on all joints in solveStatics() and solveDynamics()? m_turbine = np.zeros(len(self.mtower)) zCG_turbine = np.zeros_like(m_turbine) zBase = np.zeros_like(m_turbine) @@ -1655,48 +2458,152 @@ def saveTurbineOutputs(self, results, case): M_X_aero = np.zeros_like(XiHub) dynamic_moment = np.zeros_like(XiHub) dynamic_moment_RMS = np.zeros(self.nrotors) - - + results['Mbase_avg'] = np.zeros(self.nrotors) results['Mbase_std'] = np.zeros(self.nrotors) results['Mbase_PSD'] = np.zeros([self.nw, self.nrotors]) results['Mbase_max'] = np.zeros(self.nrotors) results['Mbase_min'] = np.zeros(self.nrotors) - + + results['FbaseX_avg'] = np.zeros(self.nrotors) + results['FbaseX_std'] = np.zeros(self.nrotors) + results['FbaseX_PSD'] = np.zeros([self.nw, self.nrotors]) + results['FbaseX_max'] = np.zeros(self.nrotors) + results['FbaseX_min'] = np.zeros(self.nrotors) + + results['FbaseY_avg'] = np.zeros(self.nrotors) + results['FbaseY_std'] = np.zeros(self.nrotors) + results['FbaseY_PSD'] = np.zeros([self.nw, self.nrotors]) + results['FbaseY_max'] = np.zeros(self.nrotors) + results['FbaseY_min'] = np.zeros(self.nrotors) + + results['FbaseZ_avg'] = np.zeros(self.nrotors) + results['FbaseZ_std'] = np.zeros(self.nrotors) + results['FbaseZ_PSD'] = np.zeros([self.nw, self.nrotors]) + results['FbaseZ_max'] = np.zeros(self.nrotors) + results['FbaseZ_min'] = np.zeros(self.nrotors) + + results['MbaseX_avg'] = np.zeros(self.nrotors) + results['MbaseX_std'] = np.zeros(self.nrotors) + results['MbaseX_PSD'] = np.zeros([self.nw, self.nrotors]) + results['MbaseX_max'] = np.zeros(self.nrotors) + results['MbaseX_min'] = np.zeros(self.nrotors) + + results['MbaseY_avg'] = np.zeros(self.nrotors) + results['MbaseY_std'] = np.zeros(self.nrotors) + results['MbaseY_PSD'] = np.zeros([self.nw, self.nrotors]) + results['MbaseY_max'] = np.zeros(self.nrotors) + results['MbaseY_min'] = np.zeros(self.nrotors) + + results['MbaseZ_avg'] = np.zeros(self.nrotors) + results['MbaseZ_std'] = np.zeros(self.nrotors) + results['MbaseZ_PSD'] = np.zeros([self.nw, self.nrotors]) + results['MbaseZ_max'] = np.zeros(self.nrotors) + results['MbaseZ_min'] = np.zeros(self.nrotors) + for ir, rotor in enumerate(self.rotorList): - # mass and moment arm >>> should three-dimensionalize <<< - m_turbine[ir] = self.mtower[ir] + rotor.mRNA # total masses of each turbine - zCG_turbine[ir] = (self.rCG_tow[ir][2]*self.mtower[ir] # CoG of each turbine - + rotor.r_rel[2]*rotor.mRNA)/m_turbine[ir] - zBase[ir] = self.memberList[self.nplatmems + ir].rA[2] # tower base elevation [m] - hArm[ir] = zCG_turbine[ir] - zBase[ir] # vertical distance from tower base to turbine CG [m] - - aCG_turbine[:,ir,:] = -self.w**2 *( self.Xi[:,0,:] + zCG_turbine[ir]*self.Xi[:,4,:] ) # fore-aft acceleration of turbine CG - - # turbine pitch moment of inertia about CG [kg-m^2] - ICG_turbine[ir] = (translateMatrix6to6DOF(self.memberList[self.nplatmems+ir].M_struc, [0,0,-zCG_turbine[ir]])[4,4] # tower MOI about turbine CG - + rotor.mRNA*(rotor.r_rel[2]-zCG_turbine[ir])**2 + rotor.IrRNA) # RNA MOI with parallel axis theorem - # moment components and summation (all complex amplitudes) - M_I[:,ir,:] = -m_turbine[ir]*aCG_turbine[:,ir,:]*hArm[ir] - ICG_turbine[ir]*(-self.w**2 *self.Xi[:,4,:] ) # tower base inertial reaction moment - M_w[:,ir,:] = m_turbine[ir]*self.g * hArm[ir]*self.Xi[:,4] # tower base weight moment - - M_F_aero = 0.0 # <<< 0.0: ns= int(np.ceil( (lstrip) / dlsMax )) # number of strips to split this segment into dlstrip = lstrip/ns - m = 0.5*(dorsl[i] - dorsl[i-1])/lstrip # taper ratio - ls += [self.stations[i-1] + dlstrip*(0.5+j) for j in range(ns)] # add node locations - dls += [dlstrip]*ns - ds += [dorsl[i-1] + dlstrip*2*m*(0.5+j) for j in range(ns)] - drs += [dlstrip*m]*ns + m = 0.5*(dorsl[i] - dorsl[i-1])/lstrip # taper ratio + ls += [self.stations[i-1] + dlstrip*(0.5+j) for j in range(ns)] # add node locations + dls += [dlstrip]*ns + ds += [dorsl[i-1] + dlstrip*2*m*(0.5+j) for j in range(ns)] + drs += [dlstrip*m]*ns + m_int = 0.5*(dorsl_int[i] - dorsl_int[i-1])/lstrip # taper ratio for internal diameter + dis += [dorsl_int[i-1] + dlstrip*2*m_int*(0.5+j) for j in range(ns)] + dris += [dlstrip*m_int]*ns + + dorsl_node_ext += [dorsl[i-1] + dlstrip*2*m*(0.5+j) for j in range(ns)] # external diameter or side length pair at the nodes + dorsl_node_int += [dorsl_int[i-1] + dlstrip*2*m_int*(0.5+j) for j in range(ns)] # internal diameter or side length pair at the nodes elif lstrip == 0.0: # flat plate case (ends, and any flat transitions), a single strip for this section dlstrip = 0 @@ -204,6 +237,10 @@ def __init__(self, mi, nw, BEM=[], heading=0, part_of='platform'): dls += [dlstrip] ds += [0.5*(dorsl[i-1] + dorsl[i])] # set diameter as midpoint diameter drs += [0.5*(dorsl[i] - dorsl[i-1])] + dis += [0.5*(dorsl_int[i-1] + dorsl_int[i])] + dris += [0.5*(dorsl_int[i] - dorsl_int[i-1])] + dorsl_node_ext += [dorsl[i-1]] # external diameter or side length pair at the end nodes (used for structural calculations) + dorsl_node_int += [dorsl_int[i-1]] # internal diameter or side length pair at the end nodes (used for structural calculations) # finish things off with the strip for end B dlstrip = 0 @@ -211,19 +248,43 @@ def __init__(self, mi, nw, BEM=[], heading=0, part_of='platform'): dls += [0.0] ds += [0.5*dorsl[-1]] drs += [-0.5*dorsl[-1]] + dis += [0.5*dorsl_int[-1]] + dris += [-0.5*dorsl_int[-1]] + dorsl_node_ext += [dorsl[-1]] + dorsl_node_int += [dorsl_int[-1]] # >>> may want to have a way to not have an end strip for members that intersect things <<< - self.ns = len(ls) # number of hydrodynamic strip theory nodes per member + self.ns = len(ls) # number of nodes per member self.ls = np.array(ls, dtype=float) # node locations along member axis self.dls = np.array(dls) self.ds = np.array(ds) self.drs = np.array(drs) self.mh = np.array(m) + self.dis = np.array(dis) + self.dris= np.array(dris) + self.dorsl_node_ext = np.array(dorsl_node_ext) + self.dorsl_node_int = np.array(dorsl_node_int) - self.r = np.zeros([self.ns,3]) # undisplaced node positions along member [m] + self.r = np.zeros([self.ns,3]) # node positions along member [m] for i in range(self.ns): - self.r[i,:] = self.rA0 + (ls[i]/self.l)*rAB # locations of hydrodynamics nodes (will later be displaced) [m] + self.r[i,:] = self.rA0 + (ls[i]/self.l)*(self.rB0-self.rA0) # locations of hydrodynamics nodes [m] + + # Create a list of structural nodes + # For rigid members, only 1 node. For flexible members, a list of nodes coinciding with the hydrodynamic loads. + # TODO: In the future, we might want to have different discretizations for the hydro and structural calculations. + self.nodeList = [] + node_id = first_node_id # ID of the first node of this member + if self.type == 'rigid': + self.nodeList.append(Node(node_id, self.rA0, nw, member=self, end_node=True)) + elif self.type == 'beam': + for i in range(self.ns): + end_node = True if (i == 0 or i == self.ns-1) else False + self.nodeList.append(Node(node_id, self.r[i,:], nw, member=self, end_node=end_node)) + node_id += 1 + else: + raise Exception(f"Member type {self.type} not supported.") + self.nDOF = self.nodeList[0].nDOF * len(self.nodeList) # number of degrees of freedom of this member # ----- initialize arrays used later for hydro calculations ----- self.a_i = np.zeros([self.ns]) # signed axial area vector that dynamic pressure will act on [m2] @@ -248,16 +309,16 @@ def __init__(self, mi, nw, BEM=[], heading=0, part_of='platform'): self.Imat_MCF = np.zeros([self.ns,3,3, nw], dtype=complex) - def setPosition(self, r6=np.zeros(6)): - '''Calculates member pose -- node positions and vectors q, p1, and p2 + def setPosition(self): + '''Calculates member pose -- hydrodynamic node positions and vectors q, p1, and p2 as well as member orientation matrix R based on the end positions and - twist angle gamma along with any mean displacements and rotations. + twist angle gamma along with any mean displacements and rotations of the structural nodes. + + The position of structural nodes must be set at FOWT level before calling this function. - Parameters - ---------- - r6 : array, optional - Absolute position/orientation of FOWT to which member is attached. - + TODO: For now, we are assuming that the deformations of flexible members are small, + such that q, p1, p2 and etc are approximately the same across the whole member. + Need to change that later. ''' # formerly calcOrientation @@ -281,7 +342,12 @@ def setPosition(self, r6=np.zeros(6)): p1 = np.matmul( R, [1,0,0] ) # unit vector that is in the 'beta' plane if gamma is zero p2 = np.cross( q, p1 ) # unit vector orthogonal to both p1 and q - + + # update member-end position + # Use the position of the first node, which has to be set before calling this function + r6 = self.nodeList[0].r + self.rA = self.nodeList[0].r[0:3] # position of the first node (end A) [m] + # apply any platform offset and rotation to the values already obtained R_platform = rotationMatrix(*r6[3:]) # rotation matrix for the platform roll, pitch, yaw @@ -290,13 +356,14 @@ def setPosition(self, r6=np.zeros(6)): p1 = np.matmul(R_platform, p1) p2 = np.matmul(R_platform, p2) - self.rA = transformPosition(self.rA0, r6) - self.rB = transformPosition(self.rB0, r6) - - # update node positions - rAB = self.rB - self.rA - for i in range(self.ns): - self.r[i,:] = self.rA + (self.ls[i]/self.l)*rAB # locations of hydrodynamics nodes (will later be displaced) [m] + if self.type == 'rigid': + self.rB = self.rA + self.l*q + for i in range(self.ns): + self.r[i,:] = self.rA + (self.ls[i]/self.l) * (self.rB - self.rA) # locations of hydrodynamics nodes (will later be displaced) [m] + else: + self.rB = self.nodeList[-1].r[0:3] + for i in range(self.ns): + self.r[i,:] = self.nodeList[i].r[0:3] # save direction vectors and matrices self.R = R @@ -307,258 +374,292 @@ def setPosition(self, r6=np.zeros(6)): # matrices of vector multiplied by vector transposed, used in computing force components self.qMat = VecVecTrans(self.q) self.p1Mat = VecVecTrans(self.p1) - self.p2Mat = VecVecTrans(self.p2) + self.p2Mat = VecVecTrans(self.p2) + + + def getInertia(self, rRP=None): + '''Returns member inertia properties: mass, center of mass, moments of inertia. + Properties are calculated relative to the RP in the global orientation directions. + Also updates the member's inertia matrix, self.M_struc, which is a (self.nDOF, self.nDOF), + matrix with respect to RP - def getInertia(self, rPRP=np.zeros(3)): - '''Calculates member inertia properties: mass, center of mass, moments of inertia. - Properties are calculated relative to the platform reference point (PRP) in the - global orientation directions. + TODO: There is a lot of code repetition in this method. After things are working and we have + tests with multibody and flexible members, reformulate this method. Maybe split into smaller functions. Parameters ---------- - rPRP : float array - Coordinates of the platform reference point (the first three entries of fowt.Xi0), - which the moment of inertia matrix will be calculated relative to. [m] + rRP : float array, optional + Coordinates of the reference point which the moment of inertia matrix will be calculated relative to. [m] + If not provided, we use the first node of the member ''' + if rRP is None: + rRP = self.nodeList[0].r[:3] - # Moment of Inertia Helper Functions (to move to helper file) <<< - - def FrustumMOI(dA, dB, H, p): - '''returns the radial and axial moments of inertia of a potentially tapered circular member about the end node. - Previously used equations found in a HydroDyn paper, now it uses newly derived ones. Ask Stein for reference if needed''' - if H==0: # if there's no height, mainly refering to no ballast, there shouldn't be any extra MoI - I_rad = 0 # radial MoI about end node [kg-m^2] - I_ax = 0 # axial MoI about axial axis [kg-m^2] - else: - if dA==dB: # if it's a cylinder - r1 = dA/2 # bottom radius [m] - r2 = dB/2 # top radius [m] - I_rad = (1/12)*(p*H*np.pi*r1**2)*(3*r1**2 + 4*H**2) # radial MoI about end node [kg-m^2] - I_ax = (1/2)*p*np.pi*H*r1**4 # axial MoI about axial axis [kg-m^2] - else: # if it's a tapered cylinder (frustum) - r1 = dA/2 # bottom radius [m] - r2 = dB/2 # top radius [m] - I_rad = (1/20)*p*np.pi*H*(r2**5 - r1**5)/(r2 - r1) + (1/30)*p*np.pi*H**3*(r1**2 + 3*r1*r2 + 6*r2**2) # radial MoI about end node [kg-m^2] - I_ax = (1/10)*p*np.pi*H*(r2**5-r1**5)/(r2-r1) # axial MoI about axial axis [kg-m^2] - - return I_rad, I_ax - - def RectangularFrustumMOI(La, Wa, Lb, Wb, H, p): - '''returns the moments of inertia about the end node of a cuboid that can be tapered. - - Inputs the lengths and widths at the top and bottom of the cuboid, as well as the height and material density. - - L is the side length along the local x-direction, W is the side length along the local y-direction. - - Does not work for members that are not symmetrical about the axial axis. - - Works for cases when it is a perfect cuboid, a truncated pyramid, and a truncated triangular prism - - Equations derived by hand, ask Stein for reference if needed''' - - if H==0: # if there's no height, mainly refering to no ballast, there shouldn't be any extra MoI - Ixx = 0 # MoI around the local x-axis about the end node [kg-m^2] - Iyy = 0 # MoI around the local y-axis about the end node [kg-m^2] - Izz = 0 # MoI around the local z-axis about the axial axis [kg-m^2] - else: - if La==Lb and Wa==Wb: # if it's a cuboid - L = La # length of the cuboid (La=Lb) [m] - W = Wa # width of the cuboid (Wa=Wb) [m] - M = p*L*W*H # mass of the cuboid [kg] + if self.type not in ['rigid', 'beam']: + raise NotImplementedError(f"Member type {self.type} not supported") - Ixx = (1/12)*M*(W**2 + 4*H**2) # MoI around the local x-axis about the end node [kg-m^2] - Iyy = (1/12)*M*(L**2 + 4*H**2) # MoI around the local y-axis about the end node [kg-m^2] - Izz = (1/12)*M*(L**2 + W**2) # MoI around the local z-axis about the axial axis [kg-m^2] - elif La!=Lb and Wa!=Wb: # if it's a truncated pyramid for both side lengths - - x2 = (1/12)*p* ( (Lb-La)**3*H*(Wb/5 + Wa/20) + (Lb-La)**2*La*H*(3*Wb/4 + Wa/4) + \ - (Lb-La)*La**2*H*(Wb + Wa/2) + La**3*H*(Wb/2 + Wa/2) ) + # ------- member inertial calculations --------- + mass_center = 0 # total sum of mass the center of mass of the member [kg-m] + mshell = 0 # total mass of the shell material only of the member [kg] + self.vfill = [] # list of ballast volumes in each submember [m^3] - stored in the object for later access + mfill = [] # list of ballast masses in each submember [kg] + pfill = [] # list of ballast densities in each submember [kg] + self.M_struc = np.zeros([self.nDOF,self.nDOF]) # member mass/inertia matrix [kg, kg-m, kg-m^2] + + # ------- Inertia due to shell and ballast --------- + if self.type == 'rigid': + for i in range(1,len(self.stations)): # start at 1 rather than 0 because we're looking at the sections (from station i-1 to i) - y2 = (1/12)*p* ( (Wb-Wa)**3*H*(Lb/5 + La/20) + (Wb-Wa)**2*Wa*H*(3*Lb/4 + La/4) + \ - (Wb-Wa)*Wa**2*H*(Lb + La/2) + Wa**3*H*(Lb/2 + La/2) ) + # initialize common variables + l = self.stations[i]-self.stations[i-1] # length of the submember [m] + mass = 0 + center = np.zeros(3) + m_shell = 0 + v_fill = 0 + m_fill = 0 + rho_fill = 0 + if l > 0: + # if the following variables are input as scalars, keep them that way, if they're vectors, take the [i-1]th value + rho_shell = self.rho_shell # density of the shell material [kg/m^3] + if np.isscalar(self.l_fill): # set up l_fill and rho_fill based on whether it's scalar or not + l_fill = self.l_fill + else: + l_fill = self.l_fill[i-1] - z2 = p*( Wb*Lb/5 + Wa*Lb/20 + La*Wb/20 + Wa*La*(1/30) ) * H**3 + if np.isscalar(self.rho_fill): + rho_fill = self.rho_fill + else: + rho_fill = self.rho_fill[i-1] + + if self.shape=='circular': + # MASS AND CENTER OF GRAVITY + dA = self.d[i-1] # outer diameter of the lower node [m] + dB = self.d[i] # outer diameter of the upper node [m] + dAi = self.d[i-1] - 2*self.t[i-1] # inner diameter of the lower node [m] + dBi = self.d[i] - 2*self.t[i] # inner diameter of the upper node [m] + + V_outer, hco = FrustumVCV(dA, dB, l) # volume and center of volume of solid frustum with outer diameters [m^3] [m] + V_inner, hci = FrustumVCV(dAi, dBi, l) # volume and center of volume of solid frustum with inner diameters [m^3] [m] + v_shell = V_outer-V_inner # volume of hollow frustum with shell thickness [m^3] + m_shell = v_shell*rho_shell # mass of hollow frustum [kg] + + hc_shell = ((hco*V_outer)-(hci*V_inner))/(V_outer-V_inner) if V_outer-V_inner!=0 else 0.0 # center of volume of hollow frustum with shell thickness [m] - Ixx = y2+z2 # MoI around the local x-axis about the end node [kg-m^2] - Iyy = x2+z2 # MoI around the local y-axis about the end node [kg-m^2] - Izz = x2+y2 # MoI around the local z-axis about the axial axis [kg-m^2] + dBi_fill = (dBi-dAi)*(l_fill/l) + dAi # interpolated inner diameter of frustum that ballast is filled to [m] + v_fill, hc_fill = FrustumVCV(dAi, dBi_fill, l_fill) # volume and center of volume of solid inner frustum that ballast occupies [m^3] [m] + m_fill = v_fill*rho_fill # mass of the ballast in the submember [kg] - elif La==Lb and Wa!=Wb: # if it's a truncated triangular prism where only the lengths are the same on top and bottom - L = La # length of the truncated triangular prism [m] + # <<< The ballast is calculated as if it starts at the same end as the shell, however, if the end of the sub-member has an end cap, + # then the ballast sits on top of the end cap. Depending on the thickness of the end cap, this can affect m_fill, hc_fill, and MoI_fill >>>>> - x2 = (1/24)*p*(L**3)*H*(Wb+Wa) - y2 = (1/48)*p*L*H*( Wb**3 + Wa*Wb**2 + Wa**2*Wb + Wa**3 ) - z2 = (1/12)*p*L*(H**3)*( 3*Wb + Wa ) + mass = m_shell + m_fill # total mass of the submember [kg] + hc = ((hc_fill*m_fill) + (hc_shell*m_shell))/mass if mass!=0 else 0.0 # total center of mass of the submember from the submember's rA location [m] - Ixx = y2+z2 # MoI around the local x-axis about the end node [kg-m^2] - Iyy = x2+z2 # MoI around the local y-axis about the end node [kg-m^2] - Izz = x2+y2 # MoI around the local z-axis about the axial axis [kg-m^2] + # MOMENT OF INERTIA + I_rad_end_outer, I_ax_outer = FrustumMOI(dA, dB, l, rho_shell) # radial and axial MoI about the end of the solid outer frustum [kg-m^2] + I_rad_end_inner, I_ax_inner = FrustumMOI(dAi, dBi, l, rho_shell) # radial and axial MoI about the end of the imaginary solid inner frustum [kg-m^2] + I_rad_end_shell = I_rad_end_outer-I_rad_end_inner # radial MoI about the end of the frustum shell through superposition [kg-m^2] + I_ax_shell = I_ax_outer - I_ax_inner # axial MoI of the shell through superposition [kg-m^2] + + I_rad_end_fill, I_ax_fill = FrustumMOI(dAi, dBi_fill, l_fill, rho_fill) # radial and axial MoI about the end of the solid inner ballast frustum [kg-m^2] + + I_rad_end = I_rad_end_shell + I_rad_end_fill # radial MoI about the end of the submember [kg-m^2] + I_rad = I_rad_end - mass*hc**2 # radial MoI about the CoG of the submember through the parallel axis theorem [kg-m^2] + + I_ax = I_ax_shell + I_ax_fill # axial MoI of the submember about the total CoG (= about the end also bc axial) - elif La!=Lb and Wa==Wb: # if it's a truncated triangular prism where only the widths are the same on top and bottom - W = Wa # width of the truncated triangular prism [m] + Ixx = I_rad # circular, so the radial MoI is about the x and y axes + Iyy = I_rad # circular, so the radial MoI is about the x and y axes + Izz = I_ax # circular, so the axial MoI is about the z axis + + elif self.shape=='rectangular': + # MASS AND CENTER OF GRAVITY + slA = self.sl[i-1] # outer side lengths of the lower node, of length 2 [m] + slB = self.sl[i] # outer side lengths of the upper node, of length 2 [m] + slAi = self.sl[i-1] - 2*self.t[i-1] # inner side lengths of the lower node, of length 2 [m] + slBi = self.sl[i] - 2*self.t[i] # inner side lengths of the upper node, of length 2 [m] + + V_outer, hco = FrustumVCV(slA, slB, l) # volume and center of volume of solid frustum with outer side lengths [m^3] [m] + V_inner, hci = FrustumVCV(slAi, slBi, l) # volume and center of volume of solid frustum with inner side lengths [m^3] [m] + v_shell = V_outer-V_inner # volume of hollow frustum with shell thickness [m^3] + m_shell = v_shell*rho_shell # mass of hollow frustum [kg] + + hc_shell = ((hco*V_outer)-(hci*V_inner))/(V_outer-V_inner) if V_outer-V_inner!=0 else 0.0 # center of volume of the hollow frustum with shell thickness [m] - x2 = (1/48)*p*W*H*( Lb**3 + La*Lb**2 + La**2*Lb + La**3 ) - y2 = (1/24)*p*(W**3)*H*(Lb+La) - z2 = (1/12)*p*W*(H**3)*( 3*Lb + La ) + slBi_fill = (slBi-slAi)*(l_fill/l) + slAi # interpolated side lengths of frustum that ballast is filled to [m] + v_fill, hc_fill = FrustumVCV(slAi, slBi_fill, l_fill) # volume and center of volume of inner frustum that ballast occupies [m^3] + m_fill = v_fill*rho_fill # mass of ballast in the submember [kg] + + mass = m_shell + m_fill # total mass of the submember [kg] + hc = ((hc_fill*m_fill) + (hc_shell*m_shell))/mass if mass !=0 else 0.0 # total center of mass of the submember from the submember's rA location [m] + + # MOMENT OF INERTIA + # MoI about each axis at the bottom end node of the solid outer truncated pyramid [kg-m^2] + Ixx_end_outer, Iyy_end_outer, Izz_end_outer = RectangularFrustumMOI(slA[0], slA[1], slB[0], slB[1], l, rho_shell) + # MoI about each axis at the bottom end node of the solid imaginary inner truncated pyramid [kg-m^2] + Ixx_end_inner, Iyy_end_inner, Izz_end_inner = RectangularFrustumMOI(slAi[0], slAi[1], slBi[0], slBi[1], l, rho_shell) + # MoI about each axis at the bottom end node of the shell using superposition [kg-m^2] + Ixx_end_shell = Ixx_end_outer - Ixx_end_inner + Iyy_end_shell = Iyy_end_outer - Iyy_end_inner + Izz_end_shell = Izz_end_outer - Izz_end_inner + + # MoI about each axis at the bottom end node of the solid inner ballast truncated pyramid [kg-m^2] + Ixx_end_fill, Iyy_end_fill, Izz_end_fill = RectangularFrustumMOI(slAi[0], slAi[1], slBi_fill[0], slBi_fill[1], l_fill, rho_fill) + + # total MoI of each axis at the center of gravity of the member using the parallel axis theorem [kg-m^2] + Ixx_end = Ixx_end_shell + Ixx_end_fill + Ixx = Ixx_end - mass*hc**2 + Iyy_end = Iyy_end_shell + Iyy_end_fill + Iyy = Iyy_end - mass*hc**2 + + Izz_end = Izz_end_shell + Izz_end_fill + Izz = Izz_end # the total MoI of the member about the z-axis is the same at any point along the z-axis - Ixx = y2+z2 # MoI around the local x-axis about the end node [kg-m^2] - Iyy = x2+z2 # MoI around the local y-axis about the end node [kg-m^2] - Izz = x2+y2 # MoI around the local z-axis about the axial axis [kg-m^2] + # center of mass of the submember (note: some of above could streamlined out of the if/else) + center = self.rA + self.q*(self.stations[i-1] + hc) # center of mass of the submember in global coordinates [m] + + # add/append terms + mass_center += mass*center # total sum of mass the center of mass of the member [kg-m] + mshell += m_shell # total mass of the shell material only of the member [kg] + self.vfill.append(v_fill) # list of ballast volumes in each submember [m^3] + mfill.append(m_fill) # list of ballast masses in each submember [kg] + pfill.append(rho_fill) # list of ballast densities in each submember [kg/m^3] + + # create a local submember mass matrix + Mmat = np.diag([mass, mass, mass, 0, 0, 0]) # submember's mass matrix without MoI tensor + # create the local submember MoI tensor in the correct directions + I = np.diag([Ixx, Iyy, Izz]) # MoI matrix about the member's local CG. 0's on off diagonals because of symmetry + T = self.R.T # transformation matrix to unrotate the member's local axes. Transposed because rotating axes. + I_rot = np.matmul(T.T, np.matmul(I,T)) # MoI about the member's local CG with axes in same direction as global axes. [I'] = [T][I][T]^T -> [T]^T[I'][T] = [I] + + Mmat[3:,3:] = I_rot # mass and inertia matrix about the submember's CG in unrotated, but translated local frame + + # translate this submember's local inertia matrix to the RP and add it to the total member's M_struc matrix + self.M_struc += translateMatrix6to6DOF(Mmat, center - rRP) # mass matrix of the member about the RP + + elif self.type == 'beam': + # The inertia of the shell is given by a finite-element beam mass matrix + self.M_struc = self.computeInertiaMatrix_FE() # compute the inertia matrix for a flexible member using the finite element method + mass, center = getMassAndCenterOfBeam(self.M_struc, np.hstack([node.r for node in self.nodeList])) # Last entry includes rotations to keep the right size of the vector, but rotations will be multiplied by 0 in getMassAndCenterOfBeam - else: - raise ValueError('You either have inconsistent inputs, or you are trying to calculate the MoI of a member that is not supported') + mshell += mass + mass_center += mass*center + + # For flexible elements, we lump the ballast inertia as a 6x6 inertia matrix for each node + # We lump the contribution of half the length to the next node, and half the length to the previous node + nodes_s = np.array([np.linalg.norm(n.r - self.nodeList[0].r) for n in self.nodeList]) # Distance of each node to the start of the member. Used to find the nodes that are part of each station/submember - return Ixx, Iyy, Izz + # Saving quantities that we will use in member.getWeight() later + self.mass_ballast_node = np.zeros(len(self.nodeList)) # ballast mass at each node + self.center_ballast_node = np.zeros((len(self.nodeList), 3)) # center of mass of the ballast that is lumped at each node + + # Get distance to previous and next nodes + dist_p = np.diff(nodes_s, prepend=0) # distance to previous node + dist_n = np.diff(nodes_s, append=nodes_s[-1]) # distance to next node + for i in range(1,len(self.stations)): + l = self.stations[i]-self.stations[i-1] # length of the submember [m] + + mass = 0 + v_fill = 0 + rho_fill = 0 + if l > 0: + if np.isscalar(self.l_fill): # set up l_fill and rho_fill based on whether it's scalar or not + l_fill = self.l_fill + else: + l_fill = self.l_fill[i-1] - # ------- member inertial calculations --------- - - mass_center = 0 # total sum of mass the center of mass of the member [kg-m] - mshell = 0 # total mass of the shell material only of the member [kg] - self.vfill = [] # list of ballast volumes in each submember [m^3] - stored in the object for later access - mfill = [] # list of ballast masses in each submember [kg] - pfill = [] # list of ballast densities in each submember [kg] - self.M_struc = np.zeros([6,6]) # member mass/inertia matrix [kg, kg-m, kg-m^2] - - # loop through each sub-member - for i in range(1,len(self.stations)): # start at 1 rather than 0 because we're looking at the sections (from station i-1 to i) - - # initialize common variables - l = self.stations[i]-self.stations[i-1] # length of the submember [m] - if l==0.0: - mass = 0 - center = np.zeros(3) - m_shell = 0 - v_fill = 0 - m_fill = 0 - rho_fill = 0 - else: - # if the following variables are input as scalars, keep them that way, if they're vectors, take the [i-1]th value - rho_shell = self.rho_shell # density of the shell material [kg/m^3] - if np.isscalar(self.l_fill): # set up l_fill and rho_fill based on whether it's scalar or not - l_fill = self.l_fill - else: - l_fill = self.l_fill[i-1] - if np.isscalar(self.rho_fill): - rho_fill = self.rho_fill - else: - rho_fill = self.rho_fill[i-1] - - - if self.shape=='circular': - # MASS AND CENTER OF GRAVITY - dA = self.d[i-1] # outer diameter of the lower node [m] - dB = self.d[i] # outer diameter of the upper node [m] - dAi = self.d[i-1] - 2*self.t[i-1] # inner diameter of the lower node [m] - dBi = self.d[i] - 2*self.t[i] # inner diameter of the upper node [m] - - V_outer, hco = FrustumVCV(dA, dB, l) # volume and center of volume of solid frustum with outer diameters [m^3] [m] - V_inner, hci = FrustumVCV(dAi, dBi, l) # volume and center of volume of solid frustum with inner diameters [m^3] [m] - v_shell = V_outer-V_inner # volume of hollow frustum with shell thickness [m^3] - m_shell = v_shell*rho_shell # mass of hollow frustum [kg] - - hc_shell = ((hco*V_outer)-(hci*V_inner))/(V_outer-V_inner) if V_outer-V_inner!=0 else 0.0 # center of volume of hollow frustum with shell thickness [m] - - dBi_fill = (dBi-dAi)*(l_fill/l) + dAi # interpolated inner diameter of frustum that ballast is filled to [m] - v_fill, hc_fill = FrustumVCV(dAi, dBi_fill, l_fill) # volume and center of volume of solid inner frustum that ballast occupies [m^3] [m] - m_fill = v_fill*rho_fill # mass of the ballast in the submember [kg] - - # <<< The ballast is calculated as if it starts at the same end as the shell, however, if the end of the sub-member has an end cap, - # then the ballast sits on top of the end cap. Depending on the thickness of the end cap, this can affect m_fill, hc_fill, and MoI_fill >>>>> - - mass = m_shell + m_fill # total mass of the submember [kg] - hc = ((hc_fill*m_fill) + (hc_shell*m_shell))/mass if mass!=0 else 0.0 # total center of mass of the submember from the submember's rA location [m] - - - # MOMENT OF INERTIA - I_rad_end_outer, I_ax_outer = FrustumMOI(dA, dB, l, rho_shell) # radial and axial MoI about the end of the solid outer frustum [kg-m^2] - I_rad_end_inner, I_ax_inner = FrustumMOI(dAi, dBi, l, rho_shell) # radial and axial MoI about the end of the imaginary solid inner frustum [kg-m^2] - I_rad_end_shell = I_rad_end_outer-I_rad_end_inner # radial MoI about the end of the frustum shell through superposition [kg-m^2] - I_ax_shell = I_ax_outer - I_ax_inner # axial MoI of the shell through superposition [kg-m^2] - - I_rad_end_fill, I_ax_fill = FrustumMOI(dAi, dBi_fill, l_fill, rho_fill) # radial and axial MoI about the end of the solid inner ballast frustum [kg-m^2] - - I_rad_end = I_rad_end_shell + I_rad_end_fill # radial MoI about the end of the submember [kg-m^2] - I_rad = I_rad_end - mass*hc**2 # radial MoI about the CoG of the submember through the parallel axis theorem [kg-m^2] - - I_ax = I_ax_shell + I_ax_fill # axial MoI of the submember about the total CoG (= about the end also bc axial) - - Ixx = I_rad # circular, so the radial MoI is about the x and y axes - Iyy = I_rad # circular, so the radial MoI is about the x and y axes - Izz = I_ax # circular, so the axial MoI is about the z axis + if np.isscalar(self.rho_fill): + rho_fill = self.rho_fill + else: + rho_fill = self.rho_fill[i-1] + # Only loop nodes whose range (node position +- half distances) is within the ballast length + idx_nodes_ballasted = [inode for inode in range(len(self.nodeList)) if (nodes_s[inode]+dist_n[inode]/2 >= self.stations[i-1]) or (nodes_s[inode]-dist_p[inode]/2 <= self.stations[i-1]+l_fill)] + for inode in idx_nodes_ballasted: + s_lower = nodes_s[inode] - dist_p[inode]/2 # curvilinear coordinate of the lower end of the ballast portion assigned to this node + s_lower = s_lower if s_lower > self.stations[i-1] else self.stations[i-1] + + s_upper = nodes_s[inode] + dist_n[inode]/2 + s_upper = s_upper if s_upper < (self.stations[i-1]+l_fill) else (self.stations[i-1]+l_fill) # use the ballasted length if it's shorter than the half-distance to the next node + l_fill_node = s_upper-s_lower # length of the ballast portion assigned to this node [m] + + if l_fill_node <= 0: # if the ballast portion assigned to this node is zero, skip it + continue + + if self.shape=='circular': + dA_station = self.d[i-1] - 2*self.t[i-1] # inner diameter of the lower station end [m] + dB_station = self.d[i] - 2*self.t[i] # inner diameter of the upper station end [m] + + # Interpolated diameters of the ends of the ballast portion that will be assigned to this node + dA_node = (dB_station-dA_station)*((s_lower-self.stations[i-1])/l) + dA_station + dB_node = (dB_station-dA_station)*((s_upper-self.stations[i-1])/l) + dA_station + + # MASS AND CENTER OF GRAVITY + v_fill_node, hc_node = FrustumVCV(dA_node, dB_node, l_fill_node) + mass_node = v_fill_node*rho_fill + + # MOMENT OF INERTIA + I_rad_end, I_ax = FrustumMOI(dA_node, dB_node, l_fill_node, rho_fill) + I_rad = I_rad_end - mass_node*hc_node**2 + + Ixx = I_rad # circular, so the radial MoI is about the x and y axes + Iyy = I_rad # circular, so the radial MoI is about the x and y axes + Izz = I_ax # circular, so the axial MoI is about the z + + elif self.shape=='rectangular': + slA_station = self.sl[i-1] - 2*self.t[i-1] + slB_station = self.sl[i] - 2*self.t[i] + + # Interpolated side lengths of the ends of the ballast portion that will be assigned to this node + slA_node = (slB_station-slA_station)*((s_lower-self.stations[i-1])/l) + slA_station + slB_node = (slB_station-slA_station)*((s_upper-self.stations[i-1])/l) + slA_station + + # MASS AND CENTER OF GRAVITY + v_fill_node, hc_node = FrustumVCV(slA_node, slB_node, l_fill_node) + mass_node = v_fill_node*rho_fill + + # MOMENT OF INERTIA + Ixx_end, Iyy_end, Izz_end = RectangularFrustumMOI(slA_node[0], slA_node[1], slB_node[0], slB_node[1], l_fill_node, rho_fill) + Ixx = Ixx_end - mass_node*hc_node**2 + Iyy = Iyy_end - mass_node*hc_node**2 + Izz = Izz_end # the total MoI of the member about the z + + Mmat = np.diag([mass_node, mass_node, mass_node, 0, 0, 0]) # submember's mass matrix without MoI tensor + I = np.diag([Ixx, Iyy, Izz]) + T = self.R.T + I_rot = np.matmul(T.T, np.matmul(I,T)) + Mmat[3:,3:] = I_rot + + center = self.rA + self.q*(s_lower + hc_node) # center of mass of this ballast portion + self.M_struc[inode*6:(inode+1)*6, inode*6:(inode+1)*6] += translateMatrix6to6DOF(Mmat, center-self.nodeList[inode].r[:3]) - elif self.shape=='rectangular': - # MASS AND CENTER OF GRAVITY - slA = self.sl[i-1] # outer side lengths of the lower node, of length 2 [m] - slB = self.sl[i] # outer side lengths of the upper node, of length 2 [m] - slAi = self.sl[i-1] - 2*self.t[i-1] # inner side lengths of the lower node, of length 2 [m] - slBi = self.sl[i] - 2*self.t[i] # inner side lengths of the upper node, of length 2 [m] - - V_outer, hco = FrustumVCV(slA, slB, l) # volume and center of volume of solid frustum with outer side lengths [m^3] [m] - V_inner, hci = FrustumVCV(slAi, slBi, l) # volume and center of volume of solid frustum with inner side lengths [m^3] [m] - v_shell = V_outer-V_inner # volume of hollow frustum with shell thickness [m^3] - m_shell = v_shell*rho_shell # mass of hollow frustum [kg] - - hc_shell = ((hco*V_outer)-(hci*V_inner))/(V_outer-V_inner) if V_outer-V_inner!=0 else 0.0 # center of volume of the hollow frustum with shell thickness [m] - - slBi_fill = (slBi-slAi)*(l_fill/l) + slAi # interpolated side lengths of frustum that ballast is filled to [m] - v_fill, hc_fill = FrustumVCV(slAi, slBi_fill, l_fill) # volume and center of volume of inner frustum that ballast occupies [m^3] - m_fill = v_fill*rho_fill # mass of ballast in the submember [kg] - - mass = m_shell + m_fill # total mass of the submember [kg] - hc = ((hc_fill*m_fill) + (hc_shell*m_shell))/mass if mass !=0 else 0.0 # total center of mass of the submember from the submember's rA location [m] - - - # MOMENT OF INERTIA - # MoI about each axis at the bottom end node of the solid outer truncated pyramid [kg-m^2] - Ixx_end_outer, Iyy_end_outer, Izz_end_outer = RectangularFrustumMOI(slA[0], slA[1], slB[0], slB[1], l, rho_shell) - # MoI about each axis at the bottom end node of the solid imaginary inner truncated pyramid [kg-m^2] - Ixx_end_inner, Iyy_end_inner, Izz_end_inner = RectangularFrustumMOI(slAi[0], slAi[1], slBi[0], slBi[1], l, rho_shell) - # MoI about each axis at the bottom end node of the shell using superposition [kg-m^2] - Ixx_end_shell = Ixx_end_outer - Ixx_end_inner - Iyy_end_shell = Iyy_end_outer - Iyy_end_inner - Izz_end_shell = Izz_end_outer - Izz_end_inner - - # MoI about each axis at the bottom end node of the solid inner ballast truncated pyramid [kg-m^2] - Ixx_end_fill, Iyy_end_fill, Izz_end_fill = RectangularFrustumMOI(slAi[0], slAi[1], slBi_fill[0], slBi_fill[1], l_fill, rho_fill) - - # total MoI of each axis at the center of gravity of the member using the parallel axis theorem [kg-m^2] - Ixx_end = Ixx_end_shell + Ixx_end_fill - Ixx = Ixx_end - mass*hc**2 - Iyy_end = Iyy_end_shell + Iyy_end_fill - Iyy = Iyy_end - mass*hc**2 - - Izz_end = Izz_end_shell + Izz_end_fill - Izz = Izz_end # the total MoI of the member about the z-axis is the same at any point along the z-axis - - # center of mass of the submember from the PRP in global orientation (note: some of above could streamlined out of the if/else) - center = self.rA + self.q*(self.stations[i-1] + hc) - rPRP # center of mass of the submember relative to the PRP [m] - - # add/append terms - mass_center += mass*center # total sum of mass the center of mass of the member [kg-m] - mshell += m_shell # total mass of the shell material only of the member [kg] - self.vfill.append(v_fill) # list of ballast volumes in each submember [m^3] - mfill.append(m_fill) # list of ballast masses in each submember [kg] - pfill.append(rho_fill) # list of ballast densities in each submember [kg] - - # create a local submember mass matrix - Mmat = np.diag([mass, mass, mass, 0, 0, 0]) # submember's mass matrix without MoI tensor - # create the local submember MoI tensor in the correct directions - I = np.diag([Ixx, Iyy, Izz]) # MoI matrix about the member's local CG. 0's on off diagonals because of symmetry - T = self.R.T # transformation matrix to unrotate the member's local axes. Transposed because rotating axes. - I_rot = np.matmul(T.T, np.matmul(I,T)) # MoI about the member's local CG with axes in same direction as global axes. [I'] = [T][I][T]^T -> [T]^T[I'][T] = [I] + # Add to station totals + mass += mass_node + v_fill += v_fill_node - Mmat[3:,3:] = I_rot # mass and inertia matrix about the submember's CG in unrotated, but translated local frame + # Add to the node variables that will be used in getWeight() + self.mass_ballast_node[inode] += mass_node + self.center_ballast_node[inode, :] += center*mass_node # center of mass of - # translate this submember's local inertia matrix to the PRP and add it to the total member's M_struc matrix - self.M_struc += translateMatrix6to6DOF(Mmat, center) # mass matrix of the member about the PRP + # add/append terms. No need to do mass_center because it was already done + self.vfill.append(v_fill) # list of ballast volumes in each submember [m^3] + mfill.append(mass) # list of ballast masses in each submember [kg] + pfill.append(rho_fill) # list of ballast densities in each submember [kg/m^3] + # self.center_ballast_node is currently storing center*mass_node. Need to divide by mass_node + for inode in range(len(self.nodeList)): + if self.mass_ballast_node[inode] > 0: + self.center_ballast_node[inode, :] /= self.mass_ballast_node[inode] - # end of submember for loop - - # END CAPS/BULKHEADS - # --------- Add the inertia properties of any end caps --------- + # ------- Inertia due to end caps/bulkeads --------- self.m_cap_list = [] + self.m_cap = np.zeros(len(self.nodeList)) # cap mass at each node - saving to use in getWeight later + self.center_cap = np.zeros((len(self.nodeList), 3)) # center of mass of the cap that is lumped at each node # Loop through each cap or bulkhead for i in range(len(self.cap_stations)): @@ -620,8 +721,6 @@ def RectangularFrustumMOI(La, Wa, Lb, Wb, H, p): Iyy = I_rad Izz = I_ax - - elif self.shape=='rectangular': sl_hole = self.cap_d_in[i,:] sl = self.sl - 2*self.t @@ -678,8 +777,8 @@ def RectangularFrustumMOI(La, Wa, Lb, Wb, H, p): Izz = Izz_end - # get centerpoint of cap relative to PRP - pos_cap = self.rA + self.q*L - rPRP # position of the referenced cap station from the PRP + # get centerpoint of cap relative to RP + pos_cap = self.rA + self.q*L # position of the referenced cap station in global coordinates if L==self.stations[0]: # if it's a bottom end cap, the position is at the bottom of the end cap center_cap = pos_cap + self.q*hc_cap # and the CG of the cap is at hc from the bottom, so this is the simple case elif L==self.stations[-1]: # if it's a top end cap, the position is at the top of the end cap @@ -703,37 +802,66 @@ def RectangularFrustumMOI(La, Wa, Lb, Wb, H, p): Mmat[3:,3:] = I_rot # mass and inertia matrix about the submember's CG in unrotated, but translated local frame - # translate this submember's local inertia matrix to the PRP and add it to the total member's M_struc matrix - self.M_struc += translateMatrix6to6DOF(Mmat, center_cap) # mass matrix of the member about the PRP + # translate this submember's local inertia matrix to the RP and add it to the total member's M_struc matrix + if self.type == 'rigid': + self.M_struc += translateMatrix6to6DOF(Mmat, center_cap - rRP) + elif self.type == 'beam': + # Find the node that is the closest to the cap + closest_node = min(self.nodeList, key=lambda n: np.linalg.norm(n.r[:3] - center_cap)) + listIDs = [node.id for node in self.nodeList] + inode = listIDs.index(closest_node.id) # Need the index of the node in member.nodeList + self.M_struc[inode*6:(inode+1)*6, inode*6:(inode+1)*6] += translateMatrix6to6DOF(Mmat, center_cap-closest_node.r[:3]) # mass matrix of the member about the RP + self.m_cap[inode] += m_cap + self.center_cap[inode, :] += center_cap*m_cap # center of mass of the cap that is lumped at this node self.mshell = mshell self.mfill = mfill - mass = self.M_struc[0,0] # total mass of the entire member [kg] - center = mass_center/mass if mass!=0 else np.zeros(3) # total center of mass of the entire member from the PRP [m] - - return mass, center, mshell, mfill, pfill + # self.center_cap is currently storing center*mass_node. Need to divide by mass_node + for inode in range(len(self.nodeList)): + if self.m_cap[inode] > 0: + self.center_cap[inode, :] /= self.m_cap[inode] + if self.type == 'rigid': + mass = self.M_struc[0,0] # total mass of the entire member [kg] + center = mass_center/mass if mass!=0 else np.zeros(3) # total center of mass of the entire member from the RP [m] + elif self.type == 'beam': + mass, center = getMassAndCenterOfBeam(self.M_struc, np.hstack([node.r for node in self.nodeList])) # get the mass and center of mass of the beam + + self.mass = mass + self.rCoG = center # coordinates of COG in global coordinates [m] + center = center - rRP # Return center wrt the reference point + return mass, center, mshell, mfill, pfill - def getHydrostatics(self, rPRP=np.zeros(3), rho=1025, g=9.81): + def getHydrostatics(self, rRP=None, rho=1025, g=9.81): '''Calculates member hydrostatic properties, namely buoyancy and stiffness matrix. - Properties are calculated relative to the platform reference point (PRP) in the - global orientation directions. + Properties are calculated relative to the reference point in the global orientation directions. + Also updates the member's inertia matrix, self.K_hydro, which is a (self.nDOF, self.nDOF) + matrix with respect to the members' nodes. This can be different than rRP. + + TODO: For now, Fvec is simply the buoyancy force, i.e. a force acting on the vertical direction. + Split this into force along the member and at ends. For example, horizontal pontoons should + have axial components at each end that cancel out but which are important for internal loads. + + TODO: Just like self.getInertia(), this method has a lot of repetition. Try to reformulate it later. + Parameters ---------- - rPRP : float array - Coordinates of the platform reference point (the first three entries of fowt.Xi0), - which the moment of inertia matrix will be calculated relative to. [m] + rRP : float array, optional + Coordinates of the reference point which the moment of inertia matrix will be calculated relative to. [m] + If not provided, we use the first node of the member ''' + if rRP is None: + rRP = self.nodeList[0].r[:3] pi = np.pi # initialize some values that will be returned - Fvec = np.zeros(6) # this will get added to by each segment of the member - Cmat = np.zeros([6,6]) # this will get added to by each segment of the member + Fvec = np.zeros(self.nDOF) # this will get added to by each segment of the member + Cmat = np.zeros([self.nDOF,self.nDOF]) # this will get added to by each segment of the member V_UW = 0 # this will get added to by each segment of the member r_centerV = np.zeros(3) # center of buoyancy times volumen total - will get added to by each segment # these will only get changed once, if there is a portion crossing the water plane @@ -742,155 +870,404 @@ def getHydrostatics(self, rPRP=np.zeros(3), rho=1025, g=9.81): xWP = 0 yWP = 0 + # angles + beta = np.arctan2(self.q[1],self.q[0]) # member incline heading from x axis + phi = np.arctan2(np.sqrt(self.q[0]**2 + self.q[1]**2), self.q[2]) # member incline angle from vertical + + # precalculate trig functions + cosPhi=np.cos(phi) + sinPhi=np.sin(phi) + tanPhi=np.tan(phi) + cosBeta=np.cos(beta) + sinBeta=np.sin(beta) + tanBeta=sinBeta/cosBeta # loop through each member segment, and treat each segment like how we used to treat each member n = len(self.stations) + if self.type == 'rigid': + for i in range(1,n): # starting at 1 rather than 0 because we're looking at the sections (from station i-1 to i) + + # end locations of this segment + rA = self.rA + self.q*self.stations[i-1] + rB = self.rA + self.q*self.stations[i ] + + # partially submerged case + if rA[2]*rB[2] <= 0: # if member crosses (or touches) water plane + + # -------------------- buoyancy and waterplane area properties ------------------------ + + xWP = intrp(0, rA[2], rB[2], rA[0], rB[0]) # x coordinate where member axis cross the waterplane [m] + yWP = intrp(0, rA[2], rB[2], rA[1], rB[1]) # y coordinate where member axis cross the waterplane [m] + if self.shape=='circular': + dWP = intrp(0, rA[2], rB[2], self.d[i], self.d[i-1]) # diameter of member where its axis crosses the waterplane [m] + AWP = (np.pi/4)*dWP**2 # waterplane area of member [m^2] + IWP = (np.pi/64)*dWP**4 # waterplane moment of inertia [m^4] approximates as a circle + IxWP = IWP # MoI of circular waterplane is the same all around + IyWP = IWP # MoI of circular waterplane is the same all around + elif self.shape=='rectangular': + slWP = intrp(0, rA[2], rB[2], self.sl[i], self.sl[i-1]) # side lengths of member where its axis crosses the waterplane [m] + AWP = slWP[0]*slWP[1] # waterplane area of rectangular member [m^2] + IxWP = (1/12)*slWP[0]*slWP[1]**3 # waterplane MoI [m^4] about the member's LOCAL x-axis, not the global x-axis + IyWP = (1/12)*slWP[0]**3*slWP[1] # waterplane MoI [m^4] about the member's LOCAL y-axis, not the global y-axis + I = np.diag([IxWP, IyWP, 0]) # area moment of inertia tensor + T = self.R.T # the transformation matrix to unrotate the member's local axes + I_rot = np.matmul(T.T, np.matmul(I,T)) # area moment of inertia tensor where MoI axes are now in the same direction as RP + IxWP = I_rot[0,0] + IyWP = I_rot[1,1] + + LWP = abs(rA[2]/cosPhi) # get length of segment along member axis that is underwater [m] + + # Assumption: the areas and MoI of the waterplane are as if the member were completely vertical, i.e. it doesn't account for phi + # This can be fixed later on if needed. We're using this assumption since the fix wouldn't significantly affect the outputs + + # Total enclosed underwater volume [m^3] and distance along axis from end A to center of buoyancy of member [m] + if self.shape=='circular': + V_UWi, hc = FrustumVCV(self.d[i-1], dWP, LWP) + elif self.shape=='rectangular': + V_UWi, hc = FrustumVCV(self.sl[i-1], slWP, LWP) + + r_center = rA + self.q*hc # coordinates of center of volume of this segment in the global frame [m] + + + # >>>> question: should this function be able to use displaced/rotated values? <<<< + + # ------------- get hydrostatic derivatives ---------------- + + # derivatives from global to local + dPhi_dThx = -sinBeta # \frac{d\phi}{d\theta_x} = \sin\beta + dPhi_dThy = cosBeta + dFz_dz = -rho*g*AWP /cosPhi + + # note: below calculations are based on untapered case, but + # temporarily approximated for taper by using dWP (diameter at water plane crossing) <<< this is rough + + # buoyancy force and moment about end A + Fz = rho*g* V_UWi + M = 0 + if self.shape=='circular': # Need to find the equivalent of this for the rectangular case + M = -rho*g*pi*( dWP**2/32*(2.0 + tanPhi**2) + 0.5*(rA[2]/cosPhi)**2)*sinPhi # moment about axis of incline + Mx = M*dPhi_dThx + My = M*dPhi_dThy + + Fvec += translateForce3to6DOF(np.array([0, 0, rho*g*V_UWi]), rA-rRP) + Fvec[3] += Mx # moment about x axis [N-m] + Fvec[4] += My # moment about y axis [N-m] + + # normal approach to hydrostatic stiffness, using this temporarily until above fancier approach is verified + xWP -= rRP[0] # x coordinate of waterplane relative to RP [m] + yWP -= rRP[1] + Cmat[2,2] += -dFz_dz + Cmat[2,3] += rho*g*( -AWP*yWP ) + Cmat[2,4] += rho*g*( AWP*xWP ) + Cmat[3,2] += rho*g*( -AWP*yWP ) + Cmat[3,3] += rho*g*(IxWP + AWP*yWP**2 ) + Cmat[3,4] += rho*g*( AWP*xWP*yWP) + Cmat[4,2] += rho*g*( AWP*xWP ) + Cmat[4,3] += rho*g*( AWP*xWP*yWP) + Cmat[4,4] += rho*g*(IyWP + AWP*xWP**2 ) + + r_rel = r_center - rRP # center of volume relative to RP [m] + Cmat[3,3] += rho*g*V_UWi * r_rel[2] + Cmat[4,4] += rho*g*V_UWi * r_rel[2] + Cmat[3,5] += -rho*g*V_UWi * r_rel[0] + Cmat[4,5] += -rho*g*V_UWi * r_rel[1] + + V_UW += V_UWi + r_centerV += r_center*V_UWi + + + # fully submerged case + elif rA[2] <= 0 and rB[2] <= 0: + + # displaced volume [m^3] and distance along axis from end A to center of buoyancy of member [m] + if self.shape=='circular': + V_UWi, hc = FrustumVCV(self.d[i-1], self.d[i], self.stations[i]-self.stations[i-1]) + elif self.shape=='rectangular': + V_UWi, hc = FrustumVCV(self.sl[i-1], self.sl[i], self.stations[i]-self.stations[i-1]) + + r_center = rA + self.q*hc # center of volume of this segment relative to RP [m] + r_rel = r_center - rRP + + # buoyancy force (and moment) vector + Fvec += translateForce3to6DOF(np.array([0, 0, rho*g*V_UWi]), r_rel) + + # hydrostatic stiffness matrix + Cmat[3,3] += rho*g*V_UWi * r_rel[2] + Cmat[4,4] += rho*g*V_UWi * r_rel[2] + Cmat[3,5] += -rho*g*V_UWi * r_rel[0] + Cmat[4,5] += -rho*g*V_UWi * r_rel[1] + + V_UW += V_UWi + r_centerV += r_center*V_UWi + + # For flexible members, for each node we lump the contribution of half the length to the next node, + # and half the length to the previous node (same idea as for self.getInertia). + # It is the same as treating each of these lengths as individual submembers. This is not strictly correct, + # as those submembers wouldn't be closed, and we might improve this in the future. + # See Lee et al, 2024, 'On the correction of hydrostatic stiffness for discrete-module-based hydroelasticity analysis of vertically arrayed modules' doi.org/10.1016/j.engstruct.2024.118710 + elif self.type == 'beam': + Nnodes = len(self.nodeList) + nodes_z = np.array([n.r[2] for n in self.nodeList]) # easier to loop z coordinates with this + nodes_r = np.array([n.r[:3] for n in self.nodeList]) + nodes_s = np.array([np.linalg.norm(r - self.nodeList[0].r[:3]) for r in nodes_r]) # distance along member axis from first node to each node [m] + + # Get distance to previous and next nodes + dist_p = np.diff(nodes_s, prepend=0) # distance to previous node + dist_n = np.diff(nodes_s, append=nodes_s[-1]) # distance to next node + + # Find which node is going to receive the hydrostatic terms due to crossing the water line + waterline_node = None + for i in range(Nnodes-1): + if nodes_z[i] * nodes_z[i+1] < 0: + waterline_node = i if abs(nodes_z[i]) < abs(nodes_z[i+1]) else i+1 # Use the node that is closest to z=0 + break + + for i in range(1,len(self.stations)): + l = self.stations[i]-self.stations[i-1] # length of the submember [m] + if l <= 0: + continue + + for inode, node in enumerate(self.nodeList): + sA = nodes_s[inode] - dist_p[inode]/2 + sA = max(sA, self.stations[i-1]) - for i in range(1,n): # starting at 1 rather than 0 because we're looking at the sections (from station i-1 to i) - - # calculate end locations for this segment relative to the point on - # the waterplane directly above the PRP in unrotated directions (rHS_ref) - rHS_ref = np.array([rPRP[0], rPRP[1], 0]) - rA = self.rA + self.q*self.stations[i-1] - rHS_ref - rB = self.rA + self.q*self.stations[i ] - rHS_ref - - # partially submerged case - if rA[2]*rB[2] <= 0: # if member crosses (or touches) water plane - - # angles - beta = np.arctan2(self.q[1],self.q[0]) # member incline heading from x axis - phi = np.arctan2(np.sqrt(self.q[0]**2 + self.q[1]**2), self.q[2]) # member incline angle from vertical - - # precalculate trig functions - cosPhi=np.cos(phi) - sinPhi=np.sin(phi) - tanPhi=np.tan(phi) - cosBeta=np.cos(beta) - sinBeta=np.sin(beta) - tanBeta=sinBeta/cosBeta - - # -------------------- buoyancy and waterplane area properties ------------------------ - - xWP = intrp(0, rA[2], rB[2], rA[0], rB[0]) # x coordinate where member axis cross the waterplane [m] - yWP = intrp(0, rA[2], rB[2], rA[1], rB[1]) # y coordinate where member axis cross the waterplane [m] - if self.shape=='circular': - dWP = intrp(0, rA[2], rB[2], self.d[i], self.d[i-1]) # diameter of member where its axis crosses the waterplane [m] - AWP = (np.pi/4)*dWP**2 # waterplane area of member [m^2] - IWP = (np.pi/64)*dWP**4 # waterplane moment of inertia [m^4] approximates as a circle - IxWP = IWP # MoI of circular waterplane is the same all around - IyWP = IWP # MoI of circular waterplane is the same all around - elif self.shape=='rectangular': - slWP = intrp(0, rA[2], rB[2], self.sl[i], self.sl[i-1]) # side lengths of member where its axis crosses the waterplane [m] - AWP = slWP[0]*slWP[1] # waterplane area of rectangular member [m^2] - IxWP = (1/12)*slWP[0]*slWP[1]**3 # waterplane MoI [m^4] about the member's LOCAL x-axis, not the global x-axis - IyWP = (1/12)*slWP[0]**3*slWP[1] # waterplane MoI [m^4] about the member's LOCAL y-axis, not the global y-axis - I = np.diag([IxWP, IyWP, 0]) # area moment of inertia tensor - T = self.R.T # the transformation matrix to unrotate the member's local axes - I_rot = np.matmul(T.T, np.matmul(I,T)) # area moment of inertia tensor where MoI axes are now in the same direction as PRP - IxWP = I_rot[0,0] - IyWP = I_rot[1,1] - - LWP = abs(rA[2]/cosPhi) # get length of segment along member axis that is underwater [m] - - # Assumption: the areas and MoI of the waterplane are as if the member were completely vertical, i.e. it doesn't account for phi - # This can be fixed later on if needed. We're using this assumption since the fix wouldn't significantly affect the outputs - - # Total enclosed underwater volume [m^3] and distance along axis from end A to center of buoyancy of member [m] - if self.shape=='circular': - V_UWi, hc = FrustumVCV(self.d[i-1], dWP, LWP) - elif self.shape=='rectangular': - V_UWi, hc = FrustumVCV(self.sl[i-1], slWP, LWP) - - r_center = rA + self.q*hc # absolute coordinates of center of volume of this segment [m] - - - # >>>> question: should this function be able to use displaced/rotated values? <<<< - - # ------------- get hydrostatic derivatives ---------------- - - # derivatives from global to local - dPhi_dThx = -sinBeta # \frac{d\phi}{d\theta_x} = \sin\beta - dPhi_dThy = cosBeta - dFz_dz = -rho*g*AWP /cosPhi - - # note: below calculations are based on untapered case, but - # temporarily approximated for taper by using dWP (diameter at water plane crossing) <<< this is rough - - # buoyancy force and moment about end A - Fz = rho*g* V_UWi - M = 0 - if self.shape=='circular': # Need to find the equivalent of this for the rectangular case - M = -rho*g*pi*( dWP**2/32*(2.0 + tanPhi**2) + 0.5*(rA[2]/cosPhi)**2)*sinPhi # moment about axis of incline - Mx = M*dPhi_dThx - My = M*dPhi_dThy - - Fvec[2] += Fz # vertical buoyancy force [N] - Fvec[3] += Mx + Fz*rA[1] # moment about x axis [N-m] - Fvec[4] += My - Fz*rA[0] # moment about y axis [N-m] - + sB = nodes_s[inode] + dist_n[inode]/2 + sB = min(sB, self.stations[i]) - # normal approach to hydrostatic stiffness, using this temporarily until above fancier approach is verified - Cmat[2,2] += -dFz_dz - Cmat[2,3] += rho*g*( -AWP*yWP ) - Cmat[2,4] += rho*g*( AWP*xWP ) - Cmat[3,2] += rho*g*( -AWP*yWP ) - Cmat[3,3] += rho*g*(IxWP + AWP*yWP**2 ) - Cmat[3,4] += rho*g*( AWP*xWP*yWP) - Cmat[4,2] += rho*g*( AWP*xWP ) - Cmat[4,3] += rho*g*( AWP*xWP*yWP) - Cmat[4,4] += rho*g*(IyWP + AWP*xWP**2 ) + l_node = sB - sA + if l_node <= 0: + # This makes us skip nodes whose submember is outside the station, + # as these submembers would have would have l_node < 0 + continue + + if inode == 0: + rA = nodes_r[0] + else: + rA = nodes_r[inode-1] + (nodes_r[inode] - nodes_r[inode-1]) * ((sA - nodes_s[inode-1]) / (nodes_s[inode] - nodes_s[inode-1])) - Cmat[3,3] += rho*g*V_UWi * r_center[2] - Cmat[4,4] += rho*g*V_UWi * r_center[2] + if inode == len(self.nodeList)-1: + rB = nodes_r[-1] + else: + rB = nodes_r[inode] + (nodes_r[inode+1] - nodes_r[inode]) * ((sB - nodes_s[inode]) / (nodes_s[inode+1] - nodes_s[inode])) - V_UW += V_UWi - r_centerV += r_center*V_UWi + # Check if submember is fully submerged + if rA[2] < 0 and rB[2] < 0: + if self.shape == 'circular': + dA_station = self.d[i-1] # outer diameter of the lower station end [m] + dB_station = self.d[i] # outer diameter of the upper station end [m] + + # Interpolated diameters of the ends of the ballast portion that will be assigned to this node + dA = (dB_station-dA_station)*((sA-self.stations[i-1])/l) + dA_station + dB = (dB_station-dA_station)*((sB-self.stations[i-1])/l) + dA_station + V_sub, hc = FrustumVCV(dA, dB, l_node) + else: + slA_station = self.sl[i-1] + slB_station = self.sl[i] + slA = (slB_station-slA_station)*((sA-self.stations[i-1])/l) + slA_station + slB = (slB_station-slA_station)*((sB-self.stations[i-1])/l) + slA_station + V_sub, hc = FrustumVCV(slA, slB, l_node) + r_center = rA + (rB - rA) * (hc / l_node) + r_rel = r_center - node.r[:3] + Fvec[inode*node.nDOF:(inode+1)*node.nDOF] += translateForce3to6DOF(np.array([0, 0, rho*g*V_sub]), r_rel) + + # Own stiffness matrix + Cmat[inode*node.nDOF+3, inode*node.nDOF+3] += rho*g*V_sub * r_rel[2] + Cmat[inode*node.nDOF+4, inode*node.nDOF+4] += rho*g*V_sub * r_rel[2] + Cmat[inode*node.nDOF+3, inode*node.nDOF+5] += -rho*g*V_sub * r_rel[0] + Cmat[inode*node.nDOF+4, inode*node.nDOF+5] += -rho*g*V_sub * r_rel[1] + V_UW += V_sub + r_centerV += r_center * V_sub + + # Check if submember crosses the waterline + elif rA[2] * rB[2] < 0: + # split submember into submerged and unsubmerged portions + frac = abs(rA[2] / (rA[2] - rB[2])) # z = rA[2] + frac * (rB[2] - rA[2]), thus z=0 -> frac = rA[2] / (rA[2] - rB[2]) + rWP = rA + frac * (rB - rA) + sWP = sA + frac * (sB - sA) + wet_length = np.linalg.norm(rWP - rA) + if self.shape == 'circular': + dA_station = self.d[i-1] + dB_station = self.d[i] + dA = (dB_station-dA_station)*((sA-self.stations[i-1])/l) + dA_station + dWP = (dB_station-dA_station)*((sWP-self.stations[i-1])/l) + dA_station + V_sub, hc = FrustumVCV(dA, dWP, wet_length) + else: + slA_station = self.sl[i-1] + slB_station = self.sl[i] + slA = (slB_station-slA_station)*((sA-self.stations[i-1])/l) + slA_station + slWP = (slB_station-slA_station)*((sWP-self.stations[i-1])/l) + slA_station + V_sub, hc = FrustumVCV(slA, slWP, wet_length) + + r_center = rA + (rWP - rA) * (hc / wet_length) + r_rel = r_center - node.r[:3] + Fvec[inode*node.nDOF:(inode+1)*node.nDOF] += translateForce3to6DOF(np.array([0, 0, rho*g*V_sub]), r_rel) + + # Own stiffness matrix + Cmat[inode*node.nDOF+3, inode*node.nDOF+3] += rho*g*V_sub * r_rel[2] + Cmat[inode*node.nDOF+4, inode*node.nDOF+4] += rho*g*V_sub * r_rel[2] + Cmat[inode*node.nDOF+3, inode*node.nDOF+5] += -rho*g*V_sub * r_rel[0] + Cmat[inode*node.nDOF+4, inode*node.nDOF+5] += -rho*g*V_sub * r_rel[1] + V_UW += V_sub + r_centerV += r_center * V_sub + + # Lump waterplane stiffness at this node + if inode == waterline_node: + M = 0 + if self.shape == 'circular': + AWP = (np.pi/4)*dWP**2 + IWP = (np.pi/64)*dWP**4 + IxWP = IWP + IyWP = IWP + M = -rho*g*pi*( dWP**2/32*(2.0 + tanPhi**2) + 0.5*(rA[2]/cosPhi)**2)*sinPhi # moment about axis of incline + else: + AWP = slWP[0]*slWP[1] + IxWP = (1/12)*slWP[0]*slWP[1]**3 + IyWP = (1/12)*slWP[0]**3*slWP[1] + I = np.diag([IxWP, IyWP, 0]) + T = self.R.T + I_rot = np.matmul(T.T, np.matmul(I,T)) + IxWP = I_rot[0,0] + IyWP = I_rot[1,1] + + Mx = -sinBeta * M + My = M*cosBeta + Fvec[inode*node.nDOF+3] += Mx # moment about x axis [N-m] + Fvec[inode*node.nDOF+4] += My # moment about y axis [N-m] + + xWP, yWP = rWP[0] - rRP[0], rWP[1] - rRP[1] + Cmat[inode*node.nDOF+2, inode*node.nDOF+2] += rho*g*AWP/cosPhi + Cmat[inode*node.nDOF+2, inode*node.nDOF+3] += rho*g*( -AWP*yWP ) + Cmat[inode*node.nDOF+2, inode*node.nDOF+4] += rho*g*( AWP*xWP ) + Cmat[inode*node.nDOF+3, inode*node.nDOF+2] += rho*g*( -AWP*yWP ) + Cmat[inode*node.nDOF+3, inode*node.nDOF+3] += rho*g*(IxWP + AWP*yWP**2 ) + Cmat[inode*node.nDOF+3, inode*node.nDOF+4] += rho*g*( AWP*xWP*yWP) + Cmat[inode*node.nDOF+4, inode*node.nDOF+2] += rho*g*( AWP*xWP ) + Cmat[inode*node.nDOF+4, inode*node.nDOF+3] += rho*g*( AWP*xWP*yWP) + Cmat[inode*node.nDOF+4, inode*node.nDOF+4] += rho*g*(IyWP + AWP*xWP**2 ) + + if V_UW > 0: + self.rCB = r_center # store center of buoyancy in global coordinates + r_center = r_centerV/V_UW - rRP # calculate overall member center of buoyancy wrp to RP + else: + self.rCB = np.zeros(3) + r_center = np.zeros(3) # temporary fix for out-of-water members + self.V = V_UW # store submerged volume + return Fvec, Cmat, V_UW, r_center, AWP, IWP, xWP, yWP - # fully submerged case - elif rA[2] <= 0 and rB[2] <= 0: + def getWeight(self, rRP=None, g=9.81, include_geom_stiffness=False): + '''Returns member weight relative to the reference point in the global orientation directions. - # displaced volume [m^3] and distance along axis from end A to center of buoyancy of member [m] - if self.shape=='circular': - V_UWi, hc = FrustumVCV(self.d[i-1], self.d[i], self.stations[i]-self.stations[i-1]) - elif self.shape=='rectangular': - V_UWi, hc = FrustumVCV(self.sl[i-1], self.sl[i], self.stations[i]-self.stations[i-1]) + Also updates the member's stiffness matrix, self.C_struc, which is a (self.nDOF, self.nDOF), + matrix with respect to rRP. This terms is usually included in the hydrostatic stiffness matrix in naval architecture + + Parameters + ---------- + rRP : float array, optional + Coordinates of the reference point which the moment of inertia matrix will be calculated relative to. [m] + If not provided, we use the first node of the member + include_geom_stiffness : bool, optional + Whether to include geometric stiffness in the calculation of the stiffness matrix of flexible members. + Does not affect rigid members. + Default is False because this component is included separately in fowt.calcStatics() to account for + other weights that might be applied to the flexible member (e.g. RNA atop of the tower) + ''' + if rRP is None: + rRP = self.nodeList[0].r[:3] + self.C_struc = np.zeros([self.nDOF,self.nDOF]) # initialize the stiffness matrix - r_center = rA + self.q*hc # center of volume of this segment relative to PRP [m] + if self.type == 'rigid': + # store the (6,6) matrix given wrt the member's node. + W, self.C_struc = getWeightOfPointMass(self.mass, self.rCoG-rRP, g=g) + + else: + W = np.zeros(self.nDOF) + + mass_node = np.zeros(len(self.nodeList)) # mass corresponding to each node - for the 'hydrostatic' stiffness term associated to weight + center_mass_node = np.zeros((len(self.nodeList), 3)) # center of mass corresponding to each node - for the 'hydrostatic' stiffness term associated to weight + m_center_sum = np.zeros((len(self.nodeList), 3)) # Auxiliar variable that stores the product of mass and center of mass for each node + + # Looping elements to get the mass of the shell + for i in range(len(self.nodeList)-1): + L = np.linalg.norm(self.nodeList[i+1].r[0:3] - self.nodeList[i].r[0:3]) + if L == 0: + raise Exception("Element length cannot be zero.") + if self.shape == 'circular': + Do = 0.5 * (self.dorsl_node_ext[i] + self.dorsl_node_ext[i+1]) # Outer diameter of the element + Di = 0.5 * (self.dorsl_node_int[i] + self.dorsl_node_int[i+1]) # Inner diameter + A = np.pi * (Do**2 - Di**2) / 4 # Cross-sectional area + elif self.shape == 'rectangular': + Lo = 0.5 * (self.dorsl_node_ext[i] + self.dorsl_node_ext[i+1]) # Outer sides of the element + Li = 0.5 * (self.dorsl_node_int[i] + self.dorsl_node_int[i+1]) # Inner sides + A = (Lo[0]*Lo[1] - Li[0]*Li[1]) # Cross-sectional area + + # Rotation matrix to transform from local to global coordinates + Dc = np.column_stack((self.p1, self.p2, self.q)) + + W[i*6:(i+1)*6] += self.rho_shell * A * g * np.array([0, 0, -L/2, -L**2/12*Dc[1,2], L**2/12*Dc[0,2], 0]) # Weight vector in global coordinates + W[(i+1)*6:(i+2)*6] += self.rho_shell * A * g * np.array([0, 0, -L/2, L**2/12*Dc[1,2], -L**2/12*Dc[0,2], 0]) + + # Get mass and CG corresponding to each node + mass_node[i] += self.rho_shell * A * L/2 # half the mass of the element + mass_node[i+1] += self.rho_shell * A * L/2 # half the mass of the element + m_center_sum[i, :] += self.rho_shell * A * L/2 * (self.nodeList[i].r[:3] + L/4 * self.q) + m_center_sum[i+1, :] += self.rho_shell * A * L/2 * (self.nodeList[i+1].r[:3] - L/4 * self.q) + - # buoyancy force (and moment) vector - Fvec += translateForce3to6DOF(np.array([0, 0, rho*g*V_UWi]), r_center) + # Ballast and cap/bulkhead contribution - Lumping at each node (see self.getInertia()) + for i in range(len(self.nodeList)): # Looping nodes + f = self.mass_ballast_node[i] * g * np.array([0, 0, -1, 0, 0, 0]) + W[i*6:(i+1)*6] += transformForce(f, offset=self.center_ballast_node[i]-self.nodeList[i].r[:3]) # Weight vector in global coordinates - # hydrostatic stiffness matrix (about end A) - Cmat[3,3] += rho*g*V_UWi * r_center[2] - Cmat[4,4] += rho*g*V_UWi * r_center[2] + f = self.m_cap[i] * g * np.array([0, 0, -1, 0, 0, 0]) + W[i*6:(i+1)*6] += transformForce(f, offset=self.center_cap[i]-self.nodeList[i].r[:3]) - V_UW += V_UWi - r_centerV += r_center*V_UWi + # Add ballast and cap mass to the node's mass + mass_node[i] += self.m_cap[i] + self.mass_ballast_node[i] + m_center_sum[i, :] += self.mass_ballast_node[i]*self.center_ballast_node[i] + self.m_cap[i] * self.center_cap[i] - else: # if the members are fully above the surface + # Calculate the center of mass for each node + center_mass_node[i, :] = m_center_sum[i, :] / mass_node[i] if mass_node[i] > 0 else np.zeros(3) - pass + # Hydrostatic stiffness matrix due to member weight + for i in range(len(self.nodeList)): + # Own stiffness, i.e. hydrostatic stiffness of the node around itself as if it were a separate body + W_own, C_own = getWeightOfPointMass(mass_node[i], center_mass_node[i,:]-self.nodeList[i].r[:3], g=g) - if V_UW > 0: - r_center = r_centerV/V_UW # calculate overall member center of buoyancy - else: - r_center = np.zeros(3) # temporary fix for out-of-water members - - self.V = V_UW # store submerged volume + # Geommetric stiffness, i.e. the component that is due to the internal force acting at each extremity of the node's zone of influence + # Since weight is always along the global z-axis, we only need to consider the z component of the part of the internal force that is due to weight only + C_geom = np.zeros((6, 6)) # Initialize geometric stiffness matrix + if include_geom_stiffness: + W_after = np.sum(W[2 + (i+1)*6 : : 6]) # Weight due to all nodes after node i + W_before = -W_after - W_own[2] + + # Get boundaries of the node's zone of influence. Relative position wrt the node + r_before, r_after = np.zeros(3), np.zeros(3) # Initialize to zero vectors + if i != 0: + r_before = (self.nodeList[i].r[:3] + self.nodeList[i-1].r[:3])/2 - self.nodeList[i].r[:3] + if i != len(self.nodeList)-1: + r_after = (self.nodeList[i].r[:3] + self.nodeList[i+1].r[:3])/2 - self.nodeList[i].r[:3] + + C_geom = np.zeros((6, 6)) + C_geom[3,3] = W_after * r_after[2] + W_before * r_before[2] # roll + C_geom[4,4] = W_after * r_after[2] + W_before * r_before[2] # pitch + C_geom[3,5] = -W_after * r_after[0] - W_before * r_before[0] # roll moment due to yaw motion + C_geom[4,5] = -W_after * r_after[1] - W_before * r_before[1] # pitch moment due to yaw motion + + self.C_struc[i*6:(i+1)*6, i*6:(i+1)*6] = C_own + C_geom + + return W - return Fvec, Cmat, V_UW, r_center, AWP, IWP, xWP, yWP - - - def calcHydroConstants(self, r_ref=np.zeros(3), sum_inertia=False, rho=1025, g=9.81, k_array=None): + def calcHydroConstants(self, r_ref=None, sum_inertia=False, rho=1025, g=9.81, k_array=None): '''Compute the Member's linear strip-theory-hydrodynamics terms, related to drag and added mass, which are also a precursor to excitation. All computed quantities are in global orientations. Parameters ---------- - r_ref : size-3 vector + r_ref : size-3 vector, optional Reference point coordinates to compute matrices about [m]. + Only used for rigid members. For flexible members, each node is its own reference point. sum_inertia : boolean, optional Flag to calculate and return an overall inertial excitation matrix (default False). @@ -900,10 +1277,13 @@ def calcHydroConstants(self, r_ref=np.zeros(3), sum_inertia=False, rho=1025, g=9 A_hydro, I_hydro : 6x6 matrices Hydrodynamic added mass and inertial excitation matrices. ''' + + if r_ref is None: + r_ref = self.nodeList[0].r[:3] - # hydrodynamic added mass and excitation matrices from strip theory [kg, kg-m, kg-m^2] - A_hydro = np.zeros([6,6]) - I_hydro = np.zeros([6,6]) + # hydrodynamic added mass and excitation matrices from strip theory [kg, kg-m, kg-m^2] + A_hydro = np.zeros([self.nDOF, self.nDOF]) + I_hydro = np.zeros([self.nDOF, self.nDOF]) circ = self.shape=='circular' # boolean for circular vs. rectangular @@ -913,6 +1293,17 @@ def calcHydroConstants(self, r_ref=np.zeros(3), sum_inertia=False, rho=1025, g=9 # loop through each node of the member for il in range(self.ns): + # Get ranges of the matrix corresponding to this node + if self.type == 'rigid': + iFirst = 0 + iLast = 6 + else: # flexible + iFirst = il*6 + iLast = iFirst+6 + + # This r_ref is useless now, as self.r[il,:] = self.nodeList[il].r[:3], but doing it this way + # because in the future we want to have different discretizations for structural and hydrodynamic + r_ref = self.nodeList[il].r[:3] # only process hydrodynamics if this node is submerged if self.r[il,2] < 0: @@ -964,13 +1355,12 @@ def calcHydroConstants(self, r_ref=np.zeros(3), sum_inertia=False, rho=1025, g=9 # ----- sum up side and end added mass and inertial excitation coefficient matrices ------ self.Amat[il,:,:] = Amat_sides + Amat_end self.a_i[il] = a_i # signed axial reference area for use in dynamic pressure force - - + # add to global added mass and inertial excitation matrices # which consider the mean offsets and are relative to the ref in global orientation - A_hydro += translateMatrix3to6DOF(self.Amat[il,:,:], self.r[il,:] - r_ref[:3]) + A_hydro[iFirst:iLast, iFirst:iLast] += translateMatrix3to6DOF(self.Amat[il,:,:], self.r[il,:] - r_ref[:3]) if sum_inertia: - I_hydro += translateMatrix3to6DOF(self.Imat[il,:,:], self.r[il,:] - r_ref[:3]) + I_hydro[iFirst:iLast, iFirst:iLast] += translateMatrix3to6DOF(self.Imat[il,:,:], self.r[il,:] - r_ref[:3]) if sum_inertia: return A_hydro, I_hydro @@ -1400,7 +1790,7 @@ def omega(k1R, k2R, n): return F - def calcCurrentLoads(self, depth, speed=0, heading=0, Zref=0, shearExp_water=0.12, rho=1025, g=9.81, r_ref=np.zeros(3)): + def calcCurrentLoads(self, depth, speed=0, heading=0, Zref=0, shearExp_water=0.12, rho=1025, g=9.81, r_ref=None): '''method to calculate the "static" current loads on each member and save as a current force Uses a simple power law relationship to calculate the current velocity as a function of member node depth @@ -1420,19 +1810,34 @@ def calcCurrentLoads(self, depth, speed=0, heading=0, Zref=0, shearExp_water=0.1 Water density [kg/m^3] g: float Gravitational acceleration [m/s^2] - r_ref: size-3 vector - Reference point coordinates to compute current loads [m]. + r_ref : size-3 vector, optional + Reference point coordinates to compute matrices about [m]. + Only used for rigid members. For flexible members, each node is its own reference point. Returns: - D_hydro: 6x1 array - Mean current force and moment on the member in global coordinates wrp to r_ref [N, N-m] + D_hydro: (self.nDOF, 1) array + Mean current force and moment acting on each node of the member wrt r_ref [N, N-m] ''' - D_hydro = np.zeros(6) + if r_ref is None: + r_ref = self.nodeList[0].r[:3] + + D_hydro = np.zeros(self.nDOF) circ = self.shape=='circular' # convenience boolian for circular vs. rectangular cross sections # loop through each node of the member for il in range(self.ns): + # Get ranges of the matrix corresponding to this node + if self.type == 'rigid': + iFirst = 0 + iLast = 6 + else: # flexible + iFirst = il*6 + iLast = iFirst+6 + + # This r_ref is useless now, as self.r[il,:] = self.nodeList[il].r[:3], but doing it this way + # because in the future we want to have different discretizations for structural and hydrodynamic + r_ref = self.nodeList[il].r[:3] # only process hydrodynamics if this node is submerged if self.r[il,2] < 0: @@ -1488,7 +1893,7 @@ def calcCurrentLoads(self, depth, speed=0, heading=0, Zref=0, shearExp_water=0.1 # ----- sum forces and add to total mean drag load about PRP ------ D = Dq + Dp1 + Dp2 + Dq_End # sum drag forces at node in member's local orientation frame - D_hydro += translateForce3to6DOF(D, self.r[il,:] - r_ref) # sum as forces and moments about PRP + D_hydro[iFirst:iLast] += translateForce3to6DOF(D, self.r[il,:] - r_ref) # sum as forces and moments about PRP return D_hydro def computeWaveKinematics(self, zeta, beta, w, depth, k=None, rho=1025, g=9.81): @@ -1532,7 +1937,7 @@ def computeWaveKinematics(self, zeta, beta, w, depth, k=None, rho=1025, g=9.81): self.u[ih,il,:,:], self.ud[ih,il,:,:], self.pDyn[ih,il,:] = getWaveKin(zeta[ih,:], beta[ih], w, k, depth, self.r[il,:], nw, rho=rho, g=g) - def calcHydroExcitation(self, zeta, beta, w, depth, k=None, rho=1025, g=9.81, r_ref=np.zeros(3)): + def calcHydroExcitation(self, zeta, beta, w, depth, k=None, rho=1025, g=9.81, r_ref=None): ''' Compute strip-theory wave excitation force (inertial part of Morison's equation). Need to call computeWaveKinematics() first to get the wave kinematics at each node. @@ -1540,20 +1945,35 @@ def calcHydroExcitation(self, zeta, beta, w, depth, k=None, rho=1025, g=9.81, r_ Parameters ---------- - r_ref: size-3 vector - Reference point coordinates to compute hydrodynamic loads [m]. + r_ref : size-3 vector, optional + Reference point coordinates to compute matrices about [m]. + Only used for rigid members. For flexible members, each node is its own reference point. Returns ---------- - self.F_hydro_iner: [nWaves x 6 x nw] complex array. nWaves: number of wave headings; 6: number of dofs; nw: number of frequencies + self.F_hydro_iner: [nWaves x self.nDOF x nw] complex array. nWaves: number of wave headings; self.nDOF: number of dofs; nw: number of frequencies ''' + if r_ref is None: + r_ref = self.nodeList[0].r[:3] + self.computeWaveKinematics(zeta, beta, w, depth, k=k, rho=rho, g=g) nWaves, _, _, nw = self.ud.shape - self.F_hydro_iner = np.zeros([nWaves, 6, nw],dtype=complex) # inertia excitation force/moment complex amplitudes vector [N, N-m] + self.F_hydro_iner = np.zeros([nWaves, self.nDOF, nw],dtype=complex) # inertia excitation force/moment complex amplitudes vector [N, N-m] # loop through each node of the member for il in range(self.ns): + # Get ranges of the matrix corresponding to this node + if self.type == 'rigid': + iFirst = 0 + iLast = 6 + else: # flexible + iFirst = il*6 + iLast = iFirst+6 + + # This r_ref is useless now, as self.r[il,:] = self.nodeList[il].r[:3], but doing it this way + # because in the future we want to have different discretizations for structural and hydrodynamic + r_ref = self.nodeList[il].r[:3] # only process hydrodynamics if this node is submerged if self.r[il,2] < 0: @@ -1568,11 +1988,11 @@ def calcHydroExcitation(self, zeta, beta, w, depth, k=None, rho=1025, g=9.81, r_ F_exc_iner_temp = np.matmul(Imat, self.ud[ih,il,:,i]) + self.pDyn[ih,il,i]*self.a_i[il]*self.q # add the excitation complex amplitude for this heading and frequency to the global excitation vector - self.F_hydro_iner[ih,:,i] += translateForce3to6DOF(F_exc_iner_temp, self.r[il,:] - r_ref) # (about PRP) + self.F_hydro_iner[ih,iFirst:iLast,i] += translateForce3to6DOF(F_exc_iner_temp, self.r[il,:] - r_ref) return self.F_hydro_iner - def calcHydroLinearization(self, w, ih=0, Xi=np.zeros(6), rho=1025, r_ref=np.zeros(3)): + def calcHydroLinearization(self, w, ih=0, Xi_nodes=None, rho=1025, r_ref=None): '''To be used within the FOWT's dynamics solve iteration method. This calculates the amplitude-dependent linearized coefficients, including the system linearized drag damping matrix, of this member. @@ -1585,35 +2005,54 @@ def calcHydroLinearization(self, w, ih=0, Xi=np.zeros(6), rho=1025, r_ref=np.zer Wave frequencies [rad/s] ih: int Index of the wave heading to consider for the drag linearization - Xi : size-6 complex array - response of the FOWT that this member is attached to - displacement and rotation complex amplitudes [m, rad] - TODO: Change this to be the response of the member itself + Xi_nodes : (nDOF,) complex array (self.nDOF = 6 * self.nNodes) + amplitude of displacement of the STRUCTURAL nodes of this member rho: float Water density [kg/m^3] - r_ref: size-3 vector - Reference point coordinates for outputs [m]. + r_ref : size-3 vector, optional + Reference point coordinates to compute matrices about [m]. + Only used for rigid members. For flexible members, each node is its own reference point. + TODO: should we remove this and always compute with respect to member's node, including for the other functions that use r_ref or rRP? Returns ---------- - B_hydro_drag: 6x6 array + B_hydro_drag: nDOF x nDOF array Hydrodynamic damping matrix from linearized viscous drag [N-s/m, N-s, N-s-m] - F_hydro_drag: 6 x nw complex array + F_hydro_drag: nDOF x nw complex array Excitation force/moment complex amplitude vector [N, N-m] This function also updates self.Bmat (size nNodes x 3 x 3) and self.F_exc_drag (size nNodes x 3 x nw) ''' + if r_ref is None: + r_ref = self.nodeList[0].r[:3] + # Zero response with size equal to the number of dofs of the member + if Xi_nodes is None: + Xi_nodes = np.zeros((self.nDOF, len(w)), dtype=complex) + circ = self.shape=='circular' # convenience boolian for circular vs. rectangular cross sections nw = len(w) - B_hydro_drag = np.zeros([6,6]) # hydrodynamic damping matrix (just linearized viscous drag for now) [N-s/m, N-s, N-s-m] - F_hydro_drag = np.zeros([6, nw],dtype=complex) # excitation force/moment complex amplitudes vector [N, N-m] - - # loop through each node of the member - for il in range(self.ns): - - # get node complex velocity amplitude based on platform motion's and relative position from PRP - # node displacement, velocity, and acceleration (each [3 x nw]) - drnode, vnode, anode = getKinematics(self.r[il,:] - r_ref, Xi, w) + B_hydro_drag = np.zeros([self.nDOF,self.nDOF]) # hydrodynamic damping matrix (just linearized viscous drag for now) [N-s/m, N-s, N-s-m] + F_hydro_drag = np.zeros([self.nDOF, nw],dtype=complex) # excitation force/moment complex amplitudes vector [N, N-m] + + # loop through each hydrodynamic node of the member + for il in range(self.ns): + if self.type == 'rigid': + # Indices to fill in the output arrays. Assuming 6-dof nodes. Only one structural node for rigid members. + iFirst = 0 + iLast = 6 + + # For rigid members, we get the displacement, velocity, and acceleration (each [3 x nw]) + # of the hydrodynamic nodes based on the response of its single structural node + drnode, vnode, _ = getKinematics(self.r[il,:] - self.nodeList[0].r[:3], Xi_nodes, w) + else: + iFirst = il*6 + iLast = iFirst+6 + + # For flexible members, we use the displacement of each structural node + drnode = Xi_nodes[iFirst:iFirst+3,:] # complex displacement amplitude [3 x nw] + vnode = drnode * 1j * w[None, :] # complex velocity amplitude [3 x nw] + r_ref = self.nodeList[il].r[:3] # only process hydrodynamics if this node is submerged if self.r[il,2] < 0: @@ -1674,36 +2113,299 @@ def calcHydroLinearization(self, w, ih=0, Xi=np.zeros(6), rho=1025, r_ref=np.zer Bmat_end = Bprime_End*self.qMat # - # ----- sum up side and end damping matrices ------ - + # ----- sum up side and end damping matrices ------ self.Bmat[il,:,:] = Bmat_sides + Bmat_end # store in Member object to be called later to get drag excitation for each wave heading - - B_hydro_drag += translateMatrix3to6DOF(self.Bmat[il,:,:], self.r[il,:] - r_ref) # add to global damping matrix for Morison members + B_hydro_drag[iFirst:iLast, iFirst:iLast] += translateMatrix3to6DOF(self.Bmat[il,:,:], self.r[il,:] - r_ref) # add to global damping matrix for Morison members # ----- calculate wave drag excitation (this may be recalculated later) ----- - for i in range(nw): - self.F_exc_drag[il,:,i] = np.matmul(self.Bmat[il,:,:], self.u[ih,il,:,i]) # get local 3d drag excitation force complex amplitude for each frequency [3 x nw] - - F_hydro_drag[:,i] += translateForce3to6DOF(self.F_exc_drag[il,:,i], self.r[il,:] - r_ref) # add to global excitation vector (frequency dependent) + F_hydro_drag[iFirst:iLast,i] += translateForce3to6DOF(self.F_exc_drag[il,:,i], self.r[il,:] - r_ref) # add to global excitation vector (frequency dependent) return B_hydro_drag, F_hydro_drag - def calcDragExcitation(self, ih, r_ref=np.zeros(3)): + def calcDragExcitation(self, ih, r_ref=None): + if r_ref is None: + r_ref = self.nodeList[0].r[:3] + nw = self.u.shape[3] - F_hydro_drag = np.zeros([6, nw], dtype=complex) # excitation force/moment complex amplitudes vector [N, N-m] + F_hydro_drag = np.zeros([self.nDOF, nw], dtype=complex) # excitation force/moment complex amplitudes vector [N, N-m] for il in range(self.ns): # loop through each node of the member if self.r[il,2] < 0: # only process hydrodynamics if this node is submerged + # Get ranges of the matrix corresponding to this node + if self.type == 'rigid': + iFirst = 0 + iLast = 6 + else: # flexible + iFirst = il*6 + iLast = iFirst+6 + r_ref = self.nodeList[il].r[:3] + + for i in range(nw): # get local 3d drag excitation force complex amplitude for each frequency [3 x nw] self.F_exc_drag[il,:,i] = np.matmul(self.Bmat[il,:,:], self.u[ih,il,:,i]) # add to global excitation vector (frequency dependent) - F_hydro_drag[:,i] += translateForce3to6DOF(self.F_exc_drag[il,:,i], self.r[il,:] - r_ref) + F_hydro_drag[iFirst:iLast,i] += translateForce3to6DOF(self.F_exc_drag[il,:,i], self.r[il,:] - r_ref) return F_hydro_drag + def computeStiffnessMatrix_FE(self): + ''' + Calculate the structural stiffnes matrix of the member (Linear Frame Finite-Element model with Timoshenko beam) + It is a 6Nnodes x 6Nnodes matrix, where Nnodes is the number of member nodes. + + Each element (subdivision of the member between two nodes) provides a 12x12 matrix in the local reference frame, + with axes p1, p2, q. The matrices of each element are assembled to provide the 6Nnodes x 6Nnodes matrix of the member. + + Returns: + ---------- + self.Kf: 6Nnodes x 6Nnodes array + Stiffness matrix of the member in the global reference frame [N/m, N-m/rad] + Besides returning the stiffness matrix, it is also stored in self.Ke + ''' + self.Kf = np.zeros((self.nDOF, self.nDOF)) # Stiffness matrix of the member + if self.type != 'beam': + return self.Kf + + if len(self.nodeList) < 2: + raise Exception("Flexible member {self.name} must have at least two nodes to compute the stiffness matrix.") + nodeDOF = self.nodeList[0].nDOF # Number of dofs per node + + E = self.E # Young's modulus + G = self.G # Shear modulus + nu = E/(2*G)-1 # Poisson's ratio - Assuming isotropic, homogeneous material + + for i in range(len(self.nodeList)-1): + L = np.linalg.norm(self.nodeList[i+1].r[0:3] - self.nodeList[i].r[0:3]) + if L == 0: + raise Exception("Element length cannot be zero.") + + if self.shape == 'circular': + Do_A, Di_A = (self.dorsl_node_ext[i], self.dorsl_node_int[i]) # External diameter and internal diameter of the element at node A + Do_B, Di_B = (self.dorsl_node_ext[i+1], self.dorsl_node_int[i+1]) # External diameter and internal diameter of the element at node B + + Do = 0.5 * (Do_A + Do_B) # Outer diameter of the element + Di = 0.5 * (Di_A + Di_B) # Inner diameter + A = np.pi * (Do**2 - Di**2) / 4 # Cross-sectional area + Jp1 = np.pi * (Do**4 - Di**4) / 64 # Moment of inertia around p1 axis + Jp2 = Jp1 # Moment of inertia around p2 axis + Jt = Jp2 + Jp1 # Torsion coefficient, around q axis + + # Terms for shear correction + kp1_num = 6*(1+nu)**2 * (1+(Di/Do)**2)**2 # Terms for shear correction + kp1_den = (1+(Di/Do)**2)**2 * (7+14*nu+8*nu**2) + 4 * (Di/Do)**2 * (5+10*nu+4*nu**2) + kp1 = kp1_num / kp1_den + kp2 = kp1 + + elif self.shape == 'rectangular': + # Lengths of the rectangular cross section. First component is normal to p1, second is normal to p2 + Wo_A, Wi_A = (self.dorsl_node_ext[i] , self.dorsl_node_int[i] ) # External and internal sides of the element at node A (2-element list) + Wo_B, Wi_B = (self.dorsl_node_ext[i+1], self.dorsl_node_int[i+1]) # External and internal sides of the element at node B + + Wo = 0.5 * (Wo_A + Wo_B) # Outer sides of the element + Wi = 0.5 * (Wi_A + Wi_B) # Inner sides + A = (Wo[0]*Wo[1] - Wi[0]*Wi[1]) # Cross-sectional area + Jp1 = (Wo[0]**3*Wo[1] - Wi[0]**3*Wi[1]) / 12 # Moment of inertia around p1 axis + Jp2 = (Wo[0]*Wo[1]**3 - Wi[0]*Wi[1]**3) / 12 # Moment of inertia around p2 axis + + # Expressions for torsion coefficient taken from Young and Budynas, Roark's Formulas for stress and strain + # Expressions for shear correction factor taken from Cowper 1966. The shear coefficient in Timoshenko's beam theory + if Wi[0] == 0 or Wi[1] == 0: # If solid rectangular section + # Get larger and smaller dimensions + a, b = max(Wo), min(Wo) + Jt = a*b**3/16 * ( 16/3 - 3.36*(b/a)*(1-b**4/a**4/12) ) + + kp1 = 10*(1+nu)/(12+11*nu) + kp2 = kp1 + + else: # Expression for thin-walled rectangular sections. Will provide bad estimates for intermediate wall thickness + t0 = (Wo[0]-Wi[0])/2 + t1 = (Wo[1]-Wi[1])/2 + Jt = 2*t0*t1 * (Wo[0]-t0)**2 * (Wo[1]-t1)**2 / (Wo[0]*t0 + Wo[1]*t1 - t0**2 - t1**2) + + m = Wi[0]*t1/Wo[1]/t0 + n = Wi[0]/Wo[1] + kp1 = 10*(1+nu)*(1+3*m)**2 / ( 12+72*m+150*m**2+90*m**3 + nu*(11+66*m+135*m**2+90*m**3) + 10*n**2*((3+nu)*m+3*m**2)) + + m = Wi[1]*t0/Wo[0]/t1 + n = Wi[1]/Wo[0] + kp2 = 10*(1+nu)*(1+3*m)**2 / ( 12+72*m+150*m**2+90*m**3 + nu*(11+66*m+135*m**2+90*m**3) + 10*n**2*((3+nu)*m+3*m**2)) + + Ksx = 12*E*Jp2 / (G*kp1*A*L**2) + Ksy = 12*E*Jp1 / (G*kp2*A*L**2) + + # # For Euler-Bernoulli beam - Using this to debug for now + # Ksx*=0 + # Ksy*=0 + + # Fill the 12x12 local stiffness matrix of the element + # Top left corner - 6x6 matrix of node 1 acting on itself + K11 = np.zeros((nodeDOF, nodeDOF)) + K11[0,0] = 12*E*Jp2/L**3/(1+Ksx) + K11[1,1] = 12*E*Jp1/L**3/(1+Ksy) + K11[2,2] = E*A/L + K11[3,3] = (4+Ksy)*E*Jp1/L/(1+Ksy) + K11[4,4] = (4+Ksx)*E*Jp2/L/(1+Ksx) + K11[5,5] = G*Jt/L + K11[0,4] = 6*E*Jp2/L**2/(1+Ksx) + K11[1,3] = -6*E*Jp1/L**2/(1+Ksy) + + # Bottom right corner - 6x6 matrix of node 2 acting on itself. + # It's the same as K11, but off-diagonal terms have opposite sign. + K22 = K11.copy() + K22[0,4] *= -1 + K22[1,3] *= -1 + + # Top right corner + K12 = np.zeros((nodeDOF, nodeDOF)) + K12[0,0] = -K11[0,0] + K12[1,1] = -K11[1,1] + K12[2,2] = -K11[2,2] + K12[3,3] = (2-Ksy)*E*Jp1/L/(1+Ksy) # This term uses 2-Ksx instead of 4+Ksx and doesn't have a sign change + K12[4,4] = (2-Ksx)*E*Jp2/L/(1+Ksx) # Same + K12[5,5] = -K11[5,5] + K12[0,4] = K11[0,4] + K12[1,3] = K11[1,3] + K12[4,0] = -K11[0,4] + K12[3,1] = -K11[1,3] + + # Fill lower triangle of the matrices (they're symmetric) + K11 = K11 + K11.T - np.diag(K11.diagonal()) + K22 = K22 + K22.T - np.diag(K22.diagonal()) + + # Assemble the 12x12 matrix + Ke = np.block([ + [K11, K12], # Top row: K11 and K12 + [K12.T, K22] # Bottom row: K12.T and K22 + ]) + + # Rotation matrix to transform from local to global coordinates + # TODO: p1, p2 and q do not account for elastic deformations yet + Dc_aux = np.column_stack((self.p1, self.p2, self.q)) + + # Make the 12x12 rotation matrix + Dc = np.zeros((2*nodeDOF, 2*nodeDOF)) + Dc[0:3, 0:3] = Dc_aux + Dc[3:6, 3:6] = Dc_aux + Dc[6:9, 6:9] = Dc_aux + Dc[9:12, 9:12] = Dc_aux + + # Transform the local stiffness matrix to global coordinates + Ke_global = (Dc @ Ke) @ Dc.T + self.Kf[i*nodeDOF:(i+2)*nodeDOF, i*nodeDOF:(i+2)*nodeDOF] += Ke_global + return self.Kf + + def computeInertiaMatrix_FE(self): + ''' + Calculate the structural inertia matrix of the member (Linear Frame Finite-Element model with Timoshenko beam) + It is a 6Nnodes x 6Nnodes matrix, where Nnodes is the number of member nodes. + This function is to be used within self.getInertia(). + + Each element (subdivision of the member between two nodes) provides a 12x12 matrix in the local reference frame, + with axes p1, p2, q. The matrices of each element are assembled to provide the 6Nnodes x 6Nnodes matrix of the member. + + Returns: + ---------- + Me: 6Nnodes x 6Nnodes array + Inertia matrix of the member in the local reference frame [kg*m^2] + ''' + self.Mf = np.zeros((self.nDOF, self.nDOF)) # Inertia matrix of a flexible member + + # Only works for flexible members + if self.type != 'beam': + return self.Mf + + if len(self.nodeList) < 2: + raise Exception("Flexible member {self.name} must have at least two nodes to compute its flexible inertia matrix.") + nodeDOF = self.nodeList[0].nDOF # Number of dofs per node + + for i in range(len(self.nodeList)-1): + L = np.linalg.norm(self.nodeList[i+1].r[0:3] - self.nodeList[i].r[0:3]) + if L == 0: + raise Exception("Element length cannot be zero.") + + if self.shape == 'circular': + Do_A, Di_A = (self.dorsl_node_ext[i], self.dorsl_node_int[i]) # External diameter and internal diameter of the element at node A + Do_B, Di_B = (self.dorsl_node_ext[i+1], self.dorsl_node_int[i+1]) # External diameter and internal diameter of the element at node B + + Do = 0.5 * (Do_A + Do_B) # Outer diameter of the element + Di = 0.5 * (Di_A + Di_B) # Inner diameter + A = np.pi * (Do**2 - Di**2) / 4 # Cross-sectional area + Jp1 = np.pi * (Do**4 - Di**4) / 64 # Moment of inertia around p1 axis + Jp2 = Jp1 # Moment of inertia around p2 axis + elif self.shape == 'rectangular': + # Lengths of the rectangular cross section. First component is normal to p1, second is normal to p2 + Wo_A, Wi_A = (self.dorsl_node_ext[i] , self.dorsl_node_int[i] ) # External and internal sides of the element at node A (2-element list) + Wo_B, Wi_B = (self.dorsl_node_ext[i+1], self.dorsl_node_int[i+1]) # External and internal sides of the element at node B + + Wo = 0.5 * (Wo_A + Wo_B) # Outer sides of the element + Wi = 0.5 * (Wi_A + Wi_B) # Inner sides + A = (Wo[0]*Wo[1] - Wi[0]*Wi[1]) # Cross-sectional area + Jp1 = (Wo[0]**3*Wo[1] - Wi[0]**3*Wi[1]) / 12 # Moment of inertia around p1 axis + Jp2 = (Wo[0]*Wo[1]**3 - Wi[0]*Wi[1]**3) / 12 # Moment of inertia around p2 axis + Jz = Jp2 + Jp1 # Polar moment of inertia around z axis + + + # Fill the 12x12 local stiffness matrix of the element + # Top left corner - 6x6 matrix of node 1 acting on itself + M11 = np.zeros((nodeDOF, nodeDOF)) + M11[0,0] = 13*A*L/35 + 6*Jp2/5/L + M11[1,1] = 13*A*L/35 + 6*Jp1/5/L + M11[2,2] = A*L/3 + M11[3,3] = A*L**3/105 + 2*L*Jp1/15 + M11[4,4] = A*L**3/105 + 2*L*Jp2/15 + M11[5,5] = Jz*L/3 + M11[0,4] = 11*A*L**2/210 + Jp2/10 + M11[1,3] = -11*A*L**2/210 - Jp1/10 + + # Bottom right corner - 6x6 matrix of node 2 acting on itself. + # It's the same as K11, but off-diagonal terms have opposite sign. + M22 = M11.copy() + M22[0,4] *= -1 + M22[1,3] *= -1 + + # Top right corner + M12 = np.zeros((nodeDOF, nodeDOF)) + M12[0,0] = 9*A*L/70 - 6*Jp2/5/L + M12[1,1] = 9*A*L/70 - 6*Jp1/5/L + M12[2,2] = A*L/6 + M12[3,3] = -A*L**3/140 - L*Jp1/30 + M12[4,4] = -A*L**3/140 - L*Jp2/30 + M12[5,5] = Jz*L/6 + M12[0,4] = -13*A*L**2/420 + Jp2/10 + M12[1,3] = 13*A*L**2/420 - Jp1/10 + M12[4,0] = 13*A*L**2/420 - Jp2/10 + M12[3,1] = -13*A*L**2/420 + Jp1/10 + + # Fill lower triangle of the matrices (they're symmetric) + M11 = M11 + M11.T - np.diag(M11.diagonal()) + M22 = M22 + M22.T - np.diag(M22.diagonal()) + + # Assemble the 12x12 matrix + Me = np.block([ + [M11, M12], + [M12.T, M22] + ]) + Me *= self.rho_shell + + # Rotation matrix to transform from local to global coordinates + # TODO: p1, p2 and q do not account for elastic deformations yet + Dc_aux = np.column_stack((self.p1, self.p2, self.q)) + + # Make the 12x12 rotation matrix + Dc = np.zeros((2*nodeDOF, 2*nodeDOF)) + Dc[0:3, 0:3] = Dc_aux + Dc[3:6, 3:6] = Dc_aux + Dc[6:9, 6:9] = Dc_aux + Dc[9:12, 9:12] = Dc_aux + + # Transform the local stiffness matrix to global coordinates + Me_global = (Dc @ Me) @ Dc.T + self.Mf[i*nodeDOF:(i+2)*nodeDOF, i*nodeDOF:(i+2)*nodeDOF] += Me_global + + return self.Mf def getSectionProperties(self, station): '''Get member cross sectional area and moments of inertia at a user- @@ -1715,8 +2417,9 @@ def getSectionProperties(self, station): return A, I def plot(self, ax, r_ptfm=[0,0,0], R_ptfm=[], color='k', nodes=0, - station_plot=[], plot2d=False, Xuvec=[1,0,0], Yuvec=[0,0,1], zorder=2): + station_plot=[], plot2d=False, Xuvec=[1,0,0], Yuvec=[0,0,1], zorder=2, plot_frame=False, frame_opts={}): '''Draws the member on the passed axes, and optional platform offset and rotation matrix + If plot_frame is True, also plots the frame structure (structural nodes and beam elements) using the parameters in frame_opts. Parameters ---------- @@ -1814,6 +2517,29 @@ def plot(self, ax, r_ptfm=[0,0,0], R_ptfm=[], color='k', nodes=0, if nodes > 0: ax.scatter(self.r[:,0], self.r[:,1], self.r[:,2]) - return linebit - - + # plot the frame structure if asked + if plot_frame: + # Set defaults for frame_opts keys if not present + frame_defaults = { + 'colorMember': 'k', + 'linewidth': 2, + 'colorNode': 'default', # Default is to use 'k for end nodes and 'b' for inner nodes + 'size': 5, + 'marker': 'o', + 'markerfacecolor': 'default', + 'writeID': False + } + + # Use default options if not provided + for k, v in frame_defaults.items(): + frame_opts.setdefault(k, v) + + # Plot the frame structure + for i, node in enumerate(self.nodeList): + ax = node.plot(ax, color=frame_opts['colorNode'], size=frame_opts['size'], marker=frame_opts['marker'], markerfacecolor=frame_opts['markerfacecolor'], writeID=frame_opts['writeID']) + if i < len(self.nodeList)-1: + x1, y1, z1 = node.r[0], node.r[1], node.r[2] + x2, y2, z2 = self.nodeList[i+1].r[0], self.nodeList[i+1].r[1], self.nodeList[i+1].r[2] + ax.plot([x1, x2], [y1, y2], [z1, z2], color=frame_opts['colorMember'], linewidth=frame_opts['linewidth']) + + return linebit \ No newline at end of file diff --git a/raft/raft_model.py b/raft/raft_model.py index ee9a2788..480e4b5c 100644 --- a/raft/raft_model.py +++ b/raft/raft_model.py @@ -17,7 +17,7 @@ import moorpy as mp import raft.raft_fowt as fowt from raft.helpers import * -from moorpy.helpers import dsolve2, set_axes_equal, dsolvePlot +from moorpy.helpers import dsolve2, set_axes_equal, dsolvePlot, lines2ss import copy #import F6T1RNA as structural # import turbine structural model functions @@ -40,8 +40,7 @@ def __init__(self, design, nTurbines=1): self.fowtList = [] # list of FOWT objects self.coords = [] # list of FOWT reference coordinates in x and y (also stored inside each FOWT as x_ref, y_ref [m] - self.nDOF = 0 # number of FOWT-level DOFs in the system - normally will be 6*len(fowtList) - + self.nDOF = 0 # number of FOWT-level DOFs in the system - for fully rigid FOWTs (including tower), this is 6*len(fowtList) # parse settings if not 'settings' in design: # if settings field not in input data @@ -52,6 +51,9 @@ def __init__(self, design, nTurbines=1): self.XiStart = getFromDict(design['settings'], 'XiStart' , default=0.1 , dtype=float) # sets initial amplitude of each DOF for all frequencies self.nIter = getFromDict(design['settings'], 'nIter' , default=15 , dtype=int ) # sets how many iterations to perform in Model.solveDynamics() + self.staticsMod = getFromDict(design['settings'], 'staticsMod' , default=0, dtype=int) # use (0) stiffness matrix or (1) nonlinear reactions in Model.solveStatics() + self.forcingMod = getFromDict(design['settings'], 'forcingsMod', default=0, dtype=int) # use (0) constant or (1) updated forcing in Model.solveStatics() + self.w = np.arange(min_freq, max_freq+0.5*min_freq, min_freq) *2*np.pi # angular frequencies to analyze (rad/s) self.nw = len(self.w) # number of frequencies @@ -99,6 +101,7 @@ def __init__(self, design, nTurbines=1): else: raise Exception("When using 'array_mooring', a MoorDyn-style input file must be provided as 'file'.") self.ms_tol = getFromDict(design['mooring'], 'tol', dtype=float, default=0.05) # mooring system tolerance for solving equilibrium + self.moorMod = getFromDict(design['array_mooring'], 'moorMod', default=0, dtype=int) else: self.ms = None @@ -125,7 +128,7 @@ def __init__(self, design, nTurbines=1): design_i['platform'] = design['platforms'][fowtInfo[i]['platformID']-1] if fowtInfo[i]['mooringID'] == 0: # no mooring on this FOWT (array-level moorings may be used instead) - design_i['mooring'] = None + design_i.pop('mooring', None) else: design_i['mooring'] = design['moorings'][fowtInfo[i]['mooringID']-1] @@ -139,7 +142,7 @@ def __init__(self, design, nTurbines=1): x_ref=x_ref, y_ref=y_ref, heading_adjust=headj)) self.coords.append([x_ref, y_ref]) - self.nDOF += 6 + self.nDOF += self.fowtList[-1].nDOF @@ -156,7 +159,7 @@ def __init__(self, design, nTurbines=1): # set up the FOWT here self.fowtList.append(fowt.FOWT(design, self.w, None, depth=self.depth)) self.coords.append([0.0,0.0]) - self.nDOF += 6 + self.nDOF += self.fowtList[-1].nDOF self.design = design # save design dictionary for possible later use/reference @@ -181,7 +184,7 @@ def addFOWT(self, fowt, xy0=[0,0]): self.fowtList.append(fowt) self.coords.append(xy0) - self.nDOF += 6 + self.nDOF += fowt.nDOF # would potentially need to add a mooring system body for it too <<< @@ -196,26 +199,39 @@ def analyzeUnloaded(self, ballast=0, heave_tol = 1): raise Exception('analyzeUnloaded is an old method that only works for a single FOWT.') # need to zero out external loads - self.fowtList[0].setPosition(np.zeros(6)) - self.fowtList[0].D_hydr0 = np.zeros(6) - self.fowtList[0].f_aero0 = np.zeros([6,self.fowtList[0].nrotors]) - - + fowt = self.fowtList[0] + fowt.setPosition(np.zeros(fowt.nDOF)) + fowt.D_hydr0 = np.zeros(fowt.nDOF) + fowt.f_aero0 = np.zeros([fowt.nDOF,fowt.nrotors]) + + # get mooring system characteristics about undisplaced platform position (useful for baseline and verification) - self.C_moor0 = np.zeros([6,6]) - self.F_moor0 = np.zeros(6) + self.C_moor0 = np.zeros([fowt.nDOF,fowt.nDOF]) + self.F_moor0 = np.zeros(fowt.nDOF) if self.ms: try: - self.C_moor0 += self.ms.getCoupledStiffness(lines_only=True) - self.F_moor0 += self.ms.getForces(DOFtype="coupled", lines_only=True) + if self.moorMod == 0 or self.moorMod == 1: + C_moor = self.ms.getCoupledStiffness(lines_only=True) + elif self.moorMod == 2: + self.ms.updateLumpedMassSystem() + _, _, _, C_moor = self.ms.getCoupledDynamicMatrices(lines_only=True) + + self.C_moor0[:6, :6] += C_moor # Lumping mooring system stiffness and loads to the first 6 dofs for now + self.F_moor0[:6] += self.ms.getForces(DOFtype="coupled", lines_only=True) except Exception as e: raise RuntimeError('An error occured when getting linearized mooring properties in undisplaced state: '+e.message) - if self.fowtList[0].ms: + if fowt.ms: try: - self.C_moor0 += self.fowtList[0].ms.getCoupledStiffness(lines_only=True) - self.F_moor0 += self.fowtList[0].ms.getForces(DOFtype="coupled", lines_only=True) + if fowt.moorMod == 0 or fowt.moorMod == 1: + C_moor = fowt.ms.getCoupledStiffness(lines_only=True) + elif fowt.moorMod == 2: + fowt.ms.updateSystemDynamicMatrices() + _, _, _, C_moor = fowt.ms.getCoupledDynamicMatrices(lines_only=True) + + self.C_moor0[:6, :6] += C_moor + self.F_moor0[:6] += fowt.ms.getForces(DOFtype="coupled", lines_only=True) except Exception as e: raise RuntimeError('An error occured when getting linearized mooring properties in undisplaced state: '+e.message) @@ -240,7 +256,7 @@ def analyzeUnloaded(self, ballast=0, heave_tol = 1): # calculate platform offsets and mooring system equilibrium state self.solveStatics(None) # passing none should imply no load case (no WWC) - self.results['properties']['offset_unloaded'] = self.fowtList[0].Xi0 + self.results['properties']['offset_unloaded'] = fowt.Xi0 # TODO: add printing of summary info here - mass, stiffnesses, etc @@ -256,11 +272,14 @@ def analyzeCases(self, display=0, meshDir=os.path.join(os.getcwd(),'BEM'), RAO_p self.results['case_metrics'] = {} self.results['mean_offsets'] = [] - # calculate the system's constant properties for fowt in self.fowtList: - fowt.setPosition([fowt.x_ref, fowt.y_ref,0,0,0,0]) + ref_displacement = np.zeros(fowt.nDOF) + for idof, dof in enumerate(fowt.reducedDOF): + ref_displacement[idof] += fowt.x_ref if dof[1] == 0 else 0 # If this is a translation in the X direction (Global dof 0) + ref_displacement[idof] += fowt.y_ref if dof[1] == 1 else 0 # If this is a translation in the Y direction (Global dof 1) + fowt.setPosition(ref_displacement) # zero platform offsets fowt.calcStatics() for i, fowt in enumerate(self.fowtList): @@ -297,6 +316,8 @@ def analyzeCases(self, display=0, meshDir=os.path.join(os.getcwd(),'BEM'), RAO_p # Solve system operating point / mean offsets again, but now including mean wave forces. # We actually wouldn't need to do that if the QTFs are computed externally, but all the wave information # is currently computed only when solveDynamics is called. Should work on that. + # In principle, solveDynamics should be recomputed to account for the actual mean position. + # However, if computing the QTFs internally, the mean drift due to the waves shouldn't be too large, so probably not worth the cost. if any(fowt.potSecOrder > 0 for fowt in self.fowtList): if display > 1: print('Recomputing equilibrium position, now with wave mean drift') @@ -311,6 +332,7 @@ def analyzeCases(self, display=0, meshDir=os.path.join(os.getcwd(),'BEM'), RAO_p # process outputs that are specific to the floating unit (initialize dictionary for case and turb index) for i, fowt in enumerate(self.fowtList): + self.results['freq_rad'] = self.w self.results['case_metrics'][iCase][i] = {} fowt.saveTurbineOutputs(self.results['case_metrics'][iCase][i],case) nTowers = fowt.ntowers @@ -348,7 +370,7 @@ def analyzeCases(self, display=0, meshDir=os.path.join(os.getcwd(),'BEM'), RAO_p # process array-level mooring tension outputs if self.ms: - + self.ms = lines2ss(self.ms) # convert composite lines to subsystem self.results['case_metrics'][iCase]['array_mooring'] = {} nLines = len(self.ms.lineList) @@ -358,9 +380,28 @@ def analyzeCases(self, display=0, meshDir=os.path.join(os.getcwd(),'BEM'), RAO_p T_moor = self.ms.getTensions() # get line end mean tensions - for ih in range(nWaves+1): - for iw in range(self.nw): - T_moor_amps[ih,:,iw] = np.matmul(J_moor, self.Xi[ih,:,iw]) # FFT of mooring tensions + if self.moorMod == 0: + for ih in range(nWaves+1): + for iw in range(self.nw): + T_moor_amps[ih,:,iw] = np.matmul(J_moor, self.Xi[ih,:,iw]) # FFT of mooring tensions + else: + for il, line in enumerate(self.ms.lineList): + for ih in range(nWaves): # Only working with waves for now + # Reshape Xi to be a nFOWTs list of 6 x nFreqs numpy arrays + resh_Xi = self.Xi[ih, :].reshape(self.nFOWT, 6, self.nw) + Xi = [resh_Xi[i] for i in range(self.nFOWT)] + + # List of mean position of the FOWTs + rBody = [f.r6[:3] for f in self.fowtList] + + RAO_A, RAO_B = getLineEndsRAO(line, self.ms, self.w, Xi, self.fowtList[0].S[ih,:], rBody) + + # Get tension along the mooring line + T_nodes_amp, _, _, _, _, _, _, _ = line.dynamicSolve(self.w, self.fowtList[0].S[ih,:], RAO_A=RAO_A.T, RAO_B=RAO_B.T, depth=self.depth, kbot=0,cbot=0, tol = 0.01, conv_time=False) + + # Tension at the end nodes of the line + T_moor_amps[ih, il, :] += T_nodes_amp[:,0] + T_moor_amps[ih, il+nLines,:] += T_nodes_amp[:,-1] self.results['case_metrics'][iCase]['array_mooring']['Tmoor_avg'] = T_moor self.results['case_metrics'][iCase]['array_mooring']['Tmoor_std'] = np.zeros(2*nLines) @@ -392,7 +433,7 @@ def analyzeCases(self, display=0, meshDir=os.path.join(os.getcwd(),'BEM'), RAO_p self.T_moor_amps = T_moor_amps # save for future processing! - def solveEigen(self, display=0): + def solveEigen(self, display=0, outPath=None): '''Compute the natural frequencies and mode shapes of the floating system. When there is a single FOWT, this should give the same result as FOWT.solveEigen. @@ -412,11 +453,11 @@ def solveEigen(self, display=0): # include each FOWT's individual mass and stiffness for i, fowt in enumerate(self.fowtList): - i1 = i*6 # range of DOFs for the current turbine - i2 = i*6+6 + i1 = i*fowt.nDOF # range of DOFs for the current turbine + i2 = (i+1)*fowt.nDOF M_tot[i1:i2, i1:i2] += fowt.M_struc + fowt.A_hydro_morison + fowt.A_BEM[:,:,0] # Mass. Using BEM added mass at w=0 because it is closer to the expected natural frequencies than w=inf - C_tot[i1:i2, i1:i2] += fowt.C_struc + fowt.C_hydro + fowt.C_moor + C_tot[i1:i2, i1:i2] += fowt.C_struc + fowt.C_hydro + fowt.C_moor + fowt.C_elast # add any additional yaw stiffness that isn't included in the MoorPy model (e.g. if a bridle isn't modeled) # TODO: Remove this now that we have additional_effects? @@ -424,8 +465,17 @@ def solveEigen(self, display=0): # include array-level mooring stiffness if self.ms: - C_tot += self.ms.getCoupledStiffnessA(lines_only=True) - + if all(f.nDOF == 6 for f in self.fowtList) == False: + raise Exception('Currently, array-level mooring eigen analysis only supported for fully rigid FOWTs (6 DOFs).') + + if self.moorMod == 0 or self.moorMod == 1: + C_moor = self.ms.getCoupledStiffnessA(lines_only=True) + elif self.moorMod == 2: + self.ms.updateSystemDynamicMatrices() + _, _, _, C_moor = self.ms.getCoupledDynamicMatrices(lines_only=True) + C_tot += C_moor + + # check viability of matrices message='' for i in range(self.nDOF): @@ -437,40 +487,56 @@ def solveEigen(self, display=0): if len(message) > 0: raise RuntimeError('System matrices computed by RAFT have one or more small or negative diagonals: '+message) - # calculate natural frequencies (using eigen analysis to get proper values for pitch and roll - otherwise would need to base about CG if using diagonal entries only) - eigenvals, eigenvectors = np.linalg.eig(np.linalg.solve(M_tot, C_tot)) # <<< need to sort this out so it gives desired modes, some are currently a bit messy + # For rigid FOWTs, using the old method for now + # sort to normal DOF order based on which DOF is largest in each eigenvector + if all(f.nDOF == 6 for f in self.fowtList): + # calculate natural frequencies (using eigen analysis to get proper values for pitch and roll - otherwise would need to base about CG if using diagonal entries only) + eigenvals, eigenvectors = np.linalg.eig(np.linalg.solve(M_tot, C_tot)) # <<< need to sort this out so it gives desired modes, some are currently a bit messy - if any(eigenvals <= 0.0): - raise RuntimeError("Error: zero or negative system eigenvalues detected.") + if any(eigenvals <= 0.0): + raise RuntimeError("Error: zero or negative system eigenvalues detected.") - # sort to normal DOF order based on which DOF is largest in each eigenvector - ind_list = [] - for i in range(self.nDOF-1,-1, -1): - vec = np.abs(eigenvectors[i,:]) # look at each row (DOF) at a time (use reverse order to pick out rotational DOFs first) + ind_list = [] + for i in range(self.nDOF-1,-1, -1): + vec = np.abs(eigenvectors[i,:]) # look at each row (DOF) at a time (use reverse order to pick out rotational DOFs first) - for j in range(self.nDOF): # now do another loop in case the index was claimed previously + for j in range(self.nDOF): # now do another loop in case the index was claimed previously - ind = np.argmax(vec) # find the index of the vector with the largest value of the current DOF + ind = np.argmax(vec) # find the index of the vector with the largest value of the current DOF - if ind in ind_list: # if a previous vector claimed this DOF, set it to zero in this vector so that we look at the other vectors - vec[ind] = 0.0 - else: - ind_list.append(ind) # if it hasn't been claimed before, assign this vector to the DOF - break + if ind in ind_list: # if a previous vector claimed this DOF, set it to zero in this vector so that we look at the other vectors + vec[ind] = 0.0 + else: + ind_list.append(ind) # if it hasn't been claimed before, assign this vector to the DOF + break + + ind_list.reverse() # reverse the index list since we made it in reverse order + + fns = np.sqrt(eigenvals[ind_list])/2.0/np.pi # apply sorting to eigenvalues and convert to natural frequency in Hz + modes = eigenvectors[:,ind_list] # apply sorting to eigenvectors - ind_list.reverse() # reverse the index list since we made it in reverse order + else: + eigenvals, eigenvectors = np.linalg.eig(np.linalg.solve(M_tot, C_tot)) - fns = np.sqrt(eigenvals[ind_list])/2.0/np.pi # apply sorting to eigenvalues and convert to natural frequency in Hz - modes = eigenvectors[:,ind_list] # apply sorting to eigenvectors + # Sort in ascending order of eigenvals + sorted_indices = np.argsort(eigenvals) + eigenvals = eigenvals[sorted_indices] + eigenvectors = eigenvectors[:, sorted_indices] + + fns = np.sqrt(eigenvals)/2.0/np.pi + modes = eigenvectors + + if isinstance(outPath, str): + self.write_modes_json(outPath, fns, modes) if display > 0: print("") print("--------- Natural frequencies and mode shapes -------------") - print("Mode "+"".join([f"{i+10:3d}" for i in range(self.nDOF)])) - print("Fn (Hz)"+"".join([f"{fn:10.4f}" for fn in fns])) + print("Mode "+"".join([f"{i+10:3d}" for i in range(6)])) + print("Fn (Hz)"+"".join([f"{fn:10.4f}" for fn in fns[:6]])) print("") - for i in range(self.nDOF): - print(f"DOF {i+1} "+"".join([f"{modes[i,j]:10.4f}" for j in range(self.nDOF)])) + for i in range(6): + print(f"DOF {i+1} "+"".join([f"{modes[i,j]:10.4f}" for j in range(6)])) print("-----------------------------------------------------------") # store results @@ -497,19 +563,16 @@ def solveStatics(self, case, display=0): - return total loads - statics_mod - 0: linearized hydrostatics; 1: hydrostatics are updated each iteration based on new poses - forcing_mod - 0: don't update environmental loads; 1: loads are updated each iteration based on new poses + self.staticsMod - 0: linearized hydrostatics; 1: hydrostatics are updated each iteration based on new poses + self.forcingMod - 0: don't update environmental loads; 1: loads are updated each iteration based on new poses New change: supports either a single wind speed or a list (where there is one wind speed per turbine) ''' - - statics_mod = 0 - forcing_mod = 0 - - if statics_mod == 0: # if using linearized hydrostatics approach, get the matrices + + if self.staticsMod == 0: # if using linearized hydrostatics approach, get the matrices K_hydrostatic = [] #np.zeros([self.nDOF, self.nDOF]) # this will be the constant hydrostatic stiffness matrix--buoyancy and weight terms F_undisplaced = np.zeros(self.nDOF) # force and moment vector before any displacements - if forcing_mod == 0: # if using constant environmental mean forcing + if self.forcingMod == 0: # if using constant environmental mean forcing F_env_constant = np.zeros(self.nDOF) # constant environmental force and moment vector @@ -528,19 +591,24 @@ def solveStatics(self, case, display=0): if display > 1: print(f"FOWT {i+1:}") - X_initial[6*i:6*i+6] = np.array([fowt.x_ref, fowt.y_ref,0,0,0,0]) - fowt.setPosition(X_initial[6*i:6*i+6]) # zero platform offsets + ref_displacement = np.zeros(fowt.nDOF) + for idof, dof in enumerate(fowt.reducedDOF): + ref_displacement[idof] += fowt.x_ref if dof[1] == 0 else 0 # If this is a translation in the X direction (Global dof 0) + ref_displacement[idof] += fowt.y_ref if dof[1] == 1 else 0 # If this is a translation in the Y direction (Global dof 1) + X_initial[fowt.nDOF*i:fowt.nDOF*(i+1)] = ref_displacement # set initial positions to reference positions + fowt.setPosition(X_initial[fowt.nDOF*i:fowt.nDOF*(i+1)]) # zero platform offsets + if case: fowt.calcTurbineConstants(case, ptfm_pitch=0) # for turbine forces >>> still need to update to use current fowt pose <<< fowt.calcStatics() # Recompute statics because turbine heading may have changed due to yaw control - if statics_mod == 0: + if self.staticsMod == 0: K_hydrostatic.append(fowt.C_struc + fowt.C_hydro) - F_undisplaced[6*i:6*i+6 ] += fowt.W_struc + fowt.W_hydro + fowt.f0_additional - - if display > 1: print(" F_undisplaced "+" ".join(["{:+8.2e}"]*6).format(*F_undisplaced[6*i:6*i+6])) + F_undisplaced[fowt.nDOF*i:fowt.nDOF*(i+1)] += fowt.W_struc + fowt.W_hydro + fowt.f0_additional - if forcing_mod == 0 and case: + if display > 1: print(" F_undisplaced "+" ".join(["{:+8.2e}"]*6).format(*F_undisplaced[fowt.nDOF*i:fowt.nDOF*(i+1)])) + + if self.forcingMod == 0 and case: # If list of wind speeds, set each turbine case with corresponding wind speed if type(caseorig['wind_speed']) == list : @@ -550,18 +618,18 @@ def solveStatics(self, case, display=0): print(case) fowt.calcHydroConstants() - F_env_constant[6*i:6*i+6] = np.sum(fowt.f_aero0, axis=1) + fowt.calcCurrentLoads(case) + F_env_constant[fowt.nDOF*i:fowt.nDOF*(i+1)] = np.sum(fowt.f_aero0, axis=1) + fowt.calcCurrentLoads(case) # Add mean drift if it was already computed. # For multiple waves in a given case, it is simply the sum of the mean drifts for each wave. # This is not strictly correct, as we would need to compute the QTFs for the combinations between wave headings, but this is a starting point if hasattr(fowt, 'Fhydro_2nd_mean'): F_meandrift = np.sum(fowt.Fhydro_2nd_mean, axis=0) - F_env_constant[6*i:6*i+6] += F_meandrift - - if display > 1: print(" F_env_constant"+" ".join(["{:+8.2e}"]*6).format(*F_env_constant[6*i:6*i+6])) - - + F_env_constant[fowt.nDOF*i:fowt.nDOF*(i+1)] += F_meandrift + + if display > 1: print(" F_env_constant"+" ".join(["{:+8.2e}"]*6).format(*F_env_constant[fowt.nDOF*i:fowt.nDOF*(i+1)])) + + # ----- Pass case water current information to MoorPy ----- currentMod = 0 # current modeling mode for MoorPy @@ -586,15 +654,26 @@ def solveStatics(self, case, display=0): # ----- calculate platform offsets and mooring system equilibrium state ----- - # figure out some settings to the equilibrium solve - db = np.array([30, 30, 5, 0.1, 0.1, 0.1]*len(self.fowtList)) # array for max step size (used manually in step func) - tols = np.array([0.05,0.05,0.05, 0.005,0.005,0.005]*len(self.fowtList)) # create vector of tolerances - tol = 0.05 rtol = tol/10 - - - '''Calculates mean offsets and linearized mooring properties for the current load case. - setEnv and calcSystemProps must be called first. This will ultimately become a method for solving mean operating point. - Mean offsets are saved in the FOWT object. - ''' + # figure out some settings to the equilibrium solve + tols = np.zeros(self.nDOF) + db = np.zeros(self.nDOF) + idof = 0 # index of the reduced dof in the reduced dofs of the array + for fowt in self.fowtList: + for dof in fowt.reducedDOF: + # create vector of tolerances: 0.05 for translations (dof[1] < 3), 0.005 for rotations + tols[idof] = 0.05 if dof[1] < 3 else 0.005 + + # array for max step size (used manually in step func): 30 for surge/sway (dof[1] < 2), 5 for heave (dof[1] == 2), 0.1 for rotations + db[idof] = 30 if dof[1] < 2 else 5 if dof[1] == 2 else 0.1 + + idof += 1 + + + '''Calculates mean offsets and linearized mooring properties for the + current load case. Methods setEnv and calcSystemProps must be called + first. This will ultimately become a method for solving mean + operating point. Mean offsets are saved in the FOWT object. + ''' def eval_func_equil(X, args): @@ -602,10 +681,10 @@ def eval_func_equil(X, args): # set latest positions of each FOWT for i, fowt in enumerate(self.fowtList): - r6 = X[6*i:6*i+6] - fowt.setPosition(r6) # this updates the fowt's position and its own MoorPy system's state (including new F and K) + rReducedDOF = X[fowt.nDOF*i:fowt.nDOF*(i+1)] + fowt.setPosition(rReducedDOF) # this updates the fowt's position and its own MoorPy system's state (including new F and K) if self.ms: - self.ms.bodyList[i].setPosition(r6) # FOWT body in array level MoorPy system + self.ms.bodyList[i].setPosition(fowt.r6) # FOWT body in array level MoorPy system # update array-level mooring system's internal equilibrium (free DOFs only) if self.ms: @@ -616,30 +695,33 @@ def eval_func_equil(X, args): Fnet = np.zeros(self.nDOF) # net forces and moments on each DOF across all platforms [N,N,N,Nm,Nm,Nm,N...] for i, fowt in enumerate(self.fowtList): - - Xi0 = X[6*i:6*i+6] - np.array([fowt.x_ref, fowt.y_ref,0,0,0,0]) # fowt mean offset from its reference position + ref_displacement = np.zeros(fowt.nDOF) + for idof, dof in enumerate(fowt.reducedDOF): + ref_displacement[idof] += fowt.x_ref if dof[1] == 0 else 0 # If this is a translation in the X direction (Global dof 0) + ref_displacement[idof] += fowt.y_ref if dof[1] == 1 else 0 # If this is a translation in the Y direction (Global dof 1) + Xi0 = X[fowt.nDOF*i:fowt.nDOF*(i+1)] - ref_displacement # fowt mean offset from its reference position # update FOWT hydrostatic loads - if statics_mod == 0 : # constant linear hydrostatics option - Fnet[6*i:6*i+6] += F_undisplaced[6*i:6*i+6] # add original hydrostatics forces - Fnet[6*i:6*i+6] += -np.matmul(K_hydrostatic[i], Xi0) # use stiffness matrix to add hydrostatic reaction forces based on offsets - elif statics_mod == 1: # switch for whether to recompute hydrostatics + if self.staticsMod == 0 : # constant linear hydrostatics + Fnet[fowt.nDOF*i:fowt.nDOF*(i+1)] += F_undisplaced[fowt.nDOF*i:fowt.nDOF*(i+1)] # add original hydrostatics forces + Fnet[fowt.nDOF*i:fowt.nDOF*(i+1)] += -np.matmul(K_hydrostatic[i], Xi0) # use stiffness matrix to add hydrostatic reaction forces based on offsets + elif self.staticsMod == 1: # recompute hydrostatics fowt.calcStatics() - Fnet[6*i:6*i+6] += fowt.W_struc # weight - Fnet[6*i:6*i+6] += fowt.W_hydro # buoyancy - Fnet[6*i:6*i+6] += fowt.f0_additional # user-specified additional forces from other external sources + Fnet[fowt.nDOF*i:fowt.nDOF*(i+1)] += fowt.W_struc # weight + Fnet[fowt.nDOF*i:fowt.nDOF*(i+1)] += fowt.W_hydro # buoyancy + Fnet[fowt.nDOF*i:fowt.nDOF*(i+1)] += fowt.f0_additional # user-specified additional forces from other external sources #breakpoint() else: - raise Exception('Invalid statics_mod value') + raise Exception('Invalid self.staticsMod value') # if it's a loaded case, include mean environmental loads if case: # <<<<<< - if forcing_mod == 0: # constant loads approach - Fnet[6*i:6*i+6] += F_env_constant[6*i:6*i+6] - - elif forcing_mod == 1: # updated loads approach + if self.forcingMod == 0: # constant loads approach + Fnet[fowt.nDOF*i:fowt.nDOF*(i+1)] += F_env_constant[fowt.nDOF*i:fowt.nDOF*(i+1)] + + elif self.forcingMod == 1: # updated loads approach # If list of wind speeds, set each turbine case with corresponding wind speed if type(caseorig['wind_speed']) == list : @@ -649,31 +731,35 @@ def eval_func_equil(X, args): fowt.calcStatics() # Recompute statics because turbine heading may have changed due to yaw control fowt.calcHydroConstants() # prep for drag force and mean drift - Fnet[6*i:6*i+6] += np.sum(fowt.f_aero0, axis=1) # sum mean turbine force across turbines - Fnet[6*i:6*i+6] += fowt.calcCurrentLoads(case) # current drag force i.e. fowt.D_hydro + Fnet[fowt.nDOF*i:fowt.nDOF*(i+1)] += np.sum(fowt.f_aero0, axis=1) # sum mean turbine force across turbines + Fnet[fowt.nDOF*i:fowt.nDOF*(i+1)] += fowt.calcCurrentLoads(case) # current drag force i.e. fowt.D_hydro - # mean drift force + # mean drift force. TODO: make this work with arbirtrary DOFs if hasattr(fowt, 'Fhydro_2nd_mean'): F_meandrift = np.sum(fowt.Fhydro_2nd_mean, axis=0) - Fnet[6*i:6*i+6] += F_meandrift + Fnet[fowt.nDOF*i:fowt.nDOF*i+6] += F_meandrift # This could eventually include FLORIS. If it's slow, FLORIS could be updated only every 5 or 10 iterations... # mooring forces (includes if currents were updated above) - Fnet[6*i:6*i+6] += fowt.F_moor0 # fowt.ms.bodyList[0].getForces(lines_only=True) # individual mooring forces + # TODO: Lumping mooring forces into the first 6 DOFs for now + Fnet[fowt.nDOF*i:fowt.nDOF*(i+1)] += fowt.F_moor0 # fowt.ms.bodyList[0].getForces(lines_only=True) # individual mooring forces if self.ms: - Fnet[6*i:6*i+6] += self.ms.bodyList[i].getForces(lines_only=True) # array-level mooring forces - + Fnet[fowt.nDOF*i:fowt.nDOF*(i+1)] += self.ms.bodyList[i].getForces(lines_only=True) # array-level mooring forces + + # Elastic forces + Fnet[fowt.nDOF*i:fowt.nDOF*(i+1)] += -np.matmul(fowt.C_elast, Xi0) # elastic forces (e.g. from flexible mooring lines) # note that the above also calculates many stiffnes terms that are used in step_func_equil if display > 1: print("Net forces") printVec(Fnet) - - RMSeForce = np.linalg.norm([Fnet[6*i :6*i+3] for i in range(self.nFOWT)]) - RMSeMoment = np.linalg.norm([Fnet[6*i+3:6*i+6] for i in range(self.nFOWT)]) + + # Not sure if this makes sense in a general case with an arbitrary number of dofs + RMSeForce = np.linalg.norm([Fnet[fowt.nDOF*i :fowt.nDOF*i+3] for i in range(self.nFOWT)]) + RMSeMoment = np.linalg.norm([Fnet[fowt.nDOF*i+3:fowt.nDOF*i+6] for i in range(self.nFOWT)]) print(f"Iteration RMS force and moment errors: {RMSeForce:8.2e} {RMSeMoment:8.2e}") Y = Fnet @@ -691,24 +777,43 @@ def step_func_equil(X, args, Y, oths, Ytarget, err, tol_, iter, maxIter): K = np.zeros ([self.nDOF,self.nDOF]) # total stiffness matrix to be filled in # add array mooring system stiffness (if applicable) + # TODO: Will need to write this in the full dofs and then convert to the reduced dofs if self.ms: - Kmoor = self.ms.getCoupledStiffnessA(lines_only=True) + if self.nDOF != 6*self.nFOWT: + raise ValueError("Shared moorings does not work with flexible/multibody FOWTs yet. Please use rigid FOWTs with 6 DOFs each.") + + if self.moorMod == 0 or self.moorMod == 1: + Kmoor = self.ms.getCoupledStiffnessA(lines_only=True) + elif self.moorMod == 2: + self.ms.updateSystemDynamicMatrices() + _, _, _, Kmoor = self.ms.getCoupledDynamicMatrices(lines_only=True) + K += Kmoor # get stiffness of each fowt (hydrostatics, individual mooring, etc.) for i, fowt in enumerate(self.fowtList): - K6 = np.zeros([6,6]) + K_fowt = np.zeros([fowt.nDOF,fowt.nDOF]) - if statics_mod == 0: - K6 += K_hydrostatic[i] + if self.staticsMod == 0: + K_fowt += K_hydrostatic[i] else: - K6 += fowt.C_struc + fowt.C_hydro + K_fowt += fowt.C_struc + fowt.C_hydro + + # Elasticity due to flexible members + K_fowt += fowt.C_elast if fowt.ms: - K6 += fowt.ms.getCoupledStiffnessA(lines_only=True) + if fowt.ms: + fowt.ms.solveEquilibrium() + if fowt.moorMod == 0 or fowt.moorMod == 1: + Kmoor_fowt = fowt.ms.getCoupledStiffnessA(lines_only=True) + elif fowt.moorMod == 2: + fowt.ms.updateSystemDynamicMatrices() + _, _, _, Kmoor_fowt = fowt.ms.getCoupledDynamicMatrices(lines_only=True) + K_fowt[:6, :6] += translateMatrix6to6DOF(Kmoor_fowt, fowt.ms.bodyList[0].r6[:3] - fowt.nodeList[fowt.reducedDOF[0][0]].r[:3]) # TODO: lumping mooring stiffness into the first 6 DOFs for now + + K[fowt.nDOF*i:fowt.nDOF*(i+1), fowt.nDOF*i:fowt.nDOF*(i+1)] += K_fowt - K[6*i:6*i+6, 6*i:6*i+6] += K6 - # could get any stiffness effects from wakes or currents, though probably negligible # TODO: if there isn't any array-level stiffness coupling, could simply solve each fowt individually <<< @@ -780,8 +885,8 @@ def step_func_equil(X, args, Y, oths, Ytarget, err, tol_, iter, maxIter): tol=tols, a_max=1.6, maxIter=20, display=0, args={'display': display} ) #, dodamping=True) if display > 1: - RMSeForce = np.linalg.norm([Y[6*i :6*i+3] for i in range(self.nFOWT)]) - RMSeMoment = np.linalg.norm([Y[6*i+3:6*i+6] for i in range(self.nFOWT)]) + RMSeForce = np.linalg.norm([Y[fowt.nDOF*i :fowt.nDOF*i+3] for i in range(self.nFOWT)]) + RMSeMoment = np.linalg.norm([Y[fowt.nDOF*i+3:fowt.nDOF*i+6] for i in range(self.nFOWT)]) if RMSeForce > 1000 or RMSeMoment > 1000: print('Warning: RMS error of equilibrium forces or moments exceeds 1000.') @@ -796,9 +901,10 @@ def step_func_equil(X, args, Y, oths, Ytarget, err, tol_, iter, maxIter): self.results['mean_offsets'].append(self.Xs2[-1]) # save the final equilibrium position for this case for i, fowt in enumerate(self.fowtList): - print(f"Found mean offets of FOWT {i+1} with surge = {fowt.Xi0[0]: .2f} m, sway = {fowt.Xi0[1]: .2f}, and heave = {fowt.Xi0[2]: .2f} m") - print(f" roll = {fowt.Xi0[3]*180/np.pi: .2f} deg, pitch = {fowt.Xi0[4]*180/np.pi: .2f} deg, and yaw = {fowt.Xi0[5]*180/np.pi: .2f} deg") + print(f"Found mean offets of FOWT {i+1} with surge = {fowt.r6[0]-fowt.x_ref: .2f} m, sway = {fowt.r6[1]-fowt.y_ref: .2f}, and heave = {fowt.r6[2]: .2f} m") + print(f" roll = {fowt.r6[3]*180/np.pi: .2f} deg, pitch = {fowt.r6[4]*180/np.pi: .2f} deg, and yaw = {fowt.r6[5]*180/np.pi: .2f} deg") + # TODO: Shouldn't we call fowt.calcStatics() again to make sure that the inertia and stiffness matrices (C_hydro and C_struc) consider the displaced position? #dsolvePlot(info) # plot solver convergence trajectories @@ -860,6 +966,8 @@ def step_func_equil(X, args, Y, oths, Ytarget, err, tol_, iter, maxIter): def solveDynamics(self, case, tol=0.01, conv_plot=0, RAO_plot=0, display=0): '''After all constant parts have been computed, call this to iterate through remaining terms until convergence on dynamic response. Note that steady/mean quantities are excluded here. + + TODO: Need to properly account for moorings and second-order wave loads for fowts with more than 6 DOFs. ''' iCase = None @@ -882,10 +990,11 @@ def solveDynamics(self, case, tol=0.01, conv_plot=0, RAO_plot=0, display=0): # Loop through each fowt to calculate its independent response to wave excitation. # This is the iterative linearization stage to get individual impedance matrices. + XiLast_all = [] # list to store the last iteration's response for each turbine for i, fowt in enumerate(self.fowtList): - i1 = i*6 # range of DOFs for the current turbine - i2 = i*6+6 - + i1 = i*fowt.nDOF # range of DOFs for the current turbine + i2 = (i+1)*fowt.nDOF # TODO: Assuming all FOWTs have the same number of DOFs. Would need to make this more general for farms with distinct FOWTs + # total FOWT complex response amplitudes (this gets updated each iteration) XiLast = np.zeros([fowt.nDOF,self.nw], dtype=complex) + XiStart # displacement and rotation complex amplitudes [m, rad] @@ -904,8 +1013,25 @@ def solveDynamics(self, case, tol=0.01, conv_plot=0, RAO_plot=0, display=0): if display > 0: print('Solving for system response to wave excitation in primary wave direction') + # TODO: Need to iterate the dynamic matrices as well due to the drag force on the moorings + # We would need to pass the motions of the extremities of the mooring lines within getCoupledDynamicMatrices + # I think this would be straightforward for lines connecting the fairlead to the anchor, but not sure about cases with buoys + M_moor, A_moor, B_moor, C_moor = (np.zeros([fowt.nDOF, fowt.nDOF]) for _ in range(4)) + M_moor_6dof, A_moor_6dof, B_moor_6dof, C_moor_6dof = (np.zeros([6, 6]) for _ in range(4)) # Helper matrices + if not fowt.ms or fowt.moorMod == 0 or fowt.moorMod == 1: + C_moor = fowt.C_moor + elif fowt.moorMod == 2: + fowt.updateMooringDynamicMatrices(XiLast[:6], fowt.S[0,:]) + M_moor_6dof, A_moor_6dof, B_moor_6dof, C_moor_6dof = fowt.ms.getCoupledDynamicMatrices(lines_only=True) + + M_moor[:6,:6] = translateMatrix6to6DOF(M_moor_6dof, fowt.ms.bodyList[0].r6[:3] - fowt.nodeList[fowt.reducedDOF[0][0]].r[:3]) + A_moor[:6,:6] = translateMatrix6to6DOF(A_moor_6dof, fowt.ms.bodyList[0].r6[:3] - fowt.nodeList[fowt.reducedDOF[0][0]].r[:3]) + B_moor[:6,:6] = translateMatrix6to6DOF(B_moor_6dof, fowt.ms.bodyList[0].r6[:3] - fowt.nodeList[fowt.reducedDOF[0][0]].r[:3]) + C_moor[:6,:6] = translateMatrix6to6DOF(C_moor_6dof, fowt.ms.bodyList[0].r6[:3] - fowt.nodeList[fowt.reducedDOF[0][0]].r[:3]) + # We can compute second-order hydrodynamic forces here if they are calculated using external QTF file. # In some cases, they may be very relevant to the motion RMS values, so should be included in the drag linearization process. + # Lumping at the first 6dofs of the FOWT for now fowt.Fhydro_2nd = np.zeros([fowt.nWaves, fowt.nDOF, fowt.nw], dtype=complex) fowt.Fhydro_2nd_mean = np.zeros([fowt.nWaves, fowt.nDOF]) if fowt.potSecOrder==2: @@ -916,9 +1042,9 @@ def solveDynamics(self, case, tol=0.01, conv_plot=0, RAO_plot=0, display=0): flagComputedQTF = False # sum up all linear (non-varying) matrices up front, including potential summation across multiple rotors - M_lin.append( M_turb + fowt.M_struc[:,:,None] + fowt.A_BEM + fowt.A_hydro_morison[:,:,None] ) # mass - B_lin.append( B_turb + fowt.B_struc[:,:,None] + fowt.B_BEM + np.sum(fowt.B_gyro, axis=2)[:,:,None] ) # damping - C_lin.append( fowt.C_struc + fowt.C_moor + fowt.C_hydro ) # stiffness + M_lin.append( M_turb + fowt.M_struc[:,:,None] + fowt.A_BEM + fowt.A_hydro_morison[:,:,None] + M_moor[:,:,None] + A_moor[:,:,None] ) # mass + B_lin.append( B_turb + fowt.B_struc[:,:,None] + fowt.B_BEM + np.sum(fowt.B_gyro, axis=2)[:,:,None]) # damping + C_lin.append( fowt.C_struc + fowt.C_hydro + C_moor + fowt.C_elast) # stiffness F_lin.append( fowt.F_BEM[0,:,:] + fowt.F_hydro_iner[0,:,:] + fowt.Fhydro_2nd[0, :, :]) # consider only excitation from the primary sea state in the load case for now # start fixed point iteration loop for dynamics of the individual FOWT @@ -936,13 +1062,21 @@ def solveDynamics(self, case, tol=0.01, conv_plot=0, RAO_plot=0, display=0): # get linearized terms for the current turbine given latest amplitudes B_linearized = fowt.calcHydroLinearization(XiLast) F_linearized = fowt.calcDragExcitation(0) # just looking at first sea state (wave heading) for the sake of linearization - + + # Recompute mooring damping matrix as it depends on body motions (linearization of drag lods). The other matrices are kept the same. + # Note: Is it worth recomputing the mooring damping matrix at each step? The impact of mooring damping on body dynamics is small, and the motion + # RAOs are probably not changing much. Perhaps compute this only once and keep it constant? + if fowt.ms and fowt.moorMod == 2: + fowt.updateMooringDynamicMatrices(XiLast[:6, :], fowt.S[0,:]) + _, _, B_moor_6dof, _ = fowt.ms.getCoupledDynamicMatrices(lines_only=True) + B_moor[:6,:6] = translateMatrix6to6DOF(B_moor_6dof, fowt.ms.bodyList[0].r6[:3] - fowt.nodeList[fowt.reducedDOF[0][0]].r[:3]) + # calculate the response based on the latest linearized terms Xi = np.zeros([fowt.nDOF,self.nw], dtype=complex) # displacement and rotation complex amplitudes [m, rad] # add fowt's terms to system matrices (BEM arrays are not yet included here) M_tot[:,:,:] = M_lin[i] - B_tot[:,:,:] = B_lin[i] + B_linearized[:,:,None] + B_tot[:,:,:] = B_lin[i] + B_linearized[:,:,None] + B_moor[:,:,None] C_tot[:,:,:] = C_lin[i][:,:,None] F_tot[: ,:] = F_lin[i] + F_linearized @@ -983,7 +1117,7 @@ def solveDynamics(self, case, tol=0.01, conv_plot=0, RAO_plot=0, display=0): print(f"Resolving for system response in primary wave direction, now with second-order wave loads.") # Get the response amplitude operators (RAOs, i.e. motions for unit wave amplitude) - Xi0 = getRAO(Xi[i1:i2, :], fowt.zeta[0,:]) + Xi0 = getRAO(Xi[i1:i1+6, :], fowt.zeta[0,:]) tic = time.perf_counter() # Time the QTF calculation fowt.calcQTF_slenderBody(waveHeadInd=0, Xi0=Xi0, verbose=True, iCase=iCase, iWT=i) @@ -1019,6 +1153,7 @@ def solveDynamics(self, case, tol=0.01, conv_plot=0, RAO_plot=0, display=0): # Save the FOWT's impedance matrix fowt.Z = Z + XiLast_all.append(XiLast) # Now that invididual FOWT impedences matrices have been found, construct the # system-level matrices (in case of couplings) and compute the total response @@ -1030,13 +1165,21 @@ def solveDynamics(self, case, tol=0.01, conv_plot=0, RAO_plot=0, display=0): # include each FOWT's individual impedance matrix for i, fowt in enumerate(self.fowtList): - i1 = i*6 # range of DOFs for the current turbine - i2 = i*6+6 + i1 = i*fowt.nDOF # range of DOFs for the current turbine + i2 = (i+1)*fowt.nDOF Z_sys[i1:i2, i1:i2] += fowt.Z # include array-level mooring stiffness if self.ms: - Z_sys += self.ms.getCoupledStiffnessA(lines_only=True)[:,:,None] + M_moor, A_moor, B_moor, C_moor = (np.zeros([Z_sys.shape[0], Z_sys.shape[1]]) for _ in range(4)) + if self.moorMod == 0 or self.moorMod == 1: + C_moor = self.ms.getCoupledStiffnessA(lines_only=True) + elif self.moorMod == 2: + self.updateMooringDynamicMatrices(XiLast_all, self.fowtList[0].S[0,:]) + M_moor, A_moor, B_moor, C_moor = self.ms.getCoupledDynamicMatrices(lines_only=True) + + for ii in range(self.nw): + Z_sys[:,:,ii] += -self.w[ii]**2 *(M_moor+A_moor) + 1j*self.w[ii]*B_moor + C_moor # >>> For arrays, we would want a sparse solver for Zinv. <<< @@ -1059,7 +1202,7 @@ def solveDynamics(self, case, tol=0.01, conv_plot=0, RAO_plot=0, display=0): F_wave = np.zeros([self.nDOF, self.nw], dtype=complex) # system wave excitation vector for this wave for i, fowt in enumerate(self.fowtList): - i1, i2 = i*6, i*6+6 + i1, i2 = i*fowt.nDOF, (i+1)*fowt.nDOF # calculate linear and nonlinear wave excitation for this FOWT and case (consider phasing due to position in array) fowt.calcHydroExcitation(case, memberList=fowt.memberList) @@ -1076,19 +1219,22 @@ def solveDynamics(self, case, tol=0.01, conv_plot=0, RAO_plot=0, display=0): # If we are computing the QTFs internally, we need to consider the motions induced by first-order hydrodynamic forces, which were computed above # TODO: Not very nice to keep the same code twice. Maybe we can move it to a function? for i, fowt in enumerate(self.fowtList): - i1, i2 = i*6, i*6+6 + i1, i2 = i*fowt.nDOF, (i+1)*fowt.nDOF if fowt.potSecOrder == 1: # Don't recompute the QTFs for the first wave because it was already done above. # Also, we would end up including second-order motions if we computed it again. if ih > 0: - Xi0 = getRAO(self.Xi[ih,i1:i2, :], fowt.zeta[ih,:]) + Xi0 = getRAO(self.Xi[ih,i1:i1+6, :], fowt.zeta[ih,:]) fowt.calcQTF_slenderBody(waveHeadInd=ih, Xi0=Xi0, verbose=True, iCase=iCase, iWT=i) - fowt.Fhydro_2nd_mean[ih, :], fowt.Fhydro_2nd[ih, :, :] = fowt.calcHydroForce_2ndOrd(fowt.beta[ih], fowt.S[ih,:]) + fowt.F_hydro_2nd_mean, fowt.Fhydro_2nd = fowt.calcHydroForce_2ndOrd(fowt.beta[ih], fowt.S[ih,:]) # Recompute the wave excitation forces and consequent motions to include second-order hydrodynamic forces F_wave[i1:i2] = fowt.F_BEM[ih,:,:] + fowt.F_hydro_iner[ih,:,:] + F_linearized + fowt.Fhydro_2nd[ih, :, :] - for iw in range(self.nw): - self.Xi[ih,:,iw] = np.matmul(Zinv[:,:,iw], F_wave[:,iw]) + + # recompute system response + for iw in range(self.nw): + self.Xi[ih,:,iw] = np.matmul(Zinv[:,:,iw], F_wave[:,iw]) + # TODO: compute joint loads based on the system of equations in the full dofs # rotor excitation ''' @@ -1101,10 +1247,12 @@ def solveDynamics(self, case, tol=0.01, conv_plot=0, RAO_plot=0, display=0): self.Xi[-1,:,iw] = np.matmul(Zinv[:,:,iw], F_rotor[:,iw]) ''' - # store all the results in the FOWT object + # store all the results in the FOWT object for i, fowt in enumerate(self.fowtList): - fowt.Xi = self.Xi[:, i*6:i*6+6, :] # this overwrites the response in the FOWT with what's been calculated - + fowt.Xi = self.Xi[:, i*fowt.nDOF:(i+1)*fowt.nDOF, :] # this overwrites the response in the FOWT with what's been calculated + fowt.Xi_fullDOF = np.zeros([fowt.nWaves+1, fowt.nFullDOF, self.nw], dtype=complex) # full DOF response + for ih in range(fowt.nWaves+1): + fowt.Xi_fullDOF[ih, :, :] = fowt.T @ fowt.Xi[ih, :, :] # convert to full DOF response # ------------------------------ preliminary plotting of response --------------------------------- @@ -1154,6 +1302,19 @@ def solveDynamics(self, case, tol=0.01, conv_plot=0, RAO_plot=0, display=0): return self.Xi # is it better to return the response or save it in the model object? Or in the FOWT objects? <<< + def updateMooringDynamicMatrices(self, Xi, S): + '''Update matrices from mooring dynamics + Inputs + Xi: List with nFOWTs arrays, each with size 6 x nFreq arrays, corresponding to the motion amplitudes of the fowts in the array [m] and [rad] + S: Wave spectrum vector with length nw [m] + ''' + from raft.helpers import getLineEndsRAO + rBody = [f.r6[:3] for f in self.fowtList] # List of mean position of the FOWTs + + for il, line in enumerate(self.ms.lineList): + RAO_A, RAO_B = getLineEndsRAO(line, self.ms, self.w, Xi, S, rBody) + line.updateLumpedMass(self.w, S, self.depth, kbot=0, cbot=0, RAO_A=RAO_A.T, RAO_B=RAO_B.T) # Need to transpose RAO_fl so that it is in the right shape (nFreq x 3) + def calcOutputs(self): '''This is where various output quantities of interest are calculated based on the already-solved system response.''' @@ -1182,7 +1343,7 @@ def calcOutputs(self): self.results['properties']['buoyancy (pgV)'] = fowt.rho_water*fowt.g*fowt.V self.results['properties']['center of buoyancy'] = fowt.rCB self.results['properties']['C hydrostatic'] = fowt.C_hydro - self.results['properties']['C system'] = fowt.C_struc + fowt.C_hydro + self.C_moor0 + self.results['properties']['C system'] = fowt.C_struc + fowt.C_hydro + self.C_moor0 + fowt.C_elast # unloaded equilibrium <<< @@ -1238,36 +1399,66 @@ def plotResponses(self): def saveResponses(self, outPath): '''Save the power spectral densities of the available response channels for each case to an output file.''' + # Perhaps easier to save everything to a pickle file? - chooseMetrics = ['wave_PSD', 'surge_PSD', 'heave_PSD', 'pitch_PSD', 'AxRNA_PSD', 'Mbase_PSD'] - metricUnit = ['m^2/Hz', 'm^2/Hz', 'm^2/Hz', 'deg^2/Hz', '(m/s^2)^2/Hz', '(Nm)^2/Hz'] + chooseMetrics = ['wave_PSD', 'surge_PSD', 'heave_PSD', 'pitch_PSD', 'AxRNA_PSD', 'Tmoor_PSD'] + metricUnit = ['m^2*s/rad', 'm^2*s/rad', 'm^2*s/rad', 'deg^2*s/rad', '(m/s^2)^2*s/rad', 'N^2*s/rad'] for i in range(self.nFOWT): - nCases = len(self.results['case_metrics']) - for iCase in range(nCases): metrics = self.results['case_metrics'][iCase][i] + if 'Tmoor_PSD' in metrics: + nLinesTensions = metrics['Tmoor_PSD'].shape[0] with open(f'{outPath}_Case{iCase+1}_WT{i}.txt', 'w') as file: # Write the header - file.write('Frequency [rad/s] \t') + header = 'Frequency [rad/s]' for metric, unit in zip(chooseMetrics, metricUnit): - file.write(f'{metric} [{unit}] \t') - file.write('\n') + if metric not in metrics: + continue + + if metric == 'Tmoor_PSD': + for iLine in range(nLinesTensions): + header += f'\t{metric}_{iLine} [{unit}]' + else: + header += f'\t {metric} [{unit}]' + file.write(f'{header}\n') # Write the data for iFreq in range(len(self.w)): - file.write(f'{self.w[iFreq]:.5f} \t') + txt = f'{self.w[iFreq]:.5f}' for metric in chooseMetrics: - file.write(f'{np.squeeze(metrics[metric][iFreq]):.5f} \t') - file.write('\n') + if metric not in metrics: + continue + + if metric == 'Tmoor_PSD': + for iLine in range(nLinesTensions): + txt += f'\t{np.squeeze(metrics[metric][iLine, iFreq]):.5f}' + else: + txt += f'\t{np.squeeze(metrics[metric][iFreq]):.5f}' + file.write(f'{txt}\n') # if self.results['mean_offsets']: # with open(f'{outPath}_Case{iCase+1}_WT{i}_meanOffsets.txt', 'w') as file: # file.write('Surge [m] \t Sway [m] \t Heave [m] \t Pitch [deg] \t Roll [deg] \t Yaw [deg] \n') # mean_offsets = self.results['mean_offsets'][iCase] # file.write(f'{mean_offsets[0]:.5f} \t {mean_offsets[1]:.5f} \t {mean_offsets[2]:.5f} \t {mean_offsets[3]:.5f} \t {mean_offsets[4]:.5f} \t {mean_offsets[5]:.5f} \n') + + # Save array tension as well + for iCase in range(nCases): + if 'array_mooring' in self.results['case_metrics'][iCase] and 'Tmoor_PSD' in self.results['case_metrics'][iCase]['array_mooring']: + nLinesTensions = self.results["case_metrics"][iCase]["array_mooring"]["Tmoor_PSD"].shape[0] + with open(f'{outPath}_Case{iCase+1}_array_tensions.txt', 'w') as file: + header = 'Frequency [rad/s]' + for iLine in range(nLinesTensions): + header += f'\tTmoor_PSD_{iLine} [N^2*s/rad]' + file.write(header + '\n') + for iFreq in range(len(self.w)): + file.write(f'{self.w[iFreq]:.5f}') + for iLine in range(nLinesTensions): + file.write(f'\t {np.squeeze(self.results["case_metrics"][iCase]["array_mooring"]["Tmoor_PSD"][iLine, iFreq]):.5f}') + file.write('\n') def plotResponses_extended(self): '''Plots more power spectral densities of the available response channels for each case.''' @@ -1341,7 +1532,7 @@ def preprocess_HAMS(self, dw=0, wMax=0, dz=0, da=0): def plot(self, ax=None, hideGrid=False, draw_body=True, color=None, nodes=0, xbounds=None, ybounds=None, zbounds=None, plot_rotor=True, airfoils=False, station_plot=[], zorder=2, figsize=(6,4), plot_fowt=True, plot_ms=True, - shadow=True, plot_water=False, plot_soil=False, mp_args={}): + shadow=True, plot_water=False, plot_soil=False, mp_args={}, plot_frame=False, frame_opts={}): '''plots the whole model, including FOWTs and mooring system mp_args @@ -1371,13 +1562,13 @@ def plot(self, ax=None, hideGrid=False, draw_body=True, color=None, nodes=0, fig = ax.get_figure() if self.ms: self.ms.plot(ax=ax, **mp_args2) - + # plot each FOWT for fowt in self.fowtList: fowt.plot(ax, color=color, zorder=zorder, nodes=nodes, plot_rotor=plot_rotor, station_plot=station_plot, - airfoils=airfoils, plot_ms=plot_ms, plot_fowt=plot_fowt, shadow=shadow, mp_args=mp_args) - + airfoils=airfoils, plot_ms=plot_ms, plot_fowt=plot_fowt, shadow=shadow, plot_frame=plot_frame, mp_args=mp_args, frame_opts=frame_opts) + set_axes_equal(ax) if hideGrid: @@ -1728,7 +1919,7 @@ def powerThrustCurve(self,nfowt, nrotor, uhubs, heading, yaw, plot = False ): # Not sure how the pitch angle should be handled if wind comes at angle..... ### NOTE: this CCBlade print statement comes after the mean offset printouts - loads, derivs = self.fowtList[nfowt].rotorList[nrotor].runCCBlade(uhub, ptfm_pitch=turbine_tilt, ) + loads, derivs = self.fowtList[nfowt].rotorList[nrotor].runCCBlade(uhub, tilt=turbine_tilt, ) cp.append(loads["CP"][0]) ct.append(loads["CT"][0]) pitch.append(rad2deg(self.fowtList[nfowt].Xi0[4])) @@ -1781,15 +1972,15 @@ def florisCoupling(self, config, turbconfig, path ): Path to turbine library of yaml files ''' - from floris.tools import FlorisInterface + from floris import FlorisModel # Setup FLORIS interface using base yaml file - self.fi = FlorisInterface(config) + self.fi = FlorisModel(config) # Update floris interface settings to match RAFT design - self.fi.reinitialize(air_density = self.design["site"]["rho_air"], wind_shear = self.design["site"]["shearExp"]) + self.fi.set(air_density = self.design["site"]["rho_air"], wind_shear = self.design["site"]["shearExp"]) fowtInfo = [dict(zip( self.design['array']['keys'], row)) for row in self.design['array']['data']] - self.fi.reinitialize(layout_x=[fowtInfo[j]["x_location"] for j in range(0,len(fowtInfo))], layout_y=[fowtInfo[j]["y_location"] for j in range(0,len(fowtInfo))]) + self.fi.set(layout_x=[fowtInfo[j]["x_location"] for j in range(0,len(fowtInfo))], layout_y=[fowtInfo[j]["y_location"] for j in range(0,len(fowtInfo))]) # create new turbine yaml file for each turbine with a unique turbine, platform, mooring, or heading adjustment # this is because these effect the pitch of the platform in the power-thrust curve @@ -1822,13 +2013,13 @@ def florisCoupling(self, config, turbconfig, path ): #Find turbine ID and use yaml file associated with that ID as basis turbData['hub_height'] = self.design["turbines"][turbID - 1]["hHub"] turbData['rotor_diameter'] = self.design["turbines"][turbID - 1]["blade"][0]["Rtip"]*2 # Check this (takes the rotor radius from first blade) - turbData['ref_density_cp_ct'] = self.design["site"]["rho_air"] + turbData['power_thrust_table']['ref_air_density'] = self.design["site"]["rho_air"] #RAFT may want to name the turbines turbData['turbine_type'] ='turb'+str(ID)+'_floating' #Cp and Ct curves already incorporate the floating tilt... so FLORIS can ignore - turbData['floating_correct_cp_ct_for_tilt'] = False + turbData['correct_cp_ct_for_tilt'] = False #set up list of hub velocities to match floris uhubs=list(np.arange(3,25,0.5)) @@ -1841,7 +2032,7 @@ def florisCoupling(self, config, turbconfig, path ): #In reality, the mooring system stiffness would slightly change the Cp curve based on heading (because the pitch angle would change) power, thrust, pitch = self.powerThrustCurve(i, 0, uhubs, 0, yaw = 0, plot = False) turbData['power_thrust_table']['power'] = np.array(power).tolist() - turbData['power_thrust_table']['thrust'] = np.array(thrust).tolist() + turbData['power_thrust_table']['thrust_coefficient'] = np.array(thrust).tolist() turbData['power_thrust_table']['wind_speed'] = np.array(uhubs).tolist() print('len winds ', len(uhubs)) @@ -1849,7 +2040,7 @@ def florisCoupling(self, config, turbconfig, path ): #Set floating tilt table only for use in Empirical Gaussian wake model (wake deflection for pitch angle) - turbData['floating_tilt_table']['wind_speeds'] = np.array(uhubs).tolist() # match roughly the wind speeds in example files + turbData['floating_tilt_table']['wind_speed'] = np.array(uhubs).tolist() # match roughly the wind speeds in example files turbData['floating_tilt_table']['tilt'] = np.array(pitch).tolist() with open(path+'\\'+'turb'+str(ID)+'.yaml', 'w') as file: @@ -1857,7 +2048,7 @@ def florisCoupling(self, config, turbconfig, path ): turblist.append('turb'+str(ID)+'.yaml') #reinitialize floris interface with updated turbine yaml files - self.fi.reinitialize(turbine_type= turblist, turbine_library_path= path) + self.fi.set(turbine_type= turblist, turbine_library_path= path) self.turblist = turblist @@ -1870,8 +2061,8 @@ def florisFindEquilibrium(self, case, cutin, plotting = True, ax = None): #FLORIS inputs the wind direction as direction wind is coming from (where the -X axis is 0) - self.fi.reinitialize(wind_directions = [-case['wind_heading']+270], wind_speeds = [case['wind_speed']], turbulence_intensity= case['turbulence']) - yaw_angles = np.ones([1,1,self.nFOWT]) + self.fi.set(wind_directions = [-case['wind_heading']+270], wind_speeds = [case['wind_speed']], turbulence_intensities= np.array([case['turbulence']])) + yaw_angles = np.zeros([1,self.nFOWT]) #calc yaw misalignment to input into FLORIS @@ -1903,7 +2094,7 @@ def florisFindEquilibrium(self, case, cutin, plotting = True, ax = None): # inflow misalignment heading relative to turbine heading [deg] yaw_misalign = turbine_heading - np.radians(heading) - yaw_angles[0,0,nfowt] = np.degrees(yaw_misalign) + yaw_angles[0,nfowt] = np.degrees(yaw_misalign) print('Yaw misalignment angles: ', yaw_angles) @@ -1924,31 +2115,32 @@ def florisFindEquilibrium(self, case, cutin, plotting = True, ax = None): if n > 0: xnew = [0.9*(self.fowtList[nfowt].Xi0[0] + fowtInfo[nfowt]["x_location"]) + 0.1*xpositions[-1][nfowt] for nfowt in range(len(self.fowtList))] ynew = [0.9*(self.fowtList[nfowt].Xi0[1] + fowtInfo[nfowt]["y_location"]) + 0.1*ypositions[-1][nfowt] for nfowt in range(len(self.fowtList))] - self.fi.reinitialize(layout_x=xnew, layout_y=ynew) + self.fi.set(layout_x=xnew, layout_y=ynew) else: xnew = [self.fowtList[nfowt].Xi0[0] + fowtInfo[nfowt]["x_location"] for nfowt in range(len(self.fowtList))] ynew = [self.fowtList[nfowt].Xi0[1] + fowtInfo[nfowt]["y_location"] for nfowt in range(len(self.fowtList))] - self.fi.reinitialize(layout_x=xnew, layout_y=ynew) - self.fi.calculate_wake(yaw_angles=yaw_angles) + self.fi.set(layout_x=xnew, layout_y=ynew) + self.fi.set(yaw_angles=yaw_angles) + self.fi.run() print('Turbine avg vels ', self.fi.turbine_average_velocities[0][0]) - print('Turbine eff vels ', self.fi.turbine_effective_velocities[0][0]) + #update wind speed list for RAFT - case['wind_speed'] = list(self.fi.turbine_average_velocities[0][0]) - winds.append(self.fi.turbine_average_velocities[0][0]) + case['wind_speed'] = list(self.fi.turbine_average_velocities[0]) + winds.append(self.fi.turbine_average_velocities[0]) xpositions.append(xnew) ypositions.append(ynew) #return FLORIS turbine powers (in order of turbine list) - if min(self.fi.turbine_effective_velocities[0][0] > cutin): - powers.append(self.fi.get_turbine_powers()[0][0]) + if min(self.fi.turbine_average_velocities[0] > cutin): + powers.append(self.fi.get_turbine_powers()[0]) else: powers.append([0]) if n > 1: - if min(self.fi.turbine_effective_velocities[0][0] > cutin): + if min(self.fi.turbine_average_velocities[0] > cutin): #check if turbine powers from recent iteration and previous iteration are within 10 W, and if so break if max([np.abs(powers[-1][i] - powers[-2][i]) for i in range(0, len(powers[-1]))]) < 10: @@ -1966,32 +2158,51 @@ def florisFindEquilibrium(self, case, cutin, plotting = True, ax = None): if plotting: - import floris.tools.visualization as wakeviz - horizontal_plane = self.fi.calculate_horizontal_plane( + + if ax == None: + fig, ax = plt.subplots(1, 1, figsize=(10, 8)) + + import floris.layout_visualization as layoutviz + from floris.flow_visualization import visualize_cut_plane + + fmodel = self.fi + self.fi.set(yaw_angles=yaw_angles) + + + # Create the plotting objects using matplotlib + fig, ax = plt.subplots() + + + layoutviz.plot_turbine_points(fmodel, ax=ax) + layoutviz.plot_turbine_labels(fmodel, ax=ax) + ax.set_title("Turbine Points and Labels") + ax.set_xlabel('X (m)') + ax.set_ylabel('Y (m)') + + + + #fmodel.set(wind_directions = [-case['wind_heading']+270], wind_speeds = [case['wind_speed']], turbulence_intensities= np.array([case['turbulence']])) + horizontal_plane = fmodel.calculate_horizontal_plane( x_resolution=200, y_resolution=100, height=90.0, - yaw_angles=yaw_angles, - ) - - y_plane = self.fi.calculate_y_plane( - x_resolution=200, - z_resolution=100, - crossstream_dist=0.0, - yaw_angles=yaw_angles, ) - cross_plane = self.fi.calculate_cross_plane( - y_resolution=100, - z_resolution=100, - downstream_dist=630.0, - yaw_angles=yaw_angles, + + # Plot the flow field with rotors + fig, ax = plt.subplots() + visualize_cut_plane( + horizontal_plane, + ax=ax, + label_contours=False, + title="Horizontal Flow with Turbine Rotors and labels", ) - - # Create the plots - if ax == None: - fig, ax = plt.subplots(1, 1, figsize=(10, 8)) - #ax_list = ax_list.flatten() - wakeviz.visualize_cut_plane(horizontal_plane, ax=ax) + ax.set_xlabel('X (m)') + ax.set_ylabel('Y (m)') + + # Plot the turbine rotors + layoutviz.plot_turbine_rotors(fmodel, ax=ax) + + plt.show() self.plot2d(Yuvec = [0, 1, 0], ax = ax) cmap = plt.cm.get_cmap('viridis_r') diff --git a/raft/raft_node.py b/raft/raft_node.py new file mode 100644 index 00000000..a8ad7269 --- /dev/null +++ b/raft/raft_node.py @@ -0,0 +1,340 @@ +# RAFT's node class + +import numpy as np +import matplotlib.pyplot as plt +from raft.helpers import getH + +class Node: + ''' This class is used to represent nodes in the FOWT, which are responsible for describing the motions of the structure.''' + + def __init__(self, node_id, r0, nw, member=None, end_node=True): + ''' + Initialize a Node object. + + PARAMETERS + ---------- + node_id : int + Unique identifier for the node. + r0 : float array + If 3-component array, this is the position of the node wrt to the platform reference point (PRP). + If 6-component array, this is the position of the node wrt to the PRP, and the initial attitude (roll, pitch, yaw). + member : Member object, optional + Reference to the member that this node belongs to. Not all nodes are part of a member, e.g. nodes that are part of a rigid link will have this set to None. + end_node : bool, optional + True if this is an end node of a member, False if this is an internal node of a flexible member. Default is True. + ''' + self.id = node_id + self.nTransDOF = 3 # Number of translation dofs per node + self.nRotDOF = 3 # Number of rotational dofs + self.nDOF = self.nTransDOF + self.nRotDOF # Total number of dofs per node + self.member = member # Reference to the member that this node belongs to. If part of a rigid link, this will be None once we start using RAFT members + + # Node position + attitude of the node relative to PRP [m, rad] + if len(r0) == 3: + self.r0 = np.hstack((r0, np.zeros(self.nRotDOF))) + elif len(r0) == 6: + self.r0 = r0.copy() + else: + raise Exception(f"Node {node_id} position must be a 3- or 6-component vector, but got {len(r0)} components instead.") + + self.r = self.r0.copy() # Current position and attitude of the node in the global reference frame (current wrp to PRP but updated when updating the FOWT's position) + self.Xi0 = np.zeros(self.nDOF) # mean offsets of the node from its reference point [m, rad] + self.end_node = end_node # True if this is an end node of a member, False if this is an internal node of a flexible member + + # Things with `None` will be assigned later + self.nodeList = None # Reference to the list of nodes in the structure. Assigned when initializing the Structure object. + self.T = None # Transformation matrix that relates the 6 dofs of this node to the reduced dofs of the STRUCTURE (rows of structure.T that correspond to this node) + self.parentNode_id = None # ID of the parent node. Assigned when attaching this node to another node. + self.reducedDOF = None # Reduced DoFs that are needed to describe this node. This is a subset of the reduced dofs of the whole structure. List of lists with two elements: [node_id, dof_id]. E.g., [[3, 5]] is the rotation around z of node with id equal to 3. + self.T_aux = None # Subset of the transformation matrix T. T_aux relates the 6 dofs of this node to a subset of the reduced dofs required to describe this node only. + # self.Xi = None # complex response amplitudes as a function of frequency [m, rad] + + self.joint_id = None + self.joint_type = None + self.rigid_link_id = None + + def getRigidConnectedNode(self): + ''' + If this node is part of a rigid link, returns the other node that is part of the rigid link. + ''' + # Does not apply if node is not part of a rigid link + if self.rigid_link_id is None: + return None + + # Checking if two nodes: 1. Are part of the same rigid link, and 2. Have different ids + rigidConnectedNode = [n for n in self.nodeList if (n.rigid_link_id == self.rigid_link_id and n.id != self.id)] + if len(rigidConnectedNode) != 1: + raise Exception(f"Node {self.id} rigidly connected to {len(rigidConnectedNode)} nodes, but rigidly links can contain only two nodes.") + return rigidConnectedNode[0] + + def getNodesConnectedByJoint(self): + ''' + Returns a list of nodes that are connected to this Node object by a joint. + This Node object needs to have a reference to the list of nodes in the structure (self.nodeList). + ''' + if self.joint_id is None: + return [] + return [n for n in self.nodeList if (n.joint_id == self.joint_id and n.id != self.id)] + + def attachToNode(self, node, rigid_link=False): + ''' + Attach this node to another node. This is done by assigning + > `self.reducedDOF`: the set of reduced dofs needed to describe the motions of this node. A subset of the reduced dofs of the whole structure + > `self.T_aux`: transformation matrix, with nDOF rows and len(self.reducedDOF) columns, that relates the reduced dofs of this node to the full dofs. A subset of the transformation matrix T of the whole structure + > `self.parentNode_id`: ID of the node to which this node is attached + based on the reduced dofs of the other node and the joint type. + + PARAMETERS + ---------- + node : Node object + The node to which this node will be attached, i.e., the node whose dofs will be copied to self based on the joint type. + rigid_link : bool, optional + If True, this node will be attached to the other node using a rigid link. + If False, it will be attached using self.joint_type that was previously assigned to this node. + ''' + # Only end nodes can be attached to other nodes using joints or rigid links + if not self.end_node: + return + + # Check if self is not the parent of the node to which we are trying to attach + if node.parentNode_id == self.id: + return + + dofs2assign = node.reducedDOF.copy() # `node.reducedDOF` is a subset of the reducedDOF of the structure (just the dofs that describe the motions of `node`) + T2assign = node.T_aux.copy() # `T_aux` is a subset of `self.T`, corresponding to the reducedDoFs needed to describe this node only + + if rigid_link: + joint_type = "rigid_link" + else: + joint_type = self.joint_type + if joint_type is None: + raise Exception(f"Node {self.id} has no joint assigned. Cannot attach to another node.") + + if joint_type == "rigid_link": + # The rigid link imposes that the nodes move as a rigid body. This corresponds to a linear transformation where + # > both nodes have the same rotation, + # > the translation of one node is equal to the translation of the other node + the cross product of the rotation and the distance vector between the two nodes + rotation = node.T_aux[self.nTransDOF:self.nDOF, :] # 'rotation' that corresponds to the rotations written in the reduced dofs + T2assign[:self.nTransDOF, :] += getH(self.r - node.r) @ rotation + + # If ball joint, this node starts with the same reduced dofs as the input node + its own rotation + # We remove some dofs if their columns are zero in the transformation matrix + elif joint_type == "ball" or joint_type == "universal": + T2assign = np.hstack((T2assign, np.zeros((T2assign.shape[0], self.nRotDOF)))) # Add columns that correspond to the rotation of this node + T2assign[self.nTransDOF:self.nDOF,:] = 0 # Make the rotation of this node independent of previous rotations + for idof in range(self.nTransDOF, self.nDOF): + dofs2assign += [[self.id, idof]] # Rotation around dof i + T2assign[idof, dofs2assign.index([self.id, idof])] = 1 + + + # Remove columns with zeros. Need to remove the corresponding dof from the list as well + for i in range(T2assign.shape[1]-1, -1, -1): # Iterate starting from the last column and going to the first column index (inclusive) + if np.all(T2assign[:, i] == 0): + T2assign = np.delete(T2assign, i, axis=1) + dofs2assign.pop(i) + + # If cantilever, self has the same dofs as the input node and the same transformation matrix, + # so we were done already when we did `dofs2assign = node.reducedDOF.copy()` and `T2assign = node.T_aux.copy()` + # Leaving this `pass` here to make it clear that we are not doing anything else. + elif joint_type == 'cantilever': + pass + + # Sort dofs2assign based on node ID first and then by dof + sorted_indices = sorted(range(len(dofs2assign)), key=lambda i: (dofs2assign[i][0], dofs2assign[i][1])) + dofs2assign = [dofs2assign[i] for i in sorted_indices] + T2assign = T2assign[:, sorted_indices] + + # For rigidly linked nodes, the rotation of one node is equal to the rotation of the other node. + # We always keep the rotation of the node with the smallest ID to avoid the same dof appearing twice under different "names". + for idof, dof in enumerate(dofs2assign): + eqDof = self.findEquivalentDof(dof) + if (eqDof is not None) and (eqDof[0] <= dof[0]): + dofs2assign[idof] = eqDof + + # If `self` did not have reduced dofs assigned yet, we can simply assign the dofs determined above + if self.reducedDOF is None: + self.reducedDOF = dofs2assign.copy() + self.T_aux = T2assign.copy() + self.parentNode_id = node.id + return + + # THE CODE BELOW IS FOR CLOSED KINEMATIC LOOPS. + # I do not trust this part of the code. I did some tests with a simple 2D code and it seems to work, but do not rely on it before it is properly tested + # For now, it's best to avoid closed kinematic loops, for example using flexible elements. + # + # If the node already had reduced dofs assigned (when we have a closed kinematic loop), we need to ensure compatibility with the dofs that we are trying to assign. + if dofs2assign != self.reducedDOF: + # The incompatibility is between two sets of reduced dofs. We need to know which set has more dofs than the other. + # It doesn't matter which set is longer (if the one already assined or the one that we're trying to assing), + # we just need to distinguish between the long list and the short list of dofs + if len(dofs2assign) >= len(self.reducedDOF): + longListDofs, shortListDofs = dofs2assign.copy(), self.reducedDOF.copy() + T_long, T_short = T2assign.copy(), self.T_aux.copy() + else: + longListDofs, shortListDofs = self.reducedDOF.copy(), dofs2assign.copy() + T_long, T_short = self.T_aux.copy(), T2assign.copy() + + # In the end, we want to keep the short list of dofs. + # The other dofs are redundant and will be removed below. + self.reducedDOF = shortListDofs.copy() + self.T_aux = T_short.copy() + + # The long list of dofs (or redundant list) can be written as a linear combination of the short list of dofs, + # i.e. T_long = compatMatrix @ T_short + # We want to compute the compatibility matrix compatMatrix + compatMatrix = np.zeros((T_long.shape[0], T_short.shape[1])) + commonDOF = [d for d in shortListDofs if d in longListDofs] # Get the indices of the dofs that are in both lists. These will be assigned 1 in the compatibility matrix + + # Get the part of the short matrix that is not repeated in the long matrix - the rest is filled with zeros + T_short_noCommon = np.zeros(T_short.shape) + for i, dof in enumerate(shortListDofs): + if (dof not in commonDOF): + T_short_noCommon[:, i] = T_short[:, i].copy() + else: # The dof can be in both but with a different column in the T matrix (i.e. different contribution to the dofs of the node) + i_long = longListDofs.index(dof) + if not np.all(T_long[:, i_long] == T_short[:, i]): + T_short_noCommon[:, i] = T_short[:, i].copy() + + # Same for the long matrix + T_long_noCommon = np.zeros(T_long.shape) + for i, dof in enumerate(longListDofs): + if (dof not in commonDOF): + T_long_noCommon[:, i] = T_long[:, i].copy() + else: # The dof can be in both but with a different column in the T matrix (i.e. different contribution to the dofs of the node) + i_short = shortListDofs.index(dof) + if not np.all(T_short[:, i_short] == T_long[:, i]): + T_long_noCommon[:, i] = T_long[:, i].copy() + + # Solve the linear system for the parts of the compatibility matrix that are not directly related to each other + try: + T_long_noCommon_inv = np.linalg.inv(T_long_noCommon) + except np.linalg.LinAlgError: + T_long_noCommon_inv = np.linalg.pinv(T_long_noCommon) + compatMatrix = T_long_noCommon_inv@T_short_noCommon + + # Fill with 1 the parts that are directly related to each other but only if they were not filled before + for irow, dof in enumerate(longListDofs): + if dof in commonDOF: + icol = shortListDofs.index(dof) + compatMatrix[irow, icol] = 1 if compatMatrix[irow, icol] == 0 else compatMatrix[irow, icol] + + + # Loop all nodes to ensure compatibility + # Basically, we loop the dofs of longListDofs and replace them in the reduced list of dofs + # by the linear combination of the dofs of shortListDofs + for n in self.nodeList: + if n.reducedDOF is not None: # Only if reduced dofs were already assigned + for irowIn, dofLong in enumerate(longListDofs): # Loop through the dofs of the long list + if dofLong in n.reducedDOF: # Only need to do something if this dof is part of the reduced dofs of the node + icolOut = n.reducedDOF.index(dofLong) # Index of the dof in the reduced dofs of the node n + col2multiply = n.T_aux[:, icolOut].copy() # Column of the transformation matrix that corresponds to this dof + n.T_aux[:, icolOut] = 0 # Clear the column to fill it with the linear combination of the dofs of the short list + + # Loop through the dofs of the short list + for icolIn, dofShort in enumerate(shortListDofs): + if dofShort not in n.reducedDOF: + n.reducedDOF.append(dofShort) + n.T_aux = np.hstack((n.T_aux, np.zeros((n.T_aux.shape[0], 1)))) + iColOut = n.reducedDOF.index(dofShort) # Index of the dof in the reduced dofs of the node n + for irowOut in range(n.T_aux.shape[0]): + # n.T_aux[:, iColOut] = T_short[:, icolIn] + compatMatrix[irowIn, icolIn] * T_long[:, icolOut] + n.T_aux[irowOut, iColOut] += compatMatrix[irowIn, icolIn] * col2multiply[irowOut] + + # Remove columns with zeros. Need to remove the corresponding dof from the list as well + for i in range(n.T_aux.shape[1]-1, -1, -1): # Iterate starting from the last column and going to the first column index (inclusive) + if np.all(n.T_aux[:, i] == 0): + n.T_aux = np.delete(n.T_aux, i, axis=1) + n.reducedDOF.pop(i) + + def findEquivalentDof(self, dof): + # TODO: I don't think we need this anymore. After we have a nice set of tests, remove this function to see if things change. + # Equivalent dofs happen for rigid links, where the rotation of one node is equal to the rotation of the other node + eqDof = None + + if dof[1] == 3 or dof[1] == 4 or dof[1] == 5: # Can only happen for rotation + nID = dof[0] # ID of the node corresponding to the input dof + n = [n for n in self.nodeList if n.id == nID][0] # Find the node itself + rigidConnectedNode = n.getRigidConnectedNode() + if rigidConnectedNode is not None: + eqDof = [rigidConnectedNode.id, dof[1]] + return eqDof + + def setT(self, reducedDoFs_structure): + ''' + Set the transformation matrix T that relates the nDOF dofs of this node to the + reduced set of dofs of the whole FOWT to which this node belongs, self.T + + PARAMETERS + ---------- + reducedDoFs_structure : list of lists + Reduced dofs of the whole structure. It has the same format as self.reducedDOF, a list of lists where each sublist has two elements: node ID and dof ID. + ''' + # Based on the dofs of this node and the matrix T_aux, we can fill the transformation matrix T + # that relates the full dofs of this node (rows of matrix T) to the reduced dofs of the structure (columns of matrix T). + # Difference between T and T_aux: + # - T has a number of columns that corresponds to the list of reduced dofs of the STRUCTURE + # - T_aux has a number of columns that corresponds to the list of reduced dofs of this node + if self.T is None: + self.T = np.zeros((self.T_aux.shape[0], len(reducedDoFs_structure))) + for i in range(self.T_aux.shape[0]): # Loop through rows + # The row in T is the same row in T_aux, as both correspond to the full dofs + # of the node (0: x, 1: y, 2: z, 3: rotation around x, 4: rotation around y, 5: rotation around z) + for j in range(self.T_aux.shape[1]): # Loop through columns + # The index j corresponds to the list of reduced dofs stored in self.reducedDOF. + # self.reducedDOF is a subset of the reduced dofs of the whole structure, so we + # need to know the index of this dof in the list of reduced dofs of the structure + try: + col = reducedDoFs_structure.index(self.reducedDOF[j]) + self.T[i, col] = self.T_aux[i, j] + except ValueError: + raise Exception(f"Node {self.id} has a dof that is not part of the reduced dofs of the structure. Why???") + + def setDisplacementLinear(self, reducedDisp_structure): + ''' + Compute node displacements using the linear transformation, self.T + + PARAMETERS + ---------- + reducedDisp_structure: vector with nReducedDisp components + Reduced displacements of the whole structure written in the reduced set of dofs of the structure. + ''' + if self.T is None: + raise Exception("Transformation matrix T is not set yet. Call setT() before calling setDisplacementLinear().") + self.Xi0 = self.T @ reducedDisp_structure + + def setPositionLinear(self, reducedDisp_structure): + # TODO: Remove this function. Set the position within the fowt class + ''' + Set node position and attitude using the linear transformation, self.T + + PARAMETERS + ---------- + reducedDisp_structure: vector with nReducedDisp components + Reduced displacements of the whole structure written in the reduced set of dofs of the structure. + ''' + self.setDisplacementLinear(reducedDisp_structure) + self.r = self.r0 + self.Xi0 + + def plot(self, ax=None, color='default', size=5, marker='o', markerfacecolor='default', writeID=False): + if color == 'default': + if self.end_node: + color = 'k' + else: + color = 'b' + + if markerfacecolor == 'default': + markerfacecolor = color + + if ax is None: + fig = plt.figure() + ax = fig.add_subplot(111, projection='3d') + + ax.scatter(self.r[0], self.r[1], self.r[2], color=color, marker=marker, s=size, facecolors=markerfacecolor) + + # Convert marker size from points to data units + fig = ax.get_figure() + d = (size / 72.0) * fig.dpi / ax.transData.transform((1, 0))[0] + + if writeID: + ax.text(self.r[0], self.r[1], self.r[2], str(self.id), color=color) + return ax \ No newline at end of file diff --git a/raft/raft_rotor.py b/raft/raft_rotor.py index be573b8f..e77eda9f 100644 --- a/raft/raft_rotor.py +++ b/raft/raft_rotor.py @@ -5,14 +5,15 @@ import numpy as np import matplotlib.pyplot as plt -from raft.pyIECWind import pyIECWind_extreme +from raft.pyIECWind import pyIECWind_extreme from raft.raft_member import Member +from raft.raft_node import Node -from scipy.interpolate import PchipInterpolator -from scipy.special import modstruve, iv +from scipy.interpolate import PchipInterpolator +from scipy.special import modstruve, iv -from raft.helpers import rotationMatrix, getFromDict, rotateMatrix3, rotateMatrix6, RotFrm2Vect +from raft.helpers import rotationMatrix, getFromDict, rotateMatrix3, rotateMatrix6, RotFrm2Vect, transformForce, translateMatrix6to6DOF try: from ccblade.ccblade import CCBlade, CCAirfoil @@ -34,7 +35,7 @@ # a class for the rotor structure, aerodynamics, and control in RAFT class Rotor: - def __init__(self, turbine, w, ir): + def __init__(self, turbine, w, ir, node_id=0): ''' >>>> add mean offset parameters add move this to runCCBlade<<<< ir = the index of the values in the arrays of the input file for multiple rotors @@ -43,6 +44,7 @@ def __init__(self, turbine, w, ir): self.w = np.array(w) self.nw = len(self.w) self.turbine = turbine # store dictionary for later use + self.type = 'rotor' # type of this member # self.r_rel is the position of the RNA reference point (which the RNA yaws about) on the FOWT if 'rRNA' in turbine: # Temporary if statement. Need to fix getFromDict to handle this @@ -50,10 +52,10 @@ def __init__(self, turbine, w, ir): else: if turbine['nrotors'] > 1: raise Exception("For designs with more than one rotor, the RNA reference point must be specified for each of them.") - self.r_rel = [0, 0, 100.] + self.r_rel = np.zeros(3) # Will be assigned proper values ahead - self.overhang = getFromDict(turbine, 'overhang', shape=turbine['nrotors'])[ir] # rotor offset in +x before yaw [m] - self.xCG_RNA = getFromDict(turbine, 'xCG_RNA', shape=turbine['nrotors'])[ir] # RNA CG offset in +x before yaw [m] + self.overhang = getFromDict(turbine, 'overhang', shape=turbine['nrotors'])[ir] # rotor offset in +x before yaw [m] + self.xCG_RNA = getFromDict(turbine, 'xCG_RNA', shape=turbine['nrotors'])[ir] # RNA CG offset in +x before yaw [m] # mass/inertia self.mRNA = getFromDict(turbine, 'mRNA' , shape=turbine['nrotors'])[ir] @@ -124,6 +126,11 @@ def __init__(self, turbine, w, ir): self.r_CG = np.array(self.r_rel) # RNA CG location self.r_hub = np.array(self.r_rel) # rotor hub coordinates in global [m] + # Create a node to store the RNA inertia and lump the aerodynamic nodes. + # Making a list for consistency with other objects that have lists of nodes (fowt and member), + # and because we might want to have more nodes in the future. + self.nodeList = [Node(node_id, self.r_RRP, self.nw, member=self, end_node=True)] # + # Call setPosition to properly initialize various location parameters self.setPosition() @@ -380,24 +387,23 @@ def __init__(self, turbine, w, ir): else: self.bladeMemberList = [] - - def setPosition(self, r6=np.zeros(6), R=None): + def setPosition(self, R=None): '''Calculate rotor pose based on FOWT pose. Parameters ---------- - r6 : array, optional - Absolute position/orientation of FOWT to which member is attached. + R : array, optional + Absolute orientation of FOWT to which rotor is attached. ''' # store rotation matrix for platform roll, pitch, yaw if R: self.R_ptfm = np.array(R) else: - self.R_ptfm = rotationMatrix(*r6[3:]) + self.R_ptfm = rotationMatrix(*self.nodeList[0].r[3:]) # Store platform heading for use with nacelle yaw - self.platform_heading = r6[5] + self.platform_heading = self.nodeList[0].r[5] # Update RNA point locations [m] w.r.t. PRP in global orientations self.r_RRP_rel = np.matmul(self.R_ptfm, self.r_rel) # RNA ref point @@ -412,7 +418,8 @@ def setPosition(self, r6=np.zeros(6), R=None): ''' # Set absolute hub coordinate [m] for use in various aero/hydro calcs - self.r3 = r6[:3] + self.r_hub_rel + # Also update the RNA inertia matrix + self.r3 = self.nodeList[0].r[:3] + self.r_hub_rel_RRP def setYaw(self, yaw=None): @@ -464,8 +471,9 @@ def setYaw(self, yaw=None): self.q = np.matmul(self.R_ptfm, self.q_rel) # Write in the global frame # Update RNA point locations [m] w.r.t. PRP in global orientations - self.r_CG_rel = self.r_RRP_rel + self.q*self.xCG_RNA # RNA CG location - self.r_hub_rel = self.r_RRP_rel + self.q*self.overhang # rotor hub location + self.r_hub_rel_RRP = self.q*self.overhang # rotor hub location relative to RNA reference point + self.r_CG_rel = self.r_RRP_rel + self.q*self.xCG_RNA # RNA CG location + self.r_hub_rel = self.r_RRP_rel + self.r_hub_rel_RRP # rotor hub location return self.yaw @@ -569,7 +577,7 @@ def bladeGeometry2Member(self): self.bladeMemberList.append(Member(blademem, len(self.w))) - self.nodes = np.zeros([int(self.nBlades), len(self.bladeMemberList)+1, 3]) # array to hold xyz positions of each node along a blade for each blade (filled in later) + self.bladeNodes = np.zeros([int(self.nBlades), len(self.bladeMemberList)+1, 3]) # array to hold xyz positions of each node along a blade for each blade (filled in later) def getBladeMemberPositions(self, azimuth, r_OG): @@ -631,7 +639,7 @@ def calcHydroConstants(self, dgamma=0, rho=1025, g=9.81): mem.setPosition() # compute hydro added mass and inertial excitation terms relative to hub - A_hydro_i, I_hydro_i = mem.calcHydroConstants(sum_inertia=True, rho=rho, g=g) + A_hydro_i, I_hydro_i = mem.calcHydroConstants(sum_inertia=True, rho=rho, g=g, r_ref=np.zeros(3)) A_hydro += A_hydro_i I_hydro += I_hydro_i @@ -688,7 +696,7 @@ def calcCavitation(self, case, azimuth=0, clearance_margin=1.0, Patm=101325, Pva cpmin_node = np.interp(aoa[n], self.aoa, cpmin[n,:,0]) # extract the depth of the node using the node position array - clearance = self.nodes[a, n, 2] # a=which blade, n=which node, 2=z-position=depth + clearance = self.bladeNodes[a, n, 2] # a=which blade, n=which node, 2=z-position=depth # calculate the critial sigma cavitation parameter sigma_crit = (Patm + self.ccblade.rho*9.81*abs(clearance) - Pvap)/(0.5*self.ccblade.rho*vrel[n]**2) @@ -798,9 +806,7 @@ def setControlGains(self,turbine): def calcAero(self, case, current=False, display=0): '''Calculates stiffness, damping, added mass, and excitation coefficients from rotor aerodynamics coupled with turbine controls. - Results are w.r.t. the hub coordinate on the nacelle reference frame (may be yawed), - but written in the global reference frame. - Currently returning 6 DOF mean loads, but other terms are just hub fore-aft scalars. + Results are w.r.t. the rotor node written in the global reference frame. ''' # added mass, damping, excitation, mean force arrays to be filled in (6 DOF) @@ -1010,9 +1016,16 @@ def calcAero(self, case, current=False, display=0): if current: self.f[0,:] += self.I_hydro[0,0] * 1j*self.w*self.V_w # <<< this should have a rotation applied breakpoint() - """ + """ + + # Transform to be wrt the rotor node + self.f0 = transformForce(self.f0, offset=self.r_hub_rel_RRP) # force at hub in global frame + for iw in range(self.nw): + self.a[:,:,iw] = translateMatrix6to6DOF(self.a[:,:,iw], self.r_hub_rel_RRP) + self.b[:,:,iw] = translateMatrix6to6DOF(self.b[:,:,iw], self.r_hub_rel_RRP) + self.f[:,iw] = transformForce(self.f[:,iw], offset=self.r_hub_rel_RRP) - return self.f0, self.f, self.a, self.b # B_aero, C_aero, F_aero0, F_aero + return self.f0, self.f, self.a, self.b def plot(self, ax, r_ptfm=np.array([0,0,0]), azimuth=0, color='k', diff --git a/tests/test_data/IEA-15-240-RWT-UMaineSemi_MoorDyn.dat b/tests/test_data/IEA-15-240-RWT-UMaineSemi_MoorDyn.dat new file mode 100644 index 00000000..351e6223 --- /dev/null +++ b/tests/test_data/IEA-15-240-RWT-UMaineSemi_MoorDyn.dat @@ -0,0 +1,61 @@ +--------------------- MoorDyn Input File ------------------------------------ +IEA 15 MW offshore reference model on UMaine VolturnUS-S semi-submersible floating platform mooring model- C. Allen UMaine +FALSE Echo - echo the input file data (flag) +----------------------- LINE TYPES ------------------------------------------ +Name Diam MassDen EA BA/-zeta EI Cd Ca CdAx CaAx +(-) (m) (kg/m) (N) (N-s/-) (-) (-) (-) (-) (-) +main 0.333 685.00 3.27E+09 -1.0 0 2.0 0.82 0.4 0.27 +---------------------- POINTS -------------------------------- +ID Type X Y Z M V CdA CA +(-) (-) (m) (m) (m) (kg) (m^3) (m^2) (-) +1 Vessel -58.000 0.000 -14.000 0 0 0 0 +2 Fixed -837.600 0.000 -200.000 0 0 0 0 +3 Vessel 29.000 50.229 -14.000 0 0 0 0 +4 Fixed 418.800 725.383 -200.000 0 0 0 0 +5 Vessel 29.000 -50.229 -14.000 0 0 0 0 +6 Fixed 418.800 -725.383 -200.000 0 0 0 0 +---------------------- LINES -------------------------------------- +ID LineType AttachA AttachB UnstrLen NumSegs Outputs +(-) (-) (-) (-) (m) (-) (-) +1 main 2 1 850.00 50 - +2 main 4 3 850.00 50 - +3 main 6 5 850.00 50 - +---------------------- SOLVER OPTIONS --------------------------------------- +0.001 dtM - time step to use in mooring integration (s) +3.0e6 kbot - bottom stiffness (Pa/m) +3.0e5 cbot - bottom damping (Pa-s/m) +1.0 dtIC - time interval for analyzing convergence during IC gen (s) +60.0 TmaxIC - max time for ic gen (s) +4.0 CdScaleIC - factor by which to scale drag coefficients during dynamic relaxation (-) +0.001 threshIC - threshold for IC convergence (-) +------------------------ OUTPUTS -------------------------------------------- +FairTen1 +FairTen2 +FairTen3 +AnchTen1 +AnchTen2 +AnchTen3 +Con1fx +Con3fx +Con5fx +Con1fy +Con3fy +Con5fy +Con1fz +Con3fz +Con5fz +Con2fx +Con4fx +Con6fx +Con2fy +Con4fy +Con6fy +Con2fz +Con4fz +Con6fz +fx +fy +fz +END +------------------------- need this line -------------------------------------- + diff --git a/tests/test_data/IEA15MW.yaml b/tests/test_data/IEA15MW.yaml index 523f4c03..9bae5dad 100644 --- a/tests/test_data/IEA15MW.yaml +++ b/tests/test_data/IEA15MW.yaml @@ -1049,7 +1049,7 @@ turbine: dlsMax : 5.0 # maximum node splitting section amount; can't be 0 name : tower # [-] an identifier (no longer has to be number) - type : 1 # [-] + type : rigid # [-] rA : [ 0, 0, 15] # [m] end A coordinates rB : [ 0, 0, 144.582] # [m] and B coordinates shape : circ # [-] circular or rectangular diff --git a/tests/test_data/IEA15MW_true_calcAero-yaw_mode0.pkl b/tests/test_data/IEA15MW_true_calcAero-yaw_mode0.pkl index 8b15875f..4da3ebb8 100644 Binary files a/tests/test_data/IEA15MW_true_calcAero-yaw_mode0.pkl and b/tests/test_data/IEA15MW_true_calcAero-yaw_mode0.pkl differ diff --git a/tests/test_data/IEA15MW_true_calcAero-yaw_mode1.pkl b/tests/test_data/IEA15MW_true_calcAero-yaw_mode1.pkl index 795ce287..b59f87c1 100644 Binary files a/tests/test_data/IEA15MW_true_calcAero-yaw_mode1.pkl and b/tests/test_data/IEA15MW_true_calcAero-yaw_mode1.pkl differ diff --git a/tests/test_data/IEA15MW_true_calcAero-yaw_mode2.pkl b/tests/test_data/IEA15MW_true_calcAero-yaw_mode2.pkl index c5f56f1b..81221508 100644 Binary files a/tests/test_data/IEA15MW_true_calcAero-yaw_mode2.pkl and b/tests/test_data/IEA15MW_true_calcAero-yaw_mode2.pkl differ diff --git a/tests/test_data/IEA15MW_true_calcAero-yaw_mode3.pkl b/tests/test_data/IEA15MW_true_calcAero-yaw_mode3.pkl index c5f56f1b..81221508 100644 Binary files a/tests/test_data/IEA15MW_true_calcAero-yaw_mode3.pkl and b/tests/test_data/IEA15MW_true_calcAero-yaw_mode3.pkl differ diff --git a/tests/test_data/OC3spar.yaml b/tests/test_data/OC3spar.yaml index ff05855a..9e2eedd3 100644 --- a/tests/test_data/OC3spar.yaml +++ b/tests/test_data/OC3spar.yaml @@ -1034,7 +1034,7 @@ turbine: tower: # (could remove some entries that don't apply for the tower) name : tower # [-] an identifier (no longer has to be number) - type : 1 # [-] + type : rigid # [-] rA : [ 0, 0, 10] # [m] end A coordinates rB : [ 0, 0, 87.6] # [m] and B coordinates shape : circ # [-] circular or rectangular @@ -1072,7 +1072,7 @@ platform: members: # list all members here - name : center_spar # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [ 0, 0, -120] # [m] end A coordinates rB : [ 0, 0, 10] # [m] and B coordinates shape : circ # [-] circular or rectangular diff --git a/tests/test_data/OC3spar_true_analyzeCases.pkl b/tests/test_data/OC3spar_true_analyzeCases.pkl index f4c3000e..69bcc430 100644 Binary files a/tests/test_data/OC3spar_true_analyzeCases.pkl and b/tests/test_data/OC3spar_true_analyzeCases.pkl differ diff --git a/tests/test_data/OC3spar_true_calcCurrentLoads.pkl b/tests/test_data/OC3spar_true_calcCurrentLoads.pkl new file mode 100644 index 00000000..98bfc2e1 Binary files /dev/null and b/tests/test_data/OC3spar_true_calcCurrentLoads.pkl differ diff --git a/tests/test_data/OC3spar_true_hydroConstants.pkl b/tests/test_data/OC3spar_true_hydroConstants.pkl new file mode 100644 index 00000000..27fc9033 Binary files /dev/null and b/tests/test_data/OC3spar_true_hydroConstants.pkl differ diff --git a/tests/test_data/OC3spar_true_hydroExcitation.pkl b/tests/test_data/OC3spar_true_hydroExcitation.pkl index 81e6f0be..0f96eb2e 100644 Binary files a/tests/test_data/OC3spar_true_hydroExcitation.pkl and b/tests/test_data/OC3spar_true_hydroExcitation.pkl differ diff --git a/tests/test_data/OC3spar_true_hydroLinearization.pkl b/tests/test_data/OC3spar_true_hydroLinearization.pkl index a813d4a2..fbf4f50c 100644 Binary files a/tests/test_data/OC3spar_true_hydroLinearization.pkl and b/tests/test_data/OC3spar_true_hydroLinearization.pkl differ diff --git a/tests/test_data/OC3spar_true_statics.pkl b/tests/test_data/OC3spar_true_statics.pkl new file mode 100644 index 00000000..6a3a63a7 Binary files /dev/null and b/tests/test_data/OC3spar_true_statics.pkl differ diff --git a/tests/test_data/OC4semi-WAMIT_Coefs.yaml b/tests/test_data/OC4semi-WAMIT_Coefs.yaml index 51dddcaf..dcb8205c 100644 --- a/tests/test_data/OC4semi-WAMIT_Coefs.yaml +++ b/tests/test_data/OC4semi-WAMIT_Coefs.yaml @@ -1032,7 +1032,7 @@ turbine: tower: # (could remove some entries that don't apply for the tower) name : tower # [-] an identifier (no longer has to be number) - type : 1 # [-] + type : rigid # [-] rA : [ 0, 0, 10] # [m] end A coordinates rB : [ 0, 0, 87.6] # [m] and B coordinates shape : circ # [-] circular or rectangular @@ -1075,7 +1075,7 @@ platform: members: # list all members here - name : main_column # [-] an identifier (no longer has to be number) - type : 2 # [-] (1=turbine, >1=substructure, for now) + type : rigid # [-] (1=turbine, >1=substructure, for now) rA : [ 0, 0, -20] # [m] end A coordinates rB : [ 0, 0, 10] # [m] and B coordinates shape : circ # [-] circular or rectangular @@ -1099,7 +1099,7 @@ platform: - name : offset_column # [-] an identifier (no longer has to be number) - type : 3 # [-] (1=turbine, >1=substructure, for now) + type : rigid # [-] (1=turbine, >1=substructure, for now) rA : [ 28.86 , 0, -20] # [m] end A coordinates rB : [ 28.86 , 0, 12] # [m] and B coordinates heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) diff --git a/tests/test_data/OC4semi-WAMIT_Coefs_true_BEM_forces.pkl b/tests/test_data/OC4semi-WAMIT_Coefs_true_BEM_forces.pkl index b2179563..80632b18 100644 Binary files a/tests/test_data/OC4semi-WAMIT_Coefs_true_BEM_forces.pkl and b/tests/test_data/OC4semi-WAMIT_Coefs_true_BEM_forces.pkl differ diff --git a/tests/test_data/OC4semi-WAMIT_Coefs_true_analyzeCases.pkl b/tests/test_data/OC4semi-WAMIT_Coefs_true_analyzeCases.pkl index 2e1bee51..9352a5ba 100644 Binary files a/tests/test_data/OC4semi-WAMIT_Coefs_true_analyzeCases.pkl and b/tests/test_data/OC4semi-WAMIT_Coefs_true_analyzeCases.pkl differ diff --git a/tests/test_data/OC4semi-WAMIT_Coefs_true_calcCurrentLoads.pkl b/tests/test_data/OC4semi-WAMIT_Coefs_true_calcCurrentLoads.pkl new file mode 100644 index 00000000..8e560dda Binary files /dev/null and b/tests/test_data/OC4semi-WAMIT_Coefs_true_calcCurrentLoads.pkl differ diff --git a/tests/test_data/OC4semi-WAMIT_Coefs_true_hydroConstants.pkl b/tests/test_data/OC4semi-WAMIT_Coefs_true_hydroConstants.pkl new file mode 100644 index 00000000..5c99800c Binary files /dev/null and b/tests/test_data/OC4semi-WAMIT_Coefs_true_hydroConstants.pkl differ diff --git a/tests/test_data/OC4semi-WAMIT_Coefs_true_hydroLinearization.pkl b/tests/test_data/OC4semi-WAMIT_Coefs_true_hydroLinearization.pkl index ad71a975..7832979c 100644 Binary files a/tests/test_data/OC4semi-WAMIT_Coefs_true_hydroLinearization.pkl and b/tests/test_data/OC4semi-WAMIT_Coefs_true_hydroLinearization.pkl differ diff --git a/tests/test_data/OC4semi-WAMIT_Coefs_true_statics.pkl b/tests/test_data/OC4semi-WAMIT_Coefs_true_statics.pkl new file mode 100644 index 00000000..1e79658f Binary files /dev/null and b/tests/test_data/OC4semi-WAMIT_Coefs_true_statics.pkl differ diff --git a/tests/test_data/VolturnUS-S-flexible.yaml b/tests/test_data/VolturnUS-S-flexible.yaml new file mode 100644 index 00000000..97f82e15 --- /dev/null +++ b/tests/test_data/VolturnUS-S-flexible.yaml @@ -0,0 +1,1269 @@ +type: input file for RAFT +name: IEA 15 MW with VolturnUS-S steel semi +comments: Used to perform tests on FOWT and model class functionality. This file should contain a single FOWT. + + +settings: # global Settings + min_freq : 0.005 # [Hz] lowest frequency to consider, also the frequency bin width + max_freq : 0.200 # [Hz] highest frequency to consider + XiStart : 0 # sets initial amplitude of each DOF for all frequencies + nIter : 4 # sets how many iterations to perform in Model.solveDynamics() + +site: + water_depth : 200 # [m] uniform water depth + rho_water : 1025.0 # [kg/m^3] water density + rho_air : 1.225 # [kg/m^3] air density + mu_air : 1.81e-05 # air dynamic viscosity + shearExp : 0.12 # shear exponent + +cases: + + keys : [wind_speed, wind_heading, turbulence, turbine_status, yaw_misalign, wave_spectrum, wave_period, wave_height, wave_heading, current_speed, current_heading ] + data : # m/s deg % or e.g. IIB_NTM string deg string (s) (m) (deg) + - [ 0, 0, 0, operating, 0, JONSWAP, 12, 6, 0 , 0, 0 ] + - [ 10, 30, 0, operating, 0, JONSWAP, 12, 6, 0 , 1, 15 ] + +turbine: + + mRNA : 1001505.907 # [kg] RNA mass: m_blades = 3*68076.969 = 204230.907 kg (from ED.sum), m_yawbearing = 100000 kg, m_hub = 190000 kg, m_nacelle = 507275 kg + IxRNA : 0 # [kg-m2] RNA moment of inertia about local x axis (assumed to be identical to rotor axis for now, as approx) [kg-m^2] + IrRNA : 0 # [kg-m2] RNA moment of inertia about local y or z axes [kg-m^2] + xCG_RNA : -7.27 # [m] x location of RNA center of mass [m]: xg_blades = -13.0 m, xg_hub = -11.0 m, xg_nac = -4.99 m, xg_yaw = 0.0 m + hHub : 150.0 # [m] hub height above water line [m] + Fthrust : 1500.0E3 # [N] temporary thrust force to use + + I_drivetrain: 318628138.0 # full rotor + drivetrain inertia as felt on the high-speed shaft + + nBlades : 3 # number of blades + Zhub : 150.0 # hub height [m] + Rhub : 3.97 # hub radius [m] + precone : -4.0 # [deg] + shaft_tilt : -6.0 # [deg] + overhang : -12.0313 # [m] + aeroServoMod : 1 # 0 aerodynamics off; 1 aerodynamics on + + + blade: + precurveTip : -3.9999999999999964 # + presweepTip : 0.0 # + Rtip : 120.96999999936446 # rotor radius + + # r chord theta precurve presweep + geometry: + - [ 8.004, 5.228, 15.474, 0.035, 0.000 ] + - [ 12.039, 5.321, 14.692, 0.084, 0.000 ] + - [ 16.073, 5.458, 13.330, 0.139, 0.000 ] + - [ 20.108, 5.602, 11.644, 0.192, 0.000 ] + - [ 24.142, 5.718, 9.927, 0.232, 0.000 ] + - [ 28.177, 5.767, 8.438, 0.250, 0.000 ] + - [ 32.211, 5.713, 7.301, 0.250, 0.000 ] + - [ 36.246, 5.536, 6.232, 0.246, 0.000 ] + - [ 40.280, 5.291, 5.230, 0.240, 0.000 ] + - [ 44.315, 5.035, 4.348, 0.233, 0.000 ] + - [ 48.349, 4.815, 3.606, 0.218, 0.000 ] + - [ 52.384, 4.623, 2.978, 0.178, 0.000 ] + - [ 56.418, 4.432, 2.423, 0.100, 0.000 ] + - [ 60.453, 4.245, 1.924, 0.000, 0.000 ] + - [ 64.487, 4.065, 1.467, -0.112, 0.000 ] + - [ 68.522, 3.896, 1.056, -0.244, 0.000 ] + - [ 72.556, 3.735, 0.692, -0.415, 0.000 ] + - [ 76.591, 3.579, 0.355, -0.620, 0.000 ] + - [ 80.625, 3.425, 0.019, -0.846, 0.000 ] + - [ 84.660, 3.268, -0.358, -1.080, 0.000 ] + - [ 88.694, 3.112, -0.834, -1.330, 0.000 ] + - [ 92.729, 2.957, -1.374, -1.602, 0.000 ] + - [ 96.763, 2.800, -1.848, -1.895, 0.000 ] + - [ 100.798, 2.637, -2.136, -2.202, 0.000 ] + - [ 104.832, 2.464, -2.172, -2.523, 0.000 ] + - [ 108.867, 2.283, -2.108, -2.864, 0.000 ] + - [ 112.901, 2.096, -1.953, -3.224, 0.000 ] + - [ 116.936, 1.902, -1.662, -3.605, 0.000 ] + # station(rel) airfoil name + airfoils: + - [ 0.00000, circular ] + - [ 0.02000, circular ] + - [ 0.15000, SNL-FFA-W3-500 ] + - [ 0.24517, FFA-W3-360 ] + - [ 0.32884, FFA-W3-330blend ] + - [ 0.43918, FFA-W3-301 ] + - [ 0.53767, FFA-W3-270blend ] + - [ 0.63821, FFA-W3-241 ] + - [ 0.77174, FFA-W3-211 ] + - [ 1.00000, FFA-W3-211 ] + + + airfoils: + - name : circular # + relative_thickness : 1.0 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00010, 0.35000, -0.00010 ] + - [ 179.9087, 0.00010, 0.35000, -0.00010 ] + - name : SNL-FFA-W3-500 # + relative_thickness : 0.5 # + data: # alpha c_l c_d c_m + - [ -179.9660, 0.00000, 0.08440, 0.00000 ] + - [ -170.0000, 0.44190, 0.08440, 0.31250 ] + - [ -160.0002, 0.88370, 0.12680, 0.28310 ] + - [ -149.9998, 0.96740, 0.29270, 0.26320 ] + - [ -139.9999, 0.78010, 0.49700, 0.20480 ] + - [ -130.0001, 0.62930, 0.71610, 0.19320 ] + - [ -120.0003, 0.47850, 0.92460, 0.20080 ] + - [ -109.9999, 0.31890, 1.09850, 0.21360 ] + - [ -100.0000, 0.15530, 1.21820, 0.22210 ] + - [ -90.0002, 0.00000, 1.27070, 0.21980 ] + - [ -79.9998, -0.15530, 1.21820, 0.19600 ] + - [ -70.0000, -0.31890, 1.09850, 0.16350 ] + - [ -60.0001, -0.47840, 0.92460, 0.12850 ] + - [ -49.9997, -0.62930, 0.71610, 0.09650 ] + - [ -39.9999, -0.78010, 0.49700, 0.07160 ] + - [ -30.0001, -0.96740, 0.29270, 0.05220 ] + - [ -20.0002, -1.02810, 0.14990, -0.00630 ] + - [ -19.7499, -1.02430, 0.14720, -0.00890 ] + - [ -19.2502, -1.00520, 0.14470, -0.00990 ] + - [ -18.9999, -0.99710, 0.14330, -0.01050 ] + - [ -18.7500, -1.00520, 0.14030, -0.01100 ] + - [ -18.5002, -0.99950, 0.13860, -0.01160 ] + - [ -18.2499, -0.99080, 0.13730, -0.01200 ] + - [ -18.0000, -0.98150, 0.13600, -0.01260 ] + - [ -17.4998, -0.97640, 0.13220, -0.01350 ] + - [ -17.2500, -0.97050, 0.13060, -0.01390 ] + - [ -17.0002, -0.96550, 0.12900, -0.01430 ] + - [ -16.7498, -0.96620, 0.12680, -0.01470 ] + - [ -16.5000, -0.95440, 0.12580, -0.01510 ] + - [ -16.2502, -0.94440, 0.12460, -0.01550 ] + - [ -15.9998, -0.94050, 0.12290, -0.01580 ] + - [ -15.7500, -0.94330, 0.12060, -0.01610 ] + - [ -15.5002, -0.93300, 0.11950, -0.01640 ] + - [ -15.2498, -0.92110, 0.11850, -0.01680 ] + - [ -14.7502, -0.91580, 0.11500, -0.01730 ] + - [ -14.4998, -0.90700, 0.11380, -0.01750 ] + - [ -14.2500, -0.89590, 0.11270, -0.01780 ] + - [ -14.0002, -0.89260, 0.11100, -0.01810 ] + - [ -13.7498, -0.88080, 0.11000, -0.01840 ] + - [ -13.5000, -0.87220, 0.10890, -0.01860 ] + - [ -13.2502, -0.86600, 0.10750, -0.01880 ] + - [ -12.9998, -0.86260, 0.10590, -0.01880 ] + - [ -12.7500, -0.84890, 0.10510, -0.01920 ] + - [ -12.5002, -0.83630, 0.10420, -0.01940 ] + - [ -12.2498, -0.83630, 0.10230, -0.01940 ] + - [ -12.0000, -0.82710, 0.10130, -0.01960 ] + - [ -11.7502, -0.81410, 0.10040, -0.01980 ] + - [ -11.4998, -0.80040, 0.09970, -0.02000 ] + - [ -11.0002, -0.78900, 0.09710, -0.01990 ] + - [ -10.7498, -0.78620, 0.09560, -0.01960 ] + - [ -10.5000, -0.77470, 0.09480, -0.01940 ] + - [ -10.2502, -0.77010, 0.09400, -0.01840 ] + - [ -9.9998, -0.76740, 0.09250, -0.01830 ] + - [ -9.7500, -0.75060, 0.09170, -0.01920 ] + - [ -9.5002, -0.72900, 0.09120, -0.02050 ] + - [ -9.2498, -0.70950, 0.09020, -0.02240 ] + - [ -9.0000, -0.68550, 0.08950, -0.02470 ] + - [ -8.7502, -0.65900, 0.08910, -0.02670 ] + - [ -8.4998, -0.63190, 0.08870, -0.02870 ] + - [ -8.2500, -0.60190, 0.08790, -0.03200 ] + - [ -8.0002, -0.57180, 0.08750, -0.03450 ] + - [ -7.7498, -0.54240, 0.08730, -0.03670 ] + - [ -7.5000, -0.50980, 0.08680, -0.03990 ] + - [ -7.2502, -0.47670, 0.08640, -0.04300 ] + - [ -6.9998, -0.44540, 0.08620, -0.04530 ] + - [ -6.7500, -0.41420, 0.08600, -0.04760 ] + - [ -6.5002, -0.37910, 0.08560, -0.05100 ] + - [ -6.2498, -0.34600, 0.08530, -0.05380 ] + - [ -6.0000, -0.31440, 0.08520, -0.05600 ] + - [ -5.7502, -0.28170, 0.08500, -0.05860 ] + - [ -5.4998, -0.24610, 0.08470, -0.06190 ] + - [ -5.2500, -0.21330, 0.08460, -0.06440 ] + - [ -5.0002, -0.18270, 0.08450, -0.06630 ] + - [ -4.7498, -0.14940, 0.08430, -0.06880 ] + - [ -4.5000, -0.11580, 0.08420, -0.07150 ] + - [ -4.2502, -0.08370, 0.08400, -0.07370 ] + - [ -3.9998, -0.05290, 0.08400, -0.07560 ] + - [ -3.7500, -0.02250, 0.08390, -0.07740 ] + - [ -3.5002, 0.00890, 0.08380, -0.07930 ] + - [ -3.2498, 0.03920, 0.08380, -0.08110 ] + - [ -3.0000, 0.06860, 0.08380, -0.08260 ] + - [ -2.7502, 0.09740, 0.08380, -0.08380 ] + - [ -2.4998, 0.12600, 0.08380, -0.08520 ] + - [ -2.2500, 0.15550, 0.08380, -0.08670 ] + - [ -2.0002, 0.18530, 0.08380, -0.08830 ] + - [ -1.7498, 0.21460, 0.08370, -0.08970 ] + - [ -1.5000, 0.24300, 0.08370, -0.09100 ] + - [ -1.2502, 0.27130, 0.08380, -0.09210 ] + - [ -0.9998, 0.30060, 0.08380, -0.09360 ] + - [ -0.7500, 0.32950, 0.08380, -0.09490 ] + - [ -0.5002, 0.35780, 0.08380, -0.09610 ] + - [ -0.2498, 0.38570, 0.08380, -0.09720 ] + - [ 0.0000, 0.41350, 0.08380, -0.09830 ] + - [ 0.2298, 0.44250, 0.08390, -0.09950 ] + - [ 0.4698, 0.47150, 0.08390, -0.10080 ] + - [ 0.7002, 0.50030, 0.08390, -0.10190 ] + - [ 0.9402, 0.52860, 0.08400, -0.10290 ] + - [ 1.1700, 0.55670, 0.08400, -0.10400 ] + - [ 1.3997, 0.58500, 0.08410, -0.10500 ] + - [ 1.6398, 0.61350, 0.08410, -0.10610 ] + - [ 1.8701, 0.64170, 0.08420, -0.10720 ] + - [ 2.1102, 0.66970, 0.08420, -0.10820 ] + - [ 2.3400, 0.69750, 0.08430, -0.10910 ] + - [ 2.5697, 0.72510, 0.08430, -0.11000 ] + - [ 2.8098, 0.75280, 0.08440, -0.11090 ] + - [ 3.0401, 0.78070, 0.08450, -0.11190 ] + - [ 3.2802, 0.80830, 0.08460, -0.11280 ] + - [ 3.5099, 0.83580, 0.08460, -0.11370 ] + - [ 3.7403, 0.86310, 0.08470, -0.11460 ] + - [ 3.9798, 0.89020, 0.08470, -0.11530 ] + - [ 4.2101, 0.91730, 0.08480, -0.11610 ] + - [ 4.4502, 0.94440, 0.08490, -0.11700 ] + - [ 4.6799, 0.97130, 0.08500, -0.11780 ] + - [ 4.9102, 0.99810, 0.08510, -0.11850 ] + - [ 5.1497, 1.02490, 0.08520, -0.11920 ] + - [ 5.3801, 1.05150, 0.08530, -0.11990 ] + - [ 5.6201, 1.07790, 0.08530, -0.12060 ] + - [ 5.8499, 1.10410, 0.08540, -0.12120 ] + - [ 6.0802, 1.13020, 0.08560, -0.12180 ] + - [ 6.3197, 1.15600, 0.08570, -0.12240 ] + - [ 6.5501, 1.18180, 0.08580, -0.12300 ] + - [ 6.7901, 1.20760, 0.08590, -0.12350 ] + - [ 7.0199, 1.23340, 0.08600, -0.12400 ] + - [ 7.2502, 1.25890, 0.08610, -0.12450 ] + - [ 7.4903, 1.28410, 0.08620, -0.12500 ] + - [ 7.7200, 1.30880, 0.08640, -0.12540 ] + - [ 7.9601, 1.33310, 0.08650, -0.12570 ] + - [ 8.1899, 1.35700, 0.08670, -0.12590 ] + - [ 8.4202, 1.38100, 0.08690, -0.12620 ] + - [ 8.6603, 1.40540, 0.08700, -0.12650 ] + - [ 8.8900, 1.42950, 0.08710, -0.12670 ] + - [ 9.1198, 1.45310, 0.08730, -0.12700 ] + - [ 9.8801, 1.51540, 0.08790, -0.12650 ] + - [ 10.6398, 1.57490, 0.08860, -0.12560 ] + - [ 11.4001, 1.61510, 0.08950, -0.12140 ] + - [ 12.1501, 1.64430, 0.09120, -0.11630 ] + - [ 12.9099, 1.68240, 0.09300, -0.11330 ] + - [ 13.6702, 1.71460, 0.09540, -0.11070 ] + - [ 14.4202, 1.73620, 0.09890, -0.10800 ] + - [ 15.1799, 1.76270, 0.10240, -0.10630 ] + - [ 15.9403, 1.77060, 0.10760, -0.10420 ] + - [ 16.6903, 1.76390, 0.11440, -0.10250 ] + - [ 17.4500, 1.76040, 0.12110, -0.10130 ] + - [ 18.2097, 1.72510, 0.13100, -0.10010 ] + - [ 18.9701, 1.70350, 0.13990, -0.09980 ] + - [ 19.7201, 1.67840, 0.14920, -0.10010 ] + - [ 20.4798, 1.65050, 0.15910, -0.10160 ] + - [ 21.2401, 1.62270, 0.16910, -0.10360 ] + - [ 21.9901, 1.60670, 0.17780, -0.10640 ] + - [ 22.7499, 1.59720, 0.18580, -0.10990 ] + - [ 23.5102, 1.58920, 0.19370, -0.11360 ] + - [ 24.2602, 1.58150, 0.20140, -0.11800 ] + - [ 25.0199, 1.55630, 0.21350, -0.12490 ] + - [ 25.7802, 1.52720, 0.22670, -0.13250 ] + - [ 26.5302, 1.49820, 0.23990, -0.14000 ] + - [ 27.2900, 1.46910, 0.25310, -0.14760 ] + - [ 28.0497, 1.44010, 0.26630, -0.15510 ] + - [ 28.8100, 1.41100, 0.27950, -0.16270 ] + - [ 29.5600, 1.38200, 0.29270, -0.17030 ] + - [ 30.3198, 1.36220, 0.30780, -0.17400 ] + - [ 31.0801, 1.34240, 0.32300, -0.17770 ] + - [ 31.8301, 1.32250, 0.33810, -0.18150 ] + - [ 32.5898, 1.30270, 0.35320, -0.18520 ] + - [ 33.3502, 1.28290, 0.36840, -0.18890 ] + - [ 34.1002, 1.26310, 0.38350, -0.19260 ] + - [ 34.8599, 1.24330, 0.39870, -0.19640 ] + - [ 35.6202, 1.22340, 0.41380, -0.20010 ] + - [ 36.3800, 1.20360, 0.42890, -0.20390 ] + - [ 37.1300, 1.18380, 0.44410, -0.20760 ] + - [ 37.8903, 1.16400, 0.45920, -0.21130 ] + - [ 38.6500, 1.14420, 0.47430, -0.21500 ] + - [ 39.4000, 1.12430, 0.48950, -0.21880 ] + - [ 40.1598, 1.10640, 0.50520, -0.22180 ] + - [ 40.9201, 1.09050, 0.52140, -0.22420 ] + - [ 41.6701, 1.07450, 0.53760, -0.22660 ] + - [ 42.4298, 1.05860, 0.55380, -0.22890 ] + - [ 43.1901, 1.04260, 0.57010, -0.23130 ] + - [ 43.9401, 1.02670, 0.58630, -0.23370 ] + - [ 44.6999, 1.01070, 0.60250, -0.23610 ] + - [ 45.4602, 0.99480, 0.61880, -0.23840 ] + - [ 46.2199, 0.97880, 0.63500, -0.24080 ] + - [ 46.9699, 0.96280, 0.65120, -0.24320 ] + - [ 47.7302, 0.94690, 0.66750, -0.24550 ] + - [ 48.4900, 0.93090, 0.68370, -0.24790 ] + - [ 49.2400, 0.91500, 0.69990, -0.25030 ] + - [ 49.9997, 0.89900, 0.71610, -0.25270 ] + - [ 60.0001, 0.68360, 0.92460, -0.28330 ] + - [ 70.0000, 0.45560, 1.09850, -0.31560 ] + - [ 79.9998, 0.22190, 1.21820, -0.34820 ] + - [ 90.0002, 0.00000, 1.27070, -0.37730 ] + - [ 100.0000, -0.15530, 1.21820, -0.38770 ] + - [ 109.9999, -0.31890, 1.09850, -0.38650 ] + - [ 120.0003, -0.47840, 0.92460, -0.38060 ] + - [ 130.0001, -0.62930, 0.71610, -0.38030 ] + - [ 139.9999, -0.78010, 0.49700, -0.40320 ] + - [ 149.9998, -0.96740, 0.29270, -0.48540 ] + - [ 160.0002, -0.88370, 0.12680, -0.53250 ] + - [ 170.0000, -0.44180, 0.08440, -0.39060 ] + - [ 179.9660, 0.00000, 0.08440, 0.00000 ] + - name : FFA-W3-211 # + relative_thickness : 0.211 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.02464, 0.00000 ] + - [ -177.7143, 0.05403, 0.02534, 0.09143 ] + - [ -175.4286, 0.10805, 0.02742, 0.18286 ] + - [ -173.1429, 0.16208, 0.03088, 0.27429 ] + - [ -170.8572, 0.21610, 0.03570, 0.36571 ] + - [ -168.5716, 0.27013, 0.05599, 0.39192 ] + - [ -166.2857, 0.32415, 0.08143, 0.37898 ] + - [ -164.0000, 0.37818, 0.11112, 0.36605 ] + - [ -161.7145, 0.43220, 0.14485, 0.35312 ] + - [ -159.4284, 0.48623, 0.18242, 0.34768 ] + - [ -157.1428, 0.54025, 0.22359, 0.36471 ] + - [ -154.8573, 0.59428, 0.26810, 0.38175 ] + - [ -152.5714, 0.64830, 0.31566, 0.39878 ] + - [ -150.2857, 0.70233, 0.36597, 0.41581 ] + - [ -148.0000, 0.75635, 0.41871, 0.41955 ] + - [ -143.8571, 0.73188, 0.51941, 0.42287 ] + - [ -139.7143, 0.70655, 0.62488, 0.42632 ] + - [ -135.5714, 0.67760, 0.73293, 0.43163 ] + - [ -131.4286, 0.64333, 0.84130, 0.43694 ] + - [ -127.2857, 0.60277, 0.94773, 0.44389 ] + - [ -123.1429, 0.55550, 1.05001, 0.45171 ] + - [ -119.0000, 0.50156, 1.14600, 0.45897 ] + - [ -114.8571, 0.44131, 1.23371, 0.46448 ] + - [ -110.7143, 0.37542, 1.31129, 0.46998 ] + - [ -106.5714, 0.30482, 1.37714, 0.47096 ] + - [ -102.4286, 0.23063, 1.42988, 0.47101 ] + - [ -98.2857, 0.15413, 1.46842, 0.46824 ] + - [ -94.1429, 0.07675, 1.49196, 0.46149 ] + - [ -90.0000, 0.00000, 1.50000, 0.45474 ] + - [ -85.8571, -0.07675, 1.49196, 0.44026 ] + - [ -81.7143, -0.15413, 1.46842, 0.42578 ] + - [ -77.5714, -0.23063, 1.42988, 0.40821 ] + - [ -73.4286, -0.30482, 1.37714, 0.38846 ] + - [ -69.2857, -0.37542, 1.31129, 0.36815 ] + - [ -65.1429, -0.44131, 1.23371, 0.34519 ] + - [ -61.0000, -0.50156, 1.14600, 0.32223 ] + - [ -56.8571, -0.55550, 1.05001, 0.29864 ] + - [ -52.7143, -0.60277, 0.94773, 0.27486 ] + - [ -48.5714, -0.64333, 0.84130, 0.25128 ] + - [ -44.4286, -0.67760, 0.73293, 0.22810 ] + - [ -40.2857, -0.70655, 0.62488, 0.20491 ] + - [ -36.1429, -0.73188, 0.51941, 0.15416 ] + - [ -32.0000, -0.75635, 0.41871, 0.10137 ] + - [ -28.0000, -0.85636, 0.28691, 0.06527 ] + - [ -24.0000, -1.18292, 0.13960, 0.01647 ] + - [ -20.0000, -1.23596, 0.08345, -0.00352 ] + - [ -18.0000, -1.22536, 0.06509, -0.00672 ] + - [ -16.0000, -1.20476, 0.04888, -0.00881 ] + - [ -14.0000, -1.18332, 0.03417, -0.01101 ] + - [ -12.0000, -1.10093, 0.02132, -0.02269 ] + - [ -10.0000, -0.88209, 0.01386, -0.04397 ] + - [ -8.0000, -0.62981, 0.01075, -0.05756 ] + - [ -6.0000, -0.37670, 0.00882, -0.06747 ] + - [ -4.0000, -0.12177, 0.00702, -0.07680 ] + - [ -2.0000, 0.12810, 0.00663, -0.08283 ] + - [ -1.0000, 0.25192, 0.00664, -0.08534 ] + - [ 0.0000, 0.37535, 0.00670, -0.08777 ] + - [ 1.0000, 0.49828, 0.00681, -0.09011 ] + - [ 2.0000, 0.62052, 0.00698, -0.09234 ] + - [ 3.0000, 0.74200, 0.00720, -0.09447 ] + - [ 4.0000, 0.86238, 0.00751, -0.09646 ] + - [ 5.0000, 0.98114, 0.00796, -0.09828 ] + - [ 6.0000, 1.09662, 0.00872, -0.09977 ] + - [ 7.0000, 1.20904, 0.00968, -0.10095 ] + - [ 8.0000, 1.31680, 0.01097, -0.10163 ] + - [ 9.0000, 1.42209, 0.01227, -0.10207 ] + - [ 10.0000, 1.52361, 0.01369, -0.10213 ] + - [ 11.0000, 1.61988, 0.01529, -0.10174 ] + - [ 12.0000, 1.70937, 0.01717, -0.10087 ] + - [ 13.0000, 1.78681, 0.01974, -0.09936 ] + - [ 14.0000, 1.84290, 0.02368, -0.09720 ] + - [ 15.0000, 1.85313, 0.03094, -0.09410 ] + - [ 16.0000, 1.80951, 0.04303, -0.09144 ] + - [ 18.0000, 1.66033, 0.07730, -0.09242 ] + - [ 20.0000, 1.56152, 0.11202, -0.09871 ] + - [ 24.0000, 1.43327, 0.18408, -0.11770 ] + - [ 28.0000, 1.29062, 0.27589, -0.14566 ] + - [ 32.0000, 1.08050, 0.41871, -0.18266 ] + - [ 36.1429, 1.04554, 0.51941, -0.20913 ] + - [ 40.2857, 1.00936, 0.62488, -0.23534 ] + - [ 44.4286, 0.96801, 0.73293, -0.25784 ] + - [ 48.5714, 0.91904, 0.84130, -0.28035 ] + - [ 52.7143, 0.86109, 0.94773, -0.30163 ] + - [ 56.8571, 0.79357, 1.05001, -0.32226 ] + - [ 61.0000, 0.71651, 1.14600, -0.34247 ] + - [ 65.1429, 0.63044, 1.23371, -0.36135 ] + - [ 69.2857, 0.53632, 1.31129, -0.38024 ] + - [ 73.4286, 0.43546, 1.37714, -0.39704 ] + - [ 77.5714, 0.32947, 1.42988, -0.41341 ] + - [ 81.7143, 0.22019, 1.46842, -0.42844 ] + - [ 85.8571, 0.10965, 1.49196, -0.44159 ] + - [ 90.0000, 0.00000, 1.50000, -0.45474 ] + - [ 94.1429, -0.07675, 1.49196, -0.46149 ] + - [ 98.2857, -0.15413, 1.46842, -0.46824 ] + - [ 102.4286, -0.23063, 1.42988, -0.47101 ] + - [ 106.5714, -0.30482, 1.37714, -0.47096 ] + - [ 110.7143, -0.37542, 1.31129, -0.46998 ] + - [ 114.8571, -0.44131, 1.23371, -0.46448 ] + - [ 119.0000, -0.50156, 1.14600, -0.45897 ] + - [ 123.1429, -0.55550, 1.05001, -0.45171 ] + - [ 127.2857, -0.60277, 0.94773, -0.44389 ] + - [ 131.4286, -0.64333, 0.84130, -0.43694 ] + - [ 135.5714, -0.67760, 0.73293, -0.43163 ] + - [ 139.7143, -0.70655, 0.62488, -0.42632 ] + - [ 143.8571, -0.73188, 0.51941, -0.42287 ] + - [ 148.0000, -0.75635, 0.41871, -0.41955 ] + - [ 150.2857, -0.70233, 0.36597, -0.41581 ] + - [ 152.5714, -0.64830, 0.31566, -0.39878 ] + - [ 154.8571, -0.59428, 0.26810, -0.38175 ] + - [ 157.1429, -0.54025, 0.22359, -0.36471 ] + - [ 159.4286, -0.48623, 0.18242, -0.34768 ] + - [ 161.7143, -0.43220, 0.14485, -0.37026 ] + - [ 164.0000, -0.37818, 0.11112, -0.40605 ] + - [ 166.2857, -0.32415, 0.08143, -0.44184 ] + - [ 168.5714, -0.27013, 0.05599, -0.47763 ] + - [ 170.8571, -0.21610, 0.03570, -0.45714 ] + - [ 173.1429, -0.16208, 0.03088, -0.34286 ] + - [ 175.4286, -0.10805, 0.02742, -0.22857 ] + - [ 177.7143, -0.05403, 0.02534, -0.11429 ] + - [ 179.9087, 0.00000, 0.02464, 0.00000 ] + - name : FFA-W3-241 # + relative_thickness : 0.241 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.01178, 0.00000 ] + - [ -177.7143, 0.05818, 0.01248, 0.09143 ] + - [ -175.4286, 0.11636, 0.01460, 0.18286 ] + - [ -173.1429, 0.17453, 0.01811, 0.27429 ] + - [ -170.8572, 0.23271, 0.02300, 0.36571 ] + - [ -168.5716, 0.29089, 0.02922, 0.39568 ] + - [ -166.2857, 0.34907, 0.05382, 0.38876 ] + - [ -164.0000, 0.40725, 0.08379, 0.38184 ] + - [ -161.7145, 0.46542, 0.11786, 0.37492 ] + - [ -159.4284, 0.52360, 0.15581, 0.37408 ] + - [ -157.1428, 0.58178, 0.19740, 0.39148 ] + - [ -154.8573, 0.63996, 0.24237, 0.40888 ] + - [ -152.5714, 0.69814, 0.29043, 0.42628 ] + - [ -150.2857, 0.75631, 0.34128, 0.44368 ] + - [ -148.0000, 0.81449, 0.39460, 0.44537 ] + - [ -143.8571, 0.77925, 0.49645, 0.44436 ] + - [ -139.7143, 0.74511, 0.60319, 0.44360 ] + - [ -135.5714, 0.70881, 0.71263, 0.44609 ] + - [ -131.4286, 0.66835, 0.82249, 0.44858 ] + - [ -127.2857, 0.62253, 0.93051, 0.45370 ] + - [ -123.1429, 0.57080, 1.03447, 0.46020 ] + - [ -119.0000, 0.51307, 1.13222, 0.46633 ] + - [ -114.8571, 0.44965, 1.22176, 0.47130 ] + - [ -110.7143, 0.38115, 1.30123, 0.47627 ] + - [ -106.5714, 0.30846, 1.36903, 0.47705 ] + - [ -102.4286, 0.23266, 1.42376, 0.47695 ] + - [ -98.2857, 0.15503, 1.46433, 0.47409 ] + - [ -94.1429, 0.07698, 1.48990, 0.46732 ] + - [ -90.0000, 0.00000, 1.50000, 0.46055 ] + - [ -85.8571, -0.07698, 1.48990, 0.44509 ] + - [ -81.7143, -0.15503, 1.46433, 0.42964 ] + - [ -77.5714, -0.23266, 1.42376, 0.41125 ] + - [ -73.4286, -0.30846, 1.36903, 0.39081 ] + - [ -69.2857, -0.38115, 1.30123, 0.36988 ] + - [ -65.1429, -0.44965, 1.22176, 0.34663 ] + - [ -61.0000, -0.51307, 1.13222, 0.32339 ] + - [ -56.8571, -0.57080, 1.03447, 0.29984 ] + - [ -52.7143, -0.62253, 0.93051, 0.27618 ] + - [ -48.5714, -0.66835, 0.82249, 0.25280 ] + - [ -44.4286, -0.70881, 0.71263, 0.22992 ] + - [ -40.2857, -0.74511, 0.60319, 0.20705 ] + - [ -36.1429, -0.77925, 0.49645, 0.14561 ] + - [ -32.0000, -0.81449, 0.39460, 0.08131 ] + - [ -28.0000, -1.07781, 0.22252, 0.04592 ] + - [ -24.0000, -1.12692, 0.15159, 0.01901 ] + - [ -20.0000, -1.14480, 0.09699, 0.00063 ] + - [ -18.0000, -1.12797, 0.07744, -0.00342 ] + - [ -16.0000, -1.09392, 0.06122, -0.00587 ] + - [ -14.0000, -1.05961, 0.04667, -0.00652 ] + - [ -12.0000, -1.03121, 0.03302, -0.00755 ] + - [ -10.0000, -0.93706, 0.02027, -0.02243 ] + - [ -8.0000, -0.67380, 0.01168, -0.05583 ] + - [ -6.0000, -0.40391, 0.00918, -0.07159 ] + - [ -4.0000, -0.14226, 0.00839, -0.08123 ] + - [ -2.0000, 0.11580, 0.00810, -0.08892 ] + - [ -1.0000, 0.24382, 0.00808, -0.09235 ] + - [ 0.0000, 0.37113, 0.00813, -0.09556 ] + - [ 1.0000, 0.49766, 0.00824, -0.09857 ] + - [ 2.0000, 0.62334, 0.00842, -0.10139 ] + - [ 3.0000, 0.74798, 0.00867, -0.10403 ] + - [ 4.0000, 0.87137, 0.00901, -0.10645 ] + - [ 5.0000, 0.99320, 0.00945, -0.10863 ] + - [ 6.0000, 1.11325, 0.00998, -0.11057 ] + - [ 7.0000, 1.23037, 0.01070, -0.11214 ] + - [ 8.0000, 1.34496, 0.01153, -0.11337 ] + - [ 9.0000, 1.45407, 0.01269, -0.11396 ] + - [ 10.0000, 1.55911, 0.01396, -0.11403 ] + - [ 11.0000, 1.65779, 0.01545, -0.11336 ] + - [ 12.0000, 1.74834, 0.01724, -0.11187 ] + - [ 13.0000, 1.82666, 0.01961, -0.10935 ] + - [ 14.0000, 1.88831, 0.02293, -0.10606 ] + - [ 15.0000, 1.92579, 0.02795, -0.10238 ] + - [ 16.0000, 1.92722, 0.03609, -0.09887 ] + - [ 18.0000, 1.80055, 0.06534, -0.09497 ] + - [ 20.0000, 1.63088, 0.10459, -0.09996 ] + - [ 24.0000, 1.43345, 0.19148, -0.12589 ] + - [ 28.0000, 1.28805, 0.28629, -0.15453 ] + - [ 32.0000, 1.16356, 0.39460, -0.18396 ] + - [ 36.1429, 1.11321, 0.49645, -0.21099 ] + - [ 40.2857, 1.06444, 0.60319, -0.23768 ] + - [ 44.4286, 1.01259, 0.71263, -0.25992 ] + - [ 48.5714, 0.95478, 0.82249, -0.28216 ] + - [ 52.7143, 0.88932, 0.93051, -0.30323 ] + - [ 56.8571, 0.81542, 1.03447, -0.32368 ] + - [ 61.0000, 0.73296, 1.13222, -0.34380 ] + - [ 65.1429, 0.64236, 1.22176, -0.36292 ] + - [ 69.2857, 0.54450, 1.30123, -0.38204 ] + - [ 73.4286, 0.44065, 1.36903, -0.39944 ] + - [ 77.5714, 0.33237, 1.42376, -0.41648 ] + - [ 81.7143, 0.22148, 1.46433, -0.43231 ] + - [ 85.8571, 0.10997, 1.48990, -0.44643 ] + - [ 90.0000, 0.00000, 1.50000, -0.46055 ] + - [ 94.1429, -0.07698, 1.48990, -0.46732 ] + - [ 98.2857, -0.15503, 1.46433, -0.47409 ] + - [ 102.4286, -0.23266, 1.42376, -0.47695 ] + - [ 106.5714, -0.30846, 1.36903, -0.47705 ] + - [ 110.7143, -0.38115, 1.30123, -0.47627 ] + - [ 114.8571, -0.44965, 1.22176, -0.47130 ] + - [ 119.0000, -0.51307, 1.13222, -0.46633 ] + - [ 123.1429, -0.57080, 1.03447, -0.46020 ] + - [ 127.2857, -0.62253, 0.93051, -0.45370 ] + - [ 131.4286, -0.66835, 0.82249, -0.44858 ] + - [ 135.5714, -0.70881, 0.71263, -0.44609 ] + - [ 139.7143, -0.74511, 0.60319, -0.44360 ] + - [ 143.8571, -0.77925, 0.49645, -0.44436 ] + - [ 148.0000, -0.81449, 0.39460, -0.44537 ] + - [ 150.2857, -0.75631, 0.34128, -0.44368 ] + - [ 152.5714, -0.69814, 0.29043, -0.42628 ] + - [ 154.8571, -0.63996, 0.24237, -0.40888 ] + - [ 157.1429, -0.58178, 0.19740, -0.39148 ] + - [ 159.4286, -0.52360, 0.15581, -0.37408 ] + - [ 161.7143, -0.46542, 0.11786, -0.39207 ] + - [ 164.0000, -0.40725, 0.08379, -0.42184 ] + - [ 166.2857, -0.34907, 0.05382, -0.45162 ] + - [ 168.5714, -0.29089, 0.02922, -0.48139 ] + - [ 170.8571, -0.23271, 0.02300, -0.45714 ] + - [ 173.1429, -0.17453, 0.01811, -0.34286 ] + - [ 175.4286, -0.11636, 0.01460, -0.22857 ] + - [ 177.7143, -0.05818, 0.01248, -0.11429 ] + - [ 179.9087, 0.00000, 0.01178, 0.00000 ] + - name : FFA-W3-270blend # + relative_thickness : 0.27 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.01545, 0.00000 ] + - [ -177.7143, 0.06213, 0.01611, 0.09143 ] + - [ -175.4286, 0.12426, 0.01807, 0.18286 ] + - [ -173.1429, 0.18639, 0.02133, 0.27429 ] + - [ -170.8572, 0.24852, 0.02587, 0.36571 ] + - [ -168.5716, 0.31064, 0.03289, 0.39874 ] + - [ -166.2857, 0.37277, 0.05681, 0.39672 ] + - [ -164.0000, 0.43490, 0.08471, 0.39470 ] + - [ -161.7145, 0.49703, 0.11643, 0.39268 ] + - [ -159.4284, 0.55916, 0.15176, 0.39544 ] + - [ -157.1428, 0.62129, 0.19048, 0.41254 ] + - [ -154.8573, 0.68342, 0.23234, 0.42964 ] + - [ -152.5714, 0.74555, 0.27708, 0.44674 ] + - [ -150.2857, 0.80768, 0.32441, 0.46384 ] + - [ -148.0000, 0.86981, 0.37404, 0.46186 ] + - [ -143.8571, 0.81660, 0.46882, 0.45335 ] + - [ -139.7143, 0.76812, 0.56814, 0.44523 ] + - [ -135.5714, 0.72040, 0.66995, 0.44237 ] + - [ -131.4286, 0.67095, 0.77214, 0.43951 ] + - [ -127.2857, 0.61828, 0.87258, 0.44072 ] + - [ -123.1429, 0.56158, 0.96921, 0.44407 ] + - [ -119.0000, 0.50057, 1.06002, 0.44739 ] + - [ -114.8571, 0.43540, 1.14315, 0.45063 ] + - [ -110.7143, 0.36655, 1.21688, 0.45387 ] + - [ -106.5714, 0.29475, 1.27969, 0.45377 ] + - [ -102.4286, 0.22098, 1.33030, 0.45298 ] + - [ -98.2857, 0.14639, 1.36768, 0.44973 ] + - [ -94.1429, 0.07227, 1.39107, 0.44302 ] + - [ -90.0000, 0.00000, 1.40000, 0.43630 ] + - [ -85.8571, -0.07227, 1.39107, 0.42180 ] + - [ -81.7143, -0.14639, 1.36768, 0.40730 ] + - [ -77.5714, -0.22098, 1.33030, 0.39020 ] + - [ -73.4286, -0.29475, 1.27969, 0.37125 ] + - [ -69.2857, -0.36655, 1.21688, 0.35190 ] + - [ -65.1429, -0.43540, 1.14315, 0.33068 ] + - [ -61.0000, -0.50057, 1.06002, 0.30945 ] + - [ -56.8571, -0.56158, 0.96921, 0.28815 ] + - [ -52.7143, -0.61828, 0.87258, 0.26684 ] + - [ -48.5714, -0.67095, 0.77214, 0.24576 ] + - [ -44.4286, -0.72040, 0.66995, 0.22512 ] + - [ -40.2857, -0.76812, 0.56814, 0.20447 ] + - [ -36.1429, -0.81660, 0.46882, 0.13957 ] + - [ -32.0000, -0.86981, 0.37404, 0.07138 ] + - [ -28.0000, -1.09837, 0.21880, 0.04400 ] + - [ -24.0000, -1.08339, 0.15982, 0.02166 ] + - [ -20.0000, -1.06990, 0.10744, 0.00422 ] + - [ -18.0000, -1.05454, 0.08690, -0.00035 ] + - [ -16.0000, -1.03432, 0.06844, -0.00334 ] + - [ -14.0000, -1.08360, 0.04733, -0.00283 ] + - [ -12.0000, -1.09489, 0.03085, -0.00556 ] + - [ -10.0000, -0.92665, 0.01984, -0.02952 ] + - [ -8.0000, -0.69676, 0.01439, -0.04822 ] + - [ -6.0000, -0.43628, 0.01155, -0.06483 ] + - [ -4.0000, -0.16252, 0.01026, -0.07919 ] + - [ -2.0000, 0.10709, 0.00976, -0.09041 ] + - [ -1.0000, 0.23993, 0.00967, -0.09517 ] + - [ 0.0000, 0.37158, 0.00968, -0.09953 ] + - [ 1.0000, 0.50210, 0.00976, -0.10355 ] + - [ 2.0000, 0.63139, 0.00993, -0.10725 ] + - [ 3.0000, 0.75951, 0.01016, -0.11068 ] + - [ 4.0000, 0.88638, 0.01045, -0.11385 ] + - [ 5.0000, 1.01172, 0.01082, -0.11673 ] + - [ 6.0000, 1.13430, 0.01140, -0.11923 ] + - [ 7.0000, 1.25536, 0.01198, -0.12145 ] + - [ 8.0000, 1.37379, 0.01267, -0.12328 ] + - [ 9.0000, 1.48841, 0.01353, -0.12460 ] + - [ 10.0000, 1.59782, 0.01460, -0.12526 ] + - [ 11.0000, 1.70005, 0.01597, -0.12505 ] + - [ 12.0000, 1.79190, 0.01777, -0.12370 ] + - [ 13.0000, 1.86782, 0.02035, -0.12093 ] + - [ 14.0000, 1.92687, 0.02385, -0.11725 ] + - [ 15.0000, 1.90901, 0.03236, -0.10931 ] + - [ 16.0000, 1.88548, 0.04259, -0.10525 ] + - [ 18.0000, 1.72106, 0.07672, -0.10292 ] + - [ 20.0000, 1.54737, 0.11914, -0.11017 ] + - [ 24.0000, 1.37176, 0.20189, -0.13431 ] + - [ 28.0000, 1.33611, 0.27981, -0.15777 ] + - [ 32.0000, 1.24258, 0.37404, -0.18432 ] + - [ 36.1429, 1.16657, 0.46882, -0.21002 ] + - [ 40.2857, 1.09731, 0.56814, -0.23531 ] + - [ 44.4286, 1.02914, 0.66995, -0.25508 ] + - [ 48.5714, 0.95850, 0.77214, -0.27485 ] + - [ 52.7143, 0.88325, 0.87258, -0.29346 ] + - [ 56.8571, 0.80225, 0.96921, -0.31145 ] + - [ 61.0000, 0.71510, 1.06002, -0.32925 ] + - [ 65.1429, 0.62200, 1.14315, -0.34641 ] + - [ 69.2857, 0.52364, 1.21688, -0.36357 ] + - [ 73.4286, 0.42107, 1.27969, -0.37949 ] + - [ 77.5714, 0.31569, 1.33030, -0.39517 ] + - [ 81.7143, 0.20913, 1.36768, -0.40983 ] + - [ 85.8571, 0.10324, 1.39107, -0.42306 ] + - [ 90.0000, 0.00000, 1.40000, -0.43630 ] + - [ 94.1429, -0.07227, 1.39107, -0.44302 ] + - [ 98.2857, -0.14639, 1.36768, -0.44973 ] + - [ 102.4286, -0.22098, 1.33030, -0.45298 ] + - [ 106.5714, -0.29475, 1.27969, -0.45377 ] + - [ 110.7143, -0.36655, 1.21688, -0.45387 ] + - [ 114.8571, -0.43540, 1.14315, -0.45063 ] + - [ 119.0000, -0.50057, 1.06002, -0.44739 ] + - [ 123.1429, -0.56158, 0.96921, -0.44407 ] + - [ 127.2857, -0.61828, 0.87258, -0.44072 ] + - [ 131.4286, -0.67095, 0.77214, -0.43951 ] + - [ 135.5714, -0.72040, 0.66995, -0.44237 ] + - [ 139.7143, -0.76812, 0.56814, -0.44523 ] + - [ 143.8571, -0.81660, 0.46882, -0.45335 ] + - [ 148.0000, -0.86981, 0.37404, -0.46186 ] + - [ 150.2857, -0.80768, 0.32441, -0.46384 ] + - [ 152.5714, -0.74555, 0.27708, -0.44674 ] + - [ 154.8571, -0.68342, 0.23234, -0.42964 ] + - [ 157.1429, -0.62129, 0.19048, -0.41254 ] + - [ 159.4286, -0.55916, 0.15176, -0.39544 ] + - [ 161.7143, -0.49703, 0.11643, -0.40982 ] + - [ 164.0000, -0.43490, 0.08471, -0.43470 ] + - [ 166.2857, -0.37277, 0.05681, -0.45958 ] + - [ 168.5714, -0.31064, 0.03289, -0.48445 ] + - [ 170.8571, -0.24852, 0.02587, -0.45714 ] + - [ 173.1429, -0.18639, 0.02133, -0.34286 ] + - [ 175.4286, -0.12426, 0.01807, -0.22857 ] + - [ 177.7143, -0.06213, 0.01611, -0.11429 ] + - [ 179.9087, 0.00000, 0.01545, 0.00000 ] + - name : FFA-W3-301 # + relative_thickness : 0.301 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.02454, 0.00000 ] + - [ -177.7143, 0.06508, 0.02514, 0.09143 ] + - [ -175.4286, 0.13016, 0.02694, 0.18286 ] + - [ -173.1429, 0.19525, 0.02993, 0.27429 ] + - [ -170.8572, 0.26033, 0.03408, 0.36571 ] + - [ -168.5716, 0.32541, 0.03938, 0.40085 ] + - [ -166.2857, 0.39049, 0.05910, 0.40220 ] + - [ -164.0000, 0.45557, 0.08495, 0.40356 ] + - [ -161.7145, 0.52066, 0.11433, 0.40492 ] + - [ -159.4284, 0.58574, 0.14704, 0.41010 ] + - [ -157.1428, 0.65082, 0.18290, 0.42678 ] + - [ -154.8573, 0.71590, 0.22166, 0.44345 ] + - [ -152.5714, 0.78098, 0.26309, 0.46013 ] + - [ -150.2857, 0.84607, 0.30692, 0.47680 ] + - [ -148.0000, 0.91115, 0.35287, 0.47162 ] + - [ -143.8571, 0.84257, 0.44061, 0.45656 ] + - [ -139.7143, 0.78187, 0.53255, 0.44202 ] + - [ -135.5714, 0.72448, 0.62677, 0.43452 ] + - [ -131.4286, 0.66755, 0.72131, 0.42701 ] + - [ -127.2857, 0.60928, 0.81421, 0.42483 ] + - [ -123.1429, 0.54868, 0.90355, 0.42544 ] + - [ -119.0000, 0.48530, 0.98748, 0.42634 ] + - [ -114.8571, 0.41915, 1.06425, 0.42813 ] + - [ -110.7143, 0.35056, 1.13227, 0.42992 ] + - [ -106.5714, 0.28017, 1.19015, 0.42916 ] + - [ -102.4286, 0.20881, 1.23669, 0.42788 ] + - [ -98.2857, 0.13754, 1.27093, 0.42444 ] + - [ -94.1429, 0.06751, 1.29218, 0.41794 ] + - [ -90.0000, 0.00000, 1.30000, 0.41144 ] + - [ -85.8571, -0.06751, 1.29218, 0.39804 ] + - [ -81.7143, -0.13754, 1.27093, 0.38464 ] + - [ -77.5714, -0.20881, 1.23669, 0.36892 ] + - [ -73.4286, -0.28017, 1.19015, 0.35157 ] + - [ -69.2857, -0.35056, 1.13227, 0.33391 ] + - [ -65.1429, -0.41915, 1.06425, 0.31474 ] + - [ -61.0000, -0.48530, 0.98748, 0.29557 ] + - [ -56.8571, -0.54868, 0.90355, 0.27653 ] + - [ -52.7143, -0.60928, 0.81421, 0.25754 ] + - [ -48.5714, -0.66755, 0.72131, 0.23873 ] + - [ -44.4286, -0.72448, 0.62677, 0.22027 ] + - [ -40.2857, -0.78187, 0.53255, 0.20181 ] + - [ -36.1429, -0.84257, 0.44061, 0.13644 ] + - [ -32.0000, -0.91115, 0.35287, 0.06760 ] + - [ -28.0000, -1.10349, 0.21721, 0.04231 ] + - [ -24.0000, -1.10737, 0.15629, 0.02026 ] + - [ -20.0000, -1.11815, 0.10335, 0.00407 ] + - [ -18.0000, -1.12332, 0.08180, 0.00017 ] + - [ -16.0000, -1.11865, 0.06331, -0.00167 ] + - [ -14.0000, -1.11620, 0.04718, -0.00120 ] + - [ -12.0000, -1.09588, 0.03280, -0.00463 ] + - [ -10.0000, -0.91767, 0.02351, -0.02494 ] + - [ -8.0000, -0.69311, 0.01793, -0.04304 ] + - [ -6.0000, -0.45396, 0.01431, -0.05868 ] + - [ -4.0000, -0.17779, 0.01242, -0.07601 ] + - [ -2.0000, 0.10480, 0.01160, -0.09121 ] + - [ -1.0000, 0.24383, 0.01143, -0.09763 ] + - [ 0.0000, 0.38111, 0.01138, -0.10341 ] + - [ 1.0000, 0.51660, 0.01143, -0.10861 ] + - [ 2.0000, 0.65044, 0.01156, -0.11333 ] + - [ 3.0000, 0.78267, 0.01177, -0.11762 ] + - [ 4.0000, 0.91326, 0.01204, -0.12154 ] + - [ 5.0000, 1.04207, 0.01239, -0.12510 ] + - [ 6.0000, 1.16873, 0.01283, -0.12828 ] + - [ 7.0000, 1.29296, 0.01338, -0.13104 ] + - [ 8.0000, 1.41390, 0.01406, -0.13332 ] + - [ 9.0000, 1.53088, 0.01488, -0.13503 ] + - [ 10.0000, 1.64208, 0.01592, -0.13599 ] + - [ 11.0000, 1.74568, 0.01726, -0.13605 ] + - [ 12.0000, 1.83887, 0.01908, -0.13514 ] + - [ 13.0000, 1.91764, 0.02169, -0.13322 ] + - [ 14.0000, 1.97413, 0.02572, -0.13020 ] + - [ 15.0000, 1.99916, 0.03222, -0.12641 ] + - [ 16.0000, 1.99377, 0.04157, -0.12265 ] + - [ 18.0000, 1.91720, 0.06731, -0.11675 ] + - [ 20.0000, 1.73683, 0.10526, -0.11652 ] + - [ 24.0000, 1.47321, 0.19229, -0.13790 ] + - [ 28.0000, 1.36017, 0.27449, -0.16242 ] + - [ 32.0000, 1.30164, 0.35287, -0.18463 ] + - [ 36.1429, 1.20367, 0.44061, -0.20894 ] + - [ 40.2857, 1.11695, 0.53255, -0.23276 ] + - [ 44.4286, 1.03498, 0.62677, -0.25011 ] + - [ 48.5714, 0.95364, 0.72131, -0.26746 ] + - [ 52.7143, 0.87040, 0.81421, -0.28365 ] + - [ 56.8571, 0.78383, 0.90355, -0.29923 ] + - [ 61.0000, 0.69329, 0.98748, -0.31472 ] + - [ 65.1429, 0.59878, 1.06425, -0.32988 ] + - [ 69.2857, 0.50080, 1.13227, -0.34505 ] + - [ 73.4286, 0.40024, 1.19015, -0.35942 ] + - [ 77.5714, 0.29831, 1.23669, -0.37363 ] + - [ 81.7143, 0.19648, 1.27093, -0.38702 ] + - [ 85.8571, 0.09644, 1.29218, -0.39923 ] + - [ 90.0000, 0.00000, 1.30000, -0.41144 ] + - [ 94.1429, -0.06751, 1.29218, -0.41794 ] + - [ 98.2857, -0.13754, 1.27093, -0.42444 ] + - [ 102.4286, -0.20881, 1.23669, -0.42788 ] + - [ 106.5714, -0.28017, 1.19015, -0.42916 ] + - [ 110.7143, -0.35056, 1.13227, -0.42992 ] + - [ 114.8571, -0.41915, 1.06425, -0.42813 ] + - [ 119.0000, -0.48530, 0.98748, -0.42634 ] + - [ 123.1429, -0.54868, 0.90355, -0.42544 ] + - [ 127.2857, -0.60928, 0.81421, -0.42483 ] + - [ 131.4286, -0.66755, 0.72131, -0.42701 ] + - [ 135.5714, -0.72448, 0.62677, -0.43452 ] + - [ 139.7143, -0.78187, 0.53255, -0.44202 ] + - [ 143.8571, -0.84257, 0.44061, -0.45656 ] + - [ 148.0000, -0.91115, 0.35287, -0.47162 ] + - [ 150.2857, -0.84607, 0.30692, -0.47680 ] + - [ 152.5714, -0.78098, 0.26309, -0.46013 ] + - [ 154.8571, -0.71590, 0.22166, -0.44345 ] + - [ 157.1429, -0.65082, 0.18290, -0.42678 ] + - [ 159.4286, -0.58574, 0.14704, -0.41010 ] + - [ 161.7143, -0.52066, 0.11433, -0.42206 ] + - [ 164.0000, -0.45557, 0.08495, -0.44356 ] + - [ 166.2857, -0.39049, 0.05910, -0.46506 ] + - [ 168.5714, -0.32541, 0.03938, -0.48656 ] + - [ 170.8571, -0.26033, 0.03408, -0.45714 ] + - [ 173.1429, -0.19525, 0.02993, -0.34286 ] + - [ 175.4286, -0.13016, 0.02694, -0.22857 ] + - [ 177.7143, -0.06508, 0.02514, -0.11429 ] + - [ 179.9087, 0.00000, 0.02454, 0.00000 ] + - name : FFA-W3-330blend # + relative_thickness : 0.33 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.03169, 0.00000 ] + - [ -177.7143, 0.06960, 0.03228, 0.09143 ] + - [ -175.4286, 0.13920, 0.03406, 0.18286 ] + - [ -173.1429, 0.20880, 0.03702, 0.27429 ] + - [ -170.8572, 0.27841, 0.04114, 0.36571 ] + - [ -168.5716, 0.34801, 0.04638, 0.40308 ] + - [ -166.2857, 0.41761, 0.05732, 0.40801 ] + - [ -164.0000, 0.48721, 0.08319, 0.41294 ] + - [ -161.7145, 0.55681, 0.11258, 0.41788 ] + - [ -159.4284, 0.62641, 0.14533, 0.42586 ] + - [ -157.1428, 0.69601, 0.18121, 0.44302 ] + - [ -154.8573, 0.76562, 0.22000, 0.46017 ] + - [ -152.5714, 0.83522, 0.26146, 0.47732 ] + - [ -150.2857, 0.90482, 0.30532, 0.49447 ] + - [ -148.0000, 0.97442, 0.35131, 0.48743 ] + - [ -143.8571, 0.89412, 0.43913, 0.46839 ] + - [ -139.7143, 0.82382, 0.53115, 0.44996 ] + - [ -135.5714, 0.75845, 0.62546, 0.43985 ] + - [ -131.4286, 0.69477, 0.72010, 0.42974 ] + - [ -127.2857, 0.63079, 0.81310, 0.42589 ] + - [ -123.1429, 0.56532, 0.90255, 0.42535 ] + - [ -119.0000, 0.49783, 0.98659, 0.42528 ] + - [ -114.8571, 0.42823, 1.06348, 0.42673 ] + - [ -110.7143, 0.35680, 1.13162, 0.42817 ] + - [ -106.5714, 0.28412, 1.18963, 0.42745 ] + - [ -102.4286, 0.21103, 1.23629, 0.42628 ] + - [ -98.2857, 0.13851, 1.27067, 0.42303 ] + - [ -94.1429, 0.06775, 1.29204, 0.41683 ] + - [ -90.0000, 0.00000, 1.30000, 0.41063 ] + - [ -85.8571, -0.06775, 1.29204, 0.39752 ] + - [ -81.7143, -0.13851, 1.27067, 0.38441 ] + - [ -77.5714, -0.21103, 1.23629, 0.36905 ] + - [ -73.4286, -0.28412, 1.18963, 0.35212 ] + - [ -69.2857, -0.35680, 1.13162, 0.33491 ] + - [ -65.1429, -0.42823, 1.06348, 0.31634 ] + - [ -61.0000, -0.49783, 0.98659, 0.29777 ] + - [ -56.8571, -0.56532, 0.90255, 0.27947 ] + - [ -52.7143, -0.63079, 0.81310, 0.26125 ] + - [ -48.5714, -0.69477, 0.72010, 0.24322 ] + - [ -44.4286, -0.75845, 0.62546, 0.22556 ] + - [ -40.2857, -0.82382, 0.53115, 0.20789 ] + - [ -36.1429, -0.89412, 0.43913, 0.13731 ] + - [ -32.0000, -0.97442, 0.35131, 0.06280 ] + - [ -28.0000, -1.16308, 0.20648, 0.03905 ] + - [ -24.0000, -1.14892, 0.15001, 0.01853 ] + - [ -20.0000, -1.09451, 0.10600, 0.00441 ] + - [ -18.0000, -1.05801, 0.08732, -0.00061 ] + - [ -16.0000, -1.02281, 0.07051, -0.00342 ] + - [ -14.0000, -0.99810, 0.05474, -0.00401 ] + - [ -12.0000, -0.98515, 0.04052, -0.00272 ] + - [ -10.0000, -0.89583, 0.02929, -0.01198 ] + - [ -8.0000, -0.67539, 0.02207, -0.03458 ] + - [ -6.0000, -0.43247, 0.01735, -0.05466 ] + - [ -4.0000, -0.15881, 0.01473, -0.07425 ] + - [ -2.0000, 0.13456, 0.01362, -0.09270 ] + - [ -1.0000, 0.28014, 0.01339, -0.10074 ] + - [ 0.0000, 0.42386, 0.01330, -0.10802 ] + - [ 1.0000, 0.56519, 0.01333, -0.11450 ] + - [ 2.0000, 0.70410, 0.01345, -0.12028 ] + - [ 3.0000, 0.84071, 0.01366, -0.12546 ] + - [ 4.0000, 0.97500, 0.01397, -0.13011 ] + - [ 5.0000, 1.10680, 0.01437, -0.13425 ] + - [ 6.0000, 1.23603, 0.01486, -0.13793 ] + - [ 7.0000, 1.36223, 0.01547, -0.14108 ] + - [ 8.0000, 1.48424, 0.01623, -0.14363 ] + - [ 9.0000, 1.60097, 0.01718, -0.14545 ] + - [ 10.0000, 1.71010, 0.01841, -0.14636 ] + - [ 11.0000, 1.80957, 0.02010, -0.14635 ] + - [ 12.0000, 1.89473, 0.02258, -0.14544 ] + - [ 13.0000, 1.95698, 0.02671, -0.14378 ] + - [ 14.0000, 1.98576, 0.03380, -0.14185 ] + - [ 15.0000, 1.99260, 0.04333, -0.14004 ] + - [ 16.0000, 1.99617, 0.05354, -0.13823 ] + - [ 18.0000, 1.96398, 0.07706, -0.13351 ] + - [ 20.0000, 1.81179, 0.11169, -0.13135 ] + - [ 24.0000, 1.56073, 0.19103, -0.14660 ] + - [ 28.0000, 1.46798, 0.27199, -0.17242 ] + - [ 32.0000, 1.39203, 0.35131, -0.19417 ] + - [ 36.1429, 1.27731, 0.43913, -0.21792 ] + - [ 40.2857, 1.17689, 0.53115, -0.24115 ] + - [ 44.4286, 1.08350, 0.62546, -0.25734 ] + - [ 48.5714, 0.99253, 0.72010, -0.27354 ] + - [ 52.7143, 0.90112, 0.81310, -0.28862 ] + - [ 56.8571, 0.80760, 0.90255, -0.30311 ] + - [ 61.0000, 0.71119, 0.98659, -0.31757 ] + - [ 65.1429, 0.61175, 1.06348, -0.33194 ] + - [ 69.2857, 0.50971, 1.13162, -0.34631 ] + - [ 73.4286, 0.40589, 1.18963, -0.36014 ] + - [ 77.5714, 0.30146, 1.23629, -0.37385 ] + - [ 81.7143, 0.19788, 1.27067, -0.38681 ] + - [ 85.8571, 0.09679, 1.29204, -0.39872 ] + - [ 90.0000, 0.00000, 1.30000, -0.41063 ] + - [ 94.1429, -0.06775, 1.29204, -0.41683 ] + - [ 98.2857, -0.13851, 1.27067, -0.42303 ] + - [ 102.4286, -0.21103, 1.23629, -0.42628 ] + - [ 106.5714, -0.28412, 1.18963, -0.42745 ] + - [ 110.7143, -0.35680, 1.13162, -0.42817 ] + - [ 114.8571, -0.42823, 1.06348, -0.42673 ] + - [ 119.0000, -0.49783, 0.98659, -0.42528 ] + - [ 123.1429, -0.56532, 0.90255, -0.42535 ] + - [ 127.2857, -0.63079, 0.81310, -0.42589 ] + - [ 131.4286, -0.69477, 0.72010, -0.42974 ] + - [ 135.5714, -0.75845, 0.62546, -0.43985 ] + - [ 139.7143, -0.82382, 0.53115, -0.44996 ] + - [ 143.8571, -0.89412, 0.43913, -0.46839 ] + - [ 148.0000, -0.97442, 0.35131, -0.48743 ] + - [ 150.2857, -0.90482, 0.30532, -0.49447 ] + - [ 152.5714, -0.83522, 0.26146, -0.47732 ] + - [ 154.8571, -0.76562, 0.22000, -0.46017 ] + - [ 157.1429, -0.69601, 0.18121, -0.44302 ] + - [ 159.4286, -0.62641, 0.14533, -0.42586 ] + - [ 161.7143, -0.55681, 0.11258, -0.43502 ] + - [ 164.0000, -0.48721, 0.08319, -0.45294 ] + - [ 166.2857, -0.41761, 0.05732, -0.47087 ] + - [ 168.5714, -0.34801, 0.04638, -0.48880 ] + - [ 170.8571, -0.27841, 0.04114, -0.45714 ] + - [ 173.1429, -0.20880, 0.03702, -0.34286 ] + - [ 175.4286, -0.13920, 0.03406, -0.22857 ] + - [ 177.7143, -0.06960, 0.03228, -0.11429 ] + - [ 179.9087, 0.00000, 0.03169, 0.00000 ] + - name : FFA-W3-360 # + relative_thickness : 0.36 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.03715, 0.00000 ] + - [ -177.7143, 0.07178, 0.03774, 0.09143 ] + - [ -175.4286, 0.14356, 0.03951, 0.18286 ] + - [ -173.1429, 0.21534, 0.04245, 0.27429 ] + - [ -170.8572, 0.28713, 0.04653, 0.36571 ] + - [ -168.5716, 0.35891, 0.05174, 0.40313 ] + - [ -166.2857, 0.43069, 0.06068, 0.40814 ] + - [ -164.0000, 0.50247, 0.08651, 0.41315 ] + - [ -161.7145, 0.57425, 0.11586, 0.41816 ] + - [ -159.4284, 0.64603, 0.14856, 0.42627 ] + - [ -157.1428, 0.71781, 0.18439, 0.44370 ] + - [ -154.8573, 0.78960, 0.22313, 0.46114 ] + - [ -152.5714, 0.86138, 0.26453, 0.47857 ] + - [ -150.2857, 0.93316, 0.30832, 0.49600 ] + - [ -148.0000, 1.00494, 0.35424, 0.48830 ] + - [ -143.8571, 0.91898, 0.44192, 0.46784 ] + - [ -139.7143, 0.84406, 0.53379, 0.44803 ] + - [ -135.5714, 0.77483, 0.62793, 0.43697 ] + - [ -131.4286, 0.70790, 0.72238, 0.42591 ] + - [ -127.2857, 0.64116, 0.81520, 0.42150 ] + - [ -123.1429, 0.57335, 0.90444, 0.42058 ] + - [ -119.0000, 0.50388, 0.98826, 0.42024 ] + - [ -114.8571, 0.43261, 1.06493, 0.42168 ] + - [ -110.7143, 0.35981, 1.13285, 0.42312 ] + - [ -106.5714, 0.28603, 1.19061, 0.42258 ] + - [ -102.4286, 0.21209, 1.23704, 0.42163 ] + - [ -98.2857, 0.13899, 1.27116, 0.41864 ] + - [ -94.1429, 0.06787, 1.29229, 0.41277 ] + - [ -90.0000, 0.00000, 1.30000, 0.40690 ] + - [ -85.8571, -0.06787, 1.29229, 0.39426 ] + - [ -81.7143, -0.13899, 1.27116, 0.38162 ] + - [ -77.5714, -0.21209, 1.23704, 0.36676 ] + - [ -73.4286, -0.28603, 1.19061, 0.35033 ] + - [ -69.2857, -0.35981, 1.13285, 0.33362 ] + - [ -65.1429, -0.43261, 1.06493, 0.31561 ] + - [ -61.0000, -0.50388, 0.98826, 0.29759 ] + - [ -56.8571, -0.57335, 0.90444, 0.27989 ] + - [ -52.7143, -0.64116, 0.81520, 0.26230 ] + - [ -48.5714, -0.70790, 0.72238, 0.24491 ] + - [ -44.4286, -0.77483, 0.62793, 0.22794 ] + - [ -40.2857, -0.84406, 0.53379, 0.21097 ] + - [ -36.1429, -0.91898, 0.44192, 0.13525 ] + - [ -32.0000, -1.00494, 0.35424, 0.05517 ] + - [ -28.0000, -1.11306, 0.20494, 0.03211 ] + - [ -24.0000, -1.05425, 0.15434, 0.01268 ] + - [ -20.0000, -0.98247, 0.10967, -0.00282 ] + - [ -18.0000, -0.94173, 0.09249, -0.00741 ] + - [ -16.0000, -0.89333, 0.07597, -0.01107 ] + - [ -14.0000, -0.85472, 0.06054, -0.01250 ] + - [ -12.0000, -0.82348, 0.04641, -0.01177 ] + - [ -10.0000, -0.79541, 0.03441, -0.01082 ] + - [ -8.0000, -0.63650, 0.02548, -0.02769 ] + - [ -6.0000, -0.39095, 0.01994, -0.05107 ] + - [ -4.0000, -0.13071, 0.01653, -0.07148 ] + - [ -2.0000, 0.16173, 0.01507, -0.09179 ] + - [ -1.0000, 0.31121, 0.01477, -0.10119 ] + - [ 0.0000, 0.45956, 0.01465, -0.10988 ] + - [ 1.0000, 0.60566, 0.01466, -0.11776 ] + - [ 2.0000, 0.74868, 0.01481, -0.12477 ] + - [ 3.0000, 0.88862, 0.01507, -0.13098 ] + - [ 4.0000, 1.02544, 0.01544, -0.13648 ] + - [ 5.0000, 1.15878, 0.01593, -0.14130 ] + - [ 6.0000, 1.28822, 0.01654, -0.14540 ] + - [ 7.0000, 1.41282, 0.01731, -0.14875 ] + - [ 8.0000, 1.53090, 0.01831, -0.15118 ] + - [ 9.0000, 1.64065, 0.01963, -0.15262 ] + - [ 10.0000, 1.73926, 0.02150, -0.15310 ] + - [ 11.0000, 1.81971, 0.02445, -0.15254 ] + - [ 12.0000, 1.87065, 0.02966, -0.15121 ] + - [ 13.0000, 1.89221, 0.03770, -0.14969 ] + - [ 14.0000, 1.87910, 0.04824, -0.14562 ] + - [ 15.0000, 1.88111, 0.05838, -0.14358 ] + - [ 16.0000, 1.86359, 0.06992, -0.14095 ] + - [ 18.0000, 1.73324, 0.10166, -0.13711 ] + - [ 20.0000, 1.59357, 0.13916, -0.14082 ] + - [ 24.0000, 1.46708, 0.21002, -0.15693 ] + - [ 28.0000, 1.44834, 0.28200, -0.17979 ] + - [ 32.0000, 1.43563, 0.35424, -0.20147 ] + - [ 36.1429, 1.31283, 0.44192, -0.22409 ] + - [ 40.2857, 1.20580, 0.53379, -0.24619 ] + - [ 44.4286, 1.10690, 0.62793, -0.26133 ] + - [ 48.5714, 1.01129, 0.72238, -0.27648 ] + - [ 52.7143, 0.91594, 0.81520, -0.29062 ] + - [ 56.8571, 0.81907, 0.90444, -0.30424 ] + - [ 61.0000, 0.71982, 0.98826, -0.31787 ] + - [ 65.1429, 0.61801, 1.06493, -0.33154 ] + - [ 69.2857, 0.51401, 1.13285, -0.34522 ] + - [ 73.4286, 0.40862, 1.19061, -0.35846 ] + - [ 77.5714, 0.30299, 1.23704, -0.37161 ] + - [ 81.7143, 0.19855, 1.27116, -0.38405 ] + - [ 85.8571, 0.09695, 1.29229, -0.39547 ] + - [ 90.0000, 0.00000, 1.30000, -0.40690 ] + - [ 94.1429, -0.06787, 1.29229, -0.41277 ] + - [ 98.2857, -0.13899, 1.27116, -0.41864 ] + - [ 102.4286, -0.21209, 1.23704, -0.42163 ] + - [ 106.5714, -0.28603, 1.19061, -0.42258 ] + - [ 110.7143, -0.35981, 1.13285, -0.42312 ] + - [ 114.8571, -0.43261, 1.06493, -0.42168 ] + - [ 119.0000, -0.50388, 0.98826, -0.42024 ] + - [ 123.1429, -0.57335, 0.90444, -0.42058 ] + - [ 127.2857, -0.64116, 0.81520, -0.42150 ] + - [ 131.4286, -0.70790, 0.72238, -0.42591 ] + - [ 135.5714, -0.77483, 0.62793, -0.43697 ] + - [ 139.7143, -0.84406, 0.53379, -0.44803 ] + - [ 143.8571, -0.91898, 0.44192, -0.46784 ] + - [ 148.0000, -1.00494, 0.35424, -0.48830 ] + - [ 150.2857, -0.93316, 0.30832, -0.49600 ] + - [ 152.5714, -0.86138, 0.26453, -0.47857 ] + - [ 154.8571, -0.78960, 0.22313, -0.46114 ] + - [ 157.1429, -0.71781, 0.18439, -0.44370 ] + - [ 159.4286, -0.64603, 0.14856, -0.42627 ] + - [ 161.7143, -0.57425, 0.11586, -0.43530 ] + - [ 164.0000, -0.50247, 0.08651, -0.45315 ] + - [ 166.2857, -0.43069, 0.06068, -0.47100 ] + - [ 168.5714, -0.35891, 0.05174, -0.48884 ] + - [ 170.8571, -0.28713, 0.04653, -0.45714 ] + - [ 173.1429, -0.21534, 0.04245, -0.34286 ] + - [ 175.4286, -0.14356, 0.03951, -0.22857 ] + - [ 177.7143, -0.07178, 0.03774, -0.11429 ] + - [ 179.9087, 0.00000, 0.03715, 0.00000 ] + + + + pitch_control: + GS_Angles: [0.06019804, 0.08713416, 0.10844806, 0.12685912, 0.14339822, 0.1586021 , 0.17279614, 0.18618935, 0.19892772, 0.21111989, 0.22285021, 0.23417256, 0.2451469 , 0.25580691, 0.26619545, 0.27632495, 0.28623134, 0.29593266, 0.30544521, 0.314779 , 0.32395154, 0.33297489, 0.3418577 , 0.35060844, 0.35923641, 0.36774807, 0.37614942, 0.38444655, 0.39264363, 0.40074407] + GS_Kp: [-0.9394215 , -0.80602855, -0.69555026, -0.60254912, -0.52318192, -0.45465531, -0.39489024, -0.34230736, -0.29568537, -0.25406506, -0.2166825 , -0.18292183, -0.15228099, -0.12434663, -0.09877533, -0.0752794 , -0.05361604, -0.0335789 , -0.01499149, 0.00229803, 0.01842102, 0.03349169, 0.0476098 , 0.0608629 , 0.07332812, 0.0850737 , 0.0961602 , 0.10664158, 0.11656607, 0.12597691] + GS_Ki: [-0.07416547, -0.06719673, -0.0614251 , -0.05656651, -0.0524202 , -0.04884022, -0.04571796, -0.04297091, -0.04053528, -0.03836094, -0.03640799, -0.03464426, -0.03304352, -0.03158417, -0.03024826, -0.02902079, -0.02788904, -0.02684226, -0.02587121, -0.02496797, -0.02412567, -0.02333834, -0.02260078, -0.02190841, -0.0212572 , -0.02064359, -0.0200644 , -0.01951683, -0.01899836, -0.01850671] + Fl_Kp: -9.35 + wt_ops: + v: [3.0, 3.266896551724138, 3.533793103448276, 3.800689655172414, 4.067586206896552, 4.334482758620689, 4.601379310344828, 4.868275862068966, 5.135172413793104, 5.402068965517241, 5.6689655172413795, 5.935862068965518, 6.2027586206896554, 6.469655172413793, 6.736551724137931, 7.00344827586207, 7.270344827586207, 7.537241379310345, 7.804137931034483, 8.071034482758622, 8.337931034482759, 8.604827586206897, 8.871724137931036, 9.138620689655173, 9.405517241379311, 9.672413793103448, 9.939310344827586, 10.206206896551725, 10.473103448275863, 10.74, 11.231724137931035, 11.723448275862069, 12.215172413793104, 12.706896551724139, 13.198620689655172, 13.690344827586207, 14.182068965517242, 14.673793103448276, 15.16551724137931, 15.657241379310346, 16.14896551724138, 16.640689655172416, 17.13241379310345, 17.624137931034483, 18.11586206896552, 18.607586206896553, 19.099310344827586, 19.591034482758623, 20.082758620689653, 20.57448275862069, 21.066206896551726, 21.557931034482756, 22.049655172413793, 22.54137931034483, 23.03310344827586, 23.524827586206897, 24.016551724137933, 24.508275862068963, 25.0] + pitch_op: [-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, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, 3.57152, 5.12896, 6.36736, 7.43866, 8.40197, 9.28843, 10.1161, 10.8974, 11.641, 12.3529, 13.038, 13.6997, 14.3409, 14.9642, 15.5713, 16.1639, 16.7435, 17.3109, 17.8673, 18.4136, 18.9506, 19.4788, 19.9989, 20.5112, 21.0164, 21.5147, 22.0067, 22.4925, 22.9724] + omega_op: [2.1486, 2.3397, 2.5309, 2.722, 2.9132, 3.1043, 3.2955, 3.4866, 3.6778, 3.8689, 4.0601, 4.2512, 4.4424, 4.6335, 4.8247, 5.0159, 5.207, 5.3982, 5.5893, 5.7805, 5.9716, 6.1628, 6.3539, 6.5451, 6.7362, 6.9274, 7.1185, 7.3097, 7.5008, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56] + gear_ratio: 1 + torque_control: + VS_KP: -38609162.66552 + VS_KI: -4588245.18720 + + + tower: # (could remove some entries that don't apply for the tower) + dlsMax : 30.0 # maximum node splitting section amount; can't be 0 + + name : tower # [-] an identifier (no longer has to be number) + type : beam # [-] + rA : [ 0, 0, 15] # [m] end A coordinates + rB : [ 0, 0, 144.582] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + E : 210e9 # [Pa] Young's modulus + G : 80e9 # [Pa] shear modulus + + # --- outer shell including hydro--- + # Simplified tower for testing - actual tower has more stations + stations : [15, 144.582] + d : [10, 6.5] + t : [0.082954, 0.021211] # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 0.0 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 0.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + # (neglecting axial coefficients for now) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] material density + + +platform: + + potModMaster : 1 # [int] master switch for potMod variables; 0=keeps all member potMod vars the same, 1=turns all potMod vars to False (no HAMS), 2=turns all potMod vars to True (no strip) + dlsMax : 10.0 # maximum node splitting section amount for platform members; can't be 0 + + + members: # list all members here + + - name : center_column # [-] an identifier (no longer has to be number) + type : rigid # [-] + rA : [ 0, 0, -20] # [m] end A coordinates + rB : [ 0, 0, 15] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : False # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + MCF : True + # --- outer shell including hydro--- + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 9.85 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 0.6 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 0.85 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.6 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.7 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + # --- handling of end caps or any internal structures if we need them --- + cap_stations : [ 0 ] # [m] location along member of any inner structures (in same scaling as set by 'stations') + cap_t : [ 0.001 ] # [m] thickness of any internal structures + cap_d_in : [ 0 ] # [m] inner diameter of internal structures (0 for full cap/bulkhead, >0 for a ring shape) + + + - name : outer_column # [-] an identifier (no longer has to be number) + type : rigid # [-] + rA : [51.75, 0, -20] # [m] end A coordinates + rB : [51.75, 0, 15] # [m] and B coordinates + heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : False # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + MCF : True + # --- outer shell including hydro--- + stations : [0, 35] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 12.23 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 0.6 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 0.85 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 1.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.7 # value of 3.0 gives more heave response # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + # --- ballast --- + l_fill : 1.4 # [m] + rho_fill : 5000 # [kg/m3] + # --- handling of end caps or any internal structures if we need them --- + cap_stations : [ 0 ] # [m] location along member of any inner structures (in same scaling as set by 'stations') + cap_t : [ 0.001 ] # [m] thickness of any internal structures + cap_d_in : [ 0 ] # [m] inner diameter of internal structures (0 for full cap/bulkhead, >0 for a ring shape) + + + - name : pontoon # [-] an identifier (no longer has to be number) + type : beam # [-] + rA : [ 5 , 0, -16.5] # [m] end A coordinates + rB : [ 45.5, 0, -16.5] # [m] and B coordinates + heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) + shape : rect # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : False # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + E : 210e9 # [Pa] Young's modulus + G : 80e9 # [Pa] shear modulus + # --- outer shell including hydro--- + stations : [0, 40.5] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : [12.4, 7.0] # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : [1.5, 2.2 ] # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : [2.2, 0.2 ] # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + l_fill : 40.5 # [m] + rho_fill : 1025.0 # [kg/m3] + + + - name : upper_support # [-] an identifier (no longer has to be number) + type : rigid # [-] + rA : [ 5 , 0, 14.545] # [m] end A coordinates + rB : [ 45.5, 0, 14.545] # [m] and B coordinates + heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : False # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + # --- outer shell including hydro--- + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 0.91 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.01 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 0.0 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 0.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + +joints: + # For now, we need a joint at the origin because some effects are still not properly accounted at node level (potential flow hydro and moorings) + - name : origin + type : cantilever + location : [0, 0, 0] + members : ['tower', 'center_column', 'upper_support'] + + - name : pontoon_inner + type : cantilever + location : [5, 0, -16.5] + members : ['pontoon', 'center_column'] + heading : [60, 180, 300] + + - name : pontoon_outer + type : cantilever + location : [45.5, 0, -16.5] + members : ['pontoon', 'outer_column'] + heading : [60, 180, 300] +mooring: + water_depth: 200 # [m] uniform water depth + + points: + - name: line1_anchor + type: fixed + location: [-837, 0.0, -200.0] + anchor_type: drag_embedment + + - name: line2_anchor + type: fixed + location: [418, 725, -200.0] + anchor_type: drag_embedment + + - name: line3_anchor + type: fixed + location: [418, -725, -200.0] + anchor_type: drag_embedment + + - name: line1_vessel + type: vessel + location: [-58, 0.0, -14.0] + + - name: line2_vessel + type: vessel + location: [29, 50, -14.0] + + - name: line3_vessel + type: vessel + location: [29, -50, -14.0] + + lines: + - name: line1 + endA: line1_anchor + endB: line1_vessel + type: chain + length: 850 + + - name: line2 + endA: line2_anchor + endB: line2_vessel + type: chain + length: 850 + + - name: line3 + endA: line3_anchor + endB: line3_vessel + type: chain + length: 850 + + line_types: + - name: chain + diameter: 0.185 + mass_density: 685.0 + stiffness: 3270e6 + breaking_load: 1e8 + cost: 100.0 + transverse_added_mass: 1.0 + tangential_added_mass: 0.0 + transverse_drag: 1.6 + tangential_drag: 0.1 + + anchor_types: + - name: drag_embedment + mass: 1e3 + cost: 1e4 + max_vertical_load: 0.0 + max_lateral_load: 1e5 + \ No newline at end of file diff --git a/tests/test_data/VolturnUS-S-flexible_true_analyzeCases.pkl b/tests/test_data/VolturnUS-S-flexible_true_analyzeCases.pkl new file mode 100644 index 00000000..bbe16cc2 Binary files /dev/null and b/tests/test_data/VolturnUS-S-flexible_true_analyzeCases.pkl differ diff --git a/tests/test_data/VolturnUS-S-flexible_true_calcCurrentLoads.pkl b/tests/test_data/VolturnUS-S-flexible_true_calcCurrentLoads.pkl new file mode 100644 index 00000000..166e79da Binary files /dev/null and b/tests/test_data/VolturnUS-S-flexible_true_calcCurrentLoads.pkl differ diff --git a/tests/test_data/VolturnUS-S-flexible_true_calcQTF_slenderBody.pkl b/tests/test_data/VolturnUS-S-flexible_true_calcQTF_slenderBody.pkl new file mode 100644 index 00000000..bf5a8741 Binary files /dev/null and b/tests/test_data/VolturnUS-S-flexible_true_calcQTF_slenderBody.pkl differ diff --git a/tests/test_data/VolturnUS-S-flexible_true_hydroConstants.pkl b/tests/test_data/VolturnUS-S-flexible_true_hydroConstants.pkl new file mode 100644 index 00000000..329c6533 Binary files /dev/null and b/tests/test_data/VolturnUS-S-flexible_true_hydroConstants.pkl differ diff --git a/tests/test_data/VolturnUS-S-flexible_true_hydroExcitation.pkl b/tests/test_data/VolturnUS-S-flexible_true_hydroExcitation.pkl new file mode 100644 index 00000000..6ea7dfd9 Binary files /dev/null and b/tests/test_data/VolturnUS-S-flexible_true_hydroExcitation.pkl differ diff --git a/tests/test_data/VolturnUS-S-flexible_true_hydroLinearization.pkl b/tests/test_data/VolturnUS-S-flexible_true_hydroLinearization.pkl new file mode 100644 index 00000000..5dfef97a Binary files /dev/null and b/tests/test_data/VolturnUS-S-flexible_true_hydroLinearization.pkl differ diff --git a/tests/test_data/VolturnUS-S-flexible_true_statics.pkl b/tests/test_data/VolturnUS-S-flexible_true_statics.pkl new file mode 100644 index 00000000..6645ea3c Binary files /dev/null and b/tests/test_data/VolturnUS-S-flexible_true_statics.pkl differ diff --git a/tests/test_data/VolturnUS-S-moorMod2.yaml b/tests/test_data/VolturnUS-S-moorMod2.yaml new file mode 100644 index 00000000..22698b0a --- /dev/null +++ b/tests/test_data/VolturnUS-S-moorMod2.yaml @@ -0,0 +1,1178 @@ +type: input file for RAFT +name: IEA 15 MW with VolturnUS-S steel semi +comments: Used to perform tests on FOWT and model class functionality. This file should contain a single FOWT. + + +settings: # global Settings + min_freq : 0.005 # [Hz] lowest frequency to consider, also the frequency bin width + max_freq : 0.200 # [Hz] highest frequency to consider + XiStart : 0 # sets initial amplitude of each DOF for all frequencies + nIter : 4 # sets how many iterations to perform in Model.solveDynamics() + +site: + water_depth : 200 # [m] uniform water depth + rho_water : 1025.0 # [kg/m^3] water density + rho_air : 1.225 # [kg/m^3] air density + mu_air : 1.81e-05 # air dynamic viscosity + shearExp : 0.12 # shear exponent + +cases: + + keys : [wind_speed, wind_heading, turbulence, turbine_status, yaw_misalign, wave_spectrum, wave_period, wave_height, wave_heading, current_speed, current_heading ] + data : # m/s deg % or e.g. IIB_NTM string deg string (s) (m) (deg) + - [ 0, 0, 0, operating, 0, JONSWAP, 12, 6, 0 , 0, 0 ] + - [ 10, 30, 0, operating, 0, JONSWAP, 12, 6, 0 , 1, 15 ] + +turbine: + + mRNA : 1001505.907 # [kg] RNA mass: m_blades = 3*68076.969 = 204230.907 kg (from ED.sum), m_yawbearing = 100000 kg, m_hub = 190000 kg, m_nacelle = 507275 kg + IxRNA : 0 # [kg-m2] RNA moment of inertia about local x axis (assumed to be identical to rotor axis for now, as approx) [kg-m^2] + IrRNA : 0 # [kg-m2] RNA moment of inertia about local y or z axes [kg-m^2] + xCG_RNA : -7.27 # [m] x location of RNA center of mass [m]: xg_blades = -13.0 m, xg_hub = -11.0 m, xg_nac = -4.99 m, xg_yaw = 0.0 m + hHub : 150.0 # [m] hub height above water line [m] + Fthrust : 1500.0E3 # [N] temporary thrust force to use + + I_drivetrain: 318628138.0 # full rotor + drivetrain inertia as felt on the high-speed shaft + + nBlades : 3 # number of blades + Zhub : 150.0 # hub height [m] + Rhub : 3.97 # hub radius [m] + precone : -4.0 # [deg] + shaft_tilt : -6.0 # [deg] + overhang : -12.0313 # [m] + aeroMod : 1 # 0 aerodynamics off; 1 aerodynamics on + + + blade: + precurveTip : -3.9999999999999964 # + presweepTip : 0.0 # + Rtip : 120.96999999936446 # rotor radius + + # r chord theta precurve presweep + geometry: + - [ 8.004, 5.228, 15.474, 0.035, 0.000 ] + - [ 12.039, 5.321, 14.692, 0.084, 0.000 ] + - [ 16.073, 5.458, 13.330, 0.139, 0.000 ] + - [ 20.108, 5.602, 11.644, 0.192, 0.000 ] + - [ 24.142, 5.718, 9.927, 0.232, 0.000 ] + - [ 28.177, 5.767, 8.438, 0.250, 0.000 ] + - [ 32.211, 5.713, 7.301, 0.250, 0.000 ] + - [ 36.246, 5.536, 6.232, 0.246, 0.000 ] + - [ 40.280, 5.291, 5.230, 0.240, 0.000 ] + - [ 44.315, 5.035, 4.348, 0.233, 0.000 ] + - [ 48.349, 4.815, 3.606, 0.218, 0.000 ] + - [ 52.384, 4.623, 2.978, 0.178, 0.000 ] + - [ 56.418, 4.432, 2.423, 0.100, 0.000 ] + - [ 60.453, 4.245, 1.924, 0.000, 0.000 ] + - [ 64.487, 4.065, 1.467, -0.112, 0.000 ] + - [ 68.522, 3.896, 1.056, -0.244, 0.000 ] + - [ 72.556, 3.735, 0.692, -0.415, 0.000 ] + - [ 76.591, 3.579, 0.355, -0.620, 0.000 ] + - [ 80.625, 3.425, 0.019, -0.846, 0.000 ] + - [ 84.660, 3.268, -0.358, -1.080, 0.000 ] + - [ 88.694, 3.112, -0.834, -1.330, 0.000 ] + - [ 92.729, 2.957, -1.374, -1.602, 0.000 ] + - [ 96.763, 2.800, -1.848, -1.895, 0.000 ] + - [ 100.798, 2.637, -2.136, -2.202, 0.000 ] + - [ 104.832, 2.464, -2.172, -2.523, 0.000 ] + - [ 108.867, 2.283, -2.108, -2.864, 0.000 ] + - [ 112.901, 2.096, -1.953, -3.224, 0.000 ] + - [ 116.936, 1.902, -1.662, -3.605, 0.000 ] + # station(rel) airfoil name + airfoils: + - [ 0.00000, circular ] + - [ 0.02000, circular ] + - [ 0.15000, SNL-FFA-W3-500 ] + - [ 0.24517, FFA-W3-360 ] + - [ 0.32884, FFA-W3-330blend ] + - [ 0.43918, FFA-W3-301 ] + - [ 0.53767, FFA-W3-270blend ] + - [ 0.63821, FFA-W3-241 ] + - [ 0.77174, FFA-W3-211 ] + - [ 1.00000, FFA-W3-211 ] + + + airfoils: + - name : circular # + relative_thickness : 1.0 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00010, 0.35000, -0.00010 ] + - [ 179.9087, 0.00010, 0.35000, -0.00010 ] + - name : SNL-FFA-W3-500 # + relative_thickness : 0.5 # + data: # alpha c_l c_d c_m + - [ -179.9660, 0.00000, 0.08440, 0.00000 ] + - [ -170.0000, 0.44190, 0.08440, 0.31250 ] + - [ -160.0002, 0.88370, 0.12680, 0.28310 ] + - [ -149.9998, 0.96740, 0.29270, 0.26320 ] + - [ -139.9999, 0.78010, 0.49700, 0.20480 ] + - [ -130.0001, 0.62930, 0.71610, 0.19320 ] + - [ -120.0003, 0.47850, 0.92460, 0.20080 ] + - [ -109.9999, 0.31890, 1.09850, 0.21360 ] + - [ -100.0000, 0.15530, 1.21820, 0.22210 ] + - [ -90.0002, 0.00000, 1.27070, 0.21980 ] + - [ -79.9998, -0.15530, 1.21820, 0.19600 ] + - [ -70.0000, -0.31890, 1.09850, 0.16350 ] + - [ -60.0001, -0.47840, 0.92460, 0.12850 ] + - [ -49.9997, -0.62930, 0.71610, 0.09650 ] + - [ -39.9999, -0.78010, 0.49700, 0.07160 ] + - [ -30.0001, -0.96740, 0.29270, 0.05220 ] + - [ -20.0002, -1.02810, 0.14990, -0.00630 ] + - [ -19.7499, -1.02430, 0.14720, -0.00890 ] + - [ -19.2502, -1.00520, 0.14470, -0.00990 ] + - [ -18.9999, -0.99710, 0.14330, -0.01050 ] + - [ -18.7500, -1.00520, 0.14030, -0.01100 ] + - [ -18.5002, -0.99950, 0.13860, -0.01160 ] + - [ -18.2499, -0.99080, 0.13730, -0.01200 ] + - [ -18.0000, -0.98150, 0.13600, -0.01260 ] + - [ -17.4998, -0.97640, 0.13220, -0.01350 ] + - [ -17.2500, -0.97050, 0.13060, -0.01390 ] + - [ -17.0002, -0.96550, 0.12900, -0.01430 ] + - [ -16.7498, -0.96620, 0.12680, -0.01470 ] + - [ -16.5000, -0.95440, 0.12580, -0.01510 ] + - [ -16.2502, -0.94440, 0.12460, -0.01550 ] + - [ -15.9998, -0.94050, 0.12290, -0.01580 ] + - [ -15.7500, -0.94330, 0.12060, -0.01610 ] + - [ -15.5002, -0.93300, 0.11950, -0.01640 ] + - [ -15.2498, -0.92110, 0.11850, -0.01680 ] + - [ -14.7502, -0.91580, 0.11500, -0.01730 ] + - [ -14.4998, -0.90700, 0.11380, -0.01750 ] + - [ -14.2500, -0.89590, 0.11270, -0.01780 ] + - [ -14.0002, -0.89260, 0.11100, -0.01810 ] + - [ -13.7498, -0.88080, 0.11000, -0.01840 ] + - [ -13.5000, -0.87220, 0.10890, -0.01860 ] + - [ -13.2502, -0.86600, 0.10750, -0.01880 ] + - [ -12.9998, -0.86260, 0.10590, -0.01880 ] + - [ -12.7500, -0.84890, 0.10510, -0.01920 ] + - [ -12.5002, -0.83630, 0.10420, -0.01940 ] + - [ -12.2498, -0.83630, 0.10230, -0.01940 ] + - [ -12.0000, -0.82710, 0.10130, -0.01960 ] + - [ -11.7502, -0.81410, 0.10040, -0.01980 ] + - [ -11.4998, -0.80040, 0.09970, -0.02000 ] + - [ -11.0002, -0.78900, 0.09710, -0.01990 ] + - [ -10.7498, -0.78620, 0.09560, -0.01960 ] + - [ -10.5000, -0.77470, 0.09480, -0.01940 ] + - [ -10.2502, -0.77010, 0.09400, -0.01840 ] + - [ -9.9998, -0.76740, 0.09250, -0.01830 ] + - [ -9.7500, -0.75060, 0.09170, -0.01920 ] + - [ -9.5002, -0.72900, 0.09120, -0.02050 ] + - [ -9.2498, -0.70950, 0.09020, -0.02240 ] + - [ -9.0000, -0.68550, 0.08950, -0.02470 ] + - [ -8.7502, -0.65900, 0.08910, -0.02670 ] + - [ -8.4998, -0.63190, 0.08870, -0.02870 ] + - [ -8.2500, -0.60190, 0.08790, -0.03200 ] + - [ -8.0002, -0.57180, 0.08750, -0.03450 ] + - [ -7.7498, -0.54240, 0.08730, -0.03670 ] + - [ -7.5000, -0.50980, 0.08680, -0.03990 ] + - [ -7.2502, -0.47670, 0.08640, -0.04300 ] + - [ -6.9998, -0.44540, 0.08620, -0.04530 ] + - [ -6.7500, -0.41420, 0.08600, -0.04760 ] + - [ -6.5002, -0.37910, 0.08560, -0.05100 ] + - [ -6.2498, -0.34600, 0.08530, -0.05380 ] + - [ -6.0000, -0.31440, 0.08520, -0.05600 ] + - [ -5.7502, -0.28170, 0.08500, -0.05860 ] + - [ -5.4998, -0.24610, 0.08470, -0.06190 ] + - [ -5.2500, -0.21330, 0.08460, -0.06440 ] + - [ -5.0002, -0.18270, 0.08450, -0.06630 ] + - [ -4.7498, -0.14940, 0.08430, -0.06880 ] + - [ -4.5000, -0.11580, 0.08420, -0.07150 ] + - [ -4.2502, -0.08370, 0.08400, -0.07370 ] + - [ -3.9998, -0.05290, 0.08400, -0.07560 ] + - [ -3.7500, -0.02250, 0.08390, -0.07740 ] + - [ -3.5002, 0.00890, 0.08380, -0.07930 ] + - [ -3.2498, 0.03920, 0.08380, -0.08110 ] + - [ -3.0000, 0.06860, 0.08380, -0.08260 ] + - [ -2.7502, 0.09740, 0.08380, -0.08380 ] + - [ -2.4998, 0.12600, 0.08380, -0.08520 ] + - [ -2.2500, 0.15550, 0.08380, -0.08670 ] + - [ -2.0002, 0.18530, 0.08380, -0.08830 ] + - [ -1.7498, 0.21460, 0.08370, -0.08970 ] + - [ -1.5000, 0.24300, 0.08370, -0.09100 ] + - [ -1.2502, 0.27130, 0.08380, -0.09210 ] + - [ -0.9998, 0.30060, 0.08380, -0.09360 ] + - [ -0.7500, 0.32950, 0.08380, -0.09490 ] + - [ -0.5002, 0.35780, 0.08380, -0.09610 ] + - [ -0.2498, 0.38570, 0.08380, -0.09720 ] + - [ 0.0000, 0.41350, 0.08380, -0.09830 ] + - [ 0.2298, 0.44250, 0.08390, -0.09950 ] + - [ 0.4698, 0.47150, 0.08390, -0.10080 ] + - [ 0.7002, 0.50030, 0.08390, -0.10190 ] + - [ 0.9402, 0.52860, 0.08400, -0.10290 ] + - [ 1.1700, 0.55670, 0.08400, -0.10400 ] + - [ 1.3997, 0.58500, 0.08410, -0.10500 ] + - [ 1.6398, 0.61350, 0.08410, -0.10610 ] + - [ 1.8701, 0.64170, 0.08420, -0.10720 ] + - [ 2.1102, 0.66970, 0.08420, -0.10820 ] + - [ 2.3400, 0.69750, 0.08430, -0.10910 ] + - [ 2.5697, 0.72510, 0.08430, -0.11000 ] + - [ 2.8098, 0.75280, 0.08440, -0.11090 ] + - [ 3.0401, 0.78070, 0.08450, -0.11190 ] + - [ 3.2802, 0.80830, 0.08460, -0.11280 ] + - [ 3.5099, 0.83580, 0.08460, -0.11370 ] + - [ 3.7403, 0.86310, 0.08470, -0.11460 ] + - [ 3.9798, 0.89020, 0.08470, -0.11530 ] + - [ 4.2101, 0.91730, 0.08480, -0.11610 ] + - [ 4.4502, 0.94440, 0.08490, -0.11700 ] + - [ 4.6799, 0.97130, 0.08500, -0.11780 ] + - [ 4.9102, 0.99810, 0.08510, -0.11850 ] + - [ 5.1497, 1.02490, 0.08520, -0.11920 ] + - [ 5.3801, 1.05150, 0.08530, -0.11990 ] + - [ 5.6201, 1.07790, 0.08530, -0.12060 ] + - [ 5.8499, 1.10410, 0.08540, -0.12120 ] + - [ 6.0802, 1.13020, 0.08560, -0.12180 ] + - [ 6.3197, 1.15600, 0.08570, -0.12240 ] + - [ 6.5501, 1.18180, 0.08580, -0.12300 ] + - [ 6.7901, 1.20760, 0.08590, -0.12350 ] + - [ 7.0199, 1.23340, 0.08600, -0.12400 ] + - [ 7.2502, 1.25890, 0.08610, -0.12450 ] + - [ 7.4903, 1.28410, 0.08620, -0.12500 ] + - [ 7.7200, 1.30880, 0.08640, -0.12540 ] + - [ 7.9601, 1.33310, 0.08650, -0.12570 ] + - [ 8.1899, 1.35700, 0.08670, -0.12590 ] + - [ 8.4202, 1.38100, 0.08690, -0.12620 ] + - [ 8.6603, 1.40540, 0.08700, -0.12650 ] + - [ 8.8900, 1.42950, 0.08710, -0.12670 ] + - [ 9.1198, 1.45310, 0.08730, -0.12700 ] + - [ 9.8801, 1.51540, 0.08790, -0.12650 ] + - [ 10.6398, 1.57490, 0.08860, -0.12560 ] + - [ 11.4001, 1.61510, 0.08950, -0.12140 ] + - [ 12.1501, 1.64430, 0.09120, -0.11630 ] + - [ 12.9099, 1.68240, 0.09300, -0.11330 ] + - [ 13.6702, 1.71460, 0.09540, -0.11070 ] + - [ 14.4202, 1.73620, 0.09890, -0.10800 ] + - [ 15.1799, 1.76270, 0.10240, -0.10630 ] + - [ 15.9403, 1.77060, 0.10760, -0.10420 ] + - [ 16.6903, 1.76390, 0.11440, -0.10250 ] + - [ 17.4500, 1.76040, 0.12110, -0.10130 ] + - [ 18.2097, 1.72510, 0.13100, -0.10010 ] + - [ 18.9701, 1.70350, 0.13990, -0.09980 ] + - [ 19.7201, 1.67840, 0.14920, -0.10010 ] + - [ 20.4798, 1.65050, 0.15910, -0.10160 ] + - [ 21.2401, 1.62270, 0.16910, -0.10360 ] + - [ 21.9901, 1.60670, 0.17780, -0.10640 ] + - [ 22.7499, 1.59720, 0.18580, -0.10990 ] + - [ 23.5102, 1.58920, 0.19370, -0.11360 ] + - [ 24.2602, 1.58150, 0.20140, -0.11800 ] + - [ 25.0199, 1.55630, 0.21350, -0.12490 ] + - [ 25.7802, 1.52720, 0.22670, -0.13250 ] + - [ 26.5302, 1.49820, 0.23990, -0.14000 ] + - [ 27.2900, 1.46910, 0.25310, -0.14760 ] + - [ 28.0497, 1.44010, 0.26630, -0.15510 ] + - [ 28.8100, 1.41100, 0.27950, -0.16270 ] + - [ 29.5600, 1.38200, 0.29270, -0.17030 ] + - [ 30.3198, 1.36220, 0.30780, -0.17400 ] + - [ 31.0801, 1.34240, 0.32300, -0.17770 ] + - [ 31.8301, 1.32250, 0.33810, -0.18150 ] + - [ 32.5898, 1.30270, 0.35320, -0.18520 ] + - [ 33.3502, 1.28290, 0.36840, -0.18890 ] + - [ 34.1002, 1.26310, 0.38350, -0.19260 ] + - [ 34.8599, 1.24330, 0.39870, -0.19640 ] + - [ 35.6202, 1.22340, 0.41380, -0.20010 ] + - [ 36.3800, 1.20360, 0.42890, -0.20390 ] + - [ 37.1300, 1.18380, 0.44410, -0.20760 ] + - [ 37.8903, 1.16400, 0.45920, -0.21130 ] + - [ 38.6500, 1.14420, 0.47430, -0.21500 ] + - [ 39.4000, 1.12430, 0.48950, -0.21880 ] + - [ 40.1598, 1.10640, 0.50520, -0.22180 ] + - [ 40.9201, 1.09050, 0.52140, -0.22420 ] + - [ 41.6701, 1.07450, 0.53760, -0.22660 ] + - [ 42.4298, 1.05860, 0.55380, -0.22890 ] + - [ 43.1901, 1.04260, 0.57010, -0.23130 ] + - [ 43.9401, 1.02670, 0.58630, -0.23370 ] + - [ 44.6999, 1.01070, 0.60250, -0.23610 ] + - [ 45.4602, 0.99480, 0.61880, -0.23840 ] + - [ 46.2199, 0.97880, 0.63500, -0.24080 ] + - [ 46.9699, 0.96280, 0.65120, -0.24320 ] + - [ 47.7302, 0.94690, 0.66750, -0.24550 ] + - [ 48.4900, 0.93090, 0.68370, -0.24790 ] + - [ 49.2400, 0.91500, 0.69990, -0.25030 ] + - [ 49.9997, 0.89900, 0.71610, -0.25270 ] + - [ 60.0001, 0.68360, 0.92460, -0.28330 ] + - [ 70.0000, 0.45560, 1.09850, -0.31560 ] + - [ 79.9998, 0.22190, 1.21820, -0.34820 ] + - [ 90.0002, 0.00000, 1.27070, -0.37730 ] + - [ 100.0000, -0.15530, 1.21820, -0.38770 ] + - [ 109.9999, -0.31890, 1.09850, -0.38650 ] + - [ 120.0003, -0.47840, 0.92460, -0.38060 ] + - [ 130.0001, -0.62930, 0.71610, -0.38030 ] + - [ 139.9999, -0.78010, 0.49700, -0.40320 ] + - [ 149.9998, -0.96740, 0.29270, -0.48540 ] + - [ 160.0002, -0.88370, 0.12680, -0.53250 ] + - [ 170.0000, -0.44180, 0.08440, -0.39060 ] + - [ 179.9660, 0.00000, 0.08440, 0.00000 ] + - name : FFA-W3-211 # + relative_thickness : 0.211 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.02464, 0.00000 ] + - [ -177.7143, 0.05403, 0.02534, 0.09143 ] + - [ -175.4286, 0.10805, 0.02742, 0.18286 ] + - [ -173.1429, 0.16208, 0.03088, 0.27429 ] + - [ -170.8572, 0.21610, 0.03570, 0.36571 ] + - [ -168.5716, 0.27013, 0.05599, 0.39192 ] + - [ -166.2857, 0.32415, 0.08143, 0.37898 ] + - [ -164.0000, 0.37818, 0.11112, 0.36605 ] + - [ -161.7145, 0.43220, 0.14485, 0.35312 ] + - [ -159.4284, 0.48623, 0.18242, 0.34768 ] + - [ -157.1428, 0.54025, 0.22359, 0.36471 ] + - [ -154.8573, 0.59428, 0.26810, 0.38175 ] + - [ -152.5714, 0.64830, 0.31566, 0.39878 ] + - [ -150.2857, 0.70233, 0.36597, 0.41581 ] + - [ -148.0000, 0.75635, 0.41871, 0.41955 ] + - [ -143.8571, 0.73188, 0.51941, 0.42287 ] + - [ -139.7143, 0.70655, 0.62488, 0.42632 ] + - [ -135.5714, 0.67760, 0.73293, 0.43163 ] + - [ -131.4286, 0.64333, 0.84130, 0.43694 ] + - [ -127.2857, 0.60277, 0.94773, 0.44389 ] + - [ -123.1429, 0.55550, 1.05001, 0.45171 ] + - [ -119.0000, 0.50156, 1.14600, 0.45897 ] + - [ -114.8571, 0.44131, 1.23371, 0.46448 ] + - [ -110.7143, 0.37542, 1.31129, 0.46998 ] + - [ -106.5714, 0.30482, 1.37714, 0.47096 ] + - [ -102.4286, 0.23063, 1.42988, 0.47101 ] + - [ -98.2857, 0.15413, 1.46842, 0.46824 ] + - [ -94.1429, 0.07675, 1.49196, 0.46149 ] + - [ -90.0000, 0.00000, 1.50000, 0.45474 ] + - [ -85.8571, -0.07675, 1.49196, 0.44026 ] + - [ -81.7143, -0.15413, 1.46842, 0.42578 ] + - [ -77.5714, -0.23063, 1.42988, 0.40821 ] + - [ -73.4286, -0.30482, 1.37714, 0.38846 ] + - [ -69.2857, -0.37542, 1.31129, 0.36815 ] + - [ -65.1429, -0.44131, 1.23371, 0.34519 ] + - [ -61.0000, -0.50156, 1.14600, 0.32223 ] + - [ -56.8571, -0.55550, 1.05001, 0.29864 ] + - [ -52.7143, -0.60277, 0.94773, 0.27486 ] + - [ -48.5714, -0.64333, 0.84130, 0.25128 ] + - [ -44.4286, -0.67760, 0.73293, 0.22810 ] + - [ -40.2857, -0.70655, 0.62488, 0.20491 ] + - [ -36.1429, -0.73188, 0.51941, 0.15416 ] + - [ -32.0000, -0.75635, 0.41871, 0.10137 ] + - [ -28.0000, -0.85636, 0.28691, 0.06527 ] + - [ -24.0000, -1.18292, 0.13960, 0.01647 ] + - [ -20.0000, -1.23596, 0.08345, -0.00352 ] + - [ -18.0000, -1.22536, 0.06509, -0.00672 ] + - [ -16.0000, -1.20476, 0.04888, -0.00881 ] + - [ -14.0000, -1.18332, 0.03417, -0.01101 ] + - [ -12.0000, -1.10093, 0.02132, -0.02269 ] + - [ -10.0000, -0.88209, 0.01386, -0.04397 ] + - [ -8.0000, -0.62981, 0.01075, -0.05756 ] + - [ -6.0000, -0.37670, 0.00882, -0.06747 ] + - [ -4.0000, -0.12177, 0.00702, -0.07680 ] + - [ -2.0000, 0.12810, 0.00663, -0.08283 ] + - [ -1.0000, 0.25192, 0.00664, -0.08534 ] + - [ 0.0000, 0.37535, 0.00670, -0.08777 ] + - [ 1.0000, 0.49828, 0.00681, -0.09011 ] + - [ 2.0000, 0.62052, 0.00698, -0.09234 ] + - [ 3.0000, 0.74200, 0.00720, -0.09447 ] + - [ 4.0000, 0.86238, 0.00751, -0.09646 ] + - [ 5.0000, 0.98114, 0.00796, -0.09828 ] + - [ 6.0000, 1.09662, 0.00872, -0.09977 ] + - [ 7.0000, 1.20904, 0.00968, -0.10095 ] + - [ 8.0000, 1.31680, 0.01097, -0.10163 ] + - [ 9.0000, 1.42209, 0.01227, -0.10207 ] + - [ 10.0000, 1.52361, 0.01369, -0.10213 ] + - [ 11.0000, 1.61988, 0.01529, -0.10174 ] + - [ 12.0000, 1.70937, 0.01717, -0.10087 ] + - [ 13.0000, 1.78681, 0.01974, -0.09936 ] + - [ 14.0000, 1.84290, 0.02368, -0.09720 ] + - [ 15.0000, 1.85313, 0.03094, -0.09410 ] + - [ 16.0000, 1.80951, 0.04303, -0.09144 ] + - [ 18.0000, 1.66033, 0.07730, -0.09242 ] + - [ 20.0000, 1.56152, 0.11202, -0.09871 ] + - [ 24.0000, 1.43327, 0.18408, -0.11770 ] + - [ 28.0000, 1.29062, 0.27589, -0.14566 ] + - [ 32.0000, 1.08050, 0.41871, -0.18266 ] + - [ 36.1429, 1.04554, 0.51941, -0.20913 ] + - [ 40.2857, 1.00936, 0.62488, -0.23534 ] + - [ 44.4286, 0.96801, 0.73293, -0.25784 ] + - [ 48.5714, 0.91904, 0.84130, -0.28035 ] + - [ 52.7143, 0.86109, 0.94773, -0.30163 ] + - [ 56.8571, 0.79357, 1.05001, -0.32226 ] + - [ 61.0000, 0.71651, 1.14600, -0.34247 ] + - [ 65.1429, 0.63044, 1.23371, -0.36135 ] + - [ 69.2857, 0.53632, 1.31129, -0.38024 ] + - [ 73.4286, 0.43546, 1.37714, -0.39704 ] + - [ 77.5714, 0.32947, 1.42988, -0.41341 ] + - [ 81.7143, 0.22019, 1.46842, -0.42844 ] + - [ 85.8571, 0.10965, 1.49196, -0.44159 ] + - [ 90.0000, 0.00000, 1.50000, -0.45474 ] + - [ 94.1429, -0.07675, 1.49196, -0.46149 ] + - [ 98.2857, -0.15413, 1.46842, -0.46824 ] + - [ 102.4286, -0.23063, 1.42988, -0.47101 ] + - [ 106.5714, -0.30482, 1.37714, -0.47096 ] + - [ 110.7143, -0.37542, 1.31129, -0.46998 ] + - [ 114.8571, -0.44131, 1.23371, -0.46448 ] + - [ 119.0000, -0.50156, 1.14600, -0.45897 ] + - [ 123.1429, -0.55550, 1.05001, -0.45171 ] + - [ 127.2857, -0.60277, 0.94773, -0.44389 ] + - [ 131.4286, -0.64333, 0.84130, -0.43694 ] + - [ 135.5714, -0.67760, 0.73293, -0.43163 ] + - [ 139.7143, -0.70655, 0.62488, -0.42632 ] + - [ 143.8571, -0.73188, 0.51941, -0.42287 ] + - [ 148.0000, -0.75635, 0.41871, -0.41955 ] + - [ 150.2857, -0.70233, 0.36597, -0.41581 ] + - [ 152.5714, -0.64830, 0.31566, -0.39878 ] + - [ 154.8571, -0.59428, 0.26810, -0.38175 ] + - [ 157.1429, -0.54025, 0.22359, -0.36471 ] + - [ 159.4286, -0.48623, 0.18242, -0.34768 ] + - [ 161.7143, -0.43220, 0.14485, -0.37026 ] + - [ 164.0000, -0.37818, 0.11112, -0.40605 ] + - [ 166.2857, -0.32415, 0.08143, -0.44184 ] + - [ 168.5714, -0.27013, 0.05599, -0.47763 ] + - [ 170.8571, -0.21610, 0.03570, -0.45714 ] + - [ 173.1429, -0.16208, 0.03088, -0.34286 ] + - [ 175.4286, -0.10805, 0.02742, -0.22857 ] + - [ 177.7143, -0.05403, 0.02534, -0.11429 ] + - [ 179.9087, 0.00000, 0.02464, 0.00000 ] + - name : FFA-W3-241 # + relative_thickness : 0.241 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.01178, 0.00000 ] + - [ -177.7143, 0.05818, 0.01248, 0.09143 ] + - [ -175.4286, 0.11636, 0.01460, 0.18286 ] + - [ -173.1429, 0.17453, 0.01811, 0.27429 ] + - [ -170.8572, 0.23271, 0.02300, 0.36571 ] + - [ -168.5716, 0.29089, 0.02922, 0.39568 ] + - [ -166.2857, 0.34907, 0.05382, 0.38876 ] + - [ -164.0000, 0.40725, 0.08379, 0.38184 ] + - [ -161.7145, 0.46542, 0.11786, 0.37492 ] + - [ -159.4284, 0.52360, 0.15581, 0.37408 ] + - [ -157.1428, 0.58178, 0.19740, 0.39148 ] + - [ -154.8573, 0.63996, 0.24237, 0.40888 ] + - [ -152.5714, 0.69814, 0.29043, 0.42628 ] + - [ -150.2857, 0.75631, 0.34128, 0.44368 ] + - [ -148.0000, 0.81449, 0.39460, 0.44537 ] + - [ -143.8571, 0.77925, 0.49645, 0.44436 ] + - [ -139.7143, 0.74511, 0.60319, 0.44360 ] + - [ -135.5714, 0.70881, 0.71263, 0.44609 ] + - [ -131.4286, 0.66835, 0.82249, 0.44858 ] + - [ -127.2857, 0.62253, 0.93051, 0.45370 ] + - [ -123.1429, 0.57080, 1.03447, 0.46020 ] + - [ -119.0000, 0.51307, 1.13222, 0.46633 ] + - [ -114.8571, 0.44965, 1.22176, 0.47130 ] + - [ -110.7143, 0.38115, 1.30123, 0.47627 ] + - [ -106.5714, 0.30846, 1.36903, 0.47705 ] + - [ -102.4286, 0.23266, 1.42376, 0.47695 ] + - [ -98.2857, 0.15503, 1.46433, 0.47409 ] + - [ -94.1429, 0.07698, 1.48990, 0.46732 ] + - [ -90.0000, 0.00000, 1.50000, 0.46055 ] + - [ -85.8571, -0.07698, 1.48990, 0.44509 ] + - [ -81.7143, -0.15503, 1.46433, 0.42964 ] + - [ -77.5714, -0.23266, 1.42376, 0.41125 ] + - [ -73.4286, -0.30846, 1.36903, 0.39081 ] + - [ -69.2857, -0.38115, 1.30123, 0.36988 ] + - [ -65.1429, -0.44965, 1.22176, 0.34663 ] + - [ -61.0000, -0.51307, 1.13222, 0.32339 ] + - [ -56.8571, -0.57080, 1.03447, 0.29984 ] + - [ -52.7143, -0.62253, 0.93051, 0.27618 ] + - [ -48.5714, -0.66835, 0.82249, 0.25280 ] + - [ -44.4286, -0.70881, 0.71263, 0.22992 ] + - [ -40.2857, -0.74511, 0.60319, 0.20705 ] + - [ -36.1429, -0.77925, 0.49645, 0.14561 ] + - [ -32.0000, -0.81449, 0.39460, 0.08131 ] + - [ -28.0000, -1.07781, 0.22252, 0.04592 ] + - [ -24.0000, -1.12692, 0.15159, 0.01901 ] + - [ -20.0000, -1.14480, 0.09699, 0.00063 ] + - [ -18.0000, -1.12797, 0.07744, -0.00342 ] + - [ -16.0000, -1.09392, 0.06122, -0.00587 ] + - [ -14.0000, -1.05961, 0.04667, -0.00652 ] + - [ -12.0000, -1.03121, 0.03302, -0.00755 ] + - [ -10.0000, -0.93706, 0.02027, -0.02243 ] + - [ -8.0000, -0.67380, 0.01168, -0.05583 ] + - [ -6.0000, -0.40391, 0.00918, -0.07159 ] + - [ -4.0000, -0.14226, 0.00839, -0.08123 ] + - [ -2.0000, 0.11580, 0.00810, -0.08892 ] + - [ -1.0000, 0.24382, 0.00808, -0.09235 ] + - [ 0.0000, 0.37113, 0.00813, -0.09556 ] + - [ 1.0000, 0.49766, 0.00824, -0.09857 ] + - [ 2.0000, 0.62334, 0.00842, -0.10139 ] + - [ 3.0000, 0.74798, 0.00867, -0.10403 ] + - [ 4.0000, 0.87137, 0.00901, -0.10645 ] + - [ 5.0000, 0.99320, 0.00945, -0.10863 ] + - [ 6.0000, 1.11325, 0.00998, -0.11057 ] + - [ 7.0000, 1.23037, 0.01070, -0.11214 ] + - [ 8.0000, 1.34496, 0.01153, -0.11337 ] + - [ 9.0000, 1.45407, 0.01269, -0.11396 ] + - [ 10.0000, 1.55911, 0.01396, -0.11403 ] + - [ 11.0000, 1.65779, 0.01545, -0.11336 ] + - [ 12.0000, 1.74834, 0.01724, -0.11187 ] + - [ 13.0000, 1.82666, 0.01961, -0.10935 ] + - [ 14.0000, 1.88831, 0.02293, -0.10606 ] + - [ 15.0000, 1.92579, 0.02795, -0.10238 ] + - [ 16.0000, 1.92722, 0.03609, -0.09887 ] + - [ 18.0000, 1.80055, 0.06534, -0.09497 ] + - [ 20.0000, 1.63088, 0.10459, -0.09996 ] + - [ 24.0000, 1.43345, 0.19148, -0.12589 ] + - [ 28.0000, 1.28805, 0.28629, -0.15453 ] + - [ 32.0000, 1.16356, 0.39460, -0.18396 ] + - [ 36.1429, 1.11321, 0.49645, -0.21099 ] + - [ 40.2857, 1.06444, 0.60319, -0.23768 ] + - [ 44.4286, 1.01259, 0.71263, -0.25992 ] + - [ 48.5714, 0.95478, 0.82249, -0.28216 ] + - [ 52.7143, 0.88932, 0.93051, -0.30323 ] + - [ 56.8571, 0.81542, 1.03447, -0.32368 ] + - [ 61.0000, 0.73296, 1.13222, -0.34380 ] + - [ 65.1429, 0.64236, 1.22176, -0.36292 ] + - [ 69.2857, 0.54450, 1.30123, -0.38204 ] + - [ 73.4286, 0.44065, 1.36903, -0.39944 ] + - [ 77.5714, 0.33237, 1.42376, -0.41648 ] + - [ 81.7143, 0.22148, 1.46433, -0.43231 ] + - [ 85.8571, 0.10997, 1.48990, -0.44643 ] + - [ 90.0000, 0.00000, 1.50000, -0.46055 ] + - [ 94.1429, -0.07698, 1.48990, -0.46732 ] + - [ 98.2857, -0.15503, 1.46433, -0.47409 ] + - [ 102.4286, -0.23266, 1.42376, -0.47695 ] + - [ 106.5714, -0.30846, 1.36903, -0.47705 ] + - [ 110.7143, -0.38115, 1.30123, -0.47627 ] + - [ 114.8571, -0.44965, 1.22176, -0.47130 ] + - [ 119.0000, -0.51307, 1.13222, -0.46633 ] + - [ 123.1429, -0.57080, 1.03447, -0.46020 ] + - [ 127.2857, -0.62253, 0.93051, -0.45370 ] + - [ 131.4286, -0.66835, 0.82249, -0.44858 ] + - [ 135.5714, -0.70881, 0.71263, -0.44609 ] + - [ 139.7143, -0.74511, 0.60319, -0.44360 ] + - [ 143.8571, -0.77925, 0.49645, -0.44436 ] + - [ 148.0000, -0.81449, 0.39460, -0.44537 ] + - [ 150.2857, -0.75631, 0.34128, -0.44368 ] + - [ 152.5714, -0.69814, 0.29043, -0.42628 ] + - [ 154.8571, -0.63996, 0.24237, -0.40888 ] + - [ 157.1429, -0.58178, 0.19740, -0.39148 ] + - [ 159.4286, -0.52360, 0.15581, -0.37408 ] + - [ 161.7143, -0.46542, 0.11786, -0.39207 ] + - [ 164.0000, -0.40725, 0.08379, -0.42184 ] + - [ 166.2857, -0.34907, 0.05382, -0.45162 ] + - [ 168.5714, -0.29089, 0.02922, -0.48139 ] + - [ 170.8571, -0.23271, 0.02300, -0.45714 ] + - [ 173.1429, -0.17453, 0.01811, -0.34286 ] + - [ 175.4286, -0.11636, 0.01460, -0.22857 ] + - [ 177.7143, -0.05818, 0.01248, -0.11429 ] + - [ 179.9087, 0.00000, 0.01178, 0.00000 ] + - name : FFA-W3-270blend # + relative_thickness : 0.27 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.01545, 0.00000 ] + - [ -177.7143, 0.06213, 0.01611, 0.09143 ] + - [ -175.4286, 0.12426, 0.01807, 0.18286 ] + - [ -173.1429, 0.18639, 0.02133, 0.27429 ] + - [ -170.8572, 0.24852, 0.02587, 0.36571 ] + - [ -168.5716, 0.31064, 0.03289, 0.39874 ] + - [ -166.2857, 0.37277, 0.05681, 0.39672 ] + - [ -164.0000, 0.43490, 0.08471, 0.39470 ] + - [ -161.7145, 0.49703, 0.11643, 0.39268 ] + - [ -159.4284, 0.55916, 0.15176, 0.39544 ] + - [ -157.1428, 0.62129, 0.19048, 0.41254 ] + - [ -154.8573, 0.68342, 0.23234, 0.42964 ] + - [ -152.5714, 0.74555, 0.27708, 0.44674 ] + - [ -150.2857, 0.80768, 0.32441, 0.46384 ] + - [ -148.0000, 0.86981, 0.37404, 0.46186 ] + - [ -143.8571, 0.81660, 0.46882, 0.45335 ] + - [ -139.7143, 0.76812, 0.56814, 0.44523 ] + - [ -135.5714, 0.72040, 0.66995, 0.44237 ] + - [ -131.4286, 0.67095, 0.77214, 0.43951 ] + - [ -127.2857, 0.61828, 0.87258, 0.44072 ] + - [ -123.1429, 0.56158, 0.96921, 0.44407 ] + - [ -119.0000, 0.50057, 1.06002, 0.44739 ] + - [ -114.8571, 0.43540, 1.14315, 0.45063 ] + - [ -110.7143, 0.36655, 1.21688, 0.45387 ] + - [ -106.5714, 0.29475, 1.27969, 0.45377 ] + - [ -102.4286, 0.22098, 1.33030, 0.45298 ] + - [ -98.2857, 0.14639, 1.36768, 0.44973 ] + - [ -94.1429, 0.07227, 1.39107, 0.44302 ] + - [ -90.0000, 0.00000, 1.40000, 0.43630 ] + - [ -85.8571, -0.07227, 1.39107, 0.42180 ] + - [ -81.7143, -0.14639, 1.36768, 0.40730 ] + - [ -77.5714, -0.22098, 1.33030, 0.39020 ] + - [ -73.4286, -0.29475, 1.27969, 0.37125 ] + - [ -69.2857, -0.36655, 1.21688, 0.35190 ] + - [ -65.1429, -0.43540, 1.14315, 0.33068 ] + - [ -61.0000, -0.50057, 1.06002, 0.30945 ] + - [ -56.8571, -0.56158, 0.96921, 0.28815 ] + - [ -52.7143, -0.61828, 0.87258, 0.26684 ] + - [ -48.5714, -0.67095, 0.77214, 0.24576 ] + - [ -44.4286, -0.72040, 0.66995, 0.22512 ] + - [ -40.2857, -0.76812, 0.56814, 0.20447 ] + - [ -36.1429, -0.81660, 0.46882, 0.13957 ] + - [ -32.0000, -0.86981, 0.37404, 0.07138 ] + - [ -28.0000, -1.09837, 0.21880, 0.04400 ] + - [ -24.0000, -1.08339, 0.15982, 0.02166 ] + - [ -20.0000, -1.06990, 0.10744, 0.00422 ] + - [ -18.0000, -1.05454, 0.08690, -0.00035 ] + - [ -16.0000, -1.03432, 0.06844, -0.00334 ] + - [ -14.0000, -1.08360, 0.04733, -0.00283 ] + - [ -12.0000, -1.09489, 0.03085, -0.00556 ] + - [ -10.0000, -0.92665, 0.01984, -0.02952 ] + - [ -8.0000, -0.69676, 0.01439, -0.04822 ] + - [ -6.0000, -0.43628, 0.01155, -0.06483 ] + - [ -4.0000, -0.16252, 0.01026, -0.07919 ] + - [ -2.0000, 0.10709, 0.00976, -0.09041 ] + - [ -1.0000, 0.23993, 0.00967, -0.09517 ] + - [ 0.0000, 0.37158, 0.00968, -0.09953 ] + - [ 1.0000, 0.50210, 0.00976, -0.10355 ] + - [ 2.0000, 0.63139, 0.00993, -0.10725 ] + - [ 3.0000, 0.75951, 0.01016, -0.11068 ] + - [ 4.0000, 0.88638, 0.01045, -0.11385 ] + - [ 5.0000, 1.01172, 0.01082, -0.11673 ] + - [ 6.0000, 1.13430, 0.01140, -0.11923 ] + - [ 7.0000, 1.25536, 0.01198, -0.12145 ] + - [ 8.0000, 1.37379, 0.01267, -0.12328 ] + - [ 9.0000, 1.48841, 0.01353, -0.12460 ] + - [ 10.0000, 1.59782, 0.01460, -0.12526 ] + - [ 11.0000, 1.70005, 0.01597, -0.12505 ] + - [ 12.0000, 1.79190, 0.01777, -0.12370 ] + - [ 13.0000, 1.86782, 0.02035, -0.12093 ] + - [ 14.0000, 1.92687, 0.02385, -0.11725 ] + - [ 15.0000, 1.90901, 0.03236, -0.10931 ] + - [ 16.0000, 1.88548, 0.04259, -0.10525 ] + - [ 18.0000, 1.72106, 0.07672, -0.10292 ] + - [ 20.0000, 1.54737, 0.11914, -0.11017 ] + - [ 24.0000, 1.37176, 0.20189, -0.13431 ] + - [ 28.0000, 1.33611, 0.27981, -0.15777 ] + - [ 32.0000, 1.24258, 0.37404, -0.18432 ] + - [ 36.1429, 1.16657, 0.46882, -0.21002 ] + - [ 40.2857, 1.09731, 0.56814, -0.23531 ] + - [ 44.4286, 1.02914, 0.66995, -0.25508 ] + - [ 48.5714, 0.95850, 0.77214, -0.27485 ] + - [ 52.7143, 0.88325, 0.87258, -0.29346 ] + - [ 56.8571, 0.80225, 0.96921, -0.31145 ] + - [ 61.0000, 0.71510, 1.06002, -0.32925 ] + - [ 65.1429, 0.62200, 1.14315, -0.34641 ] + - [ 69.2857, 0.52364, 1.21688, -0.36357 ] + - [ 73.4286, 0.42107, 1.27969, -0.37949 ] + - [ 77.5714, 0.31569, 1.33030, -0.39517 ] + - [ 81.7143, 0.20913, 1.36768, -0.40983 ] + - [ 85.8571, 0.10324, 1.39107, -0.42306 ] + - [ 90.0000, 0.00000, 1.40000, -0.43630 ] + - [ 94.1429, -0.07227, 1.39107, -0.44302 ] + - [ 98.2857, -0.14639, 1.36768, -0.44973 ] + - [ 102.4286, -0.22098, 1.33030, -0.45298 ] + - [ 106.5714, -0.29475, 1.27969, -0.45377 ] + - [ 110.7143, -0.36655, 1.21688, -0.45387 ] + - [ 114.8571, -0.43540, 1.14315, -0.45063 ] + - [ 119.0000, -0.50057, 1.06002, -0.44739 ] + - [ 123.1429, -0.56158, 0.96921, -0.44407 ] + - [ 127.2857, -0.61828, 0.87258, -0.44072 ] + - [ 131.4286, -0.67095, 0.77214, -0.43951 ] + - [ 135.5714, -0.72040, 0.66995, -0.44237 ] + - [ 139.7143, -0.76812, 0.56814, -0.44523 ] + - [ 143.8571, -0.81660, 0.46882, -0.45335 ] + - [ 148.0000, -0.86981, 0.37404, -0.46186 ] + - [ 150.2857, -0.80768, 0.32441, -0.46384 ] + - [ 152.5714, -0.74555, 0.27708, -0.44674 ] + - [ 154.8571, -0.68342, 0.23234, -0.42964 ] + - [ 157.1429, -0.62129, 0.19048, -0.41254 ] + - [ 159.4286, -0.55916, 0.15176, -0.39544 ] + - [ 161.7143, -0.49703, 0.11643, -0.40982 ] + - [ 164.0000, -0.43490, 0.08471, -0.43470 ] + - [ 166.2857, -0.37277, 0.05681, -0.45958 ] + - [ 168.5714, -0.31064, 0.03289, -0.48445 ] + - [ 170.8571, -0.24852, 0.02587, -0.45714 ] + - [ 173.1429, -0.18639, 0.02133, -0.34286 ] + - [ 175.4286, -0.12426, 0.01807, -0.22857 ] + - [ 177.7143, -0.06213, 0.01611, -0.11429 ] + - [ 179.9087, 0.00000, 0.01545, 0.00000 ] + - name : FFA-W3-301 # + relative_thickness : 0.301 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.02454, 0.00000 ] + - [ -177.7143, 0.06508, 0.02514, 0.09143 ] + - [ -175.4286, 0.13016, 0.02694, 0.18286 ] + - [ -173.1429, 0.19525, 0.02993, 0.27429 ] + - [ -170.8572, 0.26033, 0.03408, 0.36571 ] + - [ -168.5716, 0.32541, 0.03938, 0.40085 ] + - [ -166.2857, 0.39049, 0.05910, 0.40220 ] + - [ -164.0000, 0.45557, 0.08495, 0.40356 ] + - [ -161.7145, 0.52066, 0.11433, 0.40492 ] + - [ -159.4284, 0.58574, 0.14704, 0.41010 ] + - [ -157.1428, 0.65082, 0.18290, 0.42678 ] + - [ -154.8573, 0.71590, 0.22166, 0.44345 ] + - [ -152.5714, 0.78098, 0.26309, 0.46013 ] + - [ -150.2857, 0.84607, 0.30692, 0.47680 ] + - [ -148.0000, 0.91115, 0.35287, 0.47162 ] + - [ -143.8571, 0.84257, 0.44061, 0.45656 ] + - [ -139.7143, 0.78187, 0.53255, 0.44202 ] + - [ -135.5714, 0.72448, 0.62677, 0.43452 ] + - [ -131.4286, 0.66755, 0.72131, 0.42701 ] + - [ -127.2857, 0.60928, 0.81421, 0.42483 ] + - [ -123.1429, 0.54868, 0.90355, 0.42544 ] + - [ -119.0000, 0.48530, 0.98748, 0.42634 ] + - [ -114.8571, 0.41915, 1.06425, 0.42813 ] + - [ -110.7143, 0.35056, 1.13227, 0.42992 ] + - [ -106.5714, 0.28017, 1.19015, 0.42916 ] + - [ -102.4286, 0.20881, 1.23669, 0.42788 ] + - [ -98.2857, 0.13754, 1.27093, 0.42444 ] + - [ -94.1429, 0.06751, 1.29218, 0.41794 ] + - [ -90.0000, 0.00000, 1.30000, 0.41144 ] + - [ -85.8571, -0.06751, 1.29218, 0.39804 ] + - [ -81.7143, -0.13754, 1.27093, 0.38464 ] + - [ -77.5714, -0.20881, 1.23669, 0.36892 ] + - [ -73.4286, -0.28017, 1.19015, 0.35157 ] + - [ -69.2857, -0.35056, 1.13227, 0.33391 ] + - [ -65.1429, -0.41915, 1.06425, 0.31474 ] + - [ -61.0000, -0.48530, 0.98748, 0.29557 ] + - [ -56.8571, -0.54868, 0.90355, 0.27653 ] + - [ -52.7143, -0.60928, 0.81421, 0.25754 ] + - [ -48.5714, -0.66755, 0.72131, 0.23873 ] + - [ -44.4286, -0.72448, 0.62677, 0.22027 ] + - [ -40.2857, -0.78187, 0.53255, 0.20181 ] + - [ -36.1429, -0.84257, 0.44061, 0.13644 ] + - [ -32.0000, -0.91115, 0.35287, 0.06760 ] + - [ -28.0000, -1.10349, 0.21721, 0.04231 ] + - [ -24.0000, -1.10737, 0.15629, 0.02026 ] + - [ -20.0000, -1.11815, 0.10335, 0.00407 ] + - [ -18.0000, -1.12332, 0.08180, 0.00017 ] + - [ -16.0000, -1.11865, 0.06331, -0.00167 ] + - [ -14.0000, -1.11620, 0.04718, -0.00120 ] + - [ -12.0000, -1.09588, 0.03280, -0.00463 ] + - [ -10.0000, -0.91767, 0.02351, -0.02494 ] + - [ -8.0000, -0.69311, 0.01793, -0.04304 ] + - [ -6.0000, -0.45396, 0.01431, -0.05868 ] + - [ -4.0000, -0.17779, 0.01242, -0.07601 ] + - [ -2.0000, 0.10480, 0.01160, -0.09121 ] + - [ -1.0000, 0.24383, 0.01143, -0.09763 ] + - [ 0.0000, 0.38111, 0.01138, -0.10341 ] + - [ 1.0000, 0.51660, 0.01143, -0.10861 ] + - [ 2.0000, 0.65044, 0.01156, -0.11333 ] + - [ 3.0000, 0.78267, 0.01177, -0.11762 ] + - [ 4.0000, 0.91326, 0.01204, -0.12154 ] + - [ 5.0000, 1.04207, 0.01239, -0.12510 ] + - [ 6.0000, 1.16873, 0.01283, -0.12828 ] + - [ 7.0000, 1.29296, 0.01338, -0.13104 ] + - [ 8.0000, 1.41390, 0.01406, -0.13332 ] + - [ 9.0000, 1.53088, 0.01488, -0.13503 ] + - [ 10.0000, 1.64208, 0.01592, -0.13599 ] + - [ 11.0000, 1.74568, 0.01726, -0.13605 ] + - [ 12.0000, 1.83887, 0.01908, -0.13514 ] + - [ 13.0000, 1.91764, 0.02169, -0.13322 ] + - [ 14.0000, 1.97413, 0.02572, -0.13020 ] + - [ 15.0000, 1.99916, 0.03222, -0.12641 ] + - [ 16.0000, 1.99377, 0.04157, -0.12265 ] + - [ 18.0000, 1.91720, 0.06731, -0.11675 ] + - [ 20.0000, 1.73683, 0.10526, -0.11652 ] + - [ 24.0000, 1.47321, 0.19229, -0.13790 ] + - [ 28.0000, 1.36017, 0.27449, -0.16242 ] + - [ 32.0000, 1.30164, 0.35287, -0.18463 ] + - [ 36.1429, 1.20367, 0.44061, -0.20894 ] + - [ 40.2857, 1.11695, 0.53255, -0.23276 ] + - [ 44.4286, 1.03498, 0.62677, -0.25011 ] + - [ 48.5714, 0.95364, 0.72131, -0.26746 ] + - [ 52.7143, 0.87040, 0.81421, -0.28365 ] + - [ 56.8571, 0.78383, 0.90355, -0.29923 ] + - [ 61.0000, 0.69329, 0.98748, -0.31472 ] + - [ 65.1429, 0.59878, 1.06425, -0.32988 ] + - [ 69.2857, 0.50080, 1.13227, -0.34505 ] + - [ 73.4286, 0.40024, 1.19015, -0.35942 ] + - [ 77.5714, 0.29831, 1.23669, -0.37363 ] + - [ 81.7143, 0.19648, 1.27093, -0.38702 ] + - [ 85.8571, 0.09644, 1.29218, -0.39923 ] + - [ 90.0000, 0.00000, 1.30000, -0.41144 ] + - [ 94.1429, -0.06751, 1.29218, -0.41794 ] + - [ 98.2857, -0.13754, 1.27093, -0.42444 ] + - [ 102.4286, -0.20881, 1.23669, -0.42788 ] + - [ 106.5714, -0.28017, 1.19015, -0.42916 ] + - [ 110.7143, -0.35056, 1.13227, -0.42992 ] + - [ 114.8571, -0.41915, 1.06425, -0.42813 ] + - [ 119.0000, -0.48530, 0.98748, -0.42634 ] + - [ 123.1429, -0.54868, 0.90355, -0.42544 ] + - [ 127.2857, -0.60928, 0.81421, -0.42483 ] + - [ 131.4286, -0.66755, 0.72131, -0.42701 ] + - [ 135.5714, -0.72448, 0.62677, -0.43452 ] + - [ 139.7143, -0.78187, 0.53255, -0.44202 ] + - [ 143.8571, -0.84257, 0.44061, -0.45656 ] + - [ 148.0000, -0.91115, 0.35287, -0.47162 ] + - [ 150.2857, -0.84607, 0.30692, -0.47680 ] + - [ 152.5714, -0.78098, 0.26309, -0.46013 ] + - [ 154.8571, -0.71590, 0.22166, -0.44345 ] + - [ 157.1429, -0.65082, 0.18290, -0.42678 ] + - [ 159.4286, -0.58574, 0.14704, -0.41010 ] + - [ 161.7143, -0.52066, 0.11433, -0.42206 ] + - [ 164.0000, -0.45557, 0.08495, -0.44356 ] + - [ 166.2857, -0.39049, 0.05910, -0.46506 ] + - [ 168.5714, -0.32541, 0.03938, -0.48656 ] + - [ 170.8571, -0.26033, 0.03408, -0.45714 ] + - [ 173.1429, -0.19525, 0.02993, -0.34286 ] + - [ 175.4286, -0.13016, 0.02694, -0.22857 ] + - [ 177.7143, -0.06508, 0.02514, -0.11429 ] + - [ 179.9087, 0.00000, 0.02454, 0.00000 ] + - name : FFA-W3-330blend # + relative_thickness : 0.33 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.03169, 0.00000 ] + - [ -177.7143, 0.06960, 0.03228, 0.09143 ] + - [ -175.4286, 0.13920, 0.03406, 0.18286 ] + - [ -173.1429, 0.20880, 0.03702, 0.27429 ] + - [ -170.8572, 0.27841, 0.04114, 0.36571 ] + - [ -168.5716, 0.34801, 0.04638, 0.40308 ] + - [ -166.2857, 0.41761, 0.05732, 0.40801 ] + - [ -164.0000, 0.48721, 0.08319, 0.41294 ] + - [ -161.7145, 0.55681, 0.11258, 0.41788 ] + - [ -159.4284, 0.62641, 0.14533, 0.42586 ] + - [ -157.1428, 0.69601, 0.18121, 0.44302 ] + - [ -154.8573, 0.76562, 0.22000, 0.46017 ] + - [ -152.5714, 0.83522, 0.26146, 0.47732 ] + - [ -150.2857, 0.90482, 0.30532, 0.49447 ] + - [ -148.0000, 0.97442, 0.35131, 0.48743 ] + - [ -143.8571, 0.89412, 0.43913, 0.46839 ] + - [ -139.7143, 0.82382, 0.53115, 0.44996 ] + - [ -135.5714, 0.75845, 0.62546, 0.43985 ] + - [ -131.4286, 0.69477, 0.72010, 0.42974 ] + - [ -127.2857, 0.63079, 0.81310, 0.42589 ] + - [ -123.1429, 0.56532, 0.90255, 0.42535 ] + - [ -119.0000, 0.49783, 0.98659, 0.42528 ] + - [ -114.8571, 0.42823, 1.06348, 0.42673 ] + - [ -110.7143, 0.35680, 1.13162, 0.42817 ] + - [ -106.5714, 0.28412, 1.18963, 0.42745 ] + - [ -102.4286, 0.21103, 1.23629, 0.42628 ] + - [ -98.2857, 0.13851, 1.27067, 0.42303 ] + - [ -94.1429, 0.06775, 1.29204, 0.41683 ] + - [ -90.0000, 0.00000, 1.30000, 0.41063 ] + - [ -85.8571, -0.06775, 1.29204, 0.39752 ] + - [ -81.7143, -0.13851, 1.27067, 0.38441 ] + - [ -77.5714, -0.21103, 1.23629, 0.36905 ] + - [ -73.4286, -0.28412, 1.18963, 0.35212 ] + - [ -69.2857, -0.35680, 1.13162, 0.33491 ] + - [ -65.1429, -0.42823, 1.06348, 0.31634 ] + - [ -61.0000, -0.49783, 0.98659, 0.29777 ] + - [ -56.8571, -0.56532, 0.90255, 0.27947 ] + - [ -52.7143, -0.63079, 0.81310, 0.26125 ] + - [ -48.5714, -0.69477, 0.72010, 0.24322 ] + - [ -44.4286, -0.75845, 0.62546, 0.22556 ] + - [ -40.2857, -0.82382, 0.53115, 0.20789 ] + - [ -36.1429, -0.89412, 0.43913, 0.13731 ] + - [ -32.0000, -0.97442, 0.35131, 0.06280 ] + - [ -28.0000, -1.16308, 0.20648, 0.03905 ] + - [ -24.0000, -1.14892, 0.15001, 0.01853 ] + - [ -20.0000, -1.09451, 0.10600, 0.00441 ] + - [ -18.0000, -1.05801, 0.08732, -0.00061 ] + - [ -16.0000, -1.02281, 0.07051, -0.00342 ] + - [ -14.0000, -0.99810, 0.05474, -0.00401 ] + - [ -12.0000, -0.98515, 0.04052, -0.00272 ] + - [ -10.0000, -0.89583, 0.02929, -0.01198 ] + - [ -8.0000, -0.67539, 0.02207, -0.03458 ] + - [ -6.0000, -0.43247, 0.01735, -0.05466 ] + - [ -4.0000, -0.15881, 0.01473, -0.07425 ] + - [ -2.0000, 0.13456, 0.01362, -0.09270 ] + - [ -1.0000, 0.28014, 0.01339, -0.10074 ] + - [ 0.0000, 0.42386, 0.01330, -0.10802 ] + - [ 1.0000, 0.56519, 0.01333, -0.11450 ] + - [ 2.0000, 0.70410, 0.01345, -0.12028 ] + - [ 3.0000, 0.84071, 0.01366, -0.12546 ] + - [ 4.0000, 0.97500, 0.01397, -0.13011 ] + - [ 5.0000, 1.10680, 0.01437, -0.13425 ] + - [ 6.0000, 1.23603, 0.01486, -0.13793 ] + - [ 7.0000, 1.36223, 0.01547, -0.14108 ] + - [ 8.0000, 1.48424, 0.01623, -0.14363 ] + - [ 9.0000, 1.60097, 0.01718, -0.14545 ] + - [ 10.0000, 1.71010, 0.01841, -0.14636 ] + - [ 11.0000, 1.80957, 0.02010, -0.14635 ] + - [ 12.0000, 1.89473, 0.02258, -0.14544 ] + - [ 13.0000, 1.95698, 0.02671, -0.14378 ] + - [ 14.0000, 1.98576, 0.03380, -0.14185 ] + - [ 15.0000, 1.99260, 0.04333, -0.14004 ] + - [ 16.0000, 1.99617, 0.05354, -0.13823 ] + - [ 18.0000, 1.96398, 0.07706, -0.13351 ] + - [ 20.0000, 1.81179, 0.11169, -0.13135 ] + - [ 24.0000, 1.56073, 0.19103, -0.14660 ] + - [ 28.0000, 1.46798, 0.27199, -0.17242 ] + - [ 32.0000, 1.39203, 0.35131, -0.19417 ] + - [ 36.1429, 1.27731, 0.43913, -0.21792 ] + - [ 40.2857, 1.17689, 0.53115, -0.24115 ] + - [ 44.4286, 1.08350, 0.62546, -0.25734 ] + - [ 48.5714, 0.99253, 0.72010, -0.27354 ] + - [ 52.7143, 0.90112, 0.81310, -0.28862 ] + - [ 56.8571, 0.80760, 0.90255, -0.30311 ] + - [ 61.0000, 0.71119, 0.98659, -0.31757 ] + - [ 65.1429, 0.61175, 1.06348, -0.33194 ] + - [ 69.2857, 0.50971, 1.13162, -0.34631 ] + - [ 73.4286, 0.40589, 1.18963, -0.36014 ] + - [ 77.5714, 0.30146, 1.23629, -0.37385 ] + - [ 81.7143, 0.19788, 1.27067, -0.38681 ] + - [ 85.8571, 0.09679, 1.29204, -0.39872 ] + - [ 90.0000, 0.00000, 1.30000, -0.41063 ] + - [ 94.1429, -0.06775, 1.29204, -0.41683 ] + - [ 98.2857, -0.13851, 1.27067, -0.42303 ] + - [ 102.4286, -0.21103, 1.23629, -0.42628 ] + - [ 106.5714, -0.28412, 1.18963, -0.42745 ] + - [ 110.7143, -0.35680, 1.13162, -0.42817 ] + - [ 114.8571, -0.42823, 1.06348, -0.42673 ] + - [ 119.0000, -0.49783, 0.98659, -0.42528 ] + - [ 123.1429, -0.56532, 0.90255, -0.42535 ] + - [ 127.2857, -0.63079, 0.81310, -0.42589 ] + - [ 131.4286, -0.69477, 0.72010, -0.42974 ] + - [ 135.5714, -0.75845, 0.62546, -0.43985 ] + - [ 139.7143, -0.82382, 0.53115, -0.44996 ] + - [ 143.8571, -0.89412, 0.43913, -0.46839 ] + - [ 148.0000, -0.97442, 0.35131, -0.48743 ] + - [ 150.2857, -0.90482, 0.30532, -0.49447 ] + - [ 152.5714, -0.83522, 0.26146, -0.47732 ] + - [ 154.8571, -0.76562, 0.22000, -0.46017 ] + - [ 157.1429, -0.69601, 0.18121, -0.44302 ] + - [ 159.4286, -0.62641, 0.14533, -0.42586 ] + - [ 161.7143, -0.55681, 0.11258, -0.43502 ] + - [ 164.0000, -0.48721, 0.08319, -0.45294 ] + - [ 166.2857, -0.41761, 0.05732, -0.47087 ] + - [ 168.5714, -0.34801, 0.04638, -0.48880 ] + - [ 170.8571, -0.27841, 0.04114, -0.45714 ] + - [ 173.1429, -0.20880, 0.03702, -0.34286 ] + - [ 175.4286, -0.13920, 0.03406, -0.22857 ] + - [ 177.7143, -0.06960, 0.03228, -0.11429 ] + - [ 179.9087, 0.00000, 0.03169, 0.00000 ] + - name : FFA-W3-360 # + relative_thickness : 0.36 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.03715, 0.00000 ] + - [ -177.7143, 0.07178, 0.03774, 0.09143 ] + - [ -175.4286, 0.14356, 0.03951, 0.18286 ] + - [ -173.1429, 0.21534, 0.04245, 0.27429 ] + - [ -170.8572, 0.28713, 0.04653, 0.36571 ] + - [ -168.5716, 0.35891, 0.05174, 0.40313 ] + - [ -166.2857, 0.43069, 0.06068, 0.40814 ] + - [ -164.0000, 0.50247, 0.08651, 0.41315 ] + - [ -161.7145, 0.57425, 0.11586, 0.41816 ] + - [ -159.4284, 0.64603, 0.14856, 0.42627 ] + - [ -157.1428, 0.71781, 0.18439, 0.44370 ] + - [ -154.8573, 0.78960, 0.22313, 0.46114 ] + - [ -152.5714, 0.86138, 0.26453, 0.47857 ] + - [ -150.2857, 0.93316, 0.30832, 0.49600 ] + - [ -148.0000, 1.00494, 0.35424, 0.48830 ] + - [ -143.8571, 0.91898, 0.44192, 0.46784 ] + - [ -139.7143, 0.84406, 0.53379, 0.44803 ] + - [ -135.5714, 0.77483, 0.62793, 0.43697 ] + - [ -131.4286, 0.70790, 0.72238, 0.42591 ] + - [ -127.2857, 0.64116, 0.81520, 0.42150 ] + - [ -123.1429, 0.57335, 0.90444, 0.42058 ] + - [ -119.0000, 0.50388, 0.98826, 0.42024 ] + - [ -114.8571, 0.43261, 1.06493, 0.42168 ] + - [ -110.7143, 0.35981, 1.13285, 0.42312 ] + - [ -106.5714, 0.28603, 1.19061, 0.42258 ] + - [ -102.4286, 0.21209, 1.23704, 0.42163 ] + - [ -98.2857, 0.13899, 1.27116, 0.41864 ] + - [ -94.1429, 0.06787, 1.29229, 0.41277 ] + - [ -90.0000, 0.00000, 1.30000, 0.40690 ] + - [ -85.8571, -0.06787, 1.29229, 0.39426 ] + - [ -81.7143, -0.13899, 1.27116, 0.38162 ] + - [ -77.5714, -0.21209, 1.23704, 0.36676 ] + - [ -73.4286, -0.28603, 1.19061, 0.35033 ] + - [ -69.2857, -0.35981, 1.13285, 0.33362 ] + - [ -65.1429, -0.43261, 1.06493, 0.31561 ] + - [ -61.0000, -0.50388, 0.98826, 0.29759 ] + - [ -56.8571, -0.57335, 0.90444, 0.27989 ] + - [ -52.7143, -0.64116, 0.81520, 0.26230 ] + - [ -48.5714, -0.70790, 0.72238, 0.24491 ] + - [ -44.4286, -0.77483, 0.62793, 0.22794 ] + - [ -40.2857, -0.84406, 0.53379, 0.21097 ] + - [ -36.1429, -0.91898, 0.44192, 0.13525 ] + - [ -32.0000, -1.00494, 0.35424, 0.05517 ] + - [ -28.0000, -1.11306, 0.20494, 0.03211 ] + - [ -24.0000, -1.05425, 0.15434, 0.01268 ] + - [ -20.0000, -0.98247, 0.10967, -0.00282 ] + - [ -18.0000, -0.94173, 0.09249, -0.00741 ] + - [ -16.0000, -0.89333, 0.07597, -0.01107 ] + - [ -14.0000, -0.85472, 0.06054, -0.01250 ] + - [ -12.0000, -0.82348, 0.04641, -0.01177 ] + - [ -10.0000, -0.79541, 0.03441, -0.01082 ] + - [ -8.0000, -0.63650, 0.02548, -0.02769 ] + - [ -6.0000, -0.39095, 0.01994, -0.05107 ] + - [ -4.0000, -0.13071, 0.01653, -0.07148 ] + - [ -2.0000, 0.16173, 0.01507, -0.09179 ] + - [ -1.0000, 0.31121, 0.01477, -0.10119 ] + - [ 0.0000, 0.45956, 0.01465, -0.10988 ] + - [ 1.0000, 0.60566, 0.01466, -0.11776 ] + - [ 2.0000, 0.74868, 0.01481, -0.12477 ] + - [ 3.0000, 0.88862, 0.01507, -0.13098 ] + - [ 4.0000, 1.02544, 0.01544, -0.13648 ] + - [ 5.0000, 1.15878, 0.01593, -0.14130 ] + - [ 6.0000, 1.28822, 0.01654, -0.14540 ] + - [ 7.0000, 1.41282, 0.01731, -0.14875 ] + - [ 8.0000, 1.53090, 0.01831, -0.15118 ] + - [ 9.0000, 1.64065, 0.01963, -0.15262 ] + - [ 10.0000, 1.73926, 0.02150, -0.15310 ] + - [ 11.0000, 1.81971, 0.02445, -0.15254 ] + - [ 12.0000, 1.87065, 0.02966, -0.15121 ] + - [ 13.0000, 1.89221, 0.03770, -0.14969 ] + - [ 14.0000, 1.87910, 0.04824, -0.14562 ] + - [ 15.0000, 1.88111, 0.05838, -0.14358 ] + - [ 16.0000, 1.86359, 0.06992, -0.14095 ] + - [ 18.0000, 1.73324, 0.10166, -0.13711 ] + - [ 20.0000, 1.59357, 0.13916, -0.14082 ] + - [ 24.0000, 1.46708, 0.21002, -0.15693 ] + - [ 28.0000, 1.44834, 0.28200, -0.17979 ] + - [ 32.0000, 1.43563, 0.35424, -0.20147 ] + - [ 36.1429, 1.31283, 0.44192, -0.22409 ] + - [ 40.2857, 1.20580, 0.53379, -0.24619 ] + - [ 44.4286, 1.10690, 0.62793, -0.26133 ] + - [ 48.5714, 1.01129, 0.72238, -0.27648 ] + - [ 52.7143, 0.91594, 0.81520, -0.29062 ] + - [ 56.8571, 0.81907, 0.90444, -0.30424 ] + - [ 61.0000, 0.71982, 0.98826, -0.31787 ] + - [ 65.1429, 0.61801, 1.06493, -0.33154 ] + - [ 69.2857, 0.51401, 1.13285, -0.34522 ] + - [ 73.4286, 0.40862, 1.19061, -0.35846 ] + - [ 77.5714, 0.30299, 1.23704, -0.37161 ] + - [ 81.7143, 0.19855, 1.27116, -0.38405 ] + - [ 85.8571, 0.09695, 1.29229, -0.39547 ] + - [ 90.0000, 0.00000, 1.30000, -0.40690 ] + - [ 94.1429, -0.06787, 1.29229, -0.41277 ] + - [ 98.2857, -0.13899, 1.27116, -0.41864 ] + - [ 102.4286, -0.21209, 1.23704, -0.42163 ] + - [ 106.5714, -0.28603, 1.19061, -0.42258 ] + - [ 110.7143, -0.35981, 1.13285, -0.42312 ] + - [ 114.8571, -0.43261, 1.06493, -0.42168 ] + - [ 119.0000, -0.50388, 0.98826, -0.42024 ] + - [ 123.1429, -0.57335, 0.90444, -0.42058 ] + - [ 127.2857, -0.64116, 0.81520, -0.42150 ] + - [ 131.4286, -0.70790, 0.72238, -0.42591 ] + - [ 135.5714, -0.77483, 0.62793, -0.43697 ] + - [ 139.7143, -0.84406, 0.53379, -0.44803 ] + - [ 143.8571, -0.91898, 0.44192, -0.46784 ] + - [ 148.0000, -1.00494, 0.35424, -0.48830 ] + - [ 150.2857, -0.93316, 0.30832, -0.49600 ] + - [ 152.5714, -0.86138, 0.26453, -0.47857 ] + - [ 154.8571, -0.78960, 0.22313, -0.46114 ] + - [ 157.1429, -0.71781, 0.18439, -0.44370 ] + - [ 159.4286, -0.64603, 0.14856, -0.42627 ] + - [ 161.7143, -0.57425, 0.11586, -0.43530 ] + - [ 164.0000, -0.50247, 0.08651, -0.45315 ] + - [ 166.2857, -0.43069, 0.06068, -0.47100 ] + - [ 168.5714, -0.35891, 0.05174, -0.48884 ] + - [ 170.8571, -0.28713, 0.04653, -0.45714 ] + - [ 173.1429, -0.21534, 0.04245, -0.34286 ] + - [ 175.4286, -0.14356, 0.03951, -0.22857 ] + - [ 177.7143, -0.07178, 0.03774, -0.11429 ] + - [ 179.9087, 0.00000, 0.03715, 0.00000 ] + + + + pitch_control: + GS_Angles: [0.06019804, 0.08713416, 0.10844806, 0.12685912, 0.14339822, 0.1586021 , 0.17279614, 0.18618935, 0.19892772, 0.21111989, 0.22285021, 0.23417256, 0.2451469 , 0.25580691, 0.26619545, 0.27632495, 0.28623134, 0.29593266, 0.30544521, 0.314779 , 0.32395154, 0.33297489, 0.3418577 , 0.35060844, 0.35923641, 0.36774807, 0.37614942, 0.38444655, 0.39264363, 0.40074407] + GS_Kp: [-0.9394215 , -0.80602855, -0.69555026, -0.60254912, -0.52318192, -0.45465531, -0.39489024, -0.34230736, -0.29568537, -0.25406506, -0.2166825 , -0.18292183, -0.15228099, -0.12434663, -0.09877533, -0.0752794 , -0.05361604, -0.0335789 , -0.01499149, 0.00229803, 0.01842102, 0.03349169, 0.0476098 , 0.0608629 , 0.07332812, 0.0850737 , 0.0961602 , 0.10664158, 0.11656607, 0.12597691] + GS_Ki: [-0.07416547, -0.06719673, -0.0614251 , -0.05656651, -0.0524202 , -0.04884022, -0.04571796, -0.04297091, -0.04053528, -0.03836094, -0.03640799, -0.03464426, -0.03304352, -0.03158417, -0.03024826, -0.02902079, -0.02788904, -0.02684226, -0.02587121, -0.02496797, -0.02412567, -0.02333834, -0.02260078, -0.02190841, -0.0212572 , -0.02064359, -0.0200644 , -0.01951683, -0.01899836, -0.01850671] + Fl_Kp: -9.35 + wt_ops: + v: [3.0, 3.266896551724138, 3.533793103448276, 3.800689655172414, 4.067586206896552, 4.334482758620689, 4.601379310344828, 4.868275862068966, 5.135172413793104, 5.402068965517241, 5.6689655172413795, 5.935862068965518, 6.2027586206896554, 6.469655172413793, 6.736551724137931, 7.00344827586207, 7.270344827586207, 7.537241379310345, 7.804137931034483, 8.071034482758622, 8.337931034482759, 8.604827586206897, 8.871724137931036, 9.138620689655173, 9.405517241379311, 9.672413793103448, 9.939310344827586, 10.206206896551725, 10.473103448275863, 10.74, 11.231724137931035, 11.723448275862069, 12.215172413793104, 12.706896551724139, 13.198620689655172, 13.690344827586207, 14.182068965517242, 14.673793103448276, 15.16551724137931, 15.657241379310346, 16.14896551724138, 16.640689655172416, 17.13241379310345, 17.624137931034483, 18.11586206896552, 18.607586206896553, 19.099310344827586, 19.591034482758623, 20.082758620689653, 20.57448275862069, 21.066206896551726, 21.557931034482756, 22.049655172413793, 22.54137931034483, 23.03310344827586, 23.524827586206897, 24.016551724137933, 24.508275862068963, 25.0] + pitch_op: [-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, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, 3.57152, 5.12896, 6.36736, 7.43866, 8.40197, 9.28843, 10.1161, 10.8974, 11.641, 12.3529, 13.038, 13.6997, 14.3409, 14.9642, 15.5713, 16.1639, 16.7435, 17.3109, 17.8673, 18.4136, 18.9506, 19.4788, 19.9989, 20.5112, 21.0164, 21.5147, 22.0067, 22.4925, 22.9724] + omega_op: [2.1486, 2.3397, 2.5309, 2.722, 2.9132, 3.1043, 3.2955, 3.4866, 3.6778, 3.8689, 4.0601, 4.2512, 4.4424, 4.6335, 4.8247, 5.0159, 5.207, 5.3982, 5.5893, 5.7805, 5.9716, 6.1628, 6.3539, 6.5451, 6.7362, 6.9274, 7.1185, 7.3097, 7.5008, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56] + gear_ratio: 1 + torque_control: + VS_KP: -38609162.66552 + VS_KI: -4588245.18720 + + + tower: # (could remove some entries that don't apply for the tower) + dlsMax : 5.0 # maximum node splitting section amount; can't be 0 + + name : tower # [-] an identifier (no longer has to be number) + type : rigid # [-] + rA : [ 0, 0, 15] # [m] end A coordinates + rB : [ 0, 0, 144.582] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + + # --- outer shell including hydro--- + stations : [ 15, 28, 28.001, 41, 41.001, 54, 54.001, 67, 67.001, 80, 80.001, 93, 93.001, 106, 106.001, 119, 119.001, 132, 132.001, 144.582 ] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : [ 10, 9.964, 9.964, 9.967, 9.967, 9.927, 9.927, 9.528, 9.528, 9.149, 9.149, 8.945, 8.945, 8.735, 8.735, 8.405, 8.405, 7.321, 7.321, 6.5 ] # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : [ 0.082954, 0.082954, 0.083073, 0.083073, 0.082799, 0.082799, 0.0299, 0.0299, 0.027842, 0.027842, 0.025567, 0.025567, 0.022854, 0.022854, 0.02025, 0.02025, 0.018339, 0.018339, 0.021211, 0.021211 ] # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 0.0 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 0.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + # (neglecting axial coefficients for now) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] material density + + +platform: + + dlsMax : 5.0 # maximum node splitting section amount for platform members; can't be 0 + potModMaster : 1 + + members: # list all members here + + - name : center_column # [-] an identifier (no longer has to be number) + type : rigid # [-] + rA : [ 0, 0, -20] # [m] end A coordinates + rB : [ 0, 0, 15] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : False # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + # --- outer shell including hydro--- + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 9.85 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 0.6 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 0.85 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.6 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.7 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + # --- handling of end caps or any internal structures if we need them --- + cap_stations : [ 0 ] # [m] location along member of any inner structures (in same scaling as set by 'stations') + cap_t : [ 0.001 ] # [m] thickness of any internal structures + cap_d_in : [ 0 ] # [m] inner diameter of internal structures (0 for full cap/bulkhead, >0 for a ring shape) + + + - name : outer_column # [-] an identifier (no longer has to be number) + type : rigid # [-] + rA : [51.75, 0, -20] # [m] end A coordinates + rB : [51.75, 0, 15] # [m] and B coordinates + heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : False # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + # --- outer shell including hydro--- + stations : [0, 35] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 12.23 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 0.6 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 0.85 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 1.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.7 # value of 3.0 gives more heave response # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + # --- ballast --- + l_fill : 1.4 # [m] + rho_fill : 5000 # [kg/m3] + # --- handling of end caps or any internal structures if we need them --- + cap_stations : [ 0 ] # [m] location along member of any inner structures (in same scaling as set by 'stations') + cap_t : [ 0.001 ] # [m] thickness of any internal structures + cap_d_in : [ 0 ] # [m] inner diameter of internal structures (0 for full cap/bulkhead, >0 for a ring shape) + + + - name : pontoon # [-] an identifier (no longer has to be number) + type : rigid # [-] + rA : [ 5 , 0, -16.5] # [m] end A coordinates + rB : [ 45.5, 0, -16.5] # [m] and B coordinates + heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) + shape : rect # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : False # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + # --- outer shell including hydro--- + stations : [0, 40.5] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : [12.4, 7.0] # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : [1.5, 2.2 ] # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : [0.9, 0.9 ] # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + l_fill : 40.5 # [m] + rho_fill : 1025.0 # [kg/m3] + + + - name : upper_support # [-] an identifier (no longer has to be number) + type : rigid # [-] + rA : [ 5 , 0, 14.545] # [m] end A coordinates + rB : [ 45.5, 0, 14.545] # [m] and B coordinates + heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : False # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + # --- outer shell including hydro--- + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 0.91 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.01 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 0.0 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 0.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + +mooring: + water_depth: 200 # [m] uniform water depth + moorMod : 2 # 0: quasi-static mooring model (stiffness only); 1: quasi-static mooring model for body dynamics (stiffness only), post-processing of line tensions using lumped mass (stiffness, inertia and damping); 2: both body dynamics and mooring tensions solved using lumped mass + file: './test_data/IEA-15-240-RWT-UMaineSemi_MoorDyn.dat' \ No newline at end of file diff --git a/tests/test_data/VolturnUS-S-moorMod2_true_analyzeCases.pkl b/tests/test_data/VolturnUS-S-moorMod2_true_analyzeCases.pkl new file mode 100644 index 00000000..d4d90875 Binary files /dev/null and b/tests/test_data/VolturnUS-S-moorMod2_true_analyzeCases.pkl differ diff --git a/tests/test_data/VolturnUS-S-pointInertia.yaml b/tests/test_data/VolturnUS-S-pointInertia.yaml index 55de786d..0230656d 100644 --- a/tests/test_data/VolturnUS-S-pointInertia.yaml +++ b/tests/test_data/VolturnUS-S-pointInertia.yaml @@ -4,8 +4,8 @@ comments: Used to perform tests on FOWT and model class functionality. This file settings: # global Settings - min_freq : 0.005 # [Hz] lowest frequency to consider, also the frequency bin width - max_freq : 0.20 # [Hz] highest frequency to consider + min_freq : 0.005 # [Hz] lowest frequency to consider, also the frequency bin width + max_freq : 0.200 # [Hz] highest frequency to consider XiStart : 0 # sets initial amplitude of each DOF for all frequencies nIter : 4 # sets how many iterations to perform in Model.solveDynamics() @@ -1060,7 +1060,7 @@ turbine: dlsMax : 5.0 # maximum node splitting section amount; can't be 0 name : tower # [-] an identifier (no longer has to be number) - type : 1 # [-] + type : rigid # [-] rA : [ 0, 0, 15] # [m] end A coordinates rB : [ 0, 0, 144.582] # [m] and B coordinates shape : circ # [-] circular or rectangular @@ -1113,7 +1113,7 @@ platform: members: # list all members here - name : center_column # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [ 0, 0, -20] # [m] end A coordinates rB : [ 0, 0, 15] # [m] and B coordinates shape : circ # [-] circular or rectangular @@ -1134,17 +1134,17 @@ platform: - name : outer_column # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [51.75, 0, -20] # [m] end A coordinates rB : [51.75, 0, 15] # [m] and B coordinates heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) shape : circ # [-] circular or rectangular gamma : 0.0 # [deg] twist angle about the member's z-axis - potMod : False # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + potMod : False # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory MCF : True # --- outer shell including hydro--- - stations : [0, 35] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB - d : 12.23 # [m] diameters if circular or side lengths if rectangular (can be pairs) + stations : [0, 35] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 12.23 # [m] diameters if circular or side lengths if rectangular (can be pairs) Cd : 0.6 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) Ca : 0.85 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) CdEnd : 1.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) @@ -1156,7 +1156,7 @@ platform: - name : pontoon # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [ 5 , 0, -16.5] # [m] end A coordinates rB : [ 45.5, 0, -16.5] # [m] and B coordinates heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) @@ -1164,7 +1164,7 @@ platform: gamma : 0.0 # [deg] twist angle about the member's z-axis potMod : False # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory # --- outer shell including hydro--- - stations : [0, 40.5] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + stations : [0, 40.5] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB d : [12.4, 7.0] # [m] diameters if circular or side lengths if rectangular (can be pairs) Cd : [1.5, 2.2 ] # [-] transverse drag coefficient (optional, scalar or list of same length as stations) Ca : [0.9, 0.9 ] # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) @@ -1173,7 +1173,7 @@ platform: - name : upper_support # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [ 5 , 0, 14.545] # [m] end A coordinates rB : [ 45.5, 0, 14.545] # [m] and B coordinates heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) diff --git a/tests/test_data/VolturnUS-S-pointInertia_true_analyzeCases.pkl b/tests/test_data/VolturnUS-S-pointInertia_true_analyzeCases.pkl index 8836182d..35def2aa 100644 Binary files a/tests/test_data/VolturnUS-S-pointInertia_true_analyzeCases.pkl and b/tests/test_data/VolturnUS-S-pointInertia_true_analyzeCases.pkl differ diff --git a/tests/test_data/VolturnUS-S-pointInertia_true_calcCurrentLoads.pkl b/tests/test_data/VolturnUS-S-pointInertia_true_calcCurrentLoads.pkl new file mode 100644 index 00000000..93a50b16 Binary files /dev/null and b/tests/test_data/VolturnUS-S-pointInertia_true_calcCurrentLoads.pkl differ diff --git a/tests/test_data/VolturnUS-S-pointInertia_true_calcQTF_slenderBody.pkl b/tests/test_data/VolturnUS-S-pointInertia_true_calcQTF_slenderBody.pkl index 98e9d9b2..c4030da2 100644 Binary files a/tests/test_data/VolturnUS-S-pointInertia_true_calcQTF_slenderBody.pkl and b/tests/test_data/VolturnUS-S-pointInertia_true_calcQTF_slenderBody.pkl differ diff --git a/tests/test_data/VolturnUS-S-pointInertia_true_hydroConstants.pkl b/tests/test_data/VolturnUS-S-pointInertia_true_hydroConstants.pkl new file mode 100644 index 00000000..1318d443 Binary files /dev/null and b/tests/test_data/VolturnUS-S-pointInertia_true_hydroConstants.pkl differ diff --git a/tests/test_data/VolturnUS-S-pointInertia_true_hydroExcitation.pkl b/tests/test_data/VolturnUS-S-pointInertia_true_hydroExcitation.pkl index aa8430eb..58766fd4 100644 Binary files a/tests/test_data/VolturnUS-S-pointInertia_true_hydroExcitation.pkl and b/tests/test_data/VolturnUS-S-pointInertia_true_hydroExcitation.pkl differ diff --git a/tests/test_data/VolturnUS-S-pointInertia_true_hydroLinearization.pkl b/tests/test_data/VolturnUS-S-pointInertia_true_hydroLinearization.pkl index 39e56468..61f40a5a 100644 Binary files a/tests/test_data/VolturnUS-S-pointInertia_true_hydroLinearization.pkl and b/tests/test_data/VolturnUS-S-pointInertia_true_hydroLinearization.pkl differ diff --git a/tests/test_data/VolturnUS-S-pointInertia_true_statics.pkl b/tests/test_data/VolturnUS-S-pointInertia_true_statics.pkl new file mode 100644 index 00000000..5219cd5e Binary files /dev/null and b/tests/test_data/VolturnUS-S-pointInertia_true_statics.pkl differ diff --git a/tests/test_data/VolturnUS-S.yaml b/tests/test_data/VolturnUS-S.yaml index 9ff926ee..2d5d1943 100644 --- a/tests/test_data/VolturnUS-S.yaml +++ b/tests/test_data/VolturnUS-S.yaml @@ -1060,7 +1060,7 @@ turbine: dlsMax : 5.0 # maximum node splitting section amount; can't be 0 name : tower # [-] an identifier (no longer has to be number) - type : 1 # [-] + type : rigid # [-] rA : [ 0, 0, 15] # [m] end A coordinates rB : [ 0, 0, 144.582] # [m] and B coordinates shape : circ # [-] circular or rectangular @@ -1091,7 +1091,7 @@ platform: members: # list all members here - name : center_column # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [ 0, 0, -20] # [m] end A coordinates rB : [ 0, 0, 15] # [m] and B coordinates shape : circ # [-] circular or rectangular @@ -1114,17 +1114,17 @@ platform: - name : outer_column # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [51.75, 0, -20] # [m] end A coordinates rB : [51.75, 0, 15] # [m] and B coordinates heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) shape : circ # [-] circular or rectangular gamma : 0.0 # [deg] twist angle about the member's z-axis - potMod : False # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + potMod : False # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory MCF : True # --- outer shell including hydro--- - stations : [0, 35] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB - d : 12.23 # [m] diameters if circular or side lengths if rectangular (can be pairs) + stations : [0, 35] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 12.23 # [m] diameters if circular or side lengths if rectangular (can be pairs) t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) Cd : 0.6 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) Ca : 0.85 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) @@ -1141,7 +1141,7 @@ platform: - name : pontoon # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [ 5 , 0, -16.5] # [m] end A coordinates rB : [ 45.5, 0, -16.5] # [m] and B coordinates heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) @@ -1162,7 +1162,7 @@ platform: - name : upper_support # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [ 5 , 0, 14.545] # [m] end A coordinates rB : [ 45.5, 0, 14.545] # [m] and B coordinates heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) diff --git a/tests/test_data/VolturnUS-S_farm-moorMod1.yaml b/tests/test_data/VolturnUS-S_farm-moorMod1.yaml new file mode 100644 index 00000000..16976aef --- /dev/null +++ b/tests/test_data/VolturnUS-S_farm-moorMod1.yaml @@ -0,0 +1,1195 @@ +type: input file for RAFT +name: IEA 15 MW with VolturnUS-S steel semi. Two fowts with shared moorings. +comments: Used to perform tests on model class functionality. + + +settings: # global Settings + min_freq : 0.0025 # [Hz] lowest frequency to consider, also the frequency bin width + max_freq : 0.200 # [Hz] highest frequency to consider + XiStart : 0 # sets initial amplitude of each DOF for all frequencies + nIter : 10 # sets how many iterations to perform in Model.solveDynamics() + +site: + water_depth : 600 # [m] uniform water depth + rho_water : 1025.0 # [kg/m^3] water density + rho_air : 1.225 # [kg/m^3] air density + mu_air : 1.81e-05 # air dynamic viscosity + shearExp : 0.12 # shear exponent + +cases: # new + keys : [wind_speed, wind_heading, turbulence, turbine_status, yaw_misalign, wave_spectrum, wave_period, wave_height, wave_heading ] + data : # m/s deg % or e.g. 2B_NTM string deg string (s) (m) (deg) + - [ 10.5, 0, 0, operating, 0, JONSWAP, 12, 6, 0 ] + + +array: # new + keys : [turbineID, platformID, mooringID, x_location, y_location, heading_adjust] + data : # ID# ID# ID# [m] [m] [deg] + - [ 1, 1, 0, 0, 0, 180 ] # 2 array, shared moorings + - [ 1, 1, 0, 1600, 0, 0 ] + + + + # note: 0 could indicate not included at the fowt level for this fowt + # 1-n could indicate multiple options (or all use the same mooring design if only one option) + + + + +array_mooring: # option for array-level mooring system + file: "./shared_mooring_volturnus.dat" # MoorDyn shared mooring input file (same as would be used in FAST.Farm) + moorMod: 1 + + +turbine: + + mRNA : 1001505.907 # [kg] RNA mass: m_blades = 3*68076.969 = 204230.907 kg (from ED.sum), m_yawbearing = 100000 kg, m_hub = 190000 kg, m_nacelle = 507275 kg + IxRNA : 0 # [kg-m2] RNA moment of inertia about local x axis (assumed to be identical to rotor axis for now, as approx) [kg-m^2] + IrRNA : 0 # [kg-m2] RNA moment of inertia about local y or z axes [kg-m^2] + xCG_RNA : -7.27 # [m] x location of RNA center of mass [m]: xg_blades = -13.0 m, xg_hub = -11.0 m, xg_nac = -4.99 m, xg_yaw = 0.0 m + hHub : 150.0 # [m] hub height above water line [m] + Fthrust : 1500.0E3 # [N] temporary thrust force to use + + I_drivetrain: 318628138.0 # full rotor + drivetrain inertia as felt on the high-speed shaft + + nBlades : 3 # number of blades + Zhub : 150.0 # hub height [m] + Rhub : 3.97 # hub radius [m] + precone : -4.0 # [deg] + shaft_tilt : -6.0 # [deg] + overhang : -12.0313 # [m] + aeroServoMod : 2 # 0 aerodynamics off; 1 aerodynamics on (no control); 2 aerodynamics and control on + + blade: + precurveTip : -3.9999999999999964 # + presweepTip : 0.0 # + Rtip : 120.96999999936446 # rotor radius + + # r chord theta precurve presweep + geometry: + - [ 8.004, 5.228, 15.474, 0.035, 0.000 ] + - [ 12.039, 5.321, 14.692, 0.084, 0.000 ] + - [ 16.073, 5.458, 13.330, 0.139, 0.000 ] + - [ 20.108, 5.602, 11.644, 0.192, 0.000 ] + - [ 24.142, 5.718, 9.927, 0.232, 0.000 ] + - [ 28.177, 5.767, 8.438, 0.250, 0.000 ] + - [ 32.211, 5.713, 7.301, 0.250, 0.000 ] + - [ 36.246, 5.536, 6.232, 0.246, 0.000 ] + - [ 40.280, 5.291, 5.230, 0.240, 0.000 ] + - [ 44.315, 5.035, 4.348, 0.233, 0.000 ] + - [ 48.349, 4.815, 3.606, 0.218, 0.000 ] + - [ 52.384, 4.623, 2.978, 0.178, 0.000 ] + - [ 56.418, 4.432, 2.423, 0.100, 0.000 ] + - [ 60.453, 4.245, 1.924, 0.000, 0.000 ] + - [ 64.487, 4.065, 1.467, -0.112, 0.000 ] + - [ 68.522, 3.896, 1.056, -0.244, 0.000 ] + - [ 72.556, 3.735, 0.692, -0.415, 0.000 ] + - [ 76.591, 3.579, 0.355, -0.620, 0.000 ] + - [ 80.625, 3.425, 0.019, -0.846, 0.000 ] + - [ 84.660, 3.268, -0.358, -1.080, 0.000 ] + - [ 88.694, 3.112, -0.834, -1.330, 0.000 ] + - [ 92.729, 2.957, -1.374, -1.602, 0.000 ] + - [ 96.763, 2.800, -1.848, -1.895, 0.000 ] + - [ 100.798, 2.637, -2.136, -2.202, 0.000 ] + - [ 104.832, 2.464, -2.172, -2.523, 0.000 ] + - [ 108.867, 2.283, -2.108, -2.864, 0.000 ] + - [ 112.901, 2.096, -1.953, -3.224, 0.000 ] + - [ 116.936, 1.902, -1.662, -3.605, 0.000 ] + # station(rel) airfoil name + airfoils: + - [ 0.00000, circular ] + - [ 0.02000, circular ] + - [ 0.15000, SNL-FFA-W3-500 ] + - [ 0.24517, FFA-W3-360 ] + - [ 0.32884, FFA-W3-330blend ] + - [ 0.43918, FFA-W3-301 ] + - [ 0.53767, FFA-W3-270blend ] + - [ 0.63821, FFA-W3-241 ] + - [ 0.77174, FFA-W3-211 ] + - [ 1.00000, FFA-W3-211 ] + + + airfoils: + - name : circular # + relative_thickness : 1.0 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00010, 0.35000, -0.00010 ] + - [ 179.9087, 0.00010, 0.35000, -0.00010 ] + - name : SNL-FFA-W3-500 # + relative_thickness : 0.5 # + data: # alpha c_l c_d c_m + - [ -179.9660, 0.00000, 0.08440, 0.00000 ] + - [ -170.0000, 0.44190, 0.08440, 0.31250 ] + - [ -160.0002, 0.88370, 0.12680, 0.28310 ] + - [ -149.9998, 0.96740, 0.29270, 0.26320 ] + - [ -139.9999, 0.78010, 0.49700, 0.20480 ] + - [ -130.0001, 0.62930, 0.71610, 0.19320 ] + - [ -120.0003, 0.47850, 0.92460, 0.20080 ] + - [ -109.9999, 0.31890, 1.09850, 0.21360 ] + - [ -100.0000, 0.15530, 1.21820, 0.22210 ] + - [ -90.0002, 0.00000, 1.27070, 0.21980 ] + - [ -79.9998, -0.15530, 1.21820, 0.19600 ] + - [ -70.0000, -0.31890, 1.09850, 0.16350 ] + - [ -60.0001, -0.47840, 0.92460, 0.12850 ] + - [ -49.9997, -0.62930, 0.71610, 0.09650 ] + - [ -39.9999, -0.78010, 0.49700, 0.07160 ] + - [ -30.0001, -0.96740, 0.29270, 0.05220 ] + - [ -20.0002, -1.02810, 0.14990, -0.00630 ] + - [ -19.7499, -1.02430, 0.14720, -0.00890 ] + - [ -19.2502, -1.00520, 0.14470, -0.00990 ] + - [ -18.9999, -0.99710, 0.14330, -0.01050 ] + - [ -18.7500, -1.00520, 0.14030, -0.01100 ] + - [ -18.5002, -0.99950, 0.13860, -0.01160 ] + - [ -18.2499, -0.99080, 0.13730, -0.01200 ] + - [ -18.0000, -0.98150, 0.13600, -0.01260 ] + - [ -17.4998, -0.97640, 0.13220, -0.01350 ] + - [ -17.2500, -0.97050, 0.13060, -0.01390 ] + - [ -17.0002, -0.96550, 0.12900, -0.01430 ] + - [ -16.7498, -0.96620, 0.12680, -0.01470 ] + - [ -16.5000, -0.95440, 0.12580, -0.01510 ] + - [ -16.2502, -0.94440, 0.12460, -0.01550 ] + - [ -15.9998, -0.94050, 0.12290, -0.01580 ] + - [ -15.7500, -0.94330, 0.12060, -0.01610 ] + - [ -15.5002, -0.93300, 0.11950, -0.01640 ] + - [ -15.2498, -0.92110, 0.11850, -0.01680 ] + - [ -14.7502, -0.91580, 0.11500, -0.01730 ] + - [ -14.4998, -0.90700, 0.11380, -0.01750 ] + - [ -14.2500, -0.89590, 0.11270, -0.01780 ] + - [ -14.0002, -0.89260, 0.11100, -0.01810 ] + - [ -13.7498, -0.88080, 0.11000, -0.01840 ] + - [ -13.5000, -0.87220, 0.10890, -0.01860 ] + - [ -13.2502, -0.86600, 0.10750, -0.01880 ] + - [ -12.9998, -0.86260, 0.10590, -0.01880 ] + - [ -12.7500, -0.84890, 0.10510, -0.01920 ] + - [ -12.5002, -0.83630, 0.10420, -0.01940 ] + - [ -12.2498, -0.83630, 0.10230, -0.01940 ] + - [ -12.0000, -0.82710, 0.10130, -0.01960 ] + - [ -11.7502, -0.81410, 0.10040, -0.01980 ] + - [ -11.4998, -0.80040, 0.09970, -0.02000 ] + - [ -11.0002, -0.78900, 0.09710, -0.01990 ] + - [ -10.7498, -0.78620, 0.09560, -0.01960 ] + - [ -10.5000, -0.77470, 0.09480, -0.01940 ] + - [ -10.2502, -0.77010, 0.09400, -0.01840 ] + - [ -9.9998, -0.76740, 0.09250, -0.01830 ] + - [ -9.7500, -0.75060, 0.09170, -0.01920 ] + - [ -9.5002, -0.72900, 0.09120, -0.02050 ] + - [ -9.2498, -0.70950, 0.09020, -0.02240 ] + - [ -9.0000, -0.68550, 0.08950, -0.02470 ] + - [ -8.7502, -0.65900, 0.08910, -0.02670 ] + - [ -8.4998, -0.63190, 0.08870, -0.02870 ] + - [ -8.2500, -0.60190, 0.08790, -0.03200 ] + - [ -8.0002, -0.57180, 0.08750, -0.03450 ] + - [ -7.7498, -0.54240, 0.08730, -0.03670 ] + - [ -7.5000, -0.50980, 0.08680, -0.03990 ] + - [ -7.2502, -0.47670, 0.08640, -0.04300 ] + - [ -6.9998, -0.44540, 0.08620, -0.04530 ] + - [ -6.7500, -0.41420, 0.08600, -0.04760 ] + - [ -6.5002, -0.37910, 0.08560, -0.05100 ] + - [ -6.2498, -0.34600, 0.08530, -0.05380 ] + - [ -6.0000, -0.31440, 0.08520, -0.05600 ] + - [ -5.7502, -0.28170, 0.08500, -0.05860 ] + - [ -5.4998, -0.24610, 0.08470, -0.06190 ] + - [ -5.2500, -0.21330, 0.08460, -0.06440 ] + - [ -5.0002, -0.18270, 0.08450, -0.06630 ] + - [ -4.7498, -0.14940, 0.08430, -0.06880 ] + - [ -4.5000, -0.11580, 0.08420, -0.07150 ] + - [ -4.2502, -0.08370, 0.08400, -0.07370 ] + - [ -3.9998, -0.05290, 0.08400, -0.07560 ] + - [ -3.7500, -0.02250, 0.08390, -0.07740 ] + - [ -3.5002, 0.00890, 0.08380, -0.07930 ] + - [ -3.2498, 0.03920, 0.08380, -0.08110 ] + - [ -3.0000, 0.06860, 0.08380, -0.08260 ] + - [ -2.7502, 0.09740, 0.08380, -0.08380 ] + - [ -2.4998, 0.12600, 0.08380, -0.08520 ] + - [ -2.2500, 0.15550, 0.08380, -0.08670 ] + - [ -2.0002, 0.18530, 0.08380, -0.08830 ] + - [ -1.7498, 0.21460, 0.08370, -0.08970 ] + - [ -1.5000, 0.24300, 0.08370, -0.09100 ] + - [ -1.2502, 0.27130, 0.08380, -0.09210 ] + - [ -0.9998, 0.30060, 0.08380, -0.09360 ] + - [ -0.7500, 0.32950, 0.08380, -0.09490 ] + - [ -0.5002, 0.35780, 0.08380, -0.09610 ] + - [ -0.2498, 0.38570, 0.08380, -0.09720 ] + - [ 0.0000, 0.41350, 0.08380, -0.09830 ] + - [ 0.2298, 0.44250, 0.08390, -0.09950 ] + - [ 0.4698, 0.47150, 0.08390, -0.10080 ] + - [ 0.7002, 0.50030, 0.08390, -0.10190 ] + - [ 0.9402, 0.52860, 0.08400, -0.10290 ] + - [ 1.1700, 0.55670, 0.08400, -0.10400 ] + - [ 1.3997, 0.58500, 0.08410, -0.10500 ] + - [ 1.6398, 0.61350, 0.08410, -0.10610 ] + - [ 1.8701, 0.64170, 0.08420, -0.10720 ] + - [ 2.1102, 0.66970, 0.08420, -0.10820 ] + - [ 2.3400, 0.69750, 0.08430, -0.10910 ] + - [ 2.5697, 0.72510, 0.08430, -0.11000 ] + - [ 2.8098, 0.75280, 0.08440, -0.11090 ] + - [ 3.0401, 0.78070, 0.08450, -0.11190 ] + - [ 3.2802, 0.80830, 0.08460, -0.11280 ] + - [ 3.5099, 0.83580, 0.08460, -0.11370 ] + - [ 3.7403, 0.86310, 0.08470, -0.11460 ] + - [ 3.9798, 0.89020, 0.08470, -0.11530 ] + - [ 4.2101, 0.91730, 0.08480, -0.11610 ] + - [ 4.4502, 0.94440, 0.08490, -0.11700 ] + - [ 4.6799, 0.97130, 0.08500, -0.11780 ] + - [ 4.9102, 0.99810, 0.08510, -0.11850 ] + - [ 5.1497, 1.02490, 0.08520, -0.11920 ] + - [ 5.3801, 1.05150, 0.08530, -0.11990 ] + - [ 5.6201, 1.07790, 0.08530, -0.12060 ] + - [ 5.8499, 1.10410, 0.08540, -0.12120 ] + - [ 6.0802, 1.13020, 0.08560, -0.12180 ] + - [ 6.3197, 1.15600, 0.08570, -0.12240 ] + - [ 6.5501, 1.18180, 0.08580, -0.12300 ] + - [ 6.7901, 1.20760, 0.08590, -0.12350 ] + - [ 7.0199, 1.23340, 0.08600, -0.12400 ] + - [ 7.2502, 1.25890, 0.08610, -0.12450 ] + - [ 7.4903, 1.28410, 0.08620, -0.12500 ] + - [ 7.7200, 1.30880, 0.08640, -0.12540 ] + - [ 7.9601, 1.33310, 0.08650, -0.12570 ] + - [ 8.1899, 1.35700, 0.08670, -0.12590 ] + - [ 8.4202, 1.38100, 0.08690, -0.12620 ] + - [ 8.6603, 1.40540, 0.08700, -0.12650 ] + - [ 8.8900, 1.42950, 0.08710, -0.12670 ] + - [ 9.1198, 1.45310, 0.08730, -0.12700 ] + - [ 9.8801, 1.51540, 0.08790, -0.12650 ] + - [ 10.6398, 1.57490, 0.08860, -0.12560 ] + - [ 11.4001, 1.61510, 0.08950, -0.12140 ] + - [ 12.1501, 1.64430, 0.09120, -0.11630 ] + - [ 12.9099, 1.68240, 0.09300, -0.11330 ] + - [ 13.6702, 1.71460, 0.09540, -0.11070 ] + - [ 14.4202, 1.73620, 0.09890, -0.10800 ] + - [ 15.1799, 1.76270, 0.10240, -0.10630 ] + - [ 15.9403, 1.77060, 0.10760, -0.10420 ] + - [ 16.6903, 1.76390, 0.11440, -0.10250 ] + - [ 17.4500, 1.76040, 0.12110, -0.10130 ] + - [ 18.2097, 1.72510, 0.13100, -0.10010 ] + - [ 18.9701, 1.70350, 0.13990, -0.09980 ] + - [ 19.7201, 1.67840, 0.14920, -0.10010 ] + - [ 20.4798, 1.65050, 0.15910, -0.10160 ] + - [ 21.2401, 1.62270, 0.16910, -0.10360 ] + - [ 21.9901, 1.60670, 0.17780, -0.10640 ] + - [ 22.7499, 1.59720, 0.18580, -0.10990 ] + - [ 23.5102, 1.58920, 0.19370, -0.11360 ] + - [ 24.2602, 1.58150, 0.20140, -0.11800 ] + - [ 25.0199, 1.55630, 0.21350, -0.12490 ] + - [ 25.7802, 1.52720, 0.22670, -0.13250 ] + - [ 26.5302, 1.49820, 0.23990, -0.14000 ] + - [ 27.2900, 1.46910, 0.25310, -0.14760 ] + - [ 28.0497, 1.44010, 0.26630, -0.15510 ] + - [ 28.8100, 1.41100, 0.27950, -0.16270 ] + - [ 29.5600, 1.38200, 0.29270, -0.17030 ] + - [ 30.3198, 1.36220, 0.30780, -0.17400 ] + - [ 31.0801, 1.34240, 0.32300, -0.17770 ] + - [ 31.8301, 1.32250, 0.33810, -0.18150 ] + - [ 32.5898, 1.30270, 0.35320, -0.18520 ] + - [ 33.3502, 1.28290, 0.36840, -0.18890 ] + - [ 34.1002, 1.26310, 0.38350, -0.19260 ] + - [ 34.8599, 1.24330, 0.39870, -0.19640 ] + - [ 35.6202, 1.22340, 0.41380, -0.20010 ] + - [ 36.3800, 1.20360, 0.42890, -0.20390 ] + - [ 37.1300, 1.18380, 0.44410, -0.20760 ] + - [ 37.8903, 1.16400, 0.45920, -0.21130 ] + - [ 38.6500, 1.14420, 0.47430, -0.21500 ] + - [ 39.4000, 1.12430, 0.48950, -0.21880 ] + - [ 40.1598, 1.10640, 0.50520, -0.22180 ] + - [ 40.9201, 1.09050, 0.52140, -0.22420 ] + - [ 41.6701, 1.07450, 0.53760, -0.22660 ] + - [ 42.4298, 1.05860, 0.55380, -0.22890 ] + - [ 43.1901, 1.04260, 0.57010, -0.23130 ] + - [ 43.9401, 1.02670, 0.58630, -0.23370 ] + - [ 44.6999, 1.01070, 0.60250, -0.23610 ] + - [ 45.4602, 0.99480, 0.61880, -0.23840 ] + - [ 46.2199, 0.97880, 0.63500, -0.24080 ] + - [ 46.9699, 0.96280, 0.65120, -0.24320 ] + - [ 47.7302, 0.94690, 0.66750, -0.24550 ] + - [ 48.4900, 0.93090, 0.68370, -0.24790 ] + - [ 49.2400, 0.91500, 0.69990, -0.25030 ] + - [ 49.9997, 0.89900, 0.71610, -0.25270 ] + - [ 60.0001, 0.68360, 0.92460, -0.28330 ] + - [ 70.0000, 0.45560, 1.09850, -0.31560 ] + - [ 79.9998, 0.22190, 1.21820, -0.34820 ] + - [ 90.0002, 0.00000, 1.27070, -0.37730 ] + - [ 100.0000, -0.15530, 1.21820, -0.38770 ] + - [ 109.9999, -0.31890, 1.09850, -0.38650 ] + - [ 120.0003, -0.47840, 0.92460, -0.38060 ] + - [ 130.0001, -0.62930, 0.71610, -0.38030 ] + - [ 139.9999, -0.78010, 0.49700, -0.40320 ] + - [ 149.9998, -0.96740, 0.29270, -0.48540 ] + - [ 160.0002, -0.88370, 0.12680, -0.53250 ] + - [ 170.0000, -0.44180, 0.08440, -0.39060 ] + - [ 179.9660, 0.00000, 0.08440, 0.00000 ] + - name : FFA-W3-211 # + relative_thickness : 0.211 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.02464, 0.00000 ] + - [ -177.7143, 0.05403, 0.02534, 0.09143 ] + - [ -175.4286, 0.10805, 0.02742, 0.18286 ] + - [ -173.1429, 0.16208, 0.03088, 0.27429 ] + - [ -170.8572, 0.21610, 0.03570, 0.36571 ] + - [ -168.5716, 0.27013, 0.05599, 0.39192 ] + - [ -166.2857, 0.32415, 0.08143, 0.37898 ] + - [ -164.0000, 0.37818, 0.11112, 0.36605 ] + - [ -161.7145, 0.43220, 0.14485, 0.35312 ] + - [ -159.4284, 0.48623, 0.18242, 0.34768 ] + - [ -157.1428, 0.54025, 0.22359, 0.36471 ] + - [ -154.8573, 0.59428, 0.26810, 0.38175 ] + - [ -152.5714, 0.64830, 0.31566, 0.39878 ] + - [ -150.2857, 0.70233, 0.36597, 0.41581 ] + - [ -148.0000, 0.75635, 0.41871, 0.41955 ] + - [ -143.8571, 0.73188, 0.51941, 0.42287 ] + - [ -139.7143, 0.70655, 0.62488, 0.42632 ] + - [ -135.5714, 0.67760, 0.73293, 0.43163 ] + - [ -131.4286, 0.64333, 0.84130, 0.43694 ] + - [ -127.2857, 0.60277, 0.94773, 0.44389 ] + - [ -123.1429, 0.55550, 1.05001, 0.45171 ] + - [ -119.0000, 0.50156, 1.14600, 0.45897 ] + - [ -114.8571, 0.44131, 1.23371, 0.46448 ] + - [ -110.7143, 0.37542, 1.31129, 0.46998 ] + - [ -106.5714, 0.30482, 1.37714, 0.47096 ] + - [ -102.4286, 0.23063, 1.42988, 0.47101 ] + - [ -98.2857, 0.15413, 1.46842, 0.46824 ] + - [ -94.1429, 0.07675, 1.49196, 0.46149 ] + - [ -90.0000, 0.00000, 1.50000, 0.45474 ] + - [ -85.8571, -0.07675, 1.49196, 0.44026 ] + - [ -81.7143, -0.15413, 1.46842, 0.42578 ] + - [ -77.5714, -0.23063, 1.42988, 0.40821 ] + - [ -73.4286, -0.30482, 1.37714, 0.38846 ] + - [ -69.2857, -0.37542, 1.31129, 0.36815 ] + - [ -65.1429, -0.44131, 1.23371, 0.34519 ] + - [ -61.0000, -0.50156, 1.14600, 0.32223 ] + - [ -56.8571, -0.55550, 1.05001, 0.29864 ] + - [ -52.7143, -0.60277, 0.94773, 0.27486 ] + - [ -48.5714, -0.64333, 0.84130, 0.25128 ] + - [ -44.4286, -0.67760, 0.73293, 0.22810 ] + - [ -40.2857, -0.70655, 0.62488, 0.20491 ] + - [ -36.1429, -0.73188, 0.51941, 0.15416 ] + - [ -32.0000, -0.75635, 0.41871, 0.10137 ] + - [ -28.0000, -0.85636, 0.28691, 0.06527 ] + - [ -24.0000, -1.18292, 0.13960, 0.01647 ] + - [ -20.0000, -1.23596, 0.08345, -0.00352 ] + - [ -18.0000, -1.22536, 0.06509, -0.00672 ] + - [ -16.0000, -1.20476, 0.04888, -0.00881 ] + - [ -14.0000, -1.18332, 0.03417, -0.01101 ] + - [ -12.0000, -1.10093, 0.02132, -0.02269 ] + - [ -10.0000, -0.88209, 0.01386, -0.04397 ] + - [ -8.0000, -0.62981, 0.01075, -0.05756 ] + - [ -6.0000, -0.37670, 0.00882, -0.06747 ] + - [ -4.0000, -0.12177, 0.00702, -0.07680 ] + - [ -2.0000, 0.12810, 0.00663, -0.08283 ] + - [ -1.0000, 0.25192, 0.00664, -0.08534 ] + - [ 0.0000, 0.37535, 0.00670, -0.08777 ] + - [ 1.0000, 0.49828, 0.00681, -0.09011 ] + - [ 2.0000, 0.62052, 0.00698, -0.09234 ] + - [ 3.0000, 0.74200, 0.00720, -0.09447 ] + - [ 4.0000, 0.86238, 0.00751, -0.09646 ] + - [ 5.0000, 0.98114, 0.00796, -0.09828 ] + - [ 6.0000, 1.09662, 0.00872, -0.09977 ] + - [ 7.0000, 1.20904, 0.00968, -0.10095 ] + - [ 8.0000, 1.31680, 0.01097, -0.10163 ] + - [ 9.0000, 1.42209, 0.01227, -0.10207 ] + - [ 10.0000, 1.52361, 0.01369, -0.10213 ] + - [ 11.0000, 1.61988, 0.01529, -0.10174 ] + - [ 12.0000, 1.70937, 0.01717, -0.10087 ] + - [ 13.0000, 1.78681, 0.01974, -0.09936 ] + - [ 14.0000, 1.84290, 0.02368, -0.09720 ] + - [ 15.0000, 1.85313, 0.03094, -0.09410 ] + - [ 16.0000, 1.80951, 0.04303, -0.09144 ] + - [ 18.0000, 1.66033, 0.07730, -0.09242 ] + - [ 20.0000, 1.56152, 0.11202, -0.09871 ] + - [ 24.0000, 1.43327, 0.18408, -0.11770 ] + - [ 28.0000, 1.29062, 0.27589, -0.14566 ] + - [ 32.0000, 1.08050, 0.41871, -0.18266 ] + - [ 36.1429, 1.04554, 0.51941, -0.20913 ] + - [ 40.2857, 1.00936, 0.62488, -0.23534 ] + - [ 44.4286, 0.96801, 0.73293, -0.25784 ] + - [ 48.5714, 0.91904, 0.84130, -0.28035 ] + - [ 52.7143, 0.86109, 0.94773, -0.30163 ] + - [ 56.8571, 0.79357, 1.05001, -0.32226 ] + - [ 61.0000, 0.71651, 1.14600, -0.34247 ] + - [ 65.1429, 0.63044, 1.23371, -0.36135 ] + - [ 69.2857, 0.53632, 1.31129, -0.38024 ] + - [ 73.4286, 0.43546, 1.37714, -0.39704 ] + - [ 77.5714, 0.32947, 1.42988, -0.41341 ] + - [ 81.7143, 0.22019, 1.46842, -0.42844 ] + - [ 85.8571, 0.10965, 1.49196, -0.44159 ] + - [ 90.0000, 0.00000, 1.50000, -0.45474 ] + - [ 94.1429, -0.07675, 1.49196, -0.46149 ] + - [ 98.2857, -0.15413, 1.46842, -0.46824 ] + - [ 102.4286, -0.23063, 1.42988, -0.47101 ] + - [ 106.5714, -0.30482, 1.37714, -0.47096 ] + - [ 110.7143, -0.37542, 1.31129, -0.46998 ] + - [ 114.8571, -0.44131, 1.23371, -0.46448 ] + - [ 119.0000, -0.50156, 1.14600, -0.45897 ] + - [ 123.1429, -0.55550, 1.05001, -0.45171 ] + - [ 127.2857, -0.60277, 0.94773, -0.44389 ] + - [ 131.4286, -0.64333, 0.84130, -0.43694 ] + - [ 135.5714, -0.67760, 0.73293, -0.43163 ] + - [ 139.7143, -0.70655, 0.62488, -0.42632 ] + - [ 143.8571, -0.73188, 0.51941, -0.42287 ] + - [ 148.0000, -0.75635, 0.41871, -0.41955 ] + - [ 150.2857, -0.70233, 0.36597, -0.41581 ] + - [ 152.5714, -0.64830, 0.31566, -0.39878 ] + - [ 154.8571, -0.59428, 0.26810, -0.38175 ] + - [ 157.1429, -0.54025, 0.22359, -0.36471 ] + - [ 159.4286, -0.48623, 0.18242, -0.34768 ] + - [ 161.7143, -0.43220, 0.14485, -0.37026 ] + - [ 164.0000, -0.37818, 0.11112, -0.40605 ] + - [ 166.2857, -0.32415, 0.08143, -0.44184 ] + - [ 168.5714, -0.27013, 0.05599, -0.47763 ] + - [ 170.8571, -0.21610, 0.03570, -0.45714 ] + - [ 173.1429, -0.16208, 0.03088, -0.34286 ] + - [ 175.4286, -0.10805, 0.02742, -0.22857 ] + - [ 177.7143, -0.05403, 0.02534, -0.11429 ] + - [ 179.9087, 0.00000, 0.02464, 0.00000 ] + - name : FFA-W3-241 # + relative_thickness : 0.241 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.01178, 0.00000 ] + - [ -177.7143, 0.05818, 0.01248, 0.09143 ] + - [ -175.4286, 0.11636, 0.01460, 0.18286 ] + - [ -173.1429, 0.17453, 0.01811, 0.27429 ] + - [ -170.8572, 0.23271, 0.02300, 0.36571 ] + - [ -168.5716, 0.29089, 0.02922, 0.39568 ] + - [ -166.2857, 0.34907, 0.05382, 0.38876 ] + - [ -164.0000, 0.40725, 0.08379, 0.38184 ] + - [ -161.7145, 0.46542, 0.11786, 0.37492 ] + - [ -159.4284, 0.52360, 0.15581, 0.37408 ] + - [ -157.1428, 0.58178, 0.19740, 0.39148 ] + - [ -154.8573, 0.63996, 0.24237, 0.40888 ] + - [ -152.5714, 0.69814, 0.29043, 0.42628 ] + - [ -150.2857, 0.75631, 0.34128, 0.44368 ] + - [ -148.0000, 0.81449, 0.39460, 0.44537 ] + - [ -143.8571, 0.77925, 0.49645, 0.44436 ] + - [ -139.7143, 0.74511, 0.60319, 0.44360 ] + - [ -135.5714, 0.70881, 0.71263, 0.44609 ] + - [ -131.4286, 0.66835, 0.82249, 0.44858 ] + - [ -127.2857, 0.62253, 0.93051, 0.45370 ] + - [ -123.1429, 0.57080, 1.03447, 0.46020 ] + - [ -119.0000, 0.51307, 1.13222, 0.46633 ] + - [ -114.8571, 0.44965, 1.22176, 0.47130 ] + - [ -110.7143, 0.38115, 1.30123, 0.47627 ] + - [ -106.5714, 0.30846, 1.36903, 0.47705 ] + - [ -102.4286, 0.23266, 1.42376, 0.47695 ] + - [ -98.2857, 0.15503, 1.46433, 0.47409 ] + - [ -94.1429, 0.07698, 1.48990, 0.46732 ] + - [ -90.0000, 0.00000, 1.50000, 0.46055 ] + - [ -85.8571, -0.07698, 1.48990, 0.44509 ] + - [ -81.7143, -0.15503, 1.46433, 0.42964 ] + - [ -77.5714, -0.23266, 1.42376, 0.41125 ] + - [ -73.4286, -0.30846, 1.36903, 0.39081 ] + - [ -69.2857, -0.38115, 1.30123, 0.36988 ] + - [ -65.1429, -0.44965, 1.22176, 0.34663 ] + - [ -61.0000, -0.51307, 1.13222, 0.32339 ] + - [ -56.8571, -0.57080, 1.03447, 0.29984 ] + - [ -52.7143, -0.62253, 0.93051, 0.27618 ] + - [ -48.5714, -0.66835, 0.82249, 0.25280 ] + - [ -44.4286, -0.70881, 0.71263, 0.22992 ] + - [ -40.2857, -0.74511, 0.60319, 0.20705 ] + - [ -36.1429, -0.77925, 0.49645, 0.14561 ] + - [ -32.0000, -0.81449, 0.39460, 0.08131 ] + - [ -28.0000, -1.07781, 0.22252, 0.04592 ] + - [ -24.0000, -1.12692, 0.15159, 0.01901 ] + - [ -20.0000, -1.14480, 0.09699, 0.00063 ] + - [ -18.0000, -1.12797, 0.07744, -0.00342 ] + - [ -16.0000, -1.09392, 0.06122, -0.00587 ] + - [ -14.0000, -1.05961, 0.04667, -0.00652 ] + - [ -12.0000, -1.03121, 0.03302, -0.00755 ] + - [ -10.0000, -0.93706, 0.02027, -0.02243 ] + - [ -8.0000, -0.67380, 0.01168, -0.05583 ] + - [ -6.0000, -0.40391, 0.00918, -0.07159 ] + - [ -4.0000, -0.14226, 0.00839, -0.08123 ] + - [ -2.0000, 0.11580, 0.00810, -0.08892 ] + - [ -1.0000, 0.24382, 0.00808, -0.09235 ] + - [ 0.0000, 0.37113, 0.00813, -0.09556 ] + - [ 1.0000, 0.49766, 0.00824, -0.09857 ] + - [ 2.0000, 0.62334, 0.00842, -0.10139 ] + - [ 3.0000, 0.74798, 0.00867, -0.10403 ] + - [ 4.0000, 0.87137, 0.00901, -0.10645 ] + - [ 5.0000, 0.99320, 0.00945, -0.10863 ] + - [ 6.0000, 1.11325, 0.00998, -0.11057 ] + - [ 7.0000, 1.23037, 0.01070, -0.11214 ] + - [ 8.0000, 1.34496, 0.01153, -0.11337 ] + - [ 9.0000, 1.45407, 0.01269, -0.11396 ] + - [ 10.0000, 1.55911, 0.01396, -0.11403 ] + - [ 11.0000, 1.65779, 0.01545, -0.11336 ] + - [ 12.0000, 1.74834, 0.01724, -0.11187 ] + - [ 13.0000, 1.82666, 0.01961, -0.10935 ] + - [ 14.0000, 1.88831, 0.02293, -0.10606 ] + - [ 15.0000, 1.92579, 0.02795, -0.10238 ] + - [ 16.0000, 1.92722, 0.03609, -0.09887 ] + - [ 18.0000, 1.80055, 0.06534, -0.09497 ] + - [ 20.0000, 1.63088, 0.10459, -0.09996 ] + - [ 24.0000, 1.43345, 0.19148, -0.12589 ] + - [ 28.0000, 1.28805, 0.28629, -0.15453 ] + - [ 32.0000, 1.16356, 0.39460, -0.18396 ] + - [ 36.1429, 1.11321, 0.49645, -0.21099 ] + - [ 40.2857, 1.06444, 0.60319, -0.23768 ] + - [ 44.4286, 1.01259, 0.71263, -0.25992 ] + - [ 48.5714, 0.95478, 0.82249, -0.28216 ] + - [ 52.7143, 0.88932, 0.93051, -0.30323 ] + - [ 56.8571, 0.81542, 1.03447, -0.32368 ] + - [ 61.0000, 0.73296, 1.13222, -0.34380 ] + - [ 65.1429, 0.64236, 1.22176, -0.36292 ] + - [ 69.2857, 0.54450, 1.30123, -0.38204 ] + - [ 73.4286, 0.44065, 1.36903, -0.39944 ] + - [ 77.5714, 0.33237, 1.42376, -0.41648 ] + - [ 81.7143, 0.22148, 1.46433, -0.43231 ] + - [ 85.8571, 0.10997, 1.48990, -0.44643 ] + - [ 90.0000, 0.00000, 1.50000, -0.46055 ] + - [ 94.1429, -0.07698, 1.48990, -0.46732 ] + - [ 98.2857, -0.15503, 1.46433, -0.47409 ] + - [ 102.4286, -0.23266, 1.42376, -0.47695 ] + - [ 106.5714, -0.30846, 1.36903, -0.47705 ] + - [ 110.7143, -0.38115, 1.30123, -0.47627 ] + - [ 114.8571, -0.44965, 1.22176, -0.47130 ] + - [ 119.0000, -0.51307, 1.13222, -0.46633 ] + - [ 123.1429, -0.57080, 1.03447, -0.46020 ] + - [ 127.2857, -0.62253, 0.93051, -0.45370 ] + - [ 131.4286, -0.66835, 0.82249, -0.44858 ] + - [ 135.5714, -0.70881, 0.71263, -0.44609 ] + - [ 139.7143, -0.74511, 0.60319, -0.44360 ] + - [ 143.8571, -0.77925, 0.49645, -0.44436 ] + - [ 148.0000, -0.81449, 0.39460, -0.44537 ] + - [ 150.2857, -0.75631, 0.34128, -0.44368 ] + - [ 152.5714, -0.69814, 0.29043, -0.42628 ] + - [ 154.8571, -0.63996, 0.24237, -0.40888 ] + - [ 157.1429, -0.58178, 0.19740, -0.39148 ] + - [ 159.4286, -0.52360, 0.15581, -0.37408 ] + - [ 161.7143, -0.46542, 0.11786, -0.39207 ] + - [ 164.0000, -0.40725, 0.08379, -0.42184 ] + - [ 166.2857, -0.34907, 0.05382, -0.45162 ] + - [ 168.5714, -0.29089, 0.02922, -0.48139 ] + - [ 170.8571, -0.23271, 0.02300, -0.45714 ] + - [ 173.1429, -0.17453, 0.01811, -0.34286 ] + - [ 175.4286, -0.11636, 0.01460, -0.22857 ] + - [ 177.7143, -0.05818, 0.01248, -0.11429 ] + - [ 179.9087, 0.00000, 0.01178, 0.00000 ] + - name : FFA-W3-270blend # + relative_thickness : 0.27 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.01545, 0.00000 ] + - [ -177.7143, 0.06213, 0.01611, 0.09143 ] + - [ -175.4286, 0.12426, 0.01807, 0.18286 ] + - [ -173.1429, 0.18639, 0.02133, 0.27429 ] + - [ -170.8572, 0.24852, 0.02587, 0.36571 ] + - [ -168.5716, 0.31064, 0.03289, 0.39874 ] + - [ -166.2857, 0.37277, 0.05681, 0.39672 ] + - [ -164.0000, 0.43490, 0.08471, 0.39470 ] + - [ -161.7145, 0.49703, 0.11643, 0.39268 ] + - [ -159.4284, 0.55916, 0.15176, 0.39544 ] + - [ -157.1428, 0.62129, 0.19048, 0.41254 ] + - [ -154.8573, 0.68342, 0.23234, 0.42964 ] + - [ -152.5714, 0.74555, 0.27708, 0.44674 ] + - [ -150.2857, 0.80768, 0.32441, 0.46384 ] + - [ -148.0000, 0.86981, 0.37404, 0.46186 ] + - [ -143.8571, 0.81660, 0.46882, 0.45335 ] + - [ -139.7143, 0.76812, 0.56814, 0.44523 ] + - [ -135.5714, 0.72040, 0.66995, 0.44237 ] + - [ -131.4286, 0.67095, 0.77214, 0.43951 ] + - [ -127.2857, 0.61828, 0.87258, 0.44072 ] + - [ -123.1429, 0.56158, 0.96921, 0.44407 ] + - [ -119.0000, 0.50057, 1.06002, 0.44739 ] + - [ -114.8571, 0.43540, 1.14315, 0.45063 ] + - [ -110.7143, 0.36655, 1.21688, 0.45387 ] + - [ -106.5714, 0.29475, 1.27969, 0.45377 ] + - [ -102.4286, 0.22098, 1.33030, 0.45298 ] + - [ -98.2857, 0.14639, 1.36768, 0.44973 ] + - [ -94.1429, 0.07227, 1.39107, 0.44302 ] + - [ -90.0000, 0.00000, 1.40000, 0.43630 ] + - [ -85.8571, -0.07227, 1.39107, 0.42180 ] + - [ -81.7143, -0.14639, 1.36768, 0.40730 ] + - [ -77.5714, -0.22098, 1.33030, 0.39020 ] + - [ -73.4286, -0.29475, 1.27969, 0.37125 ] + - [ -69.2857, -0.36655, 1.21688, 0.35190 ] + - [ -65.1429, -0.43540, 1.14315, 0.33068 ] + - [ -61.0000, -0.50057, 1.06002, 0.30945 ] + - [ -56.8571, -0.56158, 0.96921, 0.28815 ] + - [ -52.7143, -0.61828, 0.87258, 0.26684 ] + - [ -48.5714, -0.67095, 0.77214, 0.24576 ] + - [ -44.4286, -0.72040, 0.66995, 0.22512 ] + - [ -40.2857, -0.76812, 0.56814, 0.20447 ] + - [ -36.1429, -0.81660, 0.46882, 0.13957 ] + - [ -32.0000, -0.86981, 0.37404, 0.07138 ] + - [ -28.0000, -1.09837, 0.21880, 0.04400 ] + - [ -24.0000, -1.08339, 0.15982, 0.02166 ] + - [ -20.0000, -1.06990, 0.10744, 0.00422 ] + - [ -18.0000, -1.05454, 0.08690, -0.00035 ] + - [ -16.0000, -1.03432, 0.06844, -0.00334 ] + - [ -14.0000, -1.08360, 0.04733, -0.00283 ] + - [ -12.0000, -1.09489, 0.03085, -0.00556 ] + - [ -10.0000, -0.92665, 0.01984, -0.02952 ] + - [ -8.0000, -0.69676, 0.01439, -0.04822 ] + - [ -6.0000, -0.43628, 0.01155, -0.06483 ] + - [ -4.0000, -0.16252, 0.01026, -0.07919 ] + - [ -2.0000, 0.10709, 0.00976, -0.09041 ] + - [ -1.0000, 0.23993, 0.00967, -0.09517 ] + - [ 0.0000, 0.37158, 0.00968, -0.09953 ] + - [ 1.0000, 0.50210, 0.00976, -0.10355 ] + - [ 2.0000, 0.63139, 0.00993, -0.10725 ] + - [ 3.0000, 0.75951, 0.01016, -0.11068 ] + - [ 4.0000, 0.88638, 0.01045, -0.11385 ] + - [ 5.0000, 1.01172, 0.01082, -0.11673 ] + - [ 6.0000, 1.13430, 0.01140, -0.11923 ] + - [ 7.0000, 1.25536, 0.01198, -0.12145 ] + - [ 8.0000, 1.37379, 0.01267, -0.12328 ] + - [ 9.0000, 1.48841, 0.01353, -0.12460 ] + - [ 10.0000, 1.59782, 0.01460, -0.12526 ] + - [ 11.0000, 1.70005, 0.01597, -0.12505 ] + - [ 12.0000, 1.79190, 0.01777, -0.12370 ] + - [ 13.0000, 1.86782, 0.02035, -0.12093 ] + - [ 14.0000, 1.92687, 0.02385, -0.11725 ] + - [ 15.0000, 1.90901, 0.03236, -0.10931 ] + - [ 16.0000, 1.88548, 0.04259, -0.10525 ] + - [ 18.0000, 1.72106, 0.07672, -0.10292 ] + - [ 20.0000, 1.54737, 0.11914, -0.11017 ] + - [ 24.0000, 1.37176, 0.20189, -0.13431 ] + - [ 28.0000, 1.33611, 0.27981, -0.15777 ] + - [ 32.0000, 1.24258, 0.37404, -0.18432 ] + - [ 36.1429, 1.16657, 0.46882, -0.21002 ] + - [ 40.2857, 1.09731, 0.56814, -0.23531 ] + - [ 44.4286, 1.02914, 0.66995, -0.25508 ] + - [ 48.5714, 0.95850, 0.77214, -0.27485 ] + - [ 52.7143, 0.88325, 0.87258, -0.29346 ] + - [ 56.8571, 0.80225, 0.96921, -0.31145 ] + - [ 61.0000, 0.71510, 1.06002, -0.32925 ] + - [ 65.1429, 0.62200, 1.14315, -0.34641 ] + - [ 69.2857, 0.52364, 1.21688, -0.36357 ] + - [ 73.4286, 0.42107, 1.27969, -0.37949 ] + - [ 77.5714, 0.31569, 1.33030, -0.39517 ] + - [ 81.7143, 0.20913, 1.36768, -0.40983 ] + - [ 85.8571, 0.10324, 1.39107, -0.42306 ] + - [ 90.0000, 0.00000, 1.40000, -0.43630 ] + - [ 94.1429, -0.07227, 1.39107, -0.44302 ] + - [ 98.2857, -0.14639, 1.36768, -0.44973 ] + - [ 102.4286, -0.22098, 1.33030, -0.45298 ] + - [ 106.5714, -0.29475, 1.27969, -0.45377 ] + - [ 110.7143, -0.36655, 1.21688, -0.45387 ] + - [ 114.8571, -0.43540, 1.14315, -0.45063 ] + - [ 119.0000, -0.50057, 1.06002, -0.44739 ] + - [ 123.1429, -0.56158, 0.96921, -0.44407 ] + - [ 127.2857, -0.61828, 0.87258, -0.44072 ] + - [ 131.4286, -0.67095, 0.77214, -0.43951 ] + - [ 135.5714, -0.72040, 0.66995, -0.44237 ] + - [ 139.7143, -0.76812, 0.56814, -0.44523 ] + - [ 143.8571, -0.81660, 0.46882, -0.45335 ] + - [ 148.0000, -0.86981, 0.37404, -0.46186 ] + - [ 150.2857, -0.80768, 0.32441, -0.46384 ] + - [ 152.5714, -0.74555, 0.27708, -0.44674 ] + - [ 154.8571, -0.68342, 0.23234, -0.42964 ] + - [ 157.1429, -0.62129, 0.19048, -0.41254 ] + - [ 159.4286, -0.55916, 0.15176, -0.39544 ] + - [ 161.7143, -0.49703, 0.11643, -0.40982 ] + - [ 164.0000, -0.43490, 0.08471, -0.43470 ] + - [ 166.2857, -0.37277, 0.05681, -0.45958 ] + - [ 168.5714, -0.31064, 0.03289, -0.48445 ] + - [ 170.8571, -0.24852, 0.02587, -0.45714 ] + - [ 173.1429, -0.18639, 0.02133, -0.34286 ] + - [ 175.4286, -0.12426, 0.01807, -0.22857 ] + - [ 177.7143, -0.06213, 0.01611, -0.11429 ] + - [ 179.9087, 0.00000, 0.01545, 0.00000 ] + - name : FFA-W3-301 # + relative_thickness : 0.301 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.02454, 0.00000 ] + - [ -177.7143, 0.06508, 0.02514, 0.09143 ] + - [ -175.4286, 0.13016, 0.02694, 0.18286 ] + - [ -173.1429, 0.19525, 0.02993, 0.27429 ] + - [ -170.8572, 0.26033, 0.03408, 0.36571 ] + - [ -168.5716, 0.32541, 0.03938, 0.40085 ] + - [ -166.2857, 0.39049, 0.05910, 0.40220 ] + - [ -164.0000, 0.45557, 0.08495, 0.40356 ] + - [ -161.7145, 0.52066, 0.11433, 0.40492 ] + - [ -159.4284, 0.58574, 0.14704, 0.41010 ] + - [ -157.1428, 0.65082, 0.18290, 0.42678 ] + - [ -154.8573, 0.71590, 0.22166, 0.44345 ] + - [ -152.5714, 0.78098, 0.26309, 0.46013 ] + - [ -150.2857, 0.84607, 0.30692, 0.47680 ] + - [ -148.0000, 0.91115, 0.35287, 0.47162 ] + - [ -143.8571, 0.84257, 0.44061, 0.45656 ] + - [ -139.7143, 0.78187, 0.53255, 0.44202 ] + - [ -135.5714, 0.72448, 0.62677, 0.43452 ] + - [ -131.4286, 0.66755, 0.72131, 0.42701 ] + - [ -127.2857, 0.60928, 0.81421, 0.42483 ] + - [ -123.1429, 0.54868, 0.90355, 0.42544 ] + - [ -119.0000, 0.48530, 0.98748, 0.42634 ] + - [ -114.8571, 0.41915, 1.06425, 0.42813 ] + - [ -110.7143, 0.35056, 1.13227, 0.42992 ] + - [ -106.5714, 0.28017, 1.19015, 0.42916 ] + - [ -102.4286, 0.20881, 1.23669, 0.42788 ] + - [ -98.2857, 0.13754, 1.27093, 0.42444 ] + - [ -94.1429, 0.06751, 1.29218, 0.41794 ] + - [ -90.0000, 0.00000, 1.30000, 0.41144 ] + - [ -85.8571, -0.06751, 1.29218, 0.39804 ] + - [ -81.7143, -0.13754, 1.27093, 0.38464 ] + - [ -77.5714, -0.20881, 1.23669, 0.36892 ] + - [ -73.4286, -0.28017, 1.19015, 0.35157 ] + - [ -69.2857, -0.35056, 1.13227, 0.33391 ] + - [ -65.1429, -0.41915, 1.06425, 0.31474 ] + - [ -61.0000, -0.48530, 0.98748, 0.29557 ] + - [ -56.8571, -0.54868, 0.90355, 0.27653 ] + - [ -52.7143, -0.60928, 0.81421, 0.25754 ] + - [ -48.5714, -0.66755, 0.72131, 0.23873 ] + - [ -44.4286, -0.72448, 0.62677, 0.22027 ] + - [ -40.2857, -0.78187, 0.53255, 0.20181 ] + - [ -36.1429, -0.84257, 0.44061, 0.13644 ] + - [ -32.0000, -0.91115, 0.35287, 0.06760 ] + - [ -28.0000, -1.10349, 0.21721, 0.04231 ] + - [ -24.0000, -1.10737, 0.15629, 0.02026 ] + - [ -20.0000, -1.11815, 0.10335, 0.00407 ] + - [ -18.0000, -1.12332, 0.08180, 0.00017 ] + - [ -16.0000, -1.11865, 0.06331, -0.00167 ] + - [ -14.0000, -1.11620, 0.04718, -0.00120 ] + - [ -12.0000, -1.09588, 0.03280, -0.00463 ] + - [ -10.0000, -0.91767, 0.02351, -0.02494 ] + - [ -8.0000, -0.69311, 0.01793, -0.04304 ] + - [ -6.0000, -0.45396, 0.01431, -0.05868 ] + - [ -4.0000, -0.17779, 0.01242, -0.07601 ] + - [ -2.0000, 0.10480, 0.01160, -0.09121 ] + - [ -1.0000, 0.24383, 0.01143, -0.09763 ] + - [ 0.0000, 0.38111, 0.01138, -0.10341 ] + - [ 1.0000, 0.51660, 0.01143, -0.10861 ] + - [ 2.0000, 0.65044, 0.01156, -0.11333 ] + - [ 3.0000, 0.78267, 0.01177, -0.11762 ] + - [ 4.0000, 0.91326, 0.01204, -0.12154 ] + - [ 5.0000, 1.04207, 0.01239, -0.12510 ] + - [ 6.0000, 1.16873, 0.01283, -0.12828 ] + - [ 7.0000, 1.29296, 0.01338, -0.13104 ] + - [ 8.0000, 1.41390, 0.01406, -0.13332 ] + - [ 9.0000, 1.53088, 0.01488, -0.13503 ] + - [ 10.0000, 1.64208, 0.01592, -0.13599 ] + - [ 11.0000, 1.74568, 0.01726, -0.13605 ] + - [ 12.0000, 1.83887, 0.01908, -0.13514 ] + - [ 13.0000, 1.91764, 0.02169, -0.13322 ] + - [ 14.0000, 1.97413, 0.02572, -0.13020 ] + - [ 15.0000, 1.99916, 0.03222, -0.12641 ] + - [ 16.0000, 1.99377, 0.04157, -0.12265 ] + - [ 18.0000, 1.91720, 0.06731, -0.11675 ] + - [ 20.0000, 1.73683, 0.10526, -0.11652 ] + - [ 24.0000, 1.47321, 0.19229, -0.13790 ] + - [ 28.0000, 1.36017, 0.27449, -0.16242 ] + - [ 32.0000, 1.30164, 0.35287, -0.18463 ] + - [ 36.1429, 1.20367, 0.44061, -0.20894 ] + - [ 40.2857, 1.11695, 0.53255, -0.23276 ] + - [ 44.4286, 1.03498, 0.62677, -0.25011 ] + - [ 48.5714, 0.95364, 0.72131, -0.26746 ] + - [ 52.7143, 0.87040, 0.81421, -0.28365 ] + - [ 56.8571, 0.78383, 0.90355, -0.29923 ] + - [ 61.0000, 0.69329, 0.98748, -0.31472 ] + - [ 65.1429, 0.59878, 1.06425, -0.32988 ] + - [ 69.2857, 0.50080, 1.13227, -0.34505 ] + - [ 73.4286, 0.40024, 1.19015, -0.35942 ] + - [ 77.5714, 0.29831, 1.23669, -0.37363 ] + - [ 81.7143, 0.19648, 1.27093, -0.38702 ] + - [ 85.8571, 0.09644, 1.29218, -0.39923 ] + - [ 90.0000, 0.00000, 1.30000, -0.41144 ] + - [ 94.1429, -0.06751, 1.29218, -0.41794 ] + - [ 98.2857, -0.13754, 1.27093, -0.42444 ] + - [ 102.4286, -0.20881, 1.23669, -0.42788 ] + - [ 106.5714, -0.28017, 1.19015, -0.42916 ] + - [ 110.7143, -0.35056, 1.13227, -0.42992 ] + - [ 114.8571, -0.41915, 1.06425, -0.42813 ] + - [ 119.0000, -0.48530, 0.98748, -0.42634 ] + - [ 123.1429, -0.54868, 0.90355, -0.42544 ] + - [ 127.2857, -0.60928, 0.81421, -0.42483 ] + - [ 131.4286, -0.66755, 0.72131, -0.42701 ] + - [ 135.5714, -0.72448, 0.62677, -0.43452 ] + - [ 139.7143, -0.78187, 0.53255, -0.44202 ] + - [ 143.8571, -0.84257, 0.44061, -0.45656 ] + - [ 148.0000, -0.91115, 0.35287, -0.47162 ] + - [ 150.2857, -0.84607, 0.30692, -0.47680 ] + - [ 152.5714, -0.78098, 0.26309, -0.46013 ] + - [ 154.8571, -0.71590, 0.22166, -0.44345 ] + - [ 157.1429, -0.65082, 0.18290, -0.42678 ] + - [ 159.4286, -0.58574, 0.14704, -0.41010 ] + - [ 161.7143, -0.52066, 0.11433, -0.42206 ] + - [ 164.0000, -0.45557, 0.08495, -0.44356 ] + - [ 166.2857, -0.39049, 0.05910, -0.46506 ] + - [ 168.5714, -0.32541, 0.03938, -0.48656 ] + - [ 170.8571, -0.26033, 0.03408, -0.45714 ] + - [ 173.1429, -0.19525, 0.02993, -0.34286 ] + - [ 175.4286, -0.13016, 0.02694, -0.22857 ] + - [ 177.7143, -0.06508, 0.02514, -0.11429 ] + - [ 179.9087, 0.00000, 0.02454, 0.00000 ] + - name : FFA-W3-330blend # + relative_thickness : 0.33 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.03169, 0.00000 ] + - [ -177.7143, 0.06960, 0.03228, 0.09143 ] + - [ -175.4286, 0.13920, 0.03406, 0.18286 ] + - [ -173.1429, 0.20880, 0.03702, 0.27429 ] + - [ -170.8572, 0.27841, 0.04114, 0.36571 ] + - [ -168.5716, 0.34801, 0.04638, 0.40308 ] + - [ -166.2857, 0.41761, 0.05732, 0.40801 ] + - [ -164.0000, 0.48721, 0.08319, 0.41294 ] + - [ -161.7145, 0.55681, 0.11258, 0.41788 ] + - [ -159.4284, 0.62641, 0.14533, 0.42586 ] + - [ -157.1428, 0.69601, 0.18121, 0.44302 ] + - [ -154.8573, 0.76562, 0.22000, 0.46017 ] + - [ -152.5714, 0.83522, 0.26146, 0.47732 ] + - [ -150.2857, 0.90482, 0.30532, 0.49447 ] + - [ -148.0000, 0.97442, 0.35131, 0.48743 ] + - [ -143.8571, 0.89412, 0.43913, 0.46839 ] + - [ -139.7143, 0.82382, 0.53115, 0.44996 ] + - [ -135.5714, 0.75845, 0.62546, 0.43985 ] + - [ -131.4286, 0.69477, 0.72010, 0.42974 ] + - [ -127.2857, 0.63079, 0.81310, 0.42589 ] + - [ -123.1429, 0.56532, 0.90255, 0.42535 ] + - [ -119.0000, 0.49783, 0.98659, 0.42528 ] + - [ -114.8571, 0.42823, 1.06348, 0.42673 ] + - [ -110.7143, 0.35680, 1.13162, 0.42817 ] + - [ -106.5714, 0.28412, 1.18963, 0.42745 ] + - [ -102.4286, 0.21103, 1.23629, 0.42628 ] + - [ -98.2857, 0.13851, 1.27067, 0.42303 ] + - [ -94.1429, 0.06775, 1.29204, 0.41683 ] + - [ -90.0000, 0.00000, 1.30000, 0.41063 ] + - [ -85.8571, -0.06775, 1.29204, 0.39752 ] + - [ -81.7143, -0.13851, 1.27067, 0.38441 ] + - [ -77.5714, -0.21103, 1.23629, 0.36905 ] + - [ -73.4286, -0.28412, 1.18963, 0.35212 ] + - [ -69.2857, -0.35680, 1.13162, 0.33491 ] + - [ -65.1429, -0.42823, 1.06348, 0.31634 ] + - [ -61.0000, -0.49783, 0.98659, 0.29777 ] + - [ -56.8571, -0.56532, 0.90255, 0.27947 ] + - [ -52.7143, -0.63079, 0.81310, 0.26125 ] + - [ -48.5714, -0.69477, 0.72010, 0.24322 ] + - [ -44.4286, -0.75845, 0.62546, 0.22556 ] + - [ -40.2857, -0.82382, 0.53115, 0.20789 ] + - [ -36.1429, -0.89412, 0.43913, 0.13731 ] + - [ -32.0000, -0.97442, 0.35131, 0.06280 ] + - [ -28.0000, -1.16308, 0.20648, 0.03905 ] + - [ -24.0000, -1.14892, 0.15001, 0.01853 ] + - [ -20.0000, -1.09451, 0.10600, 0.00441 ] + - [ -18.0000, -1.05801, 0.08732, -0.00061 ] + - [ -16.0000, -1.02281, 0.07051, -0.00342 ] + - [ -14.0000, -0.99810, 0.05474, -0.00401 ] + - [ -12.0000, -0.98515, 0.04052, -0.00272 ] + - [ -10.0000, -0.89583, 0.02929, -0.01198 ] + - [ -8.0000, -0.67539, 0.02207, -0.03458 ] + - [ -6.0000, -0.43247, 0.01735, -0.05466 ] + - [ -4.0000, -0.15881, 0.01473, -0.07425 ] + - [ -2.0000, 0.13456, 0.01362, -0.09270 ] + - [ -1.0000, 0.28014, 0.01339, -0.10074 ] + - [ 0.0000, 0.42386, 0.01330, -0.10802 ] + - [ 1.0000, 0.56519, 0.01333, -0.11450 ] + - [ 2.0000, 0.70410, 0.01345, -0.12028 ] + - [ 3.0000, 0.84071, 0.01366, -0.12546 ] + - [ 4.0000, 0.97500, 0.01397, -0.13011 ] + - [ 5.0000, 1.10680, 0.01437, -0.13425 ] + - [ 6.0000, 1.23603, 0.01486, -0.13793 ] + - [ 7.0000, 1.36223, 0.01547, -0.14108 ] + - [ 8.0000, 1.48424, 0.01623, -0.14363 ] + - [ 9.0000, 1.60097, 0.01718, -0.14545 ] + - [ 10.0000, 1.71010, 0.01841, -0.14636 ] + - [ 11.0000, 1.80957, 0.02010, -0.14635 ] + - [ 12.0000, 1.89473, 0.02258, -0.14544 ] + - [ 13.0000, 1.95698, 0.02671, -0.14378 ] + - [ 14.0000, 1.98576, 0.03380, -0.14185 ] + - [ 15.0000, 1.99260, 0.04333, -0.14004 ] + - [ 16.0000, 1.99617, 0.05354, -0.13823 ] + - [ 18.0000, 1.96398, 0.07706, -0.13351 ] + - [ 20.0000, 1.81179, 0.11169, -0.13135 ] + - [ 24.0000, 1.56073, 0.19103, -0.14660 ] + - [ 28.0000, 1.46798, 0.27199, -0.17242 ] + - [ 32.0000, 1.39203, 0.35131, -0.19417 ] + - [ 36.1429, 1.27731, 0.43913, -0.21792 ] + - [ 40.2857, 1.17689, 0.53115, -0.24115 ] + - [ 44.4286, 1.08350, 0.62546, -0.25734 ] + - [ 48.5714, 0.99253, 0.72010, -0.27354 ] + - [ 52.7143, 0.90112, 0.81310, -0.28862 ] + - [ 56.8571, 0.80760, 0.90255, -0.30311 ] + - [ 61.0000, 0.71119, 0.98659, -0.31757 ] + - [ 65.1429, 0.61175, 1.06348, -0.33194 ] + - [ 69.2857, 0.50971, 1.13162, -0.34631 ] + - [ 73.4286, 0.40589, 1.18963, -0.36014 ] + - [ 77.5714, 0.30146, 1.23629, -0.37385 ] + - [ 81.7143, 0.19788, 1.27067, -0.38681 ] + - [ 85.8571, 0.09679, 1.29204, -0.39872 ] + - [ 90.0000, 0.00000, 1.30000, -0.41063 ] + - [ 94.1429, -0.06775, 1.29204, -0.41683 ] + - [ 98.2857, -0.13851, 1.27067, -0.42303 ] + - [ 102.4286, -0.21103, 1.23629, -0.42628 ] + - [ 106.5714, -0.28412, 1.18963, -0.42745 ] + - [ 110.7143, -0.35680, 1.13162, -0.42817 ] + - [ 114.8571, -0.42823, 1.06348, -0.42673 ] + - [ 119.0000, -0.49783, 0.98659, -0.42528 ] + - [ 123.1429, -0.56532, 0.90255, -0.42535 ] + - [ 127.2857, -0.63079, 0.81310, -0.42589 ] + - [ 131.4286, -0.69477, 0.72010, -0.42974 ] + - [ 135.5714, -0.75845, 0.62546, -0.43985 ] + - [ 139.7143, -0.82382, 0.53115, -0.44996 ] + - [ 143.8571, -0.89412, 0.43913, -0.46839 ] + - [ 148.0000, -0.97442, 0.35131, -0.48743 ] + - [ 150.2857, -0.90482, 0.30532, -0.49447 ] + - [ 152.5714, -0.83522, 0.26146, -0.47732 ] + - [ 154.8571, -0.76562, 0.22000, -0.46017 ] + - [ 157.1429, -0.69601, 0.18121, -0.44302 ] + - [ 159.4286, -0.62641, 0.14533, -0.42586 ] + - [ 161.7143, -0.55681, 0.11258, -0.43502 ] + - [ 164.0000, -0.48721, 0.08319, -0.45294 ] + - [ 166.2857, -0.41761, 0.05732, -0.47087 ] + - [ 168.5714, -0.34801, 0.04638, -0.48880 ] + - [ 170.8571, -0.27841, 0.04114, -0.45714 ] + - [ 173.1429, -0.20880, 0.03702, -0.34286 ] + - [ 175.4286, -0.13920, 0.03406, -0.22857 ] + - [ 177.7143, -0.06960, 0.03228, -0.11429 ] + - [ 179.9087, 0.00000, 0.03169, 0.00000 ] + - name : FFA-W3-360 # + relative_thickness : 0.36 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.03715, 0.00000 ] + - [ -177.7143, 0.07178, 0.03774, 0.09143 ] + - [ -175.4286, 0.14356, 0.03951, 0.18286 ] + - [ -173.1429, 0.21534, 0.04245, 0.27429 ] + - [ -170.8572, 0.28713, 0.04653, 0.36571 ] + - [ -168.5716, 0.35891, 0.05174, 0.40313 ] + - [ -166.2857, 0.43069, 0.06068, 0.40814 ] + - [ -164.0000, 0.50247, 0.08651, 0.41315 ] + - [ -161.7145, 0.57425, 0.11586, 0.41816 ] + - [ -159.4284, 0.64603, 0.14856, 0.42627 ] + - [ -157.1428, 0.71781, 0.18439, 0.44370 ] + - [ -154.8573, 0.78960, 0.22313, 0.46114 ] + - [ -152.5714, 0.86138, 0.26453, 0.47857 ] + - [ -150.2857, 0.93316, 0.30832, 0.49600 ] + - [ -148.0000, 1.00494, 0.35424, 0.48830 ] + - [ -143.8571, 0.91898, 0.44192, 0.46784 ] + - [ -139.7143, 0.84406, 0.53379, 0.44803 ] + - [ -135.5714, 0.77483, 0.62793, 0.43697 ] + - [ -131.4286, 0.70790, 0.72238, 0.42591 ] + - [ -127.2857, 0.64116, 0.81520, 0.42150 ] + - [ -123.1429, 0.57335, 0.90444, 0.42058 ] + - [ -119.0000, 0.50388, 0.98826, 0.42024 ] + - [ -114.8571, 0.43261, 1.06493, 0.42168 ] + - [ -110.7143, 0.35981, 1.13285, 0.42312 ] + - [ -106.5714, 0.28603, 1.19061, 0.42258 ] + - [ -102.4286, 0.21209, 1.23704, 0.42163 ] + - [ -98.2857, 0.13899, 1.27116, 0.41864 ] + - [ -94.1429, 0.06787, 1.29229, 0.41277 ] + - [ -90.0000, 0.00000, 1.30000, 0.40690 ] + - [ -85.8571, -0.06787, 1.29229, 0.39426 ] + - [ -81.7143, -0.13899, 1.27116, 0.38162 ] + - [ -77.5714, -0.21209, 1.23704, 0.36676 ] + - [ -73.4286, -0.28603, 1.19061, 0.35033 ] + - [ -69.2857, -0.35981, 1.13285, 0.33362 ] + - [ -65.1429, -0.43261, 1.06493, 0.31561 ] + - [ -61.0000, -0.50388, 0.98826, 0.29759 ] + - [ -56.8571, -0.57335, 0.90444, 0.27989 ] + - [ -52.7143, -0.64116, 0.81520, 0.26230 ] + - [ -48.5714, -0.70790, 0.72238, 0.24491 ] + - [ -44.4286, -0.77483, 0.62793, 0.22794 ] + - [ -40.2857, -0.84406, 0.53379, 0.21097 ] + - [ -36.1429, -0.91898, 0.44192, 0.13525 ] + - [ -32.0000, -1.00494, 0.35424, 0.05517 ] + - [ -28.0000, -1.11306, 0.20494, 0.03211 ] + - [ -24.0000, -1.05425, 0.15434, 0.01268 ] + - [ -20.0000, -0.98247, 0.10967, -0.00282 ] + - [ -18.0000, -0.94173, 0.09249, -0.00741 ] + - [ -16.0000, -0.89333, 0.07597, -0.01107 ] + - [ -14.0000, -0.85472, 0.06054, -0.01250 ] + - [ -12.0000, -0.82348, 0.04641, -0.01177 ] + - [ -10.0000, -0.79541, 0.03441, -0.01082 ] + - [ -8.0000, -0.63650, 0.02548, -0.02769 ] + - [ -6.0000, -0.39095, 0.01994, -0.05107 ] + - [ -4.0000, -0.13071, 0.01653, -0.07148 ] + - [ -2.0000, 0.16173, 0.01507, -0.09179 ] + - [ -1.0000, 0.31121, 0.01477, -0.10119 ] + - [ 0.0000, 0.45956, 0.01465, -0.10988 ] + - [ 1.0000, 0.60566, 0.01466, -0.11776 ] + - [ 2.0000, 0.74868, 0.01481, -0.12477 ] + - [ 3.0000, 0.88862, 0.01507, -0.13098 ] + - [ 4.0000, 1.02544, 0.01544, -0.13648 ] + - [ 5.0000, 1.15878, 0.01593, -0.14130 ] + - [ 6.0000, 1.28822, 0.01654, -0.14540 ] + - [ 7.0000, 1.41282, 0.01731, -0.14875 ] + - [ 8.0000, 1.53090, 0.01831, -0.15118 ] + - [ 9.0000, 1.64065, 0.01963, -0.15262 ] + - [ 10.0000, 1.73926, 0.02150, -0.15310 ] + - [ 11.0000, 1.81971, 0.02445, -0.15254 ] + - [ 12.0000, 1.87065, 0.02966, -0.15121 ] + - [ 13.0000, 1.89221, 0.03770, -0.14969 ] + - [ 14.0000, 1.87910, 0.04824, -0.14562 ] + - [ 15.0000, 1.88111, 0.05838, -0.14358 ] + - [ 16.0000, 1.86359, 0.06992, -0.14095 ] + - [ 18.0000, 1.73324, 0.10166, -0.13711 ] + - [ 20.0000, 1.59357, 0.13916, -0.14082 ] + - [ 24.0000, 1.46708, 0.21002, -0.15693 ] + - [ 28.0000, 1.44834, 0.28200, -0.17979 ] + - [ 32.0000, 1.43563, 0.35424, -0.20147 ] + - [ 36.1429, 1.31283, 0.44192, -0.22409 ] + - [ 40.2857, 1.20580, 0.53379, -0.24619 ] + - [ 44.4286, 1.10690, 0.62793, -0.26133 ] + - [ 48.5714, 1.01129, 0.72238, -0.27648 ] + - [ 52.7143, 0.91594, 0.81520, -0.29062 ] + - [ 56.8571, 0.81907, 0.90444, -0.30424 ] + - [ 61.0000, 0.71982, 0.98826, -0.31787 ] + - [ 65.1429, 0.61801, 1.06493, -0.33154 ] + - [ 69.2857, 0.51401, 1.13285, -0.34522 ] + - [ 73.4286, 0.40862, 1.19061, -0.35846 ] + - [ 77.5714, 0.30299, 1.23704, -0.37161 ] + - [ 81.7143, 0.19855, 1.27116, -0.38405 ] + - [ 85.8571, 0.09695, 1.29229, -0.39547 ] + - [ 90.0000, 0.00000, 1.30000, -0.40690 ] + - [ 94.1429, -0.06787, 1.29229, -0.41277 ] + - [ 98.2857, -0.13899, 1.27116, -0.41864 ] + - [ 102.4286, -0.21209, 1.23704, -0.42163 ] + - [ 106.5714, -0.28603, 1.19061, -0.42258 ] + - [ 110.7143, -0.35981, 1.13285, -0.42312 ] + - [ 114.8571, -0.43261, 1.06493, -0.42168 ] + - [ 119.0000, -0.50388, 0.98826, -0.42024 ] + - [ 123.1429, -0.57335, 0.90444, -0.42058 ] + - [ 127.2857, -0.64116, 0.81520, -0.42150 ] + - [ 131.4286, -0.70790, 0.72238, -0.42591 ] + - [ 135.5714, -0.77483, 0.62793, -0.43697 ] + - [ 139.7143, -0.84406, 0.53379, -0.44803 ] + - [ 143.8571, -0.91898, 0.44192, -0.46784 ] + - [ 148.0000, -1.00494, 0.35424, -0.48830 ] + - [ 150.2857, -0.93316, 0.30832, -0.49600 ] + - [ 152.5714, -0.86138, 0.26453, -0.47857 ] + - [ 154.8571, -0.78960, 0.22313, -0.46114 ] + - [ 157.1429, -0.71781, 0.18439, -0.44370 ] + - [ 159.4286, -0.64603, 0.14856, -0.42627 ] + - [ 161.7143, -0.57425, 0.11586, -0.43530 ] + - [ 164.0000, -0.50247, 0.08651, -0.45315 ] + - [ 166.2857, -0.43069, 0.06068, -0.47100 ] + - [ 168.5714, -0.35891, 0.05174, -0.48884 ] + - [ 170.8571, -0.28713, 0.04653, -0.45714 ] + - [ 173.1429, -0.21534, 0.04245, -0.34286 ] + - [ 175.4286, -0.14356, 0.03951, -0.22857 ] + - [ 177.7143, -0.07178, 0.03774, -0.11429 ] + - [ 179.9087, 0.00000, 0.03715, 0.00000 ] + + + + pitch_control: + GS_Angles: [0.06019804, 0.08713416, 0.10844806, 0.12685912, 0.14339822, 0.1586021 , 0.17279614, 0.18618935, 0.19892772, 0.21111989, 0.22285021, 0.23417256, 0.2451469 , 0.25580691, 0.26619545, 0.27632495, 0.28623134, 0.29593266, 0.30544521, 0.314779 , 0.32395154, 0.33297489, 0.3418577 , 0.35060844, 0.35923641, 0.36774807, 0.37614942, 0.38444655, 0.39264363, 0.40074407] + GS_Kp: [-0.9394215 , -0.80602855, -0.69555026, -0.60254912, -0.52318192, -0.45465531, -0.39489024, -0.34230736, -0.29568537, -0.25406506, -0.2166825 , -0.18292183, -0.15228099, -0.12434663, -0.09877533, -0.0752794 , -0.05361604, -0.0335789 , -0.01499149, 0.00229803, 0.01842102, 0.03349169, 0.0476098 , 0.0608629 , 0.07332812, 0.0850737 , 0.0961602 , 0.10664158, 0.11656607, 0.12597691] + GS_Ki: [-0.07416547, -0.06719673, -0.0614251 , -0.05656651, -0.0524202 , -0.04884022, -0.04571796, -0.04297091, -0.04053528, -0.03836094, -0.03640799, -0.03464426, -0.03304352, -0.03158417, -0.03024826, -0.02902079, -0.02788904, -0.02684226, -0.02587121, -0.02496797, -0.02412567, -0.02333834, -0.02260078, -0.02190841, -0.0212572 , -0.02064359, -0.0200644 , -0.01951683, -0.01899836, -0.01850671] + Fl_Kp: -9.35 + wt_ops: # operating points: wind speed [m/s], blade pitch [deg], rotor speed [rpm] + v: [3.0, 3.266896551724138, 3.533793103448276, 3.800689655172414, 4.067586206896552, 4.334482758620689, 4.601379310344828, 4.868275862068966, 5.135172413793104, 5.402068965517241, 5.6689655172413795, 5.935862068965518, 6.2027586206896554, 6.469655172413793, 6.736551724137931, 7.00344827586207, 7.270344827586207, 7.537241379310345, 7.804137931034483, 8.071034482758622, 8.337931034482759, 8.604827586206897, 8.871724137931036, 9.138620689655173, 9.405517241379311, 9.672413793103448, 9.939310344827586, 10.206206896551725, 10.473103448275863, 10.74, 11.231724137931035, 11.723448275862069, 12.215172413793104, 12.706896551724139, 13.198620689655172, 13.690344827586207, 14.182068965517242, 14.673793103448276, 15.16551724137931, 15.657241379310346, 16.14896551724138, 16.640689655172416, 17.13241379310345, 17.624137931034483, 18.11586206896552, 18.607586206896553, 19.099310344827586, 19.591034482758623, 20.082758620689653, 20.57448275862069, 21.066206896551726, 21.557931034482756, 22.049655172413793, 22.54137931034483, 23.03310344827586, 23.524827586206897, 24.016551724137933, 24.508275862068963, 25.0] + #pitch_op: [-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, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, 3.57152, 5.12896, 6.36736, 7.43866, 8.40197, 9.28843, 10.1161, 10.8974, 11.641, 12.3529, 13.038, 13.6997, 14.3409, 14.9642, 15.5713, 16.1639, 16.7435, 17.3109, 17.8673, 18.4136, 18.9506, 19.4788, 19.9989, 20.5112, 21.0164, 21.5147, 22.0067, 22.4925, 22.9724] # original + pitch_op: [3.44, 3.44, 3.44, 3.44, 3.44, 3.44, 3.19, 2.94, 2.65, 2.32, 1.97, 1.59, 1.19, 0.79, 0.38, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.46, 1.27, 1.99, 2.61, 3.05, 3.69, 5.13, 6.37, 7.44, 8.40, 9.29, 10.12, 10.90, 11.64, 12.35, 13.04, 13.70, 14.34, 14.96, 15.57, 16.16, 16.74, 17.31, 17.87, 18.41, 18.95, 19.48, 20.00, 20.51, 21.02, 21.51, 22.01, 22.49, 22.97] # updated with min pitch to achieve peak thrust shaving + omega_op: [2.1486, 2.3397, 2.5309, 2.722, 2.9132, 3.1043, 3.2955, 3.4866, 3.6778, 3.8689, 4.0601, 4.2512, 4.4424, 4.6335, 4.8247, 5.0159, 5.207, 5.3982, 5.5893, 5.7805, 5.9716, 6.1628, 6.3539, 6.5451, 6.7362, 6.9274, 7.1185, 7.3097, 7.5008, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56] + gear_ratio: 1 + torque_control: + VS_KP: -38609162.66552 + VS_KI: -4588245.18720 + + + tower: # (could remove some entries that don't apply for the tower) + dlsMax : 5.0 # maximum node splitting section amount; can't be 0 + + name : tower # [-] an identifier (no longer has to be number) + type : rigid # [-] + rA : [ 0, 0, 15] # [m] end A coordinates + rB : [ 0, 0, 144.582] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + + # --- outer shell including hydro--- + stations : [ 15, 28, 28.001, 41, 41.001, 54, 54.001, 67, 67.001, 80, 80.001, 93, 93.001, 106, 106.001, 119, 119.001, 132, 132.001, 144.582 ] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : [ 10, 9.964, 9.964, 9.967, 9.967, 9.927, 9.927, 9.528, 9.528, 9.149, 9.149, 8.945, 8.945, 8.735, 8.735, 8.405, 8.405, 7.321, 7.321, 6.5 ] # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : [ 0.082954, 0.082954, 0.083073, 0.083073, 0.082799, 0.082799, 0.0299, 0.0299, 0.027842, 0.027842, 0.025567, 0.025567, 0.022854, 0.022854, 0.02025, 0.02025, 0.018339, 0.018339, 0.021211, 0.021211 ] # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 0.0 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 0.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + # (neglecting axial coefficients for now) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] material density + + +platform: + + potModMaster : 1 # [int] master switch for potMod variables; 0=keeps all member potMod vars the same, 1=turns all potMod vars to False (no HAMS), 2=turns all potMod vars to True (no strip) + dlsMax : 5.0 # maximum node splitting section amount for platform members; can't be 0 + + members: # list all members here + + - name : center_column # [-] an identifier (no longer has to be number) + type : rigid # [-] + rA : [ 0, 0, -20] # [m] end A coordinates + rB : [ 0, 0, 15] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + # --- outer shell including hydro--- + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 10.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 0.6 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 0.93 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.6 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 1.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + # --- handling of end caps or any internal structures if we need them --- + cap_stations : [ 0 ] # [m] location along member of any inner structures (in same scaling as set by 'stations') + cap_t : [ 0.001 ] # [m] thickness of any internal structures + cap_d_in : [ 0 ] # [m] inner diameter of internal structures (0 for full cap/bulkhead, >0 for a ring shape) + + + - name : outer_column # [-] an identifier (no longer has to be number) + type : rigid # [-] + rA : [51.75, 0, -20] # [m] end A coordinates + rB : [51.75, 0, 15] # [m] and B coordinates + heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + # --- outer shell including hydro--- + stations : [0, 35] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 12.5 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 0.6 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 0.93 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 1.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.7 # value of 3.0 gives more heave response # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + # --- ballast --- + l_fill : 1.4 # [m] + rho_fill : 5000 # [kg/m3] + # --- handling of end caps or any internal structures if we need them --- + cap_stations : [ 0 ] # [m] location along member of any inner structures (in same scaling as set by 'stations') + cap_t : [ 0.001 ] # [m] thickness of any internal structures + cap_d_in : [ 0 ] # [m] inner diameter of internal structures (0 for full cap/bulkhead, >0 for a ring shape) + + + - name : pontoon # [-] an identifier (no longer has to be number) + type : rigid # [-] + rA : [ 5 , 0, -16.5] # [m] end A coordinates + rB : [ 45.5, 0, -16.5] # [m] and B coordinates + heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) + shape : rect # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : False # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + # --- outer shell including hydro--- + stations : [0, 40.5] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : [12.4, 7.0] # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : [1.5, 2.2 ] # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : [2.2, 0.2 ] # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + l_fill : 40.5 # [m] + rho_fill : 1025.0 # [kg/m3] + + + - name : upper_support # [-] an identifier (no longer has to be number) + type : rigid # [-] + rA : [ 5 , 0, 14.545] # [m] end A coordinates + rB : [ 45.5, 0, 14.545] # [m] and B coordinates + heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : False # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + # --- outer shell including hydro--- + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 0.91 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.01 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 0.0 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 0.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + +mooring: + water_depth: 200 # [m] uniform water depth + \ No newline at end of file diff --git a/tests/test_data/VolturnUS-S_farm-moorMod1_true_analyzeCases.pkl b/tests/test_data/VolturnUS-S_farm-moorMod1_true_analyzeCases.pkl new file mode 100644 index 00000000..1163815e Binary files /dev/null and b/tests/test_data/VolturnUS-S_farm-moorMod1_true_analyzeCases.pkl differ diff --git a/tests/test_data/VolturnUS-S_farm.yaml b/tests/test_data/VolturnUS-S_farm.yaml index f1b75736..d39e026e 100644 --- a/tests/test_data/VolturnUS-S_farm.yaml +++ b/tests/test_data/VolturnUS-S_farm.yaml @@ -4,8 +4,8 @@ comments: Used to perform tests on model class functionality. settings: # global Settings - min_freq : 0.001 # [Hz] lowest frequency to consider, also the frequency bin width - max_freq : 0.24 # [Hz] highest frequency to consider + min_freq : 0.0025 # [Hz] lowest frequency to consider, also the frequency bin width + max_freq : 0.200 # [Hz] highest frequency to consider XiStart : 0 # sets initial amplitude of each DOF for all frequencies nIter : 10 # sets how many iterations to perform in Model.solveDynamics() @@ -1077,7 +1077,7 @@ turbine: dlsMax : 5.0 # maximum node splitting section amount; can't be 0 name : tower # [-] an identifier (no longer has to be number) - type : 1 # [-] + type : rigid # [-] rA : [ 0, 0, 15] # [m] end A coordinates rB : [ 0, 0, 144.582] # [m] and B coordinates shape : circ # [-] circular or rectangular @@ -1103,7 +1103,7 @@ platform: members: # list all members here - name : center_column # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [ 0, 0, -20] # [m] end A coordinates rB : [ 0, 0, 15] # [m] and B coordinates shape : circ # [-] circular or rectangular @@ -1125,7 +1125,7 @@ platform: - name : outer_column # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [51.75, 0, -20] # [m] end A coordinates rB : [51.75, 0, 15] # [m] and B coordinates heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) @@ -1151,7 +1151,7 @@ platform: - name : pontoon # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [ 5 , 0, -16.5] # [m] end A coordinates rB : [ 45.5, 0, -16.5] # [m] and B coordinates heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) @@ -1172,7 +1172,7 @@ platform: - name : upper_support # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] rA : [ 5 , 0, 14.545] # [m] end A coordinates rB : [ 45.5, 0, 14.545] # [m] and B coordinates heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) diff --git a/tests/test_data/VolturnUS-S_farm_true_analyzeCases.pkl b/tests/test_data/VolturnUS-S_farm_true_analyzeCases.pkl index 91b1ddfb..c2727678 100644 Binary files a/tests/test_data/VolturnUS-S_farm_true_analyzeCases.pkl and b/tests/test_data/VolturnUS-S_farm_true_analyzeCases.pkl differ diff --git a/tests/test_data/VolturnUS-S_true_analyzeCases.pkl b/tests/test_data/VolturnUS-S_true_analyzeCases.pkl index c44f04c2..d5387fb0 100644 Binary files a/tests/test_data/VolturnUS-S_true_analyzeCases.pkl and b/tests/test_data/VolturnUS-S_true_analyzeCases.pkl differ diff --git a/tests/test_data/VolturnUS-S_true_calcCurrentLoads.pkl b/tests/test_data/VolturnUS-S_true_calcCurrentLoads.pkl new file mode 100644 index 00000000..93a50b16 Binary files /dev/null and b/tests/test_data/VolturnUS-S_true_calcCurrentLoads.pkl differ diff --git a/tests/test_data/VolturnUS-S_true_calcQTF_slenderBody.pkl b/tests/test_data/VolturnUS-S_true_calcQTF_slenderBody.pkl index 98e9d9b2..c4030da2 100644 Binary files a/tests/test_data/VolturnUS-S_true_calcQTF_slenderBody.pkl and b/tests/test_data/VolturnUS-S_true_calcQTF_slenderBody.pkl differ diff --git a/tests/test_data/VolturnUS-S_true_hydroConstants.pkl b/tests/test_data/VolturnUS-S_true_hydroConstants.pkl new file mode 100644 index 00000000..1318d443 Binary files /dev/null and b/tests/test_data/VolturnUS-S_true_hydroConstants.pkl differ diff --git a/tests/test_data/VolturnUS-S_true_hydroExcitation.pkl b/tests/test_data/VolturnUS-S_true_hydroExcitation.pkl index ec78d66e..58766fd4 100644 Binary files a/tests/test_data/VolturnUS-S_true_hydroExcitation.pkl and b/tests/test_data/VolturnUS-S_true_hydroExcitation.pkl differ diff --git a/tests/test_data/VolturnUS-S_true_hydroLinearization.pkl b/tests/test_data/VolturnUS-S_true_hydroLinearization.pkl index fcc228c4..61f40a5a 100644 Binary files a/tests/test_data/VolturnUS-S_true_hydroLinearization.pkl and b/tests/test_data/VolturnUS-S_true_hydroLinearization.pkl differ diff --git a/tests/test_data/VolturnUS-S_true_statics.pkl b/tests/test_data/VolturnUS-S_true_statics.pkl new file mode 100644 index 00000000..786c2641 Binary files /dev/null and b/tests/test_data/VolturnUS-S_true_statics.pkl differ diff --git a/tests/test_data/mem_circular_beam.yaml b/tests/test_data/mem_circular_beam.yaml new file mode 100644 index 00000000..502a56c9 --- /dev/null +++ b/tests/test_data/mem_circular_beam.yaml @@ -0,0 +1,26 @@ +type: input file for RAFT +name: Horizontal underwater circular beam +comments: Used to perform some tests on member class functionality. This file should contain a single RAFT member. + + +members: # list all members here + + - name : beam + dlsMax : 40 # very coarse discretization just for testing a beam member + type : beam + potMod : False + shape : circ + rA : [ 0.000, 0.000, -20] + rB : [ 40.000, 0.000, -20] + stations : [0, 1] + d : 2 + t : 0.01 + E : 210e9 + G : 80e9 + Cd : 0.6 + Ca : 0.85 + CdEnd : 0.6 + CaEnd : 0.7 + # not defining rho_shell to flag changes in default values + + diff --git a/tests/test_data/mem_rectangular_beam.yaml b/tests/test_data/mem_rectangular_beam.yaml new file mode 100644 index 00000000..dc6f1bd0 --- /dev/null +++ b/tests/test_data/mem_rectangular_beam.yaml @@ -0,0 +1,26 @@ +type: input file for RAFT +name: Horizontal underwater rectangular beam +comments: Used to perform some tests on member class functionality. This file should contain a single RAFT member. + + +members: # list all members here + + - name : beam + dlsMax : 40 # very coarse discretization just for testing a beam member + type : beam + potMod : False + shape : rect + rA : [ 0.000, 0.000, -20] + rB : [ 40.000, 0.000, -20] + stations : [0, 1] + d : [4, 1.0] + t : 0.01 + E : 210e9 + G : 80e9 + Cd : 0.6 + Ca : 0.85 + CdEnd : 0.6 + CaEnd : 0.7 + # not defining rho_shell to flag changes in default values + + diff --git a/tests/test_data/mem_srf_inc_circ_cyl.yaml b/tests/test_data/mem_srf_inc_circ_cyl.yaml index 5057ab77..c3e5f24c 100644 --- a/tests/test_data/mem_srf_inc_circ_cyl.yaml +++ b/tests/test_data/mem_srf_inc_circ_cyl.yaml @@ -5,7 +5,7 @@ comments: Used to perform some tests on member class functionality. This file sh members: # list all members here - name : cylinder # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] dlsMax : 0.1 # maximum node splitting section amount for platform members; can't be 0 rA : [-12.500, 4.3301, -15.00] # [m] end A coordinates rB : [ 9.375, -3.2476, 11.25] # [m] and B coordinates diff --git a/tests/test_data/mem_srf_inc_rect_cyl.yaml b/tests/test_data/mem_srf_inc_rect_cyl.yaml index 99542669..23fe0084 100644 --- a/tests/test_data/mem_srf_inc_rect_cyl.yaml +++ b/tests/test_data/mem_srf_inc_rect_cyl.yaml @@ -5,7 +5,7 @@ comments: Used to perform some tests on member class functionality. This file sh members: # list all members here - name : cylinder # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] dlsMax : 0.1 # maximum node splitting section amount for platform members; can't be 0 rA : [-12.500, 4.3301, -15.00] # [m] end A coordinates rB : [ 9.375, -3.2476, 11.25] # [m] and B coordinates diff --git a/tests/test_data/mem_srf_pitch_circ_cyl.yaml b/tests/test_data/mem_srf_pitch_circ_cyl.yaml index 22c5df1e..a968b733 100644 --- a/tests/test_data/mem_srf_pitch_circ_cyl.yaml +++ b/tests/test_data/mem_srf_pitch_circ_cyl.yaml @@ -5,7 +5,7 @@ comments: Used to perform some tests on member class functionality. This file sh members: # list all members here - name : cylinder # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] dlsMax : 0.1 # maximum node splitting section amount for platform members; can't be 0 rA : [-10.0, 0, -17.321] # [m] end A coordinates rB : [ 7.5, 0, 12.990] # [m] and B coordinates diff --git a/tests/test_data/mem_srf_pitch_rect_cyl.yaml b/tests/test_data/mem_srf_pitch_rect_cyl.yaml index 257fdeec..95a28199 100644 --- a/tests/test_data/mem_srf_pitch_rect_cyl.yaml +++ b/tests/test_data/mem_srf_pitch_rect_cyl.yaml @@ -5,7 +5,7 @@ comments: Used to perform some tests on member class functionality. This file sh members: # list all members here - name : cylinder # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] dlsMax : 0.1 # maximum node splitting section amount for platform members; can't be 0 rA : [-10.0, 0, -17.321] # [m] end A coordinates rB : [ 7.5, 0, 12.990] # [m] and B coordinates diff --git a/tests/test_data/mem_srf_vert_circ_cyl.yaml b/tests/test_data/mem_srf_vert_circ_cyl.yaml index 065d3cf8..bf40f3a1 100644 --- a/tests/test_data/mem_srf_vert_circ_cyl.yaml +++ b/tests/test_data/mem_srf_vert_circ_cyl.yaml @@ -5,7 +5,7 @@ comments: Used to perform some tests on member class functionality. This file sh members: # list all members here - name : cylinder # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] dlsMax : 0.1 # maximum node splitting section amount for platform members; can't be 0 rA : [ 0, 0, -20] # [m] end A coordinates rB : [ 0, 0, 15] # [m] and B coordinates diff --git a/tests/test_data/mem_srf_vert_rect_cyl.yaml b/tests/test_data/mem_srf_vert_rect_cyl.yaml index db8c1c2a..6dc04a62 100644 --- a/tests/test_data/mem_srf_vert_rect_cyl.yaml +++ b/tests/test_data/mem_srf_vert_rect_cyl.yaml @@ -5,7 +5,7 @@ comments: Used to perform some tests on member class functionality. This file sh members: # list all members here - name : cylinder # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] dlsMax : 0.1 # maximum node splitting section amount for platform members; can't be 0 rA : [ 0, 0, -20] # [m] end A coordinates rB : [ 0, 0, 15] # [m] and B coordinates diff --git a/tests/test_data/mem_srf_vert_tap_circ_cyl.yaml b/tests/test_data/mem_srf_vert_tap_circ_cyl.yaml index c4133351..503515e3 100644 --- a/tests/test_data/mem_srf_vert_tap_circ_cyl.yaml +++ b/tests/test_data/mem_srf_vert_tap_circ_cyl.yaml @@ -5,7 +5,7 @@ comments: Used to perform some tests on member class functionality. This file sh members: # list all members here - name : cylinder # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] dlsMax : 0.1 # maximum node splitting section amount for platform members; can't be 0 rA : [ 0, 0, -20] # [m] end A coordinates rB : [ 0, 0, 15] # [m] and B coordinates diff --git a/tests/test_data/mem_srf_vert_tap_rect_cyl.yaml b/tests/test_data/mem_srf_vert_tap_rect_cyl.yaml index da4668a8..2e34ff8c 100644 --- a/tests/test_data/mem_srf_vert_tap_rect_cyl.yaml +++ b/tests/test_data/mem_srf_vert_tap_rect_cyl.yaml @@ -5,7 +5,7 @@ comments: Used to perform some tests on member class functionality. This file sh members: # list all members here - name : cylinder # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] dlsMax : 0.1 # maximum node splitting section amount for platform members; can't be 0 rA : [ 0, 0, -20] # [m] end A coordinates rB : [ 0, 0, 15] # [m] and B coordinates diff --git a/tests/test_data/mem_subm_horz_circ_cyl.yaml b/tests/test_data/mem_subm_horz_circ_cyl.yaml index f46faf71..0dac4efd 100644 --- a/tests/test_data/mem_subm_horz_circ_cyl.yaml +++ b/tests/test_data/mem_subm_horz_circ_cyl.yaml @@ -5,7 +5,7 @@ comments: Used to perform some tests on member class functionality. This file sh members: # list all members here - name : cylinder # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] dlsMax : 0.1 # maximum node splitting section amount for platform members; can't be 0 rA : [-17.5, 0, -20.0] # [m] end A coordinates rB : [ 17.5, 0, -20.0] # [m] and B coordinates diff --git a/tests/test_data/mem_subm_horz_rect_cyl.yaml b/tests/test_data/mem_subm_horz_rect_cyl.yaml index 1aa44e22..98e140fa 100644 --- a/tests/test_data/mem_subm_horz_rect_cyl.yaml +++ b/tests/test_data/mem_subm_horz_rect_cyl.yaml @@ -5,7 +5,7 @@ comments: Used to perform some tests on member class functionality. This file sh members: # list all members here - name : cylinder # [-] an identifier (no longer has to be number) - type : 2 # [-] + type : rigid # [-] dlsMax : 0.1 # maximum node splitting section amount for platform members; can't be 0 rA : [-17.5, 0, -20] # [m] end A coordinates rB : [ 17.5, 0, -20] # [m] and B coordinates diff --git a/tests/test_data/weis_inputs.yaml b/tests/test_data/weis_inputs.yaml index ad678693..6349dfeb 100644 --- a/tests/test_data/weis_inputs.yaml +++ b/tests/test_data/weis_inputs.yaml @@ -1,10 +1,10 @@ -turbine_mRNA: [951840.4416139615] -turbine_IxRNA: [409461632.2627004] -turbine_IrRNA: [278545821.52289987] -turbine_xCG_RNA: [-7.3422980746742255] +turbine_mRNA: [951979.776410793] +turbine_IxRNA: [410673981.6585206] +turbine_IrRNA: [279218289.3620287] +turbine_xCG_RNA: [-7.344891303720308] turbine_hHub: [150.0] turbine_overhang: [12.0313] -turbine_Fthrust: [3791040.342084202] +turbine_Fthrust: [3627299.9873144263] turbine_yaw_stiffness: [9286691506.067833] turbine_tower_rA: [0.0, 0.0, 15.0] turbine_tower_rB: [0.0, 0.0, 144.386] @@ -12,27 +12,27 @@ turbine_tower_gamma: [0.0] turbine_tower_stations: [0.0, 0.10047454902385111, 0.20094909804770222, 0.30142364707155334, 0.40189819609540445, 0.5023727451192556, 0.6028472941431067, 0.7033218431669578, 0.8037963921908089, 0.90427094121466, 1.0] turbine_tower_d: [10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 6.5] turbine_tower_t: [0.09, 0.0870568244887821, 0.06969791129654272, 0.06659467020278927, 0.048969783194233195, 0.04562355995431616, 0.028128174258004363, 0.025616868141627953, 0.009881156462835017, 0.009941082963793929, 0.005931142626464429] -turbine_tower_Cd: [0.7136445270091933, 0.7136445270091933, 0.7136445270091933, 0.7136445270091933, 0.7136445270091933, 0.7136445270091933, 0.7136445270091933, 0.7136445270091933, 0.7136445270091933, 0.7136445270091933, 0.7018751605201591] +turbine_tower_Cd: [0.717377272602844, 0.717377272602844, 0.717377272602844, 0.717377272602844, 0.717377272602844, 0.717377272602844, 0.717377272602844, 0.717377272602844, 0.717377272602844, 0.717377272602844, 0.7011960384944751] turbine_tower_Ca: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] turbine_tower_CdEnd: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] turbine_tower_CaEnd: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] turbine_tower_rho_shell: [7800.0] -rotor_PC_GS_angles: [0.060459247838740356, 0.08861269155978418, 0.1107444641211933, 0.12918854333222696, 0.14581834867809282, 0.161009288651768, 0.1752811375448905, 0.18846782964202727, 0.20148949662798657, 0.21333369207070996, 0.22504596166133817, 0.23649880414073302, 0.24720880609134044, 0.2578916012355006, 0.2683937152781697, 0.27828544227769414, 0.2881842628346356, 0.29808977932019026, 0.3073566747005221, 0.31660963526608277, 0.3258844284959737, 0.33489431971596006, 0.3436168999217967, 0.3523643657469011, 0.3611381487001811, 0.36948893290216206, 0.37776270100130327, 0.38607205778676645, 0.39442021360250795, 0.40231559866359] -rotor_PC_GS_Kp: [-1.4499405919862591, -1.2413889626787675, -1.0734895236563196, -0.9354115972353877, -0.819858085360773, -0.7217330780640242, -0.6373700640757235, -0.5640635915260396, -0.4997737444935102, -0.4429333490395087, -0.3923185278421952, -0.3469595798826372, -0.30607825273859846, -0.26904271765841203, -0.23533468057547627, -0.2045249768481733, -0.17625520185347587, -0.15022370480990338, -0.1261747827579203, -0.10389025294928565, -0.08318281451967177, -0.06389077139059254, -0.04587380151254236, -0.029009538146068475, -0.013190786980697256, 0.001676754727471223, 0.015676379571040042, 0.02888193125914981, 0.04135910754190046, 0.05316655332571051] -rotor_PC_GS_Ki: [-0.14754944393717015, -0.13161587759614177, -0.11878818183960942, -0.10823888137063188, -0.09941047013497416, -0.09191361518990242, -0.08546819117391558, -0.07986749868603767, -0.07495568597976036, -0.07061301929897752, -0.0667459931143122, -0.06328052123632814, -0.060157144352043966, -0.05732759007267858, -0.05475226018017072, -0.05239836603934572, -0.05023852515572539, -0.04824969108870165, -0.04641232786014341, -0.04470976607597734, -0.0431276957509139, -0.04165376313254081, -0.040277247466998095, -0.038988799805215024, -0.037780230387835706, -0.0366443343849048, -0.035574748153738865, -0.03456582995640299, -0.03361256041489877, -0.032710458995988026] -Fl_Kp: [-8.834100956191923] -rotor_inertia: [349679043.76099414] -rotor_TC_VS_Kp: [-63669658.43642259] -rotor_TC_VS_Ki: [-5035378.230158315] +rotor_PC_GS_angles: [0.06015621594430109, 0.08675397753892723, 0.11097773981951492, 0.1287459434421391, 0.14454605098444548, 0.15993721317954257, 0.17494236618281866, 0.18861117975687766, 0.2004324453200168, 0.2121751665613698, 0.22384809069072287, 0.2354569526638055, 0.2470044718747377, 0.2575377877171018, 0.267299378320044, 0.27706026354143914, 0.2868199696485141, 0.29658045540824046, 0.3063462941625118, 0.31612448879138616, 0.3251350606927088, 0.33366362280105333, 0.342224588180578, 0.3508194927384396, 0.3594495284649828, 0.3681146185375976, 0.37681239152358265, 0.38554186170527055, 0.3934834895800912, 0.4011365925128091] +rotor_PC_GS_Kp: [-1.4644304857437715, -1.2532012907932009, -1.0834525761469678, -0.9440581114537551, -0.827544248151874, -0.728704740333633, -0.6438014916996978, -0.5700811189668915, -0.5054707372266077, -0.4483799623434253, -0.39756824288811243, -0.35205368431507833, -0.3110489758497734, -0.27391546453480875, -0.24012965036251024, -0.20925835224847109, -0.1809400351452369, -0.15487058581571905, -0.1307923479900249, -0.1084855776158497, -0.087761717139842, -0.06845805251942988, -0.050433432300207345, -0.033564810356580585, -0.017744433152270558, -0.002877535564501279, 0.011119558867274367, 0.02432101372885265, 0.03679279422670766, 0.048593769579713404] +rotor_PC_GS_Ki: [-0.14879112127817487, -0.13259089806268343, -0.11957202030549056, -0.10888116176407336, -0.09994513095814507, -0.0923646348551347, -0.08585298015744017, -0.08019899613274052, -0.07524370287190296, -0.07086512586284244, -0.06696812101305534, -0.063477381919862, -0.06033252578300301, -0.05748457111358252, -0.054893368078242494, -0.05252569385349127, -0.050353820508678225, -0.04835442407892826, -0.04650774361648926, -0.04479692585115662, -0.04320750936127893, -0.04172701479327737, -0.04034461653628361, -0.03905087756763184, -0.03783753372980171, -0.0366973170116531, -0.03562380984700126, -0.03461132425959537, -0.03365480104789091, -0.03274972523711606] +Fl_Kp: [-8.917417189806258] +rotor_inertia: [350889355.0579736] +rotor_TC_VS_Kp: [-62033590.16261847] +rotor_TC_VS_Ki: [-5052806.71283482] tilt: [6.0] precone: [4.0] wind_reference_height: [150.0] hub_radius: [3.97] gear_ratio: [1.0] -blade_r: [3.97, 8.009448011426317, 12.048896022852633, 16.088344034278947, 20.127792045705267, 24.16724005713158, 28.206688068557895, 32.24613607998422, 36.285584091410534, 40.32503210283684, 44.36448011426316, 48.403928125689475, 52.443376137115784, 56.48282414854211, 60.52227215996842, 64.56172017139475, 68.60116818282106, 72.64061619424737, 76.68006420567369, 80.7195122171, 84.75896022852633, 88.79840823995265, 92.83785625137894, 96.87730426280528, 100.91675227423157, 104.9562002856579, 108.99564829708422, 113.03509630851052, 117.07454431993685, 121.11399233136315] +blade_r: [3.97, 8.014334554327489, 12.058669108654977, 16.103003662982466, 20.147338217309954, 24.19167277163744, 28.23600732596493, 32.28034188029242, 36.32467643461991, 40.369010988947394, 44.41334554327488, 48.45768009760237, 52.502014651929855, 56.546349206257354, 60.59068376058483, 64.63501831491233, 68.6793528692398, 72.72368742356731, 76.76802197789479, 80.81235653222227, 84.85669108654977, 88.90102564087726, 92.94536019520473, 96.98969474953225, 101.03402930385971, 105.0783638581872, 109.12269841251471, 113.16703296684217, 117.21136752116966, 121.25570207549714] blade_chord: [5.2, 5.2265040720520535, 5.319400683825207, 5.4580745530036845, 5.603038107463281, 5.718286587458929, 5.764630606410189, 5.715053106286686, 5.539182293334066, 5.290780459215475, 5.034005694445184, 4.815660040795825, 4.623237527554848, 4.432040224442178, 4.2451981651395, 4.065767388212587, 3.896040232078195, 3.7350841723423227, 3.5792063535409593, 3.4245801420565267, 3.267946590725438, 3.111859691750389, 2.957140175463699, 2.800021994595202, 2.6367899876098777, 2.4641317667059357, 2.2834502451238916, 2.0956817072301495, 1.9024851146667074, 0.5000000000000001] blade_theta: [15.594553019711718, 15.488273108365346, 14.71353124178717, 13.333617291568489, 11.64349455458099, 9.927004257169598, 8.44548693054192, 7.300998417700017, 6.228888266329778, 5.229058385210934, 4.345869365684453, 3.606791508890919, 2.9798194943332845, 2.4229574992772953, 1.9243945072809063, 1.4686902287805779, 1.0565354306085457, 0.6927184228293563, 0.3553347025744227, 0.01833021655638992, -0.355885118343244, -0.8310248222211819, -1.3743361006713515, -1.8520979156145947, -2.1407698795062395, -2.1741333308415802, -2.1073589596622617, -1.9479166540529262, -1.6623005276253076, -1.2423877062729698] -blade_Rtip: [121.11399233136315] +blade_Rtip: [121.25570207549714] blade_precurve: [0.0, 0.034295923985786604, 0.08329262571797669, 0.1392555188551465, 0.19190331656176873, 0.232028257864551, 0.24918042933165166, 0.2496141741724728, 0.24625256887234165, 0.2404720106240574, 0.23297926741790076, 0.2179571400171469, 0.17712118065470675, 0.10030156784192272, 1.126605912840715e-05, -0.11231262929473985, -0.24379916019447512, -0.4153387722179258, -0.6207684349190539, -0.8462432424369124, -1.0798464372334413, -1.3290155919297535, -1.6021369821922977, -1.8948995248383433, -2.201796716438755, -2.5227281124194536, -2.8639215886652067, -3.2248356445430946, -3.6046563533868463, -3.9999999999999996] blade_precurveTip: [-3.9999999999999996] blade_presweep: [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, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] @@ -14443,14 +14443,14 @@ airfoils_cm: - - [0.004849000257769079] - [0.004849000257769079] - [0.004849000257769079] -rotor_powercurve_v: [3.0, 4.272046072021935, 5.304031475548529, 6.080106111341955, 6.588350372834853, 6.82095821746675, 6.867559376486635, 7.192653799388591, 7.791248412775406, 8.6541494974404, 9.768103893234573, 10.665311954553012, 11.116002552239781, 12.677143313907283, 14.42754886624012, 16.340335009504354, 18.386123566365413, 20.533493596628738, 22.7494639864494, 25.0] -rotor_powercurve_omega_rpm: [4.999999999999999, 4.999999999999999, 4.999999999999999, 4.999999999999999, 4.999999999999999, 4.999999999999999, 4.999999999999999, 5.1039772317494405, 5.5287458029872045, 6.141068822031498, 6.931541717282476, 7.4903250909423065, 7.4903250909423065, 7.4903250909423065, 7.4903250909423065, 7.4903250909423065, 7.4903250909423065, 7.4903250909423065, 7.4903250909423065, 7.4903250909423065] -rotor_powercurve_pitch: [3.900184620042864, 3.559681534558776, 2.5497645040404984, 1.4894509402020701, 0.6685090860966085, 0.25694655220728596, 0.17138140191409368, 0.0, 0.0, 0.0, 0.0, 0.0, 3.441213241385218, 7.615587064274068, 10.686243106250354, 13.419001890543555, 15.973859706281404, 18.403061394462384, 20.721949200863058, 22.929486377590134] +rotor_powercurve_v: [3.0, 4.272046072021935, 5.304031475548529, 6.080106111341955, 6.588350372834853, 6.82095821746675, 6.867559376486635, 7.192653799388591, 7.791248412775406, 8.6541494974404, 9.768103893234573, 11.116002552239781, 11.179406673813915, 12.677143313907283, 14.42754886624012, 16.340335009504354, 18.386123566365413, 20.533493596628738, 22.7494639864494, 25.0] +rotor_powercurve_omega_rpm: [4.999999999999999, 4.999999999999999, 4.999999999999999, 4.999999999999999, 4.999999999999999, 4.999999999999999, 4.999999999999999, 5.11046111553664, 5.535769295383005, 6.148870184530444, 6.940347264196247, 7.499840493384918, 7.499840493384918, 7.499840493384918, 7.499840493384918, 7.499840493384918, 7.499840493384918, 7.499840493384918, 7.499840493384918, 7.499840493384918] +rotor_powercurve_pitch: [3.898466817660143, 3.5591052879218967, 2.550663449100678, 1.491266913749371, 0.6711739475940427, 0.26014493002007283, 0.17458008976326297, 0.0, 0.0, 0.0, 0.8948880859674491, 3.651939589378261, 3.732476464199819, 7.630932935649058, 10.688118284036522, 13.411089665698448, 15.95793408825377, 18.38024432479316, 20.693123146046435, 22.895369505783574] rho_air: [1.225] rho_water: [1025.0] mu_air: [1.81e-05] shear_exp: [0.12] -rated_rotor_speed: [7.4903250909423065] +rated_rotor_speed: [7.499840493384918] platform_member1_heading: [] platform_member1_rA: [0.0, 0.0, -20.0] platform_member1_rB: [0.0, 0.0, 15.0] @@ -14487,8 +14487,8 @@ platform_member2_Ca: [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] platform_member2_CdEnd: [0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6] platform_member2_CaEnd: [0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6] platform_member2_rho_shell: [7800.0] -platform_member2_l_fill: [0.0400627872412308, 0.05, 0.07139999999999999, 0.027130109943361083, 0.0, 0.0] -platform_member2_rho_fill: [5000.0, 1025.0, 1025.0, 1025.0, 0.0, 0.0] +platform_member2_l_fill: [0.0400627872412308, 0.05, 0.06200679454433111, 0.0, 0.0, 0.0] +platform_member2_rho_fill: [5000.0, 1025.0, 1025.0, 0.0, 0.0, 0.0] platform_member2_cap_stations: [0.0, 0.05, 0.2, 1.0] platform_member2_cap_t: [0.05, 0.05, 0.05, 0.05] platform_member2_cap_d_in: [0.0, 0.0, 0.0, 0.0] @@ -14509,8 +14509,8 @@ platform_member3_Ca: [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] platform_member3_CdEnd: [0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6] platform_member3_CaEnd: [0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6] platform_member3_rho_shell: [7800.0] -platform_member3_l_fill: [0.04006278724123036, 0.05, 0.07139999999999999, 0.02713010994336114, 0.0, 0.0] -platform_member3_rho_fill: [5000.0, 1025.0, 1025.0, 1025.0, 0.0, 0.0] +platform_member3_l_fill: [0.04006278724123036, 0.05, 0.06200679454433117, 0.0, 0.0, 0.0] +platform_member3_rho_fill: [5000.0, 1025.0, 1025.0, 0.0, 0.0, 0.0] platform_member3_cap_stations: [0.0, 0.05, 0.2, 1.0] platform_member3_cap_t: [0.05, 0.05, 0.05, 0.05] platform_member3_cap_d_in: [0.0, 0.0, 0.0, 0.0] @@ -14531,8 +14531,8 @@ platform_member4_Ca: [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] platform_member4_CdEnd: [0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6] platform_member4_CaEnd: [0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6] platform_member4_rho_shell: [7800.0] -platform_member4_l_fill: [0.0400627872412308, 0.05, 0.07139999999999999, 0.027130109943361083, 0.0, 0.0] -platform_member4_rho_fill: [5000.0, 1025.0, 1025.0, 1025.0, 0.0, 0.0] +platform_member4_l_fill: [0.0400627872412308, 0.05, 0.06200679454433111, 0.0, 0.0, 0.0] +platform_member4_rho_fill: [5000.0, 1025.0, 1025.0, 0.0, 0.0, 0.0] platform_member4_cap_stations: [0.0, 0.05, 0.2, 1.0] platform_member4_cap_t: [0.05, 0.05, 0.05, 0.05] platform_member4_cap_d_in: [0.0, 0.0, 0.0, 0.0] @@ -14625,7 +14625,7 @@ platform_member8_Ca: platform_member8_CdEnd: [0.6, 0.6] platform_member8_CaEnd: [0.6, 0.6] platform_member8_rho_shell: [7800.0] -platform_member8_l_fill: [0.7749397040523187] +platform_member8_l_fill: [0.5843832758834666] platform_member8_rho_fill: [1025.0] platform_member8_cap_stations: [0.0, 1.0] platform_member8_cap_t: [0.05, 0.05] @@ -14653,7 +14653,7 @@ platform_member9_Ca: platform_member9_CdEnd: [0.6, 0.6] platform_member9_CaEnd: [0.6, 0.6] platform_member9_rho_shell: [7800.0] -platform_member9_l_fill: [0.7749397040523186] +platform_member9_l_fill: [0.5843832758834666] platform_member9_rho_fill: [1025.0] platform_member9_cap_stations: [0.0, 1.0] platform_member9_cap_t: [0.05, 0.05] @@ -14681,7 +14681,7 @@ platform_member10_Ca: platform_member10_CdEnd: [0.6, 0.6] platform_member10_CaEnd: [0.6, 0.6] platform_member10_rho_shell: [7800.0] -platform_member10_l_fill: [0.7749397040523187] +platform_member10_l_fill: [0.5843832758834666] platform_member10_rho_fill: [1025.0] platform_member10_cap_stations: [0.0, 1.0] platform_member10_cap_t: [0.05, 0.05] @@ -14699,7 +14699,7 @@ mooring_point6_location: [25.874997812786933, -44.816815908632684, -14.001000000 mooring_line1_length: [850.0] mooring_line2_length: [850.0] mooring_line3_length: [850.0] -mooring_line_type1_diameter: [0.185] +mooring_line_type1_diameter: [0.333] mooring_line_type1_mass_density: [681.0774999999999] mooring_line_type1_stiffness: [2922815000.0] mooring_line_type1_breaking_load: [28848692.800000004] @@ -14708,5 +14708,6 @@ mooring_line_type1_transverse_added_mass: [1.0] mooring_line_type1_tangential_added_mass: [0.0] mooring_line_type1_transverse_drag: [1.6] mooring_line_type1_tangential_drag: [0.1] +rotor_orientation: upwind nBlades: 3 airfoils_name: [circular, SNL-FFA-W3-500, FFA-W3-211, FFA-W3-241, FFA-W3-270blend, FFA-W3-301, FFA-W3-330blend, FFA-W3-360] diff --git a/tests/test_data/weis_options.yaml b/tests/test_data/weis_options.yaml index 7888a538..27815426 100644 --- a/tests/test_data/weis_options.yaml +++ b/tests/test_data/weis_options.yaml @@ -10,113 +10,126 @@ modeling_options: xi_start: 0.0 nIter: 15 dls_max: 5 - min_freq_BEM: 0.0159 + min_freq_BEM: 0.0158999 plot_designs: false runPyHAMS: true - BEM_dir: /Users/dzalkind/Tools/WEIS-Main/examples/15_RAFT_Studies/none/BEM + BEM_dir: /Users/dzalkind/Tools/WEIS-Main/examples/04_frequency_domain_analysis_design/outputs/04_umaine_semi_raft_opt/openfast_runs/BEM model_potential: [false, false, false, false, false, false, false, false, false, false] - intersection_mesh: 0 nfreq: 20 - n_cases: 98 + n_cases: 11 + intersection_mesh: 0 + floating: + joints: + n_joints: 11 + name: [main_keel, main_freeboard, col1_keel, col1_freeboard, col2_keel, col2_freeboard, col3_keel, col3_freeboard, anchor1, anchor2, anchor3] + transition: [false, true, false, false, false, false, false, false, false, false, false] + cylindrical: [false, false, true, true, true, true, true, true, true, true, true] + name2idx: {main_keel: 0, main_freeboard: 1, col1_keel: 2, col1_freeboard: 3, col2_keel: 4, col2_freeboard: 5, col3_keel: 6, col3_freeboard: 7, anchor1: 8, anchor2: 9, anchor3: 10, main_upper_pontoon: 11, main_lower_pontoon: 12, col1_upper_pontoon: 13, col1_lower_pontoon: 14, col1_fairlead: 15, col2_upper_pontoon: 16, col2_lower_pontoon: 17, col2_fairlead: 18, col3_upper_pontoon: 19, col3_lower_pontoon: 20, col3_fairlead: 21} + design_variable_data: + - indices: [0, 2, 4, 6] + dimension: 2 + - indices: [2, 3, 4, 5, 6, 7] + dimension: 0 + transition_joint: 1 + members: + n_members: 10 + name: [main_column, column1, column2, column3, Y_pontoon_upper1, Y_pontoon_upper2, Y_pontoon_upper3, Y_pontoon_lower1, Y_pontoon_lower2, Y_pontoon_lower3] + joint1: [main_keel, col1_keel, col2_keel, col3_keel, main_upper_pontoon, main_upper_pontoon, main_upper_pontoon, main_lower_pontoon, main_lower_pontoon, main_lower_pontoon] + joint2: [main_freeboard, col1_freeboard, col2_freeboard, col3_freeboard, col1_upper_pontoon, col2_upper_pontoon, col3_upper_pontoon, col1_lower_pontoon, col2_lower_pontoon, col3_lower_pontoon] + outer_shape: [circular, circular, circular, circular, circular, circular, circular, rectangular, rectangular, rectangular] + n_height: [4, 7, 7, 7, 2, 2, 2, 2, 2, 2] + n_geom: [2, 2, 2, 2, 2, 2, 2, 2, 2, 2] + n_layers: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + n_ballasts: [0, 2, 2, 2, 0, 0, 0, 1, 1, 1] + n_bulkheads: [2, 4, 4, 4, 2, 2, 2, 2, 2, 2] + n_axial_joints: [2, 3, 3, 3, 0, 0, 0, 0, 0, 0] + layer_mat_member_main_column: [steel] + ballast_flag_member_main_column: [] + ballast_mat_member_main_column: [] + axial_joint_name_member_main_column: [main_upper_pontoon, main_lower_pontoon] + grid_member_main_column: [0.0, 0.1, 0.987, 1.0] + geom_member_main_column: [0.0, 1.0] + layer_mat_member_column1: [steel] + ballast_flag_member_column1: [false, true] + ballast_mat_member_column1: [slurry, ''] + axial_joint_name_member_column1: [col1_upper_pontoon, col1_lower_pontoon, col1_fairlead] + grid_member_column1: [0.0, 0.05, 0.1, 0.1714, 0.2, 0.987, 1.0] + geom_member_column1: [0.0, 1.0] + layer_mat_member_column2: [steel] + ballast_flag_member_column2: [false, true] + ballast_mat_member_column2: [slurry, ''] + axial_joint_name_member_column2: [col2_upper_pontoon, col2_lower_pontoon, col2_fairlead] + grid_member_column2: [0.0, 0.05, 0.1, 0.1714, 0.2, 0.987, 1.0] + geom_member_column2: [0.0, 1.0] + layer_mat_member_column3: [steel] + ballast_flag_member_column3: [false, true] + ballast_mat_member_column3: [slurry, ''] + axial_joint_name_member_column3: [col3_upper_pontoon, col3_lower_pontoon, col3_fairlead] + grid_member_column3: [0.0, 0.05, 0.1, 0.1714, 0.2, 0.987, 1.0] + geom_member_column3: [0.0, 1.0] + layer_mat_member_Y_pontoon_upper1: [steel] + ballast_flag_member_Y_pontoon_upper1: [] + ballast_mat_member_Y_pontoon_upper1: [] + grid_member_Y_pontoon_upper1: [0.0, 1.0] + geom_member_Y_pontoon_upper1: [0.0, 1.0] + layer_mat_member_Y_pontoon_upper2: [steel] + ballast_flag_member_Y_pontoon_upper2: [] + ballast_mat_member_Y_pontoon_upper2: [] + grid_member_Y_pontoon_upper2: [0.0, 1.0] + geom_member_Y_pontoon_upper2: [0.0, 1.0] + layer_mat_member_Y_pontoon_upper3: [steel] + ballast_flag_member_Y_pontoon_upper3: [] + ballast_mat_member_Y_pontoon_upper3: [] + grid_member_Y_pontoon_upper3: [0.0, 1.0] + geom_member_Y_pontoon_upper3: [0.0, 1.0] + layer_mat_member_Y_pontoon_lower1: [steel] + ballast_flag_member_Y_pontoon_lower1: [true] + ballast_mat_member_Y_pontoon_lower1: [''] + grid_member_Y_pontoon_lower1: [0.0, 1.0] + geom_member_Y_pontoon_lower1: [0.0, 1.0] + layer_mat_member_Y_pontoon_lower2: [steel] + ballast_flag_member_Y_pontoon_lower2: [true] + ballast_mat_member_Y_pontoon_lower2: [''] + grid_member_Y_pontoon_lower2: [0.0, 1.0] + geom_member_Y_pontoon_lower2: [0.0, 1.0] + layer_mat_member_Y_pontoon_lower3: [steel] + ballast_flag_member_Y_pontoon_lower3: [true] + ballast_mat_member_Y_pontoon_lower3: [''] + grid_member_Y_pontoon_lower3: [0.0, 1.0] + geom_member_Y_pontoon_lower3: [0.0, 1.0] + ballast_types: !!set {slurry: !!null '', variable: !!null ''} + linked_members: + - [main_column] + - [column1, column2, column3] + - [Y_pontoon_upper1] + - [Y_pontoon_upper2] + - [Y_pontoon_upper3] + - [Y_pontoon_lower1] + - [Y_pontoon_lower2] + - [Y_pontoon_lower3] + name2idx: {main_column: 0, column1: 1, column2: 1, column3: 1, Y_pontoon_upper1: 2, Y_pontoon_upper2: 3, Y_pontoon_upper3: 4, Y_pontoon_lower1: 5, Y_pontoon_lower2: 6, Y_pontoon_lower3: 7} + platform_elem_memid: [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9] + rigid_bodies: + n_bodies: 0 + joint1: [] + tower: + n_ballasts: [0] + n_bulkheads: [0] + n_axial_joints: [0] + n_height: [11] + n_layers: [1] raft_dlcs: - - [3.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 6.9, 1.0, 0.0] - - [5.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 6.93, 1.0, 0.0] - - [7.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 6.99, 1.0, 0.0] - - [9.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 7.07, 1.0, 0.0] - - [11.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 7.1850000000000005, 1.095, 0.0] - - [13.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 7.34, 1.25, 0.0] - - [15.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 7.545, 1.455, 0.0] - - [17.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 7.800000000000001, 1.715, 0.0] - - [19.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 8.105, 2.04, 0.0] - - [21.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 8.45, 2.42, 0.0] - - [23.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 8.82, 2.8449999999999998, 0.0] - - [25.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 9.01, 3.07, 0.0] - - [3.0, 0.0, IB_ECD, operating, 0.0, JONSWAP, 6.9, 1.0, 0.0] - - [3.0, 0.0, IB_ECD, operating, 0.0, JONSWAP, 6.9, 1.0, 0.0] - - [5.0, 0.0, IB_ECD, operating, 0.0, JONSWAP, 6.93, 1.0, 0.0] - - [5.0, 0.0, IB_ECD, operating, 0.0, JONSWAP, 6.93, 1.0, 0.0] - - [7.0, 0.0, IB_ECD, operating, 0.0, JONSWAP, 6.99, 1.0, 0.0] - - [7.0, 0.0, IB_ECD, operating, 0.0, JONSWAP, 6.99, 1.0, 0.0] - - [9.0, 0.0, IB_ECD, operating, 0.0, JONSWAP, 7.07, 1.0, 0.0] - - [9.0, 0.0, IB_ECD, operating, 0.0, JONSWAP, 7.07, 1.0, 0.0] - - [11.0, 0.0, IB_ECD, operating, 0.0, JONSWAP, 7.1850000000000005, 1.095, 0.0] - - [11.0, 0.0, IB_ECD, operating, 0.0, JONSWAP, 7.1850000000000005, 1.095, 0.0] - - [13.0, 0.0, IB_ECD, operating, 0.0, JONSWAP, 7.34, 1.25, 0.0] - - [13.0, 0.0, IB_ECD, operating, 0.0, JONSWAP, 7.34, 1.25, 0.0] - - [15.0, 0.0, IB_ECD, operating, 0.0, JONSWAP, 7.545, 1.455, 0.0] - - [15.0, 0.0, IB_ECD, operating, 0.0, JONSWAP, 7.545, 1.455, 0.0] - - [17.0, 0.0, IB_ECD, operating, 0.0, JONSWAP, 7.800000000000001, 1.715, 0.0] - - [17.0, 0.0, IB_ECD, operating, 0.0, JONSWAP, 7.800000000000001, 1.715, 0.0] - - [19.0, 0.0, IB_ECD, operating, 0.0, JONSWAP, 8.105, 2.04, 0.0] - - [19.0, 0.0, IB_ECD, operating, 0.0, JONSWAP, 8.105, 2.04, 0.0] - - [21.0, 0.0, IB_ECD, operating, 0.0, JONSWAP, 8.45, 2.42, 0.0] - - [21.0, 0.0, IB_ECD, operating, 0.0, JONSWAP, 8.45, 2.42, 0.0] - - [23.0, 0.0, IB_ECD, operating, 0.0, JONSWAP, 8.82, 2.8449999999999998, 0.0] - - [23.0, 0.0, IB_ECD, operating, 0.0, JONSWAP, 8.82, 2.8449999999999998, 0.0] - - [25.0, 0.0, IB_ECD, operating, 0.0, JONSWAP, 9.01, 3.07, 0.0] - - [25.0, 0.0, IB_ECD, operating, 0.0, JONSWAP, 9.01, 3.07, 0.0] - - [3.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 6.9, 1.0, 0.0] - - [3.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 6.9, 1.0, 0.0] - - [3.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 6.9, 1.0, 0.0] - - [3.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 6.9, 1.0, 0.0] - - [5.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 6.93, 1.0, 0.0] - - [5.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 6.93, 1.0, 0.0] - - [5.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 6.93, 1.0, 0.0] - - [5.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 6.93, 1.0, 0.0] - - [7.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 6.99, 1.0, 0.0] - - [7.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 6.99, 1.0, 0.0] - - [7.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 6.99, 1.0, 0.0] - - [7.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 6.99, 1.0, 0.0] - - [9.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 7.07, 1.0, 0.0] - - [9.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 7.07, 1.0, 0.0] - - [9.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 7.07, 1.0, 0.0] - - [9.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 7.07, 1.0, 0.0] - - [11.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 7.1850000000000005, 1.095, 0.0] - - [11.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 7.1850000000000005, 1.095, 0.0] - - [11.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 7.1850000000000005, 1.095, 0.0] - - [11.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 7.1850000000000005, 1.095, 0.0] - - [13.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 7.34, 1.25, 0.0] - - [13.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 7.34, 1.25, 0.0] - - [13.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 7.34, 1.25, 0.0] - - [13.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 7.34, 1.25, 0.0] - - [15.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 7.545, 1.455, 0.0] - - [15.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 7.545, 1.455, 0.0] - - [15.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 7.545, 1.455, 0.0] - - [15.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 7.545, 1.455, 0.0] - - [17.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 7.800000000000001, 1.715, 0.0] - - [17.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 7.800000000000001, 1.715, 0.0] - - [17.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 7.800000000000001, 1.715, 0.0] - - [17.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 7.800000000000001, 1.715, 0.0] - - [19.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 8.105, 2.04, 0.0] - - [19.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 8.105, 2.04, 0.0] - - [19.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 8.105, 2.04, 0.0] - - [19.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 8.105, 2.04, 0.0] - - [21.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 8.45, 2.42, 0.0] - - [21.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 8.45, 2.42, 0.0] - - [21.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 8.45, 2.42, 0.0] - - [21.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 8.45, 2.42, 0.0] - - [23.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 8.82, 2.8449999999999998, 0.0] - - [23.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 8.82, 2.8449999999999998, 0.0] - - [23.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 8.82, 2.8449999999999998, 0.0] - - [23.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 8.82, 2.8449999999999998, 0.0] - - [25.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 9.01, 3.07, 0.0] - - [25.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 9.01, 3.07, 0.0] - - [25.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 9.01, 3.07, 0.0] - - [25.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 9.01, 3.07, 0.0] - - [3.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 11.5, 6.3, 0.0] - - [5.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 12.1, 7.15, 0.0] - - [7.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 12.7, 8.0, 0.0] - - [9.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 12.75, 8.05, 0.0] - - [11.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 12.95, 8.3, 0.0] - - [13.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 13.1, 8.5, 0.0] - - [15.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 13.6, 9.15, 0.0] - - [17.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 14.1, 9.8, 0.0] - - [19.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 14.1, 9.8, 0.0] - - [21.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 14.1, 9.8, 0.0] - - [23.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 14.1, 9.850000000000001, 0.0] - - [25.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 14.1, 9.9, 0.0] - - [70.0, 0.0, IB_EWM, parked, -8.0, JONSWAP, 14.2, 10.68, 0.0] - - [70.0, 0.0, IB_EWM, parked, 8.0, JONSWAP, 14.2, 10.68, 0.0] + - [10.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 7.12, 1.03, 0.0] + - [10.0, 0.0, IB_ECD, operating, 0.0, JONSWAP, 7.12, 1.03, 0.0] + - [10.0, 0.0, IB_ECD, operating, 0.0, JONSWAP, 7.12, 1.03, 0.0] + - [10.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 7.12, 1.03, 0.0] + - [10.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 7.12, 1.03, 0.0] + - [10.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 7.12, 1.03, 0.0] + - [10.0, 0.0, IB_EWS, operating, 0.0, JONSWAP, 7.12, 1.03, 0.0] + - [10.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 12.8, 8.1, 0.0] + - [10.0, 0.0, IB_EWM, parked, -8.0, JONSWAP, 14.2, 10.68, 0.0] + - [10.0, 0.0, IB_EWM, parked, 0.0, JONSWAP, 14.2, 10.68, 0.0] + - [10.0, 0.0, IB_EWM, parked, 8.0, JONSWAP, 14.2, 10.68, 0.0] raft_dlcs_keys: [wind_speed, wind_heading, turbulence, turbine_status, yaw_misalign, wave_spectrum, wave_period, wave_height, wave_heading] turbine_options: npts: 11 @@ -156,7 +169,7 @@ member_options: platform_member9_potMod: false platform_member10_potMod: false analysis_options: - general: {folder_output: 15_RAFT_Rect, fname_output: refturb_output} + general: {folder_output: 04_umaine_semi_raft_opt, fname_output: refturb_output} design_variables: floating: joints: @@ -174,11 +187,10 @@ analysis_options: groups: - names: [column1, column2, column3] diameter: {lower_bound: 9.375, upper_bound: 15.625, constant: true} - thickness: {lower_bound: 0.05, upper_bound: 0.25, constant: true} rotor_diameter: {flag: false, minimum: 0.0, maximum: 0.0} blade: aero_shape: - twist: {flag: false, inverse: false, n_opt: 30, max_decrease: 0.1, max_increase: 0.1, index_start: 0, index_end: 8} + twist: {flag: false, inverse: false, inverse_target: max_efficiency, n_opt: 30, max_decrease: 0.1, max_increase: 0.1, index_start: 0, index_end: 8, cap_twist_root: 0.349} chord: {flag: false, n_opt: 30, max_decrease: 0.5, max_increase: 1.5, index_start: 0, index_end: 8} af_positions: {flag: false, af_start: 4} rthick: {flag: false, n_opt: 30, max_decrease: 0.5, max_increase: 1.5, index_start: 0, index_end: 8} @@ -186,8 +198,9 @@ analysis_options: c_d: {flag: false, n_opt: 8, max_decrease: 0.5, max_increase: 1.5, index_start: 0, index_end: 8} stall_margin: {flag: false, n_opt: 8, max_decrease: 0.5, max_increase: 1.5, index_start: 0, index_end: 8} z: {flag: false, n_opt: 3, lower_bound: -1.0, upper_bound: 1.0} - n_opt_struct: [30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30] structure: [] + n_opt_struct: [30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30] + layer_index_opt: [] control: tsr: {flag: false, minimum: 0.0, maximum: 0.0, min_gain: 0.5, max_gain: 1.5} flaps: @@ -231,13 +244,18 @@ analysis_options: bedplate_web_thickness: {flag: false, lower_bound: 0.001, upper_bound: 1.0} bedplate_flange_thickness: {flag: false, lower_bound: 0.001, upper_bound: 1.0} bedplate_flange_width: {flag: false, lower_bound: 0.001, upper_bound: 1.0} - tower: &id003 + tower: + outer_diameter: {flag: false, lower_bound: 5.0, upper_bound: 5.0} + layer_thickness: {flag: false, lower_bound: 0.01, upper_bound: 0.01} + section_height: {flag: false, lower_bound: 5.0, upper_bound: 5.0} + E: {flag: false, lower_bound: 200000000000.0, upper_bound: 200000000000.0} + rho: {flag: false, lower_bound: 7800, upper_bound: 7800} + monopile: outer_diameter: {flag: false, lower_bound: 5.0, upper_bound: 5.0} layer_thickness: {flag: false, lower_bound: 0.01, upper_bound: 0.01} section_height: {flag: false, lower_bound: 5.0, upper_bound: 5.0} E: {flag: false, lower_bound: 200000000000.0, upper_bound: 200000000000.0} rho: {flag: false, lower_bound: 7800, upper_bound: 7800} - monopile: *id003 jacket: foot_head_ratio: {flag: false, lower_bound: 1.5, upper_bound: 1.5} r_head: {flag: false, lower_bound: 5.0, upper_bound: 5.0} @@ -252,6 +270,7 @@ analysis_options: line_diameter: {flag: false, lower_bound: 0.0} line_mass_density_coeff: {flag: false, lower_bound: 0.0} line_stiffness_coeff: {flag: false, lower_bound: 0.0} + user: [] TMDs: flag: false groups: [] @@ -268,11 +287,11 @@ analysis_options: pitch_duty_cycle: {flag: false, max: 5} Max_Offset: {flag: true, max: 30.0} floating: - stress: {flag: true} - global_buckling: {flag: true} - shell_buckling: {flag: true} - operational_heel: &id004 {upper_bound: 0.17453292519943295} - survival_heel: *id004 + stress: {flag: false} + global_buckling: {flag: false} + shell_buckling: {flag: false} + operational_heel: {upper_bound: 0.17453292519943295} + survival_heel: {upper_bound: 0.17453292519943295} max_surge: {flag: false, upper_bound: 0.1} buoyancy: {flag: false} fixed_ballast_capacity: {flag: false} @@ -287,12 +306,12 @@ analysis_options: mooring_length: {flag: false} anchor_vertical: {flag: false} anchor_lateral: {flag: false} - surge_period: &id005 {flag: false, lower_bound: 1.0, upper_bound: 1.0} - sway_period: *id005 - heave_period: *id005 - roll_period: *id005 - pitch_period: *id005 - yaw_period: *id005 + surge_period: {flag: false, lower_bound: 1.0, upper_bound: 1.0} + sway_period: {flag: false, lower_bound: 1.0, upper_bound: 1.0} + heave_period: {flag: false, lower_bound: 1.0, upper_bound: 1.0} + roll_period: {flag: false, lower_bound: 1.0, upper_bound: 1.0} + pitch_period: {flag: false, lower_bound: 1.0, upper_bound: 1.0} + yaw_period: {flag: false, lower_bound: 1.0, upper_bound: 1.0} Max_Offset: {flag: false, max: 20} blade: strains_spar_cap_ss: {flag: false, max: 0.004, index_start: 0, index_end: 8} @@ -304,14 +323,17 @@ analysis_options: rail_transport: {flag: false, 8_axle: false, 4_axle: false} stall: {flag: false, margin: 0.05233} chord: {flag: false, max: 4.75} + chord_slope: {flag: false} + twist_slope: {flag: false} root_circle_diameter: {flag: false, max_ratio: 1.0} frequency: flap_3P: false edge_3P: false - first_flap: &id006 {flag: false, target: 0.0, acceptable_error: 0.01} - first_edge: *id006 - first_torsion: *id006 + first_flap: {flag: false, target: 0.0, acceptable_error: 0.01} + first_edge: {flag: false, target: 0.0, acceptable_error: 0.01} + first_torsion: {flag: false, target: 0.0, acceptable_error: 0.01} mass: {flag: false, target: 0.0, acceptable_error: 0.0} + rated_velocity: {flag: false, target: 0.0, acceptable_error: 0.1} moment_coefficient: {flag: false, min: 0.15, max: 0.15} match_cl_cd: {flag_cl: false, flag_cd: false, filename: ''} match_L_D: {flag_L: false, flag_D: false, filename: ''} @@ -319,35 +341,48 @@ analysis_options: thrust_coeff: {flag: false} tower: height_constraint: {flag: false, lower_bound: 0.01, upper_bound: 0.01} - stress: &id007 {flag: false} - global_buckling: &id008 {flag: false} - shell_buckling: &id009 {flag: false} - slope: &id010 {flag: false} - thickness_slope: &id011 {flag: false} - d_to_t: &id012 {flag: false, lower_bound: 50.0, upper_bound: 50.0} - taper: &id013 {flag: false, lower_bound: 0.5} + stress: {flag: false} + global_buckling: {flag: false} + shell_buckling: {flag: false} + slope: {flag: false} + thickness_slope: {flag: false} + d_to_t: {flag: false, lower_bound: 50.0, upper_bound: 50.0} + taper: {flag: false, lower_bound: 0.5} frequency: {flag: false} - frequency_1: &id014 {flag: false, lower_bound: 0.1, upper_bound: 0.1} - monopile: &id015 - stress: *id007 - global_buckling: *id008 - shell_buckling: *id009 - slope: *id010 - thickness_slope: *id011 - d_to_t: *id012 - taper: *id013 - frequency_1: *id014 + frequency_1: {flag: false, lower_bound: 0.1, upper_bound: 0.1} + mass: {flag: false, target: 0.0, acceptable_error: 0.0} + monopile: + stress: {flag: false} + global_buckling: {flag: false} + shell_buckling: {flag: false} + slope: {flag: false} + thickness_slope: {flag: false} + d_to_t: {flag: false, lower_bound: 50.0, upper_bound: 50.0} + taper: {flag: false, lower_bound: 0.5} + frequency_1: {flag: false, lower_bound: 0.1, upper_bound: 0.1} + mass: {flag: false, target: 0.0, acceptable_error: 0.0} + pile_depth: {flag: false, lower_bound: 0.0} + tower_diameter_coupling: {flag: false} + jacket: + stress: {flag: false} + global_buckling: {flag: false} + shell_buckling: {flag: false} + slope: {flag: false} + thickness_slope: {flag: false} + d_to_t: {flag: false, lower_bound: 50.0, upper_bound: 50.0} + taper: {flag: false, lower_bound: 0.5} + frequency_1: {flag: false, lower_bound: 0.1, upper_bound: 0.1} + mass: {flag: false, target: 0.0, acceptable_error: 0.0} pile_depth: {flag: false, lower_bound: 0.0} tower_diameter_coupling: {flag: false} - jacket: *id015 hub: hub_diameter: {flag: false} drivetrain: - lss: *id007 - hss: *id007 - bedplate: *id007 - mb1: &id016 {flag: false} - mb2: *id016 + lss: {flag: false} + hss: {flag: false} + bedplate: {flag: false} + mb1: {flag: false} + mb2: {flag: false} length: {flag: false} height: {flag: false} access: {flag: false, lower_bound: 2.0} @@ -362,7 +397,7 @@ analysis_options: openfast_failed: {flag: false} merit_figure: platform_mass driver: - optimization: {flag: false, solver: LN_COBYLA, tol: 0.01, max_iter: 2, max_major_iter: 10, max_minor_iter: 100, time_limit: 0, max_function_calls: 100000, step_size: 0.001, form: central, step_calc: None, debug_print: false} + optimization: {flag: true, solver: LN_COBYLA, tol: 0.01, max_iter: 1, max_major_iter: 10, max_minor_iter: 100, time_limit: 0, major_step_limit: 2.0, function_precision: 3.7e-11, max_function_calls: 100000, hist_file: None, hotstart_file: None, step_size: 0.001, form: central, step_calc: None, debug_print: false} design_of_experiments: {flag: false, run_parallel: true, generator: Uniform, num_samples: 5, seed: 2, levels: 2, criterion: center, iterations: 2, debug_print: false} step_size_study: flag: false @@ -378,5 +413,5 @@ analysis_options: just_dvs: false merit_figure_user: {name: '', ref: 1, max_flag: false} inverse_design: {} - fname_input_analysis: /Users/dzalkind/Tools/WEIS-Main/examples/15_RAFT_Studies/analysis_options.yaml - opt_flag: false + fname_input_analysis: /Users/dzalkind/Tools/WEIS-Main/examples/04_frequency_domain_analysis_design/umaine_semi_raft_opt_analysis.yaml + opt_flag: true diff --git a/tests/test_fowt.py b/tests/test_fowt.py index a27423c2..466a7a4a 100644 --- a/tests/test_fowt.py +++ b/tests/test_fowt.py @@ -17,9 +17,10 @@ # List of input file names to be tested list_files = [ 'OC3spar.yaml', - 'VolturnUS-S.yaml', + 'VolturnUS-S.yaml', 'VolturnUS-S-pointInertia.yaml', - 'OC4semi-WAMIT_Coefs.yaml' + 'OC4semi-WAMIT_Coefs.yaml', + 'VolturnUS-S-flexible.yaml', ] @@ -29,199 +30,6 @@ # To avoid problems with different platforms, get the full path of the file list_files = [os.path.join(current_dir, test_dir, file) for file in list_files] - -''' - Desired values to compare with the results. - Should be lists of the same length as list_files. - List elements are indicated below. -''' -# Structure related quantities -desired_rCG = [ - np.array([ 0, 0, -78.03525272 ]), - np.array([-3.78742736e-01, 7.80925410e-16, -1.91132267e+00]), - np.array([-3.78616422e-01, 3.80441015e-19, -1.69266625e+00]), - np.array([ 4.32611618e-15, 1.08152905e-15, -1.00637502e+01]), -] -desired_rCG_sub = [ - np.array([ 0, 0, -89.91292526 ]), - np.array([ 2.65203563e-15, 8.85162184e-16, -1.51939447e+01]), - np.array([ 8.62405052e-19, 4.31202526e-19, -1.49410924e+01]), - np.array([ 4.52296648e-15, 1.13074162e-15, -1.37215567e+01]), -] - -desired_m_ballast = [ - np.array([6.5323524956e+06]), - np.array([1.0569497625e+07, 2.42678207158787e+06]), - np.array([0.]), - np.array([9592105.45682851]), -] - -desired_M_struc = [ - np.array([[ 8.08951257e+06, 0.00000000e+00, -3.63797881e-12, 0.00000000e+00, -6.31267158e+08, 0.00000000e+00], - [ 0.00000000e+00, 8.08951257e+06, 0.00000000e+00, 6.31267158e+08, 0.00000000e+00, 0.00000000e+00], - [ 3.63797881e-12, 0.00000000e+00, 8.08951257e+06, 0.00000000e+00, 3.25832739e-10, 0.00000000e+00], - [ 0.00000000e+00, 6.31267158e+08, 0.00000000e+00, 6.77394404e+10, 0.00000000e+00, -8.06082047e+05], - [-6.31267158e+08, 0.00000000e+00, 3.25832739e-10, 0.00000000e+00, 6.77302268e+10, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -8.06082047e+05, 0.00000000e+00, 1.18100818e+08]]), - np.array([[ 1.91186826e+07, 0.00000000e+00, -7.72177272e-12, 0.00000000e+00, -3.65419714e+07, -1.49302650e-08], - [ 0.00000000e+00, 1.91186826e+07, 0.00000000e+00, 3.65419714e+07, 0.00000000e+00, -7.24106215e+06], - [ 1.30711139e-11, 0.00000000e+00, 1.91186826e+07, 1.49302650e-08, 7.24106215e+06, 0.00000000e+00], - [ 0.00000000e+00, 3.65419714e+07, 1.49302650e-08, 4.26605281e+10, 9.54605639e-07, 1.08255551e+09], - [-3.65419714e+07, 0.00000000e+00, 7.24106215e+06, 9.54605639e-07, 4.27128822e+10, 4.76371497e-07], - [-1.49302650e-08, -7.24106215e+06, 0.00000000e+00, 1.08255551e+09, 4.76371497e-07, 2.06119358e+10]]), - np.array([[ 1.91250610e+07, 0.00000000e+00, -7.72177272e-12, 0.00000000e+00, -3.23723453e+07, -7.27595761e-12], - [ 0.00000000e+00, 1.91250610e+07, 0.00000000e+00, 3.23723453e+07, 0.00000000e+00, -7.24106215e+06], - [ 1.30711139e-11, 0.00000000e+00, 1.91250610e+07, 7.27595761e-12, 7.24106215e+06, 0.00000000e+00], - [ 0.00000000e+00, 3.23723453e+07, 7.27595761e-12, 4.25355736e+10, 2.32830644e-10, 1.08255551e+09], - [-3.23723453e+07, 0.00000000e+00, 7.24106215e+06, 2.32830644e-10, 4.25879277e+10, 1.16415322e-10], - [-7.27595761e-12, -7.24106215e+06, 0.00000000e+00, 1.08255551e+09, 1.16415322e-10, 2.06187038e+10]]), - np.array([[ 1.37778650e+07, 0.00000000e+00, -3.63797881e-12, 0.00000000e+00, -1.38656991e+08, -1.49011612e-08], - [ 0.00000000e+00, 1.37778650e+07, 0.00000000e+00, 1.38656991e+08, 0.00000000e+00, 4.47034836e-08], - [ 3.63797881e-12, 0.00000000e+00, 1.37778650e+07, 1.49011612e-08, -4.43776508e-08, 0.00000000e+00], - [ 0.00000000e+00, 1.38656991e+08, 1.49011612e-08, 1.26568887e+10, 4.76837158e-07, -8.06082047e+05], - [-1.38656991e+08, 0.00000000e+00, -4.43776508e-08, 4.76837158e-07, 1.26476751e+10, 2.38418579e-07], - [-1.49011612e-08, 4.47034836e-08, 0.00000000e+00, -8.06082047e+05, 2.38418579e-07, 1.22412242e+10]]), -] - -desired_M_struc_sub = [ - np.array([[ 7.48986700e+06, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -6.73435852e+08, 0.00000000e+00], - [ 0.00000000e+00, 7.48986700e+06, 0.00000000e+00, 6.73435852e+08, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 7.48986700e+06, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 6.73435852e+08, 0.00000000e+00, 6.43071810e+10, 0.00000000e+00, 0.00000000e+00], - [ -6.73435852e+08, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 6.43071810e+10, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 9.00523426e+07]]), - np.array([[ 1.68672649e+07, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -2.56280290e+08, -1.49302650e-08], - [ 0.00000000e+00, 1.68672649e+07, 0.00000000e+00, 2.56280290e+08, 0.00000000e+00, 4.47325874e-08], - [ 0.00000000e+00, 0.00000000e+00, 1.68672649e+07, 1.49302650e-08, -4.47325874e-08, 0.00000000e+00], - [ 0.00000000e+00, 2.56280290e+08, 1.49302650e-08, 1.49458996e+10, 9.54605639e-07, 4.76371497e-07], - [ -2.56280290e+08, 0.00000000e+00, -4.47325874e-08, 9.54605639e-07, 1.49458996e+10, 4.76371497e-07], - [ -1.49302650e-08, 4.47325874e-08, 0.00000000e+00, 5.96046448e-07, 4.76371497e-07, 2.05313182e+10]]), - np.array([[ 1.68736433e+07, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -2.52110664e+08, -7.27595761e-12], - [ 0.00000000e+00, 1.68736433e+07, 0.00000000e+00, 2.52110664e+08, 0.00000000e+00, 1.45519152e-11], - [ 0.00000000e+00, 0.00000000e+00, 1.68736433e+07, 7.27595761e-12, -1.45519152e-11, 0.00000000e+00], - [ 0.00000000e+00, 2.52110664e+08, 7.27595761e-12, 1.48209451e+10, 2.32830644e-10, 2.32830644e-10], - [-2.52110664e+08, 0.00000000e+00, -1.45519152e-11, 2.32830644e-10, 1.48209451e+10, 1.16415322e-10], - [-7.27595761e-12, 1.45519152e-11, 0.00000000e+00, 3.49245965e-10, 1.16415322e-10, 2.05380863e+10]]), - np.array([[ 1.31782194e+07, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -1.80825686e+08, -1.49011612e-08], - [ 0.00000000e+00, 1.31782194e+07, 0.00000000e+00, 1.80825686e+08, 0.00000000e+00, 4.47034836e-08], - [ 0.00000000e+00, 0.00000000e+00, 1.31782194e+07, 1.49011612e-08, -4.47034836e-08, 0.00000000e+00], - [ 0.00000000e+00, 1.80825686e+08, 1.49011612e-08, 9.22462925e+09, 4.76837158e-07, 2.38418579e-07], - [-1.80825686e+08, 0.00000000e+00, -4.47034836e-08, 4.76837158e-07, 9.22462925e+09, 2.38418579e-07], - [-1.49011612e-08, 4.47034836e-08, 0.00000000e+00, 4.76837158e-07, 2.38418579e-07, 1.22131757e+10]]), -] - -desired_C_struc = [ - np.array([[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 6.19273082e+09, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 6.19273082e+09, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]), - np.array([[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 3.58476739e+08, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 3.58476739e+08, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]), - np.array([[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 3.17572707e+08, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 3.17572707e+08, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]), - np.array([[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 1.36022508e+09, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 1.36022508e+09, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]), -] - -desired_W_struc = [ - np.array([ 0.00000000e+00, 0.00000000e+00, -7.93581183e+07, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]), - np.array([ 0.00000000e+00, 0.00000000e+00, -1.87554276e+08, -2.38651410e-07, -7.10348197e+07, 0.00000000e+00]), - np.array([ 0.00000000e+00, 0.00000000e+00, -1.87616848e+08, -5.82076609e-11, -7.10348197e+07, 0.00000000e+00]), - np.array([ 0.00000000e+00, 0.00000000e+00, -1.35160856e+08, -1.19209290e-07, 4.76837158e-07, 0.00000000e+00]), -] - -# Hydrostatic quantities -desired_rCB = [ - np.array([ 0.00000000e+00, 0.00000000e+00, -6.20656552e+01]), - np.array([ 3.04454348e-15, 1.52227174e-15, -1.35855138e+01]), - np.array([ 3.04454348e-15, 1.52227174e-15, -1.35855138e+01]), - np.array([ 2.14681350e-15, 1.07340675e-15, -1.31534674e+01]) -] - -desired_C_hydro = [ - np.array([[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 3.33664089e+05, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -5.01003340e+09, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -5.01003340e+09, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]), - np.array([[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 4.30992285e+06, -7.45058060e-09, 2.23517418e-08, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, -7.45058060e-09, 2.17117691e+09, -4.76837158e-07, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 2.23517418e-08, -4.76837158e-07, 2.17117691e+09, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]), - np.array([[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 4.30992285e+06, -7.45058060e-09, 2.23517418e-08, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, -7.45058060e-09, 2.17117691e+09, -4.76837158e-07, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 2.23517418e-08, -4.76837158e-07, 2.17117691e+09, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]), - np.array([[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 3.74533004e+06, -3.72529030e-09, 1.11758709e-08, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, -3.72529030e-09, -3.40662111e+08, -1.19209290e-07, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 1.11758709e-08, -1.19209290e-07, -3.40662111e+08, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]), -] - -desired_W_hydro = [ - np.array([ 0.00000000e+00, 0.00000000e+00, 8.07357058e+07, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]), - np.array([ 0.00000000e+00, 0.00000000e+00, 1.92243134e+08, 2.38418579e-07, -3.57627869e-07, 0.00000000e+00]), - np.array([ 0.00000000e+00, 0.00000000e+00, 1.92243134e+08, 2.38418579e-07, -3.57627869e-07, 0.00000000e+00]), - np.array([ 0.00000000e+00, 0.00000000e+00, 1.36316588e+08, 2.38418579e-07, -2.38418579e-07, 0.00000000e+00]), -] - - -# Hydrodynamic quantities -desired_A_hydro_morison = [ - np.array([[ 8.22881104e+06, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -5.10692712e+08, 0.00000000e+00], - [ 0.00000000e+00, 8.22881104e+06, 0.00000000e+00, 5.10692712e+08, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 2.23242607e+05, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 5.10692712e+08, 0.00000000e+00, 4.09467123e+10, 0.00000000e+00, 0.00000000e+00], - [ -5.10692712e+08, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 4.09467123e+10, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]), - np.array([[ 1.23332103e+07, 4.65661287e-10, 0.00000000e+00, 7.45058060e-09, -1.54950929e+08, -2.98023224e-08], - [ 4.65661287e-10, 1.23332103e+07, -2.58493941e-26, 1.54950929e+08, -7.45058060e-09, 7.45058060e-08], - [ 0.00000000e+00, -2.58493941e-26, 1.09392236e+07, 1.49011612e-08, -1.49011612e-08, -9.18354962e-41], - [ 7.45058060e-09, 1.54950929e+08, 1.49011612e-08, 7.44302567e+09, 3.57627869e-07, 9.53674316e-07], - [ -1.54950929e+08, -7.45058060e-09, -1.49011612e-08, 3.57627869e-07, 7.44302567e+09, 4.76837158e-07], - [ -2.98023224e-08, 7.45058060e-08, -9.18354962e-41, 8.34465027e-07, 4.76837158e-07, 2.39620560e+10]]), - np.array([[ 1.23332103e+07, 4.65661287e-10, 0.00000000e+00, 7.45058060e-09, -1.54950929e+08, -2.98023224e-08], - [ 4.65661287e-10, 1.23332103e+07, -2.58493941e-26, 1.54950929e+08, -7.45058060e-09, 7.45058060e-08], - [ 0.00000000e+00, -2.58493941e-26, 1.09392236e+07, 1.49011612e-08, -1.49011612e-08, -9.18354962e-41], - [ 7.45058060e-09, 1.54950929e+08, 1.49011612e-08, 7.44302567e+09, 3.57627869e-07, 9.53674316e-07], - [ -1.54950929e+08, -7.45058060e-09, -1.49011612e-08, 3.57627869e-07, 7.44302567e+09, 4.76837158e-07], - [ -2.98023224e-08, 7.45058060e-08, -9.18354962e-41, 8.34465027e-07, 4.76837158e-07, 2.39620560e+10]]), - np.array([[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]) -] - -desired_current_drag = [ - np.array([1.66747692e+06, 4.46799093e+05, 0.0e+00, 2.67342887e+07, -9.97737237e+07, 0.0e+00]), - np.array([2.64655964e+06, 6.47726496e+05, 7.60648090e-27, 8.77357984e+06, -3.65254345e+07, 1.15751779e+07]), - np.array([2.64655964e+06, 6.47726496e+05, 7.60648090e-27, 8.77357984e+06, -3.65254345e+07, 1.15751779e+07]), - np.array([1.33618347e+06, 3.58029281e+05, 0.00000000e+00, 4.22548271e+06, -1.57697162e+07, -3.72529030e-09]), -] - ''' Aux functions ''' @@ -236,7 +44,7 @@ def create_fowt(file): design['platform']['hydroPath'] = os.path.join(current_dir, test_dir, design['platform']['hydroPath']) fowt = raft.Model(design).fowtList[0] - fowt.setPosition(np.zeros(6)) + fowt.setPosition(np.zeros(fowt.nDOF)) fowt.calcStatics() return fowt @@ -252,28 +60,52 @@ def index_and_fowt(request): ''' Test functions ''' -def test_statics(index_and_fowt): - index, fowt = index_and_fowt - - # Structure related quantities - assert_allclose(fowt.rCG, desired_rCG[index], rtol=1e-05, atol=1e-3) - assert_allclose(fowt.rCG_sub, desired_rCG_sub[index], rtol=1e-05, atol=1e-3) - assert_allclose(fowt.m_ballast, desired_m_ballast[index], rtol=1e-05, atol=1e-3) - assert_allclose(fowt.M_struc, desired_M_struc[index], rtol=1e-05, atol=1e-3) - assert_allclose(fowt.M_struc_sub, desired_M_struc_sub[index], rtol=1e-05, atol=1e-3) - assert_allclose(fowt.C_struc, desired_C_struc[index], rtol=1e-05, atol=1e-3) - assert_allclose(fowt.W_struc, desired_W_struc[index], rtol=1e-05, atol=1e-3) +def test_statics(index_and_fowt, flagSaveValues=False): + index, fowt = index_and_fowt + true_values_file = list_files[index].replace('.yaml', '_true_statics.pkl') + + # Values that were computed by current RAFT + computed_values = { + 'rCG': fowt.rCG, + 'rCG_sub': fowt.rCG_sub, + 'm_ballast': fowt.m_ballast, + 'M_struc': fowt.M_struc, + 'M_struc_sub': fowt.M_struc_sub, + 'C_struc': fowt.C_struc, + 'W_struc': fowt.W_struc, + 'rCB': fowt.rCB, + 'C_hydro': fowt.C_hydro, + 'W_hydro': fowt.W_hydro, + } + + if flagSaveValues: # Save computed values as true values + with open(true_values_file, 'wb') as f: + pickle.dump(computed_values, f) + else: # Load true values and compare + with open(true_values_file, 'rb') as f: + true_values = pickle.load(f) - # Hydrostatic quantities - assert_allclose(fowt.rCB, desired_rCB[index], rtol=1e-05, atol=1e-3) - assert_allclose(fowt.C_hydro, desired_C_hydro[index], rtol=1e-05, atol=1e-3) - assert_allclose(fowt.W_hydro, desired_W_hydro[index], rtol=1e-05, atol=1e-3) + for key in computed_values: + assert_allclose(computed_values[key], true_values[key], rtol=1e-5, atol=1e-3) -def test_hydroConstants(index_and_fowt): +def test_hydroConstants(index_and_fowt, flagSaveValues=False): index, fowt = index_and_fowt - fowt.calcHydroConstants() - assert_allclose(fowt.A_hydro_morison, desired_A_hydro_morison[index], rtol=1e-05, atol=1e-3) + true_values_file = list_files[index].replace('.yaml', '_true_hydroConstants.pkl') + + fowt.calcHydroConstants() + computed_values = { + 'A_hydro_morison': fowt.A_hydro_morison, + } + + if flagSaveValues: + with open(true_values_file, 'wb') as f: + pickle.dump(computed_values, f) + else: + with open(true_values_file, 'rb') as f: + true_values = pickle.load(f) + for key in computed_values: + assert_allclose(computed_values[key], true_values[key], rtol=1e-5, atol=1e-3) def test_hydroExcitation(index_and_fowt, flagSaveValues=False): @@ -314,6 +146,7 @@ def test_hydroExcitation(index_and_fowt, flagSaveValues=False): with open(true_values_file, 'wb') as f: pickle.dump(output_true_values, f) + def test_hydroLinearization(index_and_fowt, flagSaveValues=False): # Set flagSaveValues to true to replace the true values file with the values calculated below index, fowt = index_and_fowt @@ -322,7 +155,7 @@ def test_hydroLinearization(index_and_fowt, flagSaveValues=False): testCase = {'wave_spectrum': 'unit', 'wave_heading': 0, 'wave_period': 10, 'wave_height': 2} # Currently we need to specify wave period and height, even though they are not used for unit spectrum fowt.calcHydroExcitation(testCase, memberList=fowt.memberList) # Need wave kinematics - phase_array = np.linspace(0, 2 * np.pi, fowt.nw * 6).reshape(6, fowt.nw) # Needed an arbitrary motion amplitude. Assuming uniform amplitude with phases linearly spaced between 0 and 2pi. Times 6 for surge, sway, ..., yaw + phase_array = np.linspace(0, 2 * np.pi, fowt.nw * fowt.nDOF).reshape(fowt.nDOF, fowt.nw) # Needed an arbitrary motion amplitude. Assuming uniform amplitude with phases linearly spaced between 0 and 2pi. Times 6 for surge, sway, ..., yaw Xi = 0.1*np.exp(1j * phase_array) B_hydro_drag = fowt.calcHydroLinearization(Xi) F_hydro_drag = fowt.calcDragExcitation(0) @@ -341,12 +174,20 @@ def test_hydroLinearization(index_and_fowt, flagSaveValues=False): # Check the linearized drag excitation assert_allclose(F_hydro_drag, true_values['F_hydro_drag'], rtol=1e-05) -def test_calcCurrentLoads(index_and_fowt): - index, fowt = index_and_fowt - testCase = {'current_speed': 2.0, 'current_heading':15} + +def test_calcCurrentLoads(index_and_fowt, flagSaveValues=False): + index, fowt = index_and_fowt + true_values_file = list_files[index].replace('.yaml', '_true_calcCurrentLoads.pkl') + testCase = {'current_speed': 2.0, 'current_heading': 15} D = fowt.calcCurrentLoads(testCase) - assert_allclose(D, desired_current_drag[index], rtol=1e-05, atol=1e-3) + if flagSaveValues: + with open(true_values_file, 'wb') as f: + pickle.dump(D, f) + else: + with open(true_values_file, 'rb') as f: + true_D = pickle.load(f) + assert_allclose(D, true_D, rtol=1e-5, atol=1e-3) def test_calcQTF_slenderBody(index_and_fowt, flagSaveValues=False): # Set flagSaveValues to true to replace the true values file with the values calculated below @@ -405,28 +246,28 @@ def test_calcBEM(index_and_fowt, flagSaveValues=False): ''' - To run as a script. Useful for debugging. + To run as a script. Useful for debugging and updating true values when needed. ''' if __name__ == "__main__": - index = 0 - - fowt = create_fowt(list_files[index]) - test_statics((index,fowt)) - - fowt = create_fowt(list_files[index]) - test_hydroConstants((index,fowt)) + flagSaveValues = False + for index in range(len(list_files)): + fowt = create_fowt(list_files[index]) + test_statics((index,fowt), flagSaveValues=flagSaveValues) + + fowt = create_fowt(list_files[index]) + test_hydroConstants((index,fowt), flagSaveValues=flagSaveValues) - fowt = create_fowt(list_files[index]) - test_hydroExcitation((index,fowt), flagSaveValues=False) + fowt = create_fowt(list_files[index]) + test_hydroExcitation((index,fowt), flagSaveValues=flagSaveValues) - fowt = create_fowt(list_files[index]) - test_hydroLinearization((index,fowt), flagSaveValues=False) + fowt = create_fowt(list_files[index]) + test_hydroLinearization((index,fowt), flagSaveValues=flagSaveValues) - fowt = create_fowt(list_files[index]) - test_calcCurrentLoads((index,fowt)) + fowt = create_fowt(list_files[index]) + test_calcCurrentLoads((index,fowt), flagSaveValues=flagSaveValues) - fowt = create_fowt(list_files[index]) - test_calcQTF_slenderBody((index,fowt), flagSaveValues=False) + fowt = create_fowt(list_files[index]) + test_calcQTF_slenderBody((index,fowt), flagSaveValues=flagSaveValues) - fowt = create_fowt(list_files[index]) - test_calcBEM((index,fowt), flagSaveValues=False) + fowt = create_fowt(list_files[index]) + test_calcBEM((index,fowt), flagSaveValues=flagSaveValues) diff --git a/tests/test_member.py b/tests/test_member.py index ec8462c2..20c4fcfd 100644 --- a/tests/test_member.py +++ b/tests/test_member.py @@ -29,6 +29,8 @@ 'mem_subm_horz_rect_cyl.yaml', 'mem_srf_vert_tap_circ_cyl.yaml', 'mem_srf_vert_tap_rect_cyl.yaml', + 'mem_circular_beam.yaml', + 'mem_rectangular_beam.yaml', ] # Get the directory of the current file @@ -59,13 +61,11 @@ [4.32731250e+05, 7.794637500e+05, -10.381539, 0 , -20.00000], [2.96708699e+05, 2.074252114e+06, 0.00000000, 0 , -15.51393], [3.10357186e+05, 7.464875164e+05, 0.00000000, 0 , -14.58884], + [2.12560159e+04, 0.000000000e+00, 20.000000, 0 , -20.00000], + [3.38640000e+04, 0.00000000e+00, 20.000000, 0 , -20.00000] ] - - - -# 6x6 inertia matrix wrt to (0,0,0) -# Total value (sum of shell and ballast) +# Member inertia matrix (including shell and ballast) desired_inertiaMatrix = [ np.array([[ 2.73373097e+06, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -4.01212027e+07, 0.00000000e+00], [ 0.00000000e+00, 2.73373097e+06, 0.00000000e+00, 4.01212027e+07, 0.00000000e+00, 0.00000000e+00], @@ -127,28 +127,194 @@ [ 0.00000000e+00, 1.54181373e+07, 0.00000000e+00, 3.01375065e+08, 0.00000000e+00, 0.00000000e+00], [ -1.54181373e+07, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 3.06203665e+08, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 1.15631538e+07]]), + np.array([[ 3.54266932e+03, 0.00000000e+00, -2.42683921e-13, 0.00000000e+00, 6.83377971e-13, 0.00000000e+00, 1.77133466e+03, 0.00000000e+00, -8.27049770e-14, 0.00000000e+00, -4.01251689e-13, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 3.96332920e+03, 0.00000000e+00, -6.83377971e-13, 0.00000000e+00, 1.11604092e+04, 0.00000000e+00, 1.35067478e+03, 0.00000000e+00, 4.01251689e-13, 0.00000000e+00, -6.55293737e+03, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ -2.42683921e-13, 0.00000000e+00, 3.96332920e+03, 0.00000000e+00, -1.11604092e+04, 0.00000000e+00, -8.27049770e-14, 0.00000000e+00, 1.35067478e+03, 0.00000000e+00, 6.55293737e+03, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, -6.83377971e-13, 0.00000000e+00, 3.50741976e+03, 0.00000000e+00, -2.52210701e-12, 0.00000000e+00, -4.01251689e-13, 0.00000000e+00, 1.75370988e+03, 0.00000000e+00, 1.87010351e-12, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 6.83377971e-13, 0.00000000e+00, -1.11604092e+04, 0.00000000e+00, 4.11891333e+04, 0.00000000e+00, 4.01251689e-13, 0.00000000e+00, -6.55293737e+03, 0.00000000e+00, -3.05411080e+04, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 1.11604092e+04, 0.00000000e+00, -2.52210701e-12, 0.00000000e+00, 4.11891333e+04, 0.00000000e+00, 6.55293737e+03, 0.00000000e+00, 1.87010351e-12, 0.00000000e+00, -3.05411080e+04, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 1.77133466e+03, 0.00000000e+00, -8.27049770e-14, 0.00000000e+00, 4.01251689e-13, 0.00000000e+00, 7.08533863e+03, 0.00000000e+00, -4.85367842e-13, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 1.77133466e+03, 0.00000000e+00, -8.27049770e-14, 0.00000000e+00, -4.01251689e-13, 0.00000000e+00], + [ 0.00000000e+00, 1.35067478e+03, 0.00000000e+00, -4.01251689e-13, 0.00000000e+00, 6.55293737e+03, 0.00000000e+00, 7.92665840e+03, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 1.35067478e+03, 0.00000000e+00, 4.01251689e-13, 0.00000000e+00, -6.55293737e+03], + [ -8.27049770e-14, 0.00000000e+00, 1.35067478e+03, 0.00000000e+00, -6.55293737e+03, 0.00000000e+00, -4.85367842e-13, 0.00000000e+00, 7.92665840e+03, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -8.27049770e-14, 0.00000000e+00, 1.35067478e+03, 0.00000000e+00, 6.55293737e+03, 0.00000000e+00], + [ 0.00000000e+00, 4.01251689e-13, 0.00000000e+00, 1.75370988e+03, 0.00000000e+00, 1.87010351e-12, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 7.01483951e+03, 0.00000000e+00, -5.04421402e-12, 0.00000000e+00, -4.01251689e-13, 0.00000000e+00, 1.75370988e+03, 0.00000000e+00, 1.87010351e-12], + [ -4.01251689e-13, 0.00000000e+00, 6.55293737e+03, 0.00000000e+00, -3.05411080e+04, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 8.23782665e+04, 0.00000000e+00, 4.01251689e-13, 0.00000000e+00, -6.55293737e+03, 0.00000000e+00, -3.05411080e+04, 0.00000000e+00], + [ 0.00000000e+00, -6.55293737e+03, 0.00000000e+00, 1.87010351e-12, 0.00000000e+00, -3.05411080e+04, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -5.04421402e-12, 0.00000000e+00, 8.23782665e+04, 0.00000000e+00, 6.55293737e+03, 0.00000000e+00, 1.87010351e-12, 0.00000000e+00, -3.05411080e+04], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 1.77133466e+03, 0.00000000e+00, -8.27049770e-14, 0.00000000e+00, 4.01251689e-13, 0.00000000e+00, 3.54266932e+03, 0.00000000e+00, -2.42683921e-13, 0.00000000e+00, -6.83377971e-13, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 1.35067478e+03, 0.00000000e+00, -4.01251689e-13, 0.00000000e+00, 6.55293737e+03, 0.00000000e+00, 3.96332920e+03, 0.00000000e+00, 6.83377971e-13, 0.00000000e+00, -1.11604092e+04], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -8.27049770e-14, 0.00000000e+00, 1.35067478e+03, 0.00000000e+00, -6.55293737e+03, 0.00000000e+00, -2.42683921e-13, 0.00000000e+00, 3.96332920e+03, 0.00000000e+00, 1.11604092e+04, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 4.01251689e-13, 0.00000000e+00, 1.75370988e+03, 0.00000000e+00, 1.87010351e-12, 0.00000000e+00, 6.83377971e-13, 0.00000000e+00, 3.50741976e+03, 0.00000000e+00, -2.52210701e-12], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -4.01251689e-13, 0.00000000e+00, 6.55293737e+03, 0.00000000e+00, -3.05411080e+04, 0.00000000e+00, -6.83377971e-13, 0.00000000e+00, 1.11604092e+04, 0.00000000e+00, 4.11891333e+04, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -6.55293737e+03, 0.00000000e+00, 1.87010351e-12, 0.00000000e+00, -3.05411080e+04, 0.00000000e+00, -1.11604092e+04, 0.00000000e+00, -2.52210701e-12, 0.00000000e+00, 4.11891333e+04]]), + np.array([[ 5.64400000e+03, 0.00000000e+00, -3.85753084e-13, 0.00000000e+00, 1.08725866e-12, 0.00000000e+00, 2.82200000e+03, 0.00000000e+00, -1.32639906e-13, 0.00000000e+00, -6.40717978e-13, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 6.38321298e+03, 0.00000000e+00, -1.09576863e-12, 0.00000000e+00, 1.78952597e+04, 0.00000000e+00, 2.08278702e+03, 0.00000000e+00, 6.32208006e-13, 0.00000000e+00, -1.03247403e+04, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ -3.85753084e-13, 0.00000000e+00, 6.29982594e+03, 0.00000000e+00, -1.77562813e+04, 0.00000000e+00, -1.32639906e-13, 0.00000000e+00, 2.16617406e+03, 0.00000000e+00, 1.04637187e+04, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, -1.09576863e-12, 0.00000000e+00, 1.16646429e+04, 0.00000000e+00, -4.20597785e-12, 0.00000000e+00, -6.32208006e-13, 0.00000000e+00, 5.83232147e+03, 0.00000000e+00, 3.02632490e-12, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 1.08725866e-12, 0.00000000e+00, -1.77562813e+04, 0.00000000e+00, 6.49827404e+04, 0.00000000e+00, 6.40717978e-13, 0.00000000e+00, -1.04637187e+04, 0.00000000e+00, -4.84971137e+04, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 1.78952597e+04, 0.00000000e+00, -4.20597785e-12, 0.00000000e+00, 6.86888311e+04, 0.00000000e+00, 1.03247403e+04, 0.00000000e+00, 3.02632490e-12, 0.00000000e+00, -4.94236363e+04, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 2.82200000e+03, 0.00000000e+00, -1.32639906e-13, 0.00000000e+00, 6.40717978e-13, 0.00000000e+00, 1.12880000e+04, 0.00000000e+00, -7.71506168e-13, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 2.82200000e+03, 0.00000000e+00, -1.32639906e-13, 0.00000000e+00, -6.40717978e-13, 0.00000000e+00], + [ 0.00000000e+00, 2.08278702e+03, 0.00000000e+00, -6.32208006e-13, 0.00000000e+00, 1.03247403e+04, 0.00000000e+00, 1.27664260e+04, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 2.08278702e+03, 0.00000000e+00, 6.32208006e-13, 0.00000000e+00, -1.03247403e+04], + [ -1.32639906e-13, 0.00000000e+00, 2.16617406e+03, 0.00000000e+00, -1.04637187e+04, 0.00000000e+00, -7.71506168e-13, 0.00000000e+00, 1.25996519e+04, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -1.32639906e-13, 0.00000000e+00, 2.16617406e+03, 0.00000000e+00, 1.04637187e+04, 0.00000000e+00], + [ 0.00000000e+00, 6.32208006e-13, 0.00000000e+00, 5.83232147e+03, 0.00000000e+00, 3.02632490e-12, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 2.33292859e+04, 0.00000000e+00, -8.41195571e-12, 0.00000000e+00, -6.32208006e-13, 0.00000000e+00, 5.83232147e+03, 0.00000000e+00, 3.02632490e-12], + [ -6.40717978e-13, 0.00000000e+00, 1.04637187e+04, 0.00000000e+00, -4.84971137e+04, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 1.29965481e+05, 0.00000000e+00, 6.40717978e-13, 0.00000000e+00, -1.04637187e+04, 0.00000000e+00, -4.84971137e+04, 0.00000000e+00], + [ 0.00000000e+00, -1.03247403e+04, 0.00000000e+00, 3.02632490e-12, 0.00000000e+00, -4.94236363e+04, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -8.41195571e-12, 0.00000000e+00, 1.37377662e+05, 0.00000000e+00, 1.03247403e+04, 0.00000000e+00, 3.02632490e-12, 0.00000000e+00, -4.94236363e+04], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 2.82200000e+03, 0.00000000e+00, -1.32639906e-13, 0.00000000e+00, 6.40717978e-13, 0.00000000e+00, 5.64400000e+03, 0.00000000e+00, -3.85753084e-13, 0.00000000e+00, -1.08725866e-12, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 2.08278702e+03, 0.00000000e+00, -6.32208006e-13, 0.00000000e+00, 1.03247403e+04, 0.00000000e+00, 6.38321298e+03, 0.00000000e+00, 1.09576863e-12, 0.00000000e+00, -1.78952597e+04], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -1.32639906e-13, 0.00000000e+00, 2.16617406e+03, 0.00000000e+00, -1.04637187e+04, 0.00000000e+00, -3.85753084e-13, 0.00000000e+00, 6.29982594e+03, 0.00000000e+00, 1.77562813e+04, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 6.32208006e-13, 0.00000000e+00, 5.83232147e+03, 0.00000000e+00, 3.02632490e-12, 0.00000000e+00, 1.09576863e-12, 0.00000000e+00, 1.16646429e+04, 0.00000000e+00, -4.20597785e-12], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -6.40717978e-13, 0.00000000e+00, 1.04637187e+04, 0.00000000e+00, -4.84971137e+04, 0.00000000e+00, -1.08725866e-12, 0.00000000e+00, 1.77562813e+04, 0.00000000e+00, 6.49827404e+04, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -1.03247403e+04, 0.00000000e+00, 3.02632490e-12, 0.00000000e+00, -4.94236363e+04, 0.00000000e+00, -1.78952597e+04, 0.00000000e+00, -4.20597785e-12, 0.00000000e+00, 6.86888311e+04]]) ] -# Some hydrostatic quantities -# Fvec[2], Fvec[3], Fvec[4], Cmat[2,2], Cmat[3,3], Cmat[4,4], r_center[0], r_center[1], r_center[2], xWP, yWP -# Other hydrostatic values, such as AWP and IWP, are directly included in the others -desired_hydrostatics = [ - [1.53244611e+07, 0.00000000e+00, 0.00000000e+00, 7.6622305e+05, -1.48598306e+08, -1.48598306e+08, 0.00000000, 0.00000000, -10.000000, 0 , 0 ], - [1.18853055e+07, 0.00000000e+00, 0.00000000e+00, 5.9426527e+05, -1.17070259e+08, -1.14048296e+08, 0.00000000, 0.00000000, -10.000000, 0 , 0 ], - [1.53248823e+07, 0.00000000e+00, 1.49977968e+08, 8.8475737e+05, -1.28074838e+08, -1.28074838e+08, -4.99987628, 0.00000000, -8.660500, 2.47e-04, 0 ], - [1.18856322e+07, 0.00000000e+00, 1.18856322e+08, 6.8619781e+05, -1.01598418e+08, -9.81307590e+07, -4.99987628, 0.00000000, -8.660500, 2.47e-04, 0 ], - [1.53244590e+07, 6.49309773e+07, 1.87440769e+08, 1.0216306e+06, -1.10287138e+08, -1.10287138e+08, -6.25000000, 2.16504286, -7.500000, 0 , -1.428571e-05], - [1.18853038e+07, 5.14645542e+07, 1.48566298e+08, 7.9235359e+05, -8.77296079e+07, -8.47423685e+07, -6.25000000, 2.16504285, -7.500000, 0 , -1.428571e-05], - [2.68178069e+07, 0.00000000e+00, 0.00000000e+00, 0.0000000e+00, -5.36356138e+08, -5.36356138e+08, 0.00000000, 0.00000000, -20.000000, 0 , 0 ], - [2.07992846e+07, 0.00000000e+00, 0.00000000e+00, 0.0000000e+00, -4.15985692e+08, -4.15985692e+08, 0.00000000, 0.00000000, -20.000000, 0 , 0 ], - [1.17548315e+07, 0.00000000e+00, 0.00000000e+00, 4.2580711e+05, -1.27460608e+08, -1.27460608e+08, 0.00000000, 0.00000000, -10.965322, 0 , 0 ], - [9.31432035e+06, 0.00000000e+00, 0.00000000e+00, 3.4807582e+05, -1.00704868e+08, -9.97855691e+07, 0.00000000, 0.00000000, -10.881043, 0 , 0 ], +# Hydrostatic quantities +# Fvec, Cmat, r_center, xWP, yWP. Other hydrostatic values, such as AWP and IWP, are directly included in the others +desired_hydrostatics_Fvec = [ + np.array([ 0.00000000e+00, 0.00000000e+00, 1.53244611e+07, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]), + np.array([ 0.00000000e+00, 0.00000000e+00, 1.18853055e+07, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]), + np.array([ 0.00000000e+00, 0.00000000e+00, 1.53248823e+07, 0.00000000e+00, 1.49977968e+08, 0.00000000e+00]), + np.array([ 0.00000000e+00, 0.00000000e+00, 1.18856322e+07, 0.00000000e+00, 1.18856322e+08, 0.00000000e+00]), + np.array([ 0.00000000e+00, 0.00000000e+00, 1.53244590e+07, 6.49309773e+07, 1.87440769e+08, 0.00000000e+00]), + np.array([ 0.00000000e+00, 0.00000000e+00, 1.18853039e+07, 5.14645543e+07, 1.48566298e+08, 0.00000000e+00]), + np.array([ 0.00000000e+00, 0.00000000e+00, 2.68178069e+07, 0.00000000e+00, -9.52759894e-08, 0.00000000e+00]), + np.array([ 0.00000000e+00, 0.00000000e+00, 2.07992846e+07, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]), + np.array([ 0.00000000e+00, 0.00000000e+00, 1.17548315e+07, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]), + np.array([ 0.00000000e+00, 0.00000000e+00, 9.31432035e+06, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]), + np.array([ 0.00000000e+00, 0.00000000e+00, 3.15894995e+05, 0.00000000e+00, -1.57947498e+06, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 6.31789991e+05, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 3.15894995e+05, 0.00000000e+00, 1.57947498e+06, 0.00000000e+00]), + np.array([ 0.00000000e+00, 0.00000000e+00, 4.02210000e+05, 0.00000000e+00, -2.01105000e+06, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 8.04420000e+05, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 4.02210000e+05, 0.00000000e+00, 2.01105000e+06, 0.00000000e+00]), ] +desired_hydrostatics_Cmat = [ + np.array([[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 7.66223055e+05, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -1.48598306e+08, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -1.48598306e+08, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]), + np.array([[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 5.94265275e+05, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -1.17070259e+08, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -1.14048296e+08, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]), + np.array([[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 8.84757365e+05, 0.00000000e+00, 1.89590344e+02, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -1.28074838e+08, 0.00000000e+00, 7.66225156e+07], + [ 0.00000000e+00, 0.00000000e+00, 1.89590344e+02, 0.00000000e+00, -1.28074838e+08, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]), + np.array([[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 6.86197806e+05, 0.00000000e+00, 1.47041984e+02, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -1.01598418e+08, 0.00000000e+00, 5.94266905e+07], + [ 0.00000000e+00, 0.00000000e+00, 1.47041984e+02, 0.00000000e+00, -9.81307590e+07, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]), + np.array([[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 1.02163060e+06, 1.09460436e+01, -1.36108556e-09, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 1.09460436e+01, -1.10287138e+08, 1.94440795e-14, 9.57778686e+07], + [ 0.00000000e+00, 0.00000000e+00, -1.36108556e-09, 1.94440795e-14, -1.10287138e+08, -3.31781105e+07], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]), + np.array([[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 7.92353591e+05, 8.48950393e+00, -1.05562719e-09, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 8.48950393e+00, -8.77296079e+07, 1.50803884e-14, 7.42831491e+07], + [ 0.00000000e+00, 0.00000000e+00, -1.05562719e-09, 1.50803884e-14, -8.47423685e+07, -2.57321922e+07], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]), + np.array([[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -5.36356138e+08, 0.00000000e+00, -9.52759894e-08], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -5.36356138e+08, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]), + np.array([[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -4.15985692e+08, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -4.15985692e+08, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]), + np.array([[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 4.25807113e+05, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -1.27460609e+08, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -1.27460609e+08, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]), + np.array([[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 3.48075817e+05, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -1.00704868e+08, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -9.97855691e+07, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]), + np.array([[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -1.57947498e+06, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 1.57947498e+06], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]), + np.array([[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -2.01105000e+06, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 2.01105000e+06], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]), +] + +desired_hydrostatics_r_center = [ + np.array([ 0.00000000e+00, 0.00000000e+00, -1.00000000e+01]), + np.array([ 0.00000000e+00, 0.00000000e+00, -1.00000000e+01]), + np.array([-4.99987628e+00, 0.00000000e+00, -8.66050000e+00]), + np.array([-4.99987628e+00, 0.00000000e+00, -8.66050000e+00]), + np.array([-6.25000000e+00, 2.16504286e+00, -7.50000000e+00]), + np.array([-6.25000000e+00, 2.16504286e+00, -7.50000000e+00]), + np.array([ 3.55271368e-15, 0.00000000e+00, -2.00000000e+01]), + np.array([ 0.00000000e+00, 0.00000000e+00, -2.00000000e+01]), + np.array([ 0.00000000e+00, 0.00000000e+00, -1.09653220e+01]), + np.array([ 0.00000000e+00, 0.00000000e+00, -1.08810428e+01]), + np.array([ 2.00000000e+01, 0.00000000e+00, -2.00000000e+01]), + np.array([ 2.00000000e+01, 0.00000000e+00, -2.00000000e+01]), +] + +# (xWP, yWP) +desired_hydrostatics_WP = [ + ( 0.0, 0.0), + ( 0.0, 0.0), + ( 2.47434925e-04, 0.0), + ( 2.47434925e-04, 0.0), + ( -1.77635684e-15, -1.42857143e-05), + ( -1.77635684e-15, -1.42857143e-05), + ( 0.0, 0.0), + ( 0.0, 0.0), + ( 0.0, 0.0), + ( 0.0, 0.0), + ( 0.0, 0.0), + ( 0.0, 0.0), +] # Hydrodynamic added mass matrix -# Because those are analytical values, the test cases need to have a very fine discretization (dlsMax) otherwise the moments won't match +# Because some of those are analytical values, the test cases need to have a very fine discretization (dlsMax) otherwise the moments won't match desired_Ahydro = [ np.array([[ 1.32780754e+06, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -1.32780754e+07, 0.00000000e+00], [ 0.00000000e+00, 1.32780754e+06, 0.00000000e+00, 1.32780754e+07, 0.00000000e+00, 0.00000000e+00], @@ -210,6 +376,42 @@ [ 0.00000000e+00, 1.22335478e+07, 0.00000000e+00, 1.72325946e+08, 0.00000000e+00, 0.00000000e+00], [ -1.46802574e+07, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 2.06791135e+08, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]), + np.array([[ 1.50272849e+03, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 4.10501140e-28, 0.00000000e+00, -6.70399237e-12, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 1.09484504e+05, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -6.70399237e-12, 0.00000000e+00, 1.09484504e+05, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 1.50272849e+03, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]), + np.array([[ 2.93501657e+03, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 5.22666284e-28, 0.00000000e+00, -8.53578819e-12, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 1.39400000e+05, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -8.53578819e-12, 0.00000000e+00, 1.39400000e+05, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -2.93501657e+03, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]), ] # Hydrodynamic inertial excitation matrices @@ -274,8 +476,93 @@ [ 0.00000000e+00, 2.20203860e+07, 0.00000000e+00, 3.10186702e+08, 0.00000000e+00, 0.00000000e+00], [ -2.44670956e+07, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 3.44651891e+08, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]), + np.array([[ 1.50272849e+03, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 8.93443657e-28, 0.00000000e+00, -1.45910422e-11, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 2.38289803e+05, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -1.45910422e-11, 0.00000000e+00, 2.38289803e+05, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 1.50272849e+03, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]), + np.array([[ 2.93501657e+03, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 1.13756780e-27, 0.00000000e+00, -1.85778919e-11, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 3.03400000e+05, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -1.85778919e-11, 0.00000000e+00, 3.03400000e+05, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -2.93501657e+03, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]) ] +# Structural stiffness matrix of the member. Only non-zeros for members of type 'beam' +desired_stiffnessMatrix_FE = [ + np.zeros([6,6]), + np.zeros([6,6]), + np.zeros([6,6]), + np.zeros([6,6]), + np.zeros([6,6]), + np.zeros([6,6]), + np.zeros([6,6]), + np.zeros([6,6]), + np.zeros([6,6]), + np.zeros([6,6]), + np.array([[ 6.56435785e+08, 0.00000000e+00, -5.53754870e-10, 0.00000000e+00, 5.53754870e-09, 0.00000000e+00, -6.56435785e+08, 0.00000000e+00, 5.53754870e-10, 0.00000000e+00, 5.53754870e-09, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 9.04350333e+06, 0.00000000e+00, -5.53754870e-09, 0.00000000e+00, 9.04350333e+07, 0.00000000e+00, -9.04350333e+06, 0.00000000e+00, -5.53754870e-09, 0.00000000e+00, 9.04350333e+07, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [-5.53754870e-10, 0.00000000e+00, 9.04350333e+06, 0.00000000e+00, -9.04350333e+07, 0.00000000e+00, 5.53754870e-10, 0.00000000e+00, -9.04350333e+06, 0.00000000e+00, -9.04350333e+07, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, -5.53754870e-09, 0.00000000e+00, 2.47582571e+08, 0.00000000e+00, -7.52730660e-08, 0.00000000e+00, 5.53754870e-09, 0.00000000e+00, -2.47582571e+08, 0.00000000e+00, -3.54779081e-08, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 5.53754870e-09, 0.00000000e+00, -9.04350333e+07, 0.00000000e+00, 1.22930246e+09, 0.00000000e+00, -5.53754870e-09, 0.00000000e+00, 9.04350333e+07, 0.00000000e+00, 5.79398209e+08, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 9.04350333e+07, 0.00000000e+00, -7.52730660e-08, 0.00000000e+00, 1.22930246e+09, 0.00000000e+00, -9.04350333e+07, 0.00000000e+00, -3.54779081e-08, 0.00000000e+00, 5.79398209e+08, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [-6.56435785e+08, 0.00000000e+00, 5.53754870e-10, 0.00000000e+00, -5.53754870e-09, 0.00000000e+00, 1.31287157e+09, 0.00000000e+00, -1.10750974e-09, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -6.56435785e+08, 0.00000000e+00, 5.53754870e-10, 0.00000000e+00, 5.53754870e-09, 0.00000000e+00], + [ 0.00000000e+00, -9.04350333e+06, 0.00000000e+00, 5.53754870e-09, 0.00000000e+00, -9.04350333e+07, 0.00000000e+00, 1.80870067e+07, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -9.04350333e+06, 0.00000000e+00, -5.53754870e-09, 0.00000000e+00, 9.04350333e+07], + [ 5.53754870e-10, 0.00000000e+00, -9.04350333e+06, 0.00000000e+00, 9.04350333e+07, 0.00000000e+00, -1.10750974e-09, 0.00000000e+00, 1.80870067e+07, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 5.53754870e-10, 0.00000000e+00, -9.04350333e+06, 0.00000000e+00, -9.04350333e+07, 0.00000000e+00], + [ 0.00000000e+00, -5.53754870e-09, 0.00000000e+00, -2.47582571e+08, 0.00000000e+00, -3.54779081e-08, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 4.95165142e+08, 0.00000000e+00, -1.50546132e-07, 0.00000000e+00, 5.53754870e-09, 0.00000000e+00, -2.47582571e+08, 0.00000000e+00, -3.54779081e-08], + [ 5.53754870e-09, 0.00000000e+00, -9.04350333e+07, 0.00000000e+00, 5.79398209e+08, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 2.45860492e+09, 0.00000000e+00, -5.53754870e-09, 0.00000000e+00, 9.04350333e+07, 0.00000000e+00, 5.79398209e+08, 0.00000000e+00], + [ 0.00000000e+00, 9.04350333e+07, 0.00000000e+00, -3.54779081e-08, 0.00000000e+00, 5.79398209e+08, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -1.50546132e-07, 0.00000000e+00, 2.45860492e+09, 0.00000000e+00, -9.04350333e+07, 0.00000000e+00, -3.54779081e-08, 0.00000000e+00, 5.79398209e+08], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -6.56435785e+08, 0.00000000e+00, 5.53754870e-10, 0.00000000e+00, -5.53754870e-09, 0.00000000e+00, 6.56435785e+08, 0.00000000e+00, -5.53754870e-10, 0.00000000e+00, -5.53754870e-09, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -9.04350333e+06, 0.00000000e+00, 5.53754870e-09, 0.00000000e+00, -9.04350333e+07, 0.00000000e+00, 9.04350333e+06, 0.00000000e+00, 5.53754870e-09, 0.00000000e+00, -9.04350333e+07], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 5.53754870e-10, 0.00000000e+00, -9.04350333e+06, 0.00000000e+00, 9.04350333e+07, 0.00000000e+00, -5.53754870e-10, 0.00000000e+00, 9.04350333e+06, 0.00000000e+00, 9.04350333e+07, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -5.53754870e-09, 0.00000000e+00, -2.47582571e+08, 0.00000000e+00, -3.54779081e-08, 0.00000000e+00, 5.53754870e-09, 0.00000000e+00, 2.47582571e+08, 0.00000000e+00, -7.52730660e-08], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 5.53754870e-09, 0.00000000e+00, -9.04350333e+07, 0.00000000e+00, 5.79398209e+08, 0.00000000e+00, -5.53754870e-09, 0.00000000e+00, 9.04350333e+07, 0.00000000e+00, 1.22930246e+09, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 9.04350333e+07, 0.00000000e+00, -3.54779081e-08, 0.00000000e+00, 5.79398209e+08, 0.00000000e+00, -9.04350333e+07, 0.00000000e+00, -7.52730660e-08, 0.00000000e+00, 1.22930246e+09]]), + np.array([[ 1.04580000e+09, 0.00000000e+00, -3.53225298e-10, 0.00000000e+00, 3.53225298e-09, 0.00000000e+00, -1.04580000e+09, 0.00000000e+00, 3.53225298e-10, 0.00000000e+00, 3.53225298e-09, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 4.87954493e+07, 0.00000000e+00, -2.98785954e-08, 0.00000000e+00, 4.87954493e+08, 0.00000000e+00, -4.87954493e+07, 0.00000000e+00, -2.98785954e-08, 0.00000000e+00, 4.87954493e+08, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [-3.53225298e-10, 0.00000000e+00, 5.76860689e+06, 0.00000000e+00, -5.76860689e+07, 0.00000000e+00, 3.53225298e-10, 0.00000000e+00, -5.76860689e+06, 0.00000000e+00, -5.76860689e+07, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, -2.98785954e-08, 0.00000000e+00, 2.50655261e+08, 0.00000000e+00, -4.17521025e-07, 0.00000000e+00, 2.98785954e-08, 0.00000000e+00, -2.50655261e+08, 0.00000000e+00, -1.80050883e-07, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 3.53225298e-09, 0.00000000e+00, -5.76860689e+07, 0.00000000e+00, 7.99159549e+08, 0.00000000e+00, -3.53225298e-09, 0.00000000e+00, 5.76860689e+07, 0.00000000e+00, 3.54561829e+08, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [ 0.00000000e+00, 4.87954493e+08, 0.00000000e+00, -4.17521025e-07, 0.00000000e+00, 6.81863579e+09, 0.00000000e+00, -4.87954493e+08, 0.00000000e+00, -1.80050883e-07, 0.00000000e+00, 2.94045407e+09, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [-1.04580000e+09, 0.00000000e+00, 3.53225298e-10, 0.00000000e+00, -3.53225298e-09, 0.00000000e+00, 2.09160000e+09, 0.00000000e+00, -7.06450596e-10, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -1.04580000e+09, 0.00000000e+00, 3.53225298e-10, 0.00000000e+00, 3.53225298e-09, 0.00000000e+00], + [ 0.00000000e+00, -4.87954493e+07, 0.00000000e+00, 2.98785954e-08, 0.00000000e+00, -4.87954493e+08, 0.00000000e+00, 9.75908986e+07, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -4.87954493e+07, 0.00000000e+00, -2.98785954e-08, 0.00000000e+00, 4.87954493e+08], + [ 3.53225298e-10, 0.00000000e+00, -5.76860689e+06, 0.00000000e+00, 5.76860689e+07, 0.00000000e+00, -7.06450596e-10, 0.00000000e+00, 1.15372138e+07, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 3.53225298e-10, 0.00000000e+00, -5.76860689e+06, 0.00000000e+00, -5.76860689e+07, 0.00000000e+00], + [ 0.00000000e+00, -2.98785954e-08, 0.00000000e+00, -2.50655261e+08, 0.00000000e+00, -1.80050883e-07, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 5.01310522e+08, 0.00000000e+00, -8.35042050e-07, 0.00000000e+00, 2.98785954e-08, 0.00000000e+00, -2.50655261e+08, 0.00000000e+00, -1.80050883e-07], + [ 3.53225298e-09, 0.00000000e+00, -5.76860689e+07, 0.00000000e+00, 3.54561829e+08, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 1.59831910e+09, 0.00000000e+00, -3.53225298e-09, 0.00000000e+00, 5.76860689e+07, 0.00000000e+00, 3.54561829e+08, 0.00000000e+00], + [ 0.00000000e+00, 4.87954493e+08, 0.00000000e+00, -1.80050883e-07, 0.00000000e+00, 2.94045407e+09, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -8.35042050e-07, 0.00000000e+00, 1.36372716e+10, 0.00000000e+00, -4.87954493e+08, 0.00000000e+00, -1.80050883e-07, 0.00000000e+00, 2.94045407e+09], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -1.04580000e+09, 0.00000000e+00, 3.53225298e-10, 0.00000000e+00, -3.53225298e-09, 0.00000000e+00, 1.04580000e+09, 0.00000000e+00, -3.53225298e-10, 0.00000000e+00, -3.53225298e-09, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -4.87954493e+07, 0.00000000e+00, 2.98785954e-08, 0.00000000e+00, -4.87954493e+08, 0.00000000e+00, 4.87954493e+07, 0.00000000e+00, 2.98785954e-08, 0.00000000e+00, -4.87954493e+08], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 3.53225298e-10, 0.00000000e+00, -5.76860689e+06, 0.00000000e+00, 5.76860689e+07, 0.00000000e+00, -3.53225298e-10, 0.00000000e+00, 5.76860689e+06, 0.00000000e+00, 5.76860689e+07, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -2.98785954e-08, 0.00000000e+00, -2.50655261e+08, 0.00000000e+00, -1.80050883e-07, 0.00000000e+00, 2.98785954e-08, 0.00000000e+00, 2.50655261e+08, 0.00000000e+00, -4.17521025e-07], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 3.53225298e-09, 0.00000000e+00, -5.76860689e+07, 0.00000000e+00, 3.54561829e+08, 0.00000000e+00, -3.53225298e-09, 0.00000000e+00, 5.76860689e+07, 0.00000000e+00, 7.99159549e+08, 0.00000000e+00], + [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 4.87954493e+08, 0.00000000e+00, -1.80050883e-07, 0.00000000e+00, 2.94045407e+09, 0.00000000e+00, -4.87954493e+08, 0.00000000e+00, -4.17521025e-07, 0.00000000e+00, 6.81863579e+09]]) +] ''' Aux functions @@ -316,32 +603,44 @@ def index_and_member(request): ''' def test_inertia(index_and_member): index, member = index_and_member - mass, cg, mshell, mfill, pfill = member.getInertia() + mass, cg, mshell, mfill, pfill = member.getInertia(rRP=np.zeros(3)) assert_allclose([mshell, mfill[0], cg[0], cg[1], cg[2]], desired_inertiaBasic[index], rtol=1e-05, atol=1e-5, verbose=True) assert_allclose(member.M_struc, desired_inertiaMatrix[index], rtol=1e-05, atol=0, verbose=True) def test_hydrostatics(index_and_member): index, member = index_and_member - Fvec, Cmat, _, r_center, _, _, xWP, yWP = member.getHydrostatics(rho=1025, g=9.81) - assert_allclose([Fvec[2], Fvec[3], Fvec[4], Cmat[2,2], Cmat[3,3], Cmat[4,4], r_center[0], r_center[1], r_center[2], xWP, yWP], desired_hydrostatics[index], rtol=1e-05, atol=1e-5, verbose=True) + Fvec, Cmat, _, r_center, _, _, xWP, yWP = member.getHydrostatics(rho=1025, g=9.81, rRP=np.zeros(3)) + assert_allclose(Fvec, desired_hydrostatics_Fvec[index], atol=1e-5, verbose=True) + assert_allclose(Cmat, desired_hydrostatics_Cmat[index], atol=1e-5, verbose=True) + assert_allclose(r_center, desired_hydrostatics_r_center[index], atol=1e-5, verbose=True) + assert_allclose(xWP, desired_hydrostatics_WP[index][0], atol=1e-5, verbose=True) + assert_allclose(yWP, desired_hydrostatics_WP[index][1], atol=1e-5, verbose=True) def test_hydroConstants(index_and_member): index, member = index_and_member - A_hydro, I_hydro = member.calcHydroConstants(sum_inertia=True, rho=1025, g=9.81) + A_hydro, I_hydro = member.calcHydroConstants(sum_inertia=True, rho=1025, g=9.81, r_ref=np.zeros(3)) assert_allclose(A_hydro, desired_Ahydro[index], rtol=1e-05, atol=1e-7, verbose=True) assert_allclose(I_hydro, desired_Ihydro[index], rtol=1e-05, atol=1e-7, verbose=True) +def test_StiffnessMatrix_FE(index_and_member): + index, member = index_and_member + Kf = member.computeStiffnessMatrix_FE() + assert_allclose(Kf, desired_stiffnessMatrix_FE[index], rtol=1e-05, atol=1e-7, verbose=True) + + + ''' To run as a script. Useful for debugging. ''' if __name__ == "__main__": - index = 9 + index = 0 member = create_member(list_files[index]) test_inertia((index, member)) test_hydrostatics((index, member)) test_hydroConstants((index, member)) + test_StiffnessMatrix_FE((index, member)) # This is what I used to generate the cases for inclined members # member.setPosition(r6=[0,0,0, 0, np.deg2rad(30), 0]) diff --git a/tests/test_model.py b/tests/test_model.py index eea5d436..f6dd4e59 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -20,13 +20,19 @@ 'VolturnUS-S.yaml', 'VolturnUS-S-pointInertia.yaml', 'VolturnUS-S_farm.yaml', - 'OC4semi-WAMIT_Coefs.yaml' + 'OC4semi-WAMIT_Coefs.yaml', + 'VolturnUS-S-moorMod2.yaml', + 'VolturnUS-S_farm-moorMod1.yaml', + 'VolturnUS-S-flexible.yaml', ] # Get the directory of the current file current_dir = os.path.dirname(os.path.abspath(__file__)) +# Change directory to the 'tests' folder due to yaml files that use relative paths +os.chdir(current_dir) + # To avoid problems with different platforms, get the full path of the file list_files = [os.path.join(current_dir, test_dir, file) for file in list_files] @@ -79,32 +85,44 @@ def index_and_model(request): np.array([ 1.31272840e+01, 1.07929704e+01, -5.25069310e-01, -1.83674546e-02, 3.77423342e-02, -1.08655033e-03]), np.array([ 1.31217324e+01, 1.07912647e+01, -5.39376069e-01, -1.86459740e-02, 3.82958115e-02, -1.09026120e-03]), np.array([ 1.69882548e+01, 1.12870336e+01, 6.42827048e-01, -1.52526524e-02, 3.72069073e-02, -3.12853601e-02, 1.61833872e+03, 1.18776426e+01, 1.01629342e+00, -1.53239021e-02, 3.85069420e-02, 5.00848007e-02]), - np.array([ 4.40156080e+00, 3.10317400e+00, -2.06683747e-01, -1.45699889e-02, 2.77354876e-02, -8.23131250e-04]) + np.array([ 4.40156080e+00, 3.10317400e+00, -2.06683747e-01, -1.45699889e-02, 2.77354876e-02, -8.23131250e-04]), + np.array([ 1.39227470e+01, 1.17230528e+01, -3.95356509e-01, -1.85235329e-02, 3.81482849e-02, -6.05154656e-04]), + np.array([ 1.69882548e+01, 1.12870336e+01, 6.42827048e-01, -1.52526524e-02, 3.72069073e-02, -3.12853601e-02, 1.61833872e+03, 1.18776426e+01, 1.01629342e+00, -1.53239021e-02, 3.85069420e-02, 5.00848007e-02]), + np.array([ 1.32671572e+01, 1.09164076e+01, -9.85707428e-01, -1.63068292e-02, 3.38604795e-02, -1.04893762e-03]), ], 'wave': [ np.array([-1.64267049e-05, -2.83795893e-15, -6.65861624e-01, 3.88717546e-19, -5.94238978e-11, -4.02571352e-17]), np.array([ 4.27925162e-01, -9.00035158e-17, -4.51814991e-01, -5.63389767e-18, -2.54250076e-02, -1.07219357e-22]), np.array([ 4.34028448e-01, 1.29311805e-15, -4.66112782e-01, 8.09445578e-17, -2.58031212e-02, 1.54046523e-21]), np.array([-3.28437405e-01, 1.37380291e-15, 8.59345726e-01, 6.09528763e-17, -2.31870486e-02, 9.89478513e-19, 1.60065726e+03, 9.12847486e-16, 8.59907935e-01, 3.91868383e-17, -2.40815624e-02, -8.63499424e-19]), - np.array([-1.72715184e-03, -1.57518810e-16, -1.94361922e-01, 1.07116427e-16, -7.10621656e-08, 1.63094600e-21]) + np.array([-1.72715184e-03, -1.57518810e-16, -1.94361922e-01, 1.07116427e-16, -7.10621656e-08, 1.63094600e-21]), + np.array([ 3.96094698e-01, 2.23346173e-13, -3.19515173e-01, -1.67920344e-16, -2.56237326e-02, -2.52196978e-15]), + np.array([-3.28437405e-01, 1.37380291e-15, 8.59345726e-01, 6.09528763e-17, -2.31870486e-02, 9.89478513e-19, 1.60065726e+03, 9.12847486e-16, 8.59907935e-01, 3.91868383e-17, -2.40815624e-02, -8.63499424e-19]), + np.array([ 3.95574228e-01, -2.14947913e-10, -9.11283754e-01, -2.56570154e-13, -2.34275902e-02, 1.24718855e-12]), ], 'current': [ np.array([ 3.86072176e+00, 9.22694246e-01, -6.74898762e-01, -2.64759824e-04, 9.82529767e-04, -1.03532699e-05]), np.array([ 3.46491856e+00, 8.10382757e-01, -4.53718903e-01, 6.48535991e-04, -2.79078335e-02, 3.71621922e-03]), np.array([ 3.47177656e+00, 8.10749061e-01, -4.68029699e-01, 6.58432223e-04, -2.83226533e-02, 3.71570242e-03]), np.array([ 3.43402590e+00, 1.08780658e+00, 8.19500640e-01, 7.10970656e-04, -2.47671283e-02, -5.93700672e-03, 1.60441156e+03, 1.09887425e+00, 8.99148002e-01, 7.76337021e-04, -2.58189091e-02, 6.49661703e-03]), - np.array([ 1.71117023e+00, 4.59025857e-01, -1.94362700e-01, 3.00965823e-04, -1.12322280e-03, 9.56379292e-08]) + np.array([ 1.71117023e+00, 4.59025857e-01, -1.94362700e-01, 3.00965823e-04, -1.12322280e-03, 9.56379292e-08]), + np.array([ 3.64416004e+00, 8.62769909e-01, -3.21101370e-01, 6.40903510e-04, -2.80785628e-02, 3.95648649e-03]), + np.array([ 3.43402590e+00, 1.08780658e+00, 8.19500640e-01, 7.10970656e-04, -2.47671283e-02, -5.93700672e-03, 1.60441156e+03, 1.09887425e+00, 8.99148002e-01, 7.76337021e-04, -2.58189091e-02, 6.49661703e-03]), + np.array([ 3.29983490e+00, 7.66801982e-01, -9.13027802e-01, 5.54599175e-04, -2.55836969e-02, 3.77239850e-03]), ], 'wind_wave_current': [ np.array([ 1.51631881e+01, 5.72634727e+00, -8.60169827e-01, -2.23626764e-02, 4.10513406e-02, -1.30793500e-02]), np.array([ 1.53251788e+01, 1.20396365e+01, -5.38169903e-01, -1.76586714e-02, 3.54288952e-02, 2.63027461e-03]), np.array([ 1.53208390e+01, 1.20385389e+01, -5.52477030e-01, -1.79265275e-02, 3.59462192e-02, 2.62597199e-03]), np.array([ 2.07240188e+01, 1.23286859e+01, 6.03838765e-01, -1.46117873e-02, 3.53753733e-02, -3.45751602e-02, 1.62239433e+03, 1.34043791e+01, 1.05470987e+00, -1.43695528e-02, 3.70825596e-02, 6.24445456e-02]), - np.array([ 5.85516544e+00, 3.77367023e+00, -2.09149016e-01, -1.42540233e-02, 2.66270816e-02, -8.22294356e-04]) + np.array([ 5.85516544e+00, 3.77367023e+00, -2.09149016e-01, -1.42540233e-02, 2.66270816e-02, -8.22294356e-04]), + np.array([ 1.61530311e+01, 1.31163502e+01, -4.07075794e-01, -1.83365452e-02, 3.53819236e-02, 3.37922890e-03]), + np.array([ 2.07240188e+01, 1.23286859e+01, 6.03838765e-01, -1.46117873e-02, 3.53753733e-02, -3.45751602e-02, 1.62239433e+03, 1.34043791e+01, 1.05470987e+00, -1.43695528e-02, 3.70825596e-02, 6.24445456e-02]), + np.array([ 1.53567444e+01, 1.21013753e+01, -9.98317189e-01, -1.56975988e-02, 3.18765740e-02, 2.70113634e-03]), ] } -def solveStatics(index_and_model, test_case_key): +def solveStatics(index_and_model, test_case_key, rtol=1e-05, atol=1e-10): ''' We test only the mean offsets and linearized mooring properties. ''' @@ -112,13 +130,13 @@ def solveStatics(index_and_model, test_case_key): testCase = cases4solveStatics[test_case_key] model.solveStatics(testCase) for i, fowt in enumerate(model.fowtList): - assert_allclose(fowt.r6, desired_X0[test_case_key][index][6*i:6*(i+1)], rtol=1e-05, atol=1e-10) + assert_allclose(fowt.r6, desired_X0[test_case_key][index][6*i:6*(i+1)], rtol=rtol, atol=atol) def test_solveStatics_Wind(index_and_model): solveStatics(index_and_model, 'wind') def test_solveStatics_Wave(index_and_model): - solveStatics(index_and_model, 'wave') + solveStatics(index_and_model, 'wave', rtol=1e-05, atol=1e-8) def test_solveStatics_Current(index_and_model): solveStatics(index_and_model, 'current') @@ -140,14 +158,20 @@ def test_solveStatics_Wind_Wave_Current(index_and_model): np.array([0.00782180, 0.00779927, 0.06073036, 0.03829455, 0.03823218, 0.01238992]), np.array([0.00782029, 0.00779718, 0.06072388, 0.03804270, 0.03797990, 0.01238741]), np.array([0.01074526, 0.00704213, 0.05083874, 0.03718830, 0.03746220, 0.01573330, 0.00756069, 0.00716294, 0.05085846, 0.03718910, 0.03751292, 0.01545850]), - np.array([0.00884301, 0.00884300, 0.05733308, 0.04002449, 0.04003508, 0.01253087]) + np.array([0.00884301, 0.00884300, 0.05733308, 0.04002449, 0.04003508, 0.01253087]), + np.array([0.00767804, 0.00770107, 0.06063555, 0.03809081, 0.03801947, 0.01303503]), + np.array([0.01074526, 0.00704213, 0.05083874, 0.03718830, 0.03746220, 0.01573330, 0.00756069, 0.00716294, 0.05085846, 0.03718910, 0.03751292, 0.01545850]), + np.array([0.00841995, 0.00843999, 0.01358328, 0.0374836 , 0.03753538, 0.04995812, 0.43542245, 0.43659318, 1.16944889, 1.43151485, 1.43158417, 1.55760813]), ], 'loaded': [ np.array([0.00730352, 0.00939103, 0.03246224, 0.03384297, 0.03390545, 0.1555763 ]), np.array([0.00987260, 0.00712184, 0.06074470, 0.03805314, 0.03879976, 0.01324559]), np.array([0.00986996, 0.00712007, 0.06073821, 0.03779950, 0.03855126, 0.01324305]), np.array([0.01065943, 0.00720493, 0.05085334, 0.03762357, 0.03800233, 0.01769749, 0.00744181, 0.00644391, 0.05081630, 0.03648770, 0.03722345, 0.01325040]), - np.array([0.01002029, 0.00813464, 0.05733435, 0.03987943, 0.04028119, 0.01279485]) + np.array([0.01002029, 0.00813464, 0.05733435, 0.03987943, 0.04028119, 0.01279485]), + np.array([0.00997641, 0.0071045 , 0.06066521, 0.03786162, 0.03862754, 0.01390027]), + np.array([0.01065943, 0.00720493, 0.05085334, 0.03762357, 0.03800233, 0.01769749, 0.00744181, 0.00644391, 0.05081630, 0.03648770, 0.03722345, 0.01325040]), + np.array([0.00768953, 0.01067194, 0.01452767, 0.03734246, 0.0379516 , 0.04997057, 0.43542912, 0.43660933, 1.16944895, 1.43151701, 1.4315858 , 1.55762490]), ], } @@ -188,8 +212,39 @@ def test_solveStatics_Wind_Wave_Current(index_and_model): [-4.79589689e-08, 2.70444234e-18, -1.00000000e+00, 2.07959698e-16, -4.33883818e-06, 6.25433752e-18], [-1.61378116e-19, 6.30844075e-04, 4.77016972e-18, 8.71943311e-02, 2.89012940e-16, -5.27335920e-06], [ 6.30831210e-04, -2.72725959e-14, -1.89622571e-06, 2.68266047e-14, -8.71968520e-02, 6.32542432e-18], - [-2.62901456e-20, 4.48568328e-07, 6.85718339e-21, 4.40899871e-06, 3.64745019e-18, 9.99999836e-01]]) + [-2.62901456e-20, 4.48568328e-07, 6.85718339e-21, 4.40899871e-06, 3.64745019e-18, 9.99999836e-01]]), + np.array([[-9.99999914e-01, 3.79770604e-09, 2.39054240e-08, -3.37209297e-08, 9.89368685e-01, -4.18664171e-11], + [ 5.77230437e-08, -9.99999914e-01, 2.18001521e-14, 9.89368668e-01, 2.23458628e-08, -1.27751517e-04], + [-1.93864229e-08, -4.39490522e-14, -1.00000000e+00, 8.48488344e-14, 1.88865447e-07, -1.81884098e-12], + [ 2.39890348e-11, -4.15559849e-04, -2.21366154e-16, -1.45429153e-01, -3.28459973e-09, -1.88169419e-07], + [ 4.15563423e-04, -1.57641191e-12, 7.97546015e-10, -4.95664284e-09, 1.45429038e-01, 8.18946003e-14], + [ 2.45738819e-14, 9.12423593e-08, 1.23331054e-15, 2.47104974e-08, 1.00392225e-14, -9.99999992e-01]]), + np.array([[-7.07063968e-01, 1.71887064e-16, -1.30340226e-02, -2.82542470e-14, 6.94863002e-01, 3.85153580e-16, 7.07066034e-01, -6.53986496e-17, 1.25007531e-02, 2.80098589e-14, 6.92313443e-01, 5.76639921e-16], + [-7.25250255e-15, 7.07099398e-01, 1.75093624e-14, -6.97995773e-01, -3.82099078e-14, 6.98639459e-01, 7.80689701e-14, -7.07100871e-01, -1.97524808e-14, 6.97890097e-01, -2.17875817e-14, 6.96282021e-01], + [ 7.78086989e-03, -1.31547996e-19, -7.06986675e-01, 3.69809461e-15, -3.37914294e-02, 1.87852753e-17, -7.58851866e-03, -1.14893765e-18, 7.06996195e-01, -3.54499811e-15, -4.84772086e-02, 1.82168142e-17], + [-4.42008293e-18, 3.85533504e-04, -1.95389309e-16, 1.13310010e-01, 6.59117155e-15, 2.20799443e-03, 4.26954391e-17, -3.95913134e-04, -2.00243504e-16, -1.13574765e-01, 3.57431861e-15, 2.50916481e-03], + [ 4.66972697e-05, -6.69897247e-19, -2.08076011e-04, -5.37783516e-15, 1.26573873e-01, -7.03266775e-19, -1.90337265e-04, 7.23965014e-19, 1.52684219e-04, 5.23638666e-15, 1.35481349e-01, -4.06301593e-18], + [ 4.59941229e-17, -3.22196475e-03, 8.14219936e-18, -2.53785685e-03, -1.51955686e-16, 1.09079638e-01, -3.47492945e-16, 2.85012022e-03, -5.76771539e-18, 2.46481410e-03, -4.41443842e-17, 1.23225467e-01], + [ 7.07063969e-01, 1.23317808e-16, 1.30340204e-02, 5.92119539e-15, 6.94866599e-01, 5.63370023e-16, 7.07066037e-01, -2.39412617e-17, 1.25007650e-02, 7.52362237e-15, -6.92309081e-01, 1.94827127e-16], + [ 8.83463633e-17, -7.07099273e-01, -2.67391452e-17, -6.97934777e-01, 8.19753287e-15, -6.98638992e-01, -9.46449353e-15, -7.07100982e-01, -4.28411155e-18, -6.97951671e-01, -9.99882707e-15, 6.96282772e-01], + [ 7.78087658e-03, 3.67247159e-19, -7.06986551e-01, 1.17996039e-15, 3.37916947e-02, 1.50031146e-18, 7.58851869e-03, -5.80489109e-19, -7.06996319e-01, 6.76458394e-16, -4.84769765e-02, 8.65225494e-18], + [ 1.23387652e-19, -3.85533550e-04, 3.22484756e-18, 1.13300083e-01, -1.34298598e-15, -2.20798839e-03, -4.64803567e-18, -3.95913299e-04, 3.40496951e-18, 1.13584760e-01, 1.62276251e-15, 2.50916234e-03], + [-4.66966628e-05, 9.52249103e-19, 2.08075991e-04, 1.35742924e-15, 1.26574617e-01, 5.81538035e-18, -1.90337282e-04, -1.14034186e-18, 1.52684170e-04, 1.19298438e-15, -1.35480553e-01, 4.27926093e-19], + [-2.06368074e-18, -3.22196433e-03, 3.25247512e-19, 2.53764084e-03, -2.87786844e-17, 1.09079545e-01, -6.15608121e-17, -2.85012079e-03, -4.84193205e-19, 2.46503742e-03, 3.86906564e-17, -1.23225573e-01]]), + np.array([[ 1.41576155e-07, -2.00918444e-01, 1.29909556e-09, 1.70033008e-02, -1.02450086e-09, -2.94141399e-04, 1.97373778e-11, 8.02689584e-02, -4.15402741e-03, -1.82415333e-01, 3.83327164e-11, 6.91974572e-02], + [ 2.00956002e-01, 3.78495737e-07, -5.57456113e-03, -1.53894066e-09, 1.72267100e-02, 3.81843636e-12, -8.19326193e-02, -2.65821145e-11, 2.15015010e-13, 1.10517773e-09, -1.82001781e-01, -2.50365836e-13], + [-1.19315725e-10, 1.49877251e-05, 5.66737766e-11, 9.46963105e-04, -4.41452470e-12, 2.00295600e-01, 7.05817009e-13, 2.24106877e-03, 2.22288302e-01, -2.01405432e-03, 4.46744285e-13, 1.23376130e-02], + [ 1.04523090e-04, 1.97400508e-10, -1.99243722e-05, 3.24126365e-10, -3.54223580e-03, 3.53194891e-12, 4.22859597e-03, 1.38406459e-12, -1.12027194e-14, 1.11740907e-11, -1.83668951e-03, 8.74587696e-15], + [-7.06961506e-11, 9.91728028e-05, -7.20127404e-13, 3.54382466e-03, -2.16813160e-10, -6.88384814e-05, 1.01662285e-12, 4.14911475e-03, -3.39654133e-04, 1.74098040e-03, -3.78635631e-13, 4.78094025e-03], + [-7.12225004e-05, -7.78000871e-11, -7.49856627e-03, -1.16956900e-11, 1.36711283e-04, -5.84453089e-13, 1.28996291e-04, 2.88723245e-14, -3.76515360e-15, 1.17028966e-14, -1.31272739e-06, -3.92248624e-16], + [ 2.80219845e-03, -2.02562926e-01, 2.95511362e-01, -4.15266150e-02, -5.35983099e-03, 8.43167690e-04, -4.32525318e-03, 1.44695848e-02, 5.07047251e-03, 2.39651924e-01, -2.66848107e-01, -2.96824544e-02], + [ 2.01063160e-01, 4.90556889e-06, -1.76516899e-01, 3.22748475e-05, -3.81265886e-02, -8.25019979e-07, -9.78465342e-03, -1.46795359e-03, -3.54438289e-04, -2.65811277e-01, -6.78818505e-02, 1.08508822e-02], + [ 4.07003986e-03, -2.21465445e-03, -7.76158728e-04, -7.89301086e-02, -1.38278330e-01, 2.00815630e-01, 2.36758275e-01, -1.31123786e-01, -2.91985520e-01, 1.09175654e-02, 1.81635098e-02, 4.06554887e-02], + [ 1.02886273e-04, 7.16286290e-07, -2.52472557e-05, 2.14549269e-05, -3.49964489e-03, -3.58621907e-05, 6.16590143e-03, -9.97134686e-04, -1.61677910e-02, 7.57405296e-03, -1.31041466e-03, 4.88698511e-03], + [ 6.64714154e-07, 9.85010576e-05, -9.86009714e-06, 3.52640540e-03, -2.15272729e-05, -4.80402024e-05, -1.04578421e-03, 4.87092852e-03, 8.98155591e-03, 9.90289859e-03, -7.58996789e-03, 3.66521026e-03], + [-7.10499884e-05, 3.06058243e-07, -7.49995792e-03, 2.41348471e-06, 1.35511597e-04, -5.99073031e-08, 9.78308517e-05, -1.00590892e-04, -1.07459259e-04, -1.78289382e-02, 1.03351468e-02, 7.01495374e-04]]), ], + 'loaded': [ np.array([[-9.64378242e-01, -2.63590752e-01, -2.10946483e-02, 6.67618956e-01, 7.11326547e-01, -3.97038343e-03], [ 2.64226439e-01, -9.64567735e-01, -1.08535955e-02, -7.44333038e-01, 7.02378251e-01, 2.46425477e-03], @@ -220,13 +275,43 @@ def test_solveStatics_Wind_Wave_Current(index_and_model): [-6.21316965e-03, -1.32552092e-03, 2.69272852e-01, -2.30252304e-03, -5.03775015e-03, 5.34681309e-04, 7.05692246e-03, -1.78745500e-03, -9.62912928e-01, 2.06635847e-02, 6.83944327e-02, 1.94739912e-04], [ 5.73877577e-05, 1.73869447e-05, 1.55155496e-05, 7.34971902e-04, 3.91788360e-04, -3.59118324e-05, -2.45527237e-04, -4.91453005e-04, -6.20538865e-05, -1.60713894e-01, 5.82005468e-02, 3.92650678e-04], [ 5.35217661e-05, 2.69720933e-05, -7.92408612e-05, 4.79170446e-03, 3.69617884e-03, -5.29046880e-05, -2.03450513e-04, -6.51449327e-05, 4.25820931e-04, 5.51040523e-02, 1.74216186e-01, -1.49517626e-03], - [ 1.48946042e-03, -4.11837504e-04, 8.78835414e-06, -1.37529855e-05, -3.50704978e-05, -6.31055822e-03, -2.13519130e-03, -5.14879469e-03, -3.15665253e-05, 1.47542156e-03, -4.49606559e-03, -1.20832552e-01]]), + [ 1.48946042e-03, -4.11837504e-04, 8.78835414e-06, -1.37529855e-05, -3.50704978e-05, -6.31055822e-03, -2.13519130e-03, -5.14879469e-03, -3.15665253e-05, 1.47542156e-03, -4.49606559e-03, -1.20832552e-01]]), np.array([[-9.77741876e-01, 2.09950631e-01, 2.76230850e-03, -2.07854275e-01, -9.75266721e-01, 2.91921676e-01], [ 2.09804600e-01, 9.77711045e-01, 1.40426339e-03, -9.74214916e-01, 2.03478512e-01, -4.06817862e-01], [ 1.42501361e-03, -1.18401614e-03, 9.99995197e-01, 2.06240846e-03, 2.64306495e-03, 2.22321096e-04], [ 1.67601140e-04, 5.28776829e-04, -2.69224911e-05, 8.58048575e-02, -1.76247510e-02, 5.11905536e-03], [ 7.73818988e-04, -1.14037326e-04, 5.77576300e-05, -1.83050449e-02, -8.44608048e-02, 2.62981713e-03], - [ 4.42085695e-04, 3.89143516e-04, -6.49296845e-07, -3.11056279e-04, 2.68359747e-04, 8.65591007e-01]]) + [ 4.42085695e-04, 3.89143516e-04, -6.49296845e-07, -3.11056279e-04, 2.68359747e-04, 8.65591007e-01]]), + np.array([[ 9.83527134e-01, 1.80471442e-01, -4.88298639e-03, 2.67841917e-01, 9.71485993e-01, 2.13527661e-01], + [-1.80718441e-01, 9.83575038e-01, -2.62565425e-03, 9.51678067e-01, -1.91950641e-01, 6.71117230e-01], + [-3.83446971e-03, -3.12533093e-03, -9.99984624e-01, -1.90981785e-02, -2.11156901e-02, -2.29339345e-02], + [-1.51458336e-04, 3.08112455e-04, 5.20907681e-05, -1.43450080e-01, 2.71268169e-02, -1.33033871e-02], + [-6.53753201e-04, -5.97874078e-05, -1.04870491e-04, 4.03330044e-02, 1.34861636e-01, -8.03162331e-03], + [ 2.62054088e-04, 5.80525403e-04, 1.95961896e-05, 3.84016717e-04, -7.20568314e-04, -7.09394213e-01]]), + np.array([[-7.72780208e-01, 1.35468412e-01, -1.77495566e-02, 4.22842581e-01, -7.32826057e-01, 1.07921591e-01, 5.95578887e-01, -1.87722800e-01, 4.79726175e-03, -1.83129519e-03, -1.72205796e-02, -1.44056530e-01], + [-2.28519471e-03, -9.77326843e-01, -1.74843237e-04, -8.88837415e-01, -6.53268410e-01, -9.54807874e-01, 2.05369622e-01, -6.41688285e-02, 3.56670017e-05, -3.02582744e-03, 2.46120155e-02, 6.30228760e-02], + [ 8.50862335e-03, -1.27740285e-03, -9.69677742e-01, -2.66634251e-02, 5.60030809e-02, -1.43192612e-02, -6.36785160e-03, 1.98135470e-03, 2.43677208e-01, -3.31096809e-03, 1.06565881e-02, 1.48729311e-03], + [-2.14147548e-07, -5.13051234e-04, 2.28569369e-05, 1.46348523e-01, 1.03860372e-01, -8.38713717e-03, 1.11521615e-04, -4.39100546e-05, -3.88676030e-06, 3.89544548e-04, -4.17391596e-03, -1.20687744e-04], + [ 3.50229130e-05, 4.81508566e-05, -2.96471440e-04, 7.95770662e-02, -1.38834167e-01, -2.81132282e-03, -2.08014641e-04, 7.50030410e-05, 1.16277632e-04, 1.13920287e-03, -7.01170226e-03, -8.83950465e-05], + [-8.25205229e-05, 2.97095677e-03, 5.83651248e-05, -4.00418833e-03, -2.30212529e-03, -2.40166282e-01, -2.55349690e-04, -1.02689336e-04, -1.45133749e-05, -7.17160421e-05, 1.72592987e-04, -3.61621868e-03], + [ 6.33918522e-01, 1.62082701e-01, -3.39536374e-03, 5.09072525e-02, -5.43724190e-02, 8.05114239e-02, 7.01183592e-01, -2.94123355e-01, -1.51879157e-02, -2.87259623e-01, 9.22402696e-01, 2.36651590e-01], + [-2.89806557e-02, -1.40197163e-02, 6.27951672e-04, -7.98679610e-03, 2.09851086e-03, 1.10471065e-01, -3.33697652e-01, -9.34933041e-01, 2.50812940e-03, -9.42830766e-01, -3.36459026e-01, -9.52181619e-01], + [ 6.12262049e-03, 1.54700079e-03, 2.43717017e-01, -2.73706238e-03, 5.41124848e-03, 7.14441628e-04, 7.03656560e-03, -1.60801493e-03, 9.69722323e-01, 6.75971380e-03, 4.42384895e-02, 4.03303739e-03], + [-7.31124374e-05, -2.43839230e-05, -2.50078305e-05, 9.22017629e-04, -4.24008169e-04, 4.83394158e-06, -2.41322773e-04, -4.82461803e-04, -9.63686678e-05, 1.57899450e-01, 5.19950014e-02, -6.52497993e-04], + [-6.60885996e-05, -3.13030222e-05, -4.59073676e-06, 5.58053584e-03, -3.54713531e-03, -2.21919732e-05, -1.89441252e-04, -6.23442736e-05, -1.80039164e-04, -5.95345943e-02, 1.73855081e-01, 1.09011091e-03], + [-1.74789101e-03, 2.81715003e-04, -9.04124903e-07, 9.27870178e-05, 1.81765117e-06, -6.72796711e-03, -2.50526577e-03, -5.23512364e-03, -4.85249735e-06, 2.19802909e-03, 1.10782634e-05, 1.12199961e-01]]), + np.array([[-3.81040996e-02, 1.97621827e-01, -1.45871193e-03, -4.29332260e-03, -1.80104226e-02, -1.56121250e-03, -3.93378943e-02, 7.04549296e-02, 3.59908280e-03, 1.53793402e-01, -9.79465299e-02, 5.98808111e-02], + [-1.97126773e-01, -3.82146039e-02, -1.13257540e-03, -1.58555043e-02, 4.79166291e-03, -8.48222556e-04, 7.18765022e-02, 3.84910422e-02, 2.07828270e-03, 9.80945355e-02, 1.53399892e-01, 3.46776167e-02], + [ 7.53010775e-04, -9.14226408e-04, -1.05509414e-05, -4.51523534e-05, -2.05037715e-05, -2.00319487e-01, 5.29084356e-05, 2.24907595e-03, -2.22287513e-01, 2.01564491e-03, -8.95233630e-05, 1.23398411e-02], + [-8.19917355e-05, -2.78150106e-05, 1.51302836e-04, 3.42912623e-03, -9.25752774e-04, -1.62109785e-05, -3.70979076e-03, -1.99002294e-03, -1.69943076e-04, 9.39982833e-04, 1.55022094e-03, -2.39582702e-03], + [ 1.36620697e-05, -1.41454799e-04, 8.76801057e-05, -9.05461866e-04, -3.41086118e-03, 2.72665904e-05, -2.02954991e-03, 3.64110666e-03, 2.94301077e-04, -1.46586778e-03, 9.84777581e-04, 4.13715703e-03], + [-3.29795324e-05, 3.54090355e-05, 7.49218991e-03, -1.19582153e-04, 1.23381033e-04, -6.59706129e-07, -1.28776067e-04, 2.89801115e-06, -7.56892355e-11, 5.94404769e-08, 1.31775461e-06, 3.24301371e-08], + [-3.70275112e-02, 1.98574509e-01, -2.98172375e-01, 1.53463358e-02, 3.34647994e-02, -1.98691381e-03, -2.65303261e-03, 1.18792410e-02, -3.68615820e-03, -5.90272482e-02, 3.54117156e-01, -2.02923900e-02], + [-1.99231621e-01, -3.78758657e-02, 1.71836367e-01, 3.80128286e-02, -7.70941631e-03, -1.12979288e-03, 8.89160437e-03, 4.90527522e-03, -1.10015692e-03, 2.60268115e-01, -8.62692649e-02, 7.13964092e-04], + [-2.75387624e-03, 1.19144983e-03, 3.91235803e-03, 1.54221687e-01, 4.07172432e-02, -2.00534690e-01, -1.42027404e-01, -2.26337540e-01, 2.97622762e-01, -1.82140470e-02, -9.68214888e-03, 7.65549587e-02], + [-8.08896956e-05, -2.81244485e-05, 1.55385552e-04, 3.38227559e-03, -9.35371198e-04, 1.96093540e-05, -4.91083319e-03, -3.78333290e-03, 1.63237954e-02, -5.66664104e-03, 5.18631945e-03, 5.77813403e-03], + [ 1.30517961e-05, -1.40786513e-04, 9.79116570e-05, -8.80083422e-04, -3.39959193e-03, 6.53932129e-06, -1.46954102e-03, 4.76398893e-03, -9.22076310e-03, -4.32314678e-03, 1.18124435e-02, 4.00577615e-04], + [-3.30784297e-05, 3.48839563e-05, 7.49385452e-03, -1.19010103e-04, 1.20897135e-04, -5.93981173e-07, -5.56355237e-05, -5.69695975e-05, 6.21806946e-05, 9.49134420e-03, -1.83382208e-02, 4.04019856e-04]]), ], } @@ -235,8 +320,8 @@ def solveEigen(index_and_model, test_case_key): testCase = cases4solveEigen[test_case_key] model.solveStatics(testCase) fns, modes = model.solveEigen() - assert_allclose(fns, desired_fn[test_case_key][index], rtol=1e-05, atol=1e-5) - # assert_allclose(modes, desired_modes[test_case_key][index], rtol=1e-05, atol=1e-5) # this one is too sensitive to machine precision because there are some very small values + assert_allclose(fns[:12], desired_fn[test_case_key][index], rtol=1e-05, atol=1e-5) # Compare the 12 first natural frequencies. That's all modes for the 2-unit array of rigid turbines and enough for the flexible tests + # assert_allclose(modes[:12, :12], desired_modes[test_case_key][index], rtol=1e-05, atol=1e-5) # this one is too sensitive to machine precision because there are some very small values def test_solveEigen_unloaded(index_and_model): solveEigen(index_and_model, 'unloaded') @@ -256,10 +341,15 @@ def test_analyzeCases(index_and_model, plotPSDs=False, flagSaveValues=False): model.analyzeCases() + computed_values = { + 'freq_rad': model.results['freq_rad'], + 'case_metrics': model.results['case_metrics'], + } + # Save or read the true values if flagSaveValues: with open(true_values_file, 'wb') as f: - pickle.dump(model.results['case_metrics'], f) + pickle.dump(computed_values, f) return # If saving, we don't need to check the results else: with open(true_values_file, 'rb') as f: @@ -271,9 +361,9 @@ def test_analyzeCases(index_and_model, plotPSDs=False, flagSaveValues=False): for ifowt in range(model.nFOWT): for imetric, metric in enumerate(metrics2check): if metric in model.results['case_metrics'][iCase][ifowt]: - assert_allclose(model.results['case_metrics'][iCase][ifowt][metric], true_values[iCase][ifowt][metric], rtol=1e-05, atol=1e-3) + assert_allclose(model.results['case_metrics'][iCase][ifowt][metric], true_values['case_metrics'][iCase][ifowt][metric], rtol=1e-05, atol=1e-3) elif 'array_mooring' in model.results['case_metrics'][iCase] and metric in model.results['case_metrics'][iCase]['array_mooring']: - assert_allclose(model.results['case_metrics'][iCase]['array_mooring'][metric], true_values[iCase]['array_mooring'][metric], rtol=1e-05, atol=1e-3) + assert_allclose(model.results['case_metrics'][iCase]['array_mooring'][metric], true_values['case_metrics'][iCase]['array_mooring'][metric], rtol=1e-05, atol=1e-3) if plotPSDs: import matplotlib.pyplot as plt @@ -281,26 +371,27 @@ def test_analyzeCases(index_and_model, plotPSDs=False, flagSaveValues=False): fig, ax = plt.subplots(3, 3, figsize=(15, 10)) for iCase in range(nCases): for imetric, metric in enumerate(metrics2check): + w_true = true_values['freq_rad'] if metric in model.results['case_metrics'][iCase][ifowt]: - y = model.results['case_metrics'][iCase][ifowt][metric] - y_true = true_values[iCase][ifowt][metric] + y = model.results['case_metrics'][iCase][ifowt][metric] + y_true = true_values['case_metrics'][iCase][ifowt][metric] elif 'array_mooring' in model.results['case_metrics'][iCase] and metric in model.results['case_metrics'][iCase]['array_mooring']: y = model.results['case_metrics'][iCase]['array_mooring'][metric] - y_true = true_values[iCase]['array_mooring'][metric] + y_true = true_values['case_metrics'][iCase]['array_mooring'][metric] if metric == 'Tmoor_PSD': if iCase == 0: fig2, ax2 = plt.subplots(y.shape[0], 1, figsize=(15, 10)) for i in range(y.shape[0]): - ax2[i].plot(model.w, y[i, :]) - ax2[i].plot(model.w, y_true[i, :], linestyle='--') + ax2[i].plot(model.w/2/np.pi, y[i, :]) + ax2[i].plot(w_true/2/np.pi, y_true[i, :], linestyle='--') ax2[i].set_ylabel(f'Line channel {i+1}') ax2[i].set_xlabel('Frequency (Hz)') ax2[0].set_title(f'{metric}') else: # assert_allclose(model.results['case_metrics'][iCase][ifowt][metric], true_values[idxTrueValues][ifowt][metric], rtol=1e-05, atol=1e-5) - ax[imetric//3, imetric%3].plot(model.w, y, label=f'Case {iCase+1}') - ax[imetric//3, imetric%3].plot(model.w, y_true, linestyle='--') + ax[imetric//3, imetric%3].plot(model.w/2/np.pi, y, label=f'Case {iCase+1}') + ax[imetric//3, imetric%3].plot(w_true/2/np.pi, y_true, linestyle='--') ax[imetric//3, imetric%3].set_ylabel(metric) ax[imetric//3, imetric%3].set_xlabel('Frequency (Hz)') plt.show() @@ -308,9 +399,9 @@ def test_analyzeCases(index_and_model, plotPSDs=False, flagSaveValues=False): ''' To run as a script. Useful for debugging. ''' -if __name__ == "__main__": +if __name__ == "__main__": index = 0 - + model = create_model(list_files[index]) test_solveStatics_Wind((index,model)) diff --git a/tests/test_omdao_OC3spar.py b/tests/test_omdao_OC3spar.py index c324ea98..b0a2ca66 100644 --- a/tests/test_omdao_OC3spar.py +++ b/tests/test_omdao_OC3spar.py @@ -32,6 +32,10 @@ def testSpiderRegression(self): opt['modeling']['nfreq'] = 10 opt['modeling']['n_cases'] = 2 opt['modeling']['intersection_mesh'] = 0 + opt['modeling']['floating'] = {} + opt['modeling']['floating']['rigid_bodies'] = {} + opt['modeling']['floating']['rigid_bodies']['n_bodies'] = 0 + opt['modeling']['floating']['rigid_bodies']['joint1'] = [] opt['turbine'] = {} opt['turbine']['npts'] = 11