From 2922567266ba4e46527b0330084c15d4ceec5d18 Mon Sep 17 00:00:00 2001 From: lsirkis Date: Tue, 11 Nov 2025 14:57:19 -0700 Subject: [PATCH] Integrate soil plotting features from Jun Tanemoto -- project.plot2d() overhauled to plot all soil types, be able to plot bathymetry contour lines, and mask land - These features were developed by Jun Tanemoto of Shimizu Corporation and implemented by NREL - new input options include: - plot_bathy_contours (plot bathymetry contours) - plot_landmask (plot a gray mask over land areas) - cmap_soil (string name of matplotlib colormap to represent soils (discretized by famodel) - new examples added to 01_Visualization folder to show these new capabilities -- LineDesign bug fix for suspended mooring lines - set mooring.symmetric=True - removed reset call in updateDesign for now, as this slightly slows the process and it's not currently needed (would be needed if marine growth is added though) -- Mooring bug fix reset - when re-creating subsystem, sends in correct case instead of default -- Added test for suspended mooring system in LineDesign -- commented out getSize function in anchor.py to avoid confusion (should now be using getSizeAnchor() --- .../01_Visualization/09_2D-visual_soil.py | 23 + .../01_Visualization/09_2D-visual_soil.yaml | 5 + .../10_2D-visual_soil_bathy-contours.py | 29 + .../10_2D-visual_soil_bathy-contours.yaml | 7 + .../11_2D-visual_all_options.py | 68 + .../11_2D-visual_all_options.yaml | 1424 +++++++++++++++++ examples/OntologySample200m.yaml | 10 +- famodel/anchors/anchor.py | 450 +++--- famodel/design/LineDesign.py | 17 +- famodel/mooring/mooring.py | 8 +- famodel/project.py | 95 +- tests/test_LineDesign.py | 41 + 12 files changed, 1912 insertions(+), 265 deletions(-) create mode 100644 examples/01_Visualization/09_2D-visual_soil.py create mode 100644 examples/01_Visualization/09_2D-visual_soil.yaml create mode 100644 examples/01_Visualization/10_2D-visual_soil_bathy-contours.py create mode 100644 examples/01_Visualization/10_2D-visual_soil_bathy-contours.yaml create mode 100644 examples/01_Visualization/11_2D-visual_all_options.py create mode 100644 examples/01_Visualization/11_2D-visual_all_options.yaml diff --git a/examples/01_Visualization/09_2D-visual_soil.py b/examples/01_Visualization/09_2D-visual_soil.py new file mode 100644 index 00000000..78a68573 --- /dev/null +++ b/examples/01_Visualization/09_2D-visual_soil.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +""" +Simple driver file to create a 2d plot of soil types. +The input file only contains the bare minimum information to build a 2d plot +of the soil (no platforms, moorings, cables, platform design, turbines, + site condition information, etc.) +""" + +from famodel import Project +import matplotlib.pyplot as plt +import os + +# define name of ontology input file +dir = os.path.dirname(os.path.realpath(__file__)) +input_file = os.path.join(dir,'09_2D-visual_soil.yaml') + +# initialize Project class with input file, we don't need RAFT for this so mark False +project = Project(file=input_file,raft=False) + +# plot (need to turn of bathymetry plotting to see the soil) +project.plot2d(plot_soil=True, plot_bathymetry=False) + +plt.show() diff --git a/examples/01_Visualization/09_2D-visual_soil.yaml b/examples/01_Visualization/09_2D-visual_soil.yaml new file mode 100644 index 00000000..8d966feb --- /dev/null +++ b/examples/01_Visualization/09_2D-visual_soil.yaml @@ -0,0 +1,5 @@ +# Site condition information +site: + general: {} + seabed: + file: '../GulfOfMaine_soil_uniform_100x100.txt' diff --git a/examples/01_Visualization/10_2D-visual_soil_bathy-contours.py b/examples/01_Visualization/10_2D-visual_soil_bathy-contours.py new file mode 100644 index 00000000..61709ba9 --- /dev/null +++ b/examples/01_Visualization/10_2D-visual_soil_bathy-contours.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +""" +Simple driver file to create a 2d plot of soil types. +The input file only contains the bare minimum information to build a 2d plot +of the soil and bathymetry contour lines (no platforms, moorings, cables, platform design, turbines, + site condition information, etc.) +""" + +from famodel import Project +import matplotlib.pyplot as plt +import os + +# define name of ontology input file +dir = os.path.dirname(os.path.realpath(__file__)) +input_file = os.path.join(dir,'10_2D-visual_soil_bathy-contours.yaml') + +# initialize Project class with input file, we don't need RAFT for this so mark False +project = Project(file=input_file,raft=False) + +# plot the soil types with the bathymetry contour lines (must turn off bathymetry colorplot) +project.plot2d(plot_soil=True, plot_bathymetry=False, plot_bathy_contours=True, + bath_levels=10) # choose # of contour lines to show + +# Let's change the number of contour levels +project.plot2d(plot_soil=True, plot_bathymetry=False, plot_bathy_contours=True, + bath_levels=5) # choose # of contour lines to show + + +plt.show() diff --git a/examples/01_Visualization/10_2D-visual_soil_bathy-contours.yaml b/examples/01_Visualization/10_2D-visual_soil_bathy-contours.yaml new file mode 100644 index 00000000..ed0875a8 --- /dev/null +++ b/examples/01_Visualization/10_2D-visual_soil_bathy-contours.yaml @@ -0,0 +1,7 @@ +# Site condition information +site: + general: {} + seabed: + file: '../GulfOfMaine_soil_uniform_100x100.txt' + bathymetry: + file: '../GulfOfMaine_bathymetry_100x100.txt' diff --git a/examples/01_Visualization/11_2D-visual_all_options.py b/examples/01_Visualization/11_2D-visual_all_options.py new file mode 100644 index 00000000..9e438817 --- /dev/null +++ b/examples/01_Visualization/11_2D-visual_all_options.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +""" +Simple driver file to create 2D plots exploring the different settings options +for plot2d(). +""" + +from famodel import Project +import matplotlib.pyplot as plt +import os + +# define name of ontology input file +dir = os.path.dirname(os.path.realpath(__file__)) +input_file = os.path.join(dir,'11_2D-visual_all_options.yaml') + +# initialize Project class with input file, we don't need RAFT for this so mark False +project = Project(file=input_file,raft=False) + +# create a dictionary of plot settings. We list here all the options showing default settings - comment/change different ones to see what they do! +plot_2d_settings = { + 'ax' : None, # matplotlib.pyplot axis to plot on. If None, a new figure & axis is created. + 'plot_soil' : False, # bool, if True plots soil + 'plot_bathymetry' : True, # bool, if True plots bathymetry. plot_soil & plot_bathymetry can not both be True, but you can plot bathy contours with soil. + 'plot_boundary' : True, # bool, if True plots lease boundary + 'color_lineDepth' : False, # If True, color mooring lines based on depth. Only works if plot_bathymetry=False. + 'plot_bathy_contours' : False, # bool, if True plots bathymetry contour lines. Can be used with plot_soil or plot_bathymetry + 'bare' : False, # bool, if True does not plot extra things like colorbars + 'axis_equal' : True, # bool, if True plots x and y axes at same scale to prevent distortions + 'save' : False, # bool, if True saves the figure + 'figsize' : (8,8), # the dimensions of the figure to be plotted + 'env_color' : [.5,0,0,.8], # platform motion envelope color (need to run project.arrayWatchCircle() to get this) + 'fenv_color' : [.6,.3,.3,.6], # mooring motion envelope color (need to run project.arrayWatchCircle() to get this) + 'alpha' : 0.5, # the opacity of the plot + 'return_contour' : False, # bool, if True returns the bathymetry or soil filled contour (only 1 of these can be plotted at a time) + 'cmap_cables' : None, # matplotlib colormap string for cable conductors sizes + 'cmap_soil' : None, # matplotlib colormap string for soil types + 'plot_platforms' : True, # bool, if True plots the platform locations + 'plot_anchors' : True, # bool, if True plots the anchor locations + 'plot_moorings' : True, # bool, if True plots the mooring lines + 'plot_cables' : True, # bool, if True plots the cables + 'cable_labels' : False, # bool, if True adds labels of cable names to the plot + 'depth_vmin' : None, # minimum depth to plot. If None, defaults to minimum depth in the bathymetry information + 'depth_vmax' : None, # maximum depth to plot. If None, defaults to maximum depths in the bathymetry information + 'bath_levels' : 50, # number of bathymetry contour levels, for either contour lines or the filled contour + 'plot_legend' : True, # bool, if True plots the legend + 'legend_x' : 0.5, # x location of the legend + 'legend_y' : -0.1, # y location of the legend + 'plot_landmask': False, # bool, if True plots a gray mask over land areas + 'max_line_depth': None, # max depth for line coloring if color_lineDepth is True + 'only_shared' : False, # if color_lineDepth is True, only color shared lines + 'linewidth_multiplier' : 2 # multiplier for line widths if color_lineDepth is True + } + + +project.plot2d(**plot_2d_settings) # unpack settings dictionary and plot + +# Let's change some settings + +plot_2d_settings['cable_labels'] = True +plot_2d_settings['plot_bathymetry'] = False +plot_2d_settings['plot_soil'] = True +plot_2d_settings['bath_levels'] = 6 +plot_2d_settings['plot_bathy_contours'] = True + +project.plot2d(**plot_2d_settings) + + + +plt.show() diff --git a/examples/01_Visualization/11_2D-visual_all_options.yaml b/examples/01_Visualization/11_2D-visual_all_options.yaml new file mode 100644 index 00000000..e23f5e83 --- /dev/null +++ b/examples/01_Visualization/11_2D-visual_all_options.yaml @@ -0,0 +1,1424 @@ +# Site condition information +site: + general: {} + boundaries: # project or lease area boundary, via file or vertex list + file: # filename of x-y vertex coordinates [m] + x_y: # list of polygon vertices in order [m] + - [-2500, -2500] + - [-2500, -800] + - [2500, -800] + - [2500, -2500] + - [-2500, -2500] + seabed: + file: '../GulfOfMaine_soil_uniform_100x100.txt' + bathymetry: + file: '../GulfOfMaine_bathymetry_100x100.txt' + +# Wind turbine array layout +array: + keys : [ID, topsideID, platformID, mooringID, x_location, y_location, z_location, heading_adjust] + data : # ID# ID# ID# [m] [m] [m] [deg] + - [FOWT1, 1, 1, ms3, -1600, -1600, 0, 180 ] # 2 turbine array + - [FOWT2, 1, 1, ms3, 0, -1600, 0, 0 ] + - [OSS1, 2, 2, ms3, 1600, -1600, 0, 180 ] # substation + +# Array cables +array_cables: + keys: [ AttachA, AttachB, DynCableA, DynCableB, JTubeA, JTubeB, headingA, headingB, cableType] + data: + - [ FOWT2, OSS1, suspended_1, None, 2, 2, 90, 90, None] # suspended cable, so only one dynamic cable configuration, no static cable + + +# ----- Mooring system ----- + +# Mooring system descriptions (each for an individual FOWT with no sharing) +mooring_systems: + + ms3: + name: 3-line semi-taut polyester mooring system + + keys: [MooringConfigID, heading, anchorType, fairlead, lug] # fairlead and lug listings are optional; if not specified, fairlead list follows order of fairleads in the platform definition + data: + - [ semitaut-poly_1, 30 , drag-embedment1, 1, 1 ] + - [ semitaut-poly_1, 150 , drag-embedment1, 2, 1 ] + - [ semitaut-poly_1, 270, drag-embedment1, 3, 1 ] + +# Mooring line configurations +mooring_line_configs: + + semitaut-poly_1: # mooring line configuration identifier + + name: Semitaut polyester configuration 1 # descriptive name + + span: 642 + + sections: #in order from anchor to fairlead + - mooringFamily: chain # ID of a mooring line section type + d_nom: .1549 + length: 477.7 # [m] usntretched length of line section + adjustable: True # flags that this section could be adjusted to accommodate different spacings... + - mooringFamily: polyester # ID of a mooring line section type + d_nom: .182 + length: 199.8 # [m] length (unstretched) + +# Anchor type properties +anchor_types: + + drag-embedment1: + type : DEA # type of anchor + B : 5 # net area of anchor's fluke [m^2] + L : 2 + zlug : 10 # embedded depth of padeye [m] + +# Dynamic and static cable configurations +dynamic_cable_configs: +# contains the subsections that make up each section of the subsea cable (i.e., what sections make up the lazywave cable in array_cable_1) + lazy_wave1: + name: Lazy wave configuration 1 (simpler approach) + voltage: 66 # [kV] + span : 195 # [m] horizontal distance to end of dynamic cable from attachment point + A: 300 + cable_type: dynamic_cable_66 # ID of a cable section type1 + length: 353.505 # [m] length (unstretched) + + sections: + - type: buoyancy_module_1 #_w_buoy # (section properties including averaged effect of buoyancy modules) + L_mid: 200 # [m] from platform connection + N_modules: 6 + spacing: 11.23 # [m] + - type: joint_1 + - type: bend_stiffener_1 + L_mid: 3 # [m] from platform connection + + + suspended_1: + name: Dynamic suspended cable configuration 1 + voltage: 33 + span: 1590 + cable_type: dynamic_cable_66 # ID of a cable section type1 + A: 300 + length: 1660 # [m] length (unstretched) + + sections: + - type: Buoyancy_750m #_w_buoy # (section properties including averaged effect of buoyancy modules) + L_mid: 510 # [m] from end A + N_modules: 6.5 + spacing: 18 # [m] + V: 2 + + - type: Buoyancy_750m #_w_buoy # (section properties including averaged effect of buoyancy modules) + L_mid: 1040 # [m] from end A + N_modules: 6.5 + spacing: 18 # [m] + V: 2 + +cables: + - name : array_cable1 # descriptive cable name + type : static_cable_66 # cable section type ID + + endA: + attachID: FOWT1 # FOWT/substation/junction ID + heading: 260 # [deg] heading of attachment at end A + dynamicID: lazy_wave1 # ID of dynamic cable configuration at this end + JTube: 1 # index of Jtube list in platform definition + + endB: + attachID: FOWT2 # FOWT/substation/junction ID + heading: 280 # [deg] heading of attachment at end B + dynamicID: lazy_wave1 # ID of dynamic cable configuration at this end + JTube: 1 # index of Jtube list in platform definition + + routing_x_y_r: # optional vertex points along the cable route. Nonzero radius wraps around a point at that radius. + - [-900, -1450, 20] + - [-700, -1450, 20] + + burial: # optional definition of cable burial depth over its length + station: [0, 1] # length along cable, normalized by first and last value + depth : [0.1, 0.2] # [m] burial depth + +# Cable appendages +cable_appendages: + + buoyancy_module_1: + type: buoy + m : 270.68 # [kg] mass + volume : 0.566 # [m^3] volumetric displacement + CdA: 3.8 # [m^2] product of cross-sectional area and drag coefficient + l : 0.9 # [m] length along cable + density: 500 + w : -2915.0415 + d : 0.895 + joint_1 : + type : joint + m : 100000 + bend_stiffener_1 : + type : bend_stiffener + + +topsides: + + - type : 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 + - type : Substation + mass : 100000 # additional topside mass (not mass of platform) + + + +platforms: + + - 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 + fairleads : # list of fairlead coordinates for the platform relative to platform coordinate and 0-degree heading + - name: fairlead1 + r_rel: [58, 0, -14] + headings: [30, 150, 270, 35] # headings in degrees for the fairlead (if multiple headings, the fairlead will be repeated for each heading) + JTubes : # list of Jtube coordinates for the platform relative to platform coordinate and 0-degree heading + - name: Jtube1 + r_rel: [5, 0, -20] + headings: [90, 210, 330] # headings in degrees for the Jtube (if multiple headings, the Jtube will be repeated for each heading) + type : FOWT + z_location : 0 # optional to put the depth of this platform type + + 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] + + - 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 + rFair : 58 + zFair : -15 + fairleads : # list of fairlead coordinates for the platform relative to platform coordinate and 0-degree heading + - name: fairlead1 + r_rel: [58, 0, -14] + headings: [30, 150, 270, 35] # headings in degrees for the fairlead (if multiple headings, the fairlead will be repeated for each heading) + JTubes: + - name: Jtube1 + r_rel: [5, 0, -20] + headings: [90, 210, 330] # headings in degrees for the Jtube (if multiple headings, the Jtube will be repeated for each heading) + type : Substation + + 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] \ No newline at end of file diff --git a/examples/OntologySample200m.yaml b/examples/OntologySample200m.yaml index c37ab097..94ad94aa 100644 --- a/examples/OntologySample200m.yaml +++ b/examples/OntologySample200m.yaml @@ -33,13 +33,13 @@ site: file: 'bathymetry200m_sample.txt' seabed: - x : [-10901, 0, 10000] - y : [-10900, 0, 10000] + x : [-2500, 0, 2500] + y : [-2500, -1650, -800] type_array: - - [mud_hard , mud_hard , mud_hard] - - [mud_hard , mud_hard , mud_hard] - - [mud_hard , mud_hard , mud_hard] + - [mud_hard , mud_firm , mud_hard] + - [mud_firm , mud_soft , mud_firm] + - [mud_soft , mud_firm , mud_soft] soil_types: mud_soft: diff --git a/famodel/anchors/anchor.py b/famodel/anchors/anchor.py index f0399135..83d60b88 100644 --- a/famodel/anchors/anchor.py +++ b/famodel/anchors/anchor.py @@ -1297,273 +1297,273 @@ def makeBuffer(self, buff_rad=50): # results = self.getAnchorCapacity(plot=False) - def getSize(self, geom, geomKeys, geomBounds=None, loads=None, minfs={'Ha':1.6,'Va':2}, - LD_con=[4,8], fix_zlug=False, FSdiff_max=None, plot=False): - ''' + # def getSize(self, geom, geomKeys, geomBounds=None, loads=None, minfs={'Ha':1.6,'Va':2}, + # LD_con=[4,8], fix_zlug=False, FSdiff_max=None, plot=False): + # ''' - Parameters - ---------- - geom: list - starting guess geometry values - geomKeys : list - List of keys that match the geom list values i.e. 'L','D','zlug' - geomBounds : list,optional - List of upper and lower bounds for each geometry value. - Each entry should be a tuple of upper and lower bounds for each geometry i.e. [(5,10),(10,20)] - loads : dict, optional - Dictionary of maximum anchor loads in horizontal and vertical directions (not including factor of safety). The default is None. - minfs : dict,optional - Minimum factors of safety in horizontal and vertical directions - LD_con : float - Constraint for L/D parameter - fix_zlug : bool - Boolean to decide if zlug should be altered as geometric values are altered. - True = fixed zlug, False = zlug may be changed - plot : bool - Boolean controls if capacity plots are generated or not for the final configuration + # Parameters + # ---------- + # geom: list + # starting guess geometry values + # geomKeys : list + # List of keys that match the geom list values i.e. 'L','D','zlug' + # geomBounds : list,optional + # List of upper and lower bounds for each geometry value. + # Each entry should be a tuple of upper and lower bounds for each geometry i.e. [(5,10),(10,20)] + # loads : dict, optional + # Dictionary of maximum anchor loads in horizontal and vertical directions (not including factor of safety). The default is None. + # minfs : dict,optional + # Minimum factors of safety in horizontal and vertical directions + # LD_con : float + # Constraint for L/D parameter + # fix_zlug : bool + # Boolean to decide if zlug should be altered as geometric values are altered. + # True = fixed zlug, False = zlug may be changed + # plot : bool + # Boolean controls if capacity plots are generated or not for the final configuration - Returns - ------- - None. + # Returns + # ------- + # None. - ''' - # - - - - Objective and Constraint Functions + # ''' + # # - - - - Objective and Constraint Functions - # Define the objective function: Minimize weight of anchor (cost is dependent on weight) - def objective(vars, args): + # # Define the objective function: Minimize weight of anchor (cost is dependent on weight) + # def objective(vars, args): - geomKeys = args['geomKeys'] - input_loads = args['input_loads'] - fix_zlug = args['fix_zlug'] + # geomKeys = args['geomKeys'] + # input_loads = args['input_loads'] + # fix_zlug = args['fix_zlug'] - newGeom = dict(zip(geomKeys,vars)) - self.dd['design'].update(newGeom) - if 'suction' in self.dd['type'] and not fix_zlug: - self.dd['design']['zlug'] = (2/3)*newGeom['L'] + # newGeom = dict(zip(geomKeys,vars)) + # self.dd['design'].update(newGeom) + # if 'suction' in self.dd['type'] and not fix_zlug: + # self.dd['design']['zlug'] = (2/3)*newGeom['L'] - if 'Hm' in input_loads or 'Vm' in input_loads: - anchor_loads = self.getLugForces(mudloads=input_loads) - input_loads = dict(Ha=anchor_loads['Ha'], Va=anchor_loads['Va']) # overwrite the input_loads dictionary - # get results - results = self.getAnchorCapacity(loads=input_loads, plot=False) + # if 'Hm' in input_loads or 'Vm' in input_loads: + # anchor_loads = self.getLugForces(mudloads=input_loads) + # input_loads = dict(Ha=anchor_loads['Ha'], Va=anchor_loads['Va']) # overwrite the input_loads dictionary + # # get results + # results = self.getAnchorCapacity(loads=input_loads, plot=False) - return(results['Weight']) + # return(results['Weight']) - # constraint for suction bucket sizing only. May add more constraints for other anchors in the future... - def conFun_LD(vars, geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs): - newGeom = dict(zip(geomKeys, vars)) - self.dd['design'].update(newGeom) + # # constraint for suction bucket sizing only. May add more constraints for other anchors in the future... + # def conFun_LD(vars, geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs): + # newGeom = dict(zip(geomKeys, vars)) + # self.dd['design'].update(newGeom) - if 'Hm' in input_loads or 'Vm' in input_loads: - anchor_loads = self.getLugForces(mudloads=input_loads) - input_loads = dict(Ha=anchor_loads['Ha'], Va=anchor_loads['Va']) # overwrite the input_loads dictionary + # if 'Hm' in input_loads or 'Vm' in input_loads: + # anchor_loads = self.getLugForces(mudloads=input_loads) + # input_loads = dict(Ha=anchor_loads['Ha'], Va=anchor_loads['Va']) # overwrite the input_loads dictionary - results = self.getAnchorCapacity(loads=input_loads, plot=False) + # results = self.getAnchorCapacity(loads=input_loads, plot=False) - convalA = newGeom['L']/newGeom['D'] - LD_con[0] - convalB = LD_con[1] - newGeom['L']/newGeom['D'] - conval = min([convalA,convalB]) - # if newGeom['L']/newGeom['D'] >= LD_con[0] and newGeom['L']/newGeom['D'] <= LD_con[1]: - # conval = 1 - # else: - # conval = -1 + # convalA = newGeom['L']/newGeom['D'] - LD_con[0] + # convalB = LD_con[1] - newGeom['L']/newGeom['D'] + # conval = min([convalA,convalB]) + # # if newGeom['L']/newGeom['D'] >= LD_con[0] and newGeom['L']/newGeom['D'] <= LD_con[1]: + # # conval = 1 + # # else: + # # conval = -1 - return(conval) - # constraint to ensure unity check > 1 for suction buckets - def conFun_Suction(vars, geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs): - if 'Hm' in input_loads or 'Vm' in input_loads: - anchor_loads = self.getLugForces(mudloads=input_loads) - input_loads = dict(Ha=anchor_loads['Ha'], Va=anchor_loads['Va']) # overwrite the input_loads dictionary - results = self.getAnchorCapacity(loads=input_loads, plot=False) - #conval = results['UC'] - 1 - conval = 1 - results['UC'] - # convalB = 1 - results['UC'] - return(conval) + # return(conval) + # # constraint to ensure unity check > 1 for suction buckets + # def conFun_Suction(vars, geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs): + # if 'Hm' in input_loads or 'Vm' in input_loads: + # anchor_loads = self.getLugForces(mudloads=input_loads) + # input_loads = dict(Ha=anchor_loads['Ha'], Va=anchor_loads['Va']) # overwrite the input_loads dictionary + # results = self.getAnchorCapacity(loads=input_loads, plot=False) + # #conval = results['UC'] - 1 + # conval = 1 - results['UC'] + # # convalB = 1 - results['UC'] + # return(conval) - def conFun_Drilled(vars, geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs): + # def conFun_Drilled(vars, geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs): - newGeom = dict(zip(geomKeys, vars)) - self.dd['design'].update(newGeom) - if 'Hm' in input_loads or 'Vm' in input_loads: - anchor_loads = self.getLugForces(mudloads=input_loads) - input_loads = dict(Ha=anchor_loads['Ha'], Va=anchor_loads['Va']) # overwrite the input_loads dictionary - results = self.getAnchorCapacity(loads=input_loads, plot=False) + # newGeom = dict(zip(geomKeys, vars)) + # self.dd['design'].update(newGeom) + # if 'Hm' in input_loads or 'Vm' in input_loads: + # anchor_loads = self.getLugForces(mudloads=input_loads) + # input_loads = dict(Ha=anchor_loads['Ha'], Va=anchor_loads['Va']) # overwrite the input_loads dictionary + # results = self.getAnchorCapacity(loads=input_loads, plot=False) - return np.array([0.05*newGeom['D'] - results['Lateral displacement'] , 0.25 - results['Rotational displacement']]) + # return np.array([0.05*newGeom['D'] - results['Lateral displacement'] , 0.25 - results['Rotational displacement']]) - def conFunH(vars, geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs): - # if 'suction' in self.dd['type']: - # results = self.getAnchorCapacity(plot=False) - # conval = results['UC'] - 1 - # # if results['UC'] < 1: - # # conval = -1*(results['UC']) - # else: - if 'Hm' in input_loads or 'Vm' in input_loads: - anchor_loads = self.getLugForces(mudloads=input_loads) - input_loads = dict(Ha=anchor_loads['Ha'], Va=anchor_loads['Va']) # overwrite the input_loads dictionary - minfs = dict(Ha=minfs['Hm'], Va=minfs['Vm']) - FS, _, _ = self.getFS(loads=input_loads, acceptance_crit=minfs) - conval = FS['Ha'] - 1 - # for key,val in FS.items(): + # def conFunH(vars, geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs): + # # if 'suction' in self.dd['type']: + # # results = self.getAnchorCapacity(plot=False) + # # conval = results['UC'] - 1 + # # # if results['UC'] < 1: + # # # conval = -1*(results['UC']) + # # else: + # if 'Hm' in input_loads or 'Vm' in input_loads: + # anchor_loads = self.getLugForces(mudloads=input_loads) + # input_loads = dict(Ha=anchor_loads['Ha'], Va=anchor_loads['Va']) # overwrite the input_loads dictionary + # minfs = dict(Ha=minfs['Hm'], Va=minfs['Vm']) + # FS, _, _ = self.getFS(loads=input_loads, acceptance_crit=minfs) + # conval = FS['Ha'] - 1 + # # for key,val in FS.items(): - # if val/minfs[key]<1: - # if -1*(1-val/minfs[key]) < conval: - # conval = -1*(1-val/minfs[key]) - return(conval) + # # if val/minfs[key]<1: + # # if -1*(1-val/minfs[key]) < conval: + # # conval = -1*(1-val/minfs[key]) + # return(conval) - def conFunV(vars, geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs): - if 'Hm' in input_loads or 'Vm' in input_loads: - anchor_loads = self.getLugForces(mudloads=input_loads) - input_loads = dict(Ha=anchor_loads['Ha'], Va=anchor_loads['Va']) # overwrite the input_loads dictionary - minfs = dict(Ha=minfs['Hm'], Va=minfs['Vm']) - FS, _, _ = self.getFS(loads=input_loads, acceptance_crit=minfs) - # special case for DEAs - if minfs['Va'] == 0: - conval = 1 - else: - conval = FS['Va'] - 1 + # def conFunV(vars, geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs): + # if 'Hm' in input_loads or 'Vm' in input_loads: + # anchor_loads = self.getLugForces(mudloads=input_loads) + # input_loads = dict(Ha=anchor_loads['Ha'], Va=anchor_loads['Va']) # overwrite the input_loads dictionary + # minfs = dict(Ha=minfs['Hm'], Va=minfs['Vm']) + # FS, _, _ = self.getFS(loads=input_loads, acceptance_crit=minfs) + # # special case for DEAs + # if minfs['Va'] == 0: + # conval = 1 + # else: + # conval = FS['Va'] - 1 - # print('FS_V',FS['Va']) - return(conval) + # # print('FS_V',FS['Va']) + # return(conval) - def conBounds(vars, geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs): + # def conBounds(vars, geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs): - newGeom = dict(zip(geomKeys, vars)) - self.dd['design'].update(newGeom) + # newGeom = dict(zip(geomKeys, vars)) + # self.dd['design'].update(newGeom) - if 'Hm' in input_loads or 'Vm' in input_loads: - anchor_loads = self.getLugForces(mudloads=input_loads) - input_loads = dict(Ha=anchor_loads['Ha'], Va=anchor_loads['Va']) # overwrite the input_loads dictionary - results = self.getAnchorCapacity(loads=input_loads, plot=False) + # if 'Hm' in input_loads or 'Vm' in input_loads: + # anchor_loads = self.getLugForces(mudloads=input_loads) + # input_loads = dict(Ha=anchor_loads['Ha'], Va=anchor_loads['Va']) # overwrite the input_loads dictionary + # results = self.getAnchorCapacity(loads=input_loads, plot=False) - bound_L_lower = newGeom['L'] - geomBounds[0][0] - bound_L_upper = geomBounds[0][1] - newGeom['L'] - bound_D_lower = newGeom['D'] - geomBounds[1][0] - bound_D_upper = geomBounds[1][1] - newGeom['D'] + # bound_L_lower = newGeom['L'] - geomBounds[0][0] + # bound_L_upper = geomBounds[0][1] - newGeom['L'] + # bound_D_lower = newGeom['D'] - geomBounds[1][0] + # bound_D_upper = geomBounds[1][1] - newGeom['D'] - return np.array([bound_L_lower, bound_L_upper, bound_D_lower, bound_D_upper]) + # return np.array([bound_L_lower, bound_L_upper, bound_D_lower, bound_D_upper]) - # - - - - - Setup & Optimization - from scipy.optimize import minimize - from copy import deepcopy - - anchType = self.dd['type'] - - # loads['Ha'] = minfs['Ha']*loads['Ha'] - # loads['Va'] = minfs['Va']*loads['Va'] - startGeom = dict(zip(geomKeys,geom)) - print('start geometry: ',startGeom) - # apply initial guess geometry - self.dd['design'].update(startGeom) + # # - - - - - Setup & Optimization + # from scipy.optimize import minimize + # from copy import deepcopy + + # anchType = self.dd['type'] + + # # loads['Ha'] = minfs['Ha']*loads['Ha'] + # # loads['Va'] = minfs['Va']*loads['Va'] + # startGeom = dict(zip(geomKeys,geom)) + # print('start geometry: ',startGeom) + # # apply initial guess geometry + # self.dd['design'].update(startGeom) - if not 'zlug' in self.dd['design']: - if 'suction' in anchType and not fix_zlug: - self.dd['design']['zlug'] = (2/3)*startGeom['L'] - else: - self.dd['design']['zlug'] = 0 + # if not 'zlug' in self.dd['design']: + # if 'suction' in anchType and not fix_zlug: + # self.dd['design']['zlug'] = (2/3)*startGeom['L'] + # else: + # self.dd['design']['zlug'] = 0 - # if zlug is fixed, remove it from design variables - if fix_zlug and 'zlug' in geomKeys: - zlug_loc = geomKeys.index('zlug') - startGeom.pop('zlug') - geomKeys.remove('zlug') - geom.pop(zlug_loc) - if geomBounds: - geomBounds.pop(zlug_loc) - - if not loads: - loads = self.loads + # # if zlug is fixed, remove it from design variables + # if fix_zlug and 'zlug' in geomKeys: + # zlug_loc = geomKeys.index('zlug') + # startGeom.pop('zlug') + # geomKeys.remove('zlug') + # geom.pop(zlug_loc) + # if geomBounds: + # geomBounds.pop(zlug_loc) + + # if not loads: + # loads = self.loads - if not 'Ha' in loads: - loads = self.getLugForces(mudloads=loads) + # if not 'Ha' in loads: + # loads = self.getLugForces(mudloads=loads) - # suction bucket needs to be loads*FS because of capacity envelope calculations in capacity function - if ('Hm' in loads and 'Vm' in loads) and ('Hm' in minfs and 'Vm' in minfs): - input_loads = {'Hm':loads['Hm']*minfs['Hm'], 'Vm':loads['Vm']*minfs['Vm']} - else: - input_loads = {'Ha':loads['Ha']*minfs['Ha'],'Va':loads['Va']*minfs['Va']} + # # suction bucket needs to be loads*FS because of capacity envelope calculations in capacity function + # if ('Hm' in loads and 'Vm' in loads) and ('Hm' in minfs and 'Vm' in minfs): + # input_loads = {'Hm':loads['Hm']*minfs['Hm'], 'Vm':loads['Vm']*minfs['Vm']} + # else: + # input_loads = {'Ha':loads['Ha']*minfs['Ha'],'Va':loads['Va']*minfs['Va']} - # Initial guess for geometry - initial_guess = geom # [val for val in startGeom.values()] # Input values for geometry - # geomKeys = [key for key in startGeom.keys()] + # # Initial guess for geometry + # initial_guess = geom # [val for val in startGeom.values()] # Input values for geometry + # # geomKeys = [key for key in startGeom.keys()] - # Bounds and constraints - if 'suction' in anchType: - # bounds = [(1, 7), (5, 50),()] # Bounds for D and L - # constraints + # # Bounds and constraints + # if 'suction' in anchType: + # # bounds = [(1, 7), (5, 50),()] # Bounds for D and L + # # constraints - constraints = [{'type':'ineq','fun':conFun_LD,'args':(geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs)}, - {'type':'ineq','fun':conFun_Suction,'args':(geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs)}, - {'type':'ineq','fun':conFunH,'args':(geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs)}, - {'type':'ineq','fun':conFunV,'args':(geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs)}, - {'type':'ineq','fun':conBounds,'args':(geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs)}] + # constraints = [{'type':'ineq','fun':conFun_LD,'args':(geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs)}, + # {'type':'ineq','fun':conFun_Suction,'args':(geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs)}, + # {'type':'ineq','fun':conFunH,'args':(geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs)}, + # {'type':'ineq','fun':conFunV,'args':(geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs)}, + # {'type':'ineq','fun':conBounds,'args':(geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs)}] - elif 'drilled' in anchType: - constraints = [{'type':'ineq','fun':conFun_LD,'args':(geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs)}, - {'type':'ineq','fun':conFun_Drilled,'args':(geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs)}, - {'type':'ineq','fun':conFunH,'args':(geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs)}, - {'type':'ineq','fun':conFunV,'args':(geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs)}, - {'type':'ineq','fun':conBounds,'args':(geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs)}] + # elif 'drilled' in anchType: + # constraints = [{'type':'ineq','fun':conFun_LD,'args':(geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs)}, + # {'type':'ineq','fun':conFun_Drilled,'args':(geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs)}, + # {'type':'ineq','fun':conFunH,'args':(geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs)}, + # {'type':'ineq','fun':conFunV,'args':(geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs)}, + # {'type':'ineq','fun':conBounds,'args':(geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs)}] - else: - constraints = [{'type':'ineq','fun':conFunH,'args':(geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs)}, - {'type':'ineq','fun':conFunV,'args':(geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs)}] + # else: + # constraints = [{'type':'ineq','fun':conFunH,'args':(geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs)}, + # {'type':'ineq','fun':conFunV,'args':(geomKeys, input_loads, fix_zlug, LD_con, geomBounds, minfs)}] - # Run the optimization to find sizing that satisfy UC close to 1 - print('optimizing anchor size') + # # Run the optimization to find sizing that satisfy UC close to 1 + # print('optimizing anchor size') - if 'suction' in anchType or 'drilled' in anchType: - solution = minimize(objective, initial_guess, args=dict(geomKeys=geomKeys, input_loads=input_loads, fix_zlug=fix_zlug, LD_con=LD_con, geomBounds=geomBounds, minfs=minfs), - method="COBYLA", constraints=constraints, options={'rhobeg':0.1, 'catol':0.001}) - else: - solution = minimize(objective, initial_guess, args=dict(geomKeys=geomKeys, input_loads=input_loads, fix_zlug=fix_zlug, LD_con=LD_con, geomBounds=geomBounds, minfs=minfs), - method="COBYLA", constraints=constraints, options={'rhobeg':0.1, 'catol':0.001}) + # if 'suction' in anchType or 'drilled' in anchType: + # solution = minimize(objective, initial_guess, args=dict(geomKeys=geomKeys, input_loads=input_loads, fix_zlug=fix_zlug, LD_con=LD_con, geomBounds=geomBounds, minfs=minfs), + # method="COBYLA", constraints=constraints, options={'rhobeg':0.1, 'catol':0.001}) + # else: + # solution = minimize(objective, initial_guess, args=dict(geomKeys=geomKeys, input_loads=input_loads, fix_zlug=fix_zlug, LD_con=LD_con, geomBounds=geomBounds, minfs=minfs), + # method="COBYLA", constraints=constraints, options={'rhobeg':0.1, 'catol':0.001}) - FS, acceptance, FSdiff = self.getFS(loads=input_loads, acceptance_crit=minfs) + # FS, acceptance, FSdiff = self.getFS(loads=input_loads, acceptance_crit=minfs) - # adjust starting value if you're far off from the acceptance criteria (in either direction) - if FSdiff_max: - count = 0 - while count<10 and (np.any([abs(FSdiff[key])>FSdiff_max[key] for key in FSdiff.keys()]) or np.any([diff<0 for diff in FSdiff.values()])): - if np.any([diff<.02 for key,diff in FSdiff.items() if minfs[key]>0]) and np.all([diff>=0 for diff in FSdiff.values()]): - # exit loop if you're as close as can be on one of the FS even if other is above diff requirements UNLESS an FS is below minimum reqiured FS - break - print('Factor of Safety not close enough to minimum factor of safety, trying again with adjusted initial guess.') - print(FS) - # calculate new percent difference of FS from min fs - diffPCT = [FSdiff[key]/FS[key] for key in FSdiff] - # create adjustment coefficient based on this or .25, whichever is lower - adjust_coeff = np.min([np.min(diffPCT),0.25]) - # adjust initial guess values by adjustment coefficient - for i,val in enumerate(initial_guess): - initial_guess[i] = val - val*adjust_coeff - # update zlug for suction buckets as needed to be 2/3L - if 'suction' in anchType and not fix_zlug: - zlug_loc = geomKeys.index('zlug') - L_loc = geomKeys.index('L') - initial_guess[zlug_loc] = (2/3)*initial_guess[L_loc] - - print('new initial guess',initial_guess) - # re-run optimization - if 'suction' in anchType or 'drilled' in anchType: - solution = minimize(objective, initial_guess, args=dict(geomKeys=geomKeys, input_loads=input_loads, fix_zlug=fix_zlug, LD_con=LD_con, geomBounds=geomBounds, minfs=minfs), - method="COBYLA", constraints=constraints, options={'rhobeg':0.1, 'catol':0.001}) - else: - solution = minimize(objective, initial_guess, args=dict(geomKeys=geomKeys, input_loads=input_loads, fix_zlug=fix_zlug, LD_con=LD_con, geomBounds=geomBounds, minfs=minfs), - method="COBYLA", constraints=constraints, options={'rhobeg':0.1, 'catol':0.001}) - # re-determine FS and diff from minFS - FS, acceptance, FSdiff = self.getFS(loads=input_loads, acceptance_crit=minfs) - count += 1 + # # adjust starting value if you're far off from the acceptance criteria (in either direction) + # if FSdiff_max: + # count = 0 + # while count<10 and (np.any([abs(FSdiff[key])>FSdiff_max[key] for key in FSdiff.keys()]) or np.any([diff<0 for diff in FSdiff.values()])): + # if np.any([diff<.02 for key,diff in FSdiff.items() if minfs[key]>0]) and np.all([diff>=0 for diff in FSdiff.values()]): + # # exit loop if you're as close as can be on one of the FS even if other is above diff requirements UNLESS an FS is below minimum reqiured FS + # break + # print('Factor of Safety not close enough to minimum factor of safety, trying again with adjusted initial guess.') + # print(FS) + # # calculate new percent difference of FS from min fs + # diffPCT = [FSdiff[key]/FS[key] for key in FSdiff] + # # create adjustment coefficient based on this or .25, whichever is lower + # adjust_coeff = np.min([np.min(diffPCT),0.25]) + # # adjust initial guess values by adjustment coefficient + # for i,val in enumerate(initial_guess): + # initial_guess[i] = val - val*adjust_coeff + # # update zlug for suction buckets as needed to be 2/3L + # if 'suction' in anchType and not fix_zlug: + # zlug_loc = geomKeys.index('zlug') + # L_loc = geomKeys.index('L') + # initial_guess[zlug_loc] = (2/3)*initial_guess[L_loc] + + # print('new initial guess',initial_guess) + # # re-run optimization + # if 'suction' in anchType or 'drilled' in anchType: + # solution = minimize(objective, initial_guess, args=dict(geomKeys=geomKeys, input_loads=input_loads, fix_zlug=fix_zlug, LD_con=LD_con, geomBounds=geomBounds, minfs=minfs), + # method="COBYLA", constraints=constraints, options={'rhobeg':0.1, 'catol':0.001}) + # else: + # solution = minimize(objective, initial_guess, args=dict(geomKeys=geomKeys, input_loads=input_loads, fix_zlug=fix_zlug, LD_con=LD_con, geomBounds=geomBounds, minfs=minfs), + # method="COBYLA", constraints=constraints, options={'rhobeg':0.1, 'catol':0.001}) + # # re-determine FS and diff from minFS + # FS, acceptance, FSdiff = self.getFS(loads=input_loads, acceptance_crit=minfs) + # count += 1 - # Extract the optimized values of geometry - endGeom = dict(zip(geomKeys,solution.x)) - print('End geometry: ',endGeom) - self.dd['design'].update(endGeom) - if 'suction' in anchType and not fix_zlug: - self.dd['design']['zlug'] = (2/3)*self.dd['design']['L'] - results = self.getAnchorCapacity(loads=input_loads,plot=plot) + # # Extract the optimized values of geometry + # endGeom = dict(zip(geomKeys,solution.x)) + # print('End geometry: ',endGeom) + # self.dd['design'].update(endGeom) + # if 'suction' in anchType and not fix_zlug: + # self.dd['design']['zlug'] = (2/3)*self.dd['design']['L'] + # results = self.getAnchorCapacity(loads=input_loads,plot=plot) # # check if anchor loads are available # if not self.loads: diff --git a/famodel/design/LineDesign.py b/famodel/design/LineDesign.py index b38210be..5e5246a6 100644 --- a/famodel/design/LineDesign.py +++ b/famodel/design/LineDesign.py @@ -247,11 +247,14 @@ def __init__(self, depth, lineProps=None, **kwargs): Mooring.__init__(self, dd=dd, rho=rho, g=g, shared=shared, lineProps=self.lineProps) # The above will also create Mooring self parameters like self.rad_anch - + if shareCase==2: + self.symmetric=True + # symmetrical suspended case - pre-set rA so createSubsystem doesn't put rA back at Mooring default of [-span, 0, z_anch] + self.rA = np.array([-0.5*self.span-self.rad_fair, 0, -1]) # shared line midpoint coordinates # Save a copy of the original anchoring radius to use with the # solve_for=ghost option to adjust the chain length. self.rad_anch0 = float(self.rad_anch) - + self.createSubsystem(case=int(shareCase)) if self.shared==1: self.ss.rA[2] = self.rBFair[2] @@ -507,7 +510,7 @@ def func(): self.ms.pointList[2*i+1].attachLine(i+1, 1) self.ms.initialize() - + # initialize the created mooring system self.ss.initialize(daf_dict = {'DAFs': self.DAFs}) self.ss.setOffset(0) @@ -520,7 +523,7 @@ def updateDesign(self, X, display=0, display2=0, normalized=True): start_time = time.time() # reset modifiers to mooring design (corrosion/creep/marine_growth) - self.reset() + #self.reset() # Design vector error checks if len(X)==0: # if any empty design vector is passed (useful for checking constraints quickly) @@ -637,9 +640,8 @@ def updateDesign(self, X, display=0, display2=0, normalized=True): # >>> TODO: check for negative line lengths that somehow get set <<< - Lmax = 0.95*(self.ss.span + self.depth+self.rBFair[2]) - + if sum([self.ss.lineList[i].L for i in range(self.nLines)]) > Lmax: # check to make sure the total length of line is less than the maximum L shape (helpful for GA optimizations) if self.solve_for=='none': @@ -722,7 +724,6 @@ def tuneLineLengthsForOffset(xCurrent, args): # this function does the standar cMin = self.ss.getMinSF(display=display) - 2.0 # compute the constraint value print(f" xmax={xCurrent[0]:8.2f} L={x[0]:8.3f} dFx={y[0]:8.0f} minSF={self.getMinSF():7.3f}") - #breakpoint() return np.array([cMin]), dict(status=1), stopFlag # return the constraint value - we'll actually solve for this to be zero - finding the offset that just barely satisifes the SFs @@ -807,7 +808,6 @@ def tuneLineLengthsForOffset(xCurrent, args): # this function does the standar # Evaluate any constraints in the list, at the appropriate displacements. # The following function calls will fill in the self.convals array. - # ZERO OFFSET: self.ss.setOffset(0) @@ -869,7 +869,6 @@ def tuneLineLengthsForOffset(xCurrent, args): # this function does the standar ############################################################ # ----- Evaluate objective function ----- - # Calculate the cost from all components in the Mooring self.lineCost = 0.0 for line in self.ss.lineList: diff --git a/famodel/mooring/mooring.py b/famodel/mooring/mooring.py index 702e0ed3..3a36cfc9 100644 --- a/famodel/mooring/mooring.py +++ b/famodel/mooring/mooring.py @@ -218,7 +218,13 @@ def reset(self): reset the subsystem and the applied_states dictionary. ''' # create pristine subsystem - self.createSubsystem() + if self.shared and self.symmetric: + case = 2 + elif self.shared: + case = 1 + else: + case = 0 + self.createSubsystem(case=case) # reset applied_states dictionary values for state in self.applied_states: self.applied_states[state] = None diff --git a/famodel/project.py b/famodel/project.py index 234c3880..c0a0516f 100644 --- a/famodel/project.py +++ b/famodel/project.py @@ -2134,9 +2134,10 @@ def updatePositions(self): platform.r[1] = platform.body.r6[1] - def plot2d(self, ax=None, plot_seabed=False, plot_soil=False, + def plot2d(self, ax=None, plot_soil=False, plot_bathymetry=True, plot_boundary=True, color_lineDepth=False, - bare=False, axis_equal=True,save=False,**kwargs): + plot_bathy_contours=False, bare=False, axis_equal=True, + save=False,**kwargs): '''Plot aspects of the Project object in matplotlib in 3D. TODO - harmonize a lot of the seabed stuff with MoorPy System.plot... @@ -2144,6 +2145,20 @@ def plot2d(self, ax=None, plot_seabed=False, plot_soil=False, Parameters ---------- ... + ax : matplotlib.pyplot axis + Default is None + plot_soil : bool + If True, plot soil conditions + plot_bathymetry : bool + If True, plot bathymetry + plot_boundary : bool + If True, plot lease area boundary + plot_bathy_contours : bool + If True, plot bathymetry line contours + axis_equal : bool + If True, set axes to equal scales to prevent visual distortions + save : bool + If True, save the figure bare : bool If True, supress display of extra labeling like the colorbar. color_lineDepth: bool @@ -2157,6 +2172,7 @@ def plot2d(self, ax=None, plot_seabed=False, plot_soil=False, alpha = kwargs.get('alpha',0.5) return_contour = kwargs.get('return_contour',False) cmap_cables = kwargs.get('cmap_cables',None) + cmap_soil = kwargs.get('cmpa_soil', None) plot_platforms = kwargs.get('plot_platforms',True) plot_anchors = kwargs.get('plot_anchors',True) plot_moorings = kwargs.get('plot_moorings',True) @@ -2164,10 +2180,11 @@ def plot2d(self, ax=None, plot_seabed=False, plot_soil=False, cable_labels = kwargs.get('cable_labels', False) depth_vmin = kwargs.get('depth_vmin', None) depth_vmax = kwargs.get('depth_vmax', None) - bath_levels = kwargs.get('bath_levels', None) + bath_levels = kwargs.get('bath_levels', 50) plot_legend = kwargs.get('plot_legend', True) legend_x = kwargs.get('legend_x', 0.5) legend_y = kwargs.get('legend_y', -0.1) + plot_landmask = kwargs.get('plot_landmask', False) # mask land areas max_line_depth = kwargs.get('max_line_depth', None) # max depth for line coloring if color_lineDepth is True only_shared = kwargs.get('only_shared', False) # if color_lineDepth is True, only color shared lines @@ -2181,18 +2198,17 @@ def plot2d(self, ax=None, plot_seabed=False, plot_soil=False, # Bathymetry if plot_bathymetry: - if plot_seabed: - raise ValueError('The bathymetry grid and soil grid cannot yet be plotted at the same time') + if plot_soil: + raise ValueError('The bathymetry grid and soil grid cannot yet be plotted at the same time. Use plot_bathy_contours=True instead') if len(self.grid_x) > 1 and len(self.grid_y) > 1: X, Y = np.meshgrid(self.grid_x, self.grid_y) - num_levels = bath_levels if bath_levels is not None else 50 vmin = depth_vmin if depth_vmin is not None else np.min(self.grid_depth) vmax = depth_vmax if depth_vmax is not None else np.max(self.grid_depth) grid_depth = np.clip(self.grid_depth, vmin, vmax) - contourf = ax.contourf(X, Y, grid_depth, num_levels, cmap='Blues', vmin=np.min(self.grid_depth), vmax=np.max(self.grid_depth)) + contourf = ax.contourf(X, Y, grid_depth, bath_levels, cmap='Blues', vmin=np.min(self.grid_depth), vmax=np.max(self.grid_depth)) contourf.set_clim(depth_vmin, depth_vmax) @@ -2201,21 +2217,47 @@ def plot2d(self, ax=None, plot_seabed=False, plot_soil=False, cbar = plt.colorbar(contourf, ax=ax, fraction=0.04, label='Water Depth (m)', format=tkr.FormatStrFormatter('%.0f')) - if plot_seabed: + if plot_soil: if plot_bathymetry: - raise ValueError('The bathymetry grid and soil grid cannot yet be plotted at the same time') - import matplotlib.colors as mcolors - soil_types = np.unique(self.soil_names) + raise ValueError('The bathymetry grid and soil grid cannot yet be plotted at the same time. Use plot_bathy_contours=True instead') + + soil_types = np.unique(self.soil_names).tolist() + if not cmap_soil: + cmap_soil = plt.cm.YlOrRd + bounds = [i for i in range(len(soil_types)+1)] soil_type_to_int = {name: i for i,name in enumerate(soil_types)} - soil_colors = {'mud':'green', 'hard':'brown'} soil_int = np.vectorize(soil_type_to_int.get)(self.soil_names) - cmap = mcolors.ListedColormap([soil_colors.get(name, 'white') for name in soil_types]) - + from matplotlib.colors import BoundaryNorm + norm = BoundaryNorm(bounds, cmap_soil.N) + #cmap = mcolors.ListedColormap([soil_colors.get(name, 'white') for name in soil_types]) + # prepare for plot seabed data + #soil_types.remove("-") # delete nan like value manualy + levels = np.arange(0, len(soil_types)) # create index matches unique soil name + ticks = levels + 0.5 # shift label position to place center between colors X, Y = np.meshgrid(self.soil_x, self.soil_y) - ax.pcolormesh(X, Y, soil_int, cmap=cmap, shading='auto') - - soil_handles = [plt.Line2D([0], [0], marker='s', color='w', label=name, markerfacecolor=soil_colors.get(name, 'white'), markersize=10) for name in soil_types if name != '0' ] - + contourf = ax.pcolormesh(X, Y, soil_int, cmap=cmap_soil, norm=norm, shading='auto') + if not bare: + cbar = plt.colorbar(contourf, + ax=ax, norm=norm, + fraction=0.04, label='Soil Type', ticks=ticks) # color bar for soil name + cbar.ax.set_yticklabels(soil_types) # label of color bar + #soil_handles = [plt.Line2D([0], [0], marker='s', color='w', label=name, markerfacecolor=soil_colors.get(name, 'white'), markersize=10) for name in soil_types if name != '0' ] + + if plot_bathy_contours: + # plot the bathymetry in matplotlib using a plot_surface + X, Y = np.meshgrid(self.grid_x, self.grid_y) # 2D mesh of seabed grid + plot_depths = self.grid_depth + contour = ax.contour(X, Y, plot_depths, vmin=np.min(self.grid_depth), + vmax=np.max(self.grid_depth), levels=bath_levels, + colors='black', linewidths=0.5) # bathymetry contour line + ax.clabel(contour) + + if plot_landmask: + # mask the land area (where depth>0) + landMask = np.ones_like(self.grid_depth) # create land mask(sea: NaN, Land: 1) + landMask[self.grid_depth > 0] = np.nan # replace water depth > 0 as NaN + contourf = ax.contourf(self.grid_x,self.grid_y, landMask, colors='gray') # landmask + landmask_handle = plt.Line2D([0], [0], marker='s', color='w', label='Land', markerfacecolor='gray', markersize=10) if plot_boundary: if len(self.boundary) > 1: @@ -2402,9 +2444,11 @@ def plot2d(self, ax=None, plot_seabed=False, plot_soil=False, ax.set_aspect('equal',adjustable='box') handles, labels = ax.get_legend_handles_labels() - if plot_seabed: - handles += soil_handles - labels += [h.get_label() for h in soil_handles] + # add in land mask label if necessary + if plot_landmask: + handles += [landmask_handle] + labels += ['Land'] + # zip labels and handles into a dictionary by_label = dict(zip(labels, handles)) # Removing duplicate labels if plot_legend: @@ -2430,7 +2474,8 @@ def plot2d(self, ax=None, plot_seabed=False, plot_soil=False, def plot3d(self, ax=None, figsize=(10,8), plot_fowt=False, save=False, plot_boundary=True, plot_boundary_on_bath=True, args_bath={}, plot_axes=True, plot_bathymetry=True, plot_soil=False, color=None, - colorbar=True, boundary_only=False,**kwargs): + colorbar=True, boundary_only=False, plot_bathy_contours=False, + **kwargs): '''Plot aspects of the Project object in matplotlib in 3D. TODO - harmonize a lot of the seabed stuff with MoorPy System.plot... @@ -2526,9 +2571,9 @@ def plot3d(self, ax=None, figsize=(10,8), plot_fowt=False, save=False, self.setGrid(xs, ys) - # plot the bathymetry in matplotlib using a plot_surface - X, Y = np.meshgrid(self.grid_x, self.grid_y) # 2D mesh of seabed grid - plot_depths = -self.grid_depth + # plot the bathymetry in matplotlib using a plot_surface + X, Y = np.meshgrid(self.grid_x, self.grid_y) # 2D mesh of seabed grid + plot_depths = -self.grid_depth ''' # interpolate soil rockyness factor onto this grid xs = self.grid_x diff --git a/tests/test_LineDesign.py b/tests/test_LineDesign.py index b5e11eb5..faaa0615 100644 --- a/tests/test_LineDesign.py +++ b/tests/test_LineDesign.py @@ -146,6 +146,47 @@ def test_DEA_Chain_COBYLA_tension(): assert abs(ld3.ss.lineList[0].L - 1036.553) < 0.01 assert abs(X3[1] - 102.869) < 0.01 +def test_DEA_Polyester_Chain_Polyester_Suspended(): + depth = 800 + + settings = {} + settings['shared'] = True + settings['rBFair'] = [58,0,-14] + settings['rho'] = 1025 + settings['g'] = 9.81 + settings['span'] = 1304.0 + settings['fx_target'] = 2e6 + settings['solve_for'] = 'tension' + + settings['name'] = 'shared-outer' + settings['lineTypeNames'] = ['polyester', 'chain', 'polyester'] + settings['allVars'] = [ 0 , 400, 280, 0 , 250 , 170, 0, 250, 280] + settings['Xindices'] = ['c', 's' , 0, 'c', 'c' , 'c', 'c', 'c', 0] + settings['Xmin'] = [10] + settings['Xmax'] = [500] + settings['dX_last'] = [10] + + settings['x_mean_in'] = 28.47071193414532 + settings['x_mean_out'] = 28.719601624957555 + settings['x_ampl'] = 11.11 + + settings['constraints'] = [dict(name='min_sag' , index=0, threshold=-60 , offset='max'), + dict(name='min_Kx' , index=0, threshold=26714, offset='zero')] + + for j in range(len(settings['lineTypeNames'])): + settings['constraints'].append(dict(name='tension_safety_factor', index=j, threshold=1.67, offset='max')) + + ld = LineDesign(depth, **settings) + + + ld.setNormalization() + + # 1st Run + X, min_cost = ld.optimize(maxIter=400, plot=False, display=1, stepfac=5, method='COBYLA') + + ld.updateDesign(X) + X = np.array(X)*ld.X_denorm + assert abs(X[0] - 308.03) < .01 '''