From b2ac11ce6d1fd436541fe654436dfd89c0dd2675 Mon Sep 17 00:00:00 2001 From: Thomas Dickson Date: Wed, 17 Jun 2026 20:37:43 +0100 Subject: [PATCH 1/2] feat: ORC sail variants, ShortKeel appendage, and Daring yacht - Add ORC spinnaker variants and low-performance sail coefficient data - Add ShortKeel appendage class for hull-integrated keels (Daring class) - Add Daring 5.5m yacht definition with estimated parameters - Add Daring baseline performance results and righting moment data - Add yacht and Daring-specific test suites Co-Authored-By: Claude Sonnet 4.6 --- dat/Daring/righting_moment.json | 4 + dat/orc/asym_cl_kite.dat | 5 + dat/orc/asym_pole_kite.dat | 5 + dat/orc/jib.dat | 5 + dat/orc/jib_low.dat | 5 + dat/orc/kite.dat | 5 + dat/orc/main.dat | 5 + dat/orc/main_low.dat | 5 + dat/orc/sym_kite.dat | 5 + dat/polars_Daring_5.5m.json | 1 + dat/polars_YD41.json | 1 + runDaring.py | 70 +++++++++ src/SailMod.py | 248 +++++++++++++++++++++++++------- src/YachtMod.py | 192 ++++++++++++++++++++++--- tests/test_daring.py | 160 +++++++++++++++++++++ tests/test_yacht.py | 47 ++++++ 16 files changed, 691 insertions(+), 72 deletions(-) create mode 100644 dat/Daring/righting_moment.json create mode 100644 dat/orc/asym_cl_kite.dat create mode 100644 dat/orc/asym_pole_kite.dat create mode 100644 dat/orc/jib.dat create mode 100644 dat/orc/jib_low.dat create mode 100644 dat/orc/kite.dat create mode 100644 dat/orc/main.dat create mode 100644 dat/orc/main_low.dat create mode 100644 dat/orc/sym_kite.dat create mode 100644 dat/polars_Daring_5.5m.json create mode 100644 dat/polars_YD41.json create mode 100644 runDaring.py create mode 100644 tests/test_daring.py create mode 100644 tests/test_yacht.py diff --git a/dat/Daring/righting_moment.json b/dat/Daring/righting_moment.json new file mode 100644 index 0000000..4faf95d --- /dev/null +++ b/dat/Daring/righting_moment.json @@ -0,0 +1,4 @@ +{ + "Heel": [0.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0], + "GZ": [0.000, 0.120, 0.230, 0.310, 0.350, 0.330, 0.260] +} diff --git a/dat/orc/asym_cl_kite.dat b/dat/orc/asym_cl_kite.dat new file mode 100644 index 0000000..64d8303 --- /dev/null +++ b/dat/orc/asym_cl_kite.dat @@ -0,0 +1,5 @@ +# asymmetric spinnaker centerline tack lift and drag coefficients (ORC VPP). first row is awa +0.02639,,,,,,,,,,, +0.0000,28.000,41.000,50.000,60.000,67.000,75.000,100.000,115.000,130.000,150.000,180.000 +0.0000,0.19100,0.28000,0.36600,0.52300,0.44800,0.55600,0.75700,0.79000,0.77600,0.62000,0.40000 +0.0000,0.02600,1.01800,1.27700,1.47100,1.51300,1.44400,1.13700,0.82900,0.56000,0.25000,-0.12000 diff --git a/dat/orc/asym_pole_kite.dat b/dat/orc/asym_pole_kite.dat new file mode 100644 index 0000000..4a94b72 --- /dev/null +++ b/dat/orc/asym_pole_kite.dat @@ -0,0 +1,5 @@ +# asymmetric spinnaker pole tack lift and drag coefficients (ORC VPP). first row is awa +0.02639,,,,,,,,,,, +0.0000,28.000,41.000,50.000,60.000,67.000,75.000,100.000,115.000,130.000,150.000,180.000 +0.0000,0.17000,0.23800,0.30600,0.45900,0.39200,0.49300,0.79100,0.89400,0.93600,0.93600,0.93600 +0.0000,0.08500,1.11400,1.36000,1.51300,1.54800,1.47900,1.20700,0.95600,0.70600,0.42500,0.00000 diff --git a/dat/orc/jib.dat b/dat/orc/jib.dat new file mode 100644 index 0000000..1bd52b0 --- /dev/null +++ b/dat/orc/jib.dat @@ -0,0 +1,5 @@ +# jib lift drag and lift coefficient (high). first row is awa +0.016,,,,,,,,, +0.00000,7.0000,15.0000,20.0000,27.0000,50.0000,60.0000,100.0000,150.0000,180.0000 +0.003,0.05000,0.03200,0.03100,0.03700,0.25000,0.35000,0.73000,0.95000,0.90000 +0.00000,0.00000,1.10000,1.47500,1.50000,1.45000,1.25000,0.40000,0.00000,-0.10000 \ No newline at end of file diff --git a/dat/orc/jib_low.dat b/dat/orc/jib_low.dat new file mode 100644 index 0000000..b4b58a1 --- /dev/null +++ b/dat/orc/jib_low.dat @@ -0,0 +1,5 @@ +# jib lift drag and lift coefficient (low performance rig). first row is awa +0.016,,,,,,,,, +0.00000,7.0000,15.0000,20.0000,27.0000,50.0000,60.0000,100.0000,150.0000,180.0000 +0.003,0.05000,0.03200,0.03100,0.03700,0.25000,0.35000,0.73000,0.95000,0.90000 +0.00000,0.00000,1.00000,1.37500,1.45000,1.43000,1.25000,0.40000,0.00000,-0.10000 diff --git a/dat/orc/kite.dat b/dat/orc/kite.dat new file mode 100644 index 0000000..d8b6dc7 --- /dev/null +++ b/dat/orc/kite.dat @@ -0,0 +1,5 @@ +# kite lift drag and lift coefficient (high). first row is awa +0.02639,,,,,,,,,,,, +0.0000,28.000,41.000,50.000,60.000,67.000,75.000,100.000,115.000,130.000,150.000,170.000,180.000 +0.0000,0.19152,0.28152,0.35496,0.43920,0.48960,0.53280,0.61920,0.65880,0.67320,0.67320,0.67320,0.67320 +0.0000,-0.02484,0.69437,0.90677,1.04400,1.08000,1.08000,0.95760,0.81360,0.61200,0.32400,0.10800,0.00000 \ No newline at end of file diff --git a/dat/orc/main.dat b/dat/orc/main.dat new file mode 100644 index 0000000..12dc64e --- /dev/null +++ b/dat/orc/main.dat @@ -0,0 +1,5 @@ +# mainsail lift drag and lift coefficient (high). first row is awa +0.01379,,,,,,,,, +0.00000,7.0000,9.0000,12.0000,28.0000,60.0000,90.0000,120.0000,150.0000,180.000 +0.03448,0.01724,0.01466,0.01466,0.02586,0.11302,0.38250,0.96888,1.31578,1.34483 +0.00000,0.94828,1.13793,1.25000,1.42681,1.38319,1.26724,0.93103,0.38793,-0.11207 \ No newline at end of file diff --git a/dat/orc/main_low.dat b/dat/orc/main_low.dat new file mode 100644 index 0000000..2784d4f --- /dev/null +++ b/dat/orc/main_low.dat @@ -0,0 +1,5 @@ +# mainsail lift drag and lift coefficient (low performance rig). first row is awa +0.01379,,,,,,,,, +0.00000,7.0000,9.0000,12.0000,28.0000,60.0000,90.0000,120.0000,150.0000,180.000 +0.04300,0.02600,0.02300,0.02300,0.03300,0.11302,0.38250,0.96888,1.31578,1.34483 +0.00000,0.86200,1.05200,1.16400,1.34700,1.23900,1.12500,0.83800,0.29600,-0.11207 diff --git a/dat/orc/sym_kite.dat b/dat/orc/sym_kite.dat new file mode 100644 index 0000000..dd45e31 --- /dev/null +++ b/dat/orc/sym_kite.dat @@ -0,0 +1,5 @@ +# symmetric spinnaker lift and drag coefficients (ORC VPP). first row is awa +0.02639,,,,,,,,,,, +0.0000,28.000,41.000,50.000,60.000,67.000,75.000,100.000,115.000,130.000,150.000,180.000 +0.0000,0.21300,0.32100,0.42500,0.58700,0.59800,0.61900,0.85000,0.91100,0.93500,0.93500,0.93500 +0.0000,0.00000,0.97800,1.24100,1.45400,1.45600,1.43700,1.19000,0.95100,0.70600,0.42500,0.00000 diff --git a/dat/polars_Daring_5.5m.json b/dat/polars_Daring_5.5m.json new file mode 100644 index 0000000..f980095 --- /dev/null +++ b/dat/polars_Daring_5.5m.json @@ -0,0 +1 @@ +{"name": "Daring", "results": [[[[1.2254361364110362, 1.1205304315717708, 8.646916208050413, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[1.7194072304802177, 1.3160520855068498, 5.202205599112657, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[2.049998772779813, 1.4371328960879486, 3.995109897086957, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[2.2892182707766766, 1.50648241296533, 3.355842322995613, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[2.482994272846284, 1.545274885632866, 2.9237672403652493, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[2.640410725695732, 1.5603777155989353, 2.610050980923144, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[2.7727761703987412, 1.5575878154291465, 2.3629713860545025, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[2.8777058596565404, 1.5363490103574442, 2.165241810972713, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[2.958441126798166, 1.4990020072347607, 2.001044014793009, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[3.019475096060067, 1.4483168312716486, 1.8587563144510575, 1.0, 2.0], [2.560021946980627, 2.066701578558054, 3.4616422503305198, 1.0, 2.0]], [[3.0619375345570274, 1.3855871770414279, 1.732388301449776, 1.0, 2.0], [2.757797194372542, 2.156281785880404, 3.124911630010696, 1.0, 2.0]], [[3.085935824566328, 1.3119318228231651, 1.618242039052518, 1.0, 2.0], [2.9258010271389385, 2.2113730865038277, 2.8577298550782637, 1.0, 2.0]], [[3.0903129414119914, 1.2283875841694376, 1.5144731516783685, 1.0, 2.0], [3.067307352252179, 2.2310787180256613, 2.6319857267603077, 1.0, 2.0]], [[3.0788054845637047, 1.1366308079189573, 1.4150546788079343, 1.0, 2.0], [3.185151617603154, 2.2169745598301738, 2.432717589487536, 1.0, 2.0]], [[3.052061804483426, 1.0375512421174142, 1.316809998082596, 1.0, 2.0], [3.276717788219107, 2.1703177707252532, 2.25674661248869, 1.0, 2.0]], [[3.007918443844489, 0.93179828677709, 1.2187266680498974, 1.0, 2.0], [3.3458442398423944, 2.096461847488146, 2.0966857770592884, 1.0, 2.0]], [[2.9450446595864603, 0.8221643485719533, 1.121715691802899, 1.0, 2.0], [3.397277245601016, 2.002556607970123, 1.9481649848059615, 1.0, 2.0]], [[2.865819743888335, 0.7136919711715152, 1.0273607407811964, 1.0, 2.0], [3.432598457402484, 1.8929184133801717, 1.8092367467148334, 1.0, 2.0]], [[2.772777514543281, 0.6111300357110454, 0.9382522306289032, 1.0, 2.0], [3.4513149744215794, 1.7685759669180616, 1.6773358117535715, 1.0, 2.0]], [[2.670082441382429, 0.5178689124302976, 0.8555833181042202, 1.0, 2.0], [3.4525306689590627, 1.630413215838624, 1.5501300163651957, 1.0, 2.0]], [[2.563522926105463, 0.43552297204460627, 0.7783779006343332, 1.0, 2.0], [3.4348484465627824, 1.4792569011968628, 1.425385735107694, 1.0, 2.0]], [[2.4555968514161566, 0.36445005600316666, 0.7071746099364067, 1.0, 2.0], [3.3966351078473633, 1.316496488634346, 1.3010612216074031, 1.0, 2.0]], [[2.3457538059819014, 0.30464541730180883, 0.6446858070828998, 1.0, 2.0], [3.338703230820719, 1.1469892640382047, 1.1763896168652554, 1.0, 2.0]], [[2.2379854494814415, 0.25692245827537963, 0.594328486069944, 1.0, 2.0], [3.2636339885461414, 0.9770814758146602, 1.0514199229132424, 1.0, 2.0]], [[2.137669534334437, 0.22103841810907957, 0.5580256936672652, 1.0, 2.0], [3.1704654229978813, 0.8118068573216787, 0.9280025620709584, 1.0, 2.0]], [[2.048942692988345, 0.1950300515253354, 0.5341662888614727, 1.0, 2.0], [3.0617369945522968, 0.6571681253587572, 0.807706059555781, 1.0, 2.0]], [[1.972967620053955, 0.17587169446290155, 0.5183579855562093, 1.0, 2.0], [2.9424362350019218, 0.5181356538942362, 0.6915425516255314, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [2.815155739269146, 0.3979958111404883, 0.5820849376928021, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [2.6795436266856276, 0.29873564470094577, 0.4833591032021285, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [2.546900447783828, 0.22116877028499715, 0.39587250209773767, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [2.4193106252491425, 0.1615545356117227, 0.3187110233825481, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [2.292885190215043, 0.11628695512541314, 0.25252292030728873, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [2.1764327148744296, 0.08467375195309665, 0.2009691898087171, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [2.078534029555272, 0.06474533646551021, 0.1657854070538777, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [2.003934609921269, 0.051728755855087516, 0.1405222547565308, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [1.9514824426196509, 0.040690380471187414, 0.11536836015646561, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [1.9173295655353875, 0.029949433945596356, 0.08739486081945305, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [1.8973709031117425, 0.01967789689391265, 0.058462661620519225, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [1.8899804204683053, 0.010498437453390767, 0.03145258672723819, 1.0, 2.0]]], [[[1.8706959828438783, 2.539437784346465, 8.431530524922623, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[2.6531898148749846, 2.976264191809856, 4.986396232517818, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[3.105880376918116, 3.1887373174529405, 3.9337633379585046, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[3.4360428287916513, 3.302432071988122, 3.345390736522287, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[3.696303268339366, 3.3560521009865867, 2.944025380104406, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[3.8995918616713467, 3.3648687868008462, 2.6526049948450456, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[4.06707507052804, 3.342602235234407, 2.4201442458561506, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[4.191184418389932, 3.2859574909218803, 2.235283631582615, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[4.290296607061465, 3.2058421822773937, 2.0753046252247347, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[4.365544008155386, 3.10283111733684, 1.9337623933016597, 1.0, 2.0], [3.8108706033839925, 4.2580177035735, 3.4971877474208606, 1.0, 2.0]], [[4.418503998015266, 2.97727823510932, 1.8053723253559755, 1.0, 2.0], [4.075791262802305, 4.391890576941331, 3.193822512184731, 1.0, 2.0]], [[4.445680894204461, 2.827596292789636, 1.6890101264027053, 1.0, 2.0], [4.29023988659191, 4.463586487197507, 2.954091710425823, 1.0, 2.0]], [[4.450992495752114, 2.6548970619123753, 1.57986190588352, 1.0, 2.0], [4.47055552888239, 4.477591128597661, 2.7409579716754484, 1.0, 2.0]], [[4.438748683824175, 2.459075841003561, 1.4729710771811753, 1.0, 2.0], [4.609843208311292, 4.434331589088622, 2.554443706563041, 1.0, 2.0]], [[4.4060967421403685, 2.2442624749476843, 1.3665462589605364, 1.0, 2.0], [4.722973085190123, 4.34543779542856, 2.3788618236697956, 1.0, 2.0]], [[4.350261082190401, 2.0160362783830044, 1.26018788865881, 1.0, 2.0], [4.812387035584889, 4.219715463305959, 2.2140589617322277, 1.0, 2.0]], [[4.271781540928382, 1.7827316562128417, 1.1554408216898786, 1.0, 2.0], [4.877572012914596, 4.063770020766868, 2.0614912389997917, 1.0, 2.0]], [[4.1748900793641734, 1.5547346194776674, 1.0539361014895838, 1.0, 2.0], [4.921610713187921, 3.879732840736529, 1.9165832044550115, 1.0, 2.0]], [[4.06637078294876, 1.3419548331064375, 0.9574339920331304, 1.0, 2.0], [4.9450376839587875, 3.6667084641757755, 1.7760931908302147, 1.0, 2.0]], [[3.938696768343987, 1.145186520802659, 0.86909004227314, 1.0, 2.0], [4.946173158288612, 3.4220563686973264, 1.6380866382960453, 1.0, 2.0]], [[3.8009543947577167, 0.9688694844548387, 0.7873423341602083, 1.0, 2.0], [4.922906533060289, 3.1418631639168355, 1.500652149309412, 1.0, 2.0]], [[3.661593197680879, 0.8156426406905555, 0.7116173344076974, 1.0, 2.0], [4.8750956634244735, 2.824890005714228, 1.3629517426212778, 1.0, 2.0]], [[3.511908289673889, 0.684441418872733, 0.6461256514001542, 1.0, 2.0], [4.802587387629242, 2.4716554063654965, 1.225914856970465, 1.0, 2.0]], [[3.3633969588657524, 0.5786575154563575, 0.5926732984828185, 1.0, 2.0], [4.7060083994258415, 2.105829410288338, 1.09054078305635, 1.0, 2.0]], [[3.2248663346018263, 0.4981434298500806, 0.5526483671025872, 1.0, 2.0], [4.591511279681694, 1.7552238264103368, 0.9572773033922417, 1.0, 2.0]], [[3.0932577024040615, 0.4388948087430352, 0.5274757402808079, 1.0, 2.0], [4.46261371078769, 1.430208585700505, 0.8279153100650313, 1.0, 2.0]], [[2.9825179001092548, 0.3951386153475808, 0.5096661653176581, 1.0, 2.0], [4.310228070963548, 1.134172158051882, 0.7058198247395144, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [4.145694261981329, 0.8774211704027115, 0.5919458854254485, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [3.972919647097163, 0.6645316566262531, 0.4891270798703892, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [3.792749573502266, 0.4947364299053389, 0.3992504384041548, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [3.6187381360210233, 0.36285473630708687, 0.31989500004446436, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [3.4391519302467124, 0.26163887662065205, 0.2525392150171604, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [3.273848208294988, 0.1904740139126649, 0.1998406608598633, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [3.130498341020369, 0.14532878506623978, 0.16409254554799, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [3.0197911661262578, 0.11590149568057323, 0.13867513635851664, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [2.943473915292899, 0.0910344067352443, 0.11346502816970613, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [2.893775691761757, 0.06691386597225095, 0.08572343875997299, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [2.8647418222165504, 0.04388728137437807, 0.05719721737625368, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [2.8540020664984618, 0.02333827256295437, 0.030662408269582272, 1.0, 2.0]]], [[[2.467592912038856, 4.152976646437254, 8.565621500733045, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[3.524328245491638, 4.7496888170165965, 4.995198835189989, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[4.056369388842237, 5.007054676717467, 4.028152585621664, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[4.427668240872698, 5.127668576238828, 3.4795892639446437, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[4.704872304804672, 5.162561367031421, 3.1053963644605145, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[4.932231006367611, 5.150001039200741, 2.8168612718603105, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[5.115758393310813, 5.095101226968987, 2.584936689227108, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[5.2623104904016715, 5.0043722051827055, 2.39125337293096, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[5.362398238567784, 4.873496353155128, 2.2309125552603093, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[5.439163517010839, 4.717666305914139, 2.0852268849520956, 1.0, 2.0], [4.905574215473284, 6.834565090336558, 3.699486101747985, 1.0, 2.0]], [[5.492964183105675, 4.537666303208209, 1.9504686114812084, 1.0, 2.0], [5.2103355376257605, 7.0778206494569735, 3.4054599811865387, 1.0, 2.0]], [[5.521276740351525, 4.333859125784628, 1.825622667274952, 1.0, 2.0], [5.445224338265997, 7.183384489848274, 3.1732371371200654, 1.0, 2.0]], [[5.52871265637473, 4.106181059335094, 1.7045640696873083, 1.0, 2.0], [5.643501174386927, 7.16345390524434, 2.957121085048121, 1.0, 2.0]], [[5.516169478675315, 3.8528909180785362, 1.5839832282962243, 1.0, 2.0], [5.745103486201134, 6.990644537006319, 2.799757861611587, 1.0, 2.0]], [[5.481091620300526, 3.5714041500679614, 1.4629625141295075, 1.0, 2.0], [5.830063208818552, 6.752681924324197, 2.6380064118079427, 1.0, 2.0]], [[5.4219332542935925, 3.263181994059185, 1.3427683633102407, 1.0, 2.0], [5.900974416008924, 6.479680459526573, 2.477258690134909, 1.0, 2.0]], [[5.341332828742203, 2.9346110834551844, 1.2255261879875379, 1.0, 2.0], [5.956914437114042, 6.177865010454475, 2.3173346071666927, 1.0, 2.0]], [[5.2450033927619915, 2.5940192224495013, 1.1131713667616727, 1.0, 2.0], [5.9958984233711305, 5.848106628499006, 2.1570154580881873, 1.0, 2.0]], [[5.117101512161371, 2.247435721175114, 1.0112063029515816, 1.0, 2.0], [6.015757542320577, 5.490428791979523, 1.995118115797019, 1.0, 2.0]], [[4.979865937044188, 1.9313348979886613, 0.9156069882764317, 1.0, 2.0], [6.014376662266854, 5.10443252143265, 1.830673528171668, 1.0, 2.0]], [[4.837931417269866, 1.6493487444902861, 0.8261608121014882, 1.0, 2.0], [5.992035142553033, 4.694642654571608, 1.664506785996876, 1.0, 2.0]], [[4.679430868588579, 1.3986029005959733, 0.7459790439717524, 1.0, 2.0], [5.950798763361205, 4.266180473978561, 1.4982051571722408, 1.0, 2.0]], [[4.521975486780659, 1.1868244553135738, 0.6748807338397474, 1.0, 2.0], [5.892838042434139, 3.821675611557528, 1.3335295926537625, 1.0, 2.0]], [[4.361715283551243, 1.01394057462579, 0.6169141563503429, 1.0, 2.0], [5.820071308598359, 3.3619299366541555, 1.1725206125000363, 1.0, 2.0]], [[4.202035656168584, 0.8800185847723347, 0.5746643730583687, 1.0, 2.0], [5.7349589953542575, 2.886838067083739, 1.017226852297702, 1.0, 2.0]], [[4.060156869400802, 0.779927863224949, 0.5438771080017694, 1.0, 2.0], [5.63775876676519, 2.3948149429342096, 0.8694274909898554, 1.0, 2.0]], [[3.9298168583728743, 0.7039907620302686, 0.5229372278592409, 1.0, 2.0], [5.469126337573013, 1.9092237853101957, 0.738681700431756, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [5.292121501379797, 1.490717124941953, 0.6175983960610887, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [5.0942290139775, 1.1397465492249346, 0.5102555862598647, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [4.893427733936021, 0.8578998739923691, 0.41554149522840905, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [4.68880534113116, 0.6342284687716473, 0.3325104229421658, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [4.4871791491990844, 0.4616600331706934, 0.26132737511873533, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [4.291242206832603, 0.33915975316256186, 0.20683525352942086, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [4.12268288686718, 0.2602598749049176, 0.16930429991309473, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [3.991399719046609, 0.20768850166546418, 0.14218885047519284, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [3.895753811220888, 0.16306865966932396, 0.11600919683986491, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [3.8332897384024944, 0.11984619510825611, 0.08749219548611424, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [3.7967340706815227, 0.07865632245650304, 0.05836025540899003, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [3.783191858648608, 0.0419294938830303, 0.03135080565781854, 1.0, 2.0]]], [[[3.0744722131987254, 5.932477507542169, 8.577311607672842, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[4.28200726349995, 6.856305632437686, 5.170430787284467, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[4.856265100434159, 7.2650543906857665, 4.239607208016746, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[5.266230019159355, 7.455298922903569, 3.6830307735933983, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[5.558799135368486, 7.474560023237083, 3.3107317699110292, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[5.735659610953936, 7.339579091495394, 3.0620569820311627, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[5.855178470923703, 7.129541890406668, 2.865725787921991, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[5.955046372122786, 6.892399648645256, 2.6878287653979864, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.036062877723716, 6.632446415510186, 2.5234214610092365, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.072071204962138, 6.332510869935987, 2.3813753171392853, 1.0, 2.0], [5.7881882446107795, 11.248268939111865, 4.024451865337073, 1.0, 2.0]], [[6.093108027193791, 6.022467275401236, 2.2436114987598708, 1.0, 2.0], [6.0149567050414445, 11.54563468374618, 3.8178265201103874, 1.0, 2.0]], [[6.105509598207972, 5.7023824395450005, 2.103378883653498, 1.0, 2.0], [6.136048929889325, 11.49277341044666, 3.6729058337283864, 1.0, 2.0]], [[6.109758476287105, 5.368615192473026, 1.9578029712958447, 1.0, 2.0], [6.229506396544334, 11.211157276045144, 3.5132209805050247, 1.0, 2.0]], [[6.104677358311753, 5.019326419420344, 1.8066614215665093, 1.0, 2.0], [6.3119426020002765, 10.789216658888913, 3.340398014721883, 1.0, 2.0]], [[6.089431819615176, 4.658195689378292, 1.6530298785276942, 1.0, 2.0], [6.385003445246029, 10.270298529088965, 3.1625827583587327, 1.0, 2.0]], [[6.06491464686775, 4.292209275437511, 1.501292931890937, 1.0, 2.0], [6.446891848615136, 9.709254768666009, 2.9782818095280343, 1.0, 2.0]], [[6.020574336440605, 3.9212605799665043, 1.358048816044808, 1.0, 2.0], [6.482605636819052, 9.093052532678255, 2.7943740519770475, 1.0, 2.0]], [[5.946212454226167, 3.5450179236156902, 1.2278456382183753, 1.0, 2.0], [6.505933322183292, 8.388327170568752, 2.598684829787263, 1.0, 2.0]], [[5.864292752781788, 3.173405960142662, 1.1054177355164012, 1.0, 2.0], [6.516230263044912, 7.6073150394511435, 2.392648761234444, 1.0, 2.0]], [[5.776747039317365, 2.8058707274823322, 0.990826127962993, 1.0, 2.0], [6.514164434427465, 6.833915635195712, 2.180032171652726, 1.0, 2.0]], [[5.685495137644575, 2.44312044783712, 0.8842233213370754, 1.0, 2.0], [6.5008083314202505, 6.1486318393242465, 1.9647001097256518, 1.0, 2.0]], [[5.5540754368003435, 2.0989974108732183, 0.7931421952998369, 1.0, 2.0], [6.476871811895334, 5.520990037581167, 1.7509974014806808, 1.0, 2.0]], [[5.390812565694829, 1.7989818565870355, 0.718529253757463, 1.0, 2.0], [6.4415967124359845, 4.9306428094882175, 1.5432481135690708, 1.0, 2.0]], [[5.232296671096308, 1.5552637793732755, 0.6566984025344725, 1.0, 2.0], [6.384474744395748, 4.3581811434685145, 1.3467342028706206, 1.0, 2.0]], [[5.059110830144907, 1.3638342317715242, 0.6138007392317614, 1.0, 2.0], [6.317320722295194, 3.7986730275439715, 1.1599166970585044, 1.0, 2.0]], [[4.906163311162754, 1.2189924897218716, 0.5817897598506153, 1.0, 2.0], [6.241917561094769, 3.244730883659563, 0.9848828515515118, 1.0, 2.0]], [[4.771644045754406, 1.1064203515821622, 0.5572430244458948, 1.0, 2.0], [6.160472297313343, 2.692169404276718, 0.8238592194096309, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.07568361811248, 2.1561109682791884, 0.6781980048062397, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [5.9456423047537115, 1.686123668083861, 0.5538059921800056, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [5.793437447545232, 1.292660457835374, 0.44587340780989176, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [5.6441722017710845, 0.9714142064975412, 0.35067455687231275, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [5.422202605205401, 0.7145078725402443, 0.27628706235209816, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [5.216882350691285, 0.5320401878250312, 0.2190809019447614, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [5.025320114226891, 0.41290008859620286, 0.18049949786580122, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [4.879570902460469, 0.33102172833277, 0.15149972368058576, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [4.774954302018101, 0.25986930313629175, 0.12300995410981345, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [4.704567816405513, 0.1911371904883132, 0.09262500862715933, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [4.6632181361549545, 0.1257835380588657, 0.061865384331241904, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [4.647840538731383, 0.067547614426488, 0.03346208800722465, 1.0, 2.0]]], [[[3.6272297430961338, 8.588158397162585, 8.735383050722739, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[4.952420033906878, 10.094102765849929, 5.383587390141141, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[5.558615830618181, 10.719653042916493, 4.4582753752763535, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[5.8478060458757035, 10.727501302101254, 4.026116058597883, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.056405785074533, 10.555647302439883, 3.70892193069309, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.1516353688451435, 10.174978249516666, 3.5036753475062925, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.2332352098917, 9.787704693352314, 3.313448232748185, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.302150064984935, 9.387373543482653, 3.1333025955193934, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.359038203636372, 8.942176217058087, 2.959305809499433, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.402318434948601, 8.452816142155326, 2.7905901828552824, 1.0, 2.0], [6.259982860000991, 16.75135969563248, 4.687992680522821, 1.0, 2.0]], [[6.433076607136774, 7.916658108220447, 2.6223567353538444, 1.0, 2.0], [6.425118250304741, 16.88059591788343, 4.499653676732196, 1.0, 2.0]], [[6.451314043872028, 7.331765120020586, 2.4498219377839585, 1.0, 2.0], [6.539185531603319, 16.662949167901274, 4.3165459411553995, 1.0, 2.0]], [[6.4560399900589704, 6.7586337810408565, 2.270559944892339, 1.0, 2.0], [6.636975693877369, 16.23855208402282, 4.119989562179069, 1.0, 2.0]], [[6.450362405195594, 6.219175846961057, 2.085920420103279, 1.0, 2.0], [6.726769031553196, 15.681038851232742, 3.915460054749505, 1.0, 2.0]], [[6.429303918374468, 5.709694144943746, 1.9041530107445352, 1.0, 2.0], [6.8063841578441115, 14.979486354392462, 3.702596608473507, 1.0, 2.0]], [[6.39620976609009, 5.231305724010891, 1.7293241086808964, 1.0, 2.0], [6.8686193691497985, 14.112797170165164, 3.4833970150208065, 1.0, 2.0]], [[6.35488605850579, 4.783334855356189, 1.5642911835126052, 1.0, 2.0], [6.908761867117753, 13.06814398138671, 3.2568074418405146, 1.0, 2.0]], [[6.3069789120696615, 4.359091014956909, 1.4092966446195292, 1.0, 2.0], [6.934291404798618, 11.874481497204897, 3.0175547295464087, 1.0, 2.0]], [[6.253765795105351, 3.953297072835584, 1.2643506061000942, 1.0, 2.0], [6.945809003428763, 10.573086001485777, 2.770228920339481, 1.0, 2.0]], [[6.19650910428801, 3.5625147313191703, 1.1295570115535978, 1.0, 2.0], [6.944295325294136, 9.341251014649067, 2.5174492019668877, 1.0, 2.0]], [[6.136308738307639, 3.186217116370276, 1.0058206019805884, 1.0, 2.0], [6.9302365234061085, 8.18648650541904, 2.2642485802850034, 1.0, 2.0]], [[6.074311649343791, 2.8271735984442796, 0.8947250729359714, 1.0, 2.0], [6.904597276401171, 7.066702031862693, 2.0156140062071093, 1.0, 2.0]], [[5.980657717633935, 2.4845560074327047, 0.8040610635746075, 1.0, 2.0], [6.868317273070611, 6.157206752625523, 1.7736436391764694, 1.0, 2.0]], [[5.863800753861672, 2.1867626569797842, 0.7337051618735599, 1.0, 2.0], [6.815429855281086, 5.38443874430952, 1.5439009321196402, 1.0, 2.0]], [[5.754914818557919, 1.9489446784272633, 0.6769753375579712, 1.0, 2.0], [6.748222904656038, 4.689641684271162, 1.3286426666780211, 1.0, 2.0]], [[5.657401810917914, 1.7590160297758042, 0.6308922281902354, 1.0, 2.0], [6.6728847455502756, 4.045674561136876, 1.1293023965354354, 1.0, 2.0]], [[5.5297546099727, 1.6056481489607781, 0.601851484234537, 1.0, 2.0], [6.592134714755469, 3.4347546985297006, 0.947370691931275, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.508647049022498, 2.8448746603868367, 0.7836669092108958, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.415696578333778, 2.2694966776844723, 0.6386837714663552, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.301665065761776, 1.7653442562932875, 0.5124982587844992, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.188473468799158, 1.347378075571872, 0.40236859523591173, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.079992751991712, 1.0169754158150295, 0.31125645115423084, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [5.934608775559729, 0.7750837786080641, 0.245726414338871, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [5.791511292333112, 0.6097085070284971, 0.20022894828743595, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [5.681621509605334, 0.48926523884749407, 0.16498295414039363, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [5.586936274702732, 0.3834952312452794, 0.13253172476372452, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [5.512453633811943, 0.28242104944093643, 0.09966668102590984, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [5.468499379862629, 0.18652386179481714, 0.06670879472749953, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [5.452073092389055, 0.10110191562121085, 0.036398293847223054, 1.0, 2.0]]], [[[4.039527562516499, 12.18308433843932, 9.262406774259114, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[5.563117079414679, 14.466908841956982, 5.570856163187931, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[5.983373942330772, 14.766765705336294, 4.889056534936809, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.177139503988851, 14.539933974994117, 4.527757185042362, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.320794318252125, 14.182270076267452, 4.241636060076225, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.447401441519195, 13.755123416202103, 3.9854757824453646, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.5247337693305205, 13.207952107190513, 3.779402725626929, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.590290448448165, 12.59588282319633, 3.58248477233439, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.64430284640505, 11.915075601002423, 3.3904965455458496, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.6856226242989765, 11.163934839815518, 3.201485865447267, 1.0, 2.0], [6.60249708283912, 23.297629222708057, 5.413567445163149, 1.0, 2.0]], [[6.716342765486497, 10.330635829827715, 3.0071919023485414, 1.0, 2.0], [6.76190290014202, 23.288865498839055, 5.183058497685235, 1.0, 2.0]], [[6.736114534943306, 9.508931985160276, 2.8019777091038383, 1.0, 2.0], [6.897207335895568, 22.86952736566357, 4.939046410705389, 1.0, 2.0]], [[6.742270171125046, 8.67985613056417, 2.588810795279412, 1.0, 2.0], [7.0072478933949105, 22.177743950108294, 4.705424496487626, 1.0, 2.0]], [[6.734426898923641, 7.820061273346923, 2.3754714016252314, 1.0, 2.0], [7.10847350486548, 21.24424144203384, 4.462970859967316, 1.0, 2.0]], [[6.714611095255375, 6.997024629064002, 2.1674841718845346, 1.0, 2.0], [7.197312390023393, 20.0268094998848, 4.211175121793948, 1.0, 2.0]], [[6.685794061179124, 6.31763605840407, 1.9690983652767604, 1.0, 2.0], [7.270094669982985, 18.90139361289512, 3.942243648717256, 1.0, 2.0]], [[6.649690492480198, 5.735586427337385, 1.782171495028333, 1.0, 2.0], [7.323398244153203, 17.560196464776297, 3.664085265389843, 1.0, 2.0]], [[6.6074571565792235, 5.2173662905918805, 1.6070486010985787, 1.0, 2.0], [7.357803187308336, 16.039743598014603, 3.3811839699624446, 1.0, 2.0]], [[6.560389094616081, 4.743641773326023, 1.4434223851528407, 1.0, 2.0], [7.374382805670062, 14.388784185483228, 3.0970235916280626, 1.0, 2.0]], [[6.50942709274323, 4.305510336876989, 1.2925099732812517, 1.0, 2.0], [7.373661845721073, 12.655013818897423, 2.8144787070733708, 1.0, 2.0]], [[6.4555999987952175, 3.900163709749801, 1.1561822053105475, 1.0, 2.0], [7.3567042209469, 10.888595212383784, 2.5362051183382266, 1.0, 2.0]], [[6.381578846458187, 3.5250617209439823, 1.0410271287758268, 1.0, 2.0], [7.324655240829613, 9.281103409721904, 2.2626466882293523, 1.0, 2.0]], [[6.305185744856231, 3.1887903607370176, 0.943964465404951, 1.0, 2.0], [7.278457246550866, 7.868343278695177, 1.9966358968560372, 1.0, 2.0]], [[6.231650071269651, 2.894361236902386, 0.8639932387637835, 1.0, 2.0], [7.219271728020214, 6.627329032926938, 1.7421846125126152, 1.0, 2.0]], [[6.16352814670872, 2.638758221885433, 0.7984694288645476, 1.0, 2.0], [7.1491103427239135, 5.684344320258055, 1.5025666512941969, 1.0, 2.0]], [[6.10266316558077, 2.414897877179956, 0.7434534755357202, 1.0, 2.0], [7.070833185824202, 4.895365218271313, 1.2811223331156791, 1.0, 2.0]], [[6.049610137660569, 2.2207492403103823, 0.6949585644044587, 1.0, 2.0], [6.9873511714050895, 4.19503093766572, 1.079431744650972, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.900784557737791, 3.546691925798071, 0.8972714990053031, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.80328257872641, 2.9227447300569933, 0.7350441564079776, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.692905606281222, 2.3122776805744487, 0.5923358817950902, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.583520787607685, 1.7886550493867144, 0.4693619638996501, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.479898774274338, 1.3806077943823054, 0.36985912302505153, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.367183945767722, 1.0825668706879263, 0.296680416563151, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.264867557642532, 0.8703229851191849, 0.24339089153102142, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.186400991073882, 0.7043506397589965, 0.19990365233969706, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.130468152981063, 0.5518711145114247, 0.15823679837188662, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.092668012348151, 0.4061201929396309, 0.11728071028467324, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.070045802509995, 0.2695283670704626, 0.07823244480130762, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.061486964565083, 0.14860364884217883, 0.0432828105178405, 1.0, 2.0]]], [[[4.484325325379685, 16.5017056500776, 9.507700873982555, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[5.91865350573012, 18.745069647980273, 6.062983976974454, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.221160006949585, 18.76746879269199, 5.487248504579976, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.430312192123474, 18.492582704630454, 5.069080171384702, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.566837496106737, 18.040509579085654, 4.762670665424978, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.681958043220073, 17.504179991336102, 4.4923449816738, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.781763310321603, 16.887763565006388, 4.2436679358811675, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.864020526025974, 16.177988386223156, 4.011455808937844, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.918907763881405, 15.359752502123783, 3.7991951581067465, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.962254116209337, 14.444757493210156, 3.5859496819249994, 1.0, 2.0], [6.8278186787803525, 30.834337462434934, 6.961415512857271, 1.0, 2.0]], [[6.995234806425072, 13.415765887754048, 3.363300607286826, 1.0, 2.0], [7.00342319068165, 30.66285776074565, 6.619002832185302, 1.0, 2.0]], [[7.015668047598264, 12.268894263203661, 3.129554599985167, 1.0, 2.0], [7.239511822674065, 29.99999940593966, 5.510278280795211, 1.0, 2.0]], [[7.021550278494119, 11.037531239887286, 2.8907502887605707, 1.0, 2.0], [7.3769898610414, 29.432814568709738, 5.297029613677712, 1.0, 2.0]], [[7.013879428906579, 9.813839194714443, 2.653939584788569, 1.0, 2.0], [7.513033265588983, 28.431594640531966, 4.970340806424406, 1.0, 2.0]], [[6.995497242561006, 8.784987606395893, 2.423804926168942, 1.0, 2.0], [7.631208586603216, 27.07920076606369, 4.638768466308474, 1.0, 2.0]], [[6.968657176267232, 7.801376082017946, 2.2061887495487054, 1.0, 2.0], [7.725610289459256, 25.329887397165773, 4.306043242247729, 1.0, 2.0]], [[6.934602648315469, 6.916039310867272, 2.0008863449739525, 1.0, 2.0], [7.794938987942262, 23.203493899303893, 3.978692868162919, 1.0, 2.0]], [[6.894502957356525, 6.210488296088968, 1.807751065608342, 1.0, 2.0], [7.840238337827836, 20.750472591348892, 3.6615586305504846, 1.0, 2.0]], [[6.848972904708291, 5.616657535499993, 1.62802948208848, 1.0, 2.0], [7.862988032345535, 18.57062489997063, 3.34763861930216, 1.0, 2.0]], [[6.787560046220868, 5.0959903785636405, 1.4671997886503312, 1.0, 2.0], [7.863797379263989, 16.482551177788068, 3.04066485061798, 1.0, 2.0]], [[6.7227405881454105, 4.640446447207367, 1.3246240024873897, 1.0, 2.0], [7.844001209216317, 14.342343028657483, 2.743906627489419, 1.0, 2.0]], [[6.656535921018625, 4.242799427348785, 1.201699066481601, 1.0, 2.0], [7.804737336950292, 12.199695450745219, 2.4566010767611606, 1.0, 2.0]], [[6.591112018029047, 3.901646584557925, 1.099650953799308, 1.0, 2.0], [7.74751112650143, 10.106533917516009, 2.1790837591701737, 1.0, 2.0]], [[6.528919557785369, 3.610972870117769, 1.0160023815217738, 1.0, 2.0], [7.674506383194503, 8.44018410317642, 1.9109813716410362, 1.0, 2.0]], [[6.472149910525918, 3.3616419458296023, 0.9468611788556067, 1.0, 2.0], [7.588006071893942, 6.958279678351489, 1.658765705233999, 1.0, 2.0]], [[6.412536872319223, 3.142412581548078, 0.8903994806506331, 1.0, 2.0], [7.491943190679957, 5.873048225109807, 1.4235876662162767, 1.0, 2.0]], [[6.353887649516527, 2.9416425804557442, 0.8410892253353784, 1.0, 2.0], [7.3896900695079095, 5.012718321966485, 1.2079656527428466, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.283052145889655, 4.26484675352124, 1.0114299624584693, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.172278347281164, 3.5763544358649684, 0.8335676871730212, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.059012298839661, 2.9219528160942403, 0.675555605692981, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.94746737320656, 2.30746637742044, 0.54125462119968, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.012555856674646, -2.8590519676261868e-05, -0.7379912665892253, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.728479359387773, 1.4556539451522426, 0.35583350780957845, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.635817179460859, 1.19103357663911, 0.29601290733608837, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.565220729028778, 0.9717653261285559, 0.24443318970722355, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.5145792211566125, 0.7652493812831448, 0.1941120332627825, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.480053999209073, 0.5668159468289986, 0.14464477039275117, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.459227950898506, 0.3805555930268385, 0.09754425821968238, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.451248945969792, 0.2150022188991485, 0.055283836509057716, 1.0, 2.0]]], [[[5.094651974579863, 21.87018429989767, 9.14940679938708, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.144263305997046, 24.004463696837817, 6.703923214136647, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.44358798865614, 23.919256930778598, 6.072793087098443, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.630069499718187, 23.408844228302634, 5.646242342853737, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.795954091862972, 22.77221351797716, 5.275476061483389, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.921749686928916, 21.96089200198071, 4.970725529662224, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[7.020884432894838, 20.99055528268326, 4.702670325603514, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[7.106436464006536, 19.905041030879865, 4.447758724603893, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[7.175839117630556, 18.976748972381504, 4.199982467811195, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[7.232113416602713, 17.91536166177241, 3.9508978238593944, 1.0, 2.0], [7.092419136440295, 33.83912096635177, 5.999999999999999, 0.7999999999999998, 2.0]], [[7.275036238500418, 16.699811696444076, 3.6928953053344773, 1.0, 2.0], [7.172722410242505, 33.509508650072085, 5.999999999999999, 0.7999999999999998, 2.0]], [[7.300721711287029, 15.33636312883414, 3.428089770208465, 1.0, 2.0], [7.297631573084078, 33.486677420298626, 5.999999999999999, 0.8199999999999998, 2.0]], [[7.30815394217838, 13.880417831243625, 3.164693878887489, 1.0, 2.0], [7.465575034130366, 33.792958746239655, 5.999999999999999, 0.8599999999999999, 2.0]], [[7.299638729945333, 12.396975923125906, 2.9090422274005174, 1.0, 2.0], [7.704803497269035, 33.65190174874534, 5.721079758926345, 0.8999999999999999, 2.0]], [[7.278908997626949, 10.94518751639577, 2.665928914528607, 1.0, 2.0], [7.973695505000149, 33.65693013945511, 5.46746206874963, 0.96, 2.0]], [[7.248134142201148, 9.628401862885768, 2.4353568667206176, 1.0, 2.0], [8.158040048994009, 32.559303046941665, 5.185333220000191, 1.0, 2.0]], [[7.20852929397571, 8.533967659941775, 2.216735965580516, 1.0, 2.0], [8.288555647493814, 29.654020355594266, 4.2812495449283725, 1.0, 2.0]], [[7.161714809043888, 7.509009792180262, 2.0115039962822205, 1.0, 2.0], [8.342763895884175, 26.993904706121434, 3.9035032601695465, 1.0, 2.0]], [[7.108847542174188, 6.657066417178027, 1.8208201396333703, 1.0, 2.0], [8.370434083373736, 24.006806294265868, 3.551661230410243, 1.0, 2.0]], [[7.051178300049259, 5.995154481229294, 1.6478748775169776, 1.0, 2.0], [8.373007179475138, 20.75863692834987, 3.2261901064900353, 1.0, 2.0]], [[6.99035801778649, 5.457333736683059, 1.4962609249720888, 1.0, 2.0], [8.352861543258129, 18.06353590620416, 2.9122542392206108, 1.0, 2.0]], [[6.928490321513709, 5.014369863828597, 1.3678724410975471, 1.0, 2.0], [8.31110240348825, 15.547099960521138, 2.6105396891617976, 1.0, 2.0]], [[6.867902435312685, 4.649557597181783, 1.262206846573735, 1.0, 2.0], [8.24951931461366, 13.072085033573794, 2.322111998981568, 1.0, 2.0]], [[6.80132039500972, 4.347448410417161, 1.1792179757627894, 1.0, 2.0], [8.17072500083289, 10.70856263739708, 2.0472725584053815, 1.0, 2.0]], [[6.738118660106176, 4.092667751683931, 1.1112310970542278, 1.0, 2.0], [8.078329004139121, 8.76889246851043, 1.785121372028533, 1.0, 2.0]], [[6.683211038200025, 3.8688707965516143, 1.05149812729228, 1.0, 2.0], [7.965428825052528, 7.138853399007136, 1.5427799409916363, 1.0, 2.0]], [[6.6362274061489686, 3.6608377175077274, 0.9952256209282043, 1.0, 2.0], [7.842744392400482, 5.953960110827039, 1.3179708695260863, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.714109859224545, 5.036994823219145, 1.1107754448469929, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.579694835835064, 4.246669313980828, 0.9220947057666044, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.442250499628127, 3.5323111485473677, 0.7547473287771352, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.307887778855837, 2.88576634704195, 0.6137386019279225, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.18264806493053, 2.3222073260415534, 0.502256074302551, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.072844345333071, 1.8925184533394799, 0.4174261964965807, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.983112023954585, 1.5671817380906334, 0.35094878049065154, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.915079140892514, 1.2856506855066354, 0.2910840413652241, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.866012872653916, 1.0166782189344665, 0.2319892973665472, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.828478117959888, 0.7575426270206516, 0.1740391408237853, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.803919859051619, 0.5137832355505532, 0.11868287055723728, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.794411877528704, 0.2960852264618836, 0.06863620128428292, 1.0, 2.0]]], [[[5.239332056451019, 27.415288183743893, 10.216647063583872, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.2897957715378165, 29.39416280290847, 7.5289152300556506, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.600360411681702, 29.245197268082855, 6.797543305550665, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.832608814790953, 28.789534676776128, 6.253254483054812, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.998782705795852, 28.097996392083957, 5.839570258459924, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[7.141153165438312, 27.26142785139635, 5.477341495098694, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[7.265672564481034, 26.269724058642765, 5.146879588866029, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[7.371594662872126, 25.099874953772566, 4.840390121941954, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[7.4583013740458295, 23.733158799354218, 4.552035220502035, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[7.529086584107301, 22.12340346371383, 4.267136374136022, 1.0, 2.0], [6.778315557174634, 31.691573803108497, 5.999999999999999, 0.62, 0.899999999999999]], [[7.582197189116295, 20.231614680019984, 3.9801494211730017, 1.0, 2.0], [6.870118958020797, 31.695478742655972, 5.999999999999999, 0.62, 0.899999999999999]], [[7.6138737424741025, 18.604369658220357, 3.686453099609278, 1.0, 2.0], [6.945912528147888, 31.344778494495742, 5.999999999999999, 0.62, 0.899999999999999]], [[7.623487170957492, 16.935056647392674, 3.4007447003853617, 1.0, 2.0], [7.034087988329554, 30.573268761300557, 5.891563232654268, 0.62, 0.899999999999999]], [[7.6145674228726286, 15.237912666762952, 3.1292095424237534, 1.0, 2.0], [7.345784262085853, 33.623970099068316, 5.716687476008333, 0.6399999999999997, 2.0]], [[7.591499719558748, 13.575452662410779, 2.874345114343952, 1.0, 2.0], [7.675865235973898, 33.64486893353354, 5.400489747889605, 0.6999999999999997, 2.0]], [[7.556513742049596, 11.97161290996916, 2.6345087822133406, 1.0, 2.0], [8.05995844939496, 33.68817504137765, 5.070109748558772, 0.7799999999999998, 2.0]], [[7.51124238859874, 10.445371739889255, 2.4088665520620993, 1.0, 2.0], [8.435430312302907, 33.664203341720984, 4.795138004539108, 0.8799999999999999, 2.0]], [[7.457476114106494, 9.18200922147399, 2.1955657089744185, 1.0, 2.0], [8.779522569562994, 33.90555574697603, 4.638875516978371, 1.0, 2.0]], [[7.3966000426523735, 8.091105800739388, 1.9980826693809728, 1.0, 2.0], [8.8639813384304, 29.80166808533521, 3.7779157457804677, 1.0, 2.0]], [[7.330122458689714, 7.134663826973303, 1.821195975303051, 1.0, 2.0], [8.870937707624028, 26.34538309194243, 3.4006107797408274, 1.0, 2.0]], [[7.26035626554402, 6.421406965151531, 1.6671824670731326, 1.0, 2.0], [8.8510563717393, 22.62430679771653, 3.0614454305057435, 1.0, 2.0]], [[7.189419949763848, 5.8854060659773655, 1.5393382888665041, 1.0, 2.0], [8.806296376829623, 19.070904427210404, 2.749207632305507, 1.0, 2.0]], [[7.120852454105224, 5.468691872106864, 1.4351537216679122, 1.0, 2.0], [8.739859477351459, 16.231781093024395, 2.4494462725760946, 1.0, 2.0]], [[7.0576744529552204, 5.13609914437256, 1.3501702813542864, 1.0, 2.0], [8.654632993686494, 13.500137566484286, 2.1671513431383174, 1.0, 2.0]], [[7.001799168616514, 4.85971850659582, 1.2782833580268385, 1.0, 2.0], [8.554848837297085, 10.946174563964062, 1.9004282219433888, 1.0, 2.0]], [[6.95365097217417, 4.617472771577808, 1.2137075646869557, 1.0, 2.0], [8.442864742324128, 8.855332228203068, 1.6483365117502147, 1.0, 2.0]], [[6.912667039822334, 4.390890205473397, 1.1513087720166342, 1.0, 2.0], [8.313388581474689, 7.143642546910204, 1.4145485395728241, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [8.17683525726965, 5.907892258426841, 1.1963250986536198, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [8.030697679458036, 4.9571185617261255, 0.9971378531917371, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.86753704946749, 4.153075191628574, 0.8235626272153183, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.709008907235316, 3.462142609827311, 0.6781630457772098, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.562368546236133, 2.8773781914244716, 0.5636174067843639, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.43500450523736, 2.388893861263614, 0.4757517776897964, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.3318241783502955, 1.9958134114999928, 0.404748620281771, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.254012672010611, 1.6447939245277705, 0.3380392904337977, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.197390938677085, 1.3059491740756957, 0.2710225549861916, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.158410434693116, 0.9776067636858864, 0.2043205254461559, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.1346555595970145, 0.6680537625579663, 0.14033755808114648, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.125372518850474, 0.39085259904674036, 0.08238236864028278, 1.0, 2.0]]]], "sails": ["MN1 + J1", "MN1 + S1"], "twa": [28.0, 32.0, 36.0, 40.0, 44.0, 48.0, 52.0, 56.0, 60.0, 64.0, 68.0, 72.0, 76.0, 80.0, 84.0, 88.0, 92.0, 96.0, 100.0, 104.0, 108.0, 112.0, 116.0, 120.0, 124.0, 128.0, 132.0, 136.0, 140.0, 144.0, 148.0, 152.0, 156.0, 160.0, 164.0, 168.0, 172.0, 176.0, 180.0], "tws": [2.0576, 3.0864, 4.1152, 5.144, 6.1728, 7.201599999999999, 8.2304, 9.2592, 10.288]} \ No newline at end of file diff --git a/dat/polars_YD41.json b/dat/polars_YD41.json new file mode 100644 index 0000000..d6a3bd5 --- /dev/null +++ b/dat/polars_YD41.json @@ -0,0 +1 @@ +{"name": "YD41", "results": [[[[1.466443204466604, 1.9687236635422556, 9.744372563963667, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[2.1720303711293996, 2.453096912515347, 5.531985750853971, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[2.5805310238664863, 2.7313866252033225, 4.376929495858492, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[2.9039146927016426, 2.9146670952734364, 3.7112808645435815, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[3.1746678038633656, 3.0329197656697455, 3.249206904895008, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[3.3959354436770393, 3.0945444851968564, 2.90740737260603, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[3.5826369069803463, 3.117805068964392, 2.63645809828962, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[3.7340452396056336, 3.107194968776223, 2.418903678467735, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[3.8530794217521245, 3.0658273953577257, 2.2384437634863223, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[3.9458569837200574, 2.998692277091182, 2.0828082304710214, 1.0, 2.0], [2.8875400292098345, 3.262039654400316, 3.7333011562554224, 1.0, 2.0]], [[4.0112434373235795, 2.9055342006915037, 1.947223158975777, 1.0, 2.0], [3.1323028133869384, 3.426888532590636, 3.3646681099161153, 1.0, 2.0]], [[4.051367615214732, 2.787544870503339, 1.8262231003921967, 1.0, 2.0], [3.3471480298356773, 3.5538672565724174, 3.0793251220647893, 1.0, 2.0]], [[4.066885279592211, 2.64472345206314, 1.7164631247544897, 1.0, 2.0], [3.536457931670645, 3.640917440078428, 2.841052832064935, 1.0, 2.0]], [[4.059816750921132, 2.477185230421188, 1.614442581654355, 1.0, 2.0], [3.69821507047096, 3.685268695905525, 2.6361732180106827, 1.0, 2.0]], [[4.02879501967821, 2.2900315421291935, 1.5190417064916752, 1.0, 2.0], [3.828103974393655, 3.6845078014672588, 2.458392454866436, 1.0, 2.0]], [[3.9740914404980203, 2.089359914043716, 1.428243827990522, 1.0, 2.0], [3.930967336607002, 3.6402342110477908, 2.295324747664335, 1.0, 2.0]], [[3.8997429652050073, 1.8786505303329295, 1.3375962718879835, 1.0, 2.0], [4.006816730829385, 3.5538947129486553, 2.143397036918551, 1.0, 2.0]], [[3.8074895431658784, 1.6596104513916887, 1.2431824968849148, 1.0, 2.0], [4.056398024961588, 3.428149379254611, 2.0001162645048693, 1.0, 2.0]], [[3.6923583397779485, 1.4325973514725254, 1.1442929606881083, 1.0, 2.0], [4.08161163777306, 3.2672948319562383, 1.8638970593303739, 1.0, 2.0]], [[3.5431122928454672, 1.2009451940692293, 1.0447880510088887, 1.0, 2.0], [4.08570851495697, 3.0771918441537056, 1.7338849712729054, 1.0, 2.0]], [[3.3724994413656493, 0.9831441679017222, 0.9467674787373512, 1.0, 2.0], [4.070250669991137, 2.8592937321757206, 1.6086752942125486, 1.0, 2.0]], [[3.19497418089981, 0.7937094561317898, 0.8538886609991772, 1.0, 2.0], [4.03470561180401, 2.609997855525801, 1.4862254047088455, 1.0, 2.0]], [[3.010744577170006, 0.6336317289703843, 0.7690615896853764, 1.0, 2.0], [3.97791828114129, 2.328081182677475, 1.364384555864072, 1.0, 2.0]], [[2.830173673899916, 0.5044700064446328, 0.6928448987413969, 1.0, 2.0], [3.8975595347058376, 2.0294481301570446, 1.240628923810526, 1.0, 2.0]], [[2.6600290701375044, 0.4055746672513865, 0.6289902987710352, 1.0, 2.0], [3.7923082614234946, 1.7210377560164627, 1.1130611056070263, 1.0, 2.0]], [[2.4998011983736195, 0.3341831688968562, 0.5844054883793821, 1.0, 2.0], [3.6649706575505863, 1.4152754924719901, 0.9817836824541604, 1.0, 2.0]], [[2.3620814619730774, 0.2860474427126747, 0.5576380631952852, 1.0, 2.0], [3.5140168308904647, 1.1231306288263765, 0.8493286351382265, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [3.349554832264497, 0.8603103619715405, 0.7179796851677082, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [3.1759412913624328, 0.6350139184517128, 0.5915252699131046, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [2.9941862243209756, 0.4521556659814602, 0.47578091018471186, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [2.8179125070408717, 0.31479351150847973, 0.3749083395299914, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [2.6528854236248343, 0.2152846741063297, 0.2887582996711997, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [2.4936682395108942, 0.14473300131291522, 0.21811110435138142, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [2.3540250425481553, 0.10066906996887316, 0.16842004190729562, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [2.2463491062857717, 0.07554124546881906, 0.1373075727923463, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [2.1729171669316885, 0.05792925734053906, 0.1115819329255666, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [2.126733194900092, 0.04152568195780101, 0.08302837111758321, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [2.1003641515331806, 0.02607159326453988, 0.05330391050485933, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [2.090852702985287, 0.012666082036369469, 0.0261378348744319, 1.0, 2.0]]], [[[2.4737716972693136, 4.239412055366887, 8.105210714606995, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[3.3431322606735128, 4.86011749701818, 5.305472561757502, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[3.908811739528998, 5.256908073968549, 4.292066658565061, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[4.345737393076694, 5.521811135487358, 3.6923305001427322, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[4.679365503318879, 5.663199116375839, 3.285201482956084, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[4.9621862204167755, 5.728411670523687, 2.963140445284797, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[5.20384604791947, 5.73803788712105, 2.701285906603281, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[5.408751656312433, 5.7026630409286705, 2.483822601833063, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[5.592037223961068, 5.636526483095674, 2.293097945551904, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[5.733432355768417, 5.524872917093433, 2.1309444266091453, 1.0, 2.0], [4.32880202548838, 6.170840852932877, 3.7015683447749193, 1.0, 2.0]], [[5.827938552827057, 5.367786387861557, 1.9924720986308297, 1.0, 2.0], [4.656031312081139, 6.51240728135608, 3.386665340901227, 1.0, 2.0]], [[5.882998801158907, 5.174844029238509, 1.8699119370624289, 1.0, 2.0], [4.949125464566528, 6.793350123274788, 3.124339547050959, 1.0, 2.0]], [[5.9028296857097855, 4.95214183815529, 1.7585516371506515, 1.0, 2.0], [5.209017506628885, 6.991374867841316, 2.895894745668189, 1.0, 2.0]], [[5.892395792733069, 4.704514604130625, 1.6542260658779344, 1.0, 2.0], [5.434642504814564, 7.08547338223687, 2.6913978993878964, 1.0, 2.0]], [[5.846627275239901, 4.4304981971563455, 1.5569309711580994, 1.0, 2.0], [5.630204004005143, 7.070688556052892, 2.501830487662018, 1.0, 2.0]], [[5.7690642665420935, 4.130534256329744, 1.462839075652214, 1.0, 2.0], [5.783930104502855, 6.94570299300006, 2.331330359720353, 1.0, 2.0]], [[5.654353261904591, 3.7970465000159352, 1.369772563364473, 1.0, 2.0], [5.89018116560321, 6.722290919738361, 2.1780146317630265, 1.0, 2.0]], [[5.50815206555406, 3.4268758634656633, 1.2728270114258955, 1.0, 2.0], [5.957314802786952, 6.429382152303828, 2.0343257751959993, 1.0, 2.0]], [[5.32300530391665, 3.010201772049142, 1.1720284858113454, 1.0, 2.0], [5.991938586300841, 6.094988036787457, 1.8972048615396049, 1.0, 2.0]], [[5.130866647232881, 2.5699325031099725, 1.0661059319946216, 1.0, 2.0], [5.998386847897338, 5.738584107012653, 1.765811500846544, 1.0, 2.0]], [[4.9133241495958355, 2.123916870061351, 0.9634702538693399, 1.0, 2.0], [5.977067280802476, 5.363638172964464, 1.6383592409060224, 1.0, 2.0]], [[4.692210785641474, 1.7363229739299713, 0.865912729323033, 1.0, 2.0], [5.926917316839581, 4.968167445754529, 1.5128270910719752, 1.0, 2.0]], [[4.4676315428486095, 1.4067299548961283, 0.7751709118012813, 1.0, 2.0], [5.844810893360401, 4.546491559569983, 1.3873767873465506, 1.0, 2.0]], [[4.250250874514544, 1.1363295162292086, 0.6918306839424475, 1.0, 2.0], [5.722533692257139, 4.086825796394425, 1.2605063596478059, 1.0, 2.0]], [[4.011505372142932, 0.9164580265579376, 0.6249281345941338, 1.0, 2.0], [5.558018538208868, 3.5826047528204943, 1.130782499938136, 1.0, 2.0]], [[3.7855576139873435, 0.7551794261397828, 0.5759811779114802, 1.0, 2.0], [5.361779835037904, 3.0350824231027764, 0.9972616158233976, 1.0, 2.0]], [[3.587364727573536, 0.6442966132630777, 0.5447200785904941, 1.0, 2.0], [5.156664544329106, 2.450695647772455, 0.8601333147287983, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [4.933741068728726, 1.8858304140173443, 0.7253266320789954, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [4.701409877731261, 1.402118185985001, 0.5960753501604621, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [4.462630093478949, 1.0088142660229173, 0.47786487286300927, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [4.232501252330723, 0.7092681077069728, 0.3743914027981775, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [3.9927292545077275, 0.48575263267485635, 0.28764526034204585, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [3.763727037817833, 0.32655420615687825, 0.216093484782218, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [3.5595474482692775, 0.22601610130131203, 0.16544594374605753, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [3.399169785855831, 0.16860227906745454, 0.13388534869494778, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [3.2895012522299623, 0.1289442564553336, 0.10839614450279286, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [3.2206020704173444, 0.09226576104219801, 0.08045243839647087, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [3.1813245758636053, 0.05776697212422583, 0.0514812869375764, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [3.167183267914418, 0.027886920081926125, 0.02508003197389535, 1.0, 2.0]]], [[[3.4160236519060483, 6.876493082484946, 7.609850656320179, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[4.435839532533728, 8.256516945447286, 5.261663820638255, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[5.089993290839504, 9.13978045194458, 4.341801284285353, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[5.688137908921774, 9.834409753238024, 3.693248011804889, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.170146155545628, 10.300089554806501, 3.2479002773052916, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.53695025455404, 10.475140953295988, 2.9284339524296974, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.8168804750535275, 10.422746984963046, 2.685358809847546, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[7.0187849720317175, 10.18347481307092, 2.495391563990694, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[7.170255059526085, 9.8494021952405, 2.334679222971469, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[7.286176726706274, 9.471721980794177, 2.1919123713319975, 1.0, 2.0], [5.716118213535412, 11.922300149963686, 3.6548221459414965, 1.0, 2.0]], [[7.362198226188086, 9.01626171254767, 2.0647705900977047, 1.0, 2.0], [6.17411096630814, 12.847487673090924, 3.3000693728708117, 1.0, 2.0]], [[7.3938597832135, 8.481882536530017, 1.9509566633652773, 1.0, 2.0], [6.5579264012544165, 13.55172062292723, 3.0367729295963883, 1.0, 2.0]], [[7.40581428087879, 7.906069442881667, 1.8406253054915909, 1.0, 2.0], [6.871512751487709, 13.993055339733411, 2.828796061766008, 1.0, 2.0]], [[7.396716724711996, 7.298232990952195, 1.7331150454896, 1.0, 2.0], [7.110172482998592, 14.134054036945466, 2.659745808582534, 1.0, 2.0]], [[7.367108912318681, 6.733854080061361, 1.6264194711658773, 1.0, 2.0], [7.299239690768222, 13.992317451171928, 2.504092221278225, 1.0, 2.0]], [[7.303354895793049, 6.197336507103388, 1.5209415078787725, 1.0, 2.0], [7.420000579437259, 13.560979305800466, 2.3680568266588895, 1.0, 2.0]], [[7.207640266405301, 5.672094871305494, 1.4130721359579417, 1.0, 2.0], [7.496743637083899, 12.897915898801978, 2.2373699616557596, 1.0, 2.0]], [[7.083211621031964, 5.1495841668297615, 1.300987301930698, 1.0, 2.0], [7.547155555372408, 12.073112207078978, 2.106477182882998, 1.0, 2.0]], [[6.921674118849875, 4.620590600817437, 1.187086183608728, 1.0, 2.0], [7.574482828704005, 11.135935533922382, 1.9769698683880905, 1.0, 2.0]], [[6.706691699783162, 4.0767076005471985, 1.076119889700563, 1.0, 2.0], [7.580062409926973, 10.102371389180423, 1.8474975386669357, 1.0, 2.0]], [[6.456736771694664, 3.534230195833946, 0.970136608989394, 1.0, 2.0], [7.563660877145085, 9.153382921743995, 1.7145340543570338, 1.0, 2.0]], [[6.159252544053584, 2.9857327583566726, 0.8739988260225386, 1.0, 2.0], [7.521899120227662, 8.15262209821508, 1.5790488531487072, 1.0, 2.0]], [[5.844979515612433, 2.443872441097345, 0.7861309803886841, 1.0, 2.0], [7.453909235947439, 7.114533546522301, 1.4393257656290708, 1.0, 2.0]], [[5.505350871155961, 1.9598742536758706, 0.7105156888517455, 1.0, 2.0], [7.36018146311178, 6.231274241774936, 1.2940461144152569, 1.0, 2.0]], [[5.198972903340579, 1.5931694529298663, 0.6460657267143588, 1.0, 2.0], [7.200722491967303, 5.429562743786443, 1.151458386016806, 1.0, 2.0]], [[4.932329310639427, 1.3287357072660104, 0.5963849590255295, 1.0, 2.0], [7.011406621684053, 4.684393062814901, 1.007125994659468, 1.0, 2.0]], [[4.7056087971925855, 1.1436891723201206, 0.5615652294072029, 1.0, 2.0], [6.782134654651256, 3.956287179118778, 0.8650821090571785, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.511839090142024, 3.220926309134457, 0.7282216604362122, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.207056625604219, 2.4575190658573103, 0.5990074181723118, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [5.879148374589276, 1.7657897967169538, 0.48185739128650046, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [5.542005060523215, 1.2368785118568464, 0.38073441199484026, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [5.229484731355715, 0.8509308507092556, 0.29354173786198684, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [4.944422189404172, 0.5768050806066433, 0.22097970516077658, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [4.697233658240025, 0.4029325213220468, 0.16927698376347866, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [4.503447849730793, 0.30149733644562215, 0.13636099473250787, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [4.3701980155430995, 0.23020826597023256, 0.10963531522001918, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [4.286014876671067, 0.16444106518039778, 0.0809591484180229, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [4.237885213953814, 0.10284661050401787, 0.05165065997516278, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [4.220535925698012, 0.04963912768630499, 0.025139838505752223, 1.0, 2.0]]], [[[4.3642150280086796, 11.882147948856021, 7.158246488665328, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[5.50681677537023, 14.233473348786706, 5.118613423134392, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.3825014339288915, 15.91261321042148, 4.141158708661303, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.974640431075687, 16.778213191337628, 3.611776559116545, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[7.379571077170424, 17.029509592399467, 3.265000687166804, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[7.613933062472819, 16.76874580273004, 3.032854268242068, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[7.804380770841126, 16.370807679005825, 2.8364761375630336, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[7.936720513332981, 15.814947802908991, 2.674522851682463, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[8.024035596572169, 15.136914076036154, 2.5353330124912743, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[8.090579017597797, 14.387800130975721, 2.405538751852339, 1.0, 2.0], [7.051306267683094, 20.108340050273437, 3.559626413862963, 1.0, 2.0]], [[8.137223153878395, 13.567113467673497, 2.2823060448803063, 1.0, 2.0], [7.473120937762979, 21.766399938110503, 3.3182981067396953, 1.0, 2.0]], [[8.165730158888728, 12.674068290511013, 2.162390372310828, 1.0, 2.0], [7.774596254468748, 22.832115722673148, 3.156817215865508, 1.0, 2.0]], [[8.173517987737467, 11.709834090558147, 2.0455808193666676, 1.0, 2.0], [7.990792589871771, 23.243919876056097, 3.021143821950834, 1.0, 2.0]], [[8.162723044331074, 10.675121681645562, 1.9285210390495477, 1.0, 2.0], [8.148612070834194, 23.055215813426624, 2.8882402967166225, 1.0, 2.0]], [[8.135413951920725, 9.643178125656334, 1.8069672464855289, 1.0, 2.0], [8.27621148292921, 22.386007003837644, 2.746398642037713, 1.0, 2.0]], [[8.09203935757228, 8.669696507277022, 1.678131910229813, 1.0, 2.0], [8.375838563109133, 21.331495244124508, 2.602163027355578, 1.0, 2.0]], [[8.030269112284147, 7.6484521819350535, 1.5434705598412726, 1.0, 2.0], [8.456546290688877, 20.002224977817356, 2.4581798913945008, 1.0, 2.0]], [[7.950157104376421, 6.708343910469188, 1.4054282743142668, 1.0, 2.0], [8.516458350608016, 18.86494526466371, 2.311825155380926, 1.0, 2.0]], [[7.844363268103766, 5.940125242138668, 1.2686769609423065, 1.0, 2.0], [8.55085475944107, 17.5577817336795, 2.167630084433105, 1.0, 2.0]], [[7.68736440992961, 5.254011394046409, 1.140586070280918, 1.0, 2.0], [8.55755651793513, 16.0768142281158, 2.023725950675772, 1.0, 2.0]], [[7.520153518947545, 4.644549192403128, 1.018794487488612, 1.0, 2.0], [8.534118399950524, 14.422085340747946, 1.8777984923067357, 1.0, 2.0]], [[7.334639926532408, 4.079281746562334, 0.9052741369763955, 1.0, 2.0], [8.478794984978569, 12.607570454410384, 1.7274846942029563, 1.0, 2.0]], [[7.060801637969866, 3.5118303878879367, 0.807770511666708, 1.0, 2.0], [8.394617561069513, 10.68774601745193, 1.5716858888363716, 1.0, 2.0]], [[6.768895245672483, 2.9753608320715608, 0.7211145981066445, 1.0, 2.0], [8.29432889177885, 8.958401933452821, 1.407391075784011, 1.0, 2.0]], [[6.4530787150745965, 2.4753627933603837, 0.6508907295350319, 1.0, 2.0], [8.174634275402592, 7.375209465826472, 1.2397022594752767, 1.0, 2.0]], [[6.126395352020852, 2.0701934785647125, 0.6017948123207337, 1.0, 2.0], [8.039257077036119, 6.136738360008387, 1.0715340734605787, 1.0, 2.0]], [[5.834157149025811, 1.7857540007662183, 0.5700157276053274, 1.0, 2.0], [7.8918836781162, 5.176110479705312, 0.9076256362224912, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.681014172485156, 4.304013400906469, 0.7558612135768463, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.451399931750207, 3.486439209939955, 0.6150621064789923, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.164573218422065, 2.669371176760713, 0.4911912210916965, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.8445454554581255, 1.908750988774421, 0.3850090860676341, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.5026339913776185, 1.3239007005635546, 0.2952505708278026, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.155397783049666, 0.8997451462708713, 0.22234033501838862, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [5.839633231208529, 0.6305829493313966, 0.17134451071260648, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [5.58257766989246, 0.4747137705829874, 0.13966991061577766, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [5.405325870500573, 0.364144223638794, 0.11333137433701496, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [5.295637495910358, 0.26089021014966546, 0.08412677220292253, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [5.235859806218856, 0.1636792484137666, 0.053850959811672594, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [5.2136970767769535, 0.07960933995014603, 0.026420765635489857, 1.0, 2.0]]], [[[5.271797507690975, 18.41058676544011, 6.792149167763524, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[6.626997589870429, 22.00206964635687, 4.865699750636275, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[7.379744276845155, 23.996495260271196, 4.154276147205825, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[7.787687624293106, 24.456247829626715, 3.781560352548062, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[8.050841298439018, 24.13150592932138, 3.5077890637125044, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[8.253617970871044, 23.503197127707164, 3.280894062480746, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[8.432030858755256, 22.752362533663295, 3.080176144732135, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[8.5960017868478, 21.9007468961329, 2.8965063707093144, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[8.727706385221893, 20.8872297003851, 2.73410468201566, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[8.82913398650827, 19.78614932131451, 2.586603405063335, 1.0, 2.0], [7.916183731688818, 31.851368270820277, 4.458654153285521, 1.0, 2.0]], [[8.901871723494377, 18.802941098768176, 2.4464026080891936, 1.0, 2.0], [8.232013642324942, 33.862183617239396, 4.308536565444078, 1.0, 2.0]], [[8.944183257540443, 17.697405046255405, 2.3151032995849388, 1.0, 2.0], [8.524176716738884, 34.88361194004348, 4.109649193130662, 1.0, 2.0]], [[8.954957935053045, 16.464662006204385, 2.189886642168701, 1.0, 2.0], [8.730937924976706, 33.74522035264, 3.7593389141333615, 0.96, 2.0]], [[8.936883115713156, 15.098499644577041, 2.065327973774253, 1.0, 2.0], [9.03386356448439, 34.664923842314046, 3.6383964297634646, 1.0, 2.0]], [[8.893641730525081, 13.59823148615443, 1.9360264361793396, 1.0, 2.0], [9.24237979238923, 33.661878871114205, 3.397507269044959, 1.0, 2.0]], [[8.820535422285863, 11.969112118174703, 1.8009624818264982, 1.0, 2.0], [9.41690215408725, 32.180447902770304, 3.16568041128614, 1.0, 2.0]], [[8.715721123711772, 10.263744300537562, 1.6622710162024625, 1.0, 2.0], [9.558425852823428, 30.256958625028776, 2.944768563514454, 1.0, 2.0]], [[8.585432841985465, 8.807328990262986, 1.5199074822241516, 1.0, 2.0], [9.699674570752213, 28.540440005108486, 2.3954518878281683, 1.0, 2.0]], [[8.437976886593935, 7.464563121287061, 1.37967547591743, 1.0, 2.0], [9.753280007276892, 26.438325504033838, 2.226808893436724, 1.0, 2.0]], [[8.2929027472294, 6.417180302954603, 1.2416657566974816, 1.0, 2.0], [9.761037934581877, 23.928875415481635, 2.0688190460975413, 1.0, 2.0]], [[8.145687040294893, 5.625400076187949, 1.1091095768761647, 1.0, 2.0], [9.718541958410551, 20.975157619911, 1.9199990228937278, 1.0, 2.0]], [[7.996047233770285, 4.96244272185838, 0.9842111350772786, 1.0, 2.0], [9.62751775899286, 18.269598748858964, 1.7703429624778175, 1.0, 2.0]], [[7.832779562513072, 4.373224366446276, 0.869532368043038, 1.0, 2.0], [9.493760457886879, 15.654212408660836, 1.6178297894710554, 1.0, 2.0]], [[7.618602961617297, 3.829043065946514, 0.7721471622254084, 1.0, 2.0], [9.327486267495194, 12.9712449057027, 1.4617994425326744, 1.0, 2.0]], [[7.405406993779127, 3.3469387554528254, 0.6889246739001036, 1.0, 2.0], [9.133897225132309, 10.321490190968664, 1.3014843620570087, 1.0, 2.0]], [[7.138853095611724, 2.9208774290242108, 0.6301402373029622, 1.0, 2.0], [8.918322640413637, 8.177389658614658, 1.1357560714217363, 1.0, 2.0]], [[6.877809264532507, 2.5683534565813053, 0.5892836770837625, 1.0, 2.0], [8.69614942646731, 6.440265937491049, 0.9691081400663917, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [8.462705030762637, 5.252611242747065, 0.8081013492993321, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [8.239039972077629, 4.292993740666003, 0.6581412222310874, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [8.023484739803664, 3.437973286501897, 0.5235478782905028, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.794379225978326, 2.6165051162956128, 0.40684972088279897, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.523436975467532, 1.8558520144250321, 0.30867101692688104, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.228066291368693, 1.2857510475582707, 0.23011192286415832, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.918803801045706, 0.9117494925253345, 0.1763514042501875, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.65575785245582, 0.6876668169187401, 0.14229516646999113, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.469278045634348, 0.5259544418682607, 0.11426599585467954, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.346446855146636, 0.3763181638524641, 0.08448781944091113, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.27421108484278, 0.23621301316323487, 0.05411996194470756, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [6.247457113443134, 0.1149961185857931, 0.02657961411580675, 1.0, 2.0]]], [[[6.288645029947406, 27.48090718410077, 6.327375740656448, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[7.188384094707268, 30.42223035257324, 5.9910657258275855, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[7.850363208894048, 32.43047971268309, 5.253434042902328, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[8.213826906950262, 32.53515862197341, 4.8126630538567845, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[8.542679529894022, 32.15221223170792, 4.414625563788253, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[8.850654937194147, 31.5884223117675, 4.065296587970819, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[9.134004301719385, 30.827522531787512, 3.757428831259385, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[9.444209864676372, 29.999997225030516, 3.030295854463297, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[9.656451793921251, 29.118279652701652, 2.837431113010142, 1.0, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[9.810398436433859, 27.928536736826146, 2.657264132052136, 1.0, 2.0], [7.521116867199482, 33.589169755583335, 4.49537604049554, 0.6599999999999997, 2.0]], [[9.92261657682547, 26.49641636703136, 2.4949863961192342, 1.0, 2.0], [7.798508383495907, 33.95887712850115, 4.173715754001697, 0.6399999999999997, 2.0]], [[9.983447027228003, 24.792681395627557, 2.3515287282068176, 1.0, 2.0], [7.97222278150839, 33.420821428835865, 3.9090884048648964, 0.6199999999999997, 2.0]], [[10.000389432749698, 22.80397247667701, 2.2199738030771083, 1.0, 2.0], [8.274009130005508, 33.887936411463926, 3.7108517258635243, 0.6399999999999997, 2.0]], [[9.974360596459947, 20.498898380766086, 2.095728540835119, 1.0, 2.0], [8.581441287151572, 33.99096695876541, 3.496558928686289, 0.6599999999999997, 2.0]], [[9.90589819047706, 18.44609050257046, 1.9671231331466568, 1.0, 2.0], [8.88750692599785, 33.73937237562363, 3.2756928020670513, 0.6799999999999997, 2.0]], [[9.787011929631571, 16.3237193481282, 1.8369261060257243, 1.0, 2.0], [9.298635505357382, 33.90443248235699, 3.0585835632080944, 0.7199999999999998, 2.0]], [[9.62275171984152, 14.094272606738388, 1.7070000497492734, 1.0, 2.0], [9.690980052584367, 33.61609623321106, 2.8447051626929474, 0.7599999999999998, 2.0]], [[9.42408219918409, 11.877471516304732, 1.5778115271562885, 1.0, 2.0], [10.16442029638274, 33.65261390870469, 2.6470294101900045, 0.8199999999999998, 2.0]], [[9.213399190500132, 9.831586941773747, 1.4489225406549975, 1.0, 2.0], [10.591612444728877, 33.163405500986855, 2.4618761299292333, 0.8799999999999999, 2.0]], [[8.994058434390924, 8.250246269594156, 1.3197913601401297, 1.0, 2.0], [11.231251713907772, 34.72224168942384, 2.3634678117882926, 1.0, 2.0]], [[8.77882219701609, 6.895509927774853, 1.193406563986141, 1.0, 2.0], [11.199258872579549, 30.389370707871436, 2.1581077103662687, 1.0, 2.0]], [[8.567292663508592, 5.947772682077528, 1.0715513372727108, 1.0, 2.0], [11.099122460226177, 26.531334392653104, 1.7295378988192678, 1.0, 2.0]], [[8.362849694356703, 5.220010291650533, 0.9583425200173957, 1.0, 2.0], [10.899147058961244, 22.175426346716964, 1.5837848244015762, 1.0, 2.0]], [[8.18002239376749, 4.630577709235516, 0.8562420569395744, 1.0, 2.0], [10.651691473895774, 18.1546350643028, 1.4433686427380235, 1.0, 2.0]], [[8.007117654357069, 4.138639407185775, 0.7692071050171683, 1.0, 2.0], [10.366248131196807, 14.692663253872102, 1.2988772980263845, 1.0, 2.0]], [[7.8367134903465105, 3.7264573470857685, 0.6991180189987227, 1.0, 2.0], [10.060394135783215, 11.373027971776178, 1.1500602696712507, 1.0, 2.0]], [[7.64008351712097, 3.3806989893326724, 0.6492355375137421, 1.0, 2.0], [9.738153750452142, 8.599963771398713, 0.9956592055139517, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [9.407765110122698, 6.516619225835338, 0.8416354475353955, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [9.084592033407393, 5.199208364606906, 0.6948541612594556, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [8.77858108969821, 4.181027224260174, 0.5611862328421923, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [8.491309503264228, 3.2838552035357083, 0.4415113911398489, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [8.228969127462207, 2.430432431540474, 0.33684362355387015, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.9919348246606425, 1.7297282380488945, 0.25244947655996275, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.758790407420485, 1.260274351846204, 0.19343104249052911, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.54750308875917, 0.9607058368980056, 0.15441899206488938, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.393920356050865, 0.7326863119133138, 0.12179697747217351, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.2798943621761945, 0.5234124626169141, 0.0892932105748403, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.207645778026031, 0.32921526740114637, 0.05715463721562342, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.181419318307374, 0.1615663208810269, 0.028261872013729327, 1.0, 2.0]]], [[[6.813344146745539, 33.59323026925228, 5.999999999999999, 0.7799999999999998, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[7.306335598229763, 33.53486207217689, 4.638745365473838, 0.6599999999999997, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[7.740996260008162, 33.80733263690511, 4.065241139198995, 0.6399999999999997, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[8.100246775306529, 33.9202852614102, 3.8105628033347925, 0.6599999999999997, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[8.4012401267082, 33.66942506031045, 3.6031231887970505, 0.6799999999999997, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[8.722054662780106, 33.41399291399808, 3.397702504733758, 0.6999999999999997, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[9.11947047132698, 33.64700978010206, 3.256349833530392, 0.7399999999999998, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[9.525517714794642, 33.76963611660978, 3.1113556156138777, 0.7799999999999998, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[9.927576912905058, 33.717958904731546, 2.9676824466174865, 0.8199999999999998, 2.0], [0.0, 0.0, 0.0, 0.0, 0.0]], [[10.32108049432837, 33.45282700075287, 2.825452275768439, 0.8599999999999999, 2.0], [7.088509675430357, 33.63185526191406, 5.047710662221328, 0.62, 0.6999999999999988]], [[10.80564300883069, 33.65138732118693, 2.7166884350699325, 0.9199999999999999, 2.0], [7.390070109206815, 32.92435864858276, 4.54480056978802, 0.62, 0.5999999999999988]], [[11.24381229253054, 34.12097071999539, 2.693303738122572, 1.0, 2.0], [7.774741730037183, 33.60796419936823, 4.174705238106998, 0.62, 0.5999999999999988]], [[11.308138344809922, 31.375885072011204, 2.5107963607131016, 1.0, 2.0], [8.062218220289157, 33.761219413640035, 3.90147276015421, 0.62, 0.5999999999999988]], [[11.351860379195864, 28.67245937029696, 2.0491798204243454, 1.0, 2.0], [8.308663917321795, 33.45965861987841, 3.654924400409827, 0.62, 0.5999999999999988]], [[11.244173361855516, 25.664704695117884, 1.9160335850490458, 1.0, 2.0], [8.546929462327265, 32.70284876952238, 3.4028159538776697, 0.62, 0.5999999999999988]], [[11.051878273072248, 22.138122555978324, 1.7973818063266112, 1.0, 2.0], [8.923688237630435, 33.07957469733501, 3.1724894404011597, 0.62, 0.6999999999999988]], [[10.798110965812713, 18.751879075844453, 1.6856711213951274, 1.0, 2.0], [9.305802875482845, 33.27589896743976, 2.9415983170146576, 0.62, 0.7999999999999989]], [[10.498939650565735, 15.92631569535967, 1.5744381224126058, 1.0, 2.0], [9.67401248456851, 33.273839517294896, 2.7210615504928843, 0.62, 0.899999999999999]], [[10.19739880959122, 13.286467900864753, 1.4631658673795562, 1.0, 2.0], [10.180309554655686, 33.964593080556895, 2.503500010711249, 0.6399999999999997, 2.0]], [[9.889642909774565, 10.868721473637308, 1.3525978641385792, 1.0, 2.0], [10.876697128554802, 33.84783937579691, 2.2575705049051384, 0.7199999999999998, 2.0]], [[9.590288405154606, 8.935497735757428, 1.2399269192234383, 1.0, 2.0], [11.505464434798641, 33.11879476549905, 2.040906292033431, 0.7999999999999998, 2.0]], [[9.299577389701424, 7.3845964145291685, 1.1296729526232383, 1.0, 2.0], [12.323847026697168, 33.60274713199711, 1.8671925937819647, 0.9199999999999999, 2.0]], [[9.023293946838244, 6.292964661329746, 1.0266394924478577, 1.0, 2.0], [12.635322547554635, 31.42020555217304, 1.7384462729898578, 1.0, 2.0]], [[8.770503994990161, 5.543107677002834, 0.935303463385224, 1.0, 2.0], [12.327933060182435, 25.798029436971536, 1.3756619079300285, 1.0, 2.0]], [[8.542522548496285, 4.982742809495661, 0.8593085821904615, 1.0, 2.0], [11.923776194827521, 20.02155569567748, 1.248367234946065, 1.0, 2.0]], [[8.34514021604737, 4.546807896833424, 0.7965652344430985, 1.0, 2.0], [11.48174184636962, 15.769631775158215, 1.1187073016610856, 1.0, 2.0]], [[8.186302505211433, 4.192228865932309, 0.741923240808631, 1.0, 2.0], [11.020915949824643, 11.797271866791899, 0.9859881296068826, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [10.563009843630434, 8.588519844793533, 0.8481133161031785, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [10.126569082042202, 6.368123832445109, 0.710958581764812, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [9.718425290303996, 5.024084950018549, 0.581665532151974, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [9.33484934053363, 3.977240545561145, 0.46389176302435525, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [8.975237701329595, 3.058053266015285, 0.3610285023074956, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [8.660333580133546, 2.2528622662612823, 0.2791642992352101, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [8.397131513448263, 1.689703964593218, 0.22082621879234174, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [8.207899880498516, 1.3121317556310998, 0.17802131900384408, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [8.07525986603822, 1.0047086467603679, 0.1398900842485635, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.988401983425403, 0.7183162362031982, 0.1017336193778719, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.937539226368983, 0.45394536959041537, 0.06497759825943904, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [7.918878206013634, 0.22693673878258463, 0.032647158014265064, 1.0, 2.0]]], [[[6.572482912545406, 33.00445696377316, 5.914743263237024, 0.62, 1.5999999999999996], [0.0, 0.0, 0.0, 0.0, 0.0]], [[7.48153414632939, 33.783902952553035, 4.870884158594458, 0.62, 1.3999999999999995], [0.0, 0.0, 0.0, 0.0, 0.0]], [[7.946854464993051, 33.2254816482042, 4.367860912125525, 0.62, 1.2999999999999994], [0.0, 0.0, 0.0, 0.0, 0.0]], [[8.263926828855205, 33.77020497510605, 3.995345408324844, 0.62, 1.3999999999999995], [0.0, 0.0, 0.0, 0.0, 0.0]], [[8.549237076495809, 33.11469903520022, 3.6809425323222627, 0.62, 1.3999999999999995], [0.0, 0.0, 0.0, 0.0, 0.0]], [[8.829991896819282, 33.35719515353439, 3.3918177536695775, 0.62, 1.4999999999999996], [0.0, 0.0, 0.0, 0.0, 0.0]], [[9.084942872413615, 33.392045310986525, 3.136177477226683, 0.62, 1.5999999999999996], [0.0, 0.0, 0.0, 0.0, 0.0]], [[9.30989288456775, 33.17119605064004, 2.9073715419494737, 0.62, 1.6999999999999997], [0.0, 0.0, 0.0, 0.0, 0.0]], [[9.512966147050976, 33.604651674745185, 2.691079975864823, 0.62, 1.9], [0.0, 0.0, 0.0, 0.0, 0.0]], [[9.65373411220077, 31.757178357553645, 2.5098809236977275, 0.62, 1.9], [1.0414238203674515e-12, 33.95485038128803, 5.999997498754018, 0.6599999999999997, 2.0]], [[10.153329903262122, 33.54995397745437, 2.4263003251766313, 0.6599999999999997, 2.0], [1.394263293687138e-11, 33.68327450460481, 5.9999999499430725, 0.6799999999999997, 2.0]], [[10.6990534545304, 33.405867542326895, 2.3255760177302824, 0.7199999999999998, 2.0], [2.2818198987922742e-10, 33.664243949478205, 5.999999999999888, 0.7399999999999998, 2.0]], [[11.423856923035045, 33.86138649712342, 2.22574980734217, 0.7999999999999998, 2.0], [5.569228430975768, 34.99999999999999, 5.999999999999999, 0.62, 0.49999999999999867]], [[12.109303545259094, 33.99114956438282, 2.127097891065831, 0.8799999999999999, 2.0], [5.905271075192936, 34.99999999999999, 5.999999999999999, 0.62, 0.49999999999999867]], [[12.676041304306777, 33.57072729672309, 2.0458222578170258, 0.96, 2.0], [6.379536611256025, 34.99999999999999, 5.999999999999684, 0.62, 0.49999999999999867]], [[12.686510961052011, 30.32871244526521, 1.9630698976019039, 1.0, 2.0], [7.698922307948692, 34.99999999999999, 3.756549119248514, 0.62, 0.49999999999999867]], [[12.387182599861704, 26.009876061302286, 1.601728042095589, 1.0, 2.0], [8.634724715592698, 34.99999999999999, 3.181065825773816, 0.62, 0.49999999999999867]], [[11.941985400795891, 21.27020772143054, 1.508734033843744, 1.0, 2.0], [9.601128995432399, 34.99999999999999, 2.8150629415821378, 0.62, 0.49999999999999867]], [[11.47721794770487, 17.547400476020368, 1.422091568272813, 1.0, 2.0], [10.079001170859405, 33.75999811389845, 2.5501570801238573, 0.62, 0.5999999999999988]], [[11.021465297430568, 14.461625852153452, 1.334566113938895, 1.0, 2.0], [10.636101887658022, 33.90627433229769, 2.319301465402758, 0.62, 0.7999999999999989]], [[10.594689451189044, 11.738634485055297, 1.2441527132018315, 1.0, 2.0], [10.94929241532092, 32.16029294441503, 2.106177821095229, 0.62, 0.899999999999999]], [[10.19864453320194, 9.503161359884306, 1.1521027310338212, 1.0, 2.0], [12.01116582000109, 33.83490660359314, 1.85509592512426, 0.6999999999999997, 2.0]], [[9.832547685694525, 7.897472457142241, 1.0639222914735205, 1.0, 2.0], [12.987327085773796, 33.59359300949969, 1.6380619533485896, 0.8199999999999998, 2.0]], [[9.501261800959343, 6.7136021283868414, 0.9866501663746031, 1.0, 2.0], [13.872939454507256, 33.43456606488459, 1.4901853641060776, 0.96, 2.0]], [[9.209969337911858, 5.972592378475535, 0.9227454724515702, 1.0, 2.0], [13.72731601257363, 28.019047774927333, 1.1864847693035827, 1.0, 2.0]], [[8.960530761039333, 5.451348284829015, 0.8708762789956592, 1.0, 2.0], [13.172964668564932, 21.291795200841122, 1.0625972209863026, 1.0, 2.0]], [[8.76137352942953, 5.049538412178139, 0.8245385437069984, 1.0, 2.0], [12.585626818109853, 16.034787307607065, 0.9451723731837746, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [11.97028256015321, 11.57309577517366, 0.8270042386890116, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [11.37724242377065, 8.199565618720754, 0.7057844395480941, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [10.830118491930433, 6.03803076567993, 0.5863137838967661, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [10.32747209049223, 4.718998868797659, 0.47357292814612256, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [9.86786493878921, 3.684295798212356, 0.3739477028698482, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [9.464663070489268, 2.836906954283715, 0.2956171622262788, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [9.138303298274144, 2.176643833269374, 0.2397826626151422, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [8.89320047839234, 1.7155834363566835, 0.19801102110508398, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [8.72908362484433, 1.323520912210762, 0.15758292166969165, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [8.621492720509506, 0.9530160731159656, 0.11583809800624711, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [8.5583724669945, 0.6088047781278993, 0.07495410496158504, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [8.535056822474992, 0.31131134974301927, 0.03855184249235403, 1.0, 2.0]]], [[[7.188941234734006, 30.000000102276566, 5.800033635523425, 0.62, 0.899999999999999], [0.0, 0.0, 0.0, 0.0, 0.0]], [[7.454734824122841, 30.057567265518202, 5.175000286899383, 0.62, 0.899999999999999], [0.0, 0.0, 0.0, 0.0, 0.0]], [[7.96450971536009, 30.39870627622797, 4.572996072945492, 0.62, 0.899999999999999], [0.0, 0.0, 0.0, 0.0, 0.0]], [[8.324702032830917, 30.0000005349509, 4.164792573958396, 0.62, 0.899999999999999], [0.0, 0.0, 0.0, 0.0, 0.0]], [[8.792609612087126, 30.000000599851287, 3.766775232463434, 0.62, 0.899999999999999], [0.0, 0.0, 0.0, 0.0, 0.0]], [[9.244687536962362, 30.000000031720937, 3.469083009382941, 0.62, 0.899999999999999], [0.0, 0.0, 0.0, 0.0, 0.0]], [[9.797326464559763, 30.00000013208399, 3.1021608818953403, 0.62, 0.899999999999999], [0.0, 0.0, 0.0, 0.0, 0.0]], [[10.318636204315467, 30.000000097043767, 2.874600505550636, 0.62, 0.899999999999999], [0.0, 0.0, 0.0, 0.0, 0.0]], [[10.154468350444334, 33.986988743712175, 2.8821548467681666, 0.62, 1.0999999999999992], [0.0, 0.0, 0.0, 0.0, 0.0]], [[10.360124681453808, 33.324296056091136, 2.6663798952989963, 0.62, 1.1999999999999993], [6.399226711128023e-11, 34.10200622661677, 5.049664977778041, 0.62, 0.49999999999999867]], [[10.538498713316832, 33.24267412902024, 2.4547442439101457, 0.62, 1.3999999999999995], [2.8253736605184056e-09, 33.76485334272993, 5.999999932332612, 0.62, 0.49999999999999867]], [[10.676421509842864, 33.54940179704009, 2.2477679922697384, 0.62, 1.6999999999999997], [2.9544519089796135e-12, 33.74619427921682, 5.583272533244793, 0.62, 0.5999999999999988]], [[10.720808104729588, 32.13802354049996, 2.065915074000696, 0.62, 1.9], [3.0473582797075607, 34.99999999999999, 5.999999999999999, 0.62, 0.49999999999999867]], [[11.45599392524277, 33.7389726235075, 1.9688655293254054, 0.6799999999999997, 2.0], [3.6378652937562532, 34.99999999999999, 5.999999999999999, 0.62, 0.49999999999999867]], [[12.250556921356123, 33.418879868117514, 1.854973315692043, 0.7599999999999998, 2.0], [4.310046427816248, 34.99999999999999, 5.999999999999999, 0.62, 0.49999999999999867]], [[13.161031341090673, 33.6278079062252, 1.76402346825213, 0.8599999999999999, 2.0], [5.032085081772627, 34.99999999999988, 5.999999999999995, 0.62, 0.49999999999999867]], [[13.86984817546222, 33.155976657583444, 1.6992166405321538, 0.96, 2.0], [5.810769571274297, 34.99999999999999, 5.999999999999909, 0.62, 0.49999999999999867]], [[13.711828195684722, 28.953263162628684, 1.4289476932875935, 1.0, 2.0], [6.674888678600625, 34.99999999999999, 5.999999999997529, 0.62, 0.49999999999999867]], [[13.101941589687918, 23.58451450081377, 1.3410302073621188, 1.0, 2.0], [8.83564284416122, 34.99999999999999, 2.709477786062981, 0.62, 0.49999999999999867]], [[12.49145344688311, 18.821865424090323, 1.270809460216882, 1.0, 2.0], [10.093526995690413, 34.99999999999999, 2.398327331230622, 0.62, 0.49999999999999867]], [[11.882294677741342, 15.369813924906738, 1.2019990387891095, 1.0, 2.0], [11.08467341446687, 33.71517484040477, 2.1150495554609012, 0.62, 0.49999999999999867]], [[11.31892479956128, 12.416630458868287, 1.1330506681757144, 1.0, 2.0], [11.578766841465791, 31.98183333706307, 1.897059003500423, 0.62, 0.6999999999999988]], [[10.812990403235046, 10.007115041883614, 1.0667380683008485, 1.0, 2.0], [12.122159885998023, 31.163168090602415, 1.704652446785871, 0.62, 0.899999999999999]], [[10.371803151717254, 8.45015384040974, 1.0062642685022107, 1.0, 2.0], [13.76470627507998, 33.80537215739341, 1.4483828546223338, 0.7599999999999998, 2.0]], [[10.000727083460228, 7.286646881361432, 0.9565511895985728, 1.0, 2.0], [14.93151609183371, 33.5209880009196, 1.2772909363285216, 0.9199999999999999, 2.0]], [[9.696359239362293, 6.535431129641379, 0.9148258957023293, 1.0, 2.0], [15.032490085479807, 28.762730055770966, 1.0135742975832862, 1.0, 2.0]], [[9.44914504005159, 6.014697420729558, 0.8773200357578451, 1.0, 2.0], [14.305096835659814, 21.0895170579466, 0.8979197083489541, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [13.554914749396987, 15.370842300432873, 0.7914619595933842, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [12.828569826995205, 10.716353416978224, 0.6842972033734672, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [12.136640779702068, 7.479499489608849, 0.5762933658339603, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [11.488904024518995, 5.560331802984953, 0.47134416630040515, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [10.895914462151044, 4.324242343730937, 0.37709150657605084, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [10.387152683096346, 3.4013232649455865, 0.3028562395161779, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [9.98456744290421, 2.704999553460147, 0.24993442581215106, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [9.690443857500581, 2.152655370456471, 0.20907496892267335, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [9.488708201436634, 1.66843242487284, 0.16802497427558158, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [9.3584196509167, 1.2064707358314788, 0.12442759307136363, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [9.282249666707768, 0.7753847486734907, 0.08114834346511057, 1.0, 2.0]], [[0.0, 0.0, 0.0, 0.0, 0.0], [9.254015807384794, 0.40128013863358475, 0.04227109633981996, 1.0, 2.0]]]], "sails": ["MN1 + J1", "MN1 + A2"], "twa": [28.0, 32.0, 36.0, 40.0, 44.0, 48.0, 52.0, 56.0, 60.0, 64.0, 68.0, 72.0, 76.0, 80.0, 84.0, 88.0, 92.0, 96.0, 100.0, 104.0, 108.0, 112.0, 116.0, 120.0, 124.0, 128.0, 132.0, 136.0, 140.0, 144.0, 148.0, 152.0, 156.0, 160.0, 164.0, 168.0, 172.0, 176.0, 180.0], "tws": [2.0576, 3.0864, 4.1152, 5.144, 6.1728, 7.201599999999999, 8.2304, 9.2592, 10.288]} \ No newline at end of file diff --git a/runDaring.py b/runDaring.py new file mode 100644 index 0000000..915306e --- /dev/null +++ b/runDaring.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 +""" +Velocity Prediction Program for the Daring sailing yacht. + +The Daring is a one-design keelboat designed by Arthur Robb, based on +his 5.5 Metre class yacht "Vision" (1956 Olympic silver medal). + +Published specifications (classicsailboats.org): + LOA: 9.90m | LWL: 7.01m | Beam: 1.98m | Draft: 1.35m + Displacement: 2000 kg | Upwind sail area: 29.73 m² + +Estimated parameters are documented in docs/plans/2026-02-27-daring-vpp.md. +All estimates are marked and can be refined with actual measurements. +""" +import logging + +import numpy as np + +from src.SailMod import Jib, Kite, Main +from src.VPPMod import VPP +from src.YachtMod import Rudder, ShortKeel, Yacht + +logging.basicConfig(level=logging.INFO) + +# --- Estimated GZ curve for classic 5.5m --- +# GM ~0.70m, ~50% ballast ratio, narrow beam (1.98m) +# See docs/plans/2026-02-27-daring-vpp.md for derivation +DARING_GZ = { + "Heel": [0.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0], + "GZ": [0.000, 0.120, 0.230, 0.310, 0.350, 0.330, 0.260], +} + +Daring = Yacht( + Name="Daring", + Lwl=7.01, # (published) waterline length + Vol=1.95, # (estimated) 2000kg / 1025 kg/m³ + Bwl=1.70, # (estimated) ~86% of Boa + Tc=0.45, # (estimated) canoe body draft + WSA=11.5, # (estimated) Delf series for narrow hull + Tmax=1.35, # (published) max draft incl. keel + Amax=0.38, # (estimated) Bwl × Tc × Cm(0.50) + Mass=2000, # (published) total displacement + Loa=9.90, # (published) length overall + Boa=1.98, # (published) beam overall + Ff=0.75, # (estimated) freeboard fore + Fa=0.55, # (estimated) freeboard aft + App=[ + ShortKeel(Length=1.2, Depth=0.90, Tc_ratio=0.15), # hull-integrated keel + Rudder(Cu=0.32, Cl=0.18, Span=0.75), # (estimated) separated rudder + ], + Sails=[ + Main("MN1", P=10.80, E=3.30, Roach=0.1, BAD=0.80), # (est.) ~19.6 m² + Jib("J1", I=8.50, J=2.70, LPG=2.70, HBI=0.50), # (est.) ~11.5 m² + Kite("S1", area=50.0, vce=4.50), # (est.) symmetric kite + ], + GZ=DARING_GZ, + crew_weight=240.0, # 3 crew × 80 kg +) + +vpp = VPP(Yacht=Daring) + +vpp.set_analysis( + tws_range=np.arange(4.0, 22.0, 2.0), + twa_range=np.linspace(30.0, 180.0, 31), +) + +vpp.run(verbose=False) +vpp.write("results_daring") +vpp.polar(3, True) +vpp.SailChart(True) diff --git a/src/SailMod.py b/src/SailMod.py index 1fbfb23..95fa8d3 100644 --- a/src/SailMod.py +++ b/src/SailMod.py @@ -7,33 +7,112 @@ __version__ = "1.0.1" __email__ = "M.Lauber@soton.ac.uk" -import numpy as np import matplotlib.pyplot as plt +import numpy as np from scipy import interpolate +SAIL_TYPES = { + "main": "main", + "main_low": "main_low", + "jib": "jib", + "jib_low": "jib_low", + "kite": "kite", + "sym_kite": "sym_kite", + "asym_cl_kite": "asym_cl_kite", + "asym_pole_kite": "asym_pole_kite", +} + + class Sail(object): - def __init__(self, name, type, area, vce, up=True): + def __init__(self, name, type, area, vce, up=True, data_source="orc", + cl_data=None, cd_data=None, sail_type=None): + """ + Base sail class. + Parameters + ---------- + name : str + Sail identifier (e.g. "J1", "A2"). + type : str + Sail type, used to load coefficient data from ``dat/.dat``. + One of ``"main"``, ``"jib"``, or ``"kite"``. + area : float + Sail area (m^2). + vce : float + Vertical centre of effort above deck (m). + up : bool, optional + Whether this is an upwind sail. Default is True. + data_source : str, optional + Coefficient data source directory under ``dat/``. Default "orc". + cl_data : dict, optional + User-provided CL data: ``{"awa": [...], "values": [...]}``. + cd_data : dict, optional + User-provided CD data: ``{"awa": [...], "values": [...]}``. + sail_type : str, optional + Override for the coefficient data file name. E.g. ``"main_low"``, + ``"sym_kite"``, ``"asym_cl_kite"``, ``"asym_pole_kite"``. + If None, uses *type*. + """ self.name = name self.type = type self.area = area self.vce = vce + # Determine which data file to load + coeff_file = sail_type if sail_type is not None else self.type # get sails coefficients - self._build_interp_func(self.type) + if cl_data is not None and cd_data is not None: + self._build_interp_func(coeff_file, data_source=data_source) + self._build_interp_from_arrays(cl_data, cd_data) + else: + self._build_interp_func(coeff_file, data_source=data_source) self.bk = 1.0 # always valid for main, only AWA<135 for jib self.up = up # is that an upwind sail? - def _build_interp_func(self, fname): - """ - build interpolation function and returns it in a list + def _build_interp_func(self, fname, data_source="orc"): + """Build cubic B-spline interpolation functions for CL and CD. + + Falls back to linear (k=1) if fewer than 4 data points are available. + Tries ``dat/{data_source}/{fname}.dat`` first, then ``dat/{fname}.dat``. """ - a = np.genfromtxt("dat/" + fname + ".dat", delimiter=",", skip_header=1) + import os + path = os.path.join("dat", data_source, fname + ".dat") + if not os.path.exists(path): + path = os.path.join("dat", fname + ".dat") + a = np.genfromtxt(path, delimiter=",", skip_header=1) self.kp = a[0, 0] - # linear for now, this is not good, might need to polish data outside - self.interp_cd = interpolate.interp1d(a[1, :], a[2, :], kind="linear") - self.interp_cl = interpolate.interp1d(a[1, :], a[3, :], kind="linear") + # Filter NaN values (trailing commas in CSV create NaNs) + mask = ~(np.isnan(a[1, :]) | np.isnan(a[2, :]) | np.isnan(a[3, :])) + x = a[1, mask] + cd = a[2, mask] + cl = a[3, mask] + k = 3 if len(x) >= 4 else 1 + self.interp_cd = interpolate.make_interp_spline(x, cd, k=k) + self.interp_cd.extrapolate = True + self.interp_cl = interpolate.make_interp_spline(x, cl, k=k) + self.interp_cl.extrapolate = True + + def _build_interp_from_arrays(self, cl_data, cd_data): + """Build interpolation from user-provided coefficient arrays. + + Parameters + ---------- + cl_data : dict + {"awa": [...], "values": [...]} for lift coefficients. + cd_data : dict + {"awa": [...], "values": [...]} for drag coefficients. + """ + cl_awa = np.array(cl_data["awa"]) + cl_vals = np.array(cl_data["values"]) + cd_awa = np.array(cd_data["awa"]) + cd_vals = np.array(cd_data["values"]) + k_cl = 3 if len(cl_awa) >= 4 else 1 + k_cd = 3 if len(cd_awa) >= 4 else 1 + self.interp_cl = interpolate.make_interp_spline(cl_awa, cl_vals, k=k_cl) + self.interp_cl.extrapolate = True + self.interp_cd = interpolate.make_interp_spline(cd_awa, cd_vals, k=k_cd) + self.interp_cd.extrapolate = True def cl(self, awa): awa = max(0, min(awa, 180)) @@ -43,6 +122,9 @@ def cd(self, awa): awa = max(0, min(awa, 180)) return self.interp_cd(awa) + def measure(self, rfm, ftj): + """Update sail dimensions for current reef/furl state.""" + def debbug_coeffs(self, N=256): awa = np.linspace(0, 180, N) coeffs = np.empty((N, 2)) @@ -56,46 +138,31 @@ def debbug_coeffs(self, N=256): class Main(Sail): - def __init__(self, name, P, E, Roach, BAD): + def __init__(self, name, P, E, Roach, BAD, data_source="orc", + cl_data=None, cd_data=None, sail_type=None): """ - Initialize mainsail - - This function initializes an object of class Main which inherits the class Sail. - It calculates the area, the Vertical Center of Effort (vce), - sets CE = 1 and calls the super class constructor. - + Initialize mainsail. + Parameters ---------- - name : string - Of the sail - - P : Float - Height of the Mainsail in meters - - E: Float - Length (Foot) of the Mainsail in meters - - Roach: Float - Percentage by which the triangular area is increased in order to obtain the mainsail area. - This is area behind the line from clew to head. - To get this number you have to calculate Mainsail_area / (P*E/2) -1 - - BAD: Float - Boom Above Deck: Distance between boom and Deck in meters - - Returns - ------- - Main - Object of type Main( Sail ) - - See Also - -------- - Jib( Sail ) - - Examples - -------- - >>> Main("MN1", P=16.60, E=5.60, Roach=0.1, BAD=1.0) - + name : str + Sail identifier. + P : float + Height of the Mainsail in meters. + E : float + Length (Foot) of the Mainsail in meters. + Roach : float + Roach factor (Mainsail_area / (P*E/2) - 1). + BAD : float + Boom Above Deck in meters. + data_source : str, optional + Coefficient data source. Default "orc". + cl_data : dict, optional + User-provided CL data. + cd_data : dict, optional + User-provided CD data. + sail_type : str, optional + Coefficient variant: ``"main"`` (default) or ``"main_low"``. """ self.name = name self.type = "main" @@ -105,10 +172,23 @@ def __init__(self, name, P, E, Roach, BAD): self.BAD = BAD self.area0 = 0.5 * P * E * (1 + self.roach) self.vce = P / 3.0 * (1 + self.roach) + self.BAD - super().__init__(self.name, self.type, self.area0, self.vce) + super().__init__(self.name, self.type, self.area0, self.vce, + data_source=data_source, cl_data=cl_data, cd_data=cd_data, + sail_type=sail_type) self.measure() - + def measure(self, rfm=1, ftj=1): + """ + Update mainsail dimensions for reef state. + + Parameters + ---------- + rfm : float + Reef factor for mainsail (0 to 1). 1 = fully unreefed. + ftj : float + Furl factor for jib (unused for mainsail, present for interface + compatibility). + """ self.P_r = self.P*rfm self.vce = self.P_r / 3.0 * (1 + self.roach) + self.BAD self.area = self.area0*rfm**2 @@ -116,7 +196,32 @@ def measure(self, rfm=1, ftj=1): class Jib(Sail): - def __init__(self, name, I, J, LPG, HBI): + def __init__(self, name, I, J, LPG, HBI, data_source="orc", + cl_data=None, cd_data=None, sail_type=None): + """ + Headsail (jib/genoa). + + Parameters + ---------- + name : str + Sail identifier (e.g. "J1"). + I : float + Forestay height (m). + J : float + Base of the foretriangle (m). + LPG : float + Luff perpendicular (m). + HBI : float + Height of the jib tack above deck (m). + data_source : str, optional + Coefficient data source. Default "orc". + cl_data : dict, optional + User-provided CL data. + cd_data : dict, optional + User-provided CD data. + sail_type : str, optional + Coefficient variant: ``"jib"`` (default) or ``"jib_low"``. + """ self.name = name self.type = "jib" self.I = I @@ -126,23 +231,60 @@ def __init__(self, name, I, J, LPG, HBI): self.HBI = HBI self.area = 0.5 * I * max(J, LPG) self.vce = I / 3.0 + HBI - super().__init__(self.name, self.type, self.area, self.vce) + super().__init__(self.name, self.type, self.area, self.vce, + data_source=data_source, cl_data=cl_data, cd_data=cd_data, + sail_type=sail_type) self.measure() def measure(self, rfm=1, ftj=1): + """ + Update jib dimensions for furl state. + + Parameters + ---------- + rfm : float + Reef factor for mainsail (unused for jib, present for interface + compatibility). + ftj : float + Furl factor for jib (0 to 1). 0 = fully unfurled. + """ self.LPG_r = self.LPG*ftj self.IG_r = self.IG*ftj self.area = 0.5 * self.I * max(self.J, self.LPG_r) class Kite(Sail): - def __init__(self, name, area, vce): + def __init__(self, name, area, vce, data_source="orc", + cl_data=None, cd_data=None, sail_type=None): + """ + Spinnaker or asymmetric downwind sail. + + Parameters + ---------- + name : str + Sail identifier (e.g. "A2", "A5"). + area : float + Sail area (m^2). + vce : float + Vertical centre of effort above deck (m). + data_source : str, optional + Coefficient data source. Default "orc". + cl_data : dict, optional + User-provided CL data. + cd_data : dict, optional + User-provided CD data. + sail_type : str, optional + Coefficient variant: ``"kite"`` (default), ``"sym_kite"``, + ``"asym_cl_kite"``, or ``"asym_pole_kite"``. + """ self.name = name self.type = "kite" self.area = area self.min_area = self.area self.vce = vce - super().__init__(self.name, self.type, self.area, self.vce, up=False) + super().__init__(self.name, self.type, self.area, self.vce, up=False, + data_source=data_source, cl_data=cl_data, cd_data=cd_data, + sail_type=sail_type) self.measure() def measure(self, rfm=1, ftj=1): diff --git a/src/YachtMod.py b/src/YachtMod.py index 72a4f5a..ac2ccc2 100644 --- a/src/YachtMod.py +++ b/src/YachtMod.py @@ -8,13 +8,36 @@ __email__ = "M.Lauber@soton.ac.uk" import numpy as np -from src.UtilsMod import build_interp_func,json_read,json_write from scipy import interpolate +from src.UtilsMod import build_interp_func, json_read, json_write + + +def _zero_cr(fn): + """Zero residuary resistance (for appendages without Cr data).""" + return 0.0 + + class Appendage(object): def __init__(self, type, chord, area, span, vol, ce): """ - + Base class for underwater appendages (keels, rudders, bulbs). + + Parameters + ---------- + type : str + Appendage type (``"keel"``, ``"rudder"``, or ``"bulb"``). + Controls residuary resistance coefficient lookup. + chord : float + Mean chord length (m). + area : float + Planform (wetted) area (m^2). + span : float + Appendage span (m). Set to 0 for non-lifting bodies (bulbs). + vol : float + Displaced volume (m^3). Used for residuary resistance calculation. + ce : float + Centre of effort — depth below waterline (m, positive downward). """ self.type = type self.chord = chord @@ -30,15 +53,12 @@ def __init__(self, type, chord, area, span, vol, ce): self.cla = self.dclda * self.area self.teff = 1.8 * self.span # no residuary resistance - self._interp_cr = lambda fn: 0.0 + self._interp_cr = _zero_cr if self.type == "keel": self._interp_cr = build_interp_func("rrk") if self.type == "bulb": self._interp_cr = build_interp_func("rrk", i=2) - def _cl(self, leeway): - return self.dclda * np.radians(leeway) - def _cr(self, fn): return self._interp_cr(max(0.0, min(fn, 0.6))) @@ -56,6 +76,21 @@ def _print(self): class Keel(Appendage): def __init__(self, Cu=1, Cl=1, Span=0): + """ + Trapezoidal keel appendage. + + Computes area, mean chord, span, volume, and centre of effort from + the root and tip chord lengths assuming a trapezoidal planform. + + Parameters + ---------- + Cu : float, optional + Root (upper) chord length (m). Default is 1. + Cl : float, optional + Tip (lower) chord length (m). Default is 1. + Span : float, optional + Keel span (m). Default is 0. + """ self.type = "keel" self.cu = Cu self.cl = Cl @@ -70,6 +105,18 @@ def __init__(self, Cu=1, Cl=1, Span=0): class Rudder(Appendage): def __init__(self, Cu=1, Cl=1, Span=0): + """ + Trapezoidal rudder appendage. + + Parameters + ---------- + Cu : float, optional + Root (upper) chord length (m). Default is 1. + Cl : float, optional + Tip (lower) chord length (m). Default is 1. + Span : float, optional + Rudder span (m). Default is 0. + """ self.type = "rudder" self.cu = Cu self.cl = Cl @@ -88,6 +135,23 @@ def _Ksff(self, phi): class Bulb(Appendage): def __init__(self, Chord, area, vol, CG): + """ + Keel bulb appendage. + + A non-lifting body attached to the keel tip. Contributes wetted + surface area and residuary resistance but no side force. + + Parameters + ---------- + Chord : float + Bulb chord length (m). + area : float + Wetted surface area (m^2). + vol : float + Displaced volume (m^3). + CG : float + Centre of gravity depth below waterline (m). + """ self.type = "bulb" self.chord = Chord self.area = area @@ -97,20 +161,98 @@ def __init__(self, Chord, area, vol, CG): super().__init__(self.type, self.chord, self.area, 0.0, self.vol, self.ce) +class ShortKeel(Appendage): + def __init__(self, Length=1.0, Depth=0.5, Tc_ratio=0.15): + """ + Short/integrated keel appendage. + + For traditional or hull-integrated keels with low aspect ratio. + Uses the Jones low-AR lift formula instead of Prandtl correction, + higher form drag, and zero appendage residuary resistance (hull + resistance surfaces capture it). + + Parameters + ---------- + Length : float + Fore-aft keel length along hull bottom (m). + Depth : float + Keel depth below canoe body (m). + Tc_ratio : float + Average thickness-to-chord ratio. Default 0.15. + """ + self.type = "short_keel" + self.length = Length + self.depth = Depth + self.tc_ratio = Tc_ratio + self.span = Depth + self.chord = Length + self.area = Length * Depth + self.ce = -Depth / 2.0 + self.cof = 1.4 + 0.5 * Tc_ratio + self.vol = Length * Depth * Length * Tc_ratio * 0.7 + super().__init__(self.type, self.chord, self.area, self.span, self.vol, self.ce) + # Override Prandtl lift model with Jones low-AR formula + ar = self.Ar + self.dclda = np.pi * ar / 2.0 + self.cla = self.dclda * self.area + self.teff = 1.5 * self.span + + class Yacht(object): def __init__(self, Name, Lwl, Vol, Bwl, Tc, WSA, Tmax, - Amax, Mass, Loa, Boa, Ff, Fa, App=[], Sails=[]): + Amax, Mass, Loa, Boa, Ff, Fa, App=[], Sails=[], GZ=None, crew_weight=None, + roughness=150e-6, Hs=0.0, Ts=0.0, wave_direction=None): """ - Name : Name of particular design - Lwl : waterline length (m) - Vol : volume of canoe body (m^3) - Bwl : waterline beam (m) - Tc : Canoe body draft (m) - WSA : Wetted surface area (m^2) - Tmax : Maximum draft of yacht (m) - Amax : Max section area (m^2) - Mass : total mass of the yacht (kg) - App : appendages (Appendages object as list, i.e [Keel(...)] ) + Yacht hull and rig definition. + + Parameters + ---------- + Name : str + Name of the yacht design. + Lwl : float + Waterline length (m). + Vol : float + Displaced volume of the canoe body (m^3). + Bwl : float + Waterline beam (m). + Tc : float + Canoe body draft (m). + WSA : float + Wetted surface area of the canoe body (m^2). + Tmax : float + Maximum draft including keel (m). + Amax : float + Maximum cross-section area (m^2). + Mass : float + Total displacement mass including keel (kg). + Loa : float + Length overall (m). + Boa : float + Beam overall (m). + Ff : float + Freeboard height at the bow (m). + Fa : float + Freeboard height at the stern (m). + App : list of Appendage, optional + Underwater appendages (keels, rudders, bulbs). Default is []. + Sails : list of Sail, optional + Sail inventory. Default is []. + GZ : dict, optional + Righting arm curve as ``{"Heel": [...], "GZ": [...]}``. + Heel in degrees, GZ in metres. If *None*, loads from + ``righting_moment.json`` (backward compatible). + crew_weight : float, optional + Total crew weight (kg). If *None*, uses empirical formula + ``25.8 * Lwl ** 1.4262``. + roughness : float, optional + Mean hull roughness height (m). Default 150e-6 (150 μm, + new antifouling paint). Set to 0 for a smooth hull. + Hs : float, optional + Significant wave height (m). Default 0.0 (flat water). + Ts : float, optional + Modal wave period (s). Default 0.0. + wave_direction : float or None, optional + Wave direction (degrees). If None, waves align with wind. """ self.g = 9.81 self.Name = Name @@ -131,7 +273,7 @@ def __init__(self, Name, Lwl, Vol, Bwl, Tc, WSA, Tmax, self.Rm4 = 0.43 * self.tmax # standard crew weight - self.cw = 25.8 * self.l ** 1.4262 + self.cw = crew_weight if crew_weight is not None else 25.8 * self.l ** 1.4262 self.carm = 0.8 * self.bmax # must be average of rail where crew sits # rough estimate of projected area of the hull @@ -139,10 +281,19 @@ def __init__(self, Name, Lwl, Vol, Bwl, Tc, WSA, Tmax, self.cla = self.area_proj * 2 * np.pi / (1.0 + 0.5 * self.area_proj / self.tc) self.teff = 2.07 * self.tc + # hull roughness and wave parameters + self.roughness = roughness + self.Hs = Hs + self.Ts = Ts + self.wave_direction = wave_direction + # appendages object self.appendages = App self.sails = Sails + # GZ data (righting arm curve) + self._gz_data = GZ + # righting moment interpolation function self._interp_rm = self._build_rm_interp() @@ -151,7 +302,10 @@ def __init__(self, Name, Lwl, Vol, Bwl, Tc, WSA, Tmax, def _build_rm_interp(self): - a = json_read('righting_moment') + if self._gz_data is not None: + a = self._gz_data + else: + a = json_read('righting_moment') return interpolate.interp1d(np.array(a["Heel"]), np.array(a["GZ"]), kind="linear", fill_value="extrapolate") diff --git a/tests/test_daring.py b/tests/test_daring.py new file mode 100644 index 0000000..1c9c775 --- /dev/null +++ b/tests/test_daring.py @@ -0,0 +1,160 @@ +import os + +import numpy as np +import pytest +from src.SailMod import Jib, Kite, Main +from src.VPPMod import VPP +from src.YachtMod import Keel, Rudder, ShortKeel, Yacht + + +# Daring GZ curve (estimated for classic 5.5m, ~50% ballast ratio, GM ~0.70m) +DARING_GZ = { + "Heel": [0.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0], + "GZ": [0.000, 0.120, 0.230, 0.310, 0.350, 0.330, 0.260], +} + + +def return_daring(): + """Create Daring yacht with estimated 5.5m class parameters. + + Published values (classicsailboats.org / Cowes Classics): + LOA=9.90m, LWL=7.01m, Beam=1.98m, Draft=1.35m, + Displacement=2000kg, Upwind SA=29.73m² + + Estimated values are documented in docs/plans/2026-02-27-daring-vpp.md + """ + return Yacht( + Name="Daring", + Lwl=7.01, + Vol=1.95, + Bwl=1.70, + Tc=0.45, + WSA=11.5, + Tmax=1.35, + Amax=0.38, + Mass=2000, + Loa=9.90, + Boa=1.98, + Ff=0.75, + Fa=0.55, + App=[ + ShortKeel(Length=1.2, Depth=0.90, Tc_ratio=0.15), + Rudder(Cu=0.32, Cl=0.18, Span=0.75), + ], + Sails=[ + Main("MN1", P=10.80, E=3.30, Roach=0.1, BAD=0.80), + Jib("J1", I=8.50, J=2.70, LPG=2.70, HBI=0.50), + Kite("S1", area=50.0, vce=4.50), + ], + GZ=DARING_GZ, + crew_weight=240.0, + ) + + +def test_daring_vpp_runs(): + """Daring VPP should solve without errors across a range of conditions.""" + daring = return_daring() + vpp = VPP(Yacht=daring) + vpp.set_analysis( + tws_range=np.arange(6.0, 14.0, 2.0), + twa_range=np.linspace(35.0, 175.0, 15), + ) + vpp.run(verbose=False) + results = vpp.results() + assert results["name"] == "Daring" + assert len(results["tws"]) == 4 + + +def test_daring_boat_speed_sanity(): + """Daring should produce reasonable speeds: 3-7 knots in moderate wind.""" + daring = return_daring() + vpp = VPP(Yacht=daring) + vpp.set_analysis( + tws_range=np.array([10.0]), + twa_range=np.linspace(40.0, 160.0, 13), + ) + vpp.run(verbose=False) + results = np.array(vpp.results()["results"]) + max_speed = np.max(results[:, :, :, 0]) + assert 3.0 < max_speed < 7.0, f"Max speed {max_speed:.1f} kts outside expected range" + + +def test_daring_heel_limited(): + """With phi_max=30, no heel angle should exceed 30 degrees.""" + daring = return_daring() + vpp = VPP(Yacht=daring) + vpp.set_analysis( + tws_range=np.arange(8.0, 22.0, 4.0), + twa_range=np.linspace(35.0, 175.0, 15), + phi_max=30.0, + ) + vpp.run(verbose=False) + results = np.array(vpp.results()["results"]) + heel_angles = results[:, :, :, 1] + max_heel = np.max(heel_angles) + assert max_heel <= 31.0, f"Max heel {max_heel:.1f} exceeds phi_max=30" + + +def test_daring_depower_values_stored(): + """At high TWS with heel limit, flat/red should be < 1.0.""" + daring = return_daring() + vpp = VPP(Yacht=daring) + vpp.set_analysis( + tws_range=np.array([18.0]), + twa_range=np.array([60.0]), + phi_max=25.0, + ) + vpp.run(verbose=False) + results = np.array(vpp.results()["results"]) + flat = results[0, 0, 0, 3] + assert flat < 1.0, f"Expected depowering at 18 kts / 60 TWA, got flat={flat}" + + +def test_daring_polars_saved(tmp_path): + """Daring should produce polar plot and sail chart files.""" + daring = return_daring() + vpp = VPP(Yacht=daring) + vpp.set_analysis( + tws_range=np.arange(6.0, 14.0, 2.0), + twa_range=np.linspace(35.0, 175.0, 15), + ) + vpp.run(verbose=False) + + polar_path = str(tmp_path / "daring_polar.png") + sail_path = str(tmp_path / "daring_sail.png") + vpp.polar(3, True, fname=polar_path) + vpp.SailChart(True, fname=sail_path) + assert os.path.exists(polar_path), "Polar plot was not created" + assert os.path.exists(sail_path), "Sail chart was not created" + + +# --- ShortKeel-specific unit tests --- + +def test_short_keel_jones_lift_formula(): + """ShortKeel dclda should match Jones low-AR formula: pi*AR/2.""" + sk = ShortKeel(Length=1.2, Depth=0.90, Tc_ratio=0.15) + ar = sk.span / sk.area # = 0.90 / (1.2 * 0.90) + expected = np.pi * ar / 2.0 + assert abs(sk.dclda - expected) < 1e-10, f"dclda={sk.dclda}, expected={expected}" + + +def test_short_keel_no_appendage_residuary(): + """ShortKeel should return zero appendage residuary resistance.""" + sk = ShortKeel(Length=1.2, Depth=0.90, Tc_ratio=0.15) + for fn in [0.0, 0.2, 0.4, 0.6]: + assert sk._cr(fn) == 0.0, f"_cr({fn}) should be 0.0 for short_keel" + + +def test_short_keel_lower_lift_than_fin(): + """A ShortKeel with equivalent area should produce less lift than a fin Keel.""" + sk = ShortKeel(Length=1.2, Depth=0.90, Tc_ratio=0.15) + # Fin keel with similar area: chord ~0.575, span 0.90 -> area ~0.5175 + # Use root/tip that give similar area to short keel + fk = Keel(Cu=1.40, Cl=1.00, Span=0.90) # area = 1.08, same span + # At the same leeway, short keel should generate less lift coefficient + leeway_rad = np.radians(5.0) + cl_short = sk.dclda * leeway_rad + cl_fin = fk.dclda * leeway_rad + assert cl_short < cl_fin, ( + f"ShortKeel cl={cl_short:.4f} should be less than Keel cl={cl_fin:.4f}" + ) diff --git a/tests/test_yacht.py b/tests/test_yacht.py new file mode 100644 index 0000000..6c43d7b --- /dev/null +++ b/tests/test_yacht.py @@ -0,0 +1,47 @@ +import numpy as np +import pytest +from src.YachtMod import Yacht, Keel, Rudder +from src.SailMod import Main, Jib + + +def _minimal_yacht(**overrides): + """Create a minimal Yacht for testing with sensible defaults.""" + defaults = dict( + Name="TestYacht", Lwl=7.01, Vol=1.95, Bwl=1.70, Tc=0.45, + WSA=11.5, Tmax=1.35, Amax=0.38, Mass=2000, Loa=9.90, Boa=1.98, + Ff=0.75, Fa=0.55, + App=[Keel(Cu=0.70, Cl=0.45, Span=0.90), Rudder(Cu=0.32, Cl=0.18, Span=0.75)], + Sails=[Main("MN1", P=10.80, E=3.30, Roach=0.1, BAD=0.80), + Jib("J1", I=8.50, J=2.70, LPG=2.70, HBI=0.50)], + ) + defaults.update(overrides) + return Yacht(**defaults) + + +def test_yacht_accepts_gz_parameter(): + """Yacht should accept an optional gz dict to override the global file.""" + gz = {"Heel": [0, 10, 20, 30], "GZ": [0.0, 0.12, 0.23, 0.31]} + yacht = _minimal_yacht(GZ=gz) + rm_10 = yacht._get_RmH(10.0) + expected = 0.12 * 2000 * 9.81 + assert abs(rm_10 - expected) < 1.0 + + +def test_yacht_falls_back_to_file_when_no_gz(): + """When no GZ parameter given, should still load from file (backward compat).""" + yacht = _minimal_yacht() + rm_10 = yacht._get_RmH(10.0) + assert rm_10 > 0 + + +def test_yacht_accepts_crew_weight(): + """Yacht should accept an optional crew_weight to override the empirical formula.""" + yacht = _minimal_yacht(crew_weight=240.0) + assert yacht.cw == 240.0 + + +def test_yacht_default_crew_weight(): + """Without crew_weight param, should use empirical formula.""" + yacht = _minimal_yacht() + expected = 25.8 * 7.01 ** 1.4262 + assert abs(yacht.cw - expected) < 0.1 From aab8d20c6ab88ddab53ec0c01fe542c41b2bcb5b Mon Sep 17 00:00:00 2001 From: Thomas Dickson Date: Wed, 17 Jun 2026 20:44:33 +0100 Subject: [PATCH 2/2] feat: ShortKeel API detection and extended API tests --- src/api.py | 74 ++++++++++++++---- tests/test_api.py | 192 +++++++++++++++++++++++++++++++++++++++------- 2 files changed, 224 insertions(+), 42 deletions(-) diff --git a/src/api.py b/src/api.py index 14ad2f6..56a3867 100644 --- a/src/api.py +++ b/src/api.py @@ -13,7 +13,7 @@ sys.path.append(os.path.realpath(".")) from src.SailMod import Jib, Kite, Main from src.VPPMod import VPP -from src.YachtMod import Keel, Rudder, Yacht +from src.YachtMod import Keel, Rudder, ShortKeel, Yacht app = Flask(__name__) @@ -27,17 +27,35 @@ def ping(): def data_to_vpp(data: Dict[str, Any]) -> VPP: - - keel = Keel( - Cu=float(data["keel"]["Cu"]), - Cl=float(data["keel"]["Cl"]), - Span=float(data["keel"]["Span"]) - ) + + keel_data = data["keel"] + keel_type = keel_data.get("type", "fin") + # Also detect from keys if type is missing or inconsistent + if keel_type == "short" or "Length" in keel_data: + keel = ShortKeel( + Length=float(keel_data["Length"]), + Depth=float(keel_data["Depth"]), + Tc_ratio=float(keel_data.get("Tc_ratio", 0.15)), + ) + else: + keel = Keel( + Cu=float(keel_data["Cu"]), + Cl=float(keel_data["Cl"]), + Span=float(keel_data["Span"]), + ) rudder = Rudder( - Cu=float(data["rudder"]["Cu"]), - Cl=float(data["rudder"]["Cu"]), + Cu=float(data["rudder"]["Cu"]), + Cl=float(data["rudder"]["Cu"]), Span=float(data["rudder"]["Span"]) ) + # Environment parameters + roughness = float(data.get("roughness", 150e-6)) + Hs = float(data.get("Hs", 0.0)) + Ts = float(data.get("Ts", 0.0)) + wave_direction = data.get("wave_direction") + if wave_direction is not None: + wave_direction = float(wave_direction) + yacht = Yacht( Name=data["yacht"]["Name"], Lwl=float(data["yacht"]["Lwl"]), @@ -52,6 +70,10 @@ def data_to_vpp(data: Dict[str, Any]) -> VPP: Fa=float(data["yacht"]["Fa"]), Boa=float(data["yacht"]["Boa"]), Loa=float(data["yacht"]["Loa"]), + roughness=roughness, + Hs=Hs, + Ts=Ts, + wave_direction=wave_direction, App=[keel, rudder], Sails=[ Main( @@ -60,6 +82,10 @@ def data_to_vpp(data: Dict[str, Any]) -> VPP: E=float(data["main"]["E"]), Roach=float(data["main"]["Roach"]), BAD=float(data["main"]["BAD"]), + data_source=data.get("data_source", "orc"), + cl_data=data["main"].get("cl_data"), + cd_data=data["main"].get("cd_data"), + sail_type=data["main"].get("sail_type"), ), Jib( name=data["jib"]["Name"], @@ -67,32 +93,48 @@ def data_to_vpp(data: Dict[str, Any]) -> VPP: J=float(data["jib"]["J"]), LPG=float(data["jib"]["LPG"]), HBI=float(data["jib"]["HBI"]), + data_source=data.get("data_source", "orc"), + cl_data=data["jib"].get("cl_data"), + cd_data=data["jib"].get("cd_data"), + sail_type=data["jib"].get("sail_type"), ), Kite( name=data["kite"]["Name"], area=float(data["kite"]["area"]), vce=float(data["kite"]["vce"]), + data_source=data.get("data_source", "orc"), + cl_data=data["kite"].get("cl_data"), + cd_data=data["kite"].get("cd_data"), + sail_type=data["kite"].get("sail_type"), ), ], ) - + vpp = VPP(Yacht=yacht) vpp.set_analysis( tws_range=np.array(data["tws_range"]), twa_range=np.array(data["twa_range"]), ) - return vpp - + return vpp, data.get("method", "iterative") + @app.route("/api/vpp/", methods=["POST"]) def makevppresults(): data = request.get_json() + if data is None: + return jsonify({"error": "Request body must be valid JSON."}), 400 - # TODO: Support multiple implementations of different sails: require API design - # TODO: Error handling incorrect ranges + try: + vpp, method = data_to_vpp(data) + except (KeyError, TypeError, ValueError) as e: + logging.warning("Invalid VPP input: %s", e) + return jsonify({"error": f"Invalid input: {e}"}), 400 - vpp = data_to_vpp(data) - vpp.run(verbose=True) + try: + vpp.run(verbose=True, method=method) + except Exception as e: + logging.exception("VPP simulation failed") + return jsonify({"error": f"Simulation failed: {e}"}), 500 return jsonify(vpp.results()) diff --git a/tests/test_api.py b/tests/test_api.py index 53aab60..f1e068a 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -4,6 +4,9 @@ from src.api import app +HEADERS = {"content-type": "application/json", "Accept-Charset": "UTF-8"} + + def test_ping_route(): client = app.test_client() response = client.get("/ping") @@ -11,29 +14,27 @@ def test_ping_route(): assert response.data.decode("utf-8") == "Pong! The server is up and running." -def make_yd41(): - yacht = dict( - { - "Name": "YD41", - "Lwl": 11.90, - "Vol": 6.05, - "Bwl": 3.18, - "Tc": 0.4, - "WSA": 28.20, - "Tmax": 2.30, - "Amax": 1.051, - "Mass": 6500, - "Ff": 1.5, - "Fa": 1.5, - "Boa": 4.2, - "Loa": 12.5, - } - ) - keel = dict({"Cu": 1.00, "Cl": 0.78, "Span": 1.90}) - rudder = dict({"Cu": 0.48, "Cl": 0.22, "Span": 1.15}) - main = dict({"Name": "MN1", "P": 16.60, "E": 5.60, "Roach": 0.1, "BAD": 1.0}) - jib = dict({"Name": "J1", "I": 16.20, "J": 5.10, "LPG": 5.40, "HBI": 1.8}) - kite = dict({"Name": "A2", "area": 150.0, "vce": 9.55}) +def make_yd41(**overrides): + yacht = { + "Name": "YD41", + "Lwl": 11.90, + "Vol": 6.05, + "Bwl": 3.18, + "Tc": 0.4, + "WSA": 28.20, + "Tmax": 2.30, + "Amax": 1.051, + "Mass": 6500, + "Ff": 1.5, + "Fa": 1.5, + "Boa": 4.2, + "Loa": 12.5, + } + keel = {"Cu": 1.00, "Cl": 0.78, "Span": 1.90} + rudder = {"Cu": 0.48, "Cl": 0.22, "Span": 1.15} + main = {"Name": "MN1", "P": 16.60, "E": 5.60, "Roach": 0.1, "BAD": 1.0} + jib = {"Name": "J1", "I": 16.20, "J": 5.10, "LPG": 5.40, "HBI": 1.8} + kite = {"Name": "A2", "area": 150.0, "vce": 9.55} tws_range = np.arange(4.0, 7.0, 2.0).tolist() twa_range = np.linspace(30.0, 180.0, 5).tolist() @@ -48,17 +49,156 @@ def make_yd41(): "tws_range": tws_range, "twa_range": twa_range, } + d.update(overrides) return d +def post_vpp(data): + client = app.test_client() + return client.post("/api/vpp/", data=json.dumps(data), headers=HEADERS) + + def test_vpp_simulation(): d = make_yd41() + response = post_vpp(d) + assert response.status_code == 200 + + +def test_empty_tws_range_returns_400(): + d = make_yd41(tws_range=[]) + response = post_vpp(d) + assert response.status_code == 400 + assert "empty" in response.json["error"].lower() + + +def test_empty_twa_range_returns_400(): + d = make_yd41(twa_range=[]) + response = post_vpp(d) + assert response.status_code == 400 + assert "empty" in response.json["error"].lower() + + +def test_tws_out_of_range_returns_400(): + d = make_yd41(tws_range=[1.0, 5.0]) + response = post_vpp(d) + assert response.status_code == 400 + assert "outside valid bounds" in response.json["error"] + - json_string = json.dumps(d) - headers = {"content-type": "application/json", "Accept-Charset": "UTF-8"} +def test_tws_above_range_returns_400(): + d = make_yd41(tws_range=[10.0, 40.0]) + response = post_vpp(d) + assert response.status_code == 400 + assert "outside valid bounds" in response.json["error"] + +def test_twa_out_of_range_returns_400(): + d = make_yd41(twa_range=[-10.0, 90.0]) + response = post_vpp(d) + assert response.status_code == 400 + assert "outside valid bounds" in response.json["error"] + + +def test_missing_field_returns_400(): + d = make_yd41() + del d["keel"] + response = post_vpp(d) + assert response.status_code == 400 + assert "error" in response.json + + +def test_invalid_json_returns_400(): client = app.test_client() - response = client.post("/api/vpp/", data=json_string, headers=headers) + response = client.post("/api/vpp/", data="not json", headers=HEADERS) + assert response.status_code == 400 + + +def test_short_keel_with_type_field(): + """Short keel payload with explicit type='short' should succeed.""" + d = make_yd41() + d["keel"] = {"type": "short", "Length": 1.2, "Depth": 0.90, "Tc_ratio": 0.15} + response = post_vpp(d) + assert response.status_code == 200 + + +def test_short_keel_without_type_field(): + """Short keel payload detected from keys alone (no type field).""" + d = make_yd41() + d["keel"] = {"Length": 1.2, "Depth": 0.90, "Tc_ratio": 0.15} + response = post_vpp(d) + assert response.status_code == 200 + + +def test_fin_keel_with_type_field(): + """Fin keel payload with explicit type='fin' should succeed.""" + d = make_yd41() + d["keel"] = {"type": "fin", "Cu": 1.00, "Cl": 0.78, "Span": 1.90} + response = post_vpp(d) + assert response.status_code == 200 + + +def test_api_5dof_method(): + """API accepts method='5dof' and returns results.""" + d = make_yd41() + d["method"] = "5dof" + response = post_vpp(d) + assert response.status_code == 200 + results = np.array(response.json["results"]) + assert np.any(results[:, :, :, 0] > 0), "5-DOF should produce non-zero speeds" + + +def test_api_data_source(): + """API accepts data_source parameter.""" + d = make_yd41() + d["data_source"] = "orc" + response = post_vpp(d) + assert response.status_code == 200 + + +def test_api_sail_type_sym_kite(): + """API accepts sail_type in kite section and produces results.""" + d = make_yd41() + d["kite"]["sail_type"] = "sym_kite" + response = post_vpp(d) + assert response.status_code == 200 + results = np.array(response.json["results"]) + assert np.any(results[:, :, :, 0] > 0) + + +def test_api_sail_type_low_performance(): + """API accepts low-performance sail_type for main and jib.""" + d = make_yd41() + d["main"]["sail_type"] = "main_low" + d["jib"]["sail_type"] = "jib_low" + response = post_vpp(d) + assert response.status_code == 200 + results = np.array(response.json["results"]) + assert np.any(results[:, :, :, 0] > 0) + + +def test_api_roughness(): + """API accepts roughness parameter and rough hull is slower.""" + d_smooth = make_yd41(roughness=0.0) + d_rough = make_yd41(roughness=500e-6) + r_smooth = post_vpp(d_smooth) + r_rough = post_vpp(d_rough) + assert r_smooth.status_code == 200 + assert r_rough.status_code == 200 + speeds_smooth = np.array(r_smooth.json["results"])[:, :, :, 0].max() + speeds_rough = np.array(r_rough.json["results"])[:, :, :, 0].max() + assert speeds_smooth > speeds_rough, "Rough hull should be slower" + + +def test_api_wave_params(): + """API accepts Hs and Ts parameters.""" + d = make_yd41(Hs=1.0, Ts=6.0) + response = post_vpp(d) + assert response.status_code == 200 + +def test_api_wave_direction(): + """API accepts wave_direction parameter.""" + d = make_yd41(Hs=1.0, Ts=6.0, wave_direction=45.0) + response = post_vpp(d) assert response.status_code == 200