From eedc910dd47ef6e6a5ddd1b5f96578b3fa0498ee Mon Sep 17 00:00:00 2001 From: dzalkind <65573423+dzalkind@users.noreply.github.com> Date: Thu, 12 Dec 2024 08:57:35 -0700 Subject: [PATCH] DLC Generation - Refactor and New Cases (#308) * [DLC] Add skeleton for DLC case input refactoring * Send openfast outputs to directory of analysis options output * Start new method of dlc generation * Use new DLC_generator in OM_OF, single DLC only * Create functions of things that will happen in each DLC * Tidy up DLC 5.1 before applying elsewhere * Add DLC 1.6, generate multiple DLCs * Tidy up new dlc generator more * Apply initial conditions in dlc_generator * Apply olaf parameters * Refactor dlc generator: combine functions * Add PSF, windtype, seastate, and label to dlc_options * Update DLC generator for 6.1: Turn off generator at shutdown_time Expand default options Include wave_mod Apply PSF Catch error in first generic_case_input Only apply ICs in operational DLCs * Run new DLC generator in gc_LoadInputs * Apply wind inputs to case_list * DLC: Adding new versions of DLC 1.x * Update DLC 1.6, 5.1 generators * DLC: Add option of using non-turbulent wind in new DLC code * Add 50-year sea state * Re-organize order of functions * Remove yaw_misalign from wind seed calculation, handled by groups now * Set up DLC 6.3 and re-write generate_new_dlc * DLC: Finish DLC 1.5 and progress towards 1.2 * Add DLC 6.2 * Get known dlcs from modeling schema * Add DLC 3.1, regular startup in NTM * Add DLC 6.4 * Remove DLC 12.1 * Move new dlc generator to original file and name * Revert inputs for example 05 that tests DLC generator * Fix small errors in DLC_Generator.py * Set n_ws_dlc11 * Fix typo in dlc_generator and fix dlc test by removing DLC 6.5 from example 5 * Fix dlc11_ws output, it's the number of wind speeds * Clean up example 05 modopts * Fix DLC 11 counter and DLC 64 wind speeds * Fix a bug where string dlc options were storred with incorrect type * Fix error with DLC 6.4, wind speeds were stored as np-array instead of list * Fix issue with DLC 6.4 * Add DLC 2.1 and 2.3, change ROSCO version to 2.9.4 and change a variable name in IEC_CoeherentGusts.py * Set default 5.1 times if not provided in input * Remove old array inits, add case name to table output * Clean up comments * Fix DLC 6.2 label * Write OpenFAST output to stdout as a modeling option * Flip shear ordering to match previous implementation exactly * Disable unsteady aero for DLC 1.4 * For DLC 6.2, simulate more yaw misalignments * Add met options to dlc_options for output reporting * Rename wave variables/keys for output reporting to match modopt inputs * Fix add met options * Sync wind_seeds, rand_seeds, and wind_seed naming * Remove wind_speeds, all wind_speed now * Fix probabilities dictionary, re-normalize * Start DLC docs in WEIS * Tidy some docs pages * Outline DLC page * Ensure RAFT gets correct DLC data * Test the raft input generated in ex15 against a standard input * Reorganize to remove globals from dlc_generator * Use wind_speed to set URef * Point to new RAFT input file, generated with WEIS * Add DLC for AEP calculations with constant TI * Try printing RAFT inputs * Disable regression test for now * Assign wave seeds for each case * Add DLC 7.1 and 7.2 * Fix 1-year sea state * DLC: Add yaw error as an option for fault cases * Fix DLC generator test * Revert 02 input * Tidy new code blocks * Add developer docs * Outline dlc generator cases * Add DLC documentation (1.X) * Add tip clearance channels * Increase WvHiCOff so we can model normal sea states properly * Rename case to case_i * DLCDocs: Start documentation for DLC 2.x * Fix AEP DLC and PSFs * Move yaw and pitch faults to DLC 2.2 and add excpetions to fault cases --------- Co-authored-by: AbhineetGupta --- docs/dlc_generator.rst | 352 ++- docs/index.rst | 8 + docs/inputs/geometry_schema.rst | 4 +- docs/requirements.txt | 16 - environment.yml | 2 +- .../modeling_options.yaml | 2 +- .../modeling_options_loads.yaml | 43 +- .../05_IEA-3.4-130-RWT/modeling_options.yaml | 13 - examples/15_RAFT_Studies/raft_input_weis.yaml | 1983 +++++++++++++++++ .../15_RAFT_Studies/weis_driver_raft_opt.py | 10 + weis/aeroelasticse/CaseGen_General.py | 18 +- weis/aeroelasticse/IEC_CoeherentGusts.py | 10 +- weis/aeroelasticse/openmdao_openfast.py | 331 ++- weis/aeroelasticse/turbsim_util.py | 2 +- weis/dlc_driver/dlc_generator.py | 1768 +++++++++------ weis/dlc_driver/test/test_DLC_generator.py | 15 +- weis/dlc_driver/turbulence_models.py | 10 +- weis/glue_code/gc_LoadInputs.py | 31 +- weis/glue_code/glue_code.py | 6 +- weis/inputs/modeling_schema.yaml | 20 +- weis/inputs/validation.py | 2 + 21 files changed, 3683 insertions(+), 963 deletions(-) create mode 100644 examples/15_RAFT_Studies/raft_input_weis.yaml diff --git a/docs/dlc_generator.rst b/docs/dlc_generator.rst index 228e9695d..32c8af9fd 100644 --- a/docs/dlc_generator.rst +++ b/docs/dlc_generator.rst @@ -1,5 +1,351 @@ -DLC Generator -------------- +========================= +Design Load Cases in WEIS +========================= +Design load cases (DLCs) specify the conditions that a turbine must operate in safely thorughout its lifetime. +These load cases are defined in IEC standards. +We supplement the standards with information from the DTU design load basis (cite). -**Inputs to the DLC case generator explained** \ No newline at end of file +-------------------------- +How to Set Up DLCs in WEIS +-------------------------- + +DLCs are configured in the modeling options (link). +A full set of input information is contained within the modeling schema. +An example (a subset of a modeling input) is shown next:: + + DLC_driver: + metocean_conditions: + wind_speed: [1.,3.,5.,7.,9.,11.,13.,15.,17.,19.,21.,23.,25.,27.,29.] + wave_height_NSS: [0.84,0.84,0.87,0.99,1.15,1.34,1.58,1.82,2.08,2.34,2.66,2.98,3.28,3.77,3.94] + wave_period_NSS: [8.3,8.3,8.3,7.7,7.1,6.3,6.1,6.2,6.2,6.7,7.1,7.1,7.7,7.7,7.7] + wave_height_fatigue: [0.84,0.84,0.87,0.99,1.15,1.34,1.58,1.82,2.08,2.34,2.66,2.98,3.28,3.77,3.94] + wave_period_fatigue: [8.3,8.3,8.3,7.7,7.1,6.3,6.1,6.2,6.2,6.7,7.1,7.1,7.7,7.7,7.7] + wave_height_SSS: [9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7] + wave_period_SSS: [13.6,13.6,13.6,13.6,13.6,13.6,13.6,13.6,13.6,13.6,13.6,13.6,13.6,13.6,13.6] + wave_height1: 5.9 + wave_period1: 11.2 + wave_height50: 9.7 + wave_period50: 13.6 + DLCs: # Currently supported IEC 1.1, 1.3, 1.4, 1.5, 5.1, 6.1, 6.3, or define a Custom one + - DLC: "1.1" + ws_bin_size: 5 + n_seeds: 2 + # analysis_time: 5. + # transient_time: 5. + # wind_speed: [3., 5., 7., 9., 11., 13., 15., 17., 19., 21., 23., 25.] + turbulent_wind: + HubHt: 110 + GridHeight: 160 + GridWidth: 160 + +The ``metocean_conditions`` are defined using tables of ``wind_speed``, ``wave_height``, and ``wave_period`` for normal sea states (``NSS``) and severe sea states (``SSS``), and sea states representative of 1- and 50-year return periods. +Individual DLCs use these conditions to determine specific sea conditions for each case, but they can also be overwritten in each case. + +Users can specify the wind speed bin size (``ws_bin_size``) or the specific wind speeds (``wind_speed``). +The number of seeds (``n_seed``) and specifics about the turbsim inputs (link?, ``turbulent_wind``) can also be specified. +``transient_time`` is excluded from timeseries analysis; only ``analysis_time`` is used. +A complete listing of the DLC options can be found here `DLC options`_ below. + +------------------- +Reviewing DLC Cases +------------------- + +The DLC Case Matrix +------------------- + +WEIS creates a case matrix for each DLC; this case matrix, is located in the same directory as the openfast runs in both yaml and txt format. +The case matrix specifies which inputs are changed for each case. +An example case matrix is shown next:: + + Case_ID AeroDyn15 AeroDyn15 ElastoDyn ElastoDyn ElastoDyn ElastoDyn ElastoDyn Fst Fst HydroDyn HydroDyn HydroDyn InflowWind TurbSim + WakeMod tau1_const BlPitch1 BlPitch2 BlPitch3 NacYaw RotSpeed TMax TStart WaveHs WaveMod WaveTp HWindSpeed RandSeed1 + 0 1 25.353075267567498 0.000535 0.000535 0.000535 0 5.6819 10.0 0.0 9.7 2 13.6 8.0 1501552846 + 1 1 25.353075267567498 0.000535 0.000535 0.000535 0 5.6819 10.0 0.0 9.7 2 13.6 8.0 488200390 + 2 1 9.536058651858337 9.189114 9.189114 9.189114 0 7.559987 10.0 0.0 9.7 2 13.6 15.0 1693606511 + 3 1 9.536058651858337 9.189114 9.189114 9.189114 0 7.559987 10.0 0.0 9.7 2 13.6 15.0 680233354 + +This case matrix represents DLC 6.1 and shows the initial conditions (BlPitch*, RotSpeed) as well as the sea state (WaveHs, WaveTp) and wind condtions (HWindSpeed, RandSeed1) for each case. + +Modeling Option Outputs +----------------------- + +Additionally, the DLC options are outputted in the modeling options of WEIS. +These outputs can be used as inputs for future runs to exactly reproduce specific cases:: + + DLC_driver: + DLCs: + - DLC: '1.1' + wind_speed: [3.0, 5.0, 7.0, 9.0, 11.0, 13.0, 15.0, 17.0, 19.0, 21.0, 23.0, 25.0] + ws_bin_size: 2 + n_seeds: 1 + n_azimuth: 1 + wind_seed: [1501552846, 488200390, 1693606511, 680233354, 438466540, 1712329281, 1380152456, 1452245847, 2122694022, 839901364, 1802651553, 714712467] + wave_seeds: [304524126, 1192975140, 1668389755, 489172031, 349375909, 208787680, 426140584, 37937012, 1601914564, 1619243266, 413287548, 918595805] + wind_heading: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + turbine_status: operating + wave_period: [8.3, 8.3, 7.7, 7.1, 6.3, 6.1, 6.2, 6.2, 6.7, 7.1, 7.1, 7.7] + wave_height: [0.84, 0.87, 0.99, 1.15, 1.34, 1.58, 1.82, 2.08, 2.34, 2.66, 2.98, 3.28] + wave_heading: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + wave_gamma: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + probabilities: [0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333] + IEC_WindType: NTM + analysis_time: 600.0 + transient_time: 120.0 + shutdown_time: 9999 + turbulent_wind: {flag: false, Echo: false, RandSeed1: 1, RandSeed2: RANLUX, WrBHHTP: false, WrFHHTP: false, WrADHH: false, WrADFF: true, WrBLFF: false, WrADTWR: false, WrFMTFF: false, WrACT: false, Clockwise: false, ScaleIEC: 0, NumGrid_Z: 25, NumGrid_Y: 25, TimeStep: 0.05, UsableTime: ALL, HubHt: 0, GridHeight: 0, GridWidth: 0, VFlowAng: 0.0, HFlowAng: 0.0, TurbModel: IECKAI, UserFile: unused, IECstandard: 1-ED3, ETMc: default, WindProfileType: PL, ProfileFile: unused, RefHt: 0, URef: -1, IECturbc: -1, ZJetMax: default, PLExp: -1, Z0: default, Latitude: default, RICH_NO: 0.05, UStar: default, ZI: default, PC_UW: default, PC_UV: default, PC_VW: default, SCMod1: default, SCMod2: default, SCMod3: default, InCDec1: default, InCDec2: default, InCDec3: default, CohExp: default, CTEventPath: unused, CTEventFile: RANDOM, Randomize: true, DistScl: 1.0, CTLy: 0.5, CTLz: 0.5, CTStartTime: 30} + wake_mod: 1 + wave_model: 2 + label: '1.1' + sea_state: normal + PSF: 1.35 + yaw_misalign: [0] + total_time: 720.0 + pitch_initial: [2.426047, 0.377375, 0.000535, 0.000535, 1.170321, 6.052129, 9.189114, 11.824437, 14.19975, 16.42107, 18.525951, 20.553121] + rot_speed_initial: [5.000012, 5.000012, 5.000012, 6.390847, 7.559987, 7.559987, 7.559987, 7.559987, 7.559987, 7.559987, 7.559987, 7.559987] + tau1_const: [69.824578732105, 40.971862185516514, 29.12612763770409, 22.53606690450444, 16.17186559734712, 11.569392828413536, 9.536058651858337, 8.207963142590629, 7.2407552404030975, 6.493729028184553, 5.894677553483227, 5.401388775677793] + +-------------------------------- +Expected DLC Outputs in OpenFAST +-------------------------------- + +.. For each: +.. Short description. +.. Defaults? +.. Timeseries + +Power production (1.X) +----------------------- + +In all the power producing DLCs (1.X), the wind turbine should be running and connected to an electrical load. +According to the standard, deviations from theoretical operating conditions (like yaw misalignment0 should be considered). +``yaw_misalign`` is an available option for all these cases; the default is 0 deg. for all 1.X cases. +DLC 1.X simulations all use a normal turbulence model. The class and type is set in the ``assembly`` options in the geometry input. +For DLCs 1.1--1.5, a normal sea state is used, based on the modeling options ``(DLC_driver,metocean_conditions,wave_height_NSS)``. +These wave heights correspond to the ``wind_speed`` input in the ``(DLC_driver,metocean_conditions))`` table. +There is a similar option for ``wave_period_NSS``. + + +DLC 1.1 +------- +Normal turbulence and sea state, specified using the options described above, with wind speeds spanning the operational wind speeds. +Specific wind speeds can be selected with the ``(DLC_driver,DLCs,DLC: "1.1", wind_speed)`` input. +The default number of seeeds ``(DLC_driver,DLCs,DLC: "1.1", n_seeds)`` is 1, but more (6 or 12) are typically used to achieve convergence. + +.. figure:: /images/dlcs/DLC11.png + :align: center + :width: 70% + +In this demonstration we show a below rated (7 m/s, weis_job_02), near rated (11 m/s, weis_job_04), and above rated (17 m/s, weis_job_07) simulation. + + +DLC 1.2 +------- + +DLC 1.2 simulations are very similar to DLC 1.1 simulation. More metocean combinations can be specified, along with their probabilities using the following options:: + + DLC_driver: + metocean_conditions: + wind_speed: [1.,3.,5.,7.,9.,11.,13.,15.,17.,19.,21.,23.,25.,27.,29.] + wave_height_fatigue: [0.84,0.84,0.87,0.99,1.15,1.34,1.58,1.82,2.08,2.34,2.66,2.98,3.28,3.77,3.94] + wave_period_fatigue: [8.3,8.3,8.3,7.7,7.1,6.3,6.1,6.2,6.2,6.7,7.1,7.1,7.7,7.7,7.7] + probabilities: [0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05] + +Note that postprocessing using these probabilities is currently under construction, with an anticipated release in Q2 of 2025. + + +DLC 1.3 +------- + +DLC 1.3 is used for ultimate loading with the extreme turbulence model (ETM) and a normal sea state. +Note that the standard specifies some guidance for the scaling of this turbulence based on the extrapolation of DLC 1.1 results; this is not yet included in WEIS. + +.. figure:: /images/dlcs/DLC13.png + :align: center + :width: 70% + +Here, we compare a DLC 1.1 simulation with a DLC 1.3 simulation and note the differences in wind speed (Wind1VelX), control signals, and tower loading. + +DLC 1.4 +------- + +DLC 1.4 models an extreme coherent gust with direction change (ECD) transient event that causes ultimate loading. +The WEIS DLC driver simulates this case across wind speeds, but the standard specifies that it only needs to be simulated near rated conditions. +At each wind speed, both a positive and negative change in direction will be simulated. +For each of those cases, users can specify the ``n_azimuth`` input to start the simulation at evenly spaced azimuthal positions from 0 to 120 deg. to ensure a full sampling of the blade loads when the gust occurs. + +.. figure:: /images/dlcs/DLC14.png + :align: center + :width: 70% + +DLC 1.5 +------- +In thise case, we model an extreme wind shear (EWS) event. Both positive and negative direciton shears are generated, along with horizontal and vertical shear. + +.. figure:: /images/dlcs/DLC15.png + :align: center + :width: 70% + + +DLC 1.6 +------- + +DLC 1.6 models a turbine operating in normal turbulence with a severe sea state. The severe sea state is determined based on the ``metocean`` inputs of the DLC driver as follows:: + + metocean_conditions: + wind_speed: [1.,3.,5.,7.,9.,11.,13.,15.,17.,19.,21.,23.,25.,27.,29.] + wave_height_SSS: [9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7,9.7] + wave_period_SSS: [13.6,13.6,13.6,13.6,13.6,13.6,13.6,13.6,13.6,13.6,13.6,13.6,13.6,13.6,13.6] + +Note that ``wind_speed`` in the ``metocean_conditions`` table is shared with the ``NSS`` inputs to the table. + +.. figure:: /images/dlcs/DLC16.png + :align: center + :width: 70% + +Here, we compare a DLC 1.1 simulation with a DLC 1.6 and the extreme waves modeled in that case. + + +Power production with fault (2.X) +--------------------------------- +DLCs 2.X involves cases where faults turbine and/or loss of electrical network connection occurs while the turbine is producing power and connected to an electircal load. +In additions to the options used to describe power production, DLC 2.X allow foroptions to descibe blade pitch, generator and yaw faults. +The azimuth position for the rotor at the time of a fault may have significant influence on the load levels. +Therefore, the `azimuth_init` is required for DLC 2.X. + +DLC 2.1 +------- +DLC 2.1 related to normal control system fault or loss of electrical network. +The faults included in this DLC are: blade pitch fault, yaw position fault and, loss of electrical network. +What is a pitch +'pitchfault_time1','pitchfault_blade1pos' +This DLC is evaulated for normal sea-state and normal turbulence model. +The partial safety factor for this DLC is assumed to be 1.35. +The azimuth position at time of occurrence of the fault is randomly selected. + + +.. DLC 2.2 +.. """"""" +.. Some genfault in 2.1 should be moved to 2.2, needs discussion +plot of inflow, control signal, power, one load signal + +DLC 2.3 +""""""" +DLC 2.3 related to loss of electrical network under gust +This DLC is evaulated for normal sea-state and extreme operating guest. +The partial safety factor for this DLC is assumed to be 1.35. +The azimuth position at time of occurrence of the fault is randomly selected. + +.. DLC 2.4 +.. ------- + +.. DLC 3.1 +.. ------- + +.. DLC 3.2 +.. ------- + +.. DLC 3.3 +.. ------- + +.. DLC 4.1 +.. ------- + +.. DLC 4.2 +.. ------- + +.. DLC 5.1 +.. ------- + +.. DLC 6.1 +.. ------- + +.. DLC 6.2 +.. ------- + +.. DLC 6.3 +.. ------- + +.. DLC 6.4 +.. ------- + +.. DLC 7.1 +.. ------- + +.. DLC 7.2 +.. ------- + +.. DLC AEP (DZ) +.. ------- + + + +.. ------------------------ +.. User-defined DLC Example +.. ------------------------ + + +------------------------------------ +Setting Up DLCs (for developers) +------------------------------------ + +In the dlc_generator class (``/weis/dlc_driver/dlc_generator.py``), you can add new functions for additional DLCs. +Several examples are already there, like ``generate_2p3()``. New functions should follow the ``generate_*`` naming convention. Note that ``.`` is automatically mapped to ``p``. + +The function should start with some helpful comments:: + + # Power production normal turbulence model - normal sea state + +The ``dlc_options`` dictionary contains inputs for that particular DLC in the modeling options. Default options include some modeling options common across DLCs.:: + + # Get default options + dlc_options.update(self.default_options) + +Next, options specific to that DLC hard-coded in the function. Error checking may be helpful here, too:: + + # Handle DLC Specific options: + dlc_options['label'] = '1.1' + dlc_options['sea_state'] = 'normal' + dlc_options['PSF'] = 1.35 + + # Set yaw_misalign, else default + if 'yaw_misalign' in dlc_options: + dlc_options['yaw_misalign'] = dlc_options['yaw_misalign'] + else: # default + dlc_options['yaw_misalign'] = [0] + +Now, the special part happens, where we define groups of variables that are grouped and the cases are a cartesian product of the groups. +For example in this DLC 1.1 example:: + + # DLC-specific: define groups + # These options should be the same length and we will generate a matrix of all cases + generic_case_inputs = [] + generic_case_inputs.append(['total_time','transient_time']) # group 0, (usually constants) turbine variables, DT, aero_modeling + generic_case_inputs.append(['wind_speed','wave_height','wave_period', 'wind_seed','wave_seed']) # group 1, initial conditions will be added here, define some method that maps wind speed to ICs and add those variables to this group + generic_case_inputs.append(['yaw_misalign']) # group 2 + +The time and other constant options are in the first group. This group usually has a length of one. +Wind speed, wave height, wave period, and the seeds are varied together in the second group. +For example the wind speed may be 8, 10, and 12, and the corresponding wave height/period will vary with the wind speed. +Initial conditions are automatically applied in this group via linear interpolation. Search for the ``initial_condition_table`` dictionary. +The wind speed and other metocean conditions are added to the dlc_options automatically. +The developer only needs to provide specific values in certain cases, like DLC 6.1. +If the user also wants to vary the yaw_misalign, those offsets will be applied on each wind speed. + +Finally, the ``generate_cases`` method will do the rest of the work and (hopefully) check for errors along the way:: + + self.generate_cases(generic_case_inputs,dlc_options) + +Any options you want to vary across should be added to the ``dlc_options`` dictionary. + + +.. _DLC options: + +------------------------ +DLC Option Input Listing +------------------------ + +The following inputs are a subset of the options available in the ``modeling_options`` file. + +.. jsonschema:: inputs/modeling_schema.json#/definitions/DLC_driver + :hide_key_if_empty: /**/default diff --git a/docs/index.rst b/docs/index.rst index 479ee2610..c21030311 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -30,6 +30,14 @@ WEIS Visualization APP how_weis_viz_works +DLC Generator +============= + +.. toctree:: + :maxdepth: 2 + + dlc_generator + Optimization in WEIS ==================== diff --git a/docs/inputs/geometry_schema.rst b/docs/inputs/geometry_schema.rst index 7796fcd14..92f6c4e67 100644 --- a/docs/inputs/geometry_schema.rst +++ b/docs/inputs/geometry_schema.rst @@ -6,6 +6,6 @@ Significant effort has been invested to develop an _ontology_ for wind turbines Full documentation of the WISDEM geometry input file can be found at the `WindIO documentation `_ -.. jsonschema:: geometry_schema.json - :hide_key_if_empty: /**/default +.. .. jsonschema:: geometry_schema.json +.. :hide_key_if_empty: /**/default diff --git a/docs/requirements.txt b/docs/requirements.txt index c598b9b92..e69de29bb 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,16 +0,0 @@ -# Requirements list for WEIS - -# simulation -matplotlib -numpy -scipy -openmdao>=3.2 -simpy -marmot-agents - -# docs -sphinx>2.0 -numpydoc -sphinxcontrib-bibtex<2.0.0 -sphinx-rtd-theme -# sphinx-autoapi diff --git a/environment.yml b/environment.yml index ac2425b3a..373f1bd01 100644 --- a/environment.yml +++ b/environment.yml @@ -16,7 +16,7 @@ dependencies: - pip - pyhams>=1.3 #- pyoptsparse - - rosco>=2.9.2 + - rosco>=2.9.4 - smt - wisdem>=3.16.4 - pip: diff --git a/examples/02_run_openfast_cases/modeling_options.yaml b/examples/02_run_openfast_cases/modeling_options.yaml index acd9ce254..28d925def 100644 --- a/examples/02_run_openfast_cases/modeling_options.yaml +++ b/examples/02_run_openfast_cases/modeling_options.yaml @@ -49,12 +49,12 @@ DLC_driver: - DLC: "6.1" analysis_time: 10. transient_time: 0.1 + wind_speed: [46.789] turbulent_wind: HubHt: 142 RefHt: 142 GridHeight: 275 GridWidth: 275 - URef: 46.789 PLExp: 0.14 IECturbc: 0.12 diff --git a/examples/02_run_openfast_cases/modeling_options_loads.yaml b/examples/02_run_openfast_cases/modeling_options_loads.yaml index 705bcd688..39f1d0d49 100644 --- a/examples/02_run_openfast_cases/modeling_options_loads.yaml +++ b/examples/02_run_openfast_cases/modeling_options_loads.yaml @@ -50,30 +50,11 @@ DLC_driver: wave_height50: 9.7 wave_period50: 13.6 DLCs: - # - DLC: "1.1" - # n_seeds: 1 - # wind_speed: [4] - # - DLC: "1.3" - # n_seeds: 6 - # - DLC: "1.4" - # wind_speed: [8.6, 10.6, 12.6] - # n_seeds: 2 - # n_azimuth: 3 - # - DLC: "1.5" - # - DLC: "1.6" - # n_seeds: 1 - # wind_speed: [12] - # yaw_misalign: [-8,8] - # analysis_time: 10. - # transient_time: 0. - # - DLC: "1.6" - # n_seeds: 1 - # wind_speed: [12] - # wave_heading: [30] - # analysis_time: 10. - # transient_time: 0. - # - DLC: "6.3" - # n_seeds: 6 + - DLC: "1.6" + wind_speed: [8,15] + n_seeds: 2 + analysis_time: 10. + transient_time: 0.0 - DLC: "5.1" wind_speed: [12] n_seeds: 1 @@ -81,18 +62,4 @@ DLC_driver: analysis_time: 20. shutdown_time: 10. transient_time: 0.0 - # - DLC: "6.5" - # yaw_misalign: [-8.,8.] - # wave_height: [12.57] - # wave_period: [16.0] - # transient_time: 0.0 - # wave_gamma: [1.2] - # analysis_time: 10. - # turbulent_wind: - # HubHt: 140 - # GridHeight: 220 - # GridWidth: 220 - # URef: 54.8339 - # PLExp: 0.12 - diff --git a/examples/05_IEA-3.4-130-RWT/modeling_options.yaml b/examples/05_IEA-3.4-130-RWT/modeling_options.yaml index dcca357f3..0aabb7055 100644 --- a/examples/05_IEA-3.4-130-RWT/modeling_options.yaml +++ b/examples/05_IEA-3.4-130-RWT/modeling_options.yaml @@ -128,19 +128,6 @@ DLC_driver: ws_bin_size: 10 analysis_time: 5. transient_time: 5. - - DLC: "6.5" - yaw_misalign: [-8.,8.] - wave_height: [12.57] - wave_period: [16.0] - transient_time: 0.0 - wave_gamma: [1.2] - analysis_time: 10. - # turbulent_wind: - # HubHt: 140 - # GridHeight: 220 - # GridWidth: 220 - # URef: 54.8339 - # PLExp: 0.12 # - DLC: Custom # wind_speed: [10., 12, 14] diff --git a/examples/15_RAFT_Studies/raft_input_weis.yaml b/examples/15_RAFT_Studies/raft_input_weis.yaml new file mode 100644 index 000000000..470ef1ab4 --- /dev/null +++ b/examples/15_RAFT_Studies/raft_input_weis.yaml @@ -0,0 +1,1983 @@ +type: [input dictionary for RAFT] +name: [refturb_output] +comments: [none] +settings: {XiStart: 0.0, min_freq: 0.0159, max_freq: 0.3183, nIter: 15} +site: {water_depth: 200.0, rho_air: 1.225, rho_water: 1025.0, mu_air: 1.81e-05, shearExp: 0.12} +turbine: + mRNA: 951840.4416139615 + IxRNA: 409461632.2627004 + IrRNA: 278545821.52289987 + xCG_RNA: -7.3422980746742255 + hHub: 150.0 + overhang: 12.0313 + Fthrust: 3791040.342084202 + yaw_stiffness: 9286691506.067833 + gear_ratio: 1.0 + tower: + name: tower + type: 1 + rA: [0.0, 0.0, 15.0] + rB: [0.0, 0.0, 144.386] + shape: circ + gamma: 0.0 + stations: [0.0, 0.10047454902385111, 0.20094909804770222, 0.30142364707155334, 0.40189819609540445, 0.5023727451192556, 0.6028472941431067, 0.7033218431669578, 0.8037963921908089, 0.90427094121466, 1.0] + d: [10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 6.5] + t: [0.09, 0.0870568244887821, 0.06969791129654272, 0.06659467020278927, 0.048969783194233195, 0.04562355995431616, 0.028128174258004363, 0.025616868141627953, 0.009881156462835017, 0.009941082963793929, 0.005931142626464429] + Cd: [0.7136445270091933, 0.7136445270091933, 0.7136445270091933, 0.7136445270091933, 0.7136445270091933, 0.7136445270091933, 0.7136445270091933, 0.7136445270091933, 0.7136445270091933, 0.7136445270091933, 0.7018751605201591] + Ca: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + CdEnd: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + CaEnd: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + rho_shell: 7800.0 + nBlades: 3 + shaft_tilt: 6.0 + precone: 4.0 + Zhub: 150.0 + Rhub: 3.97 + I_drivetrain: 349679043.76099414 + blade: + geometry: + - [3.97, 5.2, 15.594553019711718, 0.0, 0.0] + - [8.009448011426317, 5.2265040720520535, 15.488273108365346, 0.034295923985786604, 0.0] + - [12.048896022852633, 5.319400683825207, 14.71353124178717, 0.08329262571797669, 0.0] + - [16.088344034278947, 5.4580745530036845, 13.333617291568489, 0.1392555188551465, 0.0] + - [20.127792045705267, 5.603038107463281, 11.64349455458099, 0.19190331656176873, 0.0] + - [24.16724005713158, 5.718286587458929, 9.927004257169598, 0.232028257864551, 0.0] + - [28.206688068557895, 5.764630606410189, 8.44548693054192, 0.24918042933165166, 0.0] + - [32.24613607998422, 5.715053106286686, 7.300998417700017, 0.2496141741724728, 0.0] + - [36.285584091410534, 5.539182293334066, 6.228888266329778, 0.24625256887234165, 0.0] + - [40.32503210283684, 5.290780459215475, 5.229058385210934, 0.2404720106240574, 0.0] + - [44.36448011426316, 5.034005694445184, 4.345869365684453, 0.23297926741790076, 0.0] + - [48.403928125689475, 4.815660040795825, 3.606791508890919, 0.2179571400171469, 0.0] + - [52.443376137115784, 4.623237527554848, 2.9798194943332845, 0.17712118065470675, 0.0] + - [56.48282414854211, 4.432040224442178, 2.4229574992772953, 0.10030156784192272, 0.0] + - [60.52227215996842, 4.2451981651395, 1.9243945072809063, 1.126605912840715e-05, 0.0] + - [64.56172017139475, 4.065767388212587, 1.4686902287805779, -0.11231262929473985, 0.0] + - [68.60116818282106, 3.896040232078195, 1.0565354306085457, -0.24379916019447512, 0.0] + - [72.64061619424737, 3.7350841723423227, 0.6927184228293563, -0.4153387722179258, 0.0] + - [76.68006420567369, 3.5792063535409593, 0.3553347025744227, -0.6207684349190539, 0.0] + - [80.7195122171, 3.4245801420565267, 0.01833021655638992, -0.8462432424369124, 0.0] + - [84.75896022852633, 3.267946590725438, -0.355885118343244, -1.0798464372334413, 0.0] + - [88.79840823995265, 3.111859691750389, -0.8310248222211819, -1.3290155919297535, 0.0] + - [92.83785625137894, 2.957140175463699, -1.3743361006713515, -1.6021369821922977, 0.0] + - [96.87730426280528, 2.800021994595202, -1.8520979156145947, -1.8948995248383433, 0.0] + - [100.91675227423157, 2.6367899876098777, -2.1407698795062395, -2.201796716438755, 0.0] + - [104.9562002856579, 2.4641317667059357, -2.1741333308415802, -2.5227281124194536, 0.0] + - [108.99564829708422, 2.2834502451238916, -2.1073589596622617, -2.8639215886652067, 0.0] + - [113.03509630851052, 2.0956817072301495, -1.9479166540529262, -3.2248356445430946, 0.0] + - [117.07454431993685, 1.9024851146667074, -1.6623005276253076, -3.6046563533868463, 0.0] + - [121.11399233136315, 0.5000000000000001, -1.2423877062729698, -3.9999999999999996, 0.0] + Rtip: 121.11399233136315 + precurveTip: -3.9999999999999996 + presweepTip: 0.0 + airfoils: + - [0.0, circular] + - [0.02, circular] + - [0.15, SNL-FFA-W3-500] + - [0.24517031675566095, FFA-W3-360] + - [0.3288439506472435, FFA-W3-330blend] + - [0.4391793464459161, FFA-W3-301] + - [0.5376714071084352, FFA-W3-270blend] + - [0.6382076569163737, FFA-W3-241] + - [0.7717438522715817, FFA-W3-211] + - [1.0, FFA-W3-211] + airfoils: + - name: circular + relative_thickness: 1.0 + data: + - [-180.0, 0.0001, 0.35, -0.0001] + - [-177.0, 0.0001, 0.35, -0.0001] + - [-174.0, 0.0001, 0.35, -0.0001] + - [-171.0, 0.0001, 0.35, -0.0001] + - [-168.0, 0.0001, 0.35, -0.0001] + - [-165.0, 0.0001, 0.35, -0.0001] + - [-162.0, 0.0001, 0.35, -0.0001] + - [-159.0, 0.0001, 0.35, -0.0001] + - [-156.0, 0.0001, 0.35, -0.0001] + - [-153.0, 0.0001, 0.35, -0.0001] + - [-149.99999999999997, 0.0001, 0.35, -0.0001] + - [-147.0, 0.0001, 0.35, -0.0001] + - [-144.0, 0.0001, 0.35, -0.0001] + - [-140.99999999999997, 0.0001, 0.35, -0.0001] + - [-138.0, 0.0001, 0.35, -0.0001] + - [-135.0, 0.0001, 0.35, -0.0001] + - [-131.99999999999997, 0.0001, 0.35, -0.0001] + - [-129.0, 0.0001, 0.35, -0.0001] + - [-126.0, 0.0001, 0.35, -0.0001] + - [-122.99999999999999, 0.0001, 0.35, -0.0001] + - [-119.99999999999999, 0.0001, 0.35, -0.0001] + - [-117.0, 0.0001, 0.35, -0.0001] + - [-114.0, 0.0001, 0.35, -0.0001] + - [-110.99999999999999, 0.0001, 0.35, -0.0001] + - [-108.0, 0.0001, 0.35, -0.0001] + - [-105.0, 0.0001, 0.35, -0.0001] + - [-101.99999999999999, 0.0001, 0.35, -0.0001] + - [-98.99999999999999, 0.0001, 0.35, -0.0001] + - [-96.0, 0.0001, 0.35, -0.0001] + - [-92.99999999999999, 0.0001, 0.35, -0.0001] + - [-89.99999999999999, 0.0001, 0.35, -0.0001] + - [-87.0, 0.0001, 0.35, -0.0001] + - [-83.99999999999999, 0.0001, 0.35, -0.0001] + - [-80.99999999999999, 0.0001, 0.35, -0.0001] + - [-78.0, 0.0001, 0.35, -0.0001] + - [-74.99999999999999, 0.0001, 0.35, -0.0001] + - [-71.99999999999999, 0.0001, 0.35, -0.0001] + - [-69.0, 0.0001, 0.35, -0.0001] + - [-65.99999999999999, 0.0001, 0.35, -0.0001] + - [-63.0, 0.0001, 0.35, -0.0001] + - [-59.999999999999986, 0.0001, 0.35, -0.0001] + - [-56.99999999999999, 0.0001, 0.35, -0.0001] + - [-54.0, 0.0001, 0.35, -0.0001] + - [-50.999999999999986, 0.0001, 0.35, -0.0001] + - [-47.99999999999999, 0.0001, 0.35, -0.0001] + - [-45.0, 0.0001, 0.35, -0.0001] + - [-41.999999999999986, 0.0001, 0.35, -0.0001] + - [-38.99999999999999, 0.0001, 0.35, -0.0001] + - [-36.0, 0.0001, 0.35, -0.0001] + - [-32.999999999999986, 0.0001, 0.35, -0.0001] + - [-29.999999999999996, 0.0001, 0.35, -0.0001] + - [-29.393939393939394, 0.0001, 0.35, -0.0001] + - [-28.787878787878785, 0.0001, 0.35, -0.0001] + - [-28.18181818181818, 0.0001, 0.35, -0.0001] + - [-27.575757575757574, 0.0001, 0.35, -0.0001] + - [-26.969696969696965, 0.0001, 0.35, -0.0001] + - [-26.363636363636363, 0.0001, 0.35, -0.0001] + - [-25.757575757575754, 0.0001, 0.35, -0.0001] + - [-25.15151515151515, 0.0001, 0.35, -0.0001] + - [-24.545454545454543, 0.0001, 0.35, -0.0001] + - [-23.939393939393938, 0.0001, 0.35, -0.0001] + - [-23.33333333333333, 0.0001, 0.35, -0.0001] + - [-22.727272727272727, 0.0001, 0.35, -0.0001] + - [-22.12121212121212, 0.0001, 0.35, -0.0001] + - [-21.515151515151512, 0.0001, 0.35, -0.0001] + - [-20.90909090909091, 0.0001, 0.35, -0.0001] + - [-20.3030303030303, 0.0001, 0.35, -0.0001] + - [-19.696969696969695, 0.0001, 0.35, -0.0001] + - [-19.09090909090909, 0.0001, 0.35, -0.0001] + - [-18.484848484848484, 0.0001, 0.35, -0.0001] + - [-17.878787878787875, 0.0001, 0.35, -0.0001] + - [-17.272727272727273, 0.0001, 0.35, -0.0001] + - [-16.666666666666664, 0.0001, 0.35, -0.0001] + - [-16.06060606060606, 0.0001, 0.35, -0.0001] + - [-15.454545454545455, 0.0001, 0.35, -0.0001] + - [-14.848484848484848, 0.0001, 0.35, -0.0001] + - [-14.24242424242424, 0.0001, 0.35, -0.0001] + - [-13.636363636363633, 0.0001, 0.35, -0.0001] + - [-13.03030303030303, 0.0001, 0.35, -0.0001] + - [-12.424242424242424, 0.0001, 0.35, -0.0001] + - [-11.818181818181817, 0.0001, 0.35, -0.0001] + - [-11.212121212121213, 0.0001, 0.35, -0.0001] + - [-10.606060606060606, 0.0001, 0.35, -0.0001] + - [-9.999999999999998, 0.0001, 0.35, -0.0001] + - [-9.393939393939394, 0.0001, 0.35, -0.0001] + - [-8.787878787878787, 0.0001, 0.35, -0.0001] + - [-8.18181818181818, 0.0001, 0.35, -0.0001] + - [-7.575757575757576, 0.0001, 0.35, -0.0001] + - [-6.96969696969697, 0.0001, 0.35, -0.0001] + - [-6.363636363636362, 0.0001, 0.35, -0.0001] + - [-5.757575757575755, 0.0001, 0.35, -0.0001] + - [-5.151515151515151, 0.0001, 0.35, -0.0001] + - [-4.545454545454545, 0.0001, 0.35, -0.0001] + - [-3.9393939393939377, 0.0001, 0.35, -0.0001] + - [-3.333333333333334, 0.0001, 0.35, -0.0001] + - [-2.7272727272727266, 0.0001, 0.35, -0.0001] + - [-2.1212121212121198, 0.0001, 0.35, -0.0001] + - [-1.515151515151516, 0.0001, 0.35, -0.0001] + - [-0.9090909090909121, 0.0001, 0.35, -0.0001] + - [-0.30303030303030193, 0.0001, 0.35, -0.0001] + - [0.30303030303030193, 0.0001, 0.35, -0.0001] + - [0.9090909090909121, 0.0001, 0.35, -0.0001] + - [1.515151515151516, 0.0001, 0.35, -0.0001] + - [2.1212121212121198, 0.0001, 0.35, -0.0001] + - [2.72727272727273, 0.0001, 0.35, -0.0001] + - [3.333333333333334, 0.0001, 0.35, -0.0001] + - [3.9393939393939377, 0.0001, 0.35, -0.0001] + - [4.545454545454548, 0.0001, 0.35, -0.0001] + - [5.151515151515151, 0.0001, 0.35, -0.0001] + - [5.757575757575755, 0.0001, 0.35, -0.0001] + - [6.363636363636366, 0.0001, 0.35, -0.0001] + - [6.96969696969697, 0.0001, 0.35, -0.0001] + - [7.5757575757575735, 0.0001, 0.35, -0.0001] + - [8.181818181818183, 0.0001, 0.35, -0.0001] + - [8.787878787878787, 0.0001, 0.35, -0.0001] + - [9.393939393939391, 0.0001, 0.35, -0.0001] + - [10.000000000000002, 0.0001, 0.35, -0.0001] + - [10.606060606060606, 0.0001, 0.35, -0.0001] + - [11.21212121212121, 0.0001, 0.35, -0.0001] + - [11.818181818181818, 0.0001, 0.35, -0.0001] + - [12.424242424242424, 0.0001, 0.35, -0.0001] + - [13.030303030303028, 0.0001, 0.35, -0.0001] + - [13.636363636363637, 0.0001, 0.35, -0.0001] + - [14.24242424242424, 0.0001, 0.35, -0.0001] + - [14.848484848484844, 0.0001, 0.35, -0.0001] + - [15.454545454545455, 0.0001, 0.35, -0.0001] + - [16.06060606060606, 0.0001, 0.35, -0.0001] + - [16.666666666666664, 0.0001, 0.35, -0.0001] + - [17.272727272727273, 0.0001, 0.35, -0.0001] + - [17.878787878787875, 0.0001, 0.35, -0.0001] + - [18.484848484848488, 0.0001, 0.35, -0.0001] + - [19.09090909090909, 0.0001, 0.35, -0.0001] + - [19.696969696969695, 0.0001, 0.35, -0.0001] + - [20.303030303030305, 0.0001, 0.35, -0.0001] + - [20.90909090909091, 0.0001, 0.35, -0.0001] + - [21.515151515151512, 0.0001, 0.35, -0.0001] + - [22.12121212121212, 0.0001, 0.35, -0.0001] + - [22.727272727272727, 0.0001, 0.35, -0.0001] + - [23.33333333333333, 0.0001, 0.35, -0.0001] + - [23.93939393939394, 0.0001, 0.35, -0.0001] + - [24.545454545454543, 0.0001, 0.35, -0.0001] + - [25.15151515151515, 0.0001, 0.35, -0.0001] + - [25.757575757575758, 0.0001, 0.35, -0.0001] + - [26.363636363636363, 0.0001, 0.35, -0.0001] + - [26.969696969696965, 0.0001, 0.35, -0.0001] + - [27.57575757575757, 0.0001, 0.35, -0.0001] + - [28.181818181818173, 0.0001, 0.35, -0.0001] + - [28.78787878787879, 0.0001, 0.35, -0.0001] + - [29.393939393939394, 0.0001, 0.35, -0.0001] + - [29.999999999999996, 0.0001, 0.35, -0.0001] + - [32.99999999999999, 0.0001, 0.35, -0.0001] + - [36.0, 0.0001, 0.35, -0.0001] + - [39.0, 0.0001, 0.35, -0.0001] + - [41.99999999999999, 0.0001, 0.35, -0.0001] + - [45.0, 0.0001, 0.35, -0.0001] + - [48.0, 0.0001, 0.35, -0.0001] + - [50.99999999999999, 0.0001, 0.35, -0.0001] + - [54.0, 0.0001, 0.35, -0.0001] + - [57.00000000000001, 0.0001, 0.35, -0.0001] + - [60.00000000000001, 0.0001, 0.35, -0.0001] + - [63.0, 0.0001, 0.35, -0.0001] + - [65.99999999999999, 0.0001, 0.35, -0.0001] + - [69.00000000000001, 0.0001, 0.35, -0.0001] + - [72.0, 0.0001, 0.35, -0.0001] + - [75.0, 0.0001, 0.35, -0.0001] + - [78.00000000000001, 0.0001, 0.35, -0.0001] + - [81.0, 0.0001, 0.35, -0.0001] + - [84.0, 0.0001, 0.35, -0.0001] + - [87.00000000000001, 0.0001, 0.35, -0.0001] + - [90.0, 0.0001, 0.35, -0.0001] + - [92.99999999999999, 0.0001, 0.35, -0.0001] + - [96.00000000000001, 0.0001, 0.35, -0.0001] + - [99.0, 0.0001, 0.35, -0.0001] + - [101.99999999999999, 0.0001, 0.35, -0.0001] + - [105.00000000000001, 0.0001, 0.35, -0.0001] + - [108.0, 0.0001, 0.35, -0.0001] + - [111.00000000000001, 0.0001, 0.35, -0.0001] + - [114.00000000000001, 0.0001, 0.35, -0.0001] + - [117.0, 0.0001, 0.35, -0.0001] + - [120.00000000000001, 0.0001, 0.35, -0.0001] + - [123.00000000000001, 0.0001, 0.35, -0.0001] + - [126.0, 0.0001, 0.35, -0.0001] + - [129.00000000000003, 0.0001, 0.35, -0.0001] + - [132.0, 0.0001, 0.35, -0.0001] + - [135.0, 0.0001, 0.35, -0.0001] + - [138.00000000000003, 0.0001, 0.35, -0.0001] + - [141.0, 0.0001, 0.35, -0.0001] + - [144.0, 0.0001, 0.35, -0.0001] + - [147.0, 0.0001, 0.35, -0.0001] + - [150.0, 0.0001, 0.35, -0.0001] + - [153.0, 0.0001, 0.35, -0.0001] + - [156.0, 0.0001, 0.35, -0.0001] + - [159.0, 0.0001, 0.35, -0.0001] + - [162.0, 0.0001, 0.35, -0.0001] + - [165.0, 0.0001, 0.35, -0.0001] + - [168.0, 0.0001, 0.35, -0.0001] + - [171.0, 0.0001, 0.35, -0.0001] + - [174.0, 0.0001, 0.35, -0.0001] + - [177.0, 0.0001, 0.35, -0.0001] + - [180.0, 0.0001, 0.35, -0.0001] + - name: SNL-FFA-W3-500 + relative_thickness: 0.5 + data: + - [-180.0, -0.001508374281199459, 0.0844, -0.0016463979672204404] + - [-177.0, 0.13168266590379715, 0.0844, 0.1374968475748013] + - [-174.0, 0.2647296008181975, 0.0844, 0.2484757971208787] + - [-171.0, 0.39763204773928224, 0.0844, 0.30806855908266645] + - [-168.0, 0.5399989889071862, 0.08664850466189376, 0.3102017794708924] + - [-165.0, 0.7005385454052288, 0.09715826767238156, 0.3007663605487492] + - [-162.0, 0.8339075250842936, 0.11374652330268113, 0.28919500553485206] + - [-159.0, 0.8974453884844592, 0.13526947761954833, 0.28088711627845947] + - [-156.0, 0.9334290699373027, 0.1773442517479671, 0.27552708153272865] + - [-153.0, 0.9581867791651842, 0.23420104691207233, 0.27036702172108534] + - [-149.99999999999997, 0.9673999999455202, 0.29269593149209316, 0.26320065954858457] + - [-147.0, 0.9374723365501789, 0.350420664365802, 0.24744268300568883] + - [-144.0, 0.8700921277698264, 0.41221416180628323, 0.22529522822098505] + - [-140.99999999999997, 0.7988793364454488, 0.4757992619366799, 0.2077361126796687] + - [-138.0, 0.7478565144716669, 0.5400130351025256, 0.20111614165837505] + - [-135.0, 0.7026645965374384, 0.6062722391253047, 0.19658053473715809] + - [-131.99999999999997, 0.6589378839367346, 0.6727318847301421, 0.19378698084531096] + - [-129.0, 0.6142564905395044, 0.7375412872741153, 0.19332699896772113] + - [-126.0, 0.5693873157134297, 0.8020597564369396, 0.19495978740471398] + - [-122.99999999999999, 0.524364341834745, 0.8651544049680129, 0.19775669281436584] + - [-119.99999999999999, 0.47849564844289566, 0.9246053213083825, 0.20080026763230077] + - [-117.0, 0.4314066793092279, 0.9811088872185781, 0.204323410351384] + - [-114.0, 0.38345843602203783, 1.035073810077306, 0.20853891368155564] + - [-110.99999999999999, 0.33506240971358786, 1.0838503432017845, 0.2124998195702135] + - [-108.0, 0.28630500669251274, 1.1267615010104077, 0.21579150651214335] + - [-105.0, 0.23682210220813718, 1.1669502147035637, 0.21912692189931748] + - [-101.99999999999999, 0.1875397638758426, 1.2009462496472094, 0.22154290764184867] + - [-98.99999999999999, 0.13944161786020037, 1.22558245535499, 0.22207334808311838] + - [-96.0, 0.09259582518705402, 1.2471909784871589, 0.22169305820909918] + - [-92.99999999999999, 0.0463322345134402, 1.2639589054802878, 0.22091335240635812] + - [-89.99999999999999, -3.268389946285376e-06, 1.2706999999625708, 0.21979991170397092] + - [-87.0, -0.046337094120789346, 1.2639579554320175, 0.21577351838365852] + - [-83.99999999999999, -0.09259722783212025, 1.2471906855899395, 0.2079318986440016] + - [-80.99999999999999, -0.13943983920096836, 1.2255832848714736, 0.1988548599747143] + - [-78.0, -0.18753818495544794, 1.200948199470907, 0.19018196467609585] + - [-74.99999999999999, -0.23682483455254516, 1.1669529028482497, 0.18052871848240643] + - [-71.99999999999999, -0.2863083265746392, 1.1267641675966864, 0.17031502088870842] + - [-69.0, -0.33505358567171584, 1.0838520514515733, 0.16009092293995722] + - [-65.99999999999999, -0.38341676413047565, 1.035072154500835, 0.14953598249285854] + - [-63.0, -0.43132921648473305, 0.9811030520168087, 0.13885083058129777] + - [-59.999999999999986, -0.4784021758504547, 0.9245973393304503, 0.12849953092267594] + - [-56.99999999999999, -0.5242883894020768, 0.8651479737343893, 0.11843767169238903] + - [-54.0, -0.5693468223720685, 0.8020578669005608, 0.10858782550969723] + - [-50.999999999999986, -0.6142479970729089, 0.7375437076596527, 0.09936439241537001] + - [-47.99999999999999, -0.6589415049637254, 0.6727360185379493, 0.09102408839932381] + - [-45.0, -0.702668073700908, 0.6062763979234854, 0.08327573670005874] + - [-41.999999999999986, -0.7478556038561804, 0.5400165513387399, 0.07608519832168072] + - [-38.99999999999999, -0.7980511466910782, 0.47566750132870583, 0.06955269681782358] + - [-36.0, -0.8612865294586914, 0.4107772596920168, 0.0644279995599259] + - [-32.999999999999986, -0.9239917029757694, 0.34821854119505974, 0.05929961253604659] + - [-29.999999999999996, -0.9674006432185737, 0.29269882069719927, 0.05219979558740971] + - [-29.393939393939394, -0.9729461927330637, 0.28260423241109955, 0.050306126923697604] + - [-28.787878787878785, -0.9784426979159812, 0.27269656734277886, 0.04816216421273469] + - [-28.18181818181818, -0.9838504691463588, 0.2629755929620328, 0.0457755929821767] + - [-27.575757575757574, -0.9891298168032296, 0.2534410767386564, 0.04315409875967925] + - [-26.969696969696965, -0.9942410512656267, 0.24409278614244503, 0.040305367072898036] + - [-26.363636363636363, -0.9991444829125831, 0.2349304886431941, 0.037237083449488735] + - [-25.757575757575754, -1.0038004221231316, 0.2259539517106987, 0.033956933417106996] + - [-25.15151515151515, -1.0081691792763057, 0.21716294281475423, 0.03047260250340848] + - [-24.545454545454543, -1.0122110647511382, 0.20855722942515595, 0.0267917762360489] + - [-23.939393939393938, -1.015886388926662, 0.20013657901169918, 0.02292214014268387] + - [-23.33333333333333, -1.0191554621819103, 0.19190075904417916, 0.018871379750969083] + - [-22.727272727272727, -1.0219785948959164, 0.18384953699239123, 0.014647180588560228] + - [-22.12121212121212, -1.0243160974477123, 0.17598268032613065, 0.010257228183112935] + - [-21.515151515151512, -1.0261282802163325, 0.1682999565151927, 0.005709208062282893] + - [-20.90909090909091, -1.0273754535808088, 0.1608011330293727, 0.0010108057537257919] + - [-20.3030303030303, -1.0280179279201749, 0.15348597733846592, -0.003830293214902747] + - [-19.696969696969695, -1.0230003258020903, 0.1468472514943134, -0.009073619911823212] + - [-19.09090909090909, -0.9988028958397764, 0.1438901898215623, -0.010285663487081473] + - [-18.484848484848484, -0.9990640793526067, 0.13851065592365266, -0.011628650529365956] + - [-17.878787878787875, -0.9798885560854461, 0.13517056337358388, -0.01284103140893681] + - [-17.272727272727273, -0.9710155768754316, 0.1307444076861537, -0.013863827520447684] + - [-16.666666666666664, -0.9639469302461258, 0.1264183630811425, -0.014833124011453999] + - [-16.06060606060606, -0.9408270586711386, 0.12336129782545868, -0.015729079161570386] + - [-15.454545454545455, -0.9307351228825366, 0.11931803384623378, -0.016468344612194492] + - [-14.848484848484848, -0.9171434106043295, 0.11562978335245648, -0.01721354747095932] + - [-14.24242424242424, -0.8957499711512222, 0.11265825114678873, -0.017809138164765037] + - [-13.636363636363633, -0.8765552134046716, 0.10952243755385617, -0.018496230752214897] + - [-13.03030303030303, -0.8631933033983711, 0.10604611288310452, -0.0188] + - [-12.424242424242424, -0.8363, 0.10368539732621986, -0.0194] + - [-11.818181818181817, -0.8178036537089814, 0.10062594311597149, -0.01974562088953868] + - [-11.212121212121213, -0.7926824532886931, 0.09831867636403675, -0.019964880334157817] + - [-10.606060606060606, -0.7796146760939204, 0.09511442523050942, -0.019499517004266755] + - [-9.999999999999998, -0.7674031139515511, 0.09250070006001136, -0.018300000052906145] + - [-9.393939393939394, -0.7207915735187238, 0.09080410204549832, -0.021237642672301184] + - [-8.787878787878787, -0.6630500560728259, 0.08915815758468491, -0.0264013747159762] + - [-8.18181818181818, -0.5936685057175852, 0.08776431128523689, -0.03274108429044775] + - [-7.575757575757576, -0.5198306732473122, 0.08695716987627203, -0.03889909327299801] + - [-6.96969696969697, -0.4416592619930104, 0.08617675301758129, -0.045571469450948913] + - [-6.363636363636362, -0.3608333840487412, 0.08541124234495559, -0.05260318050612237] + - [-5.757575757575755, -0.2827029102802684, 0.08500706295181511, -0.05851460879522928] + - [-5.151515151515151, -0.2011995703709761, 0.08456369880651843, -0.06516244263325704] + - [-4.545454545454545, -0.12182405457075601, 0.08422135054594339, -0.07103947957969535] + - [-3.9393939393939377, -0.045545835283685915, 0.0839897138016288, -0.07603970381873149] + - [-3.333333333333334, 0.02919843745947005, 0.0838, -0.08052730760461355] + - [-2.7272727272727266, 0.1000249616396207, 0.0838, -0.08391978250667888] + - [-2.1212121212121198, 0.17088244810429534, 0.0838, -0.08753262467629279] + - [-1.515151515151516, 0.24128197202594592, 0.0837, -0.09092712804110649] + - [-0.9090909090909121, 0.31114510722684796, 0.0838, -0.09408992605774762] + - [-0.30303030303030193, 0.3797802396476167, 0.0838, -0.09696776751051267] + - [0.30303030303030193, 0.4514133042749497, 0.0839, -0.09989861544301573] + - [0.9090909090909121, 0.5248907196316293, 0.08399539091085859, -0.10276444366688384] + - [1.515151515151516, 0.598717141835077, 0.0841, -0.10552239309199107] + - [2.1212121212121198, 0.6710102128811833, 0.08420066672916225, -0.10824431432308658] + - [2.72727272727273, 0.7432226774894726, 0.08435756818217559, -0.11058237825750909] + - [3.333333333333334, 0.8145920195828225, 0.0846, -0.11300556398950393] + - [3.9393939393939377, 0.8855847838237313, 0.0847, -0.11517733571607137] + - [4.545454545454548, 0.9554959536214028, 0.08494117793473246, -0.11734143106397518] + - [5.151515151515151, 1.0251013519351024, 0.08520075986665296, -0.11920527886798098] + - [5.757575757575755, 1.093538291395865, 0.08534538423156146, -0.12096217467425521] + - [6.363636363636366, 1.1608718728483591, 0.0857188832280944, -0.1225148906525596] + - [6.96969696969697, 1.2277683617988215, 0.08597809395202828, -0.12389046976014151] + - [7.5757575757575735, 1.2933108412772172, 0.08627021227888709, -0.1251596996682939] + - [8.181818181818183, 1.356162557045914, 0.08669292594180013, -0.1258917475711892] + - [8.787878787878787, 1.4187799711495317, 0.08705073546507483, -0.1266094990690625] + - [9.393939393939391, 1.4769256157735422, 0.08751765875714558, -0.12690530594581764] + - [10.000000000000002, 1.525184004697615, 0.08800259973098556, -0.12639897561979782] + - [10.606060606060606, 1.572726388021303, 0.08856524759752339, -0.12566410461310196] + - [11.21212121212121, 1.6063746338164058, 0.08923257776934086, -0.12262476423987657] + - [11.818181818181818, 1.6313542388343056, 0.0903842239367385, -0.1184291319176223] + - [12.424242424242424, 1.6576044564374066, 0.0918221839140069, -0.11508210779077754] + - [13.030303030303028, 1.687934072914055, 0.09333193555278901, -0.11286868158433054] + - [13.636363636363637, 1.7134217649133885, 0.0952736719366303, -0.1108180753273532] + - [14.24242424242424, 1.7309719852978553, 0.09804457482658671, -0.10855616144472718] + - [14.848484848484844, 1.752853990117909, 0.10078082613720227, -0.10702370791898037] + - [15.454545454545455, 1.7668415741861518, 0.10406773359896582, -0.10555674370294336] + - [16.06060606060606, 1.77023644512899, 0.10858569393240033, -0.10390176755181375] + - [16.666666666666664, 1.7640541089242103, 0.1141879465544675, -0.10254437185249939] + - [17.272727272727273, 1.7615632813592463, 0.11936339474079459, -0.10157103136933837] + - [17.878787878787875, 1.7423948513398853, 0.12655657420572863, -0.1005228011183096] + - [18.484848484848488, 1.7166647412442295, 0.13426907161856758, -0.09993984587302318] + - [19.09090909090909, 1.6997130176019344, 0.14136321153286452, -0.0998100060740563] + - [19.696969696969695, 1.6792082852126724, 0.14890676127353797, -0.10008475506644479] + - [20.303030303030305, 1.6570372175395607, 0.1567799901976503, -0.10118036413461762] + - [20.90909090909091, 1.6337804173972335, 0.1648284429212559, -0.10265049733123516] + - [21.515151515151512, 1.615860428110692, 0.17240618709788988, -0.10453064295147542] + - [22.12121212121212, 1.604747011753979, 0.17922750127283926, -0.1069581656288985] + - [22.727272727272727, 1.5974574426984451, 0.18556396034623973, -0.10979293498202411] + - [23.33333333333333, 1.591018658381831, 0.1918712019784225, -0.11268784728955449] + - [23.93939393939394, 1.5853503722570264, 0.19787897363727383, -0.11594299589093454] + - [24.545454545454543, 1.5741440074828073, 0.20551397528984727, -0.12034406901386757] + - [25.15151515151515, 1.5515132038736015, 0.21571505435978144, -0.12617226803098797] + - [25.757575757575758, 1.5280732600204325, 0.2263035657335661, -0.13227313374925115] + - [26.363636363636363, 1.5046291780367618, 0.23697579255831305, -0.1383337589843899] + - [26.969696969696965, 1.4813463780680147, 0.2475440778706133, -0.1444030497625908] + - [27.57575757575757, 1.4581877518977875, 0.258065633486465, -0.15042427021627766] + - [28.181818181818173, 1.4350525509758723, 0.268591691735941, -0.1564134881991745] + - [28.78787878787879, 1.4118521918579268, 0.279112831977695, -0.16247704357099915] + - [29.393939393939394, 1.3876713659169448, 0.2896658971967526, -0.16897226942143279] + - [29.999999999999996, 1.3701363003659832, 0.30134383342006826, -0.17257639238064687] + - [32.99999999999999, 1.292035972079945, 0.3613875246849083, -0.18719277289415168] + - [36.0, 1.2135128908439352, 0.42132917302665124, -0.20199634131396585] + - [39.0, 1.1348004973177914, 0.4813562580489159, -0.21681792536572206] + - [41.99999999999999, 1.0675787148390286, 0.544644902045498, -0.2276025523376413] + - [45.0, 1.0044208687644398, 0.608932003366989, -0.2370104010237921] + - [48.0, 0.941231727204344, 0.6732498481812627, -0.24634319843661925] + - [50.99999999999999, 0.8777620947705084, 0.7373694126346074, -0.25580427393815686] + - [54.0, 0.813873510527461, 0.8017480658282916, -0.26495155618177274] + - [57.00000000000001, 0.7493168849453805, 0.865012433275374, -0.27403793199601706] + - [60.00000000000001, 0.6836031080339586, 0.9245973393300273, -0.2832995590655601] + - [63.0, 0.6163327408113993, 0.9811030520168087, -0.2928518421338477] + - [65.99999999999999, 0.5478288536666346, 1.035072154500835, -0.30257447703535] + - [69.00000000000001, 0.47868612618783896, 1.0838520514515737, -0.3123500754431742] + - [72.0, 0.4090339755171868, 1.1267641675966864, -0.32216011828517765] + - [75.0, 0.3383505964972299, 1.1669529028482502, -0.33211280417819905] + - [78.00000000000001, 0.26795296397032176, 1.2009481994709073, -0.3419125187021995] + - [81.0, 0.19888781092922694, 1.2255832848714734, -0.3513682620214922] + - [84.0, 0.12855003745113458, 1.2471906855899395, -0.3614004204868424] + - [87.00000000000001, 0.06045091440324909, 1.2639579554320173, -0.3706988582969947] + - [90.0, 3.845517693112921e-06, 1.2706999999625708, -0.37729967749143634] + - [92.99999999999999, -0.05036297965572036, 1.2639589054802878, -0.3817986897648014] + - [96.00000000000001, -0.09522826505990531, 1.2471909784871587, -0.38551012071301116] + - [99.0, -0.13968842784948682, 1.2255824553549899, -0.38754669124284713] + - [101.99999999999999, -0.18754140420256138, 1.2009462496472099, -0.3876390192511365] + - [105.00000000000001, -0.23682850983920373, 1.1669502147035635, -0.3873492864561702] + - [108.0, -0.2863115679033492, 1.1267615010104077, -0.38688005845645346] + - [111.00000000000001, -0.3350554061947389, 1.0838503432017839, -0.38617835202182876] + - [114.00000000000001, -0.38341531661394523, 1.0350738100773058, -0.384190845022466] + - [117.0, -0.4313242276557622, 0.981108887218578, -0.38183279422409583] + - [120.00000000000001, -0.4783956482858542, 0.9246053213083819, -0.380600016033604] + - [123.00000000000001, -0.5242836140773733, 0.8651544049680123, -0.3804512783259557] + - [126.0, -0.5693454535934076, 0.8020597564369396, -0.3803507922102068] + - [129.00000000000003, -0.6142496912172496, 0.7375412872741146, -0.38030326219164545] + - [132.0, -0.6589442816882735, 0.6727318847301416, -0.3815352412270618] + - [135.0, -0.7026708445023447, 0.6062722391253047, -0.38727233305230424] + - [138.00000000000003, -0.7478581139118495, 0.5400130351025251, -0.3962334154802092] + - [141.0, -0.7988793364454493, 0.4757992619366793, -0.4078645308329561] + - [144.0, -0.8700921277698265, 0.41221416180628323, -0.43154489445884747] + - [147.0, -0.9374723365501788, 0.3504206643658021, -0.4611002344880862] + - [150.0, -0.9673999999455227, 0.2926959314920927, -0.4854013306067861] + - [153.0, -0.9581870987669037, 0.23420104691207233, -0.5043776651170209] + - [156.0, -0.933429800415753, 0.17734425174796709, -0.5216698739050862] + - [159.0, -0.8974457994248854, 0.13526947761954833, -0.5317199677092546] + - [162.0, -0.8338964808846603, 0.11374652330268113, -0.5244128799511457] + - [165.0, -0.70048792695537, 0.09715826767238156, -0.48760360791772994] + - [168.0, -0.5399092415244767, 0.08664850466189375, -0.43203585492127505] + - [171.0, -0.3975330484477048, 0.0844, -0.36738708344134113] + - [174.0, -0.26464572635233835, 0.0844, -0.27212833395402386] + - [177.0, -0.13163204293984684, 0.0844, -0.14588889766502622] + - [180.0, 0.0015076928352653804, 0.0844, 0.0017554139519351392] + - name: FFA-W3-211 + relative_thickness: 0.211 + data: + - [-180.0, -0.002292215462039887, 0.02464074140076669, -0.0038792002062152642] + - [-177.0, 0.07107153677436776, 0.02580569909432451, 0.12027696552828059] + - [-174.0, 0.14181572510307897, 0.02942871834539518, 0.23999994728892501] + - [-171.0, 0.21272391373945831, 0.03523220165909676, 0.36278510511025397] + - [-168.0, 0.28363564802720187, 0.06185904532622094, 0.39050196350443594] + - [-165.0, 0.3545388254203712, 0.0976229538584653, 0.37171011832851025] + - [-162.0, 0.4254517592611831, 0.1404358545562948, 0.3542304917346765] + - [-159.0, 0.49635040077576115, 0.1898618266355637, 0.3487630149938928] + - [-156.0, 0.5672654033245229, 0.24544815257692218, 0.3732297951306213] + - [-153.0, 0.6381715315511631, 0.30653219347154986, 0.3955860527997426] + - [-149.99999999999997, 0.7098174049943275, 0.3724263829206935, 0.4165250163081469] + - [-147.0, 0.7538616882854972, 0.44251607418795447, 0.42052244994858695] + - [-144.0, 0.7327637748166469, 0.5158557886291057, 0.4227503659035235] + - [-140.99999999999997, 0.714690853201677, 0.5917953657458499, 0.42513739357152486] + - [-138.0, 0.6950935790372671, 0.6693863877835179, 0.4283598627285591] + - [-135.0, 0.673219674300387, 0.747874157990578, 0.43235151853954334] + - [-131.99999999999997, 0.6483996358273271, 0.826448500207229, 0.43613411628368204] + - [-129.0, 0.6203332882904051, 0.904089678452313, 0.44086411384700586] + - [-126.0, 0.5888374307811688, 0.9799921426519673, 0.4462717393483113] + - [-122.99999999999999, 0.5537592460953803, 1.0534263324215338, 0.4519734542955108] + - [-119.99999999999999, 0.5151488552751633, 1.1235703344605303, 0.4573722664163852] + - [-117.0, 0.47322440257748927, 1.1895009342749965, 0.46172869013162615] + - [-114.0, 0.4281356900383864, 1.250590531098008, 0.46574610694786256] + - [-110.99999999999999, 0.3801154187131133, 1.3063386283892886, 0.46983026302453856] + - [-108.0, 0.3296167590618264, 1.355928248188893, 0.4708118033738002] + - [-105.0, 0.2770509147040668, 1.398729014705725, 0.47098873518593637] + - [-101.99999999999999, 0.22281824638184047, 1.4344567981238454, 0.4709601449555343] + - [-98.99999999999999, 0.1674042142935463, 1.463024794591399, 0.4689193940746805] + - [-96.0, 0.1114485182537046, 1.4836134637873077, 0.464827421024492] + - [-92.99999999999999, 0.05553565448603421, 1.4951900640528057, 0.45976370770680897] + - [-89.99999999999999, -2.1772038659848348e-10, 1.5, 0.45474199290906225] + - [-87.0, -0.05553565405735989, 1.4951900641172955, 0.4445468682927947] + - [-83.99999999999999, -0.11144851801526323, 1.4836134638456298, 0.43392518260801816] + - [-80.99999999999999, -0.16740421480573792, 1.4630247943680663, 0.42297712071673654] + - [-78.0, -0.2228182468601139, 1.4344567978497234, 0.41012997091520564] + - [-74.99999999999999, -0.2770509143861154, 1.3987290149449179, 0.39609393174152413] + - [-71.99999999999999, -0.32961675874949375, 1.355928248462634, 0.3815956944305827] + - [-69.0, -0.380115419084781, 1.306338627990761, 0.36665403126781604] + - [-65.99999999999999, -0.4281356896122363, 1.2505905316328734, 0.3499890533544733] + - [-63.0, -0.4732244025205937, 1.1895009343475729, 0.3333522914297492] + - [-59.999999999999986, -0.515148855478316, 1.123570334118575, 0.3165819846444885] + - [-56.99999999999999, -0.5537592456837378, 1.0534263332227523, 0.299457963521913] + - [-54.0, -0.5888374308473602, 0.9799921424969289, 0.28222968641001916] + - [-50.999999999999986, -0.6203332885920911, 0.9040896776704688, 0.26506677909955184] + - [-47.99999999999999, -0.6483996359815911, 0.826448499748859, 0.24806292652576867] + - [-45.0, -0.6732196740562354, 0.7478741588099511, 0.2312921182150734] + - [-41.999999999999986, -0.6950935790502258, 0.6693863877273374, 0.2157369202282988] + - [-38.99999999999999, -0.7146908532665331, 0.5917953654789297, 0.19202399653579483] + - [-36.0, -0.732718157152291, 0.5158766470757943, 0.1523650443929073] + - [-32.999999999999986, -0.7483419759706647, 0.44503984537392294, 0.1128984847247068] + - [-29.999999999999996, -0.7920103635161618, 0.35620063130531965, 0.08322816890638657] + - [-29.393939393939394, -0.808773991104565, 0.33549006612553084, 0.07816351152370977] + - [-28.787878787878785, -0.8279941206329944, 0.3144171870447617, 0.07287501054226556] + - [-28.18181818181818, -0.8494927293275135, 0.29324238577003114, 0.06712215921306457] + - [-27.575757575757574, -0.8786615825018315, 0.2713150975061302, 0.06050759486651832] + - [-26.969696969696965, -0.9274406590425088, 0.2468761440313916, 0.052730871433312954] + - [-26.363636363636363, -0.988447963237677, 0.22128719220092194, 0.044329668402112644] + - [-25.757575757575754, -1.0531531933305232, 0.19609654602368132, 0.03588276480454619] + - [-25.15151515151515, -1.1130260475642335, 0.1728525095086302, 0.027968939672242545] + - [-24.545454545454543, -1.159536224181994, 0.15310338666472922, 0.021166972036830656] + - [-23.939393939393938, -1.1842972717943563, 0.13837361735298742, 0.016045855731313684] + - [-23.33333333333333, -1.1974111409651333, 0.1270311361105049, 0.011923286247065581] + - [-22.727272727272727, -1.2091105567940776, 0.11712825408703549, 0.008128938901326136] + - [-22.12121212121212, -1.219086183414741, 0.10840634470658521, 0.004713844938584524] + - [-21.515151515151512, -1.2270286849606744, 0.10060678139316026, 0.0017290356033299904] + - [-20.90909090909091, -1.2326287255654302, 0.09347093757076677, -0.0007744578599482384] + - [-20.3030303030303, -1.23557696936256, 0.0867401866634108, -0.002745604206760962] + - [-19.696969696969695, -1.2355763621646023, 0.08027862426881537, -0.00416475124464342] + - [-19.09090909090909, -1.2329582085309976, 0.07452323565445125, -0.005233232724119824] + - [-18.484848484848484, -1.2288743274346183, 0.06923405088077107, -0.006095183697439046] + - [-17.878787878787875, -1.2244660570798531, 0.06405268961205317, -0.006866853087513765] + - [-17.272727272727273, -1.2188760052089103, 0.05898288013582364, -0.007539096510796065] + - [-16.666666666666664, -1.212176724668029, 0.05409412262859782, -0.008139162712082619] + - [-16.06060606060606, -1.205401850340153, 0.049349798528281405, -0.008748223989905412] + - [-15.454545454545455, -1.1996553405271984, 0.04471347879953847, -0.00932317973403557] + - [-14.848484848484848, -1.1942301330380345, 0.040199004880518, -0.009860954341820074] + - [-14.24242424242424, -1.1871024400357397, 0.03585302968117167, -0.010601790333802047] + - [-13.636363636363633, -1.1752360162148803, 0.03163865671647843, -0.012069167529023359] + - [-13.03030303030303, -1.1541160145706564, 0.027419286777057416, -0.015232669975981213] + - [-12.424242424242424, -1.1250355260125344, 0.02357100750276475, -0.019479693437883923] + - [-11.818181818181817, -1.0885997223733461, 0.02047421459668331, -0.02419192630739044] + - [-11.212121212121213, -1.0305232775121045, 0.01780756485408061, -0.030615036622333038] + - [-10.606060606060606, -0.957032193512811, 0.015540990599252593, -0.03781295651042744] + - [-9.999999999999998, -0.8820850013390561, 0.013858600025055628, -0.04396749990522486] + - [-9.393939393939394, -0.8082997505052592, 0.012683332204736393, -0.04866342905038359] + - [-8.787878787878787, -0.7309349594583316, 0.011752720086393408, -0.05279451875193325] + - [-8.18181818181818, -0.6529098636353498, 0.01097276269946183, -0.0565061016652951] + - [-7.575757575757576, -0.5762073570244419, 0.010281264490461897, -0.0598776359629801] + - [-6.96969696969697, -0.4995877684228703, 0.009691652923478258, -0.06289398798987221] + - [-6.363636363636362, -0.4228424784985007, 0.009146970428664724, -0.06575063059013579] + - [-5.757575757575755, -0.3458530375180803, 0.0085769895785427, -0.0686580151267245] + - [-5.151515151515151, -0.2684131503052978, 0.007925654161542055, -0.07168045172795992] + - [-4.545454545454545, -0.1909791714256718, 0.0073412564391372075, -0.07456442809467094] + - [-3.9393939393939377, -0.11412766928920895, 0.007002474342732667, -0.07702397851450171] + - [-3.333333333333334, -0.038017890955443216, 0.006825179725152748, -0.07904896062089396] + - [-2.7272727272727266, 0.037632258351725845, 0.006694017221751008, -0.08083587426393823] + - [-2.1212121212121198, 0.11303248922227122, 0.00663239122998191, -0.08250125334265854] + - [-1.515151515151516, 0.18822139156395248, 0.006634162084161137, -0.08408001796838682] + - [-0.9090909090909121, 0.26315762487600086, 0.006646002616371678, -0.08556846482152067] + - [-0.30303030303030193, 0.3379994523311616, 0.006678451242394257, -0.08704616419843544] + - [0.30303030303030193, 0.4126637931055815, 0.006726738725493311, -0.08848925124001421] + - [0.9090909090909121, 0.4871334821664601, 0.006796330671090491, -0.08989765427574209] + - [1.515151515151516, 0.5613452072689434, 0.006888308330822744, -0.09127041121091792] + - [2.1212121212121198, 0.6352916406375912, 0.007002453069202364, -0.09260520818227137] + - [2.72727272727273, 0.7089740157169441, 0.007134947215316324, -0.09390153151268424] + - [3.333333333333334, 0.7822693169755864, 0.007295468709054304, -0.0951502637255628] + - [3.9393939393939377, 0.8551249277567817, 0.007492831928462707, -0.0963478226071119] + - [4.545454545454548, 0.9274710371587396, 0.007732184905642564, -0.09748796625061229] + - [5.151515151515151, 0.9988438205428632, 0.008050354102499251, -0.09852568872745252] + - [5.757575757575755, 1.0689126819504597, 0.008515443241772697, -0.09944233219089316] + - [6.363636363636366, 1.1379224916749835, 0.009043471190630053, -0.10024639150173414] + - [6.96969696969697, 1.2057024720414724, 0.009650332665580772, -0.10092031132295777] + - [7.5757575757575735, 1.2714956718972978, 0.010403372075420214, -0.10138245885448506] + - [8.181818181818183, 1.336144123585156, 0.011204267074148665, -0.10173376395008006] + - [8.787878787878787, 1.400051762071055, 0.011990878671987613, -0.10202462108895945] + - [9.393939393939391, 1.4626039530879285, 0.01281431835167492, -0.10210573623601775] + - [10.000000000000002, 1.523610001129244, 0.013685900017146748, -0.1021297] + - [10.606060606060606, 1.5827042196330532, 0.014628707038235428, -0.10194915443698839] + - [11.21212121212121, 1.639521821903301, 0.015657287830489478, -0.10160239166935627] + - [11.818181818181818, 1.6939736920007846, 0.016789341352831427, -0.10106284314415384] + - [12.424242424242424, 1.7442925700023897, 0.018147306018722005, -0.10031462660353332] + - [13.030303030303028, 1.7887997751384677, 0.01983015463377329, -0.09930934307916785] + - [13.636363636363637, 1.8289698215608958, 0.02200286892529567, -0.09807536657195821] + - [14.24242424242424, 1.8468196865448172, 0.025059669168810982, -0.09651299894606558] + - [14.848484848484844, 1.8528336772808225, 0.029600562802559932, -0.0945521007650226] + - [15.454545454545455, 1.8403141772646419, 0.03582319854492027, -0.09256200466935666] + - [16.06060606060606, 1.8061648185447354, 0.04388650508787661, -0.0914404362201632] + - [16.666666666666664, 1.7637904323323357, 0.05348438358691562, -0.09156787134816835] + - [17.272727272727273, 1.7136661604778896, 0.06426659939691338, -0.09187541666803405] + - [17.878787878787875, 1.667896273984515, 0.07519303656284898, -0.09231888433339697] + - [18.484848484848488, 1.6327311202279013, 0.08566294234613277, -0.09325600236898232] + - [19.09090909090909, 1.6015820492518995, 0.0961358012668057, -0.0951817376652118] + - [19.696969696969695, 1.5740113941934593, 0.10669054613729248, -0.09754393939672343] + - [20.303030303030305, 1.5498296048111873, 0.11733387161855495, -0.09985533545689726] + - [20.90909090909091, 1.5284280132439607, 0.12784621336985455, -0.10230987580960176] + - [21.515151515151512, 1.5090064368126335, 0.13832182256180162, -0.10496549366065437] + - [22.12121212121212, 1.4907741784964355, 0.14891086121019464, -0.10781025063528195] + - [22.727272727272727, 1.4729405412745966, 0.1597634913308319, -0.11083220835871128] + - [23.33333333333333, 1.454714828126347, 0.17102987493951188, -0.11401942845616922] + - [23.93939393939394, 1.4353063420309162, 0.18286017405203323, -0.1173599725528826] + - [24.545454545454543, 1.415027100451909, 0.19515392421601674, -0.12090896229733272] + - [25.15151515151515, 1.3949212004491942, 0.20771751831330104, -0.12474121965003075] + - [25.757575757575758, 1.3745904897320467, 0.22073343484794197, -0.12882749484397824] + - [26.363636363636363, 1.353623834869775, 0.23438730559101686, -0.1331376799288889] + - [26.969696969696965, 1.331610102431688, 0.24886476231360355, -0.13764166695447677] + - [27.57575757575757, 1.3081381589870937, 0.2643514367867796, -0.14230934797045566] + - [28.181818181818173, 1.2824343119926174, 0.28115113951031356, -0.14713977704908004] + - [28.78787878787879, 1.2496108621074788, 0.30092059081897193, -0.15250156420931466] + - [29.393939393939394, 1.211338013244317, 0.32320585908994615, -0.15832320613524797] + - [29.999999999999996, 1.1716205351862272, 0.3467955003924829, -0.1643566277885898] + - [32.99999999999999, 1.0685410406513385, 0.4455891960198274, -0.18973362005608357] + - [36.0, 1.0467359358673944, 0.5158811871630801, -0.20823152308104184] + - [39.0, 1.0209869332379042, 0.59179536547893, -0.2275061963056689] + - [41.99999999999999, 0.9929908272146079, 0.6693863877273379, -0.24489209202581244] + - [45.0, 0.9617423915089076, 0.747874158809951, -0.2609596268358875] + - [48.0, 0.9262851942594158, 0.8264484997488591, -0.2773138711815659] + - [50.99999999999999, 0.8861904122744158, 0.9040896776704691, -0.2929336866390549] + - [54.0, 0.8411963297819433, 0.9799921424969289, -0.30809489996997286] + - [57.00000000000001, 0.7910846366910539, 1.0534263332227525, -0.3229652909516678] + - [60.00000000000001, 0.7359269363975939, 1.1235703341185754, -0.33769576871443585] + - [63.0, 0.6760348607437053, 1.189500934347573, -0.3516688900368022] + - [65.99999999999999, 0.611622413731766, 1.2505905316328734, -0.36529907987170784] + - [69.00000000000001, 0.5430220272639725, 1.306338627990761, -0.3790028935068979] + - [72.0, 0.4708810839278479, 1.3559282484626343, -0.3913563343299564] + - [75.0, 0.39578702055159315, 1.398729014944918, -0.40334275582450085] + - [78.00000000000001, 0.3183117812287338, 1.4344567978497238, -0.415026782920126] + - [81.0, 0.23914887829391096, 1.4630247943680665, -0.42598657378331617] + - [84.0, 0.15921216859323278, 1.4836134638456298, -0.4357964915461706] + - [87.00000000000001, 0.07827034078625995, 1.4951900641172955, -0.4454535586514416] + - [90.0, 2.5614153506547943e-10, 1.5, -0.4547419929098766] + - [92.99999999999999, -0.05628206997055092, 1.495190064052806, -0.4597478869672506] + - [96.00000000000001, -0.11144851825370472, 1.4836134637873077, -0.464827421024492] + - [99.0, -0.16740421429354654, 1.4630247945913988, -0.4689193940746805] + - [101.99999999999999, -0.2228182463818402, 1.4344567981238454, -0.4709601449555343] + - [105.00000000000001, -0.27705091470406673, 1.3987290147057247, -0.47098873518593637] + - [108.0, -0.32961675906182636, 1.355928248188893, -0.47081180337380024] + - [111.00000000000001, -0.3801154187131137, 1.3063386283892882, -0.4698302630245386] + - [114.00000000000001, -0.42813569003838636, 1.250590531098008, -0.46574610694786267] + - [117.0, -0.47322440257748916, 1.1895009342749967, -0.4617286901316262] + - [120.00000000000001, -0.5151488552751636, 1.12357033446053, -0.4573722664163851] + - [123.00000000000001, -0.5537592460953803, 1.053426332421534, -0.4519734542955107] + - [126.0, -0.5888374307811686, 0.9799921426519675, -0.4462717393483113] + - [129.00000000000003, -0.6203332882904053, 0.9040896784523125, -0.4408641138470058] + - [132.0, -0.6483996358273273, 0.8264485002072283, -0.43613411628368204] + - [135.0, -0.673219674300387, 0.7478741579905779, -0.4323515185395433] + - [138.00000000000003, -0.6950935790372674, 0.6693863877835172, -0.428359862728559] + - [141.0, -0.7146908532016772, 0.5917953657458491, -0.4251373935715248] + - [144.0, -0.7327637748166468, 0.5158557886291057, -0.4227503659035235] + - [147.0, -0.7538616882854975, 0.44251607418795447, -0.42052244994858706] + - [150.0, -0.7098174049943269, 0.37242638292069297, -0.41652501630814687] + - [153.0, -0.6381709030554943, 0.3065316307547298, -0.39558585463899876] + - [156.0, -0.5672630248494708, 0.2454461864990076, -0.3732290452123497] + - [159.0, -0.4963551466434462, 0.18986535295969287, -0.34876380903219556] + - [162.0, -0.4254472684374228, 0.14043294088913863, -0.3739610917050339] + - [165.0, -0.35453939023139885, 0.09762326311063277, -0.4217099832899172] + - [168.0, -0.28363151202537445, 0.061857189188377106, -0.47371692312954733] + - [171.0, -0.21272363381935017, 0.03523215929240345, -0.4543691511678618] + - [174.0, -0.14181575555381368, 0.029428720367750676, -0.29999999852727355] + - [177.0, -0.07107153677436776, 0.02580569909432451, -0.15034620691035067] + - [180.0, 0.0022922154620399, 0.024640741400766688, 0.004849000257769079] + - name: FFA-W3-241 + relative_thickness: 0.241 + data: + - [-180.0, -0.0024684199487192814, 0.011774716363659291, -0.0038792002062152642] + - [-177.0, 0.07653486422426573, 0.012956794093589775, 0.12027696552828059] + - [-174.0, 0.15271721645878958, 0.016633208806910216, 0.23999994728892501] + - [-171.0, 0.22907617583943385, 0.022655749316810435, 0.36254334904305563] + - [-168.0, 0.30543895342857713, 0.033199357827176056, 0.39491934508695464] + - [-165.0, 0.3817925163476268, 0.07009656737643084, 0.3848672800561616] + - [-162.0, 0.4581565857004687, 0.11340195092413567, 0.37526830570884284] + - [-159.0, 0.5345052640642116, 0.1633243919149153, 0.3751922355255409] + - [-156.0, 0.6108715611482838, 0.21948037813806653, 0.400184573704094] + - [-153.0, 0.6872283017337987, 0.281205172907898, 0.4230210543914243] + - [-149.99999999999997, 0.7643816523586743, 0.34780924669398067, 0.444050131116614] + - [-147.0, 0.8108557508512102, 0.4186777557032583, 0.4452623594970806] + - [-144.0, 0.7804841940627388, 0.4928593692465897, 0.44439584012141325] + - [-140.99999999999997, 0.7558200703114547, 0.5697049137929667, 0.4437161254645774] + - [-138.0, 0.7304451458118122, 0.6482621034784734, 0.4442751608509736] + - [-135.0, 0.7034987177406019, 0.7277743130958015, 0.44641977031664526] + - [-131.99999999999997, 0.6742209587944499, 0.8074282934944885, 0.44815013551611527] + - [-129.0, 0.6421662014946433, 0.8862009015483486, 0.45131779569755176] + - [-126.0, 0.6071227924809475, 0.9632841473379978, 0.4556142175689441] + - [-122.99999999999999, 0.5689093628652973, 1.037944899672024, 0.4604154076816021] + - [-119.99999999999999, 0.5275196921366394, 1.1093570960754857, 0.4649447451958491] + - [-117.0, 0.4831319420141919, 1.1765957251449002, 0.4687950729221793] + - [-114.0, 0.4358898643774663, 1.239029582793643, 0.4724519321740854] + - [-110.99999999999999, 0.3860100461691767, 1.2961510625708066, 0.47614629201064745] + - [-108.0, 0.33391862306494846, 1.347141666851018, 0.4769386507208463] + - [-105.0, 0.2800203809209471, 1.3913714005372224, 0.477032171242519] + - [-101.99999999999999, 0.2247107498061243, 1.4285498702524242, 0.4768847408045399] + - [-98.99999999999999, 0.16846585415860071, 1.458565797491921, 0.47478430692418516] + - [-96.0, 0.11191853734708714, 1.4805949686028885, 0.4706592663321528] + - [-92.99999999999999, 0.05566574530023585, 1.4938792067876234, 0.4655993269061275] + - [-89.99999999999999, -2.18356278968652e-10, 1.5, 0.46055244939410767] + - [-87.0, -0.05566574487004441, 1.4938792068685935, 0.44969185436046316] + - [-83.99999999999999, -0.11191853710682302, 1.4805949686685593, 0.4383132885629002] + - [-80.99999999999999, -0.1684658546774255, 1.4585657972547563, 0.42667892757870507] + - [-78.0, -0.22471075029267024, 1.4285498699655095, 0.41325227897305744] + - [-74.99999999999999, -0.2800203805956876, 1.391371400784926, 0.39869476565076406] + - [-71.99999999999999, -0.33391862274404316, 1.3471416671333232, 0.38371162454198665] + - [-69.0, -0.38601004655409515, 1.2961510621617032, 0.3683475008224877] + - [-65.99999999999999, -0.435889863932902, 1.23902958334095, 0.3514838987614141] + - [-63.0, -0.4831319419548744, 1.1765957252191392, 0.33463023981871903] + - [-59.999999999999986, -0.5275196923529272, 1.1093570957270251, 0.31772743200026127] + - [-56.99999999999999, -0.5689093624201317, 1.0379449004872452, 0.300649395685691] + - [-54.0, -0.6071227925542007, 0.9632841471805219, 0.2835072031230636] + - [-50.999999999999986, -0.642166201834333, 0.8862009007547714, 0.2664625630184395] + - [-47.99999999999999, -0.6742209589736335, 0.8074282930296318, 0.24961815989599534] + - [-45.0, -0.7034987174465455, 0.7277743139261696, 0.23307449955147472] + - [-41.999999999999986, -0.7304451458294412, 0.6482621034216239, 0.21800111822799886] + - [-38.99999999999999, -0.7558200703972601, 0.5697049135227753, 0.19222024718532985] + - [-36.0, -0.7804122030661512, 0.49289484505073683, 0.1434154978226849] + - [-32.999999999999986, -0.8021448752991556, 0.42297022622882025, 0.09443656244658329] + - [-29.999999999999996, -0.9433707322965991, 0.3054506017478349, 0.061807561836138857] + - [-29.393939393939394, -0.9967084667509348, 0.275591364184053, 0.056776103664852536] + - [-28.787878787878785, -1.0425571471851443, 0.24877392982499186, 0.05197596224293137] + - [-28.18181818181818, -1.0729172020176485, 0.22746849533549449, 0.04730698729484776] + - [-27.575757575757574, -1.0861018213807772, 0.21240310300961388, 0.04270163416781737] + - [-26.969696969696965, -1.0963670072300913, 0.1996053768611043, 0.038216579067882686] + - [-26.363636363636363, -1.1049737714667809, 0.18837506351028963, 0.03388513803606691] + - [-25.757575757575754, -1.1121470065336532, 0.1782884889396067, 0.02973657960957416] + - [-25.15151515151515, -1.118111604873517, 0.16892197913149268, 0.025800172325608602] + - [-24.545454545454543, -1.1230924589291797, 0.1598518600683846, 0.022105184721374408] + - [-23.939393939393938, -1.1273174502051642, 0.15065807885842922, 0.018679255967352548] + - [-23.33333333333333, -1.1312786573937665, 0.141441284742834, 0.015370871022883013] + - [-22.727272727272727, -1.1350762556810254, 0.13248730201496184, 0.012126568220332852] + - [-22.12121212121212, -1.1385110548452329, 0.12385359751278237, 0.009032550932998894] + - [-21.515151515151512, -1.1413838646646792, 0.11559763807426532, 0.006175022534178014] + - [-20.90909090909091, -1.1434954949176557, 0.10777689053738045, 0.003640186397167088] + - [-20.3030303030303, -1.1446467553824529, 0.10044882174009745, 0.0015142458952629493] + - [-19.696969696969695, -1.14419676252241, 0.0936815723387398, -0.00014840313373260433] + - [-19.09090909090909, -1.140067956891546, 0.08751265732451959, -0.0015056531178673492] + - [-18.484848484848484, -1.1335918098505, 0.08179556405532708, -0.0026391929982773335] + - [-17.878787878787875, -1.1265231427609137, 0.07636871289564838, -0.0036077561287946457] + - [-17.272727272727273, -1.1172960770967406, 0.0712430155915519, -0.004518450834948018] + - [-16.666666666666664, -1.1061428158244484, 0.06638467825163771, -0.005304482943279286] + - [-16.06060606060606, -1.0949657701840008, 0.061687284624405925, -0.005831849126252496] + - [-15.454545454545455, -1.0844064752749447, 0.05711550393495801, -0.0060907705423211235] + - [-14.848484848484848, -1.0737241177108658, 0.05269813153240522, -0.006261539303081517] + - [-14.24242424242424, -1.0634675115064174, 0.048382153216205315, -0.006432911549319505] + - [-13.636363636363633, -1.0545333770330867, 0.04412463226656427, -0.006656685258743] + - [-13.03030303030303, -1.0473432710995276, 0.039941436286327646, -0.00688353583500258] + - [-12.424242424242424, -1.0391495282730838, 0.03584061016716831, -0.007208497807295506] + - [-11.818181818181817, -1.0267860224759222, 0.03181098972944792, -0.00789108672002129] + - [-11.212121212121213, -1.0056239221685608, 0.02770107558254493, -0.011005070711169301] + - [-10.606060606060606, -0.9753823501862716, 0.023739374731661572, -0.016255026748663783] + - [-9.999999999999998, -0.937059000792465, 0.020268800058649263, -0.02243229988238789] + - [-9.393939393939394, -0.8758267168374, 0.017117341050816463, -0.03143349430896323] + - [-8.787878787878787, -0.789693458153597, 0.014222823949750718, -0.04320144697360301] + - [-8.18181818181818, -0.6989095966310211, 0.012092916830078619, -0.053596851642543755] + - [-7.575757575757576, -0.616839579043083, 0.010921633546844889, -0.06005157851558868] + - [-6.96969696969697, -0.5346306263769091, 0.010057235243615178, -0.06512227590805823] + - [-6.363636363636362, -0.45256080576674407, 0.009437614597606303, -0.06934010604344382] + - [-5.757575757575755, -0.3717911151623308, 0.009039105768112144, -0.07298948915355695] + - [-5.151515151515151, -0.29214912940320864, 0.008746268996647402, -0.07611640274158152] + - [-4.545454545454545, -0.21313911899581042, 0.008527041052477103, -0.07887885622324078] + - [-3.9393939393939377, -0.13438815266481294, 0.008375055367719864, -0.08148345870852232] + - [-3.333333333333334, -0.05589139864451755, 0.008257970188193856, -0.0839537725568411] + - [-2.7272727272727266, 0.02227841605850271, 0.00816545308613152, -0.08626586220344706] + - [-2.1212121212121198, 0.10023014506859762, 0.008110364554553691, -0.08848271497692498] + - [-1.515151515151516, 0.17797528535723836, 0.008089608822037332, -0.09062053770181841] + - [-0.9090909090909121, 0.2554269086588131, 0.008083040777043948, -0.09265345567802258] + - [-0.30303030303030193, 0.3326320591515397, 0.008108342583327108, -0.09461325649669869] + - [0.30303030303030193, 0.4095543077572709, 0.008153248263189472, -0.09649469579134581] + - [0.9090909090909121, 0.4861871728276062, 0.008227802862190296, -0.09830242594160338] + - [1.515151515151516, 0.5625211849273515, 0.008322995823135735, -0.10004550223584303] + - [2.1212121212121198, 0.6385067004129216, 0.00844441119836856, -0.10172146294062939] + - [2.72727272727273, 0.7141072363047392, 0.00859631501433785, -0.10333185543334843] + - [3.333333333333334, 0.7892614933216523, 0.00877504161997356, -0.10486186184638063] + - [3.9393939393939377, 0.8639379091606502, 0.008985698652208104, -0.10631136123761652] + - [4.545454545454548, 0.9380335097820361, 0.00923564282802056, -0.10767133986749923] + - [5.151515151515151, 1.0115164310507694, 0.009520691367575634, -0.10894324314188933] + - [5.757575757575755, 1.0843930364669154, 0.009835968087323484, -0.11013548420351905] + - [6.363636363636366, 1.1561596230308684, 0.010221073866723652, -0.11118306398625763] + - [6.96969696969697, 1.2268586330961804, 0.010678650029103114, -0.11209907039727385] + - [7.5757575757575735, 1.2968704952421726, 0.011152038861776539, -0.11292350250080899] + - [8.181818181818183, 1.365179593968063, 0.011714373737616671, -0.11351306417002291] + - [8.787878787878787, 1.4312932599221024, 0.012433353461804913, -0.11390160081906764] + - [9.393939393939391, 1.4960466839751687, 0.013177510352260977, -0.11399956488607572] + - [10.000000000000002, 1.5591100011627859, 0.013964600015662196, -0.114027] + - [10.606060606060606, 1.6198192796640374, 0.014835798563763283, -0.11372517982894269] + - [11.21212121212121, 1.6777423187018556, 0.01580212445638716, -0.11313680797225277] + - [11.818181818181818, 1.7327797655581738, 0.016882436526146412, -0.11219957268530854] + - [12.424242424242424, 1.7833309552606877, 0.018160024627608254, -0.11092261127032216] + - [13.030303030303028, 1.8287507802418514, 0.01969549667449992, -0.10926399847281909] + - [13.636363636363637, 1.8687231711188654, 0.021578324657258716, -0.10732152137287083] + - [14.24242424242424, 1.9002135550608676, 0.02395418897871206, -0.10519262375780508] + - [14.848484848484844, 1.9240770222207286, 0.027042358952867225, -0.10292954615418408] + - [15.454545454545455, 1.9267803308325253, 0.031166043696597253, -0.10066742604222363] + - [16.06060606060606, 1.9270072558679845, 0.03671809352893869, -0.09871117453814172] + - [16.666666666666664, 1.9051240931232556, 0.04419560345919143, -0.0970915053192297] + - [17.272727272727273, 1.8599773863572213, 0.053321886207706115, -0.09570649888064225] + - [17.878787878787875, 1.8096470633954829, 0.06331057438718088, -0.09499376458007416] + - [18.484848484848488, 1.7610143182906755, 0.07398128231851642, -0.09540188083577625] + - [19.09090909090909, 1.7052218351443005, 0.08586492137030904, -0.09687445770714334] + - [19.696969696969695, 1.652586178993603, 0.09833705728133992, -0.09889945898512922] + - [20.303030303030305, 1.6118975300561318, 0.1108343015728923, -0.10112481949850687] + - [20.90909090909091, 1.576705042614221, 0.12352315914902716, -0.10414287750633651] + - [21.515151515151512, 1.5446911012586861, 0.1364521907635985, -0.10788071178999256] + - [22.12121212121212, 1.5152340420818102, 0.14959847667469214, -0.11211050321218227] + - [22.727272727272727, 1.4877122011758759, 0.16293909714039365, -0.11660443263561278] + - [23.33333333333333, 1.4615039146331656, 0.17645113241878893, -0.1211346809229913] + - [23.93939393939394, 1.435987518545962, 0.1901116627679639, -0.12547342893702512] + - [24.545454545454543, 1.4111974197989732, 0.2038924587056975, -0.12964254440592513] + - [25.15151515151515, 1.3877061114099893, 0.21780395960049007, -0.13390210419782114] + - [25.757575757575758, 1.3652956007688277, 0.23189136707342767, -0.13823337910760444] + - [26.363636363636363, 1.3437404560201935, 0.24620006213235948, -0.1426149012978926] + - [26.969696969696965, 1.3228152453087911, 0.2607754257851351, -0.14702520293130344] + - [27.57575757575757, 1.3022945367793255, 0.275662839039604, -0.1514428161704547] + - [28.181818181818173, 1.2818846435328446, 0.2909292950138186, -0.1558527944506781] + - [28.78787878787879, 1.2606097255713904, 0.3068754939750198, -0.16032986063138208] + - [29.393939393939394, 1.2389372625141017, 0.3233851620874892, -0.16486620551734568] + - [29.999999999999996, 1.2178010120810556, 0.3401995197493048, -0.16941657243722863] + - [32.99999999999999, 1.1482791844401719, 0.4197701949290661, -0.19072252070809748] + - [36.0, 1.1148940628637534, 0.4928683985151295, -0.21006233666340027] + - [39.0, 1.0797429577103714, 0.5697049135227756, -0.22976458226416419] + - [41.99999999999999, 1.0434930654706303, 0.6482621034216246, -0.2471702464459598] + - [45.0, 1.004998167780779, 0.7277743139261696, -0.2629985243085755] + - [48.0, 0.9631727985337623, 0.8074282930296319, -0.2791565073898695] + - [50.99999999999999, 0.9173802883347616, 0.8862009007547716, -0.29461392609479536] + - [54.0, 0.8673182750774294, 0.9632841471805218, -0.3096309634555966] + - [57.00000000000001, 0.8127276606001878, 1.0379449004872459, -0.32437733875061703] + - [60.00000000000001, 0.7535995605041812, 1.1093570957270258, -0.3390255095124887] + - [63.0, 0.6901884885069632, 1.1765957252191392, -0.3530979443012492] + - [65.99999999999999, 0.6226998056184312, 1.23902958334095, -0.3669093825500843] + - [69.00000000000001, 0.5514429236487071, 1.2961510621617034, -0.38077698763625734] + - [72.0, 0.4770266039200613, 1.3471416671333232, -0.3935305391164314] + - [75.0, 0.40002911513669626, 1.391371400784926, -0.40598367807977026] + - [78.00000000000001, 0.32101535756095706, 1.4285498699655095, -0.41817240643921555] + - [81.0, 0.2406655066820361, 1.4585657972547563, -0.4297007118783158] + - [84.0, 0.15988362443831824, 1.4805949686685596, -0.440189876755404] + - [87.00000000000001, 0.07845307045742704, 1.4938792068685935, -0.4506004065328286] + - [90.0, 2.5688964150338833e-10, 1.5, -0.4605524493948557] + - [92.99999999999999, -0.05641434082755452, 1.4938792067876236, -0.4655847964296719] + - [96.00000000000001, -0.11191853734708725, 1.4805949686028885, -0.4706592663321529] + - [99.0, -0.16846585415860096, 1.4585657974919208, -0.4747843069241852] + - [101.99999999999999, -0.22471074980612407, 1.4285498702524244, -0.47688474080453996] + - [105.00000000000001, -0.28002038092094717, 1.3913714005372224, -0.477032171242519] + - [108.0, -0.3339186230649484, 1.3471416668510179, -0.4769386507208463] + - [111.00000000000001, -0.38601004616917717, 1.296151062570806, -0.47614629201064745] + - [114.00000000000001, -0.4358898643774662, 1.2390295827936435, -0.4724519321740855] + - [117.0, -0.4831319420141917, 1.1765957251449006, -0.4687950729221793] + - [120.00000000000001, -0.5275196921366397, 1.1093570960754855, -0.46494474519584916] + - [123.00000000000001, -0.5689093628652973, 1.0379448996720244, -0.46041540768160205] + - [126.0, -0.6071227924809472, 0.963284147337998, -0.4556142175689441] + - [129.00000000000003, -0.6421662014946437, 0.886200901548348, -0.45131779569755176] + - [132.0, -0.67422095879445, 0.8074282934944879, -0.4481501355161152] + - [135.0, -0.703498717740602, 0.7277743130958015, -0.44641977031664526] + - [138.00000000000003, -0.7304451458118124, 0.6482621034784726, -0.4442751608509737] + - [141.0, -0.7558200703114547, 0.5697049137929661, -0.44371612546457734] + - [144.0, -0.780484194062739, 0.4928593692465897, -0.44439584012141325] + - [147.0, -0.8108557508512104, 0.4186777557032584, -0.4452623594970806] + - [150.0, -0.7643816523586735, 0.3478092466939801, -0.44405013111661396] + - [153.0, -0.6872276249251513, 0.28120460421708177, -0.42302085197409367] + - [156.0, -0.6108689998378994, 0.21947839167850286, -0.4001838076772222] + - [159.0, -0.5345103747506466, 0.16332795400415434, -0.37519304662016306] + - [162.0, -0.4581517496633947, 0.11339900826874341, -0.3950838195103557] + - [165.0, -0.38179312457614245, 0.0700968782617142, -0.4348672078992604] + - [168.0, -0.3054344994888897, 0.033197837981306474, -0.4781339913630331] + - [171.0, -0.2290758744016369, 0.022655720405217395, -0.454080235578953] + - [174.0, -0.15271724925029728, 0.01663321085913303, -0.29999999852727355] + - [177.0, -0.07653486422426574, 0.012956794093589777, -0.15034620691035067] + - [180.0, 0.002468419948719279, 0.011774716363659291, 0.004849000257769079] + - name: FFA-W3-270blend + relative_thickness: 0.27 + data: + - [-180.0, -0.00263605594888068, 0.015450777462182715, -0.0038792002062152642] + - [-177.0, 0.08173252052991518, 0.016548176069292514, 0.12027696552828059] + - [-174.0, 0.16308858918092978, 0.019961176309490104, 0.23999994728892501] + - [-171.0, 0.24463325877012249, 0.02552854215374668, 0.3623572563045619] + - [-168.0, 0.32618200587101764, 0.03694614686640264, 0.39851681108243986] + - [-165.0, 0.40772091251266296, 0.07202636201950341, 0.395582324936966] + - [-162.0, 0.48927103910386077, 0.1122789986105089, 0.3927383474593689] + - [-159.0, 0.5708047294689642, 0.15875506018318591, 0.3971163260130347] + - [-156.0, 0.6523572350816756, 0.21103166933205486, 0.4210891584860143] + - [-153.0, 0.7338995351923266, 0.2684889046719643, 0.4435314532142822] + - [-149.99999999999997, 0.8162925449378126, 0.33048367278762514, 0.4637885004983212] + - [-147.0, 0.8642449214995993, 0.39644216636095525, 0.460311181571489] + - [-144.0, 0.8184157780815385, 0.46547787012907416, 0.45364450114638644] + - [-140.99999999999997, 0.7829589140257889, 0.5369846537172357, 0.44716463579653304] + - [-138.0, 0.7484046897957343, 0.6100746386693543, 0.4438533579835588] + - [-135.0, 0.7136945009310884, 0.6840421002850957, 0.4419309639811456] + - [-131.99999999999997, 0.67794728422922, 0.7581287363784374, 0.4396144387679346] + - [-129.0, 0.6405174677062215, 0.8313804266451488, 0.4400188013762815] + - [-126.0, 0.6011267043302511, 0.9030436287782484, 0.4415272438360239] + - [-122.99999999999999, 0.559545494517493, 0.9724349347402061, 0.44418157737689723] + - [-119.99999999999999, 0.515673048580355, 1.038784338623967, 0.4465922986352916] + - [-117.0, 0.469602791799581, 1.101228931957857, 0.4489574728830454] + - [-114.0, 0.42145079474212715, 1.1591804486947015, 0.45140928671585445] + - [-110.99999999999999, 0.3713887007515818, 1.2121667993312277, 0.4538399050280023] + - [-108.0, 0.3197674283472882, 1.2594244215031425, 0.45382464948811807] + - [-105.0, 0.2669511421268157, 1.3003652542948478, 0.4536048555635364] + - [-101.99999999999999, 0.2132983065931217, 1.3347197602090717, 0.45281812083733786] + - [-98.99999999999999, 0.15923595708458282, 1.3623896891371166, 0.45047555404926626] + - [-96.0, 0.1053433633602515, 1.3826062663604914, 0.44628666153553465] + - [-92.99999999999999, 0.05220047680913809, 1.3946007331098138, 0.44129723915003116] + - [-89.99999999999999, -2.049980472735315e-10, 1.4, 0.43629603878049317] + - [-87.0, -0.0522004764047749, 1.3946007331814683, 0.4260910673617176] + - [-83.99999999999999, -0.10534336313256902, 1.382606266420063, 0.415433054365303] + - [-80.99999999999999, -0.15923595758131875, 1.3623896889190525, 0.40454083863000717] + - [-78.0, -0.213298307062812, 1.3347197599443306, 0.39205111321603825] + - [-74.99999999999999, -0.26695114180946605, 1.300365254524011, 0.3785487234912952] + - [-71.99999999999999, -0.31976742803160685, 1.259424421764588, 0.36467613825320483] + - [-69.0, -0.37138870113579253, 1.2121667989519156, 0.3504992456854437] + - [-65.99999999999999, -0.421450794292512, 1.1591804492025581, 0.3351009515545919] + - [-63.0, -0.4696027917396252, 1.1012289320267499, 0.3196987032548491] + - [-59.999999999999986, -0.5156730488069873, 1.0387843383002862, 0.3043114714839693] + - [-56.99999999999999, -0.5595454940390195, 0.9724349354977455, 0.28888859786247617] + - [-54.0, -0.601126704411913, 0.9030436286318513, 0.2734395850422362] + - [-50.999999999999986, -0.640517468094992, 0.8313804259072703, 0.25807990815887644] + - [-47.99999999999999, -0.6779472844433607, 0.7581287359461155, 0.2428903956835562] + - [-45.0, -0.7136945005629897, 0.6840421010574879, 0.22795974915558662] + - [-41.999999999999986, -0.7484046898208497, 0.6100746386164542, 0.2145327749596598] + - [-38.99999999999999, -0.7829589141452282, 0.536984653465836, 0.18939137705642833] + - [-36.0, -0.8183156585382123, 0.46550928898106003, 0.13723630617510696] + - [-32.999999999999986, -0.8521305084665524, 0.40024375271067664, 0.08399382845075361] + - [-29.999999999999996, -0.9946105240988822, 0.29269151195641524, 0.05594223852759541] + - [-29.393939393939394, -1.0411027419487842, 0.2657412470157856, 0.05224345829175141] + - [-28.787878787878785, -1.0778792482733122, 0.2417645536106636, 0.04868984765077964] + - [-28.18181818181818, -1.0971573019567686, 0.22305006526473115, 0.04510561912065391] + - [-27.575757575757574, -1.0980380588591727, 0.2102668478729209, 0.04140916820499489] + - [-26.969696969696965, -1.0965951268713767, 0.19967649685096894, 0.0377871707369766] + - [-26.363636363636363, -1.0943001039227322, 0.19054298973561642, 0.03426421500965659] + - [-25.757575757575754, -1.0914818735406433, 0.18238624483392255, 0.03085037837869108] + - [-25.15151515151515, -1.0884693192525134, 0.1747261804529465, 0.027555738199736363] + - [-24.545454545454543, -1.0855913245857471, 0.16708271489974766, 0.024390371828448724] + - [-23.939393939393938, -1.0831746221416705, 0.15898017002467807, 0.021363269246696744] + - [-23.33333333333333, -1.081199304376986, 0.15057104670635982, 0.01836973646050194] + - [-22.727272727272727, -1.0794126292762694, 0.14221648229231215, 0.015389845127023195] + - [-22.12121212121212, -1.077672497289769, 0.13399654732389213, 0.012500807477962577] + - [-21.515151515151512, -1.075836808867736, 0.12599131234245697, 0.009779835745022196] + - [-20.90909090909091, -1.0737634644604188, 0.11828084788936372, 0.007304142159904162] + - [-20.3030303030303, -1.071310364518067, 0.11094522450596951, 0.0051509389543105445] + - [-19.696969696969695, -1.0682174940370819, 0.10407208204287673, 0.003374375741901972] + - [-19.09090909090909, -1.0639050867085846, 0.09768905205529005, 0.0018676479922667244] + - [-18.484848484848484, -1.0588026830375115, 0.09163370088350584, 0.0005682671115812617] + - [-17.878787878787875, -1.0533924730066813, 0.08573662599940557, -0.0005765872694806573] + - [-17.272727272727273, -1.0458913935831693, 0.08015002549699304, -0.001780882331317245] + - [-16.666666666666664, -1.0382661016766566, 0.07470707721586729, -0.002830727556586018] + - [-16.06060606060606, -1.0343550428995212, 0.06903714668416858, -0.0033323083301668734] + - [-15.454545454545455, -1.042319813475052, 0.06274963601470364, -0.0032448702532451882] + - [-14.848484848484848, -1.0619315552834727, 0.05607064775082535, -0.0030274270341385714] + - [-14.24242424242424, -1.0798832732446382, 0.04966771067267836, -0.002852178484416224] + - [-13.636363636363633, -1.0868204936332786, 0.044000837292516956, -0.0029368133448168738] + - [-13.03030303030303, -1.091353631288173, 0.038682230406591404, -0.003539542130904642] + - [-12.424242424242424, -1.0942346671603498, 0.0338410654191729, -0.004596196137241141] + - [-11.818181818181817, -1.0924331990064702, 0.029655565520618286, -0.006324032246282921] + - [-11.212121212121213, -1.0554081836812372, 0.02584633996071064, -0.01251402987609278] + - [-10.606060606060606, -0.9922321655336516, 0.022490837596474855, -0.021470607550011886] + - [-9.999999999999998, -0.9266460011100783, 0.019843300041644862, -0.029516949879982643] + - [-9.393939393939394, -0.863139470846869, 0.017811774840584015, -0.035593989028180895] + - [-8.787878787878787, -0.7927409074915532, 0.016120355441100995, -0.041227527543229815] + - [-8.18181818181818, -0.7189989978543194, 0.014747352346058118, -0.04661805539371527] + - [-7.575757575757576, -0.6438708928627351, 0.013634936137405664, -0.05191430036376013] + - [-6.96969696969697, -0.5653696852865473, 0.012681791980298245, -0.05705161191168666] + - [-6.363636363636362, -0.48486342692120354, 0.011910935166001143, -0.06198552193226561] + - [-5.757575757575755, -0.40370300762236583, 0.011340221148647401, -0.06669290014267702] + - [-5.151515151515151, -0.3208756266448425, 0.010877624487080588, -0.07125157206485426] + - [-4.545454545454545, -0.23724406898731695, 0.01050772657132952, -0.07558220960663486] + - [-3.9393939393939377, -0.15428543600303696, 0.010241874428639934, -0.07956667782702669] + - [-3.333333333333334, -0.07217941143348584, 0.010041727087417724, -0.08320474572152176] + - [-2.7272727272727266, 0.009548087473482647, 0.00988200676592892, -0.08659026561250306] + - [-2.1212121212121198, 0.09087480745593801, 0.009770834170198854, -0.08978507973809907] + - [-1.515151515151516, 0.17168172360475817, 0.009699466891807135, -0.0927871081762428] + - [-0.9090909090909121, 0.25194781940002425, 0.009670891876632906, -0.09558508830723761] + - [-0.30303030303030193, 0.33180645730930763, 0.009674189412145508, -0.0982503505794593] + - [0.30303030303030193, 0.4112511277560423, 0.009691047415012902, -0.10078444175479537] + - [0.9090909090909121, 0.490281295417522, 0.009753623907801188, -0.10319727468036234] + - [1.515151515151516, 0.56884903680607, 0.009839164525467046, -0.10549461114754896] + - [2.1212121212121198, 0.6469790017112068, 0.00995296275176863, -0.10768394811449432] + - [2.72727272727273, 0.7246928311528048, 0.010091673727043967, -0.10977247767108318] + - [3.333333333333334, 0.8019520963502115, 0.010251160945333338, -0.11176477743082089] + - [3.9393939393939377, 0.8787332995571043, 0.010434383906029776, -0.11366247328534385] + - [4.545454545454548, 0.9550228306373817, 0.01063961225315764, -0.11546125385233842] + - [5.151515151515151, 1.0304593641717676, 0.010896557955793324, -0.11713047046512147] + - [5.757575757575755, 1.1047514621312988, 0.011253852401386362, -0.11865425430325062] + - [6.363636363636366, 1.1785446863264868, 0.0116055355131845, -0.12007530294766726] + - [6.96969696969697, 1.2517300653804562, 0.0119596004924898, -0.12138694126358959] + - [7.5757575757575735, 1.3239540304448765, 0.01235922228990239, -0.12256289312217679] + - [8.181818181818183, 1.394930170323263, 0.012811553838092635, -0.1235597181426135] + - [8.787878787878787, 1.4645140849765323, 0.013331547893765061, -0.12439018328508566] + - [9.393939393939391, 1.5322281866523506, 0.013923989024567901, -0.12495856489740749] + - [10.000000000000002, 1.5978200012077783, 0.014604000013728476, -0.125264] + - [10.606060606060606, 1.6608949177335788, 0.015387724381344935, -0.1251760281486489] + - [11.21212121212121, 1.72048935254094, 0.016304906051404274, -0.12490706298004153] + - [11.818181818181818, 1.7763943630078411, 0.017394158397837776, -0.12402823943322278] + - [12.424242424242424, 1.826105618191998, 0.01875782887299289, -0.12269827468407507] + - [13.030303030303028, 1.869872281944973, 0.02043981692312981, -0.12083046867676633] + - [13.636363636363637, 1.9147139060605372, 0.022317731916970913, -0.11882937368426595] + - [14.24242424242424, 1.9251341370028814, 0.025383544541810493, -0.11561707943371159] + - [14.848484848484844, 1.912330825757305, 0.030913800076223994, -0.11028822408918386] + - [15.454545454545455, 1.899982567546397, 0.03662988835681209, -0.10704372173817737] + - [16.06060606060606, 1.8832226316338536, 0.043353625576093464, -0.10512975080322323] + - [16.666666666666664, 1.8451545473210924, 0.05231951555302492, -0.10407021928070298] + - [17.272727272727273, 1.7895484939235191, 0.06298249185177933, -0.10329149945367391] + - [17.878787878787875, 1.7315954427538232, 0.07441725833168329, -0.10292732207548304] + - [18.484848484848488, 1.6772727433286587, 0.08638182524838552, -0.10359578707375484] + - [19.09090909090909, 1.6197393611802873, 0.0994026172160595, -0.10584425812467146] + - [19.696969696969695, 1.5680387124949582, 0.1126750424988135, -0.10875993193032867] + - [20.303030303030305, 1.5291447727562808, 0.12549769617285908, -0.11158068063126161] + - [20.90909090909091, 1.4937887989354064, 0.13820316665629867, -0.11478807856457325] + - [21.515151515151512, 1.4607587312501642, 0.15087497155387805, -0.11839388495806001] + - [22.12121212121212, 1.431094492423462, 0.16348538560824116, -0.12225533096823175] + - [22.727272727272727, 1.40583600517821, 0.17600668356203175, -0.1262296477515982] + - [23.33333333333333, 1.3860231922373158, 0.18841114015789379, -0.13017406646466925] + - [23.93939393939394, 1.3726959763236888, 0.20067103013847143, -0.1339458182639547] + - [24.545454545454543, 1.3647529700288945, 0.21263330407017306, -0.13751836457674022] + - [25.15151515151515, 1.3589918330813755, 0.22422639215692192, -0.14102644212714552] + - [25.757575757575758, 1.3545629731499031, 0.23565120791991487, -0.1445082220125006] + - [26.363636363636363, 1.3506401234912522, 0.24711059637428476, -0.14800074006415037] + - [26.969696969696965, 1.3463970173621982, 0.2588074025351646, -0.15154103211344008] + - [27.57575757575757, 1.3410073880195152, 0.2709444714176876, -0.1551661339917147] + - [28.181818181818173, 1.3335721131803202, 0.2837271424084408, -0.15891461105784527] + - [28.78787878787879, 1.3226605034778052, 0.297279979802911, -0.162822381677251] + - [29.393939393939394, 1.3088267760459167, 0.3114358727432318, -0.1668524850863165] + - [29.999999999999996, 1.293179845983757, 0.3259800223070344, -0.17095231207814518] + - [32.99999999999999, 1.2227942929485434, 0.3970119865927945, -0.19065084409326555] + - [36.0, 1.1690675345824542, 0.4654825801742688, -0.2091403102741969] + - [39.0, 1.1185127344931836, 0.5369846534658362, -0.22793343069972113] + - [41.99999999999999, 1.0691495568869278, 0.6100746386164546, -0.2438361455490805] + - [45.0, 1.019563572232842, 0.6840421010574879, -0.2578160269121002] + - [48.0, 0.9684961206333724, 0.7581287359461155, -0.27218220570766133] + - [50.99999999999999, 0.9150249544214168, 0.8313804259072707, -0.28585611907670677] + - [54.0, 0.8587524348741613, 0.9030436286318514, -0.2990916002236935] + - [57.00000000000001, 0.7993507057700278, 0.9724349354977458, -0.31206948737467816] + - [60.00000000000001, 0.7366757840099812, 1.0387843383002866, -0.32500114333193925] + - [63.0, 0.6708611310566073, 1.1012289320267508, -0.3375710068108597] + - [65.99999999999999, 0.6020725632750169, 1.159180449202559, -0.34997787717428586] + - [69.00000000000001, 0.5305552873368461, 1.212166798951916, -0.36241987323054486] + - [72.0, 0.4568106114737238, 1.2594244217645885, -0.37406627630200784] + - [75.0, 0.38135877401352264, 1.300365254524011, -0.3855032957980692] + - [78.00000000000001, 0.30471186723258825, 1.3347197599443308, -0.39673030871306] + - [81.0, 0.22747993940188369, 1.3623896889190528, -0.4074013603667351] + - [84.0, 0.15049051876081257, 1.3826062664200631, -0.41720525607892184] + - [87.00000000000001, 0.07356811028904692, 1.3946007331814683, -0.4269511673164531] + - [90.0, 2.4117407376733624e-10, 1.4, -0.4362960387812576] + - [92.99999999999999, -0.05290327599043141, 1.394600733109814, -0.4412823895099083] + - [96.00000000000001, -0.1053433633602516, 1.3826062663604912, -0.4462866615355346] + - [99.0, -0.15923595708458305, 1.3623896891371166, -0.4504755540492662] + - [101.99999999999999, -0.21329830659312152, 1.334719760209072, -0.4528181208373379] + - [105.00000000000001, -0.26695114212681564, 1.3003652542948476, -0.4536048555635364] + - [108.0, -0.3197674283472881, 1.259424421503142, -0.45382464948811807] + - [111.00000000000001, -0.37138870075158226, 1.2121667993312273, -0.4538399050280023] + - [114.00000000000001, -0.42145079474212704, 1.1591804486947022, -0.4514092867158545] + - [117.0, -0.4696027917995808, 1.1012289319578572, -0.4489574728830454] + - [120.00000000000001, -0.5156730485803553, 1.0387843386239664, -0.4465922986352916] + - [123.00000000000001, -0.5595454945174931, 0.9724349347402066, -0.4441815773768972] + - [126.0, -0.6011267043302511, 0.9030436287782487, -0.4415272438360239] + - [129.00000000000003, -0.6405174677062219, 0.8313804266451482, -0.44001880137628147] + - [132.0, -0.6779472842292203, 0.7581287363784367, -0.4396144387679346] + - [135.0, -0.7136945009310883, 0.6840421002850957, -0.4419309639811457] + - [138.00000000000003, -0.7484046897957345, 0.6100746386693537, -0.4438533579835588] + - [141.0, -0.7829589140257891, 0.5369846537172351, -0.4471646357965331] + - [144.0, -0.8184157780815385, 0.46547787012907416, -0.4536445011463864] + - [147.0, -0.8642449214995996, 0.3964421663609553, -0.460311181571489] + - [150.0, -0.8162925449378119, 0.3304836727876246, -0.4637885004983212] + - [153.0, -0.7338988124200682, 0.2684883753163673, -0.4435312542909256] + - [156.0, -0.6523544998268908, 0.21102982015630545, -0.4210884056817157] + - [159.0, -0.5708101872337124, 0.15875837628360082, -0.3965290161328083] + - [162.0, -0.48926587464053517, 0.11227625903467538, -0.4122953067854554] + - [165.0, -0.40772156204735727, 0.0720266527603107, -0.445582303990209] + - [168.0, -0.32617724945417886, 0.03694462741007916, -0.4817312021705821] + - [171.0, -0.24463293686100068, 0.025528513059093868, -0.4538562799233719] + - [174.0, -0.1630886241993832, 0.019961178214650488, -0.29999999852727355] + - [177.0, -0.08173252052991518, 0.016548176069292514, -0.15034620691035067] + - [180.0, 0.0026360559488806837, 0.015450777462182715, 0.004849000257769079] + - name: FFA-W3-301 + relative_thickness: 0.301 + data: + - [-180.0, -0.00276134805429111, 0.02453927141931893, -0.0038792002062152642] + - [-177.0, 0.08561727858371998, 0.025544788908710134, 0.12027696552828059] + - [-174.0, 0.1708402124784445, 0.02867191246633776, 0.23999994728892501] + - [-171.0, 0.256260711540136, 0.03379408600261468, 0.3622342309671337] + - [-168.0, 0.34168548191822784, 0.04258772295191195, 0.40136384443158346] + - [-165.0, 0.4270999441186745, 0.07303869561628837, 0.40296780537531735] + - [-162.0, 0.5125261595544347, 0.11047868473749835, 0.40467265914407846] + - [-159.0, 0.597935157547991, 0.15352080641411045, 0.4121450943968054] + - [-156.0, 0.6833638650804877, 0.20193231190281233, 0.4351175694487958] + - [-153.0, 0.7687818820419935, 0.25513804254980643, 0.4570029265141274] + - [-149.99999999999997, 0.8550910429854451, 0.31254129184441387, 0.4766668606350469] + - [-147.0, 0.9039364868969643, 0.3736092840320001, 0.4684921861853799] + - [-144.0, 0.8448786706272934, 0.43752017270872695, 0.45707657877189334] + - [-140.99999999999997, 0.8002081584343325, 0.5037108954378096, 0.44583472734284396] + - [-138.0, 0.7578705889455373, 0.5713578837634239, 0.4385777721378651] + - [-135.0, 0.7166189594198369, 0.6398062654586694, 0.4334144912736578] + - [-131.99999999999997, 0.6754644768433276, 0.70835260936862, 0.4276234330264705] + - [-129.0, 0.6336218412112061, 0.776111731098323, 0.4252987997113364] + - [-126.0, 0.5907400273805817, 0.8423844743144893, 0.42491854996740597] + - [-122.99999999999999, 0.5465416507094067, 0.9065370666195409, 0.4254676251666612] + - [-119.99999999999999, 0.5008523278706237, 0.9678554564468888, 0.42607575384153473] + - [-117.0, 0.45369351849012785, 1.0255387873195376, 0.42712810179730115] + - [-114.0, 0.40514952176606256, 1.0790416411418553, 0.42855953104729716] + - [-110.99999999999999, 0.3553503774042096, 1.1279272799321953, 0.4299001103580478] + - [-108.0, 0.30458218603543047, 1.1714870331165825, 0.4295106140190407] + - [-105.0, 0.25316876014072887, 1.2091747640922414, 0.4287776607709619] + - [-101.99999999999999, 0.20143143313716963, 1.2407416308365935, 0.42766532012880226] + - [-98.99999999999999, 0.14975056278465287, 1.266101964429581, 0.4251962157937684] + - [-96.0, 0.09865515416861759, 1.28454275982464, 0.4210752364807829] + - [-92.99999999999999, 0.04870452472412226, 1.2952884226890675, 0.41627166275668837] + - [-89.99999999999999, -1.914869897030565e-10, 1.3, 0.4114412785108106] + - [-87.0, -0.048704524345961876, 1.295288422751814, 0.40199229077438214] + - [-83.99999999999999, -0.09865515395395544, 1.2845427598782755, 0.3921489653979693] + - [-80.99999999999999, -0.1497505632576992, 1.266101964230274, 0.38209341477267134] + - [-78.0, -0.20143143358800053, 1.2407416305937056, 0.3706230535952631] + - [-74.99999999999999, -0.2531687598330489, 1.2091747643030777, 0.35825189881468195] + - [-71.99999999999999, -0.30458218572702644, 1.1714870333573837, 0.3455612949720398] + - [-69.0, -0.355350377784501, 1.12792727958241, 0.33263420537097554] + - [-65.99999999999999, -0.4051495213158457, 1.0790416416105741, 0.3187319940779546] + - [-63.0, -0.45369351843009537, 1.0255387873831279, 0.3048146730614057] + - [-59.999999999999986, -0.5008523281044394, 0.9678554561478244, 0.2909637378283017] + - [-56.99999999999999, -0.5465416502058466, 0.9065370673197485, 0.2771889648792947] + - [-54.0, -0.5907400274689463, 0.8423844741791099, 0.2634200104269902] + - [-50.999999999999986, -0.6336218416399706, 0.7761117304158496, 0.2497270845952852] + - [-47.99999999999999, -0.6754644770863735, 0.7083526089686707, 0.236167686546562] + - [-45.0, -0.7166189589898811, 0.6398062661733612, 0.22281449867223166] + - [-41.999999999999986, -0.7578705889769921, 0.5713578837144562, 0.21091815478732126] + - [-38.99999999999999, -0.8002081585822967, 0.5037108952051196, 0.18703509355208628] + - [-36.0, -0.8447611964171388, 0.4375464989689953, 0.1340890351161215] + - [-32.999999999999986, -0.889722173514938, 0.3767946737706762, 0.07998825847004287] + - [-29.999999999999996, -1.018713439607753, 0.28249260229812045, 0.05332831627164427] + - [-29.393939393939394, -1.0563812228200908, 0.2593240864671062, 0.04997284414310546] + - [-28.787878787878785, -1.086148816848076, 0.2383508571106716, 0.046716751705706897] + - [-28.18181818181818, -1.1022090424848816, 0.22130072647652604, 0.04336131331373995] + - [-27.575757575757574, -1.1041966521165323, 0.20874177288698278, 0.03980497593157037] + - [-26.969696969696965, -1.1049279905346523, 0.1980188168799305, 0.0362451336961552] + - [-26.363636363636363, -1.1054298145742394, 0.18855641911435486, 0.03273509541398043] + - [-25.757575757575754, -1.1058181916870171, 0.17996032147155705, 0.029313888157993667] + - [-25.15151515151515, -1.1062091893247097, 0.1718362658328383, 0.026020539001142526] + - [-24.545454545454543, -1.1067188749390402, 0.1637899940794999, 0.02289407501637466] + - [-23.939393939393938, -1.1074639627698009, 0.15543101302928847, 0.01997207035311907] + - [-23.33333333333333, -1.1085910948918563, 0.1468983147578778, 0.01712933147416763] + - [-22.727272727272727, -1.1100725104578437, 0.13848429074033744, 0.014318186304077978] + - [-22.12121212121212, -1.1117974350832927, 0.130235942327356, 0.011613485933646812] + - [-21.515151515151512, -1.113655094383732, 0.12220027086962218, 0.009090081453670889] + - [-20.90909090909091, -1.1155347139746912, 0.11442427771782461, 0.006822823954946942] + - [-20.3030303030303, -1.1173255194716991, 0.10695496422265191, 0.004886564528271688] + - [-19.696969696969695, -1.119047659765663, 0.09984162564747956, 0.0033216006987985113] + - [-19.09090909090909, -1.121099524772148, 0.09310860106440902, 0.0019814861866536164] + - [-18.484848484848484, -1.1227949705210782, 0.08671209768832253, 0.0008708021997372366] + - [-17.878787878787875, -1.1232866853405976, 0.08060278691091625, 1.9476421771355293e-05] + - [-17.272727272727273, -1.1221912882583145, 0.07476346598321928, -0.0007491094763737234] + - [-16.666666666666664, -1.120340012758485, 0.06918053505103228, -0.0013769486787106545] + - [-16.06060606060606, -1.1187562605109835, 0.06383033151448625, -0.0016665050581989107] + - [-15.454545454545455, -1.1179770899763324, 0.058700425672768196, -0.0015827668344292126] + - [-14.848484848484848, -1.1174316099007273, 0.053779365921054124, -0.001378982379209499] + - [-14.24242424242424, -1.1166674394819067, 0.049036737376204904, -0.0012147421220060645] + - [-13.636363636363633, -1.1148831924468796, 0.04438435403446658, -0.0013361596091991976] + - [-13.03030303030303, -1.1103567083685801, 0.039729724843399754, -0.0021244869995222307] + - [-12.424242424242424, -1.1028841178764415, 0.035415803203190835, -0.003461162417320888] + - [-11.818181818181817, -1.0904827194129734, 0.03179018699059231, -0.005404949236075227] + - [-11.212121212121213, -1.0481151026258493, 0.028636864514262592, -0.010654495646216986] + - [-10.606060606060606, -0.9837660849801493, 0.025861049536585873, -0.018032181263130814] + - [-9.999999999999998, -0.9176740011353404, 0.02351490003985604, -0.024936149890650128] + - [-9.393939393939394, -0.8538809694432812, 0.021541365000000506, -0.030659117805281164] + - [-8.787878787878787, -0.7850275541554429, 0.019826449018725822, -0.03619647196477812] + - [-8.18181818181818, -0.7142497602904492, 0.01833689352773835, -0.04150036202867784] + - [-7.575757575757576, -0.643980937677806, 0.017018271040265705, -0.04647756481559131] + - [-6.96969696969697, -0.5730335682187075, 0.015821941780800767, -0.05112857575859415] + - [-6.363636363636362, -0.4997371968217961, 0.014804757578991086, -0.055764969015265634] + - [-5.757575757575755, -0.4223840202774928, 0.014012898897389497, -0.060707678273338] + - [-5.151515151515151, -0.33991690303301414, 0.013347830781050245, -0.06602266736176916] + - [-4.545454545454545, -0.25464090048993476, 0.012798941742908925, -0.07140006387916052] + - [-3.9393939393939377, -0.1693179700085787, 0.0123886940552848, -0.07650280563386284] + - [-3.333333333333334, -0.08388846982066332, 0.012071623646467272, -0.08133126422893541] + - [-2.7272727272727266, 0.0021371008008744486, 0.011813731151605401, -0.08597633636252096] + - [-2.1212121212121198, 0.08779418302143824, 0.011624260176041477, -0.0903698027097465] + - [-1.515151515151516, 0.17244071284456583, 0.011496960929865439, -0.0944275742934447] + - [-0.9090909090909121, 0.256380070997822, 0.011423500982055019, -0.09818355126615731] + - [-0.30303030303030193, 0.339695117929429, 0.011386585527172999, -0.10172480900339027] + - [0.30303030303030193, 0.422350148744709, 0.011387029791517926, -0.10504204893029948] + - [0.9090909090909121, 0.5043544997590137, 0.011424870515570569, -0.10815521270503255] + - [1.515151515151516, 0.585754022612516, 0.011489174593233335, -0.11109514650769432] + - [2.1212121212121198, 0.6665538787822869, 0.01158429278471337, -0.11386998460773042] + - [2.72727272727273, 0.7467660723555668, 0.011704712084653212, -0.11648949583545239] + - [3.333333333333334, 0.8263851155042815, 0.011849773701211666, -0.1189672405292041] + - [3.9393939393939377, 0.9053999027329627, 0.012023297371087562, -0.12131207717728322] + - [4.545454545454548, 0.9837709334066626, 0.012223087590234959, -0.12352974981578407] + - [5.151515151515151, 1.0614046446669467, 0.01245329701120598, -0.1256084685039096] + - [5.757575757575755, 1.1382434612265449, 0.012718672745149876, -0.1275480091045587] + - [6.363636363636366, 1.2142217214021, 0.01301902440451911, -0.1293338883892215] + - [6.96969696969697, 1.2892440238264533, 0.013360828544189764, -0.1309649809572519] + - [7.5757575757575735, 1.363043389844351, 0.013753720182796301, -0.1324227437872139] + - [8.181818181818183, 1.4354862191541595, 0.014196668849666602, -0.13367570058367087] + - [8.787878787878787, 1.5065252631832153, 0.014692443482670214, -0.13474130226465206] + - [9.393939393939391, 1.5754636919600689, 0.015261222409579831, -0.1355282423990744] + - [10.000000000000002, 1.6420800012256878, 0.015919300013349475, -0.13599100000131067] + - [10.606060606060606, 1.7060056281137754, 0.016684357655769897, -0.13604184729526647] + - [11.21212121212121, 1.7663737220521853, 0.017595167683009096, -0.13598998138727125] + - [11.818181818181818, 1.8230108380154015, 0.018700881073030806, -0.135368417845941] + - [12.424242424242424, 1.8745610678921356, 0.02006261049481751, -0.13446317478239123] + - [13.030303030303028, 1.9196363696243386, 0.02178410990244923, -0.13314496185496957] + - [13.636363636363637, 1.957581463233828, 0.024041438091898445, -0.13140394809227726] + - [14.24242424242424, 1.982656225304165, 0.027031536090747214, -0.12934017512892773] + - [14.848484848484844, 1.9982859957493535, 0.031078168306843134, -0.12698992647570778] + - [15.454545454545455, 1.9978141947261592, 0.03609653936128562, -0.12465311849333922] + - [16.06060606060606, 1.9931621159963426, 0.04221747379939444, -0.1224455583436262] + - [16.666666666666664, 1.9792980443035983, 0.04912313118584663, -0.1201627199774164] + - [17.272727272727273, 1.9545744275435493, 0.05684674689915437, -0.1180266289547721] + - [17.878787878787875, 1.9236990149717281, 0.0654687254626729, -0.1168142552858384] + - [18.484848484848488, 1.8824821860975591, 0.07539409184162735, -0.11665418637953086] + - [19.09090909090909, 1.8235962177964025, 0.0868794769453997, -0.11656813534820776] + - [19.696969696969695, 1.7628098999477564, 0.09911813982094658, -0.1165236937328464] + - [20.303030303030305, 1.713299357954769, 0.11144195853533573, -0.11674638359791663] + - [20.90909090909091, 1.6664180109708746, 0.12424945370232494, -0.11841754890000589] + - [21.515151515151512, 1.62080311455464, 0.13749006084395657, -0.12136145997328106] + - [22.12121212121212, 1.5776865156840834, 0.15097506790435294, -0.12516237477315556] + - [22.727272727272727, 1.5383000613372242, 0.16451576282763603, -0.12940455125504274] + - [23.33333333333333, 1.5038755984920806, 0.17792343355792825, -0.13367224737435598] + - [23.93939393939394, 1.4756449741266713, 0.19100936803935198, -0.1375497210865088] + - [24.545454545454543, 1.452622372834195, 0.20377222016864285, -0.1410924788590191] + - [25.15151515151515, 1.4319513296164073, 0.21641467732637257, -0.14478520720102742] + - [25.757575757575758, 1.4134132419158008, 0.2289468766723025, -0.14857293254788445] + - [26.363636363636363, 1.396814509952853, 0.24137697031525532, -0.15239545602934665] + - [26.969696969696965, 1.381961533948041, 0.2537131103640538, -0.15619257877517048] + - [27.57575757575757, 1.3686607141218416, 0.2659634489275209, -0.15990410191511234] + - [28.181818181818173, 1.3567663698258252, 0.27812582296889804, -0.16347293887091296] + - [28.78787878787879, 1.3467057336355808, 0.290072129582103, -0.16691494572817778] + - [29.393939393939394, 1.338105216609913, 0.3018407440579514, -0.1702747345449387] + - [29.999999999999996, 1.3302911293317579, 0.313533883959668, -0.17358778654714124] + - [32.99999999999999, 1.2809478424436322, 0.3734800117846805, -0.1904182945681195] + - [36.0, 1.2068836609398317, 0.43751910507249014, -0.20810743661800027] + - [39.0, 1.1431545122604239, 0.5037108952051199, -0.22593829646058564] + - [41.99999999999999, 1.0826722699671312, 0.5713578837144566, -0.24033019250468293] + - [45.0, 1.0237413699855444, 0.6398062661733612, -0.25251504152405035] + - [48.0, 0.9649492529805334, 0.7083526089686709, -0.26512964586861304] + - [50.99999999999999, 0.9051740594856722, 0.7761117304158499, -0.27705271566747] + - [54.0, 0.8439143249556375, 0.8423844741791099, -0.28853521289127376] + - [57.00000000000001, 0.7807737860083519, 0.9065370673197487, -0.2997692284771047] + - [60.00000000000001, 0.7155033258634842, 0.967855456147825, -0.3110024581989943] + - [63.0, 0.648133597757279, 1.0255387873831276, -0.32205749010161855] + - [65.99999999999999, 0.578785030451208, 1.0790416416105741, -0.33303465917432035] + - [69.00000000000001, 0.507643396835001, 1.1279272795824102, -0.34402858939799214] + - [72.0, 0.4351174081814661, 1.1714870333573837, -0.35451004718360896] + - [75.0, 0.36166965690435526, 1.2091747643030777, -0.3648636183781092] + - [78.00000000000001, 0.28775919084000046, 1.2407416305937056, -0.37505633784889575] + - [81.0, 0.21392937608242715, 1.2661019642302742, -0.38479021595321944] + - [84.0, 0.14093593421993608, 1.2845427598782757, -0.39381553764843064] + - [87.00000000000001, 0.06864006482775985, 1.295288422751814, -0.4028029776400391] + - [90.0, 2.2527871755551043e-10, 1.3, -0.411441278511576] + - [92.99999999999999, -0.04936100367089743, 1.2952884226890673, -0.41625679340498817] + - [96.00000000000001, -0.09865515416861767, 1.28454275982464, -0.4210752364807829] + - [99.0, -0.14975056278465307, 1.2661019644295808, -0.4251962157937684] + - [101.99999999999999, -0.20143143313716946, 1.2407416308365935, -0.4276653201288023] + - [105.00000000000001, -0.25316876014072887, 1.2091747640922414, -0.42877766077096197] + - [108.0, -0.3045821860354303, 1.1714870331165825, -0.4295106140190408] + - [111.00000000000001, -0.35535037740421005, 1.1279272799321947, -0.4299001103580478] + - [114.00000000000001, -0.4051495217660624, 1.0790416411418549, -0.42855953104729716] + - [117.0, -0.4536935184901277, 1.0255387873195378, -0.4271281017973011] + - [120.00000000000001, -0.5008523278706241, 0.9678554564468884, -0.4260757538415347] + - [123.00000000000001, -0.5465416507094069, 0.9065370666195411, -0.4254676251666612] + - [126.0, -0.5907400273805816, 0.8423844743144896, -0.4249185499674059] + - [129.00000000000003, -0.6336218412112065, 0.7761117310983223, -0.42529879971133644] + - [132.0, -0.6754644768433279, 0.7083526093686194, -0.42762343302647055] + - [135.0, -0.7166189594198369, 0.6398062654586694, -0.43341449127365783] + - [138.00000000000003, -0.7578705889455376, 0.5713578837634233, -0.4385777721378651] + - [141.0, -0.8002081584343328, 0.5037108954378091, -0.4458347273428441] + - [144.0, -0.8448786706272935, 0.4375201727087269, -0.45707657877189334] + - [147.0, -0.9039364868969646, 0.3736092840320001, -0.4684921861853799] + - [150.0, -0.8550910429854442, 0.3125412918444133, -0.4766668606350469] + - [153.0, -0.7687811249162692, 0.255137552379744, -0.45700273252733853] + - [156.0, -0.6833609998186628, 0.20193059950019412, -0.4351168353264133] + - [159.0, -0.5979408747210557, 0.15352387742183135, -0.4111669221783878] + - [162.0, -0.5125207496234497, 0.11047614751489504, -0.4241615498132275] + - [165.0, -0.42710062452584313, 0.07303896152415017, -0.4529678197258013] + - [168.0, -0.341680499428236, 0.04258650935509327, -0.484210625294546] + - [171.0, -0.256260374330629, 0.033794061415249564, -0.45370747085227264] + - [174.0, -0.17084024916132984, 0.028671914211871243, -0.29999999852727355] + - [177.0, -0.08561727858372, 0.025544788908710134, -0.15034620691035067] + - [180.0, 0.002761348054291101, 0.02453927141931893, 0.004849000257769079] + - name: FFA-W3-330blend + relative_thickness: 0.33 + data: + - [-180.0, -0.00295310480010975, 0.031685097807814346, -0.0038792002062152642] + - [-177.0, 0.09156281330236912, 0.032681106781086156, 0.12027696552828059] + - [-174.0, 0.18270389737282886, 0.0357785743499168, 0.23999994728892501] + - [-171.0, 0.27405626616054796, 0.040851894581822035, 0.362108367265699] + - [-168.0, 0.3654132028783924, 0.04836938738994004, 0.40484720009822994] + - [-165.0, 0.456759115586121, 0.07051088219022968, 0.41078744700889075] + - [-162.0, 0.5481175977110104, 0.1087336936958111, 0.41714883226395283] + - [-159.0, 0.6394576667600333, 0.15180786156940979, 0.42830392830425945] + - [-156.0, 0.7308188140407419, 0.20025613762976724, 0.45159309437430134] + - [-153.0, 0.8221685283633847, 0.25350322781514767, 0.4741055453344794] + - [-149.99999999999997, 0.914471270525667, 0.31095229889779114, 0.49428462050318445] + - [-147.0, 0.9659569685211193, 0.37207056240384134, 0.48337774367860004] + - [-144.0, 0.8968080905632617, 0.43603579419126814, 0.46903838780766] + - [-140.99999999999997, 0.8449531813949037, 0.5022849955312217, 0.4548689684283979] + - [-138.0, 0.7963489000963981, 0.5699943482798611, 0.4453599729911809] + - [-135.0, 0.7495822898330368, 0.6385088557366441, 0.43838128866483267] + - [-131.99999999999997, 0.7035567859349695, 0.7071248884089323, 0.4306672578330733] + - [-129.0, 0.6573820102110917, 0.7749570419500504, 0.42689993588610986] + - [-126.0, 0.610646415640526, 0.8413060025297375, 0.4256344772532876] + - [-122.99999999999999, 0.5630303897772142, 0.905537767295075, 0.4253429446813723] + - [-119.99999999999999, 0.5143128576913016, 0.9669380168897895, 0.4252858080030911] + - [-117.0, 0.4644769661734424, 1.0247057787441851, 0.42579215085796807] + - [-114.0, 0.4135902775967422, 1.0782954021741906, 0.4270737916272536] + - [-110.99999999999999, 0.36176451140260635, 1.1272696905018207, 0.42815713612141515] + - [-108.0, 0.30926329072791864, 1.1709198749808942, 0.42778010295360014] + - [-105.0, 0.25640112017472827, 1.2086998432110483, 0.4270960385314551] + - [-101.99999999999999, 0.20349160354844895, 1.2403603487102246, 0.4260796972748419] + - [-98.99999999999999, 0.15090525506505859, 1.2658141465909327, 0.4237458993073364] + - [-96.0, 0.09916651401007903, 1.2843479486635907, 0.41982283482966565] + - [-92.99999999999999, 0.04884710426198365, 1.2952037773584146, 0.4152427910218377] + - [-89.99999999999999, -1.9217900756197832e-10, 1.3, 0.4106324327824131] + - [-87.0, -0.048847103882189574, 1.295203777422225, 0.401395838960154] + - [-83.99999999999999, -0.09916651379343445, 1.2843479487176994, 0.3917561417897109] + - [-80.99999999999999, -0.1509052555453119, 1.265814146390733, 0.38192134865836624] + - [-78.0, -0.20349160400825486, 1.2403603484665107, 0.37071689343967307] + - [-74.99999999999999, -0.2564011198591013, 1.2086998434224336, 0.35863845261145594] + - [-71.99999999999999, -0.30926329041017336, 1.1709198752222478, 0.3462561092660096] + - [-69.0, -0.3617645117972698, 1.127269690151353, 0.3336664235378949] + - [-65.99999999999999, -0.4135902771265294, 1.0782954026437124, 0.3202016611593051] + - [-63.0, -0.464476966110736, 1.0247057788078822, 0.30671376411185425] + - [-59.999999999999986, -0.5143128579394058, 0.9669380165903052, 0.2933288976616854] + - [-56.99999999999999, -0.5630303892374819, 0.9055377679961863, 0.28009518945282263] + - [-54.0, -0.6106464157365542, 0.841306002394201, 0.2668860812075855] + - [-50.999999999999986, -0.6573820106813101, 0.7749570412668196, 0.25375896476302723] + - [-47.99999999999999, -0.7035567862050199, 0.7071248880085642, 0.24076857070795474] + - [-45.0, -0.7495822893492367, 0.6385088564520456, 0.22799133869725233] + - [-41.999999999999986, -0.7963489001328222, 0.5699943482308504, 0.2167080000955648] + - [-38.99999999999999, -0.8449531815655036, 0.5022849952983206, 0.1923600296104253] + - [-36.0, -0.8966770922944285, 0.43606522851223933, 0.13475790093067566] + - [-32.999999999999986, -0.9501062550848293, 0.3756320274688328, 0.07564551751922276] + - [-29.999999999999996, -1.0825191277520099, 0.27566317608486585, 0.04922564362651128] + - [-29.393939393939394, -1.1190282098526976, 0.25053252955729355, 0.046131270271671486] + - [-28.787878787878785, -1.147433007114013, 0.22810920648274352, 0.04313762617455519] + - [-28.18181818181818, -1.1621583673809779, 0.2105067151846633, 0.04003347434649611] + - [-27.575757575757574, -1.1628570057009886, 0.19832115252961718, 0.03670782401545741] + - [-26.969696969696965, -1.161848025062223, 0.1880718475833369, 0.033364717888706596] + - [-26.363636363636363, -1.160128153798606, 0.1791461992773612, 0.030066484620366] + - [-25.757575757575754, -1.1578193568519457, 0.17117304459953045, 0.02686092588027333] + - [-25.15151515151515, -1.1550435991640493, 0.163781220537685, 0.023795843338266377] + - [-24.545454545454543, -1.151922845676725, 0.15659956407966538, 0.020919038664182907] + - [-23.939393939393938, -1.1485670742962868, 0.14926103953711423, 0.018277507696639113] + - [-23.33333333333333, -1.1437559550044716, 0.1419500794325697, 0.01581434177210206] + - [-22.727272727272727, -1.1369500850755494, 0.13492395256044531, 0.013470798215018724] + - [-22.12121212121212, -1.1286293290913705, 0.12815151700341593, 0.011246965456545579] + - [-21.515151515151512, -1.1192735516337848, 0.12160163084415637, 0.009142931927839132] + - [-20.90909090909091, -1.1093626172846431, 0.11524315216534152, 0.007158786060055892] + - [-20.3030303030303, -1.099376390625795, 0.10904493904964621, 0.005294616284352339] + - [-19.696969696969695, -1.0894875635956953, 0.10300027641570707, 0.0035394544573808654] + - [-19.09090909090909, -1.0784947419845206, 0.09721354517687558, 0.0018690258042908727] + - [-18.484848484848484, -1.0669840486532247, 0.09164982150618976, 0.00037963482459413056] + - [-17.878787878787875, -1.0558262998912888, 0.0862507820422565, -0.0008251451620371137] + - [-17.272727272727273, -1.0446009495873692, 0.081030808239656, -0.0018977834507657736] + - [-16.666666666666664, -1.0335838478937267, 0.07596755696133924, -0.002807829082999535] + - [-16.06060606060606, -1.02369953363722, 0.07100288415872001, -0.00338319595129919] + - [-15.454545454545455, -1.0150282637104056, 0.06609247057479131, -0.0036674085411501265] + - [-14.848484848484848, -1.007048719808014, 0.061264255161239664, -0.0038848856232495408] + - [-14.24242424242424, -1.0003167534214272, 0.05656968273161914, -0.004002936671956978] + - [-13.636363636363633, -0.9955151521735311, 0.05202000907350231, -0.003901679009749271] + - [-13.03030303030303, -0.9924728195106627, 0.04754671168393948, -0.003396873967465143] + - [-12.424242424242424, -0.9890283951848636, 0.04328670161456213, -0.002870465274813953] + - [-11.818181818181817, -0.9823275396324186, 0.03937779656047934, -0.002837453138700414] + - [-11.212121212121213, -0.9631731906581247, 0.03567327551293121, -0.004663532499492021] + - [-10.606060606060606, -0.9327333689237203, 0.03224885419006181, -0.008010326966369817] + - [-9.999999999999998, -0.8958320007263345, 0.029290300050221357, -0.011979299924950726] + - [-9.393939393939394, -0.8434506782476175, 0.02677368332152253, -0.017519892563589264] + - [-8.787878787878787, -0.7725518614824108, 0.02454570170384594, -0.024978689378645384] + - [-8.18181818181818, -0.6969307801826782, 0.022598063883256674, -0.032552868491644] + - [-7.575757575757576, -0.6259221616047274, 0.020888989572233094, -0.039001769097658276] + - [-6.96969696969697, -0.5535347580975365, 0.019345464411084177, -0.045095955217322875] + - [-6.363636363636362, -0.4787156911411543, 0.018019153465132103, -0.05106686666340564] + - [-5.757575757575755, -0.40094744513126696, 0.016950155266730278, -0.05706127582414793] + - [-5.151515151515151, -0.3196485094308806, 0.016022506071325982, -0.06306559393267265] + - [-4.545454545454545, -0.23569771495210545, 0.015248332547055187, -0.06900847534308834] + - [-3.9393939393939377, -0.15020954543764442, 0.014680699326137508, -0.07483096948798779] + - [-3.333333333333334, -0.06244165025780066, 0.014257396012887592, -0.08058824864335443] + - [-2.7272727272727266, 0.027198505941453153, 0.013916784010008927, -0.08624250627760546] + - [-2.1212121212121198, 0.11680546985045409, 0.013663478278062951, -0.09165544192886615] + - [-1.515151515151516, 0.20532044007043287, 0.013488544450598999, -0.09670682661781702] + - [-0.9090909090909121, 0.29328924458787786, 0.013379203456441589, -0.10143065638886109] + - [-0.30303030303030193, 0.38054964999164403, 0.013310664960684563, -0.1058963892250747] + - [0.30303030303030193, 0.4669435096283293, 0.013301828718006302, -0.11005877694678005] + - [0.9090909090909121, 0.5524455023500271, 0.013321399647618649, -0.11393738269397763] + - [1.515151515151516, 0.6370469791369167, 0.013375377537830666, -0.11755650830862198] + - [2.1212121212121198, 0.7207820685164329, 0.013470019167514788, -0.12093802345318794] + - [2.72727272727273, 0.8036800689703992, 0.013597749041127583, -0.12410143125405476] + - [3.333333333333334, 0.8857342244384241, 0.013755855796905523, -0.12706482888937856] + - [3.9393939393939377, 0.9669342236913783, 0.013949445754431867, -0.1298413534611656] + - [4.545454545454548, 1.0472066063473617, 0.014176042281982201, -0.1324289265994498] + - [5.151515151515151, 1.1265488408696627, 0.014436925987404163, -0.13483820940196392] + - [5.757575757575755, 1.2049714057062078, 0.014733126811789182, -0.1370840964506493] + - [6.363636363636366, 1.2823206223127481, 0.01506901253583525, -0.1391365896474158] + - [6.96969696969697, 1.358467791331078, 0.015451418967556627, -0.14099422431393593] + - [7.5757575757575735, 1.4330711003657353, 0.01588620128624975, -0.1426332734716319] + - [8.181818181818183, 1.5058840914114882, 0.016383027479798647, -0.14401074089301535] + - [8.787878787878787, 1.5768178111220517, 0.01695430624353996, -0.1451536572283362] + - [9.393939393939391, 1.6449672696292719, 0.01761983379657999, -0.14593517250906068] + - [10.000000000000002, 1.7101000011892455, 0.018408100016280307, -0.146355] + - [10.606060606060606, 1.7719336441576516, 0.019359816184843563, -0.1463524132681365] + - [11.21212121212121, 1.8289725573375344, 0.020538834947403533, -0.14628294051951027] + - [11.818181818181818, 1.8810357969088758, 0.02204070906134788, -0.1456650317791209] + - [12.424242424242424, 1.9248714942831981, 0.024074644290553837, -0.14481985097020228] + - [13.030303030303028, 1.9581694283348512, 0.026869923348073282, -0.14372446939676928] + - [13.636363636363637, 1.9787954067424105, 0.030911921619456877, -0.1425515135606596] + - [14.24242424242424, 1.9881000167141294, 0.035902719462541685, -0.14139938067735164] + - [14.848484848484844, 1.9918800682494575, 0.04182376320776166, -0.1403109805999026] + - [15.454545454545455, 1.9947767123752087, 0.04785397862399975, -0.13923815247739152] + - [16.06060606060606, 1.9961304323096218, 0.054200757721955754, -0.13810073791263397] + - [16.666666666666664, 1.991760756168843, 0.06077953195590087, -0.13662265607563298] + - [17.272727272727273, 1.9814792343434942, 0.06769300788035378, -0.13501975650692138] + - [17.878787878787875, 1.9671624489387338, 0.0753876450598798, -0.1336993420125636] + - [18.484848484848488, 1.9402820692395861, 0.0844423329820813, -0.13277418085878087] + - [19.09090909090909, 1.890354743719397, 0.09492505510587815, -0.1319461300492411] + - [19.696969696969695, 1.8353466148920614, 0.10609190215491042, -0.13142387054788712] + - [20.303030303030305, 1.79040546410864, 0.11731665217461257, -0.13149561495013] + - [20.90909090909091, 1.7464435906393225, 0.12888817149590984, -0.1325878910630181] + - [21.515151515151512, 1.7024310751563467, 0.14080646284753648, -0.13454591023695495] + - [22.12121212121212, 1.6602156350267867, 0.15296474736847926, -0.13713329020499418] + - [22.727272727272727, 1.6216449876177181, 0.16525624619772455, -0.14011364870018939] + - [23.33333333333333, 1.5885668502962154, 0.17757418047425916, -0.14325060345559415] + - [23.93939393939394, 1.5628289404293523, 0.1898117713370697, -0.14630777220426217] + - [24.545454545454543, 1.5435901960749436, 0.20199728043730628, -0.14948101602478925] + - [25.15151515151515, 1.5272493535436948, 0.21426408785548257, -0.1531945929705434] + - [25.757575757575758, 1.5130789279717727, 0.22657914987053618, -0.15726881610373694] + - [26.363636363636363, 1.5003803855200826, 0.23890787590996915, -0.16151874789550133] + - [26.969696969696965, 1.4884551923495304, 0.25121567540128387, -0.1657594508169681] + - [27.57575757575757, 1.4766048146210216, 0.26346795777198273, -0.16980598733926874] + - [28.181818181818173, 1.4642422110778794, 0.2756269514318314, -0.17348847188752753] + - [28.78787878787879, 1.4524975815632435, 0.28763787602136537, -0.1769258870916749] + - [29.393939393939394, 1.441506419808432, 0.29954663149354344, -0.1802318424848738] + - [29.999999999999996, 1.4308173921491623, 0.31142513479789036, -0.18345725988974734] + - [32.99999999999999, 1.3669878408084437, 0.37200944948203984, -0.19982448955657647] + - [36.0, 1.2810473837079723, 0.43603528985578766, -0.21710818851070626] + - [39.0, 1.2070759736650047, 0.5022849952983208, -0.23456942758379368] + - [41.99999999999999, 1.1376412859040315, 0.5699943482308507, -0.2482617377803298] + - [45.0, 1.0708318419274814, 0.6385088564520456, -0.2595870504340323] + - [48.0, 1.0050811231500285, 0.7071248880085643, -0.2713636066638902] + - [50.99999999999999, 0.9391171581161569, 0.7749570412668199, -0.28247370638936636] + - [54.0, 0.8723520224807918, 0.8413060023942008, -0.2931571824935403] + - [57.00000000000001, 0.8043291274821172, 0.9055377679961866, -0.3036068588400215] + - [60.00000000000001, 0.7347326541991507, 0.9669380165903058, -0.3140858557293279] + - [63.0, 0.6635385230153369, 1.0247057788078828, -0.3245129498363518] + - [65.99999999999999, 0.590843253037899, 1.0782954026437135, -0.3349225768856173] + - [69.00000000000001, 0.5168064454246709, 1.1272696901513533, -0.34533584957143243] + - [72.0, 0.44180470058596166, 1.170919875222248, -0.35539735066660466] + - [75.0, 0.36628731408443016, 1.2086998434224336, -0.36537871230753205] + - [78.00000000000001, 0.29070229144036375, 1.2403603484665109, -0.3752234966448193] + - [81.0, 0.21557893649330248, 1.265814146390733, -0.3846511443428052] + - [84.0, 0.14166644827633468, 1.2843479487176999, -0.3934397473698714] + - [87.00000000000001, 0.06884036065232411, 1.2952037774222251, -0.4022150944691635] + - [90.0, 2.2609285797725587e-10, 1.3, -0.41063243278316275] + - [92.99999999999999, -0.04950595566772013, 1.2952037773584149, -0.4152282283948728] + - [96.00000000000001, -0.0991665140100791, 1.2843479486635905, -0.4198228348296656] + - [99.0, -0.15090525506505884, 1.2658141465909327, -0.42374589930733647] + - [101.99999999999999, -0.20349160354844878, 1.2403603487102246, -0.4260796972748419] + - [105.00000000000001, -0.25640112017472816, 1.208699843211048, -0.4270960385314551] + - [108.0, -0.3092632907279184, 1.1709198749808942, -0.42778010295360014] + - [111.00000000000001, -0.36176451140260685, 1.1272696905018205, -0.42815713612141515] + - [114.00000000000001, -0.41359027759674216, 1.0782954021741913, -0.4270737916272536] + - [117.0, -0.46447696617344225, 1.0247057787441858, -0.42579215085796807] + - [120.00000000000001, -0.5143128576913019, 0.966938016889789, -0.4252858080030911] + - [123.00000000000001, -0.5630303897772141, 0.9055377672950751, -0.4253429446813724] + - [126.0, -0.6106464156405259, 0.8413060025297379, -0.42563447725328774] + - [129.00000000000003, -0.6573820102110921, 0.7749570419500498, -0.4268999358861099] + - [132.0, -0.70355678593497, 0.7071248884089317, -0.4306672578330734] + - [135.0, -0.7495822898330368, 0.6385088557366441, -0.43838128866483267] + - [138.00000000000003, -0.7963489000963986, 0.5699943482798605, -0.44535997299118096] + - [141.0, -0.844953181394904, 0.5022849955312212, -0.45486896842839797] + - [144.0, -0.8968080905632618, 0.4360357941912681, -0.46903838780765994] + - [147.0, -0.9659569685211197, 0.37207056240384134, -0.48337774367860004] + - [150.0, -0.9144712705256662, 0.3109522988977906, -0.4942846205031845] + - [153.0, -0.8221677186604546, 0.2535027372594743, -0.474105345789274] + - [156.0, -0.7308157498060702, 0.20025442391154932, -0.45159233921668224] + - [159.0, -0.639463780951685, 0.15181093488570574, -0.4269561752447657] + - [162.0, -0.5481118120973009, 0.10873115460206803, -0.43670447013892816] + - [165.0, -0.4567598432429161, 0.07051112500691316, -0.460787498731591] + - [168.0, -0.36540787438853084, 0.048368717335640424, -0.4868358032297164] + - [171.0, -0.2740559055341458, 0.04085187022996305, -0.45355460410152204] + - [174.0, -0.1827039366030899, 0.035778576078861896, -0.29999999852727355] + - [177.0, -0.09156281330236912, 0.03268110678108616, -0.15034620691035067] + - [180.0, 0.002953104800109749, 0.03168509780781435, 0.004849000257769079] + - name: FFA-W3-360 + relative_thickness: 0.36 + data: + - [-180.0, -0.0030455994800266954, 0.03714705619585253, -0.0038792002062152642] + - [-177.0, 0.09443066719918405, 0.03813579727367402, 0.12027696552828059] + - [-174.0, 0.18842639611599918, 0.04121059709689213, 0.23999994728892501] + - [-171.0, 0.28264002743336514, 0.04624657599122172, 0.36210569331107884] + - [-168.0, 0.3768583697537456, 0.05343736898075255, 0.40492111253819074] + - [-165.0, 0.47106534277918066, 0.07362780646212136, 0.41095657023248905] + - [-162.0, 0.5652852789105537, 0.11202069160284718, 0.41741761474786804] + - [-159.0, 0.65948622524709, 0.15503449482107326, 0.4287515274420342] + - [-156.0, 0.7537089100100646, 0.20341350703496067, 0.4524203262258868] + - [-153.0, 0.8479198037214183, 0.2565826892470456, 0.47529949675043215] + - [-149.99999999999997, 0.9431135752137264, 0.3139454469222059, 0.4957921485316433] + - [-147.0, 0.9958727523528891, 0.37496901554698914, 0.4839279017668961] + - [-144.0, 0.9218564239621779, 0.4388318825193565, 0.46854283279917186] + - [-140.99999999999997, 0.8665358324303118, 0.5049709291084021, 0.4533303646174134] + - [-138.0, 0.8149091176675105, 0.5725628074731601, 0.4430100289135322] + - [-135.0, 0.7654825791150911, 0.6409527553977519, 0.4353691068766621] + - [-131.99999999999997, 0.7171069498407837, 0.7094375170556496, 0.4269512175560201] + - [-129.0, 0.6688427614509851, 0.7771321023279496, 0.42272344739510387] + - [-126.0, 0.6202486120545384, 0.8433374940279813, 0.42109968759737715] + - [-122.99999999999999, 0.5709838711412836, 0.9074201235202909, 0.4205674915830363] + - [-119.99999999999999, 0.5208054694962092, 0.9686661759796045, 0.420267203196163] + - [-117.0, 0.4696784718319848, 1.026274897171036, 0.42074809166030047] + - [-114.0, 0.4176618401807726, 1.0797010745420434, 0.42202641700233073] + - [-110.99999999999999, 0.3648583456479005, 1.1285083761976822, 0.42310695903425083] + - [-108.0, 0.31152120474735645, 1.1719882180055656, 0.42283151803407665] + - [-105.0, 0.25796031543242853, 1.209594440831475, 0.4223037015761414] + - [-101.99999999999999, 0.20448538175162137, 1.241078559830792, 0.42146008801316087] + - [-98.99999999999999, 0.15146217425707167, 1.2663563087233543, 0.4193121310123176] + - [-96.0, 0.09941315551328958, 1.2847149620702571, 0.41561651483676326] + - [-92.99999999999999, 0.048915960608778876, 1.2953631593684296, 0.4112706298266405] + - [-89.99999999999999, -1.9251280531227598e-10, 1.3, 0.40690017627925706] + - [-87.0, -0.048915960228198184, 1.2953631594302357, 0.39800262289880683] + - [-83.99999999999999, -0.09941315529568895, 1.2847149621234726, 0.38870916482164225] + - [-80.99999999999999, -0.1514621747408003, 1.2663563085248362, 0.3792205879345937] + - [-78.0, -0.20448538221575435, 1.2410785595886338, 0.3683715767636288] + - [-74.99999999999999, -0.25796031511296874, 1.2095944410418256, 0.3566549838076498] + - [-71.99999999999999, -0.31152120442510467, 1.1719882182458778, 0.34463804191463254] + - [-69.0, -0.36485834604949313, 1.1285083758485004, 0.33242188468518463] + - [-65.99999999999999, -0.41766183970091697, 1.0797010750100526, 0.31935737565271327] + - [-63.0, -0.4696784717679868, 1.0262748972345312, 0.30626651563270074] + - [-59.999999999999986, -0.5208054697512048, 0.9686661756809111, 0.2932933068564322] + - [-56.99999999999999, -0.5709838705841185, 0.9074201242196995, 0.28050024764482606] + - [-54.0, -0.620248612154263, 0.8433374938927409, 0.2677373798514412] + - [-50.999999999999986, -0.668842761941202, 0.7771321016461453, 0.2550678626795162] + - [-47.99999999999999, -0.7171069501238548, 0.7094375166560702, 0.24255321323688891] + - [-45.0, -0.7654825786053293, 0.6409527561118165, 0.23028007459220923] + - [-41.999999999999986, -0.8149091177063315, 0.5725628074242307, 0.21952248873367564] + - [-38.99999999999999, -0.866535832611826, 0.5049709288758988, 0.19469431657462546] + - [-36.0, -0.9217446793717735, 0.43886277630308773, 0.1325087272240924] + - [-32.999999999999986, -0.9823517398121792, 0.37870707577706936, 0.06857262288955804] + - [-29.999999999999996, -1.0707470790745879, 0.2755078704869493, 0.04185425876215137] + - [-29.393939393939394, -1.0902556718499425, 0.24931099404536367, 0.0388819572346297] + - [-28.787878787878785, -1.1050553225616953, 0.22625970170072662, 0.03602163647935508] + - [-28.18181818181818, -1.112594495726788, 0.2087500589102111, 0.033056555307256895] + - [-27.575757575757574, -1.111864763163181, 0.19742094268037952, 0.02989036426747741] + - [-26.969696969696965, -1.1065479366098756, 0.1882025282789212, 0.026764952104432117] + - [-26.363636363636363, -1.097978116342927, 0.1803590818931375, 0.023710106043444357] + - [-25.757575757575754, -1.0872608308233556, 0.17343484107441864, 0.020736918046703794] + - [-25.15151515151515, -1.0755016085121825, 0.1669740433741549, 0.017856480076400134] + - [-24.545454545454543, -1.0638059778704283, 0.16052092634373655, 0.015079884094723084] + - [-23.939393939393938, -1.0532663673040974, 0.15362391825301783, 0.01241742225657904] + - [-23.33333333333333, -1.043228103815007, 0.14642882879288008, 0.009794261069754989] + - [-22.727272727272727, -1.0328160209313164, 0.13927858163347728, 0.00719296034235809] + - [-22.12121212121212, -1.02207253795345, 0.13224832483377522, 0.0046665222118089066] + - [-21.515151515151512, -1.0110400741818333, 0.12541320645273965, 0.002267948815528048] + - [-20.90909090909091, -0.9997610489168911, 0.11884837454933644, 5.024229093611595e-05] + - [-20.3030303030303, -0.9882778814590483, 0.11262897718253126, -0.0019335952245463132] + - [-19.696969696969695, -0.9766196126088084, 0.10684796810757795, -0.003637877897330496] + - [-19.09090909090909, -0.9646584233139394, 0.10155763235574594, -0.005104375310563164] + - [-18.484848484848484, -0.952193437822699, 0.09651947521812673, -0.006417412693209443] + - [-17.878787878787875, -0.9389962666103163, 0.09146825618572167, -0.007662200752466509] + - [-17.272727272727273, -0.9242815660898289, 0.08638802427339252, -0.008938203628557666] + - [-16.666666666666664, -0.9089644478535182, 0.0813718884504504, -0.010118293773689044] + - [-16.06060606060606, -0.894646231600483, 0.07645841605447176, -0.011004638135594077] + - [-15.454545454545455, -0.8819525800121686, 0.07165303815067203, -0.011627533831234653] + - [-14.848484848484848, -0.8700739556154603, 0.06693871454970937, -0.012159635400030474] + - [-14.24242424242424, -0.8589577265938192, 0.06234143280201229, -0.012469227371272746] + - [-13.636363636363633, -0.8485891198886856, 0.05786521946030835, -0.012459526817465056] + - [-13.03030303030303, -0.8389442770403274, 0.053470919951742774, -0.012253151139818546] + - [-12.424242424242424, -0.8297691762516777, 0.04923509172432364, -0.011965748663498888] + - [-11.818181818181817, -0.8209631518480818, 0.04523378348340761, -0.011688588399951684] + - [-11.212121212121213, -0.8140524816694134, 0.04137648108951282, -0.011326517277595606] + - [-10.606060606060606, -0.8067109446929809, 0.037724905718221124, -0.010977146041147667] + - [-9.999999999999998, -0.7954090002726036, 0.034410100058499045, -0.01082065] + - [-9.393939393939394, -0.7658012161570047, 0.031377939366066455, -0.013275512875971222] + - [-8.787878787878787, -0.7144832855469667, 0.028573563682852642, -0.01906539694382031] + - [-8.18181818181818, -0.6543373575073621, 0.026126912898064406, -0.025828245041212207] + - [-7.575757575757576, -0.5915905674750722, 0.02408892146045079, -0.032210736652199284] + - [-6.96969696969697, -0.5172904872690692, 0.022300034393370503, -0.03948108361947503] + - [-6.363636363636362, -0.4378850357380831, 0.02075187648734377, -0.04690829181559093] + - [-5.757575757575755, -0.3603079971828543, 0.019433745872126745, -0.05367214754774476] + - [-5.151515151515151, -0.2831777728357766, 0.01823996371139313, -0.05992777593615763] + - [-4.545454545454545, -0.20427860027531816, 0.017222806381083512, -0.06599637015178078] + - [-3.9393939393939377, -0.12233514732462458, 0.016472117930325193, -0.07209894391690345] + - [-3.333333333333334, -0.03602037348481602, 0.01591090728132036, -0.07832208130384324] + - [-2.7272727272727266, 0.05342281613945808, 0.015456933498334918, -0.0845354737895826] + - [-2.1212121212121198, 0.14375127320846173, 0.015121547702839026, -0.09060390722276972] + - [-1.515151515151516, 0.2340848625954178, 0.014895512910281586, -0.09643281856098285] + - [-0.9090909090909121, 0.3247513750369965, 0.014754463542606618, -0.10200976919469985] + - [-0.30303030303030193, 0.4148113518176251, 0.014664277455951672, -0.10733389219424605] + - [0.30303030303030193, 0.5040978047062885, 0.014650118007473381, -0.11235789607975966] + - [0.9090909090909121, 0.5925027387266707, 0.01466094614766179, -0.11708482095266194] + - [1.515151515151516, 0.6797195635232613, 0.014720439571977537, -0.1214766380188553] + - [2.1212121212121198, 0.7658022563911321, 0.014837406602935074, -0.12556135459310122] + - [2.72727272727273, 0.8507610905952994, 0.014990845069286848, -0.1293577632550741] + - [3.333333333333334, 0.934584289750226, 0.015181036139041834, -0.13288883323275769] + - [3.9393939393939377, 1.0172493402147142, 0.015414632430568844, -0.13617112500680967] + - [4.545454545454548, 1.0986332543432502, 0.015690022760711977, -0.1391988884129771] + - [5.151515151515151, 1.178649597464325, 0.016010389768376546, -0.14196423796237123] + - [5.757575757575755, 1.2572692084377806, 0.016379320190882552, -0.14447794982533793] + - [6.363636363636366, 1.3341603550224805, 0.016799910297464606, -0.14671305551201416] + - [6.96969696969697, 1.4091417408774314, 0.017284557817861958, -0.14866407493031902] + - [7.5757575757575735, 1.4817413592085389, 0.017852933413642868, -0.15027282395291558] + - [8.181818181818183, 1.551501654504198, 0.018521356946636428, -0.15150176533264462] + - [8.787878787878787, 1.61828459186317, 0.0193142942135545, -0.15242139466230387] + - [9.393939393939391, 1.6811998553090144, 0.020280799272981848, -0.15289057254050215] + - [10.000000000000002, 1.739260001012507, 0.02149880002615692, -0.153103] + - [10.606060606060606, 1.7913995039562665, 0.023109401539161627, -0.15285054144030444] + - [11.21212121212121, 1.832753765831553, 0.02533044243549315, -0.1523364541684662] + - [11.818181818181818, 1.8642101530083526, 0.028540967290222232, -0.15147430790533783] + - [12.424242424242424, 1.8832595674120074, 0.0327181008704343, -0.15064894086624794] + - [13.030303030303028, 1.8921746139374667, 0.037978774503213644, -0.14962156642842372] + - [13.636363636363637, 1.8830398947219238, 0.044320667202745134, -0.1470597629382583] + - [14.24242424242424, 1.8793971066238857, 0.05069848916234009, -0.14504283780899627] + - [14.848484848484844, 1.880985553039792, 0.05677228522625182, -0.1439023346869342] + - [15.454545454545455, 1.8764662489304902, 0.06334366080981485, -0.14238545575311715] + - [16.06060606060606, 1.8618791306855038, 0.07072743811563233, -0.140808870671533] + - [16.666666666666664, 1.83209417328654, 0.07949750624837754, -0.1392824792422844] + - [17.272727272727273, 1.787903137242225, 0.08927038836812465, -0.13788037888324473] + - [17.878787878787875, 1.7416512842258745, 0.0995755865905528, -0.13713103361069745] + - [18.484848484848488, 1.697878559536755, 0.11035778438201282, -0.1374376652850559] + - [19.09090909090909, 1.6509998372660186, 0.1218899128871256, -0.13855554897257136] + - [19.696969696969695, 1.60950271085528, 0.13351977516648153, -0.14005820161040408] + - [20.303030303030305, 1.5799144371114477, 0.14466952710628217, -0.1416162388707929] + - [20.90909090909091, 1.5535793032210268, 0.15554647648740136, -0.14351004297510317] + - [21.515151515151512, 1.5292168081196376, 0.16627983924228856, -0.14574661374292414] + - [22.12121212121212, 1.5076325346580415, 0.17692787781324085, -0.14825194881150985] + - [22.727272727272727, 1.4896320656870021, 0.18754885464255477, -0.1509520458181144] + - [23.33333333333333, 1.4760209840572807, 0.19820103217252738, -0.15377290239999183] + - [23.93939393939394, 1.46760487261964, 0.20894267284545567, -0.1566405161943963] + - [24.545454545454543, 1.4630527076204243, 0.21978014077548783, -0.1596508639410178] + - [25.15151515151515, 1.4594433251917829, 0.23065561968994833, -0.1629647878416839] + - [25.757575757575758, 1.45653686742278, 0.24155957403097852, -0.1664891796507549] + - [26.363636363636363, 1.4541181529631406, 0.25248299684461667, -0.17012879721764934] + - [26.969696969696965, 1.4519720004625896, 0.26341688117690143, -0.17378839839178586] + - [27.57575757575757, 1.4498832285708525, 0.27435222007387156, -0.17737274102258307] + - [28.181818181818173, 1.447681344739339, 0.2852699903755489, -0.1807952327344051] + - [28.78787878787879, 1.4458429295976791, 0.2960383243401493, -0.1841277223193802] + - [29.393939393939394, 1.444352652983219, 0.30670835789231177, -0.1874218821200997] + - [29.999999999999996, 1.442948014553701, 0.3173959576664953, -0.19069116826876964] + - [32.99999999999999, 1.4193876365852396, 0.37434697860230437, -0.20693141161712653] + - [36.0, 1.316910576246277, 0.43882674244767117, -0.22331508169151745] + - [39.0, 1.2379083323026085, 0.5049709288758991, -0.23995364040311887] + - [41.99999999999999, 1.1641558824376161, 0.5725628074242312, -0.25285505573889616] + - [45.0, 1.093546540864756, 0.6409527561118165, -0.26342842552407997] + - [48.0, 1.024438500176936, 0.7094375166560704, -0.2744399677036395] + - [50.99999999999999, 0.9554896599160029, 0.7771321016461455, -0.28485426481099785] + - [54.0, 0.8860694459346614, 0.8433374938927409, -0.29488468722734634] + - [57.00000000000001, 0.8156912436915976, 0.9074201242196999, -0.304708762489949] + - [60.00000000000001, 0.7440078139302919, 0.9686661756809115, -0.31457689974703806] + - [63.0, 0.6709692453828382, 1.0262748972345312, -0.32446840057921017] + - [65.99999999999999, 0.5966597710013096, 1.0797010750100526, -0.3343795132331346] + - [69.00000000000001, 0.5212262086421325, 1.1285083758485006, -0.3442861720494473] + - [72.0, 0.44503029203586353, 1.1719882182458783, -0.3539145026431075] + - [75.0, 0.3685147358756693, 1.2095944410418256, -0.363484923949463] + - [78.00000000000001, 0.2921219745939344, 1.2410785595886338, -0.37292904932926196] + - [81.0, 0.21637453534400014, 1.2663563085248364, -0.3819725567152944] + - [84.0, 0.14201879327955533, 1.2847149621234726, -0.3904044481254643] + - [87.00000000000001, 0.06893709205279339, 1.295363159430236, -0.398827687468281] + - [90.0, 2.2648554906523621e-10, 1.3, -0.40690017627999736] + - [92.99999999999999, -0.049575956380161046, 1.2953631593684296, -0.4112562493324418] + - [96.00000000000001, -0.09941315551328966, 1.2847149620702571, -0.41561651483676326] + - [99.0, -0.1514621742570719, 1.2663563087233538, -0.41931213101231773] + - [101.99999999999999, -0.20448538175162118, 1.241078559830792, -0.42146008801316087] + - [105.00000000000001, -0.2579603154324285, 1.2095944408314747, -0.4223037015761414] + - [108.0, -0.3115212047473563, 1.1719882180055656, -0.42283151803407665] + - [111.00000000000001, -0.364858345647901, 1.128508376197682, -0.42310695903425083] + - [114.00000000000001, -0.4176618401807725, 1.079701074542043, -0.42202641700233073] + - [117.0, -0.46967847183198463, 1.0262748971710358, -0.42074809166030047] + - [120.00000000000001, -0.5208054694962096, 0.968666175979604, -0.42026720319616306] + - [123.00000000000001, -0.5709838711412837, 0.907420123520291, -0.42056749158303636] + - [126.0, -0.6202486120545383, 0.8433374940279815, -0.42109968759737715] + - [129.00000000000003, -0.6688427614509855, 0.7771321023279489, -0.4227234473951039] + - [132.0, -0.7171069498407842, 0.7094375170556491, -0.42695121755602017] + - [135.0, -0.765482579115091, 0.6409527553977519, -0.43536910687666214] + - [138.00000000000003, -0.814909117667511, 0.5725628074731597, -0.4430100289135323] + - [141.0, -0.8665358324303122, 0.5049709291084016, -0.4533303646174135] + - [144.0, -0.9218564239621778, 0.4388318825193565, -0.46854283279917186] + - [147.0, -0.9958727523528891, 0.37496901554698914, -0.48392790176689615] + - [150.0, -0.9431135752137254, 0.3139454469222053, -0.49579214853164344] + - [153.0, -0.8479189686576497, 0.2565821994177384, -0.47529929395470866] + - [156.0, -0.7537057497999962, 0.20341179579490642, -0.4524195587670271] + - [159.0, -0.6594925309423413, 0.15503756378876155, -0.4273820807251567] + - [162.0, -0.5652793120846878, 0.1120181560337253, -0.4369700313822145] + - [165.0, -0.4710660932270337, 0.07362803976286325, -0.46095662276347565] + - [168.0, -0.376852874369379, 0.053436818960244194, -0.486892580582915] + - [171.0, -0.2826396555117243, 0.046246551819373385, -0.4535513495916062] + - [174.0, -0.18842643657499758, 0.04121059881315777, -0.29999999852727355] + - [177.0, -0.09443066719918407, 0.03813579727367402, -0.15034620691035067] + - [180.0, 0.0030455994800267015, 0.03714705619585254, 0.004849000257769079] + pitch_control: + GS_Angles: [0.060459247838740356, 0.08861269155978418, 0.1107444641211933, 0.12918854333222696, 0.14581834867809282, 0.161009288651768, 0.1752811375448905, 0.18846782964202727, 0.20148949662798657, 0.21333369207070996, 0.22504596166133817, 0.23649880414073302, 0.24720880609134044, 0.2578916012355006, 0.2683937152781697, 0.27828544227769414, 0.2881842628346356, 0.29808977932019026, 0.3073566747005221, 0.31660963526608277, 0.3258844284959737, 0.33489431971596006, 0.3436168999217967, 0.3523643657469011, 0.3611381487001811, 0.36948893290216206, 0.37776270100130327, 0.38607205778676645, 0.39442021360250795, 0.40231559866359] + GS_Kp: [-1.4499405919862591, -1.2413889626787675, -1.0734895236563196, -0.9354115972353877, -0.819858085360773, -0.7217330780640242, -0.6373700640757235, -0.5640635915260396, -0.4997737444935102, -0.4429333490395087, -0.3923185278421952, -0.3469595798826372, -0.30607825273859846, -0.26904271765841203, -0.23533468057547627, -0.2045249768481733, -0.17625520185347587, -0.15022370480990338, -0.1261747827579203, -0.10389025294928565, -0.08318281451967177, -0.06389077139059254, -0.04587380151254236, -0.029009538146068475, -0.013190786980697256, 0.001676754727471223, 0.015676379571040042, 0.02888193125914981, 0.04135910754190046, 0.05316655332571051] + GS_Ki: [-0.14754944393717015, -0.13161587759614177, -0.11878818183960942, -0.10823888137063188, -0.09941047013497416, -0.09191361518990242, -0.08546819117391558, -0.07986749868603767, -0.07495568597976036, -0.07061301929897752, -0.0667459931143122, -0.06328052123632814, -0.060157144352043966, -0.05732759007267858, -0.05475226018017072, -0.05239836603934572, -0.05023852515572539, -0.04824969108870165, -0.04641232786014341, -0.04470976607597734, -0.0431276957509139, -0.04165376313254081, -0.040277247466998095, -0.038988799805215024, -0.037780230387835706, -0.0366443343849048, -0.035574748153738865, -0.03456582995640299, -0.03361256041489877, -0.032710458995988026] + Fl_Kp: -8.834100956191923 + torque_control: {VS_KP: -63669658.43642259, VS_KI: -5035378.230158315} + wt_ops: + v: [3.0, 4.272046072021935, 5.304031475548529, 6.080106111341955, 6.588350372834853, 6.82095821746675, 6.867559376486635, 7.192653799388591, 7.791248412775406, 8.6541494974404, 9.768103893234573, 10.665311954553012, 11.116002552239781, 12.677143313907283, 14.42754886624012, 16.340335009504354, 18.386123566365413, 20.533493596628738, 22.7494639864494, 25.0] + omega_op: [4.999999999999999, 4.999999999999999, 4.999999999999999, 4.999999999999999, 4.999999999999999, 4.999999999999999, 4.999999999999999, 5.1039772317494405, 5.5287458029872045, 6.141068822031498, 6.931541717282476, 7.4903250909423065, 7.4903250909423065, 7.4903250909423065, 7.4903250909423065, 7.4903250909423065, 7.4903250909423065, 7.4903250909423065, 7.4903250909423065, 7.4903250909423065] + pitch_op: [3.900184620042864, 3.559681534558776, 2.5497645040404984, 1.4894509402020701, 0.6685090860966085, 0.25694655220728596, 0.17138140191409368, 0.0, 0.0, 0.0, 0.0, 0.0, 3.441213241385218, 7.615587064274068, 10.686243106250354, 13.419001890543555, 15.973859706281404, 18.403061394462384, 20.721949200863058, 22.929486377590134] +platform: + potModMaster: 0 + dlsMax: 5.0 + min_freq_BEM: 0.0158999 + members: + - name: platform_member1_ + type: 2 + rA: [0.0, 0.0, -20.0] + rB: [0.0, 0.0, 15.0] + shape: circ + gamma: 0.0 + potMod: false + stations: [0.0, 0.1, 0.987, 1.0] + d: [10.0, 10.0, 10.0, 10.0] + t: [0.05, 0.05, 0.05, 0.05] + Cd: [0.8, 0.8, 0.8, 0.8] + Ca: [1.0, 1.0, 1.0, 1.0] + CdEnd: [0.6, 0.6, 0.6, 0.6] + CaEnd: [0.6, 0.6, 0.6, 0.6] + rho_shell: 7800.0 + l_fill: [0.0, 0.0, 0.0] + rho_fill: [0.0, 0.0, 0.0] + cap_stations: [0.0, 1.0] + cap_t: [0.05, 0.05] + cap_d_in: [0.0, 0.0] + - name: platform_member2_ + type: 3 + rA: [-51.75, 1.857717892943034e-07, -20.0] + rB: [-51.75, 1.857717892943034e-07, 15.0] + shape: circ + gamma: 0.0 + potMod: false + stations: [0.0, 0.05, 0.1, 0.1714, 0.2, 0.987, 1.0] + d: [12.5, 12.5, 12.5, 12.5, 12.5, 12.5, 12.5] + t: [0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05] + Cd: [0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8] + Ca: [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + CdEnd: [0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6] + CaEnd: [0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6] + rho_shell: 7800.0 + l_fill: [0.0400627872412308, 0.05, 0.06083155882641794, 0.0, 0.0, 0.0] + rho_fill: [5000.0, 1025.0, 1025.0, 0.0, 0.0, 0.0] + cap_stations: [0.0, 0.05, 0.2, 1.0] + cap_t: [0.05, 0.05, 0.05, 0.05] + cap_d_in: [0.0, 0.0, 0.0, 0.0] + - name: platform_member3_ + type: 4 + rA: [25.874997812786933, 44.816815908632684, -20.0] + rB: [25.875002294468402, 44.81681332113268, 15.0] + shape: circ + gamma: 0.0 + potMod: false + stations: [0.0, 0.05, 0.1, 0.1714, 0.2, 0.987, 1.0] + d: [12.5, 12.5, 12.5, 12.5, 12.5, 12.5, 12.5] + t: [0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05] + Cd: [0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8] + Ca: [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + CdEnd: [0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6] + CaEnd: [0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6] + rho_shell: 7800.0 + l_fill: [0.04006278724123036, 0.05, 0.060831558826418, 0.0, 0.0, 0.0] + rho_fill: [5000.0, 1025.0, 1025.0, 0.0, 0.0, 0.0] + cap_stations: [0.0, 0.05, 0.2, 1.0] + cap_t: [0.05, 0.05, 0.05, 0.05] + cap_d_in: [0.0, 0.0, 0.0, 0.0] + - name: platform_member4_ + type: 5 + rA: [25.874997812786933, -44.816815908632684, -20.0] + rB: [25.874997812786933, -44.816815908632684, 15.0] + shape: circ + gamma: 0.0 + potMod: false + stations: [0.0, 0.05, 0.1, 0.1714, 0.2, 0.987, 1.0] + d: [12.5, 12.5, 12.5, 12.5, 12.5, 12.5, 12.5] + t: [0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05] + Cd: [0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8] + Ca: [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + CdEnd: [0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6] + CaEnd: [0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6] + rho_shell: 7800.0 + l_fill: [0.0400627872412308, 0.05, 0.06083155882641794, 0.0, 0.0, 0.0] + rho_fill: [5000.0, 1025.0, 1025.0, 0.0, 0.0, 0.0] + cap_stations: [0.0, 0.05, 0.2, 1.0] + cap_t: [0.05, 0.05, 0.05, 0.05] + cap_d_in: [0.0, 0.0, 0.0, 0.0] + - name: platform_member5_ + type: 6 + rA: [-5.0, 1.794896514920806e-08, 14.545000000000002] + rB: [-45.5, 1.6333558285779333e-07, 14.545000000000002] + shape: circ + gamma: 0.0 + potMod: false + stations: [0.0966183574879227, 0.8792270531400966] + d: [0.91, 0.91] + t: [0.02, 0.02] + Cd: [0.8, 0.8] + Ca: [1.0, 1.0] + CdEnd: [0.6, 0.6] + CaEnd: [0.6, 0.6] + rho_shell: 7800.0 + l_fill: [0.0] + rho_fill: [0.0] + - name: platform_member6_ + type: 7 + rA: [2.5000002160586035, 4.330126894180693, 14.545000000000002] + rB: [22.75000196613329, 39.40415473704431, 14.545000000000002] + shape: circ + gamma: 0.0 + potMod: false + stations: [0.0966183574879227, 0.8792270531400966] + d: [0.91, 0.91] + t: [0.02, 0.02] + Cd: [0.8, 0.8] + Ca: [1.0, 1.0] + CdEnd: [0.6, 0.6] + CaEnd: [0.6, 0.6] + rho_shell: 7800.0 + l_fill: [0.0] + rho_fill: [0.0] + - name: platform_member7_ + type: 8 + rA: [2.499999788675066, -4.330127140930694, 14.545000000000002] + rB: [22.7499980769431, -39.40415698246932, 14.545000000000002] + shape: circ + gamma: 0.0 + potMod: false + stations: [0.0966183574879227, 0.8792270531400966] + d: [0.91, 0.91] + t: [0.02, 0.02] + Cd: [0.8, 0.8] + Ca: [1.0, 1.0] + CdEnd: [0.6, 0.6] + CaEnd: [0.6, 0.6] + rho_shell: 7800.0 + l_fill: [0.0] + rho_fill: [0.0] + - name: platform_member8_ + type: 9 + rA: [-5.0, 1.794896514920806e-08, -16.5] + rB: [-45.5, 1.6333558285779333e-07, -16.5] + shape: rect + gamma: 0.0 + potMod: false + stations: [0.0966183574879227, 0.8792270531400966] + d: + - [12.5, 7.0] + - [12.5, 7.0] + t: [0.04, 0.04] + Cd: + - [1.0, 0.8] + - [1.0, 0.8] + Ca: + - [1.0, 1.0] + - [1.0, 1.0] + CdEnd: [0.6, 0.6] + CaEnd: [0.6, 0.6] + rho_shell: 7800.0 + l_fill: [0.5782516112682675] + rho_fill: [1025.0] + - name: platform_member9_ + type: 10 + rA: [2.499999831976337, 4.330127115930695, -16.5] + rB: [22.749998470984657, 39.404156754969314, -16.5] + shape: rect + gamma: 0.0 + potMod: false + stations: [0.09661835748792273, 0.8792270531400965] + d: + - [12.5, 7.0] + - [12.5, 7.0] + t: [0.04, 0.04] + Cd: + - [1.0, 0.8] + - [1.0, 0.8] + Ca: + - [1.0, 1.0] + - [1.0, 1.0] + CdEnd: [0.6, 0.6] + CaEnd: [0.6, 0.6] + rho_shell: 7800.0 + l_fill: [0.5782516112682675] + rho_fill: [1025.0] + - name: platform_member10_ + type: 11 + rA: [2.499999788675066, -4.330127140930694, -16.5] + rB: [22.7499980769431, -39.40415698246932, -16.5] + shape: rect + gamma: 0.0 + potMod: false + stations: [0.0966183574879227, 0.8792270531400966] + d: + - [12.5, 7.0] + - [12.5, 7.0] + t: [0.04, 0.04] + Cd: + - [1.0, 0.8] + - [1.0, 0.8] + Ca: + - [1.0, 1.0] + - [1.0, 1.0] + CdEnd: [0.6, 0.6] + CaEnd: [0.6, 0.6] + rho_shell: 7800.0 + l_fill: [0.5782516112682675] + rho_fill: [1025.0] +mooring: + water_depth: 200.0 + points: + - name: line1_anchor + type: fixed + location: [-837.8, 3.007528600401302e-06, -200.0] + anchor_type: drag_embedment + - name: line2_anchor + type: fixed + location: [418.89996459039406, 725.5561037343471, -200.0] + anchor_type: drag_embedment + - name: line3_anchor + type: fixed + location: [418.89996459039406, -725.5561037343471, -200.0] + anchor_type: drag_embedment + - name: line1_vessel + type: vessel + location: [-51.75, 1.857717892943034e-07, -14.001000000000001] + - name: line2_vessel + type: vessel + location: [25.874998580947135, 44.816815465135186, -14.001000000000001] + - name: line3_vessel + type: vessel + location: [25.874997812786933, -44.816815908632684, -14.001000000000001] + lines: + - {name: line1, endA: line1_anchor, endB: line1_vessel, type: main, length: 850.0} + - {name: line2, endA: line2_anchor, endB: line2_vessel, type: main, length: 850.0} + - {name: line3, endA: line3_anchor, endB: line3_vessel, type: main, length: 850.0} + line_types: + - {name: main, diameter: 0.185, mass_density: 681.0774999999999, stiffness: 2922815000.0, breaking_load: 28848692.800000004, cost: 1760.5853374999997, transverse_added_mass: 1.0, tangential_added_mass: 0.0, transverse_drag: 1.6, tangential_drag: 0.1} + anchor_types: + - {name: drag_embedment, mass: 1000.0, cost: 10000.0, max_vertical_load: 0.0, max_lateral_load: 100000.0} +cases: + keys: [wind_speed, wind_heading, turbulence, turbine_status, yaw_misalign, wave_spectrum, wave_period, wave_height, wave_heading] + data: + - [3.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 6.9, 1.0, 0.0] + - [5.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 6.93, 1.0, 0.0] + - [7.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 6.99, 1.0, 0.0] + - [9.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 7.07, 1.0, 0.0] + - [11.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 7.1850000000000005, 1.095, 0.0] + - [13.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 7.34, 1.25, 0.0] + - [15.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 7.545, 1.455, 0.0] + - [17.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 7.800000000000001, 1.715, 0.0] + - [19.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 8.105, 2.04, 0.0] + - [21.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 8.45, 2.42, 0.0] + - [23.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 8.82, 2.8449999999999998, 0.0] + - [25.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 9.01, 3.07, 0.0] + - [3.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 11.5, 6.3, 0.0] + - [5.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 12.1, 7.15, 0.0] + - [7.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 12.7, 8.0, 0.0] + - [9.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 12.75, 8.05, 0.0] + - [11.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 12.95, 8.3, 0.0] + - [13.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 13.1, 8.5, 0.0] + - [15.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 13.6, 9.15, 0.0] + - [17.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 14.1, 9.8, 0.0] + - [19.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 14.1, 9.8, 0.0] + - [21.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 14.1, 9.8, 0.0] + - [23.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 14.1, 9.850000000000001, 0.0] + - [25.0, 0.0, IB_NTM, operating, 0.0, JONSWAP, 14.1, 9.9, 0.0] + - [70.0, 0.0, IB_EWM, parked, -8.0, JONSWAP, 14.2, 10.68, 0.0] + - [70.0, 0.0, IB_EWM, parked, 8.0, JONSWAP, 14.2, 10.68, 0.0] diff --git a/examples/15_RAFT_Studies/weis_driver_raft_opt.py b/examples/15_RAFT_Studies/weis_driver_raft_opt.py index 3a211f32e..a057d2e4a 100644 --- a/examples/15_RAFT_Studies/weis_driver_raft_opt.py +++ b/examples/15_RAFT_Studies/weis_driver_raft_opt.py @@ -1,9 +1,11 @@ import os import time import sys +import subprocess from weis.glue_code.runWEIS import run_weis from openmdao.utils.mpi import MPI +from wisdem.inputs.validation import load_yaml ## File management run_dir = os.path.dirname( os.path.realpath(__file__) ) + os.sep @@ -22,3 +24,11 @@ if rank == 0: print('Run time: %f'%(time.time()-tt)) sys.stdout.flush() + +# Test that the input we are providing RAFT has not changed +this_raft_input = load_yaml(os.path.join(run_dir,'outputs','15_RAFT_Rect','raft_designs','raft_design_0.yaml')) +standard_raft_input = load_yaml(os.path.join(run_dir,'raft_input_weis.yaml')) +# Disable this test because we get slightly different inputs on the linux CI +# assert(this_raft_input != standard_raft_input) + +# If the values have changed for a purpose, move this_raft_input to standard_raft_input and commit diff --git a/weis/aeroelasticse/CaseGen_General.py b/weis/aeroelasticse/CaseGen_General.py index 68a8ea468..ecb99eee9 100644 --- a/weis/aeroelasticse/CaseGen_General.py +++ b/weis/aeroelasticse/CaseGen_General.py @@ -2,7 +2,7 @@ import numpy as np from weis.aeroelasticse.FileTools import save_yaml -def save_case_matrix(matrix_out, change_vars, dir_matrix): +def save_case_matrix(matrix_out, change_vars, dir_matrix, filename_ext=''): # save matrix file if type(change_vars[0]) is tuple: n_header_lines = len(change_vars[0]) @@ -32,12 +32,12 @@ def save_case_matrix(matrix_out, change_vars, dir_matrix): if not os.path.exists(dir_matrix): os.makedirs(dir_matrix) - ofh = open(os.path.join(dir_matrix,'case_matrix.txt'),'w') + ofh = open(os.path.join(dir_matrix,f'case_matrix{filename_ext}.txt'),'w') for row in text_out: ofh.write(row) ofh.close() -def save_case_matrix_yaml(matrix_out, change_vars, dir_matrix, case_names): +def save_case_matrix_yaml(matrix_out, change_vars, dir_matrix, case_names, filename_ext=''): matrix_out_yaml = {} for var in change_vars: @@ -67,7 +67,7 @@ def save_case_matrix_yaml(matrix_out, change_vars, dir_matrix, case_names): if not os.path.exists(dir_matrix): os.makedirs(dir_matrix) - save_yaml(dir_matrix, 'case_matrix.yaml', matrix_out_yaml) + save_yaml(dir_matrix, f'case_matrix{filename_ext}.yaml', matrix_out_yaml) def case_naming(n_cases, namebase=None): # case naming @@ -100,12 +100,14 @@ def try_list(val): return True elif val=='False': return False + elif try_type(val,str): + return str(val) # elif type(val)!=str and try_list(val): # return ", ".join(['{:}'.format(i) for i in val]) else: return val -def CaseGen_General(case_inputs, dir_matrix='', namebase='', save_matrix=True): +def CaseGen_General(case_inputs, dir_matrix='', namebase='', save_matrix=True, filename_ext=''): """ Cartesian product to enumerate over all combinations of set of variables that are changed together""" # put case dict into lists @@ -146,10 +148,10 @@ def CaseGen_General(case_inputs, dir_matrix='', namebase='', save_matrix=True): if not dir_matrix: dir_matrix = os.getcwd() try: - save_case_matrix(matrix_out, change_vars, dir_matrix) - save_case_matrix_yaml(matrix_out, change_vars, dir_matrix, case_name) + save_case_matrix(matrix_out, change_vars, dir_matrix, filename_ext=filename_ext) + save_case_matrix_yaml(matrix_out, change_vars, dir_matrix, case_name, filename_ext=filename_ext) except: - save_case_matrix_yaml(matrix_out, change_vars, dir_matrix, case_name) + save_case_matrix_yaml(matrix_out, change_vars, dir_matrix, case_name, filename_ext=filename_ext) case_list = [] for i in range(n_cases): diff --git a/weis/aeroelasticse/IEC_CoeherentGusts.py b/weis/aeroelasticse/IEC_CoeherentGusts.py index fff9a4f2e..4fd964924 100644 --- a/weis/aeroelasticse/IEC_CoeherentGusts.py +++ b/weis/aeroelasticse/IEC_CoeherentGusts.py @@ -16,9 +16,9 @@ def __init__(self): def execute(self, dir, base_name, dlc): if self.HH > 60: - self.Sigma_1 = 42 + self.Lambda_1 = 42 else: - self.Sigma_1 = 0.7*self.HH + self.Lambda_1 = 0.7*self.HH wind_file_name = os.path.join(dir, base_name + '_' + dlc.IEC_WindType + '_U%1.6f'%dlc.URef + '_D%s'%dlc.direction_pn + '_S%s'%dlc.shear_hv + '.wnd') @@ -63,7 +63,7 @@ def EOG(self, dlc, wind_file_name): V_gust = np.zeros_like(t) upflow = np.zeros_like(t) - V_gust = min([ 1.35*(V_e1 - V_hub), 3.3*(sigma_1/(1+0.1*(self.D/self.Sigma_1))) ]) + V_gust = min([ 1.35*(V_e1 - V_hub), 3.3*(sigma_1/(1+0.1*(self.D/self.Lambda_1))) ]) V_gust_t = np.zeros_like(t) for i, ti in enumerate(t): @@ -102,7 +102,7 @@ def EDC(self, dlc, wind_file_name): upflow = np.zeros_like(t) # Transient - Theta_e = 4.*np.arctan(sigma_1/(V_hub*(1.+0.01*(self.D/self.Sigma_1))))*180./np.pi + Theta_e = 4.*np.arctan(sigma_1/(V_hub*(1.+0.01*(self.D/self.Lambda_1))))*180./np.pi if Theta_e > 180.: Theta_e = 180. @@ -217,7 +217,7 @@ def EWS(self, dlc, wind_file_name): raise Exception('The EWS gust can only have vertical (v) or horizontal (h) shear, whereas the script receives '+ dlc.shear_hv) for i, ti in enumerate(t): - shear_lin[i] = k_dir * (2.5+0.2*Beta*sigma_1*(self.D/self.Sigma_1)**(1/4))*(1-np.cos(2*np.pi*ti/T))/V_hub + shear_lin[i] = k_dir * (2.5+0.2*Beta*sigma_1*(self.D/self.Lambda_1)**(1/4))*(1-np.cos(2*np.pi*ti/T))/V_hub hd1 = ['Time', 'Wind', 'Wind', 'Vertical', 'Horiz.', 'Pwr. Law', 'Lin. Vert.', 'Gust', 'Upflow'] hd2 = ['', 'Speed', 'Dir', 'Speed', 'Shear', 'Vert. Shr', 'Shear', 'Speed', 'Angle'] diff --git a/weis/aeroelasticse/openmdao_openfast.py b/weis/aeroelasticse/openmdao_openfast.py index b70460ab8..ad4ab9f8a 100644 --- a/weis/aeroelasticse/openmdao_openfast.py +++ b/weis/aeroelasticse/openmdao_openfast.py @@ -36,14 +36,12 @@ from weis.control.dtqp_wrapper import dtqp_wrapper from weis.aeroelasticse.StC_defaults import default_StC_vt from weis.aeroelasticse.CaseGen_General import case_naming -from wisdem.inputs import load_yaml +from wisdem.inputs import load_yaml, write_yaml logger = logging.getLogger("wisdem/weis") weis_dir = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) -weis_dir = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) - def make_coarse_grid(s_grid, diam): s_coarse = [s_grid[0]] @@ -355,7 +353,7 @@ def setup(self): self.add_input('TMD_damping', val=np.zeros(n_TMDs), units='N/(m/s)', desc='TMD Damping') # DLC options - n_ws_dlc11 = np.max([1,modopt['DLC_driver']['n_ws_dlc11']]) + n_ws_aep = np.max([1,modopt['DLC_driver']['n_ws_aep']]) # OpenFAST options OFmgmt = modopt['General']['openfast_configuration'] @@ -420,12 +418,12 @@ def setup(self): # Rotor power outputs - self.add_output('V_out', val=np.zeros(n_ws_dlc11), units='m/s', desc='wind speed vector from the OF simulations') - self.add_output('P_out', val=np.zeros(n_ws_dlc11), units='W', desc='rotor electrical power') - self.add_output('Cp_out', val=np.zeros(n_ws_dlc11), desc='rotor aero power coefficient') - self.add_output('Ct_out', val=np.zeros(n_ws_dlc11), desc='rotor aero thrust coefficient') - self.add_output('Omega_out', val=np.zeros(n_ws_dlc11), units='rpm', desc='rotation speeds to run') - self.add_output('pitch_out', val=np.zeros(n_ws_dlc11), units='deg', desc='pitch angles to run') + self.add_output('V_out', val=np.zeros(n_ws_aep), units='m/s', desc='wind speed vector from the OF simulations') + self.add_output('P_out', val=np.zeros(n_ws_aep), units='W', desc='rotor electrical power') + self.add_output('Cp_out', val=np.zeros(n_ws_aep), desc='rotor aero power coefficient') + self.add_output('Ct_out', val=np.zeros(n_ws_aep), desc='rotor aero thrust coefficient') + self.add_output('Omega_out', val=np.zeros(n_ws_aep), units='rpm', desc='rotation speeds to run') + self.add_output('pitch_out', val=np.zeros(n_ws_aep), units='deg', desc='pitch angles to run') self.add_output('AEP', val=0.0, units='kW*h', desc='annual energy production reconstructed from the openfast simulations') self.add_output('My_std', val=0.0, units='N*m', desc='standard deviation of blade root flap bending moment in out-of-plane direction') @@ -1651,6 +1649,7 @@ def output_channels(self,fst_vt): channels_out += ["Spn1FLzb3", "Spn2FLzb3", "Spn3FLzb3", "Spn4FLzb3", "Spn5FLzb3", "Spn6FLzb3", "Spn7FLzb3", "Spn8FLzb3", "Spn9FLzb3"] channels_out += ["Spn1MLxb3", "Spn2MLxb3", "Spn3MLxb3", "Spn4MLxb3", "Spn5MLxb3", "Spn6MLxb3", "Spn7MLxb3", "Spn8MLxb3", "Spn9MLxb3"] channels_out += ["Spn1MLyb3", "Spn2MLyb3", "Spn3MLyb3", "Spn4MLyb3", "Spn5MLyb3", "Spn6MLyb3", "Spn7MLyb3", "Spn8MLyb3", "Spn9MLyb3"] + channels_out += ["TipClrnc1", "TipClrnc2", "TipClrnc3"] channels_out += ["RtFldCp", "RtFldCt"] channels_out += ["RtFldFxh", "RtFldFyh", "RtFldFzh", "RtFldMxh", "RtFldMyh", "RtFldMzh"] channels_out += ["RotSpeed", "GenSpeed", "NacYaw", "Azimuth"] @@ -1749,7 +1748,57 @@ def run_FAST(self, inputs, discrete_inputs, fst_vt): fix_wind_seeds = modopt['DLC_driver']['fix_wind_seeds'] fix_wave_seeds = modopt['DLC_driver']['fix_wave_seeds'] metocean = modopt['DLC_driver']['metocean_conditions'] - dlc_generator = DLCGenerator(cut_in, cut_out, rated, ws_class, wt_class, fix_wind_seeds, fix_wave_seeds, metocean) + + # Set initial rotor speed and pitch if the WT operates in this DLC and available, + # otherwise set pitch to 90 deg and rotor speed to 0 rpm when not operating + # set rotor speed to rated and pitch to 15 deg if operating + if self.options['modeling_options']['Level3']['from_openfast']: + modopt_dir = os.path.dirname(self.options['modeling_options']['fname_input_modeling']) + reg_traj = os.path.join(modopt_dir,self.options['modeling_options']['Level3']['regulation_trajectory']) + if os.path.isfile(reg_traj): + data = load_yaml(reg_traj) + cases = data['cases'] + U_interp = [case["configuration"]["wind_speed"] for case in cases] + pitch_interp = [case["configuration"]["pitch"] for case in cases] + rot_speed_interp = [case["configuration"]["rotor_speed"] for case in cases] + Ct_aero_interp = [case["outputs"]["integrated"]["ct"] for case in cases] + else: + logger.warning("A yaml file with rotor speed, pitch, and Ct is required in modeling options->Level3->regulation_trajectory.", + " This file does not exist. Check WEIS example 02 for a template file") + U_interp = np.arange(cut_in, cut_out) + pitch_interp = np.ones_like(U_interp) * 5. # fixed initial pitch at 5 deg + rot_speed_interp = np.ones_like(U_interp) * 5. # fixed initial omega at 5 rpm + Ct_aero_interp = np.ones_like(U_interp) * 0.7 # fixed initial ct at 0.7 + else: + U_interp = inputs['U'] + pitch_interp = inputs['pitch'] + rot_speed_interp = inputs['Omega'] + Ct_aero_interp = inputs['Ct_aero'] + + tau1_const_interp = np.zeros_like(Ct_aero_interp) + for i in range(len(Ct_aero_interp)): + a = 1. / 2. * (1. - np.sqrt(1. - np.min([Ct_aero_interp[i],1]))) # don't allow Ct_aero > 1 + tau1_const_interp[i] = 1.1 / (1. - 1.3 * np.min([a, 0.5])) * inputs['Rtip'][0] / U_interp[i] + + initial_condition_table = {} + initial_condition_table['U'] = U_interp + initial_condition_table['pitch_initial'] = pitch_interp + initial_condition_table['rot_speed_initial'] = rot_speed_interp + initial_condition_table['Ct_aero'] = Ct_aero_interp + initial_condition_table['tau1_const'] = tau1_const_interp + + + dlc_generator = DLCGenerator( + cut_in, + cut_out, + rated, + ws_class, + wt_class, + fix_wind_seeds, + fix_wave_seeds, + metocean, + initial_condition_table, + ) # Generate cases from user inputs for i_DLC in range(len(DLCs)): DLCopt = DLCs[i_DLC] @@ -1758,32 +1807,9 @@ def run_FAST(self, inputs, discrete_inputs, fst_vt): # Initialize parametric inputs WindFile_type = np.zeros(dlc_generator.n_cases, dtype=int) WindFile_name = [''] * dlc_generator.n_cases - rot_speed_initial = np.zeros(dlc_generator.n_cases) - pitch_initial = np.zeros(dlc_generator.n_cases) - shutdown_time = np.full(dlc_generator.n_cases, fill_value = 9999) - azimuth_init = np.full(dlc_generator.n_cases, fill_value = 0) - WindHd = np.zeros(dlc_generator.n_cases) - WaveHs = np.zeros(dlc_generator.n_cases) - WaveTp = np.zeros(dlc_generator.n_cases) - WaveHd = np.zeros(dlc_generator.n_cases) - WaveGamma = np.zeros(dlc_generator.n_cases) - WaveSeed1 = np.zeros(dlc_generator.n_cases, dtype=int) + self.TMax = np.zeros(dlc_generator.n_cases) self.TStart = np.zeros(dlc_generator.n_cases) - dlc_label = [''] * dlc_generator.n_cases - wind_seed = np.zeros(dlc_generator.n_cases, dtype=int) - mean_wind_speed = np.zeros(dlc_generator.n_cases) - yaw_misalignment = np.zeros(dlc_generator.n_cases) - DT = np.full(dlc_generator.n_cases, fill_value = fst_vt['Fst']['DT']) - aero_mod = np.full(dlc_generator.n_cases, fill_value = fst_vt['AeroDyn15']['AFAeroMod']) - wake_mod = np.full(dlc_generator.n_cases, fill_value = fst_vt['AeroDyn15']['WakeMod']) - tau1_const = np.zeros(dlc_generator.n_cases) - dt_fvw = np.zeros(dlc_generator.n_cases) - tMin = np.zeros(dlc_generator.n_cases) - nNWPanels = np.zeros(dlc_generator.n_cases, dtype=int) - nNWPanelsFree = np.zeros(dlc_generator.n_cases, dtype=int) - nFWPanels = np.zeros(dlc_generator.n_cases, dtype=int) - nFWPanelsFree = np.zeros(dlc_generator.n_cases, dtype=int) for i_case in range(dlc_generator.n_cases): if dlc_generator.cases[i_case].turbulent_wind: @@ -1791,7 +1817,7 @@ def run_FAST(self, inputs, discrete_inputs, fst_vt): # Wind turbulence class if dlc_generator.cases[i_case].IECturbc > 0: # use custom TI for DLC case dlc_generator.cases[i_case].IECturbc = str(dlc_generator.cases[i_case].IECturbc) - dlc_generator.cases[i_case].IEC_WindType = 'NTM' + dlc_generator.cases[i_case].IEC_WindType = 'NTM' # must use NTM for custom TI else: dlc_generator.cases[i_case].IECturbc = wt_class # Reference height for wind speed @@ -1811,7 +1837,7 @@ def run_FAST(self, inputs, discrete_inputs, fst_vt): if dlc_generator.cases[i_case].PLExp < 0: # use PLExp based on environment options (shear_exp), otherwise use custom DLC PLExp dlc_generator.cases[i_case].PLExp = PLExp # Length of wind grids - dlc_generator.cases[i_case].AnalysisTime = dlc_generator.cases[i_case].analysis_time + dlc_generator.cases[i_case].transient_time + dlc_generator.cases[i_case].AnalysisTime = dlc_generator.cases[i_case].total_time # Generate wind files if MPI and not self.options['opt_options']['driver']['design_of_experiments']['flag']: @@ -1841,139 +1867,57 @@ def run_FAST(self, inputs, discrete_inputs, fst_vt): WindFile_type[i_case] , WindFile_name[i_case] = generate_wind_files( dlc_generator, self.FAST_namingOut, self.wind_directory, rotorD, hub_height, self.turbsim_exe, i_case) - # Set initial rotor speed and pitch if the WT operates in this DLC and available, - # otherwise set pitch to 90 deg and rotor speed to 0 rpm when not operating - # set rotor speed to rated and pitch to 15 deg if operating - if self.options['modeling_options']['Level3']['from_openfast']: - reg_traj = self.options['modeling_options']['Level3']['regulation_trajectory'] - if os.path.isfile(reg_traj): - data = load_yaml(reg_traj) - cases = data['cases'] - U_interp = [case["configuration"]["wind_speed"] for case in cases] - pitch_interp = [case["configuration"]["pitch"] for case in cases] - rot_speed_interp = [case["configuration"]["rotor_speed"] for case in cases] - Ct_aero_interp = [case["outputs"]["integrated"]["ct"] for case in cases] - else: - logger.warning("A yaml file with rotor speed, pitch, and Ct is required in modeling options->Level3->regulation_trajectory.", - " This file does not exist. Check WEIS example 02 for a template file") - U_interp = np.arange(cut_in, cut_out) - pitch_interp = np.ones_like(U_interp) * 5. # fixed initial pitch at 5 deg - rot_speed_interp = np.ones_like(U_interp) * 5. # fixed initial omega at 5 rpm - Ct_aero_interp = np.ones_like(U_interp) * 0.7 # fixed initial ct at 0.7 - else: - U_interp = inputs['U'] - pitch_interp = inputs['pitch'] - rot_speed_interp = inputs['Omega'] - Ct_aero_interp = inputs['Ct_aero'] - - tau1_const_interp = np.zeros_like(Ct_aero_interp) - for i in range(len(Ct_aero_interp)): - a = 1. / 2. * (1. - np.sqrt(1. - np.min([Ct_aero_interp[i],1]))) # don't allow Ct_aero > 1 - tau1_const_interp[i] = 1.1 / (1. - 1.3 * np.min([a, 0.5])) * inputs['Rtip'][0] / U_interp[i] - - - for i_case in range(dlc_generator.n_cases): - if 'operating' in dlc_generator.cases[i_case].turbine_status: - # We have initial conditions from WISDEM - rot_speed_initial[i_case] = np.interp(dlc_generator.cases[i_case].URef, U_interp, rot_speed_interp) - pitch_initial[i_case] = np.interp(dlc_generator.cases[i_case].URef, U_interp, pitch_interp) - tau1_const[i_case] = np.interp(dlc_generator.cases[i_case].URef, U_interp, tau1_const_interp) - - if dlc_generator.cases[i_case].turbine_status == 'operating-shutdown': - shutdown_time[i_case] = dlc_generator.cases[i_case].shutdown_time - else: - rot_speed_initial[i_case] = 0. - pitch_initial[i_case] = 90. - shutdown_time[i_case] = 0 - aero_mod[i_case] = 1 - wake_mod[i_case] = 0 - tau1_const[i_case] = 0. - - # Wave inputs to HydroDyn - WindHd[i_case] = dlc_generator.cases[i_case].wind_heading - WaveHs[i_case] = dlc_generator.cases[i_case].wave_height - WaveTp[i_case] = dlc_generator.cases[i_case].wave_period - WaveHd[i_case] = dlc_generator.cases[i_case].wave_heading - WaveGamma[i_case] = dlc_generator.cases[i_case].wave_gamma - WaveSeed1[i_case] = dlc_generator.cases[i_case].wave_seed1 - - # Other case info - self.TMax[i_case] = dlc_generator.cases[i_case].analysis_time + dlc_generator.cases[i_case].transient_time - self.TStart[i_case] = dlc_generator.cases[i_case].transient_time - dlc_label[i_case] = dlc_generator.cases[i_case].label - wind_seed[i_case] = dlc_generator.cases[i_case].RandSeed1 - mean_wind_speed[i_case] = dlc_generator.cases[i_case].URef - yaw_misalignment[i_case] = dlc_generator.cases[i_case].yaw_misalign - azimuth_init[i_case] = dlc_generator.cases[i_case].azimuth_init - - # OLAF data - if wake_mod[i_case] == 3: - dt_fvw[i_case], tMin[i_case], nNWPanels[i_case], nNWPanelsFree[i_case], nFWPanels[i_case], nFWPanelsFree[i_case] = OLAFParams(rot_speed_initial[i_case], mean_wind_speed[i_case], rotorD*0.5) - # nNWPanelsFree[i_case]=60. - if fst_vt['Fst']['CompElast'] == 1: - DT[i_case] = dt_fvw[i_case] - if tMin[i_case] > self.TMax: - logger.warning("OLAF runs are too short in time, the wake is not at convergence") + # Apply olaf settings, should be similar to above? + if dlc_generator.default_options['wake_mod'] == 3: # OLAF is used + apply_olaf_parameters(dlc_generator,fst_vt) + # Parameteric inputs - case_inputs = {} - # Main fst - case_inputs[("Fst","DT")] = {'vals':DT, 'group':1} - case_inputs[("Fst","TMax")] = {'vals':self.TMax, 'group':1} - case_inputs[("Fst","TStart")] = {'vals':self.TStart, 'group':1} - # Inflow wind - case_inputs[("InflowWind","WindType")] = {'vals':WindFile_type, 'group':1} - case_inputs[("InflowWind","HWindSpeed")] = {'vals':mean_wind_speed, 'group':1} - case_inputs[("InflowWind","FileName_BTS")] = {'vals':WindFile_name, 'group':1} - case_inputs[("InflowWind","Filename_Uni")] = {'vals':WindFile_name, 'group':1} - case_inputs[("InflowWind","RefLength")] = {'vals':[rotorD], 'group':0} - case_inputs[("InflowWind","PropagationDir")] = {'vals':WindHd, 'group':1} - case_inputs[("InflowWind","RefHt_Uni")] = {'vals':[hub_height], 'group':0} - # Initial conditions for rotor speed, pitch, and azimuth - case_inputs[("ElastoDyn","RotSpeed")] = {'vals':rot_speed_initial, 'group':1} - case_inputs[("ElastoDyn","BlPitch1")] = {'vals':pitch_initial, 'group':1} - case_inputs[("ElastoDyn","BlPitch2")] = case_inputs[("ElastoDyn","BlPitch1")] - case_inputs[("ElastoDyn","BlPitch3")] = case_inputs[("ElastoDyn","BlPitch1")] - case_inputs[("ElastoDyn","Azimuth")] = {'vals':azimuth_init, 'group':1} - # Yaw offset - case_inputs[("ElastoDyn","NacYaw")] = {'vals':yaw_misalignment, 'group':1} - # Inputs to HydroDyn - case_inputs[("HydroDyn","WaveHs")] = {'vals':WaveHs, 'group':1} - case_inputs[("HydroDyn","WaveTp")] = {'vals':WaveTp, 'group':1} - case_inputs[("HydroDyn","WaveDir")] = {'vals':WaveHd, 'group':1} - case_inputs[("HydroDyn","WavePkShp")] = {'vals':WaveGamma, 'group':1} - case_inputs[("HydroDyn","WaveSeed1")] = {'vals':WaveSeed1, 'group':1} - # Inputs to ServoDyn (parking), PitManRat and BlPitchF are ServoDyn modeling_options - case_inputs[("ServoDyn","TPitManS1")] = {'vals':shutdown_time, 'group':1} - case_inputs[("ServoDyn","TPitManS2")] = {'vals':shutdown_time, 'group':1} - case_inputs[("ServoDyn","TPitManS3")] = {'vals':shutdown_time, 'group':1} - - # Inputs to AeroDyn (parking) - case_inputs[("AeroDyn15","AFAeroMod")] = {'vals':aero_mod, 'group':1} - case_inputs[("AeroDyn15","WakeMod")] = {'vals':wake_mod, 'group':1} - case_inputs[("AeroDyn15","tau1_const")] = {'vals':tau1_const, 'group':1} - - # Inputs to OLAF - case_inputs[("AeroDyn15","OLAF","DTfvw")] = {'vals':dt_fvw, 'group':1} - case_inputs[("AeroDyn15","OLAF","nNWPanels")] = {'vals':nNWPanels, 'group':1} - case_inputs[("AeroDyn15","OLAF","nNWPanelsFree")] = {'vals':nNWPanelsFree, 'group':1} - case_inputs[("AeroDyn15","OLAF","nFWPanels")] = {'vals':nFWPanels, 'group':1} - case_inputs[("AeroDyn15","OLAF","nFWPanelsFree")] = {'vals':nFWPanelsFree, 'group':1} - - # DLC Label add these for the case matrix and delete from the case_list - case_inputs[("DLC","Label")] = {'vals':dlc_label, 'group':1} - case_inputs[("DLC","WindSeed")] = {'vals':wind_seed, 'group':1} - case_inputs[("DLC","MeanWS")] = {'vals':mean_wind_speed, 'group':1} - fst_vt['DLC'] = [] - - # Append current DLC to full list of cases - case_list, case_name = CaseGen_General(case_inputs, self.FAST_runDirectory, self.FAST_InputFile) + case_name = [] + case_list = [] + for i_case, case_inputs in enumerate(dlc_generator.openfast_case_inputs): + # Generate case list for DLC i + dlc_label = DLCs[i_case]['DLC'] + case_list_i, case_name_i = CaseGen_General(case_inputs, self.FAST_runDirectory, self.FAST_InputFile, filename_ext=f'_DLC{dlc_label}_{i_case}') + # Add DLC to case names + case_name_i = [f'DLC{dlc_label}_{i_case}_{cni}' for cni in case_name_i] # TODO: discuss case labeling with stakeholders + + # Extend lists of cases + case_list.extend(case_list_i) + case_name.extend(case_name_i) + + # Apply wind files to case_list (this info will be in combined case matrix, but not individual DLCs) + for case_i, wt, wf in zip(case_list,WindFile_type,WindFile_name): + case_i[('InflowWind','WindType')] = wt + case_i[('InflowWind','Filename_Uni')] = wf + case_i[('InflowWind','FileName_BTS')] = wf + + # Save some case info + self.TMax = [c.total_time for c in dlc_generator.cases] + self.TStart = [c.transient_time for c in dlc_generator.cases] + dlc_label = [c.label for c in dlc_generator.cases] + + + # Merge various cases into single case matrix + case_df = pd.DataFrame(case_list) + case_df.index = case_name + # Add case name and dlc label to front for readability + case_df.insert(0,'DLC',dlc_label) + case_df.insert(0,'case_name',case_name) + text_table = case_df.to_string(index=False) + + # Write the text table to a yaml, text file + write_yaml(case_df.to_dict(),os.path.join(self.FAST_runDirectory,'case_matrix_combined.yaml')) + with open(os.path.join(self.FAST_runDirectory,'case_matrix_combined.txt'), 'w') as file: + file.write(text_table) + + channels= self.output_channels(fst_vt) - # Now delete the DLC-based case_inputs because they don't play nicely with aeroelasticse + # Delete the extra case_inputs because they don't play nicely with aeroelasticse for case in case_list: for key in list(case): - if key[0] == 'DLC': + if key[0] in ['DLC','TurbSim']: del case[key] @@ -2446,10 +2390,18 @@ def calculate_AEP(self, sum_stats, case_list, dlc_generator, discrete_inputs, ou # determine which dlc will be used for the powercurve calculations, allows using dlc 1.1 if specific power curve calculations were not run + modopts = self.options['modeling_options'] + DLCs = [i_dlc['DLC'] for i_dlc in modopts['DLC_driver']['DLCs']] + if 'AEP' in DLCs: + DLC_label_for_AEP = 'AEP' + else: + DLC_label_for_AEP = '1.1' + logger.warning('WARNING: DLC 1.1 is being used for AEP calculations. Use the AEP DLC for more accurate wind modeling with constant TI.') + idx_pwrcrv = [] U = [] for i_case in range(dlc_generator.n_cases): - if dlc_generator.cases[i_case].label == '1.1': + if dlc_generator.cases[i_case].label == DLC_label_for_AEP: idx_pwrcrv = np.append(idx_pwrcrv, i_case) U = np.append(U, dlc_generator.cases[i_case].URef) @@ -2486,7 +2438,7 @@ def calculate_AEP(self, sum_stats, case_list, dlc_generator, discrete_inputs, ou if self.fst_vt['Fst']['CompServo'] == 1: outputs['AEP'] = sum_stats['GenPwr']['mean'].mean() outputs['P_out'] = sum_stats['GenPwr']['mean'].iloc[0] * 1.e3 - logger.warning('WARNING: OpenFAST is not run using DLC 1.1/1.2. AEP cannot be estimated. Using average power instead.') + logger.warning('WARNING: OpenFAST is not run using DLC AEP, 1.1, or 1.2. AEP cannot be estimated. Using average power instead.') if len(U)>0: outputs['V_out'] = np.unique(U) @@ -2797,3 +2749,50 @@ def save_iterations(self,summ_stats,DELs,discrete_outputs): pickle.dump(self.fst_vt,f) discrete_outputs['ts_out_dir'] = save_dir + +def apply_olaf_parameters(dlc_generator,fst_vt): + ''' + Apply OLAF parameters using wind speed, rotor speed, and rotor radius + Parameters are applied for each case, if WakeMod = 3 + + This method requires that the case inputs have been generated for each case in dlc_generator + + OLAF parameters will be appended to proper openfast_case_input for each dlc + ''' + + # Loop over cases + for case_input in dlc_generator.openfast_case_inputs: + + min_TMax = min(case_input[('Fst', 'TMax')]['vals']) + + # find group with wind_speed + wind_group = case_input[('InflowWind', 'HWindSpeed')]['group'] + + wind_speeds = case_input[('InflowWind', 'HWindSpeed')]['vals'] + rotor_speeds = case_input[('ElastoDyn', 'RotSpeed')]['vals'] + + dt_fvw = len(wind_speeds) * [None] + tMin = len(wind_speeds) * [None] + nNWPanels = len(wind_speeds) * [None] + nNWPanelsFree = len(wind_speeds) * [None] + nFWPanels = len(wind_speeds) * [None] + nFWPanelsFree = len(wind_speeds) * [None] + + for i_case in range(len(wind_speeds)): + dt_fvw[i_case], tMin[i_case], nNWPanels[i_case], nNWPanelsFree[i_case], nFWPanels[i_case], nFWPanelsFree[i_case] = OLAFParams(rotor_speeds[i_case], wind_speeds[i_case], fst_vt['ElastoDyn']['TipRad']) + + # Check that runs are long enough + if tMin[i_case] > min_TMax: + logger.warning("OLAF runs are too short in time, the wake is not at convergence") + + # TODO: skipping timestep setting because they're big timesteps + # # Set timestep + # if fst_vt['Fst']['CompElast'] == 1: + # DT[i_case] = dt_fvw[i_case] + + case_input[("AeroDyn15","OLAF","DTfvw")] = {'vals': dt_fvw, 'group': wind_group} + case_input[("AeroDyn15","OLAF","nNWPanels")] = {'vals': nNWPanels, 'group': wind_group} + case_input[("AeroDyn15","OLAF","nNWPanelsFree")] = {'vals': nNWPanelsFree, 'group': wind_group} + case_input[("AeroDyn15","OLAF","nFWPanels")] = {'vals': nFWPanels, 'group': wind_group} + case_input[("AeroDyn15","OLAF","nFWPanelsFree")] = {'vals': nFWPanelsFree, 'group': wind_group} + diff --git a/weis/aeroelasticse/turbsim_util.py b/weis/aeroelasticse/turbsim_util.py index ac1317acc..955476ea5 100644 --- a/weis/aeroelasticse/turbsim_util.py +++ b/weis/aeroelasticse/turbsim_util.py @@ -269,7 +269,7 @@ def generate_wind_files(dlc_generator, FAST_namingOut, wind_directory, rotorD, h gusts.HH = hub_height gusts.dt = dlc_generator.cases[i_case].TimeStep gusts.TStart = dlc_generator.cases[i_case].transient_time + 10. # start gust 10 seconds after OpenFAST starts recording - gusts.TF = dlc_generator.cases[i_case].analysis_time + dlc_generator.cases[i_case].transient_time + gusts.TF = dlc_generator.cases[i_case].total_time gusts.Vert_Slope = dlc_generator.cases[i_case].VFlowAng wind_file_name = gusts.execute(wind_directory, FAST_namingOut, dlc_generator.cases[i_case]) if not os.path.isabs(wind_file_name): diff --git a/weis/dlc_driver/dlc_generator.py b/weis/dlc_driver/dlc_generator.py index 7e2911ebc..04273a660 100644 --- a/weis/dlc_driver/dlc_generator.py +++ b/weis/dlc_driver/dlc_generator.py @@ -1,8 +1,13 @@ import numpy as np import os +import logging import weis.inputs as sch from weis.dlc_driver.turbulence_models import IEC_TurbulenceModels +from weis.aeroelasticse.CaseGen_General import CaseGen_General +from weis.aeroelasticse.FileTools import remove_numpy +from weis.aeroelasticse.utils import OLAFParams +logger = logging.getLogger("wisdem/weis") class DLCInstance(object): @@ -42,8 +47,97 @@ def default_turbsim_props(self, options): class DLCGenerator(object): - def __init__(self, ws_cut_in=4.0, ws_cut_out=25.0, ws_rated=10.0, wind_speed_class = 'I', - wind_turbulence_class = 'B', fix_wind_seeds=True, fix_wave_seeds=True, metocean={}): + dlc_schema = sch.validation.get_modeling_schema()['properties']['DLC_driver']['properties']['DLCs']['items']['properties'] + + # TODO: not sure where this should live, so it's a global for now + # Could it be an input yaml? + openfast_input_map = { + # Generic name: OpenFAST input (list if necessary) + 'total_time': ("Fst","TMax"), + 'transient_time': ("Fst","TStart"), + + 'WindFile_type': ("InflowWind","WindType"), + 'wind_speed': ("InflowWind","HWindSpeed"), + 'WindFile_name': ("InflowWind","FileName_BTS"), + 'WindFile_name': ("InflowWind","Filename_Uni"), + 'rotorD': ("InflowWind","RefLength"), + 'WindHd': ("InflowWind","PropagationDir"), + 'hub_height': ("InflowWind","RefHt_Uni"), + + 'rot_speed_initial': ("ElastoDyn","RotSpeed"), + 'pitch_initial': [("ElastoDyn","BlPitch1"),("ElastoDyn","BlPitch2"),("ElastoDyn","BlPitch3")], + 'azimuth_init': ("ElastoDyn","Azimuth"), + 'yaw_misalign': ("ElastoDyn","NacYaw"), + + 'wave_height': ("HydroDyn","WaveHs"), + 'wave_period': ("HydroDyn","WaveTp"), + 'WaveHd': ("HydroDyn","WaveDir"), + 'WaveGamma': ("HydroDyn","WavePkShp"), + 'wave_seed': ("HydroDyn","WaveSeed1"), + + 'wave_model': ("HydroDyn","WaveMod"), + + 'shutdown_time': [ + ("ServoDyn","TPitManS1"), + ("ServoDyn","TPitManS2"), + ("ServoDyn","TPitManS3"), + ("ServoDyn","TimGenOf"), + ], + + 'startup_time': [ + ("ServoDyn","TimGenOn"), + ("ServoDyn","TPCOn"), + ], + + + 'final_blade_pitch': [ + ("ServoDyn","BlPitchF(1)"), + ("ServoDyn","BlPitchF(2)"), + ("ServoDyn","BlPitchF(3)"), + + ], + 'pitchfault_time1': ("ServoDyn","TPitManS1"), + 'pitchfault_time2': ("ServoDyn","TPitManS2"), + 'pitchfault_time3': ("ServoDyn","TPitManS3"), + 'pitchfault_blade1pos': ("ServoDyn","BlPitchF(1)"), + 'pitchfault_blade2pos': ("ServoDyn","BlPitchF(2)"), + 'pitchfault_blade3pos': ("ServoDyn","BlPitchF(3)"), + 'genfault_time': ("ServoDyn","TimGenOf"), + 'yawfault_time': ("ServoDyn","TYawManS"), + 'yawfault_yawpos': ("ServoDyn","NacYawF"), + + 'aero_mod': ("AeroDyn15","AFAeroMod"), + 'wake_mod': ("AeroDyn15","WakeMod"), + 'tau1_const': ("AeroDyn15","tau1_const"), + + + # 'dlc_label': ("DLC","Label"), + # 'wind_seed': ("DLC","WindSeed"), + # 'wind_speed': ("DLC","MeanWS"), + + # TODO: where should turbsim live? + # These aren't actually used to generate turbsim, the generic inputs are used + # However, I think it's better to be over-thorough and check that inputs are applied than the uncertainty of not checking any + 'wind_seed': ("TurbSim", "RandSeed1"), + 'direction': ("TurbSim", "direction_pn"), + 'shear': ("TurbSim", "shear_hv") + } + + + + def __init__( + self, + ws_cut_in=4.0, + ws_cut_out=25.0, + ws_rated=10.0, + wind_speed_class = 'I', + wind_turbulence_class = 'B', + fix_wind_seeds=True, + fix_wave_seeds=True, + metocean={}, + initial_condition_table = {}, + default_options = {}, + ): self.ws_cut_in = ws_cut_in self.ws_cut_out = ws_cut_out self.wind_speed_class = wind_speed_class @@ -61,6 +155,16 @@ def __init__(self, ws_cut_in=4.0, ws_cut_out=25.0, ws_rated=10.0, wind_speed_cla self.n_cases = 0 self.n_ws_dlc11 = 0 + # Set and update default_options, applied to dlc_options and first group in case_inputs + self.default_options = { + 'wake_mod': 1, + 'wave_model': 2, + } + self.default_options.update(default_options) + + # Init openfast case list + self.openfast_case_inputs = [] + # Metocean conditions self.mo_ws = metocean['wind_speed'] self.mo_Hs_NSS = metocean['wave_height_NSS'] @@ -83,10 +187,12 @@ def __init__(self, ws_cut_in=4.0, ws_cut_out=25.0, ws_rated=10.0, wind_speed_cla raise Exception('The vector of metocean conditions wave_period_SSS in the modeling options must have the same length of the tabulated wind speeds') # Load extreme wave heights and periods - self.wave_Hs50 = np.array([metocean['wave_height50']]) - self.wave_Tp50 = np.array([metocean['wave_period50']]) - self.wave_Hs1 = np.array([metocean['wave_height1']]) - self.wave_Tp1 = np.array([metocean['wave_period1']]) + self.wave_height50 = np.array([metocean['wave_height50']]) + self.wave_period50 = np.array([metocean['wave_period50']]) + self.wave_height1 = np.array([metocean['wave_height1']]) + self.wave_period1 = np.array([metocean['wave_period1']]) + + self.initial_condition_table = initial_condition_table def IECwind(self): self.IECturb = IEC_TurbulenceModels() @@ -102,35 +208,31 @@ def to_dict(self): def get_wind_speeds(self, options): if len(options['wind_speed']) > 0: - wind_speeds = np.array( [float(m) for m in options['wind_speed']] ) + wind_speed = np.array( [float(m) for m in options['wind_speed']] ) else: - wind_speeds = np.arange(self.ws_cut_in, self.ws_cut_out+0.5*options['ws_bin_size'], options['ws_bin_size']) - if wind_speeds[-1] != self.ws_cut_out: - wind_speeds = np.append(wind_speeds, self.ws_cut_out) + wind_speed = np.arange(self.ws_cut_in, self.ws_cut_out+0.5*options['ws_bin_size'], options['ws_bin_size']) + if wind_speed[-1] != self.ws_cut_out: + wind_speed = np.append(wind_speed, self.ws_cut_out) - return wind_speeds + return wind_speed - def get_wind_seeds(self, options, wind_speeds): - if 'yaw_misalign' in options: - n_yaw_ms = len(options['yaw_misalign']) - else: - n_yaw_ms = 1 + def get_wind_seeds(self, options, wind_speed): if len(options['wind_seed']) > 0: - wind_seeds = np.array( [int(m) for m in options['wind_seed']] ) + wind_seed = np.array( [int(m) for m in options['wind_seed']] ) else: - wind_seeds = self.rng_wind.integers(2147483648, size=options['n_seeds']*len(wind_speeds) * n_yaw_ms * options['n_azimuth'], dtype=int) - wind_speeds = np.repeat(wind_speeds, options['n_seeds'] * n_yaw_ms * options['n_azimuth']) + wind_seed = self.rng_wind.integers(2147483648, size=options['n_seeds']*len(wind_speed), dtype=int) + wind_speed = np.repeat(wind_speed, options['n_seeds']) - return wind_speeds, wind_seeds + return wind_speed, wind_seed - def get_wave_seeds(self, options, wind_speeds): - if len(options['wave_seeds']) > 0: - wave_seeds = np.array( [int(m) for m in options['wave_seeds']] ) + def get_wave_seeds(self, options, wind_speed): + if len(options['wave_seed']) > 0: + wave_seed = np.array( [int(m) for m in options['wave_seed']] ) else: - wave_seeds = self.rng_wave.integers(2147483648, size=len(wind_speeds), dtype=int) + wave_seed = self.rng_wave.integers(2147483648, size=len(wind_speed), dtype=int) - return wave_seeds + return wave_seed def get_wind_heading(self, options): if len(options['wind_heading']) > 0: @@ -139,19 +241,19 @@ def get_wind_heading(self, options): wind_heading = np.array([]) return wind_heading - def get_wave_Hs(self, options): + def get_wave_height(self, options): if len(options['wave_height']) > 0: - wave_Hs = np.array( [float(m) for m in options['wave_height']] ) + wave_height = np.array( [float(m) for m in options['wave_height']] ) else: - wave_Hs = np.array([]) - return wave_Hs + wave_height = np.array([]) + return wave_height - def get_wave_Tp(self, options): + def get_wave_period(self, options): if len(options['wave_period']) > 0: - wave_Tp = np.array( [float(m) for m in options['wave_period']] ) + wave_period = np.array( [float(m) for m in options['wave_period']] ) else: - wave_Tp = np.array([]) - return wave_Tp + wave_period = np.array([]) + return wave_period def get_wave_gamma(self, options): if len(options['wave_gamma']) > 0: @@ -176,38 +278,54 @@ def get_probabilities(self, options): def get_metocean(self, options): wind_speeds_indiv = self.get_wind_speeds(options) - wind_speeds, wind_seeds = self.get_wind_seeds(options, wind_speeds_indiv) - wave_seeds = self.get_wave_seeds(options, wind_speeds) + wind_speed, wind_seed = self.get_wind_seeds(options, wind_speeds_indiv) + wave_seed = self.get_wave_seeds(options, wind_speed) wind_heading = self.get_wind_heading(options) - wave_Hs = self.get_wave_Hs(options) - wave_Tp = self.get_wave_Tp(options) + wave_height = self.get_wave_height(options) + wave_period = self.get_wave_period(options) wave_gamma = self.get_wave_gamma(options) wave_heading = self.get_wave_heading(options) probabilities = self.get_probabilities(options) - if len(wind_seeds) > 1 and len(wind_seeds) != len(wind_speeds): - raise Exception("The vector of wind_seeds must have either length=1 or the same length of wind speeds") - if len(wind_heading) > 1 and len(wind_heading) != len(wind_speeds): + if len(wind_seed) > 1 and len(wind_seed) != len(wind_speed): + raise Exception("The vector of wind_seed must have either length=1 or the same length of wind speeds") + if len(wind_heading) > 1 and len(wind_heading) != len(wind_speed): raise Exception("The vector of wind_heading must have either length=1 or the same length of wind speeds") - if len(wave_seeds) > 1 and len(wave_seeds) != len(wind_speeds): + if len(wave_seed) > 1 and len(wave_seed) != len(wind_speed): raise Exception("The vector of wave seeds must have the same length of wind speeds or not defined") - if len(wave_Hs) > 1 and len(wave_Hs) != len(wind_speeds): + if len(wave_height) > 1 and len(wave_height) != len(wind_speed): raise Exception("The vector of wave heights must have either length=1 or the same length of wind speeds") - if len(wave_Tp) > 1 and len(wave_Tp) != len(wind_speeds): + if len(wave_period) > 1 and len(wave_period) != len(wind_speed): raise Exception("The vector of wave periods must have either length=1 or the same length of wind speeds") - if len(wave_gamma) > 1 and len(wave_gamma) != len(wind_speeds): + if len(wave_gamma) > 1 and len(wave_gamma) != len(wind_speed): raise Exception("The vector of wave_gamma must have either length=1 or the same length of wind speeds") - if len(wave_heading) > 1 and len(wave_heading) != len(wind_speeds): + if len(wave_heading) > 1 and len(wave_heading) != len(wind_speed): raise Exception("The vector of wave heading must have either length=1 or the same length of wind speeds") - if len(probabilities) > 1 and len(probabilities) != len(wind_speeds): + if len(probabilities) > 1 and len(probabilities) != len(wind_speed): raise Exception("The vector of probabilities must have either length=1 or the same length of wind speeds") if abs(sum(probabilities) - 1.) > 1.e-3: raise Exception("The vector of probabilities must sum to 1") + + metocean_case_info = {} + metocean_case_info['wind_speed'] = wind_speed + metocean_case_info['wind_seed'] = wind_seed + metocean_case_info['wave_seed'] = wave_seed + metocean_case_info['wind_heading'] = wind_heading + metocean_case_info['wave_height'] = wave_height + metocean_case_info['wave_period'] = wave_period + # metocean_case_info['current_speeds'] = current_speeds + metocean_case_info['wave_gamma'] = wave_gamma + metocean_case_info['wave_heading'] = wave_heading + metocean_case_info['probabilities'] = probabilities + # metocean_case_info['current_std'] = self.mo_current_std + + return metocean_case_info - return wind_speeds, wind_seeds, wave_seeds, wind_heading, wave_Hs, wave_Tp, wave_gamma, wave_heading, probabilities def generate(self, label, options): - known_dlcs = [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 5.1, 6.1, 6.3, 6.4, 6.5, 12.1] + # Use schema to determine known_dlcs (weis/inputs/modeling_schema.yaml) + known_dlcs = self.dlc_schema['DLC']['enum'] + self.OF_dlccaseinputs = {key: None for key in known_dlcs} # Get extreme wind speeds self.IECwind() @@ -226,667 +344,929 @@ def generate(self, label, options): self.n_cases = len(self.cases) - def generate_custom(self, options): - pass - - def generate_1p1(self, options): - # Power production normal turbulence model - ultimate loads - wind_speeds, wind_seeds, wave_seeds, wind_heading, wave_Hs, wave_Tp, wave_gamma, wave_heading, _ = self.get_metocean(options) - # If the user has not defined Hs and Tp, apply the metocean conditions for the normal sea state - if len(wave_Hs)==0: - wave_Hs = np.interp(wind_speeds, self.mo_ws, self.mo_Hs_NSS) - if len(wave_Tp)==0: - wave_Tp = np.interp(wind_speeds, self.mo_ws, self.mo_Tp_NSS) + def generate_cases(self,generic_case_inputs,dlc_options): + ''' + This method will generate the simulation inputs for each design load case + + generic_case_inputs is a list of lists of strings with the options used to create a case matrix + dlc_options is a dictionary, some of its keys will be in generic_case_inputs and used to generate the cases + Other keys include: + sea_state is a string: either severe or normal + label is the string label used in when the wind inputs are created + ''' + + # Handle default options + if 'sea_state' not in dlc_options: + dlc_options['sea_state'] = 'normal' + + if 'PSF' not in dlc_options: + dlc_options['PSF'] = 1.35 + + + # Generate case list, both generic and OpenFAST specific + self.set_time_options(dlc_options) + met_options = self.gen_met_options(dlc_options, sea_state=dlc_options['sea_state']) + + # Add met options to dlc_options for output reporting + dlc_options.update(met_options) + dlc_options = remove_numpy(dlc_options) + + self.apply_initial_conditions(generic_case_inputs,dlc_options, met_options) + generic_case_list = self.gen_case_list(dlc_options,met_options,generic_case_inputs) + + # DLC specific: Make idlc for other parts of WEIS (mostly turbsim generation) + for _, case in enumerate(generic_case_list): + idlc = DLCInstance(options=dlc_options) + if dlc_options['IEC_WindType'] == 'ECD': + idlc.turbulent_wind = False + idlc.direction_pn = case['direction'] + elif dlc_options['IEC_WindType'] == 'EOG': + idlc.turbulent_wind = False + idlc.sigma1,idlc.V_e1 = self.IECturb.EOG(case['wind_speed']) + elif dlc_options['IEC_WindType'] == 'EWS': + idlc.turbulent_wind = False + idlc.direction_pn = case['direction'] + idlc.shear_hv = case['shear'] + idlc.sigma1 = self.IECturb.NTM(case['wind_speed']) + else: + idlc.turbulent_wind = True + idlc.RandSeed1 = case['wind_seed'] + idlc.URef = case['wind_speed'] + idlc.label = dlc_options['label'] + idlc.total_time = case['total_time'] + idlc.IEC_WindType = dlc_options['IEC_WindType'] + idlc.turbine_status = dlc_options['turbine_status'] + + # Apply case_list info to idlc + for key in case: + setattr(idlc,key,case[key]) + + #if dlc_options['label'] == '1.2': + # idlc.probability = probabilities[i_WaH] + self.cases.append(idlc) + + # AEP DLC: set constant turbulence intensity + if dlc_options['label'] == 'AEP': + idlc.IECturbc = self.IECturb.NTM(idlc.URef) * dlc_options['TI_factor'] / idlc.URef * 100 + + + def apply_sea_state(self,met_options,sea_state='normal'): + ''' + Apply waves based on the expected values provided in the metocean inputs + Will use met_options as an input and modify that dict + sea_state can be normal, severe + ''' + allowed_sea_states = ['normal','severe','50-year','1-year'] + if sea_state not in allowed_sea_states: + raise Exception(f'Selected sea state of {sea_state} is not in allowed_sea_states: {allowed_sea_states}') + + # Select wind speed, sea state lookup + if sea_state == 'normal': + wind_speed_table = self.mo_ws + wave_height_table = self.mo_Hs_NSS + wave_period_table = self.mo_Tp_NSS + elif sea_state == 'severe': + wind_speed_table = self.mo_ws + wave_height_table = self.mo_Hs_SSS + wave_period_table = self.mo_Tp_SSS + elif sea_state == '50-year': + wind_speed_table = [50.] + wave_height_table = self.wave_height50 + wave_period_table = self.wave_period50 + elif sea_state == '1-year': + wind_speed_table = [50.] + wave_height_table = self.wave_height1 + wave_period_table = self.wave_period1 + + + # If the user has not defined Hs (wave_height in modopts) and Tp (wave_period in modopts), apply the metocean conditions defined by the table + if len(met_options['wave_height'])==0: + met_options['wave_height'] = np.interp(met_options['wind_speed'], wind_speed_table, wave_height_table) + if len(met_options['wave_period'])==0: + met_options['wave_period'] = np.interp(met_options['wind_speed'], wind_speed_table, wave_period_table) + + def set_time_options(self, options): + ''' + Handle time options and add total_time to dict + Default for analysis and transient_time is 0 + ''' + if options['analysis_time'] > 0: + options['analysis_time'] = options['analysis_time'] + else: + options['analysis_time'] = 600. + if options['transient_time'] >= 0: + options['transient_time'] = options['transient_time'] + options['total_time'] = options['analysis_time'] + options['transient_time'] + + def gen_case_list(self,dlc_options, met_options, generic_case_inputs): + ''' + Generate case list from generic_case_inputs + TODO: this whole thing could be moved into generate_cases, thoughts? + ''' + + + # Combine + comb_options = combine_options(dlc_options,met_options) + + # Check that all inputs are valid options + all_inputs = sum(generic_case_inputs, []) + for input in all_inputs: + if not input in comb_options: + raise Exception(f'The desired input {input} is not defined. Options include {comb_options.keys()}') + + # Setup generic cross product of inputs: + gen_case_inputs = {} + for i_group, group in enumerate(generic_case_inputs): + first_array_len = len(comb_options[group[0]]) + for input in group: + + # Check that all inputs are of equal length + if len(comb_options[input]) != first_array_len: + raise Exception(f'The input options in group {i_group} are not equal. This group contains: {group}') + + gen_case_inputs[input] = {'vals': comb_options[input], 'group': i_group} + + # Generate generic case list + generic_case_list, _ = CaseGen_General(gen_case_inputs,save_matrix=False) + + case_inputs_openfast = self.map_generic_to_openfast(generic_case_inputs, comb_options) + self.openfast_case_inputs.append(case_inputs_openfast) + return generic_case_list + + def gen_met_options(self, dlc_options, sea_state='normal'): + ''' + Determine metocean options based on dlcs and sea state requested + met_options includes wind, waves, seeds, etc. + + TODO: what input conditions are required of self? + TODO: what is required in dlc_options? + ''' + met_options = self.get_metocean(dlc_options) + + # Apply wave conditions based on wind speeds + self.apply_sea_state(met_options,sea_state=sea_state) + + make_equal_length(met_options,'wind_speed') + return met_options + + def apply_initial_conditions(self,generic_case_inputs, dlc_options, met_options): + ''' + Add available initial conditions to generic_case_inputs and interpolate options based on initial_condition_table + This is performed within each dlc generator function + + ''' + + # These allowed_ics should map to input in openfast_input_map + allowed_ics = ['pitch_initial','rot_speed_initial','tau1_const'] + + + if self.initial_condition_table and dlc_options['turbine_status'] == 'operating': # there is an IC table that's not empty + dlc_wind_speeds = met_options['wind_speed'] # need to use met_options wind speeds because it accounts for seeds + # find group with wind_speed + wind_group = ['wind_speed' in gci for gci in generic_case_inputs].index(True) + group = generic_case_inputs[wind_group] + + for initial_condition in allowed_ics: + if initial_condition in self.initial_condition_table: + group.append(initial_condition) + dlc_options[initial_condition] = np.interp(dlc_wind_speeds,self.initial_condition_table['U'],self.initial_condition_table[initial_condition]) + + # Apply new group + generic_case_inputs[wind_group] = group + + + def map_generic_to_openfast(self,generic_case_inputs, comb_options): + case_inputs_openfast = {} + for i_group, generic_case_group in enumerate(generic_case_inputs): + for generic_input in generic_case_group: + + if generic_input not in self.openfast_input_map.keys(): + raise Exception(f'The input {generic_input} does not map to an OpenFAST input key in openfast_input_map') + + openfast_input = self.openfast_input_map[generic_input] + + if type(openfast_input) == list: + # Apply to all list of openfast_inputs + for of_input in openfast_input: + case_inputs_openfast[of_input] = {'vals': comb_options[generic_input], 'group': i_group} + + else: + case_inputs_openfast[openfast_input] = {'vals': comb_options[generic_input], 'group': i_group} + + return case_inputs_openfast + + def generate_1p1(self, dlc_options): + # Power production normal turbulence model - normal sea state + + # Get default options + dlc_options.update(self.default_options) + + # Handle DLC Specific options: + dlc_options['label'] = '1.1' + dlc_options['sea_state'] = 'normal' + dlc_options['PSF'] = 1.35 + # Set yaw_misalign, else default - if 'yaw_misalign' in options: - yaw_misalign = options['yaw_misalign'] + if 'yaw_misalign' in dlc_options: + dlc_options['yaw_misalign'] = dlc_options['yaw_misalign'] else: # default - yaw_misalign = [0] - yaw_misalign_deg = np.array(yaw_misalign * int(len(wind_speeds) / len(yaw_misalign))) - # Counter for wind seed - i_WiSe=0 - # Counters for wave conditions - i_WaSe=0 - i_Hs=0 - i_Tp=0 - i_WiH=0 - i_WG=0 - i_WaH=0 - for ws in wind_speeds: - idlc = DLCInstance(options=options) - idlc.URef = ws - idlc.RandSeed1 = wind_seeds[i_WiSe] - idlc.wave_seed1 = wave_seeds[i_WaSe] - idlc.wind_heading = wind_heading[i_WiH] - idlc.wave_height = wave_Hs[i_Hs] - idlc.wave_period = wave_Tp[i_Tp] - idlc.wave_gamma = wave_gamma[i_WG] - idlc.wave_heading = wave_heading[i_WaH] - idlc.yaw_misalign = yaw_misalign_deg[i_WiSe] - idlc.turbulent_wind = True - idlc.label = '1.1' - if options['analysis_time'] > 0: - idlc.analysis_time = options['analysis_time'] - if options['transient_time'] >= 0: - idlc.transient_time = options['transient_time'] - idlc.PSF = 1.2 * 1.25 - self.cases.append(idlc) - if len(wind_seeds)>1: - i_WiSe+=1 - if len(wave_seeds)>1: - i_WaSe+=1 - if len(wind_heading)>1: - i_WiH+=1 - if len(wave_Hs)>1: - i_Hs+=1 - if len(wave_Tp)>1: - i_Tp+=1 - if len(wave_gamma)>1: - i_WG+=1 - if len(wave_heading)>1: - i_WaH+=1 - - self.n_ws_dlc11 = len(np.unique(wind_speeds)) - - def generate_1p2(self, options): + dlc_options['yaw_misalign'] = [0] + + # DLC-specific: define groups + # These options should be the same length and we will generate a matrix of all cases + generic_case_inputs = [] + generic_case_inputs.append(['total_time','transient_time']) # group 0, (usually constants) turbine variables, DT, aero_modeling + generic_case_inputs.append(['wind_speed','wave_height','wave_period', 'wind_seed','wave_seed']) # group 1, initial conditions will be added here, define some method that maps wind speed to ICs and add those variables to this group + generic_case_inputs.append(['yaw_misalign']) # group 2 + + self.generate_cases(generic_case_inputs,dlc_options) + + def generate_AEP(self, dlc_options): + # Same as DLC 1.1, but with a constant TI + + # Get default options + dlc_options.update(self.default_options) + + # Handle DLC Specific options: + dlc_options['label'] = 'AEP' + dlc_options['sea_state'] = 'normal' + dlc_options['PSF'] = 1.35 + if 'TI_factor' not in dlc_options: + raise Exception('A TI_factor must be set for the AEP DLC.') + + if 'turbulence_class' in dlc_options: + self.IECturb.Turbulence_Class = dlc_options['turbulence_class'] + self.IECturb.setup() + + + # Set yaw_misalign, else default + if 'yaw_misalign' in dlc_options: + dlc_options['yaw_misalign'] = dlc_options['yaw_misalign'] + else: # default + dlc_options['yaw_misalign'] = [0] + + # DLC-specific: define groups + # These options should be the same length and we will generate a matrix of all cases + generic_case_inputs = [] + generic_case_inputs.append(['total_time','transient_time']) # group 0, (usually constants) turbine variables, DT, aero_modeling + generic_case_inputs.append(['wind_speed','wave_height','wave_period', 'wind_seed']) # group 1, initial conditions will be added here, define some method that maps wind speed to ICs and add those variables to this group + generic_case_inputs.append(['yaw_misalign']) # group 2 + + self.generate_cases(generic_case_inputs,dlc_options) + + def generate_1p2(self, dlc_options): # Power production normal turbulence model - fatigue loads - wind_speeds, wind_seeds, wave_seeds, wind_heading, wave_Hs, wave_Tp, wave_gamma, wave_heading, probabilities = self.get_metocean(options) - # If the user has not defined Hs and Tp, apply the metocean conditions for the fatigue analysis - if len(wave_Hs)==0: - wave_Hs = np.interp(wind_speeds, self.mo_ws, self.mo_Hs_F) - if len(wave_Tp)==0: - wave_Tp = np.interp(wind_speeds, self.mo_ws, self.mo_Tp_F) - # Counter for wind seed - i_WiSe=0 - # Counters for wave conditions - i_WaSe=0 - i_Hs=0 - i_Tp=0 - i_WiH=0 - i_WG=0 - i_WaH=0 - for ws in wind_speeds: - idlc = DLCInstance(options=options) - idlc.URef = ws - idlc.RandSeed1 = wind_seeds[i_WiSe] - idlc.wave_seed1 = wave_seeds[i_WaSe] - idlc.wind_heading = wind_heading[i_WiH] - idlc.wave_height = wave_Hs[i_Hs] - idlc.wave_period = wave_Tp[i_Tp] - idlc.wave_gamma = wave_gamma[i_WG] - idlc.wave_heading = wave_heading[i_WaH] - idlc.probability = probabilities[i_WaH] - idlc.turbulent_wind = True - idlc.label = '1.2' - if options['analysis_time'] > 0: - idlc.analysis_time = options['analysis_time'] - if options['transient_time'] >= 0: - idlc.transient_time = options['transient_time'] - idlc.PSF = 1. - self.cases.append(idlc) - if len(wind_seeds)>1: - i_WiSe+=1 - if len(wave_seeds)>1: - i_WaSe+=1 - if len(wind_heading)>1: - i_WiH+=1 - if len(wave_Hs)>1: - i_Hs+=1 - if len(wave_Tp)>1: - i_Tp+=1 - if len(wave_gamma)>1: - i_WG+=1 - if len(wave_heading)>1: - i_WaH+=1 - - def generate_1p3(self, options): + + # Get default options + dlc_options.update(self.default_options) + + # Handle DLC Specific options: + dlc_options['label'] = '1.2' + dlc_options['sea_state'] = 'normal' + + # Set yaw_misalign, else default + if 'yaw_misalign' in dlc_options: + dlc_options['yaw_misalign'] = dlc_options['yaw_misalign'] + else: # default + dlc_options['yaw_misalign'] = [0] + + # DLC-specific: define groups + # These options should be the same length and we will generate a matrix of all cases + generic_case_inputs = [] + generic_case_inputs.append(['total_time','transient_time']) # group 0, (usually constants) turbine variables, DT, aero_modeling + generic_case_inputs.append(['wind_speed','wave_height','wave_period', 'wind_seed', 'wave_seed']) # group 1, initial conditions will be added here, define some method that maps wind speed to ICs and add those variables to this group + generic_case_inputs.append(['yaw_misalign']) # group 2 + + self.generate_cases(generic_case_inputs,dlc_options) + + + def generate_1p3(self, dlc_options): # Power production extreme turbulence model - ultimate loads - wind_speeds, wind_seeds, wave_seeds, wind_heading, wave_Hs, wave_Tp, wave_gamma, wave_heading, _ = self.get_metocean(options) - # If the user has not defined Hs and Tp, apply the metocean conditions for the normal sea state - if len(wave_Hs)==0: - wave_Hs = np.interp(wind_speeds, self.mo_ws, self.mo_Hs_NSS) - if len(wave_Tp)==0: - wave_Tp = np.interp(wind_speeds, self.mo_ws, self.mo_Tp_NSS) + + # Get default options + dlc_options.update(self.default_options) + + # Handle DLC Specific options: + dlc_options['label'] = '1.3' + dlc_options['sea_state'] = 'normal' + dlc_options['IEC_WindType'] = '1ETM' + # Set yaw_misalign, else default - if 'yaw_misalign' in options: - yaw_misalign = options['yaw_misalign'] + if 'yaw_misalign' in dlc_options: + dlc_options['yaw_misalign'] = dlc_options['yaw_misalign'] else: # default - yaw_misalign = [0] - yaw_misalign_deg = np.array(yaw_misalign * int(len(wind_speeds) / len(yaw_misalign))) - # Counter for wind seed - i_WiSe=0 - # Counters for wave conditions - i_WaSe=0 - i_Hs=0 - i_Tp=0 - i_WiH=0 - i_WG=0 - i_WaH=0 - for ws in wind_speeds: - idlc = DLCInstance(options=options) - idlc.URef = ws - idlc.RandSeed1 = wind_seeds[i_WiSe] - idlc.wave_seed1 = wave_seeds[i_WaSe] - idlc.wind_heading = wind_heading[i_WiH] - idlc.wave_height = wave_Hs[i_Hs] - idlc.wave_period = wave_Tp[i_Tp] - idlc.wave_gamma = wave_gamma[i_WG] - idlc.wave_heading = wave_heading[i_WaH] - idlc.yaw_misalign = yaw_misalign_deg[i_WiSe] - idlc.IEC_WindType = self.wind_speed_class_num + 'ETM' - idlc.turbulent_wind = True - idlc.label = '1.3' - if options['analysis_time'] > 0: - idlc.analysis_time = options['analysis_time'] - if options['transient_time'] >= 0: - idlc.transient_time = options['transient_time'] - self.cases.append(idlc) - if len(wind_seeds)>1: - i_WiSe+=1 - if len(wave_seeds)>1: - i_WaSe+=1 - if len(wind_heading)>1: - i_WiH+=1 - if len(wave_Hs)>1: - i_Hs+=1 - if len(wave_Tp)>1: - i_Tp+=1 - if len(wave_gamma)>1: - i_WG+=1 - if len(wave_heading)>1: - i_WaH+=1 - - def generate_1p4(self, options): + dlc_options['yaw_misalign'] = [0] + + # DLC-specific: define groups + # These options should be the same length and we will generate a matrix of all cases + generic_case_inputs = [] + generic_case_inputs.append(['total_time','transient_time']) # group 0, (usually constants) turbine variables, DT, aero_modeling + generic_case_inputs.append(['wind_speed','wave_height','wave_period', 'wind_seed', 'wave_seed']) # group 1, initial conditions will be added here, define some method that maps wind speed to ICs and add those variables to this group + generic_case_inputs.append(['yaw_misalign']) # group 2 + + self.generate_cases(generic_case_inputs,dlc_options) + + def generate_1p4(self, dlc_options): # Extreme coherent gust with direction change - ultimate loads - wind_speeds, _, wave_seeds, wind_heading, wave_Hs, wave_Tp, wave_gamma, wave_heading, _ = self.get_metocean(options) - directions = ['n', 'p'] - # If the user has not defined Hs and Tp, apply the metocean conditions for the normal sea state - if len(wave_Hs)==0: - wave_Hs = np.interp(wind_speeds, self.mo_ws, self.mo_Hs_NSS) - if len(wave_Tp)==0: - wave_Tp = np.interp(wind_speeds, self.mo_ws, self.mo_Tp_NSS) + + # Get default options + dlc_options.update(self.default_options) + + # Handle DLC Specific options: + dlc_options['label'] = '1.4' + dlc_options['sea_state'] = 'normal' + dlc_options['IEC_WindType'] = 'ECD' + dlc_options['direction'] = ['n', 'p'] + dlc_options['aero_mod'] = 1 # don't use unsteady aero + + dlc_options['azimuth_init'] = np.linspace(0.,120.,dlc_options['n_azimuth'],endpoint=False) + # Set yaw_misalign, else default - if 'yaw_misalign' in options: - yaw_misalign = options['yaw_misalign'] + if 'yaw_misalign' in dlc_options: + dlc_options['yaw_misalign'] = dlc_options['yaw_misalign'] else: # default - yaw_misalign = [0] - yaw_misalign_deg = np.array(yaw_misalign * int(len(wind_speeds) / len(yaw_misalign))) - # Set azimuth start positions, tile so length is same as wind_seeds - azimuth_inits = np.tile( - np.linspace(0.,120.,options['n_azimuth'],endpoint=False), - int(len(wind_speeds)/options['n_azimuth']) - ) - # Counters for wave conditions - i_WaSe=0 - i_Hs=0 - i_Tp=0 - i_WiH=0 - i_WG=0 - i_WaH=0 - for ws in wind_speeds: - for direction in directions: - idlc = DLCInstance(options=options) - idlc.URef = ws - idlc.wave_seed1 = wave_seeds[i_WaSe] - idlc.wind_heading = wind_heading[i_WiH] - idlc.wave_height = wave_Hs[i_Hs] - idlc.wave_period = wave_Tp[i_Tp] - idlc.wave_gamma = wave_gamma[i_WG] - idlc.wave_heading = wave_heading[i_WaH] - idlc.yaw_misalign = yaw_misalign_deg[i_WaSe] - idlc.azimuth_init = azimuth_inits[i_WaSe] - idlc.IEC_WindType = 'ECD' - idlc.turbulent_wind = False - idlc.label = '1.4' - if options['analysis_time'] > 0: - idlc.analysis_time = options['analysis_time'] - if options['transient_time'] >= 0: - idlc.transient_time = options['transient_time'] - idlc.direction_pn = direction - self.cases.append(idlc) - if len(wind_heading)>1: - i_WiH+=1 - if len(wave_gamma)>1: - i_WG+=1 - if len(wave_heading)>1: - i_WaH+=1 - # Same wave height, period, and seed per direction, check whether this is allowed or change seed sampling - if len(wave_Hs)>1: - i_Hs+=1 - if len(wave_Tp)>1: - i_Tp+=1 - if len(wave_seeds)>1: - i_WaSe+=1 - - def generate_1p5(self, options): + dlc_options['yaw_misalign'] = [0]*len(dlc_options['azimuth_init']) + + + # DLC-specific: define groups + # These options should be the same length and we will generate a matrix of all cases + generic_case_inputs = [] + generic_case_inputs.append(['total_time','transient_time','aero_mod']) # group 0, (usually constants) turbine variables, DT, aero_modeling + generic_case_inputs.append(['wind_speed','wave_height','wave_period', 'wind_seed', 'wave_seed']) # group 1, initial conditions will be added here, define some method that maps wind speed to ICs and add those variables to this group + generic_case_inputs.append(['yaw_misalign','azimuth_init']) # group 2: + generic_case_inputs.append(['direction']) # group 3: + + self.generate_cases(generic_case_inputs,dlc_options) + + + def generate_1p5(self, dlc_options): # Extreme wind shear - ultimate loads - wind_speeds, _, wave_seeds, wind_heading, wave_Hs, wave_Tp, wave_gamma, wave_heading, _ = self.get_metocean(options) - # If the user has not defined Hs and Tp, apply the metocean conditions for the normal sea state - if len(wave_Hs)==0: - wave_Hs = np.interp(wind_speeds, self.mo_ws, self.mo_Hs_NSS) - if len(wave_Tp)==0: - wave_Tp = np.interp(wind_speeds, self.mo_ws, self.mo_Tp_NSS) + + # Get default options + dlc_options.update(self.default_options) + + # Handle DLC Specific options: + dlc_options['label'] = '1.5' + dlc_options['sea_state'] = 'normal' + dlc_options['IEC_WindType'] = 'EWS' + dlc_options['direction'] = ['p', 'n'] + dlc_options['shear'] = ['h', 'v'] + + # Set yaw_misalign, else default - if 'yaw_misalign' in options: - yaw_misalign = options['yaw_misalign'] + if 'yaw_misalign' in dlc_options: + dlc_options['yaw_misalign'] = dlc_options['yaw_misalign'] else: # default - yaw_misalign = [0] - yaw_misalign_deg = np.array(yaw_misalign * int(len(wind_speeds) / len(yaw_misalign))) - directions = ['p', 'n'] - shears=['h', 'v'] - # Counters for wave conditions - i_WaSe=0 - i_Hs=0 - i_Tp=0 - i_WiH=0 - i_WG=0 - i_WaH=0 - for ws in wind_speeds: - for direction in directions: - for shear in shears: - idlc = DLCInstance(options=options) - idlc.URef = ws - idlc.wave_seed1 = wave_seeds[i_WaSe] - idlc.wind_heading = wind_heading[i_WiH] - idlc.wave_height = wave_Hs[i_Hs] - idlc.wave_period = wave_Tp[i_Tp] - idlc.wave_gamma = wave_gamma[i_WG] - idlc.wave_heading = wave_heading[i_WaH] - idlc.yaw_misalign = yaw_misalign_deg[i_WaSe] - idlc.IEC_WindType = 'EWS' - idlc.turbulent_wind = False - idlc.label = '1.5' - if options['analysis_time'] > 0: - idlc.analysis_time = options['analysis_time'] - if options['transient_time'] >= 0: - idlc.transient_time = options['transient_time'] - idlc.sigma1 = self.IECturb.NTM(ws) - idlc.direction_pn = direction - idlc.shear_hv = shear - self.cases.append(idlc) - if len(wind_heading)>1: - i_WiH+=1 - if len(wave_gamma)>1: - i_WG+=1 - if len(wave_heading)>1: - i_WaH+=1 - # Same wave height, period, and seed per direction, check whether this is allowed or change seed sampling - if len(wave_seeds)>1: - i_WaSe+=1 - if len(wave_Hs)>1: - i_Hs+=1 - if len(wave_Tp)>1: - i_Tp+=1 - - def generate_1p6(self, options): + dlc_options['yaw_misalign'] = [0] + + # DLC-specific: define groups + # These options should be the same length and we will generate a matrix of all cases + generic_case_inputs = [] + generic_case_inputs.append(['total_time','transient_time']) # group 0, (usually constants) turbine variables, DT, aero_modeling + generic_case_inputs.append(['wind_speed','wave_height','wave_period', 'wind_seed', 'wave_seed']) # group 1, initial conditions will be added here, define some method that maps wind speed to ICs and add those variables to this group + generic_case_inputs.append(['yaw_misalign']) # group 2: + generic_case_inputs.append(['direction']) # group 3: + generic_case_inputs.append(['shear']) # group 4: + + self.generate_cases(generic_case_inputs,dlc_options) + + def generate_1p6(self, dlc_options): # Power production normal turbulence model - severe sea state - wind_speeds, wind_seeds, wave_seeds, wind_heading, wave_Hs, wave_Tp, wave_gamma, wave_heading, _ = self.get_metocean(options) - # If the user has not defined Hs and Tp, apply the metocean conditions for the severe sea state - if len(wave_Hs)==0: - wave_Hs = np.interp(wind_speeds, self.mo_ws, self.mo_Hs_SSS) - if len(wave_Tp)==0: - wave_Tp = np.interp(wind_speeds, self.mo_ws, self.mo_Tp_SSS) + + # Get default options + dlc_options.update(self.default_options) + + # DLC Specific options: + dlc_options['label'] = '1.6' + dlc_options['sea_state'] = 'severe' + dlc_options['IEC_WindType'] = 'NTM' + # Set yaw_misalign, else default - if 'yaw_misalign' in options: - yaw_misalign = options['yaw_misalign'] + if 'yaw_misalign' in dlc_options: + dlc_options['yaw_misalign'] = dlc_options['yaw_misalign'] else: # default - yaw_misalign = [0] - yaw_misalign_deg = np.array(yaw_misalign * int(len(wind_speeds) / len(yaw_misalign))) - # Counter for wind seed - i_WiSe=0 - # Counters for wave conditions - i_WaSe=0 - i_Hs=0 - i_Tp=0 - i_WiH=0 - i_WG=0 - i_WaH=0 - for ws in wind_speeds: - idlc = DLCInstance(options=options) - idlc.URef = ws - idlc.RandSeed1 = wind_seeds[i_WiSe] - idlc.wave_seed1 = wave_seeds[i_WaSe] - idlc.wind_heading = wind_heading[i_WiH] - idlc.wave_height = wave_Hs[i_Hs] - idlc.wave_period = wave_Tp[i_Tp] - idlc.wave_gamma = wave_gamma[i_WG] - idlc.wave_heading = wave_heading[i_WaH] - idlc.yaw_misalign = yaw_misalign_deg[i_WiSe] - idlc.turbulent_wind = True - idlc.label = '1.6' - if options['analysis_time'] > 0: - idlc.analysis_time = options['analysis_time'] - if options['transient_time'] >= 0: - idlc.transient_time = options['transient_time'] - self.cases.append(idlc) - if len(wind_seeds)>1: - i_WiSe+=1 - if len(wave_seeds)>1: - i_WaSe+=1 - if len(wind_heading)>1: - i_WiH+=1 - if len(wave_Hs)>1: - i_Hs+=1 - if len(wave_Tp)>1: - i_Tp+=1 - if len(wave_gamma)>1: - i_WG+=1 - if len(wave_heading)>1: - i_WaH+=1 - - def generate_5p1(self, options): - # Power production normal turbulence model - severe sea state - wind_speeds, wind_seeds, wave_seeds, wind_heading, wave_Hs, wave_Tp, wave_gamma, wave_heading, _ = self.get_metocean(options) - # If the user has not defined Hs and Tp, apply the metocean conditions for the normal sea state - if len(wave_Hs)==0: - wave_Hs = np.interp(wind_speeds, self.mo_ws, self.mo_Hs_NSS) - if len(wave_Tp)==0: - wave_Tp = np.interp(wind_speeds, self.mo_ws, self.mo_Tp_NSS) - # Set azimuth start positions, tile so length is same as wind_seeds - azimuth_inits = np.tile( - np.linspace(0.,120.,options['n_azimuth'],endpoint=False), - int(len(wind_seeds)/options['n_azimuth']) - ) - # Counter for wind seed - i_WiSe=0 - # Counters for wave conditions - i_WaSe=0 - i_Hs=0 - i_Tp=0 - i_WiH=0 - i_WG=0 - i_WaH=0 - for ws in wind_speeds: - idlc = DLCInstance(options=options) - idlc.URef = ws - idlc.RandSeed1 = wind_seeds[i_WiSe] - idlc.wave_seed1 = wave_seeds[i_WaSe] - idlc.wind_heading = wind_heading[i_WiH] - idlc.wave_height = wave_Hs[i_Hs] - idlc.wave_period = wave_Tp[i_Tp] - idlc.wave_gamma = wave_gamma[i_WG] - idlc.wave_heading = wave_heading[i_WaH] - idlc.azimuth_init = azimuth_inits[i_WiSe] - idlc.turbulent_wind = True - idlc.label = '5.1' - idlc.turbine_status = 'operating-shutdown' - if options['analysis_time'] > 0: - idlc.analysis_time = options['analysis_time'] - if options['transient_time'] >= 0: - idlc.transient_time = options['transient_time'] - if options['shutdown_time'] > options['analysis_time']: - raise Exception(f"DLC 5.1 was selected, but the shutdown_time ({options['shutdown_time']}) option is greater than the analysis_time ({options['analysis_time']})") - else: - idlc.shutdown_time = options['shutdown_time'] - self.cases.append(idlc) - if len(wind_seeds)>1: - i_WiSe+=1 - if len(wave_seeds)>1: - i_WaSe+=1 - if len(wind_heading)>1: - i_WiH+=1 - if len(wave_Hs)>1: - i_Hs+=1 - if len(wave_Tp)>1: - i_Tp+=1 - if len(wave_gamma)>1: - i_WG+=1 - if len(wave_heading)>1: - i_WaH+=1 - - def generate_6p1(self, options): + dlc_options['yaw_misalign'] = [0] + + # DLC-specific: define groups + # These options should be the same length and we will generate a matrix of all cases + generic_case_inputs = [] + generic_case_inputs.append(['total_time','transient_time','wake_mod','wave_model']) # group 0, (usually constants) turbine variables, DT, aero_modeling + generic_case_inputs.append(['wind_speed','wave_height','wave_period', 'wind_seed', 'wave_seed']) # group 1, initial conditions will be added here, define some method that maps wind speed to ICs and add those variables to this group + generic_case_inputs.append(['yaw_misalign']) # group 2 + + self.generate_cases(generic_case_inputs,dlc_options) + + def generate_2p1(self, dlc_options): + # Power production plus loss of electrical network + + # Get default options + dlc_options.update(self.default_options) + + # DLC Specific options: + dlc_options['label'] = '2.1' + dlc_options['sea_state'] = 'normal' + dlc_options['IEC_WindType'] = 'NTM' + dlc_options['PSF'] = 1.35 # For fault cases, psf depends on the mean-time between faults + + if 'genfault_time' not in dlc_options: + raise Exception('genfault_time must be set for the DLC 2.1') + + # azimuth starting positions + dlc_options['azimuth_init'] = np.linspace(0.,120.,dlc_options['n_azimuth'],endpoint=False) + + # DLC-specific: define groups + # These options should be the same length and we will generate a matrix of all cases + generic_case_inputs = [] + + generic_case_inputs.append(['total_time','transient_time','wake_mod','wave_model','genfault_time']) # group 0, (usually constants) turbine variables, DT, aero_modeling + generic_case_inputs.append(['wind_speed','wave_height','wave_period', 'wind_seed', 'wave_seed']) # group 1, initial conditions will be added here, define some method that maps wind speed to ICs and add those variables to this group + generic_case_inputs.append(['azimuth_init']) # group 2 + + self.generate_cases(generic_case_inputs,dlc_options) + + def generate_2p2(self, dlc_options): + # Power production plus occurrence of fault + + # Get default options + dlc_options.update(self.default_options) + + # DLC Specific options: + dlc_options['label'] = '2.2' + dlc_options['sea_state'] = 'normal' + dlc_options['IEC_WindType'] = 'NTM' + dlc_options['PSF'] = 1.35 # For fault cases, psf depends on the mean-time between faults + + # azimuth starting positions + dlc_options['azimuth_init'] = np.linspace(0.,120.,dlc_options['n_azimuth'],endpoint=False) + + + # DLC-specific: define groups + # These options should be the same length and we will generate a matrix of all cases + generic_case_inputs = [] + group0 = ['total_time','transient_time','wake_mod','wave_model'] + + AnyFault = False + if 'pitchfault_time1' in dlc_options: + group0.extend(['pitchfault_time1','pitchfault_blade1pos']) + AnyFault = True + if 'pitchfault_time2' in dlc_options: + group0.extend(['pitchfault_time2','pitchfault_blade2pos']) + AnyFault = True + if 'pitchfault_time3' in dlc_options: + group0.extend(['pitchfault_time3','pitchfault_blade3pos']) + AnyFault = True + if 'yawfault_time' in dlc_options: + group0.extend(['yawfault_time','yawfault_yawpos']) + AnyFault = True + + if not AnyFault: + raise Exception('yawfault or pitchfault for at least one blade must be set for dlc 2.2') + + generic_case_inputs.append(group0) # group 0, (usually constants) turbine variables, DT, aero_modeling + generic_case_inputs.append(['wind_speed','wave_height','wave_period', 'wind_seed', 'wave_seed']) # group 1, initial conditions will be added here, define some method that maps wind speed to ICs and add those variables to this group + generic_case_inputs.append(['azimuth_init']) # group 2 + + self.generate_cases(generic_case_inputs,dlc_options) + + def generate_2p3(self, dlc_options): + # Power production plus occurrence of fault + # Normal control system fault + + # Get default options + dlc_options.update(self.default_options) + + # DLC Specific options: + dlc_options['label'] = '2.3' + dlc_options['sea_state'] = 'normal' + dlc_options['IEC_WindType'] = 'EOG' + dlc_options['PSF'] = 1.1 # For fault cases, psf depends on the mean-time between faults + + if 'genfault_time' not in dlc_options: + raise Exception('genfault_time must be set for the DLC 2.3') + + # azimuth starting positions + dlc_options['azimuth_init'] = np.linspace(0.,120.,dlc_options['n_azimuth'],endpoint=False) + + # DLC-specific: define groups + # These options should be the same length and we will generate a matrix of all cases + generic_case_inputs = [] + + generic_case_inputs.append(['total_time','transient_time','wake_mod','wave_model','genfault_time']) # group 0, (usually constants) turbine variables, DT, aero_modeling + generic_case_inputs.append(['wind_speed','wave_height','wave_period', 'wind_seed', 'wave_seed']) # group 1, initial conditions will be added here, define some method that maps wind speed to ICs and add those variables to this group + generic_case_inputs.append(['azimuth_init']) # group 2 + + self.generate_cases(generic_case_inputs,dlc_options) + + def generate_3p1(self, dlc_options): + # Start up - normal wind - fatigue + # + + # Get default options + dlc_options.update(self.default_options) + + # DLC Specific options: + dlc_options['label'] = '3.1' + dlc_options['sea_state'] = 'normal' + dlc_options['IEC_WindType'] = 'NTM' + dlc_options['pitch_initial'] = 90. + dlc_options['turbine_status'] = 'parked-idling' # initial turbine status is what matters here + + # Specify startup time for this case + if dlc_options['startup_time'] > dlc_options['analysis_time']: + raise Exception(f"DLC 3.1 was selected, but the startup_time ({dlc_options['startup_time']}) option is greater than the analysis_time ({dlc_options['analysis_time']})") + else: + dlc_options['startup_time'] = dlc_options['startup_time'] + + # DLC-specific: define groups + # These options should be the same length and we will generate a matrix of all cases + generic_case_inputs = [] + generic_case_inputs.append(['total_time','transient_time','startup_time','wake_mod','wave_model','pitch_initial']) # group 0, (usually constants) turbine variables, DT, aero_modeling + generic_case_inputs.append(['wind_speed','wave_height','wave_period', 'wind_seed', 'wave_seed']) # group 1, initial conditions will be added here, define some method that maps wind speed to ICs and add those variables to this group + # generic_case_inputs.append(['azimuth_init']) # group 2 + + self.generate_cases(generic_case_inputs,dlc_options) + + + def generate_5p1(self, dlc_options): + # Power production normal turbulence model - shutdown with varous azimuth initial conditions + # + + # Get default options + dlc_options.update(self.default_options) + + # DLC Specific options: + dlc_options['label'] = '5.1' + dlc_options['sea_state'] = 'normal' + dlc_options['IEC_WindType'] = 'NTM' + dlc_options['final_blade_pitch'] = 90. + + # Time options, set defaults if not provided + if dlc_options['analysis_time'] == self.dlc_schema['analysis_time']['default']: + dlc_options['analysis_time'] = 600 + + if dlc_options['shutdown_time'] == self.dlc_schema['shutdown_time']['default']: + dlc_options['shutdown_time'] = 300 + + + # azimuth starting positions + dlc_options['azimuth_init'] = np.linspace(0.,120.,dlc_options['n_azimuth'],endpoint=False) + + # Specify shutdown time for this case + if dlc_options['shutdown_time'] > dlc_options['analysis_time']: + raise Exception(f"DLC 5.1 was selected, but the shutdown_time ({dlc_options['shutdown_time']}) option is greater than the analysis_time ({dlc_options['analysis_time']})") + else: + dlc_options['shutdown_time'] = dlc_options['shutdown_time'] + + # DLC-specific: define groups + # These options should be the same length and we will generate a matrix of all cases + generic_case_inputs = [] + generic_case_inputs.append(['total_time','transient_time','shutdown_time','wake_mod','wave_model','final_blade_pitch']) # group 0, (usually constants) turbine variables, DT, aero_modeling + generic_case_inputs.append(['wind_speed','wave_height','wave_period', 'wind_seed', 'wave_seed']) # group 1, initial conditions will be added here, define some method that maps wind speed to ICs and add those variables to this group + generic_case_inputs.append(['azimuth_init']) # group 2 + + self.generate_cases(generic_case_inputs,dlc_options) + + + def generate_6p1(self, dlc_options): # Parked (standing still or idling) - extreme wind model 50-year return period - ultimate loads - options['wind_speed'] = [50,50] # set dummy, so wind seeds are correct - _, wind_seeds, wave_seeds, wind_heading, wave_Hs, wave_Tp, wave_gamma, wave_heading, _ = self.get_metocean(options) - # Set yaw_misalign, else default - if 'yaw_misalign' in options: - yaw_misalign = options['yaw_misalign'] + # extra dlc_options: + # yaw_misalign: default = [-8,8] + + # Get default options + dlc_options.update(self.default_options) + + # DLC Specific options: + dlc_options['label'] = '6.1' + dlc_options['sea_state'] = '50-year' + dlc_options['IEC_WindType'] = self.wind_speed_class_num + 'EWM50' + + # yaw_misalign + if 'yaw_misalign' not in dlc_options: + dlc_options['yaw_misalign'] = [-8,8] + + if not dlc_options['wind_speed']: + dlc_options['wind_speed'] = [self.V_e50] + + # parked options + dlc_options['turbine_status'] = 'parked-idling' + dlc_options['wake_mod'] = 0 + dlc_options['pitch_initial'] = 90. + dlc_options['rot_speed_initial'] = 0. + dlc_options['shutdown_time'] = 0. + dlc_options['final_blade_pitch'] = 90. + + + # DLC-specific: define groups + # These options should be the same length and we will generate a matrix of all cases + generic_case_inputs = [] + generic_case_inputs.append(['total_time','transient_time','wake_mod','wave_model','pitch_initial', + 'rot_speed_initial','shutdown_time','final_blade_pitch']) # group 0, (usually constants) turbine variables, DT, aero_modeling + generic_case_inputs.append(['wind_speed','wave_height','wave_period', 'wind_seed', 'wave_seed']) # group 1, initial conditions will be added here, define some method that maps wind speed to ICs and add those variables to this group + generic_case_inputs.append(['yaw_misalign']) # group 2 + + self.generate_cases(generic_case_inputs,dlc_options) + + def generate_6p2(self, dlc_options): + # Parked (standing still or idling) - extreme wind model 50-year return period - ultimate loads + # This is the same as DLC 6.1 in the 61400-3-1 standards, except there's a loss of electrical network. + # In DLC 6.1, the generator is disabled already, so the only difference in 6.2 may be that users may want to simulate larger yaw misalignments + # extra dlc_options: + # yaw_misalign: default = [-180 to 180] + + # Get default options + dlc_options.update(self.default_options) + + # DLC Specific options: + dlc_options['label'] = '6.2' + dlc_options['sea_state'] = '50-year' + dlc_options['IEC_WindType'] = self.wind_speed_class_num + 'EWM50' + dlc_options['PSF'] = 1.1 + + # yaw_misalign + if 'yaw_misalign' not in dlc_options: + dlc_options['yaw_misalign'] = np.arange(-180+15,180+15,15).tolist() # -180 is not valid in OF + + if not dlc_options['wind_speed']: + dlc_options['wind_speed'] = [self.V_e50] + + # parked options + dlc_options['turbine_status'] = 'parked-idling' + dlc_options['wake_mod'] = 0 + dlc_options['pitch_initial'] = 90. + dlc_options['rot_speed_initial'] = 0. + dlc_options['shutdown_time'] = 0. + dlc_options['final_blade_pitch'] = 90. + + + # DLC-specific: define groups + # These options should be the same length and we will generate a matrix of all cases + generic_case_inputs = [] + generic_case_inputs.append(['total_time','transient_time','wake_mod','wave_model','pitch_initial', + 'rot_speed_initial','shutdown_time','final_blade_pitch']) # group 0, (usually constants) turbine variables, DT, aero_modeling + generic_case_inputs.append(['wind_speed','wave_height','wave_period', 'wind_seed', 'wave_seed']) # group 1, initial conditions will be added here, define some method that maps wind speed to ICs and add those variables to this group + generic_case_inputs.append(['yaw_misalign']) # group 2 + + self.generate_cases(generic_case_inputs,dlc_options) + + + def generate_6p3(self, dlc_options): + # Parked (standing still or idling) - extreme wind model 1-year return period - ultimate loads, usually larger (20 deg) yaw offset + + # Get default options + dlc_options.update(self.default_options) + + # Set DLC Specific options: + # These three are required + dlc_options['label'] = '6.3' + dlc_options['sea_state'] = '1-year' + dlc_options['IEC_WindType'] = self.wind_speed_class_num + 'EWM1' + + # Set dlc-specific options, like yaw_misalign, initial azimuth + if 'yaw_misalign' in dlc_options: + dlc_options['yaw_misalign'] = dlc_options['yaw_misalign'] else: # default - yaw_misalign = [-8., 8.] - yaw_misalign_deg = np.array(yaw_misalign * options['n_seeds']) - if len(wave_Hs)==0: - wave_Hs = self.wave_Hs50 - if len(wave_Tp)==0: - wave_Tp = self.wave_Tp50 - # Counter for wind seed - i_WiSe=0 - # Counters for wave conditions - i_WaSe=0 - i_Hs=0 - i_Tp=0 - i_WiH=0 - i_WG=0 - i_WaH=0 - for yaw_ms in yaw_misalign_deg: - idlc = DLCInstance(options=options) - if idlc.URef < 0: # default is -1, this allows us to set custom V_50 - idlc.URef = self.V_e50 - idlc.yaw_misalign = yaw_ms - idlc.RandSeed1 = wind_seeds[i_WiSe] - idlc.wave_seed1 = wave_seeds[i_WaSe] - idlc.wind_heading = wind_heading[i_WiH] - idlc.wave_height = wave_Hs[i_Hs] - idlc.wave_period = wave_Tp[i_Tp] - idlc.wave_gamma = wave_gamma[i_WG] - idlc.wave_heading = wave_heading[i_WaH] - idlc.IEC_WindType = self.wind_speed_class_num + 'EWM50' - idlc.turbulent_wind = True - if idlc.turbine_status == 'operating': - idlc.turbine_status = 'parked-still' - idlc.label = '6.1' - if options['analysis_time'] > 0: - idlc.analysis_time = options['analysis_time'] - if options['transient_time'] >= 0: - idlc.transient_time = options['transient_time'] - self.cases.append(idlc) - if len(wind_seeds)>1: - i_WiSe+=1 - if len(wave_seeds)>1: - i_WaSe+=1 - if len(wind_heading)>1: - i_WiH+=1 - if len(wave_Hs)>1: - i_Hs+=1 - if len(wave_Tp)>1: - i_Tp+=1 - if len(wave_gamma)>1: - i_WG+=1 - if len(wave_heading)>1: - i_WaH+=1 - - def generate_6p3(self, options): - # Parked (standing still or idling) - extreme wind model 1-year return period - ultimate loads - options['wind_speed'] = [50,50] # set dummy, so wind seeds are correct - _, wind_seeds, wave_seeds, wind_heading, wave_Hs, wave_Tp, wave_gamma, wave_heading, _ = self.get_metocean(options) - # Set yaw_misalign, else default - if 'yaw_misalign' in options: - yaw_misalign = options['yaw_misalign'] + dlc_options['yaw_misalign'] = [-20.,20.] + + if not dlc_options['wind_speed']: + dlc_options['wind_speed'] = [self.V_e1] + + # parked options + dlc_options['turbine_status'] = 'parked-idling' + dlc_options['wake_mod'] = 0 + dlc_options['pitch_initial'] = 90. + dlc_options['rot_speed_initial'] = 0. + dlc_options['shutdown_time'] = 0. + dlc_options['final_blade_pitch'] = 90. + + # DLC-specific: define groups + # Groups are dependent variables, the cases are a cross product of the independent groups + # The options in each group should have the same length + generic_case_inputs = [] + generic_case_inputs.append(['total_time','transient_time','wake_mod','wave_model','pitch_initial', + 'rot_speed_initial','shutdown_time','final_blade_pitch']) # group 0, (usually constants) turbine variables, DT, aero_modeling + generic_case_inputs.append(['wind_speed','wave_height','wave_period', 'wind_seed', 'wave_seed']) # group 1, initial conditions will be added here, define some method that maps wind speed to ICs and add those variables to this group + generic_case_inputs.append(['yaw_misalign']) # group 2 + + # This function does the rest and generates the individual cases for each DLC + self.generate_cases(generic_case_inputs,dlc_options) + + + def generate_6p4(self, dlc_options): + # Parked (standing still or idling) - normal turbulence model - fatigue loads + + # Get default options + dlc_options.update(self.default_options) + + # Set DLC Specific options: + # These three are required + dlc_options['label'] = '6.4' + dlc_options['sea_state'] = 'normal' + dlc_options['IEC_WindType'] = 'NTM' + # Set wind speeds to DLC spec if not defined by the user + if len(dlc_options['wind_speed']) == 0: + dlc_options['wind_speed'] = np.arange(self.ws_cut_in, 0.7 * self.V_ref, dlc_options['ws_bin_size']) + # Include V_ref + if dlc_options['wind_speed'][-1] != self.V_ref: + dlc_options['wind_speed'] = np.append(dlc_options['wind_speed'], self.V_ref) + dlc_options['wind_speed'] = dlc_options['wind_speed'].tolist() + + # Set dlc-specific options, like yaw_misalign, initial azimuth + if 'yaw_misalign' in dlc_options: + dlc_options['yaw_misalign'] = dlc_options['yaw_misalign'] else: # default - yaw_misalign = [-20., 20.] - yaw_misalign_deg = np.array(yaw_misalign * options['n_seeds']) - if len(wave_Hs)==0: - wave_Hs = self.wave_Hs1 - if len(wave_Tp)==0: - wave_Tp = self.wave_Tp1 - # Counter for wind seed - i_WiSe=0 - # Counters for wave conditions - i_WaSe=0 - i_Hs=0 - i_Tp=0 - i_WiH=0 - i_WG=0 - i_WaH=0 - for yaw_ms in yaw_misalign_deg: - idlc = DLCInstance(options=options) - if idlc.URef < 0: # default is -1, this allows us to set custom V_50 - idlc.URef = self.V_e1 - idlc.yaw_misalign = yaw_ms - idlc.RandSeed1 = wind_seeds[i_WiSe] - idlc.wave_seed1 = wave_seeds[i_WaSe] - idlc.wind_heading = wind_heading[i_WiH] - idlc.wave_height = wave_Hs[i_Hs] - idlc.wave_period = wave_Tp[i_Tp] - idlc.wave_gamma = wave_gamma[i_WG] - idlc.wave_heading = wave_heading[i_WaH] - idlc.IEC_WindType = self.wind_speed_class_num + 'EWM1' - idlc.turbulent_wind = True - if idlc.turbine_status == 'operating': - idlc.turbine_status = 'parked-still' - idlc.label = '6.3' - if options['analysis_time'] > 0: - idlc.analysis_time = options['analysis_time'] - if options['transient_time'] >= 0: - idlc.transient_time = options['transient_time'] - self.cases.append(idlc) - if len(wind_seeds)>1: - i_WiSe+=1 - if len(wave_seeds)>1: - i_WaSe+=1 - if len(wind_heading)>1: - i_WiH+=1 - if len(wave_Hs)>1: - i_Hs+=1 - if len(wave_Tp)>1: - i_Tp+=1 - if len(wave_gamma)>1: - i_WG+=1 - if len(wave_heading)>1: - i_WaH+=1 - - def generate_6p4(self, options): + dlc_options['yaw_misalign'] = [0.] + + # parked options + dlc_options['turbine_status'] = 'parked-idling' + dlc_options['wake_mod'] = 0 + dlc_options['pitch_initial'] = 90. + dlc_options['rot_speed_initial'] = 0. + dlc_options['shutdown_time'] = 0. + dlc_options['final_blade_pitch'] = 90. + + # DLC-specific: define groups + # Groups are dependent variables, the cases are a cross product of the independent groups + # The options in each group should have the same length + generic_case_inputs = [] + generic_case_inputs.append(['total_time','transient_time','wake_mod','wave_model','pitch_initial', + 'rot_speed_initial','shutdown_time','final_blade_pitch']) # group 0, (usually constants) turbine variables, DT, aero_modeling + generic_case_inputs.append(['wind_speed','wave_height','wave_period', 'wind_seed', 'wave_seed']) # group 1, initial conditions will be added here, define some method that maps wind speed to ICs and add those variables to this group + generic_case_inputs.append(['yaw_misalign']) # group 2 + + # This function does the rest and generates the individual cases for each DLC + self.generate_cases(generic_case_inputs,dlc_options) + + def generate_7p1(self, dlc_options): + # Parked (standing still or idling) - extreme wind model 1-year return period - ultimate loads, usually larger (20 deg) yaw offset + + # Get default options + dlc_options.update(self.default_options) + + # Set DLC Specific options: + # These three are required + dlc_options['label'] = '7.1' + dlc_options['sea_state'] = '1-year' + dlc_options['IEC_WindType'] = self.wind_speed_class_num + 'EWM1' + dlc_options['PSF'] = 1.1 + + # Set dlc-specific options, like yaw_misalign, initial azimuth + if 'yaw_misalign' in dlc_options: + dlc_options['yaw_misalign'] = dlc_options['yaw_misalign'] + else: # default + dlc_options['yaw_misalign'] = [0.] # default + + if not dlc_options['wind_speed']: + dlc_options['wind_speed'] = [self.V_e1] + + # parked options + dlc_options['turbine_status'] = 'parked-idling' + dlc_options['wake_mod'] = 0 + dlc_options['pitch_initial'] = 90. + dlc_options['rot_speed_initial'] = 0. + dlc_options['shutdown_time'] = 0. + dlc_options['final_blade_pitch'] = 90. + + # DLC-specific: define groups + # Groups are dependent variables, the cases are a cross product of the independent groups + # The options in each group should have the same length + generic_case_inputs = [] + + group0 = ['total_time','transient_time','wake_mod','wave_model','pitch_initial', + 'rot_speed_initial','shutdown_time','final_blade_pitch'] # group 0, (usually constants) turbine variables, DT, aero_modeling + + if 'pitchfault_time1' in dlc_options: + group0.extend(['pitchfault_time1','pitchfault_blade1pos']) + if 'pitchfault_time2' in dlc_options: + group0.extend(['pitchfault_time2','pitchfault_blade2pos']) + if 'pitchfault_time3' in dlc_options: + group0.extend(['pitchfault_time3','pitchfault_blade3pos']) + if 'yawfault_time' in dlc_options: + group0.extend(['yawfault_time','yawfault_yawpos']) + if 'genfault_time' in dlc_options: + group0.extend(['genfault_time']) + + generic_case_inputs.append(group0) + generic_case_inputs.append(['wind_speed','wave_height','wave_period', 'wind_seed', 'wave_seed']) # group 1, initial conditions will be added here, define some method that maps wind speed to ICs and add those variables to this group + generic_case_inputs.append(['yaw_misalign']) # group 2 + + # This function does the rest and generates the individual cases for each DLC + self.generate_cases(generic_case_inputs,dlc_options) + + def generate_7p2(self, dlc_options): # Parked (standing still or idling) - normal turbulence model - fatigue loads - wind_speeds = np.arange(self.ws_cut_in, 0.7 * self.V_ref, options['ws_bin_size']) - if wind_speeds[-1] != self.V_ref: - wind_speeds = np.append(wind_speeds, self.V_ref) - wind_speeds, wind_seeds = self.get_wind_seeds(options, wind_speeds) - wind_speeds = np.repeat(wind_speeds, options['n_seeds']) - wave_seeds = self.get_wave_seeds(options, wind_speeds) - _, _, _, wind_heading, wave_Hs, wave_Tp, wave_gamma, wave_heading, _ = self.get_metocean(options) - # If the user has not defined Hs and Tp, apply the metocean conditions for the normal sea state - if len(wave_Hs)==0: - wave_Hs = np.interp(wind_speeds, self.mo_ws, self.mo_Hs_NSS) - if len(wave_Tp)==0: - wave_Tp = np.interp(wind_speeds, self.mo_ws, self.mo_Tp_NSS) - # Counter for wind seed - i_WiSe=0 - # Counters for wave conditions - i_WaSe=0 - i_Hs=0 - i_Tp=0 - i_WiH=0 - i_WG=0 - i_WaH=0 - for ws in wind_speeds: - idlc = DLCInstance(options=options) - idlc.URef = ws - idlc.RandSeed1 = wind_seeds[i_WiSe] - idlc.wave_seed1 = wave_seeds[i_WaSe] - idlc.wind_heading = wind_heading[i_WiH] - idlc.wave_height = wave_Hs[i_Hs] - idlc.wave_period = wave_Tp[i_Tp] - idlc.wave_gamma = wave_gamma[i_WG] - idlc.wave_heading = wave_heading[i_WaH] - idlc.turbulent_wind = True - if idlc.turbine_status == 'operating': - idlc.turbine_status = 'parked-still' - idlc.label = '6.4' - if options['analysis_time'] > 0: - idlc.analysis_time = options['analysis_time'] - if options['transient_time'] >= 0: - idlc.transient_time = options['transient_time'] - self.cases.append(idlc) - if len(wind_seeds)>1: - i_WiSe+=1 - if len(wave_seeds)>1: - i_WaSe+=1 - if len(wind_heading)>1: - i_WiH+=1 - if len(wave_Hs)>1: - i_Hs+=1 - if len(wave_Tp)>1: - i_Tp+=1 - if len(wave_gamma)>1: - i_WG+=1 - if len(wave_heading)>1: - i_WaH+=1 - - def generate_6p5(self, options): - # Parked (standing still or idling) - extreme wind model 500-year return period - ultimate loads - options['wind_speed'] = [50,50] # set dummy, so wind seeds are correct - _, wind_seeds, wave_seeds, wind_heading, wave_Hs, wave_Tp, wave_gamma, wave_heading, _ = self.get_metocean(options) - # Set yaw_misalign, else default - if 'yaw_misalign' in options: - yaw_misalign = options['yaw_misalign'] + + # Get default options + dlc_options.update(self.default_options) + + # Set DLC Specific options: + # These three are required + dlc_options['label'] = '7.2' + dlc_options['sea_state'] = 'normal' + dlc_options['IEC_WindType'] = 'NTM' + + # Set wind speeds to DLC spec if not defined by the user + if len(dlc_options['wind_speed']) == 0: + dlc_options['wind_speed'] = np.arange(0,self.ws_cut_out, dlc_options['ws_bin_size']) + dlc_options['wind_speed'] = dlc_options['wind_speed'].tolist() + + # Set dlc-specific options, like yaw_misalign, initial azimuth + if 'yaw_misalign' in dlc_options: + dlc_options['yaw_misalign'] = dlc_options['yaw_misalign'] else: # default - yaw_misalign = [-8., 8.] - yaw_misalign_deg = np.array(yaw_misalign * options['n_seeds']) - if len(wave_Hs)==0: - wave_Hs = self.wave_Hs1 - if len(wave_Tp)==0: - wave_Tp = self.wave_Tp1 - # Counter for wind seed - i_WiSe=0 - # Counters for wave conditions - i_WaSe=0 - i_Hs=0 - i_Tp=0 - i_WiH=0 - i_WG=0 - i_WaH=0 - for yaw_ms in yaw_misalign_deg: - idlc = DLCInstance(options=options) - if idlc.URef < 0: # default is -1, this allows us to set custom V_50 - idlc.URef = self.V_e50 * 1.125 - idlc.yaw_misalign = yaw_ms - idlc.RandSeed1 = wind_seeds[i_WiSe] - idlc.wave_seed1 = wave_seeds[i_WaSe] - idlc.wind_heading = wind_heading[i_WiH] - idlc.wave_height = wave_Hs[i_Hs] - idlc.wave_period = wave_Tp[i_Tp] - idlc.wave_gamma = wave_gamma[i_WG] - idlc.wave_heading = wave_heading[i_WaH] - idlc.IEC_WindType = self.wind_speed_class_num + 'EWM1' - idlc.turbulent_wind = True - if idlc.turbine_status == 'operating': - idlc.turbine_status = 'parked-still' - idlc.label = '6.5' - if options['analysis_time'] > 0: - idlc.analysis_time = options['analysis_time'] - if options['transient_time'] >= 0: - idlc.transient_time = options['transient_time'] - self.cases.append(idlc) - if len(wind_seeds)>1: - i_WiSe+=1 - if len(wave_seeds)>1: - i_WaSe+=1 - if len(wind_heading)>1: - i_WiH+=1 - if len(wave_Hs)>1: - i_Hs+=1 - if len(wave_Tp)>1: - i_Tp+=1 - if len(wave_gamma)>1: - i_WG+=1 - if len(wave_heading)>1: - i_WaH+=1 + dlc_options['yaw_misalign'] = [0.] + + # parked options + dlc_options['turbine_status'] = 'parked-idling' + dlc_options['wake_mod'] = 0 + dlc_options['pitch_initial'] = 90. + dlc_options['rot_speed_initial'] = 0. + dlc_options['shutdown_time'] = 0. + dlc_options['final_blade_pitch'] = 90. + + # DLC-specific: define groups + # Groups are dependent variables, the cases are a cross product of the independent groups + # The options in each group should have the same length + generic_case_inputs = [] + generic_case_inputs.append(['total_time','transient_time','wake_mod','wave_model','pitch_initial', + 'rot_speed_initial','shutdown_time','final_blade_pitch']) # group 0, (usually constants) turbine variables, DT, aero_modeling + generic_case_inputs.append(['wind_speed','wave_height','wave_period', 'wind_seed', 'wave_seed']) # group 1, initial conditions will be added here, define some method that maps wind speed to ICs and add those variables to this group + generic_case_inputs.append(['yaw_misalign']) # group 2 + + # This function does the rest and generates the individual cases for each DLC + self.generate_cases(generic_case_inputs,dlc_options) + + def generate_new_dlc(self,dlc_options): + # Describe the new design load case + + # Get default options + dlc_options.update(self.default_options) + + # Set DLC Specific options: + # These three are required + dlc_options['label'] = '1.6' + dlc_options['sea_state'] = 'severe' + dlc_options['IEC_WindType'] = 'NTM' + + # Set dlc-specific options, like yaw_misalign, initial azimuth + if 'yaw_misalign' in dlc_options: + dlc_options['yaw_misalign'] = dlc_options['yaw_misalign'] + else: # default + dlc_options['yaw_misalign'] = [0] + + # DLC-specific: define groups + # Groups are dependent variables, the cases are a cross product of the independent groups + # The options in each group should have the same length + generic_case_inputs = [] + generic_case_inputs.append(['total_time','transient_time','wake_mod','wave_model']) # group 0, (usually constants) turbine variables, DT, aero_modeling + generic_case_inputs.append(['wind_speed','wave_height','wave_period', 'wind_seed', 'wave_seed']) # group 1, initial conditions will be added here, define some method that maps wind speed to ICs and add those variables to this group + generic_case_inputs.append(['yaw_misalign']) # group 2 + + # This function does the rest and generates the individual cases for each DLC + self.generate_cases(generic_case_inputs,dlc_options) + +def make_equal_length(option_dict,target_name): + ''' + This function will set the length of all the option_dicts to that of option_dict[target_name] if it's a scalar + ''' + target_len = len(option_dict[target_name]) + for key in option_dict: + if len(option_dict[key]) == 1: + if isinstance(option_dict[key], np.ndarray): + option_dict[key] = np.tile(option_dict[key],target_len) + elif isinstance(option_dict[key], list): + option_dict[key] = option_dict[key] * target_len + else: + raise Exception(f'Cannot coerce {key} into an array with same length as wind_speed') + + # re-normalize probabilities + if key == 'probabilities': + option_dict['probabilities'] /= target_len + + +def combine_options(*dicts): + """ + Combine option dictionarys and do standard processing, + like removing numpy and turning everything into lists for case_inputs - def generate_12p1(self, options): - # Pass through uniform wind input - wind_speeds, _, wave_seeds, wind_heading, wave_Hs, wave_Tp, wave_gamma, wave_heading, _ = self.get_metocean(options) - for ws in wind_speeds: - idlc = DLCInstance(options=options) - idlc.label = '12.1' - idlc.IEC_WindType = 'Custom' - idlc.URef = wind_speeds - idlc.turbulent_wind = False - # idlc.wind_file = options['wind_file'] - if options['analysis_time'] >= 0: - idlc.analysis_time = options['analysis_time'] - if options['transient_time'] >= 0: - idlc.transient_time = options['transient_time'] + Args: + *dicts: Variable number of dictionaries. + + Returns: + dict: Combined dictionary. + """ + comb_options = {} + for d in dicts: + comb_options.update(d) + + comb_options = remove_numpy(comb_options) + + # Make all options a list + for opt in comb_options: + if not isinstance(comb_options[opt], list): # if not a list + comb_options[opt] = [comb_options[opt]] + + return comb_options - self.cases.append(idlc) if __name__ == "__main__": @@ -917,5 +1297,15 @@ def generate_12p1(self, options): DLCopt = DLCs[i_DLC] dlc_generator.generate(DLCopt['DLC'], DLCopt) - print(dlc_generator.cases[5].URef) - print(dlc_generator.n_cases) + # print(dlc_generator.cases[1].URef) + # print(dlc_generator.n_cases) + + FAST_runDirectory = '/Users/dzalkind/Tools/WEIS-DLC/examples/05_IEA-3.4-130-RWT/outputs/05_DLC15_new_setup/openfast_runs' + FAST_InputFile = 'weis_job' + + case_list_all = [] + for case_inputs in dlc_generator.openfast_case_inputs: + case_list, case_name = CaseGen_General(case_inputs, FAST_runDirectory, FAST_InputFile) + print('here') + + diff --git a/weis/dlc_driver/test/test_DLC_generator.py b/weis/dlc_driver/test/test_DLC_generator.py index e976077e7..100adbb9e 100644 --- a/weis/dlc_driver/test/test_DLC_generator.py +++ b/weis/dlc_driver/test/test_DLC_generator.py @@ -33,10 +33,21 @@ def test_generator(self): for i_DLC in range(len(DLCs)): DLCopt = DLCs[i_DLC] dlc_generator.generate(DLCopt['DLC'], DLCopt) + np.testing.assert_equal(dlc_generator.cases[11].URef, ws_cut_out) - np.testing.assert_equal(dlc_generator.n_ws_dlc11, 6) - np.testing.assert_equal(dlc_generator.n_cases, 62) + np.testing.assert_equal(dlc_generator.n_cases, 60) + # Determine wind speeds that will be used to calculate AEP (using DLC AEP or 1.1) + DLCs = [i_dlc['DLC'] for i_dlc in modeling_options['DLC_driver']['DLCs']] + if 'AEP' in DLCs: + DLC_label_for_AEP = 'AEP' + else: + DLC_label_for_AEP = '1.1' + dlc_aep_ws = [c.URef for c in dlc_generator.cases if c.label == DLC_label_for_AEP] + n_ws_aep = len(np.unique(dlc_aep_ws)) + + np.testing.assert_equal(n_ws_aep, 6) + if __name__ == "__main__": unittest.main() diff --git a/weis/dlc_driver/turbulence_models.py b/weis/dlc_driver/turbulence_models.py index be4059d22..64f618e01 100644 --- a/weis/dlc_driver/turbulence_models.py +++ b/weis/dlc_driver/turbulence_models.py @@ -64,4 +64,12 @@ def EWM(self, V_hub): V_1 = 0.8*V_50 sigma_1 = 0.11*V_hub - return sigma_1, V_e50, V_e1, V_50, V_1 \ No newline at end of file + return sigma_1, V_e50, V_e1, V_50, V_1 + + def EOG(self,V_hub): + V_e50 = 1.4*self.V_ref + V_e1 = 0.8*V_e50 + b = 5.6 + sigma_1 = self.I_ref*(0.75*V_hub + b) + + return sigma_1, V_e1 \ No newline at end of file diff --git a/weis/glue_code/gc_LoadInputs.py b/weis/glue_code/gc_LoadInputs.py index e60e6a653..ffd50118d 100644 --- a/weis/glue_code/gc_LoadInputs.py +++ b/weis/glue_code/gc_LoadInputs.py @@ -1,6 +1,7 @@ import os import os.path as osp import shutil +import numpy as np from rosco import discon_lib_path import weis.inputs as sch @@ -80,10 +81,6 @@ def set_weis_data(self): else: bemDir = osp.join(base_run_dir,'BEM') - self.modeling_options["Level1"]['BEM_dir'] = bemDir - if MPI: - # If running MPI, RAFT won't be able to save designs in parallel - self.modeling_options["Level1"]['save_designs'] = False # Openfast @@ -92,7 +89,6 @@ def set_weis_data(self): self.modeling_options['General']['openfast_configuration']['fst_vt'] = {} self.modeling_options['General']['openfast_configuration']['fst_vt']['outlist'] = fast.fst_vt['outlist'] - # User-defined control dylib (path2dll) path2dll = self.modeling_options['General']['openfast_configuration']['path2dll'] @@ -157,6 +153,19 @@ def set_weis_data(self): self.modeling_options['Level3']['openfast_dir'] = osp.realpath(osp.join( mod_opt_dir, self.modeling_options['Level3']['openfast_dir'] )) + # BEM dir, all levels + base_run_dir = os.path.join(mod_opt_dir,self.modeling_options['General']['openfast_configuration']['OF_run_dir']) + if MPI: + rank = MPI.COMM_WORLD.Get_rank() + bemDir = osp.join(base_run_dir,'rank_%000d'%int(rank),'BEM') + else: + bemDir = osp.join(base_run_dir,'BEM') + + self.modeling_options["Level1"]['BEM_dir'] = bemDir + if MPI: + # If running MPI, RAFT won't be able to save designs in parallel + self.modeling_options["Level1"]['save_designs'] = False + # RAFT if self.modeling_options["flags"]["floating"]: bool_init = True if self.modeling_options["Level1"]["potential_model_override"]==2 else False @@ -208,11 +217,17 @@ def set_weis_data(self): DLCopt = DLCs[i_DLC] dlc_generator.generate(DLCopt['DLC'], DLCopt) self.modeling_options['DLC_driver']['n_cases'] = dlc_generator.n_cases - if hasattr(dlc_generator,'n_ws_dlc11'): - self.modeling_options['DLC_driver']['n_ws_dlc11'] = dlc_generator.n_ws_dlc11 + + # Determine wind speeds that will be used to calculate AEP (using DLC AEP or 1.1) + DLCs = [i_dlc['DLC'] for i_dlc in self.modeling_options['DLC_driver']['DLCs']] + if 'AEP' in DLCs: + DLC_label_for_AEP = 'AEP' else: - self.modeling_options['DLC_driver']['n_ws_dlc11'] = 0 + DLC_label_for_AEP = '1.1' + dlc_aep_ws = [c.URef for c in dlc_generator.cases if c.label == DLC_label_for_AEP] + self.modeling_options['DLC_driver']['n_ws_aep'] = len(np.unique(dlc_aep_ws)) + # TMD modeling self.modeling_options['flags']['TMDs'] = False if 'TMDs' in self.wt_init: if self.modeling_options['Level3']['flag']: diff --git a/weis/glue_code/glue_code.py b/weis/glue_code/glue_code.py index b96b063b5..452e7c8f7 100644 --- a/weis/glue_code/glue_code.py +++ b/weis/glue_code/glue_code.py @@ -880,8 +880,8 @@ def setup(self): # Inputs to plantfinancese from wt group if not modeling_options['Level3']['from_openfast']: - # Connect computed AEP only if DLC 1.1 is used, otherwise use rotorse - if modeling_options['DLC_driver']['n_ws_dlc11'] > 0: + # Connect computed AEP only if DLC 1.1 or AEP is used, otherwise use rotorse + if modeling_options['DLC_driver']['n_ws_aep'] > 0: self.connect('aeroelastic.AEP', 'financese_post.turbine_aep') else: self.connect('rotorse.rp.AEP', 'financese_post.turbine_aep') @@ -906,7 +906,7 @@ def setup(self): self.connect('costs.wake_loss_factor', 'financese_post.wake_loss_factor') self.connect('costs.fixed_charge_rate', 'financese_post.fixed_charge_rate') - if modeling_options['DLC_driver']['n_ws_dlc11'] > 0: + if modeling_options['DLC_driver']['n_ws_aep'] > 0: self.connect('aeroelastic.AEP', 'outputs_2_screen_weis.aep') # Connections to outputs to screen diff --git a/weis/inputs/modeling_schema.yaml b/weis/inputs/modeling_schema.yaml index 29cd93997..4c4957241 100644 --- a/weis/inputs/modeling_schema.yaml +++ b/weis/inputs/modeling_schema.yaml @@ -1814,7 +1814,7 @@ properties: description: Low cut-off frequency or lower frequency limit of the wave spectrum beyond which the wave spectrum is zeroed (rad/s) [unused when WaveMod=0, 1, or 6] WvHiCOff: type: number - default: 0.783827 + default: 1.256637 # 5 sec. minimum: 0.0 maximum: 1e3 unit: rad/s @@ -3045,7 +3045,7 @@ properties: DLC: type: string default: '1.1' - enum: ['1.1', '1.2', '1.3', '1.4', '1.5', '1.6', '5.1', '6.1', '6.2', '6.3', '6.4', '6.5', '12.1', 'Custom'] + enum: ['1.1', '1.2', '1.3', '1.4', '1.5', '1.6', '2.1', '2.3', '3.1', '3.2', '3.3', '5.1', '6.1', '6.2', '6.3', '6.4', '6.5', '7.1', '7.2', '12.1', 'Custom','AEP'] description: IEC design load case to run. The DLCs currently supported are 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 5.1, 6.1, 6.3, and 6.4 wind_speed: type: array @@ -3086,7 +3086,7 @@ properties: unit: none minItems: 1 uniqueItems: true - wave_seeds: + wave_seed: type: array default: [] description: Wave random number generator seeds for HydroDyn @@ -3178,8 +3178,8 @@ properties: IEC_WindType: type: string default: NTM - enum: ['NTM', '1ETM', '2ETM', '3ETM', '1EWM1', '2EWM1', '3EWM1', '1EWM50', '2EWM50', '3EWM50', 'ECD', 'EDC', 'EOG'] - description: IEC turbulence type ('NTM'=normal, 'xETM'=extreme turbulence, 'xEWM1'=extreme 1-year wind, 'xEWM50'=extreme 50-year wind, where x=wind turbine class 1, 2, or 3), 'ECD'=extreme coherent gust with direction change, 'EDC'=extreme direction change, 'EOG'=extreme operating gust. Normally the user does not need to define this entry. + enum: ['NTM', '1ETM', '2ETM', '3ETM', '1EWM1', '2EWM1', '3EWM1', '1EWM50', '2EWM50', '3EWM50', 'ECD', 'EDC', 'EOG','EWS'] + description: IEC turbulence type ('NTM'=normal, 'xETM'=extreme turbulence, 'xEWM1'=extreme 1-year wind, 'xEWM50'=extreme 50-year wind, where x=wind turbine class 1, 2, or 3), 'ECD'=extreme coherent gust with direction change, 'EDC'=extreme direction change, 'EOG'=extreme operating gust. Normally the user does not need to define this entry, 'EWS'='extreme wind shear' analysis_time: type: number unit: s @@ -3204,6 +3204,14 @@ properties: wind_file: type: string description: File path of custom wind file + TI_factor: + type: number + unit: Percentage + description: The fraction of the TI, relative to the class defined in the geometry options or by turbulence_class + turbulence_class: + type: string + enum: ['A+','A','B','C'] + description: The class of turbulence, will overwrite class defined in geometry options. Only valid in the AEP DLC. turbulent_wind: type: object default: {} @@ -3361,7 +3369,7 @@ properties: type: number unit: m/s default: -1 - description: Mean (total) velocity at the reference height [m/s] (or 'default' for JET velocity profile) [must be 1-hr mean for API model; otherwise is the mean over AnalysisTime seconds] + description: URef is an input to TurbSim, but it's not honored in WEIS. Please use the wind_speed input to each DLC instead. IECturbc: type: number unit: '(-)' diff --git a/weis/inputs/validation.py b/weis/inputs/validation.py index 56e8d9d5d..55d3c6075 100644 --- a/weis/inputs/validation.py +++ b/weis/inputs/validation.py @@ -3,6 +3,7 @@ import wisdem.inputs from wisdem.inputs.validation import load_yaml, write_yaml, _validate, simple_types, DefaultValidatingDraft7Validator import rosco.toolbox.inputs +from weis.aeroelasticse.FileTools import remove_numpy froot_wisdem = os.path.dirname(wisdem.inputs.__file__) fschema_geom_wisdem = os.path.join(froot_wisdem, 'geometry_schema.yaml') @@ -64,6 +65,7 @@ def write_modeling_yaml(instance, foutput): foutput = foutput[-4:] sfx_str = "-modeling.yaml" instance2 = simple_types(instance) + instance2 = remove_numpy(instance2) write_yaml(instance2, foutput+sfx_str) def get_analysis_schema():