From 1e6ed84d4f3169798b6f8c1dc7b802598452f591 Mon Sep 17 00:00:00 2001 From: "Documenter.jl" Date: Sat, 2 Nov 2024 14:27:32 +0000 Subject: [PATCH] build based on 576f5a8 --- dev/.documenter-siteinfo.json | 2 +- dev/advanced_usage/index.html | 8 ++++---- dev/guided_examples/index.html | 12 +++++------ dev/index.html | 2 +- dev/objects.inv | Bin 1640 -> 1806 bytes dev/quickstart/index.html | 36 ++++++++++++++++----------------- dev/reference/index.html | 2 +- dev/search_index.js | 2 +- dev/theory/index.html | 2 +- 9 files changed, 33 insertions(+), 33 deletions(-) diff --git a/dev/.documenter-siteinfo.json b/dev/.documenter-siteinfo.json index 94b5c3a..b707809 100644 --- a/dev/.documenter-siteinfo.json +++ b/dev/.documenter-siteinfo.json @@ -1 +1 @@ -{"documenter":{"julia_version":"1.11.1","generation_timestamp":"2024-11-02T14:12:56","documenter_version":"1.7.0"}} \ No newline at end of file +{"documenter":{"julia_version":"1.11.1","generation_timestamp":"2024-11-02T14:27:28","documenter_version":"1.7.0"}} \ No newline at end of file diff --git a/dev/advanced_usage/index.html b/dev/advanced_usage/index.html index 75197b0..1dae5cf 100644 --- a/dev/advanced_usage/index.html +++ b/dev/advanced_usage/index.html @@ -24,7 +24,7 @@ fmm.fmm!(target_system, source_system, unsort_source_bodies=true, unsort_target_bodies=true) # standard run (defaults) fmm.fmm!(target_system, source_system, - unsort_source_bodies=false, unsort_target_bodies=false) # sorted bodies (not original indices)
(SingleTree{Float64, Vector{Tuple{Main.Body{Float64}, Vector{Float64}}}, 5}(SingleBranch{Float64}[SingleBranch{Float64}(1:100, 8, 2:9, 0, -1, [0.49849075893959255, 0.5011246180164968, 0.50101931980297], 0.8238712189768528, [-49.209733528008485 0.0; 0.0 0.0;;; 3.235503852070557 0.0; 0.0 0.0;;; 0.02681865248285875 0.0; 0.9591193094494829 0.0;;; … ;;; -0.0004469512083583769 0.0; -0.0001593241956586191 0.0;;; -0.0002871052995659781 0.0; -0.0003190451687766938 0.0;;; -7.588266430169105e-6 0.0; -8.400184364295123e-5 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716302037249, 139716224304144, 139715617863648))), SingleBranch{Float64}(1:13, 0, 10:9, 1, 1, [0.24972409829345718, 0.2523579573703614, 0.2522526591568346], 0.33251523753625056, [-6.326393509059363 0.0; 0.0 0.0;;; 0.10172908853834879 0.0; 0.0 0.0;;; -0.07897900882246582 0.0; 0.03842446525558845 0.0;;; … ;;; -9.655530668433345e-7 0.0; -5.592925868629596e-7 0.0;;; 1.1757087124649147e-6 0.0; 2.391906416191541e-6 0.0;;; -3.8953000638580764e-8 0.0; -4.372963917986633e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.21988669568485109 0.0; 0.0 0.0;;; -0.009072982836663246 0.0; -0.0807848408169367 0.0;;; … ;;; 6.640110287989058e-7 0.0; 1.9041912535102654e-6 0.0;;; 3.6074759162369163e-7 0.0; -1.7309101958119792e-7 0.0;;; -1.569552638656214e-8 0.0; -2.5078811456687917e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715632692880, 139715632692912, 8589934611))), SingleBranch{Float64}(14:23, 0, 10:9, 1, 2, [0.7472574195857279, 0.2523579573703614, 0.2522526591568346], 0.3164294356194214, [-5.505985520323303 0.0; 0.0 0.0;;; -0.08935376761589264 0.0; 0.0 0.0;;; 0.07470445052396994 0.0; -0.23211726377071046 0.0;;; … ;;; -2.392758173695492e-6 0.0; -2.7522839300098923e-7 0.0;;; 1.2870322712791405e-6 0.0; 8.633199128089602e-7 0.0;;; -1.432464313580054e-7 0.0; 3.403253642846997e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.18612829398667197 0.0; 0.0 0.0;;; -0.039883017625346906 0.0; -0.10881215708761188 0.0;;; … ;;; 3.1494240254279436e-6 0.0; 1.7899698505317833e-6 0.0;;; 2.304644782594209e-7 0.0; -1.3798323055816275e-6 0.0;;; -1.7120894951022973e-7 0.0; 3.218698082968668e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716387761808, 139716387650000, 139716387151744))), SingleBranch{Float64}(24:40, 0, 10:9, 1, 3, [0.24972409829345718, 0.7498912786626322, 0.2522526591568346], 0.3907770906724327, [-7.986155913622251 0.0; 0.0 0.0;;; -0.17961782829081357 0.0; 0.0 0.0;;; -0.1708311757232731 0.0; 0.03136313659178587 0.0;;; … ;;; -6.066729814028882e-6 0.0; 2.4234001902523587e-6 0.0;;; 2.327516919788084e-6 0.0; 4.871503604644382e-7 0.0;;; 2.4779318915245518e-8 0.0; -5.833921797828204e-8 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.23123037091208298 0.0; 0.0 0.0;;; -0.04900538737735943 0.0; 0.09175926185175516 0.0;;; … ;;; 4.485918956630448e-6 0.0; -4.465435544644365e-7 0.0;;; 4.3030079417319214e-7 0.0; -1.0429330819021147e-6 0.0;;; -6.453452663209182e-8 0.0; -7.83577196866388e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716215628560, 139716387140992, 139716387142336))), SingleBranch{Float64}(41:57, 0, 10:9, 1, 4, [0.7472574195857279, 0.7498912786626322, 0.2522526591568346], 0.3550039324436246, [-9.931355245362722 0.0; 0.0 0.0;;; 0.004614587660418196 0.0; 0.0 0.0;;; 0.10229082910864945 0.0; 0.3430918058130857 0.0;;; … ;;; -5.8056578563028725e-6 0.0; -3.676520371447365e-6 0.0;;; 1.9707645764181104e-6 0.0; -1.126264814443797e-6 0.0;;; 4.6062541911518666e-7 0.0; -7.362398838063609e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.2483301379555629 0.0; 0.0 0.0;;; -0.04049668029331138 0.0; 0.11830360519660482 0.0;;; … ;;; 7.332258441837855e-6 0.0; -4.818227525166921e-6 0.0;;; 6.296600514955141e-7 0.0; 2.449994518659487e-6 0.0;;; -2.5397024192420015e-7 0.0; -1.9913483563355406e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (20753281979104, 0, 430691983406))), SingleBranch{Float64}(58:71, 0, 10:9, 1, 5, [0.24972409829345718, 0.2523579573703614, 0.7497859804491054], 0.3771527761310317, [-6.0812379817404665 0.0; 0.0 0.0;;; 0.25006763569186036 0.0; 0.0 0.0;;; -0.31820443039978746 0.0; 0.12220137601869531 0.0;;; … ;;; 3.886196424852797e-6 0.0; -7.451574546740225e-6 0.0;;; -1.5655251626942046e-6 0.0; 1.3488066967558975e-6 0.0;;; -2.6514766795446883e-7 0.0; -1.0394863598276786e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.23600705383401233 0.0; 0.0 0.0;;; 0.007799304330178003 0.0; 0.012439246336657786 0.0;;; … ;;; -1.4574470769163516e-8 0.0; 1.5992824761514576e-9 0.0;;; -2.835160161464411e-10 0.0; -3.5835678290697956e-10 0.0;;; 1.903723274446139e-12 0.0; -5.3571781615939486e-12 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715609311408, 139716346238224, 139716387187136))), SingleBranch{Float64}(72:82, 0, 10:9, 1, 6, [0.7472574195857279, 0.2523579573703614, 0.7497859804491054], 0.30707077616958983, [-5.643660411433685 0.0; 0.0 0.0;;; -0.09738759296933737 0.0; 0.0 0.0;;; 0.30570347319695684 0.0; 0.2359164756883997 0.0;;; … ;;; -9.828099569702297e-7 0.0; -4.228517737531717e-7 0.0;;; 2.722456045838181e-6 0.0; -9.867573156177317e-7 0.0;;; -2.8843207756702224e-7 0.0; 2.1892520476678593e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.13724763757441194 0.0; 0.0 0.0;;; -0.04184953211719816 0.0; 0.07154727061705074 0.0;;; … ;;; 7.307988510028463e-7 0.0; 1.2409626176729771e-8 0.0;;; 1.4022411841898488e-7 0.0; -2.3065426719117736e-7 0.0;;; -1.5496615773161006e-8 0.0; -2.8685996288531465e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716185616416, 139716240549472, 16))), SingleBranch{Float64}(83:89, 0, 10:9, 1, 7, [0.24972409829345718, 0.7498912786626322, 0.7497859804491054], 0.3929947235085011, [-2.3207471469996026 0.0; 0.0 0.0;;; 0.09585500095857492 0.0; 0.0 0.0;;; -0.034594650561498956 0.0; -0.04020353614176252 0.0;;; … ;;; 3.931149601398332e-6 0.0; -1.9070778716987882e-6 0.0;;; 4.2619416834337335e-7 0.0; 6.012393369990659e-7 0.0;;; -1.2968067700147368e-7 0.0; -1.7486311823425472e-8 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.14971788789451468 0.0; 0.0 0.0;;; -0.10199693754953348 0.0; -0.004039834025586983 0.0;;; … ;;; -1.5142626441460724e-6 0.0; -1.80684298411887e-7 0.0;;; 6.688133151638003e-7 0.0; 1.0679859224139595e-7 0.0;;; -9.055091853819892e-8 0.0; -1.816085482072339e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715609100560, 139716240549472, 1))), SingleBranch{Float64}(90:100, 0, 10:9, 1, 8, [0.7472574195857279, 0.7498912786626322, 0.7497859804491054], 0.3438264385687289, [-5.414197799467094 0.0; 0.0 0.0;;; 0.5897761356473473 0.0; 0.0 0.0;;; -0.11387613704005295 0.0; -0.009808782041582427 0.0;;; … ;;; 1.152786650059206e-5 0.0; -4.517396982831503e-6 0.0;;; -4.140305435424666e-6 0.0; -1.5665038040260306e-6 0.0;;; 1.2470773517558522e-7 0.0; 2.0253872196586884e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.2109597908590688 0.0; 0.0 0.0;;; 0.09347365978668326 0.0; -0.08394706203777819 0.0;;; … ;;; -3.5374566227538475e-6 0.0; -4.908528487673616e-6 0.0;;; -2.139788952278572e-6 0.0; -4.6632140843711356e-7 0.0;;; -2.2673535631629022e-7 0.0; 1.289726603228056e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715609312336, 139715609312368, 0)))], UnitRange{Int64}[1:1, 2:9], [2, 3, 4, 5, 6, 7, 8, 9], [8, 19, 24, 25, 30, 33, 35, 43, 52, 55  …  37, 41, 42, 49, 64, 71, 78, 79, 87, 88], [90, 83, 24, 72, 58, 59, 25, 1, 60, 73  …  23, 38, 80, 56, 39, 81, 82, 40, 13, 57], Tuple{Main.Body{Float64}, Vector{Float64}}[(Main.Body{Float64}([0.4660552366407049, 0.13111968284280429, 0.1908671255470663], 0.010673064683743582, 0.8267772979915037), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.3447705767476935, 0.07006788456539503, 0.2923577651940017], 0.004397261752829818, 0.5517592405944612), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.4911645955827536, 0.040324077362882016, 0.317784960572128], 0.004572616745488207, 0.1280946812518453), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.40516617554370093, 0.32616788197738866, 0.056217617276771326], 0.010585392495089252, 0.012104263433355023), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.18599865953230243, 0.15030687931482978, 0.12186905472850917], 0.00530068913657312, 0.7976632010743766), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.4346643684051661, 0.13212864017170378, 0.19630837394498046], 0.004567269441401094, 0.39368661127046056), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.0009624129307819196, 0.2950090065083799, 0.07129536266232961], 0.0030690713098188082, 0.49288942845129), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.06701550238862786, 0.25483654814098344, 0.3238706353789649], 0.00505556524793979, 0.4522470321326544), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.1639092692596178, 0.44194134967919385, 0.42176372731880774], 0.010361551731613024, 0.6906085781397405), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.47398778866030766, 0.2026564230666169, 0.09034743825060043], 0.004653876665231441, 0.5317908249797711), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Body{Float64}([0.6906947058638981, 0.7538566588961716, 0.5900448016217961], 0.0029834697498147098, 0.10279531111389983), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9917278520449697, 0.794049105113352, 0.7711676013529396], 0.007048482826053925, 0.6415640852627671), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8289326726987614, 0.6101948372863522, 0.519118545970754], 0.0018327766115619636, 0.2379274720768212), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6174588851816368, 0.6522104227559661, 0.5847276813173017], 0.00761078545286029, 0.9704213765219395), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5232139755745984, 0.6045990113354003, 0.5429901209014718], 0.0060841769615967035, 0.8911459293930191), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9581632293408542, 0.9135421917156796, 0.7073373243745936], 0.010449665448269006, 0.8357622456841612), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.7658820877217039, 0.9631550531437152, 0.5344687381454426], 0.0068829275392983565, 0.07479369706302341), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.960720320334046, 0.651071293378233, 0.6942906786235435], 0.0097351936375095, 0.44997536837158536), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.7803189670835223, 0.8311591102139488, 0.5707525801936775], 0.008043628052385822, 0.08862350083761417), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5793632955101715, 0.5629439590892656, 0.5388261895900366], 0.008824875260231754, 0.805646285033539), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], Val{5}(), 50), SingleTree{Float64, Vector{Tuple{Main.Body{Float64}, Vector{Float64}}}, 5}(SingleBranch{Float64}[SingleBranch{Float64}(1:100, 8, 2:9, 0, -1, [0.49850630217496006, 0.5029084590406193, 0.4970227729348794], 0.8362233044847701, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (68719476747, 81604378642, 2))), SingleBranch{Float64}(1:14, 0, 10:9, 1, 1, [0.2510328948919175, 0.25543505175757675, 0.24954936565183686], 0.32830620603364347, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.2148637130046256 0.0; -0.0 0.0;;; -0.04834020432476547 0.0; -0.08941144433660723 0.0;;; … ;;; 3.5752497223563428e-6 0.0; 3.006318555294376e-7 0.0;;; 3.8241925632138014e-7 0.0; 8.756852584356714e-7 0.0;;; -5.567255439862998e-8 0.0; 7.122976820673655e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716346238400, 139716240540464, 1))), SingleBranch{Float64}(15:32, 0, 10:9, 1, 2, [0.7459797094580026, 0.25543505175757675, 0.24954936565183686], 0.4075867895483546, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.11109434668789528 0.0; -0.0 0.0;;; -0.09395711373565785 0.0; -0.0339352994212802 0.0;;; … ;;; -3.093083615342297e-7 0.0; -5.266957581159998e-7 0.0;;; -8.45286066948681e-8 0.0; -4.5318545488438834e-7 0.0;;; 1.3388476395864516e-8 0.0; -8.18196465630313e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715648315824, 139716387140544, 14))), SingleBranch{Float64}(33:42, 0, 10:9, 1, 3, [0.2510328948919175, 0.7503818663236619, 0.24954936565183686], 0.35924653313006505, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.19025706176624954 0.0; -0.0 0.0;;; -0.08523496179525314 0.0; 0.10063729919665365 0.0;;; … ;;; 4.515975081865985e-6 0.0; 2.6908857868788118e-6 0.0;;; 2.2681790868948097e-6 0.0; -7.786951926686422e-7 0.0;;; 1.2084952396660516e-7 0.0; -3.097235599682232e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715632632368, 139715632632400, 429653962406))), SingleBranch{Float64}(43:55, 0, 10:9, 1, 4, [0.7459797094580026, 0.7503818663236619, 0.24954936565183686], 0.3444301048203579, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.10425563194142104 0.0; -0.0 0.0;;; -0.04040126882373641 0.0; -0.04562532239334573 0.0;;; … ;;; 1.3996120396479463e-7 0.0; -9.646181946431826e-8 0.0;;; 5.816317826369127e-8 0.0; 1.4394267248631393e-8 0.0;;; 3.2480223567985996e-9 0.0; 6.206399328437309e-9 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716185616416, 139716240549472, 139716188884736))), SingleBranch{Float64}(56:68, 0, 10:9, 1, 5, [0.2510328948919175, 0.25543505175757675, 0.744496180217922], 0.38361157253242145, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.14061387788889593 0.0; 0.0 0.0;;; 0.04115555743278536 0.0; -0.035336314269337296 0.0;;; … ;;; -1.288070786691546e-7 0.0; -2.0654704149134432e-7 0.0;;; -4.8404286408038316e-8 0.0; -1.51707993788448e-8 0.0;;; -3.595926037719477e-9 0.0; 1.544749903303687e-9 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715609101825, 139716345562000, 139716188884736))), SingleBranch{Float64}(69:78, 0, 10:9, 1, 6, [0.7459797094580026, 0.25543505175757675, 0.744496180217922], 0.3013874815759014, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.05941703079908202 0.0; -0.0 0.0;;; -0.06985022321023225 0.0; 0.1032519762464019 0.0;;; … ;;; -6.688757943059791e-7 0.0; -1.4504812423201137e-7 0.0;;; 4.323362110439875e-7 0.0; -4.1295023043996754e-7 0.0;;; -4.18706433955205e-8 0.0; -2.4735074430968403e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716346238464, 139715617276304, 139716188884736))), SingleBranch{Float64}(79:86, 0, 10:9, 1, 7, [0.2510328948919175, 0.7503818663236619, 0.744496180217922], 0.3820455665476881, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.19773882534987763 0.0; -0.0 0.0;;; 0.10337544252106134 0.0; -0.003701264144869725 0.0;;; … ;;; 3.095126144436569e-6 0.0; -3.3359544949065297e-7 0.0;;; -9.336790671507606e-7 0.0; 1.3458164455370796e-7 0.0;;; 9.71193839691501e-8 0.0; -1.7566838362957855e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (4294967297, 139715286138880, 139716188884736))), SingleBranch{Float64}(87:100, 0, 10:9, 1, 8, [0.7459797094580026, 0.7503818663236619, 0.744496180217922], 0.3327162107193368, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.0593706787958249 0.0; -0.0 0.0;;; 0.08539509989261301 0.0; 0.03940386228514198 0.0;;; … ;;; -1.6827227854645148e-8 0.0; -5.990511984334067e-8 0.0;;; 3.054235133952722e-8 0.0; -1.9110787243922576e-7 0.0;;; -3.415340917917519e-8 0.0; 5.0921396075492695e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715632635056, 139715632635088, 5)))], UnitRange{Int64}[1:1, 2:9], [2, 3, 4, 5, 6, 7, 8, 9], [11, 19, 33, 43, 59, 63, 67, 68, 69, 72  …  20, 24, 31, 37, 42, 48, 60, 74, 94, 100], [69, 87, 70, 71, 79, 43, 56, 57, 44, 88  …  12, 55, 30, 99, 31, 32, 13, 68, 14, 100], Tuple{Main.Body{Float64}, Vector{Float64}}[(Main.Body{Float64}([0.3108257809580788, 0.018444977603329638, 0.1448495720156966], 0.004532460900544307, 0.6204619994567462), [6.656408075963273, 0.0, 0.0, 0.0, -3.5398731184273053, -9.295941020322173, -5.413464408657029, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.04239416161334009, 0.32064719274449505, 0.48130130480471], 0.009728577099494845, 0.28031926582466293), [7.0836044891461585, 0.0, 0.0, 0.0, -8.857359963224212, -3.7043629243965284, 2.6867154926403254, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.431557182411335, 0.05729104146002573, 0.4039530057283216], 0.007375228802112362, 0.30999664605164), [7.739018612595635, 0.0, 0.0, 0.0, -0.37792795808645685, -9.107993435650643, 1.4755711117578612, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.3760481927883257, 0.30427758942618754, 0.0424352411332668], 0.008737504330345026, 0.3856873023831733), [7.497010356100949, 0.0, 0.0, 0.0, -4.93733078661837, -0.9512848217887391, -9.321732229232445, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.40796257253884594, 0.3169707043296718, 0.17481471770913004], 0.0006599191423210741, 0.6303355439118526), [8.603145628291282, 0.0, 0.0, 0.0, -5.092945448737958, -0.35201620762089525, -5.017596524805857, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.44526311787148065, 0.3123953708377504, 0.0031981489559432807], 0.002234687294853749, 0.2526616143954684), [7.394307495297395, 0.0, 0.0, 0.0, -4.074197603049914, -0.8843005298526739, -12.129516167989486, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.09506281506194814, 0.37886831688663536, 0.2883280135877385], 0.0026513954621956654, 0.34851211014036976), [7.743796789514465, 0.0, 0.0, 0.0, -8.951264053959937, -1.9617883735084023, -4.658746399724488, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.385983388890926, 0.2099869174765614, 0.2103305433014464], 0.002673503120625262, 0.731920338683347), [8.699005360233967, 0.0, 0.0, 0.0, -9.322285862701646, 2.555093162665515, -1.874069896074265, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.4374975251302734, 0.2511138400545102, 0.1042125323068771], 0.0079424961191749, 0.28373707089135336), [8.545986552488209, 0.0, 0.0, 0.0, -10.43682822175596, 6.712123318844789, -6.799535652933345, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.33885320202792324, 0.21079845214701087, 0.07899763839448037], 0.0008797470416774469, 0.6588156699242567), [7.516005325514882, 0.0, 0.0, 0.0, -4.836766418598849, -2.225174045341691, -8.617929217958249, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Body{Float64}([0.761014175927334, 0.5625502355864805, 0.6362450642237143], 0.00477924026951857, 0.08790391023238642), [8.696622821572635, 0.0, 0.0, 0.0, 5.548245493459153, 0.6647207464342835, 6.278537989010481, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.741658189777045, 0.8784627652056287, 0.6026198177064941], 0.0028805176050072864, 0.24086407961581202), [7.541219085822956, 0.0, 0.0, 0.0, 0.3131879052669324, 8.516359052958578, 5.9072937820384634, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6559052253949811, 0.9583482860298168, 0.6198294517560885], 0.008868504569149492, 0.17689335268130646), [6.840663348171893, 0.0, 0.0, 0.0, 0.2944062620800215, 7.712555707441569, 4.705741898589104, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5044880780307363, 0.9392745252820915, 0.8236302658478007], 0.0035072444787534506, 0.5071979794728987), [5.902585114087375, 0.0, 0.0, 0.0, -0.7298300723802948, 5.074581758334187, 4.958470552095021, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.7719706502318479, 0.987371940477909, 0.5992694800324155], 0.000561642365078654, 0.020303598406039902), [6.659400467615292, 0.0, 0.0, 0.0, 0.9370333132030003, 8.321557859554815, 4.446254367712357, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9270141064885, 0.6996533718950176, 0.7573000900883736], 0.005090949172292981, 0.41670321904423535), [7.294560374728856, 0.0, 0.0, 0.0, 0.7797311911756291, 1.8536289165730497, 8.106518301667714, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6705665433906464, 0.8074865918599404, 0.5791268533462717], 0.008580519038422284, 0.2990005802447111), [8.378169492760158, 0.0, 0.0, 0.0, 0.672628905011095, 11.149982109624677, 5.703626251533733, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5199695296735932, 0.5150132871145792, 0.7028351735495706], 0.0037563211861237865, 0.28526666192551975), [8.680614827593462, 0.0, 0.0, 0.0, -3.197166807339375, 0.26787494900673947, 8.549839228303712, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5109351365074641, 0.7269107204213763, 0.8057341233600875], 0.002916397428800248, 0.13080774080166646), [7.060195088980969, 0.0, 0.0, 0.0, -0.8852806157001135, 4.388943223104779, 7.646679439394734, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8247874340282866, 0.5795916665384359, 0.8038668590137469], 0.0035401668870093193, 0.6409979037657155), [7.436136404880495, 0.0, 0.0, 0.0, 1.9624183678921265, 3.8680899850301302, 6.034444873485874, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], Val{5}(), 50), StaticArraysCore.SVector{2, Int32}[], UnitRange{Int64}[1:14, 1:14, 1:14, 1:14, 1:14, 1:14, 1:14, 1:14, 15:32, 15:32  …  79:86, 79:86, 87:100, 87:100, 87:100, 87:100, 87:100, 87:100, 87:100, 87:100], UnitRange{Int64}[1:13, 14:23, 24:40, 41:57, 58:71, 72:82, 83:89, 90:100, 1:13, 14:23  …  83:89, 90:100, 1:13, 14:23, 24:40, 41:57, 58:71, 72:82, 83:89, 90:100])

Reusing the Octree

Users are able to define the tree to be used in the FMM by passing in a previously created tree into the fmm! call. For convenience, the upward_pass, horizontal_pass, and downward_pass can be toggled off seperately. These are important to toggle when generating octrees to be reused. Additionally, unsort_target_bodies and unsort_source_bodies should be set to false when generating the reusable trees.

target_system = generate_gravitational(123, 100)
+    unsort_source_bodies=false, unsort_target_bodies=false) # sorted bodies (not original indices)
(SingleTree{Float64, Vector{Tuple{Main.Body{Float64}, Vector{Float64}}}, 5}(SingleBranch{Float64}[SingleBranch{Float64}(1:100, 8, 2:9, 0, -1, [0.49849075893959255, 0.5011246180164968, 0.50101931980297], 0.8617443734929683, 0.8617443734929683, [-0.49752834600881063, 0.49752834600881063, -0.49752834600881063, 0.49752834600881063, -0.49752834600881063, 0.49752834600881063], [0.49752834600881063, 0.49752834600881063, 0.49752834600881063], 0.0, 0.0, fill(0.0), [-49.209733528008485 0.0; 0.0 0.0;;; 3.235503852070556 0.0; 0.0 0.0;;; 0.02681865248285842 0.0; 0.9591193094494834 0.0;;; … ;;; -0.0004469512083583767 0.0; -0.00015932419565861916 0.0;;; -0.00028710529956597804 0.0; -0.00031904516877669385 0.0;;; -7.588266430169126e-6 0.0; -8.400184364295124e-5 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871751534849, 139871858994320, 139871751534992))), SingleBranch{Float64}(1:13, 0, 10:9, 1, 1, [0.24972658593518723, 0.25236044501209143, 0.25225514679856464], 0.43087218674648414, 0.43087218674648414, [-0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531], [0.24876417300440531, 0.24876417300440531, 0.24876417300440531], 0.0, 0.0, fill(0.0), [-6.326393509059363 0.0; 0.0 0.0;;; 0.10174482633884264 0.0; 0.0 0.0;;; -0.07898687772271276 0.0; 0.03841659635534152 0.0;;; … ;;; -9.654710862452212e-7 0.0; -5.591129557725438e-7 0.0;;; 1.175731767951614e-6 0.0; 2.391893864725776e-6 0.0;;; -3.893767927840696e-8 0.0; -4.373076778562484e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.21988918332658114 0.0; 0.0 0.0;;; -0.00907173901579822 0.0; -0.08078608463780172 0.0;;; … ;;; 6.639561085749197e-7 0.0; 1.9043445262044332e-6 0.0;;; 3.6078285954161947e-7 0.0; -1.730779168448776e-7 0.0;;; -1.5694464749247868e-8 0.0; -2.5081831237534205e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 431051618394))), SingleBranch{Float64}(14:23, 0, 10:9, 1, 2, [0.7472549319439978, 0.25236044501209143, 0.25225514679856464], 0.43087218674648414, 0.43087218674648414, [-0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531], [0.24876417300440531, 0.24876417300440531, 0.24876417300440531], 0.0, 0.0, fill(0.0), [-5.505985520323303 0.0; 0.0 0.0;;; -0.0893400706965472 0.0; 0.0 0.0;;; 0.07469760206429724 0.0; -0.23211041531103774 0.0;;; … ;;; -2.392727383648695e-6 0.0; -2.7506172478695797e-7 0.0;;; 1.2869752996385646e-6 0.0; 8.632541193951725e-7 0.0;;; -1.4323853566229846e-7 0.0; 3.40320513459477e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.18613078162840202 0.0; 0.0 0.0;;; -0.03988177380448188 0.0; -0.10881091326674686 0.0;;; … ;;; 3.1493849180079693e-6 0.0; 1.79002742056861e-6 0.0;;; 2.3049009571265728e-7 0.0; -1.3797688581858191e-6 0.0;;; -1.7119818873987816e-7 0.0; 3.217930041360891e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 430491729105))), SingleBranch{Float64}(24:40, 0, 10:9, 1, 3, [0.24972658593518723, 0.7498887910209021, 0.25225514679856464], 0.43087218674648414, 0.43087218674648414, [-0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531], [0.24876417300440531, 0.24876417300440531, 0.24876417300440531], 0.0, 0.0, fill(0.0), [-7.986155913622251 0.0; 0.0 0.0;;; -0.1795979615961002 0.0; 0.0 0.0;;; -0.1708212423759164 0.0; 0.03135320324442914 0.0;;; … ;;; -6.066362373385743e-6 0.0; 2.4234495602853986e-6 0.0;;; 2.327392085993626e-6 0.0; 4.871331224296273e-7 0.0;;; 2.4751088043185402e-8 0.0; -5.827716675663792e-8 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.23122788327035293 0.0; 0.0 0.0;;; -0.04900663119822446 0.0; 0.09175801803089013 0.0;;; … ;;; 4.485772070448108e-6 0.0; -4.4630903906536425e-7 0.0;;; 4.303552019451355e-7 0.0; -1.0428735117063708e-6 0.0;;; -6.452660186998594e-8 0.0; -7.836101483352229e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 430491729105))), SingleBranch{Float64}(41:57, 0, 10:9, 1, 4, [0.7472549319439978, 0.7498887910209021, 0.25225514679856464], 0.43087218674648414, 0.43087218674648414, [-0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531], [0.24876417300440531, 0.24876417300440531, 0.24876417300440531], 0.0, 0.0, fill(0.0), [-9.931355245362722 0.0; 0.0 0.0;;; 0.004639293314162463 0.0; 0.0 0.0;;; 0.10230318193552163 0.0; 0.3431041586399578 0.0;;; … ;;; -5.8057861586053485e-6 0.0; -3.6767179441275553e-6 0.0;;; 1.970849569609788e-6 0.0; -1.1263384149017906e-6 0.0;;; 4.6063384099401923e-7 0.0; -7.362879677517756e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.24833262559729297 0.0; 0.0 0.0;;; -0.04049792411417641 0.0; 0.11830484901746985 0.0;;; … ;;; 7.332767131734295e-6 0.0; -4.818366848970212e-6 0.0;;; 6.296375165101449e-7 0.0; 2.450158453149185e-6 0.0;;; -2.5398566738723024e-7 0.0; -1.9922601565040447e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 430782432454))), SingleBranch{Float64}(58:71, 0, 10:9, 1, 5, [0.24972658593518723, 0.25236044501209143, 0.7497834928073753], 0.43087218674648414, 0.43087218674648414, [-0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531], [0.24876417300440531, 0.24876417300440531, 0.24876417300440531], 0.0, 0.0, fill(0.0), [-6.0812379817404665 0.0; 0.0 0.0;;; 0.2500525077504865 0.0; 0.0 0.0;;; -0.31821199437047437 0.0; 0.12219381204800842 0.0;;; … ;;; 3.886164164482793e-6 0.0; -7.451230042206713e-6 0.0;;; -1.5655861775267537e-6 0.0; 1.3488384490746591e-6 0.0;;; -2.65136301189794e-7 0.0; -1.0396969077621681e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.23600456619228227 0.0; 0.0 0.0;;; 0.00780054815104303 0.0; 0.01243800251579276 0.0;;; … ;;; -1.457243306148132e-8 0.0; 1.604225902871519e-9 0.0;;; -2.836500215179685e-10 0.0; -3.581821796740947e-10 0.0;;; 1.9003405206797664e-12 0.0; -5.3575717814609175e-12 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 433312535027))), SingleBranch{Float64}(72:82, 0, 10:9, 1, 6, [0.7472549319439978, 0.25236044501209143, 0.7497834928073753], 0.43087218674648414, 0.43087218674648414, [-0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531], [0.24876417300440531, 0.24876417300440531, 0.24876417300440531], 0.0, 0.0, fill(0.0), [-5.643660411433685 0.0; 0.0 0.0;;; -0.09740163237448708 0.0; 0.0 0.0;;; 0.30569645349438196 0.0; 0.2359234953909746 0.0;;; … ;;; -9.82916763080865e-7 0.0; -4.2285511081766585e-7 0.0;;; 2.7225441029521644e-6 0.0; -9.866422822602592e-7 0.0;;; -2.884182756506517e-7 0.0; 2.1891312191953625e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.137250125216142 0.0; 0.0 0.0;;; -0.041848288296333136 0.0; 0.07154851443791577 0.0;;; … ;;; 7.308420503707386e-7 0.0; 1.2365335735668517e-8 0.0;;; 1.4021073394047346e-7 0.0; -2.3067492312302074e-7 0.0;;; -1.5499976899256273e-8 0.0; -2.8685176609168157e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 433312535027))), SingleBranch{Float64}(83:89, 0, 10:9, 1, 7, [0.24972658593518723, 0.7498887910209021, 0.7497834928073753], 0.43087218674648414, 0.43087218674648414, [-0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531], [0.24876417300440531, 0.24876417300440531, 0.24876417300440531], 0.0, 0.0, fill(0.0), [-2.3207471469996026 0.0; 0.0 0.0;;; 0.09584922777112714 0.0; 0.0 0.0;;; -0.03459176396777507 0.0; -0.04020642273548641 0.0;;; … ;;; 3.930977957593639e-6 0.0; -1.9071506252246133e-6 0.0;;; 4.262561393862879e-7 0.0; 6.012045573535614e-7 0.0;;; -1.296847519879538e-7 0.0; -1.748757755002258e-8 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.14971540025278463 0.0; 0.0 0.0;;; -0.10199818137039851 0.0; -0.00404107784645201 0.0;;; … ;;; -1.5142366400508734e-6 0.0; -1.807350708728618e-7 0.0;;; 6.688310694761936e-7 0.0; 1.0683350833198992e-7 0.0;;; -9.055558759133121e-8 0.0; -1.8167298693653792e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 0))), SingleBranch{Float64}(90:100, 0, 10:9, 1, 8, [0.7472549319439978, 0.7498887910209021, 0.7497834928073753], 0.43087218674648414, 0.43087218674648414, [-0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531], [0.24876417300440531, 0.24876417300440531, 0.24876417300440531], 0.0, 0.0, fill(0.0), [-5.414197799467094 0.0; 0.0 0.0;;; 0.5897626670629665 0.0; 0.0 0.0;;; -0.1138694027478626 0.0; -0.009802047749392043 0.0;;; … ;;; 1.152740503052551e-5 0.0; -4.517016990218442e-6 0.0;;; -4.140046433990845e-6 0.0; -1.566383749352849e-6 0.0;;; 1.2469713505945974e-7 0.0; 2.024928160458584e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.21095730321733874 0.0; 0.0 0.0;;; 0.09347241596581823 0.0; -0.08394581821691316 0.0;;; … ;;; -3.5372171155417328e-6 0.0; -4.908219455216665e-6 0.0;;; -2.1396426594075856e-6 0.0; -4.6629625718216964e-7 0.0;;; -2.2671999108049045e-7 0.0; 1.289627938417499e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 429496729600)))], UnitRange{Int64}[1:1, 2:9], [2, 3, 4, 5, 6, 7, 8, 9], [8, 19, 24, 25, 30, 33, 35, 43, 52, 55  …  37, 41, 42, 49, 64, 71, 78, 79, 87, 88], [90, 83, 24, 72, 58, 59, 25, 1, 60, 73  …  23, 38, 80, 56, 39, 81, 82, 40, 13, 57], Tuple{Main.Body{Float64}, Vector{Float64}}[(Main.Body{Float64}([0.4660552366407049, 0.13111968284280429, 0.1908671255470663], 0.010673064683743582, 0.8267772979915037), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.3447705767476935, 0.07006788456539503, 0.2923577651940017], 0.004397261752829818, 0.5517592405944612), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.4911645955827536, 0.040324077362882016, 0.317784960572128], 0.004572616745488207, 0.1280946812518453), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.40516617554370093, 0.32616788197738866, 0.056217617276771326], 0.010585392495089252, 0.012104263433355023), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.18599865953230243, 0.15030687931482978, 0.12186905472850917], 0.00530068913657312, 0.7976632010743766), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.4346643684051661, 0.13212864017170378, 0.19630837394498046], 0.004567269441401094, 0.39368661127046056), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.0009624129307819196, 0.2950090065083799, 0.07129536266232961], 0.0030690713098188082, 0.49288942845129), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.06701550238862786, 0.25483654814098344, 0.3238706353789649], 0.00505556524793979, 0.4522470321326544), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.1639092692596178, 0.44194134967919385, 0.42176372731880774], 0.010361551731613024, 0.6906085781397405), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.47398778866030766, 0.2026564230666169, 0.09034743825060043], 0.004653876665231441, 0.5317908249797711), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Body{Float64}([0.6906947058638981, 0.7538566588961716, 0.5900448016217961], 0.0029834697498147098, 0.10279531111389983), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9917278520449697, 0.794049105113352, 0.7711676013529396], 0.007048482826053925, 0.6415640852627671), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8289326726987614, 0.6101948372863522, 0.519118545970754], 0.0018327766115619636, 0.2379274720768212), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6174588851816368, 0.6522104227559661, 0.5847276813173017], 0.00761078545286029, 0.9704213765219395), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5232139755745984, 0.6045990113354003, 0.5429901209014718], 0.0060841769615967035, 0.8911459293930191), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9581632293408542, 0.9135421917156796, 0.7073373243745936], 0.010449665448269006, 0.8357622456841612), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.7658820877217039, 0.9631550531437152, 0.5344687381454426], 0.0068829275392983565, 0.07479369706302341), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.960720320334046, 0.651071293378233, 0.6942906786235435], 0.0097351936375095, 0.44997536837158536), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.7803189670835223, 0.8311591102139488, 0.5707525801936775], 0.008043628052385822, 0.08862350083761417), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5793632955101715, 0.5629439590892656, 0.5388261895900366], 0.008824875260231754, 0.805646285033539), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], Val{5}(), 50), SingleTree{Float64, Vector{Tuple{Main.Body{Float64}, Vector{Float64}}}, 5}(SingleBranch{Float64}[SingleBranch{Float64}(1:100, 8, 2:9, 0, -1, [0.49850630217496006, 0.5029084590406193, 0.4970227729348794], 0.8572644572282587, 0.8572644572282587, [-0.49494186514743355, 0.49494186514743355, -0.49494186514743355, 0.49494186514743355, -0.49494186514743355, 0.49494186514743355], [0.49494186514743355, 0.49494186514743355, 0.49494186514743355], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871114018352, 139871114020752, 139871111261712))), SingleBranch{Float64}(1:14, 0, 10:9, 1, 1, [0.2510353696012433, 0.25543752646690254, 0.24955184036116262], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.2148612382952998 0.0; -0.0 0.0;;; -0.04833896697010254 0.0; -0.08941268169127015 0.0;;; … ;;; 3.5751904359505736e-6 0.0; 3.0080507578758053e-7 0.0;;; 3.8236458599367976e-7 0.0; 8.757176386082573e-7 0.0;;; -5.567979953388733e-8 0.0; 7.122692732518039e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871763235568, 139871708759632, 139871763244640))), SingleBranch{Float64}(15:32, 0, 10:9, 1, 2, [0.7459772347486768, 0.25543752646690254, 0.24955184036116262], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.11109187197856953 0.0; -0.0 0.0;;; -0.09395587638099494 0.0; -0.03393406206661734 0.0;;; … ;;; -3.0928893153242635e-7 0.0; -5.266357454009592e-7 0.0;;; -8.453485198034652e-8 0.0; -4.5314409979717737e-7 0.0;;; 1.3384370562270982e-8 0.0; -8.18136577012236e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871711579904, 139871711579904, 139871711579904))), SingleBranch{Float64}(33:42, 0, 10:9, 1, 3, [0.2510353696012433, 0.7503793916143361, 0.24955184036116262], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.1902545870569238 0.0; -0.0 0.0;;; -0.08523619914991601 0.0; 0.10063606184199078 0.0;;; … ;;; 4.515701992660869e-6 0.0; 2.690965808809799e-6 0.0;;; 2.2681808274429954e-6 0.0; -7.785616815693268e-7 0.0;;; 1.2086933929990936e-7 0.0; -3.097138724670615e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (1, 1, 0))), SingleBranch{Float64}(43:55, 0, 10:9, 1, 4, [0.7459772347486768, 0.7503793916143361, 0.24955184036116262], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.10425315723209527 0.0; -0.0 0.0;;; -0.04040250617839929 0.0; -0.04562408503868281 0.0;;; … ;;; 1.3994426612384809e-7 0.0; -9.646789543011186e-8 0.0;;; 5.8163042620289284e-8 0.0; 1.4387157402797034e-8 0.0;;; 3.2488834697645844e-9 0.0; 6.2058798109508465e-9 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871909836608, 139871909837056, 139871909837504))), SingleBranch{Float64}(56:68, 0, 10:9, 1, 5, [0.2510353696012433, 0.25543752646690254, 0.7444937055085962], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.1406114031795701 0.0; 0.0 0.0;;; 0.04115679478744828 0.0; -0.03533755162400021 0.0;;; … ;;; -1.2881546024813352e-7 0.0; -2.0655710448954946e-7 0.0;;; -4.840981119340681e-8 0.0; -1.5172010562775518e-8 0.0;;; -3.596485511575488e-9 0.0; 1.545042368324494e-9 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 0))), SingleBranch{Float64}(69:78, 0, 10:9, 1, 6, [0.7459772347486768, 0.25543752646690254, 0.7444937055085962], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.05941950550840777 0.0; -0.0 0.0;;; -0.06984898585556935 0.0; 0.10325321360106476 0.0;;; … ;;; -6.688472512156468e-7 0.0; -1.4501297809812144e-7 0.0;;; 4.3233604883670166e-7 0.0; -4.1299565937718063e-7 0.0;;; -4.1888246519238254e-8 0.0; -2.4735114753799555e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871114018352, 139871114020752, 139871111261872))), SingleBranch{Float64}(79:86, 0, 10:9, 1, 7, [0.2510353696012433, 0.7503793916143361, 0.7444937055085962], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.19774130005920343 0.0; -0.0 0.0;;; 0.10337420516639845 0.0; -0.003702501499532632 0.0;;; … ;;; 3.0951077862846165e-6 0.0; -3.337097810420304e-7 0.0;;; -9.336410389602992e-7 0.0; 1.3462336691028458e-7 0.0;;; 9.711269933660484e-8 0.0; -1.7571838450287563e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871763235568, 139871708759632, 139871763244640))), SingleBranch{Float64}(87:100, 0, 10:9, 1, 8, [0.7459772347486768, 0.7503793916143361, 0.7444937055085962], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.0593731535051507 0.0; -0.0 0.0;;; 0.08539386253795012 0.0; 0.039405099639804875 0.0;;; … ;;; -1.6817191281206375e-8 0.0; -5.988143577896676e-8 0.0;;; 3.0556184471062655e-8 0.0; -1.9110878655930648e-7 0.0;;; -3.415675534882339e-8 0.0; 5.09167765671537e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871711579904, 139871711579904, 139871711579904)))], UnitRange{Int64}[1:1, 2:9], [2, 3, 4, 5, 6, 7, 8, 9], [11, 19, 33, 43, 59, 63, 67, 68, 69, 72  …  20, 24, 31, 37, 42, 48, 60, 74, 94, 100], [69, 87, 70, 71, 79, 43, 56, 57, 44, 88  …  12, 55, 30, 99, 31, 32, 13, 68, 14, 100], Tuple{Main.Body{Float64}, Vector{Float64}}[(Main.Body{Float64}([0.3108257809580788, 0.018444977603329638, 0.1448495720156966], 0.004532460900544307, 0.6204619994567462), [6.656408075963273, 0.0, 0.0, 0.0, -3.5398731184273053, -9.295941020322173, -5.413464408657029, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.04239416161334009, 0.32064719274449505, 0.48130130480471], 0.009728577099494845, 0.28031926582466293), [7.0836044891461585, 0.0, 0.0, 0.0, -8.857359963224212, -3.7043629243965284, 2.6867154926403254, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.431557182411335, 0.05729104146002573, 0.4039530057283216], 0.007375228802112362, 0.30999664605164), [7.739018612595635, 0.0, 0.0, 0.0, -0.37792795808645685, -9.107993435650643, 1.4755711117578612, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.3760481927883257, 0.30427758942618754, 0.0424352411332668], 0.008737504330345026, 0.3856873023831733), [7.497010356100949, 0.0, 0.0, 0.0, -4.93733078661837, -0.9512848217887391, -9.321732229232445, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.40796257253884594, 0.3169707043296718, 0.17481471770913004], 0.0006599191423210741, 0.6303355439118526), [8.603145628291282, 0.0, 0.0, 0.0, -5.092945448737958, -0.35201620762089525, -5.017596524805857, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.44526311787148065, 0.3123953708377504, 0.0031981489559432807], 0.002234687294853749, 0.2526616143954684), [7.394307495297395, 0.0, 0.0, 0.0, -4.074197603049914, -0.8843005298526739, -12.129516167989486, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.09506281506194814, 0.37886831688663536, 0.2883280135877385], 0.0026513954621956654, 0.34851211014036976), [7.743796789514465, 0.0, 0.0, 0.0, -8.951264053959937, -1.9617883735084023, -4.658746399724488, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.385983388890926, 0.2099869174765614, 0.2103305433014464], 0.002673503120625262, 0.731920338683347), [8.699005360233967, 0.0, 0.0, 0.0, -9.322285862701646, 2.555093162665515, -1.874069896074265, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.4374975251302734, 0.2511138400545102, 0.1042125323068771], 0.0079424961191749, 0.28373707089135336), [8.545986552488209, 0.0, 0.0, 0.0, -10.43682822175596, 6.712123318844789, -6.799535652933345, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.33885320202792324, 0.21079845214701087, 0.07899763839448037], 0.0008797470416774469, 0.6588156699242567), [7.516005325514882, 0.0, 0.0, 0.0, -4.836766418598849, -2.225174045341691, -8.617929217958249, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Body{Float64}([0.761014175927334, 0.5625502355864805, 0.6362450642237143], 0.00477924026951857, 0.08790391023238642), [8.696622821572635, 0.0, 0.0, 0.0, 5.548245493459153, 0.6647207464342835, 6.278537989010481, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.741658189777045, 0.8784627652056287, 0.6026198177064941], 0.0028805176050072864, 0.24086407961581202), [7.541219085822956, 0.0, 0.0, 0.0, 0.3131879052669324, 8.516359052958578, 5.9072937820384634, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6559052253949811, 0.9583482860298168, 0.6198294517560885], 0.008868504569149492, 0.17689335268130646), [6.840663348171893, 0.0, 0.0, 0.0, 0.2944062620800215, 7.712555707441569, 4.705741898589104, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5044880780307363, 0.9392745252820915, 0.8236302658478007], 0.0035072444787534506, 0.5071979794728987), [5.902585114087375, 0.0, 0.0, 0.0, -0.7298300723802948, 5.074581758334187, 4.958470552095021, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.7719706502318479, 0.987371940477909, 0.5992694800324155], 0.000561642365078654, 0.020303598406039902), [6.659400467615292, 0.0, 0.0, 0.0, 0.9370333132030003, 8.321557859554815, 4.446254367712357, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9270141064885, 0.6996533718950176, 0.7573000900883736], 0.005090949172292981, 0.41670321904423535), [7.294560374728856, 0.0, 0.0, 0.0, 0.7797311911756291, 1.8536289165730497, 8.106518301667714, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6705665433906464, 0.8074865918599404, 0.5791268533462717], 0.008580519038422284, 0.2990005802447111), [8.378169492760158, 0.0, 0.0, 0.0, 0.672628905011095, 11.149982109624677, 5.703626251533733, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5199695296735932, 0.5150132871145792, 0.7028351735495706], 0.0037563211861237865, 0.28526666192551975), [8.680614827593462, 0.0, 0.0, 0.0, -3.197166807339375, 0.26787494900673947, 8.549839228303712, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5109351365074641, 0.7269107204213763, 0.8057341233600875], 0.002916397428800248, 0.13080774080166646), [7.060195088980969, 0.0, 0.0, 0.0, -0.8852806157001135, 4.388943223104779, 7.646679439394734, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8247874340282866, 0.5795916665384359, 0.8038668590137469], 0.0035401668870093193, 0.6409979037657155), [7.436136404880495, 0.0, 0.0, 0.0, 1.9624183678921265, 3.8680899850301302, 6.034444873485874, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], Val{5}(), 50), Tuple{Int32, Int32, Int64}[], StaticArraysCore.SVector{2, Int32}[[2, 2], [3, 2], [4, 2], [5, 2], [6, 2], [7, 2], [8, 2], [9, 2], [2, 3], [3, 3]  …  [8, 8], [9, 8], [2, 9], [3, 9], [4, 9], [5, 9], [6, 9], [7, 9], [8, 9], [9, 9]], DerivativesSwitch{true, true, true}())

Reusing the Octree

Users are able to define the tree to be used in the FMM by passing in a previously created tree into the fmm! call. For convenience, the upward_pass, horizontal_pass, and downward_pass can be toggled off seperately. These are important to toggle when generating octrees to be reused. Additionally, unsort_target_bodies and unsort_source_bodies should be set to false when generating the reusable trees.

target_system = generate_gravitational(123, 100)
 source_system = generate_gravitational(321, 100)
 
 target_tree, source_tree = fmm.fmm!(target_system, source_system;
@@ -32,14 +32,14 @@
     unsort_source_bodies=false, unsort_target_bodies=false) # generating trees to be reused
 
 fmm.fmm!(target_tree, target_system, source_tree, source_system;
-    upward_pass=false, horizontal_pass=true, downward_pass=true) # reusing trees
(StaticArraysCore.SVector{2, Int32}[], UnitRange{Int64}[1:13, 1:13, 1:13, 1:13, 1:13, 1:13, 1:13, 1:13, 14:23, 14:23  …  83:89, 83:89, 90:100, 90:100, 90:100, 90:100, 90:100, 90:100, 90:100, 90:100], UnitRange{Int64}[1:14, 15:32, 33:42, 43:55, 56:68, 69:78, 79:86, 87:100, 1:14, 15:32  …  79:86, 87:100, 1:14, 15:32, 33:42, 43:55, 56:68, 69:78, 79:86, 87:100], DerivativesSwitch{true, true, true}())

Partial Evaluation

The nearfield, farfield, and self_induced parameters allow users to bypass certain portions of the FMM.

system = generate_gravitational(123, 100)
+    upward_pass=false, horizontal_pass=true, downward_pass=true) # reusing trees
(Tuple{Int32, Int32, Int64}[], StaticArraysCore.SVector{2, Int32}[[2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [2, 8], [2, 9], [3, 2], [3, 3]  …  [8, 8], [8, 9], [9, 2], [9, 3], [9, 4], [9, 5], [9, 6], [9, 7], [9, 8], [9, 9]], DerivativesSwitch{true, true, true}())

Partial Evaluation

The nearfield, farfield, and self_induced parameters allow users to bypass certain portions of the FMM.

system = generate_gravitational(123, 100)
 fmm.fmm!(system,
     nearfield=true, farfield=true, self_induced=true) # standard run (defaults)
 fmm.fmm!(system,
-    nearfield=false, farfield=true, self_induced=true) # nearfield not evaluated
(SingleTree{Float64, Vector{Tuple{Main.Body{Float64}, Vector{Float64}}}, 5}(SingleBranch{Float64}[SingleBranch{Float64}(1:100, 8, 2:9, 0, -1, [0.49850630217496006, 0.5029084590406193, 0.4970227729348794], 0.8362233044847701, [-48.34870113041748 0.0; 0.0 0.0;;; 2.5984220197757493 0.0; 0.0 0.0;;; -1.2227362282002519 0.0; 0.8450131042390989 0.0;;; … ;;; -8.791709687591738e-5 0.0; -0.0004287156900488262 0.0;;; 8.822613231853972e-5 0.0; -0.00020008302331153612 0.0;;; -1.2615951275491271e-5 0.0; -3.06555042659532e-6 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716227851536, 139716238107552, 139716387159360))), SingleBranch{Float64}(1:14, 0, 10:9, 1, 1, [0.2510328948919175, 0.25543505175757675, 0.24954936565183686], 0.32830620603364347, [-6.487390818499682 0.0; 0.0 0.0;;; 0.13160802997362941 0.0; 0.0 0.0;;; 0.025257151070001396 0.0; 0.11024142779407628 0.0;;; … ;;; -3.4552047941103347e-6 0.0; 5.92279525203367e-7 0.0;;; 1.5154359196085172e-6 0.0; -1.704818027801098e-6 0.0;;; 1.507027521410391e-7 0.0; 1.884904605400281e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.2148637130046256 0.0; -0.0 0.0;;; -0.04834020432476547 0.0; -0.08941144433660723 0.0;;; … ;;; 3.5752497223563428e-6 0.0; 3.006318555294376e-7 0.0;;; 3.8241925632138014e-7 0.0; 8.756852584356714e-7 0.0;;; -5.567255439862998e-8 0.0; 7.122976820673655e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716340817376, 0, 0))), SingleBranch{Float64}(15:32, 0, 10:9, 1, 2, [0.7459797094580026, 0.25543505175757675, 0.24954936565183686], 0.4075867895483546, [-11.124170053937009 0.0; 0.0 0.0;;; 0.41136017634896405 0.0; 0.0 0.0;;; 0.01681678779456549 0.0; -0.14479053987919496 0.0;;; … ;;; -8.963438716003618e-6 0.0; 4.693304408214976e-6 0.0;;; 4.4102445395579444e-6 0.0; -2.1277857167741254e-7 0.0;;; -1.841923482140888e-8 0.0; -2.1879278420605707e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.11109434668789528 0.0; -0.0 0.0;;; -0.09395711373565785 0.0; -0.0339352994212802 0.0;;; … ;;; -3.093083615342297e-7 0.0; -5.266957581159998e-7 0.0;;; -8.45286066948681e-8 0.0; -4.5318545488438834e-7 0.0;;; 1.3388476395864516e-8 0.0; -8.18196465630313e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716325999616, 139715854923472, 0))), SingleBranch{Float64}(33:42, 0, 10:9, 1, 3, [0.2510328948919175, 0.7503818663236619, 0.24954936565183686], 0.35924653313006505, [-5.116346939838825 0.0; 0.0 0.0;;; -0.08995666607829884 0.0; 0.0 0.0;;; -0.1349835437527065 0.0; 0.06707456146941994 0.0;;; … ;;; -1.03637148934866e-6 0.0; 1.2241097861125e-6 0.0;;; -1.8670331116491932e-7 0.0; 1.6661144301044405e-6 0.0;;; 6.54442154006702e-7 0.0; -6.941261187215138e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.19025706176624954 0.0; -0.0 0.0;;; -0.08523496179525314 0.0; 0.10063729919665365 0.0;;; … ;;; 4.515975081865985e-6 0.0; 2.6908857868788118e-6 0.0;;; 2.2681790868948097e-6 0.0; -7.786951926686422e-7 0.0;;; 1.2084952396660516e-7 0.0; -3.097235599682232e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716240540464, 139716240540464, 139716240540464))), SingleBranch{Float64}(43:55, 0, 10:9, 1, 4, [0.7459797094580026, 0.7503818663236619, 0.24954936565183686], 0.3444301048203579, [-6.531648389278439 0.0; 0.0 0.0;;; 0.27835014416833864 0.0; 0.0 0.0;;; 0.002411856261420299 0.0; 0.3732641200075186 0.0;;; … ;;; 3.3763825929270474e-6 0.0; -2.6723802968550274e-6 0.0;;; -1.3437331724310995e-6 0.0; 8.279964236047045e-7 0.0;;; -2.634861518662996e-7 0.0; -4.924335067619407e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.10425563194142104 0.0; -0.0 0.0;;; -0.04040126882373641 0.0; -0.04562532239334573 0.0;;; … ;;; 1.3996120396479463e-7 0.0; -9.646181946431826e-8 0.0;;; 5.816317826369127e-8 0.0; 1.4394267248631393e-8 0.0;;; 3.2480223567985996e-9 0.0; 6.206399328437309e-9 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716387141072, 139716387141520, 418185514174))), SingleBranch{Float64}(56:68, 0, 10:9, 1, 5, [0.2510328948919175, 0.25543505175757675, 0.744496180217922], 0.38361157253242145, [-6.660580658394574 0.0; 0.0 0.0;;; -0.3951368573332444 0.0; 0.0 0.0;;; 0.059806140235814806 0.0; 0.07531365368595062 0.0;;; … ;;; 2.0907706727779475e-6 0.0; -2.5152710642921285e-6 0.0;;; 1.3306624123546174e-6 0.0; 8.501482770130618e-7 0.0;;; -4.5792260804476627e-7 0.0; 1.3806284113973838e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.14061387788889593 0.0; 0.0 0.0;;; 0.04115555743278536 0.0; -0.035336314269337296 0.0;;; … ;;; -1.288070786691546e-7 0.0; -2.0654704149134432e-7 0.0;;; -4.8404286408038316e-8 0.0; -1.51707993788448e-8 0.0;;; -3.595926037719477e-9 0.0; 1.544749903303687e-9 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716240540464, 139716240549472, 0))), SingleBranch{Float64}(69:78, 0, 10:9, 1, 6, [0.7459797094580026, 0.25543505175757675, 0.744496180217922], 0.3013874815759014, [-5.009402189699274 0.0; 0.0 0.0;;; -0.19303271210733094 0.0; 0.0 0.0;;; 0.12964273844915233 0.0; 0.1001623545337623 0.0;;; … ;;; -2.0328306964806397e-6 0.0; 1.1605648632212315e-6 0.0;;; 1.6073342055098596e-6 0.0; 7.524720770054802e-7 0.0;;; -2.1135198071024206e-7 0.0; -2.403266195567272e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.05941703079908202 0.0; -0.0 0.0;;; -0.06985022321023225 0.0; 0.1032519762464019 0.0;;; … ;;; -6.688757943059791e-7 0.0; -1.4504812423201137e-7 0.0;;; 4.323362110439875e-7 0.0; -4.1295023043996754e-7 0.0;;; -4.18706433955205e-8 0.0; -2.4735074430968403e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716363615489, 139716199936080, 414503011198))), SingleBranch{Float64}(79:86, 0, 10:9, 1, 7, [0.2510328948919175, 0.7503818663236619, 0.744496180217922], 0.3820455665476881, [-3.769527893701526 0.0; 0.0 0.0;;; -0.01937485760252879 0.0; 0.0 0.0;;; -0.0011869565842794313 0.0; -0.14576258200570863 0.0;;; … ;;; -1.035780355194869e-5 0.0; 1.2916687480313506e-6 0.0;;; -2.490552446971178e-7 0.0; -3.155207119859079e-6 0.0;;; 4.921259852079049e-7 0.0; 2.9739990241645427e-8 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.19773882534987763 0.0; -0.0 0.0;;; 0.10337544252106134 0.0; -0.003701264144869725 0.0;;; … ;;; 3.095126144436569e-6 0.0; -3.3359544949065297e-7 0.0;;; -9.336790671507606e-7 0.0; 1.3458164455370796e-7 0.0;;; 9.71193839691501e-8 0.0; -1.7566838362957855e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716240540464, 139715591327600, 143526722090))), SingleBranch{Float64}(87:100, 0, 10:9, 1, 8, [0.7459797094580026, 0.7503818663236619, 0.744496180217922], 0.3327162107193368, [-3.6496341870681537 0.0; 0.0 0.0;;; -0.042301568716341185 0.0; 0.0 0.0;;; -0.05660590987410181 0.0; -0.12020777259952997 0.0;;; … ;;; 1.267669727184831e-7 0.0; 9.742058782909874e-7 0.0;;; 6.168283320807449e-7 0.0; -3.980144929711531e-7 0.0;;; 1.6500915529856466e-7 0.0; 5.91078696240452e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.0593706787958249 0.0; -0.0 0.0;;; 0.08539509989261301 0.0; 0.03940386228514198 0.0;;; … ;;; -1.6827227854645148e-8 0.0; -5.990511984334067e-8 0.0;;; 3.054235133952722e-8 0.0; -1.9110787243922576e-7 0.0;;; -3.415340917917519e-8 0.0; 5.0921396075492695e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715591327680, 139715591327696, 139716240540464)))], UnitRange{Int64}[1:1, 2:9], [2, 3, 4, 5, 6, 7, 8, 9], [11, 19, 33, 43, 59, 63, 67, 68, 69, 72  …  20, 24, 31, 37, 42, 48, 60, 74, 94, 100], [69, 87, 70, 71, 79, 43, 56, 57, 44, 88  …  12, 55, 30, 99, 31, 32, 13, 68, 14, 100], Tuple{Main.Body{Float64}, Vector{Float64}}[(Main.Body{Float64}([0.9191811597933967, 0.42601923740838954, 0.7465863168484385], 0.00551624732815934, 0.2538490889415096), [7.0834787492030005, 0.0, 0.0, 0.0, 5.568735643477791, 2.9213884843016737, 0.7633475677477748, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8192008435733007, 0.9541592624784624, 0.8458950823510601], 0.0014709561750558223, 0.03209667335274724), [5.114232575764009, 0.0, 0.0, 0.0, 2.446182605378621, 4.41119482090726, 3.440180697344876, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.586748700554989, 0.12181263792534469, 0.7894931647499924], 0.0016174951280755708, 0.8935369466209786), [6.585365931828452, 0.0, 0.0, 0.0, 2.5334789856996256, -5.935281910533853, 5.877738846695876, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6192588014774537, 0.47764531343080796, 0.8041934288169849], 0.003639098305331564, 0.8236563299357046), [7.314225348781349, 0.0, 0.0, 0.0, 2.0263196413417575, -0.5909579553411834, 6.438131407639304, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.12353811904859124, 0.7400202596259494, 0.7057473220960516], 0.004975260027225807, 0.9340155879013086), [5.994006655657172, 0.0, 0.0, 0.0, -3.6150300092368397, 3.588312709800555, 2.445983480158574, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9919607797239652, 0.8036971367794874, 0.29827230692896456], 0.006659427674753824, 0.4842893268146866), [6.3093512714054905, 0.0, 0.0, 0.0, 6.811100230860857, 3.229004706340305, 0.7635631719803121, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.49265789199054244, 0.17985285886739166, 0.6397154045236242], 0.004022070032387327, 0.6922349538863742), [7.856042192681273, 0.0, 0.0, 0.0, 0.5375760890909462, -5.141800886434623, 1.9448732399847593, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.22768758746068596, 0.26780944724527167, 0.8309795986773825], 0.006802835099514221, 0.6911617055492341), [8.668207473779663, 0.0, 0.0, 0.0, -3.782240224623742, 18.504359731864223, 92.23746117912798, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.621178864455285, 0.7425206336869923, 0.15487161620983314], 0.0010425988209884726, 0.09206661519876747), [7.388934820369321, 0.0, 0.0, 0.0, -0.5191138373209423, 4.756088137496654, -3.410201822139256, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5733898483119126, 0.5900840309886971, 0.7659266276192337], 0.00633005068065063, 0.37737321139310276), [7.64606632116185, 0.0, 0.0, 0.0, 0.09461688248299382, 7.241804506257593, 4.346937745416622, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Body{Float64}([0.3562026836409853, 0.3635243844573359, 0.309727986680287], 0.0038713948967191466, 0.43490959394031214), [8.717797558762465, 0.0, 0.0, 0.0, -5.329362059354715, 1.927215437532789, 2.1413599561398255, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6547290646713112, 0.8311844039711347, 0.3538049975932579], 0.004154302641783906, 0.5842214092626906), [6.95468678089278, 0.0, 0.0, 0.0, -0.26889425383548615, 5.455632900159945, 0.18581332796087613, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5388794936906567, 0.04350921485134718, 0.23629199234128806], 0.006559279199653211, 0.9196974029361853), [7.405157852909614, 0.0, 0.0, 0.0, -0.6529358028805777, -11.2963043390672, -2.91169792948822, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5109351365074641, 0.7269107204213763, 0.8057341233600875], 0.002916397428800248, 0.13080774080166646), [6.808606792136021, 0.0, 0.0, 0.0, -0.9111986992873469, 5.362862739910923, 4.495324132308462, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6177567582580967, 0.38039525218264447, 0.37934078500465196], 0.010186078857427224, 0.2366140514268097), [11.921598844654353, 0.0, 0.0, 0.0, 7.200411754134824, 89.02612612758858, 98.32074510763668, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6781091106154422, 0.44334927922889245, 0.36064371233973214], 0.01036251002724151, 0.2743759198193091), [9.314269146067007, 0.0, 0.0, 0.0, 8.622634737411559, 10.442703018323094, 2.8516623050362013, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.20158107237490663, 0.3238946945648584, 0.24399963650509682], 0.009664372151238956, 0.47733204119516204), [7.6745848038899, 0.0, 0.0, 0.0, -6.292867218536123, -1.9303407565718314, -4.440111319869195, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.18036026635324287, 0.173123936892006, 0.6038823023290261], 0.010016593230124706, 0.4401491209134364), [7.332967741437809, 0.0, 0.0, 0.0, -9.697414526287979, -8.79693777899164, -1.907340053628442, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.072210006218703, 0.3521154604071077, 0.4644130786564624], 0.0037743609975635275, 0.17728847529212788), [7.947029043250998, 0.0, 0.0, 0.0, -1.1234362906646078, 4.290370818176258, 6.7821312097650095, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8247874340282866, 0.5795916665384359, 0.8038668590137469], 0.0035401668870093193, 0.6409979037657155), [6.637146429694789, 0.0, 0.0, 0.0, 3.5215079301835996, 3.242536913859295, 4.5734372311785485, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], Val{5}(), 50), StaticArraysCore.SVector{2, Int32}[], UnitRange{Int64}[], UnitRange{Int64}[], DerivativesSwitch{true, true, true}())

Resize and Recenter Branches

The initial creation of the octree will create uniformly sized and spaced branches in each level. These branches are not centered or optimally sized with relation to the bodies they contain. As a default, the fmm! call resizes and recenters these branches to utilize the smallest possible radius that contains all the bodies in each branch[3]. This feature can be toggled with the source_shrink_recenter and target_shrink_recenter parameters.

target_system = generate_gravitational(123, 100)
+    nearfield=false, farfield=true, self_induced=true) # nearfield not evaluated
(SingleTree{Float64, Vector{Tuple{Main.Body{Float64}, Vector{Float64}}}, 5}(SingleBranch{Float64}[SingleBranch{Float64}(1:100, 8, 2:9, 0, -1, [0.49850630217496006, 0.5029084590406193, 0.4970227729348794], 0.8572644572282587, 0.8572644572282587, [-0.49494186514743355, 0.49494186514743355, -0.49494186514743355, 0.49494186514743355, -0.49494186514743355, 0.49494186514743355], [0.49494186514743355, 0.49494186514743355, 0.49494186514743355], 0.0, 0.0, fill(0.0), [-48.34870113041748 0.0; 0.0 0.0;;; 2.598422019775752 0.0; 0.0 0.0;;; -1.2227362282002523 0.0; 0.8450131042390987 0.0;;; … ;;; -8.791709687591729e-5 0.0; -0.0004287156900488262 0.0;;; 8.822613231853985e-5 0.0; -0.00020008302331153626 0.0;;; -1.2615951275491288e-5 0.0; -3.065550426595302e-6 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871910065744, 139871853565472, 0))), SingleBranch{Float64}(1:14, 0, 10:9, 1, 1, [0.2510353696012433, 0.25543752646690254, 0.24955184036116262], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [-6.487390818499682 0.0; 0.0 0.0;;; 0.1316240843801879 0.0; 0.0 0.0;;; 0.025249123866722074 0.0; 0.110233400590797 0.0;;; … ;;; -3.455130567368021e-6 0.0; 5.924004312810844e-7 0.0;;; 1.5153888935850128e-6 0.0; -1.7047891151365984e-6 0.0;;; 1.5070525582333026e-7 0.0; 1.8849553081710956e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.2148612382952998 0.0; -0.0 0.0;;; -0.04833896697010254 0.0; -0.08941268169127015 0.0;;; … ;;; 3.5751904359505736e-6 0.0; 3.0080507578758053e-7 0.0;;; 3.8236458599367976e-7 0.0; 8.757176386082573e-7 0.0;;; -5.567979953388733e-8 0.0; 7.122692732518039e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871119281072, 139871853565216, 0))), SingleBranch{Float64}(15:32, 0, 10:9, 1, 2, [0.7459772347486768, 0.25543752646690254, 0.24955184036116262], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [-11.124170053937009 0.0; 0.0 0.0;;; 0.41138770543633796 0.0; 0.0 0.0;;; 0.016803023250878363 0.0; -0.14477677533550787 0.0;;; … ;;; -8.963509625362107e-6 0.0; 4.693012478346667e-6 0.0;;; 4.410168138692953e-6 0.0; -2.126045985106235e-7 0.0;;; -1.8361776114546595e-8 0.0; -2.1883614233265213e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.11109187197856953 0.0; -0.0 0.0;;; -0.09395587638099494 0.0; -0.03393406206661734 0.0;;; … ;;; -3.0928893153242635e-7 0.0; -5.266357454009592e-7 0.0;;; -8.453485198034652e-8 0.0; -4.5314409979717737e-7 0.0;;; 1.3384370562270982e-8 0.0; -8.18136577012236e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871910064848, 139871853566848, 0))), SingleBranch{Float64}(33:42, 0, 10:9, 1, 3, [0.2510353696012433, 0.7503793916143361, 0.24955184036116262], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [-5.116346939838825 0.0; 0.0 0.0;;; -0.08994400460681298 0.0; 0.0 0.0;;; -0.13497721301696344 0.0; 0.06706823073367696 0.0;;; … ;;; -1.0362892970772102e-6 0.0; 1.2247154898001747e-6 0.0;;; -1.868656271304562e-7 0.0; 1.6661679454393324e-6 0.0;;; 6.543631075683181e-7 0.0; -6.940763763815243e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.1902545870569238 0.0; -0.0 0.0;;; -0.08523619914991601 0.0; 0.10063606184199078 0.0;;; … ;;; 4.515701992660869e-6 0.0; 2.690965808809799e-6 0.0;;; 2.2681808274429954e-6 0.0; -7.785616815693268e-7 0.0;;; 1.2086933929990936e-7 0.0; -3.097138724670615e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871910065296, 139871853566928, 0))), SingleBranch{Float64}(43:55, 0, 10:9, 1, 4, [0.7459772347486768, 0.7503793916143361, 0.24955184036116262], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [-6.531648389278439 0.0; 0.0 0.0;;; 0.27836630809952023 0.0; 0.0 0.0;;; 0.0024199382270112084 0.0; 0.3732722019731095 0.0;;; … ;;; 3.376714829662012e-6 0.0; -2.67253441421499e-6 0.0;;; -1.3437328271781197e-6 0.0; 8.280933433509673e-7 0.0;;; -2.6353089381680604e-7 0.0; -4.924657915182052e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.10425315723209527 0.0; -0.0 0.0;;; -0.04040250617839929 0.0; -0.04562408503868281 0.0;;; … ;;; 1.3994426612384809e-7 0.0; -9.646789543011186e-8 0.0;;; 5.8163042620289284e-8 0.0; 1.4387157402797034e-8 0.0;;; 3.2488834697645844e-9 0.0; 6.2058798109508465e-9 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871119281072, 139871853568192, 139871112307392))), SingleBranch{Float64}(56:68, 0, 10:9, 1, 5, [0.2510353696012433, 0.25543752646690254, 0.7444937055085962], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [-6.660580658394574 0.0; 0.0 0.0;;; -0.395153340334315 0.0; 0.0 0.0;;; 0.05979789873527955 0.0; 0.07530541218541535 0.0;;; … ;;; 2.090523898062051e-6 0.0; -2.515462436886501e-6 0.0;;; 1.3306773654521538e-6 0.0; 8.501110961871042e-7 0.0;;; -4.5790897504950176e-7 0.0; 1.3805850178672174e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.1406114031795701 0.0; 0.0 0.0;;; 0.04115679478744828 0.0; -0.03533755162400021 0.0;;; … ;;; -1.2881546024813352e-7 0.0; -2.0655710448954946e-7 0.0;;; -4.840981119340681e-8 0.0; -1.5172010562775518e-8 0.0;;; -3.596485511575488e-9 0.0; 1.545042368324494e-9 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871853567504, 139871824730784, 0))), SingleBranch{Float64}(69:78, 0, 10:9, 1, 6, [0.7459772347486768, 0.25543752646690254, 0.7444937055085962], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [-5.009402189699274 0.0; 0.0 0.0;;; -0.19304510892164647 0.0; 0.0 0.0;;; 0.12963654004199454 0.0; 0.10016855294092004 0.0;;; … ;;; -2.032871463751076e-6 0.0; 1.1604382246619326e-6 0.0;;; 1.6073455016687304e-6 0.0; 7.525148568942718e-7 0.0;;; -2.1131812349704138e-7 0.0; -2.403269261044048e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.05941950550840777 0.0; -0.0 0.0;;; -0.06984898585556935 0.0; 0.10325321360106476 0.0;;; … ;;; -6.688472512156468e-7 0.0; -1.4501297809812144e-7 0.0;;; 4.3233604883670166e-7 0.0; -4.1299565937718063e-7 0.0;;; -4.1888246519238254e-8 0.0; -2.4735114753799555e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871127934816, 139871824730784, 0))), SingleBranch{Float64}(79:86, 0, 10:9, 1, 7, [0.2510353696012433, 0.7503793916143361, 0.7444937055085962], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [-3.769527893701526 0.0; 0.0 0.0;;; -0.01938418608836119 0.0; 0.0 0.0;;; -0.0011822923413632442 0.0; -0.1457672462486248 0.0;;; … ;;; -1.035853369522652e-5 0.0; 1.2914125498780046e-6 0.0;;; -2.4874690174267746e-7 0.0; -3.1553943207752724e-6 0.0;;; 4.921174899074237e-7 0.0; 2.978833721286661e-8 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.19774130005920343 0.0; -0.0 0.0;;; 0.10337420516639845 0.0; -0.003702501499532632 0.0;;; … ;;; 3.0951077862846165e-6 0.0; -3.337097810420304e-7 0.0;;; -9.336410389602992e-7 0.0; 1.3462336691028458e-7 0.0;;; 9.711269933660484e-8 0.0; -1.7571838450287563e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871763235632, 139871763235632, 139871763235632))), SingleBranch{Float64}(87:100, 0, 10:9, 1, 8, [0.7459772347486768, 0.7503793916143361, 0.7444937055085962], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [-3.6496341870681537 0.0; 0.0 0.0;;; -0.04231060050009968 0.0; 0.0 0.0;;; -0.05660139398222258 0.0; -0.12020325670765074 0.0;;; … ;;; 1.2674714042901395e-7 0.0; 9.742117200541327e-7 0.0;;; 6.169136545969979e-7 0.0; -3.979999499773143e-7 0.0;;; 1.6497981578864858e-7 0.0; 5.910575433895744e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.0593731535051507 0.0; -0.0 0.0;;; 0.08539386253795012 0.0; 0.039405099639804875 0.0;;; … ;;; -1.6817191281206375e-8 0.0; -5.988143577896676e-8 0.0;;; 3.0556184471062655e-8 0.0; -1.9110878655930648e-7 0.0;;; -3.415675534882339e-8 0.0; 5.09167765671537e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871763235632, 139871763235632, 139871708131376)))], UnitRange{Int64}[1:1, 2:9], [2, 3, 4, 5, 6, 7, 8, 9], [11, 19, 33, 43, 59, 63, 67, 68, 69, 72  …  20, 24, 31, 37, 42, 48, 60, 74, 94, 100], [69, 87, 70, 71, 79, 43, 56, 57, 44, 88  …  12, 55, 30, 99, 31, 32, 13, 68, 14, 100], Tuple{Main.Body{Float64}, Vector{Float64}}[(Main.Body{Float64}([0.9191811597933967, 0.42601923740838954, 0.7465863168484385], 0.00551624732815934, 0.2538490889415096), [7.0834787492030005, 0.0, 0.0, 0.0, 5.568735643477791, 2.9213884843016737, 0.7633475677477748, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8192008435733007, 0.9541592624784624, 0.8458950823510601], 0.0014709561750558223, 0.03209667335274724), [5.114232575764009, 0.0, 0.0, 0.0, 2.446182605378621, 4.41119482090726, 3.440180697344876, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.586748700554989, 0.12181263792534469, 0.7894931647499924], 0.0016174951280755708, 0.8935369466209786), [6.585365931828452, 0.0, 0.0, 0.0, 2.5334789856996256, -5.935281910533853, 5.877738846695876, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6192588014774537, 0.47764531343080796, 0.8041934288169849], 0.003639098305331564, 0.8236563299357046), [7.314225348781349, 0.0, 0.0, 0.0, 2.0263196413417575, -0.5909579553411834, 6.438131407639304, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.12353811904859124, 0.7400202596259494, 0.7057473220960516], 0.004975260027225807, 0.9340155879013086), [5.994006655657172, 0.0, 0.0, 0.0, -3.6150300092368397, 3.588312709800555, 2.445983480158574, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9919607797239652, 0.8036971367794874, 0.29827230692896456], 0.006659427674753824, 0.4842893268146866), [6.3093512714054905, 0.0, 0.0, 0.0, 6.811100230860857, 3.229004706340305, 0.7635631719803121, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.49265789199054244, 0.17985285886739166, 0.6397154045236242], 0.004022070032387327, 0.6922349538863742), [7.856042192681273, 0.0, 0.0, 0.0, 0.5375760890909462, -5.141800886434623, 1.9448732399847593, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.22768758746068596, 0.26780944724527167, 0.8309795986773825], 0.006802835099514221, 0.6911617055492341), [8.668207473779663, 0.0, 0.0, 0.0, -3.782240224623742, 18.504359731864223, 92.23746117912798, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.621178864455285, 0.7425206336869923, 0.15487161620983314], 0.0010425988209884726, 0.09206661519876747), [7.388934820369321, 0.0, 0.0, 0.0, -0.5191138373209423, 4.756088137496654, -3.410201822139256, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5733898483119126, 0.5900840309886971, 0.7659266276192337], 0.00633005068065063, 0.37737321139310276), [7.64606632116185, 0.0, 0.0, 0.0, 0.09461688248299382, 7.241804506257593, 4.346937745416622, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Body{Float64}([0.3562026836409853, 0.3635243844573359, 0.309727986680287], 0.0038713948967191466, 0.43490959394031214), [8.717797558762465, 0.0, 0.0, 0.0, -5.329362059354715, 1.927215437532789, 2.1413599561398255, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6547290646713112, 0.8311844039711347, 0.3538049975932579], 0.004154302641783906, 0.5842214092626906), [6.95468678089278, 0.0, 0.0, 0.0, -0.26889425383548615, 5.455632900159945, 0.18581332796087613, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5388794936906567, 0.04350921485134718, 0.23629199234128806], 0.006559279199653211, 0.9196974029361853), [7.405157852909614, 0.0, 0.0, 0.0, -0.6529358028805777, -11.2963043390672, -2.91169792948822, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5109351365074641, 0.7269107204213763, 0.8057341233600875], 0.002916397428800248, 0.13080774080166646), [6.808606792136021, 0.0, 0.0, 0.0, -0.9111986992873469, 5.362862739910923, 4.495324132308462, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6177567582580967, 0.38039525218264447, 0.37934078500465196], 0.010186078857427224, 0.2366140514268097), [11.921598844654353, 0.0, 0.0, 0.0, 7.200411754134824, 89.02612612758858, 98.32074510763668, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6781091106154422, 0.44334927922889245, 0.36064371233973214], 0.01036251002724151, 0.2743759198193091), [9.314269146067007, 0.0, 0.0, 0.0, 8.622634737411559, 10.442703018323094, 2.8516623050362013, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.20158107237490663, 0.3238946945648584, 0.24399963650509682], 0.009664372151238956, 0.47733204119516204), [7.6745848038899, 0.0, 0.0, 0.0, -6.292867218536123, -1.9303407565718314, -4.440111319869195, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.18036026635324287, 0.173123936892006, 0.6038823023290261], 0.010016593230124706, 0.4401491209134364), [7.332967741437809, 0.0, 0.0, 0.0, -9.697414526287979, -8.79693777899164, -1.907340053628442, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.072210006218703, 0.3521154604071077, 0.4644130786564624], 0.0037743609975635275, 0.17728847529212788), [7.947029043250998, 0.0, 0.0, 0.0, -1.1234362906646078, 4.290370818176258, 6.7821312097650095, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8247874340282866, 0.5795916665384359, 0.8038668590137469], 0.0035401668870093193, 0.6409979037657155), [6.637146429694789, 0.0, 0.0, 0.0, 3.5215079301835996, 3.242536913859295, 4.5734372311785485, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], Val{5}(), 50), Tuple{Int32, Int32, Int64}[], StaticArraysCore.SVector{2, Int32}[], DerivativesSwitch{true, true, true}())

Resize and Recenter Branches

The initial creation of the octree will create uniformly sized and spaced branches in each level. These branches are not centered or optimally sized with relation to the bodies they contain. As a default, the fmm! call resizes and recenters these branches to utilize the smallest possible radius that contains all the bodies in each branch[3]. This feature can be toggled with the source_shrink_recenter and target_shrink_recenter parameters.

target_system = generate_gravitational(123, 100)
 source_system = generate_gravitational(321, 100)
 
 fmm.fmm!(target_system, source_system,
     source_shrink_recenter=true, target_shrink_recenter=true) # standard run (defaults)
 fmm.fmm!(target_system, source_system,
-    source_shrink_recenter=false, target_shrink_recenter=false) # no branch recentering
(SingleTree{Float64, Vector{Tuple{Main.Body{Float64}, Vector{Float64}}}, 5}(SingleBranch{Float64}[SingleBranch{Float64}(1:100, 8, 2:9, 0, -1, [0.49849075893959255, 0.5011246180164968, 0.50101931980297], 0.49753332129227074, [-49.209733528008485 0.0; 0.0 0.0;;; 3.235503852070557 0.0; 0.0 0.0;;; 0.02681865248285875 0.0; 0.9591193094494829 0.0;;; … ;;; -0.0004469512083583769 0.0; -0.0001593241956586191 0.0;;; -0.0002871052995659781 0.0; -0.0003190451687766938 0.0;;; -7.588266430169105e-6 0.0; -8.400184364295123e-5 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716387369680, 139716387141888, 1519571675789))), SingleBranch{Float64}(1:13, 0, 10:9, 1, 1, [0.24972409829345718, 0.2523579573703614, 0.2522526591568346], 0.24876666064613537, [-6.326393509059363 0.0; 0.0 0.0;;; 0.10172908853834879 0.0; 0.0 0.0;;; -0.07897900882246582 0.0; 0.03842446525558845 0.0;;; … ;;; -9.655530668433345e-7 0.0; -5.592925868629596e-7 0.0;;; 1.1757087124649147e-6 0.0; 2.391906416191541e-6 0.0;;; -3.8953000638580764e-8 0.0; -4.372963917986633e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.21988669568485109 0.0; 0.0 0.0;;; -0.009072982836663246 0.0; -0.0807848408169367 0.0;;; … ;;; 6.640110287989058e-7 0.0; 1.9041912535102654e-6 0.0;;; 3.6074759162369163e-7 0.0; -1.7309101958119792e-7 0.0;;; -1.569552638656214e-8 0.0; -2.5078811456687917e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (1, 0, 0))), SingleBranch{Float64}(14:23, 0, 10:9, 1, 2, [0.7472574195857279, 0.2523579573703614, 0.2522526591568346], 0.24876666064613537, [-5.505985520323303 0.0; 0.0 0.0;;; -0.08935376761589264 0.0; 0.0 0.0;;; 0.07470445052396994 0.0; -0.23211726377071046 0.0;;; … ;;; -2.392758173695492e-6 0.0; -2.7522839300098923e-7 0.0;;; 1.2870322712791405e-6 0.0; 8.633199128089602e-7 0.0;;; -1.432464313580054e-7 0.0; 3.403253642846997e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.18612829398667197 0.0; 0.0 0.0;;; -0.039883017625346906 0.0; -0.10881215708761188 0.0;;; … ;;; 3.1494240254279436e-6 0.0; 1.7899698505317833e-6 0.0;;; 2.304644782594209e-7 0.0; -1.3798323055816275e-6 0.0;;; -1.7120894951022973e-7 0.0; 3.218698082968668e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716387761808, 139716387135504, 0))), SingleBranch{Float64}(24:40, 0, 10:9, 1, 3, [0.24972409829345718, 0.7498912786626322, 0.2522526591568346], 0.24876666064613537, [-7.986155913622251 0.0; 0.0 0.0;;; -0.17961782829081357 0.0; 0.0 0.0;;; -0.1708311757232731 0.0; 0.03136313659178587 0.0;;; … ;;; -6.066729814028882e-6 0.0; 2.4234001902523587e-6 0.0;;; 2.327516919788084e-6 0.0; 4.871503604644382e-7 0.0;;; 2.4779318915245518e-8 0.0; -5.833921797828204e-8 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.23123037091208298 0.0; 0.0 0.0;;; -0.04900538737735943 0.0; 0.09175926185175516 0.0;;; … ;;; 4.485918956630448e-6 0.0; -4.465435544644365e-7 0.0;;; 4.3030079417319214e-7 0.0; -1.0429330819021147e-6 0.0;;; -6.453452663209182e-8 0.0; -7.83577196866388e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 415382006501))), SingleBranch{Float64}(41:57, 0, 10:9, 1, 4, [0.7472574195857279, 0.7498912786626322, 0.2522526591568346], 0.24876666064613537, [-9.931355245362722 0.0; 0.0 0.0;;; 0.004614587660418196 0.0; 0.0 0.0;;; 0.10229082910864945 0.0; 0.3430918058130857 0.0;;; … ;;; -5.8056578563028725e-6 0.0; -3.676520371447365e-6 0.0;;; 1.9707645764181104e-6 0.0; -1.126264814443797e-6 0.0;;; 4.6062541911518666e-7 0.0; -7.362398838063609e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.2483301379555629 0.0; 0.0 0.0;;; -0.04049668029331138 0.0; 0.11830360519660482 0.0;;; … ;;; 7.332258441837855e-6 0.0; -4.818227525166921e-6 0.0;;; 6.296600514955141e-7 0.0; 2.449994518659487e-6 0.0;;; -2.5397024192420015e-7 0.0; -1.9913483563355406e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716326100080, 139716326100112, 139716188884736))), SingleBranch{Float64}(58:71, 0, 10:9, 1, 5, [0.24972409829345718, 0.2523579573703614, 0.7497859804491054], 0.24876666064613537, [-6.0812379817404665 0.0; 0.0 0.0;;; 0.25006763569186036 0.0; 0.0 0.0;;; -0.31820443039978746 0.0; 0.12220137601869531 0.0;;; … ;;; 3.886196424852797e-6 0.0; -7.451574546740225e-6 0.0;;; -1.5655251626942046e-6 0.0; 1.3488066967558975e-6 0.0;;; -2.6514766795446883e-7 0.0; -1.0394863598276786e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.23600705383401233 0.0; 0.0 0.0;;; 0.007799304330178003 0.0; 0.012439246336657786 0.0;;; … ;;; -1.4574470769163516e-8 0.0; 1.5992824761514576e-9 0.0;;; -2.835160161464411e-10 0.0; -3.5835678290697956e-10 0.0;;; 1.903723274446139e-12 0.0; -5.3571781615939486e-12 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716387369680, 139716387149952, 139716240549472))), SingleBranch{Float64}(72:82, 0, 10:9, 1, 6, [0.7472574195857279, 0.2523579573703614, 0.7497859804491054], 0.24876666064613537, [-5.643660411433685 0.0; 0.0 0.0;;; -0.09738759296933737 0.0; 0.0 0.0;;; 0.30570347319695684 0.0; 0.2359164756883997 0.0;;; … ;;; -9.828099569702297e-7 0.0; -4.228517737531717e-7 0.0;;; 2.722456045838181e-6 0.0; -9.867573156177317e-7 0.0;;; -2.8843207756702224e-7 0.0; 2.1892520476678593e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.13724763757441194 0.0; 0.0 0.0;;; -0.04184953211719816 0.0; 0.07154727061705074 0.0;;; … ;;; 7.307988510028463e-7 0.0; 1.2409626176729771e-8 0.0;;; 1.4022411841898488e-7 0.0; -2.3065426719117736e-7 0.0;;; -1.5496615773161006e-8 0.0; -2.8685996288531465e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716387146816, 139716302035616, 145715636042))), SingleBranch{Float64}(83:89, 0, 10:9, 1, 7, [0.24972409829345718, 0.7498912786626322, 0.7497859804491054], 0.24876666064613537, [-2.3207471469996026 0.0; 0.0 0.0;;; 0.09585500095857492 0.0; 0.0 0.0;;; -0.034594650561498956 0.0; -0.04020353614176252 0.0;;; … ;;; 3.931149601398332e-6 0.0; -1.9070778716987882e-6 0.0;;; 4.2619416834337335e-7 0.0; 6.012393369990659e-7 0.0;;; -1.2968067700147368e-7 0.0; -1.7486311823425472e-8 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.14971788789451468 0.0; 0.0 0.0;;; -0.10199693754953348 0.0; -0.004039834025586983 0.0;;; … ;;; -1.5142626441460724e-6 0.0; -1.80684298411887e-7 0.0;;; 6.688133151638003e-7 0.0; 1.0679859224139595e-7 0.0;;; -9.055091853819892e-8 0.0; -1.816085482072339e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716387288384, 139716387284352, 139716387285248))), SingleBranch{Float64}(90:100, 0, 10:9, 1, 8, [0.7472574195857279, 0.7498912786626322, 0.7497859804491054], 0.24876666064613537, [-5.414197799467094 0.0; 0.0 0.0;;; 0.5897761356473473 0.0; 0.0 0.0;;; -0.11387613704005295 0.0; -0.009808782041582427 0.0;;; … ;;; 1.152786650059206e-5 0.0; -4.517396982831503e-6 0.0;;; -4.140305435424666e-6 0.0; -1.5665038040260306e-6 0.0;;; 1.2470773517558522e-7 0.0; 2.0253872196586884e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.2109597908590688 0.0; 0.0 0.0;;; 0.09347365978668326 0.0; -0.08394706203777819 0.0;;; … ;;; -3.5374566227538475e-6 0.0; -4.908528487673616e-6 0.0;;; -2.139788952278572e-6 0.0; -4.6632140843711356e-7 0.0;;; -2.2673535631629022e-7 0.0; 1.289726603228056e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716387296896, 139716387292864, 139716387293760)))], UnitRange{Int64}[1:1, 2:9], [2, 3, 4, 5, 6, 7, 8, 9], [8, 19, 24, 25, 30, 33, 35, 43, 52, 55  …  37, 41, 42, 49, 64, 71, 78, 79, 87, 88], [90, 83, 24, 72, 58, 59, 25, 1, 60, 73  …  23, 38, 80, 56, 39, 81, 82, 40, 13, 57], Tuple{Main.Body{Float64}, Vector{Float64}}[(Main.Body{Float64}([0.7287348331279035, 0.8645178072081, 0.9863586950447876], 0.002824412632887574, 0.3155425281087243), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.04871498957839171, 0.5228239956008278, 0.9981161184046683], 0.0010354523583936332, 0.10074227409525549), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.26339547338830394, 0.8205923530535013, 0.013801744155504059], 0.000561123611422205, 0.48127815547923203), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9156175145346829, 0.2751207698440503, 0.5246024619099758], 0.0098534859774698, 0.26935622770690937), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.23794338253051606, 0.07126180162893991, 0.8268192848648235], 0.005893848251548706, 0.9623280302748543), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.34419014790511104, 0.05942329652687128, 0.638243835469361], 0.00644242207338283, 0.6288483051985535), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.15805649008974942, 0.5709938439335004, 0.1952963518956614], 0.008603607634628693, 0.5087196531195634), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.4660552366407049, 0.13111968284280429, 0.1908671255470663], 0.010673064683743582, 0.8267772979915037), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.2548517099678951, 0.4198627396823058, 0.721065848690685], 0.003035717937974793, 0.189926270491526), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8858526395090768, 0.46145248100070335, 0.9250567869081467], 0.001049518093285898, 0.5832151279544228), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Body{Float64}([0.5296331054105041, 0.3321239926210552, 0.06612436517016262], 0.002175180875437042, 0.542909809886388), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.2721094519411936, 0.5745316878158806, 0.31571722739191854], 0.005050715677355731, 0.7277739175207515), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.7434626951201386, 0.36289922364912086, 0.7061441002953883], 0.006725458802148647, 0.407131657744786), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8013471104408885, 0.5720653332405079, 0.27403203500462225], 0.007524167273081227, 0.7565384544369875), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.46830452243845555, 0.569647595880568, 0.1541232993049313], 0.0011190004051976465, 0.5368528346904301), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9017878088237389, 0.40553596320169993, 0.7807749436261482], 0.0010846429951816498, 0.8565385784764896), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8903519608198294, 0.3360570216047577, 0.8870336180235173], 0.009269785903194445, 0.8071347497510072), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.4332426219969675, 0.847902053417351, 0.4834830300689176], 0.010282220561264157, 0.13342547527751936), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.08815441665958379, 0.27050392304368787, 0.032365963471983505], 0.0061883460330328845, 0.47163404328391867), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9838646299789375, 0.8308846392492549, 0.003922521201271678], 0.002568471846652083, 0.6464273083957023), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], Val{5}(), 50), SingleTree{Float64, Vector{Tuple{Main.Body{Float64}, Vector{Float64}}}, 5}(SingleBranch{Float64}[SingleBranch{Float64}(1:100, 8, 2:9, 0, -1, [0.49850630217496006, 0.5029084590406193, 0.4970227729348794], 0.4949468145660851, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716240539664, 139716240540464, 145715636042))), SingleBranch{Float64}(1:14, 0, 10:9, 1, 1, [0.2510328948919175, 0.25543505175757675, 0.24954936565183686], 0.24747340728304254, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.2148637130046256 0.0; -0.0 0.0;;; -0.04834020432476547 0.0; -0.08941144433660723 0.0;;; … ;;; 3.5752497223563428e-6 0.0; 3.006318555294376e-7 0.0;;; 3.8241925632138014e-7 0.0; 8.756852584356714e-7 0.0;;; -5.567255439862998e-8 0.0; 7.122976820673655e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716326284336, 139716326284368, 139716387135496))), SingleBranch{Float64}(15:32, 0, 10:9, 1, 2, [0.7459797094580026, 0.25543505175757675, 0.24954936565183686], 0.24747340728304254, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.11109434668789528 0.0; -0.0 0.0;;; -0.09395711373565785 0.0; -0.0339352994212802 0.0;;; … ;;; -3.093083615342297e-7 0.0; -5.266957581159998e-7 0.0;;; -8.45286066948681e-8 0.0; -4.5318545488438834e-7 0.0;;; 1.3388476395864516e-8 0.0; -8.18196465630313e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715619582896, 139716302035616, 139716240549472))), SingleBranch{Float64}(33:42, 0, 10:9, 1, 3, [0.2510328948919175, 0.7503818663236619, 0.24954936565183686], 0.24747340728304254, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.19025706176624954 0.0; -0.0 0.0;;; -0.08523496179525314 0.0; 0.10063729919665365 0.0;;; … ;;; 4.515975081865985e-6 0.0; 2.6908857868788118e-6 0.0;;; 2.2681790868948097e-6 0.0; -7.786951926686422e-7 0.0;;; 1.2084952396660516e-7 0.0; -3.097235599682232e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716387154880, 139716387155328, 145715636042))), SingleBranch{Float64}(43:55, 0, 10:9, 1, 4, [0.7459797094580026, 0.7503818663236619, 0.24954936565183686], 0.24747340728304254, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.10425563194142104 0.0; -0.0 0.0;;; -0.04040126882373641 0.0; -0.04562532239334573 0.0;;; … ;;; 1.3996120396479463e-7 0.0; -9.646181946431826e-8 0.0;;; 5.816317826369127e-8 0.0; 1.4394267248631393e-8 0.0;;; 3.2480223567985996e-9 0.0; 6.206399328437309e-9 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716387157568, 139716387158016, 414953222741))), SingleBranch{Float64}(56:68, 0, 10:9, 1, 5, [0.2510328948919175, 0.25543505175757675, 0.744496180217922], 0.24747340728304254, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.14061387788889593 0.0; 0.0 0.0;;; 0.04115555743278536 0.0; -0.035336314269337296 0.0;;; … ;;; -1.288070786691546e-7 0.0; -2.0654704149134432e-7 0.0;;; -4.8404286408038316e-8 0.0; -1.51707993788448e-8 0.0;;; -3.595926037719477e-9 0.0; 1.544749903303687e-9 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716387160704, 139715615157728, 139716387147264))), SingleBranch{Float64}(69:78, 0, 10:9, 1, 6, [0.7459797094580026, 0.25543505175757675, 0.744496180217922], 0.24747340728304254, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.05941703079908202 0.0; -0.0 0.0;;; -0.06985022321023225 0.0; 0.1032519762464019 0.0;;; … ;;; -6.688757943059791e-7 0.0; -1.4504812423201137e-7 0.0;;; 4.323362110439875e-7 0.0; -4.1295023043996754e-7 0.0;;; -4.18706433955205e-8 0.0; -2.4735074430968403e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 414657700120))), SingleBranch{Float64}(79:86, 0, 10:9, 1, 7, [0.2510328948919175, 0.7503818663236619, 0.744496180217922], 0.24747340728304254, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.19773882534987763 0.0; -0.0 0.0;;; 0.10337544252106134 0.0; -0.003701264144869725 0.0;;; … ;;; 3.095126144436569e-6 0.0; -3.3359544949065297e-7 0.0;;; -9.336790671507606e-7 0.0; 1.3458164455370796e-7 0.0;;; 9.71193839691501e-8 0.0; -1.7566838362957855e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 413075832919))), SingleBranch{Float64}(87:100, 0, 10:9, 1, 8, [0.7459797094580026, 0.7503818663236619, 0.744496180217922], 0.24747340728304254, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.0593706787958249 0.0; -0.0 0.0;;; 0.08539509989261301 0.0; 0.03940386228514198 0.0;;; … ;;; -1.6827227854645148e-8 0.0; -5.990511984334067e-8 0.0;;; 3.054235133952722e-8 0.0; -1.9110787243922576e-7 0.0;;; -3.415340917917519e-8 0.0; 5.0921396075492695e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715789922704, 139715789922752, 1519571675789)))], UnitRange{Int64}[1:1, 2:9], [2, 3, 4, 5, 6, 7, 8, 9], [11, 19, 33, 43, 59, 63, 67, 68, 69, 72  …  20, 24, 31, 37, 42, 48, 60, 74, 94, 100], [69, 87, 70, 71, 79, 43, 56, 57, 44, 88  …  12, 55, 30, 99, 31, 32, 13, 68, 14, 100], Tuple{Main.Body{Float64}, Vector{Float64}}[(Main.Body{Float64}([0.9191811597933967, 0.42601923740838954, 0.7465863168484385], 0.00551624732815934, 0.2538490889415096), [17.271409969161304, 0.0, 0.0, 0.0, 41.685412355141416, 34.12426438870282, -51.63876083740611, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8192008435733007, 0.9541592624784624, 0.8458950823510601], 0.0014709561750558223, 0.03209667335274724), [11.529739095286155, 0.0, 0.0, 0.0, 1.024496302655218, 10.679868569840236, 10.166694863850497, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.586748700554989, 0.12181263792534469, 0.7894931647499924], 0.0016174951280755708, 0.8935369466209786), [13.46622737210304, 0.0, 0.0, 0.0, 4.201427260478692, -11.777746989315899, 8.494900903588235, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6192588014774537, 0.47764531343080796, 0.8041934288169849], 0.003639098305331564, 0.8236563299357046), [16.810905005346296, 0.0, 0.0, 0.0, 20.653133771733803, 22.29084743955388, 12.956920331242188, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.12353811904859124, 0.7400202596259494, 0.7057473220960516], 0.004975260027225807, 0.9340155879013086), [13.212106090876661, 0.0, 0.0, 0.0, -6.564084687557748, 10.714720577279024, 7.1489651530156975, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9919607797239652, 0.8036971367794874, 0.29827230692896456], 0.006659427674753824, 0.4842893268146866), [15.293301715719982, 0.0, 0.0, 0.0, 20.840068737911185, 6.203972731398467, 2.3564006118821963, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.49265789199054244, 0.17985285886739166, 0.6397154045236242], 0.004022070032387327, 0.6922349538863742), [16.030214365478127, 0.0, 0.0, 0.0, 4.854825245033792, -12.82436694878877, 9.932648614159953, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.22768758746068596, 0.26780944724527167, 0.8309795986773825], 0.006802835099514221, 0.6911617055492341), [13.477674670011098, 0.0, 0.0, 0.0, -7.615430967959103, 0.8284024454950295, 11.665202214285912, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.621178864455285, 0.7425206336869923, 0.15487161620983314], 0.0010425988209884726, 0.09206661519876747), [17.722712907499606, 0.0, 0.0, 0.0, -9.940219848256183, 17.727356485985396, -29.098711105724526, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5733898483119126, 0.5900840309886971, 0.7659266276192337], 0.00633005068065063, 0.37737321139310276), [16.05489877164097, 0.0, 0.0, 0.0, -1.3860752481739533, 7.346902899243912, 19.030178738198078, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Body{Float64}([0.3562026836409853, 0.3635243844573359, 0.309727986680287], 0.0038713948967191466, 0.43490959394031214), [17.98003272398291, 0.0, 0.0, 0.0, -6.176928042529583, -6.83720001434035, -5.104865976947373, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6547290646713112, 0.8311844039711347, 0.3538049975932579], 0.004154302641783906, 0.5842214092626906), [19.759661981521948, 0.0, 0.0, 0.0, 2.1460904804827003, 22.402074129288803, 38.03301983987145, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5388794936906567, 0.04350921485134718, 0.23629199234128806], 0.006559279199653211, 0.9196974029361853), [15.25309168181086, 0.0, 0.0, 0.0, 10.352682001138295, -27.645326895875023, -2.5692266359007827, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5109351365074641, 0.7269107204213763, 0.8057341233600875], 0.002916397428800248, 0.13080774080166646), [14.120390177961934, 0.0, 0.0, 0.0, -1.770561231400227, 8.777886446209552, 15.293358878789466, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6177567582580967, 0.38039525218264447, 0.37934078500465196], 0.010186078857427224, 0.2366140514268097), [19.989481091602663, 0.0, 0.0, 0.0, 8.002207700492232, -27.907771334220058, -16.494951316871173, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6781091106154422, 0.44334927922889245, 0.36064371233973214], 0.01036251002724151, 0.2743759198193091), [19.81705582450624, 0.0, 0.0, 0.0, 12.06418885791642, -5.798482118132713, -4.308943660676608, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.20158107237490663, 0.3238946945648584, 0.24399963650509682], 0.009664372151238956, 0.47733204119516204), [16.09145579771531, 0.0, 0.0, 0.0, -9.056889348091818, -6.4324259288317, -9.833126873177216, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.18036026635324287, 0.173123936892006, 0.6038823023290261], 0.010016593230124706, 0.4401491209134364), [14.946809903378847, 0.0, 0.0, 0.0, -14.889338356696868, 0.1483895783560294, 4.026318082371973, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.072210006218703, 0.3521154604071077, 0.4644130786564624], 0.0037743609975635275, 0.17728847529212788), [15.085750970541683, 0.0, 0.0, 0.0, -19.61109590484976, -9.907966126632697, 6.262829492967415, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8247874340282866, 0.5795916665384359, 0.8038668590137469], 0.0035401668870093193, 0.6409979037657155), [14.872272809760988, 0.0, 0.0, 0.0, 3.9248367357842517, 7.73617997006026, 12.068889746971752, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], Val{5}(), 50), StaticArraysCore.SVector{2, Int32}[], UnitRange{Int64}[1:14, 1:14, 1:14, 1:14, 1:14, 1:14, 1:14, 1:14, 15:32, 15:32  …  79:86, 79:86, 87:100, 87:100, 87:100, 87:100, 87:100, 87:100, 87:100, 87:100], UnitRange{Int64}[1:13, 14:23, 24:40, 41:57, 58:71, 72:82, 83:89, 90:100, 1:13, 14:23  …  83:89, 90:100, 1:13, 14:23, 24:40, 41:57, 58:71, 72:82, 83:89, 90:100])
+ source_shrink_recenter=false, target_shrink_recenter=false) # no branch recentering
(SingleTree{Float64, Vector{Tuple{Main.Body{Float64}, Vector{Float64}}}, 5}(SingleBranch{Float64}[SingleBranch{Float64}(1:100, 8, 2:9, 0, -1, [0.49849075893959255, 0.5011246180164968, 0.50101931980297], 0.8617443734929683, 0.8617443734929683, [-0.49752834600881063, 0.49752834600881063, -0.49752834600881063, 0.49752834600881063, -0.49752834600881063, 0.49752834600881063], [0.49752834600881063, 0.49752834600881063, 0.49752834600881063], 0.0, 0.0, fill(0.0), [-49.209733528008485 0.0; 0.0 0.0;;; 3.235503852070556 0.0; 0.0 0.0;;; 0.02681865248285842 0.0; 0.9591193094494834 0.0;;; … ;;; -0.0004469512083583767 0.0; -0.00015932419565861916 0.0;;; -0.00028710529956597804 0.0; -0.00031904516877669385 0.0;;; -7.588266430169126e-6 0.0; -8.400184364295124e-5 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871133325008, 139871909837136, 139871853851040))), SingleBranch{Float64}(1:13, 0, 10:9, 1, 1, [0.24972658593518723, 0.25236044501209143, 0.25225514679856464], 0.43087218674648414, 0.43087218674648414, [-0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531], [0.24876417300440531, 0.24876417300440531, 0.24876417300440531], 0.0, 0.0, fill(0.0), [-6.326393509059363 0.0; 0.0 0.0;;; 0.10174482633884264 0.0; 0.0 0.0;;; -0.07898687772271276 0.0; 0.03841659635534152 0.0;;; … ;;; -9.654710862452212e-7 0.0; -5.591129557725438e-7 0.0;;; 1.175731767951614e-6 0.0; 2.391893864725776e-6 0.0;;; -3.893767927840696e-8 0.0; -4.373076778562484e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.21988918332658114 0.0; 0.0 0.0;;; -0.00907173901579822 0.0; -0.08078608463780172 0.0;;; … ;;; 6.639561085749197e-7 0.0; 1.9043445262044332e-6 0.0;;; 3.6078285954161947e-7 0.0; -1.730779168448776e-7 0.0;;; -1.5694464749247868e-8 0.0; -2.5081831237534205e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871910348248, 0, 139871158346704))), SingleBranch{Float64}(14:23, 0, 10:9, 1, 2, [0.7472549319439978, 0.25236044501209143, 0.25225514679856464], 0.43087218674648414, 0.43087218674648414, [-0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531], [0.24876417300440531, 0.24876417300440531, 0.24876417300440531], 0.0, 0.0, fill(0.0), [-5.505985520323303 0.0; 0.0 0.0;;; -0.0893400706965472 0.0; 0.0 0.0;;; 0.07469760206429724 0.0; -0.23211041531103774 0.0;;; … ;;; -2.392727383648695e-6 0.0; -2.7506172478695797e-7 0.0;;; 1.2869752996385646e-6 0.0; 8.632541193951725e-7 0.0;;; -1.4323853566229846e-7 0.0; 3.40320513459477e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.18613078162840202 0.0; 0.0 0.0;;; -0.03988177380448188 0.0; -0.10881091326674686 0.0;;; … ;;; 3.1493849180079693e-6 0.0; 1.79002742056861e-6 0.0;;; 2.3049009571265728e-7 0.0; -1.3797688581858191e-6 0.0;;; -1.7119818873987816e-7 0.0; 3.217930041360891e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871163457840, 139871163457872, 139871161489936))), SingleBranch{Float64}(24:40, 0, 10:9, 1, 3, [0.24972658593518723, 0.7498887910209021, 0.25225514679856464], 0.43087218674648414, 0.43087218674648414, [-0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531], [0.24876417300440531, 0.24876417300440531, 0.24876417300440531], 0.0, 0.0, fill(0.0), [-7.986155913622251 0.0; 0.0 0.0;;; -0.1795979615961002 0.0; 0.0 0.0;;; -0.1708212423759164 0.0; 0.03135320324442914 0.0;;; … ;;; -6.066362373385743e-6 0.0; 2.4234495602853986e-6 0.0;;; 2.327392085993626e-6 0.0; 4.871331224296273e-7 0.0;;; 2.4751088043185402e-8 0.0; -5.827716675663792e-8 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.23122788327035293 0.0; 0.0 0.0;;; -0.04900663119822446 0.0; 0.09175801803089013 0.0;;; … ;;; 4.485772070448108e-6 0.0; -4.4630903906536425e-7 0.0;;; 4.303552019451355e-7 0.0; -1.0428735117063708e-6 0.0;;; -6.452660186998594e-8 0.0; -7.836101483352229e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871133325296, 139871133325328, 429867152245))), SingleBranch{Float64}(41:57, 0, 10:9, 1, 4, [0.7472549319439978, 0.7498887910209021, 0.25225514679856464], 0.43087218674648414, 0.43087218674648414, [-0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531], [0.24876417300440531, 0.24876417300440531, 0.24876417300440531], 0.0, 0.0, fill(0.0), [-9.931355245362722 0.0; 0.0 0.0;;; 0.004639293314162463 0.0; 0.0 0.0;;; 0.10230318193552163 0.0; 0.3431041586399578 0.0;;; … ;;; -5.8057861586053485e-6 0.0; -3.6767179441275553e-6 0.0;;; 1.970849569609788e-6 0.0; -1.1263384149017906e-6 0.0;;; 4.6063384099401923e-7 0.0; -7.362879677517756e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.24833262559729297 0.0; 0.0 0.0;;; -0.04049792411417641 0.0; 0.11830484901746985 0.0;;; … ;;; 7.332767131734295e-6 0.0; -4.818366848970212e-6 0.0;;; 6.296375165101449e-7 0.0; 2.450158453149185e-6 0.0;;; -2.5398566738723024e-7 0.0; -1.9922601565040447e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871163460848, 139871163460880, 139871909830672))), SingleBranch{Float64}(58:71, 0, 10:9, 1, 5, [0.24972658593518723, 0.25236044501209143, 0.7497834928073753], 0.43087218674648414, 0.43087218674648414, [-0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531], [0.24876417300440531, 0.24876417300440531, 0.24876417300440531], 0.0, 0.0, fill(0.0), [-6.0812379817404665 0.0; 0.0 0.0;;; 0.2500525077504865 0.0; 0.0 0.0;;; -0.31821199437047437 0.0; 0.12219381204800842 0.0;;; … ;;; 3.886164164482793e-6 0.0; -7.451230042206713e-6 0.0;;; -1.5655861775267537e-6 0.0; 1.3488384490746591e-6 0.0;;; -2.65136301189794e-7 0.0; -1.0396969077621681e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.23600456619228227 0.0; 0.0 0.0;;; 0.00780054815104303 0.0; 0.01243800251579276 0.0;;; … ;;; -1.457243306148132e-8 0.0; 1.604225902871519e-9 0.0;;; -2.836500215179685e-10 0.0; -3.581821796740947e-10 0.0;;; 1.9003405206797664e-12 0.0; -5.3575717814609175e-12 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871724951904, 139871763244640, 139871909830672))), SingleBranch{Float64}(72:82, 0, 10:9, 1, 6, [0.7472549319439978, 0.25236044501209143, 0.7497834928073753], 0.43087218674648414, 0.43087218674648414, [-0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531], [0.24876417300440531, 0.24876417300440531, 0.24876417300440531], 0.0, 0.0, fill(0.0), [-5.643660411433685 0.0; 0.0 0.0;;; -0.09740163237448708 0.0; 0.0 0.0;;; 0.30569645349438196 0.0; 0.2359234953909746 0.0;;; … ;;; -9.82916763080865e-7 0.0; -4.2285511081766585e-7 0.0;;; 2.7225441029521644e-6 0.0; -9.866422822602592e-7 0.0;;; -2.884182756506517e-7 0.0; 2.1891312191953625e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.137250125216142 0.0; 0.0 0.0;;; -0.041848288296333136 0.0; 0.07154851443791577 0.0;;; … ;;; 7.308420503707386e-7 0.0; 1.2365335735668517e-8 0.0;;; 1.4021073394047346e-7 0.0; -2.3067492312302074e-7 0.0;;; -1.5499976899256273e-8 0.0; -2.8685176609168157e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871845910736, 139871863057360, 139871863054672))), SingleBranch{Float64}(83:89, 0, 10:9, 1, 7, [0.24972658593518723, 0.7498887910209021, 0.7497834928073753], 0.43087218674648414, 0.43087218674648414, [-0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531], [0.24876417300440531, 0.24876417300440531, 0.24876417300440531], 0.0, 0.0, fill(0.0), [-2.3207471469996026 0.0; 0.0 0.0;;; 0.09584922777112714 0.0; 0.0 0.0;;; -0.03459176396777507 0.0; -0.04020642273548641 0.0;;; … ;;; 3.930977957593639e-6 0.0; -1.9071506252246133e-6 0.0;;; 4.262561393862879e-7 0.0; 6.012045573535614e-7 0.0;;; -1.296847519879538e-7 0.0; -1.748757755002258e-8 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.14971540025278463 0.0; 0.0 0.0;;; -0.10199818137039851 0.0; -0.00404107784645201 0.0;;; … ;;; -1.5142366400508734e-6 0.0; -1.807350708728618e-7 0.0;;; 6.688310694761936e-7 0.0; 1.0683350833198992e-7 0.0;;; -9.055558759133121e-8 0.0; -1.8167298693653792e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871113195888, 139871113195984, 139871158346896))), SingleBranch{Float64}(90:100, 0, 10:9, 1, 8, [0.7472549319439978, 0.7498887910209021, 0.7497834928073753], 0.43087218674648414, 0.43087218674648414, [-0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531], [0.24876417300440531, 0.24876417300440531, 0.24876417300440531], 0.0, 0.0, fill(0.0), [-5.414197799467094 0.0; 0.0 0.0;;; 0.5897626670629665 0.0; 0.0 0.0;;; -0.1138694027478626 0.0; -0.009802047749392043 0.0;;; … ;;; 1.152740503052551e-5 0.0; -4.517016990218442e-6 0.0;;; -4.140046433990845e-6 0.0; -1.566383749352849e-6 0.0;;; 1.2469713505945974e-7 0.0; 2.024928160458584e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.21095730321733874 0.0; 0.0 0.0;;; 0.09347241596581823 0.0; -0.08394581821691316 0.0;;; … ;;; -3.5372171155417328e-6 0.0; -4.908219455216665e-6 0.0;;; -2.1396426594075856e-6 0.0; -4.6629625718216964e-7 0.0;;; -2.2671999108049045e-7 0.0; 1.289627938417499e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871113195888, 139871113195984, 139871158189168)))], UnitRange{Int64}[1:1, 2:9], [2, 3, 4, 5, 6, 7, 8, 9], [8, 19, 24, 25, 30, 33, 35, 43, 52, 55  …  37, 41, 42, 49, 64, 71, 78, 79, 87, 88], [90, 83, 24, 72, 58, 59, 25, 1, 60, 73  …  23, 38, 80, 56, 39, 81, 82, 40, 13, 57], Tuple{Main.Body{Float64}, Vector{Float64}}[(Main.Body{Float64}([0.7287348331279035, 0.8645178072081, 0.9863586950447876], 0.002824412632887574, 0.3155425281087243), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.04871498957839171, 0.5228239956008278, 0.9981161184046683], 0.0010354523583936332, 0.10074227409525549), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.26339547338830394, 0.8205923530535013, 0.013801744155504059], 0.000561123611422205, 0.48127815547923203), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9156175145346829, 0.2751207698440503, 0.5246024619099758], 0.0098534859774698, 0.26935622770690937), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.23794338253051606, 0.07126180162893991, 0.8268192848648235], 0.005893848251548706, 0.9623280302748543), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.34419014790511104, 0.05942329652687128, 0.638243835469361], 0.00644242207338283, 0.6288483051985535), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.15805649008974942, 0.5709938439335004, 0.1952963518956614], 0.008603607634628693, 0.5087196531195634), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.4660552366407049, 0.13111968284280429, 0.1908671255470663], 0.010673064683743582, 0.8267772979915037), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.2548517099678951, 0.4198627396823058, 0.721065848690685], 0.003035717937974793, 0.189926270491526), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8858526395090768, 0.46145248100070335, 0.9250567869081467], 0.001049518093285898, 0.5832151279544228), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Body{Float64}([0.5296331054105041, 0.3321239926210552, 0.06612436517016262], 0.002175180875437042, 0.542909809886388), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.2721094519411936, 0.5745316878158806, 0.31571722739191854], 0.005050715677355731, 0.7277739175207515), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.7434626951201386, 0.36289922364912086, 0.7061441002953883], 0.006725458802148647, 0.407131657744786), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8013471104408885, 0.5720653332405079, 0.27403203500462225], 0.007524167273081227, 0.7565384544369875), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.46830452243845555, 0.569647595880568, 0.1541232993049313], 0.0011190004051976465, 0.5368528346904301), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9017878088237389, 0.40553596320169993, 0.7807749436261482], 0.0010846429951816498, 0.8565385784764896), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8903519608198294, 0.3360570216047577, 0.8870336180235173], 0.009269785903194445, 0.8071347497510072), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.4332426219969675, 0.847902053417351, 0.4834830300689176], 0.010282220561264157, 0.13342547527751936), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.08815441665958379, 0.27050392304368787, 0.032365963471983505], 0.0061883460330328845, 0.47163404328391867), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9838646299789375, 0.8308846392492549, 0.003922521201271678], 0.002568471846652083, 0.6464273083957023), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], Val{5}(), 50), SingleTree{Float64, Vector{Tuple{Main.Body{Float64}, Vector{Float64}}}, 5}(SingleBranch{Float64}[SingleBranch{Float64}(1:100, 8, 2:9, 0, -1, [0.49850630217496006, 0.5029084590406193, 0.4970227729348794], 0.8572644572282587, 0.8572644572282587, [-0.49494186514743355, 0.49494186514743355, -0.49494186514743355, 0.49494186514743355, -0.49494186514743355, 0.49494186514743355], [0.49494186514743355, 0.49494186514743355, 0.49494186514743355], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871128707344, 139871128707376, 139871158189424))), SingleBranch{Float64}(1:14, 0, 10:9, 1, 1, [0.2510353696012433, 0.25543752646690254, 0.24955184036116262], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.2148612382952998 0.0; -0.0 0.0;;; -0.04833896697010254 0.0; -0.08941268169127015 0.0;;; … ;;; 3.5751904359505736e-6 0.0; 3.0080507578758053e-7 0.0;;; 3.8236458599367976e-7 0.0; 8.757176386082573e-7 0.0;;; -5.567979953388733e-8 0.0; 7.122692732518039e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 11))), SingleBranch{Float64}(15:32, 0, 10:9, 1, 2, [0.7459772347486768, 0.25543752646690254, 0.24955184036116262], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.11109187197856953 0.0; -0.0 0.0;;; -0.09395587638099494 0.0; -0.03393406206661734 0.0;;; … ;;; -3.0928893153242635e-7 0.0; -5.266357454009592e-7 0.0;;; -8.453485198034652e-8 0.0; -4.5314409979717737e-7 0.0;;; 1.3384370562270982e-8 0.0; -8.18136577012236e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871159967264, 139871159967280, 139871128745168))), SingleBranch{Float64}(33:42, 0, 10:9, 1, 3, [0.2510353696012433, 0.7503793916143361, 0.24955184036116262], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.1902545870569238 0.0; -0.0 0.0;;; -0.08523619914991601 0.0; 0.10063606184199078 0.0;;; … ;;; 4.515701992660869e-6 0.0; 2.690965808809799e-6 0.0;;; 2.2681808274429954e-6 0.0; -7.785616815693268e-7 0.0;;; 1.2086933929990936e-7 0.0; -3.097138724670615e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 139869904961536, 139871909830664))), SingleBranch{Float64}(43:55, 0, 10:9, 1, 4, [0.7459772347486768, 0.7503793916143361, 0.24955184036116262], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.10425315723209527 0.0; -0.0 0.0;;; -0.04040250617839929 0.0; -0.04562408503868281 0.0;;; … ;;; 1.3994426612384809e-7 0.0; -9.646789543011186e-8 0.0;;; 5.8163042620289284e-8 0.0; 1.4387157402797034e-8 0.0;;; 3.2488834697645844e-9 0.0; 6.2058798109508465e-9 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871163452752, 139871845911520, 139871711579904))), SingleBranch{Float64}(56:68, 0, 10:9, 1, 5, [0.2510353696012433, 0.25543752646690254, 0.7444937055085962], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.1406114031795701 0.0; 0.0 0.0;;; 0.04115679478744828 0.0; -0.03533755162400021 0.0;;; … ;;; -1.2881546024813352e-7 0.0; -2.0655710448954946e-7 0.0;;; -4.840981119340681e-8 0.0; -1.5172010562775518e-8 0.0;;; -3.596485511575488e-9 0.0; 1.545042368324494e-9 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (3, 4, 41))), SingleBranch{Float64}(69:78, 0, 10:9, 1, 6, [0.7459772347486768, 0.25543752646690254, 0.7444937055085962], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.05941950550840777 0.0; -0.0 0.0;;; -0.06984898585556935 0.0; 0.10325321360106476 0.0;;; … ;;; -6.688472512156468e-7 0.0; -1.4501297809812144e-7 0.0;;; 4.3233604883670166e-7 0.0; -4.1299565937718063e-7 0.0;;; -4.1888246519238254e-8 0.0; -2.4735114753799555e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (12884901891, 3, 0))), SingleBranch{Float64}(79:86, 0, 10:9, 1, 7, [0.2510353696012433, 0.7503793916143361, 0.7444937055085962], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.19774130005920343 0.0; -0.0 0.0;;; 0.10337420516639845 0.0; -0.003702501499532632 0.0;;; … ;;; 3.0951077862846165e-6 0.0; -3.337097810420304e-7 0.0;;; -9.336410389602992e-7 0.0; 1.3462336691028458e-7 0.0;;; 9.711269933660484e-8 0.0; -1.7571838450287563e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (19791209300192, 672, 0))), SingleBranch{Float64}(87:100, 0, 10:9, 1, 8, [0.7459772347486768, 0.7503793916143361, 0.7444937055085962], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.0593731535051507 0.0; -0.0 0.0;;; 0.08539386253795012 0.0; 0.039405099639804875 0.0;;; … ;;; -1.6817191281206375e-8 0.0; -5.988143577896676e-8 0.0;;; 3.0556184471062655e-8 0.0; -1.9110878655930648e-7 0.0;;; -3.415675534882339e-8 0.0; 5.09167765671537e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (12884901891, 139869904961539, 59)))], UnitRange{Int64}[1:1, 2:9], [2, 3, 4, 5, 6, 7, 8, 9], [11, 19, 33, 43, 59, 63, 67, 68, 69, 72  …  20, 24, 31, 37, 42, 48, 60, 74, 94, 100], [69, 87, 70, 71, 79, 43, 56, 57, 44, 88  …  12, 55, 30, 99, 31, 32, 13, 68, 14, 100], Tuple{Main.Body{Float64}, Vector{Float64}}[(Main.Body{Float64}([0.9191811597933967, 0.42601923740838954, 0.7465863168484385], 0.00551624732815934, 0.2538490889415096), [17.271409969161304, 0.0, 0.0, 0.0, 41.685412355141416, 34.12426438870282, -51.63876083740611, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8192008435733007, 0.9541592624784624, 0.8458950823510601], 0.0014709561750558223, 0.03209667335274724), [11.529739095286155, 0.0, 0.0, 0.0, 1.024496302655218, 10.679868569840236, 10.166694863850497, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.586748700554989, 0.12181263792534469, 0.7894931647499924], 0.0016174951280755708, 0.8935369466209786), [13.46622737210304, 0.0, 0.0, 0.0, 4.201427260478692, -11.777746989315899, 8.494900903588235, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6192588014774537, 0.47764531343080796, 0.8041934288169849], 0.003639098305331564, 0.8236563299357046), [16.810905005346296, 0.0, 0.0, 0.0, 20.653133771733803, 22.29084743955388, 12.956920331242188, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.12353811904859124, 0.7400202596259494, 0.7057473220960516], 0.004975260027225807, 0.9340155879013086), [13.212106090876661, 0.0, 0.0, 0.0, -6.564084687557748, 10.714720577279024, 7.1489651530156975, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9919607797239652, 0.8036971367794874, 0.29827230692896456], 0.006659427674753824, 0.4842893268146866), [15.293301715719982, 0.0, 0.0, 0.0, 20.840068737911185, 6.203972731398467, 2.3564006118821963, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.49265789199054244, 0.17985285886739166, 0.6397154045236242], 0.004022070032387327, 0.6922349538863742), [16.030214365478127, 0.0, 0.0, 0.0, 4.854825245033792, -12.82436694878877, 9.932648614159953, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.22768758746068596, 0.26780944724527167, 0.8309795986773825], 0.006802835099514221, 0.6911617055492341), [13.477674670011098, 0.0, 0.0, 0.0, -7.615430967959103, 0.8284024454950295, 11.665202214285912, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.621178864455285, 0.7425206336869923, 0.15487161620983314], 0.0010425988209884726, 0.09206661519876747), [17.722712907499606, 0.0, 0.0, 0.0, -9.940219848256183, 17.727356485985396, -29.098711105724526, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5733898483119126, 0.5900840309886971, 0.7659266276192337], 0.00633005068065063, 0.37737321139310276), [16.05489877164097, 0.0, 0.0, 0.0, -1.3860752481739533, 7.346902899243912, 19.030178738198078, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Body{Float64}([0.3562026836409853, 0.3635243844573359, 0.309727986680287], 0.0038713948967191466, 0.43490959394031214), [17.98003272398291, 0.0, 0.0, 0.0, -6.176928042529583, -6.83720001434035, -5.104865976947373, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6547290646713112, 0.8311844039711347, 0.3538049975932579], 0.004154302641783906, 0.5842214092626906), [19.759661981521948, 0.0, 0.0, 0.0, 2.1460904804827003, 22.402074129288803, 38.03301983987145, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5388794936906567, 0.04350921485134718, 0.23629199234128806], 0.006559279199653211, 0.9196974029361853), [15.25309168181086, 0.0, 0.0, 0.0, 10.352682001138295, -27.645326895875023, -2.5692266359007827, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5109351365074641, 0.7269107204213763, 0.8057341233600875], 0.002916397428800248, 0.13080774080166646), [14.120390177961934, 0.0, 0.0, 0.0, -1.770561231400227, 8.777886446209552, 15.293358878789466, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6177567582580967, 0.38039525218264447, 0.37934078500465196], 0.010186078857427224, 0.2366140514268097), [19.989481091602663, 0.0, 0.0, 0.0, 8.002207700492232, -27.907771334220058, -16.494951316871173, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6781091106154422, 0.44334927922889245, 0.36064371233973214], 0.01036251002724151, 0.2743759198193091), [19.81705582450624, 0.0, 0.0, 0.0, 12.06418885791642, -5.798482118132713, -4.308943660676608, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.20158107237490663, 0.3238946945648584, 0.24399963650509682], 0.009664372151238956, 0.47733204119516204), [16.09145579771531, 0.0, 0.0, 0.0, -9.056889348091818, -6.4324259288317, -9.833126873177216, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.18036026635324287, 0.173123936892006, 0.6038823023290261], 0.010016593230124706, 0.4401491209134364), [14.946809903378847, 0.0, 0.0, 0.0, -14.889338356696868, 0.1483895783560294, 4.026318082371973, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.072210006218703, 0.3521154604071077, 0.4644130786564624], 0.0037743609975635275, 0.17728847529212788), [15.085750970541683, 0.0, 0.0, 0.0, -19.61109590484976, -9.907966126632697, 6.262829492967415, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8247874340282866, 0.5795916665384359, 0.8038668590137469], 0.0035401668870093193, 0.6409979037657155), [14.872272809760988, 0.0, 0.0, 0.0, 3.9248367357842517, 7.73617997006026, 12.068889746971752, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], Val{5}(), 50), Tuple{Int32, Int32, Int64}[], StaticArraysCore.SVector{2, Int32}[[2, 2], [3, 2], [4, 2], [5, 2], [6, 2], [7, 2], [8, 2], [9, 2], [2, 3], [3, 3]  …  [8, 8], [9, 8], [2, 9], [3, 9], [4, 9], [5, 9], [6, 9], [7, 9], [8, 9], [9, 9]], DerivativesSwitch{true, true, true}())
diff --git a/dev/guided_examples/index.html b/dev/guided_examples/index.html index af2dc58..940445a 100644 --- a/dev/guided_examples/index.html +++ b/dev/guided_examples/index.html @@ -125,11 +125,11 @@ println(measure_error(multipole_threshold=0.4, leaf_size=50, expansion_order=5)) # expansion_order increased to 10 -println(measure_error(multipole_threshold=0.4, leaf_size=50, expansion_order=10))
0.29228706845073854
-0.2922871099458623

Evaluate Source on Target

FastMutipole allows for the evaluation of source systems on target systems while leaving the source systems unaltered.

target_system = generate_gravitational(123, 100)
+println(measure_error(multipole_threshold=0.4, leaf_size=50, expansion_order=10))
0.06721955970698754
+0.06721954776336198

Evaluate Source on Target

FastMutipole allows for the evaluation of source systems on target systems while leaving the source systems unaltered.

target_system = generate_gravitational(123, 100)
 source_system = generate_gravitational(321, 100)
 
-fmm.fmm!(target_system, source_system)
(SingleTree{Float64, Vector{Tuple{Main.Body{Float64}, Vector{Float64}}}, 5}(SingleBranch{Float64}[SingleBranch{Float64}(1:100, 8, 2:9, 0, -1, [0.49849075893959255, 0.5011246180164968, 0.50101931980297], 0.8238712189768528, [-49.209733528008485 0.0; 0.0 0.0;;; 3.235503852070557 0.0; 0.0 0.0;;; 0.02681865248285875 0.0; 0.9591193094494829 0.0;;; … ;;; -0.0004469512083583769 0.0; -0.0001593241956586191 0.0;;; -0.0002871052995659781 0.0; -0.0003190451687766938 0.0;;; -7.588266430169105e-6 0.0; -8.400184364295123e-5 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716387370128, 139716387370576, 139715584720224))), SingleBranch{Float64}(1:13, 0, 10:9, 1, 1, [0.24972409829345718, 0.2523579573703614, 0.2522526591568346], 0.33251523753625056, [-6.326393509059363 0.0; 0.0 0.0;;; 0.10172908853834879 0.0; 0.0 0.0;;; -0.07897900882246582 0.0; 0.03842446525558845 0.0;;; … ;;; -9.655530668433345e-7 0.0; -5.592925868629596e-7 0.0;;; 1.1757087124649147e-6 0.0; 2.391906416191541e-6 0.0;;; -3.8953000638580764e-8 0.0; -4.372963917986633e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.21988669568485109 0.0; 0.0 0.0;;; -0.009072982836663246 0.0; -0.0807848408169367 0.0;;; … ;;; 6.640110287989058e-7 0.0; 1.9041912535102654e-6 0.0;;; 3.6074759162369163e-7 0.0; -1.7309101958119792e-7 0.0;;; -1.569552638656214e-8 0.0; -2.5078811456687917e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716240540464, 139715589746544, 430925428987))), SingleBranch{Float64}(14:23, 0, 10:9, 1, 2, [0.7472574195857279, 0.2523579573703614, 0.2522526591568346], 0.3164294356194214, [-5.505985520323303 0.0; 0.0 0.0;;; -0.08935376761589264 0.0; 0.0 0.0;;; 0.07470445052396994 0.0; -0.23211726377071046 0.0;;; … ;;; -2.392758173695492e-6 0.0; -2.7522839300098923e-7 0.0;;; 1.2870322712791405e-6 0.0; 8.633199128089602e-7 0.0;;; -1.432464313580054e-7 0.0; 3.403253642846997e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.18612829398667197 0.0; 0.0 0.0;;; -0.039883017625346906 0.0; -0.10881215708761188 0.0;;; … ;;; 3.1494240254279436e-6 0.0; 1.7899698505317833e-6 0.0;;; 2.304644782594209e-7 0.0; -1.3798323055816275e-6 0.0;;; -1.7120894951022973e-7 0.0; 3.218698082968668e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715589225408, 139716387370128, 139716240540464))), SingleBranch{Float64}(24:40, 0, 10:9, 1, 3, [0.24972409829345718, 0.7498912786626322, 0.2522526591568346], 0.3907770906724327, [-7.986155913622251 0.0; 0.0 0.0;;; -0.17961782829081357 0.0; 0.0 0.0;;; -0.1708311757232731 0.0; 0.03136313659178587 0.0;;; … ;;; -6.066729814028882e-6 0.0; 2.4234001902523587e-6 0.0;;; 2.327516919788084e-6 0.0; 4.871503604644382e-7 0.0;;; 2.4779318915245518e-8 0.0; -5.833921797828204e-8 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.23123037091208298 0.0; 0.0 0.0;;; -0.04900538737735943 0.0; 0.09175926185175516 0.0;;; … ;;; 4.485918956630448e-6 0.0; -4.465435544644365e-7 0.0;;; 4.3030079417319214e-7 0.0; -1.0429330819021147e-6 0.0;;; -6.453452663209182e-8 0.0; -7.83577196866388e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716387369680, 139716387370576, 275956203085))), SingleBranch{Float64}(41:57, 0, 10:9, 1, 4, [0.7472574195857279, 0.7498912786626322, 0.2522526591568346], 0.3550039324436246, [-9.931355245362722 0.0; 0.0 0.0;;; 0.004614587660418196 0.0; 0.0 0.0;;; 0.10229082910864945 0.0; 0.3430918058130857 0.0;;; … ;;; -5.8056578563028725e-6 0.0; -3.676520371447365e-6 0.0;;; 1.9707645764181104e-6 0.0; -1.126264814443797e-6 0.0;;; 4.6062541911518666e-7 0.0; -7.362398838063609e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.2483301379555629 0.0; 0.0 0.0;;; -0.04049668029331138 0.0; 0.11830360519660482 0.0;;; … ;;; 7.332258441837855e-6 0.0; -4.818227525166921e-6 0.0;;; 6.296600514955141e-7 0.0; 2.449994518659487e-6 0.0;;; -2.5397024192420015e-7 0.0; -1.9913483563355406e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715589225408, 139716387369680, 275956203085))), SingleBranch{Float64}(58:71, 0, 10:9, 1, 5, [0.24972409829345718, 0.2523579573703614, 0.7497859804491054], 0.3771527761310317, [-6.0812379817404665 0.0; 0.0 0.0;;; 0.25006763569186036 0.0; 0.0 0.0;;; -0.31820443039978746 0.0; 0.12220137601869531 0.0;;; … ;;; 3.886196424852797e-6 0.0; -7.451574546740225e-6 0.0;;; -1.5655251626942046e-6 0.0; 1.3488066967558975e-6 0.0;;; -2.6514766795446883e-7 0.0; -1.0394863598276786e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.23600705383401233 0.0; 0.0 0.0;;; 0.007799304330178003 0.0; 0.012439246336657786 0.0;;; … ;;; -1.4574470769163516e-8 0.0; 1.5992824761514576e-9 0.0;;; -2.835160161464411e-10 0.0; -3.5835678290697956e-10 0.0;;; 1.903723274446139e-12 0.0; -5.3571781615939486e-12 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716387369680, 139716387370576, 139715591657520))), SingleBranch{Float64}(72:82, 0, 10:9, 1, 6, [0.7472574195857279, 0.2523579573703614, 0.7497859804491054], 0.30707077616958983, [-5.643660411433685 0.0; 0.0 0.0;;; -0.09738759296933737 0.0; 0.0 0.0;;; 0.30570347319695684 0.0; 0.2359164756883997 0.0;;; … ;;; -9.828099569702297e-7 0.0; -4.228517737531717e-7 0.0;;; 2.722456045838181e-6 0.0; -9.867573156177317e-7 0.0;;; -2.8843207756702224e-7 0.0; 2.1892520476678593e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.13724763757441194 0.0; 0.0 0.0;;; -0.04184953211719816 0.0; 0.07154727061705074 0.0;;; … ;;; 7.307988510028463e-7 0.0; 1.2409626176729771e-8 0.0;;; 1.4022411841898488e-7 0.0; -2.3065426719117736e-7 0.0;;; -1.5496615773161006e-8 0.0; -2.8685996288531465e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716387213568, 139716302035616, 139715646511664))), SingleBranch{Float64}(83:89, 0, 10:9, 1, 7, [0.24972409829345718, 0.7498912786626322, 0.7497859804491054], 0.3929947235085011, [-2.3207471469996026 0.0; 0.0 0.0;;; 0.09585500095857492 0.0; 0.0 0.0;;; -0.034594650561498956 0.0; -0.04020353614176252 0.0;;; … ;;; 3.931149601398332e-6 0.0; -1.9070778716987882e-6 0.0;;; 4.2619416834337335e-7 0.0; 6.012393369990659e-7 0.0;;; -1.2968067700147368e-7 0.0; -1.7486311823425472e-8 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.14971788789451468 0.0; 0.0 0.0;;; -0.10199693754953348 0.0; -0.004039834025586983 0.0;;; … ;;; -1.5142626441460724e-6 0.0; -1.80684298411887e-7 0.0;;; 6.688133151638003e-7 0.0; 1.0679859224139595e-7 0.0;;; -9.055091853819892e-8 0.0; -1.816085482072339e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715589225408, 139716387369680, 139716387137608))), SingleBranch{Float64}(90:100, 0, 10:9, 1, 8, [0.7472574195857279, 0.7498912786626322, 0.7497859804491054], 0.3438264385687289, [-5.414197799467094 0.0; 0.0 0.0;;; 0.5897761356473473 0.0; 0.0 0.0;;; -0.11387613704005295 0.0; -0.009808782041582427 0.0;;; … ;;; 1.152786650059206e-5 0.0; -4.517396982831503e-6 0.0;;; -4.140305435424666e-6 0.0; -1.5665038040260306e-6 0.0;;; 1.2470773517558522e-7 0.0; 2.0253872196586884e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.2109597908590688 0.0; 0.0 0.0;;; 0.09347365978668326 0.0; -0.08394706203777819 0.0;;; … ;;; -3.5374566227538475e-6 0.0; -4.908528487673616e-6 0.0;;; -2.139788952278572e-6 0.0; -4.6632140843711356e-7 0.0;;; -2.2673535631629022e-7 0.0; 1.289726603228056e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716387370128, 139716387370576, 139715589748384)))], UnitRange{Int64}[1:1, 2:9], [2, 3, 4, 5, 6, 7, 8, 9], [8, 19, 24, 25, 30, 33, 35, 43, 52, 55  …  37, 41, 42, 49, 64, 71, 78, 79, 87, 88], [90, 83, 24, 72, 58, 59, 25, 1, 60, 73  …  23, 38, 80, 56, 39, 81, 82, 40, 13, 57], Tuple{Main.Body{Float64}, Vector{Float64}}[(Main.Body{Float64}([0.7287348331279035, 0.8645178072081, 0.9863586950447876], 0.002824412632887574, [0.3155425281087243, 0.5242721608260215, 0.3037915019715359, 0.5092362809736347]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.04871498957839171, 0.5228239956008278, 0.9981161184046683], 0.0010354523583936332, [0.10074227409525549, 0.4506225909463669, 0.17491391238059328, 0.06082060195439776]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.26339547338830394, 0.8205923530535013, 0.013801744155504059], 0.000561123611422205, [0.48127815547923203, 0.597575664859812, 0.25621397411396096, 0.24376337038602525]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9156175145346829, 0.2751207698440503, 0.5246024619099758], 0.0098534859774698, [0.26935622770690937, 0.8362086583306593, 0.34878217938304656, 0.892054755729866]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.23794338253051606, 0.07126180162893991, 0.8268192848648235], 0.005893848251548706, [0.9623280302748543, 0.9700474105552134, 0.5401563811701252, 0.3363767088616114]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.34419014790511104, 0.05942329652687128, 0.638243835469361], 0.00644242207338283, [0.6288483051985535, 0.5436188365924102, 0.037170548624490096, 0.6186924419946928]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.15805649008974942, 0.5709938439335004, 0.1952963518956614], 0.008603607634628693, [0.5087196531195634, 0.46083787720574276, 0.11131168268560498, 0.05390644299571157]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.4660552366407049, 0.13111968284280429, 0.1908671255470663], 0.010673064683743582, [0.8267772979915037, 0.5940503494088615, 0.7642758026757188, 0.7064898043827468]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.2548517099678951, 0.4198627396823058, 0.721065848690685], 0.003035717937974793, [0.189926270491526, 0.15590027174117937, 0.7717098308773933, 0.9680719682507289]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8858526395090768, 0.46145248100070335, 0.9250567869081467], 0.001049518093285898, [0.5832151279544228, 0.15248404026168572, 0.09640162291097443, 0.6066622096622617]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Body{Float64}([0.5296331054105041, 0.3321239926210552, 0.06612436517016262], 0.002175180875437042, [0.542909809886388, 0.9881319260769655, 0.5116206744374018, 0.9679174508161817]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.2721094519411936, 0.5745316878158806, 0.31571722739191854], 0.005050715677355731, [0.7277739175207515, 0.009255442256615898, 0.3853129792372124, 0.8965895001482749]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.7434626951201386, 0.36289922364912086, 0.7061441002953883], 0.006725458802148647, [0.407131657744786, 0.9044154694097414, 0.24397207168261692, 0.6196427314061671]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8013471104408885, 0.5720653332405079, 0.27403203500462225], 0.007524167273081227, [0.7565384544369875, 0.6324196309760326, 0.976021107723584, 0.29692421493161325]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.46830452243845555, 0.569647595880568, 0.1541232993049313], 0.0011190004051976465, [0.5368528346904301, 0.4268673876767367, 0.9735324084830853, 0.24475631443925416]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9017878088237389, 0.40553596320169993, 0.7807749436261482], 0.0010846429951816498, [0.8565385784764896, 0.7273458269895778, 0.982711926423153, 0.04772294619709316]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8903519608198294, 0.3360570216047577, 0.8870336180235173], 0.009269785903194445, [0.8071347497510072, 0.016120646043767062, 0.6116823564493244, 0.339969923686365]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.4332426219969675, 0.847902053417351, 0.4834830300689176], 0.010282220561264157, [0.13342547527751936, 0.39771446132672317, 0.9621059017952472, 0.5630711498775078]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.08815441665958379, 0.27050392304368787, 0.032365963471983505], 0.0061883460330328845, [0.47163404328391867, 0.9347698946928172, 0.815645714794484, 0.05209239706209945]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9838646299789375, 0.8308846392492549, 0.003922521201271678], 0.002568471846652083, [0.6464273083957023, 0.17360869737136164, 0.9921060153024334, 0.05658531089982577]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], Val{5}(), 50), SingleTree{Float64, Vector{Tuple{Main.Body{Float64}, Vector{Float64}}}, 5}(SingleBranch{Float64}[SingleBranch{Float64}(1:100, 8, 2:9, 0, -1, [0.49850630217496006, 0.5029084590406193, 0.4970227729348794], 0.8362233044847701, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716387369680, 139716387369680, 139715591666000))), SingleBranch{Float64}(1:14, 0, 10:9, 1, 1, [0.2510328948919175, 0.25543505175757675, 0.24954936565183686], 0.32830620603364347, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.2148637130046256 0.0; -0.0 0.0;;; -0.04834020432476547 0.0; -0.08941144433660723 0.0;;; … ;;; 3.5752497223563428e-6 0.0; 3.006318555294376e-7 0.0;;; 3.8241925632138014e-7 0.0; 8.756852584356714e-7 0.0;;; -5.567255439862998e-8 0.0; 7.122976820673655e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716343528752, 139715570430352, 139716387369680))), SingleBranch{Float64}(15:32, 0, 10:9, 1, 2, [0.7459797094580026, 0.25543505175757675, 0.24954936565183686], 0.4075867895483546, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.11109434668789528 0.0; -0.0 0.0;;; -0.09395711373565785 0.0; -0.0339352994212802 0.0;;; … ;;; -3.093083615342297e-7 0.0; -5.266957581159998e-7 0.0;;; -8.45286066948681e-8 0.0; -4.5318545488438834e-7 0.0;;; 1.3388476395864516e-8 0.0; -8.18196465630313e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716387370128, 139716387369680, 139716302035616))), SingleBranch{Float64}(33:42, 0, 10:9, 1, 3, [0.2510328948919175, 0.7503818663236619, 0.24954936565183686], 0.35924653313006505, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.19025706176624954 0.0; -0.0 0.0;;; -0.08523496179525314 0.0; 0.10063729919665365 0.0;;; … ;;; 4.515975081865985e-6 0.0; 2.6908857868788118e-6 0.0;;; 2.2681790868948097e-6 0.0; -7.786951926686422e-7 0.0;;; 1.2084952396660516e-7 0.0; -3.097235599682232e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716387370128, 139716387369680, 139715595849424))), SingleBranch{Float64}(43:55, 0, 10:9, 1, 4, [0.7459797094580026, 0.7503818663236619, 0.24954936565183686], 0.3444301048203579, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.10425563194142104 0.0; -0.0 0.0;;; -0.04040126882373641 0.0; -0.04562532239334573 0.0;;; … ;;; 1.3996120396479463e-7 0.0; -9.646181946431826e-8 0.0;;; 5.816317826369127e-8 0.0; 1.4394267248631393e-8 0.0;;; 3.2480223567985996e-9 0.0; 6.206399328437309e-9 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716361221984, 139716361222032, 142273203075))), SingleBranch{Float64}(56:68, 0, 10:9, 1, 5, [0.2510328948919175, 0.25543505175757675, 0.744496180217922], 0.38361157253242145, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.14061387788889593 0.0; 0.0 0.0;;; 0.04115555743278536 0.0; -0.035336314269337296 0.0;;; … ;;; -1.288070786691546e-7 0.0; -2.0654704149134432e-7 0.0;;; -4.8404286408038316e-8 0.0; -1.51707993788448e-8 0.0;;; -3.595926037719477e-9 0.0; 1.544749903303687e-9 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715589225408, 139716387370128, 19))), SingleBranch{Float64}(69:78, 0, 10:9, 1, 6, [0.7459797094580026, 0.25543505175757675, 0.744496180217922], 0.3013874815759014, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.05941703079908202 0.0; -0.0 0.0;;; -0.06985022321023225 0.0; 0.1032519762464019 0.0;;; … ;;; -6.688757943059791e-7 0.0; -1.4504812423201137e-7 0.0;;; 4.323362110439875e-7 0.0; -4.1295023043996754e-7 0.0;;; -4.18706433955205e-8 0.0; -2.4735074430968403e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716387370128, 139716387369680, -1))), SingleBranch{Float64}(79:86, 0, 10:9, 1, 7, [0.2510328948919175, 0.7503818663236619, 0.744496180217922], 0.3820455665476881, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.19773882534987763 0.0; -0.0 0.0;;; 0.10337544252106134 0.0; -0.003701264144869725 0.0;;; … ;;; 3.095126144436569e-6 0.0; -3.3359544949065297e-7 0.0;;; -9.336790671507606e-7 0.0; 1.3458164455370796e-7 0.0;;; 9.71193839691501e-8 0.0; -1.7566838362957855e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716387369680, 139716387369680, 139715595855680))), SingleBranch{Float64}(87:100, 0, 10:9, 1, 8, [0.7459797094580026, 0.7503818663236619, 0.744496180217922], 0.3327162107193368, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.0593706787958249 0.0; -0.0 0.0;;; 0.08539509989261301 0.0; 0.03940386228514198 0.0;;; … ;;; -1.6827227854645148e-8 0.0; -5.990511984334067e-8 0.0;;; 3.054235133952722e-8 0.0; -1.9110787243922576e-7 0.0;;; -3.415340917917519e-8 0.0; 5.0921396075492695e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716343528464, 139716188884736, 142273203075)))], UnitRange{Int64}[1:1, 2:9], [2, 3, 4, 5, 6, 7, 8, 9], [11, 19, 33, 43, 59, 63, 67, 68, 69, 72  …  20, 24, 31, 37, 42, 48, 60, 74, 94, 100], [69, 87, 70, 71, 79, 43, 56, 57, 44, 88  …  12, 55, 30, 99, 31, 32, 13, 68, 14, 100], Tuple{Main.Body{Float64}, Vector{Float64}}[(Main.Body{Float64}([0.9191811597933967, 0.42601923740838954, 0.7465863168484385], 0.00551624732815934, [0.2538490889415096, 0.33415153638191886, 0.4273278808735992, 0.867547200255958]), [108.51946935250929, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8192008435733007, 0.9541592624784624, 0.8458950823510601], 0.0014709561750558223, [0.03209667335274724, 0.3505458214588266, 0.9303323763821093, 0.9594335994071538]), [72.44348727911604, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.586748700554989, 0.12181263792534469, 0.7894931647499924], 0.0016174951280755708, [0.8935369466209786, 0.3548676566528912, 0.13179829123412257, 0.9411330896079791]), [84.61080196753738, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6192588014774537, 0.47764531343080796, 0.8041934288169849], 0.003639098305331564, [0.8236563299357046, 0.45048364263035023, 0.8913769757127503, 0.7110385498005108]), [105.6260313299836, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.12353811904859124, 0.7400202596259494, 0.7057473220960516], 0.004975260027225807, [0.9340155879013086, 0.753277849991045, 0.7295997282994879, 0.16238042514897943]), [83.01411086709412, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9919607797239652, 0.8036971367794874, 0.29827230692896456], 0.006659427674753824, [0.4842893268146866, 0.5997019277391098, 0.4536933650141408, 0.3249034202416199]), [96.09064863847617, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.49265789199054244, 0.17985285886739166, 0.6397154045236242], 0.004022070032387327, [0.6922349538863742, 0.7468540519107453, 0.09667869010406493, 0.45910253524716227]), [100.7208073721113, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.22768758746068596, 0.26780944724527167, 0.8309795986773825], 0.006802835099514221, [0.6911617055492341, 0.821283430881433, 0.5644095995557176, 0.030378874865931382]), [84.68272746156016, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.621178864455285, 0.7425206336869923, 0.15487161620983314], 0.0010425988209884726, [0.09206661519876747, 0.4379647602849879, 0.23146826213384353, 0.6471427793654219]), [111.35508934376354, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5733898483119126, 0.5900840309886971, 0.7659266276192337], 0.00633005068065063, [0.37737321139310276, 0.2404468114408953, 0.2221494346545283, 0.5096964769051421]), [100.87590407023012, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Body{Float64}([0.3562026836409853, 0.3635243844573359, 0.309727986680287], 0.0038713948967191466, [0.43490959394031214, 0.0758000769135273, 0.3487409265919944, 0.30331684418426996]), [112.97187743393756, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6547290646713112, 0.8311844039711347, 0.3538049975932579], 0.004154302641783906, [0.5842214092626906, 0.881611313975086, 0.009146364153274189, 0.9806631480861379]), [124.15361783713384, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5388794936906567, 0.04350921485134718, 0.23629199234128806], 0.006559279199653211, [0.9196974029361853, 0.17022568799250704, 0.2638800824351736, 0.6514229873225715]), [95.83800154421716, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5109351365074641, 0.7269107204213763, 0.8057341233600875], 0.002916397428800248, [0.13080774080166646, 0.22271994897768166, 0.6048365813194562, 0.052884966374337816]), [88.72102809781342, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6177567582580967, 0.38039525218264447, 0.37934078500465196], 0.010186078857427224, [0.2366140514268097, 0.31694750597495125, 0.29912838760350746, 0.623451826337517]), [125.5976138929021, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6781091106154422, 0.44334927922889245, 0.36064371233973214], 0.01036251002724151, [0.2743759198193091, 0.7285911206511895, 0.03773808039378912, 0.04331783284230861]), [124.51423398809521, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.20158107237490663, 0.3238946945648584, 0.24399963650509682], 0.009664372151238956, [0.47733204119516204, 0.4603052801344075, 0.9298297825042643, 0.358424742237733]), [101.10559863933453, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.18036026635324287, 0.173123936892006, 0.6038823023290261], 0.010016593230124706, [0.4401491209134364, 0.8609926737185056, 0.1638092551671958, 0.22646456871949416]), [93.91357637411625, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.072210006218703, 0.3521154604071077, 0.4644130786564624], 0.0037743609975635275, [0.17728847529212788, 0.12630836876865192, 0.9645167219705122, 0.8221674765296613]), [94.78656884587767, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8247874340282866, 0.5795916665384359, 0.8038668590137469], 0.0035401668870093193, [0.6409979037657155, 0.15911501872567757, 0.5356210909593669, 0.6799181470255188]), [93.44524600265673, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], Val{5}(), 50), StaticArraysCore.SVector{2, Int32}[], UnitRange{Int64}[1:14, 1:14, 1:14, 1:14, 1:14, 1:14, 1:14, 1:14, 15:32, 15:32  …  79:86, 79:86, 87:100, 87:100, 87:100, 87:100, 87:100, 87:100, 87:100, 87:100], UnitRange{Int64}[1:13, 14:23, 24:40, 41:57, 58:71, 72:82, 83:89, 90:100, 1:13, 14:23  …  83:89, 90:100, 1:13, 14:23, 24:40, 41:57, 58:71, 72:82, 83:89, 90:100])

Evaluate Multiple Sources on Multiple Targets

The FMM also supports the evaluation of multiple source systems on multiple target systems. The user is also able to evaluate a single source on multiple targets or multiple sources on a single target with any combination of supported system types.

vortex_path = normpath(joinpath(splitdir(pathof(fmm))[1], "..", "test", "vortex.jl"))
+fmm.fmm!(target_system, source_system)
(SingleTree{Float64, Vector{Tuple{Main.Body{Float64}, Vector{Float64}}}, 5}(SingleBranch{Float64}[SingleBranch{Float64}(1:100, 8, 2:9, 0, -1, [0.49849075893959255, 0.5011246180164968, 0.50101931980297], 0.8617443734929683, 0.8617443734929683, [-0.49752834600881063, 0.49752834600881063, -0.49752834600881063, 0.49752834600881063, -0.49752834600881063, 0.49752834600881063], [0.49752834600881063, 0.49752834600881063, 0.49752834600881063], 0.0, 0.0, fill(0.0), [-49.209733528008485 0.0; 0.0 0.0;;; 3.235503852070556 0.0; 0.0 0.0;;; 0.02681865248285842 0.0; 0.9591193094494834 0.0;;; … ;;; -0.0004469512083583767 0.0; -0.00015932419565861916 0.0;;; -0.00028710529956597804 0.0; -0.00031904516877669385 0.0;;; -7.588266430169126e-6 0.0; -8.400184364295124e-5 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871136998416, 139871136998464, 0))), SingleBranch{Float64}(1:13, 0, 10:9, 1, 1, [0.24972658593518723, 0.25236044501209143, 0.25225514679856464], 0.43087218674648414, 0.43087218674648414, [-0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531], [0.24876417300440531, 0.24876417300440531, 0.24876417300440531], 0.0, 0.0, fill(0.0), [-6.326393509059363 0.0; 0.0 0.0;;; 0.10174482633884264 0.0; 0.0 0.0;;; -0.07898687772271276 0.0; 0.03841659635534152 0.0;;; … ;;; -9.654710862452212e-7 0.0; -5.591129557725438e-7 0.0;;; 1.175731767951614e-6 0.0; 2.391893864725776e-6 0.0;;; -3.893767927840696e-8 0.0; -4.373076778562484e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.21988918332658114 0.0; 0.0 0.0;;; -0.00907173901579822 0.0; -0.08078608463780172 0.0;;; … ;;; 6.639561085749197e-7 0.0; 1.9043445262044332e-6 0.0;;; 3.6078285954161947e-7 0.0; -1.730779168448776e-7 0.0;;; -1.5694464749247868e-8 0.0; -2.5081831237534205e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871763235632, 139871763235632, 139871763235632))), SingleBranch{Float64}(14:23, 0, 10:9, 1, 2, [0.7472549319439978, 0.25236044501209143, 0.25225514679856464], 0.43087218674648414, 0.43087218674648414, [-0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531], [0.24876417300440531, 0.24876417300440531, 0.24876417300440531], 0.0, 0.0, fill(0.0), [-5.505985520323303 0.0; 0.0 0.0;;; -0.0893400706965472 0.0; 0.0 0.0;;; 0.07469760206429724 0.0; -0.23211041531103774 0.0;;; … ;;; -2.392727383648695e-6 0.0; -2.7506172478695797e-7 0.0;;; 1.2869752996385646e-6 0.0; 8.632541193951725e-7 0.0;;; -1.4323853566229846e-7 0.0; 3.40320513459477e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.18613078162840202 0.0; 0.0 0.0;;; -0.03988177380448188 0.0; -0.10881091326674686 0.0;;; … ;;; 3.1493849180079693e-6 0.0; 1.79002742056861e-6 0.0;;; 2.3049009571265728e-7 0.0; -1.3797688581858191e-6 0.0;;; -1.7119818873987816e-7 0.0; 3.217930041360891e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871763235632, 139871763235632, 0))), SingleBranch{Float64}(24:40, 0, 10:9, 1, 3, [0.24972658593518723, 0.7498887910209021, 0.25225514679856464], 0.43087218674648414, 0.43087218674648414, [-0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531], [0.24876417300440531, 0.24876417300440531, 0.24876417300440531], 0.0, 0.0, fill(0.0), [-7.986155913622251 0.0; 0.0 0.0;;; -0.1795979615961002 0.0; 0.0 0.0;;; -0.1708212423759164 0.0; 0.03135320324442914 0.0;;; … ;;; -6.066362373385743e-6 0.0; 2.4234495602853986e-6 0.0;;; 2.327392085993626e-6 0.0; 4.871331224296273e-7 0.0;;; 2.4751088043185402e-8 0.0; -5.827716675663792e-8 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.23122788327035293 0.0; 0.0 0.0;;; -0.04900663119822446 0.0; 0.09175801803089013 0.0;;; … ;;; 4.485772070448108e-6 0.0; -4.4630903906536425e-7 0.0;;; 4.303552019451355e-7 0.0; -1.0428735117063708e-6 0.0;;; -6.452660186998594e-8 0.0; -7.836101483352229e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 431013955054))), SingleBranch{Float64}(41:57, 0, 10:9, 1, 4, [0.7472549319439978, 0.7498887910209021, 0.25225514679856464], 0.43087218674648414, 0.43087218674648414, [-0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531], [0.24876417300440531, 0.24876417300440531, 0.24876417300440531], 0.0, 0.0, fill(0.0), [-9.931355245362722 0.0; 0.0 0.0;;; 0.004639293314162463 0.0; 0.0 0.0;;; 0.10230318193552163 0.0; 0.3431041586399578 0.0;;; … ;;; -5.8057861586053485e-6 0.0; -3.6767179441275553e-6 0.0;;; 1.970849569609788e-6 0.0; -1.1263384149017906e-6 0.0;;; 4.6063384099401923e-7 0.0; -7.362879677517756e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.24833262559729297 0.0; 0.0 0.0;;; -0.04049792411417641 0.0; 0.11830484901746985 0.0;;; … ;;; 7.332767131734295e-6 0.0; -4.818366848970212e-6 0.0;;; 6.296375165101449e-7 0.0; 2.450158453149185e-6 0.0;;; -2.5398566738723024e-7 0.0; -1.9922601565040447e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 0))), SingleBranch{Float64}(58:71, 0, 10:9, 1, 5, [0.24972658593518723, 0.25236044501209143, 0.7497834928073753], 0.43087218674648414, 0.43087218674648414, [-0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531], [0.24876417300440531, 0.24876417300440531, 0.24876417300440531], 0.0, 0.0, fill(0.0), [-6.0812379817404665 0.0; 0.0 0.0;;; 0.2500525077504865 0.0; 0.0 0.0;;; -0.31821199437047437 0.0; 0.12219381204800842 0.0;;; … ;;; 3.886164164482793e-6 0.0; -7.451230042206713e-6 0.0;;; -1.5655861775267537e-6 0.0; 1.3488384490746591e-6 0.0;;; -2.65136301189794e-7 0.0; -1.0396969077621681e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.23600456619228227 0.0; 0.0 0.0;;; 0.00780054815104303 0.0; 0.01243800251579276 0.0;;; … ;;; -1.457243306148132e-8 0.0; 1.604225902871519e-9 0.0;;; -2.836500215179685e-10 0.0; -3.581821796740947e-10 0.0;;; 1.9003405206797664e-12 0.0; -5.3575717814609175e-12 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 0))), SingleBranch{Float64}(72:82, 0, 10:9, 1, 6, [0.7472549319439978, 0.25236044501209143, 0.7497834928073753], 0.43087218674648414, 0.43087218674648414, [-0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531], [0.24876417300440531, 0.24876417300440531, 0.24876417300440531], 0.0, 0.0, fill(0.0), [-5.643660411433685 0.0; 0.0 0.0;;; -0.09740163237448708 0.0; 0.0 0.0;;; 0.30569645349438196 0.0; 0.2359234953909746 0.0;;; … ;;; -9.82916763080865e-7 0.0; -4.2285511081766585e-7 0.0;;; 2.7225441029521644e-6 0.0; -9.866422822602592e-7 0.0;;; -2.884182756506517e-7 0.0; 2.1891312191953625e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.137250125216142 0.0; 0.0 0.0;;; -0.041848288296333136 0.0; 0.07154851443791577 0.0;;; … ;;; 7.308420503707386e-7 0.0; 1.2365335735668517e-8 0.0;;; 1.4021073394047346e-7 0.0; -2.3067492312302074e-7 0.0;;; -1.5499976899256273e-8 0.0; -2.8685176609168157e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871061625936, 139871061625968, 0))), SingleBranch{Float64}(83:89, 0, 10:9, 1, 7, [0.24972658593518723, 0.7498887910209021, 0.7497834928073753], 0.43087218674648414, 0.43087218674648414, [-0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531], [0.24876417300440531, 0.24876417300440531, 0.24876417300440531], 0.0, 0.0, fill(0.0), [-2.3207471469996026 0.0; 0.0 0.0;;; 0.09584922777112714 0.0; 0.0 0.0;;; -0.03459176396777507 0.0; -0.04020642273548641 0.0;;; … ;;; 3.930977957593639e-6 0.0; -1.9071506252246133e-6 0.0;;; 4.262561393862879e-7 0.0; 6.012045573535614e-7 0.0;;; -1.296847519879538e-7 0.0; -1.748757755002258e-8 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.14971540025278463 0.0; 0.0 0.0;;; -0.10199818137039851 0.0; -0.00404107784645201 0.0;;; … ;;; -1.5142366400508734e-6 0.0; -1.807350708728618e-7 0.0;;; 6.688310694761936e-7 0.0; 1.0683350833198992e-7 0.0;;; -9.055558759133121e-8 0.0; -1.8167298693653792e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 0))), SingleBranch{Float64}(90:100, 0, 10:9, 1, 8, [0.7472549319439978, 0.7498887910209021, 0.7497834928073753], 0.43087218674648414, 0.43087218674648414, [-0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531, -0.24876417300440531, 0.24876417300440531], [0.24876417300440531, 0.24876417300440531, 0.24876417300440531], 0.0, 0.0, fill(0.0), [-5.414197799467094 0.0; 0.0 0.0;;; 0.5897626670629665 0.0; 0.0 0.0;;; -0.1138694027478626 0.0; -0.009802047749392043 0.0;;; … ;;; 1.152740503052551e-5 0.0; -4.517016990218442e-6 0.0;;; -4.140046433990845e-6 0.0; -1.566383749352849e-6 0.0;;; 1.2469713505945974e-7 0.0; 2.024928160458584e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.21095730321733874 0.0; 0.0 0.0;;; 0.09347241596581823 0.0; -0.08394581821691316 0.0;;; … ;;; -3.5372171155417328e-6 0.0; -4.908219455216665e-6 0.0;;; -2.1396426594075856e-6 0.0; -4.6629625718216964e-7 0.0;;; -2.2671999108049045e-7 0.0; 1.289627938417499e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 0)))], UnitRange{Int64}[1:1, 2:9], [2, 3, 4, 5, 6, 7, 8, 9], [8, 19, 24, 25, 30, 33, 35, 43, 52, 55  …  37, 41, 42, 49, 64, 71, 78, 79, 87, 88], [90, 83, 24, 72, 58, 59, 25, 1, 60, 73  …  23, 38, 80, 56, 39, 81, 82, 40, 13, 57], Tuple{Main.Body{Float64}, Vector{Float64}}[(Main.Body{Float64}([0.7287348331279035, 0.8645178072081, 0.9863586950447876], 0.002824412632887574, [0.3155425281087243, 0.5242721608260215, 0.3037915019715359, 0.5092362809736347]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.04871498957839171, 0.5228239956008278, 0.9981161184046683], 0.0010354523583936332, [0.10074227409525549, 0.4506225909463669, 0.17491391238059328, 0.06082060195439776]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.26339547338830394, 0.8205923530535013, 0.013801744155504059], 0.000561123611422205, [0.48127815547923203, 0.597575664859812, 0.25621397411396096, 0.24376337038602525]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9156175145346829, 0.2751207698440503, 0.5246024619099758], 0.0098534859774698, [0.26935622770690937, 0.8362086583306593, 0.34878217938304656, 0.892054755729866]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.23794338253051606, 0.07126180162893991, 0.8268192848648235], 0.005893848251548706, [0.9623280302748543, 0.9700474105552134, 0.5401563811701252, 0.3363767088616114]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.34419014790511104, 0.05942329652687128, 0.638243835469361], 0.00644242207338283, [0.6288483051985535, 0.5436188365924102, 0.037170548624490096, 0.6186924419946928]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.15805649008974942, 0.5709938439335004, 0.1952963518956614], 0.008603607634628693, [0.5087196531195634, 0.46083787720574276, 0.11131168268560498, 0.05390644299571157]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.4660552366407049, 0.13111968284280429, 0.1908671255470663], 0.010673064683743582, [0.8267772979915037, 0.5940503494088615, 0.7642758026757188, 0.7064898043827468]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.2548517099678951, 0.4198627396823058, 0.721065848690685], 0.003035717937974793, [0.189926270491526, 0.15590027174117937, 0.7717098308773933, 0.9680719682507289]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8858526395090768, 0.46145248100070335, 0.9250567869081467], 0.001049518093285898, [0.5832151279544228, 0.15248404026168572, 0.09640162291097443, 0.6066622096622617]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Body{Float64}([0.5296331054105041, 0.3321239926210552, 0.06612436517016262], 0.002175180875437042, [0.542909809886388, 0.9881319260769655, 0.5116206744374018, 0.9679174508161817]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.2721094519411936, 0.5745316878158806, 0.31571722739191854], 0.005050715677355731, [0.7277739175207515, 0.009255442256615898, 0.3853129792372124, 0.8965895001482749]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.7434626951201386, 0.36289922364912086, 0.7061441002953883], 0.006725458802148647, [0.407131657744786, 0.9044154694097414, 0.24397207168261692, 0.6196427314061671]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8013471104408885, 0.5720653332405079, 0.27403203500462225], 0.007524167273081227, [0.7565384544369875, 0.6324196309760326, 0.976021107723584, 0.29692421493161325]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.46830452243845555, 0.569647595880568, 0.1541232993049313], 0.0011190004051976465, [0.5368528346904301, 0.4268673876767367, 0.9735324084830853, 0.24475631443925416]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9017878088237389, 0.40553596320169993, 0.7807749436261482], 0.0010846429951816498, [0.8565385784764896, 0.7273458269895778, 0.982711926423153, 0.04772294619709316]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8903519608198294, 0.3360570216047577, 0.8870336180235173], 0.009269785903194445, [0.8071347497510072, 0.016120646043767062, 0.6116823564493244, 0.339969923686365]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.4332426219969675, 0.847902053417351, 0.4834830300689176], 0.010282220561264157, [0.13342547527751936, 0.39771446132672317, 0.9621059017952472, 0.5630711498775078]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.08815441665958379, 0.27050392304368787, 0.032365963471983505], 0.0061883460330328845, [0.47163404328391867, 0.9347698946928172, 0.815645714794484, 0.05209239706209945]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9838646299789375, 0.8308846392492549, 0.003922521201271678], 0.002568471846652083, [0.6464273083957023, 0.17360869737136164, 0.9921060153024334, 0.05658531089982577]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], Val{5}(), 50), SingleTree{Float64, Vector{Tuple{Main.Body{Float64}, Vector{Float64}}}, 5}(SingleBranch{Float64}[SingleBranch{Float64}(1:100, 8, 2:9, 0, -1, [0.49850630217496006, 0.5029084590406193, 0.4970227729348794], 0.8572644572282587, 0.8572644572282587, [-0.49494186514743355, 0.49494186514743355, -0.49494186514743355, 0.49494186514743355, -0.49494186514743355, 0.49494186514743355], [0.49494186514743355, 0.49494186514743355, 0.49494186514743355], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 0))), SingleBranch{Float64}(1:14, 0, 10:9, 1, 1, [0.2510353696012433, 0.25543752646690254, 0.24955184036116262], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.2148612382952998 0.0; -0.0 0.0;;; -0.04833896697010254 0.0; -0.08941268169127015 0.0;;; … ;;; 3.5751904359505736e-6 0.0; 3.0080507578758053e-7 0.0;;; 3.8236458599367976e-7 0.0; 8.757176386082573e-7 0.0;;; -5.567979953388733e-8 0.0; 7.122692732518039e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871909835712, 139871909854080, 139871909854976))), SingleBranch{Float64}(15:32, 0, 10:9, 1, 2, [0.7459772347486768, 0.25543752646690254, 0.24955184036116262], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.11109187197856953 0.0; -0.0 0.0;;; -0.09395587638099494 0.0; -0.03393406206661734 0.0;;; … ;;; -3.0928893153242635e-7 0.0; -5.266357454009592e-7 0.0;;; -8.453485198034652e-8 0.0; -4.5314409979717737e-7 0.0;;; 1.3384370562270982e-8 0.0; -8.18136577012236e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871910065296, 139871910065744, 139871909835712))), SingleBranch{Float64}(33:42, 0, 10:9, 1, 3, [0.2510353696012433, 0.7503793916143361, 0.24955184036116262], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.1902545870569238 0.0; -0.0 0.0;;; -0.08523619914991601 0.0; 0.10063606184199078 0.0;;; … ;;; 4.515701992660869e-6 0.0; 2.690965808809799e-6 0.0;;; 2.2681808274429954e-6 0.0; -7.785616815693268e-7 0.0;;; 1.2086933929990936e-7 0.0; -3.097138724670615e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 0))), SingleBranch{Float64}(43:55, 0, 10:9, 1, 4, [0.7459772347486768, 0.7503793916143361, 0.24955184036116262], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.10425315723209527 0.0; -0.0 0.0;;; -0.04040250617839929 0.0; -0.04562408503868281 0.0;;; … ;;; 1.3994426612384809e-7 0.0; -9.646789543011186e-8 0.0;;; 5.8163042620289284e-8 0.0; 1.4387157402797034e-8 0.0;;; 3.2488834697645844e-9 0.0; 6.2058798109508465e-9 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871910066640, 139871910067088, 0))), SingleBranch{Float64}(56:68, 0, 10:9, 1, 5, [0.2510353696012433, 0.25543752646690254, 0.7444937055085962], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.1406114031795701 0.0; 0.0 0.0;;; 0.04115679478744828 0.0; -0.03533755162400021 0.0;;; … ;;; -1.2881546024813352e-7 0.0; -2.0655710448954946e-7 0.0;;; -4.840981119340681e-8 0.0; -1.5172010562775518e-8 0.0;;; -3.596485511575488e-9 0.0; 1.545042368324494e-9 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (1128098930099712, 256, 0))), SingleBranch{Float64}(69:78, 0, 10:9, 1, 6, [0.7459772347486768, 0.25543752646690254, 0.7444937055085962], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.05941950550840777 0.0; -0.0 0.0;;; -0.06984898585556935 0.0; 0.10325321360106476 0.0;;; … ;;; -6.688472512156468e-7 0.0; -1.4501297809812144e-7 0.0;;; 4.3233604883670166e-7 0.0; -4.1299565937718063e-7 0.0;;; -4.1888246519238254e-8 0.0; -2.4735114753799555e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 0))), SingleBranch{Float64}(79:86, 0, 10:9, 1, 7, [0.2510353696012433, 0.7503793916143361, 0.7444937055085962], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.19774130005920343 0.0; -0.0 0.0;;; 0.10337420516639845 0.0; -0.003702501499532632 0.0;;; … ;;; 3.0951077862846165e-6 0.0; -3.337097810420304e-7 0.0;;; -9.336410389602992e-7 0.0; 1.3462336691028458e-7 0.0;;; 9.711269933660484e-8 0.0; -1.7571838450287563e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 0))), SingleBranch{Float64}(87:100, 0, 10:9, 1, 8, [0.7459772347486768, 0.7503793916143361, 0.7444937055085962], 0.42863222861412936, 0.42863222861412936, [-0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677, -0.24747093257371677, 0.24747093257371677], [0.24747093257371677, 0.24747093257371677, 0.24747093257371677], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.0593731535051507 0.0; -0.0 0.0;;; 0.08539386253795012 0.0; 0.039405099639804875 0.0;;; … ;;; -1.6817191281206375e-8 0.0; -5.988143577896676e-8 0.0;;; 3.0556184471062655e-8 0.0; -1.9110878655930648e-7 0.0;;; -3.415675534882339e-8 0.0; 5.09167765671537e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871060234448, 139871060234480, 0)))], UnitRange{Int64}[1:1, 2:9], [2, 3, 4, 5, 6, 7, 8, 9], [11, 19, 33, 43, 59, 63, 67, 68, 69, 72  …  20, 24, 31, 37, 42, 48, 60, 74, 94, 100], [69, 87, 70, 71, 79, 43, 56, 57, 44, 88  …  12, 55, 30, 99, 31, 32, 13, 68, 14, 100], Tuple{Main.Body{Float64}, Vector{Float64}}[(Main.Body{Float64}([0.9191811597933967, 0.42601923740838954, 0.7465863168484385], 0.00551624732815934, [0.2538490889415096, 0.33415153638191886, 0.4273278808735992, 0.867547200255958]), [108.51946935250929, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8192008435733007, 0.9541592624784624, 0.8458950823510601], 0.0014709561750558223, [0.03209667335274724, 0.3505458214588266, 0.9303323763821093, 0.9594335994071538]), [72.44348727911604, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.586748700554989, 0.12181263792534469, 0.7894931647499924], 0.0016174951280755708, [0.8935369466209786, 0.3548676566528912, 0.13179829123412257, 0.9411330896079791]), [84.61080196753738, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6192588014774537, 0.47764531343080796, 0.8041934288169849], 0.003639098305331564, [0.8236563299357046, 0.45048364263035023, 0.8913769757127503, 0.7110385498005108]), [105.6260313299836, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.12353811904859124, 0.7400202596259494, 0.7057473220960516], 0.004975260027225807, [0.9340155879013086, 0.753277849991045, 0.7295997282994879, 0.16238042514897943]), [83.01411086709412, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9919607797239652, 0.8036971367794874, 0.29827230692896456], 0.006659427674753824, [0.4842893268146866, 0.5997019277391098, 0.4536933650141408, 0.3249034202416199]), [96.09064863847617, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.49265789199054244, 0.17985285886739166, 0.6397154045236242], 0.004022070032387327, [0.6922349538863742, 0.7468540519107453, 0.09667869010406493, 0.45910253524716227]), [100.7208073721113, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.22768758746068596, 0.26780944724527167, 0.8309795986773825], 0.006802835099514221, [0.6911617055492341, 0.821283430881433, 0.5644095995557176, 0.030378874865931382]), [84.68272746156016, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.621178864455285, 0.7425206336869923, 0.15487161620983314], 0.0010425988209884726, [0.09206661519876747, 0.4379647602849879, 0.23146826213384353, 0.6471427793654219]), [111.35508934376354, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5733898483119126, 0.5900840309886971, 0.7659266276192337], 0.00633005068065063, [0.37737321139310276, 0.2404468114408953, 0.2221494346545283, 0.5096964769051421]), [100.87590407023012, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Body{Float64}([0.3562026836409853, 0.3635243844573359, 0.309727986680287], 0.0038713948967191466, [0.43490959394031214, 0.0758000769135273, 0.3487409265919944, 0.30331684418426996]), [112.97187743393756, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6547290646713112, 0.8311844039711347, 0.3538049975932579], 0.004154302641783906, [0.5842214092626906, 0.881611313975086, 0.009146364153274189, 0.9806631480861379]), [124.15361783713384, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5388794936906567, 0.04350921485134718, 0.23629199234128806], 0.006559279199653211, [0.9196974029361853, 0.17022568799250704, 0.2638800824351736, 0.6514229873225715]), [95.83800154421716, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5109351365074641, 0.7269107204213763, 0.8057341233600875], 0.002916397428800248, [0.13080774080166646, 0.22271994897768166, 0.6048365813194562, 0.052884966374337816]), [88.72102809781342, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6177567582580967, 0.38039525218264447, 0.37934078500465196], 0.010186078857427224, [0.2366140514268097, 0.31694750597495125, 0.29912838760350746, 0.623451826337517]), [125.5976138929021, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6781091106154422, 0.44334927922889245, 0.36064371233973214], 0.01036251002724151, [0.2743759198193091, 0.7285911206511895, 0.03773808039378912, 0.04331783284230861]), [124.51423398809521, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.20158107237490663, 0.3238946945648584, 0.24399963650509682], 0.009664372151238956, [0.47733204119516204, 0.4603052801344075, 0.9298297825042643, 0.358424742237733]), [101.10559863933453, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.18036026635324287, 0.173123936892006, 0.6038823023290261], 0.010016593230124706, [0.4401491209134364, 0.8609926737185056, 0.1638092551671958, 0.22646456871949416]), [93.91357637411625, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.072210006218703, 0.3521154604071077, 0.4644130786564624], 0.0037743609975635275, [0.17728847529212788, 0.12630836876865192, 0.9645167219705122, 0.8221674765296613]), [94.78656884587767, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8247874340282866, 0.5795916665384359, 0.8038668590137469], 0.0035401668870093193, [0.6409979037657155, 0.15911501872567757, 0.5356210909593669, 0.6799181470255188]), [93.44524600265673, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], Val{5}(), 50), Tuple{Int32, Int32, Int64}[], StaticArraysCore.SVector{2, Int32}[[2, 2], [3, 2], [4, 2], [5, 2], [6, 2], [7, 2], [8, 2], [9, 2], [2, 3], [3, 3]  …  [8, 8], [9, 8], [2, 9], [3, 9], [4, 9], [5, 9], [6, 9], [7, 9], [8, 9], [9, 9]], DerivativesSwitch{true, true, true}())

Evaluate Multiple Sources on Multiple Targets

The FMM also supports the evaluation of multiple source systems on multiple target systems. The user is also able to evaluate a single source on multiple targets or multiple sources on a single target with any combination of supported system types.

vortex_path = normpath(joinpath(splitdir(pathof(fmm))[1], "..", "test", "vortex.jl"))
 include(vortex_path)
 
 function generate_vortex(seed, n_bodies; radius_factor=0.1, strength_factor=1.0)
@@ -152,15 +152,15 @@
 source_one = generate_gravitational(125, 100)
 source_two = generate_vortex(126, 100)
 
-fmm.fmm!((target_one, target_two), (source_one, source_two))
(MultiTree{Float64, 2, Tuple{Vector{Tuple{Main.Body{Float64}, Vector{Float64}}}, Vector{Tuple{Main.Vorton{Float64}, Vector{Float64}, Vector{Float64}}}}, 5}(MultiBranch{Float64, 2}[MultiBranch{Float64, 2}(UnitRange{Int64}[1:100, 1:100], 8, 2:9, 0, -1, [0.5026259736883681, 0.5006093989915064, 0.506575304253488], 0.8277771902722312, [-47.330269153011905 0.0; 0.0 0.0;;; -1.4300235236405046 0.0; 0.0 0.0;;; -0.002029992045810891 0.0; -0.08105879513383552 0.0;;; … ;;; -0.00110296520679963 0.0; -4.645570995686038e-5 0.0;;; 0.00016939788823689894 0.0; -9.944048413272222e-5 0.0;;; -2.8630359674060424e-5 0.0; -1.3837933452246478e-5 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716387761808, 139716387729504, 0))), MultiBranch{Float64, 2}(UnitRange{Int64}[1:14, 1:12], 0, 10:9, 1, 1, [0.2537862393699683, 0.2517696646731065, 0.2577355699350881], 0.386976873723269, [-7.499871222570643 0.0; 0.0 0.0;;; 0.1413280618542008 5.876318899706723; 0.0 0.0;;; -0.2778050353901769 -3.399262014326455; -0.2135628412525933 -3.034004529419432;;; … ;;; 2.5279388048245515e-6 -5.197695753483257e-6; -3.582749342833826e-7 -2.281384210369846e-6;;; -5.825886060242268e-6 1.666878749161324e-7; 7.346571089344604e-7 -5.343535198943436e-6;;; 4.4522407123885324e-7 2.873750220989941e-6; -5.919575673478341e-7 1.515390219902579e-6], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.07563467197145896 0.0; 0.0 0.0;;; -0.09383431934945272 0.0; 0.04427551923972553 0.0;;; … ;;; -7.727976399312987e-9 0.0; 3.049710268932081e-8 0.0;;; 6.994193162068015e-8 0.0; 3.5845979253253754e-7 0.0;;; 5.932185968102146e-8 0.0; 8.075427449153416e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 416634645919))), MultiBranch{Float64, 2}(UnitRange{Int64}[15:25, 13:23], 0, 10:9, 1, 2, [0.7514657080067679, 0.2517696646731065, 0.2577355699350881], 0.3230690296481368, [-5.786962147547788 0.0; 0.0 0.0;;; -0.08046577457759745 4.410294461276509; 0.0 0.0;;; 0.07919020972806944 -3.2482101027014534; 0.01347798934951734 -2.7368772194723507;;; … ;;; 2.9554477518446013e-6 -2.7287709179256256e-6; -1.3516018795147526e-6 3.5590593923822444e-6;;; -5.235098433276203e-7 3.5552234113359207e-6; -9.924456702068648e-7 -1.2779760943951946e-6;;; 1.9552919252249726e-7 7.438174966858878e-7; 4.169201744735889e-7 1.0619942539838923e-6], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.05128280523699197 0.0; 0.0 0.0;;; 0.02683119760921701 0.0; -0.0748107358903965 0.0;;; … ;;; 1.8984537616018438e-8 0.0; -1.1320746676560644e-8 0.0;;; 1.6380856222468962e-8 0.0; 8.36668638095202e-8 0.0;;; 2.6124536715916755e-8 0.0; 3.97567271520342e-9 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 416634645919))), MultiBranch{Float64, 2}(UnitRange{Int64}[26:39, 24:38], 0, 10:9, 1, 3, [0.2537862393699683, 0.7494491333099063, 0.2577355699350881], 0.36217293866513744, [-6.461237959815938 0.0; 0.0 0.0;;; -0.06458761415098542 10.059074305326293; 0.0 0.0;;; 0.014526329180068319 -4.529151153045262; 0.03572930574457327 -3.1853673726340865;;; … ;;; 2.185771337017815e-6 2.939637077688196e-6; -2.1019997625325658e-6 2.2770758379475904e-5;;; 6.414161010346966e-7 8.118341780726322e-6; -2.6281262900676806e-6 -5.2016543709996284e-6;;; 3.2165419046610564e-7 -7.8687948326151e-7; 6.657712199963187e-7 1.3271852331886163e-6], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.1969730258352485 0.0; 0.0 0.0;;; -0.0698296131028206 0.0; 0.05592483190306116 0.0;;; … ;;; 9.125180808589473e-7 0.0; 1.8650572122102615e-6 0.0;;; -4.755674131792346e-7 0.0; -2.2417508004170621e-7 0.0;;; 4.644863624430006e-8 0.0; -1.111011874607459e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716225522912, 139716240549472, 139716240549472))), MultiBranch{Float64, 2}(UnitRange{Int64}[40:49, 39:53], 0, 10:9, 1, 4, [0.7514657080067679, 0.7494491333099063, 0.2577355699350881], 0.39677412749082186, [-3.3477273311870865 0.0; 0.0 0.0;;; -0.1643668976318889 9.721186791516416; 0.0 0.0;;; 0.12294937242378291 -4.248526417696294; -0.03325322174701322 -4.252662383598009;;; … ;;; -8.136565698569824e-6 2.85809157130654e-6; -6.232010414066585e-7 6.863685034497029e-6;;; 2.2144238981415906e-7 -2.3464361481297434e-6; -3.7086998732612144e-6 -1.3558230807860473e-5;;; -5.605043300416817e-7 1.527859074306763e-6; -7.90941359700747e-7 1.3074942097750816e-6], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.12032717928231967 0.0; 0.0 0.0;;; 0.10905031792031677 0.0; -0.06508069037532493 0.0;;; … ;;; -4.748270292288002e-8 0.0; -1.0938275445221958e-6 0.0;;; -7.162073789051865e-7 0.0; -1.089733933277272e-6 0.0;;; -2.4769678797163877e-7 0.0; -1.2004696134683626e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716217871728, 139716217871728, 417175155038))), MultiBranch{Float64, 2}(UnitRange{Int64}[50:59, 54:61], 0, 10:9, 1, 5, [0.2537862393699683, 0.2517696646731065, 0.7554150385718879], 0.3734431704571032, [-3.768609585113875 0.0; 0.0 0.0;;; -0.0008181128137484846 5.180157724215509; 0.0 0.0;;; -0.13506186626488595 -2.648291420360042; 0.3387043394039166 -1.2864699484118736;;; … ;;; -9.013725729133286e-7 -7.018065644033346e-6; -3.564322401311956e-6 5.502095057858123e-6;;; -1.509582810631105e-7 -5.154587052030781e-6; -4.196290814709549e-6 6.013387936943595e-6;;; -1.3481597274614644e-7 3.5575548759740192e-6; -1.0044497056752384e-6 -5.975165409448692e-7], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.11255954450564098 0.0; 0.0 0.0;;; -0.020965295448399784 0.0; -0.02927205162446475 0.0;;; … ;;; 4.4757238616545156e-8 0.0; -1.354134964324324e-8 0.0;;; -6.248695913645672e-9 0.0; -4.804446771192453e-9 0.0;;; -1.7111401718698163e-11 0.0; 5.039799985682485e-10 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716345724112, 139716345724112, 417380189073))), MultiBranch{Float64, 2}(UnitRange{Int64}[60:70, 62:69], 0, 10:9, 1, 6, [0.7514657080067679, 0.2517696646731065, 0.7554150385718879], 0.36552972496063485, [-6.6995373983658775 0.0; 0.0 0.0;;; -0.22616041330146255 3.677475516378436; 0.0 0.0;;; -0.038929312047969115 -2.5171015089578783; -0.2980338882135055 -2.2333489901345933;;; … ;;; -4.152688998175833e-6 2.0044533246661873e-6; -3.693613433510793e-6 -2.1319390118067337e-6;;; 2.173531363544937e-6 2.868487114403946e-6; -8.0725840621465e-7 -1.950457352600298e-6;;; -5.684396498485783e-7 1.2853104759165028e-6; 6.412159113289811e-7 3.4784936658284787e-6], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.15531558256850708 0.0; 0.0 0.0;;; -0.09289683873130108 0.0; 0.11456595470778719 0.0;;; … ;;; 3.1526442601373232e-6 0.0; 1.6140908523622387e-6 0.0;;; -2.8012990802374663e-6 0.0; 1.2385162487162629e-6 0.0;;; 1.5238655450103131e-7 0.0; -5.614217718048159e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716186779488, 139716203235536, 0))), MultiBranch{Float64, 2}(UnitRange{Int64}[71:84, 70:84], 0, 10:9, 1, 7, [0.2537862393699683, 0.7494491333099063, 0.7554150385718879], 0.3391995617258065, [-5.357829793323234 0.0; 0.0 0.0;;; -0.4061689396155924 9.5704574266076; 0.0 0.0;;; 0.03135942300401651 -3.3376101500858075; -0.23075145082996534 -3.916290355677398;;; … ;;; 3.301838117476098e-6 -7.670353392260943e-6; -5.207986168718153e-6 -3.0578122138454885e-5;;; 2.870915110749233e-6 -6.334826865600408e-6; 1.7483509075056676e-6 1.8944278521011196e-5;;; -4.1527328690452027e-7 3.2831790802632986e-7; 7.872235416416785e-7 4.794130730297706e-7], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.035438493800372894 0.0; 0.0 0.0;;; -0.04873269714095829 0.0; -0.03622644205055428 0.0;;; … ;;; -3.728633941010672e-9 0.0; 1.0312576955542882e-8 0.0;;; -1.6741397243205723e-8 0.0; 1.1079177537746566e-8 0.0;;; 6.869437688098299e-9 0.0; 3.7565396505474165e-10 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716203235536, 139716203235536, 0))), MultiBranch{Float64, 2}(UnitRange{Int64}[85:100, 85:100], 0, 10:9, 1, 8, [0.7514657080067679, 0.7494491333099063, 0.7554150385718879], 0.37210064395305154, [-8.40849371508746 0.0; 0.0 0.0;;; -0.3454370375590243 7.943956858857518; 0.0 0.0;;; 0.2240980866225453 -4.708608165124062; 0.16290462172283848 -4.930830366108012;;; … ;;; -1.0594331053817852e-5 -1.954814726825918e-5; 6.84588785365499e-6 -6.545133716275618e-6;;; 3.1625267639407288e-6 -4.415281923123912e-6; -4.1035318753537076e-7 4.171988794538208e-6;;; -1.5065638473139756e-6 -1.853662625064418e-6; -8.640666164678302e-8 2.7630447957716085e-6], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.19104180160549544 0.0; 0.0 0.0;;; -0.019537723588883227 0.0; -0.018190689254912684 0.0;;; … ;;; 3.5951448524924415e-8 0.0; -4.460984023540474e-8 0.0;;; -4.0012675609576176e-9 0.0; 5.751054350339875e-10 0.0;;; 9.279353850704035e-11 0.0; 6.443570285217977e-11 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716203235536, 139716203235536, 139716240549472)))], UnitRange{Int64}[1:1, 2:9], [2, 3, 4, 5, 6, 7, 8, 9], ([5, 19, 24, 38, 39, 43, 51, 53, 60, 62  …  20, 29, 45, 52, 54, 58, 76, 82, 83, 99], [16, 18, 46, 56, 57, 58, 62, 64, 66, 73  …  35, 38, 47, 48, 49, 52, 63, 71, 82, 83]), ([40, 26, 85, 50, 1, 86, 27, 60, 61, 87  …  69, 48, 58, 49, 13, 84, 70, 59, 100, 14], [39, 54, 85, 24, 70, 40, 13, 86, 62, 71  …  60, 23, 83, 52, 53, 12, 68, 69, 61, 84]), (Tuple{Main.Body{Float64}, Vector{Float64}}[(Main.Body{Float64}([0.557859214605901, 0.9505794906131003, 0.3404453566099245], 0.009400118805868503, [0.4279926935042637, 0.5792958612811091, 0.7737051496094961, 0.755089351578363]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.4665724969813344, 0.7527119243585907, 0.37990008755992277], 0.008009455207989609, [0.03215302412332721, 0.30401585392069863, 0.39844830923765007, 0.05175624298006909]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.655364218417507, 0.5420094641040476, 0.5949064366117462], 0.00966985017093868, [0.45318687939721236, 0.714833285253085, 0.8014821280258599, 0.0423294989420161]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.46020494037027904, 0.1183049591166877, 0.8455736796675837], 0.009564529506430412, [0.43820774144362595, 0.9864134399623772, 0.5213635902352741, 0.7825393808296219]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.38302007549064776, 0.2610738988132921, 0.38243110265103486], 0.00879050055450757, [0.22661173901939113, 0.6427440609269616, 0.7349829587317898, 0.22440478954784737]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.7675706354227012, 0.6830216562053943, 0.9828525063335046], 0.00030193717698736916, [0.6962187903754538, 0.7485949073619695, 0.6034741867978999, 0.7292786447682762]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.3050424229456674, 0.705503651828581, 0.2161902177875057], 0.0019490720274920647, [0.8645972363970755, 0.5822420927980573, 0.25580361360386095, 0.377504748209773]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.503364457080568, 0.4739102794439455, 0.8882313721777293], 0.007003767860720454, [0.647938265577496, 0.5462740370511083, 0.4481538479575009, 0.42773190354588286]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6419909113170134, 0.3653123773611996, 0.9713497759206838], 0.0043579616572875434, [0.8917110271026161, 0.6439207339714714, 0.5036025955048534, 0.4437995597691393]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5660529652176645, 0.9595746577303932, 0.8477086241617172], 0.0035640681857256975, [0.5419453685002806, 0.3427439265408987, 0.032196858193411226, 0.18518731541358224]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Body{Float64}([0.5828631646060379, 0.34651215147388426, 0.5134178926389176], 0.003926179004732325, [0.0458405367409076, 0.3639566243370217, 0.059578557114454256, 0.9962632355591512]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.879080103813595, 0.6025583064984074, 0.23268830772202231], 0.0008940181927595166, [0.42801386665227803, 0.07046185542048555, 0.6951230120676851, 0.6705048319454384]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.1440075538011215, 0.3067113936734345, 0.6436070688247999], 0.007053929291224028, [0.3997191978718325, 0.013760125081811125, 0.11173714288874481, 0.25455238905806765]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5215814102984935, 0.5258283802989739, 0.3954807490563794], 0.007982359414388152, [0.047033883420560474, 0.9582951819555906, 0.9519215449752892, 0.2567791620738684]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.11881400147042598, 0.011220061279313964, 0.13384862525073793], 0.007187609019877816, [0.7795024398485453, 0.8301151297487197, 0.45918152351480335, 0.25851486922819]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.060512169419791206, 0.7446053256593784, 0.6746307003251895], 0.006094604185275119, [0.906748548471635, 0.11488502630332675, 0.5753095521549699, 0.782094637362603]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.863362101283652, 0.21474704797833044, 0.6503263151978904], 0.00989898695295262, [0.6240429482632586, 0.7906374362304105, 0.7652350423701638, 0.14765296790357707]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.47316473223960553, 0.052497737269379674, 0.8449616700297329], 0.001296483920557443, [0.7700451041031097, 0.7383868768468096, 0.34134557996296455, 0.05993679065745827]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.7449788853899865, 0.5181977584843006, 0.7351146161115111], 0.002153393855190447, [0.4172346693219562, 0.7146733939712135, 0.8797743859260458, 0.7096904549422267]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.0895075005214856, 0.012769070252689807, 0.21717576989610088], 0.007793578077477884, [0.17355753790968675, 0.9885775553410592, 0.05271954177460836, 0.504623980860874]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], Tuple{Main.Vorton{Float64}, Vector{Float64}, Vector{Float64}}[(Main.Vorton{Float64}([0.6930608269351647, 0.5953826990089739, 0.26009741633886674], [0.708975608783004, 0.4394604367174749, 0.6143483139481591], 0.002522113977453815), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.4736959165523619, 0.07319045613465058, 0.5279634023504362], [0.01577213921807452, 0.5769351603895058, 0.46967633280564924], 0.010145707404439529), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.6395805176226315, 0.8837886147365132, 0.7541674014529683], [0.40633052528186975, 0.6551097046413992, 0.8085217817740494], 0.006190339263914765), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.4631722969914098, 0.8141764584094953, 0.34998766001547277], [0.02285921557912396, 0.9620740765684674, 0.8628479339285585], 0.004900731051132423), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.3853667049302918, 0.5281707735578608, 0.7578440632557893], [0.7696437203416594, 0.14268788425911882, 0.9585990358769636], 0.0013076612145550802), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.7235603944754815, 0.6619214652561239, 0.49311973421304267], [0.66472377932795, 0.70181996648594, 0.8606817852554968], 0.00680460850742638), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.866335124889903, 0.44495332387411457, 0.19206496056055744], [0.8783063366197971, 0.5210113642202104, 0.7929108909484469], 0.008296600414482234), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.8005737193684215, 0.9286577650625372, 0.8816670257839777], [0.6607811201396498, 0.3573595306059265, 0.16305322765946628], 0.007574200408496729), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.5841927149409011, 0.27288281477972787, 0.6364104723135541], [0.6254189121396706, 0.5788460814241853, 0.09527339989464556], 0.0027914065402173593), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.4858020455896641, 0.6822544316120533, 0.7421646227295875], [0.03146588273117701, 0.5249122388651134, 0.555380505342661], 0.006004808789025575), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Vorton{Float64}([0.15838432041921613, 0.39137001697762885, 0.8186619053080604], [0.7913811629657576, 0.8078455536303967, 0.967197757866526], 0.007154627189838537), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.9010871797875609, 0.30543205989154054, 0.3090183751720801], [0.025980839293487157, 0.7583642275285837, 0.27292660535811286], 0.009552645635530432), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.1635168706372193, 0.847082049512829, 0.9545070538738755], [0.2608997687416311, 0.6250852449509345, 0.6909582078949791], 0.002189030971528107), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.9490322673395254, 0.7258379023145007, 0.05021538416807836], [0.22751986401005164, 0.7261381551482464, 0.06352652466673381], 0.007063791754264745), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.8816270887574178, 0.9675497691505398, 0.3780627492174078], [0.3884890848560171, 0.0005752088145820622, 0.7417616734381712], 0.008864046920721253), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.16523520089051724, 0.06410102597420109, 0.18210089796362916], [0.5549655695831773, 0.8637860954012616, 0.4944273944361771], 0.006034557502749332), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.8653643258264998, 0.34589851369467783, 0.5379998834582042], [0.7687352179913052, 0.8919604959857386, 0.9957687887352038], 0.0054620417749986425), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.5223337985911936, 0.06597598721050435, 0.9107306211403949], [0.4224941044001491, 0.675471368361827, 0.11124522614496535], 0.0057352215420712685), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.3123303426188978, 0.20983907377630695, 0.8679745830775288], [0.06926277130277392, 0.6643018073630574, 0.1097076813599972], 0.008160475501220016), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.32623912347107686, 0.6519837390279897, 0.7908535323722607], [0.968260540137222, 0.19739786160280937, 0.34581970605657375], 0.007458633600391231), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0])]), Val{5}(), 50), MultiTree{Float64, 2, Tuple{Vector{Tuple{Main.Body{Float64}, Vector{Float64}}}, Vector{Tuple{Main.Vorton{Float64}, Vector{Float64}, Vector{Float64}}}}, 5}(MultiBranch{Float64, 2}[MultiBranch{Float64, 2}(UnitRange{Int64}[1:100, 1:100], 8, 2:9, 0, -1, [0.49801566262999436, 0.49520356617852135, 0.4970227729348794], 0.8466306954936855, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716322547888, 139715535306528, 139715883511440))), MultiBranch{Float64, 2}(UnitRange{Int64}[1:14, 1:12], 0, 10:9, 1, 1, [0.250484291582877, 0.24767219513140398, 0.24949140188776203], 0.3409932792863347, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.20869874596677065 0.0; 0.0 0.0;;; 0.03254377097505185 0.0; -0.1007333470256917 0.0;;; … ;;; -3.0242004225390363e-6 0.0; 2.220518533084813e-6 0.0;;; 3.4440717958941495e-7 0.0; 1.0362947825737592e-6 0.0;;; 1.10779535155466e-7 0.0; -9.279862880947665e-10 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 431484753537))), MultiBranch{Float64, 2}(UnitRange{Int64}[15:32, 13:28], 0, 10:9, 1, 2, [0.7455470336771117, 0.24767219513140398, 0.24949140188776203], 0.41243839701263263, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.08037383493127098 0.0; -0.0 0.0;;; 0.029832952514170157 0.0; 0.045838607914399754 0.0;;; … ;;; -6.681267736283102e-8 0.0; 1.0787022507591235e-8 0.0;;; 2.013798665114524e-8 0.0; 2.2186931832707142e-8 0.0;;; 1.035766104639165e-9 0.0; -3.94406701992733e-9 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716191360848, 139715551329232, 139716240541232))), MultiBranch{Float64, 2}(UnitRange{Int64}[33:42, 29:38], 0, 10:9, 1, 3, [0.250484291582877, 0.7427349372256387, 0.24949140188776203], 0.36302001867661576, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.005682275592499425 0.0; 0.0 0.0;;; 0.1070453050980747 0.0; -0.0901672037658789 0.0;;; … ;;; 1.1261220844601339e-6 0.0; 1.9251926905735457e-6 0.0;;; -8.56042285355047e-8 0.0; -3.042603195096511e-8 0.0;;; -4.190912879936818e-7 0.0; 1.570402551525783e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716344225808, 139716344225840, 0))), MultiBranch{Float64, 2}(UnitRange{Int64}[43:55, 39:45], 0, 10:9, 1, 4, [0.7455470336771117, 0.7427349372256387, 0.24949140188776203], 0.34021299765217916, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.16613055019683698 0.0; -0.0 0.0;;; 0.08268525888080963 0.0; 0.09953703777220477 0.0;;; … ;;; -3.0320146510520043e-6 0.0; 1.6910008732197272e-6 0.0;;; 1.8102564368833417e-6 0.0; 6.997748400631538e-7 0.0;;; -9.634351700169127e-8 0.0; -2.865801947471854e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716240540464, 139716240540464, 0))), MultiBranch{Float64, 2}(UnitRange{Int64}[56:66, 46:60], 0, 10:9, 1, 5, [0.250484291582877, 0.24767219513140398, 0.7445541439819967], 0.388254296473148, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.045193444997522404 0.0; -0.0 0.0;;; 0.06242729584508568 0.0; -0.11141486351827706 0.0;;; … ;;; 1.0603068547827958e-6 0.0; -4.096367611186083e-8 0.0;;; 2.2781704857028653e-7 0.0; -4.4615199317580046e-7 0.0;;; 1.5704030148789486e-7 0.0; 2.355840226226345e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716185616416, 139716240549472, 139716240540464))), MultiBranch{Float64, 2}(UnitRange{Int64}[67:76, 61:73], 0, 10:9, 1, 6, [0.7455470336771117, 0.24767219513140398, 0.7445541439819967], 0.3963543727619728, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.1675166718637826 0.0; -0.0 0.0;;; -0.031233857882897335 0.0; -0.012017246955209782 0.0;;; … ;;; -3.881994280756285e-8 0.0; -7.662692826978993e-8 0.0;;; -8.882410817528648e-10 0.0; -8.709864620516205e-9 0.0;;; 9.184208057872618e-11 0.0; -3.37538804975255e-10 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716322443472, 139716240549472, 1517556598748))), MultiBranch{Float64, 2}(UnitRange{Int64}[77:86, 74:88], 0, 10:9, 1, 7, [0.250484291582877, 0.7427349372256387, 0.7445541439819967], 0.38464760558362926, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.11536726864546462 0.0; 0.0 0.0;;; 0.08162659633493155 0.0; -0.0797385094721889 0.0;;; … ;;; -5.740272026047589e-7 0.0; -6.158082271289903e-7 0.0;;; -8.141285793603281e-7 0.0; -3.812964472862527e-8 0.0;;; -1.2047601848511563e-7 0.0; 1.0714478559456662e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716387370576, 139716387243584, 139715648817472))), MultiBranch{Float64, 2}(UnitRange{Int64}[87:100, 89:100], 0, 10:9, 1, 8, [0.7455470336771117, 0.7427349372256387, 0.7445541439819967], 0.4178937843728946, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.08931416919147463 0.0; 0.0 0.0;;; 0.05004005163057301 0.0; 0.10583634984280096 0.0;;; … ;;; -1.4581381634699428e-7 0.0; -3.658482340494631e-8 0.0;;; -1.36015697237707e-7 0.0; -6.856578817162079e-7 0.0;;; 1.472583701438592e-7 0.0; -1.0906614518136271e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716387176832, 139716387265088, 0)))], UnitRange{Int64}[1:1, 2:9], [2, 3, 4, 5, 6, 7, 8, 9], ([11, 19, 33, 43, 59, 63, 67, 68, 69, 72  …  20, 24, 31, 37, 42, 48, 60, 74, 94, 100], [13, 15, 20, 41, 44, 49, 55, 62, 64, 65  …  22, 23, 24, 33, 54, 59, 66, 74, 75, 92]), ([67, 87, 68, 69, 77, 43, 56, 57, 44, 88  …  12, 55, 30, 99, 31, 32, 13, 66, 14, 100], [13, 89, 14, 61, 62, 46, 47, 39, 48, 74  …  59, 100, 72, 28, 12, 45, 60, 88, 73, 38]), (Tuple{Main.Body{Float64}, Vector{Float64}}[(Main.Body{Float64}([0.9191811597933967, 0.42601923740838954, 0.7465863168484385], 0.00551624732815934, [0.2538490889415096, 0.33415153638191886, 0.4273278808735992, 0.867547200255958]), [85.3506033780559, 0.0, 0.0, 0.0, 8.06249772598236, 20.742132708088107, -29.651179810975506, -108.92907718083855, 1358.7526071212158, -1171.3085492072082  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8192008435733007, 0.9541592624784624, 0.8458950823510601], 0.0014709561750558223, [0.03209667335274724, 0.3505458214588266, 0.9303323763821093, 0.9594335994071538]), [87.38882482263334, 0.0, 0.0, 0.0, -1.100939058319244, 7.474445909530373, 6.699188519856526, 457.93697609693334, -440.6509869868499, -690.8172778072006  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.586748700554989, 0.12181263792534469, 0.7894931647499924], 0.0016174951280755708, [0.8935369466209786, 0.3548676566528912, 0.13179829123412257, 0.9411330896079791]), [101.52858282491175, 0.0, 0.0, 0.0, 9.630211659160361, -2.638210371642431, -8.622154886089199, 0.008429065777369044, 5.233817961002082, -14.797288890588765  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6192588014774537, 0.47764531343080796, 0.8041934288169849], 0.003639098305331564, [0.8236563299357046, 0.45048364263035023, 0.8913769757127503, 0.7110385498005108]), [103.43268574590765, 0.0, 0.0, 0.0, 13.859110768453563, -3.9071367847812035, -8.11395605272161, -27.45516266302689, -9.378570810203593, 22.74100838219483  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.12353811904859124, 0.7400202596259494, 0.7057473220960516], 0.004975260027225807, [0.9340155879013086, 0.753277849991045, 0.7295997282994879, 0.16238042514897943]), [93.32127662551393, 0.0, 0.0, 0.0, -0.15841740325928771, -12.98905722258311, 10.724699909110734, 17.04079689897897, -9.103399047511285, 5.467324335930193  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9919607797239652, 0.8036971367794874, 0.29827230692896456], 0.006659427674753824, [0.4842893268146866, 0.5997019277391098, 0.4536933650141408, 0.3249034202416199]), [69.46581263668925, 0.0, 0.0, 0.0, -5.678810753233454, 13.674421198809798, -4.815599860065737, 11.158614532959072, -17.33922277427247, -12.335120138379066  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.49265789199054244, 0.17985285886739166, 0.6397154045236242], 0.004022070032387327, [0.6922349538863742, 0.7468540519107453, 0.09667869010406493, 0.45910253524716227]), [105.64593566408003, 0.0, 0.0, 0.0, 5.718129941800118, -9.847937002678014, -0.870729449848443, -129.54769381563, -182.518357936482, 153.05445952519017  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.22768758746068596, 0.26780944724527167, 0.8309795986773825], 0.006802835099514221, [0.6911617055492341, 0.821283430881433, 0.5644095995557176, 0.030378874865931382]), [82.48342248428222, 0.0, 0.0, 0.0, -0.7032839479798534, 5.704028315696549, -5.645750346651228, 337.26341798169574, -33.59797397914119, 62.619199827203055  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.621178864455285, 0.7425206336869923, 0.15487161620983314], 0.0010425988209884726, [0.09206661519876747, 0.4379647602849879, 0.23146826213384353, 0.6471427793654219]), [89.54825552075131, 0.0, 0.0, 0.0, -8.803138478520511, 17.31055979004575, -6.379565479954741, -147.41550741185515, -85.31936943654026, 194.62709067291138  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5733898483119126, 0.5900840309886971, 0.7659266276192337], 0.00633005068065063, [0.37737321139310276, 0.2404468114408953, 0.2221494346545283, 0.5096964769051421]), [101.33590365207982, 0.0, 0.0, 0.0, -1.7862929027640466, 21.488498710253474, -18.724753643750333, 382.18022122827057, -513.3572304837079, 226.9480321694559  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Body{Float64}([0.3562026836409853, 0.3635243844573359, 0.309727986680287], 0.0038713948967191466, [0.43490959394031214, 0.0758000769135273, 0.3487409265919944, 0.30331684418426996]), [97.45103071097367, 0.0, 0.0, 0.0, 3.7363343635707627, -2.6450963023691947, 3.5634416109623404, -8.848496519347146, 43.01756318720152, -60.137322799255514  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6547290646713112, 0.8311844039711347, 0.3538049975932579], 0.004154302641783906, [0.5842214092626906, 0.881611313975086, 0.009146364153274189, 0.9806631480861379]), [92.64727615051551, 0.0, 0.0, 0.0, -9.789566006058367, 19.649513017655398, -7.49722317810011, -33.20980996493979, -18.1072460256417, 32.27525647878902  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5388794936906567, 0.04350921485134718, 0.23629199234128806], 0.006559279199653211, [0.9196974029361853, 0.17022568799250704, 0.2638800824351736, 0.6514229873225715]), [81.30366296307194, 0.0, 0.0, 0.0, 5.390598913605371, 3.774600537535236, -7.770998408513131, -10.930957804363196, 15.641140699561106, 5.036619545207673  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5109351365074641, 0.7269107204213763, 0.8057341233600875], 0.002916397428800248, [0.13080774080166646, 0.22271994897768166, 0.6048365813194562, 0.052884966374337816]), [95.25179822463326, 0.0, 0.0, 0.0, 1.4922349492126696, -2.0520727956577445, 6.096890255702781, 1.6238466676321324, 95.41966121366875, -110.55671481774108  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6177567582580967, 0.38039525218264447, 0.37934078500465196], 0.010186078857427224, [0.2366140514268097, 0.31694750597495125, 0.29912838760350746, 0.623451826337517]), [102.86206571255629, 0.0, 0.0, 0.0, 183.22319548422686, -157.6131538178901, 124.89243427616086, 25630.480708536135, -10361.615921711391, -4549.69088770725  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6781091106154422, 0.44334927922889245, 0.36064371233973214], 0.01036251002724151, [0.2743759198193091, 0.7285911206511895, 0.03773808039378912, 0.04331783284230861]), [105.42062571549427, 0.0, 0.0, 0.0, -9.407098849857421, 10.66744635703102, 25.675874823028234, 213.24758539120032, -1.384483145900039, -268.37836906236925  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.20158107237490663, 0.3238946945648584, 0.24399963650509682], 0.009664372151238956, [0.47733204119516204, 0.4603052801344075, 0.9298297825042643, 0.358424742237733]), [89.10879222107357, 0.0, 0.0, 0.0, 0.29518122695650023, -1.5885953056254103, 2.6447317528749124, -0.04062593887656736, -0.3264347540319396, 39.209688879525736  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.18036026635324287, 0.173123936892006, 0.6038823023290261], 0.010016593230124706, [0.4401491209134364, 0.8609926737185056, 0.1638092551671958, 0.22646456871949416]), [85.06258300857247, 0.0, 0.0, 0.0, 9.980583049852275, -8.614757397874126, 1.4048918493255516, 16.304054536182477, -0.9083852185269751, 3.15651612869891  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.072210006218703, 0.3521154604071077, 0.4644130786564624], 0.0037743609975635275, [0.17728847529212788, 0.12630836876865192, 0.9645167219705122, 0.8221674765296613]), [87.35657697788763, 0.0, 0.0, 0.0, 6.631668160458205, -8.880876039620292, 2.2808268003712016, 8.688862460608041, 18.290196257740945, -27.70535302223958  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8247874340282866, 0.5795916665384359, 0.8038668590137469], 0.0035401668870093193, [0.6409979037657155, 0.15911501872567757, 0.5356210909593669, 0.6799181470255188]), [92.93042970237086, 0.0, 0.0, 0.0, 3.579170479759858, 0.5574429880355298, 8.653730501829191, -68.66336036933845, 80.5018410452713, -1.4853866455436502  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], Tuple{Main.Vorton{Float64}, Vector{Float64}, Vector{Float64}}[(Main.Vorton{Float64}([0.6956808381416713, 0.4853785553982539, 0.4648049213765313], [0.7054270031323241, 0.70014541220553, 0.49839208412207514], 0.008389531007170116), [0.0, 0.0, 0.0, 0.0, -0.8822584941683183, 37.933252387002895, -47.88603708257046, -14.946301589562754, 48.53490625653456, 4.048568767978836, 46.10273767416563, -14.937591195125465, -47.65264776236629], [8.50174853254558, 0.3422807467000143, -1.3698895414123198, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.6528326495428173, 0.8783095326823105, 0.6955937752833566], [0.992073216064829, 0.03702391218002421, 0.052040147154059024], 0.008559673062325765), [0.0, 0.0, 0.0, 0.0, 510.46032146257323, -337.29636284298914, -181.21412202984754, -597.077758178114, -40.577188108336635, 470.6252663326008, -572.3709595111981, 1008.0975596281908, -469.8831333542366], [-6.635307494467758, -10.657954792707974, 9.07280276144781, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.9077908593045806, 0.3939808726568609, 0.1924335604037214], [0.5681911381173306, 0.06084849139338322, 0.9611920275200003], 0.00920463305134842), [0.0, 0.0, 0.0, 0.0, -320.3332114842369, -34.58377130895539, 368.0839198461781, 230.13536494966473, 324.9842959812287, -428.13261855501696, 107.45354565095035, -237.813327378721, -4.6510844969917695], [5.002262904567566, 20.106483412927478, -27.95795361610942, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.680305220184172, 0.45142673639459907, 0.6565158730370251], [0.9871517007068787, 0.536191701519787, 0.8044608001295422], 0.01032776912661538), [0.0, 0.0, 0.0, 0.0, 3.5290366718469843, -165.41852935577367, 215.10016845722762, -68.86842304729687, 23.303633729181946, 247.64379943807933, 100.32617617358432, -249.17334079623583, -26.832670401028913], [9.74821219150256, 3.092276196613873, -11.616523984606683, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.5772900725131546, 0.19456471074413395, 0.9691695971486246], [0.029308796906382772, 0.237901194890202, 0.8225322140924277], 0.005855920250376647), [0.0, 0.0, 0.0, 0.0, -12.590937064305567, -5.8931029583027374, -6.052580045726423, -9.567705795412877, 6.983084969341174, -3.8613455886210613, 7.032438744361059, -4.783126247213283, 5.607852094964389], [11.241725102135732, -6.223353028275995, -4.338609044329697, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.07881482026287556, 0.16694384061777157, 0.7453082600322598], [0.36751517071734363, 0.08464781300384328, 0.7877792123673903], 0.006719633426946119), [0.0, 0.0, 0.0, 0.0, 26.415864678954573, -20.050867256931426, -0.8178529266405452, -4.549102666819707, -34.45901507382465, 11.628461542970213, 18.752918414945103, -27.01043418561137, 8.043150394870079], [9.920823853550871, -10.194323634205208, 1.9599671382805932, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.34386745978232425, 0.15114271162865245, 0.8692858825227187], [0.34380421639038017, 0.49221567013213885, 0.7577396026981709], 0.007165314050997217), [0.0, 0.0, 0.0, 0.0, -59.79113188139079, -1.9709498200711613, -26.762698675340847, 54.10917654100488, 45.492034964801626, -261.8421332968958, 164.44096188607392, -25.562476104392736, 14.299096916589178], [14.394628290815083, -3.672764630088914, -9.378589297611173, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.7924111084524182, 0.7258577993874293, 0.4074759819413786], [0.004779849956308646, 0.10815467687383273, 0.6365113178025307], 0.004211825485699923), [0.0, 0.0, 0.0, 0.0, 10.465389536407542, 94.68236585742876, -78.85761169691806, 70.89533439823704, -134.6061639041499, 47.9278980522469, -155.00862689153615, 43.986774759861845, 124.14077436774228], [-17.950340377015056, 21.149992040957308, 1.7437458219519797, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.15007164548253604, 0.13891454905930323, 0.8854146060893755], [0.2322606392244514, 0.24943996074378283, 0.6529923359002099], 0.004730386058191863), [0.0, 0.0, 0.0, 0.0, 59.442434719016205, 26.31264290953867, -7.788753592832606, 63.14513611059529, -47.72166333663818, 20.19110915521419, -57.46819208991416, 29.471415735207678, -11.720771382378052], [14.768178748060738, -8.861646545075095, 1.2188993808980852, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.178892411148747, 0.8198348637351619, 0.746693545507861], [0.05374276809352163, 0.28259697683790064, 0.9963633829133356], 0.004082068996145551), [0.0, 0.0, 0.0, 0.0, 57.050592206607114, -90.21090922096973, 48.878961267701186, -82.68306936940297, 14.29503143257214, 31.74239957362232, 12.320723650538946, 83.85090301869836, -71.34562363917927], [-0.03144901666306661, -15.583012096242426, 13.750015093195545, 0.0, 0.0, 0.0])  …  (Main.Vorton{Float64}([0.4598055261641393, 0.09042082143339258, 0.5640409504623178], [0.6396964311422774, 0.5845421243866575, 0.5349929592419193], 0.001124964196695102), [0.0, 0.0, 0.0, 0.0, 382.09609513254355, 228.00822947658645, -354.08488347129423, -954.163507769204, 241.5556796267648, -189.6437242626885, -169.1205368140404, 434.7509477257039, -623.6517747593078], [20.887342734108213, -2.735476925891841, -5.502211836582691, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.9572197333627137, 0.6426548339644926, 0.6552399747905221], [0.747485027142634, 0.23562083902231445, 0.23561754824795678], 0.0027436327111542455), [0.0, 0.0, 0.0, 0.0, 15.061487372616561, -26.10806509511263, 22.112106061527545, -41.88706206809685, 42.58929055731519, -11.079768202200608, -8.832598907394338, 0.18603518576434164, -57.65077792993176], [0.6561052462927573, 10.15339318367006, -12.7859063446062, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.8050706937073655, 0.005451816228509987, 0.6194543923497148], [0.2893241621284488, 0.15343050371415934, 0.45483197600289493], 0.0033418266341768534), [0.0, 0.0, 0.0, 0.0, -6.235476091786627, 2.7558002187956046, 2.9497273741924195, 10.232663073288112, 3.190253764733486, -17.021401404515075, 0.5779868577948659, -5.568330421328691, 3.0452223270531427], [8.099441084807626, 1.7447616146476344, -9.964573343111939, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.8372242495059112, 0.1880062901030637, 0.329865236819033], [0.6964852800076098, 0.41732935474694366, 0.12800112947157438], 0.008074470339380045), [0.0, 0.0, 0.0, 0.0, 47.94685325237328, -51.324186953826846, 4.847239236476755, -34.28059339724347, 40.769072683232345, 6.830704526226973, 33.07160266107869, 73.1016517686344, -88.71592593560563], [8.754889219586548, -1.8218252892777913, -7.180948488310969, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.049017597531493595, 0.18258465318130024, 0.04079265592099135], [0.6643772290446401, 0.25419876795775076, 0.0111761955710723], 0.006867801058606931), [0.0, 0.0, 0.0, 0.0, -27.31628247323072, 24.233190449744797, -0.3379485823927118, -11.924411796320792, 11.796570800683952, 4.254545828100499, -0.052136141612230326, 2.7632399691705896, 15.519711672546764], [-3.3270429646506385, 1.727457486302319, 2.4540759698751926, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.9446211092215213, 0.5773644194640194, 0.41562195208459896], [0.06814741604330621, 0.16749916233272766, 0.7091985108360725], 0.0031542415121338305), [0.0, 0.0, 0.0, 0.0, 1.8215164214546353, -43.0534679191244, 21.758774568979174, -1.455109738812573, 32.13601155444825, 15.440864606507798, 40.155527530783026, -3.0240868014144886, -33.9575279759029], [-1.4567847361429935, 15.2886865778917, -13.296049302008182, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.02765456454632287, 0.1228176034412326, 0.7897475889795191], [0.5848018551658597, 0.4374509112686895, 0.6003922163899991], 0.0010159571328096377), [0.0, 0.0, 0.0, 0.0, 26.979366295589013, -14.345761341507757, -2.1051658180464075, 8.158019109103137, -26.582227133027917, 11.360653361273496, 4.9604405244283765, -1.6498848360812965, -0.39713916256110293], [8.800785520582927, -8.37524017976289, 1.6105446403166235, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.09100727263849917, 0.5794817445557756, 0.6291868753365321], [0.04589763740992747, 0.2683934891175124, 0.9312357743393328], 0.004951543147051906), [0.0, 0.0, 0.0, 0.0, 7.2826254124701535, 200.02901760661942, -231.96691984886604, -180.55079830561596, 172.343725105568, 48.94235243035011, 203.53488904458027, 29.0355615056544, -179.62635051803812], [-0.04772504081689664, -20.681704217331202, 12.630047100731876, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.7215125397666922, 0.3101399108971986, 0.9120708158457793], [0.036429367243270616, 0.6439997561017691, 0.35149929330560925], 0.0006879838266934451), [0.0, 0.0, 0.0, 0.0, -10.842172139751918, 15.190887004020365, -17.834678493148925, 41.594173476581865, -5.397510782923477, -20.116652682634676, -1.618663520420014, -10.434703724772072, 16.239682922675396], [9.914485943053739, -4.739369747570147, -7.025390474122207, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.07014988405111922, 0.5286443270294893, 0.24380912629526263], [0.620780571763883, 0.8699240224718836, 0.5642401605234335], 0.0003071608128254314), [0.0, 0.0, 0.0, 0.0, 101.93059974405706, 17.590681314952022, -320.9252338856423, 442.5488472353321, -219.0466532545508, -19.474434088571872, -146.04873079853883, 40.3055813981039, 117.11605351049374], [-12.779350368008263, -1.3595250276884299, 13.026821975903577, 0.0, 0.0, 0.0])]), Val{5}(), 50), StaticArraysCore.SVector{2, Int32}[], (UnitRange{Int64}[1:14, 1:14, 1:14, 1:14, 1:14, 1:14, 1:14, 1:14, 15:32, 15:32  …  77:86, 77:86, 87:100, 87:100, 87:100, 87:100, 87:100, 87:100, 87:100, 87:100], UnitRange{Int64}[1:12, 1:12, 1:12, 1:12, 1:12, 1:12, 1:12, 1:12, 13:28, 13:28  …  74:88, 74:88, 89:100, 89:100, 89:100, 89:100, 89:100, 89:100, 89:100, 89:100]), (UnitRange{Int64}[1:14, 15:25, 26:39, 40:49, 50:59, 60:70, 71:84, 85:100, 1:14, 15:25  …  71:84, 85:100, 1:14, 15:25, 26:39, 40:49, 50:59, 60:70, 71:84, 85:100], UnitRange{Int64}[1:12, 13:23, 24:38, 39:53, 54:61, 62:69, 70:84, 85:100, 1:12, 13:23  …  70:84, 85:100, 1:12, 13:23, 24:38, 39:53, 54:61, 62:69, 70:84, 85:100]))

Non-Potential Flow Applications

As a default, target systems will be evaluated and returned with scalar_potential, velocity, and velocity_gradient fields populated. (Note that the vector potential is not explicitly tracked, though its induced velocity and velocity gradient are.) In some situations, only some of these values may be required. By inputting a boolean vector of the same length as target systems, the user is able to speed up the calculation by not storing unecessary values.

\[\overline{V} = -\nabla \phi + \nabla \times \overline{\psi}\]

$\phi$$\overline{\psi}$$\overline{V}$$\nabla \overline{V}$
fmm! Keyword Argumentsscalar_potentialvector_potentialvelocityvelocity_gradient
Fluid DynamicsScalar PotentialStream FunctionFluid VelocityVelocity Gradient
ElectrostaticsElectric Potential-Electric FieldField Gradient Tensor
Magnetostatics-Magnetic Vector PotentialMagnetic FieldField Gradient Tensor
GravityGravitational Potential-Gravitational AccelerationAcceleration Gradient Tensor
target_one = generate_gravitational(123, 100)
+fmm.fmm!((target_one, target_two), (source_one, source_two))
(MultiTree{Float64, 2, Tuple{Vector{Tuple{Main.Body{Float64}, Vector{Float64}}}, Vector{Tuple{Main.Vorton{Float64}, Vector{Float64}, Vector{Float64}}}}, 5}(MultiBranch{Float64, 2}[MultiBranch{Float64, 2}(UnitRange{Int64}[1:100, 1:100], 8, 2:9, 0, -1, [0.5026259736883681, 0.5006093989915064, 0.506575304253488], 0.8619975055877627, 0.8619975055877627, [-0.49767449189188073, 0.49767449189188073, -0.49767449189188073, 0.49767449189188073, -0.49767449189188073, 0.49767449189188073], [0.49767449189188073, 0.49767449189188073, 0.49767449189188073], 0.0, 0.0, fill(0.0), [-47.330269153011905 0.0; 0.0 0.0;;; -1.4300081297763314 0.0; 0.0 0.0;;; -0.0020279707713188877 0.0; -0.0810447498230098 0.0;;; … ;;; -0.001102965892865963 0.0; -4.646297296899838e-5 0.0;;; 0.0001693966781257666 0.0; -9.944313846444004e-5 0.0;;; -2.862980365746775e-5 0.0; -1.3838857277821314e-5 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 0))), MultiBranch{Float64, 2}(UnitRange{Int64}[1:14, 1:12], 0, 10:9, 1, 1, [0.2537887277424278, 0.251772153045566, 0.2577380583075476], 0.43099875279388133, 0.43099875279388133, [-0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037], [0.24883724594594037, 0.24883724594594037, 0.24883724594594037], 0.0, 0.0, fill(0.0), [-7.499871222570643 0.0; 0.0 0.0;;; 0.14134763322386673 5.876318899706723; 0.0 0.0;;; -0.27781448587580504 -3.399262014326455; -0.21357159879163193 -3.034004529419432;;; … ;;; 2.528007054727247e-6 -5.198140515345906e-6; -3.5865531122720975e-7 -2.2816070849536322e-6;;; -5.825983403314016e-6 1.668839102392757e-7; 7.346808214947709e-7 -5.3432822173448825e-6;;; 4.452343181626718e-7 2.8737566545769717e-6; -5.919437972505053e-7 1.5152180081065892e-6], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.07563716034391843 0.0; 0.0 0.0;;; -0.09383556353568245 0.0; 0.04427676342595527 0.0;;; … ;;; -7.732499867406854e-9 0.0; 3.051715598564347e-8 0.0;;; 6.995691193611116e-8 0.0; 3.5849287145216293e-7 0.0;;; 5.9328907145372435e-8 0.0; 8.075902066539915e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (20753281979104, 0, 412362272566))), MultiBranch{Float64, 2}(UnitRange{Int64}[15:25, 13:23], 0, 10:9, 1, 2, [0.7514632196343085, 0.251772153045566, 0.2577380583075476], 0.43099875279388133, 0.43099875279388133, [-0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037], [0.24883724594594037, 0.24883724594594037, 0.24883724594594037], 0.0, 0.0, fill(0.0), [-5.786962147547788 0.0; 0.0 0.0;;; -0.08046626758682532 4.410294461276509; 0.0 0.0;;; 0.07917686087068565 -3.2482101027014534; 0.013486487172595357 -2.7368772194723507;;; … ;;; 2.9550574604507674e-6 -2.7285638004285373e-6; -1.3518437065648355e-6 3.5595636693251586e-6;;; -5.234086734876242e-7 3.555165107606909e-6; -9.92570608622439e-7 -1.2783154363676133e-6;;; 1.9554981220314482e-7 7.438288253934825e-7; 4.1692108973748044e-7 1.062118867108326e-6], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.051280316864532494 0.0; 0.0 0.0;;; 0.026829953422987274 0.0; -0.0748119800766262 0.0;;; … ;;; 1.899571107442584e-8 0.0; -1.1328956225594303e-8 0.0;;; 1.6387380676626464e-8 0.0; 8.366465479549419e-8 0.0;;; 2.6126169093897e-8 0.0; 3.9732453187322435e-9 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 0))), MultiBranch{Float64, 2}(UnitRange{Int64}[26:39, 24:38], 0, 10:9, 1, 3, [0.2537887277424278, 0.7494466449374467, 0.2577380583075476], 0.43099875279388133, 0.43099875279388133, [-0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037], [0.24883724594594037, 0.24883724594594037, 0.24883724594594037], 0.0, 0.0, fill(0.0), [-6.461237959815938 0.0; 0.0 0.0;;; -0.06455233958895452 10.059074305326293; 0.0 0.0;;; 0.01453666265401074 -4.529151153045262; 0.035733159549641055 -3.1853673726340865;;; … ;;; 2.185651803566736e-6 2.939983733331748e-6; -2.1020197866396055e-6 2.2769594810854188e-5;;; 6.413575350526986e-7 8.118082850156805e-6; -2.6281938845417287e-6 -5.2015670950708256e-6;;; 3.216724613459501e-7 -7.86771014197628e-7; 6.657658982750058e-7 1.327187878612661e-6], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.19697053746278903 0.0; 0.0 0.0;;; -0.06982836891659083 0.0; 0.0559260760892909 0.0;;; … ;;; 9.125962831737276e-7 0.0; 1.864939988205681e-6 0.0;;; -4.7557482138149605e-7 0.0; -2.2413312341668466e-7 0.0;;; 4.644704815088655e-8 0.0; -1.1114538610052121e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 0))), MultiBranch{Float64, 2}(UnitRange{Int64}[40:49, 39:53], 0, 10:9, 1, 4, [0.7514632196343085, 0.7494466449374467, 0.2577380583075476], 0.43099875279388133, 0.43099875279388133, [-0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037], [0.24883724594594037, 0.24883724594594037, 0.24883724594594037], 0.0, 0.0, fill(0.0), [-3.3477273311870865 0.0; 0.0 0.0;;; -0.16435855694757204 9.721186791516416; 0.0 0.0;;; 0.12294219903268079 -4.248526417696294; -0.0332377231093299 -4.252662383598009;;; … ;;; -8.13710641459531e-6 2.8580911633519164e-6; -6.231810556349974e-7 6.864144066599249e-6;;; 2.2119897970051911e-7 -2.346400167145746e-6; -3.7089074074201864e-6 -1.3558413583447434e-5;;; -5.605149079948702e-7 1.52790392922525e-6; -7.910253772220518e-7 1.307628828750524e-6], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.1203246909098602 0.0; 0.0 0.0;;; 0.10905156210654654 0.0; -0.06508193456155464 0.0;;; … ;;; -4.7489710223826224e-8 0.0; -1.0937320874843271e-6 0.0;;; -7.162458392092633e-7 0.0; -1.0897602359520343e-6 0.0;;; -2.4771546198069067e-7 0.0; -1.200508235984114e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871127389392, 139871127389408, 139871164557872))), MultiBranch{Float64, 2}(UnitRange{Int64}[50:59, 54:61], 0, 10:9, 1, 5, [0.2537887277424278, 0.251772153045566, 0.7554125501994283], 0.43099875279388133, 0.43099875279388133, [-0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037], [0.24883724594594037, 0.24883724594594037, 0.24883724594594037], 0.0, 0.0, fill(0.0), [-3.768609585113875 0.0; 0.0 0.0;;; -0.0008241017990052862 5.180157724215509; 0.0 0.0;;; -0.13506173196838803 -2.648291420360042; 0.3386931330435938 -1.2864699484118736;;; … ;;; -9.014507135353242e-7 -7.018939476416647e-6; -3.5641213887785376e-6 5.502324767485222e-6;;; -1.5099245250969104e-7 -5.154080100681363e-6; -4.196134456734228e-6 6.012899693515811e-6;;; -1.3480597057727598e-7 3.5575244532127094e-6; -1.0043910673550508e-6 -5.975371881267255e-7], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.11256203287810052 0.0; 0.0 0.0;;; -0.020966539634629522 0.0; -0.029270807438235014 0.0;;; … ;;; 4.475633321570958e-8 0.0; -1.3548142320263519e-8 0.0;;; -6.2495612685646185e-9 0.0; -4.803194607824211e-9 0.0;;; -1.6989228380302114e-11 0.0; 5.039640229144699e-10 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871142209648, 139871905110608, 139869904961536))), MultiBranch{Float64, 2}(UnitRange{Int64}[60:70, 62:69], 0, 10:9, 1, 6, [0.7514632196343085, 0.251772153045566, 0.7554125501994283], 0.43099875279388133, 0.43099875279388133, [-0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037], [0.24883724594594037, 0.24883724594594037, 0.24883724594594037], 0.0, 0.0, fill(0.0), [-6.6995373983658775 0.0; 0.0 0.0;;; -0.226188905136008 3.677475516378436; 0.0 0.0;;; -0.038937156550284735 -2.5171015089578783; -0.29803097221656427 -2.2333489901345933;;; … ;;; -4.152573541563101e-6 2.0044427363543273e-6; -3.6936070425416564e-6 -2.1325029628985765e-6;;; 2.173487342197061e-6 2.868425050078561e-6; -8.071153365030427e-7 -1.950602288335767e-6;;; -5.683976842176204e-7 1.2853220827340282e-6; 6.412124498508532e-7 3.478490587942194e-6], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.1553180709409666 0.0; 0.0 0.0;;; -0.09289808291753082 0.0; 0.11456471052155748 0.0;;; … ;;; 3.1527654798849906e-6 0.0; 1.6142945545284847e-6 0.0;;; -2.80138885224981e-6 0.0; 1.2383970011340801e-6 0.0;;; 1.524189158643975e-7 0.0; -5.614092520865809e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871883680576, 139871883680624, 13))), MultiBranch{Float64, 2}(UnitRange{Int64}[71:84, 70:84], 0, 10:9, 1, 7, [0.2537887277424278, 0.7494466449374467, 0.7554125501994283], 0.43099875279388133, 0.43099875279388133, [-0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037], [0.24883724594594037, 0.24883724594594037, 0.24883724594594037], 0.0, 0.0, fill(0.0), [-5.357829793323234 0.0; 0.0 0.0;;; -0.4061642214854503 9.5704574266076; 0.0 0.0;;; 0.03137691545227036 -3.3376101500858075; -0.23075631586093312 -3.916290355677398;;; … ;;; 3.3014050982660475e-6 -7.670618662800918e-6; -5.208062214551448e-6 -3.057767276954066e-5;;; 2.870869148786357e-6 -6.334327079983546e-6; 1.7481832131259466e-6 1.8943763991561415e-5;;; -4.1528628356866803e-7 3.2824458852436157e-7; 7.872102020772641e-7 4.794973342512074e-7], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.035440982172832425 0.0; 0.0 0.0;;; -0.04873145295472853 0.0; -0.03622519786432454 0.0;;; … ;;; -3.726393398184811e-9 0.0; 1.0306788187000984e-8 0.0;;; -1.6740465940925586e-8 0.0; 1.1078967570105604e-8 0.0;;; 6.868461008583211e-9 0.0; 3.754551936342892e-10 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871169963696, 139871169963792, 139871169963888))), MultiBranch{Float64, 2}(UnitRange{Int64}[85:100, 85:100], 0, 10:9, 1, 8, [0.7514632196343085, 0.7494466449374467, 0.7554125501994283], 0.43099875279388133, 0.43099875279388133, [-0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037], [0.24883724594594037, 0.24883724594594037, 0.24883724594594037], 0.0, 0.0, fill(0.0), [-8.40849371508746 0.0; 0.0 0.0;;; -0.34545740805160585 7.943956858857518; 0.0 0.0;;; 0.22410974134501493 -4.708608165124062; 0.16291416695035782 -4.930830366108012;;; … ;;; -1.05944642054225e-5 -1.954777621277687e-5; 6.8460014106523975e-6 -6.5452749419695515e-6;;; 3.1627420840446823e-6 -4.41582628104629e-6; -4.102198163233976e-7 4.1721490645721465e-6;;; -1.5065578353604211e-6 -1.8535538843153348e-6; -8.642184239884788e-8 2.7630564033119637e-6], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.19104428997795497 0.0; 0.0 0.0;;; -0.01953647940265346 0.0; -0.018191933441142394 0.0;;; … ;;; 3.596095751927648e-8 0.0; -4.4603595930755186e-8 0.0;;; -4.001433464789944e-9 0.0; 5.740532260866596e-10 0.0;;; 9.277122132969723e-11 0.0; 6.446550403600691e-11 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871763235632, 139871763235632, 139871711579904)))], UnitRange{Int64}[1:1, 2:9], [2, 3, 4, 5, 6, 7, 8, 9], ([5, 19, 24, 38, 39, 43, 51, 53, 60, 62  …  20, 29, 45, 52, 54, 58, 76, 82, 83, 99], [16, 18, 46, 56, 57, 58, 62, 64, 66, 73  …  35, 38, 47, 48, 49, 52, 63, 71, 82, 83]), ([40, 26, 85, 50, 1, 86, 27, 60, 61, 87  …  69, 48, 58, 49, 13, 84, 70, 59, 100, 14], [39, 54, 85, 24, 70, 40, 13, 86, 62, 71  …  60, 23, 83, 52, 53, 12, 68, 69, 61, 84]), (Tuple{Main.Body{Float64}, Vector{Float64}}[(Main.Body{Float64}([0.557859214605901, 0.9505794906131003, 0.3404453566099245], 0.009400118805868503, [0.4279926935042637, 0.5792958612811091, 0.7737051496094961, 0.755089351578363]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.4665724969813344, 0.7527119243585907, 0.37990008755992277], 0.008009455207989609, [0.03215302412332721, 0.30401585392069863, 0.39844830923765007, 0.05175624298006909]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.655364218417507, 0.5420094641040476, 0.5949064366117462], 0.00966985017093868, [0.45318687939721236, 0.714833285253085, 0.8014821280258599, 0.0423294989420161]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.46020494037027904, 0.1183049591166877, 0.8455736796675837], 0.009564529506430412, [0.43820774144362595, 0.9864134399623772, 0.5213635902352741, 0.7825393808296219]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.38302007549064776, 0.2610738988132921, 0.38243110265103486], 0.00879050055450757, [0.22661173901939113, 0.6427440609269616, 0.7349829587317898, 0.22440478954784737]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.7675706354227012, 0.6830216562053943, 0.9828525063335046], 0.00030193717698736916, [0.6962187903754538, 0.7485949073619695, 0.6034741867978999, 0.7292786447682762]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.3050424229456674, 0.705503651828581, 0.2161902177875057], 0.0019490720274920647, [0.8645972363970755, 0.5822420927980573, 0.25580361360386095, 0.377504748209773]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.503364457080568, 0.4739102794439455, 0.8882313721777293], 0.007003767860720454, [0.647938265577496, 0.5462740370511083, 0.4481538479575009, 0.42773190354588286]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6419909113170134, 0.3653123773611996, 0.9713497759206838], 0.0043579616572875434, [0.8917110271026161, 0.6439207339714714, 0.5036025955048534, 0.4437995597691393]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5660529652176645, 0.9595746577303932, 0.8477086241617172], 0.0035640681857256975, [0.5419453685002806, 0.3427439265408987, 0.032196858193411226, 0.18518731541358224]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Body{Float64}([0.5828631646060379, 0.34651215147388426, 0.5134178926389176], 0.003926179004732325, [0.0458405367409076, 0.3639566243370217, 0.059578557114454256, 0.9962632355591512]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.879080103813595, 0.6025583064984074, 0.23268830772202231], 0.0008940181927595166, [0.42801386665227803, 0.07046185542048555, 0.6951230120676851, 0.6705048319454384]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.1440075538011215, 0.3067113936734345, 0.6436070688247999], 0.007053929291224028, [0.3997191978718325, 0.013760125081811125, 0.11173714288874481, 0.25455238905806765]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5215814102984935, 0.5258283802989739, 0.3954807490563794], 0.007982359414388152, [0.047033883420560474, 0.9582951819555906, 0.9519215449752892, 0.2567791620738684]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.11881400147042598, 0.011220061279313964, 0.13384862525073793], 0.007187609019877816, [0.7795024398485453, 0.8301151297487197, 0.45918152351480335, 0.25851486922819]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.060512169419791206, 0.7446053256593784, 0.6746307003251895], 0.006094604185275119, [0.906748548471635, 0.11488502630332675, 0.5753095521549699, 0.782094637362603]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.863362101283652, 0.21474704797833044, 0.6503263151978904], 0.00989898695295262, [0.6240429482632586, 0.7906374362304105, 0.7652350423701638, 0.14765296790357707]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.47316473223960553, 0.052497737269379674, 0.8449616700297329], 0.001296483920557443, [0.7700451041031097, 0.7383868768468096, 0.34134557996296455, 0.05993679065745827]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.7449788853899865, 0.5181977584843006, 0.7351146161115111], 0.002153393855190447, [0.4172346693219562, 0.7146733939712135, 0.8797743859260458, 0.7096904549422267]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.0895075005214856, 0.012769070252689807, 0.21717576989610088], 0.007793578077477884, [0.17355753790968675, 0.9885775553410592, 0.05271954177460836, 0.504623980860874]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], Tuple{Main.Vorton{Float64}, Vector{Float64}, Vector{Float64}}[(Main.Vorton{Float64}([0.6930608269351647, 0.5953826990089739, 0.26009741633886674], [0.708975608783004, 0.4394604367174749, 0.6143483139481591], 0.002522113977453815), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.4736959165523619, 0.07319045613465058, 0.5279634023504362], [0.01577213921807452, 0.5769351603895058, 0.46967633280564924], 0.010145707404439529), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.6395805176226315, 0.8837886147365132, 0.7541674014529683], [0.40633052528186975, 0.6551097046413992, 0.8085217817740494], 0.006190339263914765), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.4631722969914098, 0.8141764584094953, 0.34998766001547277], [0.02285921557912396, 0.9620740765684674, 0.8628479339285585], 0.004900731051132423), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.3853667049302918, 0.5281707735578608, 0.7578440632557893], [0.7696437203416594, 0.14268788425911882, 0.9585990358769636], 0.0013076612145550802), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.7235603944754815, 0.6619214652561239, 0.49311973421304267], [0.66472377932795, 0.70181996648594, 0.8606817852554968], 0.00680460850742638), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.866335124889903, 0.44495332387411457, 0.19206496056055744], [0.8783063366197971, 0.5210113642202104, 0.7929108909484469], 0.008296600414482234), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.8005737193684215, 0.9286577650625372, 0.8816670257839777], [0.6607811201396498, 0.3573595306059265, 0.16305322765946628], 0.007574200408496729), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.5841927149409011, 0.27288281477972787, 0.6364104723135541], [0.6254189121396706, 0.5788460814241853, 0.09527339989464556], 0.0027914065402173593), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.4858020455896641, 0.6822544316120533, 0.7421646227295875], [0.03146588273117701, 0.5249122388651134, 0.555380505342661], 0.006004808789025575), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Vorton{Float64}([0.15838432041921613, 0.39137001697762885, 0.8186619053080604], [0.7913811629657576, 0.8078455536303967, 0.967197757866526], 0.007154627189838537), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.9010871797875609, 0.30543205989154054, 0.3090183751720801], [0.025980839293487157, 0.7583642275285837, 0.27292660535811286], 0.009552645635530432), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.1635168706372193, 0.847082049512829, 0.9545070538738755], [0.2608997687416311, 0.6250852449509345, 0.6909582078949791], 0.002189030971528107), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.9490322673395254, 0.7258379023145007, 0.05021538416807836], [0.22751986401005164, 0.7261381551482464, 0.06352652466673381], 0.007063791754264745), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.8816270887574178, 0.9675497691505398, 0.3780627492174078], [0.3884890848560171, 0.0005752088145820622, 0.7417616734381712], 0.008864046920721253), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.16523520089051724, 0.06410102597420109, 0.18210089796362916], [0.5549655695831773, 0.8637860954012616, 0.4944273944361771], 0.006034557502749332), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.8653643258264998, 0.34589851369467783, 0.5379998834582042], [0.7687352179913052, 0.8919604959857386, 0.9957687887352038], 0.0054620417749986425), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.5223337985911936, 0.06597598721050435, 0.9107306211403949], [0.4224941044001491, 0.675471368361827, 0.11124522614496535], 0.0057352215420712685), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.3123303426188978, 0.20983907377630695, 0.8679745830775288], [0.06926277130277392, 0.6643018073630574, 0.1097076813599972], 0.008160475501220016), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.32623912347107686, 0.6519837390279897, 0.7908535323722607], [0.968260540137222, 0.19739786160280937, 0.34581970605657375], 0.007458633600391231), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0])]), Val{5}(), 50), MultiTree{Float64, 2, Tuple{Vector{Tuple{Main.Body{Float64}, Vector{Float64}}}, Vector{Tuple{Main.Vorton{Float64}, Vector{Float64}, Vector{Float64}}}}, 5}(MultiBranch{Float64, 2}[MultiBranch{Float64, 2}(UnitRange{Int64}[1:100, 1:100], 8, 2:9, 0, -1, [0.49801566262999436, 0.49520356617852135, 0.4970227729348794], 0.8574652475891061, 0.8574652475891061, [-0.4950577915163195, 0.4950577915163195, -0.4950577915163195, 0.4950577915163195, -0.4950577915163195, 0.4950577915163195], [0.4950577915163195, 0.4950577915163195, 0.4950577915163195], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871763235632, 139871763235632, 139871763235632))), MultiBranch{Float64, 2}(UnitRange{Int64}[1:14, 1:12], 0, 10:9, 1, 1, [0.2504867668718346, 0.2476746704203616, 0.24949387717671964], 0.42873262379455307, 0.42873262379455307, [-0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976], [0.24752889575815976, 0.24752889575815976, 0.24752889575815976], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.2087012212557283 0.0; 0.0 0.0;;; 0.032545008619530684 0.0; -0.10073458467017052 0.0;;; … ;;; -3.0244533257637133e-6 0.0; 2.2205990602711725e-6 0.0;;; 3.4440032384179833e-7 0.0; 1.036378465235622e-6 0.0;;; 1.1078772330034604e-7 0.0; -9.238829485383542e-10 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871763244640, 139871763235632, 139871134004368))), MultiBranch{Float64, 2}(UnitRange{Int64}[15:32, 13:28], 0, 10:9, 1, 2, [0.7455445583881541, 0.2476746704203616, 0.24949387717671964], 0.42873262379455307, 0.42873262379455307, [-0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976], [0.24752889575815976, 0.24752889575815976, 0.24752889575815976], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.08037135964231336 0.0; -0.0 0.0;;; 0.02983419015864896 0.0; 0.045839845558878545 0.0;;; … ;;; -6.68121229105876e-8 0.0; 1.0788294956364102e-8 0.0;;; 2.014047636416609e-8 0.0; 2.218849378968717e-8 0.0;;; 1.0357976488678172e-9 0.0; -3.9447188056193436e-9 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871763244640, 139871763235632, 413338904475))), MultiBranch{Float64, 2}(UnitRange{Int64}[33:42, 29:38], 0, 10:9, 1, 3, [0.2504867668718346, 0.7427324619366811, 0.24949387717671964], 0.42873262379455307, 0.42873262379455307, [-0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976], [0.24752889575815976, 0.24752889575815976, 0.24752889575815976], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.005684750881457034 0.0; 0.0 0.0;;; 0.10704406745359585 0.0; -0.09016844141035768 0.0;;; … ;;; 1.1261847899409718e-6 0.0; 1.9251347681431154e-6 0.0;;; -8.564267080796984e-8 0.0; -3.0434887744530454e-8 0.0;;; -4.1907926914274465e-7 0.0; 1.570655271058279e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 412685075854))), MultiBranch{Float64, 2}(UnitRange{Int64}[43:55, 39:45], 0, 10:9, 1, 4, [0.7455445583881541, 0.7427324619366811, 0.24949387717671964], 0.42873262379455307, 0.42873262379455307, [-0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976], [0.24752889575815976, 0.24752889575815976, 0.24752889575815976], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.16612807490787934 0.0; -0.0 0.0;;; 0.08268402123633084 0.0; 0.09953827541668359 0.0;;; … ;;; -3.031961319705402e-6 0.0; 1.6908105173106713e-6 0.0;;; 1.8102007820043372e-6 0.0; 6.998654255063502e-7 0.0;;; -9.632481742411246e-8 0.0; -2.865884671640096e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (1, 139871901864272, 139871763235632))), MultiBranch{Float64, 2}(UnitRange{Int64}[56:66, 46:60], 0, 10:9, 1, 5, [0.2504867668718346, 0.2476746704203616, 0.7445516686930391], 0.42873262379455307, 0.42873262379455307, [-0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976], [0.24752889575815976, 0.24752889575815976, 0.24752889575815976], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.04519592028648003 0.0; -0.0 0.0;;; 0.06242853348956448 0.0; -0.11141610116275585 0.0;;; … ;;; 1.0603477834477849e-6 0.0; -4.095341527385005e-8 0.0;;; 2.2784818233315364e-7 0.0; -4.461965845635977e-7 0.0;;; 1.5704628071710524e-7 0.0; 2.3560248012414177e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871139163600, 139871139163648, 431841399430))), MultiBranch{Float64, 2}(UnitRange{Int64}[67:76, 61:73], 0, 10:9, 1, 6, [0.7455445583881541, 0.2476746704203616, 0.7445516686930391], 0.42873262379455307, 0.42873262379455307, [-0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976], [0.24752889575815976, 0.24752889575815976, 0.24752889575815976], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.1675191471527402 0.0; -0.0 0.0;;; -0.0312326202384185 0.0; -0.012016009310730989 0.0;;; … ;;; -3.88205041167155e-8 0.0; -7.661592791364743e-8 0.0;;; -8.888241440564631e-10 0.0; -8.708252780808858e-9 0.0;;; 9.178430149748747e-11 0.0; -3.374678967008055e-10 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871910456976, 139871910424672, 432430299173))), MultiBranch{Float64, 2}(UnitRange{Int64}[77:86, 74:88], 0, 10:9, 1, 7, [0.2504867668718346, 0.7427324619366811, 0.7445516686930391], 0.42873262379455307, 0.42873262379455307, [-0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976], [0.24752889575815976, 0.24752889575815976, 0.24752889575815976], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.11536479335650705 0.0; 0.0 0.0;;; 0.08162535869045275 0.0; -0.0797397471166677 0.0;;; … ;;; -5.740072039305257e-7 0.0; -6.157299676352652e-7 0.0;;; -8.141128652993099e-7 0.0; -3.8078853256653077e-8 0.0;;; -1.204676933958677e-7 0.0; 1.071539282470548e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (20753281979104, 139869904961536, 0))), MultiBranch{Float64, 2}(UnitRange{Int64}[87:100, 89:100], 0, 10:9, 1, 8, [0.7455445583881541, 0.7427324619366811, 0.7445516686930391], 0.42873262379455307, 0.42873262379455307, [-0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976], [0.24752889575815976, 0.24752889575815976, 0.24752889575815976], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.08931169390251703 0.0; 0.0 0.0;;; 0.05003881398609423 0.0; 0.1058375874872798 0.0;;; … ;;; -1.4574817802585404e-7 0.0; -3.657489693104403e-8 0.0;;; -1.3597606331520128e-7 0.0; -6.856603553560549e-7 0.0;;; 1.4726975614088464e-7 0.0; -1.0905852828131589e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871711579904, 139871711579904, 139871763235632)))], UnitRange{Int64}[1:1, 2:9], [2, 3, 4, 5, 6, 7, 8, 9], ([11, 19, 33, 43, 59, 63, 67, 68, 69, 72  …  20, 24, 31, 37, 42, 48, 60, 74, 94, 100], [13, 15, 20, 41, 44, 49, 55, 62, 64, 65  …  22, 23, 24, 33, 54, 59, 66, 74, 75, 92]), ([67, 87, 68, 69, 77, 43, 56, 57, 44, 88  …  12, 55, 30, 99, 31, 32, 13, 66, 14, 100], [13, 89, 14, 61, 62, 46, 47, 39, 48, 74  …  59, 100, 72, 28, 12, 45, 60, 88, 73, 38]), (Tuple{Main.Body{Float64}, Vector{Float64}}[(Main.Body{Float64}([0.9191811597933967, 0.42601923740838954, 0.7465863168484385], 0.00551624732815934, [0.2538490889415096, 0.33415153638191886, 0.4273278808735992, 0.867547200255958]), [85.3506033780559, 0.0, 0.0, 0.0, 8.06249772598236, 20.742132708088107, -29.651179810975506, -108.92907718083855, 1358.7526071212158, -1171.3085492072082  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8192008435733007, 0.9541592624784624, 0.8458950823510601], 0.0014709561750558223, [0.03209667335274724, 0.3505458214588266, 0.9303323763821093, 0.9594335994071538]), [87.38882482263334, 0.0, 0.0, 0.0, -1.100939058319244, 7.474445909530373, 6.699188519856526, 457.93697609693334, -440.6509869868499, -690.8172778072006  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.586748700554989, 0.12181263792534469, 0.7894931647499924], 0.0016174951280755708, [0.8935369466209786, 0.3548676566528912, 0.13179829123412257, 0.9411330896079791]), [101.52858282491175, 0.0, 0.0, 0.0, 9.630211659160361, -2.638210371642431, -8.622154886089199, 0.008429065777369044, 5.233817961002082, -14.797288890588765  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6192588014774537, 0.47764531343080796, 0.8041934288169849], 0.003639098305331564, [0.8236563299357046, 0.45048364263035023, 0.8913769757127503, 0.7110385498005108]), [103.43268574590765, 0.0, 0.0, 0.0, 13.859110768453563, -3.9071367847812035, -8.11395605272161, -27.45516266302689, -9.378570810203593, 22.74100838219483  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.12353811904859124, 0.7400202596259494, 0.7057473220960516], 0.004975260027225807, [0.9340155879013086, 0.753277849991045, 0.7295997282994879, 0.16238042514897943]), [93.32127662551393, 0.0, 0.0, 0.0, -0.15841740325928771, -12.98905722258311, 10.724699909110734, 17.04079689897897, -9.103399047511285, 5.467324335930193  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9919607797239652, 0.8036971367794874, 0.29827230692896456], 0.006659427674753824, [0.4842893268146866, 0.5997019277391098, 0.4536933650141408, 0.3249034202416199]), [69.46581263668925, 0.0, 0.0, 0.0, -5.678810753233454, 13.674421198809798, -4.815599860065737, 11.158614532959072, -17.33922277427247, -12.335120138379066  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.49265789199054244, 0.17985285886739166, 0.6397154045236242], 0.004022070032387327, [0.6922349538863742, 0.7468540519107453, 0.09667869010406493, 0.45910253524716227]), [105.64593566408003, 0.0, 0.0, 0.0, 5.718129941800118, -9.847937002678014, -0.870729449848443, -129.54769381563, -182.518357936482, 153.05445952519017  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.22768758746068596, 0.26780944724527167, 0.8309795986773825], 0.006802835099514221, [0.6911617055492341, 0.821283430881433, 0.5644095995557176, 0.030378874865931382]), [82.48342248428222, 0.0, 0.0, 0.0, -0.7032839479798534, 5.704028315696549, -5.645750346651228, 337.26341798169574, -33.59797397914119, 62.619199827203055  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.621178864455285, 0.7425206336869923, 0.15487161620983314], 0.0010425988209884726, [0.09206661519876747, 0.4379647602849879, 0.23146826213384353, 0.6471427793654219]), [89.54825552075131, 0.0, 0.0, 0.0, -8.803138478520511, 17.31055979004575, -6.379565479954741, -147.41550741185515, -85.31936943654026, 194.62709067291138  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5733898483119126, 0.5900840309886971, 0.7659266276192337], 0.00633005068065063, [0.37737321139310276, 0.2404468114408953, 0.2221494346545283, 0.5096964769051421]), [101.33590365207982, 0.0, 0.0, 0.0, -1.7862929027640466, 21.488498710253474, -18.724753643750333, 382.18022122827057, -513.3572304837079, 226.9480321694559  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Body{Float64}([0.3562026836409853, 0.3635243844573359, 0.309727986680287], 0.0038713948967191466, [0.43490959394031214, 0.0758000769135273, 0.3487409265919944, 0.30331684418426996]), [97.45103071097367, 0.0, 0.0, 0.0, 3.7363343635707627, -2.6450963023691947, 3.5634416109623404, -8.848496519347146, 43.01756318720152, -60.137322799255514  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6547290646713112, 0.8311844039711347, 0.3538049975932579], 0.004154302641783906, [0.5842214092626906, 0.881611313975086, 0.009146364153274189, 0.9806631480861379]), [92.64727615051551, 0.0, 0.0, 0.0, -9.789566006058367, 19.649513017655398, -7.49722317810011, -33.20980996493979, -18.1072460256417, 32.27525647878902  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5388794936906567, 0.04350921485134718, 0.23629199234128806], 0.006559279199653211, [0.9196974029361853, 0.17022568799250704, 0.2638800824351736, 0.6514229873225715]), [81.30366296307194, 0.0, 0.0, 0.0, 5.390598913605371, 3.774600537535236, -7.770998408513131, -10.930957804363196, 15.641140699561106, 5.036619545207673  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5109351365074641, 0.7269107204213763, 0.8057341233600875], 0.002916397428800248, [0.13080774080166646, 0.22271994897768166, 0.6048365813194562, 0.052884966374337816]), [95.25179822463326, 0.0, 0.0, 0.0, 1.4922349492126696, -2.0520727956577445, 6.096890255702781, 1.6238466676321324, 95.41966121366875, -110.55671481774108  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6177567582580967, 0.38039525218264447, 0.37934078500465196], 0.010186078857427224, [0.2366140514268097, 0.31694750597495125, 0.29912838760350746, 0.623451826337517]), [102.86206571255629, 0.0, 0.0, 0.0, 183.22319548422686, -157.6131538178901, 124.89243427616086, 25630.480708536135, -10361.615921711391, -4549.69088770725  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6781091106154422, 0.44334927922889245, 0.36064371233973214], 0.01036251002724151, [0.2743759198193091, 0.7285911206511895, 0.03773808039378912, 0.04331783284230861]), [105.42062571549427, 0.0, 0.0, 0.0, -9.407098849857421, 10.66744635703102, 25.675874823028234, 213.24758539120032, -1.384483145900039, -268.37836906236925  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.20158107237490663, 0.3238946945648584, 0.24399963650509682], 0.009664372151238956, [0.47733204119516204, 0.4603052801344075, 0.9298297825042643, 0.358424742237733]), [89.10879222107357, 0.0, 0.0, 0.0, 0.29518122695650023, -1.5885953056254103, 2.6447317528749124, -0.04062593887656736, -0.3264347540319396, 39.209688879525736  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.18036026635324287, 0.173123936892006, 0.6038823023290261], 0.010016593230124706, [0.4401491209134364, 0.8609926737185056, 0.1638092551671958, 0.22646456871949416]), [85.06258300857247, 0.0, 0.0, 0.0, 9.980583049852275, -8.614757397874126, 1.4048918493255516, 16.304054536182477, -0.9083852185269751, 3.15651612869891  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.072210006218703, 0.3521154604071077, 0.4644130786564624], 0.0037743609975635275, [0.17728847529212788, 0.12630836876865192, 0.9645167219705122, 0.8221674765296613]), [87.35657697788763, 0.0, 0.0, 0.0, 6.631668160458205, -8.880876039620292, 2.2808268003712016, 8.688862460608041, 18.290196257740945, -27.70535302223958  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8247874340282866, 0.5795916665384359, 0.8038668590137469], 0.0035401668870093193, [0.6409979037657155, 0.15911501872567757, 0.5356210909593669, 0.6799181470255188]), [92.93042970237086, 0.0, 0.0, 0.0, 3.579170479759858, 0.5574429880355298, 8.653730501829191, -68.66336036933845, 80.5018410452713, -1.4853866455436502  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], Tuple{Main.Vorton{Float64}, Vector{Float64}, Vector{Float64}}[(Main.Vorton{Float64}([0.6956808381416713, 0.4853785553982539, 0.4648049213765313], [0.7054270031323241, 0.70014541220553, 0.49839208412207514], 0.008389531007170116), [0.0, 0.0, 0.0, 0.0, -0.8822584941683183, 37.933252387002895, -47.88603708257046, -14.946301589562754, 48.53490625653456, 4.048568767978836, 46.10273767416563, -14.937591195125465, -47.65264776236629], [8.50174853254558, 0.3422807467000143, -1.3698895414123198, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.6528326495428173, 0.8783095326823105, 0.6955937752833566], [0.992073216064829, 0.03702391218002421, 0.052040147154059024], 0.008559673062325765), [0.0, 0.0, 0.0, 0.0, 510.46032146257323, -337.29636284298914, -181.21412202984754, -597.077758178114, -40.577188108336635, 470.6252663326008, -572.3709595111981, 1008.0975596281908, -469.8831333542366], [-6.635307494467758, -10.657954792707974, 9.07280276144781, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.9077908593045806, 0.3939808726568609, 0.1924335604037214], [0.5681911381173306, 0.06084849139338322, 0.9611920275200003], 0.00920463305134842), [0.0, 0.0, 0.0, 0.0, -320.3332114842369, -34.58377130895539, 368.0839198461781, 230.13536494966473, 324.9842959812287, -428.13261855501696, 107.45354565095035, -237.813327378721, -4.6510844969917695], [5.002262904567566, 20.106483412927478, -27.95795361610942, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.680305220184172, 0.45142673639459907, 0.6565158730370251], [0.9871517007068787, 0.536191701519787, 0.8044608001295422], 0.01032776912661538), [0.0, 0.0, 0.0, 0.0, 3.5290366718469843, -165.41852935577367, 215.10016845722762, -68.86842304729687, 23.303633729181946, 247.64379943807933, 100.32617617358432, -249.17334079623583, -26.832670401028913], [9.74821219150256, 3.092276196613873, -11.616523984606683, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.5772900725131546, 0.19456471074413395, 0.9691695971486246], [0.029308796906382772, 0.237901194890202, 0.8225322140924277], 0.005855920250376647), [0.0, 0.0, 0.0, 0.0, -12.590937064305567, -5.8931029583027374, -6.052580045726423, -9.567705795412877, 6.983084969341174, -3.8613455886210613, 7.032438744361059, -4.783126247213283, 5.607852094964389], [11.241725102135732, -6.223353028275995, -4.338609044329697, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.07881482026287556, 0.16694384061777157, 0.7453082600322598], [0.36751517071734363, 0.08464781300384328, 0.7877792123673903], 0.006719633426946119), [0.0, 0.0, 0.0, 0.0, 26.415864678954573, -20.050867256931426, -0.8178529266405452, -4.549102666819707, -34.45901507382465, 11.628461542970213, 18.752918414945103, -27.01043418561137, 8.043150394870079], [9.920823853550871, -10.194323634205208, 1.9599671382805932, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.34386745978232425, 0.15114271162865245, 0.8692858825227187], [0.34380421639038017, 0.49221567013213885, 0.7577396026981709], 0.007165314050997217), [0.0, 0.0, 0.0, 0.0, -59.79113188139079, -1.9709498200711613, -26.762698675340847, 54.10917654100488, 45.492034964801626, -261.8421332968958, 164.44096188607392, -25.562476104392736, 14.299096916589178], [14.394628290815083, -3.672764630088914, -9.378589297611173, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.7924111084524182, 0.7258577993874293, 0.4074759819413786], [0.004779849956308646, 0.10815467687383273, 0.6365113178025307], 0.004211825485699923), [0.0, 0.0, 0.0, 0.0, 10.465389536407542, 94.68236585742876, -78.85761169691806, 70.89533439823704, -134.6061639041499, 47.9278980522469, -155.00862689153615, 43.986774759861845, 124.14077436774228], [-17.950340377015056, 21.149992040957308, 1.7437458219519797, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.15007164548253604, 0.13891454905930323, 0.8854146060893755], [0.2322606392244514, 0.24943996074378283, 0.6529923359002099], 0.004730386058191863), [0.0, 0.0, 0.0, 0.0, 59.442434719016205, 26.31264290953867, -7.788753592832606, 63.14513611059529, -47.72166333663818, 20.19110915521419, -57.46819208991416, 29.471415735207678, -11.720771382378052], [14.768178748060738, -8.861646545075095, 1.2188993808980852, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.178892411148747, 0.8198348637351619, 0.746693545507861], [0.05374276809352163, 0.28259697683790064, 0.9963633829133356], 0.004082068996145551), [0.0, 0.0, 0.0, 0.0, 57.050592206607114, -90.21090922096973, 48.878961267701186, -82.68306936940297, 14.29503143257214, 31.74239957362232, 12.320723650538946, 83.85090301869836, -71.34562363917927], [-0.03144901666306661, -15.583012096242426, 13.750015093195545, 0.0, 0.0, 0.0])  …  (Main.Vorton{Float64}([0.4598055261641393, 0.09042082143339258, 0.5640409504623178], [0.6396964311422774, 0.5845421243866575, 0.5349929592419193], 0.001124964196695102), [0.0, 0.0, 0.0, 0.0, 382.09609513254355, 228.00822947658645, -354.08488347129423, -954.163507769204, 241.5556796267648, -189.6437242626885, -169.1205368140404, 434.7509477257039, -623.6517747593078], [20.887342734108213, -2.735476925891841, -5.502211836582691, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.9572197333627137, 0.6426548339644926, 0.6552399747905221], [0.747485027142634, 0.23562083902231445, 0.23561754824795678], 0.0027436327111542455), [0.0, 0.0, 0.0, 0.0, 15.061487372616561, -26.10806509511263, 22.112106061527545, -41.88706206809685, 42.58929055731519, -11.079768202200608, -8.832598907394338, 0.18603518576434164, -57.65077792993176], [0.6561052462927573, 10.15339318367006, -12.7859063446062, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.8050706937073655, 0.005451816228509987, 0.6194543923497148], [0.2893241621284488, 0.15343050371415934, 0.45483197600289493], 0.0033418266341768534), [0.0, 0.0, 0.0, 0.0, -6.235476091786627, 2.7558002187956046, 2.9497273741924195, 10.232663073288112, 3.190253764733486, -17.021401404515075, 0.5779868577948659, -5.568330421328691, 3.0452223270531427], [8.099441084807626, 1.7447616146476344, -9.964573343111939, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.8372242495059112, 0.1880062901030637, 0.329865236819033], [0.6964852800076098, 0.41732935474694366, 0.12800112947157438], 0.008074470339380045), [0.0, 0.0, 0.0, 0.0, 47.94685325237328, -51.324186953826846, 4.847239236476755, -34.28059339724347, 40.769072683232345, 6.830704526226973, 33.07160266107869, 73.1016517686344, -88.71592593560563], [8.754889219586548, -1.8218252892777913, -7.180948488310969, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.049017597531493595, 0.18258465318130024, 0.04079265592099135], [0.6643772290446401, 0.25419876795775076, 0.0111761955710723], 0.006867801058606931), [0.0, 0.0, 0.0, 0.0, -27.31628247323072, 24.233190449744797, -0.3379485823927118, -11.924411796320792, 11.796570800683952, 4.254545828100499, -0.052136141612230326, 2.7632399691705896, 15.519711672546764], [-3.3270429646506385, 1.727457486302319, 2.4540759698751926, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.9446211092215213, 0.5773644194640194, 0.41562195208459896], [0.06814741604330621, 0.16749916233272766, 0.7091985108360725], 0.0031542415121338305), [0.0, 0.0, 0.0, 0.0, 1.8215164214546353, -43.0534679191244, 21.758774568979174, -1.455109738812573, 32.13601155444825, 15.440864606507798, 40.155527530783026, -3.0240868014144886, -33.9575279759029], [-1.4567847361429935, 15.2886865778917, -13.296049302008182, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.02765456454632287, 0.1228176034412326, 0.7897475889795191], [0.5848018551658597, 0.4374509112686895, 0.6003922163899991], 0.0010159571328096377), [0.0, 0.0, 0.0, 0.0, 26.979366295589013, -14.345761341507757, -2.1051658180464075, 8.158019109103137, -26.582227133027917, 11.360653361273496, 4.9604405244283765, -1.6498848360812965, -0.39713916256110293], [8.800785520582927, -8.37524017976289, 1.6105446403166235, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.09100727263849917, 0.5794817445557756, 0.6291868753365321], [0.04589763740992747, 0.2683934891175124, 0.9312357743393328], 0.004951543147051906), [0.0, 0.0, 0.0, 0.0, 7.2826254124701535, 200.02901760661942, -231.96691984886604, -180.55079830561596, 172.343725105568, 48.94235243035011, 203.53488904458027, 29.0355615056544, -179.62635051803812], [-0.04772504081689664, -20.681704217331202, 12.630047100731876, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.7215125397666922, 0.3101399108971986, 0.9120708158457793], [0.036429367243270616, 0.6439997561017691, 0.35149929330560925], 0.0006879838266934451), [0.0, 0.0, 0.0, 0.0, -10.842172139751918, 15.190887004020365, -17.834678493148925, 41.594173476581865, -5.397510782923477, -20.116652682634676, -1.618663520420014, -10.434703724772072, 16.239682922675396], [9.914485943053739, -4.739369747570147, -7.025390474122207, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.07014988405111922, 0.5286443270294893, 0.24380912629526263], [0.620780571763883, 0.8699240224718836, 0.5642401605234335], 0.0003071608128254314), [0.0, 0.0, 0.0, 0.0, 101.93059974405706, 17.590681314952022, -320.9252338856423, 442.5488472353321, -219.0466532545508, -19.474434088571872, -146.04873079853883, 40.3055813981039, 117.11605351049374], [-12.779350368008263, -1.3595250276884299, 13.026821975903577, 0.0, 0.0, 0.0])]), Val{5}(), 50), Tuple{Int32, Int32, Int64}[], StaticArraysCore.SVector{2, Int32}[[2, 2], [3, 2], [4, 2], [5, 2], [6, 2], [7, 2], [8, 2], [9, 2], [2, 3], [3, 3]  …  [8, 8], [9, 8], [2, 9], [3, 9], [4, 9], [5, 9], [6, 9], [7, 9], [8, 9], [9, 9]], (DerivativesSwitch{true, true, true}(), DerivativesSwitch{true, true, true}()))

Non-Potential Flow Applications

As a default, target systems will be evaluated and returned with scalar_potential, velocity, and velocity_gradient fields populated. (Note that the vector potential is not explicitly tracked, though its induced velocity and velocity gradient are.) In some situations, only some of these values may be required. By inputting a boolean vector of the same length as target systems, the user is able to speed up the calculation by not storing unecessary values.

\[\overline{V} = -\nabla \phi + \nabla \times \overline{\psi}\]

$\phi$$\overline{\psi}$$\overline{V}$$\nabla \overline{V}$
fmm! Keyword Argumentsscalar_potentialvector_potentialvelocityvelocity_gradient
Fluid DynamicsScalar PotentialStream FunctionFluid VelocityVelocity Gradient
ElectrostaticsElectric Potential-Electric FieldField Gradient Tensor
Magnetostatics-Magnetic Vector PotentialMagnetic FieldField Gradient Tensor
GravityGravitational Potential-Gravitational AccelerationAcceleration Gradient Tensor
target_one = generate_gravitational(123, 100)
 target_two = generate_vortex(124, 100)
 
 source_one = generate_gravitational(125, 100)
 
 fmm.fmm!((target_one, target_two), source_one, scalar_potential=[true, false],
-    velocity=[true, true], velocity_gradient=[false, false])
(SingleTree{Float64, Vector{Tuple{Main.Body{Float64}, Vector{Float64}}}, 5}(SingleBranch{Float64}[SingleBranch{Float64}(1:100, 8, 2:9, 0, -1, [0.48179464439418035, 0.5006093989915064, 0.5135846646682118], 0.7942993513806789, [-47.330269153011905 0.0; 0.0 0.0;;; -1.0538836054878988 0.0; 0.0 0.0;;; 0.2581437255104949 0.0; 0.3241769757979456 0.0;;; … ;;; -0.0008324020930813904 0.0; 9.584516978454661e-5 0.0;;; 0.00022605569837265318 0.0; 0.00020017373557616356 0.0;;; -4.7885893823454805e-5 0.0; -1.5737437600225257e-5 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715617526768, 139715617526800, 139715636057136))), SingleBranch{Float64}(1:14, 0, 10:9, 1, 1, [0.2329549100757805, 0.2517696646731065, 0.264744930349812], 0.3265477835357854, [-7.499871222570643 0.0; 0.0 0.0;;; 0.15115885475068658 0.0; 0.0 0.0;;; -0.17158929357495725 0.0; -0.0777648798799988 0.0;;; … ;;; 6.654252858858559e-6 0.0; -1.8316443939338635e-6 0.0;;; -2.8303103309810145e-7 0.0; 2.7273127408319682e-6 0.0;;; 2.9804666165177085e-7 0.0; -1.6644760941303057e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.04756916045371112 0.0; 0.0 0.0;;; 0.11950029721020836 0.0; -0.07172370477714746 0.0;;; … ;;; 8.550133810171912e-8 0.0; 1.6784579898460373e-6 0.0;;; -4.1698605699852915e-7 0.0; -6.208168706147225e-7 0.0;;; -3.9671603531577027e-7 0.0; -1.8617110447559723e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 139715636059120))), SingleBranch{Float64}(15:26, 0, 10:9, 1, 2, [0.7306343787125802, 0.2517696646731065, 0.264744930349812], 0.30831197482535866, [-5.832802684288696 0.0; 0.0 0.0;;; -0.005189176663182856 0.0; 0.0 0.0;;; 0.1582145495356849 0.0; 0.12483878435097756 0.0;;; … ;;; 1.0333800330420654e-6 0.0; 2.1651436873723104e-6 0.0;;; 1.9100168243831855e-7 0.0; -6.942365039744032e-7 0.0;;; -5.390551044606302e-8 0.0; 1.718962432915656e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.24867296228910557 0.0; 0.0 0.0;;; -0.04737124340038887 0.0; -0.07388560705327113 0.0;;; … ;;; 3.235212002334253e-6 0.0; -4.5450900955894827e-7 0.0;;; 4.006219960686618e-7 0.0; 4.663794862628542e-7 0.0;;; -1.2450705722005797e-8 0.0; 4.15752280129547e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715548708048, 139715629811904, 139715547449296))), SingleBranch{Float64}(27:41, 0, 10:9, 1, 3, [0.2329549100757805, 0.7494491333099063, 0.264744930349812], 0.3133393912703728, [-6.731488675573531 0.0; 0.0 0.0;;; 0.011383725138952507 0.0; 0.0 0.0;;; 0.11884906341007492 0.0; 0.0205520228753044 0.0;;; … ;;; 1.8722581161649814e-6 0.0; -6.7419225812967e-8 0.0;;; -9.062644865702596e-7 0.0; -1.5023534317429158e-7 0.0;;; -2.656455287517457e-7 0.0; 8.048875834654213e-8 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.07765724046713612 0.0; 0.0 0.0;;; 0.050434238155397104 0.0; 0.12172786138906605 0.0;;; … ;;; 4.667677183204075e-7 0.0; 1.9319306471103751e-7 0.0;;; -3.530577890767353e-10 0.0; -9.75291406287716e-7 0.0;;; 3.0570834143444814e-7 0.0; -1.2679063981438295e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 412661471752))), SingleBranch{Float64}(42:51, 0, 10:9, 1, 4, [0.7306343787125802, 0.7494491333099063, 0.264744930349812], 0.3408505601677704, [-3.3477273311870865 0.0; 0.0 0.0;;; -0.0566248400277272 0.0; 0.0 0.0;;; 0.04904152354120695 0.0; -0.02973987766736967 0.0;;; … ;;; 7.249173251010599e-7 0.0; 5.074506374667067e-7 0.0;;; 8.468210860940043e-7 0.0; -1.2456807327278477e-7 0.0;;; -3.347927899050812e-8 0.0; -9.681924754424843e-8 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.13073581870656742 0.0; 0.0 0.0;;; 0.11181037650546616 0.0; -0.10452648420704336 0.0;;; … ;;; -1.0160480271235289e-6 0.0; -1.2451378868785194e-6 0.0;;; 2.962661148083201e-6 0.0; 4.0127844538127243e-7 0.0;;; -5.709230832090615e-7 0.0; 4.0510620924581994e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715556877920, 139716194018944, 139716194018944))), SingleBranch{Float64}(52:61, 0, 10:9, 1, 5, [0.2329549100757805, 0.2517696646731065, 0.7624243989866117], 0.3333069501704939, [-3.768609585113875 0.0; 0.0 0.0;;; -0.0357550191853654 0.0; 0.0 0.0;;; -0.1622790319362934 0.0; 0.2374254843920229 0.0;;; … ;;; 5.054171256825993e-7 0.0; 2.1360953887201103e-7 0.0;;; 1.7168521207067675e-6 0.0; -1.3242952207629116e-6 0.0;;; 7.062134267230373e-8 0.0; -6.418090365813106e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.08253727104312114 0.0; 0.0 0.0;;; 0.09963596370186342 0.0; 0.12010491108191251 0.0;;; … ;;; 1.4852001534081327e-6 0.0; -8.244360891604843e-7 0.0;;; 1.9003636289989814e-6 0.0; 7.404267587698187e-7 0.0;;; -2.433220053570819e-7 0.0; -7.318297165098047e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 4294967297, 34359738374))), SingleBranch{Float64}(62:71, 0, 10:9, 1, 6, [0.7306343787125802, 0.2517696646731065, 0.7624243989866117], 0.3488011705906093, [-6.65369686162497 0.0; 0.0 0.0;;; -0.3383104942024834 0.0; 0.0 0.0;;; 0.03649267423881712 0.0; -0.2893090476295361 0.0;;; … ;;; -9.56402985926673e-7 0.0; -2.20255221170374e-6 0.0;;; 1.9475670196013723e-6 0.0; 5.641884091364119e-8 0.0;;; -4.831989709346556e-7 0.0; 4.5325239472120987e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.11209808378872133 0.0; 0.0 0.0;;; 0.01851130834738804 0.0; 0.0663638612855359 0.0;;; … ;;; -2.023539833006521e-7 0.0; -1.9030774381678535e-7 0.0;;; 4.885168508702443e-8 0.0; -9.321836212722623e-8 0.0;;; 1.2650776569518706e-8 0.0; 2.705474628027458e-9 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715629811760, 139716387141440, 139716358861776))), SingleBranch{Float64}(72:83, 0, 10:9, 1, 7, [0.2329549100757805, 0.7494491333099063, 0.7624243989866117], 0.3450692261807237, [-4.426804767086749 0.0; 0.0 0.0;;; -0.3360337016850282 0.0; 0.0 0.0;;; 0.13233581753799306 0.0; -0.1606618784997876 0.0;;; … ;;; 1.145856291388403e-6 0.0; -1.464169990620039e-6 0.0;;; 8.006030462781151e-8 0.0; 7.65807034739751e-7 0.0;;; -2.96013940730094e-7 0.0; -7.415444253571641e-8 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.08779369866142228 0.0; 0.0 0.0;;; 0.002421903825263916 0.0; -0.08622137032799465 0.0;;; … ;;; -1.7944822373579807e-8 0.0; 2.1250099265089239e-7 0.0;;; 2.0121075668735017e-7 0.0; 2.269713036538068e-8 0.0;;; 5.568260185387666e-9 0.0; -3.939621445077742e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 139715286138880))), SingleBranch{Float64}(84:100, 0, 10:9, 1, 8, [0.7306343787125802, 0.7494491333099063, 0.7624243989866117], 0.3632962885992695, [-9.069268025566352 0.0; 0.0 0.0;;; -0.3184782843535382 0.0; 0.0 0.0;;; 0.1194356220592298 0.0; 0.1906831133039457 0.0;;; … ;;; -6.760395753091587e-6 0.0; 3.950193566118475e-6 0.0;;; 6.17939008287199e-6 0.0; 5.4487341057922875e-8 0.0;;; -8.913557176706732e-7 0.0; -4.835742324954884e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.027309782875100663 0.0; 0.0 0.0;;; 0.11562568741280282 0.0; 0.007172253338703138 0.0;;; … ;;; -7.594809106792492e-7 0.0; -1.4279872135042865e-7 0.0;;; 1.9869507835358542e-7 0.0; 5.0270283919011154e-8 0.0;;; 1.6560881433529153e-7 0.0; 5.3003918828491525e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715617530640, 139715617530672, 139715635753808)))], UnitRange{Int64}[1:1, 2:9], [2, 3, 4, 5, 6, 7, 8, 9], [5, 19, 24, 38, 39, 43, 51, 53, 60, 62  …  20, 29, 45, 52, 54, 58, 76, 82, 83, 99], [42, 27, 84, 52, 1, 85, 28, 62, 63, 86  …  26, 50, 60, 51, 13, 83, 71, 61, 100, 14], Tuple{Main.Body{Float64}, Vector{Float64}}[(Main.Body{Float64}([0.557859214605901, 0.9505794906131003, 0.3404453566099245], 0.009400118805868503, [0.4279926935042637, 0.5792958612811091, 0.7737051496094961, 0.755089351578363]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.4665724969813344, 0.7527119243585907, 0.37990008755992277], 0.008009455207989609, [0.03215302412332721, 0.30401585392069863, 0.39844830923765007, 0.05175624298006909]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.655364218417507, 0.5420094641040476, 0.5949064366117462], 0.00966985017093868, [0.45318687939721236, 0.714833285253085, 0.8014821280258599, 0.0423294989420161]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.46020494037027904, 0.1183049591166877, 0.8455736796675837], 0.009564529506430412, [0.43820774144362595, 0.9864134399623772, 0.5213635902352741, 0.7825393808296219]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.38302007549064776, 0.2610738988132921, 0.38243110265103486], 0.00879050055450757, [0.22661173901939113, 0.6427440609269616, 0.7349829587317898, 0.22440478954784737]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.7675706354227012, 0.6830216562053943, 0.9828525063335046], 0.00030193717698736916, [0.6962187903754538, 0.7485949073619695, 0.6034741867978999, 0.7292786447682762]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.3050424229456674, 0.705503651828581, 0.2161902177875057], 0.0019490720274920647, [0.8645972363970755, 0.5822420927980573, 0.25580361360386095, 0.377504748209773]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.503364457080568, 0.4739102794439455, 0.8882313721777293], 0.007003767860720454, [0.647938265577496, 0.5462740370511083, 0.4481538479575009, 0.42773190354588286]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6419909113170134, 0.3653123773611996, 0.9713497759206838], 0.0043579616572875434, [0.8917110271026161, 0.6439207339714714, 0.5036025955048534, 0.4437995597691393]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5660529652176645, 0.9595746577303932, 0.8477086241617172], 0.0035640681857256975, [0.5419453685002806, 0.3427439265408987, 0.032196858193411226, 0.18518731541358224]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Body{Float64}([0.5828631646060379, 0.34651215147388426, 0.5134178926389176], 0.003926179004732325, [0.0458405367409076, 0.3639566243370217, 0.059578557114454256, 0.9962632355591512]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.879080103813595, 0.6025583064984074, 0.23268830772202231], 0.0008940181927595166, [0.42801386665227803, 0.07046185542048555, 0.6951230120676851, 0.6705048319454384]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.1440075538011215, 0.3067113936734345, 0.6436070688247999], 0.007053929291224028, [0.3997191978718325, 0.013760125081811125, 0.11173714288874481, 0.25455238905806765]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5215814102984935, 0.5258283802989739, 0.3954807490563794], 0.007982359414388152, [0.047033883420560474, 0.9582951819555906, 0.9519215449752892, 0.2567791620738684]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.11881400147042598, 0.011220061279313964, 0.13384862525073793], 0.007187609019877816, [0.7795024398485453, 0.8301151297487197, 0.45918152351480335, 0.25851486922819]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.060512169419791206, 0.7446053256593784, 0.6746307003251895], 0.006094604185275119, [0.906748548471635, 0.11488502630332675, 0.5753095521549699, 0.782094637362603]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.863362101283652, 0.21474704797833044, 0.6503263151978904], 0.00989898695295262, [0.6240429482632586, 0.7906374362304105, 0.7652350423701638, 0.14765296790357707]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.47316473223960553, 0.052497737269379674, 0.8449616700297329], 0.001296483920557443, [0.7700451041031097, 0.7383868768468096, 0.34134557996296455, 0.05993679065745827]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.7449788853899865, 0.5181977584843006, 0.7351146161115111], 0.002153393855190447, [0.4172346693219562, 0.7146733939712135, 0.8797743859260458, 0.7096904549422267]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.0895075005214856, 0.012769070252689807, 0.21717576989610088], 0.007793578077477884, [0.17355753790968675, 0.9885775553410592, 0.05271954177460836, 0.504623980860874]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], Val{5}(), 50), MultiTree{Float64, 2, Tuple{Vector{Tuple{Main.Body{Float64}, Vector{Float64}}}, Vector{Tuple{Main.Vorton{Float64}, Vector{Float64}, Vector{Float64}}}}, 5}(MultiBranch{Float64, 2}[MultiBranch{Float64, 2}(UnitRange{Int64}[1:100, 1:100], 8, 2:9, 0, -1, [0.49801566262999436, 0.49520356617852135, 0.4970227729348794], 0.8466306954936855, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (43, 139715548802048, 19791209300192))), MultiBranch{Float64, 2}(UnitRange{Int64}[1:14, 1:12], 0, 10:9, 1, 1, [0.250484291582877, 0.24767219513140398, 0.24949140188776203], 0.3409932792863347, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.20869874596677065 0.0; 0.0 0.0;;; 0.03254377097505185 0.0; -0.1007333470256917 0.0;;; … ;;; -3.0242004225390363e-6 0.0; 2.220518533084813e-6 0.0;;; 3.4440717958941495e-7 0.0; 1.0362947825737592e-6 0.0;;; 1.10779535155466e-7 0.0; -9.279862880947665e-10 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 184683593779))), MultiBranch{Float64, 2}(UnitRange{Int64}[15:32, 13:28], 0, 10:9, 1, 2, [0.7455470336771117, 0.24767219513140398, 0.24949140188776203], 0.41243839701263263, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.08037383493127098 0.0; -0.0 0.0;;; 0.029832952514170157 0.0; 0.045838607914399754 0.0;;; … ;;; -6.681267736283102e-8 0.0; 1.0787022507591235e-8 0.0;;; 2.013798665114524e-8 0.0; 2.2186931832707142e-8 0.0;;; 1.035766104639165e-9 0.0; -3.94406701992733e-9 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 413090806128))), MultiBranch{Float64, 2}(UnitRange{Int64}[33:42, 29:38], 0, 10:9, 1, 3, [0.250484291582877, 0.7427349372256387, 0.24949140188776203], 0.36302001867661576, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.005682275592499425 0.0; 0.0 0.0;;; 0.1070453050980747 0.0; -0.0901672037658789 0.0;;; … ;;; 1.1261220844601339e-6 0.0; 1.9251926905735457e-6 0.0;;; -8.56042285355047e-8 0.0; -3.042603195096511e-8 0.0;;; -4.190912879936818e-7 0.0; 1.570402551525783e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715617670192, 139715617670224, 139716387140992))), MultiBranch{Float64, 2}(UnitRange{Int64}[43:55, 39:45], 0, 10:9, 1, 4, [0.7455470336771117, 0.7427349372256387, 0.24949140188776203], 0.34021299765217916, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.16613055019683698 0.0; -0.0 0.0;;; 0.08268525888080963 0.0; 0.09953703777220477 0.0;;; … ;;; -3.0320146510520043e-6 0.0; 1.6910008732197272e-6 0.0;;; 1.8102564368833417e-6 0.0; 6.997748400631538e-7 0.0;;; -9.634351700169127e-8 0.0; -2.865801947471854e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716387143680, 139716387144128, 144866454904))), MultiBranch{Float64, 2}(UnitRange{Int64}[56:66, 46:60], 0, 10:9, 1, 5, [0.250484291582877, 0.24767219513140398, 0.7445541439819967], 0.388254296473148, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.045193444997522404 0.0; -0.0 0.0;;; 0.06242729584508568 0.0; -0.11141486351827706 0.0;;; … ;;; 1.0603068547827958e-6 0.0; -4.096367611186083e-8 0.0;;; 2.2781704857028653e-7 0.0; -4.4615199317580046e-7 0.0;;; 1.5704030148789486e-7 0.0; 2.355840226226345e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (2886218027624, 0, 141733920768))), MultiBranch{Float64, 2}(UnitRange{Int64}[67:76, 61:73], 0, 10:9, 1, 6, [0.7455470336771117, 0.24767219513140398, 0.7445541439819967], 0.3963543727619728, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.1675166718637826 0.0; -0.0 0.0;;; -0.031233857882897335 0.0; -0.012017246955209782 0.0;;; … ;;; -3.881994280756285e-8 0.0; -7.662692826978993e-8 0.0;;; -8.882410817528648e-10 0.0; -8.709864620516205e-9 0.0;;; 9.184208057872618e-11 0.0; -3.37538804975255e-10 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715639032304, 139715639398320, 144866454904))), MultiBranch{Float64, 2}(UnitRange{Int64}[77:86, 74:88], 0, 10:9, 1, 7, [0.250484291582877, 0.7427349372256387, 0.7445541439819967], 0.38464760558362926, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.11536726864546462 0.0; 0.0 0.0;;; 0.08162659633493155 0.0; -0.0797385094721889 0.0;;; … ;;; -5.740272026047589e-7 0.0; -6.158082271289903e-7 0.0;;; -8.141285793603281e-7 0.0; -3.812964472862527e-8 0.0;;; -1.2047601848511563e-7 0.0; 1.0714478559456662e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716302037249, 139716233006112, 0))), MultiBranch{Float64, 2}(UnitRange{Int64}[87:100, 89:100], 0, 10:9, 1, 8, [0.7455470336771117, 0.7427349372256387, 0.7445541439819967], 0.4178937843728946, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.08931416919147463 0.0; 0.0 0.0;;; 0.05004005163057301 0.0; 0.10583634984280096 0.0;;; … ;;; -1.4581381634699428e-7 0.0; -3.658482340494631e-8 0.0;;; -1.36015697237707e-7 0.0; -6.856578817162079e-7 0.0;;; 1.472583701438592e-7 0.0; -1.0906614518136271e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715547110528, 139716240540400, 139715557912112)))], UnitRange{Int64}[1:1, 2:9], [2, 3, 4, 5, 6, 7, 8, 9], ([11, 19, 33, 43, 59, 63, 67, 68, 69, 72  …  20, 24, 31, 37, 42, 48, 60, 74, 94, 100], [13, 15, 20, 41, 44, 49, 55, 62, 64, 65  …  22, 23, 24, 33, 54, 59, 66, 74, 75, 92]), ([67, 87, 68, 69, 77, 43, 56, 57, 44, 88  …  12, 55, 30, 99, 31, 32, 13, 66, 14, 100], [13, 89, 14, 61, 62, 46, 47, 39, 48, 74  …  59, 100, 72, 28, 12, 45, 60, 88, 73, 38]), (Tuple{Main.Body{Float64}, Vector{Float64}}[(Main.Body{Float64}([0.9191811597933967, 0.42601923740838954, 0.7465863168484385], 0.00551624732815934, [0.2538490889415096, 0.33415153638191886, 0.4273278808735992, 0.867547200255958]), [85.35060337805587, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8192008435733007, 0.9541592624784624, 0.8458950823510601], 0.0014709561750558223, [0.03209667335274724, 0.3505458214588266, 0.9303323763821093, 0.9594335994071538]), [87.38882482263334, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.586748700554989, 0.12181263792534469, 0.7894931647499924], 0.0016174951280755708, [0.8935369466209786, 0.3548676566528912, 0.13179829123412257, 0.9411330896079791]), [101.52858282491177, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6192588014774537, 0.47764531343080796, 0.8041934288169849], 0.003639098305331564, [0.8236563299357046, 0.45048364263035023, 0.8913769757127503, 0.7110385498005108]), [103.43268574590765, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.12353811904859124, 0.7400202596259494, 0.7057473220960516], 0.004975260027225807, [0.9340155879013086, 0.753277849991045, 0.7295997282994879, 0.16238042514897943]), [93.32127662551395, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9919607797239652, 0.8036971367794874, 0.29827230692896456], 0.006659427674753824, [0.4842893268146866, 0.5997019277391098, 0.4536933650141408, 0.3249034202416199]), [69.46581263668925, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.49265789199054244, 0.17985285886739166, 0.6397154045236242], 0.004022070032387327, [0.6922349538863742, 0.7468540519107453, 0.09667869010406493, 0.45910253524716227]), [105.64593566408001, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.22768758746068596, 0.26780944724527167, 0.8309795986773825], 0.006802835099514221, [0.6911617055492341, 0.821283430881433, 0.5644095995557176, 0.030378874865931382]), [82.48342248428222, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.621178864455285, 0.7425206336869923, 0.15487161620983314], 0.0010425988209884726, [0.09206661519876747, 0.4379647602849879, 0.23146826213384353, 0.6471427793654219]), [89.54825552075133, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5733898483119126, 0.5900840309886971, 0.7659266276192337], 0.00633005068065063, [0.37737321139310276, 0.2404468114408953, 0.2221494346545283, 0.5096964769051421]), [101.3359036520798, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Body{Float64}([0.3562026836409853, 0.3635243844573359, 0.309727986680287], 0.0038713948967191466, [0.43490959394031214, 0.0758000769135273, 0.3487409265919944, 0.30331684418426996]), [97.45103071097368, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6547290646713112, 0.8311844039711347, 0.3538049975932579], 0.004154302641783906, [0.5842214092626906, 0.881611313975086, 0.009146364153274189, 0.9806631480861379]), [92.64727615051551, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5388794936906567, 0.04350921485134718, 0.23629199234128806], 0.006559279199653211, [0.9196974029361853, 0.17022568799250704, 0.2638800824351736, 0.6514229873225715]), [81.30366296307194, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5109351365074641, 0.7269107204213763, 0.8057341233600875], 0.002916397428800248, [0.13080774080166646, 0.22271994897768166, 0.6048365813194562, 0.052884966374337816]), [95.25179822463329, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6177567582580967, 0.38039525218264447, 0.37934078500465196], 0.010186078857427224, [0.2366140514268097, 0.31694750597495125, 0.29912838760350746, 0.623451826337517]), [102.86206571255629, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6781091106154422, 0.44334927922889245, 0.36064371233973214], 0.01036251002724151, [0.2743759198193091, 0.7285911206511895, 0.03773808039378912, 0.04331783284230861]), [105.42062571549425, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.20158107237490663, 0.3238946945648584, 0.24399963650509682], 0.009664372151238956, [0.47733204119516204, 0.4603052801344075, 0.9298297825042643, 0.358424742237733]), [89.10879222107356, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.18036026635324287, 0.173123936892006, 0.6038823023290261], 0.010016593230124706, [0.4401491209134364, 0.8609926737185056, 0.1638092551671958, 0.22646456871949416]), [85.06258300857247, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.072210006218703, 0.3521154604071077, 0.4644130786564624], 0.0037743609975635275, [0.17728847529212788, 0.12630836876865192, 0.9645167219705122, 0.8221674765296613]), [87.35657697788763, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8247874340282866, 0.5795916665384359, 0.8038668590137469], 0.0035401668870093193, [0.6409979037657155, 0.15911501872567757, 0.5356210909593669, 0.6799181470255188]), [92.93042970237086, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], Tuple{Main.Vorton{Float64}, Vector{Float64}, Vector{Float64}}[(Main.Vorton{Float64}([0.6956808381416713, 0.4853785553982539, 0.4648049213765313], [0.7054270031323241, 0.70014541220553, 0.49839208412207514], 0.008389531007170116), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.6528326495428173, 0.8783095326823105, 0.6955937752833566], [0.992073216064829, 0.03702391218002421, 0.052040147154059024], 0.008559673062325765), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.9077908593045806, 0.3939808726568609, 0.1924335604037214], [0.5681911381173306, 0.06084849139338322, 0.9611920275200003], 0.00920463305134842), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.680305220184172, 0.45142673639459907, 0.6565158730370251], [0.9871517007068787, 0.536191701519787, 0.8044608001295422], 0.01032776912661538), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.5772900725131546, 0.19456471074413395, 0.9691695971486246], [0.029308796906382772, 0.237901194890202, 0.8225322140924277], 0.005855920250376647), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.07881482026287556, 0.16694384061777157, 0.7453082600322598], [0.36751517071734363, 0.08464781300384328, 0.7877792123673903], 0.006719633426946119), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.34386745978232425, 0.15114271162865245, 0.8692858825227187], [0.34380421639038017, 0.49221567013213885, 0.7577396026981709], 0.007165314050997217), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.7924111084524182, 0.7258577993874293, 0.4074759819413786], [0.004779849956308646, 0.10815467687383273, 0.6365113178025307], 0.004211825485699923), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.15007164548253604, 0.13891454905930323, 0.8854146060893755], [0.2322606392244514, 0.24943996074378283, 0.6529923359002099], 0.004730386058191863), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.178892411148747, 0.8198348637351619, 0.746693545507861], [0.05374276809352163, 0.28259697683790064, 0.9963633829133356], 0.004082068996145551), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Vorton{Float64}([0.4598055261641393, 0.09042082143339258, 0.5640409504623178], [0.6396964311422774, 0.5845421243866575, 0.5349929592419193], 0.001124964196695102), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.9572197333627137, 0.6426548339644926, 0.6552399747905221], [0.747485027142634, 0.23562083902231445, 0.23561754824795678], 0.0027436327111542455), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.8050706937073655, 0.005451816228509987, 0.6194543923497148], [0.2893241621284488, 0.15343050371415934, 0.45483197600289493], 0.0033418266341768534), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.8372242495059112, 0.1880062901030637, 0.329865236819033], [0.6964852800076098, 0.41732935474694366, 0.12800112947157438], 0.008074470339380045), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.049017597531493595, 0.18258465318130024, 0.04079265592099135], [0.6643772290446401, 0.25419876795775076, 0.0111761955710723], 0.006867801058606931), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.9446211092215213, 0.5773644194640194, 0.41562195208459896], [0.06814741604330621, 0.16749916233272766, 0.7091985108360725], 0.0031542415121338305), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.02765456454632287, 0.1228176034412326, 0.7897475889795191], [0.5848018551658597, 0.4374509112686895, 0.6003922163899991], 0.0010159571328096377), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.09100727263849917, 0.5794817445557756, 0.6291868753365321], [0.04589763740992747, 0.2683934891175124, 0.9312357743393328], 0.004951543147051906), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.7215125397666922, 0.3101399108971986, 0.9120708158457793], [0.036429367243270616, 0.6439997561017691, 0.35149929330560925], 0.0006879838266934451), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.07014988405111922, 0.5286443270294893, 0.24380912629526263], [0.620780571763883, 0.8699240224718836, 0.5642401605234335], 0.0003071608128254314), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0])]), Val{5}(), 50), StaticArraysCore.SVector{2, Int32}[], (UnitRange{Int64}[1:14, 1:14, 1:14, 1:14, 1:14, 1:14, 1:14, 1:14, 15:32, 15:32  …  77:86, 77:86, 87:100, 87:100, 87:100, 87:100, 87:100, 87:100, 87:100, 87:100], UnitRange{Int64}[1:12, 1:12, 1:12, 1:12, 1:12, 1:12, 1:12, 1:12, 13:28, 13:28  …  74:88, 74:88, 89:100, 89:100, 89:100, 89:100, 89:100, 89:100, 89:100, 89:100]), UnitRange{Int64}[1:14, 15:26, 27:41, 42:51, 52:61, 62:71, 72:83, 84:100, 1:14, 15:26  …  72:83, 84:100, 1:14, 15:26, 27:41, 42:51, 52:61, 62:71, 72:83, 84:100])

Saving Generated Trees

A given fmm! call will typically return a single tree (if performed on the entire system) or two seperate source/target trees (if called on a source and a target). The function call can also be modified to save these trees.

target_filepath = "target_tree"
+    velocity=[true, true], velocity_gradient=[false, false])
(SingleTree{Float64, Vector{Tuple{Main.Body{Float64}, Vector{Float64}}}, 5}(SingleBranch{Float64}[SingleBranch{Float64}(1:100, 8, 2:9, 0, -1, [0.48179464439418035, 0.5006093989915064, 0.5135846646682118], 0.8619975055877627, 0.8619975055877627, [-0.49767449189188073, 0.49767449189188073, -0.49767449189188073, 0.49767449189188073, -0.49767449189188073, 0.49767449189188073], [0.49767449189188073, 0.49767449189188073, 0.49767449189188073], 0.0, 0.0, fill(0.0), [-47.330269153011905 0.0; 0.0 0.0;;; -1.0538836054878957 0.0; 0.0 0.0;;; 0.2581437255104959 0.0; 0.32417697579794513 0.0;;; … ;;; -0.0008324020930813901 0.0; 9.584516978454677e-5 0.0;;; 0.00022605569837265332 0.0; 0.0002001737355761634 0.0;;; -4.788589382345488e-5 0.0; -1.5737437600225223e-5 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 146010703005))), SingleBranch{Float64}(1:14, 0, 10:9, 1, 1, [0.23295739844823998, 0.251772153045566, 0.2647474187222715], 0.43099875279388133, 0.43099875279388133, [-0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037], [0.24883724594594037, 0.24883724594594037, 0.24883724594594037], 0.0, 0.0, fill(0.0), [-7.499871222570643 0.0; 0.0 0.0;;; 0.1511775172236864 0.0; 0.0 0.0;;; -0.17159862481145716 0.0; -0.07777421111649871 0.0;;; … ;;; 6.654374417721039e-6 0.0; -1.8320398726639646e-6 0.0;;; -2.831979898952648e-7 0.0; 2.7274227268680686e-6 0.0;;; 2.980421231232696e-7 0.0; -1.6644915713327277e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.0475716488261706 0.0; 0.0 0.0;;; 0.1195015413964381 0.0; -0.0717249489633772 0.0;;; … ;;; 8.551990292441558e-8 0.0; 1.6785191448426871e-6 0.0;;; -4.1703590062913545e-7 0.0; -6.208746591492499e-7 0.0;;; -3.967431800726344e-7 0.0; -1.8617643569857076e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 141733920768))), SingleBranch{Float64}(15:26, 0, 10:9, 1, 2, [0.7306318903401208, 0.251772153045566, 0.2647474187222715], 0.43099875279388133, 0.43099875279388133, [-0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037], [0.24883724594594037, 0.24883724594594037, 0.24883724594594037], 0.0, 0.0, fill(0.0), [-5.832802684288696 0.0; 0.0 0.0;;; -0.005174662477621744 0.0; 0.0 0.0;;; 0.15820729244290432 0.0; 0.12484604144375797 0.0;;; … ;;; 1.0332065930653744e-6 0.0; 2.1649761195969315e-6 0.0;;; 1.9104310530934324e-7 0.0; -6.94223215499619e-7 0.0;;; -5.3899273439794484e-8 0.0; 1.718878795742581e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.2486704739166461 0.0; 0.0 0.0;;; -0.04736999921415913 0.0; -0.07388436286704142 0.0;;; … ;;; 3.2349671327322305e-6 0.0; -4.544322257288448e-7 0.0;;; 4.005786149725973e-7 0.0; 4.6634514669915355e-7 0.0;;; -1.2450376693078546e-8 0.0; 4.157089031438735e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 141733920768))), SingleBranch{Float64}(27:41, 0, 10:9, 1, 3, [0.23295739844823998, 0.7494466449374467, 0.2647474187222715], 0.43099875279388133, 0.43099875279388133, [-0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037], [0.24883724594594037, 0.24883724594594037, 0.24883724594594037], 0.0, 0.0, fill(0.0), [-6.731488675573531 0.0; 0.0 0.0;;; 0.011400475589984096 0.0; 0.0 0.0;;; 0.1188574386355909 0.0; 0.02054364764978861 0.0;;; … ;;; 1.8724041357624202e-6 0.0; -6.740573259352781e-8 0.0;;; -9.062764401980581e-7 0.0; -1.5028718156848473e-7 0.0;;; -2.656402793225009e-7 0.0; 8.050058723093146e-8 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.0776597288395956 0.0; 0.0 0.0;;; 0.05043299396916734 0.0; 0.12172661720283631 0.0;;; … ;;; 4.666416807814993e-7 0.0; 1.931492763086916e-7 0.0;;; -3.331198811096547e-10 0.0; -9.752745318068186e-7 0.0;;; 3.0569272167597004e-7 0.0; -1.267750090624772e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 141733920768))), SingleBranch{Float64}(42:51, 0, 10:9, 1, 4, [0.7306318903401208, 0.7494466449374467, 0.2647474187222715], 0.43099875279388133, 0.43099875279388133, [-0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037], [0.24883724594594037, 0.24883724594594037, 0.24883724594594037], 0.0, 0.0, fill(0.0), [-3.3477273311870865 0.0; 0.0 0.0;;; -0.05661650963523443 0.0; 0.0 0.0;;; 0.049045688737453436 0.0; -0.029735712471123377 0.0;;; … ;;; 7.249010232689599e-7 0.0; 5.074419050401502e-7 0.0;;; 8.467912089590641e-7 0.0; -1.2457046357912389e-7 0.0;;; -3.3486020944921064e-8 0.0; -9.682938343398542e-8 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.13073333033410794 0.0; 0.0 0.0;;; 0.11180913231923639 0.0; -0.10452524002081365 0.0;;; … ;;; -1.015939496560566e-6 0.0; -1.245007835412755e-6 0.0;;; 2.9624679866733807e-6 0.0; 4.0125695067632e-7 0.0;;; -5.708910699960474e-7 0.0; 4.050818336718332e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 412742661958))), SingleBranch{Float64}(52:61, 0, 10:9, 1, 5, [0.23295739844823998, 0.251772153045566, 0.7624219106141522], 0.43099875279388133, 0.43099875279388133, [-0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037], [0.24883724594594037, 0.24883724594594037, 0.24883724594594037], 0.0, 0.0, fill(0.0), [-3.768609585113875 0.0; 0.0 0.0;;; -0.035764396889667704 0.0; 0.0 0.0;;; -0.16228372078844444 0.0; 0.23742079553987183 0.0;;; … ;;; 5.056014420212356e-7 0.0; 2.136901791719658e-7 0.0;;; 1.7169448653861497e-6 0.0; -1.3242169437551442e-6 0.0;;; 7.066422746939443e-8 0.0; -6.418001947143367e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.08253975941558067 0.0; 0.0 0.0;;; 0.09963720788809316 0.0; 0.12010366689568278 0.0;;; … ;;; 1.4850469385811878e-6 0.0; -8.244164692731008e-7 0.0;;; 1.9004462221190685e-6 0.0; 7.403606419704646e-7 0.0;;; -2.4336181277641484e-7 0.0; -7.318122304914546e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 141733920768))), SingleBranch{Float64}(62:71, 0, 10:9, 1, 6, [0.7306318903401208, 0.251772153045566, 0.7624219106141522], 0.43099875279388133, 0.43099875279388133, [-0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037], [0.24883724594594037, 0.24883724594594037, 0.24883724594594037], 0.0, 0.0, fill(0.0), [-6.65369686162497 0.0; 0.0 0.0;;; -0.33832705107850786 0.0; 0.0 0.0;;; 0.03648439580080508 0.0; -0.2893007691915242 0.0;;; … ;;; -9.56553625327193e-7 0.0; -2.2026067778364347e-6 0.0;;; 1.9474701214310728e-6 0.0; 5.648080340882214e-8 0.0;;; -4.831687600971158e-7 0.0; 4.5322428445436293e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.1120955954162618 0.0; 0.0 0.0;;; 0.018512552533617777 0.0; 0.0663651054717656 0.0;;; … ;;; -2.0236147622849254e-7 0.0; -1.903004423018463e-7 0.0;;; 4.885027079146498e-8 0.0; -9.322703900889062e-8 0.0;;; 1.2652353474943286e-8 0.0; 2.7049821370130747e-9 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 141733920768))), SingleBranch{Float64}(72:83, 0, 10:9, 1, 7, [0.23295739844823998, 0.7494466449374467, 0.7624219106141522], 0.43099875279388133, 0.43099875279388133, [-0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037], [0.24883724594594037, 0.24883724594594037, 0.24883724594594037], 0.0, 0.0, fill(0.0), [-4.426804767086749 0.0; 0.0 0.0;;; -0.33604471722409424 0.0; 0.0 0.0;;; 0.13234132530752615 0.0; -0.1606673862693206 0.0;;; … ;;; 1.1458834355307562e-6 0.0; -1.4643331074881864e-6 0.0;;; 8.012013073683108e-8 0.0; 7.658765166251638e-7 0.0;;; -2.960351828451514e-7 0.0; -7.415640875943139e-8 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.08779121028896275 0.0; 0.0 0.0;;; 0.0024206596390341506 0.0; -0.08622261451422439 0.0;;; … ;;; -1.793369218013121e-8 0.0; 2.1248188421746336e-7 0.0;;; 2.0121767805487402e-7 0.0; 2.2685828324326742e-8 0.0;;; 5.565730178295652e-9 0.0; -3.93993876207998e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 141733920768))), SingleBranch{Float64}(84:100, 0, 10:9, 1, 8, [0.7306318903401208, 0.7494466449374467, 0.7624219106141522], 0.43099875279388133, 0.43099875279388133, [-0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037], [0.24883724594594037, 0.24883724594594037, 0.24883724594594037], 0.0, 0.0, fill(0.0), [-9.069268025566352 0.0; 0.0 0.0;;; -0.31850085207032125 0.0; 0.0 0.0;;; 0.11944690591762133 0.0; 0.1906943971623366 0.0;;; … ;;; -6.760562163890454e-6 0.0; 3.950077335221274e-6 0.0;;; 6.1795388617324575e-6 0.0; 5.467181615162473e-8 0.0;;; -8.913747733183657e-7 0.0; -4.836258226795493e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.027307294502641133 0.0; 0.0 0.0;;; 0.11562444322657306 0.0; 0.007173497524932848 0.0;;; … ;;; -7.594532495054794e-7 0.0; -1.4282037498218524e-7 0.0;;; 1.9866669481961943e-7 0.0; 5.027272869736831e-8 0.0;;; 1.6559747198033837e-7 0.0; 5.301068040987261e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 143930197480)))], UnitRange{Int64}[1:1, 2:9], [2, 3, 4, 5, 6, 7, 8, 9], [5, 19, 24, 38, 39, 43, 51, 53, 60, 62  …  20, 29, 45, 52, 54, 58, 76, 82, 83, 99], [42, 27, 84, 52, 1, 85, 28, 62, 63, 86  …  26, 50, 60, 51, 13, 83, 71, 61, 100, 14], Tuple{Main.Body{Float64}, Vector{Float64}}[(Main.Body{Float64}([0.557859214605901, 0.9505794906131003, 0.3404453566099245], 0.009400118805868503, [0.4279926935042637, 0.5792958612811091, 0.7737051496094961, 0.755089351578363]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.4665724969813344, 0.7527119243585907, 0.37990008755992277], 0.008009455207989609, [0.03215302412332721, 0.30401585392069863, 0.39844830923765007, 0.05175624298006909]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.655364218417507, 0.5420094641040476, 0.5949064366117462], 0.00966985017093868, [0.45318687939721236, 0.714833285253085, 0.8014821280258599, 0.0423294989420161]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.46020494037027904, 0.1183049591166877, 0.8455736796675837], 0.009564529506430412, [0.43820774144362595, 0.9864134399623772, 0.5213635902352741, 0.7825393808296219]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.38302007549064776, 0.2610738988132921, 0.38243110265103486], 0.00879050055450757, [0.22661173901939113, 0.6427440609269616, 0.7349829587317898, 0.22440478954784737]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.7675706354227012, 0.6830216562053943, 0.9828525063335046], 0.00030193717698736916, [0.6962187903754538, 0.7485949073619695, 0.6034741867978999, 0.7292786447682762]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.3050424229456674, 0.705503651828581, 0.2161902177875057], 0.0019490720274920647, [0.8645972363970755, 0.5822420927980573, 0.25580361360386095, 0.377504748209773]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.503364457080568, 0.4739102794439455, 0.8882313721777293], 0.007003767860720454, [0.647938265577496, 0.5462740370511083, 0.4481538479575009, 0.42773190354588286]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6419909113170134, 0.3653123773611996, 0.9713497759206838], 0.0043579616572875434, [0.8917110271026161, 0.6439207339714714, 0.5036025955048534, 0.4437995597691393]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5660529652176645, 0.9595746577303932, 0.8477086241617172], 0.0035640681857256975, [0.5419453685002806, 0.3427439265408987, 0.032196858193411226, 0.18518731541358224]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Body{Float64}([0.5828631646060379, 0.34651215147388426, 0.5134178926389176], 0.003926179004732325, [0.0458405367409076, 0.3639566243370217, 0.059578557114454256, 0.9962632355591512]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.879080103813595, 0.6025583064984074, 0.23268830772202231], 0.0008940181927595166, [0.42801386665227803, 0.07046185542048555, 0.6951230120676851, 0.6705048319454384]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.1440075538011215, 0.3067113936734345, 0.6436070688247999], 0.007053929291224028, [0.3997191978718325, 0.013760125081811125, 0.11173714288874481, 0.25455238905806765]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5215814102984935, 0.5258283802989739, 0.3954807490563794], 0.007982359414388152, [0.047033883420560474, 0.9582951819555906, 0.9519215449752892, 0.2567791620738684]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.11881400147042598, 0.011220061279313964, 0.13384862525073793], 0.007187609019877816, [0.7795024398485453, 0.8301151297487197, 0.45918152351480335, 0.25851486922819]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.060512169419791206, 0.7446053256593784, 0.6746307003251895], 0.006094604185275119, [0.906748548471635, 0.11488502630332675, 0.5753095521549699, 0.782094637362603]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.863362101283652, 0.21474704797833044, 0.6503263151978904], 0.00989898695295262, [0.6240429482632586, 0.7906374362304105, 0.7652350423701638, 0.14765296790357707]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.47316473223960553, 0.052497737269379674, 0.8449616700297329], 0.001296483920557443, [0.7700451041031097, 0.7383868768468096, 0.34134557996296455, 0.05993679065745827]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.7449788853899865, 0.5181977584843006, 0.7351146161115111], 0.002153393855190447, [0.4172346693219562, 0.7146733939712135, 0.8797743859260458, 0.7096904549422267]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.0895075005214856, 0.012769070252689807, 0.21717576989610088], 0.007793578077477884, [0.17355753790968675, 0.9885775553410592, 0.05271954177460836, 0.504623980860874]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], Val{5}(), 50), MultiTree{Float64, 2, Tuple{Vector{Tuple{Main.Body{Float64}, Vector{Float64}}}, Vector{Tuple{Main.Vorton{Float64}, Vector{Float64}, Vector{Float64}}}}, 5}(MultiBranch{Float64, 2}[MultiBranch{Float64, 2}(UnitRange{Int64}[1:100, 1:100], 8, 2:9, 0, -1, [0.49801566262999436, 0.49520356617852135, 0.4970227729348794], 0.8574652475891061, 0.8574652475891061, [-0.4950577915163195, 0.4950577915163195, -0.4950577915163195, 0.4950577915163195, -0.4950577915163195, 0.4950577915163195], [0.4950577915163195, 0.4950577915163195, 0.4950577915163195], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 141733920768))), MultiBranch{Float64, 2}(UnitRange{Int64}[1:14, 1:12], 0, 10:9, 1, 1, [0.2504867668718346, 0.2476746704203616, 0.24949387717671964], 0.42873262379455307, 0.42873262379455307, [-0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976], [0.24752889575815976, 0.24752889575815976, 0.24752889575815976], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.2087012212557283 0.0; 0.0 0.0;;; 0.032545008619530684 0.0; -0.10073458467017052 0.0;;; … ;;; -3.0244533257637133e-6 0.0; 2.2205990602711725e-6 0.0;;; 3.4440032384179833e-7 0.0; 1.036378465235622e-6 0.0;;; 1.1078772330034604e-7 0.0; -9.238829485383542e-10 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 144556828538))), MultiBranch{Float64, 2}(UnitRange{Int64}[15:32, 13:28], 0, 10:9, 1, 2, [0.7455445583881541, 0.2476746704203616, 0.24949387717671964], 0.42873262379455307, 0.42873262379455307, [-0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976], [0.24752889575815976, 0.24752889575815976, 0.24752889575815976], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.08037135964231336 0.0; -0.0 0.0;;; 0.02983419015864896 0.0; 0.045839845558878545 0.0;;; … ;;; -6.68121229105876e-8 0.0; 1.0788294956364102e-8 0.0;;; 2.014047636416609e-8 0.0; 2.218849378968717e-8 0.0;;; 1.0357976488678172e-9 0.0; -3.9447188056193436e-9 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 141733920768))), MultiBranch{Float64, 2}(UnitRange{Int64}[33:42, 29:38], 0, 10:9, 1, 3, [0.2504867668718346, 0.7427324619366811, 0.24949387717671964], 0.42873262379455307, 0.42873262379455307, [-0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976], [0.24752889575815976, 0.24752889575815976, 0.24752889575815976], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.005684750881457034 0.0; 0.0 0.0;;; 0.10704406745359585 0.0; -0.09016844141035768 0.0;;; … ;;; 1.1261847899409718e-6 0.0; 1.9251347681431154e-6 0.0;;; -8.564267080796984e-8 0.0; -3.0434887744530454e-8 0.0;;; -4.1907926914274465e-7 0.0; 1.570655271058279e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 146010703005))), MultiBranch{Float64, 2}(UnitRange{Int64}[43:55, 39:45], 0, 10:9, 1, 4, [0.7455445583881541, 0.7427324619366811, 0.24949387717671964], 0.42873262379455307, 0.42873262379455307, [-0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976], [0.24752889575815976, 0.24752889575815976, 0.24752889575815976], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.16612807490787934 0.0; -0.0 0.0;;; 0.08268402123633084 0.0; 0.09953827541668359 0.0;;; … ;;; -3.031961319705402e-6 0.0; 1.6908105173106713e-6 0.0;;; 1.8102007820043372e-6 0.0; 6.998654255063502e-7 0.0;;; -9.632481742411246e-8 0.0; -2.865884671640096e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 412316860416))), MultiBranch{Float64, 2}(UnitRange{Int64}[56:66, 46:60], 0, 10:9, 1, 5, [0.2504867668718346, 0.2476746704203616, 0.7445516686930391], 0.42873262379455307, 0.42873262379455307, [-0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976], [0.24752889575815976, 0.24752889575815976, 0.24752889575815976], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.04519592028648003 0.0; -0.0 0.0;;; 0.06242853348956448 0.0; -0.11141610116275585 0.0;;; … ;;; 1.0603477834477849e-6 0.0; -4.095341527385005e-8 0.0;;; 2.2784818233315364e-7 0.0; -4.461965845635977e-7 0.0;;; 1.5704628071710524e-7 0.0; 2.3560248012414177e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871086649408, 0, 52))), MultiBranch{Float64, 2}(UnitRange{Int64}[67:76, 61:73], 0, 10:9, 1, 6, [0.7455445583881541, 0.2476746704203616, 0.7445516686930391], 0.42873262379455307, 0.42873262379455307, [-0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976], [0.24752889575815976, 0.24752889575815976, 0.24752889575815976], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.1675191471527402 0.0; -0.0 0.0;;; -0.0312326202384185 0.0; -0.012016009310730989 0.0;;; … ;;; -3.88205041167155e-8 0.0; -7.661592791364743e-8 0.0;;; -8.888241440564631e-10 0.0; -8.708252780808858e-9 0.0;;; 9.178430149748747e-11 0.0; -3.374678967008055e-10 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (73, 73, 76))), MultiBranch{Float64, 2}(UnitRange{Int64}[77:86, 74:88], 0, 10:9, 1, 7, [0.2504867668718346, 0.7427324619366811, 0.7445516686930391], 0.42873262379455307, 0.42873262379455307, [-0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976], [0.24752889575815976, 0.24752889575815976, 0.24752889575815976], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.11536479335650705 0.0; 0.0 0.0;;; 0.08162535869045275 0.0; -0.0797397471166677 0.0;;; … ;;; -5.740072039305257e-7 0.0; -6.157299676352652e-7 0.0;;; -8.141128652993099e-7 0.0; -3.8078853256653077e-8 0.0;;; -1.204676933958677e-7 0.0; 1.071539282470548e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871763244640, 139871763234832, 100))), MultiBranch{Float64, 2}(UnitRange{Int64}[87:100, 89:100], 0, 10:9, 1, 8, [0.7455445583881541, 0.7427324619366811, 0.7445516686930391], 0.42873262379455307, 0.42873262379455307, [-0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976], [0.24752889575815976, 0.24752889575815976, 0.24752889575815976], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.08931169390251703 0.0; 0.0 0.0;;; 0.05003881398609423 0.0; 0.1058375874872798 0.0;;; … ;;; -1.4574817802585404e-7 0.0; -3.657489693104403e-8 0.0;;; -1.3597606331520128e-7 0.0; -6.856603553560549e-7 0.0;;; 1.4726975614088464e-7 0.0; -1.0905852828131589e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (9, 10, 11)))], UnitRange{Int64}[1:1, 2:9], [2, 3, 4, 5, 6, 7, 8, 9], ([11, 19, 33, 43, 59, 63, 67, 68, 69, 72  …  20, 24, 31, 37, 42, 48, 60, 74, 94, 100], [13, 15, 20, 41, 44, 49, 55, 62, 64, 65  …  22, 23, 24, 33, 54, 59, 66, 74, 75, 92]), ([67, 87, 68, 69, 77, 43, 56, 57, 44, 88  …  12, 55, 30, 99, 31, 32, 13, 66, 14, 100], [13, 89, 14, 61, 62, 46, 47, 39, 48, 74  …  59, 100, 72, 28, 12, 45, 60, 88, 73, 38]), (Tuple{Main.Body{Float64}, Vector{Float64}}[(Main.Body{Float64}([0.9191811597933967, 0.42601923740838954, 0.7465863168484385], 0.00551624732815934, [0.2538490889415096, 0.33415153638191886, 0.4273278808735992, 0.867547200255958]), [85.35060337805587, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8192008435733007, 0.9541592624784624, 0.8458950823510601], 0.0014709561750558223, [0.03209667335274724, 0.3505458214588266, 0.9303323763821093, 0.9594335994071538]), [87.38882482263334, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.586748700554989, 0.12181263792534469, 0.7894931647499924], 0.0016174951280755708, [0.8935369466209786, 0.3548676566528912, 0.13179829123412257, 0.9411330896079791]), [101.52858282491177, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6192588014774537, 0.47764531343080796, 0.8041934288169849], 0.003639098305331564, [0.8236563299357046, 0.45048364263035023, 0.8913769757127503, 0.7110385498005108]), [103.43268574590765, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.12353811904859124, 0.7400202596259494, 0.7057473220960516], 0.004975260027225807, [0.9340155879013086, 0.753277849991045, 0.7295997282994879, 0.16238042514897943]), [93.32127662551395, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9919607797239652, 0.8036971367794874, 0.29827230692896456], 0.006659427674753824, [0.4842893268146866, 0.5997019277391098, 0.4536933650141408, 0.3249034202416199]), [69.46581263668925, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.49265789199054244, 0.17985285886739166, 0.6397154045236242], 0.004022070032387327, [0.6922349538863742, 0.7468540519107453, 0.09667869010406493, 0.45910253524716227]), [105.64593566408001, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.22768758746068596, 0.26780944724527167, 0.8309795986773825], 0.006802835099514221, [0.6911617055492341, 0.821283430881433, 0.5644095995557176, 0.030378874865931382]), [82.48342248428222, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.621178864455285, 0.7425206336869923, 0.15487161620983314], 0.0010425988209884726, [0.09206661519876747, 0.4379647602849879, 0.23146826213384353, 0.6471427793654219]), [89.54825552075133, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5733898483119126, 0.5900840309886971, 0.7659266276192337], 0.00633005068065063, [0.37737321139310276, 0.2404468114408953, 0.2221494346545283, 0.5096964769051421]), [101.3359036520798, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Body{Float64}([0.3562026836409853, 0.3635243844573359, 0.309727986680287], 0.0038713948967191466, [0.43490959394031214, 0.0758000769135273, 0.3487409265919944, 0.30331684418426996]), [97.45103071097368, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6547290646713112, 0.8311844039711347, 0.3538049975932579], 0.004154302641783906, [0.5842214092626906, 0.881611313975086, 0.009146364153274189, 0.9806631480861379]), [92.64727615051551, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5388794936906567, 0.04350921485134718, 0.23629199234128806], 0.006559279199653211, [0.9196974029361853, 0.17022568799250704, 0.2638800824351736, 0.6514229873225715]), [81.30366296307194, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5109351365074641, 0.7269107204213763, 0.8057341233600875], 0.002916397428800248, [0.13080774080166646, 0.22271994897768166, 0.6048365813194562, 0.052884966374337816]), [95.25179822463329, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6177567582580967, 0.38039525218264447, 0.37934078500465196], 0.010186078857427224, [0.2366140514268097, 0.31694750597495125, 0.29912838760350746, 0.623451826337517]), [102.86206571255629, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6781091106154422, 0.44334927922889245, 0.36064371233973214], 0.01036251002724151, [0.2743759198193091, 0.7285911206511895, 0.03773808039378912, 0.04331783284230861]), [105.42062571549425, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.20158107237490663, 0.3238946945648584, 0.24399963650509682], 0.009664372151238956, [0.47733204119516204, 0.4603052801344075, 0.9298297825042643, 0.358424742237733]), [89.10879222107356, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.18036026635324287, 0.173123936892006, 0.6038823023290261], 0.010016593230124706, [0.4401491209134364, 0.8609926737185056, 0.1638092551671958, 0.22646456871949416]), [85.06258300857247, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.072210006218703, 0.3521154604071077, 0.4644130786564624], 0.0037743609975635275, [0.17728847529212788, 0.12630836876865192, 0.9645167219705122, 0.8221674765296613]), [87.35657697788763, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8247874340282866, 0.5795916665384359, 0.8038668590137469], 0.0035401668870093193, [0.6409979037657155, 0.15911501872567757, 0.5356210909593669, 0.6799181470255188]), [92.93042970237086, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], Tuple{Main.Vorton{Float64}, Vector{Float64}, Vector{Float64}}[(Main.Vorton{Float64}([0.6956808381416713, 0.4853785553982539, 0.4648049213765313], [0.7054270031323241, 0.70014541220553, 0.49839208412207514], 0.008389531007170116), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.6528326495428173, 0.8783095326823105, 0.6955937752833566], [0.992073216064829, 0.03702391218002421, 0.052040147154059024], 0.008559673062325765), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.9077908593045806, 0.3939808726568609, 0.1924335604037214], [0.5681911381173306, 0.06084849139338322, 0.9611920275200003], 0.00920463305134842), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.680305220184172, 0.45142673639459907, 0.6565158730370251], [0.9871517007068787, 0.536191701519787, 0.8044608001295422], 0.01032776912661538), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.5772900725131546, 0.19456471074413395, 0.9691695971486246], [0.029308796906382772, 0.237901194890202, 0.8225322140924277], 0.005855920250376647), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.07881482026287556, 0.16694384061777157, 0.7453082600322598], [0.36751517071734363, 0.08464781300384328, 0.7877792123673903], 0.006719633426946119), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.34386745978232425, 0.15114271162865245, 0.8692858825227187], [0.34380421639038017, 0.49221567013213885, 0.7577396026981709], 0.007165314050997217), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.7924111084524182, 0.7258577993874293, 0.4074759819413786], [0.004779849956308646, 0.10815467687383273, 0.6365113178025307], 0.004211825485699923), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.15007164548253604, 0.13891454905930323, 0.8854146060893755], [0.2322606392244514, 0.24943996074378283, 0.6529923359002099], 0.004730386058191863), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.178892411148747, 0.8198348637351619, 0.746693545507861], [0.05374276809352163, 0.28259697683790064, 0.9963633829133356], 0.004082068996145551), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Vorton{Float64}([0.4598055261641393, 0.09042082143339258, 0.5640409504623178], [0.6396964311422774, 0.5845421243866575, 0.5349929592419193], 0.001124964196695102), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.9572197333627137, 0.6426548339644926, 0.6552399747905221], [0.747485027142634, 0.23562083902231445, 0.23561754824795678], 0.0027436327111542455), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.8050706937073655, 0.005451816228509987, 0.6194543923497148], [0.2893241621284488, 0.15343050371415934, 0.45483197600289493], 0.0033418266341768534), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.8372242495059112, 0.1880062901030637, 0.329865236819033], [0.6964852800076098, 0.41732935474694366, 0.12800112947157438], 0.008074470339380045), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.049017597531493595, 0.18258465318130024, 0.04079265592099135], [0.6643772290446401, 0.25419876795775076, 0.0111761955710723], 0.006867801058606931), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.9446211092215213, 0.5773644194640194, 0.41562195208459896], [0.06814741604330621, 0.16749916233272766, 0.7091985108360725], 0.0031542415121338305), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.02765456454632287, 0.1228176034412326, 0.7897475889795191], [0.5848018551658597, 0.4374509112686895, 0.6003922163899991], 0.0010159571328096377), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.09100727263849917, 0.5794817445557756, 0.6291868753365321], [0.04589763740992747, 0.2683934891175124, 0.9312357743393328], 0.004951543147051906), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.7215125397666922, 0.3101399108971986, 0.9120708158457793], [0.036429367243270616, 0.6439997561017691, 0.35149929330560925], 0.0006879838266934451), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.07014988405111922, 0.5286443270294893, 0.24380912629526263], [0.620780571763883, 0.8699240224718836, 0.5642401605234335], 0.0003071608128254314), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0])]), Val{5}(), 50), Tuple{Int32, Int32, Int64}[], StaticArraysCore.SVector{2, Int32}[[2, 2], [3, 2], [4, 2], [5, 2], [6, 2], [7, 2], [8, 2], [9, 2], [2, 3], [3, 3]  …  [8, 8], [9, 8], [2, 9], [3, 9], [4, 9], [5, 9], [6, 9], [7, 9], [8, 9], [9, 9]], (DerivativesSwitch{true, true, false}(), DerivativesSwitch{false, true, false}()))

Saving Generated Trees

A given fmm! call will typically return a single tree (if performed on the entire system) or two seperate source/target trees (if called on a source and a target). The function call can also be modified to save these trees.

target_filepath = "target_tree"
 source_filepath = "source_tree"
 
 target_tree, source_tree = fmm.fmm!((target_one, target_two), source_one;
     save_tree_target=true, save_name_target=target_filepath,
-    save_tree_source=true, save_name_source=source_filepath)
(SingleTree{Float64, Vector{Tuple{Main.Body{Float64}, Vector{Float64}}}, 5}(SingleBranch{Float64}[SingleBranch{Float64}(1:100, 8, 2:9, 0, -1, [0.48179464439418035, 0.5006093989915064, 0.5135846646682118], 0.7942993513806789, [-47.330269153011905 0.0; 0.0 0.0;;; -1.0538836054878988 0.0; 0.0 0.0;;; 0.2581437255104949 0.0; 0.3241769757979456 0.0;;; … ;;; -0.0008324020930813904 0.0; 9.584516978454661e-5 0.0;;; 0.00022605569837265318 0.0; 0.00020017373557616356 0.0;;; -4.7885893823454805e-5 0.0; -1.5737437600225257e-5 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715636078016, 139715636078032, 139715286138882))), SingleBranch{Float64}(1:14, 0, 10:9, 1, 1, [0.2329549100757805, 0.2517696646731065, 0.264744930349812], 0.3265477835357854, [-7.499871222570643 0.0; 0.0 0.0;;; 0.15115885475068658 0.0; 0.0 0.0;;; -0.17158929357495725 0.0; -0.0777648798799988 0.0;;; … ;;; 6.654252858858559e-6 0.0; -1.8316443939338635e-6 0.0;;; -2.8303103309810145e-7 0.0; 2.7273127408319682e-6 0.0;;; 2.9804666165177085e-7 0.0; -1.6644760941303057e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.04756916045371112 0.0; 0.0 0.0;;; 0.11950029721020836 0.0; -0.07172370477714746 0.0;;; … ;;; 8.550133810171912e-8 0.0; 1.6784579898460373e-6 0.0;;; -4.1698605699852915e-7 0.0; -6.208168706147225e-7 0.0;;; -3.9671603531577027e-7 0.0; -1.8617110447559723e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716240540464, 139716221544128, 141733920768))), SingleBranch{Float64}(15:26, 0, 10:9, 1, 2, [0.7306343787125802, 0.2517696646731065, 0.264744930349812], 0.30831197482535866, [-5.832802684288696 0.0; 0.0 0.0;;; -0.005189176663182856 0.0; 0.0 0.0;;; 0.1582145495356849 0.0; 0.12483878435097756 0.0;;; … ;;; 1.0333800330420654e-6 0.0; 2.1651436873723104e-6 0.0;;; 1.9100168243831855e-7 0.0; -6.942365039744032e-7 0.0;;; -5.390551044606302e-8 0.0; 1.718962432915656e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.24867296228910557 0.0; 0.0 0.0;;; -0.04737124340038887 0.0; -0.07388560705327113 0.0;;; … ;;; 3.235212002334253e-6 0.0; -4.5450900955894827e-7 0.0;;; 4.006219960686618e-7 0.0; 4.663794862628542e-7 0.0;;; -1.2450705722005797e-8 0.0; 4.15752280129547e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715623603952, 139715623603984, 139715604942992))), SingleBranch{Float64}(27:41, 0, 10:9, 1, 3, [0.2329549100757805, 0.7494491333099063, 0.264744930349812], 0.3133393912703728, [-6.731488675573531 0.0; 0.0 0.0;;; 0.011383725138952507 0.0; 0.0 0.0;;; 0.11884906341007492 0.0; 0.0205520228753044 0.0;;; … ;;; 1.8722581161649814e-6 0.0; -6.7419225812967e-8 0.0;;; -9.062644865702596e-7 0.0; -1.5023534317429158e-7 0.0;;; -2.656455287517457e-7 0.0; 8.048875834654213e-8 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.07765724046713612 0.0; 0.0 0.0;;; 0.050434238155397104 0.0; 0.12172786138906605 0.0;;; … ;;; 4.667677183204075e-7 0.0; 1.9319306471103751e-7 0.0;;; -3.530577890767353e-10 0.0; -9.75291406287716e-7 0.0;;; 3.0570834143444814e-7 0.0; -1.2679063981438295e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715517393665, 139715646494032, 139715517393808))), SingleBranch{Float64}(42:51, 0, 10:9, 1, 4, [0.7306343787125802, 0.7494491333099063, 0.264744930349812], 0.3408505601677704, [-3.3477273311870865 0.0; 0.0 0.0;;; -0.0566248400277272 0.0; 0.0 0.0;;; 0.04904152354120695 0.0; -0.02973987766736967 0.0;;; … ;;; 7.249173251010599e-7 0.0; 5.074506374667067e-7 0.0;;; 8.468210860940043e-7 0.0; -1.2456807327278477e-7 0.0;;; -3.347927899050812e-8 0.0; -9.681924754424843e-8 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.13073581870656742 0.0; 0.0 0.0;;; 0.11181037650546616 0.0; -0.10452648420704336 0.0;;; … ;;; -1.0160480271235289e-6 0.0; -1.2451378868785194e-6 0.0;;; 2.962661148083201e-6 0.0; 4.0127844538127243e-7 0.0;;; -5.709230832090615e-7 0.0; 4.0510620924581994e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715636078368, 139716387140544, 139716240540464))), SingleBranch{Float64}(52:61, 0, 10:9, 1, 5, [0.2329549100757805, 0.2517696646731065, 0.7624243989866117], 0.3333069501704939, [-3.768609585113875 0.0; 0.0 0.0;;; -0.0357550191853654 0.0; 0.0 0.0;;; -0.1622790319362934 0.0; 0.2374254843920229 0.0;;; … ;;; 5.054171256825993e-7 0.0; 2.1360953887201103e-7 0.0;;; 1.7168521207067675e-6 0.0; -1.3242952207629116e-6 0.0;;; 7.062134267230373e-8 0.0; -6.418090365813106e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.08253727104312114 0.0; 0.0 0.0;;; 0.09963596370186342 0.0; 0.12010491108191251 0.0;;; … ;;; 1.4852001534081327e-6 0.0; -8.244360891604843e-7 0.0;;; 1.9003636289989814e-6 0.0; 7.404267587698187e-7 0.0;;; -2.433220053570819e-7 0.0; -7.318297165098047e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 431793782032))), SingleBranch{Float64}(62:71, 0, 10:9, 1, 6, [0.7306343787125802, 0.2517696646731065, 0.7624243989866117], 0.3488011705906093, [-6.65369686162497 0.0; 0.0 0.0;;; -0.3383104942024834 0.0; 0.0 0.0;;; 0.03649267423881712 0.0; -0.2893090476295361 0.0;;; … ;;; -9.56402985926673e-7 0.0; -2.20255221170374e-6 0.0;;; 1.9475670196013723e-6 0.0; 5.641884091364119e-8 0.0;;; -4.831989709346556e-7 0.0; 4.5325239472120987e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.11209808378872133 0.0; 0.0 0.0;;; 0.01851130834738804 0.0; 0.0663638612855359 0.0;;; … ;;; -2.023539833006521e-7 0.0; -1.9030774381678535e-7 0.0;;; 4.885168508702443e-8 0.0; -9.321836212722623e-8 0.0;;; 1.2650776569518706e-8 0.0; 2.705474628027458e-9 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (8, 4, 139715564438032))), SingleBranch{Float64}(72:83, 0, 10:9, 1, 7, [0.2329549100757805, 0.7494491333099063, 0.7624243989866117], 0.3450692261807237, [-4.426804767086749 0.0; 0.0 0.0;;; -0.3360337016850282 0.0; 0.0 0.0;;; 0.13233581753799306 0.0; -0.1606618784997876 0.0;;; … ;;; 1.145856291388403e-6 0.0; -1.464169990620039e-6 0.0;;; 8.006030462781151e-8 0.0; 7.65807034739751e-7 0.0;;; -2.96013940730094e-7 0.0; -7.415444253571641e-8 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.08779369866142228 0.0; 0.0 0.0;;; 0.002421903825263916 0.0; -0.08622137032799465 0.0;;; … ;;; -1.7944822373579807e-8 0.0; 2.1250099265089239e-7 0.0;;; 2.0121075668735017e-7 0.0; 2.269713036538068e-8 0.0;;; 5.568260185387666e-9 0.0; -3.939621445077742e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715636078288, 139716240540400, 139716387192512))), SingleBranch{Float64}(84:100, 0, 10:9, 1, 8, [0.7306343787125802, 0.7494491333099063, 0.7624243989866117], 0.3632962885992695, [-9.069268025566352 0.0; 0.0 0.0;;; -0.3184782843535382 0.0; 0.0 0.0;;; 0.1194356220592298 0.0; 0.1906831133039457 0.0;;; … ;;; -6.760395753091587e-6 0.0; 3.950193566118475e-6 0.0;;; 6.17939008287199e-6 0.0; 5.4487341057922875e-8 0.0;;; -8.913557176706732e-7 0.0; -4.835742324954884e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.027309782875100663 0.0; 0.0 0.0;;; 0.11562568741280282 0.0; 0.007172253338703138 0.0;;; … ;;; -7.594809106792492e-7 0.0; -1.4279872135042865e-7 0.0;;; 1.9869507835358542e-7 0.0; 5.0270283919011154e-8 0.0;;; 1.6560881433529153e-7 0.0; 5.3003918828491525e-8 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715636078576, 139716387140544, 139716387369680)))], UnitRange{Int64}[1:1, 2:9], [2, 3, 4, 5, 6, 7, 8, 9], [5, 19, 24, 38, 39, 43, 51, 53, 60, 62  …  20, 29, 45, 52, 54, 58, 76, 82, 83, 99], [42, 27, 84, 52, 1, 85, 28, 62, 63, 86  …  26, 50, 60, 51, 13, 83, 71, 61, 100, 14], Tuple{Main.Body{Float64}, Vector{Float64}}[(Main.Body{Float64}([0.557859214605901, 0.9505794906131003, 0.3404453566099245], 0.009400118805868503, [0.4279926935042637, 0.5792958612811091, 0.7737051496094961, 0.755089351578363]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.4665724969813344, 0.7527119243585907, 0.37990008755992277], 0.008009455207989609, [0.03215302412332721, 0.30401585392069863, 0.39844830923765007, 0.05175624298006909]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.655364218417507, 0.5420094641040476, 0.5949064366117462], 0.00966985017093868, [0.45318687939721236, 0.714833285253085, 0.8014821280258599, 0.0423294989420161]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.46020494037027904, 0.1183049591166877, 0.8455736796675837], 0.009564529506430412, [0.43820774144362595, 0.9864134399623772, 0.5213635902352741, 0.7825393808296219]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.38302007549064776, 0.2610738988132921, 0.38243110265103486], 0.00879050055450757, [0.22661173901939113, 0.6427440609269616, 0.7349829587317898, 0.22440478954784737]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.7675706354227012, 0.6830216562053943, 0.9828525063335046], 0.00030193717698736916, [0.6962187903754538, 0.7485949073619695, 0.6034741867978999, 0.7292786447682762]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.3050424229456674, 0.705503651828581, 0.2161902177875057], 0.0019490720274920647, [0.8645972363970755, 0.5822420927980573, 0.25580361360386095, 0.377504748209773]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.503364457080568, 0.4739102794439455, 0.8882313721777293], 0.007003767860720454, [0.647938265577496, 0.5462740370511083, 0.4481538479575009, 0.42773190354588286]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6419909113170134, 0.3653123773611996, 0.9713497759206838], 0.0043579616572875434, [0.8917110271026161, 0.6439207339714714, 0.5036025955048534, 0.4437995597691393]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5660529652176645, 0.9595746577303932, 0.8477086241617172], 0.0035640681857256975, [0.5419453685002806, 0.3427439265408987, 0.032196858193411226, 0.18518731541358224]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Body{Float64}([0.5828631646060379, 0.34651215147388426, 0.5134178926389176], 0.003926179004732325, [0.0458405367409076, 0.3639566243370217, 0.059578557114454256, 0.9962632355591512]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.879080103813595, 0.6025583064984074, 0.23268830772202231], 0.0008940181927595166, [0.42801386665227803, 0.07046185542048555, 0.6951230120676851, 0.6705048319454384]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.1440075538011215, 0.3067113936734345, 0.6436070688247999], 0.007053929291224028, [0.3997191978718325, 0.013760125081811125, 0.11173714288874481, 0.25455238905806765]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5215814102984935, 0.5258283802989739, 0.3954807490563794], 0.007982359414388152, [0.047033883420560474, 0.9582951819555906, 0.9519215449752892, 0.2567791620738684]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.11881400147042598, 0.011220061279313964, 0.13384862525073793], 0.007187609019877816, [0.7795024398485453, 0.8301151297487197, 0.45918152351480335, 0.25851486922819]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.060512169419791206, 0.7446053256593784, 0.6746307003251895], 0.006094604185275119, [0.906748548471635, 0.11488502630332675, 0.5753095521549699, 0.782094637362603]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.863362101283652, 0.21474704797833044, 0.6503263151978904], 0.00989898695295262, [0.6240429482632586, 0.7906374362304105, 0.7652350423701638, 0.14765296790357707]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.47316473223960553, 0.052497737269379674, 0.8449616700297329], 0.001296483920557443, [0.7700451041031097, 0.7383868768468096, 0.34134557996296455, 0.05993679065745827]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.7449788853899865, 0.5181977584843006, 0.7351146161115111], 0.002153393855190447, [0.4172346693219562, 0.7146733939712135, 0.8797743859260458, 0.7096904549422267]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.0895075005214856, 0.012769070252689807, 0.21717576989610088], 0.007793578077477884, [0.17355753790968675, 0.9885775553410592, 0.05271954177460836, 0.504623980860874]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], Val{5}(), 50), MultiTree{Float64, 2, Tuple{Vector{Tuple{Main.Body{Float64}, Vector{Float64}}}, Vector{Tuple{Main.Vorton{Float64}, Vector{Float64}, Vector{Float64}}}}, 5}(MultiBranch{Float64, 2}[MultiBranch{Float64, 2}(UnitRange{Int64}[1:100, 1:100], 8, 2:9, 0, -1, [0.49801566262999436, 0.49520356617852135, 0.4970227729348794], 0.8466306954936855, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715623413872, 139715623413904, 412316860416))), MultiBranch{Float64, 2}(UnitRange{Int64}[1:14, 1:12], 0, 10:9, 1, 1, [0.250484291582877, 0.24767219513140398, 0.24949140188776203], 0.3409932792863347, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.20869874596677065 0.0; 0.0 0.0;;; 0.03254377097505185 0.0; -0.1007333470256917 0.0;;; … ;;; -3.0242004225390363e-6 0.0; 2.220518533084813e-6 0.0;;; 3.4440717958941495e-7 0.0; 1.0362947825737592e-6 0.0;;; 1.10779535155466e-7 0.0; -9.279862880947665e-10 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716239803488, 139716239803488, 139716188884736))), MultiBranch{Float64, 2}(UnitRange{Int64}[15:32, 13:28], 0, 10:9, 1, 2, [0.7455470336771117, 0.24767219513140398, 0.24949140188776203], 0.41243839701263263, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.08037383493127098 0.0; -0.0 0.0;;; 0.029832952514170157 0.0; 0.045838607914399754 0.0;;; … ;;; -6.681267736283102e-8 0.0; 1.0787022507591235e-8 0.0;;; 2.013798665114524e-8 0.0; 2.2186931832707142e-8 0.0;;; 1.035766104639165e-9 0.0; -3.94406701992733e-9 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716345268976, 139716345269008, 416007631513))), MultiBranch{Float64, 2}(UnitRange{Int64}[33:42, 29:38], 0, 10:9, 1, 3, [0.250484291582877, 0.7427349372256387, 0.24949140188776203], 0.36302001867661576, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.005682275592499425 0.0; 0.0 0.0;;; 0.1070453050980747 0.0; -0.0901672037658789 0.0;;; … ;;; 1.1261220844601339e-6 0.0; 1.9251926905735457e-6 0.0;;; -8.56042285355047e-8 0.0; -3.042603195096511e-8 0.0;;; -4.190912879936818e-7 0.0; 1.570402551525783e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716341913104, 0, 3))), MultiBranch{Float64, 2}(UnitRange{Int64}[43:55, 39:45], 0, 10:9, 1, 4, [0.7455470336771117, 0.7427349372256387, 0.24949140188776203], 0.34021299765217916, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.16613055019683698 0.0; -0.0 0.0;;; 0.08268525888080963 0.0; 0.09953703777220477 0.0;;; … ;;; -3.0320146510520043e-6 0.0; 1.6910008732197272e-6 0.0;;; 1.8102564368833417e-6 0.0; 6.997748400631538e-7 0.0;;; -9.634351700169127e-8 0.0; -2.865801947471854e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716387369680, 139716387142336, 139715564439088))), MultiBranch{Float64, 2}(UnitRange{Int64}[56:66, 46:60], 0, 10:9, 1, 5, [0.250484291582877, 0.24767219513140398, 0.7445541439819967], 0.388254296473148, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.045193444997522404 0.0; -0.0 0.0;;; 0.06242729584508568 0.0; -0.11141486351827706 0.0;;; … ;;; 1.0603068547827958e-6 0.0; -4.096367611186083e-8 0.0;;; 2.2781704857028653e-7 0.0; -4.4615199317580046e-7 0.0;;; 1.5704030148789486e-7 0.0; 2.355840226226345e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 416087106808))), MultiBranch{Float64, 2}(UnitRange{Int64}[67:76, 61:73], 0, 10:9, 1, 6, [0.7455470336771117, 0.24767219513140398, 0.7445541439819967], 0.3963543727619728, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.1675166718637826 0.0; -0.0 0.0;;; -0.031233857882897335 0.0; -0.012017246955209782 0.0;;; … ;;; -3.881994280756285e-8 0.0; -7.662692826978993e-8 0.0;;; -8.882410817528648e-10 0.0; -8.709864620516205e-9 0.0;;; 9.184208057872618e-11 0.0; -3.37538804975255e-10 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716326969552, 139716387203264, 139716387369680))), MultiBranch{Float64, 2}(UnitRange{Int64}[77:86, 74:88], 0, 10:9, 1, 7, [0.250484291582877, 0.7427349372256387, 0.7445541439819967], 0.38464760558362926, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.11536726864546462 0.0; 0.0 0.0;;; 0.08162659633493155 0.0; -0.0797385094721889 0.0;;; … ;;; -5.740272026047589e-7 0.0; -6.158082271289903e-7 0.0;;; -8.141285793603281e-7 0.0; -3.812964472862527e-8 0.0;;; -1.2047601848511563e-7 0.0; 1.0714478559456662e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139716191120096, 139716387216256, 139715545440240))), MultiBranch{Float64, 2}(UnitRange{Int64}[87:100, 89:100], 0, 10:9, 1, 8, [0.7455470336771117, 0.7427349372256387, 0.7445541439819967], 0.4178937843728946, [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.08931416919147463 0.0; 0.0 0.0;;; 0.05004005163057301 0.0; 0.10583634984280096 0.0;;; … ;;; -1.4581381634699428e-7 0.0; -3.658482340494631e-8 0.0;;; -1.36015697237707e-7 0.0; -6.856578817162079e-7 0.0;;; 1.472583701438592e-7 0.0; -1.0906614518136271e-7 0.0], [0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139715551108736, 139715551110336, 139715546358416)))], UnitRange{Int64}[1:1, 2:9], [2, 3, 4, 5, 6, 7, 8, 9], ([11, 19, 33, 43, 59, 63, 67, 68, 69, 72  …  20, 24, 31, 37, 42, 48, 60, 74, 94, 100], [13, 15, 20, 41, 44, 49, 55, 62, 64, 65  …  22, 23, 24, 33, 54, 59, 66, 74, 75, 92]), ([67, 87, 68, 69, 77, 43, 56, 57, 44, 88  …  12, 55, 30, 99, 31, 32, 13, 66, 14, 100], [13, 89, 14, 61, 62, 46, 47, 39, 48, 74  …  59, 100, 72, 28, 12, 45, 60, 88, 73, 38]), (Tuple{Main.Body{Float64}, Vector{Float64}}[(Main.Body{Float64}([0.9191811597933967, 0.42601923740838954, 0.7465863168484385], 0.00551624732815934, [0.2538490889415096, 0.33415153638191886, 0.4273278808735992, 0.867547200255958]), [170.70120675611167, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8192008435733007, 0.9541592624784624, 0.8458950823510601], 0.0014709561750558223, [0.03209667335274724, 0.3505458214588266, 0.9303323763821093, 0.9594335994071538]), [174.77764964526665, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.586748700554989, 0.12181263792534469, 0.7894931647499924], 0.0016174951280755708, [0.8935369466209786, 0.3548676566528912, 0.13179829123412257, 0.9411330896079791]), [203.0571656498236, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6192588014774537, 0.47764531343080796, 0.8041934288169849], 0.003639098305331564, [0.8236563299357046, 0.45048364263035023, 0.8913769757127503, 0.7110385498005108]), [206.86537149181515, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.12353811904859124, 0.7400202596259494, 0.7057473220960516], 0.004975260027225807, [0.9340155879013086, 0.753277849991045, 0.7295997282994879, 0.16238042514897943]), [186.6425532510278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9919607797239652, 0.8036971367794874, 0.29827230692896456], 0.006659427674753824, [0.4842893268146866, 0.5997019277391098, 0.4536933650141408, 0.3249034202416199]), [138.93162527337853, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.49265789199054244, 0.17985285886739166, 0.6397154045236242], 0.004022070032387327, [0.6922349538863742, 0.7468540519107453, 0.09667869010406493, 0.45910253524716227]), [211.29187132816003, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.22768758746068596, 0.26780944724527167, 0.8309795986773825], 0.006802835099514221, [0.6911617055492341, 0.821283430881433, 0.5644095995557176, 0.030378874865931382]), [164.96684496856452, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.621178864455285, 0.7425206336869923, 0.15487161620983314], 0.0010425988209884726, [0.09206661519876747, 0.4379647602849879, 0.23146826213384353, 0.6471427793654219]), [179.0965110415026, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5733898483119126, 0.5900840309886971, 0.7659266276192337], 0.00633005068065063, [0.37737321139310276, 0.2404468114408953, 0.2221494346545283, 0.5096964769051421]), [202.67180730415947, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Body{Float64}([0.3562026836409853, 0.3635243844573359, 0.309727986680287], 0.0038713948967191466, [0.43490959394031214, 0.0758000769135273, 0.3487409265919944, 0.30331684418426996]), [194.90206142194737, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6547290646713112, 0.8311844039711347, 0.3538049975932579], 0.004154302641783906, [0.5842214092626906, 0.881611313975086, 0.009146364153274189, 0.9806631480861379]), [185.29455230103096, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5388794936906567, 0.04350921485134718, 0.23629199234128806], 0.006559279199653211, [0.9196974029361853, 0.17022568799250704, 0.2638800824351736, 0.6514229873225715]), [162.60732592614377, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5109351365074641, 0.7269107204213763, 0.8057341233600875], 0.002916397428800248, [0.13080774080166646, 0.22271994897768166, 0.6048365813194562, 0.052884966374337816]), [190.5035964492667, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6177567582580967, 0.38039525218264447, 0.37934078500465196], 0.010186078857427224, [0.2366140514268097, 0.31694750597495125, 0.29912838760350746, 0.623451826337517]), [205.7241314251126, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6781091106154422, 0.44334927922889245, 0.36064371233973214], 0.01036251002724151, [0.2743759198193091, 0.7285911206511895, 0.03773808039378912, 0.04331783284230861]), [210.84125143098854, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.20158107237490663, 0.3238946945648584, 0.24399963650509682], 0.009664372151238956, [0.47733204119516204, 0.4603052801344075, 0.9298297825042643, 0.358424742237733]), [178.21758444214709, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.18036026635324287, 0.173123936892006, 0.6038823023290261], 0.010016593230124706, [0.4401491209134364, 0.8609926737185056, 0.1638092551671958, 0.22646456871949416]), [170.1251660171448, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.072210006218703, 0.3521154604071077, 0.4644130786564624], 0.0037743609975635275, [0.17728847529212788, 0.12630836876865192, 0.9645167219705122, 0.8221674765296613]), [174.71315395577525, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8247874340282866, 0.5795916665384359, 0.8038668590137469], 0.0035401668870093193, [0.6409979037657155, 0.15911501872567757, 0.5356210909593669, 0.6799181470255188]), [185.86085940474177, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], Tuple{Main.Vorton{Float64}, Vector{Float64}, Vector{Float64}}[(Main.Vorton{Float64}([0.6956808381416713, 0.4853785553982539, 0.4648049213765313], [0.7054270031323241, 0.70014541220553, 0.49839208412207514], 0.008389531007170116), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.6528326495428173, 0.8783095326823105, 0.6955937752833566], [0.992073216064829, 0.03702391218002421, 0.052040147154059024], 0.008559673062325765), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.9077908593045806, 0.3939808726568609, 0.1924335604037214], [0.5681911381173306, 0.06084849139338322, 0.9611920275200003], 0.00920463305134842), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.680305220184172, 0.45142673639459907, 0.6565158730370251], [0.9871517007068787, 0.536191701519787, 0.8044608001295422], 0.01032776912661538), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.5772900725131546, 0.19456471074413395, 0.9691695971486246], [0.029308796906382772, 0.237901194890202, 0.8225322140924277], 0.005855920250376647), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.07881482026287556, 0.16694384061777157, 0.7453082600322598], [0.36751517071734363, 0.08464781300384328, 0.7877792123673903], 0.006719633426946119), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.34386745978232425, 0.15114271162865245, 0.8692858825227187], [0.34380421639038017, 0.49221567013213885, 0.7577396026981709], 0.007165314050997217), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.7924111084524182, 0.7258577993874293, 0.4074759819413786], [0.004779849956308646, 0.10815467687383273, 0.6365113178025307], 0.004211825485699923), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.15007164548253604, 0.13891454905930323, 0.8854146060893755], [0.2322606392244514, 0.24943996074378283, 0.6529923359002099], 0.004730386058191863), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.178892411148747, 0.8198348637351619, 0.746693545507861], [0.05374276809352163, 0.28259697683790064, 0.9963633829133356], 0.004082068996145551), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Vorton{Float64}([0.4598055261641393, 0.09042082143339258, 0.5640409504623178], [0.6396964311422774, 0.5845421243866575, 0.5349929592419193], 0.001124964196695102), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.9572197333627137, 0.6426548339644926, 0.6552399747905221], [0.747485027142634, 0.23562083902231445, 0.23561754824795678], 0.0027436327111542455), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.8050706937073655, 0.005451816228509987, 0.6194543923497148], [0.2893241621284488, 0.15343050371415934, 0.45483197600289493], 0.0033418266341768534), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.8372242495059112, 0.1880062901030637, 0.329865236819033], [0.6964852800076098, 0.41732935474694366, 0.12800112947157438], 0.008074470339380045), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.049017597531493595, 0.18258465318130024, 0.04079265592099135], [0.6643772290446401, 0.25419876795775076, 0.0111761955710723], 0.006867801058606931), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.9446211092215213, 0.5773644194640194, 0.41562195208459896], [0.06814741604330621, 0.16749916233272766, 0.7091985108360725], 0.0031542415121338305), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.02765456454632287, 0.1228176034412326, 0.7897475889795191], [0.5848018551658597, 0.4374509112686895, 0.6003922163899991], 0.0010159571328096377), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.09100727263849917, 0.5794817445557756, 0.6291868753365321], [0.04589763740992747, 0.2683934891175124, 0.9312357743393328], 0.004951543147051906), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.7215125397666922, 0.3101399108971986, 0.9120708158457793], [0.036429367243270616, 0.6439997561017691, 0.35149929330560925], 0.0006879838266934451), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.07014988405111922, 0.5286443270294893, 0.24380912629526263], [0.620780571763883, 0.8699240224718836, 0.5642401605234335], 0.0003071608128254314), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0])]), Val{5}(), 50), StaticArraysCore.SVector{2, Int32}[], (UnitRange{Int64}[1:14, 1:14, 1:14, 1:14, 1:14, 1:14, 1:14, 1:14, 15:32, 15:32  …  77:86, 77:86, 87:100, 87:100, 87:100, 87:100, 87:100, 87:100, 87:100, 87:100], UnitRange{Int64}[1:12, 1:12, 1:12, 1:12, 1:12, 1:12, 1:12, 1:12, 13:28, 13:28  …  74:88, 74:88, 89:100, 89:100, 89:100, 89:100, 89:100, 89:100, 89:100, 89:100]), UnitRange{Int64}[1:14, 15:26, 27:41, 42:51, 52:61, 62:71, 72:83, 84:100, 1:14, 15:26  …  72:83, 84:100, 1:14, 15:26, 27:41, 42:51, 52:61, 62:71, 72:83, 84:100])
+ save_tree_source=true, save_name_source=source_filepath)
(SingleTree{Float64, Vector{Tuple{Main.Body{Float64}, Vector{Float64}}}, 5}(SingleBranch{Float64}[SingleBranch{Float64}(1:100, 8, 2:9, 0, -1, [0.48179464439418035, 0.5006093989915064, 0.5135846646682118], 0.8619975055877627, 0.8619975055877627, [-0.49767449189188073, 0.49767449189188073, -0.49767449189188073, 0.49767449189188073, -0.49767449189188073, 0.49767449189188073], [0.49767449189188073, 0.49767449189188073, 0.49767449189188073], 0.0, 0.0, fill(0.0), [-47.330269153011905 0.0; 0.0 0.0;;; -1.0538836054878957 0.0; 0.0 0.0;;; 0.2581437255104959 0.0; 0.32417697579794513 0.0;;; … ;;; -0.0008324020930813901 0.0; 9.584516978454677e-5 0.0;;; 0.00022605569837265332 0.0; 0.0002001737355761634 0.0;;; -4.788589382345488e-5 0.0; -1.5737437600225223e-5 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871065156528, 139871065156560, 20))), SingleBranch{Float64}(1:14, 0, 10:9, 1, 1, [0.23295739844823998, 0.251772153045566, 0.2647474187222715], 0.43099875279388133, 0.43099875279388133, [-0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037], [0.24883724594594037, 0.24883724594594037, 0.24883724594594037], 0.0, 0.0, fill(0.0), [-7.499871222570643 0.0; 0.0 0.0;;; 0.1511775172236864 0.0; 0.0 0.0;;; -0.17159862481145716 0.0; -0.07777421111649871 0.0;;; … ;;; 6.654374417721039e-6 0.0; -1.8320398726639646e-6 0.0;;; -2.831979898952648e-7 0.0; 2.7274227268680686e-6 0.0;;; 2.980421231232696e-7 0.0; -1.6644915713327277e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.0475716488261706 0.0; 0.0 0.0;;; 0.1195015413964381 0.0; -0.0717249489633772 0.0;;; … ;;; 8.551990292441558e-8 0.0; 1.6785191448426871e-6 0.0;;; -4.1703590062913545e-7 0.0; -6.208746591492499e-7 0.0;;; -3.967431800726344e-7 0.0; -1.8617643569857076e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871748060384, 139871070596080, 139871055071952))), SingleBranch{Float64}(15:26, 0, 10:9, 1, 2, [0.7306318903401208, 0.251772153045566, 0.2647474187222715], 0.43099875279388133, 0.43099875279388133, [-0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037], [0.24883724594594037, 0.24883724594594037, 0.24883724594594037], 0.0, 0.0, fill(0.0), [-5.832802684288696 0.0; 0.0 0.0;;; -0.005174662477621744 0.0; 0.0 0.0;;; 0.15820729244290432 0.0; 0.12484604144375797 0.0;;; … ;;; 1.0332065930653744e-6 0.0; 2.1649761195969315e-6 0.0;;; 1.9104310530934324e-7 0.0; -6.94223215499619e-7 0.0;;; -5.3899273439794484e-8 0.0; 1.718878795742581e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.2486704739166461 0.0; 0.0 0.0;;; -0.04736999921415913 0.0; -0.07388436286704142 0.0;;; … ;;; 3.2349671327322305e-6 0.0; -4.544322257288448e-7 0.0;;; 4.005786149725973e-7 0.0; 4.6634514669915355e-7 0.0;;; -1.2450376693078546e-8 0.0; 4.157089031438735e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871708759520, 139871708437120, 25))), SingleBranch{Float64}(27:41, 0, 10:9, 1, 3, [0.23295739844823998, 0.7494466449374467, 0.2647474187222715], 0.43099875279388133, 0.43099875279388133, [-0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037], [0.24883724594594037, 0.24883724594594037, 0.24883724594594037], 0.0, 0.0, fill(0.0), [-6.731488675573531 0.0; 0.0 0.0;;; 0.011400475589984096 0.0; 0.0 0.0;;; 0.1188574386355909 0.0; 0.02054364764978861 0.0;;; … ;;; 1.8724041357624202e-6 0.0; -6.740573259352781e-8 0.0;;; -9.062764401980581e-7 0.0; -1.5028718156848473e-7 0.0;;; -2.656402793225009e-7 0.0; 8.050058723093146e-8 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.0776597288395956 0.0; 0.0 0.0;;; 0.05043299396916734 0.0; 0.12172661720283631 0.0;;; … ;;; 4.666416807814993e-7 0.0; 1.931492763086916e-7 0.0;;; -3.331198811096547e-10 0.0; -9.752745318068186e-7 0.0;;; 3.0569272167597004e-7 0.0; -1.267750090624772e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871708759520, 139871708437120, 0))), SingleBranch{Float64}(42:51, 0, 10:9, 1, 4, [0.7306318903401208, 0.7494466449374467, 0.2647474187222715], 0.43099875279388133, 0.43099875279388133, [-0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037], [0.24883724594594037, 0.24883724594594037, 0.24883724594594037], 0.0, 0.0, fill(0.0), [-3.3477273311870865 0.0; 0.0 0.0;;; -0.05661650963523443 0.0; 0.0 0.0;;; 0.049045688737453436 0.0; -0.029735712471123377 0.0;;; … ;;; 7.249010232689599e-7 0.0; 5.074419050401502e-7 0.0;;; 8.467912089590641e-7 0.0; -1.2457046357912389e-7 0.0;;; -3.3486020944921064e-8 0.0; -9.682938343398542e-8 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.13073333033410794 0.0; 0.0 0.0;;; 0.11180913231923639 0.0; -0.10452524002081365 0.0;;; … ;;; -1.015939496560566e-6 0.0; -1.245007835412755e-6 0.0;;; 2.9624679866733807e-6 0.0; 4.0125695067632e-7 0.0;;; -5.708910699960474e-7 0.0; 4.050818336718332e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871065705344, 139871763235568, 0))), SingleBranch{Float64}(52:61, 0, 10:9, 1, 5, [0.23295739844823998, 0.251772153045566, 0.7624219106141522], 0.43099875279388133, 0.43099875279388133, [-0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037], [0.24883724594594037, 0.24883724594594037, 0.24883724594594037], 0.0, 0.0, fill(0.0), [-3.768609585113875 0.0; 0.0 0.0;;; -0.035764396889667704 0.0; 0.0 0.0;;; -0.16228372078844444 0.0; 0.23742079553987183 0.0;;; … ;;; 5.056014420212356e-7 0.0; 2.136901791719658e-7 0.0;;; 1.7169448653861497e-6 0.0; -1.3242169437551442e-6 0.0;;; 7.066422746939443e-8 0.0; -6.418001947143367e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.08253975941558067 0.0; 0.0 0.0;;; 0.09963720788809316 0.0; 0.12010366689568278 0.0;;; … ;;; 1.4850469385811878e-6 0.0; -8.244164692731008e-7 0.0;;; 1.9004462221190685e-6 0.0; 7.403606419704646e-7 0.0;;; -2.4336181277641484e-7 0.0; -7.318122304914546e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871089152464, 139871089152496, 139871909837056))), SingleBranch{Float64}(62:71, 0, 10:9, 1, 6, [0.7306318903401208, 0.251772153045566, 0.7624219106141522], 0.43099875279388133, 0.43099875279388133, [-0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037], [0.24883724594594037, 0.24883724594594037, 0.24883724594594037], 0.0, 0.0, fill(0.0), [-6.65369686162497 0.0; 0.0 0.0;;; -0.33832705107850786 0.0; 0.0 0.0;;; 0.03648439580080508 0.0; -0.2893007691915242 0.0;;; … ;;; -9.56553625327193e-7 0.0; -2.2026067778364347e-6 0.0;;; 1.9474701214310728e-6 0.0; 5.648080340882214e-8 0.0;;; -4.831687600971158e-7 0.0; 4.5322428445436293e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.1120955954162618 0.0; 0.0 0.0;;; 0.018512552533617777 0.0; 0.0663651054717656 0.0;;; … ;;; -2.0236147622849254e-7 0.0; -1.903004423018463e-7 0.0;;; 4.885027079146498e-8 0.0; -9.322703900889062e-8 0.0;;; 1.2652353474943286e-8 0.0; 2.7049821370130747e-9 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871163723504, 139871093974480, 139871041656336))), SingleBranch{Float64}(72:83, 0, 10:9, 1, 7, [0.23295739844823998, 0.7494466449374467, 0.7624219106141522], 0.43099875279388133, 0.43099875279388133, [-0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037], [0.24883724594594037, 0.24883724594594037, 0.24883724594594037], 0.0, 0.0, fill(0.0), [-4.426804767086749 0.0; 0.0 0.0;;; -0.33604471722409424 0.0; 0.0 0.0;;; 0.13234132530752615 0.0; -0.1606673862693206 0.0;;; … ;;; 1.1458834355307562e-6 0.0; -1.4643331074881864e-6 0.0;;; 8.012013073683108e-8 0.0; 7.658765166251638e-7 0.0;;; -2.960351828451514e-7 0.0; -7.415640875943139e-8 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.08779121028896275 0.0; 0.0 0.0;;; 0.0024206596390341506 0.0; -0.08622261451422439 0.0;;; … ;;; -1.793369218013121e-8 0.0; 2.1248188421746336e-7 0.0;;; 2.0121767805487402e-7 0.0; 2.2685828324326742e-8 0.0;;; 5.565730178295652e-9 0.0; -3.93993876207998e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (1, 139871077613328, 0))), SingleBranch{Float64}(84:100, 0, 10:9, 1, 8, [0.7306318903401208, 0.7494466449374467, 0.7624219106141522], 0.43099875279388133, 0.43099875279388133, [-0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037, -0.24883724594594037, 0.24883724594594037], [0.24883724594594037, 0.24883724594594037, 0.24883724594594037], 0.0, 0.0, fill(0.0), [-9.069268025566352 0.0; 0.0 0.0;;; -0.31850085207032125 0.0; 0.0 0.0;;; 0.11944690591762133 0.0; 0.1906943971623366 0.0;;; … ;;; -6.760562163890454e-6 0.0; 3.950077335221274e-6 0.0;;; 6.1795388617324575e-6 0.0; 5.467181615162473e-8 0.0;;; -8.913747733183657e-7 0.0; -4.836258226795493e-7 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.027307294502641133 0.0; 0.0 0.0;;; 0.11562444322657306 0.0; 0.007173497524932848 0.0;;; … ;;; -7.594532495054794e-7 0.0; -1.4282037498218524e-7 0.0;;; 1.9866669481961943e-7 0.0; 5.027272869736831e-8 0.0;;; 1.6559747198033837e-7 0.0; 5.301068040987261e-8 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139869904961760, 139871129610736, 34)))], UnitRange{Int64}[1:1, 2:9], [2, 3, 4, 5, 6, 7, 8, 9], [5, 19, 24, 38, 39, 43, 51, 53, 60, 62  …  20, 29, 45, 52, 54, 58, 76, 82, 83, 99], [42, 27, 84, 52, 1, 85, 28, 62, 63, 86  …  26, 50, 60, 51, 13, 83, 71, 61, 100, 14], Tuple{Main.Body{Float64}, Vector{Float64}}[(Main.Body{Float64}([0.557859214605901, 0.9505794906131003, 0.3404453566099245], 0.009400118805868503, [0.4279926935042637, 0.5792958612811091, 0.7737051496094961, 0.755089351578363]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.4665724969813344, 0.7527119243585907, 0.37990008755992277], 0.008009455207989609, [0.03215302412332721, 0.30401585392069863, 0.39844830923765007, 0.05175624298006909]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.655364218417507, 0.5420094641040476, 0.5949064366117462], 0.00966985017093868, [0.45318687939721236, 0.714833285253085, 0.8014821280258599, 0.0423294989420161]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.46020494037027904, 0.1183049591166877, 0.8455736796675837], 0.009564529506430412, [0.43820774144362595, 0.9864134399623772, 0.5213635902352741, 0.7825393808296219]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.38302007549064776, 0.2610738988132921, 0.38243110265103486], 0.00879050055450757, [0.22661173901939113, 0.6427440609269616, 0.7349829587317898, 0.22440478954784737]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.7675706354227012, 0.6830216562053943, 0.9828525063335046], 0.00030193717698736916, [0.6962187903754538, 0.7485949073619695, 0.6034741867978999, 0.7292786447682762]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.3050424229456674, 0.705503651828581, 0.2161902177875057], 0.0019490720274920647, [0.8645972363970755, 0.5822420927980573, 0.25580361360386095, 0.377504748209773]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.503364457080568, 0.4739102794439455, 0.8882313721777293], 0.007003767860720454, [0.647938265577496, 0.5462740370511083, 0.4481538479575009, 0.42773190354588286]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6419909113170134, 0.3653123773611996, 0.9713497759206838], 0.0043579616572875434, [0.8917110271026161, 0.6439207339714714, 0.5036025955048534, 0.4437995597691393]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5660529652176645, 0.9595746577303932, 0.8477086241617172], 0.0035640681857256975, [0.5419453685002806, 0.3427439265408987, 0.032196858193411226, 0.18518731541358224]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Body{Float64}([0.5828631646060379, 0.34651215147388426, 0.5134178926389176], 0.003926179004732325, [0.0458405367409076, 0.3639566243370217, 0.059578557114454256, 0.9962632355591512]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.879080103813595, 0.6025583064984074, 0.23268830772202231], 0.0008940181927595166, [0.42801386665227803, 0.07046185542048555, 0.6951230120676851, 0.6705048319454384]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.1440075538011215, 0.3067113936734345, 0.6436070688247999], 0.007053929291224028, [0.3997191978718325, 0.013760125081811125, 0.11173714288874481, 0.25455238905806765]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5215814102984935, 0.5258283802989739, 0.3954807490563794], 0.007982359414388152, [0.047033883420560474, 0.9582951819555906, 0.9519215449752892, 0.2567791620738684]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.11881400147042598, 0.011220061279313964, 0.13384862525073793], 0.007187609019877816, [0.7795024398485453, 0.8301151297487197, 0.45918152351480335, 0.25851486922819]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.060512169419791206, 0.7446053256593784, 0.6746307003251895], 0.006094604185275119, [0.906748548471635, 0.11488502630332675, 0.5753095521549699, 0.782094637362603]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.863362101283652, 0.21474704797833044, 0.6503263151978904], 0.00989898695295262, [0.6240429482632586, 0.7906374362304105, 0.7652350423701638, 0.14765296790357707]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.47316473223960553, 0.052497737269379674, 0.8449616700297329], 0.001296483920557443, [0.7700451041031097, 0.7383868768468096, 0.34134557996296455, 0.05993679065745827]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.7449788853899865, 0.5181977584843006, 0.7351146161115111], 0.002153393855190447, [0.4172346693219562, 0.7146733939712135, 0.8797743859260458, 0.7096904549422267]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.0895075005214856, 0.012769070252689807, 0.21717576989610088], 0.007793578077477884, [0.17355753790968675, 0.9885775553410592, 0.05271954177460836, 0.504623980860874]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], Val{5}(), 50), MultiTree{Float64, 2, Tuple{Vector{Tuple{Main.Body{Float64}, Vector{Float64}}}, Vector{Tuple{Main.Vorton{Float64}, Vector{Float64}, Vector{Float64}}}}, 5}(MultiBranch{Float64, 2}[MultiBranch{Float64, 2}(UnitRange{Int64}[1:100, 1:100], 8, 2:9, 0, -1, [0.49801566262999436, 0.49520356617852135, 0.4970227729348794], 0.8574652475891061, 0.8574652475891061, [-0.4950577915163195, 0.4950577915163195, -0.4950577915163195, 0.4950577915163195, -0.4950577915163195, 0.4950577915163195], [0.4950577915163195, 0.4950577915163195, 0.4950577915163195], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (3, 4, 5))), MultiBranch{Float64, 2}(UnitRange{Int64}[1:14, 1:12], 0, 10:9, 1, 1, [0.2504867668718346, 0.2476746704203616, 0.24949387717671964], 0.42873262379455307, 0.42873262379455307, [-0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976], [0.24752889575815976, 0.24752889575815976, 0.24752889575815976], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.2087012212557283 0.0; 0.0 0.0;;; 0.032545008619530684 0.0; -0.10073458467017052 0.0;;; … ;;; -3.0244533257637133e-6 0.0; 2.2205990602711725e-6 0.0;;; 3.4440032384179833e-7 0.0; 1.036378465235622e-6 0.0;;; 1.1078772330034604e-7 0.0; -9.238829485383542e-10 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871910108304, 139871910071120, 0))), MultiBranch{Float64, 2}(UnitRange{Int64}[15:32, 13:28], 0, 10:9, 1, 2, [0.7455445583881541, 0.2476746704203616, 0.24949387717671964], 0.42873262379455307, 0.42873262379455307, [-0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976], [0.24752889575815976, 0.24752889575815976, 0.24752889575815976], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.08037135964231336 0.0; -0.0 0.0;;; 0.02983419015864896 0.0; 0.045839845558878545 0.0;;; … ;;; -6.68121229105876e-8 0.0; 1.0788294956364102e-8 0.0;;; 2.014047636416609e-8 0.0; 2.218849378968717e-8 0.0;;; 1.0357976488678172e-9 0.0; -3.9447188056193436e-9 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (20753281981152, 6208, 0))), MultiBranch{Float64, 2}(UnitRange{Int64}[33:42, 29:38], 0, 10:9, 1, 3, [0.2504867668718346, 0.7427324619366811, 0.24949387717671964], 0.42873262379455307, 0.42873262379455307, [-0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976], [0.24752889575815976, 0.24752889575815976, 0.24752889575815976], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.005684750881457034 0.0; 0.0 0.0;;; 0.10704406745359585 0.0; -0.09016844141035768 0.0;;; … ;;; 1.1261847899409718e-6 0.0; 1.9251347681431154e-6 0.0;;; -8.564267080796984e-8 0.0; -3.0434887744530454e-8 0.0;;; -4.1907926914274465e-7 0.0; 1.570655271058279e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (0, 0, 139871055097664))), MultiBranch{Float64, 2}(UnitRange{Int64}[43:55, 39:45], 0, 10:9, 1, 4, [0.7455445583881541, 0.7427324619366811, 0.24949387717671964], 0.42873262379455307, 0.42873262379455307, [-0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976], [0.24752889575815976, 0.24752889575815976, 0.24752889575815976], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.16612807490787934 0.0; -0.0 0.0;;; 0.08268402123633084 0.0; 0.09953827541668359 0.0;;; … ;;; -3.031961319705402e-6 0.0; 1.6908105173106713e-6 0.0;;; 1.8102007820043372e-6 0.0; 6.998654255063502e-7 0.0;;; -9.632481742411246e-8 0.0; -2.865884671640096e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871910064848, 139871909842432, 51))), MultiBranch{Float64, 2}(UnitRange{Int64}[56:66, 46:60], 0, 10:9, 1, 5, [0.2504867668718346, 0.2476746704203616, 0.7445516686930391], 0.42873262379455307, 0.42873262379455307, [-0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976], [0.24752889575815976, 0.24752889575815976, 0.24752889575815976], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.04519592028648003 0.0; -0.0 0.0;;; 0.06242853348956448 0.0; -0.11141610116275585 0.0;;; … ;;; 1.0603477834477849e-6 0.0; -4.095341527385005e-8 0.0;;; 2.2784818233315364e-7 0.0; -4.461965845635977e-7 0.0;;; 1.5704628071710524e-7 0.0; 2.3560248012414177e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871910064848, 139871909853632, 53))), MultiBranch{Float64, 2}(UnitRange{Int64}[67:76, 61:73], 0, 10:9, 1, 6, [0.7455445583881541, 0.2476746704203616, 0.7445516686930391], 0.42873262379455307, 0.42873262379455307, [-0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976], [0.24752889575815976, 0.24752889575815976, 0.24752889575815976], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; -0.1675191471527402 0.0; -0.0 0.0;;; -0.0312326202384185 0.0; -0.012016009310730989 0.0;;; … ;;; -3.88205041167155e-8 0.0; -7.661592791364743e-8 0.0;;; -8.888241440564631e-10 0.0; -8.708252780808858e-9 0.0;;; 9.178430149748747e-11 0.0; -3.374678967008055e-10 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871065706304, 139871824730784, 57))), MultiBranch{Float64, 2}(UnitRange{Int64}[77:86, 74:88], 0, 10:9, 1, 7, [0.2504867668718346, 0.7427324619366811, 0.7445516686930391], 0.42873262379455307, 0.42873262379455307, [-0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976], [0.24752889575815976, 0.24752889575815976, 0.24752889575815976], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.11536479335650705 0.0; 0.0 0.0;;; 0.08162535869045275 0.0; -0.0797397471166677 0.0;;; … ;;; -5.740072039305257e-7 0.0; -6.157299676352652e-7 0.0;;; -8.141128652993099e-7 0.0; -3.8078853256653077e-8 0.0;;; -1.204676933958677e-7 0.0; 1.071539282470548e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871088728400, 139871763244640, 0))), MultiBranch{Float64, 2}(UnitRange{Int64}[87:100, 89:100], 0, 10:9, 1, 8, [0.7455445583881541, 0.7427324619366811, 0.7445516686930391], 0.42873262379455307, 0.42873262379455307, [-0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976, -0.24752889575815976, 0.24752889575815976], [0.24752889575815976, 0.24752889575815976, 0.24752889575815976], 0.0, 0.0, fill(0.0), [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; … ;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0;;; 0.0 0.0; 0.0 0.0], [1.0 0.0; 0.0 0.0;;; 0.08931169390251703 0.0; 0.0 0.0;;; 0.05003881398609423 0.0; 0.1058375874872798 0.0;;; … ;;; -1.4574817802585404e-7 0.0; -3.657489693104403e-8 0.0;;; -1.3597606331520128e-7 0.0; -6.856603553560549e-7 0.0;;; 1.4726975614088464e-7 0.0; -1.0905852828131589e-7 0.0], ReentrantLock(nothing, 0x00000000, 0x00, Base.GenericCondition{Base.Threads.SpinLock}(Base.IntrusiveLinkedList{Task}(nothing, nothing), Base.Threads.SpinLock(0)), (139871711579904, 139871711579904, 2)))], UnitRange{Int64}[1:1, 2:9], [2, 3, 4, 5, 6, 7, 8, 9], ([11, 19, 33, 43, 59, 63, 67, 68, 69, 72  …  20, 24, 31, 37, 42, 48, 60, 74, 94, 100], [13, 15, 20, 41, 44, 49, 55, 62, 64, 65  …  22, 23, 24, 33, 54, 59, 66, 74, 75, 92]), ([67, 87, 68, 69, 77, 43, 56, 57, 44, 88  …  12, 55, 30, 99, 31, 32, 13, 66, 14, 100], [13, 89, 14, 61, 62, 46, 47, 39, 48, 74  …  59, 100, 72, 28, 12, 45, 60, 88, 73, 38]), (Tuple{Main.Body{Float64}, Vector{Float64}}[(Main.Body{Float64}([0.9191811597933967, 0.42601923740838954, 0.7465863168484385], 0.00551624732815934, [0.2538490889415096, 0.33415153638191886, 0.4273278808735992, 0.867547200255958]), [170.70120675611167, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8192008435733007, 0.9541592624784624, 0.8458950823510601], 0.0014709561750558223, [0.03209667335274724, 0.3505458214588266, 0.9303323763821093, 0.9594335994071538]), [174.77764964526665, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.586748700554989, 0.12181263792534469, 0.7894931647499924], 0.0016174951280755708, [0.8935369466209786, 0.3548676566528912, 0.13179829123412257, 0.9411330896079791]), [203.0571656498236, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6192588014774537, 0.47764531343080796, 0.8041934288169849], 0.003639098305331564, [0.8236563299357046, 0.45048364263035023, 0.8913769757127503, 0.7110385498005108]), [206.86537149181515, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.12353811904859124, 0.7400202596259494, 0.7057473220960516], 0.004975260027225807, [0.9340155879013086, 0.753277849991045, 0.7295997282994879, 0.16238042514897943]), [186.6425532510278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.9919607797239652, 0.8036971367794874, 0.29827230692896456], 0.006659427674753824, [0.4842893268146866, 0.5997019277391098, 0.4536933650141408, 0.3249034202416199]), [138.93162527337853, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.49265789199054244, 0.17985285886739166, 0.6397154045236242], 0.004022070032387327, [0.6922349538863742, 0.7468540519107453, 0.09667869010406493, 0.45910253524716227]), [211.29187132816003, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.22768758746068596, 0.26780944724527167, 0.8309795986773825], 0.006802835099514221, [0.6911617055492341, 0.821283430881433, 0.5644095995557176, 0.030378874865931382]), [164.96684496856452, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.621178864455285, 0.7425206336869923, 0.15487161620983314], 0.0010425988209884726, [0.09206661519876747, 0.4379647602849879, 0.23146826213384353, 0.6471427793654219]), [179.0965110415026, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5733898483119126, 0.5900840309886971, 0.7659266276192337], 0.00633005068065063, [0.37737321139310276, 0.2404468114408953, 0.2221494346545283, 0.5096964769051421]), [202.67180730415947, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Body{Float64}([0.3562026836409853, 0.3635243844573359, 0.309727986680287], 0.0038713948967191466, [0.43490959394031214, 0.0758000769135273, 0.3487409265919944, 0.30331684418426996]), [194.90206142194737, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6547290646713112, 0.8311844039711347, 0.3538049975932579], 0.004154302641783906, [0.5842214092626906, 0.881611313975086, 0.009146364153274189, 0.9806631480861379]), [185.29455230103096, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5388794936906567, 0.04350921485134718, 0.23629199234128806], 0.006559279199653211, [0.9196974029361853, 0.17022568799250704, 0.2638800824351736, 0.6514229873225715]), [162.60732592614377, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.5109351365074641, 0.7269107204213763, 0.8057341233600875], 0.002916397428800248, [0.13080774080166646, 0.22271994897768166, 0.6048365813194562, 0.052884966374337816]), [190.5035964492667, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6177567582580967, 0.38039525218264447, 0.37934078500465196], 0.010186078857427224, [0.2366140514268097, 0.31694750597495125, 0.29912838760350746, 0.623451826337517]), [205.7241314251126, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.6781091106154422, 0.44334927922889245, 0.36064371233973214], 0.01036251002724151, [0.2743759198193091, 0.7285911206511895, 0.03773808039378912, 0.04331783284230861]), [210.84125143098854, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.20158107237490663, 0.3238946945648584, 0.24399963650509682], 0.009664372151238956, [0.47733204119516204, 0.4603052801344075, 0.9298297825042643, 0.358424742237733]), [178.21758444214709, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.18036026635324287, 0.173123936892006, 0.6038823023290261], 0.010016593230124706, [0.4401491209134364, 0.8609926737185056, 0.1638092551671958, 0.22646456871949416]), [170.1251660171448, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.072210006218703, 0.3521154604071077, 0.4644130786564624], 0.0037743609975635275, [0.17728847529212788, 0.12630836876865192, 0.9645167219705122, 0.8221674765296613]), [174.71315395577525, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Body{Float64}([0.8247874340282866, 0.5795916665384359, 0.8038668590137469], 0.0035401668870093193, [0.6409979037657155, 0.15911501872567757, 0.5356210909593669, 0.6799181470255188]), [185.86085940474177, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], Tuple{Main.Vorton{Float64}, Vector{Float64}, Vector{Float64}}[(Main.Vorton{Float64}([0.6956808381416713, 0.4853785553982539, 0.4648049213765313], [0.7054270031323241, 0.70014541220553, 0.49839208412207514], 0.008389531007170116), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.6528326495428173, 0.8783095326823105, 0.6955937752833566], [0.992073216064829, 0.03702391218002421, 0.052040147154059024], 0.008559673062325765), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.9077908593045806, 0.3939808726568609, 0.1924335604037214], [0.5681911381173306, 0.06084849139338322, 0.9611920275200003], 0.00920463305134842), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.680305220184172, 0.45142673639459907, 0.6565158730370251], [0.9871517007068787, 0.536191701519787, 0.8044608001295422], 0.01032776912661538), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.5772900725131546, 0.19456471074413395, 0.9691695971486246], [0.029308796906382772, 0.237901194890202, 0.8225322140924277], 0.005855920250376647), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.07881482026287556, 0.16694384061777157, 0.7453082600322598], [0.36751517071734363, 0.08464781300384328, 0.7877792123673903], 0.006719633426946119), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.34386745978232425, 0.15114271162865245, 0.8692858825227187], [0.34380421639038017, 0.49221567013213885, 0.7577396026981709], 0.007165314050997217), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.7924111084524182, 0.7258577993874293, 0.4074759819413786], [0.004779849956308646, 0.10815467687383273, 0.6365113178025307], 0.004211825485699923), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.15007164548253604, 0.13891454905930323, 0.8854146060893755], [0.2322606392244514, 0.24943996074378283, 0.6529923359002099], 0.004730386058191863), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.178892411148747, 0.8198348637351619, 0.746693545507861], [0.05374276809352163, 0.28259697683790064, 0.9963633829133356], 0.004082068996145551), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0])  …  (Main.Vorton{Float64}([0.4598055261641393, 0.09042082143339258, 0.5640409504623178], [0.6396964311422774, 0.5845421243866575, 0.5349929592419193], 0.001124964196695102), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.9572197333627137, 0.6426548339644926, 0.6552399747905221], [0.747485027142634, 0.23562083902231445, 0.23561754824795678], 0.0027436327111542455), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.8050706937073655, 0.005451816228509987, 0.6194543923497148], [0.2893241621284488, 0.15343050371415934, 0.45483197600289493], 0.0033418266341768534), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.8372242495059112, 0.1880062901030637, 0.329865236819033], [0.6964852800076098, 0.41732935474694366, 0.12800112947157438], 0.008074470339380045), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.049017597531493595, 0.18258465318130024, 0.04079265592099135], [0.6643772290446401, 0.25419876795775076, 0.0111761955710723], 0.006867801058606931), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.9446211092215213, 0.5773644194640194, 0.41562195208459896], [0.06814741604330621, 0.16749916233272766, 0.7091985108360725], 0.0031542415121338305), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.02765456454632287, 0.1228176034412326, 0.7897475889795191], [0.5848018551658597, 0.4374509112686895, 0.6003922163899991], 0.0010159571328096377), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.09100727263849917, 0.5794817445557756, 0.6291868753365321], [0.04589763740992747, 0.2683934891175124, 0.9312357743393328], 0.004951543147051906), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.7215125397666922, 0.3101399108971986, 0.9120708158457793], [0.036429367243270616, 0.6439997561017691, 0.35149929330560925], 0.0006879838266934451), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), (Main.Vorton{Float64}([0.07014988405111922, 0.5286443270294893, 0.24380912629526263], [0.620780571763883, 0.8699240224718836, 0.5642401605234335], 0.0003071608128254314), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0])]), Val{5}(), 50), Tuple{Int32, Int32, Int64}[], StaticArraysCore.SVector{2, Int32}[[2, 2], [3, 2], [4, 2], [5, 2], [6, 2], [7, 2], [8, 2], [9, 2], [2, 3], [3, 3]  …  [8, 8], [9, 8], [2, 9], [3, 9], [4, 9], [5, 9], [6, 9], [7, 9], [8, 9], [9, 9]], (DerivativesSwitch{true, true, true}(), DerivativesSwitch{true, true, true}()))
diff --git a/dev/index.html b/dev/index.html index bafda2a..8e6a086 100644 --- a/dev/index.html +++ b/dev/index.html @@ -1,2 +1,2 @@ -Introduction · FastMultipole.jl

FastMultipole

A fast, multi-system, multi-kernel, differentiable implementation of the fast multipole method for use with scalar-plus-vector potential N-body problems in pure Julia.

Author: Ryan Anderson

Features:

  • solves $N$-body problems governed by the Laplace ($1/r$) kernel, with work planned to support the Helmholtz kernel in the future
  • incorporates seamlessly into existing Julia code without modifications (just the addition of a few interface functions)
  • offers convenience functions for determining the expansion coefficients for source points, vortex points, source panels, and dipole panels (this list is growing!)
  • provides velocity and velocity gradient (or their equivalent for non-fluids problems) obtained using analytic expressions (no finite difference)
  • uses $O(p^4)$ multipole-to-local translation operator (where $p$ is the expansion order), though this may improve in the near future
  • automated CPU-parallelization of expansions and direct interactions
  • supports GPU-parallelization of direct interactions using CUDA
  • ForwardDiff and ReverseDiff compatible

Installation:

pkg> add https://github.com/byuflowlab/FastMultipole.git

Documentation:

+Introduction · FastMultipole.jl

FastMultipole

A fast, multi-system, multi-kernel, differentiable implementation of the fast multipole method for use with scalar-plus-vector potential N-body problems in pure Julia.

Author: Ryan Anderson

Features:

  • solves $N$-body problems governed by the Laplace ($1/r$) kernel, with work planned to support the Helmholtz kernel in the future
  • incorporates seamlessly into existing Julia code without modifications (just the addition of a few interface functions)
  • offers convenience functions for determining the expansion coefficients for source points, vortex points, source panels, and dipole panels (this list is growing!)
  • provides velocity and velocity gradient (or their equivalent for non-fluids problems) obtained using analytic expressions (no finite difference)
  • uses $O(p^4)$ multipole-to-local translation operator (where $p$ is the expansion order), though this may improve in the near future
  • automated CPU-parallelization of expansions and direct interactions
  • supports GPU-parallelization of direct interactions using CUDA
  • ForwardDiff and ReverseDiff compatible

Installation:

pkg> add https://github.com/byuflowlab/FastMultipole.git

Documentation:

diff --git a/dev/objects.inv b/dev/objects.inv index ba41e238d5085997d7e523653526b2fdde984937..3c8ca518b0959e0ac98eee113bea42543326beac 100644 GIT binary patch delta 1693 zcmV;O24eZ>42}+vg@0R9+d2?__pcDs@`g*fOxx+47oZ6}Go{TTq31E9*n+q?c8)Bk zq#6GESzT;PzQl3}gc*i7j=tU1UcOz~LFAJMlraCZAA86>Lg?>^(b!Kt7Q~VBUmAG# z3B#1>Yl^#v=pTNKhWv|jmj*uZ$K(Oe<{?RRNa?3TbSZA2o`1UGV1I!l50<0}z9Tx+ z{N)gxsqg59e|IRkC6vGo9h2WYMAzA+!=@yrOMRKVbBIRb)A_L=G>owyM0YOy!je`yGHED7A|(w$kn(#=+M0L~ zFrHbXG~#*&nBp0M9Bg+L&o7BW1(t4m2qU@Fxqpe0m@;l<&`#EJF_Mdo)^tgjRn_Qi zMPUp%!wuvpjPsLtET$TNwF!}c!s#Ycyz?R7J+=qj0DzVF|A>BtpP|&Jv5$;YtwZvD zDp30$&(-G_PB+FVCL6s6P0hA;pH)=rR36YVsG)=&D%QO*n_N5}^h7%4@ zZhy3;QYobBkK>E|1f77bQ{myzOG7A%@%-1GdlLaS zt(12k4^Xc505$&mi9=ZX_=tW_!4@>IGf>ydT_ZFXsd7F5W2J}m4Tu|^F2K4>n*2L{ zFYJWRLB$z~;7UH|`D(g+Ifs;WzZ$2|n1Asw<)iO-x#xbDe)uGIY+HL3Ied%Xvz>e@ zY^+JsE*xv1Qjxuy;RJtRjsmnCWAe*whFzsOjU{2wBq2D`K8!A)}&y zEnwOq594_pL~J)5RJY*O^wBSb27e1U{4Ge*jjv|`r7;|9$K?%ncJ5|=ZPfn^uI=Pe zaU~y@+4`~=JA=t?#@%4@YBI7bbM2C)EEvdYJ1@2e3xie5>DI-c)XFoBTWs2!cJB%u zK4G|Okkw_*qGSsveJNyW^ z3&kq&dpmpb^2^=b+ZJysYBU|xvtdhpO0Rnu@nO@Ezv+p@ht3DH-JQo?$uaC@9AIeN z-Nvh@;qHxm>m9yo)N}Ou=YJdwu;-;SIV*cp{>sYqs_1vhtCIw3!DFf!{`Fa&1=JI) ze1_=S4l4%Kc~I+ixd#n%;Ku&R#s0~eG^+B@t2B_bKlU=-$8;Q!s;^|)=AowX>^zRc z162Hf@`T2PNJ~mrHAW3#y84&m`JB+sZ$v8C=650m!S3cU+s>b?4S$2^E+pMf*0u?w zT=#r=qdTV>+hj_E=zcsAdn;E{my$9BHCEQ94-PBjwf*DjS^}z>zqC_=ZBAg{ABRCi zYF^m#I-x+Wa;K+{mR`>!Hoe1D+0G^FTRfE;Z0|MWiFmu;+;Zf3OskKTI)H7n;V3I? n`%ZR5)2uRA9&Oxp?iL6e53&jSv`c;HNU-L#R0{tC=*zf+Y=Bn( delta 1525 zcmV8U=I<_mfb1MoJ0DEe)zp_n}eJc5g42W$YFvp|W12_c~WJ_Ww{!LJwb2mxi1& ze8|8d52?d5qkjs1`|uGdECMXjSfsJef$JuWxC~M3g=2m0~~fvW+X@mr}#p;Dxi26B@7@q3iGuQ zVfU2Bjdo~hNFz}y4FO5nS}M)C1QmmbgByJ~Yd?sd@PEN{8u+d}NV7Hzj|3i>ct>Uy z9%ji`!-JWCIyLZhmPF5lLm`o_XcFsq{pE5-8wI2Y8M6xE^hwMwblBQ>NtlSNQ4$J0 z1H#CJLJT&$O2n5!p&aF?5~8E5SxT|w2m%-dZ!(ag6O05tU$o**Ly-jq4m>}N|0}g) z0u(n}mw)4siF4q{A+21{*v)f-q_JhJv9Ch9oSv5GuBje1zi@;y&O*D4fsbN@ga&QJ#B*BLPPO?u_y- zQCV`17!?K(JY2+_PM%YzwjzSmR_8j5BgTc5et&bZR-2L9Y_+CS%3EcP*;Z1FC1<#X zoD}2SP?tx{s9#M&6d-rHT`4}rGHyiEo588+d_0Z(kZVJdK=oAr# z&qZ-e52#LG1_ms;rK&5n3=Ro5!^03! zMLW3EO#*0tWB>O5EaRr$jVa!V?B!Ms-a#3IEg4Wk%H>#^lL@Qh;$$-A3-PdXiGMC2 z>#KC`_UYsM&^>+J7`jW9`E|>2``VkgEH8b3@gDP(m%Z`WOm>XEx%Tk#Y_qJ%8GAC* z{$6`Hv)odlt~5d73i4ZOuaQ+tV1+r*P+ndWm5_C6B8#}F8u=iw*us~}mLFX_QI;dD zxzy(Tc-9A9`ga|Dhfx&lp#1a241WqC%Id;h#Q}^VpzS$0BVjBnww$}he`?3U+WMpl zQhEAY4t8JyZ0UfK9W5uoPBqIYOpQaH+$eX+=jARwpMu3;U$@_X#Pi01AJU4^&u&a# z+cqXGv2GfyX;NQnnv?;xBH@B?=FgX-{wj+Dai4NM>bEntB;8S?BSpgsmU2(mJz7w!B`-XdB)lQ{E(H>O$*)F|t?=#lIX}c^@Ca zPyA0q^^$7&1w7dYXYIXNH)_*e bs?2=dm)PsRzqW08uXoptudM$At=%)K42
Main.Gravitational{Float64}(Main.Body{Float64}[Main.Body{Float64}([0.9191811597933967, 0.42601923740838954, 0.7465863168484385], 0.0025604152001830723, 0.2538490889415096), Main.Body{Float64}([0.8192008435733007, 0.9541592624784624, 0.8458950823510601], 0.0006827573756872869, 0.03209667335274724), Main.Body{Float64}([0.586748700554989, 0.12181263792534469, 0.7894931647499924], 0.0007507747324898641, 0.8935369466209786), Main.Body{Float64}([0.6192588014774537, 0.47764531343080796, 0.8041934288169849], 0.0016891198058446176, 0.8236563299357046), Main.Body{Float64}([0.12353811904859124, 0.7400202596259494, 0.7057473220960516], 0.002309311138669132, 0.9340155879013086), Main.Body{Float64}([0.9919607797239652, 0.8036971367794874, 0.29827230692896456], 0.003091032513338926, 0.4842893268146866), Main.Body{Float64}([0.49265789199054244, 0.17985285886739166, 0.6397154045236242], 0.0018668795350337605, 0.6922349538863742), Main.Body{Float64}([0.22768758746068596, 0.26780944724527167, 0.8309795986773825], 0.003157596343481429, 0.6911617055492341), Main.Body{Float64}([0.621178864455285, 0.7425206336869923, 0.15487161620983314], 0.0004839315045437943, 0.09206661519876747), Main.Body{Float64}([0.5733898483119126, 0.5900840309886971, 0.7659266276192337], 0.0029381492555510935, 0.37737321139310276)  …  Main.Body{Float64}([0.2812234741618985, 0.27708389819825585, 0.4235731630417695], 0.0034210382558890573, 0.21244265959226383), Main.Body{Float64}([0.18233133223758657, 0.14916241688519882, 0.20618207218201223], 0.004302370469688393, 0.11811367096065306), Main.Body{Float64}([0.6538431813324862, 0.18465961144472087, 0.6987624957781595], 0.0032758534628382265, 0.1146339723247145), Main.Body{Float64}([0.502384784571667, 0.07721752813458782, 0.044128253140823026], 0.0012068237929352668, 0.8824300122645492), Main.Body{Float64}([0.10622545957526253, 0.23136923168145673, 0.07315362621407251], 0.004639824685179317, 0.5202481974492436), Main.Body{Float64}([0.2644435533586268, 0.3676770504551723, 0.9608299085823863], 0.0009116451209061823, 0.14299177749328063), Main.Body{Float64}([0.44451280995349074, 0.6545010003851659, 0.7398328188365615], 0.000762117045391454, 0.4548855071076938), Main.Body{Float64}([0.7393125867689954, 0.9345095474243973, 0.7672377064661036], 0.004141438543486005, 0.5686419495976187), Main.Body{Float64}([0.6678036693907312, 0.21007708769686184, 0.24471486161349698], 0.004755798682676574, 0.48026240320564606), Main.Body{Float64}([0.4422922153896224, 0.5903414423174669, 0.6120978024383686], 0.0005905059991398905, 0.649924587497539)], [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0])

Evaluate The Potential at Each Body

The fmm! function evaluates the gravitational potential induced by system in-place. We can control the tradeoff between performance and accuracy by tuning a handful of parameters for our particular system, but we'll stick with the defaults for this example:

fmm.fmm!(system)

The resulting potential can then be accessed as a field of system.

@show system.potential[1,:]
1000-element Vector{Float64}:
- 74.34534899255411
- 63.16302812527192
- 77.69886677802258
- 87.80436433007651
- 76.87041445838584
- 65.8198268481202
- 87.03697204997485
- 78.8849052429896
- 78.82253402891475
- 88.2007352913844
+ 74.34535006666736
+ 63.16303142306167
+ 77.69886045695277
+ 87.80436385765044
+ 76.87039459587758
+ 65.8198175648441
+ 87.03696306210689
+ 78.8848821122295
+ 78.82253221081596
+ 88.20073499522836
   ⋮
- 71.43329657927653
- 83.25350073954752
- 65.1298298950103
- 62.18259687156562
- 72.94949145243523
+ 71.43329666653969
+ 83.2535031282214
+ 65.12979096714376
+ 62.18260070014051
+ 72.94948420007046
  86.42278009063244
- 68.06275993943673
- 84.0384452262423
+ 68.06274582312719
+ 84.03846816243086
  93.17295917707808

Accuracy of FMM Call

By using the direct! function, we can check the accuracy of the fmm! call by evaluating the ''N''-body problem naively, without fast multipole acceleration.

direct_system = deepcopy(system)
 direct_system.potential .= 0
 
@@ -45,4 +45,4 @@
 
 percent_error = abs.((system.potential[1,:] .- direct_system.potential[1,:]) ./ direct_system.potential[1,:])
 
-@show maximum(percent_error)
8.797758382673223e-7
+@show maximum(percent_error)
4.748757699729193e-7
diff --git a/dev/reference/index.html b/dev/reference/index.html index 78ee8cd..13ec541 100644 --- a/dev/reference/index.html +++ b/dev/reference/index.html @@ -1,2 +1,2 @@ -Reference · FastMultipole.jl

Reference

FastMultipole.DerivativesSwitchType
DerivativesSwitch

Switch indicating whether the scalar potential, vector potential, velocity, and/or velocity gradient should be computed for a target system. Information is stored as type parameters, allowing the compiler to compile away if statements.

source
FastMultipole.DerivativesSwitchMethod
DerivativesSwitch(scalar_potential, velocity, velocity_gradient)

Constructs a tuple of DerivativesSwitch objects.

Arguments

  • scalar_potential::Vector{Bool}: a vector of ::Bool indicating whether the scalar potential should be computed for each target system
  • velocity::Vector{Bool}: a vector of ::Bool indicating whether the velocity should be computed for each target system
  • velocity_gradient::Vector{Bool}: a vector of ::Bool indicating whether the velocity gradient should be computed for each target system
source
FastMultipole.DerivativesSwitchMethod
DerivativesSwitch(scalar_potential, velocity, velocity_gradient, target_systems)

Constructs a ::Tuple of indentical DerivativesSwitch objects of the same length as target_systems (if it is a ::Tuple), or a single DerivativesSwitch (if target_system is not a ::Tuple)

Arguments

  • scalar_potential::Bool: a ::Bool indicating whether the scalar potential should be computed for each target system
  • velocity::Bool: a ::Bool indicating whether the velocity should be computed for each target system
  • velocity_gradient::Bool: a ::Bool indicating whether the velocity gradient should be computed for each target system
source
FastMultipole.DerivativesSwitchMethod
DerivativesSwitch(scalar_potential, velocity, velocity_gradient)

Constructs a single DerivativesSwitch object.

Arguments

  • scalar_potential::Bool: a ::Bool indicating whether the scalar potential should be computed for the target system
  • velocity::Bool: a ::Bool indicating whether the velocity should be computed for the target system
  • velocity_gradient::Bool: a ::Bool indicating whether the velocity gradient should be computed for the target system
source
FastMultipole.ExpansionSwitchType
ExpansionSwitch

Switch indicating which expansions should be used:

  1. scalar potential (SP)
  2. vector potential via Lamb-Helmholtz decomposition (VP)
source
FastMultipole.MultiTreeType

bodies[indexlist] is the same sort operation as performed by the tree sortedbodies[inverseindexlist] undoes the sort operation performed by the tree

source
FastMultipole.ProbeSystemType
ProbeSystem

Convenience system for defining locations at which the potential, velocity, or velocity gradient may be desired.

source
FastMultipole.ProbeSystemMethod
ProbeSystem(positions; kwargs...)

A convenience system constructor for calculating the influence of source systems at locations not already described by a system object. It behaves like a system whose elements induce a null potential field.

Arguments

  • positions::Vector{SVector{3,Float64}}: a vector of position vectors of each probe

Optional Arguments

  • scalar_potential::Bool: whether or not to compute the scalar potential at each probe location
  • vector_potential::Bool: whether or not to compute the vector potential at each probe location
  • velocity::Bool: whether or not to compute the velocity at each probe location
  • velocity_gradient::Bool: whether or not to compute the velocity gradient at each probe location
source
FastMultipole.ProbeSystemMethod
ProbeSystem(positions; kwargs...)

Dispatch of ProbeSystem accepting a matrix of horizontally concatenated column vectors describing the position of each probe. Optional arguments are identical.

source
FastMultipole.SortWrapperMethod
SortWrapper(system)

Convenience wrapper for systems whose elements cannot be sorted in-place (e.g. structured grids). The resulting object is treated like any other system.

source
FastMultipole.TreeType
abstract type Tree{TF,P} end

Supertype of all octree structures with TF the floating point type and P the expansion order.

source
FastMultipole.EmptyTreeMethod
EmptyTree(system)

Returns an empty tree. Used if system is empty.

Arguments

  • system: the system from which a tree is to be created

Returns

  • tree: if typeof(system)<:Tuple, a ::MultiTree is returned; otherwise, a ::SingleTree is returned
source
FastMultipole.add_line!Method
add_line!(probes::ProbeSystem, x1, x2, n_probes, i_last)

Adds n_probes probes in a line between x1 and x2. Specifically, they are added at the midpoint of equally partiti oned segments of the line.

Arguments

  • probes::ProbeSystem: the probe system whose .position field is to be updated
  • x1::Vector{Float64}: the first point defining the line along which probes are to be added
  • x2::Vector{Float64}: the second point defining the line along which probes are to be added
  • n_probes::Int: number of probes to be added
  • i_last::Int: index of the last probe in probes

Output

  • i_last::Int: updated index of the last probe in probes
source
FastMultipole.back_rotate_z!Method

Assumes eimϕs have already been computed. DOES NOT overwrite rotated weights (unlike other rotate functions); rather, accumulates on top of it.

source
FastMultipole.calculate_ib!Method

assumes j has already been calculated

Note: if X0real is replaced with X0real + Xw_real, etc., this becomes bnm (as used for volumes) instead of inm (as used for panels)

source
FastMultipole.calculate_pj!Method

assumes q has already been calculated

If X0real is replaced with X0real + Xv_real, etc., the result becomes jnm instead of pnm, as used for panels.

source
FastMultipole.direct!Method
direct!(target_system, source_system; derivatives_switches)

Applies all interactions of source_system acting on target_system without multipole acceleration.

Arguments

  • target_system: either

    • a system object for which compatibility functions have been overloaded, or
    • a tuple of system objects for which compatibility functions have been overloaded
  • source_system: either

    • a system object for which compatibility functions have been overloaded, or
    • a tuple of system objects for which compatibility functions have been overloaded

Optional Arguments

  • scalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a scalar potential from source_systems
  • velocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity from source_systems
  • velocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity gradient from source_systems
source
FastMultipole.direct!Method
direct!(systems; derivatives_switches)

Applies all interactions of systems acting on itself without multipole acceleration.

Arguments

  • systems: either

    • a system object for which compatibility functions have been overloaded, or
    • a tuple of system objects for which compatibility functions have been overloaded

Optional Arguments

  • scalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a scalar potential from source_systems
  • velocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity from source_systems
  • velocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity gradient from source_systems
source
FastMultipole.fmm!Method
fmm!(target_systems, source_systems; kwargs...)

Apply all interactions of source_systems acting on target_systems using the fast multipole method. Assumes compatibility functions have been overloaded for both source and target systems.

Arguments

  • target_systems: either

    • a system object for which compatibility functions have been overloaded, or - a tuple of system objects for which compatibility functions have been overloaded
  • source_systems: either

    • a system object for which compatibility functions have been overloaded, or
    • a tuple of system objects for which compatibility functions have been overloaded

Optional Arguments

  • expansion_order::Int: the expansion order to be used
  • leaf_size_source::Int: maximum number of bodies from source_systems allowed in a leaf-level branch
  • leaf_size_target::Int: maximum number of bodies from target_systems allowed in a leaf-level branch
  • multipole_threshold::Float64: number between 0 and 1 (often denoted theta in [0,1]) controls the accuracy by determining the non-dimensional distance after which multipoles are used; 0 means an infinite distance (no error, high cost), and 1 means barely convergent (high error, low cost)
  • lamb_helmholtz::Bool: determines whether or not to calculate the induced velocity due to a vector potential using the Lamb-Helmholtz decomposition; erroroneous velocity and gradient will result if lamb_helmholtz==false and a vector potential is used.
  • scalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a scalar potential from source_systems
  • velocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity from source_systems
  • velocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity gradient from source_systems
  • upward_pass::Bool: whether or not to form the multipole expansions from source bodies and translate them upward in the source tree
  • horizontal_pass::Bool: whether or not to transform multipole expansions from the source tree into local expansions in the target tree
  • downward_pass::Bool: whether or not to translate local expansions down to the leaf level of the target tree and evaluate them
  • nearfield::Bool: indicates whether near-field (comuted without multipoles) interactions should be included
  • farfield::Bool: indicates whether far-field (comuted with multipoles) interactions should be included
  • self_induced::Bool: indicates whether to include the interactions of each leaf-level branch on itself
  • unsort_source_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for the source_systems
  • unsort_target_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for the target_systems
  • source_shink_recenter::Bool: indicates whether or not to resize branches for the source_systems octree after it is created to increase computational efficiency
  • target_shink_recenter::Bool: indicates whether or not to resize branches for the target_systems octree after it is created to increase computational efficiency
  • save_tree_source::Bool: indicates whether or not to save a VTK file for visualizing the source octree
  • save_tree_target::Bool: indicates whether or not to save a VTK file for visualizing the target octree
  • save_name_source::String: name and path of the source octree visualization if save_tree == true
  • save_name_target::String: name and path of the target octree visualization if save_tree == true
source
FastMultipole.fmm!Method
fmm!(systems; kwargs...)

Apply all interactions of systems acting on itself using the fast multipole method. Assumes compatibility functions have been overloaded for both source and target systems.

Arguments

  • systems: either

    • a system object for which compatibility functions have been overloaded, or
    • a tuple of system objects for which compatibility functions have been overloaded

Optional Arguments

  • expansion_order::Int: the expansion order to be used
  • leaf_size::Int: maximum number of bodies from systems allowed in a leaf-level branch
  • multipole_threshold::Float64: number between 0 and 1 (often denoted theta in [0,1]) controls the accuracy by determining the non-dimensional distance after which multipoles are used; 0 means an infinite distance (no error, high cost), and 1 means barely convergent (high error, low cost)
  • scalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(systems) indicating whether each system should receive a scalar potential from source_systems
  • velocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(systems) indicating whether each system should receive a velocity from source_systems
  • velocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(systems) indicating whether each system should receive a velocity gradient from source_systems
  • upward_pass::Bool: whether or not to form the multipole expansions from source bodies and translate them upward in the source tree
  • horizontal_pass::Bool: whether or not to transform multipole expansions from the source tree into local expansions in the target tree
  • downward_pass::Bool: whether or not to translate local expansions down to the leaf level of the target tree and evaluate them
  • nearfield::Bool: indicates whether near-field (comuted without multipoles) interactions should be included in the direct_list
  • farfield::Bool: indicates whether far-field (comuted with multipoles) interactions should be included in the m2l_list
  • self_induced::Bool: indicates whether to include the interactions of each leaf-level branch on itself in the direct_list
  • unsort_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for systems
  • shink_recenter::Bool: indicates whether or not to resize branches for the octree after it is created to increase computational efficiency
  • save_tree::Bool: indicates whether or not to save a VTK file for visualizing the octree
  • save_name::String: name and path of the octree visualization if save_tree == true
  • gpu::Bool: indicates whether or not GPU is to be used for direct interactions
source
FastMultipole.fmm!Method
fmm!(target_tree, target_systems, source_tree, source_systems; kwargs...)

Dispatches fmm! using existing ::Tree objects.

Arguments

  • target_tree::Tree: a <:Tree object (see Tree)

  • target_systems: either

    • a system object for which compatibility functions have been overloaded, or
    • a tuple of system objects for which compatibility functions have been overloaded
  • source_tree::Tree: a <:Tree object (see Tree)

  • source_systems: either

    • a system object for which compatibility functions have been overloaded, or
    • a tuple of system objects for which compatibility functions have been overloaded

Optional Arguments

  • multipole_threshold::Float64: number between 0 and 1 (often denoted theta in [0,1]) controls the accuracy by determining the non-dimensional distance after which multipoles are used; 0 means an infinite distance (no error, high cost), and 1 means barely convergent (high error, low cost)
  • scalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a scalar potential from source_systems
  • velocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity from source_systems
  • velocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity gradient from source_systems
  • reset_source_tree::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(source_systems) indicating whether or not to reset the expansions of each source tree
  • reset_target_tree::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(source_systems) indicating whether or not to reset the expansions of each target tree
  • upward_pass::Bool: whether or not to form the multipole expansions from source bodies and translate them upward in the source tree
  • horizontal_pass::Bool: whether or not to transform multipole expansions from the source tree into local expansions in the target tree
  • downward_pass::Bool: whether or not to translate local expansions down to the leaf level of the target tree and evaluate them
  • nearfield::Bool: indicates whether near-field (computed without multipoles) interactions should be included in the direct_list
  • farfield::Bool: indicates whether far-field (computed with multipoles) interactions should be included in the m2l_list
  • self_induced::Bool: indicates whether to include the interactions of each leaf-level branch on itself in the direct_list
  • unsort_source_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for source_systems
  • unsort_target_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for target_systems
  • gpu::Bool: indicates whether or not GPU is to be used for direct interactions
source
FastMultipole.fmm!Method
fmm!(target_tree, target_systems, source_tree, source_systems, m2l_list, direct_list, derivatives_switches; kwargs...)

Dispatches fmm! using existing ::Tree objects.

Arguments

  • target_tree::Tree: a <:Tree object (see Tree)

  • target_systems: either

    • a system object for which compatibility functions have been overloaded, or
    • a tuple of system objects for which compatibility functions have been overloaded
  • source_tree::Tree: a <:Tree object (see Tree)

  • source_systems: either

    • a system object for which compatibility functions have been overloaded, or
    • a tuple of system objects for which compatibility functions have been overloaded
  • m2l_list::Vector{SVector{2,Int32}}: list of branch index pairs [i_target, i_source] for which multipole expansions of the source branch are to be transformed to local expansions at the target branch

  • direct_list::Union{Vector{SVector{2,Int32}}, InteractionList}: list of branch index pairs [i_target, i_source] for which interactions are to be evaluted without multipole expansion (i.e., directly); if typeof(direct_list) <: InteractionList, then prepared influence matrices are used rather than computing direct influences on the fly

  • derivatives_switches::Union{DerivativesSwitch, Tuple{<:DerivativesSwitch,...}}: switch determining which of scalar potential, vector potential, velocity, and/or velocity gradient are to be computed for each target system

Optional Arguments

  • multipole_threshold::Float64: number between 0 and 1 (often denoted theta in [0,1]) controls the accuracy by determining the non-dimensional distance after which multipoles are used; 0 means an infinite distance (no error, high cost), and 1 means barely convergent (high error, low cost)
  • scalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a scalar potential from source_systems
  • velocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity from source_systems
  • velocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity gradient from source_systems
  • upward_pass::Bool: whether or not to form the multipole expansions from source bodies and translate them upward in the source tree
  • horizontal_pass::Bool: whether or not to transform multipole expansions from the source tree into local expansions in the target tree
  • downward_pass::Bool: whether or not to translate local expansions down to the leaf level of the target tree and evaluate them
  • nearfield::Bool: indicates whether near-field (comuted without multipoles) interactions should be included
  • farfield::Bool: indicates whether far-field (comuted with multipoles) interactions should be included
  • self_induced::Bool: indicates whether to include the interactions of each leaf-level branch on itself
  • unsort_source_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for source_systems
  • unsort_target_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for target_systems
source
FastMultipole.fmm!Method
fmm!(tree, systems; kwargs...)

Dispatches fmm! using an existing ::Tree.

Arguments

  • tree::Tree: a <:Tree object (see Tree)

  • systems: either

    • a system object for which compatibility functions have been overloaded, or
    • a tuple of system objects for which compatibility functions have been overloaded

Optional Arguments

  • multipole_threshold::Float64: number between 0 and 1 (often denoted theta in [0,1]) controls the accuracy by determining the non-dimensional distance after which multipoles are used; 0 means an infinite distance (no error, high cost), and 1 means barely convergent (high error, low cost)
  • scalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(systems) indicating whether each system should receive a scalar potential from source_systems
  • velocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(systems) indicating whether each system should receive a velocity from source_systems
  • velocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(systems) indicating whether each system should receive a velocity gradient from source_systems
  • upward_pass::Bool: whether or not to form the multipole expansions from source bodies and translate them upward in the source tree
  • horizontal_pass::Bool: whether or not to transform multipole expansions from the source tree into local expansions in the target tree
  • downward_pass::Bool: whether or not to translate local expansions down to the leaf level of the target tree and evaluate them
  • nearfield::Bool: indicates whether near-field (computed without multipoles) interactions should be included in the direct_list
  • farfield::Bool: indicates whether far-field (computed with multipoles) interactions should be included in the m2l_list
  • self_induced::Bool: indicates whether to include the interactions of each leaf-level branch on itself in the direct_list
  • unsort_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for systems
  • gpu::Bool: indicates whether or not GPU is to be used for direct interactions
source
FastMultipole.fmm!Method
fmm!(tree, systems; kwargs...)

Dispatches fmm! using an existing ::Tree.

Arguments

  • tree::Tree: a <:Tree object (see Tree)

  • systems: either

    • a system object for which compatibility functions have been overloaded, or
    • a tuple of system objects for which compatibility functions have been overloaded
  • m2l_list::Vector{SVector{2,Int32}}: list of branch index pairs [i_target, i_source] for which multipole expansions of the source branch are to be transformed to local expansions at the target branch

  • direct_list::Union{Vector{SVector{2,Int32}}, InteractionList}: list of branch index pairs [i_target, i_source] for which interactions are to be evaluted without multipole expansion (i.e., directly); if typeof(direct_list) <: InteractionList, then prepared influence matrices are used rather than computing direct influences on the fly

  • derivatives_switches::Union{DerivativesSwitch, Tuple{<:DerivativesSwitch,...}}: switch determining which of scalar potential, vector potential, velocity, and/or velocity gradient are to be computed for each target system

Optional Arguments

  • upward_pass::Bool: whether or not to form the multipole expansions from source bodies and translate them upward in the source tree
  • horizontal_pass::Bool: whether or not to transform multipole expansions from the source tree into local expansions in the target tree
  • downward_pass::Bool: whether or not to translate local expansions down to the leaf level of the target tree and evaluate them
  • unsort_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for systems
source
FastMultipole.reset!Method
reset!(probes)

Zeroes all values (e.g. scalar/vector potential, velocity, and/or velocity gradient) of all probes.

Arguments

source
FastMultipole.rotate_multipole_y!Method

Rotate solid harmonic weights about the y axis by θ. Note that Hsπ2 and ζsmag must be updated a priori, but Ts is updated en situ. Resets rotated_weights before computing.

source
+Reference · FastMultipole.jl

Reference

FastMultipole.DerivativesSwitchType
DerivativesSwitch

Switch indicating whether the scalar potential, vector potential, velocity, and/or velocity gradient should be computed for a target system. Information is stored as type parameters, allowing the compiler to compile away if statements.

source
FastMultipole.DerivativesSwitchMethod
DerivativesSwitch(scalar_potential, velocity, velocity_gradient)

Constructs a tuple of DerivativesSwitch objects.

Arguments

  • scalar_potential::Vector{Bool}: a vector of ::Bool indicating whether the scalar potential should be computed for each target system
  • velocity::Vector{Bool}: a vector of ::Bool indicating whether the velocity should be computed for each target system
  • velocity_gradient::Vector{Bool}: a vector of ::Bool indicating whether the velocity gradient should be computed for each target system
source
FastMultipole.DerivativesSwitchMethod
DerivativesSwitch(scalar_potential, velocity, velocity_gradient, target_systems)

Constructs a ::Tuple of indentical DerivativesSwitch objects of the same length as target_systems (if it is a ::Tuple), or a single DerivativesSwitch (if target_system is not a ::Tuple)

Arguments

  • scalar_potential::Bool: a ::Bool indicating whether the scalar potential should be computed for each target system
  • velocity::Bool: a ::Bool indicating whether the velocity should be computed for each target system
  • velocity_gradient::Bool: a ::Bool indicating whether the velocity gradient should be computed for each target system
source
FastMultipole.DerivativesSwitchMethod
DerivativesSwitch(scalar_potential, velocity, velocity_gradient)

Constructs a single DerivativesSwitch object.

Arguments

  • scalar_potential::Bool: a ::Bool indicating whether the scalar potential should be computed for the target system
  • velocity::Bool: a ::Bool indicating whether the velocity should be computed for the target system
  • velocity_gradient::Bool: a ::Bool indicating whether the velocity gradient should be computed for the target system
source
FastMultipole.ExpansionSwitchType
ExpansionSwitch

Switch indicating which expansions should be used:

  1. scalar potential (SP)
  2. vector potential via Lamb-Helmholtz decomposition (VP)
source
FastMultipole.MultiBranchType
MultiBranch{TF,N} <: Branch{TF}

Branch object used to sort more than one system into an octree. Type parameters represent:

  • TF: the floating point type (would be a dual number if using algorithmic differentiation)
  • N: the number of systems represented

Fields

  • bodies_index::Vector{UnitRange}: vector of unit ranges indicating the index of bodies in each represented system, respectively
  • n_branches::Int: number of child branches corresponding to this branch
  • branch_index::UnitRange: indices of this branch's child branches
  • i_parent::Int: index of this branch's parent
  • i_leaf::Int: if this branch is a leaf, what is its index in its parent <:Tree's leaf_index field
  • center::Vector{TF}: center of this branch at which its multipole and local expansions are centered
  • source_radius::TF: if this branch is a leaf, distance from center to the outer edge of farthest body contained in this branch; otherwise, this is the distance from center to the corner of its source_box
  • target_radius::TF: distance from center to the farthest body center contained in this branch
  • source_box::Vector{TF}: vector of length 6 containing the distances from the center to faces of a rectangular prism completely enclosing all bodies with their finite radius in the negative x, positive x, negative y, positive y, negative z, and positive z directions, respectively
  • target_box::Vector{TF}: vector of length 3 containing the distances from the center to faces of a rectangular prism completely enclosing all body centers in the x, y, and z direction, respectively
  • multipole_expansion::Array{TF,3}: array of size (2,2,) containing the multipole expansion coefficients; the first index indicates real or imaginary, the second index indicates scalar potential or the second component of the Lamb-Helmholtz decomposition, and the third indexk` indicates the expansion coefficient of degree $n$ and order $m$, as $k = p(p+1)/2 + m + 1$
  • local_expansion::Array{TF,3}: array of size(2,2,(p+1)(p+2)/2)containing the local expansion coefficients; the first index indicates real or imaginary, the second index indicates scalar potential or the second component of the Lamb-Helmholtz decomposition, and the third indexk` indicates the expansion coefficient of degree $n$ and order $m$, as $k = p(p+1)/2 + m + 1$
  • harmonics::Array{TF,3}: array of size (2,2,(p+1)(p+2)/2) used as storage for regular harmonics, irregular harmonics, or whatever is needed, and is indexed as multipole and local expansions
  • lock::ReentrantLock: lock used to avoid data race conditions when modifying this branch or its corresponding bodies
source
FastMultipole.MultiTreeType

bodies[indexlist] is the same sort operation as performed by the tree sortedbodies[inverseindexlist] undoes the sort operation performed by the tree

source
FastMultipole.ProbeSystemType
ProbeSystem

Convenience system for defining locations at which the potential, velocity, or velocity gradient may be desired.

source
FastMultipole.ProbeSystemMethod
ProbeSystem(positions; kwargs...)

A convenience system constructor for calculating the influence of source systems at locations not already described by a system object. It behaves like a system whose elements induce a null potential field.

Arguments

  • positions::Vector{SVector{3,Float64}}: a vector of position vectors of each probe

Optional Arguments

  • scalar_potential::Bool: whether or not to compute the scalar potential at each probe location
  • vector_potential::Bool: whether or not to compute the vector potential at each probe location
  • velocity::Bool: whether or not to compute the velocity at each probe location
  • velocity_gradient::Bool: whether or not to compute the velocity gradient at each probe location
source
FastMultipole.ProbeSystemMethod
ProbeSystem(positions; kwargs...)

Dispatch of ProbeSystem accepting a matrix of horizontally concatenated column vectors describing the position of each probe. Optional arguments are identical.

source
FastMultipole.SingleBranchType
SingleBranch{TF} <: Branch{TF}

Branch object used to sort a single system into an octree. Type parameters represent:

  • TF: the floating point type (would be a dual number if using algorithmic differentiation)

Fields

  • bodies_index::UnitRange: unit range indicating the index of bodies in the represented system
  • n_branches::Int: number of child branches corresponding to this branch
  • branch_index::UnitRange: indices of this branch's child branches
  • i_parent::Int: index of this branch's parent
  • i_leaf::Int: if this branch is a leaf, what is its index in its parent <:Tree's leaf_index field
  • center::Vector{TF}: center of this branch at which its multipole and local expansions are centered
  • source_radius::TF: if this branch is a leaf, distance from center to the outer edge of farthest body contained in this branch; otherwise, this is the distance from center to the corner of its source_box
  • target_radius::TF: distance from center to the farthest body center contained in this branch
  • source_box::Vector{TF}: vector of length 6 containing the distances from the center to faces of a rectangular prism completely enclosing all bodies with their finite radius in the negative x, positive x, negative y, positive y, negative z, and positive z directions, respectively
  • target_box::Vector{TF}: vector of length 3 containing the distances from the center to faces of a rectangular prism completely enclosing all body centers in the x, y, and z direction, respectively
  • multipole_expansion::Array{TF,3}: array of size (2,2,) containing the multipole expansion coefficients; the first index indicates real or imaginary, the second index indicates scalar potential or the second component of the Lamb-Helmholtz decomposition, and the third indexk` indicates the expansion coefficient of degree $n$ and order $m$, as $k = p(p+1)/2 + m + 1$
  • local_expansion::Array{TF,3}: array of size(2,2,(p+1)(p+2)/2)containing the local expansion coefficients; the first index indicates real or imaginary, the second index indicates scalar potential or the second component of the Lamb-Helmholtz decomposition, and the third indexk` indicates the expansion coefficient of degree $n$ and order $m$, as $k = p(p+1)/2 + m + 1$
  • harmonics::Array{TF,3}: array of size (2,2,(p+1)(p+2)/2) used as storage for regular harmonics, irregular harmonics, or whatever is needed, and is indexed as multipole and local expansions
  • lock::ReentrantLock: lock used to avoid data race conditions when modifying this branch or its corresponding bodies
source
FastMultipole.SortWrapperMethod
SortWrapper(system)

Convenience wrapper for systems whose elements cannot be sorted in-place (e.g. structured grids). The resulting object is treated like any other system.

source
FastMultipole.TreeType
abstract type Tree{TF,P} end

Supertype of all octree structures with TF the floating point type and P the expansion order.

source
FastMultipole.EmptyTreeMethod
EmptyTree(system)

Returns an empty tree. Used if system is empty.

Arguments

  • system: the system from which a tree is to be created

Returns

  • tree: if typeof(system)<:Tuple, a ::MultiTree is returned; otherwise, a ::SingleTree is returned
source
FastMultipole.accumulate_charge!Method
accumulate_charge!(branches, systems, branch_index)

Computes the sum of the absolute value of body source strengths, as well as the sum of the L2 norm of the dipole strengths, and store them in each branch, inheriting values from child branches if available.

source
FastMultipole.accumulate_charge_bodies!Method
accumulate_charge!(branch, systems)

Computes the sum of the absolute value of body source strengths, as well as the sum of the L2 norm of the dipole strengths, based on source bodies directly, and store them in each branch.

source
FastMultipole.add_line!Method
add_line!(probes::ProbeSystem, x1, x2, n_probes, i_last)

Adds n_probes probes in a line between x1 and x2. Specifically, they are added at the midpoint of equally partiti oned segments of the line.

Arguments

  • probes::ProbeSystem: the probe system whose .position field is to be updated
  • x1::Vector{Float64}: the first point defining the line along which probes are to be added
  • x2::Vector{Float64}: the second point defining the line along which probes are to be added
  • n_probes::Int: number of probes to be added
  • i_last::Int: index of the last probe in probes

Output

  • i_last::Int: updated index of the last probe in probes
source
FastMultipole.back_rotate_z!Method

Assumes eimϕs have already been computed. DOES NOT overwrite rotated weights (unlike other rotate functions); rather, accumulates on top of it.

source
FastMultipole.calculate_ib!Method

assumes j has already been calculated

Note: if X0real is replaced with X0real + Xw_real, etc., this becomes bnm (as used for volumes) instead of inm (as used for panels)

source
FastMultipole.calculate_pj!Method

assumes q has already been calculated

If X0real is replaced with X0real + Xv_real, etc., the result becomes jnm instead of pnm, as used for panels.

source
FastMultipole.direct!Method
direct!(target_system, source_system; derivatives_switches)

Applies all interactions of source_system acting on target_system without multipole acceleration.

Arguments

  • target_system: either

    • a system object for which compatibility functions have been overloaded, or
    • a tuple of system objects for which compatibility functions have been overloaded
  • source_system: either

    • a system object for which compatibility functions have been overloaded, or
    • a tuple of system objects for which compatibility functions have been overloaded

Optional Arguments

  • scalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a scalar potential from source_systems
  • velocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity from source_systems
  • velocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity gradient from source_systems
source
FastMultipole.direct!Method
direct!(systems; derivatives_switches)

Applies all interactions of systems acting on itself without multipole acceleration.

Arguments

  • systems: either

    • a system object for which compatibility functions have been overloaded, or
    • a tuple of system objects for which compatibility functions have been overloaded

Optional Arguments

  • scalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a scalar potential from source_systems
  • velocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity from source_systems
  • velocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity gradient from source_systems
source
FastMultipole.fmm!Method
fmm!(systems; kwargs...)

Apply all interactions of systems acting on itself using the fast multipole method. Assumes compatibility functions have been overloaded for both source and target systems.

Arguments

  • systems: either

    • a system object for which compatibility functions have been overloaded, or
    • a tuple of system objects for which compatibility functions have been overloaded

Optional Arguments

  • expansion_order::Int: the expansion order to be used
  • leaf_size::Int: maximum number of bodies from systems allowed in a leaf-level branch
  • multipole_threshold::Float64: number between 0 and 1 (often denoted theta in [0,1]) controls the accuracy by determining the non-dimensional distance after which multipoles are used; 0 means an infinite distance (no error, high cost), and 1 means barely convergent (high error, low cost)
  • scalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(systems) indicating whether each system should receive a scalar potential from source_systems
  • velocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(systems) indicating whether each system should receive a velocity from source_systems
  • velocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(systems) indicating whether each system should receive a velocity gradient from source_systems
  • upward_pass::Bool: whether or not to form the multipole expansions from source bodies and translate them upward in the source tree
  • horizontal_pass::Bool: whether or not to transform multipole expansions from the source tree into local expansions in the target tree
  • downward_pass::Bool: whether or not to translate local expansions down to the leaf level of the target tree and evaluate them
  • nearfield::Bool: indicates whether near-field (comuted without multipoles) interactions should be included in the direct_list
  • farfield::Bool: indicates whether far-field (comuted with multipoles) interactions should be included in the m2l_list
  • self_induced::Bool: indicates whether to include the interactions of each leaf-level branch on itself in the direct_list
  • unsort_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for systems
  • shink_recenter::Bool: indicates whether or not to resize branches for the octree after it is created to increase computational efficiency
  • save_tree::Bool: indicates whether or not to save a VTK file for visualizing the octree
  • save_name::String: name and path of the octree visualization if save_tree == true
  • nearfield_user::Bool: indicates whether or not the nearfield_user! function should be used for nearfield interactions
source
FastMultipole.fmm!Method
fmm!(target_systems, source_systems; kwargs...)

Apply all interactions of source_systems acting on target_systems using the fast multipole method. Assumes compatibility functions have been overloaded for both source and target systems.

Arguments

  • target_systems: either

    • a system object for which compatibility functions have been overloaded, or - a tuple of system objects for which compatibility functions have been overloaded
  • source_systems: either

    • a system object for which compatibility functions have been overloaded, or
    • a tuple of system objects for which compatibility functions have been overloaded

Optional Arguments

  • expansion_order::Int: the expansion order to be used
  • leaf_size_source::Int: maximum number of bodies from source_systems allowed in a leaf-level branch
  • leaf_size_target::Int: maximum number of bodies from target_systems allowed in a leaf-level branch
  • multipole_threshold::Float64: number between 0 and 1 (often denoted theta in [0,1]) controls the accuracy by determining the non-dimensional distance after which multipoles are used; 0 means an infinite distance (no error, high cost), and 1 means barely convergent (high error, low cost)
  • lamb_helmholtz::Bool: determines whether or not to calculate the induced velocity due to a vector potential using the Lamb-Helmholtz decomposition; erroroneous velocity and gradient will result if lamb_helmholtz==false and a vector potential is used.
  • scalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a scalar potential from source_systems
  • velocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity from source_systems
  • velocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity gradient from source_systems
  • upward_pass::Bool: whether or not to form the multipole expansions from source bodies and translate them upward in the source tree
  • horizontal_pass::Bool: whether or not to transform multipole expansions from the source tree into local expansions in the target tree
  • downward_pass::Bool: whether or not to translate local expansions down to the leaf level of the target tree and evaluate them
  • nearfield::Bool: indicates whether near-field (comuted without multipoles) interactions should be included
  • farfield::Bool: indicates whether far-field (comuted with multipoles) interactions should be included
  • self_induced::Bool: indicates whether to include the interactions of each leaf-level branch on itself
  • unsort_source_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for the source_systems
  • unsort_target_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for the target_systems
  • source_shink_recenter::Bool: indicates whether or not to resize branches for the source_systems octree after it is created to increase computational efficiency
  • target_shink_recenter::Bool: indicates whether or not to resize branches for the target_systems octree after it is created to increase computational efficiency
  • save_tree_source::Bool: indicates whether or not to save a VTK file for visualizing the source octree
  • save_tree_target::Bool: indicates whether or not to save a VTK file for visualizing the target octree
  • save_name_source::String: name and path of the source octree visualization if save_tree == true
  • save_name_target::String: name and path of the target octree visualization if save_tree == true
source
FastMultipole.fmm!Method
fmm!(tree, systems; kwargs...)

Dispatches fmm! using an existing ::Tree.

Arguments

  • tree::Tree: a <:Tree object (see Tree)

  • systems: either

    • a system object for which compatibility functions have been overloaded, or
    • a tuple of system objects for which compatibility functions have been overloaded
  • m2l_list::Vector{SVector{2,Int32}}: list of branch index pairs [i_target, i_source] for which multipole expansions of the source branch are to be transformed to local expansions at the target branch

  • direct_list::Union{Vector{SVector{2,Int32}}, InteractionList}: list of branch index pairs [i_target, i_source] for which interactions are to be evaluted without multipole expansion (i.e., directly); if typeof(direct_list) <: InteractionList, then prepared influence matrices are used rather than computing direct influences on the fly

  • derivatives_switches::Union{DerivativesSwitch, Tuple{<:DerivativesSwitch,...}}: switch determining which of scalar potential, vector potential, velocity, and/or velocity gradient are to be computed for each target system

Optional Arguments

  • upward_pass::Bool: whether or not to form the multipole expansions from source bodies and translate them upward in the source tree
  • horizontal_pass::Bool: whether or not to transform multipole expansions from the source tree into local expansions in the target tree
  • downward_pass::Bool: whether or not to translate local expansions down to the leaf level of the target tree and evaluate them
  • unsort_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for systems
source
FastMultipole.fmm!Method
fmm!(target_tree, target_systems, source_tree, source_systems, m2l_list, direct_list, derivatives_switches; kwargs...)

Dispatches fmm! using existing ::Tree objects.

Arguments

  • target_tree::Tree: a <:Tree object (see Tree)

  • target_systems: either

    • a system object for which compatibility functions have been overloaded, or
    • a tuple of system objects for which compatibility functions have been overloaded
  • source_tree::Tree: a <:Tree object (see Tree)

  • source_systems: either

    • a system object for which compatibility functions have been overloaded, or
    • a tuple of system objects for which compatibility functions have been overloaded
  • m2l_list::Vector{SVector{2,Int32}}: list of branch index pairs [i_target, i_source] for which multipole expansions of the source branch are to be transformed to local expansions at the target branch

  • direct_list::Union{Vector{SVector{2,Int32}}, InteractionList}: list of branch index pairs [i_target, i_source] for which interactions are to be evaluted without multipole expansion (i.e., directly); if typeof(direct_list) <: InteractionList, then prepared influence matrices are used rather than computing direct influences on the fly

  • derivatives_switches::Union{DerivativesSwitch, Tuple{<:DerivativesSwitch,...}}: switch determining which of scalar potential, vector potential, velocity, and/or velocity gradient are to be computed for each target system

Optional Arguments

  • multipole_threshold::Float64: number between 0 and 1 (often denoted theta in [0,1]) controls the accuracy by determining the non-dimensional distance after which multipoles are used; 0 means an infinite distance (no error, high cost), and 1 means barely convergent (high error, low cost)
  • scalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a scalar potential from source_systems
  • velocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity from source_systems
  • velocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity gradient from source_systems
  • upward_pass::Bool: whether or not to form the multipole expansions from source bodies and translate them upward in the source tree
  • horizontal_pass::Bool: whether or not to transform multipole expansions from the source tree into local expansions in the target tree
  • downward_pass::Bool: whether or not to translate local expansions down to the leaf level of the target tree and evaluate them
  • nearfield::Bool: indicates whether near-field (comuted without multipoles) interactions should be included
  • farfield::Bool: indicates whether far-field (comuted with multipoles) interactions should be included
  • self_induced::Bool: indicates whether to include the interactions of each leaf-level branch on itself
  • unsort_source_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for source_systems
  • unsort_target_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for target_systems
source
FastMultipole.fmm!Method
fmm!(target_tree, target_systems, source_tree, source_systems; kwargs...)

Dispatches fmm! using existing ::Tree objects.

Arguments

  • target_tree::Tree: a <:Tree object (see Tree)

  • target_systems: either

    • a system object for which compatibility functions have been overloaded, or
    • a tuple of system objects for which compatibility functions have been overloaded
  • source_tree::Tree: a <:Tree object (see Tree)

  • source_systems: either

    • a system object for which compatibility functions have been overloaded, or
    • a tuple of system objects for which compatibility functions have been overloaded

Optional Arguments

  • multipole_threshold::Float64: number between 0 and 1 (often denoted theta in [0,1]) controls the accuracy by determining the non-dimensional distance after which multipoles are used; 0 means an infinite distance (no error, high cost), and 1 means barely convergent (high error, low cost)
  • scalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a scalar potential from source_systems
  • velocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity from source_systems
  • velocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity gradient from source_systems
  • reset_source_tree::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(source_systems) indicating whether or not to reset the expansions of each source tree
  • reset_target_tree::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(source_systems) indicating whether or not to reset the expansions of each target tree
  • upward_pass::Bool: whether or not to form the multipole expansions from source bodies and translate them upward in the source tree
  • horizontal_pass::Bool: whether or not to transform multipole expansions from the source tree into local expansions in the target tree
  • downward_pass::Bool: whether or not to translate local expansions down to the leaf level of the target tree and evaluate them
  • nearfield::Bool: indicates whether near-field (computed without multipoles) interactions should be included in the direct_list
  • farfield::Bool: indicates whether far-field (computed with multipoles) interactions should be included in the m2l_list
  • self_induced::Bool: indicates whether to include the interactions of each leaf-level branch on itself in the direct_list
  • unsort_source_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for source_systems
  • unsort_target_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for target_systems
  • nearfield_user::Bool: indicates whether or not the nearfield_user! function should be used for nearfield interactions
source
FastMultipole.fmm!Method
fmm!(tree, systems; kwargs...)

Dispatches fmm! using an existing ::Tree.

Arguments

  • tree::Tree: a <:Tree object (see Tree)

  • systems: either

    • a system object for which compatibility functions have been overloaded, or
    • a tuple of system objects for which compatibility functions have been overloaded

Optional Arguments

  • multipole_threshold::Float64: number between 0 and 1 (often denoted theta in [0,1]) controls the accuracy by determining the non-dimensional distance after which multipoles are used; 0 means an infinite distance (no error, high cost), and 1 means barely convergent (high error, low cost)
  • scalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(systems) indicating whether each system should receive a scalar potential from source_systems
  • velocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(systems) indicating whether each system should receive a velocity from source_systems
  • velocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(systems) indicating whether each system should receive a velocity gradient from source_systems
  • upward_pass::Bool: whether or not to form the multipole expansions from source bodies and translate them upward in the source tree
  • horizontal_pass::Bool: whether or not to transform multipole expansions from the source tree into local expansions in the target tree
  • downward_pass::Bool: whether or not to translate local expansions down to the leaf level of the target tree and evaluate them
  • nearfield::Bool: indicates whether near-field (computed without multipoles) interactions should be included in the direct_list
  • farfield::Bool: indicates whether far-field (computed with multipoles) interactions should be included in the m2l_list
  • self_induced::Bool: indicates whether to include the interactions of each leaf-level branch on itself in the direct_list
  • unsort_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for systems
  • nearfield_user::Bool: indicates whether or not the nearfield_user! function should be used for nearfield interactions
source
FastMultipole.get_PMethod
get_P(r_max_over_ρ_min, ρ_max_over_r_min, Pmax, ε_rel)

Returns the smallest expansion order not greater than Pmax and satisfying the specified relative error tolerance.

Inputs

  • r_max_over_ρ_min::Float64: ratio r_max / ρ_min
  • ρ_max_over_r_min::Float64: ratio ρ_max / r_min
  • Pmax::Int64: maximum allowable expansion order
  • ε_rel::Float64: relative error tolerance

where

  • r_max::Float64: distance from the local expansion to the farthest target
  • r_min::Flaot64: distance from the multipole expansion to the closest target
  • ρ_max::Float64: distance from the multipole expansion to the farthest source
  • ρ_min::Float64: distance from the local expansion to the closest source

Ouputs

  • P::Int: the smallest expansion order to satisfy the error tolerance
source
FastMultipole.reset!Method
reset!(probes)

Zeroes all values (e.g. scalar/vector potential, velocity, and/or velocity gradient) of all probes.

Arguments

source
FastMultipole.rotate_multipole_y!Method

Rotate solid harmonic weights about the y axis by θ. Note that Hsπ2 and ζsmag must be updated a priori, but Ts is updated en situ. Resets rotated_weights before computing.

source
FastMultipole.shrink_branch!Method

Computes the smallest bounding box to completely bound all child boxes.

Shrunk radii are merely the distance from the center to the corner of the box.

source
diff --git a/dev/search_index.js b/dev/search_index.js index 885318d..90efcdc 100644 --- a/dev/search_index.js +++ b/dev/search_index.js @@ -1,3 +1,3 @@ var documenterSearchIndex = {"docs": -[{"location":"advanced_usage/#Advanced-Usage","page":"Advanced Usage","title":"Advanced Usage","text":"","category":"section"},{"location":"advanced_usage/","page":"Advanced Usage","title":"Advanced Usage","text":"Though the typical user won't need to alter these parameters, various situations may require modifications to the evaluation process of the FMM.","category":"page"},{"location":"advanced_usage/#Unsort-Bodies","page":"Advanced Usage","title":"Unsort Bodies","text":"","category":"section"},{"location":"advanced_usage/","page":"Advanced Usage","title":"Advanced Usage","text":"As part of the evaluation, the fmm! call will sort bodies contained in the systems in order to optimize performance, thus during the fmm evaluation, the body indices are different from initial indices given by the user. At the conclusion of the fmm! call, these bodies are then put back in their original order for the convenience of the user. This feature can be toggled off so that the bodies are left in their sorted order after the FMM evaluation.","category":"page"},{"location":"advanced_usage/","page":"Advanced Usage","title":"Advanced Usage","text":"import FastMultipole as fmm\nusing Random\ngravitational_path = normpath(joinpath(splitdir(pathof(fmm))[1], \"..\", \"test\", \"gravitational.jl\"))\ninclude(gravitational_path)\n\nfunction generate_gravitational(seed, n_bodies; radius_factor=0.1, strength_factor=1.0)\n Random.seed!(seed)\n bodies = rand(8,n_bodies)\n bodies[1:3,:] = rand(3,n_bodies) # body positions\n\n bodies[4,:] ./= (n_bodies^(1/3)*2) # body radii\n bodies[4,:] .*= radius_factor\n\n bodies[5,:] .*= strength_factor # body strengths\n\n system = Gravitational(bodies)\n return system\nend\n\ntarget_system = generate_gravitational(123, 100)\nsource_system = generate_gravitational(321, 100)\n\nfmm.fmm!(target_system, source_system,\n unsort_source_bodies=true, unsort_target_bodies=true) # standard run (defaults)\nfmm.fmm!(target_system, source_system,\n unsort_source_bodies=false, unsort_target_bodies=false) # sorted bodies (not original indices)","category":"page"},{"location":"advanced_usage/#Reusing-the-Octree","page":"Advanced Usage","title":"Reusing the Octree","text":"","category":"section"},{"location":"advanced_usage/","page":"Advanced Usage","title":"Advanced Usage","text":"Users are able to define the tree to be used in the FMM by passing in a previously created tree into the fmm! call. For convenience, the upward_pass, horizontal_pass, and downward_pass can be toggled off seperately. These are important to toggle when generating octrees to be reused. Additionally, unsort_target_bodies and unsort_source_bodies should be set to false when generating the reusable trees.","category":"page"},{"location":"advanced_usage/","page":"Advanced Usage","title":"Advanced Usage","text":"upward_pass creates the multipole expansions for each branch\nhorizontal_pass evaluates the expansions in the appropriate locations\ndownward_pass applies parent expansions to children branches","category":"page"},{"location":"advanced_usage/","page":"Advanced Usage","title":"Advanced Usage","text":"target_system = generate_gravitational(123, 100)\nsource_system = generate_gravitational(321, 100)\n\ntarget_tree, source_tree = fmm.fmm!(target_system, source_system;\n upward_pass=true, horizontal_pass=false, downward_pass=false,\n unsort_source_bodies=false, unsort_target_bodies=false) # generating trees to be reused\n\nfmm.fmm!(target_tree, target_system, source_tree, source_system;\n upward_pass=false, horizontal_pass=true, downward_pass=true) # reusing trees","category":"page"},{"location":"advanced_usage/#Partial-Evaluation","page":"Advanced Usage","title":"Partial Evaluation","text":"","category":"section"},{"location":"advanced_usage/","page":"Advanced Usage","title":"Advanced Usage","text":"The nearfield, farfield, and self_induced parameters allow users to bypass certain portions of the FMM.","category":"page"},{"location":"advanced_usage/","page":"Advanced Usage","title":"Advanced Usage","text":"nearfield if false, FastMultipole omits all direct interactions\nfarfield if false, FastMultipole omits all multipole interactions\nself_induced if false, FastMultipole omits the interaction of each leaf branch on itself","category":"page"},{"location":"advanced_usage/","page":"Advanced Usage","title":"Advanced Usage","text":"system = generate_gravitational(123, 100)\nfmm.fmm!(system,\n nearfield=true, farfield=true, self_induced=true) # standard run (defaults)\nfmm.fmm!(system,\n nearfield=false, farfield=true, self_induced=true) # nearfield not evaluated","category":"page"},{"location":"advanced_usage/#Resize-and-Recenter-Branches","page":"Advanced Usage","title":"Resize and Recenter Branches","text":"","category":"section"},{"location":"advanced_usage/","page":"Advanced Usage","title":"Advanced Usage","text":"The initial creation of the octree will create uniformly sized and spaced branches in each level. These branches are not centered or optimally sized with relation to the bodies they contain. As a default, the fmm! call resizes and recenters these branches to utilize the smallest possible radius that contains all the bodies in each branch[3]. This feature can be toggled with the source_shrink_recenter and target_shrink_recenter parameters.","category":"page"},{"location":"advanced_usage/","page":"Advanced Usage","title":"Advanced Usage","text":"target_system = generate_gravitational(123, 100)\nsource_system = generate_gravitational(321, 100)\n\nfmm.fmm!(target_system, source_system,\n source_shrink_recenter=true, target_shrink_recenter=true) # standard run (defaults)\nfmm.fmm!(target_system, source_system,\n source_shrink_recenter=false, target_shrink_recenter=false) # no branch recentering","category":"page"},{"location":"guided_examples/#Guided-Examples","page":"Guided Examples","title":"Guided Examples","text":"","category":"section"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"FastMultipole is designed to incorporate easily into your existing Julia code with minimal effort. We'll walk through the process of adding FastMultipole to an existing code in the following guided examples.","category":"page"},{"location":"guided_examples/#Gravitational-Example","page":"Guided Examples","title":"Gravitational Example","text":"","category":"section"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"In order to use FastMultipole, certain interface functions must be defined. In this example, we will walk through the process of incorporating FMM into the gravitational point mass model used in Quick Start. This code can also be found under test/gravitational.jl. Note that an additional (minimalistic) vortex particle example is included in test/vortex.jl.","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"To better understand how the FastMultipole interface functions, let's take a look at the data structures we'll use to define our point masses:","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"using FastMultipole\nusing FastMultipole.StaticArrays\n\nconst i_POTENTIAL = 1:4 # index of the gravitational potential\nconst i_VELOCITY = 5:7 # index of the velocity\nconst i_VELOCITY_GRADIENT = 8:16 # index of the velocity gradient\n\n# a single point mass\nstruct Body{TF}\n position::SVector{3,TF}\n radius::TF\n strength::SVector{4,TF}\nend\n\n# container for a system of `Body`'s\nstruct Gravitational{TF}\n bodies::Vector{Body{TF}}\n potential::Matrix{TF}\nend\n\n# constructor\nfunction Gravitational(bodies::Matrix)\n nbodies = size(bodies)[2]\n bodies2 = [Body(SVector{3}(bodies[1:3,i]),bodies[4,i],SVector{4}(bodies[5:8,i])) for i in 1:nbodies]\n potential = zeros(52,nbodies)\n return Gravitational(bodies2,potential)\nend","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"Note that while the particular choice of data structures is completely arbitrary, FastMultipole does not create any new storage containers for values of interest such as potential, velocity, velocity gradient. If these are desired, they must exist in the user-defined system, and will be updated in-place by FastMultipole.","category":"page"},{"location":"guided_examples/#Overloading-the-body_to_multipole!-Function","page":"Guided Examples","title":"Overloading the body_to_multipole! Function","text":"","category":"section"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"The function body_to_multipole! is used to generate multipole expansions for our particular system. This is done be overloading body_to_multipole! for the data structure representing our model. Convenience functions exist within FastMultipole to make this complicated function into a one-liner:","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"FastMultipole.body_to_multipole!(system::Gravitational, args...) =\n FastMultipole.body_to_multipole!(Point{Source}, system, args...)","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"Note that we are overloading body_to_multipole! to operate on our ::Gravitational system, which consists of point sources. Other convenience functions exist in FastMultipole for any combination of Point, Filament, or Panel geometries using Source, Dipole, or Vortex kernels. These are specified when overloading body_to_multipole! as {}. For example, if my model used vortex filaments, I would replace Point{Source} in the example above to Filament{Vortex}.","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"We use the fast recursive method of generating exact coefficients for panels as developed by [1].","category":"page"},{"location":"guided_examples/#Overloading-Getters","page":"Guided Examples","title":"Overloading Getters","text":"","category":"section"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"The Gravitational struct needs the following getters to be overloaded to support the indexing format used by FastMultipole. This approach allows for great flexibility without harming performance.","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"import Base: getindex\n\nBase.getindex(g::Gravitational, i, ::FastMultipole.Position) = g.bodies[i].position\nBase.getindex(g::Gravitational, i, ::FastMultipole.Radius) = g.bodies[i].radius\nBase.getindex(g::Gravitational, i, ::FastMultipole.ScalarPotential) = g.potential[1,i]\nBase.getindex(g::Gravitational, i, ::FastMultipole.Velocity) = view(g.potential,i_VELOCITY,i)\nBase.getindex(g::Gravitational, i, ::FastMultipole.VelocityGradient) = reshape(view(g.potential,i_VELOCITY_GRADIENT,i),3,3)\nBase.getindex(g::Gravitational, i, ::FastMultipole.Strength) = g.bodies[i].strength[1]\nBase.getindex(g::Gravitational, i, ::FastMultipole.Body) = g.bodies[i], view(g.potential,:,i)","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"It is worth noting that there are ways of defining these functions that would harm performance, e.g. by allocating an array each time the velocity is requested. It is up to the user to define these functions with the efficiency they desire.","category":"page"},{"location":"guided_examples/#Overloading-Setters","page":"Guided Examples","title":"Overloading Setters","text":"","category":"section"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"Gravitational also needs the following setters to be overloaded as well. These are used to update the potential and other quantities in-place. The same performance considerations that applied to getters apply here.","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"import Base: setindex!\n\nfunction Base.setindex!(g::Gravitational, val, i, ::FastMultipole.Body)\n body, potential = val\n g.bodies[i] = body\n g.potential[:,i] .= potential\n return nothing\nend\nfunction Base.setindex!(g::Gravitational, val, i, ::FastMultipole.ScalarPotential)\n g.potential[i_POTENTIAL[1],i] = val\nend\nfunction Base.setindex!(g::Gravitational, val, i, ::FastMultipole.Velocity)\n g.potential[i_VELOCITY,i] .= val\nend\nfunction Base.setindex!(g::Gravitational, val, i, ::FastMultipole.VelocityGradient)\n reshape(g.potential[i_VELOCITY_GRADIENT,i],3,3) .= val\nend","category":"page"},{"location":"guided_examples/#Additional-Requirements","page":"Guided Examples","title":"Additional Requirements","text":"","category":"section"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"In addition to the getters and setters listed above, each system struct must be overloaded with three additional methods. In gravitational.jl, these are they are overloaded as follows.","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"# determine the number of bodies contained by the system\nFastMultipole.get_n_bodies(g::Gravitational) = length(g.bodies)\n\n# determine the float-type used by the system\nBase.eltype(::Gravitational{TF}) where TF = TF\n\n# return all data structures required to define a single body\nFastMultipole.buffer_element(g::Gravitational) = (deepcopy(g.bodies[1]),zeros(eltype(g),52))","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"Note that the last of these functions, buffer_element, can return a tuple of values in case multiple data structures are required to define a single body.","category":"page"},{"location":"guided_examples/#Vector-Potential","page":"Guided Examples","title":"Vector Potential","text":"","category":"section"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"Ordinarily, a 3-dimensional vector potential, such as the stream function in 3-dimensional fluid dynamics, requires 3 separate expansions (1 for each dimension). In FastMultipole, however, we employ the Lamb-Helmholtz decomposition demonstrated by [2] to reduce the number of expansions required from 3 to 2, thus reducing computational cost.","category":"page"},{"location":"guided_examples/#Non-required-Functionality","page":"Guided Examples","title":"Non-required Functionality","text":"","category":"section"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"Though not required to run Fast Multipole, the direct! and save_vtk functions are useful for debugging and visualization. Here are some examples of how this could be implemented.","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"function FastMultipole.direct!(target_system, target_index, derivatives_switch, source_system::Gravitational, source_index)\n # nbad = 0\n for i_source in source_index\n source_x, source_y, source_z = source_system[i_source,FastMultipole.POSITION]\n source_strength = source_system.bodies[i_source].strength[1]\n for j_target in target_index\n target_x, target_y, target_z = target_system[j_target,FastMultipole.POSITION]\n dx = target_x - source_x\n dy = target_y - source_y\n dz = target_z - source_z\n r = sqrt(dx*dx + dy*dy + dz*dz)\n # te = @elapsed begin\n if r > 0\n dV = source_strength / r\n target_system[j_target,FastMultipole.SCALAR_POTENTIAL] += dV\n end\n # end\n # if te > 0.00001; nbad += 1; end\n end\n end\n # println(\"nbad = $nbad\")\nend\n\nfunction save_vtk(filename, element::Gravitational, nt=0; compress=false, extra_fields=nothing)\n _, n = size(element.bodies)\n WriteVTK.vtk_grid(filename*\"_point_masses.\"*string(nt)*\".vts\", reshape(view(element.bodies,1:3,:),3,n,1,1); compress) do vtk\n vtk[\"strength\"] = reshape(view(element.bodies,4,:), 1, n, 1, 1)\n vtk[\"velocity\"] = reshape(element.velocity, 3, n, 1, 1)\n vtk[\"scalar potential\"] = reshape(view(element.potential,1,:), n, 1, 1)\n vtk[\"vector potential\"] = reshape(view(element.potential,2:4,:), 3, n, 1, 1)\n if !isnothing(extra_fields)\n for i in 1:length(extra_fields)\n vtk[extra_fields[i][1]] = extra_fields[i][2]\n end\n end\n end\nend\n","category":"page"},{"location":"guided_examples/#FMM-Tuning-Parameters","page":"Guided Examples","title":"FMM Tuning Parameters","text":"","category":"section"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"We can improve the accuracy of the FMM by altering the follwing input parameters: multipole_threshold, leaf_size, and expansion_order. Though not linear, expansion_order is positively correlated with accuracy while multipole_threshold and leaf_size are negatively correlated.","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"multipole_threshold (between 0 and 1) the radius of the source over the minimum distance at which multipole expansion are used\nleaf_size (greater than 1) the maximum number of bodies included in each leaf level branch\nexpansion_order the number of terms included in each multipole expansion minus one","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"import FastMultipole as fmm\nusing Random\n\nfunction generate_gravitational(seed, n_bodies; radius_factor=0.1, strength_factor=1.0)\n Random.seed!(seed)\n bodies = rand(8,n_bodies)\n bodies[1:3,:] = rand(3,n_bodies) # body positions\n\n bodies[4,:] ./= (n_bodies^(1/3)*2) # body radii\n bodies[4,:] .*= radius_factor\n\n bodies[5,:] .*= strength_factor # body strengths\n\n system = Gravitational(bodies)\n return system\nend\n\nfunction measure_error(;multipole_threshold=0.4, leaf_size=50, expansion_order=5)\n fmm_system = generate_gravitational(123,1000)\n direct_system = deepcopy(fmm_system)\n\n fmm.fmm!(fmm_system; multipole_threshold, leaf_size, expansion_order)\n fmm.direct!(direct_system)\n\n percent_error = abs.((fmm_system.potential[1,:] .- direct_system.potential[1,:]) ./ direct_system.potential[1,:])\n return maximum(percent_error)\nend\n\n# default parameters\nprintln(measure_error(multipole_threshold=0.4, leaf_size=50, expansion_order=5))\n\n# expansion_order increased to 10\nprintln(measure_error(multipole_threshold=0.4, leaf_size=50, expansion_order=10))","category":"page"},{"location":"guided_examples/#Evaluate-Source-on-Target","page":"Guided Examples","title":"Evaluate Source on Target","text":"","category":"section"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"FastMutipole allows for the evaluation of source systems on target systems while leaving the source systems unaltered.","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"target_system = generate_gravitational(123, 100)\nsource_system = generate_gravitational(321, 100)\n\nfmm.fmm!(target_system, source_system)","category":"page"},{"location":"guided_examples/#Evaluate-Multiple-Sources-on-Multiple-Targets","page":"Guided Examples","title":"Evaluate Multiple Sources on Multiple Targets","text":"","category":"section"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"The FMM also supports the evaluation of multiple source systems on multiple target systems. The user is also able to evaluate a single source on multiple targets or multiple sources on a single target with any combination of supported system types.","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"vortex_path = normpath(joinpath(splitdir(pathof(fmm))[1], \"..\", \"test\", \"vortex.jl\"))\ninclude(vortex_path)\n\nfunction generate_vortex(seed, n_bodies; radius_factor=0.1, strength_factor=1.0)\n Random.seed!(seed)\n bodies = rand(8,n_bodies)\n bodies[1:3,:] = rand(3,n_bodies) # body positions\n\n bodies[4,:] ./= (n_bodies^(1/3)*2) # body radii\n bodies[4,:] .*= radius_factor\n\n bodies[5,:] .*= strength_factor # body strengths\n\n system = VortexParticles(bodies)\n return system\nend\n\ntarget_one = generate_gravitational(123, 100)\ntarget_two = generate_vortex(124, 100)\n\nsource_one = generate_gravitational(125, 100)\nsource_two = generate_vortex(126, 100)\n\nfmm.fmm!((target_one, target_two), (source_one, source_two))","category":"page"},{"location":"guided_examples/#Non-Potential-Flow-Applications","page":"Guided Examples","title":"Non-Potential Flow Applications","text":"","category":"section"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"As a default, target systems will be evaluated and returned with scalar_potential, velocity, and velocity_gradient fields populated. (Note that the vector potential is not explicitly tracked, though its induced velocity and velocity gradient are.) In some situations, only some of these values may be required. By inputting a boolean vector of the same length as target systems, the user is able to speed up the calculation by not storing unecessary values.","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"overlineV = -nabla phi + nabla times overlinepsi","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":" phi overlinepsi overlineV nabla overlineV\nfmm! Keyword Arguments scalar_potential vector_potential velocity velocity_gradient\nFluid Dynamics Scalar Potential Stream Function Fluid Velocity Velocity Gradient\nElectrostatics Electric Potential - Electric Field Field Gradient Tensor\nMagnetostatics - Magnetic Vector Potential Magnetic Field Field Gradient Tensor\nGravity Gravitational Potential - Gravitational Acceleration Acceleration Gradient Tensor","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"target_one = generate_gravitational(123, 100)\ntarget_two = generate_vortex(124, 100)\n\nsource_one = generate_gravitational(125, 100)\n\nfmm.fmm!((target_one, target_two), source_one, scalar_potential=[true, false],\n velocity=[true, true], velocity_gradient=[false, false])","category":"page"},{"location":"guided_examples/#Saving-Generated-Trees","page":"Guided Examples","title":"Saving Generated Trees","text":"","category":"section"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"A given fmm! call will typically return a single tree (if performed on the entire system) or two seperate source/target trees (if called on a source and a target). The function call can also be modified to save these trees.","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"\ntarget_filepath = \"target_tree\"\nsource_filepath = \"source_tree\"\n\ntarget_tree, source_tree = fmm.fmm!((target_one, target_two), source_one;\n save_tree_target=true, save_name_target=target_filepath,\n save_tree_source=true, save_name_source=source_filepath)","category":"page"},{"location":"theory/#Theory","page":"Theory","title":"Theory","text":"","category":"section"},{"location":"theory/","page":"Theory","title":"Theory","text":"In a nutshell, FastMultipole operates by forming series expansions of a kernel function, and translating and combining those expansions to obtain optimal compression. You can get a sense for how this works in the following figure.","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"Here, we see how each body's influence can be expressed as a series expansion. These series expansions can be translated and combined such that an entire cluster of bodies is represented by a single series expansion. This is what is known as a multipole expansion. Multipole expansions only converge outside of a finite radius of convergence, as illustrated by the red dotted line. Multipole expansions can only be used for interactions that are farther apart than this circl. The accuracy of the expansion gets better and better the farther away we go, so we can control the accuracy by imposing a cutoff radius (dotted blue line), and only use multipole expansions for interactions that are farther away than the blue circle. Multipole expansions are very helpful for reducing the cost of the N-body problem; in fact, we can reduce the scaling of the N-body problem to O(NlogN) by only considering multipole expansions.","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"Local expansions are very similar to multipole expansions, but they converge inside of a finite radius rather than outside. These provide the additional required compression to achieve fully O(N) scaling. In the next figure, we see how local expansions can reduce the number of times an expansion need be evaluated.","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"More details of the fast multipole method (FMM) can be found in the original work by Greengard and Rokhlin.[4]","category":"page"},{"location":"theory/#References","page":"Theory","title":"References","text":"","category":"section"},{"location":"theory/","page":"Theory","title":"Theory","text":"N. A. Gumerov, S. Kaneko and R. Duraiswami. Recursive computation of the multipole expansions of layer potential integrals over simplices for efficient fast multipole accelerated boundary elements. Journal of Computational Physics 486, 112118 (2023).\n\n\n\nN. A. Gumerov and R. Duraiswami. Efficient FMM accelerated vortex methods in three dimensions via the Lamb–Helmholtz decomposition. Journal of Computational Physics 240, 310–328 (2013).\n\n\n\nS. DENG, C. JIANG, Y. WANG and H. WANG. Acceleration of unsteady vortex lattice method via dipole panel fast multipole method. Chinese Journal of Aeronautics 34, 265–278 (2021).\n\n\n\nL. Greengard and V. Rokhlin. A fast algorithm for particle simulations. Journal of computational physics 73, 325–348 (1987).\n\n\n\n","category":"page"},{"location":"quickstart/#Quick-Start","page":"Quick Start","title":"Quick Start","text":"","category":"section"},{"location":"quickstart/","page":"Quick Start","title":"Quick Start","text":"The following tutorial shows how to use FastMultipole to compute the gravitational potential induced by a collection of point masses. It uses data structures located in test/gravitational.jl.","category":"page"},{"location":"quickstart/#Create-a-System","page":"Quick Start","title":"Create a System","text":"","category":"section"},{"location":"quickstart/","page":"Quick Start","title":"Quick Start","text":"First, let's create a system of 1000 randomly spaced point masses:","category":"page"},{"location":"quickstart/","page":"Quick Start","title":"Quick Start","text":"using Random\nimport FastMultipole as fmm\ngravitational_path = normpath(joinpath(splitdir(pathof(fmm))[1], \"..\", \"test\", \"gravitational.jl\"))\ninclude(gravitational_path)\n\nfunction generate_gravitational(seed, n_bodies; radius_factor=0.1, strength_factor=1.0)\n Random.seed!(seed)\n bodies = rand(8,n_bodies)\n bodies[1:3,:] = rand(3,n_bodies) # body positions\n\n bodies[4,:] ./= (n_bodies^(1/3)*2) # body radii\n bodies[4,:] .*= radius_factor\n\n bodies[5,:] .*= strength_factor # body strengths\n\n system = Gravitational(bodies)\n return system\nend\n\nsystem = generate_gravitational(123, 1000)","category":"page"},{"location":"quickstart/#Evaluate-The-Potential-at-Each-Body","page":"Quick Start","title":"Evaluate The Potential at Each Body","text":"","category":"section"},{"location":"quickstart/","page":"Quick Start","title":"Quick Start","text":"The fmm! function evaluates the gravitational potential induced by system in-place. We can control the tradeoff between performance and accuracy by tuning a handful of parameters for our particular system, but we'll stick with the defaults for this example:","category":"page"},{"location":"quickstart/","page":"Quick Start","title":"Quick Start","text":"fmm.fmm!(system)","category":"page"},{"location":"quickstart/","page":"Quick Start","title":"Quick Start","text":"The resulting potential can then be accessed as a field of system.","category":"page"},{"location":"quickstart/","page":"Quick Start","title":"Quick Start","text":"@show system.potential[1,:]","category":"page"},{"location":"quickstart/#Accuracy-of-FMM-Call","page":"Quick Start","title":"Accuracy of FMM Call","text":"","category":"section"},{"location":"quickstart/","page":"Quick Start","title":"Quick Start","text":"By using the direct! function, we can check the accuracy of the fmm! call by evaluating the ''N''-body problem naively, without fast multipole acceleration.","category":"page"},{"location":"quickstart/","page":"Quick Start","title":"Quick Start","text":"direct_system = deepcopy(system)\ndirect_system.potential .= 0\n\nfmm.direct!(direct_system)\n\npercent_error = abs.((system.potential[1,:] .- direct_system.potential[1,:]) ./ direct_system.potential[1,:])\n\n@show maximum(percent_error)","category":"page"},{"location":"reference/#Reference","page":"Reference","title":"Reference","text":"","category":"section"},{"location":"reference/","page":"Reference","title":"Reference","text":"CurrentModule = FastMultipole","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Modules = [FastMultipole]\nOrder = [:constant, :type, :function]\n# Pages = [\"fmm.jl\"]","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Modules = [FastMultipole]\nOrder = [:constant, :type, :function]\n# Pages = [\"fmm.jl\"]","category":"page"},{"location":"reference/#FastMultipole.DerivativesSwitch","page":"Reference","title":"FastMultipole.DerivativesSwitch","text":"DerivativesSwitch\n\nSwitch indicating whether the scalar potential, vector potential, velocity, and/or velocity gradient should be computed for a target system. Information is stored as type parameters, allowing the compiler to compile away if statements.\n\n\n\n\n\n","category":"type"},{"location":"reference/#FastMultipole.DerivativesSwitch-Tuple{Any, Any, Any}","page":"Reference","title":"FastMultipole.DerivativesSwitch","text":"DerivativesSwitch(scalar_potential, velocity, velocity_gradient)\n\nConstructs a tuple of DerivativesSwitch objects.\n\nArguments\n\nscalar_potential::Vector{Bool}: a vector of ::Bool indicating whether the scalar potential should be computed for each target system\nvelocity::Vector{Bool}: a vector of ::Bool indicating whether the velocity should be computed for each target system\nvelocity_gradient::Vector{Bool}: a vector of ::Bool indicating whether the velocity gradient should be computed for each target system\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.DerivativesSwitch-Tuple{Bool, Bool, Bool, Tuple}","page":"Reference","title":"FastMultipole.DerivativesSwitch","text":"DerivativesSwitch(scalar_potential, velocity, velocity_gradient, target_systems)\n\nConstructs a ::Tuple of indentical DerivativesSwitch objects of the same length as target_systems (if it is a ::Tuple), or a single DerivativesSwitch (if target_system is not a ::Tuple)\n\nArguments\n\nscalar_potential::Bool: a ::Bool indicating whether the scalar potential should be computed for each target system\nvelocity::Bool: a ::Bool indicating whether the velocity should be computed for each target system\nvelocity_gradient::Bool: a ::Bool indicating whether the velocity gradient should be computed for each target system\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.DerivativesSwitch-Tuple{Bool, Bool, Bool}","page":"Reference","title":"FastMultipole.DerivativesSwitch","text":"DerivativesSwitch(scalar_potential, velocity, velocity_gradient)\n\nConstructs a single DerivativesSwitch object.\n\nArguments\n\nscalar_potential::Bool: a ::Bool indicating whether the scalar potential should be computed for the target system\nvelocity::Bool: a ::Bool indicating whether the velocity should be computed for the target system\nvelocity_gradient::Bool: a ::Bool indicating whether the velocity gradient should be computed for the target system\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.ExpansionSwitch","page":"Reference","title":"FastMultipole.ExpansionSwitch","text":"ExpansionSwitch\n\nSwitch indicating which expansions should be used:\n\nscalar potential (SP)\nvector potential via Lamb-Helmholtz decomposition (VP)\n\n\n\n\n\n","category":"type"},{"location":"reference/#FastMultipole.MultiTree","page":"Reference","title":"FastMultipole.MultiTree","text":"bodies[indexlist] is the same sort operation as performed by the tree sortedbodies[inverseindexlist] undoes the sort operation performed by the tree\n\n\n\n\n\n","category":"type"},{"location":"reference/#FastMultipole.ProbeSystem","page":"Reference","title":"FastMultipole.ProbeSystem","text":"ProbeSystem\n\nConvenience system for defining locations at which the potential, velocity, or velocity gradient may be desired.\n\n\n\n\n\n","category":"type"},{"location":"reference/#FastMultipole.ProbeSystem-Union{Tuple{Array{StaticArraysCore.SVector{3, TF}, 1}}, Tuple{TF}} where TF","page":"Reference","title":"FastMultipole.ProbeSystem","text":"ProbeSystem(positions; kwargs...)\n\nA convenience system constructor for calculating the influence of source systems at locations not already described by a system object. It behaves like a system whose elements induce a null potential field.\n\nArguments\n\npositions::Vector{SVector{3,Float64}}: a vector of position vectors of each probe\n\nOptional Arguments\n\nscalar_potential::Bool: whether or not to compute the scalar potential at each probe location\nvector_potential::Bool: whether or not to compute the vector potential at each probe location\nvelocity::Bool: whether or not to compute the velocity at each probe location\nvelocity_gradient::Bool: whether or not to compute the velocity gradient at each probe location\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.ProbeSystem-Union{Tuple{Matrix{TF}}, Tuple{TF}} where TF","page":"Reference","title":"FastMultipole.ProbeSystem","text":"ProbeSystem(positions; kwargs...)\n\nDispatch of ProbeSystem accepting a matrix of horizontally concatenated column vectors describing the position of each probe. Optional arguments are identical.\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.SortWrapper-Tuple{Any}","page":"Reference","title":"FastMultipole.SortWrapper","text":"SortWrapper(system)\n\nConvenience wrapper for systems whose elements cannot be sorted in-place (e.g. structured grids). The resulting object is treated like any other system.\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.Tree","page":"Reference","title":"FastMultipole.Tree","text":"abstract type Tree{TF,P} end\n\nSupertype of all octree structures with TF the floating point type and P the expansion order.\n\n\n\n\n\n","category":"type"},{"location":"reference/#FastMultipole.EmptyTree-Tuple{Any}","page":"Reference","title":"FastMultipole.EmptyTree","text":"EmptyTree(system)\n\nReturns an empty tree. Used if system is empty.\n\nArguments\n\nsystem: the system from which a tree is to be created\n\nReturns\n\ntree: if typeof(system)<:Tuple, a ::MultiTree is returned; otherwise, a ::SingleTree is returned\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.add_line!-Tuple{ProbeSystem, Vararg{Any, 4}}","page":"Reference","title":"FastMultipole.add_line!","text":"add_line!(probes::ProbeSystem, x1, x2, n_probes, i_last)\n\nAdds n_probes probes in a line between x1 and x2. Specifically, they are added at the midpoint of equally partiti oned segments of the line.\n\nArguments\n\nprobes::ProbeSystem: the probe system whose .position field is to be updated\nx1::Vector{Float64}: the first point defining the line along which probes are to be added\nx2::Vector{Float64}: the second point defining the line along which probes are to be added\nn_probes::Int: number of probes to be added\ni_last::Int: index of the last probe in probes\n\nOutput\n\ni_last::Int: updated index of the last probe in probes\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.back_rotate_local_y!-NTuple{7, Any}","page":"Reference","title":"FastMultipole.back_rotate_local_y!","text":"Assumes Ts, Hsπ2, and ηsmag have all been precomputed. Resets target_weights.\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.back_rotate_multipole_y!-NTuple{6, Any}","page":"Reference","title":"FastMultipole.back_rotate_multipole_y!","text":"Assumes Ts, Hsπ2, and ζsmag have all been precomputed. Resets target_weights.\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.back_rotate_z!-Union{Tuple{LH}, Tuple{P}, Tuple{Any, Any, Any, Val{P}, Val{LH}}} where {P, LH}","page":"Reference","title":"FastMultipole.back_rotate_z!","text":"Assumes eimϕs have already been computed. DOES NOT overwrite rotated weights (unlike other rotate functions); rather, accumulates on top of it.\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.calculate_ib!-Union{Tuple{P}, Tuple{Any, Any, Any, Any, Any, Any, Val{P}}} where P","page":"Reference","title":"FastMultipole.calculate_ib!","text":"assumes j has already been calculated\n\nNote: if X0real is replaced with X0real + Xw_real, etc., this becomes bnm (as used for volumes) instead of inm (as used for panels)\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.calculate_pj!-Union{Tuple{P}, Tuple{Any, Any, Any, Any, Any, Any, Val{P}}} where P","page":"Reference","title":"FastMultipole.calculate_pj!","text":"assumes q has already been calculated\n\nIf X0real is replaced with X0real + Xv_real, etc., the result becomes jnm instead of pnm, as used for panels.\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.d2rdx2-Tuple{Any, Any, Any}","page":"Reference","title":"FastMultipole.d2rdx2","text":"drk/dxidx_j\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.direct!-Tuple{Any, Any}","page":"Reference","title":"FastMultipole.direct!","text":"direct!(target_system, source_system; derivatives_switches)\n\nApplies all interactions of source_system acting on target_system without multipole acceleration.\n\nArguments\n\ntarget_system: either\na system object for which compatibility functions have been overloaded, or\na tuple of system objects for which compatibility functions have been overloaded\nsource_system: either\na system object for which compatibility functions have been overloaded, or\na tuple of system objects for which compatibility functions have been overloaded\n\nOptional Arguments\n\nscalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a scalar potential from source_systems\nvelocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity from source_systems\nvelocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity gradient from source_systems\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.direct!-Tuple{Tuple}","page":"Reference","title":"FastMultipole.direct!","text":"direct!(systems; derivatives_switches)\n\nApplies all interactions of systems acting on itself without multipole acceleration.\n\nArguments\n\nsystems: either\na system object for which compatibility functions have been overloaded, or\na tuple of system objects for which compatibility functions have been overloaded\n\nOptional Arguments\n\nscalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a scalar potential from source_systems\nvelocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity from source_systems\nvelocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity gradient from source_systems\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.drdx-Tuple{Any, Any, Any}","page":"Reference","title":"FastMultipole.drdx","text":"drj/dxi\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.fmm!-Tuple{Any, Any}","page":"Reference","title":"FastMultipole.fmm!","text":"fmm!(target_systems, source_systems; kwargs...)\n\nApply all interactions of source_systems acting on target_systems using the fast multipole method. Assumes compatibility functions have been overloaded for both source and target systems.\n\nArguments\n\ntarget_systems: either\na system object for which compatibility functions have been overloaded, or - a tuple of system objects for which compatibility functions have been overloaded\nsource_systems: either\na system object for which compatibility functions have been overloaded, or\na tuple of system objects for which compatibility functions have been overloaded\n\nOptional Arguments\n\nexpansion_order::Int: the expansion order to be used\nleaf_size_source::Int: maximum number of bodies from source_systems allowed in a leaf-level branch\nleaf_size_target::Int: maximum number of bodies from target_systems allowed in a leaf-level branch\nmultipole_threshold::Float64: number between 0 and 1 (often denoted theta in [0,1]) controls the accuracy by determining the non-dimensional distance after which multipoles are used; 0 means an infinite distance (no error, high cost), and 1 means barely convergent (high error, low cost)\nlamb_helmholtz::Bool: determines whether or not to calculate the induced velocity due to a vector potential using the Lamb-Helmholtz decomposition; erroroneous velocity and gradient will result if lamb_helmholtz==false and a vector potential is used.\nscalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a scalar potential from source_systems\nvelocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity from source_systems\nvelocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity gradient from source_systems\nupward_pass::Bool: whether or not to form the multipole expansions from source bodies and translate them upward in the source tree\nhorizontal_pass::Bool: whether or not to transform multipole expansions from the source tree into local expansions in the target tree\ndownward_pass::Bool: whether or not to translate local expansions down to the leaf level of the target tree and evaluate them\nnearfield::Bool: indicates whether near-field (comuted without multipoles) interactions should be included\nfarfield::Bool: indicates whether far-field (comuted with multipoles) interactions should be included\nself_induced::Bool: indicates whether to include the interactions of each leaf-level branch on itself\nunsort_source_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for the source_systems\nunsort_target_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for the target_systems\nsource_shink_recenter::Bool: indicates whether or not to resize branches for the source_systems octree after it is created to increase computational efficiency\ntarget_shink_recenter::Bool: indicates whether or not to resize branches for the target_systems octree after it is created to increase computational efficiency\nsave_tree_source::Bool: indicates whether or not to save a VTK file for visualizing the source octree\nsave_tree_target::Bool: indicates whether or not to save a VTK file for visualizing the target octree\nsave_name_source::String: name and path of the source octree visualization if save_tree == true\nsave_name_target::String: name and path of the target octree visualization if save_tree == true\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.fmm!-Tuple{Any}","page":"Reference","title":"FastMultipole.fmm!","text":"fmm!(systems; kwargs...)\n\nApply all interactions of systems acting on itself using the fast multipole method. Assumes compatibility functions have been overloaded for both source and target systems.\n\nArguments\n\nsystems: either\na system object for which compatibility functions have been overloaded, or\na tuple of system objects for which compatibility functions have been overloaded\n\nOptional Arguments\n\nexpansion_order::Int: the expansion order to be used\nleaf_size::Int: maximum number of bodies from systems allowed in a leaf-level branch\nmultipole_threshold::Float64: number between 0 and 1 (often denoted theta in [0,1]) controls the accuracy by determining the non-dimensional distance after which multipoles are used; 0 means an infinite distance (no error, high cost), and 1 means barely convergent (high error, low cost)\nscalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(systems) indicating whether each system should receive a scalar potential from source_systems\nvelocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(systems) indicating whether each system should receive a velocity from source_systems\nvelocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(systems) indicating whether each system should receive a velocity gradient from source_systems\nupward_pass::Bool: whether or not to form the multipole expansions from source bodies and translate them upward in the source tree\nhorizontal_pass::Bool: whether or not to transform multipole expansions from the source tree into local expansions in the target tree\ndownward_pass::Bool: whether or not to translate local expansions down to the leaf level of the target tree and evaluate them\nnearfield::Bool: indicates whether near-field (comuted without multipoles) interactions should be included in the direct_list\nfarfield::Bool: indicates whether far-field (comuted with multipoles) interactions should be included in the m2l_list\nself_induced::Bool: indicates whether to include the interactions of each leaf-level branch on itself in the direct_list\nunsort_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for systems\nshink_recenter::Bool: indicates whether or not to resize branches for the octree after it is created to increase computational efficiency\nsave_tree::Bool: indicates whether or not to save a VTK file for visualizing the octree\nsave_name::String: name and path of the octree visualization if save_tree == true\ngpu::Bool: indicates whether or not GPU is to be used for direct interactions\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.fmm!-Tuple{Tree, Any, Tree, Any}","page":"Reference","title":"FastMultipole.fmm!","text":"fmm!(target_tree, target_systems, source_tree, source_systems; kwargs...)\n\nDispatches fmm! using existing ::Tree objects.\n\nArguments\n\ntarget_tree::Tree: a <:Tree object (see Tree)\ntarget_systems: either\na system object for which compatibility functions have been overloaded, or\na tuple of system objects for which compatibility functions have been overloaded\nsource_tree::Tree: a <:Tree object (see Tree)\nsource_systems: either\na system object for which compatibility functions have been overloaded, or\na tuple of system objects for which compatibility functions have been overloaded\n\nOptional Arguments\n\nmultipole_threshold::Float64: number between 0 and 1 (often denoted theta in [0,1]) controls the accuracy by determining the non-dimensional distance after which multipoles are used; 0 means an infinite distance (no error, high cost), and 1 means barely convergent (high error, low cost)\nscalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a scalar potential from source_systems\nvelocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity from source_systems\nvelocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity gradient from source_systems\nreset_source_tree::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(source_systems) indicating whether or not to reset the expansions of each source tree\nreset_target_tree::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(source_systems) indicating whether or not to reset the expansions of each target tree\nupward_pass::Bool: whether or not to form the multipole expansions from source bodies and translate them upward in the source tree\nhorizontal_pass::Bool: whether or not to transform multipole expansions from the source tree into local expansions in the target tree\ndownward_pass::Bool: whether or not to translate local expansions down to the leaf level of the target tree and evaluate them\nnearfield::Bool: indicates whether near-field (computed without multipoles) interactions should be included in the direct_list\nfarfield::Bool: indicates whether far-field (computed with multipoles) interactions should be included in the m2l_list\nself_induced::Bool: indicates whether to include the interactions of each leaf-level branch on itself in the direct_list\nunsort_source_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for source_systems\nunsort_target_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for target_systems\ngpu::Bool: indicates whether or not GPU is to be used for direct interactions\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.fmm!-Tuple{Tree, Any, Tree, Vararg{Any, 5}}","page":"Reference","title":"FastMultipole.fmm!","text":"fmm!(target_tree, target_systems, source_tree, source_systems, m2l_list, direct_list, derivatives_switches; kwargs...)\n\nDispatches fmm! using existing ::Tree objects.\n\nArguments\n\ntarget_tree::Tree: a <:Tree object (see Tree)\ntarget_systems: either\na system object for which compatibility functions have been overloaded, or\na tuple of system objects for which compatibility functions have been overloaded\nsource_tree::Tree: a <:Tree object (see Tree)\nsource_systems: either\na system object for which compatibility functions have been overloaded, or\na tuple of system objects for which compatibility functions have been overloaded\nm2l_list::Vector{SVector{2,Int32}}: list of branch index pairs [i_target, i_source] for which multipole expansions of the source branch are to be transformed to local expansions at the target branch\ndirect_list::Union{Vector{SVector{2,Int32}}, InteractionList}: list of branch index pairs [i_target, i_source] for which interactions are to be evaluted without multipole expansion (i.e., directly); if typeof(direct_list) <: InteractionList, then prepared influence matrices are used rather than computing direct influences on the fly\nderivatives_switches::Union{DerivativesSwitch, Tuple{<:DerivativesSwitch,...}}: switch determining which of scalar potential, vector potential, velocity, and/or velocity gradient are to be computed for each target system\n\nOptional Arguments\n\nmultipole_threshold::Float64: number between 0 and 1 (often denoted theta in [0,1]) controls the accuracy by determining the non-dimensional distance after which multipoles are used; 0 means an infinite distance (no error, high cost), and 1 means barely convergent (high error, low cost)\nscalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a scalar potential from source_systems\nvelocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity from source_systems\nvelocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity gradient from source_systems\nupward_pass::Bool: whether or not to form the multipole expansions from source bodies and translate them upward in the source tree\nhorizontal_pass::Bool: whether or not to transform multipole expansions from the source tree into local expansions in the target tree\ndownward_pass::Bool: whether or not to translate local expansions down to the leaf level of the target tree and evaluate them\nnearfield::Bool: indicates whether near-field (comuted without multipoles) interactions should be included\nfarfield::Bool: indicates whether far-field (comuted with multipoles) interactions should be included\nself_induced::Bool: indicates whether to include the interactions of each leaf-level branch on itself\nunsort_source_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for source_systems\nunsort_target_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for target_systems\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.fmm!-Tuple{Tree, Any}","page":"Reference","title":"FastMultipole.fmm!","text":"fmm!(tree, systems; kwargs...)\n\nDispatches fmm! using an existing ::Tree.\n\nArguments\n\ntree::Tree: a <:Tree object (see Tree)\nsystems: either\na system object for which compatibility functions have been overloaded, or\na tuple of system objects for which compatibility functions have been overloaded\n\nOptional Arguments\n\nmultipole_threshold::Float64: number between 0 and 1 (often denoted theta in [0,1]) controls the accuracy by determining the non-dimensional distance after which multipoles are used; 0 means an infinite distance (no error, high cost), and 1 means barely convergent (high error, low cost)\nscalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(systems) indicating whether each system should receive a scalar potential from source_systems\nvelocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(systems) indicating whether each system should receive a velocity from source_systems\nvelocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(systems) indicating whether each system should receive a velocity gradient from source_systems\nupward_pass::Bool: whether or not to form the multipole expansions from source bodies and translate them upward in the source tree\nhorizontal_pass::Bool: whether or not to transform multipole expansions from the source tree into local expansions in the target tree\ndownward_pass::Bool: whether or not to translate local expansions down to the leaf level of the target tree and evaluate them\nnearfield::Bool: indicates whether near-field (computed without multipoles) interactions should be included in the direct_list\nfarfield::Bool: indicates whether far-field (computed with multipoles) interactions should be included in the m2l_list\nself_induced::Bool: indicates whether to include the interactions of each leaf-level branch on itself in the direct_list\nunsort_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for systems\ngpu::Bool: indicates whether or not GPU is to be used for direct interactions\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.fmm!-Tuple{Tree, Vararg{Any, 5}}","page":"Reference","title":"FastMultipole.fmm!","text":"fmm!(tree, systems; kwargs...)\n\nDispatches fmm! using an existing ::Tree.\n\nArguments\n\ntree::Tree: a <:Tree object (see Tree)\nsystems: either\na system object for which compatibility functions have been overloaded, or\na tuple of system objects for which compatibility functions have been overloaded\nm2l_list::Vector{SVector{2,Int32}}: list of branch index pairs [i_target, i_source] for which multipole expansions of the source branch are to be transformed to local expansions at the target branch\ndirect_list::Union{Vector{SVector{2,Int32}}, InteractionList}: list of branch index pairs [i_target, i_source] for which interactions are to be evaluted without multipole expansion (i.e., directly); if typeof(direct_list) <: InteractionList, then prepared influence matrices are used rather than computing direct influences on the fly\nderivatives_switches::Union{DerivativesSwitch, Tuple{<:DerivativesSwitch,...}}: switch determining which of scalar potential, vector potential, velocity, and/or velocity gradient are to be computed for each target system\n\nOptional Arguments\n\nupward_pass::Bool: whether or not to form the multipole expansions from source bodies and translate them upward in the source tree\nhorizontal_pass::Bool: whether or not to transform multipole expansions from the source tree into local expansions in the target tree\ndownward_pass::Bool: whether or not to translate local expansions down to the leaf level of the target tree and evaluate them\nunsort_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for systems\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.local_to_local!-Union{Tuple{LH}, Tuple{Any, Any, Any, Any, Any, Any, Any, Any, Any, Val{LH}}} where LH","page":"Reference","title":"FastMultipole.local_to_local!","text":"Expects ηsmag and Hsπ2 to be precomputed. Ts and eimϕs are computed here.\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.mirrored_source_to_vortex!-Union{Tuple{P}, Tuple{Any, Any, Any, Any, Any, Val{P}}} where P","page":"Reference","title":"FastMultipole.mirrored_source_to_vortex!","text":"my novel derivation\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.multipole_to_local!-Union{Tuple{LH}, Tuple{Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Val{LH}}} where LH","page":"Reference","title":"FastMultipole.multipole_to_local!","text":"Expects ζsmag, ηsmag, and Hs_π2 to be computed a priori.\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.reset!-Tuple{ProbeSystem}","page":"Reference","title":"FastMultipole.reset!","text":"reset!(probes)\n\nZeroes all values (e.g. scalar/vector potential, velocity, and/or velocity gradient) of all probes.\n\nArguments\n\nprobes::ProbeSystem: a ::ProbeSystem object\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.resort!-Tuple{Tuple, MultiTree}","page":"Reference","title":"FastMultipole.resort!","text":"Performs the same sort operation as the tree. (Undoes unsort! operation.)\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.rotate_multipole_y!-NTuple{8, Any}","page":"Reference","title":"FastMultipole.rotate_multipole_y!","text":"Rotate solid harmonic weights about the y axis by θ. Note that Hsπ2 and ζsmag must be updated a priori, but Ts is updated en situ. Resets rotated_weights before computing.\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.rotate_z!-Union{Tuple{LH}, Tuple{P}, Tuple{Any, Any, Any, Any, Val{P}, Val{LH}}} where {P, LH}","page":"Reference","title":"FastMultipole.rotate_z!","text":"Performs a z-axis rotation of the supplied solid harmonic coefficients. Computes e^{imϕ} as well.\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.source_to_dipole!-Union{Tuple{P}, Tuple{Any, Any, Any, Any, Any, Any, Val{P}}} where P","page":"Reference","title":"FastMultipole.source_to_dipole!","text":"assumes source expansion coefficients have already been calculated\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.source_to_vortex_point!-Union{Tuple{P}, Tuple{Any, Any, Any, Any, Any, Any, Val{P}}} where P","page":"Reference","title":"FastMultipole.source_to_vortex_point!","text":"might be slightly faster than mirroredsourceto_vortex\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.translate_local_z!-Union{Tuple{LH}, Tuple{P}, Tuple{Any, Any, Any, Val{P}, Val{LH}}} where {P, LH}","page":"Reference","title":"FastMultipole.translate_local_z!","text":"Overwrites translated_weights\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.translate_multipole_to_local_z!-Union{Tuple{LH}, Tuple{P}, Tuple{Any, Any, Any, Val{P}, Val{LH}}} where {P, LH}","page":"Reference","title":"FastMultipole.translate_multipole_to_local_z!","text":"Overwrites translated_weights\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.translate_multipole_z!-Union{Tuple{LH}, Tuple{P}, Tuple{Any, Any, Any, Val{P}, Val{LH}}} where {P, LH}","page":"Reference","title":"FastMultipole.translate_multipole_z!","text":"Overwrites translated_weights\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.unsort!-Tuple{Tuple, MultiTree}","page":"Reference","title":"FastMultipole.unsort!","text":"Undoes the sort operation performed by the tree.\n\n\n\n\n\n","category":"method"},{"location":"#FastMultipole","page":"Introduction","title":"FastMultipole","text":"","category":"section"},{"location":"","page":"Introduction","title":"Introduction","text":"A fast, multi-system, multi-kernel, differentiable implementation of the fast multipole method for use with scalar-plus-vector potential N-body problems in pure Julia.","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"Author: Ryan Anderson","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"Features:","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"solves N-body problems governed by the Laplace (1r) kernel, with work planned to support the Helmholtz kernel in the future\nincorporates seamlessly into existing Julia code without modifications (just the addition of a few interface functions)\noffers convenience functions for determining the expansion coefficients for source points, vortex points, source panels, and dipole panels (this list is growing!)\nprovides velocity and velocity gradient (or their equivalent for non-fluids problems) obtained using analytic expressions (no finite difference)\nuses O(p^4) multipole-to-local translation operator (where p is the expansion order), though this may improve in the near future\nautomated CPU-parallelization of expansions and direct interactions\nsupports GPU-parallelization of direct interactions using CUDA\nForwardDiff and ReverseDiff compatible","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"Installation:","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"pkg> add https://github.com/byuflowlab/FastMultipole.git","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"Documentation:","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"learn basic useage in the Quick Start tutorial\ndiscover more features in the Guided Examples\nfine-tune performance in the Advanced Usage section (for FMM experts)\nsee the full API\nbrush up on the Theory","category":"page"}] +[{"location":"advanced_usage/#Advanced-Usage","page":"Advanced Usage","title":"Advanced Usage","text":"","category":"section"},{"location":"advanced_usage/","page":"Advanced Usage","title":"Advanced Usage","text":"Though the typical user won't need to alter these parameters, various situations may require modifications to the evaluation process of the FMM.","category":"page"},{"location":"advanced_usage/#Unsort-Bodies","page":"Advanced Usage","title":"Unsort Bodies","text":"","category":"section"},{"location":"advanced_usage/","page":"Advanced Usage","title":"Advanced Usage","text":"As part of the evaluation, the fmm! call will sort bodies contained in the systems in order to optimize performance, thus during the fmm evaluation, the body indices are different from initial indices given by the user. At the conclusion of the fmm! call, these bodies are then put back in their original order for the convenience of the user. This feature can be toggled off so that the bodies are left in their sorted order after the FMM evaluation.","category":"page"},{"location":"advanced_usage/","page":"Advanced Usage","title":"Advanced Usage","text":"import FastMultipole as fmm\nusing Random\ngravitational_path = normpath(joinpath(splitdir(pathof(fmm))[1], \"..\", \"test\", \"gravitational.jl\"))\ninclude(gravitational_path)\n\nfunction generate_gravitational(seed, n_bodies; radius_factor=0.1, strength_factor=1.0)\n Random.seed!(seed)\n bodies = rand(8,n_bodies)\n bodies[1:3,:] = rand(3,n_bodies) # body positions\n\n bodies[4,:] ./= (n_bodies^(1/3)*2) # body radii\n bodies[4,:] .*= radius_factor\n\n bodies[5,:] .*= strength_factor # body strengths\n\n system = Gravitational(bodies)\n return system\nend\n\ntarget_system = generate_gravitational(123, 100)\nsource_system = generate_gravitational(321, 100)\n\nfmm.fmm!(target_system, source_system,\n unsort_source_bodies=true, unsort_target_bodies=true) # standard run (defaults)\nfmm.fmm!(target_system, source_system,\n unsort_source_bodies=false, unsort_target_bodies=false) # sorted bodies (not original indices)","category":"page"},{"location":"advanced_usage/#Reusing-the-Octree","page":"Advanced Usage","title":"Reusing the Octree","text":"","category":"section"},{"location":"advanced_usage/","page":"Advanced Usage","title":"Advanced Usage","text":"Users are able to define the tree to be used in the FMM by passing in a previously created tree into the fmm! call. For convenience, the upward_pass, horizontal_pass, and downward_pass can be toggled off seperately. These are important to toggle when generating octrees to be reused. Additionally, unsort_target_bodies and unsort_source_bodies should be set to false when generating the reusable trees.","category":"page"},{"location":"advanced_usage/","page":"Advanced Usage","title":"Advanced Usage","text":"upward_pass creates the multipole expansions for each branch\nhorizontal_pass evaluates the expansions in the appropriate locations\ndownward_pass applies parent expansions to children branches","category":"page"},{"location":"advanced_usage/","page":"Advanced Usage","title":"Advanced Usage","text":"target_system = generate_gravitational(123, 100)\nsource_system = generate_gravitational(321, 100)\n\ntarget_tree, source_tree = fmm.fmm!(target_system, source_system;\n upward_pass=true, horizontal_pass=false, downward_pass=false,\n unsort_source_bodies=false, unsort_target_bodies=false) # generating trees to be reused\n\nfmm.fmm!(target_tree, target_system, source_tree, source_system;\n upward_pass=false, horizontal_pass=true, downward_pass=true) # reusing trees","category":"page"},{"location":"advanced_usage/#Partial-Evaluation","page":"Advanced Usage","title":"Partial Evaluation","text":"","category":"section"},{"location":"advanced_usage/","page":"Advanced Usage","title":"Advanced Usage","text":"The nearfield, farfield, and self_induced parameters allow users to bypass certain portions of the FMM.","category":"page"},{"location":"advanced_usage/","page":"Advanced Usage","title":"Advanced Usage","text":"nearfield if false, FastMultipole omits all direct interactions\nfarfield if false, FastMultipole omits all multipole interactions\nself_induced if false, FastMultipole omits the interaction of each leaf branch on itself","category":"page"},{"location":"advanced_usage/","page":"Advanced Usage","title":"Advanced Usage","text":"system = generate_gravitational(123, 100)\nfmm.fmm!(system,\n nearfield=true, farfield=true, self_induced=true) # standard run (defaults)\nfmm.fmm!(system,\n nearfield=false, farfield=true, self_induced=true) # nearfield not evaluated","category":"page"},{"location":"advanced_usage/#Resize-and-Recenter-Branches","page":"Advanced Usage","title":"Resize and Recenter Branches","text":"","category":"section"},{"location":"advanced_usage/","page":"Advanced Usage","title":"Advanced Usage","text":"The initial creation of the octree will create uniformly sized and spaced branches in each level. These branches are not centered or optimally sized with relation to the bodies they contain. As a default, the fmm! call resizes and recenters these branches to utilize the smallest possible radius that contains all the bodies in each branch[3]. This feature can be toggled with the source_shrink_recenter and target_shrink_recenter parameters.","category":"page"},{"location":"advanced_usage/","page":"Advanced Usage","title":"Advanced Usage","text":"target_system = generate_gravitational(123, 100)\nsource_system = generate_gravitational(321, 100)\n\nfmm.fmm!(target_system, source_system,\n source_shrink_recenter=true, target_shrink_recenter=true) # standard run (defaults)\nfmm.fmm!(target_system, source_system,\n source_shrink_recenter=false, target_shrink_recenter=false) # no branch recentering","category":"page"},{"location":"guided_examples/#Guided-Examples","page":"Guided Examples","title":"Guided Examples","text":"","category":"section"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"FastMultipole is designed to incorporate easily into your existing Julia code with minimal effort. We'll walk through the process of adding FastMultipole to an existing code in the following guided examples.","category":"page"},{"location":"guided_examples/#Gravitational-Example","page":"Guided Examples","title":"Gravitational Example","text":"","category":"section"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"In order to use FastMultipole, certain interface functions must be defined. In this example, we will walk through the process of incorporating FMM into the gravitational point mass model used in Quick Start. This code can also be found under test/gravitational.jl. Note that an additional (minimalistic) vortex particle example is included in test/vortex.jl.","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"To better understand how the FastMultipole interface functions, let's take a look at the data structures we'll use to define our point masses:","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"using FastMultipole\nusing FastMultipole.StaticArrays\n\nconst i_POTENTIAL = 1:4 # index of the gravitational potential\nconst i_VELOCITY = 5:7 # index of the velocity\nconst i_VELOCITY_GRADIENT = 8:16 # index of the velocity gradient\n\n# a single point mass\nstruct Body{TF}\n position::SVector{3,TF}\n radius::TF\n strength::SVector{4,TF}\nend\n\n# container for a system of `Body`'s\nstruct Gravitational{TF}\n bodies::Vector{Body{TF}}\n potential::Matrix{TF}\nend\n\n# constructor\nfunction Gravitational(bodies::Matrix)\n nbodies = size(bodies)[2]\n bodies2 = [Body(SVector{3}(bodies[1:3,i]),bodies[4,i],SVector{4}(bodies[5:8,i])) for i in 1:nbodies]\n potential = zeros(52,nbodies)\n return Gravitational(bodies2,potential)\nend","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"Note that while the particular choice of data structures is completely arbitrary, FastMultipole does not create any new storage containers for values of interest such as potential, velocity, velocity gradient. If these are desired, they must exist in the user-defined system, and will be updated in-place by FastMultipole.","category":"page"},{"location":"guided_examples/#Overloading-the-body_to_multipole!-Function","page":"Guided Examples","title":"Overloading the body_to_multipole! Function","text":"","category":"section"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"The function body_to_multipole! is used to generate multipole expansions for our particular system. This is done be overloading body_to_multipole! for the data structure representing our model. Convenience functions exist within FastMultipole to make this complicated function into a one-liner:","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"FastMultipole.body_to_multipole!(system::Gravitational, args...) =\n FastMultipole.body_to_multipole!(Point{Source}, system, args...)","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"Note that we are overloading body_to_multipole! to operate on our ::Gravitational system, which consists of point sources. Other convenience functions exist in FastMultipole for any combination of Point, Filament, or Panel geometries using Source, Dipole, or Vortex kernels. These are specified when overloading body_to_multipole! as {}. For example, if my model used vortex filaments, I would replace Point{Source} in the example above to Filament{Vortex}.","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"We use the fast recursive method of generating exact coefficients for panels as developed by [1].","category":"page"},{"location":"guided_examples/#Overloading-Getters","page":"Guided Examples","title":"Overloading Getters","text":"","category":"section"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"The Gravitational struct needs the following getters to be overloaded to support the indexing format used by FastMultipole. This approach allows for great flexibility without harming performance.","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"import Base: getindex\n\nBase.getindex(g::Gravitational, i, ::FastMultipole.Position) = g.bodies[i].position\nBase.getindex(g::Gravitational, i, ::FastMultipole.Radius) = g.bodies[i].radius\nBase.getindex(g::Gravitational, i, ::FastMultipole.ScalarPotential) = g.potential[1,i]\nBase.getindex(g::Gravitational, i, ::FastMultipole.Velocity) = view(g.potential,i_VELOCITY,i)\nBase.getindex(g::Gravitational, i, ::FastMultipole.VelocityGradient) = reshape(view(g.potential,i_VELOCITY_GRADIENT,i),3,3)\nBase.getindex(g::Gravitational, i, ::FastMultipole.Strength) = g.bodies[i].strength[1]\nBase.getindex(g::Gravitational, i, ::FastMultipole.Body) = g.bodies[i], view(g.potential,:,i)","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"It is worth noting that there are ways of defining these functions that would harm performance, e.g. by allocating an array each time the velocity is requested. It is up to the user to define these functions with the efficiency they desire.","category":"page"},{"location":"guided_examples/#Overloading-Setters","page":"Guided Examples","title":"Overloading Setters","text":"","category":"section"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"Gravitational also needs the following setters to be overloaded as well. These are used to update the potential and other quantities in-place. The same performance considerations that applied to getters apply here.","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"import Base: setindex!\n\nfunction Base.setindex!(g::Gravitational, val, i, ::FastMultipole.Body)\n body, potential = val\n g.bodies[i] = body\n g.potential[:,i] .= potential\n return nothing\nend\nfunction Base.setindex!(g::Gravitational, val, i, ::FastMultipole.ScalarPotential)\n g.potential[i_POTENTIAL[1],i] = val\nend\nfunction Base.setindex!(g::Gravitational, val, i, ::FastMultipole.Velocity)\n g.potential[i_VELOCITY,i] .= val\nend\nfunction Base.setindex!(g::Gravitational, val, i, ::FastMultipole.VelocityGradient)\n reshape(g.potential[i_VELOCITY_GRADIENT,i],3,3) .= val\nend","category":"page"},{"location":"guided_examples/#Additional-Requirements","page":"Guided Examples","title":"Additional Requirements","text":"","category":"section"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"In addition to the getters and setters listed above, each system struct must be overloaded with three additional methods. In gravitational.jl, these are they are overloaded as follows.","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"# determine the number of bodies contained by the system\nFastMultipole.get_n_bodies(g::Gravitational) = length(g.bodies)\n\n# determine the float-type used by the system\nBase.eltype(::Gravitational{TF}) where TF = TF\n\n# return all data structures required to define a single body\nFastMultipole.buffer_element(g::Gravitational) = (deepcopy(g.bodies[1]),zeros(eltype(g),52))","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"Note that the last of these functions, buffer_element, can return a tuple of values in case multiple data structures are required to define a single body.","category":"page"},{"location":"guided_examples/#Vector-Potential","page":"Guided Examples","title":"Vector Potential","text":"","category":"section"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"Ordinarily, a 3-dimensional vector potential, such as the stream function in 3-dimensional fluid dynamics, requires 3 separate expansions (1 for each dimension). In FastMultipole, however, we employ the Lamb-Helmholtz decomposition demonstrated by [2] to reduce the number of expansions required from 3 to 2, thus reducing computational cost.","category":"page"},{"location":"guided_examples/#Non-required-Functionality","page":"Guided Examples","title":"Non-required Functionality","text":"","category":"section"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"Though not required to run Fast Multipole, the direct! and save_vtk functions are useful for debugging and visualization. Here are some examples of how this could be implemented.","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"function FastMultipole.direct!(target_system, target_index, derivatives_switch, source_system::Gravitational, source_index)\n # nbad = 0\n for i_source in source_index\n source_x, source_y, source_z = source_system[i_source,FastMultipole.POSITION]\n source_strength = source_system.bodies[i_source].strength[1]\n for j_target in target_index\n target_x, target_y, target_z = target_system[j_target,FastMultipole.POSITION]\n dx = target_x - source_x\n dy = target_y - source_y\n dz = target_z - source_z\n r = sqrt(dx*dx + dy*dy + dz*dz)\n # te = @elapsed begin\n if r > 0\n dV = source_strength / r\n target_system[j_target,FastMultipole.SCALAR_POTENTIAL] += dV\n end\n # end\n # if te > 0.00001; nbad += 1; end\n end\n end\n # println(\"nbad = $nbad\")\nend\n\nfunction save_vtk(filename, element::Gravitational, nt=0; compress=false, extra_fields=nothing)\n _, n = size(element.bodies)\n WriteVTK.vtk_grid(filename*\"_point_masses.\"*string(nt)*\".vts\", reshape(view(element.bodies,1:3,:),3,n,1,1); compress) do vtk\n vtk[\"strength\"] = reshape(view(element.bodies,4,:), 1, n, 1, 1)\n vtk[\"velocity\"] = reshape(element.velocity, 3, n, 1, 1)\n vtk[\"scalar potential\"] = reshape(view(element.potential,1,:), n, 1, 1)\n vtk[\"vector potential\"] = reshape(view(element.potential,2:4,:), 3, n, 1, 1)\n if !isnothing(extra_fields)\n for i in 1:length(extra_fields)\n vtk[extra_fields[i][1]] = extra_fields[i][2]\n end\n end\n end\nend\n","category":"page"},{"location":"guided_examples/#FMM-Tuning-Parameters","page":"Guided Examples","title":"FMM Tuning Parameters","text":"","category":"section"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"We can improve the accuracy of the FMM by altering the follwing input parameters: multipole_threshold, leaf_size, and expansion_order. Though not linear, expansion_order is positively correlated with accuracy while multipole_threshold and leaf_size are negatively correlated.","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"multipole_threshold (between 0 and 1) the radius of the source over the minimum distance at which multipole expansion are used\nleaf_size (greater than 1) the maximum number of bodies included in each leaf level branch\nexpansion_order the number of terms included in each multipole expansion minus one","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"import FastMultipole as fmm\nusing Random\n\nfunction generate_gravitational(seed, n_bodies; radius_factor=0.1, strength_factor=1.0)\n Random.seed!(seed)\n bodies = rand(8,n_bodies)\n bodies[1:3,:] = rand(3,n_bodies) # body positions\n\n bodies[4,:] ./= (n_bodies^(1/3)*2) # body radii\n bodies[4,:] .*= radius_factor\n\n bodies[5,:] .*= strength_factor # body strengths\n\n system = Gravitational(bodies)\n return system\nend\n\nfunction measure_error(;multipole_threshold=0.4, leaf_size=50, expansion_order=5)\n fmm_system = generate_gravitational(123,1000)\n direct_system = deepcopy(fmm_system)\n\n fmm.fmm!(fmm_system; multipole_threshold, leaf_size, expansion_order)\n fmm.direct!(direct_system)\n\n percent_error = abs.((fmm_system.potential[1,:] .- direct_system.potential[1,:]) ./ direct_system.potential[1,:])\n return maximum(percent_error)\nend\n\n# default parameters\nprintln(measure_error(multipole_threshold=0.4, leaf_size=50, expansion_order=5))\n\n# expansion_order increased to 10\nprintln(measure_error(multipole_threshold=0.4, leaf_size=50, expansion_order=10))","category":"page"},{"location":"guided_examples/#Evaluate-Source-on-Target","page":"Guided Examples","title":"Evaluate Source on Target","text":"","category":"section"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"FastMutipole allows for the evaluation of source systems on target systems while leaving the source systems unaltered.","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"target_system = generate_gravitational(123, 100)\nsource_system = generate_gravitational(321, 100)\n\nfmm.fmm!(target_system, source_system)","category":"page"},{"location":"guided_examples/#Evaluate-Multiple-Sources-on-Multiple-Targets","page":"Guided Examples","title":"Evaluate Multiple Sources on Multiple Targets","text":"","category":"section"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"The FMM also supports the evaluation of multiple source systems on multiple target systems. The user is also able to evaluate a single source on multiple targets or multiple sources on a single target with any combination of supported system types.","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"vortex_path = normpath(joinpath(splitdir(pathof(fmm))[1], \"..\", \"test\", \"vortex.jl\"))\ninclude(vortex_path)\n\nfunction generate_vortex(seed, n_bodies; radius_factor=0.1, strength_factor=1.0)\n Random.seed!(seed)\n bodies = rand(8,n_bodies)\n bodies[1:3,:] = rand(3,n_bodies) # body positions\n\n bodies[4,:] ./= (n_bodies^(1/3)*2) # body radii\n bodies[4,:] .*= radius_factor\n\n bodies[5,:] .*= strength_factor # body strengths\n\n system = VortexParticles(bodies)\n return system\nend\n\ntarget_one = generate_gravitational(123, 100)\ntarget_two = generate_vortex(124, 100)\n\nsource_one = generate_gravitational(125, 100)\nsource_two = generate_vortex(126, 100)\n\nfmm.fmm!((target_one, target_two), (source_one, source_two))","category":"page"},{"location":"guided_examples/#Non-Potential-Flow-Applications","page":"Guided Examples","title":"Non-Potential Flow Applications","text":"","category":"section"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"As a default, target systems will be evaluated and returned with scalar_potential, velocity, and velocity_gradient fields populated. (Note that the vector potential is not explicitly tracked, though its induced velocity and velocity gradient are.) In some situations, only some of these values may be required. By inputting a boolean vector of the same length as target systems, the user is able to speed up the calculation by not storing unecessary values.","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"overlineV = -nabla phi + nabla times overlinepsi","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":" phi overlinepsi overlineV nabla overlineV\nfmm! Keyword Arguments scalar_potential vector_potential velocity velocity_gradient\nFluid Dynamics Scalar Potential Stream Function Fluid Velocity Velocity Gradient\nElectrostatics Electric Potential - Electric Field Field Gradient Tensor\nMagnetostatics - Magnetic Vector Potential Magnetic Field Field Gradient Tensor\nGravity Gravitational Potential - Gravitational Acceleration Acceleration Gradient Tensor","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"target_one = generate_gravitational(123, 100)\ntarget_two = generate_vortex(124, 100)\n\nsource_one = generate_gravitational(125, 100)\n\nfmm.fmm!((target_one, target_two), source_one, scalar_potential=[true, false],\n velocity=[true, true], velocity_gradient=[false, false])","category":"page"},{"location":"guided_examples/#Saving-Generated-Trees","page":"Guided Examples","title":"Saving Generated Trees","text":"","category":"section"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"A given fmm! call will typically return a single tree (if performed on the entire system) or two seperate source/target trees (if called on a source and a target). The function call can also be modified to save these trees.","category":"page"},{"location":"guided_examples/","page":"Guided Examples","title":"Guided Examples","text":"\ntarget_filepath = \"target_tree\"\nsource_filepath = \"source_tree\"\n\ntarget_tree, source_tree = fmm.fmm!((target_one, target_two), source_one;\n save_tree_target=true, save_name_target=target_filepath,\n save_tree_source=true, save_name_source=source_filepath)","category":"page"},{"location":"theory/#Theory","page":"Theory","title":"Theory","text":"","category":"section"},{"location":"theory/","page":"Theory","title":"Theory","text":"In a nutshell, FastMultipole operates by forming series expansions of a kernel function, and translating and combining those expansions to obtain optimal compression. You can get a sense for how this works in the following figure.","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"Here, we see how each body's influence can be expressed as a series expansion. These series expansions can be translated and combined such that an entire cluster of bodies is represented by a single series expansion. This is what is known as a multipole expansion. Multipole expansions only converge outside of a finite radius of convergence, as illustrated by the red dotted line. Multipole expansions can only be used for interactions that are farther apart than this circl. The accuracy of the expansion gets better and better the farther away we go, so we can control the accuracy by imposing a cutoff radius (dotted blue line), and only use multipole expansions for interactions that are farther away than the blue circle. Multipole expansions are very helpful for reducing the cost of the N-body problem; in fact, we can reduce the scaling of the N-body problem to O(NlogN) by only considering multipole expansions.","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"Local expansions are very similar to multipole expansions, but they converge inside of a finite radius rather than outside. These provide the additional required compression to achieve fully O(N) scaling. In the next figure, we see how local expansions can reduce the number of times an expansion need be evaluated.","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"More details of the fast multipole method (FMM) can be found in the original work by Greengard and Rokhlin.[4]","category":"page"},{"location":"theory/#References","page":"Theory","title":"References","text":"","category":"section"},{"location":"theory/","page":"Theory","title":"Theory","text":"N. A. Gumerov, S. Kaneko and R. Duraiswami. Recursive computation of the multipole expansions of layer potential integrals over simplices for efficient fast multipole accelerated boundary elements. Journal of Computational Physics 486, 112118 (2023).\n\n\n\nN. A. Gumerov and R. Duraiswami. Efficient FMM accelerated vortex methods in three dimensions via the Lamb–Helmholtz decomposition. Journal of Computational Physics 240, 310–328 (2013).\n\n\n\nS. DENG, C. JIANG, Y. WANG and H. WANG. Acceleration of unsteady vortex lattice method via dipole panel fast multipole method. Chinese Journal of Aeronautics 34, 265–278 (2021).\n\n\n\nL. Greengard and V. Rokhlin. A fast algorithm for particle simulations. Journal of computational physics 73, 325–348 (1987).\n\n\n\n","category":"page"},{"location":"quickstart/#Quick-Start","page":"Quick Start","title":"Quick Start","text":"","category":"section"},{"location":"quickstart/","page":"Quick Start","title":"Quick Start","text":"The following tutorial shows how to use FastMultipole to compute the gravitational potential induced by a collection of point masses. It uses data structures located in test/gravitational.jl.","category":"page"},{"location":"quickstart/#Create-a-System","page":"Quick Start","title":"Create a System","text":"","category":"section"},{"location":"quickstart/","page":"Quick Start","title":"Quick Start","text":"First, let's create a system of 1000 randomly spaced point masses:","category":"page"},{"location":"quickstart/","page":"Quick Start","title":"Quick Start","text":"using Random\nimport FastMultipole as fmm\ngravitational_path = normpath(joinpath(splitdir(pathof(fmm))[1], \"..\", \"test\", \"gravitational.jl\"))\ninclude(gravitational_path)\n\nfunction generate_gravitational(seed, n_bodies; radius_factor=0.1, strength_factor=1.0)\n Random.seed!(seed)\n bodies = rand(8,n_bodies)\n bodies[1:3,:] = rand(3,n_bodies) # body positions\n\n bodies[4,:] ./= (n_bodies^(1/3)*2) # body radii\n bodies[4,:] .*= radius_factor\n\n bodies[5,:] .*= strength_factor # body strengths\n\n system = Gravitational(bodies)\n return system\nend\n\nsystem = generate_gravitational(123, 1000)","category":"page"},{"location":"quickstart/#Evaluate-The-Potential-at-Each-Body","page":"Quick Start","title":"Evaluate The Potential at Each Body","text":"","category":"section"},{"location":"quickstart/","page":"Quick Start","title":"Quick Start","text":"The fmm! function evaluates the gravitational potential induced by system in-place. We can control the tradeoff between performance and accuracy by tuning a handful of parameters for our particular system, but we'll stick with the defaults for this example:","category":"page"},{"location":"quickstart/","page":"Quick Start","title":"Quick Start","text":"fmm.fmm!(system)","category":"page"},{"location":"quickstart/","page":"Quick Start","title":"Quick Start","text":"The resulting potential can then be accessed as a field of system.","category":"page"},{"location":"quickstart/","page":"Quick Start","title":"Quick Start","text":"@show system.potential[1,:]","category":"page"},{"location":"quickstart/#Accuracy-of-FMM-Call","page":"Quick Start","title":"Accuracy of FMM Call","text":"","category":"section"},{"location":"quickstart/","page":"Quick Start","title":"Quick Start","text":"By using the direct! function, we can check the accuracy of the fmm! call by evaluating the ''N''-body problem naively, without fast multipole acceleration.","category":"page"},{"location":"quickstart/","page":"Quick Start","title":"Quick Start","text":"direct_system = deepcopy(system)\ndirect_system.potential .= 0\n\nfmm.direct!(direct_system)\n\npercent_error = abs.((system.potential[1,:] .- direct_system.potential[1,:]) ./ direct_system.potential[1,:])\n\n@show maximum(percent_error)","category":"page"},{"location":"reference/#Reference","page":"Reference","title":"Reference","text":"","category":"section"},{"location":"reference/","page":"Reference","title":"Reference","text":"CurrentModule = FastMultipole","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Modules = [FastMultipole]\nOrder = [:constant, :type, :function]\n# Pages = [\"fmm.jl\"]","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Modules = [FastMultipole]\nOrder = [:constant, :type, :function]\n# Pages = [\"fmm.jl\"]","category":"page"},{"location":"reference/#FastMultipole.DerivativesSwitch","page":"Reference","title":"FastMultipole.DerivativesSwitch","text":"DerivativesSwitch\n\nSwitch indicating whether the scalar potential, vector potential, velocity, and/or velocity gradient should be computed for a target system. Information is stored as type parameters, allowing the compiler to compile away if statements.\n\n\n\n\n\n","category":"type"},{"location":"reference/#FastMultipole.DerivativesSwitch-Tuple{Any, Any, Any}","page":"Reference","title":"FastMultipole.DerivativesSwitch","text":"DerivativesSwitch(scalar_potential, velocity, velocity_gradient)\n\nConstructs a tuple of DerivativesSwitch objects.\n\nArguments\n\nscalar_potential::Vector{Bool}: a vector of ::Bool indicating whether the scalar potential should be computed for each target system\nvelocity::Vector{Bool}: a vector of ::Bool indicating whether the velocity should be computed for each target system\nvelocity_gradient::Vector{Bool}: a vector of ::Bool indicating whether the velocity gradient should be computed for each target system\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.DerivativesSwitch-Tuple{Bool, Bool, Bool, Tuple}","page":"Reference","title":"FastMultipole.DerivativesSwitch","text":"DerivativesSwitch(scalar_potential, velocity, velocity_gradient, target_systems)\n\nConstructs a ::Tuple of indentical DerivativesSwitch objects of the same length as target_systems (if it is a ::Tuple), or a single DerivativesSwitch (if target_system is not a ::Tuple)\n\nArguments\n\nscalar_potential::Bool: a ::Bool indicating whether the scalar potential should be computed for each target system\nvelocity::Bool: a ::Bool indicating whether the velocity should be computed for each target system\nvelocity_gradient::Bool: a ::Bool indicating whether the velocity gradient should be computed for each target system\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.DerivativesSwitch-Tuple{Bool, Bool, Bool}","page":"Reference","title":"FastMultipole.DerivativesSwitch","text":"DerivativesSwitch(scalar_potential, velocity, velocity_gradient)\n\nConstructs a single DerivativesSwitch object.\n\nArguments\n\nscalar_potential::Bool: a ::Bool indicating whether the scalar potential should be computed for the target system\nvelocity::Bool: a ::Bool indicating whether the velocity should be computed for the target system\nvelocity_gradient::Bool: a ::Bool indicating whether the velocity gradient should be computed for the target system\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.ExpansionSwitch","page":"Reference","title":"FastMultipole.ExpansionSwitch","text":"ExpansionSwitch\n\nSwitch indicating which expansions should be used:\n\nscalar potential (SP)\nvector potential via Lamb-Helmholtz decomposition (VP)\n\n\n\n\n\n","category":"type"},{"location":"reference/#FastMultipole.MultiBranch","page":"Reference","title":"FastMultipole.MultiBranch","text":"MultiBranch{TF,N} <: Branch{TF}\n\nBranch object used to sort more than one system into an octree. Type parameters represent:\n\nTF: the floating point type (would be a dual number if using algorithmic differentiation)\nN: the number of systems represented\n\nFields\n\nbodies_index::Vector{UnitRange}: vector of unit ranges indicating the index of bodies in each represented system, respectively\nn_branches::Int: number of child branches corresponding to this branch\nbranch_index::UnitRange: indices of this branch's child branches\ni_parent::Int: index of this branch's parent\ni_leaf::Int: if this branch is a leaf, what is its index in its parent <:Tree's leaf_index field\ncenter::Vector{TF}: center of this branch at which its multipole and local expansions are centered\nsource_radius::TF: if this branch is a leaf, distance from center to the outer edge of farthest body contained in this branch; otherwise, this is the distance from center to the corner of its source_box\ntarget_radius::TF: distance from center to the farthest body center contained in this branch\nsource_box::Vector{TF}: vector of length 6 containing the distances from the center to faces of a rectangular prism completely enclosing all bodies with their finite radius in the negative x, positive x, negative y, positive y, negative z, and positive z directions, respectively\ntarget_box::Vector{TF}: vector of length 3 containing the distances from the center to faces of a rectangular prism completely enclosing all body centers in the x, y, and z direction, respectively\nmultipole_expansion::Array{TF,3}: array of size (2,2,) containing the multipole expansion coefficients; the first index indicates real or imaginary, the second index indicates scalar potential or the second component of the Lamb-Helmholtz decomposition, and the third indexk` indicates the expansion coefficient of degree n and order m, as k = p(p+1)2 + m + 1\nlocal_expansion::Array{TF,3}: array of size(2,2,(p+1)(p+2)/2)containing the local expansion coefficients; the first index indicates real or imaginary, the second index indicates scalar potential or the second component of the Lamb-Helmholtz decomposition, and the third indexk` indicates the expansion coefficient of degree n and order m, as k = p(p+1)2 + m + 1\nharmonics::Array{TF,3}: array of size (2,2,(p+1)(p+2)/2) used as storage for regular harmonics, irregular harmonics, or whatever is needed, and is indexed as multipole and local expansions\nlock::ReentrantLock: lock used to avoid data race conditions when modifying this branch or its corresponding bodies\n\n\n\n\n\n","category":"type"},{"location":"reference/#FastMultipole.MultiTree","page":"Reference","title":"FastMultipole.MultiTree","text":"bodies[indexlist] is the same sort operation as performed by the tree sortedbodies[inverseindexlist] undoes the sort operation performed by the tree\n\n\n\n\n\n","category":"type"},{"location":"reference/#FastMultipole.ProbeSystem","page":"Reference","title":"FastMultipole.ProbeSystem","text":"ProbeSystem\n\nConvenience system for defining locations at which the potential, velocity, or velocity gradient may be desired.\n\n\n\n\n\n","category":"type"},{"location":"reference/#FastMultipole.ProbeSystem-Union{Tuple{Array{StaticArraysCore.SVector{3, TF}, 1}}, Tuple{TF}} where TF","page":"Reference","title":"FastMultipole.ProbeSystem","text":"ProbeSystem(positions; kwargs...)\n\nA convenience system constructor for calculating the influence of source systems at locations not already described by a system object. It behaves like a system whose elements induce a null potential field.\n\nArguments\n\npositions::Vector{SVector{3,Float64}}: a vector of position vectors of each probe\n\nOptional Arguments\n\nscalar_potential::Bool: whether or not to compute the scalar potential at each probe location\nvector_potential::Bool: whether or not to compute the vector potential at each probe location\nvelocity::Bool: whether or not to compute the velocity at each probe location\nvelocity_gradient::Bool: whether or not to compute the velocity gradient at each probe location\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.ProbeSystem-Union{Tuple{Matrix{TF}}, Tuple{TF}} where TF","page":"Reference","title":"FastMultipole.ProbeSystem","text":"ProbeSystem(positions; kwargs...)\n\nDispatch of ProbeSystem accepting a matrix of horizontally concatenated column vectors describing the position of each probe. Optional arguments are identical.\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.SingleBranch","page":"Reference","title":"FastMultipole.SingleBranch","text":"SingleBranch{TF} <: Branch{TF}\n\nBranch object used to sort a single system into an octree. Type parameters represent:\n\nTF: the floating point type (would be a dual number if using algorithmic differentiation)\n\nFields\n\nbodies_index::UnitRange: unit range indicating the index of bodies in the represented system\nn_branches::Int: number of child branches corresponding to this branch\nbranch_index::UnitRange: indices of this branch's child branches\ni_parent::Int: index of this branch's parent\ni_leaf::Int: if this branch is a leaf, what is its index in its parent <:Tree's leaf_index field\ncenter::Vector{TF}: center of this branch at which its multipole and local expansions are centered\nsource_radius::TF: if this branch is a leaf, distance from center to the outer edge of farthest body contained in this branch; otherwise, this is the distance from center to the corner of its source_box\ntarget_radius::TF: distance from center to the farthest body center contained in this branch\nsource_box::Vector{TF}: vector of length 6 containing the distances from the center to faces of a rectangular prism completely enclosing all bodies with their finite radius in the negative x, positive x, negative y, positive y, negative z, and positive z directions, respectively\ntarget_box::Vector{TF}: vector of length 3 containing the distances from the center to faces of a rectangular prism completely enclosing all body centers in the x, y, and z direction, respectively\nmultipole_expansion::Array{TF,3}: array of size (2,2,) containing the multipole expansion coefficients; the first index indicates real or imaginary, the second index indicates scalar potential or the second component of the Lamb-Helmholtz decomposition, and the third indexk` indicates the expansion coefficient of degree n and order m, as k = p(p+1)2 + m + 1\nlocal_expansion::Array{TF,3}: array of size(2,2,(p+1)(p+2)/2)containing the local expansion coefficients; the first index indicates real or imaginary, the second index indicates scalar potential or the second component of the Lamb-Helmholtz decomposition, and the third indexk` indicates the expansion coefficient of degree n and order m, as k = p(p+1)2 + m + 1\nharmonics::Array{TF,3}: array of size (2,2,(p+1)(p+2)/2) used as storage for regular harmonics, irregular harmonics, or whatever is needed, and is indexed as multipole and local expansions\nlock::ReentrantLock: lock used to avoid data race conditions when modifying this branch or its corresponding bodies\n\n\n\n\n\n","category":"type"},{"location":"reference/#FastMultipole.SortWrapper-Tuple{Any}","page":"Reference","title":"FastMultipole.SortWrapper","text":"SortWrapper(system)\n\nConvenience wrapper for systems whose elements cannot be sorted in-place (e.g. structured grids). The resulting object is treated like any other system.\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.Tree","page":"Reference","title":"FastMultipole.Tree","text":"abstract type Tree{TF,P} end\n\nSupertype of all octree structures with TF the floating point type and P the expansion order.\n\n\n\n\n\n","category":"type"},{"location":"reference/#FastMultipole.EmptyTree-Tuple{Any}","page":"Reference","title":"FastMultipole.EmptyTree","text":"EmptyTree(system)\n\nReturns an empty tree. Used if system is empty.\n\nArguments\n\nsystem: the system from which a tree is to be created\n\nReturns\n\ntree: if typeof(system)<:Tuple, a ::MultiTree is returned; otherwise, a ::SingleTree is returned\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.accumulate_charge!-Union{Tuple{TF}, Tuple{AbstractVector{<:Branch{TF}}, Any, Any}} where TF","page":"Reference","title":"FastMultipole.accumulate_charge!","text":"accumulate_charge!(branches, systems, branch_index)\n\nComputes the sum of the absolute value of body source strengths, as well as the sum of the L2 norm of the dipole strengths, and store them in each branch, inheriting values from child branches if available.\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.accumulate_charge_bodies!-Union{Tuple{TF}, Tuple{Array{SingleBranch{TF}, 1}, Any, Any}} where TF","page":"Reference","title":"FastMultipole.accumulate_charge_bodies!","text":"accumulate_charge!(branch, systems)\n\nComputes the sum of the absolute value of body source strengths, as well as the sum of the L2 norm of the dipole strengths, based on source bodies directly, and store them in each branch.\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.add_line!-Tuple{ProbeSystem, Vararg{Any, 4}}","page":"Reference","title":"FastMultipole.add_line!","text":"add_line!(probes::ProbeSystem, x1, x2, n_probes, i_last)\n\nAdds n_probes probes in a line between x1 and x2. Specifically, they are added at the midpoint of equally partiti oned segments of the line.\n\nArguments\n\nprobes::ProbeSystem: the probe system whose .position field is to be updated\nx1::Vector{Float64}: the first point defining the line along which probes are to be added\nx2::Vector{Float64}: the second point defining the line along which probes are to be added\nn_probes::Int: number of probes to be added\ni_last::Int: index of the last probe in probes\n\nOutput\n\ni_last::Int: updated index of the last probe in probes\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.back_rotate_local_y!-NTuple{7, Any}","page":"Reference","title":"FastMultipole.back_rotate_local_y!","text":"Assumes Ts, Hsπ2, and ηsmag have all been precomputed. Resets target_weights.\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.back_rotate_multipole_y!-NTuple{6, Any}","page":"Reference","title":"FastMultipole.back_rotate_multipole_y!","text":"Assumes Ts, Hsπ2, and ζsmag have all been precomputed. Resets target_weights.\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.back_rotate_z!-Union{Tuple{LH}, Tuple{Any, Any, Any, Any, Val{LH}}} where LH","page":"Reference","title":"FastMultipole.back_rotate_z!","text":"Assumes eimϕs have already been computed. DOES NOT overwrite rotated weights (unlike other rotate functions); rather, accumulates on top of it.\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.calculate_ib!-Union{Tuple{P}, Tuple{Any, Any, Any, Any, Any, Any, Val{P}}} where P","page":"Reference","title":"FastMultipole.calculate_ib!","text":"assumes j has already been calculated\n\nNote: if X0real is replaced with X0real + Xw_real, etc., this becomes bnm (as used for volumes) instead of inm (as used for panels)\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.calculate_pj!-Union{Tuple{P}, Tuple{Any, Any, Any, Any, Any, Any, Val{P}}} where P","page":"Reference","title":"FastMultipole.calculate_pj!","text":"assumes q has already been calculated\n\nIf X0real is replaced with X0real + Xv_real, etc., the result becomes jnm instead of pnm, as used for panels.\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.d2rdx2-Tuple{Any, Any, Any}","page":"Reference","title":"FastMultipole.d2rdx2","text":"drk/dxidx_j\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.direct!-Tuple{Any, Any}","page":"Reference","title":"FastMultipole.direct!","text":"direct!(target_system, source_system; derivatives_switches)\n\nApplies all interactions of source_system acting on target_system without multipole acceleration.\n\nArguments\n\ntarget_system: either\na system object for which compatibility functions have been overloaded, or\na tuple of system objects for which compatibility functions have been overloaded\nsource_system: either\na system object for which compatibility functions have been overloaded, or\na tuple of system objects for which compatibility functions have been overloaded\n\nOptional Arguments\n\nscalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a scalar potential from source_systems\nvelocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity from source_systems\nvelocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity gradient from source_systems\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.direct!-Tuple{Tuple}","page":"Reference","title":"FastMultipole.direct!","text":"direct!(systems; derivatives_switches)\n\nApplies all interactions of systems acting on itself without multipole acceleration.\n\nArguments\n\nsystems: either\na system object for which compatibility functions have been overloaded, or\na tuple of system objects for which compatibility functions have been overloaded\n\nOptional Arguments\n\nscalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a scalar potential from source_systems\nvelocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity from source_systems\nvelocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity gradient from source_systems\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.drdx-Tuple{Any, Any, Any}","page":"Reference","title":"FastMultipole.drdx","text":"drj/dxi\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.fmm!-Union{Tuple{Any}, Tuple{PE}} where PE","page":"Reference","title":"FastMultipole.fmm!","text":"fmm!(systems; kwargs...)\n\nApply all interactions of systems acting on itself using the fast multipole method. Assumes compatibility functions have been overloaded for both source and target systems.\n\nArguments\n\nsystems: either\na system object for which compatibility functions have been overloaded, or\na tuple of system objects for which compatibility functions have been overloaded\n\nOptional Arguments\n\nexpansion_order::Int: the expansion order to be used\nleaf_size::Int: maximum number of bodies from systems allowed in a leaf-level branch\nmultipole_threshold::Float64: number between 0 and 1 (often denoted theta in [0,1]) controls the accuracy by determining the non-dimensional distance after which multipoles are used; 0 means an infinite distance (no error, high cost), and 1 means barely convergent (high error, low cost)\nscalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(systems) indicating whether each system should receive a scalar potential from source_systems\nvelocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(systems) indicating whether each system should receive a velocity from source_systems\nvelocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(systems) indicating whether each system should receive a velocity gradient from source_systems\nupward_pass::Bool: whether or not to form the multipole expansions from source bodies and translate them upward in the source tree\nhorizontal_pass::Bool: whether or not to transform multipole expansions from the source tree into local expansions in the target tree\ndownward_pass::Bool: whether or not to translate local expansions down to the leaf level of the target tree and evaluate them\nnearfield::Bool: indicates whether near-field (comuted without multipoles) interactions should be included in the direct_list\nfarfield::Bool: indicates whether far-field (comuted with multipoles) interactions should be included in the m2l_list\nself_induced::Bool: indicates whether to include the interactions of each leaf-level branch on itself in the direct_list\nunsort_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for systems\nshink_recenter::Bool: indicates whether or not to resize branches for the octree after it is created to increase computational efficiency\nsave_tree::Bool: indicates whether or not to save a VTK file for visualizing the octree\nsave_name::String: name and path of the octree visualization if save_tree == true\nnearfield_user::Bool: indicates whether or not the nearfield_user! function should be used for nearfield interactions\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.fmm!-Union{Tuple{PE}, Tuple{Any, Any}} where PE","page":"Reference","title":"FastMultipole.fmm!","text":"fmm!(target_systems, source_systems; kwargs...)\n\nApply all interactions of source_systems acting on target_systems using the fast multipole method. Assumes compatibility functions have been overloaded for both source and target systems.\n\nArguments\n\ntarget_systems: either\na system object for which compatibility functions have been overloaded, or - a tuple of system objects for which compatibility functions have been overloaded\nsource_systems: either\na system object for which compatibility functions have been overloaded, or\na tuple of system objects for which compatibility functions have been overloaded\n\nOptional Arguments\n\nexpansion_order::Int: the expansion order to be used\nleaf_size_source::Int: maximum number of bodies from source_systems allowed in a leaf-level branch\nleaf_size_target::Int: maximum number of bodies from target_systems allowed in a leaf-level branch\nmultipole_threshold::Float64: number between 0 and 1 (often denoted theta in [0,1]) controls the accuracy by determining the non-dimensional distance after which multipoles are used; 0 means an infinite distance (no error, high cost), and 1 means barely convergent (high error, low cost)\nlamb_helmholtz::Bool: determines whether or not to calculate the induced velocity due to a vector potential using the Lamb-Helmholtz decomposition; erroroneous velocity and gradient will result if lamb_helmholtz==false and a vector potential is used.\nscalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a scalar potential from source_systems\nvelocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity from source_systems\nvelocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity gradient from source_systems\nupward_pass::Bool: whether or not to form the multipole expansions from source bodies and translate them upward in the source tree\nhorizontal_pass::Bool: whether or not to transform multipole expansions from the source tree into local expansions in the target tree\ndownward_pass::Bool: whether or not to translate local expansions down to the leaf level of the target tree and evaluate them\nnearfield::Bool: indicates whether near-field (comuted without multipoles) interactions should be included\nfarfield::Bool: indicates whether far-field (comuted with multipoles) interactions should be included\nself_induced::Bool: indicates whether to include the interactions of each leaf-level branch on itself\nunsort_source_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for the source_systems\nunsort_target_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for the target_systems\nsource_shink_recenter::Bool: indicates whether or not to resize branches for the source_systems octree after it is created to increase computational efficiency\ntarget_shink_recenter::Bool: indicates whether or not to resize branches for the target_systems octree after it is created to increase computational efficiency\nsave_tree_source::Bool: indicates whether or not to save a VTK file for visualizing the source octree\nsave_tree_target::Bool: indicates whether or not to save a VTK file for visualizing the target octree\nsave_name_source::String: name and path of the source octree visualization if save_tree == true\nsave_name_target::String: name and path of the target octree visualization if save_tree == true\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.fmm!-Union{Tuple{PE}, Tuple{Tree, Any, Any, Any, Any, Val}} where PE","page":"Reference","title":"FastMultipole.fmm!","text":"fmm!(tree, systems; kwargs...)\n\nDispatches fmm! using an existing ::Tree.\n\nArguments\n\ntree::Tree: a <:Tree object (see Tree)\nsystems: either\na system object for which compatibility functions have been overloaded, or\na tuple of system objects for which compatibility functions have been overloaded\nm2l_list::Vector{SVector{2,Int32}}: list of branch index pairs [i_target, i_source] for which multipole expansions of the source branch are to be transformed to local expansions at the target branch\ndirect_list::Union{Vector{SVector{2,Int32}}, InteractionList}: list of branch index pairs [i_target, i_source] for which interactions are to be evaluted without multipole expansion (i.e., directly); if typeof(direct_list) <: InteractionList, then prepared influence matrices are used rather than computing direct influences on the fly\nderivatives_switches::Union{DerivativesSwitch, Tuple{<:DerivativesSwitch,...}}: switch determining which of scalar potential, vector potential, velocity, and/or velocity gradient are to be computed for each target system\n\nOptional Arguments\n\nupward_pass::Bool: whether or not to form the multipole expansions from source bodies and translate them upward in the source tree\nhorizontal_pass::Bool: whether or not to transform multipole expansions from the source tree into local expansions in the target tree\ndownward_pass::Bool: whether or not to translate local expansions down to the leaf level of the target tree and evaluate them\nunsort_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for systems\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.fmm!-Union{Tuple{PE}, Tuple{Tree, Any, Tree, Any, Any, Any, Any, Val}} where PE","page":"Reference","title":"FastMultipole.fmm!","text":"fmm!(target_tree, target_systems, source_tree, source_systems, m2l_list, direct_list, derivatives_switches; kwargs...)\n\nDispatches fmm! using existing ::Tree objects.\n\nArguments\n\ntarget_tree::Tree: a <:Tree object (see Tree)\ntarget_systems: either\na system object for which compatibility functions have been overloaded, or\na tuple of system objects for which compatibility functions have been overloaded\nsource_tree::Tree: a <:Tree object (see Tree)\nsource_systems: either\na system object for which compatibility functions have been overloaded, or\na tuple of system objects for which compatibility functions have been overloaded\nm2l_list::Vector{SVector{2,Int32}}: list of branch index pairs [i_target, i_source] for which multipole expansions of the source branch are to be transformed to local expansions at the target branch\ndirect_list::Union{Vector{SVector{2,Int32}}, InteractionList}: list of branch index pairs [i_target, i_source] for which interactions are to be evaluted without multipole expansion (i.e., directly); if typeof(direct_list) <: InteractionList, then prepared influence matrices are used rather than computing direct influences on the fly\nderivatives_switches::Union{DerivativesSwitch, Tuple{<:DerivativesSwitch,...}}: switch determining which of scalar potential, vector potential, velocity, and/or velocity gradient are to be computed for each target system\n\nOptional Arguments\n\nmultipole_threshold::Float64: number between 0 and 1 (often denoted theta in [0,1]) controls the accuracy by determining the non-dimensional distance after which multipoles are used; 0 means an infinite distance (no error, high cost), and 1 means barely convergent (high error, low cost)\nscalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a scalar potential from source_systems\nvelocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity from source_systems\nvelocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity gradient from source_systems\nupward_pass::Bool: whether or not to form the multipole expansions from source bodies and translate them upward in the source tree\nhorizontal_pass::Bool: whether or not to transform multipole expansions from the source tree into local expansions in the target tree\ndownward_pass::Bool: whether or not to translate local expansions down to the leaf level of the target tree and evaluate them\nnearfield::Bool: indicates whether near-field (comuted without multipoles) interactions should be included\nfarfield::Bool: indicates whether far-field (comuted with multipoles) interactions should be included\nself_induced::Bool: indicates whether to include the interactions of each leaf-level branch on itself\nunsort_source_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for source_systems\nunsort_target_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for target_systems\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.fmm!-Union{Tuple{PE}, Tuple{Tree, Any, Tree, Any}} where PE","page":"Reference","title":"FastMultipole.fmm!","text":"fmm!(target_tree, target_systems, source_tree, source_systems; kwargs...)\n\nDispatches fmm! using existing ::Tree objects.\n\nArguments\n\ntarget_tree::Tree: a <:Tree object (see Tree)\ntarget_systems: either\na system object for which compatibility functions have been overloaded, or\na tuple of system objects for which compatibility functions have been overloaded\nsource_tree::Tree: a <:Tree object (see Tree)\nsource_systems: either\na system object for which compatibility functions have been overloaded, or\na tuple of system objects for which compatibility functions have been overloaded\n\nOptional Arguments\n\nmultipole_threshold::Float64: number between 0 and 1 (often denoted theta in [0,1]) controls the accuracy by determining the non-dimensional distance after which multipoles are used; 0 means an infinite distance (no error, high cost), and 1 means barely convergent (high error, low cost)\nscalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a scalar potential from source_systems\nvelocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity from source_systems\nvelocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(target_systems) indicating whether each system should receive a velocity gradient from source_systems\nreset_source_tree::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(source_systems) indicating whether or not to reset the expansions of each source tree\nreset_target_tree::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(source_systems) indicating whether or not to reset the expansions of each target tree\nupward_pass::Bool: whether or not to form the multipole expansions from source bodies and translate them upward in the source tree\nhorizontal_pass::Bool: whether or not to transform multipole expansions from the source tree into local expansions in the target tree\ndownward_pass::Bool: whether or not to translate local expansions down to the leaf level of the target tree and evaluate them\nnearfield::Bool: indicates whether near-field (computed without multipoles) interactions should be included in the direct_list\nfarfield::Bool: indicates whether far-field (computed with multipoles) interactions should be included in the m2l_list\nself_induced::Bool: indicates whether to include the interactions of each leaf-level branch on itself in the direct_list\nunsort_source_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for source_systems\nunsort_target_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for target_systems\nnearfield_user::Bool: indicates whether or not the nearfield_user! function should be used for nearfield interactions\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.fmm!-Union{Tuple{PE}, Tuple{Tree, Any}} where PE","page":"Reference","title":"FastMultipole.fmm!","text":"fmm!(tree, systems; kwargs...)\n\nDispatches fmm! using an existing ::Tree.\n\nArguments\n\ntree::Tree: a <:Tree object (see Tree)\nsystems: either\na system object for which compatibility functions have been overloaded, or\na tuple of system objects for which compatibility functions have been overloaded\n\nOptional Arguments\n\nmultipole_threshold::Float64: number between 0 and 1 (often denoted theta in [0,1]) controls the accuracy by determining the non-dimensional distance after which multipoles are used; 0 means an infinite distance (no error, high cost), and 1 means barely convergent (high error, low cost)\nscalar_potential::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(systems) indicating whether each system should receive a scalar potential from source_systems\nvelocity::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(systems) indicating whether each system should receive a velocity from source_systems\nvelocity_gradient::Bool: either a ::Bool or a ::AbstractVector{Bool} of length length(systems) indicating whether each system should receive a velocity gradient from source_systems\nupward_pass::Bool: whether or not to form the multipole expansions from source bodies and translate them upward in the source tree\nhorizontal_pass::Bool: whether or not to transform multipole expansions from the source tree into local expansions in the target tree\ndownward_pass::Bool: whether or not to translate local expansions down to the leaf level of the target tree and evaluate them\nnearfield::Bool: indicates whether near-field (computed without multipoles) interactions should be included in the direct_list\nfarfield::Bool: indicates whether far-field (computed with multipoles) interactions should be included in the m2l_list\nself_induced::Bool: indicates whether to include the interactions of each leaf-level branch on itself in the direct_list\nunsort_bodies::Bool: indicates whether or not to undo the sort operation used to generate the octree for systems\nnearfield_user::Bool: indicates whether or not the nearfield_user! function should be used for nearfield interactions\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.get_P-NTuple{4, Any}","page":"Reference","title":"FastMultipole.get_P","text":"get_P(r_max_over_ρ_min, ρ_max_over_r_min, Pmax, ε_rel)\n\nReturns the smallest expansion order not greater than Pmax and satisfying the specified relative error tolerance.\n\nInputs\n\nr_max_over_ρ_min::Float64: ratio r_max / ρ_min\nρ_max_over_r_min::Float64: ratio ρ_max / r_min\nPmax::Int64: maximum allowable expansion order\nε_rel::Float64: relative error tolerance\n\nwhere\n\nr_max::Float64: distance from the local expansion to the farthest target\nr_min::Flaot64: distance from the multipole expansion to the closest target\nρ_max::Float64: distance from the multipole expansion to the farthest source\nρ_min::Float64: distance from the local expansion to the closest source\n\nOuputs\n\nP::Int: the smallest expansion order to satisfy the error tolerance\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.local_to_local!-Union{Tuple{LH}, Tuple{P}, Tuple{Any, Any, Any, Any, Any, Any, Any, Any, Val{P}, Val{LH}}} where {P, LH}","page":"Reference","title":"FastMultipole.local_to_local!","text":"Expects ηsmag and Hsπ2 to be precomputed. Ts and eimϕs are computed here.\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.mirrored_source_to_vortex!-Union{Tuple{P}, Tuple{Any, Any, Any, Any, Any, Val{P}}} where P","page":"Reference","title":"FastMultipole.mirrored_source_to_vortex!","text":"my novel derivation\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.multipole_to_local!-Union{Tuple{LH}, Tuple{Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Val{LH}}} where LH","page":"Reference","title":"FastMultipole.multipole_to_local!","text":"Expects ζsmag, ηsmag, and Hs_π2 to be computed a priori.\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.reset!-Tuple{ProbeSystem}","page":"Reference","title":"FastMultipole.reset!","text":"reset!(probes)\n\nZeroes all values (e.g. scalar/vector potential, velocity, and/or velocity gradient) of all probes.\n\nArguments\n\nprobes::ProbeSystem: a ::ProbeSystem object\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.resort!-Tuple{Tuple, MultiTree}","page":"Reference","title":"FastMultipole.resort!","text":"Performs the same sort operation as the tree. (Undoes unsort! operation.)\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.rotate_multipole_y!-NTuple{8, Any}","page":"Reference","title":"FastMultipole.rotate_multipole_y!","text":"Rotate solid harmonic weights about the y axis by θ. Note that Hsπ2 and ζsmag must be updated a priori, but Ts is updated en situ. Resets rotated_weights before computing.\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.rotate_z!-Union{Tuple{LH}, Tuple{Any, Any, Any, Any, Any, Val{LH}}} where LH","page":"Reference","title":"FastMultipole.rotate_z!","text":"Performs a z-axis rotation of the supplied solid harmonic coefficients. Computes e^{imϕ} as well.\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.shrink_branch!-Tuple{Any, Any, Any}","page":"Reference","title":"FastMultipole.shrink_branch!","text":"Computes the smallest bounding box to completely bound all child boxes.\n\nShrunk radii are merely the distance from the center to the corner of the box.\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.source_to_dipole!-Union{Tuple{P}, Tuple{Any, Any, Any, Any, Any, Any, Val{P}}} where P","page":"Reference","title":"FastMultipole.source_to_dipole!","text":"assumes source expansion coefficients have already been calculated\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.source_to_vortex_point!-Union{Tuple{P}, Tuple{Any, Any, Any, Any, Any, Any, Val{P}}} where P","page":"Reference","title":"FastMultipole.source_to_vortex_point!","text":"might be slightly faster than mirroredsourceto_vortex\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.translate_local_z!-Union{Tuple{LH}, Tuple{Any, Any, Any, Any, Val{LH}}} where LH","page":"Reference","title":"FastMultipole.translate_local_z!","text":"Overwrites translated_weights\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.translate_multipole_to_local_z!-Union{Tuple{LH}, Tuple{Any, Any, Any, Any, Val{LH}}} where LH","page":"Reference","title":"FastMultipole.translate_multipole_to_local_z!","text":"Overwrites translated_weights\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.translate_multipole_z!-Union{Tuple{LH}, Tuple{Any, Any, Any, Any, Val{LH}}} where LH","page":"Reference","title":"FastMultipole.translate_multipole_z!","text":"Overwrites translated_weights\n\n\n\n\n\n","category":"method"},{"location":"reference/#FastMultipole.unsort!-Tuple{Tuple, MultiTree}","page":"Reference","title":"FastMultipole.unsort!","text":"Undoes the sort operation performed by the tree.\n\n\n\n\n\n","category":"method"},{"location":"#FastMultipole","page":"Introduction","title":"FastMultipole","text":"","category":"section"},{"location":"","page":"Introduction","title":"Introduction","text":"A fast, multi-system, multi-kernel, differentiable implementation of the fast multipole method for use with scalar-plus-vector potential N-body problems in pure Julia.","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"Author: Ryan Anderson","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"Features:","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"solves N-body problems governed by the Laplace (1r) kernel, with work planned to support the Helmholtz kernel in the future\nincorporates seamlessly into existing Julia code without modifications (just the addition of a few interface functions)\noffers convenience functions for determining the expansion coefficients for source points, vortex points, source panels, and dipole panels (this list is growing!)\nprovides velocity and velocity gradient (or their equivalent for non-fluids problems) obtained using analytic expressions (no finite difference)\nuses O(p^4) multipole-to-local translation operator (where p is the expansion order), though this may improve in the near future\nautomated CPU-parallelization of expansions and direct interactions\nsupports GPU-parallelization of direct interactions using CUDA\nForwardDiff and ReverseDiff compatible","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"Installation:","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"pkg> add https://github.com/byuflowlab/FastMultipole.git","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"Documentation:","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"learn basic useage in the Quick Start tutorial\ndiscover more features in the Guided Examples\nfine-tune performance in the Advanced Usage section (for FMM experts)\nsee the full API\nbrush up on the Theory","category":"page"}] } diff --git a/dev/theory/index.html b/dev/theory/index.html index f4927ad..f93586a 100644 --- a/dev/theory/index.html +++ b/dev/theory/index.html @@ -1,2 +1,2 @@ -Theory · FastMultipole.jl

Theory

In a nutshell, FastMultipole operates by forming series expansions of a kernel function, and translating and combining those expansions to obtain optimal compression. You can get a sense for how this works in the following figure.

Here, we see how each body's influence can be expressed as a series expansion. These series expansions can be translated and combined such that an entire cluster of bodies is represented by a single series expansion. This is what is known as a multipole expansion. Multipole expansions only converge outside of a finite radius of convergence, as illustrated by the red dotted line. Multipole expansions can only be used for interactions that are farther apart than this circl. The accuracy of the expansion gets better and better the farther away we go, so we can control the accuracy by imposing a cutoff radius (dotted blue line), and only use multipole expansions for interactions that are farther away than the blue circle. Multipole expansions are very helpful for reducing the cost of the N-body problem; in fact, we can reduce the scaling of the N-body problem to O(NlogN) by only considering multipole expansions.

Local expansions are very similar to multipole expansions, but they converge inside of a finite radius rather than outside. These provide the additional required compression to achieve fully O(N) scaling. In the next figure, we see how local expansions can reduce the number of times an expansion need be evaluated.

More details of the fast multipole method (FMM) can be found in the original work by Greengard and Rokhlin.[4]

References

[1]
N. A. Gumerov, S. Kaneko and R. Duraiswami. Recursive computation of the multipole expansions of layer potential integrals over simplices for efficient fast multipole accelerated boundary elements. Journal of Computational Physics 486, 112118 (2023).
[2]
N. A. Gumerov and R. Duraiswami. Efficient FMM accelerated vortex methods in three dimensions via the Lamb–Helmholtz decomposition. Journal of Computational Physics 240, 310–328 (2013).
[3]
[4]
L. Greengard and V. Rokhlin. A fast algorithm for particle simulations. Journal of computational physics 73, 325–348 (1987).
+Theory · FastMultipole.jl

Theory

In a nutshell, FastMultipole operates by forming series expansions of a kernel function, and translating and combining those expansions to obtain optimal compression. You can get a sense for how this works in the following figure.

Here, we see how each body's influence can be expressed as a series expansion. These series expansions can be translated and combined such that an entire cluster of bodies is represented by a single series expansion. This is what is known as a multipole expansion. Multipole expansions only converge outside of a finite radius of convergence, as illustrated by the red dotted line. Multipole expansions can only be used for interactions that are farther apart than this circl. The accuracy of the expansion gets better and better the farther away we go, so we can control the accuracy by imposing a cutoff radius (dotted blue line), and only use multipole expansions for interactions that are farther away than the blue circle. Multipole expansions are very helpful for reducing the cost of the N-body problem; in fact, we can reduce the scaling of the N-body problem to O(NlogN) by only considering multipole expansions.

Local expansions are very similar to multipole expansions, but they converge inside of a finite radius rather than outside. These provide the additional required compression to achieve fully O(N) scaling. In the next figure, we see how local expansions can reduce the number of times an expansion need be evaluated.

More details of the fast multipole method (FMM) can be found in the original work by Greengard and Rokhlin.[4]

References

[1]
N. A. Gumerov, S. Kaneko and R. Duraiswami. Recursive computation of the multipole expansions of layer potential integrals over simplices for efficient fast multipole accelerated boundary elements. Journal of Computational Physics 486, 112118 (2023).
[2]
N. A. Gumerov and R. Duraiswami. Efficient FMM accelerated vortex methods in three dimensions via the Lamb–Helmholtz decomposition. Journal of Computational Physics 240, 310–328 (2013).
[3]
[4]
L. Greengard and V. Rokhlin. A fast algorithm for particle simulations. Journal of computational physics 73, 325–348 (1987).