commit cf286c675b324904921375cbfaa0e7b53c4cc529 Author: Cian Hughes Date: Fri Feb 2 09:38:42 2024 +0000 First commit (yeah, its a mess) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aedf0ec --- /dev/null +++ b/.gitignore @@ -0,0 +1,79 @@ +# vscode .gitignore +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +# julia .gitignore +# Files generated by invoking Julia with --code-coverage +*.jl.cov +*.jl.*.cov + +# Files generated by invoking Julia with --track-allocation +*.jl.mem + +# System-specific files and directories generated by the BinaryProvider and BinDeps packages +# They contain absolute paths specific to the host computer, and so should not be committed +deps/deps.jl +deps/build.log +deps/downloads/ +deps/usr/ +deps/src/ + +# Build artifacts for creating documentation generated by the Documenter package +docs/build/ +docs/site/ + +# File generated by Pkg, the package manager, based on a corresponding Project.toml +# It records a fixed state of all packages used by the project. As such, it should not be +# committed for packages, but should be committed for applications that require a static +# environment. +Manifest.toml + +# fortran .gitignore +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + +# Project specific gitignores +# Original notes from when developing +notes/* +# My terrible, newbie attempt at version control (yes, shouldve jsut learned git) +backups/* \ No newline at end of file diff --git a/0-100abs.jl b/0-100abs.jl new file mode 100755 index 0000000..5493a13 --- /dev/null +++ b/0-100abs.jl @@ -0,0 +1,24 @@ +include("nanoconc.jl") +using PyPlot + +particledata = ([2.5 1.], + [5. 1.], + [10. 1.], + [20. 1.], + [30. 1.], + [40. 1.], + [50. 1.], + [60. 1.], + [70. 1.], + [80. 1.], + [90. 1.], + [100. 1.]) + +mat = nanoconc.loadmaterial("Gold",disp=false) +predict(x) = nanoconc.abspredict(1.333,250.,900.,0x00001000,x,mat,1000.,1.) +spectra = predict.(particledata) + +for spectrum in spectra + plot(spectrum[:,1],spectrum[:,2]) +end +show() diff --git a/0-100test.jl b/0-100test.jl new file mode 100755 index 0000000..45d1b13 --- /dev/null +++ b/0-100test.jl @@ -0,0 +1,39 @@ +println("\nImporting modules...") + +include("nanoconc.jl") +using PyPlot +using JLD2 + +println("Loading parameters...") + +particledata = ([2.5 1.], + [5. 1.], + [10. 1.], + [20. 1.], + [30. 1.], + [40. 1.], + [50. 1.], + [60. 1.], + [70. 1.], + [80. 1.], + [90. 1.], + [100. 1.]) + +mat = nanoconc.loadmaterial("Gold",disp=false) +predict(x) = nanoconc.qpredict(1.333,250.,900.,0x00001000,x,mat) +println("Calculating spectra...") +print("Calculation time: ") + +@time spectra = predict.(particledata) + +println("Saving output...") + +println("Plotting spectra...") + +for spectrum in spectra + plot(spectrum[:,1],spectrum[:,2]) +end +println("Displaying spectra...") +println("Script complete!") +show() +println() diff --git a/20nm.jl b/20nm.jl new file mode 100755 index 0000000..b70df0f --- /dev/null +++ b/20nm.jl @@ -0,0 +1,28 @@ +println("\nImporting modules...") + +include("nanoconc.jl") +using PyPlot + +println("Loading parameters...") + +particledata = [20. 1.] + +mat = nanoconc.loadmaterial("Gold",disp=false) +predict(x) = nanoconc.abspredict(1.333,450.,650.,0x00001000,x,mat,1000.,1.) + +println("Calculating spectra...") +print("Calculation time: ") + +@time spectrum = predict(particledata) + +println("Finding lambda max...") +#println("\nDebug data:\nfindmax = $(findmax(spectrum[:,2]))\nmaxind = $(findmax(spectrum[:,2])[2])") +lmax = spectrum[findmax(spectrum[:,2])[2],1] +println("lambda max = $(lmax)") + +println("Plotting spectra...") + +plot(spectrum[:,1],spectrum[:,2]) +println("Displaying spectra...") +show() +println("Script complete!") diff --git a/Project.toml b/Project.toml new file mode 100644 index 0000000..10dc913 --- /dev/null +++ b/Project.toml @@ -0,0 +1,9 @@ +[deps] +CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +HDF5 = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f" +Interpolations = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" +Memoize = "c03570c3-d221-55d1-a50c-7939bbd78826" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +QuadGK = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +XLSX = "fdbf4ff8-1666-58a4-91e7-1b58723a45e0" diff --git a/abs.csv b/abs.csv new file mode 100644 index 0000000..071bc95 --- /dev/null +++ b/abs.csv @@ -0,0 +1,4096 @@ +250.0,6.4050393630165585 +250.15873015873015,6.405198375455386 +250.31746031746033,6.405356613579415 +250.47619047619048,6.405514076029071 +250.63492063492063,6.405670761444101 +250.79365079365078,6.405826668463598 +250.95238095238096,6.405981795726015 +251.11111111111111,6.406136141869198 +251.26984126984127,6.406289705530403 +251.42857142857142,6.406442485346316 +251.5873015873016,6.406594479953082 +251.74603174603175,6.40674568798632 +251.9047619047619,6.406896108081152 +252.06349206349208,6.40704573887222 +252.22222222222223,6.407194578993716 +252.38095238095238,6.4073426270793945 +252.53968253968253,6.407489881762605 +252.6984126984127,6.407636341676308 +252.85714285714286,6.4077820054531 +253.015873015873,6.407926871725239 +253.17460317460316,6.408070939124663 +253.33333333333334,6.408214206283014 +253.4920634920635,6.408356671831662 +253.65079365079364,6.408498334401728 +253.8095238095238,6.408639192624107 +253.96825396825398,6.408779245129488 +254.12698412698413,6.408918490548383 +254.28571428571428,6.409056927511143 +254.44444444444446,6.409194554647988 +254.6031746031746,6.409331370589025 +254.76190476190476,6.409467373964274 +254.9206349206349,6.409602563403689 +255.0793650793651,6.409736937537184 +255.23809523809524,6.409778537894726 +255.3968253968254,6.4098052818433775 +255.55555555555554,6.409830889013462 +255.71428571428572,6.409855359059802 +255.87301587301587,6.409878691641712 +256.031746031746,6.409900886423023 +256.1904761904762,6.4099219430720975 +256.3492063492063,6.4099418612618395 +256.5079365079365,6.409960640669718 +256.6666666666667,6.40997828097778 +256.8253968253968,6.409994781872666 +256.984126984127,6.410010143045627 +257.14285714285717,6.410024364192539 +257.3015873015873,6.41003744501392 +257.46031746031747,6.410049385214946 +257.6190476190476,6.410060184505466 +257.77777777777777,6.410069842600016 +257.93650793650795,6.410078359217839 +258.0952380952381,6.4100857340828945 +258.25396825396825,6.410091966923879 +258.41269841269843,6.410097057474238 +258.57142857142856,6.410101005472183 +258.73015873015873,6.410103810660707 +258.8888888888889,6.410105472787597 +259.04761904761904,6.410105991605453 +259.2063492063492,6.410105366871698 +259.36507936507934,6.410103598348599 +259.5238095238095,6.410100685803277 +259.6825396825397,6.410096629007721 +259.8412698412698,6.410091427738808 +260.0,6.410085081778314 +260.1587301587302,6.410077590912929 +260.3174603174603,6.410068954934269 +260.4761904761905,6.410059173638896 +260.63492063492066,6.410048246828328 +260.7936507936508,6.410036174309056 +260.95238095238096,6.410022955892553 +261.1111111111111,6.410008591395296 +261.26984126984127,6.409993080638772 +261.42857142857144,6.409976423449498 +261.58730158730157,6.409958619659032 +261.74603174603175,6.409844164531525 +261.9047619047619,6.409720507250624 +262.06349206349205,6.4095959632691395 +262.22222222222223,6.409470532914504 +262.3809523809524,6.409344216517922 +262.53968253968253,6.409217014414369 +262.6984126984127,6.4090889269425935 +262.85714285714283,6.408959954445118 +263.015873015873,6.40883009726824 +263.1746031746032,6.4086993557620335 +263.3333333333333,6.4085677302803505 +263.4920634920635,6.408435221180697 +263.6507936507937,6.4083018288247295 +263.8095238095238,6.408167553577513 +263.968253968254,6.4080323958080205 +264.12698412698415,6.407896355889003 +264.2857142857143,6.407759434196997 +264.44444444444446,6.40762163111232 +264.6031746031746,6.407482947019078 +264.76190476190476,6.407343382305158 +264.92063492063494,6.407202937362231 +265.07936507936506,6.407061612585759 +265.23809523809524,6.406919408374985 +265.3968253968254,6.406776325132941 +265.55555555555554,6.406632363266446 +265.7142857142857,6.406487523186105 +265.87301587301585,6.406341805306312 +266.031746031746,6.406195210045245 +266.1904761904762,6.406047737824873 +266.3492063492063,6.405899389070951 +266.5079365079365,6.405750164213023 +266.6666666666667,6.4056000636844175 +266.8253968253968,6.4054490879222525 +266.984126984127,6.405297237367432 +267.14285714285717,6.405144512464649 +267.3015873015873,6.404990913662382 +267.46031746031747,6.404836441412892 +267.6190476190476,6.404681096172232 +267.77777777777777,6.404524878400236 +267.93650793650795,6.404367788560523 +268.0952380952381,6.404209827120499 +268.25396825396825,6.4040509945513495 +268.41269841269843,6.403891291328045 +268.57142857142856,6.403730717929339 +268.73015873015873,6.403569274837762 +268.8888888888889,6.403406962539631 +269.04761904761904,6.403108072269205 +269.2063492063492,6.402798166877652 +269.36507936507934,6.402487464827619 +269.5238095238095,6.4021759674701775 +269.6825396825397,6.4018636761583085 +269.8412698412698,6.401550592246892 +270.0,6.401236717092704 +270.1587301587302,6.400922052054411 +270.3174603174603,6.400606598492559 +270.4761904761905,6.400290357769574 +270.63492063492066,6.399973331249749 +270.7936507936508,6.399655520299241 +270.95238095238096,6.399336926286064 +271.1111111111111,6.399017550580082 +271.26984126984127,6.398697394553002 +271.42857142857144,6.398376459578367 +271.58730158730157,6.398054747031551 +271.74603174603175,6.397732258289748 +271.9047619047619,6.397408994731968 +272.06349206349205,6.397084957739031 +272.22222222222223,6.396760148693555 +272.3809523809524,6.396434568979952 +272.53968253968253,6.396108219984423 +272.6984126984127,6.395781103094944 +272.85714285714283,6.395453219701263 +273.015873015873,6.395124571194894 +273.1746031746032,6.394795158969104 +273.3333333333333,6.394464984418908 +273.4920634920635,6.394134048941063 +273.6507936507937,6.393802353934056 +273.8095238095238,6.3934699007981015 +273.968253968254,6.393136690935125 +274.12698412698415,6.392802725748765 +274.2857142857143,6.392468006644356 +274.44444444444446,6.392132535028928 +274.6031746031746,6.3917963123111905 +274.76190476190476,6.3914593399015285 +274.92063492063494,6.3911216192119955 +275.07936507936506,6.3907831516563 +275.23809523809524,6.3904439386498 +275.3968253968254,6.390103981609496 +275.55555555555554,6.389763281954016 +275.7142857142857,6.389421841103616 +275.87301587301585,6.38907966048016 +276.031746031746,6.388736741507122 +276.1904761904762,6.38838795857352 +276.3492063492063,6.388034910696924 +276.5079365079365,6.387681558973478 +276.6666666666667,6.387327903949314 +276.8253968253968,6.386973946171736 +276.984126984127,6.386619686189218 +277.14285714285717,6.386265124551388 +277.3015873015873,6.385910261809025 +277.46031746031747,6.3855550985140495 +277.6190476190476,6.385199635219516 +277.77777777777777,6.384843872479603 +277.93650793650795,6.384487810849606 +278.0952380952381,6.38413145088593 +278.25396825396825,6.383774793146081 +278.41269841269843,6.383417838188655 +278.57142857142856,6.383060586573336 +278.73015873015873,6.382703038860882 +278.8888888888889,6.382345195613118 +279.04761904761904,6.381987057392932 +279.2063492063492,6.381628624764261 +279.36507936507934,6.381269898292086 +279.5238095238095,6.380910878542426 +279.6825396825397,6.380551566082323 +279.8412698412698,6.3801919614798415 +280.0,6.379832065304055 +280.1587301587302,6.379471878125043 +280.3174603174603,6.3791114005138745 +280.4761904761905,6.3787506330426105 +280.63492063492066,6.378389576284286 +280.7936507936508,6.3780282308129115 +280.95238095238096,6.377666597203453 +281.1111111111111,6.377304676031836 +281.26984126984127,6.376942467874932 +281.42857142857144,6.376579973310546 +281.58730158730157,6.376217192917418 +281.74603174603175,6.375854127275205 +281.9047619047619,6.375490776964481 +282.06349206349205,6.3751271425667255 +282.22222222222223,6.374763224664258 +282.3809523809524,6.374399023840455 +282.53968253968253,6.374034540679408 +282.6984126984127,6.373669775766137 +282.85714285714283,6.373304729686526 +283.015873015873,6.37293940302732 +283.1746031746032,6.372573796376108 +283.3333333333333,6.372207910321324 +283.4920634920635,6.371841745452232 +283.6507936507937,6.371475302358925 +283.8095238095238,6.371108581632309 +283.968253968254,6.370741583864101 +284.12698412698415,6.370374309646819 +284.2857142857143,6.370006759573775 +284.44444444444446,6.3696540058233895 +284.6031746031746,6.369339826962286 +284.76190476190476,6.3690255207970035 +284.92063492063494,6.368711087671245 +285.07936507936506,6.368396527928837 +285.23809523809524,6.36808184191372 +285.3968253968254,6.367767029969945 +285.55555555555554,6.367452092441672 +285.7142857142857,6.367137029673166 +285.87301587301585,6.366821842008788 +286.031746031746,6.366506529793 +286.1904761904762,6.366191093370354 +286.3492063492063,6.365875533085491 +286.5079365079365,6.365559849283139 +286.6666666666667,6.365244042308105 +286.8253968253968,6.364928112505275 +286.984126984127,6.364612060219609 +287.14285714285717,6.364295885796137 +287.3015873015873,6.363979589579957 +287.46031746031747,6.363663171916227 +287.6190476190476,6.363346633150168 +287.77777777777777,6.363029973627054 +287.93650793650795,6.362713193692213 +288.0952380952381,6.362396293691021 +288.25396825396825,6.362079273968899 +288.41269841269843,6.361762134871309 +288.57142857142856,6.361444876743752 +288.73015873015873,6.361127499931761 +288.8888888888889,6.360810004780903 +289.04761904761904,6.36049239163677 +289.2063492063492,6.3601746608449785 +289.36507936507934,6.359856812751166 +289.5238095238095,6.359538847700985 +289.6825396825397,6.359220766040102 +289.8412698412698,6.358902568114195 +290.0,6.358584254268949 +290.1587301587302,6.358265824850046 +290.3174603174603,6.357947280203176 +290.4761904761905,6.357628620674019 +290.63492063492066,6.357309846608251 +290.7936507936508,6.3569909583515365 +290.95238095238096,6.356671956249526 +291.1111111111111,6.356352840647853 +291.26984126984127,6.356033611892131 +291.42857142857144,6.355714270327948 +291.58730158730157,6.355394816300868 +291.74603174603175,6.35507525015642 +291.9047619047619,6.354755572240103 +292.06349206349205,6.3544357828973785 +292.22222222222223,6.354115882473666 +292.3809523809524,6.353795871314342 +292.53968253968253,6.353401815780879 +292.6984126984127,6.352997522752098 +292.85714285714283,6.352593071754302 +293.015873015873,6.35218846332155 +293.1746031746032,6.351783697987964 +293.3333333333333,6.351378776287719 +293.4920634920635,6.350973698755045 +293.6507936507937,6.350568465924214 +293.8095238095238,6.350163078329538 +293.968253968254,6.349757536505356 +294.12698412698415,6.349351840986038 +294.2857142857143,6.3489459923059695 +294.44444444444446,6.3485399909995515 +294.6031746031746,6.348133837601189 +294.76190476190476,6.347727532645291 +294.92063492063494,6.347321076666258 +295.07936507936506,6.346914470198484 +295.23809523809524,6.3465077137763375 +295.3968253968254,6.34610080793417 +295.55555555555554,6.3456937532063025 +295.7142857142857,6.3452865501270175 +295.87301587301585,6.344879199230559 +296.031746031746,6.3444717010511225 +296.1904761904762,6.344064056122848 +296.3492063492063,6.34365626497982 +296.5079365079365,6.343248328156053 +296.6666666666667,6.342840246185497 +296.8253968253968,6.342432019602017 +296.984126984127,6.342023648939403 +297.14285714285717,6.3416151347313505 +297.3015873015873,6.341206477511464 +297.46031746031747,6.340797677813247 +297.6190476190476,6.340388736170097 +297.77777777777777,6.339979653115301 +297.93650793650795,6.339570429182028 +298.0952380952381,6.339161064903325 +298.25396825396825,6.33875156081211 +298.41269841269843,6.338341917441167 +298.57142857142856,6.3379321353231415 +298.73015873015873,6.337522214990532 +298.8888888888889,6.337112156975688 +299.04761904761904,6.336701961810803 +299.2063492063492,6.336291630027908 +299.36507936507934,6.335881162158867 +299.5238095238095,6.3354705587353735 +299.6825396825397,6.335059820288939 +299.8412698412698,6.334648947350897 +300.0,6.334237940452388 +300.1587301587302,6.33382680012436 +300.3174603174603,6.333415526897563 +300.4761904761905,6.333004121302543 +300.63492063492066,6.332592583869632 +300.7936507936508,6.3321809151289505 +300.95238095238096,6.3318251072908405 +301.1111111111111,6.331582940590002 +301.26984126984127,6.3313407811816775 +301.42857142857144,6.331098629218333 +301.58730158730157,6.330856484852028 +301.74603174603175,6.330614348234411 +301.9047619047619,6.330372219516725 +302.06349206349205,6.3301300988498035 +302.22222222222223,6.329887986384072 +302.3809523809524,6.3296458822695465 +302.53968253968253,6.329403786655838 +302.6984126984127,6.329161699692148 +302.85714285714283,6.32891962152727 +303.015873015873,6.328677552309588 +303.1746031746032,6.328435492187084 +303.3333333333333,6.3281934413073255 +303.4920634920635,6.3279513998174775 +303.6507936507937,6.327709367864295 +303.8095238095238,6.327467345594128 +303.968253968254,6.327225333152917 +304.12698412698415,6.326983330686197 +304.2857142857143,6.326741338339096 +304.44444444444446,6.326499356256335 +304.6031746031746,6.326257384582227 +304.76190476190476,6.326015423460683 +304.92063492063494,6.325773473035205 +305.07936507936506,6.325531533448885 +305.23809523809524,6.325289604844416 +305.3968253968254,6.325047687364081 +305.55555555555554,6.324805781149759 +305.7142857142857,6.324563886342922 +305.87301587301585,6.324322003084639 +306.031746031746,6.324080131515571 +306.1904761904762,6.323838271775977 +306.3492063492063,6.32359642400571 +306.5079365079365,6.323354588344218 +306.6666666666667,6.323112764930546 +306.8253968253968,6.322870953903334 +306.984126984127,6.322629155400818 +307.14285714285717,6.322387369560831 +307.3015873015873,6.322145596520802 +307.46031746031747,6.321903836417758 +307.6190476190476,6.3216620893883215 +307.77777777777777,6.321420355568713 +307.93650793650795,6.32117863509475 +308.0952380952381,6.320936928101848 +308.25396825396825,6.320695234725022 +308.41269841269843,6.320453555098883 +308.57142857142856,6.320211889357641 +308.73015873015873,6.319970237635107 +308.8888888888889,6.319728600064687 +309.04761904761904,6.319486976779389 +309.2063492063492,6.3192453679118215 +309.36507936507934,6.31900377359419 +309.5238095238095,6.318762193958303 +309.6825396825397,6.318520629135566 +309.8412698412698,6.31827907925699 +310.0,6.3180375444531816 +310.1587301587302,6.317796024854353 +310.3174603174603,6.317554520590316 +310.4761904761905,6.3173130317904835 +310.63492063492066,6.317071558583874 +310.7936507936508,6.316806393449984 +310.95238095238096,6.316524743783725 +311.1111111111111,6.316243077989516 +311.26984126984127,6.315961396269489 +311.42857142857144,6.315679698825367 +311.58730158730157,6.315397985858472 +311.74603174603175,6.315116257569721 +311.9047619047619,6.314834514159626 +312.06349206349205,6.314552755828294 +312.22222222222223,6.314270982775426 +312.3809523809524,6.3139891952003175 +312.53968253968253,6.313707393301861 +312.6984126984127,6.313425577278538 +312.85714285714283,6.3131437473284295 +313.015873015873,6.312861903649205 +313.1746031746032,6.312580046438129 +313.3333333333333,6.312298175892061 +313.4920634920635,6.31201629220745 +313.6507936507937,6.311734395580342 +313.8095238095238,6.311452486206371 +313.968253968254,6.311170564280767 +314.12698412698415,6.310888629998349 +314.2857142857143,6.310606683553531 +314.44444444444446,6.310324725140317 +314.6031746031746,6.310042754952303 +314.76190476190476,6.309760773182676 +314.92063492063494,6.309478780024215 +315.07936507936506,6.309196775669292 +315.23809523809524,6.308914760309867 +315.3968253968254,6.3086327341374915 +315.55555555555554,6.308350697343309 +315.7142857142857,6.308068650118055 +315.87301587301585,6.307786592652052 +316.031746031746,6.307504525135215 +316.1904761904762,6.30722244775705 +316.3492063492063,6.306940360706653 +316.5079365079365,6.306658264172708 +316.6666666666667,6.306376158343494 +316.8253968253968,6.306094043406874 +316.984126984127,6.305811919550306 +317.14285714285717,6.305529786960836 +317.3015873015873,6.305247645825099 +317.46031746031747,6.304965496329321 +317.6190476190476,6.304683338659317 +317.77777777777777,6.304401173000493 +317.93650793650795,6.3041189995378435 +318.0952380952381,6.303836818455952 +318.25396825396825,6.303554629938995 +318.41269841269843,6.303272434170735 +318.57142857142856,6.302990231334523 +318.73015873015873,6.302708021613306 +318.8888888888889,6.302425805189614 +319.04761904761904,6.30214358224557 +319.2063492063492,6.301861352962884 +319.36507936507934,6.301579117522859 +319.5238095238095,6.3012968761063854 +319.6825396825397,6.3010146288939435 +319.8412698412698,6.300732376065603 +320.0,6.300450117801024 +320.1587301587302,6.300167854279455 +320.3174603174603,6.299885585679737 +320.4761904761905,6.299714962412495 +320.63492063492066,6.299665491738704 +320.7936507936508,6.299616290365814 +320.95238095238096,6.2995673580598535 +321.1111111111111,6.2995186945866495 +321.26984126984127,6.299470299711839 +321.42857142857144,6.299422173200864 +321.58730158730157,6.299374314818981 +321.74603174603175,6.2993267243312525 +321.9047619047619,6.29927940150256 +322.06349206349205,6.299232346097597 +322.22222222222223,6.299185557880878 +322.3809523809524,6.299139036616734 +322.53968253968253,6.299092782069319 +322.6984126984127,6.299046794002613 +322.85714285714283,6.299001072180415 +323.015873015873,6.298955616366358 +323.1746031746032,6.2989104263239 +323.3333333333333,6.298865501816329 +323.4920634920635,6.29882084260677 +323.6507936507937,6.298776448458178 +323.8095238095238,6.2987323191333475 +323.968253968254,6.298688454394909 +324.12698412698415,6.2986448540053335 +324.2857142857143,6.298601517726933 +324.44444444444446,6.298558445321864 +324.6031746031746,6.2985156365521275 +324.76190476190476,6.298473091179571 +324.92063492063494,6.298430808965891 +325.07936507936506,6.298388789672634 +325.23809523809524,6.298347033061199 +325.3968253968254,6.298305538892836 +325.55555555555554,6.298264306928655 +325.7142857142857,6.298223336929617 +325.87301587301585,6.298182628656547 +326.031746031746,6.298142181870127 +326.1904761904762,6.298101996330901 +326.3492063492063,6.298062071799278 +326.5079365079365,6.298022408035532 +326.6666666666667,6.2979830047998 +326.8253968253968,6.297943861852091 +326.984126984127,6.297904978952282 +327.14285714285717,6.297866355860102 +327.3015873015873,6.297827992335213 +327.46031746031747,6.29778988813709 +327.6190476190476,6.297752043025105 +327.77777777777777,6.2977144567585075 +327.93650793650795,6.297677129096424 +328.0952380952381,6.297640059797864 +328.25396825396825,6.297603248621717 +328.41269841269843,6.297566695326755 +328.57142857142856,6.297530399671637 +328.73015873015873,6.297494361414907 +328.8888888888889,6.297458580314998 +329.04761904761904,6.297423056130228 +329.2063492063492,6.297387788618744 +329.36507936507934,6.297352777538779 +329.5238095238095,6.297318022648264 +329.6825396825397,6.297283523705088 +329.8412698412698,6.297249280467039 +330.0,6.297215292691799 +330.1587301587302,6.297181560136951 +330.3174603174603,6.2971480825599775 +330.4761904761905,6.297114859718261 +330.63492063492066,6.2970818913690865 +330.7936507936508,6.297049177269644 +330.95238095238096,6.297016717177029 +331.1111111111111,6.296984510848242 +331.26984126984127,6.296952558040192 +331.42857142857144,6.296920858509696 +331.58730158730157,6.2967621893030445 +331.74603174603175,6.296499525415321 +331.9047619047619,6.296236912848071 +332.06349206349205,6.295974351680072 +332.22222222222223,6.295711841989661 +332.3809523809524,6.2954493838547405 +332.53968253968253,6.295186977352779 +332.6984126984127,6.294924622560812 +332.85714285714283,6.29466231955544 +333.015873015873,6.294400068412834 +333.1746031746032,6.294137869208736 +333.3333333333333,6.293875722018457 +333.4920634920635,6.2936136269168825 +333.6507936507937,6.293351583978468 +333.8095238095238,6.293089593277245 +333.968253968254,6.292827654886822 +334.12698412698415,6.292565768880383 +334.2857142857143,6.292303935330689 +334.44444444444446,6.292042154310082 +334.6031746031746,6.291780425890483 +334.76190476190476,6.291518750143394 +334.92063492063494,6.291257127139899 +335.07936507936506,6.290995556950669 +335.23809523809524,6.290734039645955 +335.3968253968254,6.2904725752955954 +335.55555555555554,6.290211163969017 +335.7142857142857,6.289949805735235 +335.87301587301585,6.289688500662851 +336.031746031746,6.289427248820059 +336.1904761904762,6.289166050274643 +336.3492063492063,6.2889049050939825 +336.5079365079365,6.288643813345049 +336.6666666666667,6.288382775094407 +336.8253968253968,6.288121790408219 +336.984126984127,6.2878608593522465 +337.14285714285717,6.287599981991846 +337.3015873015873,6.287339158391975 +337.46031746031747,6.287078388617191 +337.6190476190476,6.286817672731654 +337.77777777777777,6.286557010799124 +337.93650793650795,6.28629640288297 +338.0952380952381,6.2860358490461605 +338.25396825396825,6.285775349351273 +338.41269841269843,6.285514903860494 +338.57142857142856,6.285254512635614 +338.73015873015873,6.284994175738037 +338.8888888888889,6.284733893228774 +339.04761904761904,6.28447366516845 +339.2063492063492,6.2842134916173045 +339.36507936507934,6.283953372635186 +339.5238095238095,6.283693308281564 +339.6825396825397,6.283433298615519 +339.8412698412698,6.283173343695751 +340.0,6.282913443580579 +340.1587301587302,6.282653598327941 +340.3174603174603,6.282393807995395 +340.4761904761905,6.282134072640121 +340.63492063492066,6.281874392318923 +340.7936507936508,6.281614767088227 +340.95238095238096,6.281355197004086 +341.1111111111111,6.281095682122178 +341.26984126984127,6.280836222497807 +341.42857142857144,6.280576818185908 +341.58730158730157,6.280317469241044 +341.74603174603175,6.280058175717409 +341.9047619047619,6.2797989376688275 +342.06349206349205,6.279539755148758 +342.22222222222223,6.2792806282102935 +342.3809523809524,6.27902155690616 +342.53968253968253,6.278746832169834 +342.6984126984127,6.278425014560795 +342.85714285714283,6.278103218813131 +343.015873015873,6.277781445082908 +343.1746031746032,6.277459693525726 +343.3333333333333,6.277137964296719 +343.4920634920635,6.276816257550557 +343.6507936507937,6.276494573441449 +343.8095238095238,6.276172912123138 +343.968253968254,6.2758512737489065 +344.12698412698415,6.2755296584715765 +344.2857142857143,6.275208066443508 +344.44444444444446,6.2748864978166 +344.6031746031746,6.274564952742294 +344.76190476190476,6.274243431371572 +344.92063492063494,6.273921933854957 +345.07936507936506,6.2736004603425135 +345.23809523809524,6.2732790109838525 +345.3968253968254,6.2729575859281255 +345.55555555555554,6.27263618532403 +345.7142857142857,6.272314809319808 +345.87301587301585,6.271993458063248 +346.031746031746,6.271672131701683 +346.1904761904762,6.271350830381995 +346.3492063492063,6.271029554250614 +346.5079365079365,6.2707083034535165 +346.6666666666667,6.2703870781362285 +346.8253968253968,6.270065878443828 +346.984126984127,6.2697447045209405 +347.14285714285717,6.269423556511744 +347.3015873015873,6.269102434559969 +347.46031746031747,6.268781338808896 +347.6190476190476,6.268460269401363 +347.77777777777777,6.268139226479757 +347.93650793650795,6.2678182101860225 +348.0952380952381,6.267497220661659 +348.25396825396825,6.267176258047721 +348.41269841269843,6.266855322484821 +348.57142857142856,6.266534414113125 +348.73015873015873,6.266213533072364 +348.8888888888889,6.265892679501821 +349.04761904761904,6.265571853540342 +349.2063492063492,6.265251055326332 +349.36507936507934,6.2649302849977575 +349.5238095238095,6.264609542692146 +349.6825396825397,6.264288828546587 +349.8412698412698,6.263968142697734 +350.0,6.263647485281803 +350.1587301587302,6.263326856434575 +350.3174603174603,6.263006256291396 +350.4761904761905,6.262685684987178 +350.63492063492066,6.262365142656401 +350.7936507936508,6.262044629433108 +350.95238095238096,6.261724145450914 +351.1111111111111,6.261403690843001 +351.26984126984127,6.261083265742122 +351.42857142857144,6.260762870280597 +351.58730158730157,6.260442504590319 +351.74603174603175,6.260122168802754 +351.9047619047619,6.259801863048938 +352.06349206349205,6.25948158745948 +352.22222222222223,6.259161342164565 +352.3809523809524,6.25884112729395 +352.53968253968253,6.258520942976969 +352.6984126984127,6.258200789342531 +352.85714285714283,6.257880666519123 +353.015873015873,6.257560574634807 +353.1746031746032,6.2572405138172265 +353.3333333333333,6.256920484193601 +353.4920634920635,6.256600485890731 +353.6507936507937,6.256280519034998 +353.8095238095238,6.255960583752365 +353.968253968254,6.255640680168374 +354.12698412698415,6.255320808408152 +354.2857142857143,6.255103723092799 +354.44444444444446,6.254974173779653 +354.6031746031746,6.254844620543123 +354.76190476190476,6.254715063301763 +354.92063492063494,6.254585501974133 +355.07936507936506,6.254455936478792 +355.23809523809524,6.254326366734306 +355.3968253968254,6.254196792659241 +355.55555555555554,6.254067214172167 +355.7142857142857,6.253937631191658 +355.87301587301585,6.253808043636292 +356.031746031746,6.253678451424651 +356.1904761904762,6.253548854475322 +356.3492063492063,6.2534192527068955 +356.5079365079365,6.253289646037967 +356.6666666666667,6.253160034387139 +356.8253968253968,6.253030417673017 +356.984126984127,6.252900795814213 +357.14285714285717,6.252771168729345 +357.3015873015873,6.2526415363370385 +357.46031746031747,6.252511898555922 +357.6190476190476,6.252382255304635 +357.77777777777777,6.252252606501821 +357.93650793650795,6.252122952066129 +358.0952380952381,6.25199329191622 +358.25396825396825,6.251863625970759 +358.41269841269843,6.2517339541484205 +358.57142857142856,6.251604276367886 +358.73015873015873,6.251474592547847 +358.8888888888889,6.251344902607002 +359.04761904761904,6.251215206464059 +359.2063492063492,6.251085504037735 +359.36507936507934,6.250955795246754 +359.5238095238095,6.250826080009856 +359.6825396825397,6.250696358245783 +359.8412698412698,6.250566629873291 +360.0,6.2504368948111475 +360.1587301587302,6.250307152978128 +360.3174603174603,6.250177404293019 +360.4761904761905,6.25004764867462 +360.63492063492066,6.249917886041739 +360.7936507936508,6.249788116313196 +360.95238095238096,6.249658339407825 +361.1111111111111,6.24952855524447 +361.26984126984127,6.249398763741986 +361.42857142857144,6.249268964819245 +361.58730158730157,6.249139158395125 +361.74603174603175,6.249009344388522 +361.9047619047619,6.248879522718343 +362.06349206349205,6.24874969330351 +362.22222222222223,6.248619856062956 +362.3809523809524,6.24849001091563 +362.53968253968253,6.248360157780493 +362.6984126984127,6.248230296576522 +362.85714285714283,6.248100427222709 +363.015873015873,6.247970549638057 +363.1746031746032,6.24784066374159 +363.3333333333333,6.247710769452341 +363.4920634920635,6.247580866689362 +363.6507936507937,6.24745095537172 +363.8095238095238,6.247321035418497 +363.968253968254,6.247191106748793 +364.12698412698415,6.247061169281721 +364.2857142857143,6.246931222936414 +364.44444444444446,6.246801267632021 +364.6031746031746,6.246671303287705 +364.76190476190476,6.2465413298226515 +364.92063492063494,6.246411347156059 +365.07936507936506,6.246281355207144 +365.23809523809524,6.2461513538951445 +365.3968253968254,6.246021343139312 +365.55555555555554,6.24589132285892 +365.7142857142857,6.24576129297326 +365.87301587301585,6.245631253401639 +366.031746031746,6.245501204063386 +366.1904761904762,6.245371144877849 +366.3492063492063,6.245241075764396 +366.5079365079365,6.2451109966424125 +366.6666666666667,6.244980907431305 +366.8253968253968,6.2448508080505025 +366.984126984127,6.244720698419449 +367.14285714285717,6.244590578457615 +367.3015873015873,6.244460448084486 +367.46031746031747,6.244330307219574 +367.6190476190476,6.2442001557824085 +367.77777777777777,6.244069993692541 +367.93650793650795,6.24394251210069 +368.0952380952381,6.243824003018957 +368.25396825396825,6.243705440017212 +368.41269841269843,6.243586822991375 +368.57142857142856,6.2434681518374475 +368.73015873015873,6.243349426451514 +368.8888888888889,6.243230646729746 +369.04761904761904,6.2431118125683955 +369.2063492063492,6.2429929238638024 +369.36507936507934,6.242873980512389 +369.5238095238095,6.242754982410663 +369.6825396825397,6.242635929455218 +369.8412698412698,6.242516821542732 +370.0,6.242397658569968 +370.1587301587302,6.242278440433775 +370.3174603174603,6.24215916703109 +370.4761904761905,6.242039838258933 +370.63492063492066,6.241920454014411 +370.7936507936508,6.241801014194719 +370.95238095238096,6.241681518697136 +371.1111111111111,6.241561967419029 +371.26984126984127,6.241442360257855 +371.42857142857144,6.241322697111153 +371.58730158730157,6.2412029778765525 +371.74603174603175,6.241083202451771 +371.9047619047619,6.240963370734612 +372.06349206349205,6.240843482622968 +372.22222222222223,6.24072353801482 +372.3809523809524,6.240603536808238 +372.53968253968253,6.2404834789013774 +372.6984126984127,6.240363364192487 +372.85714285714283,6.240243192579901 +373.015873015873,6.240122963962044 +373.1746031746032,6.240002678237431 +373.3333333333333,6.2398823353046655 +373.4920634920635,6.23976193506244 +373.6507936507937,6.239641477409538 +373.8095238095238,6.239520962244834 +373.968253968254,6.239400389467292 +374.12698412698415,6.239279758975965 +374.2857142857143,6.239159070670001 +374.44444444444446,6.239038324448634 +374.6031746031746,6.238917520211193 +374.76190476190476,6.238796657857095 +374.92063492063494,6.238675737285851 +375.07936507936506,6.238554758397064 +375.23809523809524,6.238433721090426 +375.3968253968254,6.238312625265725 +375.55555555555554,6.238191470822839 +375.7142857142857,6.238070257661738 +375.87301587301585,6.237948985682485 +376.031746031746,6.237827654785239 +376.1904761904762,6.237706264870174 +376.3492063492063,6.2375848158377805 +376.5079365079365,6.2374633075884205 +376.6666666666667,6.237341740022624 +376.8253968253968,6.237220113041016 +376.984126984127,6.237098426544314 +377.14285714285717,6.2369766804333295 +377.3015873015873,6.2368548746089685 +377.46031746031747,6.236733008972233 +377.6190476190476,6.2366110834242185 +377.77777777777777,6.236489097866116 +377.93650793650795,6.236367052199211 +378.0952380952381,6.236244946324885 +378.25396825396825,6.236122780144616 +378.41269841269843,6.236000553559976 +378.57142857142856,6.235878266472634 +378.73015873015873,6.2357559187843545 +378.8888888888889,6.235633510396999 +379.04761904761904,6.235511041212525 +379.2063492063492,6.235388511132987 +379.36507936507934,6.235265920060535 +379.5238095238095,6.23514326789742 +379.6825396825397,6.235020554545986 +379.8412698412698,6.234897779908675 +380.0,6.234774943888029 +380.1587301587302,6.234652046386686 +380.3174603174603,6.234529087307384 +380.4761904761905,6.234406066552956 +380.63492063492066,6.234282984026335 +380.7936507936508,6.234159839630554 +380.95238095238096,6.234036633268744 +381.1111111111111,6.233913364844132 +381.26984126984127,6.233790034260049 +381.42857142857144,6.233666641419921 +381.58730158730157,6.2334768083264125 +381.74603174603175,6.233232649889047 +381.9047619047619,6.232988488781182 +382.06349206349205,6.232744325067656 +382.22222222222223,6.232500158813145 +382.3809523809524,6.232255990082173 +382.53968253968253,6.232011818939105 +382.6984126984127,6.231767645448151 +382.85714285714283,6.2315234696733635 +383.015873015873,6.23127929167864 +383.1746031746032,6.231035111527724 +383.3333333333333,6.230790929284201 +383.4920634920635,6.230546745011503 +383.6507936507937,6.230302558772907 +383.8095238095238,6.230058370631535 +383.968253968254,6.229814180650356 +384.12698412698415,6.229569988892184 +384.2857142857143,6.229325795419679 +384.44444444444446,6.2290816002953475 +384.6031746031746,6.228837403581544 +384.76190476190476,6.228593205340467 +384.92063492063494,6.228349005634166 +385.07936507936506,6.228104804524535 +385.23809523809524,6.227860602073318 +385.3968253968254,6.227616398342104 +385.55555555555554,6.227372193392334 +385.7142857142857,6.227127987285293 +385.87301587301585,6.22688378008212 +386.031746031746,6.226639571843799 +386.1904761904762,6.226395362631162 +386.3492063492063,6.226151152504896 +386.5079365079365,6.225906941525533 +386.6666666666667,6.225662729753457 +386.8253968253968,6.225418517248901 +386.984126984127,6.225174304071949 +387.14285714285717,6.224930090282537 +387.3015873015873,6.224685875940449 +387.46031746031747,6.224441661105324 +387.6190476190476,6.22419744583665 +387.77777777777777,6.223953230193766 +387.93650793650795,6.223709014235864 +388.0952380952381,6.2234647980219915 +388.25396825396825,6.223220581611042 +388.41269841269843,6.2229763650617675 +388.57142857142856,6.222732148432769 +388.73015873015873,6.222487931782502 +388.8888888888889,6.222243715169277 +389.04761904761904,6.2219994986512575 +389.2063492063492,6.221755282286459 +389.36507936507934,6.221511066132754 +389.5238095238095,6.221266850247868 +389.6825396825397,6.221022634689381 +389.8412698412698,6.220778419514728 +390.0,6.220534204781202 +390.1587301587302,6.220289990545947 +390.3174603174603,6.220045776865965 +390.4761904761905,6.219801563798116 +390.63492063492066,6.219557351399113 +390.7936507936508,6.219313139725527 +390.95238095238096,6.219068928833785 +391.1111111111111,6.218824718780173 +391.26984126984127,6.218580509620831 +391.42857142857144,6.2183363014117585 +391.58730158730157,6.2180920942088145 +391.74603174603175,6.217847888067713 +391.9047619047619,6.217603683044026 +392.06349206349205,6.217359479193188 +392.22222222222223,6.217115276570489 +392.3809523809524,6.216871075231078 +392.53968253968253,6.216626875229964 +392.6984126984127,6.216382676622016 +392.85714285714283,6.216138479461962 +393.015873015873,6.215894283804391 +393.1746031746032,6.215650089703752 +393.3333333333333,6.215405897214353 +393.4920634920635,6.215161706390365 +393.6507936507937,6.214917517285819 +393.8095238095238,6.214673329954607 +393.968253968254,6.2144291444504836 +394.12698412698415,6.214184960827064 +394.2857142857143,6.213940779137826 +394.44444444444446,6.213696599436111 +394.6031746031746,6.21345242177512 +394.76190476190476,6.21320824620792 +394.92063492063494,6.212964072787438 +395.07936507936506,6.212719901566467 +395.23809523809524,6.212475732597661 +395.3968253968254,6.212231565933543 +395.55555555555554,6.211987401626492 +395.7142857142857,6.211743239728757 +395.87301587301585,6.211499080292453 +396.031746031746,6.211254923369553 +396.1904761904762,6.211010769011901 +396.3492063492063,6.210766617271206 +396.5079365079365,6.210522468199039 +396.6666666666667,6.21027832184684 +396.8253968253968,6.2100341782659125 +396.984126984127,6.209790037507429 +397.14285714285717,6.2095458996224275 +397.3015873015873,6.209301764661813 +397.46031746031747,6.209076854168128 +397.6190476190476,6.208883336234374 +397.77777777777777,6.208689862115838 +397.93650793650795,6.208496431784444 +398.0952380952381,6.208303045212046 +398.25396825396825,6.208109702370425 +398.41269841269843,6.2079164032313 +398.57142857142856,6.207723147766312 +398.73015873015873,6.207529935947036 +398.8888888888889,6.207336767744982 +399.04761904761904,6.2071436431315865 +399.2063492063492,6.20695056207822 +399.36507936507934,6.2067575245561875 +399.5238095238095,6.206564530536723 +399.6825396825397,6.2063715799909955 +399.8412698412698,6.206178672890108 +400.0,6.205985809205095 +400.1587301587302,6.205792988906926 +400.3174603174603,6.205600211966506 +400.4761904761905,6.205407478354674 +400.63492063492066,6.205214788042203 +400.7936507936508,6.205022140999802 +400.95238095238096,6.204829537198116 +401.1111111111111,6.204636976607726 +401.26984126984127,6.204444459199148 +401.42857142857144,6.204251984942837 +401.58730158730157,6.204059553809182 +401.74603174603175,6.203867165768512 +401.9047619047619,6.2036748207910914 +402.06349206349205,6.2034825188471245 +402.22222222222223,6.203290259906752 +402.3809523809524,6.203098043940055 +402.53968253968253,6.202905870917051 +402.6984126984127,6.202713740807699 +402.85714285714283,6.202521653581897 +403.015873015873,6.202329609209481 +403.1746031746032,6.202137607660229 +403.3333333333333,6.201945648903861 +403.4920634920635,6.201753732910031 +403.6507936507937,6.2015618596483435 +403.8095238095238,6.201370029088338 +403.968253968254,6.201178241199496 +404.12698412698415,6.200986495951243 +404.2857142857143,6.200794793312946 +404.44444444444446,6.200603133253915 +404.6031746031746,6.2004115157434025 +404.76190476190476,6.2002199407506025 +404.92063492063494,6.200028408244656 +405.07936507936506,6.199836918194646 +405.23809523809524,6.199645470569599 +405.3968253968254,6.199454065338485 +405.55555555555554,6.199262702470223 +405.7142857142857,6.199071381933672 +405.87301587301585,6.198880103697641 +406.031746031746,6.198688867730878 +406.1904761904762,6.198497674002085 +406.3492063492063,6.198306522479903 +406.5079365079365,6.198115413132926 +406.6666666666667,6.197924345929688 +406.8253968253968,6.197733320838676 +406.984126984127,6.197542337828319 +407.14285714285717,6.197351396867001 +407.3015873015873,6.197160497923045 +407.46031746031747,6.1969696409647295 +407.6190476190476,6.196778825960276 +407.77777777777777,6.1965880528778605 +407.93650793650795,6.196397321685604 +408.0952380952381,6.196206632351576 +408.25396825396825,6.1960159848438 +408.41269841269843,6.1958253791302464 +408.57142857142856,6.1956348151788365 +408.73015873015873,6.195444292957442 +408.8888888888889,6.195253812433886 +409.04761904761904,6.19506337357594 +409.2063492063492,6.1948729763513315 +409.36507936507934,6.194682620727737 +409.5238095238095,6.1944923066727835 +409.6825396825397,6.1943020341540524 +409.8412698412698,6.194111803139078 +410.0,6.193921613595345 +410.1587301587302,6.193731465490292 +410.3174603174603,6.193541358791314 +410.4761904761905,6.193351293465753 +410.63492063492066,6.19316126948091 +410.7936507936508,6.192971286804041 +410.95238095238096,6.192781345402351 +411.1111111111111,6.192591445243004 +411.26984126984127,6.192401586293118 +411.42857142857144,6.192211768519766 +411.58730158730157,6.192021991889976 +411.74603174603175,6.191832256370732 +411.9047619047619,6.191642561928973 +412.06349206349205,6.1914529085315975 +412.22222222222223,6.191263296145456 +412.3809523809524,6.191073724737359 +412.53968253968253,6.190884194274074 +412.6984126984127,6.190694704722323 +412.85714285714283,6.190505256048788 +413.015873015873,6.190315848220109 +413.1746031746032,6.190126481202882 +413.3333333333333,6.1899346994321 +413.4920634920635,6.1897337322661565 +413.6507936507937,6.189532824539544 +413.8095238095238,6.189331976206208 +413.968253968254,6.18913118722005 +414.12698412698415,6.188930457534932 +414.2857142857143,6.188729787104672 +414.44444444444446,6.188529175883045 +414.6031746031746,6.1883286238237885 +414.76190476190476,6.188128130880595 +414.92063492063494,6.187927697007119 +415.07936507936506,6.187727322156972 +415.23809523809524,6.187527006283725 +415.3968253968254,6.1873267493409125 +415.55555555555554,6.187126551282026 +415.7142857142857,6.1869264120605205 +415.87301587301585,6.186726331629809 +416.031746031746,6.186526309943268 +416.1904761904762,6.186326346954236 +416.3492063492063,6.186126442616012 +416.5079365079365,6.185926596881859 +416.6666666666667,6.185726809705 +416.8253968253968,6.185527081038623 +416.984126984127,6.185327410835881 +417.14285714285717,6.185127799049885 +417.3015873015873,6.184928245633716 +417.46031746031747,6.184728750540415 +417.6190476190476,6.184529313722991 +417.77777777777777,6.1843299351344125 +417.93650793650795,6.184130614727619 +418.0952380952381,6.1839313524555095 +418.25396825396825,6.1837321482709555 +418.41269841269843,6.183533002126788 +418.57142857142856,6.183333913975808 +418.73015873015873,6.183134883770784 +418.8888888888889,6.182935911464445 +419.04761904761904,6.182736997009496 +419.2063492063492,6.182538140358602 +419.36507936507934,6.182339341464401 +419.5238095238095,6.182140600279496 +419.6825396825397,6.181941916756458 +419.8412698412698,6.18174329084783 +420.0,6.181544722506121 +420.1587301587302,6.181346211683809 +420.3174603174603,6.181147758333342 +420.4761904761905,6.180949362407139 +420.63492063492066,6.180751023857589 +420.7936507936508,6.180552742637048 +420.95238095238096,6.180354518697847 +421.1111111111111,6.180156351992285 +421.26984126984127,6.179958242472633 +421.42857142857144,6.179760190091134 +421.58730158730157,6.179562194800002 +421.74603174603175,6.179364256551422 +421.9047619047619,6.179166375297555 +422.06349206349205,6.17896855099053 +422.22222222222223,6.1787707835824515 +422.3809523809524,6.1785730730253965 +422.53968253968253,6.178375419271414 +422.6984126984127,6.178177822272529 +422.85714285714283,6.17798028198074 +423.015873015873,6.177782798348017 +423.1746031746032,6.177585371326224 +423.3333333333333,6.177388000867448 +423.4920634920635,6.1771906869235025 +423.6507936507937,6.1769934294462585 +423.8095238095238,6.176796228387562 +423.968253968254,6.1765990836992355 +424.12698412698415,6.1764019953330775 +424.2857142857143,6.176204963240863 +424.44444444444446,6.176007987374343 +424.6031746031746,6.175811067685245 +424.76190476190476,6.175614204125274 +424.92063492063494,6.175417396646114 +425.07936507936506,6.175220645199421 +425.23809523809524,6.175023949736836 +425.3968253968254,6.174827310209974 +425.55555555555554,6.174630726570427 +425.7142857142857,6.17443419876977 +425.87301587301585,6.174237726759553 +426.031746031746,6.1740413104913054 +426.1904761904762,6.173844949916538 +426.3492063492063,6.1736486449867405 +426.5079365079365,6.173452395653381 +426.6666666666667,6.1732562018679085 +426.8253968253968,6.173060063581752 +426.984126984127,6.172863980746322 +427.14285714285717,6.172667953313009 +427.3015873015873,6.172471981233183 +427.46031746031747,6.172276064458199 +427.6190476190476,6.172080202939389 +427.77777777777777,6.171884396628071 +427.93650793650795,6.171688645475542 +428.0952380952381,6.171492949433082 +428.25396825396825,6.171297308451955 +428.41269841269843,6.171101722483403 +428.57142857142856,6.170906191478657 +428.73015873015873,6.170710715388927 +428.8888888888889,6.1705152941654084 +429.04761904761904,6.170319927759279 +429.2063492063492,6.170124616121701 +429.36507936507934,6.169929359203819 +429.5238095238095,6.169734156956766 +429.6825396825397,6.169539009331655 +429.8412698412698,6.169343916279585 +430.0,6.169148877751643 +430.1587301587302,6.168953893698896 +430.3174603174603,6.168758964072402 +430.4761904761905,6.1685640888231985 +430.63492063492066,6.1684782843907975 +430.7936507936508,6.168411814852305 +430.95238095238096,6.168345445280544 +431.1111111111111,6.16827917550761 +431.26984126984127,6.168213005365673 +431.42857142857144,6.168146934686983 +431.58730158730157,6.1680809633038685 +431.74603174603175,6.168015091048735 +431.9047619047619,6.167949317754069 +432.06349206349205,6.167883643252432 +432.22222222222223,6.167818067376467 +432.3809523809524,6.16775258995889 +432.53968253968253,6.167687210832501 +432.6984126984127,6.167621929830172 +432.85714285714283,6.16755674678486 +433.015873015873,6.167491661529592 +433.1746031746032,6.167426673897478 +433.3333333333333,6.167361783721704 +433.4920634920635,6.167296990835532 +433.6507936507937,6.167232295072305 +433.8095238095238,6.167167696265439 +433.968253968254,6.167103194248432 +434.12698412698415,6.167038788854855 +434.2857142857143,6.166974479918359 +434.44444444444446,6.16691026727267 +434.6031746031746,6.166846150751595 +434.76190476190476,6.166782130189012 +434.92063492063494,6.1667182054188805 +435.07936507936506,6.166654376275234 +435.23809523809524,6.166590642592186 +435.3968253968254,6.166527004203923 +435.55555555555554,6.16646346094471 +435.7142857142857,6.1664000126488885 +435.87301587301585,6.1663366591508755 +436.031746031746,6.1662734002851645 +436.1904761904762,6.166210235886299 +436.3492063492063,6.1661471657889795 +436.5079365079365,6.1660841898279 +436.6666666666667,6.166021307837859 +436.8253968253968,6.165958519653731 +436.984126984127,6.165895825110466 +437.14285714285717,6.165833224043088 +437.3015873015873,6.1657707162866995 +437.46031746031747,6.165708301676477 +437.6190476190476,6.165645980047669 +437.77777777777777,6.1655837512356095 +437.93650793650795,6.165521615075699 +438.0952380952381,6.165459571403413 +438.25396825396825,6.165397620054307 +438.41269841269843,6.165335760864008 +438.57142857142856,6.165273993668219 +438.73015873015873,6.165212318302718 +438.8888888888889,6.1651507346033565 +439.04761904761904,6.165089242406063 +439.2063492063492,6.16502784154684 +439.36507936507934,6.1649665318617615 +439.5238095238095,6.164905313186979 +439.6825396825397,6.164844185358716 +439.8412698412698,6.164783148213274 +440.0,6.1647222015870256 +440.1587301587302,6.164661345316417 +440.3174603174603,6.164600579237969 +440.4761904761905,6.164539903188277 +440.63492063492066,6.164479317004009 +440.7936507936508,6.164418820521908 +440.95238095238096,6.164358413578788 +441.1111111111111,6.16429809601154 +441.26984126984127,6.164237867657125 +441.42857142857144,6.16417772835258 +441.58730158730157,6.164117677935011 +441.74603174603175,6.164057716241603 +441.9047619047619,6.163997843109608 +442.06349206349205,6.163938058376356 +442.22222222222223,6.163878361879245 +442.3809523809524,6.1638187534557485 +442.53968253968253,6.163759232943413 +442.6984126984127,6.163699800179855 +442.85714285714283,6.163640455002766 +443.015873015873,6.163581197249906 +443.1746031746032,6.163522026759112 +443.3333333333333,6.163462943368289 +443.4920634920635,6.163403946915417 +443.6507936507937,6.163345037238544 +443.8095238095238,6.163286214175793 +443.968253968254,6.163227477565359 +444.12698412698415,6.163168827245505 +444.2857142857143,6.163110263054568 +444.44444444444446,6.163051784830956 +444.6031746031746,6.162993392413148 +444.76190476190476,6.1629350856396945 +444.92063492063494,6.162876864349216 +445.07936507936506,6.162818728380405 +445.23809523809524,6.162760677572022 +445.3968253968254,6.162702711762903 +445.55555555555554,6.16264483079195 +445.7142857142857,6.162587034498139 +445.87301587301585,6.162529322720514 +446.031746031746,6.162471695298189 +446.1904761904762,6.162414152070349 +446.3492063492063,6.1623566928762505 +446.5079365079365,6.162299317555218 +446.6666666666667,6.162242025946646 +446.8253968253968,6.162184817889997 +446.984126984127,6.162127693224808 +447.14285714285717,6.162070651790681 +447.3015873015873,6.162013693427289 +447.46031746031747,6.1619568179743744 +447.6190476190476,6.1619000252717475 +447.77777777777777,6.161843315159289 +447.93650793650795,6.161786687476948 +448.0952380952381,6.161730142064743 +448.25396825396825,6.161673678762758 +448.41269841269843,6.161617297411151 +448.57142857142856,6.161560997850146 +448.73015873015873,6.161504779920032 +448.8888888888889,6.161448643461173 +449.04761904761904,6.161392588313994 +449.2063492063492,6.1613366143189925 +449.36507936507934,6.161280721316733 +449.5238095238095,6.161224909147848 +449.6825396825397,6.1611691776530355 +449.8412698412698,6.1611135266730646 +450.0,6.1610579560487695 +450.1587301587302,6.161002465621051 +450.3174603174603,6.16094705523088 +450.4761904761905,6.160891724719291 +450.63492063492066,6.160836473927389 +450.7936507936508,6.160781302696343 +450.95238095238096,6.160720990818577 +451.1111111111111,6.160650131874935 +451.26984126984127,6.160579309788611 +451.42857142857144,6.160508524298612 +451.58730158730157,6.160437775144019 +451.74603174603175,6.160367062063989 +451.9047619047619,6.160296384797747 +452.06349206349205,6.160225743084594 +452.22222222222223,6.160155136663903 +452.3809523809524,6.160084565275119 +452.53968253968253,6.16001402865776 +452.6984126984127,6.15994352655142 +452.85714285714283,6.159873058695767 +453.015873015873,6.159802624830536 +453.1746031746032,6.159732224695542 +453.3333333333333,6.159661858030674 +453.4920634920635,6.15959152457589 +453.6507936507937,6.159521224071226 +453.8095238095238,6.159450956256792 +453.968253968254,6.15938072087277 +454.12698412698415,6.15931051765942 +454.2857142857143,6.1592403463570715 +454.44444444444446,6.159170206706134 +454.6031746031746,6.159100098447087 +454.76190476190476,6.159030021320491 +454.92063492063494,6.158959975066974 +455.07936507936506,6.1588899594272455 +455.23809523809524,6.158819974142088 +455.3968253968254,6.158750018952358 +455.55555555555554,6.158680093598989 +455.7142857142857,6.158610197822993 +455.87301587301585,6.158540331365451 +456.031746031746,6.158470493967527 +456.1904761904762,6.158400685370457 +456.3492063492063,6.158330905315554 +456.5079365079365,6.158261153544209 +456.6666666666667,6.158191429797887 +456.8253968253968,6.158121733818132 +456.984126984127,6.158052065346563 +457.14285714285717,6.157982424124877 +457.3015873015873,6.157912809894848 +457.46031746031747,6.157843222398326 +457.6190476190476,6.157773661377241 +457.77777777777777,6.157704126573597 +457.93650793650795,6.157634617729479 +458.0952380952381,6.157565134587046 +458.25396825396825,6.15749567688854 +458.41269841269843,6.157426244376277 +458.57142857142856,6.15735683679265 +458.73015873015873,6.157287453880136 +458.8888888888889,6.157218095381286 +459.04761904761904,6.157148761038732 +459.2063492063492,6.15707945059518 +459.36507936507934,6.157010163793423 +459.5238095238095,6.156940900376326 +459.6825396825397,6.1568716600868365 +459.8412698412698,6.156802442667981 +460.0,6.156733247862865 +460.1587301587302,6.1566640754146755 +460.3174603174603,6.156594925066675 +460.4761904761905,6.156525796562211 +460.63492063492066,6.156456689644708 +460.7936507936508,6.156387604057672 +460.95238095238096,6.156318539544689 +461.1111111111111,6.156249495849426 +461.26984126984127,6.15618047271563 +461.42857142857144,6.156111469887131 +461.58730158730157,6.156042487107838 +461.74603174603175,6.155973524121741 +461.9047619047619,6.155904580672913 +462.06349206349205,6.155835656505507 +462.22222222222223,6.1557667513637595 +462.3809523809524,6.155697864991987 +462.53968253968253,6.15562899713459 +462.6984126984127,6.15556014753605 +462.85714285714283,6.155491315940931 +463.015873015873,6.155422502093879 +463.1746031746032,6.155353705739624 +463.3333333333333,6.155284926622977 +463.4920634920635,6.155216164488836 +463.6507936507937,6.155147419082177 +463.8095238095238,6.155078690148063 +463.968253968254,6.1550099774316385 +464.12698412698415,6.154941280678134 +464.2857142857143,6.154872599632862 +464.44444444444446,6.15480393404122 +464.6031746031746,6.154735283648689 +464.76190476190476,6.154666648200835 +464.92063492063494,6.154598027443309 +465.07936507936506,6.154529421121846 +465.23809523809524,6.154460828982266 +465.3968253968254,6.154392250770475 +465.55555555555554,6.1543236862324635 +465.7142857142857,6.154255135114307 +465.87301587301585,6.154186597162169 +466.031746031746,6.154118072122296 +466.1904761904762,6.154049559741023 +466.3492063492063,6.153981059764769 +466.5079365079365,6.153912571940041 +466.6666666666667,6.153844096013433 +466.8253968253968,6.153775631731624 +466.984126984127,6.153707178841381 +467.14285714285717,6.153638737089557 +467.3015873015873,6.153570306223097 +467.46031746031747,6.1535018859890265 +467.6190476190476,6.153433476134465 +467.77777777777777,6.153365076406615 +467.93650793650795,6.15329668655277 +468.0952380952381,6.1532283063203135 +468.25396825396825,6.153159935456713 +468.41269841269843,6.153091573709527 +468.57142857142856,6.1530232208264035 +468.73015873015873,6.1529548765550794 +468.8888888888889,6.15288654064338 +469.04761904761904,6.152818212839222 +469.2063492063492,6.152749892890608 +469.36507936507934,6.152681580545636 +469.5238095238095,6.152613275552489 +469.6825396825397,6.152544977659444 +469.8412698412698,6.1524766866148655 +470.0,6.152408402167213 +470.1587301587302,6.152340124065032 +470.3174603174603,6.152271852056862 +470.4761904761905,6.152203585891635 +470.63492063492066,6.152135325318071 +470.7936507936508,6.152067070085083 +470.95238095238096,6.15199881994168 +471.1111111111111,6.151930574636957 +471.26984126984127,6.151862333920106 +471.42857142857144,6.151870073402107 +471.58730158730157,6.152224176493521 +471.74603174603175,6.152578702942163 +471.9047619047619,6.152933653090692 +472.06349206349205,6.153289027284197 +472.22222222222223,6.1536448258702015 +472.3809523809524,6.1540010491986665 +472.53968253968253,6.154357697621998 +472.6984126984127,6.154714771495045 +472.85714285714283,6.155072271175112 +473.015873015873,6.15543019702196 +473.1746031746032,6.155788549397805 +473.3333333333333,6.156147328667334 +473.4920634920635,6.1565065351977015 +473.6507936507937,6.156866169358534 +473.8095238095238,6.157226231521938 +473.968253968254,6.1575867220625025 +474.12698412698415,6.157947641357302 +474.2857142857143,6.158308989785905 +474.44444444444446,6.158670767730374 +474.6031746031746,6.159032975575274 +474.76190476190476,6.159395613707672 +474.92063492063494,6.1597586825171495 +475.07936507936506,6.160122182395796 +475.23809523809524,6.160486113738224 +475.3968253968254,6.160850476941567 +475.55555555555554,6.161215272405487 +475.7142857142857,6.1615805005321755 +475.87301587301585,6.161946161726364 +476.031746031746,6.162312256395324 +476.1904761904762,6.16267878494887 +476.3492063492063,6.163045747799369 +476.5079365079365,6.163413145361743 +476.6666666666667,6.163780978053472 +476.8253968253968,6.164149246294599 +476.984126984127,6.164517950507736 +477.14285714285717,6.164887091118068 +477.3015873015873,6.165256668553357 +477.46031746031747,6.165626683243946 +477.6190476190476,6.165997135622766 +477.77777777777777,6.166368026125338 +477.93650793650795,6.166739355189777 +478.0952380952381,6.1671111232568 +478.25396825396825,6.167483330769728 +478.41269841269843,6.16785597817449 +478.57142857142856,6.16822906591963 +478.73015873015873,6.168602594456309 +478.8888888888889,6.168976564238313 +479.04761904761904,6.1693509757220495 +479.2063492063492,6.169725829366566 +479.36507936507934,6.170101125633541 +479.5238095238095,6.170476864987293 +479.6825396825397,6.17085304789479 +479.8412698412698,6.171229674825646 +480.0,6.171606746252134 +480.1587301587302,6.17198426264918 +480.3174603174603,6.172362224494379 +480.4761904761905,6.172740632267992 +480.63492063492066,6.1731194864529515 +480.7936507936508,6.17349878753487 +480.95238095238096,6.173878536002039 +481.1111111111111,6.174258732345437 +481.26984126984127,6.174639377058734 +481.42857142857144,6.175020470638294 +481.58730158730157,6.175402013583182 +481.74603174603175,6.175784006395166 +481.9047619047619,6.176166449578724 +482.06349206349205,6.176549343641046 +482.22222222222223,6.176932689092041 +482.3809523809524,6.177316486444338 +482.53968253968253,6.177700736213295 +482.6984126984127,6.178085438917001 +482.85714285714283,6.178470595076278 +483.015873015873,6.17885620521469 +483.1746031746032,6.1792422698585465 +483.3333333333333,6.1796287895369035 +483.4920634920635,6.180015764781571 +483.6507936507937,6.180403196127118 +483.8095238095238,6.180791084110874 +483.968253968254,6.181179429272936 +484.12698412698415,6.18156823215617 +484.2857142857143,6.181957493306221 +484.44444444444446,6.182347213271511 +484.6031746031746,6.182737392603245 +484.76190476190476,6.183128031855419 +484.92063492063494,6.183519131584819 +485.07936507936506,6.18391069235103 +485.23809523809524,6.184302714716438 +485.3968253968254,6.1846951992462325 +485.55555555555554,6.185088146508415 +485.7142857142857,6.1854815570738 +485.87301587301585,6.1858754315160205 +486.031746031746,6.186269770411532 +486.1904761904762,6.186664574339618 +486.3492063492063,6.1870598438823885 +486.5079365079365,6.187455579624794 +486.6666666666667,6.187851782154621 +486.8253968253968,6.1882484520625 +486.984126984127,6.18864558994191 +487.14285714285717,6.189043196389179 +487.3015873015873,6.189441272003495 +487.46031746031747,6.1898398173869 +487.6190476190476,6.190238833144304 +487.77777777777777,6.190638319883484 +487.93650793650795,6.191038278215087 +488.0952380952381,6.191438708752639 +488.25396825396825,6.191839612112541 +488.41269841269843,6.192240988914082 +488.57142857142856,6.192642839779435 +488.73015873015873,6.193045165333667 +488.8888888888889,6.193447966204741 +489.04761904761904,6.193851243023514 +489.2063492063492,6.1942549964237505 +489.36507936507934,6.194659227042121 +489.5238095238095,6.1950639355182044 +489.6825396825397,6.195469122494495 +489.8412698412698,6.195874788616405 +490.0,6.196280934532266 +490.1587301587302,6.196687560893338 +490.3174603174603,6.197094668353807 +490.4761904761905,6.197502257570792 +490.63492063492066,6.1979103292043485 +490.7936507936508,6.1983188839174685 +490.95238095238096,6.198727922376089 +491.1111111111111,6.199137445249093 +491.26984126984127,6.199547453208312 +491.42857142857144,6.199957946928531 +491.58730158730157,6.20036892708749 +491.74603174603175,6.20078039436589 +491.9047619047619,6.2011923494473935 +492.06349206349205,6.201604793018629 +492.22222222222223,6.202017725769193 +492.3809523809524,6.202431148391657 +492.53968253968253,6.202845061581564 +492.6984126984127,6.203259466037438 +492.85714285714283,6.203674362460782 +493.015873015873,6.2040897515560856 +493.1746031746032,6.204505634030823 +493.3333333333333,6.204922010595458 +493.4920634920635,6.20533888196345 +493.6507936507937,6.205756248851252 +493.8095238095238,6.206174111978314 +493.968253968254,6.206592472067087 +494.12698412698415,6.207011329843028 +494.2857142857143,6.207430686034598 +494.44444444444446,6.207850541373265 +494.6031746031746,6.208270896593509 +494.76190476190476,6.208691752432825 +494.92063492063494,6.209113109631721 +495.07936507936506,6.209534968933722 +495.23809523809524,6.209957331085378 +495.3968253968254,6.2103801968362555 +495.55555555555554,6.210803566938948 +495.7142857142857,6.211227442149074 +495.87301587301585,6.211651823225282 +496.031746031746,6.212488981602136 +496.1904761904762,6.2134112374758255 +496.3492063492063,6.214334164394938 +496.5079365079365,6.215257762977039 +496.6666666666667,6.216182033782349 +496.8253968253968,6.217106977312655 +496.984126984127,6.218032594010198 +497.14285714285717,6.218958884256547 +497.3015873015873,6.219885848371449 +497.46031746031747,6.220813486611664 +497.6190476190476,6.221741799169779 +497.77777777777777,6.222670786173007 +497.93650793650795,6.223600447681953 +498.0952380952381,6.224530783689377 +498.25396825396825,6.225461794118922 +498.41269841269843,6.22639347882383 +498.57142857142856,6.2273258375856315 +498.73015873015873,6.228258870112815 +498.8888888888889,6.229192576039474 +499.04761904761904,6.230126954923932 +499.2063492063492,6.231062006247348 +499.36507936507934,6.231997729412287 +499.5238095238095,6.232934123741281 +499.6825396825397,6.233871188475362 +499.8412698412698,6.234808922772557 +500.0,6.2357473257063845 +500.1587301587302,6.236686396264298 +500.3174603174603,6.237626133346122 +500.4761904761905,6.238566535762457 +500.63492063492066,6.239507602233052 +500.7936507936508,6.240449331385157 +500.95238095238096,6.2413917217518495 +501.1111111111111,6.242334771770322 +501.26984126984127,6.243278479780155 +501.42857142857144,6.244222844021548 +501.58730158730157,6.245167862633531 +501.74603174603175,6.246113533652139 +501.9047619047619,6.247059855008561 +502.06349206349205,6.2480068245272555 +502.22222222222223,6.248954439924035 +502.3809523809524,6.249902698804118 +502.53968253968253,6.250851598660145 +502.6984126984127,6.2518011368701725 +502.85714285714283,6.252751310695618 +503.015873015873,6.253702117279179 +503.1746031746032,6.254653553642723 +503.3333333333333,6.255605616685125 +503.4920634920635,6.256558303180086 +503.6507936507937,6.257511609773906 +503.8095238095238,6.2584655329832195 +503.968253968254,6.259420069192694 +504.12698412698415,6.260375214652692 +504.2857142857143,6.261330965476895 +504.44444444444446,6.262287317639876 +504.6031746031746,6.263244266974649 +504.76190476190476,6.264201809170161 +504.92063492063494,6.265159939768751 +505.07936507936506,6.266118654163566 +505.23809523809524,6.267077947595925 +505.3968253968254,6.268037815152651 +505.55555555555554,6.268998251763349 +505.7142857142857,6.2699592521976415 +505.87301587301585,6.2709208110623536 +506.031746031746,6.271882922798659 +506.1904761904762,6.272845581679169 +506.3492063492063,6.273808781804975 +506.5079365079365,6.274772517102646 +506.6666666666667,6.275736781321164 +506.8253968253968,6.276701568028826 +506.984126984127,6.277666870610071 +507.14285714285717,6.278632682262272 +507.3015873015873,6.279598995992464 +507.46031746031747,6.280565804614022 +507.6190476190476,6.2815331007432755 +507.77777777777777,6.282500876796077 +507.93650793650795,6.283469124984301 +508.0952380952381,6.28443783731229 +508.25396825396825,6.285407005573241 +508.41269841269843,6.286376621345528 +508.57142857142856,6.287346675988959 +508.73015873015873,6.288317160640987 +508.8888888888889,6.289288066212828 +509.04761904761904,6.290259383385541 +509.2063492063492,6.291231102606023 +509.36507936507934,6.292203214082951 +509.5238095238095,6.29317570778264 +509.6825396825397,6.2941485734248435 +509.8412698412698,6.295121800478475 +510.0,6.296095378157263 +510.1587301587302,6.297069295415331 +510.3174603174603,6.298043540942697 +510.4761904761905,6.299018103160705 +510.63492063492066,6.299992970217375 +510.7936507936508,6.300968129982678 +510.95238095238096,6.301943570043723 +511.1111111111111,6.302919277699871 +511.26984126984127,6.303895239957767 +511.42857142857144,6.304871443526279 +511.58730158730157,6.30584787481136 +511.74603174603175,6.3068245199108235 +511.9047619047619,6.307801364609022 +512.063492063492,6.308778394371445 +512.2222222222222,6.309755594339226 +512.3809523809524,6.310732949323548 +512.5396825396825,6.311710443799961 +512.6984126984127,6.312688061902609 +512.8571428571429,6.313665787418347 +513.015873015873,6.31464360378077 +513.1746031746031,6.315621494064134 +513.3333333333334,6.316599440977186 +513.4920634920635,6.317577426856874 +513.6507936507936,6.318555433661964 +513.8095238095239,6.3195334429665495 +513.968253968254,6.32051143595344 +514.1269841269841,6.3214893934074565 +514.2857142857143,6.322467295708602 +514.4444444444445,6.323445122825119 +514.6031746031746,6.324422854306439 +514.7619047619048,6.325400469276003 +514.9206349206349,6.3263779464239684 +515.0793650793651,6.327355263999797 +515.2380952380952,6.328332399804713 +515.3968253968254,6.329309331184042 +515.5555555555555,6.330286035019411 +515.7142857142857,6.331262487720835 +515.8730158730159,6.332238665218661 +516.031746031746,6.333214542955378 +516.1904761904761,6.334190095877302 +516.3492063492064,6.3351652984261095 +516.5079365079365,6.33614012453024 +516.6666666666666,6.337114547596154 +516.8253968253969,6.33808854049945 +516.984126984127,6.339062075575825 +517.1428571428571,6.340035124611905 +517.3015873015873,6.341007658835905 +517.4603174603175,6.341979648908145 +517.6190476190476,6.342951064911418 +517.7777777777778,6.343921876341186 +517.936507936508,6.344892052095624 +518.0952380952381,6.345861560465504 +518.2539682539683,6.346830369123915 +518.4126984126984,6.347798445115801 +518.5714285714286,6.3487657548473555 +518.7301587301587,6.349732264075221 +518.8888888888889,6.350697937895528 +519.047619047619,6.351662740732753 +519.2063492063492,6.352626636328397 +519.3650793650794,6.353589587729489 +519.5238095238095,6.354551557276887 +519.6825396825396,6.355512506593423 +519.8412698412699,6.356472396571831 +520.0,6.357431187362493 +520.1587301587301,6.3583888383610025 +520.3174603174604,6.359345308195515 +520.4761904761905,6.360300554713902 +520.6349206349206,6.361254534970718 +520.7936507936508,6.362207205213946 +520.952380952381,6.3628773782137165 +521.1111111111111,6.362972338712378 +521.2698412698413,6.363061341072511 +521.4285714285714,6.363144353086794 +521.5873015873016,6.363221342592922 +521.7460317460317,6.363292277477141 +521.9047619047619,6.363357125677823 +522.063492063492,6.363415855189061 +522.2222222222222,6.363468434064295 +522.3809523809524,6.3635148304199705 +522.5396825396825,6.363555012439211 +522.6984126984127,6.363588948375536 +522.8571428571429,6.363616606556585 +523.015873015873,6.363637955387876 +523.1746031746031,6.363652963356594 +523.3333333333334,6.363661599035391 +523.4920634920635,6.363663831086219 +523.6507936507936,6.36365962826418 +523.8095238095239,6.3636489594214 +523.968253968254,6.363631793510921 +524.1269841269841,6.363608099590623 +524.2857142857143,6.363577846827148 +524.4444444444445,6.363541004499862 +524.6031746031746,6.363497542004821 +524.7619047619048,6.363447428858759 +524.9206349206349,6.363390634703092 +525.0793650793651,6.36332712930794 +525.2380952380952,6.3632568825761595 +525.3968253968254,6.363179864547389 +525.5555555555555,6.363096045402112 +525.7142857142857,6.363005395465727 +525.8730158730159,6.362907885212634 +526.031746031746,6.3628034852703195 +526.1904761904761,6.362692166423468 +526.3492063492064,6.362573899618063 +526.5079365079365,6.362448655965508 +526.6666666666666,6.362316406746749 +526.8253968253969,6.362177123416397 +526.984126984127,6.362030777606863 +527.1428571428571,6.361877341132492 +527.3015873015873,6.361716785993692 +527.4603174603175,6.361549084381077 +527.6190476190476,6.361374208679599 +527.7777777777778,6.361192131472679 +527.936507936508,6.3610028255463416 +528.0952380952381,6.360806263893337 +528.2539682539683,6.360602419717265 +528.4126984126984,6.36039126643669 +528.5714285714286,6.360172777689247 +528.7301587301587,6.359946927335738 +528.8888888888889,6.359713689464226 +529.047619047619,6.35947303839411 +529.2063492063492,6.359224948680183 +529.3650793650794,6.358969395116697 +529.5238095238095,6.358706352741386 +529.6825396825396,6.3584357968394976 +529.8412698412699,6.358157702947784 +530.0,6.357872046858497 +530.1587301587301,6.357578804623347 +530.3174603174604,6.357277952557445 +530.4761904761905,6.356969467243227 +530.6349206349206,6.356653325534345 +530.7936507936508,6.356329504559545 +530.952380952381,6.355997981726507 +531.1111111111111,6.355658734725665 +531.2698412698413,6.355311741533996 +531.4285714285714,6.354956980418776 +531.5873015873016,6.354594429941307 +531.7460317460317,6.354224068960612 +531.9047619047619,6.353845876637092 +532.063492063492,6.353459832436155 +532.2222222222222,6.3530659161317935 +532.3809523809524,6.352664107810145 +532.5396825396825,6.352254387872994 +532.6984126984127,6.351836737041243 +532.8571428571429,6.3514111363583385 +533.015873015873,6.350977567193657 +533.1746031746031,6.3505360112458416 +533.3333333333334,6.350086450546096 +533.4920634920635,6.349628867461433 +533.6507936507936,6.349163244697871 +533.8095238095239,6.348689565303578 +533.968253968254,6.348207812671981 +534.1269841269841,6.3477179705447995 +534.2857142857143,6.347220023015043 +534.4444444444445,6.346713954529957 +534.6031746031746,6.346199749893889 +534.7619047619048,6.34567739427113 +534.9206349206349,6.3451468731886775 +535.0793650793651,6.344608172538944 +535.2380952380952,6.344061278582406 +535.3968253968254,6.343506177950193 +535.5555555555555,6.342942857646617 +535.7142857142857,6.342371305051626 +535.8730158730159,6.341791507923213 +536.031746031746,6.341203454399741 +536.1904761904761,6.340607133002215 +536.3492063492064,6.340002532636475 +536.5079365079365,6.339389642595334 +536.6666666666666,6.338768452560633 +536.8253968253969,6.338138952605236 +536.984126984127,6.337501133194951 +537.1428571428571,6.336854985190376 +537.3015873015873,6.336200499848674 +537.4603174603175,6.335537668825282 +537.6190476190476,6.334866484175529 +537.7777777777778,6.334186938356195 +537.936507936508,6.33349902422699 +538.0952380952381,6.332802735051945 +538.2539682539683,6.332098064500743 +538.4126984126984,6.331385006649966 +538.5714285714286,6.330663555984254 +538.7301587301587,6.329933707397396 +538.8888888888889,6.329195456193343 +539.047619047619,6.328448798087131 +539.2063492063492,6.3276937292057305 +539.3650793650794,6.326930246088807 +539.5238095238095,6.326158345689419 +539.6825396825396,6.325378025374608 +539.8412698412699,6.324589282925924 +540.0,6.323792116539869 +540.1587301587301,6.322986524828243 +540.3174603174604,6.322172506818423 +540.4761904761905,6.321350061953547 +540.6349206349206,6.320519190092627 +540.7936507936508,6.319679891510562 +540.952380952381,6.31883216689808 +541.1111111111111,6.317976017361593 +541.2698412698413,6.317111444422962 +541.4285714285714,6.316238450019195 +541.5873015873016,6.3153570365020295 +541.7460317460317,6.314467206637469 +541.9047619047619,6.31356896360521 +542.063492063492,6.312662310997991 +542.2222222222222,6.3117472528208625 +542.3809523809524,6.310823793490368 +542.5396825396825,6.309891937833649 +542.6984126984127,6.308951691087461 +542.8571428571429,6.308003058897104 +543.015873015873,6.3070460473152865 +543.1746031746031,6.306080662800883 +543.3333333333334,6.305106912217638 +543.4920634920635,6.304124802832763 +543.6507936507936,6.303134342315471 +543.8095238095239,6.302135538735423 +543.968253968254,6.3011284005611 +544.1269841269841,6.300112936658086 +544.2857142857143,6.299089156287285 +544.4444444444445,6.298057069103056 +544.6031746031746,6.297016685151259 +544.7619047619048,6.295968014867253 +544.9206349206349,6.294911069073786 +545.0793650793651,6.29384585897881 +545.2380952380952,6.292772396173317 +545.3968253968254,6.291690692628898 +545.5555555555555,6.290600760695446 +545.7142857142857,6.289502613098654 +545.8730158730159,6.2883962629375 +546.031746031746,6.287281723681636 +546.1904761904761,6.286159009168723 +546.3492063492064,6.285028133601684 +546.5079365079365,6.283889111545914 +546.6666666666666,6.282741957926389 +546.8253968253969,6.281586688024746 +546.984126984127,6.280423317476278 +547.1428571428571,6.279251862266872 +547.3015873015873,6.278072338729881 +547.4603174603175,6.276884763542951 +547.6190476190476,6.275689153724769 +547.7777777777778,6.274485526631761 +547.936507936508,6.273273899954746 +548.0952380952381,6.272054291715507 +548.2539682539683,6.270826720263333 +548.4126984126984,6.2695912042714985 +548.5714285714286,6.268347762733685 +548.7301587301587,6.2671143333851775 +548.8888888888889,6.2658799026294485 +549.047619047619,6.264640852042701 +549.2063492063492,6.263397204836047 +549.3650793650794,6.262148984282647 +549.5238095238095,6.260896213715337 +549.6825396825396,6.259638916524239 +549.8412698412699,6.25837711615442 +550.0,6.257110836103523 +550.1587301587301,6.255840099919441 +550.3174603174604,6.254564931197974 +550.4761904761905,6.253285353580531 +550.6349206349206,6.2520013907518015 +550.7936507936508,6.250713066437487 +550.952380952381,6.249420404402001 +551.1111111111111,6.248123428446218 +551.2698412698413,6.246822162405207 +551.4285714285714,6.245516630146005 +551.5873015873016,6.244206855565384 +551.7460317460317,6.242892862587641 +551.9047619047619,6.2415746751624095 +552.063492063492,6.240252317262472 +552.2222222222222,6.2389258128815985 +552.3809523809524,6.237595186032394 +552.5396825396825,6.236260460744172 +552.6984126984127,6.234921661060835 +552.8571428571429,6.233578811038772 +553.015873015873,6.232231934744777 +553.1746031746031,6.230881056253989 +553.3333333333334,6.2295261996478315 +553.4920634920635,6.228167389011995 +553.6507936507936,6.2268046484344115 +553.8095238095239,6.22543800200327 +553.968253968254,6.224067473805033 +554.1269841269841,6.222693087922485 +554.2857142857143,6.221314868432782 +554.4444444444445,6.219932839405546 +554.6031746031746,6.218547024900948 +554.7619047619048,6.217157448967836 +554.9206349206349,6.21576413564187 +555.0793650793651,6.2143671089436765 +555.2380952380952,6.212966392877028 +555.3968253968254,6.211562011427031 +555.5555555555555,6.210153988558358 +555.7142857142857,6.208742348213464 +555.8730158730159,6.2073271143108615 +556.031746031746,6.205908310743385 +556.1904761904761,6.204485961376493 +556.3492063492064,6.2030600900465815 +556.5079365079365,6.201630720559333 +556.6666666666666,6.200197876688061 +556.8253968253969,6.1987615821721 +556.984126984127,6.197321860715205 +557.1428571428571,6.195878735983973 +557.3015873015873,6.194432231606277 +557.4603174603175,6.192982371169745 +557.6190476190476,6.191529178220233 +557.7777777777778,6.190072676260333 +557.936507936508,6.188612888747905 +558.0952380952381,6.187149839094614 +558.2539682539683,6.185683550664516 +558.4126984126984,6.184214046772632 +558.5714285714286,6.1827413506835684 +558.7301587301587,6.1812654856101465 +558.8888888888889,6.179786474712058 +559.047619047619,6.178304341094541 +559.2063492063492,6.17681910780707 +559.3650793650794,6.175330797842083 +559.5238095238095,6.173839434133711 +559.6825396825396,6.17234503955654 +559.8412698412699,6.170847636924396 +560.0,6.169347248989138 +560.1587301587301,6.167843898439487 +560.3174603174604,6.166337607899865 +560.4761904761905,6.164828399929264 +560.6349206349206,6.1633162970201205 +560.7936507936508,6.161801321597233 +560.952380952381,6.16028349601668 +561.1111111111111,6.158762842564767 +561.2698412698413,6.157239383456995 +561.4285714285714,6.155713140837047 +561.5873015873016,6.154184136775797 +561.7460317460317,6.1526523932703325 +561.9047619047619,6.151117932243003 +562.063492063492,6.149580775540497 +562.2222222222222,6.148040944932917 +562.3809523809524,6.146498462112885 +562.5396825396825,6.14495334869469 +562.6984126984127,6.143405626213404 +562.8571428571429,6.141855316124072 +563.015873015873,6.140302439800883 +563.1746031746031,6.138747018536383 +563.3333333333334,6.137189073540683 +563.4920634920635,6.1356286259407256 +563.6507936507936,6.134065696779518 +563.8095238095239,6.132500307015429 +563.968253968254,6.130932477521484 +564.1269841269841,6.129362229084672 +564.2857142857143,6.127789582405289 +564.4444444444445,6.126214558096291 +564.6031746031746,6.124637176682652 +564.7619047619048,6.123057458600764 +564.9206349206349,6.1214754241978415 +565.0793650793651,6.119891093731334 +565.2380952380952,6.118304487368376 +565.3968253968254,6.1167156251852415 +565.5555555555555,6.115124527166818 +565.7142857142857,6.1135312132060955 +565.8730158730159,6.111935703103674 +566.031746031746,6.110338016567293 +566.1904761904761,6.108738173211368 +566.3492063492064,6.107136192556539 +566.5079365079365,6.105532094029261 +566.6666666666666,6.10392589696138 +566.8253968253969,6.102317620589734 +566.984126984127,6.10070728405578 +567.1428571428571,6.09909490640523 +567.3015873015873,6.097480506587694 +567.4603174603175,6.095864103456346 +567.6190476190476,6.09424571576761 +567.7777777777778,6.092625362180848 +567.936507936508,6.0910030612580695 +568.0952380952381,6.089378831463658 +568.2539682539683,6.087752691164101 +568.4126984126984,6.08612465862775 +568.5714285714286,6.084494752024584 +568.7301587301587,6.082862989425976 +568.8888888888889,6.0812293888044975 +569.047619047619,6.079593968033722 +569.2063492063492,6.077956744888037 +569.3650793650794,6.0763177370424755 +569.5238095238095,6.074676962072574 +569.6825396825396,6.0730344374542025 +569.8412698412699,6.071390180563456 +570.0,6.069744208676526 +570.1587301587301,6.068096538969591 +570.3174603174604,6.066447188518725 +570.4761904761905,6.064796174299816 +570.6349206349206,6.063143513188483 +570.7936507936508,6.061489221960025 +570.952380952381,6.059833317289376 +571.1111111111111,6.0581758157510475 +571.2698412698413,6.056516733819114 +571.4285714285714,6.054856087867198 +571.5873015873016,6.053193894168454 +571.7460317460317,6.051530168895575 +571.9047619047619,6.049864928120808 +572.063492063492,6.048198187815979 +572.2222222222222,6.046529963852519 +572.3809523809524,6.044860272001514 +572.5396825396825,6.043189127933754 +572.6984126984127,6.041516547219796 +572.8571428571429,6.039842545330035 +573.015873015873,6.038167137634781 +573.1746031746031,6.036490339404357 +573.3333333333334,6.034812165809177 +573.4920634920635,6.033132631919875 +573.6507936507936,6.031451752707406 +573.8095238095239,6.029769543043168 +573.968253968254,6.028086017699138 +574.1269841269841,6.02640119134801 +574.2857142857143,6.024715078563334 +574.4444444444445,6.02302769381968 +574.6031746031746,6.02133905149279 +574.7619047619048,6.019649165859753 +574.9206349206349,6.017958051099181 +575.0793650793651,6.016265721291386 +575.2380952380952,6.014572190418571 +575.3968253968254,6.012877472365033 +575.5555555555555,6.011181580917358 +575.7142857142857,6.0094845297646335 +575.8730158730159,6.007786332498662 +576.031746031746,6.006087002614191 +576.1904761904761,6.0043865535091285 +576.3492063492064,6.002684998484786 +576.5079365079365,6.0009823507461135 +576.6666666666666,5.9992786234019455 +576.8253968253969,5.997573829465254 +576.984126984127,5.9958679818534 +577.1428571428571,5.994161093388402 +577.3015873015873,5.99245317679719 +577.4603174603175,5.990744244711893 +577.6190476190476,5.9890343096700995 +577.7777777777778,5.9873233841151485 +577.936507936508,5.9856114803964156 +578.0952380952381,5.983898610769593 +578.2539682539683,5.982184787396996 +578.4126984126984,5.980470022347854 +578.5714285714286,5.978754327598615 +578.7301587301587,5.977037715033257 +578.8888888888889,5.975320196443588 +579.047619047619,5.973601783529574 +579.2063492063492,5.9718824878996495 +579.3650793650794,5.9701623210710375 +579.5238095238095,5.968441294470087 +579.6825396825396,5.966719419432583 +579.8412698412699,5.964996707204094 +580.0,5.963273168940302 +580.1587301587301,5.9615488157073395 +580.3174603174604,5.959823658482134 +580.4761904761905,5.95809770815275 +580.6349206349206,5.956370975518734 +580.7936507936508,5.954643471291468 +580.952380952381,5.9529152060945245 +581.1111111111111,5.951186190464009 +581.2698412698413,5.94945643484893 +581.4285714285714,5.947725949611554 +581.5873015873016,5.945994745027766 +581.7460317460317,5.944262831287433 +581.9047619047619,5.9425302184947695 +582.063492063492,5.940796916668712 +582.2222222222222,5.939168849167853 +582.3809523809524,5.937572802323893 +582.5396825396825,5.935977282137752 +582.6984126984127,5.934382293793305 +582.8571428571429,5.932787842414556 +583.015873015873,5.931193933066134 +583.1746031746031,5.929600570753757 +583.3333333333334,5.928007760424726 +583.4920634920635,5.926415506968402 +583.6507936507936,5.924823815216675 +583.8095238095239,5.923232689944434 +583.968253968254,5.921642135870049 +584.1269841269841,5.920052157655826 +584.2857142857143,5.918462759908466 +584.4444444444445,5.916873947179542 +584.6031746031746,5.91528572396594 +584.7619047619048,5.913698094710324 +584.9206349206349,5.912111063801583 +585.0793650793651,5.910524635575282 +585.2380952380952,5.908938814314107 +585.3968253968254,5.907353604248309 +585.5555555555555,5.905769009556148 +585.7142857142857,5.904185034364326 +585.8730158730159,5.902601682748418 +586.031746031746,5.901018958733318 +586.1904761904761,5.899436866293654 +586.3492063492064,5.897855409354222 +586.5079365079365,5.896274591790409 +586.6666666666666,5.894694417428608 +586.8253968253969,5.893114890046644 +586.984126984127,5.8915360133741865 +587.1428571428571,5.889957791093158 +587.3015873015873,5.888380226838147 +587.4603174603175,5.886803324196818 +587.6190476190476,5.885227086710308 +587.7777777777778,5.8836515178736315 +587.936507936508,5.8820766211360835 +588.0952380952381,5.8805023999016255 +588.2539682539683,5.878928857529286 +588.4126984126984,5.877355997333551 +588.5714285714286,5.875783822584746 +588.7301587301587,5.874212336509426 +588.8888888888889,5.87264154229075 +589.047619047619,5.871071443068875 +589.2063492063492,5.869502041941317 +589.3650793650794,5.867933341963331 +589.5238095238095,5.866365346148288 +589.6825396825396,5.8647980574680325 +589.8412698412699,5.863231478853257 +590.0,5.861665613193865 +590.1587301587301,5.860100463339323 +590.3174603174604,5.858536032099032 +590.4761904761905,5.856972322242667 +590.6349206349206,5.855409336500551 +590.7936507936508,5.8538470775639775 +590.952380952381,5.852285548085586 +591.1111111111111,5.850724750679687 +591.2698412698413,5.849164687922613 +591.4285714285714,5.847605362353061 +591.5873015873016,5.846046776472423 +591.7460317460317,5.844488932745123 +591.9047619047619,5.842931833598948 +592.063492063492,5.8413754814253895 +592.2222222222222,5.8398198785799496 +592.3809523809524,5.838265027382487 +592.5396825396825,5.8367109301175235 +592.6984126984127,5.835157589034574 +592.8571428571429,5.8336050063484555 +593.015873015873,5.832053184239614 +593.1746031746031,5.830502124854424 +593.3333333333334,5.828951830305505 +593.4920634920635,5.827402302672033 +593.6507936507936,5.825853544000037 +593.8095238095239,5.8243055563027095 +593.968253968254,5.822758341560703 +594.1269841269841,5.821211901722428 +594.2857142857143,5.819666238704356 +594.4444444444445,5.818121354391302 +594.6031746031746,5.816577250636726 +594.7619047619048,5.815033929263012 +594.9206349206349,5.813491392061765 +595.0793650793651,5.811949640794092 +595.2380952380952,5.810408677190877 +595.3968253968254,5.808868502953072 +595.5555555555555,5.807329119751972 +595.7142857142857,5.80579052922948 +595.8730158730159,5.804252732998393 +596.031746031746,5.802715732642673 +596.1904761904761,5.801179529717705 +596.3492063492064,5.7996441257505715 +596.5079365079365,5.798109522240323 +596.6666666666666,5.796575720658225 +596.8253968253969,5.795042722448029 +596.984126984127,5.793510529026235 +597.1428571428571,5.791979141782334 +597.3015873015873,5.790448562079068 +597.4603174603175,5.788918791252697 +597.6190476190476,5.7873898306132165 +597.7777777777778,5.78586168144464 +597.936507936508,5.784334345005221 +598.0952380952381,5.782807822527708 +598.2539682539683,5.78128211521958 +598.4126984126984,5.779757224263293 +598.5714285714286,5.778233150816517 +598.7301587301587,5.776709896012362 +598.8888888888889,5.775187460959626 +599.047619047619,5.7736658467430155 +599.2063492063492,5.772145054423385 +599.3650793650794,5.770625085037958 +599.5238095238095,5.769105939600558 +599.6825396825396,5.767587619101828 +599.8412698412699,5.766070124509454 +600.0,5.764553456768397 +600.1587301587301,5.76303761680109 +600.3174603174604,5.761522605507674 +600.4761904761905,5.760008423766205 +600.6349206349206,5.75849507243287 +600.7936507936508,5.756982552342193 +600.952380952381,5.755470864307252 +601.1111111111111,5.753960009119883 +601.2698412698413,5.752449987550885 +601.4285714285714,5.7509408003502305 +601.5873015873016,5.749432448247261 +601.7460317460317,5.747924931950891 +601.9047619047619,5.746418252149804 +602.063492063492,5.744912409512664 +602.2222222222222,5.743407404688289 +602.3809523809524,5.741903238305861 +602.5396825396825,5.740399910975118 +602.6984126984127,5.738897423286536 +602.8571428571429,5.737395775811526 +603.015873015873,5.735894969102622 +603.1746031746031,5.734395003693659 +603.3333333333334,5.732895880099964 +603.4920634920635,5.731397598818541 +603.6507936507936,5.729900160328245 +603.8095238095239,5.728403565089966 +603.968253968254,5.726907813546808 +604.1269841269841,5.725412906124267 +604.2857142857143,5.7239188432303925 +604.4444444444445,5.722425625255985 +604.6031746031746,5.720933252574746 +604.7619047619048,5.719441725543459 +604.9206349206349,5.71795104450216 +605.0793650793651,5.7164612097743 +605.2380952380952,5.714972221666911 +605.3968253968254,5.713484080470776 +605.5555555555555,5.711996786460587 +605.7142857142857,5.71051033989511 +605.8730158730159,5.709024741017341 +606.031746031746,5.707539990054674 +606.1904761904761,5.70605608721905 +606.3492063492064,5.704573032707111 +606.5079365079365,5.703090826700367 +606.6666666666666,5.70160946936534 +606.8253968253969,5.700128960853713 +606.984126984127,5.6986493013024955 +607.1428571428571,5.697170490834157 +607.3015873015873,5.695692529556782 +607.4603174603175,5.6942154175642195 +607.6190476190476,5.692739154936222 +607.7777777777778,5.691263741738595 +607.936507936508,5.68978917802334 +608.0952380952381,5.68831546382879 +608.2539682539683,5.686842599179756 +608.4126984126984,5.685370584087666 +608.5714285714286,5.683899418550702 +608.7301587301587,5.68242910255393 +608.8888888888889,5.6809596360694465 +609.047619047619,5.67949101905651 +609.2063492063492,5.678023251461665 +609.3650793650794,5.676556333218887 +609.5238095238095,5.675090264249702 +609.6825396825396,5.673625044463325 +609.8412698412699,5.672160673756782 +610.0,5.67069715201504 +610.1587301587301,5.669234479111135 +610.3174603174604,5.667772654906288 +610.4761904761905,5.666311679250043 +610.6349206349206,5.664851551980381 +610.7936507936508,5.663392272923836 +610.952380952381,5.661933841895631 +611.1111111111111,5.660476258699784 +611.2698412698413,5.659019523129231 +611.4285714285714,5.657563634965946 +611.5873015873016,5.6561085939810525 +611.7460317460317,5.654654399934941 +611.9047619047619,5.653201052577381 +612.063492063492,5.651748551647642 +612.2222222222222,5.650296896874593 +612.3809523809524,5.648846087976824 +612.5396825396825,5.647396124662753 +612.6984126984127,5.645947006630729 +612.8571428571429,5.644498733569151 +613.015873015873,5.6430513051565665 +613.1746031746031,5.641604721061782 +613.3333333333334,5.640158980943963 +613.4920634920635,5.638714084452748 +613.6507936507936,5.637270031228342 +613.8095238095239,5.635826820901619 +613.968253968254,5.634384453094235 +614.1269841269841,5.632942927418712 +614.2857142857143,5.631502243478551 +614.4444444444445,5.630062400868323 +614.6031746031746,5.628623399173769 +614.7619047619048,5.627185237971896 +614.9206349206349,5.625747916831077 +615.0793650793651,5.6243114353111405 +615.2380952380952,5.622875792963464 +615.3968253968254,5.6214409893310755 +615.5555555555555,5.620007023948737 +615.7142857142857,5.618573896343042 +615.8730158730159,5.617141606032501 +616.031746031746,5.615710152527639 +616.1904761904761,5.6142795353310735 +616.3492063492064,5.612849753937614 +616.5079365079365,5.611420807834346 +616.6666666666666,5.6099926965007105 +616.8253968253969,5.60860343271681 +616.984126984127,5.6074145190136875 +617.1428571428571,5.606226346157816 +617.3015873015873,5.605038913483667 +617.4603174603175,5.603852220323685 +617.6190476190476,5.602666266008298 +617.7777777777778,5.601481049865955 +617.936507936508,5.600296571223158 +618.0952380952381,5.5991128294044845 +618.2539682539683,5.597929823732616 +618.4126984126984,5.596747553528371 +618.5714285714286,5.595566018110725 +618.7301587301587,5.594385216796845 +618.8888888888889,5.593205148902111 +619.047619047619,5.592025813740149 +619.2063492063492,5.590847210622849 +619.3650793650794,5.589669338860398 +619.5238095238095,5.588492197761307 +619.6825396825396,5.5873157866324314 +619.8412698412699,5.586140104779 +620.0,5.584965151504642 +620.1587301587301,5.583790926111409 +620.3174603174604,5.582617427899797 +620.4761904761905,5.581444656168784 +620.6349206349206,5.580272610215834 +620.7936507936508,5.579101289336945 +620.952380952381,5.577930692826655 +621.1111111111111,5.5767608199780705 +621.2698412698413,5.575591670082893 +621.4285714285714,5.574423242431445 +621.5873015873016,5.573255536312683 +621.7460317460317,5.572088551014229 +621.9047619047619,5.570922285822391 +622.063492063492,5.569756740022187 +622.2222222222222,5.5685919128973635 +622.3809523809524,5.567427803730419 +622.5396825396825,5.56626441180263 +622.6984126984127,5.565101736394067 +622.8571428571429,5.563939776783619 +623.015873015873,5.562778532249016 +623.1746031746031,5.561618002066849 +623.3333333333334,5.560458185512585 +623.4920634920635,5.5592990818606 +623.6507936507936,5.5581406903841915 +623.8095238095239,5.556983010355594 +623.968253968254,5.5558260410460125 +624.1269841269841,5.554669781725636 +624.2857142857143,5.553514231663649 +624.4444444444445,5.552359390128266 +624.6031746031746,5.55120525638674 +624.7619047619048,5.550051829705384 +624.9206349206349,5.5488991093496 +625.0793650793651,5.54774709458388 +625.2380952380952,5.546595784671835 +625.3968253968254,5.545445178876219 +625.5555555555555,5.544295276458937 +625.7142857142857,5.543146076681065 +625.8730158730159,5.541997578802875 +626.031746031746,5.540849782083847 +626.1904761904761,5.539702685782685 +626.3492063492064,5.538556289157338 +626.5079365079365,5.53741059146502 +626.6666666666666,5.536265591962222 +626.8253968253969,5.535121289904728 +626.984126984127,5.53397768454764 +627.1428571428571,5.532834775145387 +627.3015873015873,5.531692560951742 +627.4603174603175,5.530551041219846 +627.6190476190476,5.529410215202214 +627.7777777777778,5.528270082150755 +627.936507936508,5.527130641316793 +628.0952380952381,5.525991891951075 +628.2539682539683,5.524853833303792 +628.4126984126984,5.523716464624594 +628.5714285714286,5.522579785162601 +628.7301587301587,5.52144379416642 +628.8888888888889,5.520308490884165 +629.047619047619,5.519173874563469 +629.2063492063492,5.518039944451492 +629.3650793650794,5.516906699794947 +629.5238095238095,5.515774139840105 +629.6825396825396,5.514642263832819 +629.8412698412699,5.513511071018522 +630.0,5.512380560642265 +630.1587301587301,5.511250731948707 +630.3174603174604,5.510121584182144 +630.4761904761905,5.508993116586516 +630.6349206349206,5.5078653284054235 +630.7936507936508,5.5067382188821385 +630.952380952381,5.505611787259625 +631.1111111111111,5.504486032780536 +631.2698412698413,5.503360954687243 +631.4285714285714,5.502236552221843 +631.5873015873016,5.501112824626172 +631.7460317460317,5.49998977114181 +631.9047619047619,5.498867391010105 +632.063492063492,5.49774568347218 +632.2222222222222,5.4966246477689475 +632.3809523809524,5.4955042831411145 +632.5396825396825,5.494384588829204 +632.6984126984127,5.493265564073562 +632.8571428571429,5.492147208114368 +633.015873015873,5.491029520191651 +633.1746031746031,5.489912499545299 +633.3333333333334,5.488796145415068 +633.4920634920635,5.4876804570405975 +633.6507936507936,5.486565433661419 +633.8095238095239,5.485451074516966 +633.968253968254,5.4843373788465914 +634.1269841269841,5.483224345889568 +634.2857142857143,5.482111974885111 +634.4444444444445,5.481000265072378 +634.6031746031746,5.479889215690487 +634.7619047619048,5.478778825978521 +634.9206349206349,5.477669095175547 +635.0793650793651,5.4765600225206175 +635.2380952380952,5.475451607252783 +635.3968253968254,5.474343848611102 +635.5555555555555,5.473236745834655 +635.7142857142857,5.472130298162554 +635.8730158730159,5.47102450483394 +636.031746031746,5.4699193650880105 +636.1904761904761,5.468814878164019 +636.3492063492064,5.467711043301281 +636.5079365079365,5.466607859739198 +636.6666666666666,5.465505326717247 +636.8253968253969,5.464403443475007 +636.984126984127,5.4633022092521575 +637.1428571428571,5.462201623288491 +637.3015873015873,5.461101684823925 +637.4603174603175,5.460002393098503 +637.6190476190476,5.458903747352412 +637.7777777777778,5.457805746825984 +637.936507936508,5.456708390759708 +638.0952380952381,5.45561167839424 +638.2539682539683,5.454515608970404 +638.4126984126984,5.4534201817292125 +638.5714285714286,5.452325395911862 +638.7301587301587,5.451231250759749 +638.8888888888889,5.450137745514476 +639.047619047619,5.449044879417857 +639.2063492063492,5.447952651711931 +639.3650793650794,5.446861061638963 +639.5238095238095,5.445770108441457 +639.6825396825396,5.4446797913621605 +639.8412698412699,5.443590109644071 +640.0,5.442501062530452 +640.1587301587301,5.441412649264825 +640.3174603174604,5.440324869090991 +640.4761904761905,5.439237721253032 +640.6349206349206,5.438151204995318 +640.7936507936508,5.437065319562511 +640.952380952381,5.435980064199582 +641.1111111111111,5.434895438151806 +641.2698412698413,5.433811440664775 +641.4285714285714,5.432728070984404 +641.5873015873016,5.431645328356941 +641.7460317460317,5.4305632120289635 +641.9047619047619,5.429481721247397 +642.063492063492,5.428400855259514 +642.2222222222222,5.427320613312944 +642.3809523809524,5.426240994655675 +642.5396825396825,5.425161998536067 +642.6984126984127,5.424083624202851 +642.8571428571429,5.423005870905142 +643.015873015873,5.4219287378924355 +643.1746031746031,5.420852224414626 +643.3333333333334,5.419776329722001 +643.4920634920635,5.4187010530652575 +643.6507936507936,5.417626393695498 +643.8095238095239,5.416552350864239 +643.968253968254,5.415478923823425 +644.1269841269841,5.414406111825423 +644.2857142857143,5.4133339141230294 +644.4444444444445,5.4122623299694865 +644.6031746031746,5.411191358618474 +644.7619047619048,5.410120999324118 +644.9206349206349,5.4090512513410065 +645.0793650793651,5.407982113924181 +645.2380952380952,5.406913586329146 +645.3968253968254,5.405845667811879 +645.5555555555555,5.404778357628831 +645.7142857142857,5.403711655036933 +645.8730158730159,5.402645559293595 +646.031746031746,5.401580069656726 +646.1904761904761,5.400515185384719 +646.3492063492064,5.39945090573647 +646.5079365079365,5.398387229971381 +646.6666666666666,5.397324157349359 +646.8253968253969,5.396261687130822 +646.984126984127,5.39519981857671 +647.1428571428571,5.394138550948482 +647.3015873015873,5.393077883508122 +647.4603174603175,5.392017815518147 +647.6190476190476,5.390958346241606 +647.7777777777778,5.38989947494209 +647.936507936508,5.388841200883733 +648.0952380952381,5.387783523331214 +648.2539682539683,5.386726441549764 +648.4126984126984,5.385669954805173 +648.5714285714286,5.384614062363789 +648.7301587301587,5.3835587634925215 +648.8888888888889,5.382504057458849 +649.047619047619,5.381449943530823 +649.2063492063492,5.380396420977069 +649.3650793650794,5.379343489066793 +649.5238095238095,5.37829114706978 +649.6825396825396,5.377239394256406 +649.8412698412699,5.3761882298976325 +650.0,5.375137653265021 +650.1587301587301,5.374087663630725 +650.3174603174604,5.373038260267499 +650.4761904761905,5.371989442448707 +650.6349206349206,5.370941209448315 +650.7936507936508,5.369893560540899 +650.952380952381,5.368846495001657 +651.1111111111111,5.3678000121063985 +651.2698412698413,5.366754111131554 +651.4285714285714,5.365708791354181 +651.5873015873016,5.364664052051963 +651.7460317460317,5.363619892503212 +651.9047619047619,5.362576311986875 +652.063492063492,5.361533309782537 +652.2222222222222,5.360490885170422 +652.3809523809524,5.359449037431392 +652.5396825396825,5.3584077658469615 +652.6984126984127,5.357367069699286 +652.8571428571429,5.356326948271179 +653.015873015873,5.355287400846102 +653.1746031746031,5.354248426708176 +653.3333333333334,5.3532100251421815 +653.4920634920635,5.35217219543356 +653.6507936507936,5.351134936868419 +653.8095238095239,5.350098248733531 +653.968253968254,5.349062130316341 +654.1269841269841,5.348026580904937 +654.2857142857143,5.346991599788165 +654.4444444444445,5.345957186255465 +654.6031746031746,5.344923339596986 +654.7619047619048,5.343890059103557 +654.9206349206349,5.342857344066695 +655.0793650793651,5.3418251937786 +655.2380952380952,5.340793607532165 +655.3968253968254,5.339762584620969 +655.5555555555555,5.33873212433929 +655.7142857142857,5.3377022259821 +655.8730158730159,5.336672888845068 +656.031746031746,5.335644112224562 +656.1904761904761,5.3346158954176595 +656.3492063492064,5.333588237722131 +656.5079365079365,5.332561138436461 +656.6666666666666,5.331534596859842 +656.8253968253969,5.330508612292173 +656.984126984127,5.3294831840340695 +657.1428571428571,5.328458311386858 +657.3015873015873,5.32743399365258 +657.4603174603175,5.326410230134001 +657.6190476190476,5.325387020134597 +657.7777777777778,5.324364362958575 +657.936507936508,5.323342257910858 +658.0952380952381,5.3223207042970975 +658.2539682539683,5.321299701423669 +658.4126984126984,5.32027924859768 +658.5714285714286,5.319259345126964 +658.7301587301587,5.31823999032009 +658.8888888888889,5.317221183486355 +659.047619047619,5.316202923935797 +659.2063492063492,5.315185210979184 +659.3650793650794,5.314168043928027 +659.5238095238095,5.313188617030272 +659.6825396825396,5.312420518482848 +659.8412698412699,5.311652985463477 +660.0,5.310886017167865 +660.1587301587301,5.310119612793422 +660.3174603174604,5.309353771539249 +660.4761904761905,5.3085884926061455 +660.6349206349206,5.307823775196596 +660.7936507936508,5.307059618514766 +660.952380952381,5.306296021766508 +661.1111111111111,5.30553298415934 +661.2698412698413,5.3047705049024545 +661.4285714285714,5.30400858320671 +661.5873015873016,5.303247218284626 +661.7460317460317,5.302486409350378 +661.9047619047619,5.301726155619794 +662.063492063492,5.300966456310352 +662.2222222222222,5.300207310641172 +662.3809523809524,5.299448717833014 +662.5396825396825,5.298690677108273 +662.6984126984127,5.297933187690976 +662.8571428571429,5.2971762488067755 +663.015873015873,5.2964198596829455 +663.1746031746031,5.295664019548378 +663.3333333333334,5.294908727633583 +663.4920634920635,5.294153983170673 +663.6507936507936,5.293399785393371 +663.8095238095239,5.292646133536997 +663.968253968254,5.291893026838472 +664.1269841269841,5.291140464536308 +664.2857142857143,5.290388445870601 +664.4444444444445,5.2896369700830395 +664.6031746031746,5.2888860364168835 +664.7619047619048,5.288135644116976 +664.9206349206349,5.287385792429728 +665.0793650793651,5.286636480603116 +665.2380952380952,5.285887707886686 +665.3968253968254,5.285139473531537 +665.5555555555555,5.284391776790328 +665.7142857142857,5.283644616917266 +665.8730158730159,5.282897993168109 +666.031746031746,5.282151904800152 +666.1904761904761,5.281406351072236 +666.3492063492064,5.2806613312447315 +666.5079365079365,5.2799168445795415 +666.6666666666666,5.2791728903400985 +666.8253968253969,5.278429467791355 +666.984126984127,5.277686576199781 +667.1428571428571,5.276944214833368 +667.3015873015873,5.276202382961612 +667.4603174603175,5.275461079855519 +667.6190476190476,5.274720304787596 +667.7777777777778,5.273980057031851 +667.936507936508,5.27324033586379 +668.0952380952381,5.272501140560403 +668.2539682539683,5.271762470400176 +668.4126984126984,5.271024324663072 +668.5714285714286,5.270286702630537 +668.7301587301587,5.269549603585492 +668.8888888888889,5.26881302681233 +669.047619047619,5.268076971596912 +669.2063492063492,5.2673414372265634 +669.3650793650794,5.266606422990072 +669.5238095238095,5.265871928177679 +669.6825396825396,5.265137952081082 +669.8412698412699,5.264404493993425 +670.0,5.263671553209298 +670.1587301587301,5.262939129024734 +670.3174603174604,5.262207220737205 +670.4761904761905,5.2614758276456115 +670.6349206349206,5.2607449490502916 +670.7936507936508,5.260014584253003 +670.952380952381,5.259284732556934 +671.1111111111111,5.258555393266687 +671.2698412698413,5.257826565688281 +671.4285714285714,5.257098249129148 +671.5873015873016,5.2563704428981275 +671.7460317460317,5.255643146305465 +671.9047619047619,5.254916358662802 +672.063492063492,5.254190079283188 +672.2222222222222,5.253464307481055 +672.3809523809524,5.252739042572231 +672.5396825396825,5.2520142838739305 +672.6984126984127,5.25129003070475 +672.8571428571429,5.250566282384664 +673.015873015873,5.249843038235026 +673.1746031746031,5.2491202975785605 +673.3333333333334,5.24839805973936 +673.4920634920635,5.247676324042882 +673.6507936507936,5.2469550898159465 +673.8095238095239,5.246234356386734 +673.968253968254,5.245514123084775 +674.1269841269841,5.2447943892409565 +674.2857142857143,5.244075154187508 +674.4444444444445,5.243356417258007 +674.6031746031746,5.242638177787372 +674.7619047619048,5.2419204351118545 +674.9206349206349,5.241203188569045 +675.0793650793651,5.240486437497863 +675.2380952380952,5.239770181238553 +675.3968253968254,5.239054419132686 +675.5555555555555,5.238339150523152 +675.7142857142857,5.237624374754159 +675.8730158730159,5.236910091171225 +676.031746031746,5.2361962991211835 +676.1904761904761,5.23548299795217 +676.3492063492064,5.234770187013628 +676.5079365079365,5.234057865656297 +676.6666666666666,5.2333460332322135 +676.8253968253969,5.232634689094711 +676.984126984127,5.231923832598412 +677.1428571428571,5.231213463099222 +677.3015873015873,5.230503579954337 +677.4603174603175,5.229794182522226 +677.6190476190476,5.2290852701626385 +677.7777777777778,5.2283768422366 +677.936507936508,5.227668898106403 +678.0952380952381,5.226961437135609 +678.2539682539683,5.226254458689041 +678.4126984126984,5.225547962132787 +678.5714285714286,5.22484194683419 +678.7301587301587,5.224136412161848 +678.8888888888889,5.223431357485609 +679.047619047619,5.222726782176571 +679.2063492063492,5.222022685607077 +679.3650793650794,5.221319067150708 +679.5238095238095,5.22061592618229 +679.6825396825396,5.2199132620778785 +679.8412698412699,5.219211074214764 +680.0,5.2185093619714635 +680.1587301587301,5.217808124727726 +680.3174603174604,5.217107361864516 +680.4761904761905,5.216407072764022 +680.6349206349206,5.215707256809649 +680.7936507936508,5.2150079133860165 +680.952380952381,5.214309041878952 +681.1111111111111,5.213610641675491 +681.2698412698413,5.212912712163875 +681.4285714285714,5.212215252733546 +681.5873015873016,5.211518262775143 +681.7460317460317,5.210821741680504 +681.9047619047619,5.2101256888426555 +682.063492063492,5.209430103655815 +682.2222222222222,5.208734985515386 +682.3809523809524,5.208040333817956 +682.5396825396825,5.207346147961292 +682.6984126984127,5.20665242734434 +682.8571428571429,5.2059591713672155 +683.015873015873,5.205266379431213 +683.1746031746031,5.204574050938788 +683.3333333333334,5.203882185293566 +683.4920634920635,5.203190781900336 +683.6507936507936,5.202499840165041 +683.8095238095239,5.201809359494788 +683.968253968254,5.201119339297832 +684.1269841269841,5.200429778983582 +684.2857142857143,5.199740677962595 +684.4444444444445,5.199052035646572 +684.6031746031746,5.198363851448357 +684.7619047619048,5.197676124781932 +684.9206349206349,5.196988855062419 +685.0793650793651,5.196302041706072 +685.2380952380952,5.195615684130273 +685.3968253968254,5.194929781753536 +685.5555555555555,5.1942443339955 +685.7142857142857,5.193559340276925 +685.8730158730159,5.19287480001969 +686.031746031746,5.192190712646793 +686.1904761904761,5.1915070775823455 +686.3492063492064,5.190823894251568 +686.5079365079365,5.190141162080792 +686.6666666666666,5.189458880497455 +686.8253968253969,5.1887770489300955 +686.984126984127,5.188095666808354 +687.1428571428571,5.187414733562967 +687.3015873015873,5.186734248625767 +687.4603174603175,5.186054211429678 +687.6190476190476,5.185374621408714 +687.7777777777778,5.184695477997974 +687.936507936508,5.184016780633643 +688.0952380952381,5.183338528752985 +688.2539682539683,5.1826607217943454 +688.4126984126984,5.181983359197142 +688.5714285714286,5.181306440401869 +688.7301587301587,5.180629964850089 +688.8888888888889,5.179953931984433 +689.047619047619,5.179278341248599 +689.2063492063492,5.178603192087345 +689.3650793650794,5.177928483946488 +689.5238095238095,5.1772542162729085 +689.6825396825396,5.176580388514535 +689.8412698412699,5.175907000120351 +690.0,5.175234050540389 +690.1587301587301,5.1745615392257305 +690.3174603174604,5.173889465628498 +690.4761904761905,5.173217829201857 +690.6349206349206,5.172546629400013 +690.7936507936508,5.171875865678208 +690.952380952381,5.1712055374927175 +691.1111111111111,5.17053564430085 +691.2698412698413,5.169866185560939 +691.4285714285714,5.16919716073235 +691.5873015873016,5.168528569275468 +691.7460317460317,5.167860410651701 +691.9047619047619,5.167192684323478 +692.063492063492,5.1665253897542405 +692.2222222222222,5.165858526408447 +692.3809523809524,5.165192093751565 +692.5396825396825,5.164526091250073 +692.6984126984127,5.163860518371456 +692.8571428571429,5.1631953745842 +693.015873015873,5.162530659357797 +693.1746031746031,5.161866372162735 +693.3333333333334,5.161202512470498 +693.4920634920635,5.160539079753569 +693.6507936507936,5.159876073485417 +693.8095238095239,5.159213493140502 +693.968253968254,5.1585513381942745 +694.1269841269841,5.157889608123164 +694.2857142857143,5.157228302404587 +694.4444444444445,5.156567420516936 +694.6031746031746,5.155906961939582 +694.7619047619048,5.155246926152874 +694.9206349206349,5.154587312638128 +695.0793650793651,5.153928120877636 +695.2380952380952,5.153269350354654 +695.3968253968254,5.152611000553401 +695.5555555555555,5.151953070959069 +695.7142857142857,5.151295561057797 +695.8730158730159,5.1506384703366965 +696.031746031746,5.149981798283825 +696.1904761904761,5.149325544388199 +696.3492063492064,5.148669708139782 +696.5079365079365,5.1480142890294935 +696.6666666666666,5.147359286549191 +696.8253968253969,5.146704700191686 +696.984126984127,5.146050529450725 +697.1428571428571,5.145396773820999 +697.3015873015873,5.144743432798133 +697.4603174603175,5.144090505878692 +697.6190476190476,5.143437992560171 +697.7777777777778,5.142785892340995 +697.936507936508,5.142134204720521 +698.0952380952381,5.141482929199029 +698.2539682539683,5.140832065277728 +698.4126984126984,5.140181612458743 +698.5714285714286,5.139531570245125 +698.7301587301587,5.1388819381408375 +698.8888888888889,5.138232715650761 +699.047619047619,5.13758390228069 +699.2063492063492,5.136935497537331 +699.3650793650794,5.136287500928294 +699.5238095238095,5.1356399119621035 +699.6825396825396,5.134992730148181 +699.8412698412699,5.134345954996853 +700.0,5.133699586019349 +700.1587301587301,5.1330536227277905 +700.3174603174604,5.132408064635202 +700.4761904761905,5.131762911255495 +700.6349206349206,5.1311181621034745 +700.7936507936508,5.130473816694837 +700.952380952381,5.129829874546165 +701.1111111111111,5.129186335174924 +701.2698412698413,5.128543198099464 +701.4285714285714,5.127900462839015 +701.5873015873016,5.127258128913689 +701.7460317460317,5.126616195844472 +701.9047619047619,5.125974663153222 +702.063492063492,5.125333530362677 +702.2222222222222,5.1246927969964355 +702.3809523809524,5.124052462578972 +702.5396825396825,5.123412526635624 +702.6984126984127,5.122772988692594 +702.8571428571429,5.122133848276944 +703.015873015873,5.121495104916604 +703.1746031746031,5.12085675814035 +703.3333333333334,5.120218807477824 +703.4920634920635,5.119581252459517 +703.6507936507936,5.118944092616773 +703.8095238095239,5.1183073274817845 +703.968253968254,5.117670956587598 +704.1269841269841,5.117034979468097 +704.2857142857143,5.116399395658014 +704.4444444444445,5.115764204692922 +704.6031746031746,5.115183597655491 +704.7619047619048,5.114632519121255 +704.9206349206349,5.114081779387301 +705.0793650793651,5.1135313780436045 +705.2380952380952,5.112981314680905 +705.3968253968254,5.112431588890693 +705.5555555555555,5.111882200265222 +705.7142857142857,5.111333148397501 +705.8730158730159,5.110784432881284 +706.031746031746,5.110236053311091 +706.1904761904761,5.109688009282178 +706.3492063492064,5.109140300390555 +706.5079365079365,5.108592926232978 +706.6666666666666,5.108045886406946 +706.8253968253969,5.107499180510699 +706.984126984127,5.10695280814322 +707.1428571428571,5.106406768904231 +707.3015873015873,5.105861062394186 +707.4603174603175,5.105315688214282 +707.6190476190476,5.104770645966442 +707.7777777777778,5.104225935253327 +707.936507936508,5.103681555678321 +708.0952380952381,5.10313750684554 +708.2539682539683,5.102593788359827 +708.4126984126984,5.102050399826747 +708.5714285714286,5.101507340852588 +708.7301587301587,5.100964611044359 +708.8888888888889,5.100422210009792 +709.047619047619,5.099880137357331 +709.2063492063492,5.099338392696139 +709.3650793650794,5.09879697563609 +709.5238095238095,5.098255885787774 +709.6825396825396,5.097715122762491 +709.8412698412699,5.097174686172246 +710.0,5.096634575629754 +710.1587301587301,5.096094790748437 +710.3174603174604,5.0955553311424175 +710.4761904761905,5.095016196426523 +710.6349206349206,5.094477386216278 +710.7936507936508,5.093938900127907 +710.952380952381,5.0934007377783335 +711.1111111111111,5.092862898785173 +711.2698412698413,5.092325382766736 +711.4285714285714,5.091788189342028 +711.5873015873016,5.091251318130738 +711.7460317460317,5.090714768753251 +711.9047619047619,5.090178540830632 +712.063492063492,5.089642633984639 +712.2222222222222,5.0891070478377065 +712.3809523809524,5.088571782012954 +712.5396825396825,5.088036836134183 +712.6984126984127,5.087502209825873 +712.8571428571429,5.086967902713177 +713.015873015873,5.086433914421929 +713.1746031746031,5.085900244578634 +713.3333333333334,5.085366892810469 +713.4920634920635,5.084833858745283 +713.6507936507936,5.084301142011595 +713.8095238095239,5.083768742238589 +713.968253968254,5.083236659056115 +714.1269841269841,5.082704892094691 +714.2857142857143,5.082173440985494 +714.4444444444445,5.081642305360364 +714.6031746031746,5.0811114848518 +714.7619047619048,5.080580979092959 +714.9206349206349,5.080050787717655 +715.0793650793651,5.079520910360357 +715.2380952380952,5.078991346656188 +715.3968253968254,5.078462096240919 +715.5555555555555,5.077933158750978 +715.7142857142857,5.077404533823437 +715.8730158730159,5.076876221096015 +716.031746031746,5.0763482202070795 +716.1904761904761,5.0758205307956406 +716.3492063492064,5.075293152501351 +716.5079365079365,5.074766084964506 +716.6666666666666,5.074239327826037 +716.8253968253969,5.073712880727517 +716.984126984127,5.073186743311156 +717.1428571428571,5.072660915219796 +717.3015873015873,5.0721353960969155 +717.4603174603175,5.071610185586622 +717.6190476190476,5.071085283333658 +717.7777777777778,5.070560688983391 +717.936507936508,5.0700364021818185 +718.0952380952381,5.069512422575565 +718.2539682539683,5.068988749811876 +718.4126984126984,5.068465383538626 +718.5714285714286,5.067942323404306 +718.7301587301587,5.067419569058029 +718.8888888888889,5.066897120149529 +719.047619047619,5.066374976329158 +719.2063492063492,5.065853137247878 +719.3650793650794,5.06533160255727 +719.5238095238095,5.064810371909529 +719.6825396825396,5.0642894449574625 +719.8412698412699,5.063768821354483 +720.0,5.063248500754616 +720.1587301587301,5.062728482812495 +720.3174603174604,5.062208767183359 +720.4761904761905,5.061689353523046 +720.6349206349206,5.061170241488009 +720.7936507936508,5.06065143073529 +720.952380952381,5.060132920922542 +721.1111111111111,5.05961471170801 +721.2698412698413,5.059096802750538 +721.4285714285714,5.05857919370957 +721.5873015873016,5.058061884245142 +721.7460317460317,5.057544874017882 +721.9047619047619,5.057028162689014 +722.063492063492,5.056511749920349 +722.2222222222222,5.055995635374289 +722.3809523809524,5.055479818713827 +722.5396825396825,5.054964299602535 +722.6984126984127,5.054449077704579 +722.8571428571429,5.053934152684703 +723.015873015873,5.053419524208237 +723.1746031746031,5.052905191941091 +723.3333333333334,5.052391155549752 +723.4920634920635,5.051877414701293 +723.6507936507936,5.051363969063356 +723.8095238095239,5.0508508183041645 +723.968253968254,5.050337962092515 +724.1269841269841,5.049825400097778 +724.2857142857143,5.0493131319898925 +724.4444444444445,5.048801157439372 +724.6031746031746,5.0482894761173 +724.7619047619048,5.047778087695322 +724.9206349206349,5.0472669918456585 +725.0793650793651,5.0467561882410905 +725.2380952380952,5.046245676554962 +725.3968253968254,5.045735456461184 +725.5555555555555,5.045225527634226 +725.7142857142857,5.04471588974912 +725.8730158730159,5.044206542481454 +726.031746031746,5.0436974855073755 +726.1904761904761,5.043188718503593 +726.3492063492064,5.04268024114736 +726.5079365079365,5.042172053116492 +726.6666666666666,5.0416641540893545 +726.8253968253969,5.041156543744865 +726.984126984127,5.040649221762492 +727.1428571428571,5.04014218782225 +727.3015873015873,5.039635441604703 +727.4603174603175,5.039128982790961 +727.6190476190476,5.038622811062682 +727.7777777777778,5.038116926102063 +727.936507936508,5.037611327591848 +728.0952380952381,5.0371060152153175 +728.2539682539683,5.036600988656299 +728.4126984126984,5.036096247599154 +728.5714285714286,5.035591791728782 +728.7301587301587,5.035087620730622 +728.8888888888889,5.034583734290646 +729.047619047619,5.034080132095361 +729.2063492063492,5.033576813831805 +729.3650793650794,5.033073779187551 +729.5238095238095,5.032571027850701 +729.6825396825396,5.032068559509886 +729.8412698412699,5.0315663738542655 +730.0,5.031064470573527 +730.1587301587301,5.030562849357881 +730.3174603174604,5.030061509898065 +730.4761904761905,5.029560451885339 +730.6349206349206,5.029059675011487 +730.7936507936508,5.028559178968811 +730.952380952381,5.028058963450135 +731.1111111111111,5.027559028148801 +731.2698412698413,5.027059372758669 +731.4285714285714,5.026559996974115 +731.5873015873016,5.02606090049003 +731.7460317460317,5.02556208300182 +731.9047619047619,5.025063544205405 +732.063492063492,5.0245652837972115 +732.2222222222222,5.024067301474183 +732.3809523809524,5.023569596933768 +732.5396825396825,5.023072169873927 +732.6984126984127,5.022575019993126 +732.8571428571429,5.022078146990337 +733.015873015873,5.021581550565035 +733.1746031746031,5.021085230417203 +733.3333333333334,5.020589186247323 +733.4920634920635,5.020093417756383 +733.6507936507936,5.019597924645866 +733.8095238095239,5.0191027066177565 +733.968253968254,5.01860776337454 +734.1269841269841,5.018113094619197 +734.2857142857143,5.017618700055202 +734.4444444444445,5.017124579386529 +734.6031746031746,5.0166307323176405 +734.7619047619048,5.016137158553496 +734.9206349206349,5.015643857799546 +735.0793650793651,5.015150829761731 +735.2380952380952,5.014658074146478 +735.3968253968254,5.014165590660708 +735.5555555555555,5.013673379011827 +735.7142857142857,5.013181438907723 +735.8730158730159,5.012689770056776 +736.031746031746,5.0121983721678465 +736.1904761904761,5.011707244950279 +736.3492063492064,5.0112163881138985 +736.5079365079365,5.010725801369012 +736.6666666666666,5.010235484426407 +736.8253968253969,5.00974543699735 +736.984126984127,5.009255658793581 +737.1428571428571,5.0087661495273235 +737.3015873015873,5.008276908911272 +737.4603174603175,5.007787936658596 +737.6190476190476,5.007299232482939 +737.7777777777778,5.006810796098418 +737.936507936508,5.006322627219621 +738.0952380952381,5.005834725561606 +738.2539682539683,5.0053470908399 +738.4126984126984,5.0048597227705 +738.5714285714286,5.004372621069867 +738.7301587301587,5.003885785454934 +738.8888888888889,5.003399215643092 +739.047619047619,5.002912911352203 +739.2063492063492,5.002426872300589 +739.3650793650794,5.001941098207034 +739.5238095238095,5.001455588790786 +739.6825396825396,5.000970343771547 +739.8412698412699,5.000485362869487 +740.0,5.000000645805227 +740.1587301587301,4.999516192299848 +740.3174603174604,4.999032002074888 +740.4761904761905,4.99854807485234 +740.6349206349206,4.99806441035465 +740.7936507936508,4.997581008304716 +740.952380952381,4.997097868425895 +741.1111111111111,4.9966149904419845 +741.2698412698413,4.996132374077243 +741.4285714285714,4.995650019056372 +741.5873015873016,4.995167925104524 +741.7460317460317,4.994686091947297 +741.9047619047619,4.9942045193107365 +742.063492063492,4.9937232069213335 +742.2222222222222,4.9932421545060235 +742.3809523809524,4.992761361792184 +742.5396825396825,4.99228082850764 +742.6984126984127,4.991800554380652 +742.8571428571429,4.991320539139925 +743.015873015873,4.9908407825146 +743.1746031746031,4.990361284234262 +743.3333333333334,4.98988204402893 +743.4920634920635,4.989403061629063 +743.6507936507936,4.9889243367655505 +743.8095238095239,4.9884458691697215 +743.968253968254,4.987967658573341 +744.1269841269841,4.987489704708599 +744.2857142857143,4.987012007308127 +744.4444444444445,4.986534566104982 +744.6031746031746,4.986057380832654 +744.7619047619048,4.985580451225059 +744.9206349206349,4.985103777016546 +745.0793650793651,4.984627357941889 +745.2380952380952,4.984151193736288 +745.3968253968254,4.98367528413537 +745.5555555555555,4.983199628875189 +745.7142857142857,4.982724227692218 +745.8730158730159,4.982249080323357 +746.031746031746,4.981774186505925 +746.1904761904761,4.981299545977667 +746.3492063492064,4.980825158476744 +746.5079365079365,4.980351023741736 +746.6666666666666,4.979877141511644 +746.8253968253969,4.979403511525888 +746.984126984127,4.978930133524299 +747.1428571428571,4.978457007247131 +747.3015873015873,4.977984132435046 +747.4603174603175,4.977511508829127 +747.6190476190476,4.9770391361708635 +747.7777777777778,4.976567014202162 +747.936507936508,4.97609514266534 +748.0952380952381,4.975623521303122 +748.2539682539683,4.975152149858647 +748.4126984126984,4.97468102807546 +748.5714285714286,4.974210155697514 +748.7301587301587,4.973739532469169 +748.8888888888889,4.973269158135193 +749.047619047619,4.97279903244076 +749.2063492063492,4.972329155131442 +749.3650793650794,4.971859525953224 +749.5238095238095,4.971390144652488 +749.6825396825396,4.970921010976017 +749.8412698412699,4.970452124671 +750.0,4.969983485485023 +750.1587301587301,4.96951509316607 +750.3174603174604,4.9690469474625285 +750.4761904761905,4.968579048123178 +750.6349206349206,4.968111394897201 +750.7936507936508,4.967643987534171 +750.952380952381,4.967176825784058 +751.1111111111111,4.966709909397228 +751.2698412698413,4.966243238124437 +751.4285714285714,4.96577681171684 +751.5873015873016,4.965310629925978 +751.7460317460317,4.964844692503785 +751.9047619047619,4.964378999202586 +752.063492063492,4.963913549775096 +752.2222222222222,4.963448343974417 +752.3809523809524,4.962983381554036 +752.5396825396825,4.9625186622678354 +752.6984126984127,4.962054185870077 +752.8571428571429,4.96158995211541 +753.015873015873,4.961125960758867 +753.1746031746031,4.960662211555865 +753.3333333333334,4.960198704262208 +753.4920634920635,4.959735438634074 +753.6507936507936,4.95927241442803 +753.8095238095239,4.958809631401019 +753.968253968254,4.958347089310367 +754.1269841269841,4.957884787913774 +754.2857142857143,4.957422726969326 +754.4444444444445,4.956960906235478 +754.6031746031746,4.956499325471069 +754.7619047619048,4.956037984435307 +754.9206349206349,4.955576882887781 +755.0793650793651,4.955116020588452 +755.2380952380952,4.954655397297654 +755.3968253968254,4.9541950127760925 +755.5555555555555,4.953734866784848 +755.7142857142857,4.953274959085371 +755.8730158730159,4.9528152894394815 +756.031746031746,4.952360765965647 +756.1904761904761,4.9519261027881125 +756.3492063492064,4.951491659120658 +756.5079365079365,4.951057434745729 +756.6666666666666,4.950623429446105 +756.8253968253969,4.950189643004903 +756.984126984127,4.949756075205574 +757.1428571428571,4.949322725831904 +757.3015873015873,4.948889594668014 +757.4603174603175,4.948456681498354 +757.6190476190476,4.948023986107712 +757.7777777777778,4.947591508281202 +757.936507936508,4.947159247804273 +758.0952380952381,4.946727204462704 +758.2539682539683,4.9462953780426 +758.4126984126984,4.945863768330399 +758.5714285714286,4.9454323751128655 +758.7301587301587,4.945001198177091 +758.8888888888889,4.9445702373104945 +759.047619047619,4.944139492300823 +759.2063492063492,4.943708962936146 +759.3650793650794,4.943278649004859 +759.5238095238095,4.9428485502956825 +759.6825396825396,4.9424186665976615 +759.8412698412699,4.941988997700161 +760.0,4.94155954339287 +760.1587301587301,4.9411303034657985 +760.3174603174604,4.9407012777092785 +760.4761904761905,4.940272465913962 +760.6349206349206,4.9398438678708185 +760.7936507936508,4.93941548337114 +760.952380952381,4.938987312206534 +761.1111111111111,4.938559354168928 +761.2698412698413,4.938131609050563 +761.4285714285714,4.937704076644001 +761.5873015873016,4.937276756742114 +761.7460317460317,4.936849649138097 +761.9047619047619,4.936422753625451 +762.063492063492,4.935996069997997 +762.2222222222222,4.935569598049866 +762.3809523809524,4.935143337575502 +762.5396825396825,4.934717288369663 +762.6984126984127,4.934291450227415 +762.8571428571429,4.933865822944138 +763.015873015873,4.933440406315517 +763.1746031746031,4.933015200137524 +763.3333333333334,4.932590204206522 +763.4920634920635,4.932165418319099 +763.6507936507936,4.9317408422721725 +763.8095238095239,4.931316475862977 +763.968253968254,4.930892318889044 +764.1269841269841,4.9304683711482165 +764.2857142857143,4.93004463243864 +764.4444444444445,4.929621102558763 +764.6031746031746,4.9291977813073435 +764.7619047619048,4.928774668483436 +764.9206349206349,4.928351763886402 +765.0793650793651,4.927929067315905 +765.2380952380952,4.927506578571904 +765.3968253968254,4.927084297454669 +765.5555555555555,4.926662223764761 +765.7142857142857,4.926240357303043 +765.8730158730159,4.92581869787068 +766.031746031746,4.925397245269133 +766.1904761904761,4.9249759993001625 +766.3492063492064,4.924554959765821 +766.5079365079365,4.924134126468465 +766.6666666666666,4.923713499210742 +766.8253968253969,4.923293077795597 +766.984126984127,4.922872862026266 +767.1428571428571,4.922452851706287 +767.3015873015873,4.922033046639483 +767.4603174603175,4.9216134466299755 +767.6190476190476,4.921194051482177 +767.7777777777778,4.92077486100079 +767.936507936508,4.920355874990813 +768.0952380952381,4.919937093257531 +768.2539682539683,4.919518515606518 +768.4126984126984,4.919100141843644 +768.5714285714286,4.918681971775061 +768.7301587301587,4.918264005207212 +768.8888888888889,4.91784624194683 +769.047619047619,4.917428681800931 +769.2063492063492,4.917011324576824 +769.3650793650794,4.916594170082095 +769.5238095238095,4.916177218124625 +769.6825396825396,4.915760468512573 +769.8412698412699,4.915343921054386 +770.0,4.914927575558793 +770.1587301587301,4.914511431834809 +770.3174603174604,4.914095489691729 +770.4761904761905,4.9136797489391295 +770.6349206349206,4.913264209386873 +770.7936507936508,4.912848870845098 +770.952380952381,4.912433733124226 +771.1111111111111,4.91201879603496 +771.2698412698413,4.911604059388279 +771.4285714285714,4.911189522995442 +771.5873015873016,4.910775186667989 +771.7460317460317,4.910361050217731 +771.9047619047619,4.909947113456765 +772.063492063492,4.909533376197458 +772.2222222222222,4.9091198382524555 +772.3809523809524,4.908706499434679 +772.5396825396825,4.908293359557324 +772.6984126984127,4.907880418433862 +772.8571428571429,4.907467675878036 +773.015873015873,4.907055131703863 +773.1746031746031,4.906642785725635 +773.3333333333334,4.906230637757914 +773.4920634920635,4.905818687615535 +773.6507936507936,4.905406935113605 +773.8095238095239,4.904995380067499 +773.968253968254,4.904584022292865 +774.1269841269841,4.904172861605618 +774.2857142857143,4.903761897821944 +774.4444444444445,4.903351130758299 +774.6031746031746,4.9029405602314045 +774.7619047619048,4.902530186058249 +774.9206349206349,4.902120008056091 +775.0793650793651,4.901710026042453 +775.2380952380952,4.901300239835127 +775.3968253968254,4.9008906492521636 +775.5555555555555,4.9004812541118845 +775.7142857142857,4.900072054232875 +775.8730158730159,4.8996630494339835 +776.031746031746,4.89925423953432 +776.1904761904761,4.89884562435326 +776.3492063492064,4.898437203710441 +776.5079365079365,4.898028977425761 +776.6666666666666,4.897620945319381 +776.8253968253969,4.89721310721172 +776.984126984127,4.896805462923463 +777.1428571428571,4.896398012275548 +777.3015873015873,4.895990755089177 +777.4603174603175,4.89558369118581 +777.6190476190476,4.895176820387164 +777.7777777777778,4.894770142515214 +777.936507936508,4.894363657392195 +778.0952380952381,4.8939573648405945 +778.2539682539683,4.893551264683161 +778.4126984126984,4.893145356742896 +778.5714285714286,4.892739640843057 +778.7301587301587,4.892334116807154 +778.8888888888889,4.8919287844589565 +779.047619047619,4.891523643622484 +779.2063492063492,4.89111869412201 +779.3650793650794,4.8907139357820615 +779.5238095238095,4.8903093684274195 +779.6825396825396,4.889904991883112 +779.8412698412699,4.889500805974424 +780.0,4.889096810526889 +780.1587301587301,4.8886930053662905 +780.3174603174604,4.888289390318663 +780.4761904761905,4.88788596521029 +780.6349206349206,4.887482729867703 +780.7936507936508,4.887079684117685 +780.952380952381,4.886676827787265 +781.1111111111111,4.886274160703717 +781.2698412698413,4.88587168269457 +781.4285714285714,4.885469393587592 +781.5873015873016,4.885067293210799 +781.7460317460317,4.8846653813924545 +781.9047619047619,4.884263657961068 +782.063492063492,4.883862122745389 +782.2222222222222,4.883460775574417 +782.3809523809524,4.883059616277391 +782.5396825396825,4.882658644683797 +782.6984126984127,4.882257860623359 +782.8571428571429,4.881857263926051 +783.015873015873,4.881456854422081 +783.1746031746031,4.881056631941903 +783.3333333333334,4.880656596316212 +783.4920634920635,4.880256747375941 +783.6507936507936,4.879857084952266 +783.8095238095239,4.879457608876601 +783.968253968254,4.879058318980601 +784.1269841269841,4.878659215096158 +784.2857142857143,4.878260297055399 +784.4444444444445,4.8778615646907 +784.6031746031746,4.877463017834661 +784.7619047619048,4.877064656320128 +784.9206349206349,4.876666479980181 +785.0793650793651,4.876268488648135 +785.2380952380952,4.87587068215754 +785.3968253968254,4.875473060342184 +785.5555555555555,4.875075623036088 +785.7142857142857,4.874678370073508 +785.8730158730159,4.874281301288934 +786.031746031746,4.873884416517085 +786.1904761904761,4.873487715592923 +786.3492063492064,4.873091198351631 +786.5079365079365,4.872694864628629 +786.6666666666666,4.872298714259573 +786.8253968253969,4.8719027470803455 +786.984126984127,4.87150696292706 +787.1428571428571,4.871111361636058 +787.3015873015873,4.870715943043917 +787.4603174603175,4.870320706987441 +787.6190476190476,4.86992565330366 +787.7777777777778,4.869530781829837 +787.936507936508,4.86913609240346 +788.0952380952381,4.868741584862249 +788.2539682539683,4.868347259044148 +788.4126984126984,4.867953114787326 +788.5714285714286,4.867559151930184 +788.7301587301587,4.867165370311346 +788.8888888888889,4.866771769769658 +789.047619047619,4.866378350144198 +789.2063492063492,4.865985111274265 +789.3650793650794,4.865592052999381 +789.5238095238095,4.865199175159298 +789.6825396825396,4.864806477593984 +789.8412698412699,4.864413960143635 +790.0,4.864021622648667 +790.1587301587301,4.86362946494972 +790.3174603174604,4.863237486887656 +790.4761904761905,4.862845688303557 +790.6349206349206,4.862454069038727 +790.7936507936508,4.86206262893469 +790.952380952381,4.86167136783319 +791.1111111111111,4.861280285576194 +791.2698412698413,4.860889382005882 +791.4285714285714,4.86049865696466 +791.5873015873016,4.860108110295146 +791.7460317460317,4.859717741840182 +791.9047619047619,4.859327551442824 +792.063492063492,4.858937538946348 +792.2222222222222,4.858547704194244 +792.3809523809524,4.858158047030219 +792.5396825396825,4.857768567298199 +792.6984126984127,4.857379264842324 +792.8571428571429,4.856990139506946 +793.015873015873,4.856601191136639 +793.1746031746031,4.8562124195761855 +793.3333333333334,4.855823824670585 +793.4920634920635,4.85543540626505 +793.6507936507936,4.855047164205006 +793.8095238095239,4.854659098336093 +793.968253968254,4.85427120850416 +794.1269841269841,4.853883494555273 +794.2857142857143,4.853495956335705 +794.4444444444445,4.853108593691946 +794.6031746031746,4.852721406470691 +794.7619047619048,4.8523343945188495 +794.9206349206349,4.8519475576835385 +795.0793650793651,4.851560895812088 +795.2380952380952,4.851174408752037 +795.3968253968254,4.8507880963511285 +795.5555555555555,4.850401958457322 +795.7142857142857,4.850015994918779 +795.8730158730159,4.849630205583871 +796.031746031746,4.849244590301179 +796.1904761904761,4.848859148919488 +796.3492063492064,4.848473881287792 +796.5079365079365,4.848088787255291 +796.6666666666666,4.847703866671389 +796.8253968253969,4.8473191193856975 +796.984126984127,4.8469345452480335 +797.1428571428571,4.846550144108419 +797.3015873015873,4.846165915817077 +797.4603174603175,4.8457818602244425 +797.6190476190476,4.845397977181144 +797.7777777777778,4.845014266538022 +797.936507936508,4.844630728146114 +798.0952380952381,4.844247361856664 +798.2539682539683,4.843864167521117 +798.4126984126984,4.843481144991119 +798.5714285714286,4.843098294118521 +798.7301587301587,4.842715614755369 +798.8888888888889,4.842333106753915 +799.047619047619,4.841950769966611 +799.2063492063492,4.841568604246106 +799.3650793650794,4.841186609445251 +799.5238095238095,4.840804785417095 +799.6825396825396,4.840423132014889 +799.8412698412699,4.84004164909208 +800.0,4.839660336502312 +800.1587301587301,4.839279194099428 +800.3174603174604,4.838898221737473 +800.4761904761905,4.838517419270682 +800.6349206349206,4.838136786553491 +800.7936507936508,4.837756323440531 +800.952380952381,4.837376029786631 +801.1111111111111,4.836995905446813 +801.2698412698413,4.836615950276296 +801.4285714285714,4.836236164130495 +801.5873015873016,4.835856546865017 +801.7460317460317,4.835477098335666 +801.9047619047619,4.835097818398437 +802.063492063492,4.834718706909523 +802.2222222222222,4.834339763725307 +802.3809523809524,4.833960988702364 +802.5396825396825,4.8335823816974655 +802.6984126984127,4.833203942567571 +802.8571428571429,4.832825671169834 +803.015873015873,4.8324475673616005 +803.1746031746031,4.832069631000406 +803.3333333333334,4.831691861943979 +803.4920634920635,4.831314260050235 +803.6507936507936,4.830936825177281 +803.8095238095239,4.830559557183417 +803.968253968254,4.830182455927128 +804.1269841269841,4.829805521267091 +804.2857142857143,4.82942875306217 +804.4444444444445,4.829052151171419 +804.6031746031746,4.8286757154540805 +804.7619047619048,4.828299445769582 +804.9206349206349,4.82792334197754 +805.0793650793651,4.827547403937761 +805.2380952380952,4.827171631510232 +805.3968253968254,4.826796024555133 +805.5555555555555,4.826420582932824 +805.7142857142857,4.826045306503859 +805.8730158730159,4.825670195128968 +806.031746031746,4.825295248669073 +806.1904761904761,4.824920466985274 +806.3492063492064,4.824545849938866 +806.5079365079365,4.824171397391317 +806.6666666666666,4.8237971092042855 +806.8253968253969,4.823422985239613 +806.984126984127,4.82304902535932 +807.1428571428571,4.822675229425615 +807.3015873015873,4.822301597300886 +807.4603174603175,4.821928128847702 +807.6190476190476,4.8215548239288175 +807.7777777777778,4.821181682407166 +807.936507936508,4.820808704145862 +808.0952380952381,4.820435889008204 +808.2539682539683,4.820063236857666 +808.4126984126984,4.819690747557907 +808.5714285714286,4.819318420972763 +808.7301587301587,4.818946256966251 +808.8888888888889,4.818574255402566 +809.047619047619,4.818202416146082 +809.2063492063492,4.817830739061355 +809.3650793650794,4.817459224013114 +809.5238095238095,4.81708787086627 +809.6825396825396,4.81671667948591 +809.8412698412699,4.816345649737297 +810.0,4.8159747814858775 +810.1587301587301,4.815604074597264 +810.3174603174604,4.815233528937257 +810.4761904761905,4.814863144371825 +810.6349206349206,4.814492920767114 +810.7936507936508,4.814122857989446 +810.952380952381,4.813752955905322 +811.1111111111111,4.813383214381412 +811.2698412698413,4.813013633284564 +811.4285714285714,4.812644212481798 +811.5873015873016,4.812274951840312 +811.7460317460317,4.811905851227473 +811.9047619047619,4.8115369105108226 +812.063492063492,4.8111681295580775 +812.2222222222222,4.8107995082371255 +812.3809523809524,4.810431046416027 +812.5396825396825,4.810062743963015 +812.6984126984127,4.809694600746493 +812.8571428571429,4.8093266166350395 +813.015873015873,4.8089587914974 +813.1746031746031,4.808591125202491 +813.3333333333334,4.808223617619404 +813.4920634920635,4.807856268617398 +813.6507936507936,4.8074890780659025 +813.8095238095239,4.807122045834514 +813.968253968254,4.806755171793004 +814.1269841269841,4.806388455811307 +814.2857142857143,4.806021897759531 +814.4444444444445,4.805655497507952 +814.6031746031746,4.805289254927012 +814.7619047619048,4.804923169887322 +814.9206349206349,4.80455724225966 +815.0793650793651,4.804191471914974 +815.2380952380952,4.803825858724377 +815.3968253968254,4.803460402559149 +815.5555555555555,4.803095103290736 +815.7142857142857,4.80272996079075 +815.8730158730159,4.802364974930972 +816.031746031746,4.802000145583346 +816.1904761904761,4.80163547261998 +816.3492063492064,4.801270955913149 +816.5079365079365,4.800906595335295 +816.6666666666666,4.800542390759021 +816.8253968253969,4.800178342057094 +816.984126984127,4.799814449102446 +817.1428571428571,4.799450711768174 +817.3015873015873,4.799087129927538 +817.4603174603175,4.798723703453958 +817.6190476190476,4.798360432221021 +817.7777777777778,4.7979973161024745 +817.936507936508,4.797634354972227 +818.0952380952381,4.79727154870435 +818.2539682539683,4.796908897173078 +818.4126984126984,4.796546400252807 +818.5714285714286,4.79618405781809 +818.7301587301587,4.795821869743644 +818.8888888888889,4.795459835904348 +819.047619047619,4.795097956175239 +819.2063492063492,4.794736230431514 +819.3650793650794,4.79437465854853 +819.5238095238095,4.794013240401803 +819.6825396825396,4.793651975867011 +819.8412698412699,4.793290864819986 +820.0,4.792929907136724 +820.1587301587301,4.792569102693376 +820.3174603174604,4.79220845136625 +820.4761904761905,4.791847953031816 +820.6349206349206,4.791487607566697 +820.7936507936508,4.791127414847675 +820.952380952381,4.790767374751692 +821.1111111111111,4.79040673871412 +821.2698412698413,4.790036313644255 +821.4285714285714,4.789666044891371 +821.5873015873016,4.789295932333212 +821.7460317460317,4.78892597584767 +821.9047619047619,4.788556175312791 +822.063492063492,4.788186530606766 +822.2222222222222,4.787817041607937 +822.3809523809524,4.787447708194791 +822.5396825396825,4.7870785302459655 +822.6984126984127,4.786709507640245 +822.8571428571429,4.7863406402565625 +823.015873015873,4.7859719279739945 +823.1746031746031,4.78560337067177 +823.3333333333334,4.78523496822926 +823.4920634920635,4.784866720525986 +823.6507936507936,4.784498627441611 +823.8095238095239,4.7841306888559485 +823.968253968254,4.783762904648958 +824.1269841269841,4.783395274700738 +824.2857142857143,4.783027798891541 +824.4444444444445,4.78266047710176 +824.6031746031746,4.782293309211932 +824.7619047619048,4.78192629510274 +824.9206349206349,4.781559434655014 +825.0793650793651,4.781192727749722 +825.2380952380952,4.7808261742679825 +825.3968253968254,4.780459774091054 +825.5555555555555,4.7800935271003375 +825.7142857142857,4.779727433177381 +825.8730158730159,4.779361492203871 +826.031746031746,4.778995704061641 +826.1904761904761,4.778630068632665 +826.3492063492064,4.778264585799057 +826.5079365079365,4.777899255443079 +826.6666666666666,4.77753407744713 +826.8253968253969,4.7771690516937495 +826.984126984127,4.776804178065622 +827.1428571428571,4.776439456445573 +827.3015873015873,4.776074886716567 +827.4603174603175,4.77571046876171 +827.6190476190476,4.775346202464247 +827.7777777777778,4.774982087707566 +827.936507936508,4.774618124375192 +828.0952380952381,4.774254312350794 +828.2539682539683,4.773890651518175 +828.4126984126984,4.7735271417612815 +828.5714285714286,4.773163782964197 +828.7301587301587,4.772800575011146 +828.8888888888889,4.772437517786489 +829.047619047619,4.772074611174727 +829.2063492063492,4.771711855060496 +829.3650793650794,4.771349249328575 +829.5238095238095,4.770986793863878 +829.6825396825396,4.770624488551455 +829.8412698412699,4.770262333276494 +830.0,4.769900327924324 +830.1587301587301,4.769538472380406 +830.3174603174604,4.769176766530339 +830.4761904761905,4.768815210259859 +830.6349206349206,4.7684538034548405 +830.7936507936508,4.768092546001288 +830.952380952381,4.767731437785348 +831.1111111111111,4.767370478693298 +831.2698412698413,4.767009668611554 +831.4285714285714,4.766649007426666 +831.5873015873016,4.766288495025316 +831.7460317460317,4.765928131294328 +831.9047619047619,4.765567916120652 +832.063492063492,4.765207849391378 +832.2222222222222,4.764847930993726 +832.3809523809524,4.764488160815053 +832.5396825396825,4.764128538742851 +832.6984126984127,4.763769064664739 +832.8571428571429,4.763409738468475 +833.015873015873,4.76305056004195 +833.1746031746031,4.762691529273184 +833.3333333333334,4.762332646050329 +833.4920634920635,4.761973910261674 +833.6507936507936,4.761615321795639 +833.8095238095239,4.761256880540773 +833.968253968254,4.76089858638576 +834.1269841269841,4.760540439219411 +834.2857142857143,4.7601824389306735 +834.4444444444445,4.759824585408624 +834.6031746031746,4.759466878542469 +834.7619047619048,4.759109318221545 +834.9206349206349,4.758751904335322 +835.0793650793651,4.758394636773398 +835.2380952380952,4.7580375154254995 +835.3968253968254,4.757680540181489 +835.5555555555555,4.75732371093135 +835.7142857142857,4.756967027565203 +835.8730158730159,4.7566104899732915 +836.031746031746,4.756254098045994 +836.1904761904761,4.755897851673814 +836.3492063492064,4.755541750747383 +836.5079365079365,4.755185795157464 +836.6666666666666,4.754829984794946 +836.8253968253969,4.754474319550845 +836.984126984127,4.754118799316309 +837.1428571428571,4.753763423982609 +837.3015873015873,4.753408193441145 +837.4603174603175,4.753053107583446 +837.6190476190476,4.7526981663011645 +837.7777777777778,4.752343369486082 +837.936507936508,4.751988717030107 +838.0952380952381,4.751634208825274 +838.2539682539683,4.751279844763742 +838.4126984126984,4.750925624737797 +838.5714285714286,4.750571548639852 +838.7301587301587,4.750217616362445 +838.8888888888889,4.749863827798237 +839.047619047619,4.749510182840018 +839.2063492063492,4.7491566813807 +839.3650793650794,4.748803323313322 +839.5238095238095,4.748450108531045 +839.6825396825396,4.748097036927157 +839.8412698412699,4.747744108395068 +840.0,4.747391322828315 +840.1587301587301,4.747038680120556 +840.3174603174604,4.746686180165573 +840.4761904761905,4.746333822857272 +840.6349206349206,4.745981608089683 +840.7936507936508,4.745629535756958 +840.952380952381,4.7452776057533725 +841.1111111111111,4.744925817973323 +841.2698412698413,4.74457417231133 +841.4285714285714,4.744222668662037 +841.5873015873016,4.743871306920207 +841.7460317460317,4.743520086980728 +841.9047619047619,4.743169008738607 +842.063492063492,4.742818072088974 +842.2222222222222,4.74246727692708 +842.3809523809524,4.742116623148296 +842.5396825396825,4.7417661106481175 +842.6984126984127,4.741415739322156 +842.8571428571429,4.741065509066146 +843.015873015873,4.7407154197759445 +843.1746031746031,4.740365471347523 +843.3333333333334,4.740015663676979 +843.4920634920635,4.739665996660525 +843.6507936507936,4.739316470194497 +843.8095238095239,4.738967084175349 +843.968253968254,4.7386178384996525 +844.1269841269841,4.7382687330641 +844.2857142857143,4.737919767765503 +844.4444444444445,4.737570942500791 +844.6031746031746,4.73722225716701 +844.7619047619048,4.736873711661331 +844.9206349206349,4.736525305881036 +845.0793650793651,4.736177039723527 +845.2380952380952,4.7358289130863245 +845.3968253968254,4.735480925867067 +845.5555555555555,4.735133077963511 +845.7142857142857,4.734785369273527 +845.8730158730159,4.7344377996951055 +846.031746031746,4.734090369126354 +846.1904761904761,4.733743077465493 +846.3492063492064,4.733395924610866 +846.5079365079365,4.7330489104609255 +846.6666666666666,4.732702034914246 +846.8253968253969,4.732355297869516 +846.984126984127,4.7320086992255375 +847.1428571428571,4.731662238881231 +847.3015873015873,4.731315916735632 +847.4603174603175,4.73096973268789 +847.6190476190476,4.73062368663727 +847.7777777777778,4.730277778483154 +847.936507936508,4.729932008125035 +848.0952380952381,4.7295863754625245 +848.2539682539683,4.729240880395343 +848.4126984126984,4.728895522823333 +848.5714285714286,4.728550302646442 +848.7301587301587,4.728205219764741 +848.8888888888889,4.727860274078405 +849.047619047619,4.72751546548773 +849.2063492063492,4.727170793893119 +849.3650793650794,4.7268262591950965 +849.5238095238095,4.726481861294292 +849.6825396825396,4.726137600091451 +849.8412698412699,4.725793475487431 +850.0,4.725449487383203 +850.1587301587301,4.725105635679852 +850.3174603174604,4.724761920278568 +850.4761904761905,4.7244183410806615 +850.6349206349206,4.72407489798755 +850.7936507936508,4.723731590900763 +850.952380952381,4.723388419721942 +851.1111111111111,4.72304538435284 +851.2698412698413,4.722702484695321 +851.4285714285714,4.722359720651361 +851.5873015873016,4.722017092123043 +851.7460317460317,4.721674599012565 +851.9047619047619,4.721332241222232 +852.063492063492,4.720990018654462 +852.2222222222222,4.720647931211782 +852.3809523809524,4.720305978796827 +852.5396825396825,4.719964161312345 +852.6984126984127,4.719622478661191 +852.8571428571429,4.719280930746331 +853.015873015873,4.718939517470839 +853.1746031746031,4.7185982387379 +853.3333333333334,4.718257094450805 +853.4920634920635,4.717916084512956 +853.6507936507936,4.717575208827864 +853.8095238095239,4.717234467299146 +853.968253968254,4.716893859830528 +854.1269841269841,4.716553386325845 +854.2857142857143,4.716213046689041 +854.4444444444445,4.715872840824166 +854.6031746031746,4.715532768635375 +854.7619047619048,4.715192830026937 +854.9206349206349,4.714853024903223 +855.0793650793651,4.714513353168713 +855.2380952380952,4.714173814727992 +855.3968253968254,4.713834409485756 +855.5555555555555,4.713495137346803 +855.7142857142857,4.713155998216041 +855.8730158730159,4.712816991998481 +856.031746031746,4.712478118599242 +856.1904761904761,4.712139377923551 +856.3492063492064,4.711800769876736 +856.5079365079365,4.711462294364234 +856.6666666666666,4.711123951291589 +856.8253968253969,4.710785740564445 +856.984126984127,4.710447662088556 +857.1428571428571,4.710109715769779 +857.3015873015873,4.709771901514076 +857.4603174603175,4.709434219227513 +857.6190476190476,4.709096668816263 +857.7777777777778,4.708759250186602 +857.936507936508,4.7084219632449065 +858.0952380952381,4.708084807897665 +858.2539682539683,4.707747784051463 +858.4126984126984,4.7074108916129935 +858.5714285714286,4.70707413048905 +858.7301587301587,4.7067375005865335 +858.8888888888889,4.706401001812445 +859.047619047619,4.706064634073889 +859.2063492063492,4.705728397278075 +859.3650793650794,4.705392291332313 +859.5238095238095,4.7050563161440175 +859.6825396825396,4.704720471620704 +859.8412698412699,4.704384757669992 +860.0,4.704049174199601 +860.1587301587301,4.703713721117355 +860.3174603174604,4.703378398331178 +860.4761904761905,4.703043205749096 +860.6349206349206,4.702708143279239 +860.7936507936508,4.702373210829835 +860.952380952381,4.702038408309216 +861.1111111111111,4.701703735625812 +861.2698412698413,4.701369192688158 +861.4285714285714,4.701034779404886 +861.5873015873016,4.700700495684734 +861.7460317460317,4.700366341436532 +861.9047619047619,4.70003231656922 +862.063492063492,4.699698420991832 +862.2222222222222,4.699364654613502 +862.3809523809524,4.699031017343469 +862.5396825396825,4.698697509091066 +862.6984126984127,4.698364129765731 +862.8571428571429,4.6980308792769945 +863.015873015873,4.6976977575344945 +863.1746031746031,4.697364764447962 +863.3333333333334,4.6970318999272305 +863.4920634920635,4.696699163882231 +863.6507936507936,4.696366556222993 +863.8095238095239,4.696034076859646 +863.968253968254,4.695701725702416 +864.1269841269841,4.695369502661629 +864.2857142857143,4.6950374076477095 +864.4444444444445,4.694705440571178 +864.6031746031746,4.694373601342654 +864.7619047619048,4.694041889872854 +864.9206349206349,4.693710306072595 +865.0793650793651,4.693378849852787 +865.2380952380952,4.693047521124442 +865.3968253968254,4.692716319798666 +865.5555555555555,4.692385245786662 +865.7142857142857,4.692054298999731 +865.8730158730159,4.691723479349271 +866.031746031746,4.691392786746775 +866.1904761904761,4.691062221103835 +866.3492063492064,4.690731782332137 +866.5079365079365,4.690401470343465 +866.6666666666666,4.6900712850496955 +866.8253968253969,4.689741226362805 +866.984126984127,4.689411294194864 +867.1428571428571,4.689081488458039 +867.3015873015873,4.688751809064591 +867.4603174603175,4.688422255926879 +867.6190476190476,4.688092828957353 +867.7777777777778,4.68776352806856 +867.936507936508,4.687434353173145 +868.0952380952381,4.6871053041838415 +868.2539682539683,4.686776381013483 +868.4126984126984,4.686447583574995 +868.5714285714286,4.6861189117813975 +868.7301587301587,4.685790365545806 +868.8888888888889,4.685461944781428 +869.047619047619,4.685133649401568 +869.2063492063492,4.684805479319621 +869.3650793650794,4.684477434449076 +869.5238095238095,4.684149514703519 +869.6825396825396,4.683821719996624 +869.8412698412699,4.683494050242164 +870.0,4.683166505354 +870.1587301587301,4.68283908524609 +870.3174603174604,4.682511789832482 +870.4761904761905,4.682184619027319 +870.6349206349206,4.681857572744834 +870.7936507936508,4.681530650899354 +870.952380952381,4.681203853405299 +871.1111111111111,4.68087718017718 +871.2698412698413,4.6805506311295995 +871.4285714285714,4.680224206177253 +871.5873015873016,4.679897905234928 +871.7460317460317,4.679571728217503 +871.9047619047619,4.6792456750399465 +872.063492063492,4.678919745617323 +872.2222222222222,4.678593939864748 +872.3809523809524,4.6782682576975345 +872.5396825396825,4.677942699030983 +872.6984126984127,4.67761726378052 +872.8571428571429,4.67729195186166 +873.015873015873,4.676966763190012 +873.1746031746031,4.676641697681271 +873.3333333333334,4.676316755251226 +873.4920634920635,4.6759919358157545 +873.6507936507936,4.675667239290823 +873.8095238095239,4.67534266559249 +873.968253968254,4.6750182146369035 +874.1269841269841,4.6746938863403 +874.2857142857143,4.674369680619007 +874.4444444444445,4.674045597389438 +874.6031746031746,4.673721636568101 +874.7619047619048,4.673397798071589 +874.9206349206349,4.673074081816586 +875.0793650793651,4.672750487719863 +875.2380952380952,4.672427015698272 +875.3968253968254,4.672103665668781 +875.5555555555555,4.671780437548423 +875.7142857142857,4.67145733125432 +875.8730158730159,4.671134346703687 +876.031746031746,4.6708114838138295 +876.1904761904761,4.670488742502135 +876.3492063492064,4.670166122686084 +876.5079365079365,4.669843624283243 +876.6666666666666,4.669521247211264 +876.8253968253969,4.6691989913878915 +876.984126984127,4.668876856730953 +877.1428571428571,4.668554843158364 +877.3015873015873,4.668232950588127 +877.4603174603175,4.667911178938333 +877.6190476190476,4.667589528127159 +877.7777777777778,4.6672679980728695 +877.936507936508,4.666946588693813 +878.0952380952381,4.666625299908428 +878.2539682539683,4.666304131635236 +878.4126984126984,4.665983083792847 +878.5714285714286,4.665662156299956 +878.7301587301587,4.665341349075346 +878.8888888888889,4.6650206620378825 +879.047619047619,4.664700095106518 +879.2063492063492,4.664379648200293 +879.3650793650794,4.664059321238331 +879.5238095238095,4.663739114139839 +879.6825396825396,4.663419026824117 +879.8412698412699,4.66309905921054 +880.0,4.6627792112185755 +880.1587301587301,4.662459482767771 +880.3174603174604,4.662139873777763 +880.4761904761905,4.661820384168268 +880.6349206349206,4.661501013859092 +880.7936507936508,4.661181762770123 +880.952380952381,4.660862630821331 +881.1111111111111,4.660543617932774 +881.2698412698413,4.6602247240245935 +881.4285714285714,4.659905949017012 +881.5873015873016,4.659587292830339 +881.7460317460317,4.659268755384964 +881.9047619047619,4.658950336601365 +882.063492063492,4.658632036400101 +882.2222222222222,4.658313854701811 +882.3809523809524,4.657995791427223 +882.5396825396825,4.657677846497145 +882.6984126984127,4.657360019832468 +882.8571428571429,4.657042311354165 +883.015873015873,4.656724720983296 +883.1746031746031,4.656407248640998 +883.3333333333334,4.6560898942484945 +883.4920634920635,4.655772657727088 +883.6507936507936,4.655455538998168 +883.8095238095239,4.655138537983201 +883.968253968254,4.654821654603738 +884.1269841269841,4.654504888781415 +884.2857142857143,4.654188240437941 +884.4444444444445,4.6538717094951165 +884.6031746031746,4.653555295874819 +884.7619047619048,4.653238999499005 +884.9206349206349,4.652922820289718 +885.0793650793651,4.652606758169079 +885.2380952380952,4.65229081305929 +885.3968253968254,4.651974984882636 +885.5555555555555,4.651659273561481 +885.7142857142857,4.651343679018271 +885.8730158730159,4.6510282011755315 +886.031746031746,4.65071283995587 +886.1904761904761,4.650397595281973 +886.3492063492064,4.650082467076608 +886.5079365079365,4.649767455262623 +886.6666666666666,4.649452559762946 +886.8253968253969,4.649137780500585 +886.984126984127,4.648823117398626 +887.1428571428571,4.648508570380237 +887.3015873015873,4.648194139368664 +887.4603174603175,4.6478798242872355 +887.6190476190476,4.647565625059356 +887.7777777777778,4.64725154160851 +887.936507936508,4.646937573858264 +888.0952380952381,4.646623721732259 +888.2539682539683,4.646309985154218 +888.4126984126984,4.645996364047942 +888.5714285714286,4.645682858337313 +888.7301587301587,4.645369467946287 +888.8888888888889,4.645056192798901 +889.047619047619,4.644743032819272 +889.2063492063492,4.644429987931594 +889.3650793650794,4.644117058060137 +889.5238095238095,4.643804243129253 +889.6825396825396,4.6434915430633685 +889.8412698412699,4.643178957786991 +890.0,4.642866487224702 +890.1587301587301,4.642554131301164 +890.3174603174604,4.642241889941117 +890.4761904761905,4.641929763069375 +890.6349206349206,4.641617750610833 +890.7936507936508,4.6413058524904605 +890.952380952381,4.640994068633307 +891.1111111111111,4.640682398964496 +891.2698412698413,4.6403708434092295 +891.4285714285714,4.640059401892787 +891.5873015873016,4.639748074340523 +891.7460317460317,4.639436860677869 +891.9047619047619,4.639125760830334 +892.063492063492,4.638840727175628 +892.2222222222222,4.638594709123353 +892.3809523809524,4.638348766484267 +892.5396825396825,4.638102899214313 +892.6984126984127,4.637857107269472 +892.8571428571429,4.6376113906057705 +893.015873015873,4.637365749179278 +893.1746031746031,4.637120182946105 +893.3333333333334,4.636874691862407 +893.4920634920635,4.6366292758843795 +893.6507936507936,4.636383934968265 +893.8095238095239,4.63613866907034 +893.968253968254,4.635893478146934 +894.1269841269841,4.635648362154411 +894.2857142857143,4.63540332104918 +894.4444444444445,4.635158354787694 +894.6031746031746,4.634913463326444 +894.7619047619048,4.634668646621968 +894.9206349206349,4.63442390463084 +895.0793650793651,4.634179237309684 +895.2380952380952,4.63393464461516 +895.3968253968254,4.63369012650397 +895.5555555555555,4.6334456829328605 +895.7142857142857,4.6332013138586206 +895.8730158730159,4.632957019238077 +896.031746031746,4.632712799028099 +896.1904761904761,4.632468653185603 +896.3492063492064,4.63222458166754 +896.5079365079365,4.631980584430905 +896.6666666666666,4.631736661432737 +896.8253968253969,4.631492812630113 +896.984126984127,4.631249037980152 +897.1428571428571,4.6310053374400155 +897.3015873015873,4.630761710966906 +897.4603174603175,4.630518158518068 +897.6190476190476,4.630274680050783 +897.7777777777778,4.630031275522377 +897.936507936508,4.629787944890219 +898.0952380952381,4.629544688111714 +898.2539682539683,4.629301505144312 +898.4126984126984,4.629058395945501 +898.5714285714286,4.628815360472813 +898.7301587301587,4.628572398683816 +898.8888888888889,4.6283295105361235 +899.047619047619,4.628086695987388 +899.2063492063492,4.627843954995299 +899.3650793650794,4.627601287517595 +899.5238095238095,4.627358693512045 +899.6825396825396,4.627116172936466 +899.8412698412699,4.626873725748711 +900.0,4.626631351906675 diff --git a/abstest.jl b/abstest.jl new file mode 100755 index 0000000..b0e391b --- /dev/null +++ b/abstest.jl @@ -0,0 +1,37 @@ +println("\nImporting modules...") + +include("src/nanoconc.jl") +using CSV +using DataFrames +using Profile, ProfileVega + +println("Loading parameters...") + +refmed = 1.333 # refractive index of the medium +wavel1, wavel2 = 250., 900. # wavelengths to calculate between +numval = 0x00001000 # number of values to calculate in spectrum +particledata = [2.5 1.; + 5. 1.; + 10. 1.; + 20. 1.; + 30. 1.; + 40. 1.; + 50. 1.; + 60. 1.; + 70. 1.; + 80. 1.; + 90. 1.; + 100. 1.] +materialdata = nanoconc.loadmaterial("Gold",disp=false) +ppml = 10000. # particles per ml nanoconc.quantumcalc.numtomol(ppml) -> conc +d0 = 1. # path length +params = (refmed,wavel1,wavel2,numval,particledata,materialdata,ppml,d0) +spectrum = nanoconc.abspredict(params...) + +println("Calculating absorbance spectrum...") +print("Calculation time: ") + +@time spectrum = nanoconc.abspredict(params...) +CSV.write("abs.csv", DataFrame(spectrum, :auto), writeheader=false) + +# @profview nanoconc.abspredict(params...) diff --git a/data/materials.h5 b/data/materials.h5 new file mode 100755 index 0000000..47b49f0 Binary files /dev/null and b/data/materials.h5 differ diff --git a/prof.ipynb b/prof.ipynb new file mode 100644 index 0000000..152bfc4 --- /dev/null +++ b/prof.ipynb @@ -0,0 +1,3594 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Importing modules...\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading parameters...\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Calculating absorbance spectrum...\n", + "Calculation time: " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 0.325362 seconds (5.42 M allocations: 455.666 MiB, 15.68% gc time)\n" + ] + }, + { + "data": { + "application/vnd.vegalite.v4+json": { + "data": { + "values": [ + { + "level": 0, + "sf": "ip:0x0", + "status": "Runtime dispatch", + "x1": 1, + "x2": 304.9 + }, + { + "level": 1, + "sf": "(::Base.Threads.var\"#1#2\"{Main.nanoconc.miemfp.var\"#77#threadsfor_fun#20\"{Main.nanoconc.miemfp.var\"#77#threadsfor_fun#19#21\"{Float64, Float64, Matrix{Float64}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Main.nanoconc.miemfp._bhmie, Main.nanoconc.miemfp._mfp, UnitRange{UInt32}}}, Int64})() at threadingconstructs.jl:108", + "status": "Default", + "x1": 1, + "x2": 295.9 + }, + { + "level": 2, + "sf": "#77#threadsfor_fun at threadingconstructs.jl:130 [inlined]", + "status": "Default", + "x1": 1, + "x2": 295.9 + }, + { + "level": 3, + "sf": "(::Main.nanoconc.miemfp.var\"#77#threadsfor_fun#20\"{Main.nanoconc.miemfp.var\"#77#threadsfor_fun#19#21\"{Float64, Float64, Matrix{Float64}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Main.nanoconc.miemfp._bhmie, Main.nanoconc.miemfp._mfp, UnitRange{UInt32}}})(tid::Int64; onethread::Bool) at threadingconstructs.jl:163", + "status": "Default", + "x1": 1, + "x2": 295.9 + }, + { + "level": 4, + "sf": "macro expansion at miemfp.jl:333 [inlined]", + "status": "Default", + "x1": 1, + "x2": 295.9 + }, + { + "level": 5, + "sf": "_calc_apparent_cross_section at Memoize.jl:61 [inlined]", + "status": "Default", + "x1": 1, + "x2": 2.9 + }, + { + "level": 6, + "sf": "get! at iddict.jl:176 [inlined]", + "status": "Garbage collection", + "x1": 1, + "x2": 2.9 + }, + { + "level": 5, + "sf": "_bhmie at miemfp.jl:300 [inlined]", + "status": "Default", + "x1": 3, + "x2": 274.9 + }, + { + "level": 6, + "sf": "*(A::Float64, B::Vector{ComplexF64}) at arraymath.jl:21", + "status": "Default", + "x1": 3, + "x2": 3.9 + }, + { + "level": 6, + "sf": "bhmie(x::Float64, refrel::ComplexF64, nang::UInt32) at essentials.jl:0", + "status": "Default", + "x1": 4, + "x2": 4.9 + }, + { + "level": 6, + "sf": "bhmie(x::Float64, refrel::ComplexF64, nang::UInt32) at miemfp.jl:186", + "status": "Default", + "x1": 5, + "x2": 5.9 + }, + { + "level": 7, + "sf": "round at floatfuncs.jl:128 [inlined]", + "status": "Default", + "x1": 5, + "x2": 5.9 + }, + { + "level": 8, + "sf": "round at float.jl:395 [inlined]", + "status": "Default", + "x1": 5, + "x2": 5.9 + }, + { + "level": 6, + "sf": "bhmie(x::Float64, refrel::ComplexF64, nang::UInt32) at miemfp.jl:188", + "status": "Default", + "x1": 6, + "x2": 8.9 + }, + { + "level": 7, + "sf": "materialize at broadcast.jl:873 [inlined]", + "status": "Default", + "x1": 6, + "x2": 8.9 + }, + { + "level": 8, + "sf": "copy at broadcast.jl:898 [inlined]", + "status": "Default", + "x1": 6, + "x2": 8.9 + }, + { + "level": 9, + "sf": "copyto! at broadcast.jl:926 [inlined]", + "status": "Default", + "x1": 6, + "x2": 6.9 + }, + { + "level": 10, + "sf": "copyto! at broadcast.jl:973 [inlined]", + "status": "Default", + "x1": 6, + "x2": 6.9 + }, + { + "level": 11, + "sf": "macro expansion at simdloop.jl:75 [inlined]", + "status": "Default", + "x1": 6, + "x2": 6.9 + }, + { + "level": 12, + "sf": "< at int.jl:83 [inlined]", + "status": "Default", + "x1": 6, + "x2": 6.9 + }, + { + "level": 9, + "sf": "similar at broadcast.jl:211 [inlined]", + "status": "Default", + "x1": 7, + "x2": 8.9 + }, + { + "level": 10, + "sf": "similar at broadcast.jl:212 [inlined]", + "status": "Default", + "x1": 7, + "x2": 8.9 + }, + { + "level": 11, + "sf": "similar at abstractarray.jl:881 [inlined]", + "status": "Default", + "x1": 7, + "x2": 8.9 + }, + { + "level": 12, + "sf": "similar at abstractarray.jl:882 [inlined]", + "status": "Default", + "x1": 7, + "x2": 8.9 + }, + { + "level": 13, + "sf": "Array at boot.jl:494 [inlined]", + "status": "Default", + "x1": 7, + "x2": 8.9 + }, + { + "level": 14, + "sf": "Array at boot.jl:486 [inlined]", + "status": "Default", + "x1": 7, + "x2": 8.9 + }, + { + "level": 15, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Default", + "x1": 7, + "x2": 8.9 + }, + { + "level": 6, + "sf": "bhmie(x::Float64, refrel::ComplexF64, nang::UInt32) at miemfp.jl:190", + "status": "Default", + "x1": 9, + "x2": 14.9 + }, + { + "level": 7, + "sf": "Array at baseext.jl:23 [inlined]", + "status": "Default", + "x1": 9, + "x2": 14.9 + }, + { + "level": 8, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Garbage collection", + "x1": 9, + "x2": 14.9 + }, + { + "level": 6, + "sf": "bhmie(x::Float64, refrel::ComplexF64, nang::UInt32) at miemfp.jl:192", + "status": "Default", + "x1": 15, + "x2": 25.9 + }, + { + "level": 7, + "sf": "macro expansion at simdloop.jl:75 [inlined]", + "status": "Default", + "x1": 15, + "x2": 15.9 + }, + { + "level": 8, + "sf": "< at int.jl:83 [inlined]", + "status": "Default", + "x1": 15, + "x2": 15.9 + }, + { + "level": 7, + "sf": "macro expansion at simdloop.jl:77 [inlined]", + "status": "Default", + "x1": 16, + "x2": 25.9 + }, + { + "level": 8, + "sf": "macro expansion at array.jl:0 [inlined]", + "status": "Default", + "x1": 16, + "x2": 16.9 + }, + { + "level": 8, + "sf": "macro expansion at miemfp.jl:194 [inlined]", + "status": "Default", + "x1": 17, + "x2": 25.9 + }, + { + "level": 9, + "sf": "setindex! at array.jl:969 [inlined]", + "status": "Default", + "x1": 17, + "x2": 17.9 + }, + { + "level": 9, + "sf": "div_fast at fastmath.jl:229 [inlined]", + "status": "Default", + "x1": 18, + "x2": 23.9 + }, + { + "level": 10, + "sf": "abs2_fast at fastmath.jl:197 [inlined]", + "status": "Default", + "x1": 18, + "x2": 20.9 + }, + { + "level": 11, + "sf": "add_fast at fastmath.jl:165 [inlined]", + "status": "Default", + "x1": 18, + "x2": 20.9 + }, + { + "level": 10, + "sf": "div_fast at fastmath.jl:227 [inlined]", + "status": "Default", + "x1": 21, + "x2": 23.9 + }, + { + "level": 11, + "sf": "div_fast at fastmath.jl:168 [inlined]", + "status": "Default", + "x1": 21, + "x2": 23.9 + }, + { + "level": 9, + "sf": "maybeview at views.jl:149 [inlined]", + "status": "Default", + "x1": 24, + "x2": 25.9 + }, + { + "level": 10, + "sf": "getindex at essentials.jl:13 [inlined]", + "status": "Default", + "x1": 24, + "x2": 25.9 + }, + { + "level": 6, + "sf": "bhmie(x::Float64, refrel::ComplexF64, nang::UInt32) at miemfp.jl:198", + "status": "Default", + "x1": 26, + "x2": 26.9 + }, + { + "level": 7, + "sf": "cos_fast at fastmath.jl:349 [inlined]", + "status": "Default", + "x1": 26, + "x2": 26.9 + }, + { + "level": 8, + "sf": "cos(x::Float64) at trig.jl:104", + "status": "Default", + "x1": 26, + "x2": 26.9 + }, + { + "level": 9, + "sf": "cos_kernel at trig.jl:147 [inlined]", + "status": "Default", + "x1": 26, + "x2": 26.9 + }, + { + "level": 10, + "sf": "* at float.jl:410 [inlined]", + "status": "Default", + "x1": 26, + "x2": 26.9 + }, + { + "level": 6, + "sf": "bhmie(x::Float64, refrel::ComplexF64, nang::UInt32) at miemfp.jl:205", + "status": "Default", + "x1": 27, + "x2": 39.9 + }, + { + "level": 7, + "sf": "zeros at array.jl:580 [inlined]", + "status": "Default", + "x1": 27, + "x2": 39.9 + }, + { + "level": 8, + "sf": "zeros at array.jl:584 [inlined]", + "status": "Default", + "x1": 27, + "x2": 39.9 + }, + { + "level": 9, + "sf": "Array at baseext.jl:36 [inlined]", + "status": "Default", + "x1": 27, + "x2": 39.9 + }, + { + "level": 10, + "sf": "Array at boot.jl:486 [inlined]", + "status": "Default", + "x1": 27, + "x2": 39.9 + }, + { + "level": 11, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Garbage collection", + "x1": 27, + "x2": 39.9 + }, + { + "level": 6, + "sf": "bhmie(x::Float64, refrel::ComplexF64, nang::UInt32) at miemfp.jl:207", + "status": "Default", + "x1": 40, + "x2": 40.9 + }, + { + "level": 7, + "sf": "zeros at array.jl:580 [inlined]", + "status": "Default", + "x1": 40, + "x2": 40.9 + }, + { + "level": 8, + "sf": "zeros at array.jl:584 [inlined]", + "status": "Default", + "x1": 40, + "x2": 40.9 + }, + { + "level": 9, + "sf": "Array at baseext.jl:36 [inlined]", + "status": "Default", + "x1": 40, + "x2": 40.9 + }, + { + "level": 10, + "sf": "Array at boot.jl:486 [inlined]", + "status": "Default", + "x1": 40, + "x2": 40.9 + }, + { + "level": 11, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Default", + "x1": 40, + "x2": 40.9 + }, + { + "level": 6, + "sf": "bhmie(x::Float64, refrel::ComplexF64, nang::UInt32) at miemfp.jl:208", + "status": "Default", + "x1": 41, + "x2": 41.9 + }, + { + "level": 7, + "sf": "zeros at array.jl:580 [inlined]", + "status": "Default", + "x1": 41, + "x2": 41.9 + }, + { + "level": 8, + "sf": "zeros at array.jl:584 [inlined]", + "status": "Default", + "x1": 41, + "x2": 41.9 + }, + { + "level": 9, + "sf": "Array at baseext.jl:36 [inlined]", + "status": "Default", + "x1": 41, + "x2": 41.9 + }, + { + "level": 10, + "sf": "Array at boot.jl:486 [inlined]", + "status": "Default", + "x1": 41, + "x2": 41.9 + }, + { + "level": 11, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Garbage collection", + "x1": 41, + "x2": 41.9 + }, + { + "level": 6, + "sf": "bhmie(x::Float64, refrel::ComplexF64, nang::UInt32) at miemfp.jl:209", + "status": "Default", + "x1": 42, + "x2": 42.9 + }, + { + "level": 7, + "sf": "zeros at array.jl:579 [inlined]", + "status": "Default", + "x1": 42, + "x2": 42.9 + }, + { + "level": 8, + "sf": "zeros at array.jl:581 [inlined]", + "status": "Default", + "x1": 42, + "x2": 42.9 + }, + { + "level": 9, + "sf": "zeros at array.jl:585 [inlined]", + "status": "Default", + "x1": 42, + "x2": 42.9 + }, + { + "level": 10, + "sf": "fill! at array.jl:348 [inlined]", + "status": "Default", + "x1": 42, + "x2": 42.9 + }, + { + "level": 11, + "sf": "iterate at range.jl:887 [inlined]", + "status": "Default", + "x1": 42, + "x2": 42.9 + }, + { + "level": 12, + "sf": "isempty at range.jl:662 [inlined]", + "status": "Default", + "x1": 42, + "x2": 42.9 + }, + { + "level": 13, + "sf": "> at operators.jl:369 [inlined]", + "status": "Default", + "x1": 42, + "x2": 42.9 + }, + { + "level": 14, + "sf": "< at int.jl:83 [inlined]", + "status": "Default", + "x1": 42, + "x2": 42.9 + }, + { + "level": 6, + "sf": "bhmie(x::Float64, refrel::ComplexF64, nang::UInt32) at miemfp.jl:210", + "status": "Default", + "x1": 43, + "x2": 47.9 + }, + { + "level": 7, + "sf": "ones at array.jl:579 [inlined]", + "status": "Default", + "x1": 43, + "x2": 47.9 + }, + { + "level": 8, + "sf": "ones at array.jl:581 [inlined]", + "status": "Default", + "x1": 43, + "x2": 47.9 + }, + { + "level": 9, + "sf": "ones at array.jl:584 [inlined]", + "status": "Default", + "x1": 43, + "x2": 47.9 + }, + { + "level": 10, + "sf": "Array at baseext.jl:36 [inlined]", + "status": "Default", + "x1": 43, + "x2": 47.9 + }, + { + "level": 11, + "sf": "Array at boot.jl:486 [inlined]", + "status": "Default", + "x1": 43, + "x2": 47.9 + }, + { + "level": 12, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Garbage collection", + "x1": 43, + "x2": 47.9 + }, + { + "level": 6, + "sf": "bhmie(x::Float64, refrel::ComplexF64, nang::UInt32) at miemfp.jl:211", + "status": "Default", + "x1": 48, + "x2": 49.9 + }, + { + "level": 7, + "sf": "similar at abstractarray.jl:880 [inlined]", + "status": "Default", + "x1": 48, + "x2": 49.9 + }, + { + "level": 8, + "sf": "similar at abstractarray.jl:881 [inlined]", + "status": "Default", + "x1": 48, + "x2": 49.9 + }, + { + "level": 9, + "sf": "similar at abstractarray.jl:882 [inlined]", + "status": "Default", + "x1": 48, + "x2": 49.9 + }, + { + "level": 10, + "sf": "Array at boot.jl:486 [inlined]", + "status": "Default", + "x1": 48, + "x2": 49.9 + }, + { + "level": 11, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Default", + "x1": 48, + "x2": 49.9 + }, + { + "level": 6, + "sf": "bhmie(x::Float64, refrel::ComplexF64, nang::UInt32) at miemfp.jl:212", + "status": "Default", + "x1": 50, + "x2": 265.9 + }, + { + "level": 7, + "sf": "macro expansion at simdloop.jl:77 [inlined]", + "status": "Default", + "x1": 50, + "x2": 265.9 + }, + { + "level": 8, + "sf": "macro expansion at fastmath.jl:0 [inlined]", + "status": "Default", + "x1": 50, + "x2": 50.9 + }, + { + "level": 8, + "sf": "macro expansion at simdloop.jl:0 [inlined]", + "status": "Default", + "x1": 51, + "x2": 79.9 + }, + { + "level": 9, + "sf": "*(A::Float64, B::Vector{ComplexF64}) at arraymath.jl:21", + "status": "Default", + "x1": 51, + "x2": 65.9 + }, + { + "level": 10, + "sf": "broadcast_preserving_zero_d at broadcast.jl:862 [inlined]", + "status": "Default", + "x1": 51, + "x2": 65.9 + }, + { + "level": 11, + "sf": "materialize at broadcast.jl:873 [inlined]", + "status": "Default", + "x1": 51, + "x2": 65.9 + }, + { + "level": 12, + "sf": "copy at broadcast.jl:898 [inlined]", + "status": "Default", + "x1": 51, + "x2": 65.9 + }, + { + "level": 13, + "sf": "similar at broadcast.jl:211 [inlined]", + "status": "Default", + "x1": 51, + "x2": 65.9 + }, + { + "level": 14, + "sf": "similar at broadcast.jl:212 [inlined]", + "status": "Default", + "x1": 51, + "x2": 65.9 + }, + { + "level": 15, + "sf": "similar at abstractarray.jl:881 [inlined]", + "status": "Default", + "x1": 51, + "x2": 65.9 + }, + { + "level": 16, + "sf": "similar at abstractarray.jl:882 [inlined]", + "status": "Default", + "x1": 51, + "x2": 65.9 + }, + { + "level": 17, + "sf": "Array at boot.jl:494 [inlined]", + "status": "Default", + "x1": 51, + "x2": 65.9 + }, + { + "level": 18, + "sf": "Array at boot.jl:486 [inlined]", + "status": "Default", + "x1": 51, + "x2": 65.9 + }, + { + "level": 19, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Garbage collection", + "x1": 51, + "x2": 65.9 + }, + { + "level": 9, + "sf": "-(A::Vector{ComplexF64}, B::Vector{ComplexF64}) at arraymath.jl:8", + "status": "Default", + "x1": 66, + "x2": 78.9 + }, + { + "level": 10, + "sf": "broadcast_preserving_zero_d at broadcast.jl:862 [inlined]", + "status": "Default", + "x1": 66, + "x2": 78.9 + }, + { + "level": 11, + "sf": "materialize at broadcast.jl:873 [inlined]", + "status": "Default", + "x1": 66, + "x2": 78.9 + }, + { + "level": 12, + "sf": "copy at broadcast.jl:898 [inlined]", + "status": "Default", + "x1": 66, + "x2": 78.9 + }, + { + "level": 13, + "sf": "copyto! at broadcast.jl:926 [inlined]", + "status": "Default", + "x1": 66, + "x2": 67.9 + }, + { + "level": 14, + "sf": "copyto! at broadcast.jl:970 [inlined]", + "status": "Default", + "x1": 66, + "x2": 67.9 + }, + { + "level": 15, + "sf": "preprocess at broadcast.jl:953 [inlined]", + "status": "Default", + "x1": 66, + "x2": 67.9 + }, + { + "level": 16, + "sf": "preprocess_args at broadcast.jl:956 [inlined]", + "status": "Default", + "x1": 66, + "x2": 67.9 + }, + { + "level": 17, + "sf": "size at array.jl:0 [inlined]", + "status": "Default", + "x1": 66, + "x2": 66.9 + }, + { + "level": 17, + "sf": "preprocess at broadcast.jl:954 [inlined]", + "status": "Default", + "x1": 67, + "x2": 67.9 + }, + { + "level": 18, + "sf": "extrude at broadcast.jl:650 [inlined]", + "status": "Default", + "x1": 67, + "x2": 67.9 + }, + { + "level": 19, + "sf": "newindexer at broadcast.jl:599 [inlined]", + "status": "Default", + "x1": 67, + "x2": 67.9 + }, + { + "level": 20, + "sf": "axes at abstractarray.jl:98 [inlined]", + "status": "Default", + "x1": 67, + "x2": 67.9 + }, + { + "level": 21, + "sf": "size at array.jl:149 [inlined]", + "status": "Default", + "x1": 67, + "x2": 67.9 + }, + { + "level": 13, + "sf": "similar at broadcast.jl:211 [inlined]", + "status": "Default", + "x1": 68, + "x2": 78.9 + }, + { + "level": 14, + "sf": "similar at broadcast.jl:212 [inlined]", + "status": "Default", + "x1": 68, + "x2": 78.9 + }, + { + "level": 15, + "sf": "similar at abstractarray.jl:881 [inlined]", + "status": "Default", + "x1": 68, + "x2": 78.9 + }, + { + "level": 16, + "sf": "similar at abstractarray.jl:882 [inlined]", + "status": "Default", + "x1": 68, + "x2": 78.9 + }, + { + "level": 17, + "sf": "Array at boot.jl:494 [inlined]", + "status": "Default", + "x1": 68, + "x2": 78.9 + }, + { + "level": 18, + "sf": "Array at boot.jl:486 [inlined]", + "status": "Default", + "x1": 68, + "x2": 78.9 + }, + { + "level": 19, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Garbage collection", + "x1": 68, + "x2": 78.9 + }, + { + "level": 9, + "sf": "-(A::Vector{ComplexF64}, B::Vector{ComplexF64}) at broadcast.jl:0", + "status": "Default", + "x1": 79, + "x2": 79.9 + }, + { + "level": 8, + "sf": "macro expansion at miemfp.jl:214 [inlined]", + "status": "Default", + "x1": 80, + "x2": 80.9 + }, + { + "level": 9, + "sf": "sub_fast at fastmath.jl:166 [inlined]", + "status": "Default", + "x1": 80, + "x2": 80.9 + }, + { + "level": 8, + "sf": "macro expansion at miemfp.jl:220 [inlined]", + "status": "Default", + "x1": 81, + "x2": 81.9 + }, + { + "level": 9, + "sf": "add_fast at fastmath.jl:204 [inlined]", + "status": "Default", + "x1": 81, + "x2": 81.9 + }, + { + "level": 10, + "sf": "add_fast at fastmath.jl:165 [inlined]", + "status": "Default", + "x1": 81, + "x2": 81.9 + }, + { + "level": 8, + "sf": "macro expansion at miemfp.jl:230 [inlined]", + "status": "Default", + "x1": 82, + "x2": 127.9 + }, + { + "level": 9, + "sf": "materialize at broadcast.jl:873 [inlined]", + "status": "Default", + "x1": 82, + "x2": 109.9 + }, + { + "level": 10, + "sf": "copy at broadcast.jl:898 [inlined]", + "status": "Default", + "x1": 82, + "x2": 109.9 + }, + { + "level": 11, + "sf": "copyto! at broadcast.jl:926 [inlined]", + "status": "Default", + "x1": 82, + "x2": 82.9 + }, + { + "level": 12, + "sf": "copyto! at broadcast.jl:973 [inlined]", + "status": "Default", + "x1": 82, + "x2": 82.9 + }, + { + "level": 13, + "sf": "macro expansion at simdloop.jl:78 [inlined]", + "status": "Default", + "x1": 82, + "x2": 82.9 + }, + { + "level": 14, + "sf": "+ at int.jl:87 [inlined]", + "status": "Default", + "x1": 82, + "x2": 82.9 + }, + { + "level": 11, + "sf": "similar at broadcast.jl:211 [inlined]", + "status": "Default", + "x1": 83, + "x2": 109.9 + }, + { + "level": 12, + "sf": "similar at broadcast.jl:212 [inlined]", + "status": "Default", + "x1": 83, + "x2": 109.9 + }, + { + "level": 13, + "sf": "similar at abstractarray.jl:881 [inlined]", + "status": "Default", + "x1": 83, + "x2": 109.9 + }, + { + "level": 14, + "sf": "similar at abstractarray.jl:882 [inlined]", + "status": "Default", + "x1": 83, + "x2": 109.9 + }, + { + "level": 15, + "sf": "Array at boot.jl:494 [inlined]", + "status": "Default", + "x1": 83, + "x2": 109.9 + }, + { + "level": 16, + "sf": "Array at boot.jl:486 [inlined]", + "status": "Default", + "x1": 83, + "x2": 109.9 + }, + { + "level": 17, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Garbage collection", + "x1": 83, + "x2": 109.9 + }, + { + "level": 9, + "sf": "mul_fast at fastmath.jl:265 [inlined]", + "status": "Default", + "x1": 110, + "x2": 118.9 + }, + { + "level": 10, + "sf": "*(A::Int64, B::Vector{Float64}) at arraymath.jl:21", + "status": "Default", + "x1": 110, + "x2": 118.9 + }, + { + "level": 11, + "sf": "broadcast_preserving_zero_d at broadcast.jl:862 [inlined]", + "status": "Default", + "x1": 110, + "x2": 118.9 + }, + { + "level": 12, + "sf": "materialize at broadcast.jl:873 [inlined]", + "status": "Default", + "x1": 110, + "x2": 118.9 + }, + { + "level": 13, + "sf": "copy at broadcast.jl:898 [inlined]", + "status": "Default", + "x1": 110, + "x2": 118.9 + }, + { + "level": 14, + "sf": "similar at broadcast.jl:211 [inlined]", + "status": "Default", + "x1": 110, + "x2": 118.9 + }, + { + "level": 15, + "sf": "similar at broadcast.jl:212 [inlined]", + "status": "Default", + "x1": 110, + "x2": 118.9 + }, + { + "level": 16, + "sf": "similar at abstractarray.jl:881 [inlined]", + "status": "Default", + "x1": 110, + "x2": 118.9 + }, + { + "level": 17, + "sf": "similar at abstractarray.jl:882 [inlined]", + "status": "Default", + "x1": 110, + "x2": 118.9 + }, + { + "level": 18, + "sf": "Array at boot.jl:494 [inlined]", + "status": "Default", + "x1": 110, + "x2": 118.9 + }, + { + "level": 19, + "sf": "Array at boot.jl:486 [inlined]", + "status": "Default", + "x1": 110, + "x2": 118.9 + }, + { + "level": 20, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Default", + "x1": 110, + "x2": 118.9 + }, + { + "level": 9, + "sf": "sub_fast at fastmath.jl:265 [inlined]", + "status": "Default", + "x1": 119, + "x2": 127.9 + }, + { + "level": 10, + "sf": "-(A::Vector{Float64}, B::Vector{Float64}) at arraymath.jl:8", + "status": "Default", + "x1": 119, + "x2": 127.9 + }, + { + "level": 11, + "sf": "broadcast_preserving_zero_d at broadcast.jl:862 [inlined]", + "status": "Default", + "x1": 119, + "x2": 127.9 + }, + { + "level": 12, + "sf": "materialize at broadcast.jl:873 [inlined]", + "status": "Default", + "x1": 119, + "x2": 127.9 + }, + { + "level": 13, + "sf": "copy at broadcast.jl:898 [inlined]", + "status": "Default", + "x1": 119, + "x2": 127.9 + }, + { + "level": 14, + "sf": "copyto! at broadcast.jl:926 [inlined]", + "status": "Default", + "x1": 119, + "x2": 119.9 + }, + { + "level": 15, + "sf": "copyto! at broadcast.jl:973 [inlined]", + "status": "Default", + "x1": 119, + "x2": 119.9 + }, + { + "level": 16, + "sf": "macro expansion at simdloop.jl:77 [inlined]", + "status": "Default", + "x1": 119, + "x2": 119.9 + }, + { + "level": 17, + "sf": "macro expansion at broadcast.jl:974 [inlined]", + "status": "Default", + "x1": 119, + "x2": 119.9 + }, + { + "level": 18, + "sf": "getindex at broadcast.jl:610 [inlined]", + "status": "Default", + "x1": 119, + "x2": 119.9 + }, + { + "level": 19, + "sf": "_broadcast_getindex at broadcast.jl:655 [inlined]", + "status": "Default", + "x1": 119, + "x2": 119.9 + }, + { + "level": 20, + "sf": "_getindex at broadcast.jl:679 [inlined]", + "status": "Default", + "x1": 119, + "x2": 119.9 + }, + { + "level": 21, + "sf": "_broadcast_getindex at broadcast.jl:649 [inlined]", + "status": "Default", + "x1": 119, + "x2": 119.9 + }, + { + "level": 22, + "sf": "getindex at essentials.jl:13 [inlined]", + "status": "Default", + "x1": 119, + "x2": 119.9 + }, + { + "level": 14, + "sf": "similar at broadcast.jl:211 [inlined]", + "status": "Default", + "x1": 120, + "x2": 127.9 + }, + { + "level": 15, + "sf": "similar at broadcast.jl:212 [inlined]", + "status": "Default", + "x1": 120, + "x2": 127.9 + }, + { + "level": 16, + "sf": "similar at abstractarray.jl:881 [inlined]", + "status": "Default", + "x1": 120, + "x2": 127.9 + }, + { + "level": 17, + "sf": "similar at abstractarray.jl:882 [inlined]", + "status": "Default", + "x1": 120, + "x2": 127.9 + }, + { + "level": 18, + "sf": "Array at boot.jl:494 [inlined]", + "status": "Default", + "x1": 120, + "x2": 127.9 + }, + { + "level": 19, + "sf": "Array at boot.jl:486 [inlined]", + "status": "Default", + "x1": 120, + "x2": 127.9 + }, + { + "level": 20, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Garbage collection", + "x1": 120, + "x2": 127.9 + }, + { + "level": 8, + "sf": "macro expansion at miemfp.jl:231 [inlined]", + "status": "Default", + "x1": 128, + "x2": 168.9 + }, + { + "level": 9, + "sf": "div_fast at fastmath.jl:270 [inlined]", + "status": "Default", + "x1": 128, + "x2": 129.9 + }, + { + "level": 10, + "sf": "/ at int.jl:97 [inlined]", + "status": "Default", + "x1": 128, + "x2": 129.9 + }, + { + "level": 11, + "sf": "float at float.jl:294 [inlined]", + "status": "Default", + "x1": 128, + "x2": 129.9 + }, + { + "level": 12, + "sf": "AbstractFloat at float.jl:268 [inlined]", + "status": "Default", + "x1": 128, + "x2": 129.9 + }, + { + "level": 13, + "sf": "Float64 at float.jl:159 [inlined]", + "status": "Default", + "x1": 128, + "x2": 129.9 + }, + { + "level": 9, + "sf": "mul_fast at fastmath.jl:265 [inlined]", + "status": "Default", + "x1": 130, + "x2": 168.9 + }, + { + "level": 10, + "sf": "*(A::ComplexF64, B::Vector{Float64}) at arraymath.jl:21", + "status": "Default", + "x1": 130, + "x2": 165.9 + }, + { + "level": 11, + "sf": "broadcast_preserving_zero_d at broadcast.jl:862 [inlined]", + "status": "Default", + "x1": 130, + "x2": 165.9 + }, + { + "level": 12, + "sf": "materialize at broadcast.jl:873 [inlined]", + "status": "Default", + "x1": 130, + "x2": 165.9 + }, + { + "level": 13, + "sf": "copy at broadcast.jl:898 [inlined]", + "status": "Default", + "x1": 130, + "x2": 165.9 + }, + { + "level": 14, + "sf": "copyto! at broadcast.jl:926 [inlined]", + "status": "Default", + "x1": 130, + "x2": 131.9 + }, + { + "level": 15, + "sf": "copyto! at broadcast.jl:962 [inlined]", + "status": "Default", + "x1": 130, + "x2": 130.9 + }, + { + "level": 16, + "sf": "== at tuple.jl:458 [inlined]", + "status": "Default", + "x1": 130, + "x2": 130.9 + }, + { + "level": 17, + "sf": "_eq at tuple.jl:462 [inlined]", + "status": "Default", + "x1": 130, + "x2": 130.9 + }, + { + "level": 18, + "sf": "== at range.jl:1119 [inlined]", + "status": "Default", + "x1": 130, + "x2": 130.9 + }, + { + "level": 19, + "sf": "== at promotion.jl:499 [inlined]", + "status": "Default", + "x1": 130, + "x2": 130.9 + }, + { + "level": 15, + "sf": "copyto! at broadcast.jl:970 [inlined]", + "status": "Default", + "x1": 131, + "x2": 131.9 + }, + { + "level": 16, + "sf": "preprocess at broadcast.jl:953 [inlined]", + "status": "Default", + "x1": 131, + "x2": 131.9 + }, + { + "level": 17, + "sf": "preprocess_args at broadcast.jl:956 [inlined]", + "status": "Default", + "x1": 131, + "x2": 131.9 + }, + { + "level": 18, + "sf": "preprocess_args at broadcast.jl:957 [inlined]", + "status": "Default", + "x1": 131, + "x2": 131.9 + }, + { + "level": 19, + "sf": "preprocess at broadcast.jl:954 [inlined]", + "status": "Default", + "x1": 131, + "x2": 131.9 + }, + { + "level": 20, + "sf": "extrude at broadcast.jl:650 [inlined]", + "status": "Default", + "x1": 131, + "x2": 131.9 + }, + { + "level": 21, + "sf": "newindexer at broadcast.jl:599 [inlined]", + "status": "Default", + "x1": 131, + "x2": 131.9 + }, + { + "level": 22, + "sf": "shapeindexer at broadcast.jl:600 [inlined]", + "status": "Default", + "x1": 131, + "x2": 131.9 + }, + { + "level": 23, + "sf": "_newindexer at broadcast.jl:605 [inlined]", + "status": "Default", + "x1": 131, + "x2": 131.9 + }, + { + "level": 24, + "sf": "!= at operators.jl:269 [inlined]", + "status": "Default", + "x1": 131, + "x2": 131.9 + }, + { + "level": 25, + "sf": "== at promotion.jl:499 [inlined]", + "status": "Default", + "x1": 131, + "x2": 131.9 + }, + { + "level": 14, + "sf": "similar at broadcast.jl:211 [inlined]", + "status": "Default", + "x1": 132, + "x2": 165.9 + }, + { + "level": 15, + "sf": "similar at broadcast.jl:212 [inlined]", + "status": "Default", + "x1": 132, + "x2": 165.9 + }, + { + "level": 16, + "sf": "similar at abstractarray.jl:881 [inlined]", + "status": "Default", + "x1": 132, + "x2": 165.9 + }, + { + "level": 17, + "sf": "similar at abstractarray.jl:882 [inlined]", + "status": "Default", + "x1": 132, + "x2": 165.9 + }, + { + "level": 18, + "sf": "Array at boot.jl:494 [inlined]", + "status": "Default", + "x1": 132, + "x2": 165.9 + }, + { + "level": 19, + "sf": "Array at boot.jl:486 [inlined]", + "status": "Default", + "x1": 132, + "x2": 165.9 + }, + { + "level": 20, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Garbage collection", + "x1": 132, + "x2": 165.9 + }, + { + "level": 8, + "sf": "macro expansion at miemfp.jl:232 [inlined]", + "status": "Default", + "x1": 169, + "x2": 190.9 + }, + { + "level": 9, + "sf": "add_fast at fastmath.jl:265 [inlined]", + "status": "Default", + "x1": 169, + "x2": 182.9 + }, + { + "level": 10, + "sf": "+(A::Vector{ComplexF64}, Bs::Vector{ComplexF64}) at arraymath.jl:14", + "status": "Default", + "x1": 169, + "x2": 169.9 + }, + { + "level": 11, + "sf": "promote_shape at indices.jl:169 [inlined]", + "status": "Default", + "x1": 169, + "x2": 169.9 + }, + { + "level": 12, + "sf": "axes at abstractarray.jl:98 [inlined]", + "status": "Default", + "x1": 169, + "x2": 169.9 + }, + { + "level": 13, + "sf": "size at array.jl:149 [inlined]", + "status": "Default", + "x1": 169, + "x2": 169.9 + }, + { + "level": 10, + "sf": "+(A::Vector{ComplexF64}, Bs::Vector{ComplexF64}) at arraymath.jl:16", + "status": "Default", + "x1": 170, + "x2": 181.9 + }, + { + "level": 11, + "sf": "broadcast_preserving_zero_d at broadcast.jl:862 [inlined]", + "status": "Default", + "x1": 170, + "x2": 180.9 + }, + { + "level": 12, + "sf": "materialize at broadcast.jl:873 [inlined]", + "status": "Default", + "x1": 170, + "x2": 180.9 + }, + { + "level": 13, + "sf": "copy at broadcast.jl:898 [inlined]", + "status": "Default", + "x1": 170, + "x2": 180.9 + }, + { + "level": 14, + "sf": "similar at broadcast.jl:211 [inlined]", + "status": "Default", + "x1": 170, + "x2": 180.9 + }, + { + "level": 15, + "sf": "similar at broadcast.jl:212 [inlined]", + "status": "Default", + "x1": 170, + "x2": 180.9 + }, + { + "level": 16, + "sf": "similar at abstractarray.jl:881 [inlined]", + "status": "Default", + "x1": 170, + "x2": 180.9 + }, + { + "level": 17, + "sf": "similar at abstractarray.jl:882 [inlined]", + "status": "Default", + "x1": 170, + "x2": 180.9 + }, + { + "level": 18, + "sf": "Array at boot.jl:494 [inlined]", + "status": "Default", + "x1": 170, + "x2": 180.9 + }, + { + "level": 19, + "sf": "Array at boot.jl:486 [inlined]", + "status": "Default", + "x1": 170, + "x2": 180.9 + }, + { + "level": 20, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Garbage collection", + "x1": 170, + "x2": 180.9 + }, + { + "level": 9, + "sf": "mul_fast at fastmath.jl:265 [inlined]", + "status": "Default", + "x1": 183, + "x2": 190.9 + }, + { + "level": 10, + "sf": "*(A::Float64, B::Vector{ComplexF64}) at arraymath.jl:21", + "status": "Default", + "x1": 183, + "x2": 189.9 + }, + { + "level": 11, + "sf": "broadcast_preserving_zero_d at broadcast.jl:862 [inlined]", + "status": "Default", + "x1": 183, + "x2": 188.9 + }, + { + "level": 12, + "sf": "materialize at broadcast.jl:873 [inlined]", + "status": "Default", + "x1": 183, + "x2": 188.9 + }, + { + "level": 13, + "sf": "copy at broadcast.jl:898 [inlined]", + "status": "Default", + "x1": 183, + "x2": 188.9 + }, + { + "level": 14, + "sf": "similar at broadcast.jl:211 [inlined]", + "status": "Default", + "x1": 183, + "x2": 188.9 + }, + { + "level": 15, + "sf": "similar at broadcast.jl:212 [inlined]", + "status": "Default", + "x1": 183, + "x2": 188.9 + }, + { + "level": 16, + "sf": "similar at abstractarray.jl:881 [inlined]", + "status": "Default", + "x1": 183, + "x2": 188.9 + }, + { + "level": 17, + "sf": "similar at abstractarray.jl:882 [inlined]", + "status": "Default", + "x1": 183, + "x2": 188.9 + }, + { + "level": 18, + "sf": "Array at boot.jl:494 [inlined]", + "status": "Default", + "x1": 183, + "x2": 188.9 + }, + { + "level": 19, + "sf": "Array at boot.jl:486 [inlined]", + "status": "Default", + "x1": 183, + "x2": 188.9 + }, + { + "level": 20, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Garbage collection", + "x1": 183, + "x2": 188.9 + }, + { + "level": 8, + "sf": "macro expansion at miemfp.jl:233 [inlined]", + "status": "Default", + "x1": 191, + "x2": 206.9 + }, + { + "level": 9, + "sf": "add_fast at fastmath.jl:265 [inlined]", + "status": "Default", + "x1": 191, + "x2": 200.9 + }, + { + "level": 10, + "sf": "+(A::Vector{ComplexF64}, Bs::Vector{ComplexF64}) at arraymath.jl:16", + "status": "Default", + "x1": 191, + "x2": 199.9 + }, + { + "level": 11, + "sf": "broadcast_preserving_zero_d at broadcast.jl:862 [inlined]", + "status": "Default", + "x1": 191, + "x2": 199.9 + }, + { + "level": 12, + "sf": "materialize at broadcast.jl:873 [inlined]", + "status": "Default", + "x1": 191, + "x2": 199.9 + }, + { + "level": 13, + "sf": "copy at broadcast.jl:898 [inlined]", + "status": "Default", + "x1": 191, + "x2": 199.9 + }, + { + "level": 14, + "sf": "similar at broadcast.jl:211 [inlined]", + "status": "Default", + "x1": 191, + "x2": 199.9 + }, + { + "level": 15, + "sf": "similar at broadcast.jl:212 [inlined]", + "status": "Default", + "x1": 191, + "x2": 199.9 + }, + { + "level": 16, + "sf": "similar at abstractarray.jl:881 [inlined]", + "status": "Default", + "x1": 191, + "x2": 199.9 + }, + { + "level": 17, + "sf": "similar at abstractarray.jl:882 [inlined]", + "status": "Default", + "x1": 191, + "x2": 199.9 + }, + { + "level": 18, + "sf": "Array at boot.jl:494 [inlined]", + "status": "Default", + "x1": 191, + "x2": 199.9 + }, + { + "level": 19, + "sf": "Array at boot.jl:486 [inlined]", + "status": "Default", + "x1": 191, + "x2": 199.9 + }, + { + "level": 20, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Garbage collection", + "x1": 191, + "x2": 199.9 + }, + { + "level": 9, + "sf": "mul_fast at fastmath.jl:265 [inlined]", + "status": "Default", + "x1": 201, + "x2": 206.9 + }, + { + "level": 10, + "sf": "*(A::Float64, B::Vector{ComplexF64}) at arraymath.jl:21", + "status": "Default", + "x1": 201, + "x2": 206.9 + }, + { + "level": 11, + "sf": "broadcast_preserving_zero_d at broadcast.jl:862 [inlined]", + "status": "Default", + "x1": 201, + "x2": 206.9 + }, + { + "level": 12, + "sf": "materialize at broadcast.jl:873 [inlined]", + "status": "Default", + "x1": 201, + "x2": 206.9 + }, + { + "level": 13, + "sf": "copy at broadcast.jl:898 [inlined]", + "status": "Default", + "x1": 201, + "x2": 206.9 + }, + { + "level": 14, + "sf": "copyto! at broadcast.jl:926 [inlined]", + "status": "Default", + "x1": 201, + "x2": 201.9 + }, + { + "level": 15, + "sf": "copyto! at broadcast.jl:973 [inlined]", + "status": "Default", + "x1": 201, + "x2": 201.9 + }, + { + "level": 16, + "sf": "macro expansion at simdloop.jl:75 [inlined]", + "status": "Default", + "x1": 201, + "x2": 201.9 + }, + { + "level": 17, + "sf": "< at int.jl:83 [inlined]", + "status": "Default", + "x1": 201, + "x2": 201.9 + }, + { + "level": 14, + "sf": "similar at broadcast.jl:211 [inlined]", + "status": "Default", + "x1": 202, + "x2": 206.9 + }, + { + "level": 15, + "sf": "similar at broadcast.jl:212 [inlined]", + "status": "Default", + "x1": 202, + "x2": 206.9 + }, + { + "level": 16, + "sf": "similar at abstractarray.jl:881 [inlined]", + "status": "Default", + "x1": 202, + "x2": 206.9 + }, + { + "level": 17, + "sf": "similar at abstractarray.jl:882 [inlined]", + "status": "Default", + "x1": 202, + "x2": 206.9 + }, + { + "level": 18, + "sf": "Array at boot.jl:494 [inlined]", + "status": "Default", + "x1": 202, + "x2": 206.9 + }, + { + "level": 19, + "sf": "Array at boot.jl:486 [inlined]", + "status": "Default", + "x1": 202, + "x2": 206.9 + }, + { + "level": 20, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Garbage collection", + "x1": 202, + "x2": 206.9 + }, + { + "level": 8, + "sf": "macro expansion at miemfp.jl:236 [inlined]", + "status": "Default", + "x1": 207, + "x2": 220.9 + }, + { + "level": 9, + "sf": "mul_fast at fastmath.jl:265 [inlined]", + "status": "Default", + "x1": 207, + "x2": 212.9 + }, + { + "level": 10, + "sf": "*(A::Float64, B::Vector{ComplexF64}) at arraymath.jl:21", + "status": "Default", + "x1": 207, + "x2": 212.9 + }, + { + "level": 11, + "sf": "broadcast_preserving_zero_d at broadcast.jl:862 [inlined]", + "status": "Default", + "x1": 207, + "x2": 212.9 + }, + { + "level": 12, + "sf": "materialize at broadcast.jl:873 [inlined]", + "status": "Default", + "x1": 207, + "x2": 212.9 + }, + { + "level": 13, + "sf": "copy at broadcast.jl:898 [inlined]", + "status": "Default", + "x1": 207, + "x2": 212.9 + }, + { + "level": 14, + "sf": "similar at broadcast.jl:211 [inlined]", + "status": "Default", + "x1": 207, + "x2": 212.9 + }, + { + "level": 15, + "sf": "similar at broadcast.jl:212 [inlined]", + "status": "Default", + "x1": 207, + "x2": 212.9 + }, + { + "level": 16, + "sf": "similar at abstractarray.jl:881 [inlined]", + "status": "Default", + "x1": 207, + "x2": 212.9 + }, + { + "level": 17, + "sf": "similar at abstractarray.jl:882 [inlined]", + "status": "Default", + "x1": 207, + "x2": 212.9 + }, + { + "level": 18, + "sf": "Array at boot.jl:494 [inlined]", + "status": "Default", + "x1": 207, + "x2": 212.9 + }, + { + "level": 19, + "sf": "Array at boot.jl:486 [inlined]", + "status": "Default", + "x1": 207, + "x2": 212.9 + }, + { + "level": 20, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Default", + "x1": 207, + "x2": 212.9 + }, + { + "level": 9, + "sf": "sub_fast at fastmath.jl:265 [inlined]", + "status": "Default", + "x1": 213, + "x2": 220.9 + }, + { + "level": 10, + "sf": "-(A::Vector{ComplexF64}, B::Vector{ComplexF64}) at arraymath.jl:7", + "status": "Default", + "x1": 213, + "x2": 213.9 + }, + { + "level": 11, + "sf": "promote_shape at indices.jl:169 [inlined]", + "status": "Default", + "x1": 213, + "x2": 213.9 + }, + { + "level": 12, + "sf": "axes at abstractarray.jl:98 [inlined]", + "status": "Default", + "x1": 213, + "x2": 213.9 + }, + { + "level": 13, + "sf": "size at array.jl:149 [inlined]", + "status": "Default", + "x1": 213, + "x2": 213.9 + }, + { + "level": 10, + "sf": "-(A::Vector{ComplexF64}, B::Vector{ComplexF64}) at arraymath.jl:8", + "status": "Default", + "x1": 214, + "x2": 219.9 + }, + { + "level": 11, + "sf": "broadcast_preserving_zero_d at broadcast.jl:862 [inlined]", + "status": "Default", + "x1": 214, + "x2": 219.9 + }, + { + "level": 12, + "sf": "materialize at broadcast.jl:873 [inlined]", + "status": "Default", + "x1": 214, + "x2": 219.9 + }, + { + "level": 13, + "sf": "copy at broadcast.jl:898 [inlined]", + "status": "Default", + "x1": 214, + "x2": 219.9 + }, + { + "level": 14, + "sf": "similar at broadcast.jl:211 [inlined]", + "status": "Default", + "x1": 214, + "x2": 219.9 + }, + { + "level": 15, + "sf": "similar at broadcast.jl:212 [inlined]", + "status": "Default", + "x1": 214, + "x2": 219.9 + }, + { + "level": 16, + "sf": "similar at abstractarray.jl:881 [inlined]", + "status": "Default", + "x1": 214, + "x2": 219.9 + }, + { + "level": 17, + "sf": "similar at abstractarray.jl:882 [inlined]", + "status": "Default", + "x1": 214, + "x2": 219.9 + }, + { + "level": 18, + "sf": "Array at boot.jl:494 [inlined]", + "status": "Default", + "x1": 214, + "x2": 219.9 + }, + { + "level": 19, + "sf": "Array at boot.jl:486 [inlined]", + "status": "Default", + "x1": 214, + "x2": 219.9 + }, + { + "level": 20, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Garbage collection", + "x1": 214, + "x2": 219.9 + }, + { + "level": 10, + "sf": "-(A::Vector{ComplexF64}, B::Vector{ComplexF64}) at broadcast.jl:0", + "status": "Default", + "x1": 220, + "x2": 220.9 + }, + { + "level": 8, + "sf": "macro expansion at miemfp.jl:239 [inlined]", + "status": "Default", + "x1": 221, + "x2": 227.9 + }, + { + "level": 9, + "sf": "mul_fast at fastmath.jl:265 [inlined]", + "status": "Default", + "x1": 221, + "x2": 225.9 + }, + { + "level": 10, + "sf": "*(A::Float64, B::Vector{ComplexF64}) at arraymath.jl:21", + "status": "Default", + "x1": 221, + "x2": 225.9 + }, + { + "level": 11, + "sf": "broadcast_preserving_zero_d at broadcast.jl:862 [inlined]", + "status": "Default", + "x1": 221, + "x2": 224.9 + }, + { + "level": 12, + "sf": "materialize at broadcast.jl:873 [inlined]", + "status": "Default", + "x1": 221, + "x2": 224.9 + }, + { + "level": 13, + "sf": "copy at broadcast.jl:898 [inlined]", + "status": "Default", + "x1": 221, + "x2": 224.9 + }, + { + "level": 14, + "sf": "similar at broadcast.jl:211 [inlined]", + "status": "Default", + "x1": 221, + "x2": 224.9 + }, + { + "level": 15, + "sf": "similar at broadcast.jl:212 [inlined]", + "status": "Default", + "x1": 221, + "x2": 224.9 + }, + { + "level": 16, + "sf": "similar at abstractarray.jl:881 [inlined]", + "status": "Default", + "x1": 221, + "x2": 224.9 + }, + { + "level": 17, + "sf": "similar at abstractarray.jl:882 [inlined]", + "status": "Default", + "x1": 221, + "x2": 224.9 + }, + { + "level": 18, + "sf": "Array at boot.jl:494 [inlined]", + "status": "Default", + "x1": 221, + "x2": 224.9 + }, + { + "level": 19, + "sf": "Array at boot.jl:486 [inlined]", + "status": "Default", + "x1": 221, + "x2": 224.9 + }, + { + "level": 20, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Default", + "x1": 221, + "x2": 224.9 + }, + { + "level": 9, + "sf": "sub_fast at fastmath.jl:265 [inlined]", + "status": "Default", + "x1": 226, + "x2": 227.9 + }, + { + "level": 10, + "sf": "-(A::Vector{ComplexF64}, B::Vector{ComplexF64}) at arraymath.jl:8", + "status": "Default", + "x1": 226, + "x2": 227.9 + }, + { + "level": 11, + "sf": "broadcast_preserving_zero_d at broadcast.jl:862 [inlined]", + "status": "Default", + "x1": 226, + "x2": 227.9 + }, + { + "level": 12, + "sf": "materialize at broadcast.jl:873 [inlined]", + "status": "Default", + "x1": 226, + "x2": 227.9 + }, + { + "level": 13, + "sf": "copy at broadcast.jl:898 [inlined]", + "status": "Default", + "x1": 226, + "x2": 227.9 + }, + { + "level": 14, + "sf": "similar at broadcast.jl:211 [inlined]", + "status": "Default", + "x1": 226, + "x2": 227.9 + }, + { + "level": 15, + "sf": "similar at broadcast.jl:212 [inlined]", + "status": "Default", + "x1": 226, + "x2": 227.9 + }, + { + "level": 16, + "sf": "similar at abstractarray.jl:881 [inlined]", + "status": "Default", + "x1": 226, + "x2": 227.9 + }, + { + "level": 17, + "sf": "similar at abstractarray.jl:882 [inlined]", + "status": "Default", + "x1": 226, + "x2": 227.9 + }, + { + "level": 18, + "sf": "Array at boot.jl:494 [inlined]", + "status": "Default", + "x1": 226, + "x2": 227.9 + }, + { + "level": 19, + "sf": "Array at boot.jl:486 [inlined]", + "status": "Default", + "x1": 226, + "x2": 227.9 + }, + { + "level": 20, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Default", + "x1": 226, + "x2": 227.9 + }, + { + "level": 8, + "sf": "macro expansion at miemfp.jl:242 [inlined]", + "status": "Default", + "x1": 228, + "x2": 265.9 + }, + { + "level": 9, + "sf": "materialize at broadcast.jl:873 [inlined]", + "status": "Default", + "x1": 228, + "x2": 236.9 + }, + { + "level": 10, + "sf": "copy at broadcast.jl:898 [inlined]", + "status": "Default", + "x1": 228, + "x2": 235.9 + }, + { + "level": 11, + "sf": "similar at broadcast.jl:211 [inlined]", + "status": "Default", + "x1": 228, + "x2": 235.9 + }, + { + "level": 12, + "sf": "similar at broadcast.jl:212 [inlined]", + "status": "Default", + "x1": 228, + "x2": 235.9 + }, + { + "level": 13, + "sf": "similar at abstractarray.jl:881 [inlined]", + "status": "Default", + "x1": 228, + "x2": 235.9 + }, + { + "level": 14, + "sf": "similar at abstractarray.jl:882 [inlined]", + "status": "Default", + "x1": 228, + "x2": 235.9 + }, + { + "level": 15, + "sf": "Array at boot.jl:494 [inlined]", + "status": "Default", + "x1": 228, + "x2": 235.9 + }, + { + "level": 16, + "sf": "Array at boot.jl:486 [inlined]", + "status": "Default", + "x1": 228, + "x2": 235.9 + }, + { + "level": 17, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Default", + "x1": 228, + "x2": 235.9 + }, + { + "level": 10, + "sf": "instantiate at broadcast.jl:294 [inlined]", + "status": "Default", + "x1": 236, + "x2": 236.9 + }, + { + "level": 11, + "sf": "combine_axes at broadcast.jl:512 [inlined]", + "status": "Default", + "x1": 236, + "x2": 236.9 + }, + { + "level": 12, + "sf": "axes at abstractarray.jl:98 [inlined]", + "status": "Default", + "x1": 236, + "x2": 236.9 + }, + { + "level": 13, + "sf": "size at array.jl:149 [inlined]", + "status": "Default", + "x1": 236, + "x2": 236.9 + }, + { + "level": 9, + "sf": "div_fast at fastmath.jl:265 [inlined]", + "status": "Default", + "x1": 237, + "x2": 243.9 + }, + { + "level": 10, + "sf": "/(A::Vector{Float64}, B::Int64) at arraymath.jl:24", + "status": "Default", + "x1": 237, + "x2": 243.9 + }, + { + "level": 11, + "sf": "broadcast_preserving_zero_d at broadcast.jl:862 [inlined]", + "status": "Default", + "x1": 237, + "x2": 243.9 + }, + { + "level": 12, + "sf": "materialize at broadcast.jl:873 [inlined]", + "status": "Default", + "x1": 237, + "x2": 243.9 + }, + { + "level": 13, + "sf": "copy at broadcast.jl:898 [inlined]", + "status": "Default", + "x1": 237, + "x2": 243.9 + }, + { + "level": 14, + "sf": "copyto! at broadcast.jl:926 [inlined]", + "status": "Default", + "x1": 237, + "x2": 237.9 + }, + { + "level": 15, + "sf": "copyto! at broadcast.jl:973 [inlined]", + "status": "Default", + "x1": 237, + "x2": 237.9 + }, + { + "level": 16, + "sf": "macro expansion at simdloop.jl:77 [inlined]", + "status": "Default", + "x1": 237, + "x2": 237.9 + }, + { + "level": 17, + "sf": "macro expansion at broadcast.jl:974 [inlined]", + "status": "Default", + "x1": 237, + "x2": 237.9 + }, + { + "level": 18, + "sf": "setindex! at array.jl:969 [inlined]", + "status": "Default", + "x1": 237, + "x2": 237.9 + }, + { + "level": 14, + "sf": "similar at broadcast.jl:211 [inlined]", + "status": "Default", + "x1": 238, + "x2": 243.9 + }, + { + "level": 15, + "sf": "similar at broadcast.jl:212 [inlined]", + "status": "Default", + "x1": 238, + "x2": 243.9 + }, + { + "level": 16, + "sf": "similar at abstractarray.jl:881 [inlined]", + "status": "Default", + "x1": 238, + "x2": 243.9 + }, + { + "level": 17, + "sf": "similar at abstractarray.jl:882 [inlined]", + "status": "Default", + "x1": 238, + "x2": 243.9 + }, + { + "level": 18, + "sf": "Array at boot.jl:494 [inlined]", + "status": "Default", + "x1": 238, + "x2": 243.9 + }, + { + "level": 19, + "sf": "Array at boot.jl:486 [inlined]", + "status": "Default", + "x1": 238, + "x2": 243.9 + }, + { + "level": 20, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Default", + "x1": 238, + "x2": 243.9 + }, + { + "level": 9, + "sf": "mul_fast at fastmath.jl:265 [inlined]", + "status": "Default", + "x1": 244, + "x2": 250.9 + }, + { + "level": 10, + "sf": "*(A::Int64, B::Vector{Float64}) at arraymath.jl:21", + "status": "Default", + "x1": 244, + "x2": 249.9 + }, + { + "level": 11, + "sf": "broadcast_preserving_zero_d at broadcast.jl:862 [inlined]", + "status": "Default", + "x1": 244, + "x2": 249.9 + }, + { + "level": 12, + "sf": "materialize at broadcast.jl:873 [inlined]", + "status": "Default", + "x1": 244, + "x2": 249.9 + }, + { + "level": 13, + "sf": "copy at broadcast.jl:898 [inlined]", + "status": "Default", + "x1": 244, + "x2": 249.9 + }, + { + "level": 14, + "sf": "similar at broadcast.jl:211 [inlined]", + "status": "Default", + "x1": 244, + "x2": 249.9 + }, + { + "level": 15, + "sf": "similar at broadcast.jl:212 [inlined]", + "status": "Default", + "x1": 244, + "x2": 249.9 + }, + { + "level": 16, + "sf": "similar at abstractarray.jl:881 [inlined]", + "status": "Default", + "x1": 244, + "x2": 249.9 + }, + { + "level": 17, + "sf": "similar at abstractarray.jl:882 [inlined]", + "status": "Default", + "x1": 244, + "x2": 249.9 + }, + { + "level": 18, + "sf": "Array at boot.jl:494 [inlined]", + "status": "Default", + "x1": 244, + "x2": 249.9 + }, + { + "level": 19, + "sf": "Array at boot.jl:486 [inlined]", + "status": "Default", + "x1": 244, + "x2": 249.9 + }, + { + "level": 20, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Garbage collection", + "x1": 244, + "x2": 249.9 + }, + { + "level": 9, + "sf": "sub_fast at fastmath.jl:265 [inlined]", + "status": "Default", + "x1": 251, + "x2": 265.9 + }, + { + "level": 10, + "sf": "-(A::Vector{Float64}, B::Vector{Float64}) at arraymath.jl:8", + "status": "Default", + "x1": 251, + "x2": 265.9 + }, + { + "level": 11, + "sf": "broadcast_preserving_zero_d at broadcast.jl:862 [inlined]", + "status": "Default", + "x1": 251, + "x2": 264.9 + }, + { + "level": 12, + "sf": "materialize at broadcast.jl:873 [inlined]", + "status": "Default", + "x1": 251, + "x2": 264.9 + }, + { + "level": 13, + "sf": "copy at broadcast.jl:898 [inlined]", + "status": "Default", + "x1": 251, + "x2": 264.9 + }, + { + "level": 14, + "sf": "copyto! at broadcast.jl:926 [inlined]", + "status": "Default", + "x1": 251, + "x2": 252.9 + }, + { + "level": 15, + "sf": "copyto! at broadcast.jl:962 [inlined]", + "status": "Default", + "x1": 251, + "x2": 251.9 + }, + { + "level": 16, + "sf": "== at tuple.jl:458 [inlined]", + "status": "Default", + "x1": 251, + "x2": 251.9 + }, + { + "level": 17, + "sf": "_eq at tuple.jl:462 [inlined]", + "status": "Default", + "x1": 251, + "x2": 251.9 + }, + { + "level": 18, + "sf": "== at range.jl:1119 [inlined]", + "status": "Default", + "x1": 251, + "x2": 251.9 + }, + { + "level": 19, + "sf": "== at promotion.jl:499 [inlined]", + "status": "Default", + "x1": 251, + "x2": 251.9 + }, + { + "level": 15, + "sf": "copyto! at broadcast.jl:970 [inlined]", + "status": "Default", + "x1": 252, + "x2": 252.9 + }, + { + "level": 16, + "sf": "preprocess at broadcast.jl:953 [inlined]", + "status": "Default", + "x1": 252, + "x2": 252.9 + }, + { + "level": 17, + "sf": "preprocess_args at broadcast.jl:956 [inlined]", + "status": "Default", + "x1": 252, + "x2": 252.9 + }, + { + "level": 18, + "sf": "preprocess at broadcast.jl:954 [inlined]", + "status": "Default", + "x1": 252, + "x2": 252.9 + }, + { + "level": 19, + "sf": "broadcast_unalias at broadcast.jl:947 [inlined]", + "status": "Default", + "x1": 252, + "x2": 252.9 + }, + { + "level": 14, + "sf": "similar at broadcast.jl:211 [inlined]", + "status": "Default", + "x1": 253, + "x2": 264.9 + }, + { + "level": 15, + "sf": "similar at broadcast.jl:212 [inlined]", + "status": "Default", + "x1": 253, + "x2": 264.9 + }, + { + "level": 16, + "sf": "similar at abstractarray.jl:881 [inlined]", + "status": "Default", + "x1": 253, + "x2": 264.9 + }, + { + "level": 17, + "sf": "similar at abstractarray.jl:882 [inlined]", + "status": "Default", + "x1": 253, + "x2": 264.9 + }, + { + "level": 18, + "sf": "Array at boot.jl:494 [inlined]", + "status": "Default", + "x1": 253, + "x2": 264.9 + }, + { + "level": 19, + "sf": "Array at boot.jl:486 [inlined]", + "status": "Default", + "x1": 253, + "x2": 264.9 + }, + { + "level": 20, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Garbage collection", + "x1": 253, + "x2": 264.9 + }, + { + "level": 6, + "sf": "bhmie(x::Float64, refrel::ComplexF64, nang::UInt32) at miemfp.jl:249", + "status": "Default", + "x1": 266, + "x2": 269.9 + }, + { + "level": 7, + "sf": "getindex at array.jl:944 [inlined]", + "status": "Default", + "x1": 266, + "x2": 266.9 + }, + { + "level": 8, + "sf": "_array_for at array.jl:674 [inlined]", + "status": "Default", + "x1": 266, + "x2": 266.9 + }, + { + "level": 9, + "sf": "_array_for at array.jl:671 [inlined]", + "status": "Default", + "x1": 266, + "x2": 266.9 + }, + { + "level": 10, + "sf": "similar at abstractarray.jl:881 [inlined]", + "status": "Default", + "x1": 266, + "x2": 266.9 + }, + { + "level": 11, + "sf": "similar at abstractarray.jl:882 [inlined]", + "status": "Default", + "x1": 266, + "x2": 266.9 + }, + { + "level": 12, + "sf": "Array at boot.jl:486 [inlined]", + "status": "Default", + "x1": 266, + "x2": 266.9 + }, + { + "level": 13, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Default", + "x1": 266, + "x2": 266.9 + }, + { + "level": 7, + "sf": "vcat(::Vector{ComplexF64}, ::Vector{ComplexF64}) at array.jl:1940", + "status": "Default", + "x1": 267, + "x2": 268.9 + }, + { + "level": 8, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Default", + "x1": 267, + "x2": 268.9 + }, + { + "level": 7, + "sf": "vcat(::Vector{ComplexF64}, ::Vector{ComplexF64}) at array.jl:1947", + "status": "Default", + "x1": 269, + "x2": 269.9 + }, + { + "level": 8, + "sf": "iterate at tuple.jl:68 [inlined]", + "status": "Default", + "x1": 269, + "x2": 269.9 + }, + { + "level": 9, + "sf": "getindex at tuple.jl:29 [inlined]", + "status": "Default", + "x1": 269, + "x2": 269.9 + }, + { + "level": 6, + "sf": "bhmie(x::Float64, refrel::ComplexF64, nang::UInt32) at miemfp.jl:250", + "status": "Default", + "x1": 270, + "x2": 273.9 + }, + { + "level": 7, + "sf": "getindex at array.jl:944 [inlined]", + "status": "Default", + "x1": 270, + "x2": 270.9 + }, + { + "level": 8, + "sf": "_array_for at array.jl:674 [inlined]", + "status": "Default", + "x1": 270, + "x2": 270.9 + }, + { + "level": 9, + "sf": "_array_for at array.jl:671 [inlined]", + "status": "Default", + "x1": 270, + "x2": 270.9 + }, + { + "level": 10, + "sf": "similar at abstractarray.jl:881 [inlined]", + "status": "Default", + "x1": 270, + "x2": 270.9 + }, + { + "level": 11, + "sf": "similar at abstractarray.jl:882 [inlined]", + "status": "Default", + "x1": 270, + "x2": 270.9 + }, + { + "level": 12, + "sf": "Array at boot.jl:486 [inlined]", + "status": "Default", + "x1": 270, + "x2": 270.9 + }, + { + "level": 13, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Default", + "x1": 270, + "x2": 270.9 + }, + { + "level": 7, + "sf": "vcat(::Vector{ComplexF64}, ::Vector{ComplexF64}) at array.jl:1940", + "status": "Default", + "x1": 271, + "x2": 273.9 + }, + { + "level": 8, + "sf": "Array at boot.jl:477 [inlined]", + "status": "Default", + "x1": 271, + "x2": 273.9 + }, + { + "level": 5, + "sf": "_mfp at miemfp.jl:312 [inlined]", + "status": "Default", + "x1": 275, + "x2": 295.9 + }, + { + "level": 6, + "sf": "mfp(fv::Float64, wavel::Float64, radcor::Float64, omp::Float64, om0::Float64, rn::Float64, rk::Float64) at miemfp.jl:74", + "status": "Default", + "x1": 275, + "x2": 295.9 + }, + { + "level": 7, + "sf": "_om_manipulations(wavel::Float64, fv::Float64, radcor::Float64, omp::Float64, om0::Float64) at miemfp.jl:56", + "status": "Default", + "x1": 275, + "x2": 283.9 + }, + { + "level": 8, + "sf": "_om_calc at Memoize.jl:61 [inlined]", + "status": "Default", + "x1": 275, + "x2": 283.9 + }, + { + "level": 9, + "sf": "get! at iddict.jl:176 [inlined]", + "status": "Default", + "x1": 275, + "x2": 283.9 + }, + { + "level": 7, + "sf": "_om_manipulations(wavel::Float64, fv::Float64, radcor::Float64, omp::Float64, om0::Float64) at miemfp.jl:58", + "status": "Default", + "x1": 284, + "x2": 290.9 + }, + { + "level": 8, + "sf": "_om_sq_calc at Memoize.jl:61 [inlined]", + "status": "Default", + "x1": 284, + "x2": 290.9 + }, + { + "level": 9, + "sf": "get! at iddict.jl:176 [inlined]", + "status": "Garbage collection", + "x1": 284, + "x2": 290.9 + }, + { + "level": 7, + "sf": "_om_manipulations(wavel::Float64, fv::Float64, radcor::Float64, omp::Float64, om0::Float64) at miemfp.jl:59", + "status": "Default", + "x1": 291, + "x2": 291.9 + }, + { + "level": 8, + "sf": "_om0_sq_calc at Memoize.jl:61 [inlined]", + "status": "Default", + "x1": 291, + "x2": 291.9 + }, + { + "level": 9, + "sf": "get! at iddict.jl:176 [inlined]", + "status": "Default", + "x1": 291, + "x2": 291.9 + }, + { + "level": 7, + "sf": "_om_manipulations(wavel::Float64, fv::Float64, radcor::Float64, omp::Float64, om0::Float64) at miemfp.jl:60", + "status": "Default", + "x1": 292, + "x2": 294.9 + }, + { + "level": 8, + "sf": "_omp_sq_calc at Memoize.jl:61 [inlined]", + "status": "Default", + "x1": 292, + "x2": 294.9 + }, + { + "level": 9, + "sf": "get! at iddict.jl:176 [inlined]", + "status": "Default", + "x1": 292, + "x2": 294.9 + }, + { + "level": 7, + "sf": "_om_manipulations(wavel::Float64, fv::Float64, radcor::Float64, omp::Float64, om0::Float64) at miemfp.jl:61", + "status": "Default", + "x1": 295, + "x2": 295.9 + }, + { + "level": 8, + "sf": "_om0r_sq_calc at Memoize.jl:61 [inlined]", + "status": "Default", + "x1": 295, + "x2": 295.9 + }, + { + "level": 9, + "sf": "get! at iddict.jl:176 [inlined]", + "status": "Default", + "x1": 295, + "x2": 295.9 + }, + { + "level": 1, + "sf": "_start() at client.jl:522", + "status": "Default", + "x1": 299, + "x2": 304.9 + }, + { + "level": 2, + "sf": "exec_options(opts::Base.JLOptions) at client.jl:307", + "status": "Runtime dispatch", + "x1": 299, + "x2": 304.9 + }, + { + "level": 3, + "sf": "include(mod::Module, _path::String) at Base.jl:457", + "status": "Default", + "x1": 299, + "x2": 304.9 + }, + { + "level": 4, + "sf": "_include(mapexpr::Function, mod::Module, _path::String) at loading.jl:1959", + "status": "Runtime dispatch", + "x1": 299, + "x2": 304.9 + }, + { + "level": 5, + "sf": "include_string(mapexpr::typeof(identity), mod::Module, code::String, filename::String) at loading.jl:1899", + "status": "Default", + "x1": 299, + "x2": 304.9 + }, + { + "level": 6, + "sf": "eval at boot.jl:370 [inlined]", + "status": "Default", + "x1": 299, + "x2": 304.9 + }, + { + "level": 7, + "sf": "top-level scope at notebook.jl:32", + "status": "Runtime dispatch", + "x1": 299, + "x2": 304.9 + }, + { + "level": 8, + "sf": "kwcall(::NamedTuple{(:crashreporting_pipename,), Tuple{String}}, ::typeof(VSCodeServer.serve_notebook), pipename::String, outputchannel_logger::Base.CoreLogging.SimpleLogger) at serve_notebook.jl:75", + "status": "Default", + "x1": 299, + "x2": 304.9 + }, + { + "level": 9, + "sf": "serve_notebook(pipename::String, outputchannel_logger::Base.CoreLogging.SimpleLogger; crashreporting_pipename::String) at serve_notebook.jl:139", + "status": "Runtime dispatch", + "x1": 299, + "x2": 304.9 + }, + { + "level": 10, + "sf": "dispatch_msg(x::VSCodeServer.JSONRPC.JSONRPCEndpoint{Base.PipeEndpoint, Base.PipeEndpoint}, dispatcher::VSCodeServer.JSONRPC.MsgDispatcher, msg::Dict{String, Any}) at typed.jl:67", + "status": "Runtime dispatch", + "x1": 299, + "x2": 304.9 + }, + { + "level": 11, + "sf": "notebook_runcell_request(conn::VSCodeServer.JSONRPC.JSONRPCEndpoint{Base.PipeEndpoint, Base.PipeEndpoint}, params::VSCodeServer.NotebookRunCellArguments) at serve_notebook.jl:13", + "status": "Default", + "x1": 299, + "x2": 304.9 + }, + { + "level": 12, + "sf": "withpath(f::VSCodeServer.var\"#198#199\"{VSCodeServer.NotebookRunCellArguments, String}, path::String) at repl.jl:249", + "status": "Default", + "x1": 299, + "x2": 304.9 + }, + { + "level": 13, + "sf": "(::VSCodeServer.var\"#198#199\"{VSCodeServer.NotebookRunCellArguments, String})() at serve_notebook.jl:19", + "status": "Default", + "x1": 299, + "x2": 304.9 + }, + { + "level": 14, + "sf": "invokelatest at essentials.jl:813 [inlined]", + "status": "Default", + "x1": 299, + "x2": 304.9 + }, + { + "level": 15, + "sf": "#invokelatest#2 at essentials.jl:816 [inlined]", + "status": "Runtime dispatch", + "x1": 299, + "x2": 304.9 + }, + { + "level": 16, + "sf": "include_string(mapexpr::typeof(REPL.softscope), mod::Module, code::String, filename::String) at loading.jl:1899", + "status": "Default", + "x1": 299, + "x2": 304.9 + }, + { + "level": 17, + "sf": "eval at boot.jl:370 [inlined]", + "status": "Runtime dispatch", + "x1": 299, + "x2": 304.9 + }, + { + "level": 18, + "sf": "abspredict(refmed::Float64, wavel1::Float64, wavel2::Float64, numval::UInt32, particledata::Matrix{Float64}, materialdata::Tuple{Float64, Float64, Float64, Matrix{Float64}}, ppml::Float64, d0::Float64) at nanoconc.jl:275", + "status": "Default", + "x1": 299, + "x2": 299.9 + }, + { + "level": 19, + "sf": "materialize at broadcast.jl:873 [inlined]", + "status": "Default", + "x1": 299, + "x2": 299.9 + }, + { + "level": 20, + "sf": "copy at broadcast.jl:898 [inlined]", + "status": "Default", + "x1": 299, + "x2": 299.9 + }, + { + "level": 21, + "sf": "copyto! at broadcast.jl:926 [inlined]", + "status": "Default", + "x1": 299, + "x2": 299.9 + }, + { + "level": 22, + "sf": "copyto! at broadcast.jl:973 [inlined]", + "status": "Default", + "x1": 299, + "x2": 299.9 + }, + { + "level": 23, + "sf": "macro expansion at simdloop.jl:77 [inlined]", + "status": "Default", + "x1": 299, + "x2": 299.9 + }, + { + "level": 24, + "sf": "macro expansion at broadcast.jl:974 [inlined]", + "status": "Default", + "x1": 299, + "x2": 299.9 + }, + { + "level": 25, + "sf": "getindex at broadcast.jl:610 [inlined]", + "status": "Default", + "x1": 299, + "x2": 299.9 + }, + { + "level": 26, + "sf": "_broadcast_getindex at broadcast.jl:656 [inlined]", + "status": "Default", + "x1": 299, + "x2": 299.9 + }, + { + "level": 27, + "sf": "_broadcast_getindex_evalf at broadcast.jl:683 [inlined]", + "status": "Default", + "x1": 299, + "x2": 299.9 + }, + { + "level": 28, + "sf": "(::Main.nanoconc.var\"#predict#22\"{Matrix{Float64}, Float64, Float64})(qext::Float64) at nanoconc.jl:269", + "status": "Default", + "x1": 299, + "x2": 299.9 + }, + { + "level": 29, + "sf": "sum at reducedim.jl:994 [inlined]", + "status": "Default", + "x1": 299, + "x2": 299.9 + }, + { + "level": 30, + "sf": "#sum#807 at reducedim.jl:994 [inlined]", + "status": "Default", + "x1": 299, + "x2": 299.9 + }, + { + "level": 31, + "sf": "_sum at reducedim.jl:998 [inlined]", + "status": "Default", + "x1": 299, + "x2": 299.9 + }, + { + "level": 32, + "sf": "#_sum#809 at reducedim.jl:998 [inlined]", + "status": "Default", + "x1": 299, + "x2": 299.9 + }, + { + "level": 33, + "sf": "_sum at reducedim.jl:999 [inlined]", + "status": "Default", + "x1": 299, + "x2": 299.9 + }, + { + "level": 34, + "sf": "#_sum#810 at reducedim.jl:999 [inlined]", + "status": "Default", + "x1": 299, + "x2": 299.9 + }, + { + "level": 35, + "sf": "mapreduce at reducedim.jl:357 [inlined]", + "status": "Default", + "x1": 299, + "x2": 299.9 + }, + { + "level": 36, + "sf": "#mapreduce#800 at reducedim.jl:357 [inlined]", + "status": "Default", + "x1": 299, + "x2": 299.9 + }, + { + "level": 37, + "sf": "_mapreduce_dim at reducedim.jl:365 [inlined]", + "status": "Default", + "x1": 299, + "x2": 299.9 + }, + { + "level": 38, + "sf": "_mapreduce at reduce.jl:437 [inlined]", + "status": "Default", + "x1": 299, + "x2": 299.9 + }, + { + "level": 39, + "sf": "+ at int.jl:87 [inlined]", + "status": "Default", + "x1": 299, + "x2": 299.9 + } + ] + }, + "encoding": { + "color": { + "field": "status", + "legend": { + "orient": "bottom", + "title": null + }, + "type": "nominal" + }, + "fillOpacity": { + "condition": [ + { + "selection": "highlight", + "value": 0.6 + }, + { + "selection": "select", + "value": 0.5 + } + ], + "value": 1 + }, + "strokeWidth": { + "condition": [ + { + "selection": "highlight", + "value": 0.5 + }, + { + "selection": "select", + "value": 0.5 + } + ], + "value": 0 + }, + "tooltip": { + "field": "sf", + "type": "nominal" + }, + "x": { + "axis": null, + "field": "x1", + "type": "quantitative" + }, + "x2": { + "field": "x2", + "type": "quantitative" + }, + "y": { + "axis": null, + "field": "level", + "type": "quantitative" + }, + "y2": { + "field": "level2", + "type": "quantitative" + } + }, + "height": 400, + "mark": { + "stroke": "#505050", + "type": "rect" + }, + "selection": { + "grid": { + "bind": "scales", + "type": "interval" + }, + "highlight": { + "empty": "none", + "on": "mouseover", + "type": "single" + }, + "select": { + "empty": "none", + "type": "multi" + } + }, + "title": "Profile Results", + "transform": [ + { + "as": "level2", + "calculate": "datum.level+0.9" + } + ], + "width": 800 + }, + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAyoAAAHKCAYAAADsEr9sAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nO3de5Sd46E/8O/kSnNrqEga2ogEyQiKVqvUQZSWSOoalJ7+Thc5WqdYovSkFY7TujW/nnMcdaJupcopxyW9xElpXZZSGkFDbkVFk6AEuYhEzO8Pa+aXxJ7JTDKT/Yz5fNayVmbPfp/neff77j3ztd8935q6urq6AAAAFKRTtRcAAACwLkEFAAAojqACAAAUR1ABAACKI6gAdCALFy7M5z//+fTp0yd9+/bNVVddlV133TXDhg3LqlWrkiRdu3ZNr169qrzSDdOe1w7A2gQVgAKNGDEiNTU1qampSc+ePbP77rvn5z//+UaPO2nSpEybNi0jRozIySefnH322Sf9+/dP//7906nTxv9IWHPdffv2zSc/+cnceOONGz3uhnrllVdy8cUX59VXX63aGgDYMF2qvQAAGnfyySdn+fLlufXWWzN27Nhsu+22+fSnP73B473wwgtJknPOOSeHHXZYkuTuu+9ulbWu6R/+4R+yfPny3HnnnTnppJPSv3//jBw5stXnWZ/rrrsu55xzTkaPHp0tt9xyk88PwIbzjgpAwcaPH58bbrghZ511Vt599938+te/TvLeJU7jxo3LNddck6222iqnnnpqkuT555/PUUcdlX79+qVXr14ZM2ZMnnvuuSTJBRdckDvuuCNJMmrUqPTt2zdJ0qtXr3Tt2rXRNcybNy+HHXZYevTokf79++drX/taFi9e3OS6zznnnNx0000599xzU1dXl9/+9rfNGu+dd97J+PHjs80226R79+4ZNGhQLrjggqxYsSI1NTUZMGBAwzhXXnllampqcu6551Zcw49+9KOcd955SZJhw4alpqYm8+bNa3QOAMriHRWAduCtt95KkrUuz7r55ptz9dVXZ8SIEfnEJz6Rt99+O4ccckjmzJmTsWPHpkuXLrnxxhvzxBNPZObMmdljjz2y8847Z/r06Tn99NOz6667rnfeFStW5KCDDsqLL76Y888/P8uXL8/3vve9LFmyJLfcckuT2y5atCi///3vkyRDhgxp1nh33HFHLrvssnzqU5/K2Wefnaeeeiof+chHNugx22677dK/f/8899xzOf/889O/f//069evVecAoO0IKgAFu+iii/Lqq6/mF7/4Rbp27Zqjjjqq4XtvvPFG7rrrrowaNSpJMm3atMyePTsHH3xwbrrppiTJsmXL8j//8z/51a9+laOOOirXXXddpk+fnkMPPbRZl2Ldc889ef7553P44Yfn29/+dsNtt99+e1auXJlu3bpV3G7o0KEN/x47dmxOPPHEZo1X/0H4+fPnp3v37vnhD3+YHj16ZMWKFS196HLIIYdk6623znPPPZdjjjkmO+20U5I0OgcAZXHpF0DBrr766kybNi177bVXpkyZktra2obvbbbZZg0hJUn+8pe/JEm23377htvq//3Xv/51g+ZfsGBBkuSuu+5q+JD8ww8/nFWrVmXRokWNbnfyySdnxx13TLdu3TJhwoR06dKlWeMdfPDBueSSS/L2229n3Lhx+fjHP54777yz4hz1f6WspVoyBwDVI6gAFGzu3LlZunRpHnzwwRx88MFrfa/+l/96H/3oR5O89xmQevX/HjRo0AbNXz/mIYcckscee2yt//r379/oduPHj8/111+f1atX58tf/nJWrlzZ7PHGjx+fF154IZdeemlee+21nHnmmencuXM6deqUZcuWpa6u7n372Ziampok7332Zd31rTsHAGVx6RfAB8TIkSMzdOjQTJs2Lccdd1y6du2aO+64IwMGDMgBBxywwWNuv/32+c1vfpNhw4Zl6NChWbhwYVavXp099tijyW332muvfOMb38i//du/5bvf/W4uuuii9Y5300035Ve/+lX22GOPLFu2rOHPM3ft2jVDhw7N7Nmzc9ppp2XAgAG5+uqr17v++g/fn3HGGamtrc2pp56axx57rOIcAJRFUAH4gOjWrVumTZuWM844I7/85S/TvXv3jB49OpdeeukGlyB2794999xzT84+++xcf/31Wbp0abbeeuucdtppzdr+wgsvzO23357LLrsshx56aPbdd98mx+vXr18effTR3HbbbenWrVv222+/TJo0KUlyzTXX5Otf/3quvfba7LDDDpk0aVLGjRvX5Pzf+c538txzz+XBBx/MvHnzMm7cuCbnAKAcNXX176EDAAAUwmdUAACA4ggqAABAcQQVAACgOIIKAABQHEEFAAAojqACAAAUp2KPyrPPPrup1wEAAHRggwcPXuvrRgsf170jAACUYPKU6Zny0NyccNDOGXtAbbWXQyuo9EaJS78AAIDiCCoAAEBxBBUA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433jG9/I5MmTM3z48GYu/z3Lli3L9OnT31t3XV3OPPPMTJkypUVj1BvW681M2OnpJu9z4azG13f++efn7rvvzvnnn5+BAwfmkUceSefOnZs9/5r7UpI117Wha1z32PTq1Suf+tSnWnWdjRlSU5PTu3Vt8j4/XLmq4u3vvvtuZs2alfvuuy+vvfZaxo0bl379+uULX/hCi9ZQjf2fPXt2Bg0alBEjRrTqXM15npV6LgMA7UObfUalU6dO6du3b2prazNx4sTsueee+clPfpIkefDBB3PEEUfkuOOOy5/+9KckycSJE/PnP/855513Xp5++un853/+Z0aPHp0TTjgh8+bNS5LMmTMn5513XsMckydPzgMPPLDWvKeeemruv//+HHTQQfnd737XVrtX0UsvvZT/+q//ytSpU3PQQQdl+PDh+epXv5rtttsuSSru0/z58/PDH/4wV1xxRb70pS8lSWpqajJx4sQcdthhueGGGxrGr7R9kkybNi1HHHFExo8fn5/85Cd5+OGHk1R+nNf14IMP5uijj87o0aPzhz/8IUny2GOP5fjjj8+RRx6Z+++/f7373dg864697rF57bXXct999zXcv9K88+fPz8UXX5wLLrggo0aNyg9+8IP1H4g20KVLlwwePDh77rlnTjrppDzyyCONno+Nrbmp/a/f5jvf+U6OOOKI3HrrrZkyZUqOPPLInH766Vm+fHmS5h3T+vPhrLPOyooVK5JkrblWrFiRb33rWznkkEMybty4LF68OPPnz8+ll17acN7VP1eTyuddpedZpXOppqYml156aUaNGpVJkya12vEAAD74Gn1HpbWNHDky06ZNy5gxY3L22WfnpptuyiuvvJITTjghTzzxRCZOnJjrr78+06ZNS/Le/7E96qij8vDDD+ecc87JrbfemjfffDNPPvlkw5hz587NFltska222qrhtn/5l3/JY4891jDOpvTQQw9l//33T+/evSt+f7fddnvfPi1btiyXXHJJTjnllFxyySVZvXp17r///vzTP/1TTjrppBx77LHZfvvts/fee1fcfsGCBTnllFNy++23Z8mSJTniiCNyzTXXZNGiRRUf5zUtWLAgX/nKV3L99denT58+6devX15++eV8+ctfzk9/+tN06dIlY8eOza9//etG97mxeSqNve6xmTVrVsP/cW9s3hUrVuS8887Lf//3f+fv//7vc/TRR2efffbJXnvt1UpHreWeeeaZ7L333k2ej5XW3NT+L1u2LBMnTsydd96Z448/PgceeGCOPPLI/Pu//3v++Z//OTfccENGjx693mP64osvZty4cbnrrruyZMmSjBo1KqNHj17r3Y1rr702nTp1yo033phnnnkmvXv3zksvvZTzzjsvt912W0488cQcddRRGTJkSKPn3br7Uul4L168OA888ED+8R//Mccee2yOPvrofPazn63qsQMA2o9NFlR69OiRd955J3fffXfeeuuths+gvPjii3n55ZfTr1+/te6/YsWKXH755Zk/f35eeOGFTbXMjbJ06dJsueWWDV9/9atfzbJlyzJq1KiceOKJje5Tz549G/7P/KxZs1JbW5vDDjssSXLyySfn7rvvzt57711x+9/85jc58sgjs+uuuyZJPv/5zydJsx7n//3f/82XvvSl7LPPPg23/fSnP82oUaOyxx57JEnGjh2bu+66q2HcdTU2T6Wx//a3vzX62E2bNq3ReYcPH57DDz+8Yf/mzJmzyX/ZfeWVV3LMMcfkpZdeyjbbbJPjjjsuM2bMaPT+lda8/fbbNznHzjvv3PA477TTTjn55JMzcODAfOELX8j06dObdUzvvffeHHHEEamtrW2Yu9I8V199dUaOHJkDDzyw4fba2tqGy9nGjRvX5Hm3rkrHe/HixRk2bFjDO4XVOnYAQPu0yYLKM888k+233z5vvvlm9tlnn5xxxhlJkm9961vZYost1rrvL3/5y1x66aW54oorstlmm+XYY4+tOOaqVZU/U1At2267bX72s581fP3Nb34zv/jFL/Lkk082uU8f+9jH1hqnZ8+eDf/u1atX3nzzzUa3X7JkST784Q833L/+3815nNfdNnnvl8s+ffo0fN2nT58sW7as0X1ubJ5KYzelqXnXXHfnzp2zevXqZo/bWvr27ZuLLrooP/rRj7LVVlulS5f3P3XWPB83ZM1r7n/nzp3Tq1evhn+/++67G3RMKx2DfffdN9dcc02+973v5cILL2z4nMmanx/r2bNnlixZ0uznYmPHu4RjBwC0T5ukR+WFF17IFVdckTFjxqS2tjaPP/54tttuuwwePDiDBw9+3y99f/jDH3Lsscdm+PDhWbRoUcPtPXv2zJtvvtnw9ezZs98312abbZaVK1e23c40Ye+9986sWbPy0EMPJXnvUq9BgwYlaXyfkveu41/TnDlz8s477yRJZsyYkR122KHR7YcOHbrW5T+zZs1KkmY9zkOHDs2jjz661m21tbUNny+oX/cuu+zS6D43Nk+lsZs6Nk3Nu+7jUw31n1H57ne/mx//+MdZuHBhk+djpTWv79xc334255gOGTJkrXd6nn668h+G2GWXXXLzzTdnyLoiBBcAAASHSURBVJAhefDBBxvWXx+2HnnkkSbPu3X3pdLxbs4+AQA0ps3eUXn11VdzyimnZMGCBZkxY0YuuOCC7Lbbbqmrq8s222yTz372s9lxxx2zcOHCTJ06da1tR44cmTPPPDOvv/565syZk+7duyd575ewJUuWZPz48Vm6dGkWLFjwvnl79uyZHj165MQTT8zXvva17Lfffm21i+/TrVu3/OxnP8vxxx+fHXbYIVtvvXWeeOKJjB49OgceeGDFfapk2223zeGHH57+/ftn+vTpuf/++/PEE09U3H7kyJG56KKLMnbs2Lzzzjt5/fXXkyT777//eh/ngw46KP/xH/+RL37xi+nbt2+OOeaYHH744bnyyiszZsyYdO3aNatWrcoXv/jFiqGwqXkqjT169Oi1js3WW2/dMM7f/d3ftWjeaunVq1fOOuusnHvuufnxj3+83vNxTeuem2vuf3M055iOHDky3//+9zN27NisXLmyIfCu6YorrsgDDzyQfv365dFHH82FF16YxYsX58Mf/nBGjx6dAQMG5PHHH8+//uu/ZsaMGRXPu3X3pdLx3nHHHVu0fwAAa6qpq6urW/fGCRMm5E/PvdKsP0+883Zb5cILL1zr9nfffTf33vveny4eOHBghgwZkq5d1/7TsLNnz87ixYszYsSI9OjRI8l7fzWo/hr3v/71r3n11VczfPjwPPPMMxkxYkSS5O23385TTz2VgQMHZvXq1enWrVt69OiR2bNnZ/fdd0/y3geTZ86cmZ122qnRD7ZXMmHChLz7wu+b9eeJO33sM+/b73qrVq3K008/nbfeeivbbrttBg4c2Og+LVu27H1rX7RoUbbaaqvMmzcvtbW1Db8cNvaYrF69OjNnzsyAAQNy/vnn59BDD234rEGlx3ldTz31VFatWpXddtstnTq99ybbzJkz07lz5+y4446pqalZa53rrrmpedYde81j07lz5/eN09S8SfLss89ms802y0c/+tEmj9GaJkyYkLeffrpZf564+/DhFc/nhx56qOHcXL16de67777sv//+Wbly5XrPxzXX3Nj+r7uf06dPz7Bhw7L55pvn5ZdfzhtvvNHQWbK+Y7p69er86U9/yjbbbJPly5dn8803z+abb94wfl1dXWbOnJlly5Zll112yeabb55Zs2blm9/8Zm677bbMnTs3w4cPX+95V+l5tubxfuuttzb62AEAHVfjQWXOc6nrM7jpjd94NjvvsF2jv7C3NxMmTMhLc6fncx95pcn73f+3rbL10N2L2O+6urqsXr264RKgz3zmM7n22muz0047VXll5ZgwYUIWPj0zn+7UdJ/Nw++uzoDhtUUc101t1qxZOe2006ry1/IAACpp9NKvmlXLU/O3yj0NH2R/W9k9/7Ngm/Xer2UX7bSdlStXZrfddss+++yTv/zlLxk8eLCQUsFrdcmvmvFB7gGbYC0AAKxfxXdUaF9ef/31zJo1K1tssUV22GGHai+HdqjS5XwAANUkqAAAAMXZJH+eGAAAoCUEFQAAoDiCCgAAUBxBBQAAKM7/A+i3vIfmxPdaAAAAAElFTkSuQmCC", + "image/svg+xml": [ + "\n", + "\n", + "DefaultGarbage collectionRuntime dispatchProfile Results\n" + ], + "text/plain": [ + "@vlplot(\n", + " mark={\n", + " type=\"rect\",\n", + " stroke=\"#505050\"\n", + " },\n", + " transform=[\n", + " {\n", + " calculate=\"datum.level+0.9\",\n", + " as=\"level2\"\n", + " }\n", + " ],\n", + " selection={\n", + " grid={\n", + " type=\"interval\",\n", + " bind=\"scales\"\n", + " },\n", + " highlight={\n", + " type=\"single\",\n", + " on=\"mouseover\",\n", + " empty=\"none\"\n", + " },\n", + " select={\n", + " type=\"multi\",\n", + " empty=\"none\"\n", + " }\n", + " },\n", + " width=800,\n", + " height=400,\n", + " title=\"Profile Results\",\n", + " encoding={\n", + " x={\n", + " axis=nothing,\n", + " field=\"x1\"\n", + " },\n", + " x2={\n", + " field=\"x2\"\n", + " },\n", + " y={\n", + " axis=nothing,\n", + " field=\"level\",\n", + " type=\"quantitative\"\n", + " },\n", + " y2={\n", + " field=\"level2\",\n", + " type=\"quantitative\"\n", + " },\n", + " fillOpacity={\n", + " condition=[\n", + " {\n", + " selection=\"highlight\",\n", + " value=0.6\n", + " },\n", + " {\n", + " selection=\"select\",\n", + " value=0.5\n", + " }\n", + " ],\n", + " value=1\n", + " },\n", + " strokeWidth={\n", + " condition=[\n", + " {\n", + " selection=\"highlight\",\n", + " value=0.5\n", + " },\n", + " {\n", + " selection=\"select\",\n", + " value=0.5\n", + " }\n", + " ],\n", + " value=0\n", + " },\n", + " color={\n", + " legend={\n", + " title=nothing,\n", + " orient=\"bottom\"\n", + " },\n", + " field=\"status\",\n", + " type=\"nominal\"\n", + " },\n", + " tooltip={\n", + " field=\"sf\"\n", + " }\n", + " },\n", + " data={\n", + " values=...\n", + " }\n", + ")" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "println(\"\\nImporting modules...\")\n", + "\n", + "include(\"src/nanoconc.jl\")\n", + "using CSV\n", + "using DataFrames\n", + "using Profile, ProfileVega\n", + "\n", + "println(\"Loading parameters...\")\n", + "\n", + "refmed = 1.333 # refractive index of the medium\n", + "wavel1, wavel2 = 250.0, 900.0 # wavelengths to calculate between\n", + "numval = 0x00001000 # number of values to calculate in spectrum\n", + "particledata = [2.5 1.0\n", + " 5.0 1.0\n", + " 10.0 1.0\n", + " 20.0 1.0\n", + " 30.0 1.0\n", + " 40.0 1.0\n", + " 50.0 1.0\n", + " 60.0 1.0\n", + " 70.0 1.0\n", + " 80.0 1.0\n", + " 90.0 1.0\n", + " 100.0 1.0]\n", + "materialdata = nanoconc.loadmaterial(\"Gold\", disp=false)\n", + "ppml = 10000.0 # particles per ml nanoconc.quantumcalc.numtomol(ppml) -> conc\n", + "d0 = 1.0 # path length\n", + "params = (refmed, wavel1, wavel2, numval, particledata, materialdata, ppml, d0)\n", + "spectrum = nanoconc.abspredict(params...)\n", + "\n", + "println(\"Calculating absorbance spectrum...\")\n", + "print(\"Calculation time: \")\n", + "\n", + "@time spectrum = nanoconc.abspredict(params...)\n", + "CSV.write(\"abs.csv\", DataFrame(spectrum, :auto), writeheader=false)\n", + "\n", + "ProfileVega.@profview nanoconc.abspredict(params...)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia 1.9.1", + "language": "julia", + "name": "julia-1.9" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.9.1" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/scratch.ipynb b/scratch.ipynb new file mode 100644 index 0000000..4f128a7 --- /dev/null +++ b/scratch.ipynb @@ -0,0 +1,1758 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Main.nanoconc" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "using Serialization\n", + "\n", + "include(\"src/nanoconc.jl\")" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MethodInstance for Main.nanoconc.abspredict(::Float64, ::Float64, ::Float64, ::UInt32, ::Matrix{Float64}, ::Tuple{Float64, Float64, Float64, Matrix{Float64}}, ::Float64, ::Float64)\n", + " from abspredict(\u001b[90mrefmed\u001b[39m::\u001b[1mFloat64\u001b[22m, \u001b[90mwavel1\u001b[39m::\u001b[1mFloat64\u001b[22m, \u001b[90mwavel2\u001b[39m::\u001b[1mFloat64\u001b[22m, \u001b[90mnumval\u001b[39m::\u001b[1mUInt32\u001b[22m, \u001b[90mparticledata\u001b[39m::\u001b[1mMatrix\u001b[22m\u001b[0m{Float64}, \u001b[90mmaterialdata\u001b[39m::\u001b[1mTuple\u001b[22m\u001b[0m{Float64, Float64, Float64, Matrix{Float64}}, \u001b[90mppml\u001b[39m::\u001b[1mFloat64\u001b[22m, \u001b[90md0\u001b[39m::\u001b[1mFloat64\u001b[22m)\u001b[90m @\u001b[39m \u001b[90mMain.nanoconc\u001b[39m \u001b[90m~/Programming/Work_Projects/nanoconc/src/\u001b[39m\u001b[90m\u001b[4mnanoconc.jl:264\u001b[24m\u001b[39m\n", + "Arguments\n", + " #self#\u001b[36m::Core.Const(Main.nanoconc.abspredict)\u001b[39m\n", + " refmed\u001b[36m::Float64\u001b[39m\n", + " wavel1\u001b[36m::Float64\u001b[39m\n", + " wavel2\u001b[36m::Float64\u001b[39m\n", + " numval\u001b[36m::UInt32\u001b[39m\n", + " particledata\u001b[36m::Matrix{Float64}\u001b[39m\n", + " materialdata\u001b[36m::Tuple{Float64, Float64, Float64, Matrix{Float64}}\u001b[39m\n", + " ppml\u001b[36m::Float64\u001b[39m\n", + " d0\u001b[36m::Float64\u001b[39m\n", + "Locals\n", + " predict\u001b[36m::Main.nanoconc.var\"#predict#22\"{Matrix{Float64}, Float64, Float64}\u001b[39m\n", + " data\u001b[36m::Matrix{Float64}\u001b[39m\n", + "Body\u001b[36m::Matrix{Float64}\u001b[39m\n", + "\u001b[90m1 ─\u001b[39m %1 = Core.apply_type(Main.nanoconc.Array, Main.nanoconc.Float64, 2)\u001b[36m::Core.Const(Matrix{Float64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m (data = Main.nanoconc.qpredict(refmed, wavel1, wavel2, numval, particledata, materialdata))\n", + "\u001b[90m│ \u001b[39m %3 = Main.nanoconc.:(var\"#predict#22\")\u001b[36m::Core.Const(Main.nanoconc.var\"#predict#22\")\u001b[39m\n", + "\u001b[90m│ \u001b[39m %4 = Core.typeof(particledata)\u001b[36m::Core.Const(Matrix{Float64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %5 = Core.typeof(ppml)\u001b[36m::Core.Const(Float64)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %6 = Core.typeof(d0)\u001b[36m::Core.Const(Float64)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %7 = Core.apply_type(%3, %4, %5, %6)\u001b[36m::Core.Const(Main.nanoconc.var\"#predict#22\"{Matrix{Float64}, Float64, Float64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m (predict = %new(%7, particledata, ppml, d0))\n", + "\u001b[90m│ \u001b[39m %9 = predict\u001b[36m::Main.nanoconc.var\"#predict#22\"{Matrix{Float64}, Float64, Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %10 = Base.getindex(data, Main.nanoconc.:(:), 2)\u001b[36m::Vector{Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %11 = Base.broadcasted(%9, %10)\u001b[36m::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1}, Nothing, Main.nanoconc.var\"#predict#22\"{Matrix{Float64}, Float64, Float64}, Tuple{Vector{Float64}}}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %12 = Base.materialize(%11)\u001b[36m::Vector{Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m Base.setindex!(data, %12, Main.nanoconc.:(:), 2)\n", + "\u001b[90m│ \u001b[39m %14 = Base.convert(%1, data)\u001b[36m::Matrix{Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %15 = Core.typeassert(%14, %1)\u001b[36m::Matrix{Float64}\u001b[39m\n", + "\u001b[90m└──\u001b[39m return %15\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: replacing module nanoconc.\n" + ] + } + ], + "source": [ + "include(\"src/nanoconc.jl\")\n", + "test_data = deserialize(\"test/data/Main.nanoconc.abspredict.ser\")\n", + "test_data = test_data[1]\n", + "args, kwargs = test_data[1]\n", + "@code_warntype nanoconc.abspredict(args..., kwargs...)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: replacing module nanoconc.\n" + ] + }, + { + "ename": "LoadError", + "evalue": "LoadError: UndefVarError: `@code_warntype` not defined\nin expression starting at /home/cianh/Programming/Work_Projects/nanoconc/src/miemfp.jl:318\nin expression starting at /home/cianh/Programming/Work_Projects/nanoconc/src/miemfp.jl:1\nin expression starting at /home/cianh/Programming/Work_Projects/nanoconc/src/nanoconc.jl:1", + "output_type": "error", + "traceback": [ + "LoadError: UndefVarError: `@code_warntype` not defined\n", + "in expression starting at /home/cianh/Programming/Work_Projects/nanoconc/src/miemfp.jl:318\n", + "in expression starting at /home/cianh/Programming/Work_Projects/nanoconc/src/miemfp.jl:1\n", + "in expression starting at /home/cianh/Programming/Work_Projects/nanoconc/src/nanoconc.jl:1\n" + ] + } + ], + "source": [ + "include(\"src/nanoconc.jl\")\n", + "test_data = deserialize(\"test/data/Main.nanoconc.miemfp.mfp.ser\")\n", + "test_data = test_data[1]\n", + "args, kwargs = test_data[1]\n", + "@code_warntype nanoconc.miemfp.mfp(args..., kwargs...)" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MethodInstance for Main.nanoconc.miemfp.qbare(::Float64, ::Float64, ::UInt32, ::UInt32, ::Float64, ::Float64, ::Float64, ::Float64, ::Float64, ::Matrix{Float64})\n", + " from qbare(\u001b[90mwavel1\u001b[39m::\u001b[1mFloat64\u001b[22m, \u001b[90mwavel2\u001b[39m::\u001b[1mFloat64\u001b[22m, \u001b[90mnumval\u001b[39m::\u001b[1mUInt32\u001b[22m, \u001b[90mscangles\u001b[39m::\u001b[1mUInt32\u001b[22m, \u001b[90mrefmed\u001b[39m::\u001b[1mFloat64\u001b[22m, \u001b[90mradcore\u001b[39m::\u001b[1mFloat64\u001b[22m, \u001b[90momp\u001b[39m::\u001b[1mFloat64\u001b[22m, \u001b[90mom0\u001b[39m::\u001b[1mFloat64\u001b[22m, \u001b[90mfv\u001b[39m::\u001b[1mFloat64\u001b[22m, \u001b[90mrefcore\u001b[39m::\u001b[1mMatrix\u001b[22m\u001b[0m{Float64})\u001b[90m @\u001b[39m \u001b[90mMain.nanoconc.miemfp\u001b[39m \u001b[90m~/Programming/Work_Projects/nanoconc/src/\u001b[39m\u001b[90m\u001b[4mmiemfp.jl:320\u001b[24m\u001b[39m\n", + "Arguments\n", + " #self#\u001b[36m::Core.Const(Main.nanoconc.miemfp.qbare)\u001b[39m\n", + " wavel1\u001b[36m::Float64\u001b[39m\n", + " wavel2\u001b[36m::Float64\u001b[39m\n", + " numval\u001b[36m::UInt32\u001b[39m\n", + " scangles\u001b[36m::UInt32\u001b[39m\n", + " refmed\u001b[36m::Float64\u001b[39m\n", + " radcore\u001b[36m::Float64\u001b[39m\n", + " omp\u001b[36m::Float64\u001b[39m\n", + " om0\u001b[36m::Float64\u001b[39m\n", + " fv\u001b[36m::Float64\u001b[39m\n", + " refcore\u001b[36m::Matrix{Float64}\u001b[39m\n", + "Locals\n", + " interp_pair\u001b[36m::Main.nanoconc.miemfp.InterpolationPair\u001b[39m\n", + " qarray\u001b[36m::Matrix{Float64}\u001b[39m\n", + " wavelengths\u001b[36m::StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}\u001b[39m\n", + " interp_ref_rn\u001b[36m::Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}\u001b[39m\n", + " interp_ref_rk\u001b[36m::Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}\u001b[39m\n", + " map_fn\u001b[36m::Main.nanoconc.miemfp._bhmie\u001b[39m\n", + " threadsfor_fun\u001b[36m::Main.nanoconc.miemfp.var\"#957#threadsfor_fun#20\"{Main.nanoconc.miemfp.var\"#957#threadsfor_fun#19#21\"{Float64, Float64, Matrix{Float64}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Main.nanoconc.miemfp._bhmie, Main.nanoconc.miemfp._mfp, UnitRange{UInt32}}}\u001b[39m\n", + " val\u001b[36m::Nothing\u001b[39m\n", + " mfp_fn\u001b[36m::Main.nanoconc.miemfp._mfp\u001b[39m\n", + " threadsfor_fun#19\u001b[36m::Main.nanoconc.miemfp.var\"#957#threadsfor_fun#19#21\"{Float64, Float64, Matrix{Float64}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Main.nanoconc.miemfp._bhmie, Main.nanoconc.miemfp._mfp, UnitRange{UInt32}}\u001b[39m\n", + " range\u001b[36m::UnitRange{UInt32}\u001b[39m\n", + "Body\u001b[36m::Matrix{Float64}\u001b[39m\n", + "\u001b[90m1 ─\u001b[39m %1 = Core.apply_type(Main.nanoconc.miemfp.Matrix, Main.nanoconc.miemfp.Float64)\u001b[36m::Core.Const(Matrix{Float64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %2 = Main.nanoconc.miemfp._calc_delta_wl(wavel1, wavel2, numval)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %3 = (wavel1:%2:wavel2)\u001b[36m::StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %4 = Core.apply_type(Main.nanoconc.miemfp.StepRangeLen, Main.nanoconc.miemfp.Float64)\u001b[36m::Core.Const(StepRangeLen{Float64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %5 = Base.convert(%4, %3)\u001b[36m::StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m (wavelengths = Core.typeassert(%5, %4))\n", + "\u001b[90m│ \u001b[39m %7 = wavelengths\u001b[36m::StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %8 = Core.apply_type(Main.nanoconc.miemfp.Vector, Main.nanoconc.miemfp.Float64)\u001b[36m::Core.Const(Vector{Float64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %9 = Main.nanoconc.miemfp.undef\u001b[36m::Core.Const(UndefInitializer())\u001b[39m\n", + "\u001b[90m│ \u001b[39m %10 = (%8)(%9, numval)\u001b[36m::Vector{Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %11 = Main.nanoconc.miemfp.hcat(%7, %10)\u001b[36m::Matrix{Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %12 = Core.apply_type(Main.nanoconc.miemfp.Matrix, Main.nanoconc.miemfp.Float64)\u001b[36m::Core.Const(Matrix{Float64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %13 = Base.convert(%12, %11)\u001b[36m::Matrix{Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m (qarray = Core.typeassert(%13, %12))\n", + "\u001b[90m│ \u001b[39m %15 = Main.nanoconc.miemfp._get_rnrk_interp_objects(refcore)\u001b[36m::Main.nanoconc.miemfp.InterpolationPair\u001b[39m\n", + "\u001b[90m│ \u001b[39m %16 = Base.convert(Main.nanoconc.miemfp.InterpolationPair, %15)\u001b[36m::Main.nanoconc.miemfp.InterpolationPair\u001b[39m\n", + "\u001b[90m│ \u001b[39m (interp_pair = Core.typeassert(%16, Main.nanoconc.miemfp.InterpolationPair))\n", + "\u001b[90m│ \u001b[39m %18 = Base.getproperty(interp_pair, :rn)\u001b[36m::Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}\u001b[39m\n", + "\u001b[90m│ \u001b[39m (interp_ref_rn = %18)\n", + "\u001b[90m│ \u001b[39m %20 = Base.getproperty(interp_pair, :rk)\u001b[36m::Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}\u001b[39m\n", + "\u001b[90m│ \u001b[39m (interp_ref_rk = %20)\n", + "\u001b[90m│ \u001b[39m %22 = Main.nanoconc.miemfp._bhmie(scangles)\u001b[36m::Main.nanoconc.miemfp._bhmie\u001b[39m\n", + "\u001b[90m│ \u001b[39m (map_fn = %22)\n", + "\u001b[90m│ \u001b[39m %24 = Main.nanoconc.miemfp._mfp(fv, radcore, omp, om0)\u001b[36m::Main.nanoconc.miemfp._mfp\u001b[39m\n", + "\u001b[90m│ \u001b[39m Core.NewvarNode(:(val))\n", + "\u001b[90m│ \u001b[39m (mfp_fn = %24)\n", + "\u001b[90m│ \u001b[39m nothing\n", + "\u001b[90m│ \u001b[39m %28 = (0x00000001:numval)\u001b[36m::Core.PartialStruct(UnitRange{UInt32}, Any[Core.Const(0x00000001), UInt32])\u001b[39m\n", + "\u001b[90m│ \u001b[39m (range = %28)\n", + "\u001b[90m│ \u001b[39m %30 = Main.nanoconc.miemfp.:(var\"#957#threadsfor_fun#19#21\")\u001b[36m::Core.Const(Main.nanoconc.miemfp.var\"#957#threadsfor_fun#19#21\")\u001b[39m\n", + "\u001b[90m│ \u001b[39m %31 = Core.typeof(refmed)\u001b[36m::Core.Const(Float64)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %32 = Core.typeof(radcore)\u001b[36m::Core.Const(Float64)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %33 = Core.typeof(qarray)\u001b[36m::Core.Const(Matrix{Float64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %34 = Core.typeof(interp_ref_rn)\u001b[36m::Core.Const(Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %35 = Core.typeof(interp_ref_rk)\u001b[36m::Core.Const(Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %36 = Core.typeof(map_fn)\u001b[36m::Core.Const(Main.nanoconc.miemfp._bhmie)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %37 = Core.typeof(mfp_fn)\u001b[36m::Core.Const(Main.nanoconc.miemfp._mfp)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %38 = Core.typeof(range::Core.PartialStruct(UnitRange{UInt32}, Any[Core.Const(0x00000001), UInt32]))\u001b[36m::Core.Const(UnitRange{UInt32})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %39 = Core.apply_type(%30, %31, %32, %33, %34, %35, %36, %37, %38)\u001b[36m::Core.Const(Main.nanoconc.miemfp.var\"#957#threadsfor_fun#19#21\"{Float64, Float64, Matrix{Float64}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Main.nanoconc.miemfp._bhmie, Main.nanoconc.miemfp._mfp, UnitRange{UInt32}})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %40 = qarray\u001b[36m::Matrix{Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %41 = interp_ref_rn\u001b[36m::Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}\u001b[39m\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[90m│ \u001b[39m %42 = interp_ref_rk\u001b[36m::Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %43 = map_fn\u001b[36m::Main.nanoconc.miemfp._bhmie\u001b[39m\n", + "\u001b[90m│ \u001b[39m %44 = mfp_fn\u001b[36m::Main.nanoconc.miemfp._mfp\u001b[39m\n", + "\u001b[90m│ \u001b[39m (threadsfor_fun#19 = %new(%39, refmed, radcore, %40, %41, %42, %43, %44, range::Core.PartialStruct(UnitRange{UInt32}, Any[Core.Const(0x00000001), UInt32])))\n", + "\u001b[90m│ \u001b[39m %46 = Main.nanoconc.miemfp.:(var\"#957#threadsfor_fun#20\")\u001b[36m::Core.Const(Main.nanoconc.miemfp.var\"#957#threadsfor_fun#20\")\u001b[39m\n", + "\u001b[90m│ \u001b[39m %47 = Core.typeof(threadsfor_fun#19::Core.PartialStruct(Main.nanoconc.miemfp.var\"#957#threadsfor_fun#19#21\"{Float64, Float64, Matrix{Float64}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Main.nanoconc.miemfp._bhmie, Main.nanoconc.miemfp._mfp, UnitRange{UInt32}}, Any[Float64, Float64, Matrix{Float64}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Main.nanoconc.miemfp._bhmie, Main.nanoconc.miemfp._mfp, Core.PartialStruct(UnitRange{UInt32}, Any[Core.Const(0x00000001), UInt32])]))\u001b[36m::Core.Const(Main.nanoconc.miemfp.var\"#957#threadsfor_fun#19#21\"{Float64, Float64, Matrix{Float64}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Main.nanoconc.miemfp._bhmie, Main.nanoconc.miemfp._mfp, UnitRange{UInt32}})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %48 = Core.apply_type(%46, %47)\u001b[36m::Core.Const(Main.nanoconc.miemfp.var\"#957#threadsfor_fun#20\"{Main.nanoconc.miemfp.var\"#957#threadsfor_fun#19#21\"{Float64, Float64, Matrix{Float64}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Main.nanoconc.miemfp._bhmie, Main.nanoconc.miemfp._mfp, UnitRange{UInt32}}})\u001b[39m\n", + "\u001b[90m│ \u001b[39m (threadsfor_fun = %new(%48, threadsfor_fun#19::Core.PartialStruct(Main.nanoconc.miemfp.var\"#957#threadsfor_fun#19#21\"{Float64, Float64, Matrix{Float64}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Main.nanoconc.miemfp._bhmie, Main.nanoconc.miemfp._mfp, UnitRange{UInt32}}, Any[Float64, Float64, Matrix{Float64}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Main.nanoconc.miemfp._bhmie, Main.nanoconc.miemfp._mfp, Core.PartialStruct(UnitRange{UInt32}, Any[Core.Const(0x00000001), UInt32])])))\n", + "\u001b[90m│ \u001b[39m %50 = threadsfor_fun\u001b[36m::Core.PartialStruct(Main.nanoconc.miemfp.var\"#957#threadsfor_fun#20\"{Main.nanoconc.miemfp.var\"#957#threadsfor_fun#19#21\"{Float64, Float64, Matrix{Float64}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Main.nanoconc.miemfp._bhmie, Main.nanoconc.miemfp._mfp, UnitRange{UInt32}}}, Any[Core.PartialStruct(Main.nanoconc.miemfp.var\"#957#threadsfor_fun#19#21\"{Float64, Float64, Matrix{Float64}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Main.nanoconc.miemfp._bhmie, Main.nanoconc.miemfp._mfp, UnitRange{UInt32}}, Any[Float64, Float64, Matrix{Float64}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Main.nanoconc.miemfp._bhmie, Main.nanoconc.miemfp._mfp, Core.PartialStruct(UnitRange{UInt32}, Any[Core.Const(0x00000001), UInt32])])])\u001b[39m\n", + "\u001b[90m│ \u001b[39m Core.ifelse(false, false, %50)\n", + "\u001b[90m└──\u001b[39m goto #3 if not true\n", + "\u001b[90m2 ─\u001b[39m Base.Threads.threading_run(threadsfor_fun::Core.PartialStruct(Main.nanoconc.miemfp.var\"#957#threadsfor_fun#20\"{Main.nanoconc.miemfp.var\"#957#threadsfor_fun#19#21\"{Float64, Float64, Matrix{Float64}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Main.nanoconc.miemfp._bhmie, Main.nanoconc.miemfp._mfp, UnitRange{UInt32}}}, Any[Core.PartialStruct(Main.nanoconc.miemfp.var\"#957#threadsfor_fun#19#21\"{Float64, Float64, Matrix{Float64}, Interpolations." + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Main.nanoconc.miemfp._bhmie, Main.nanoconc.miemfp._mfp, UnitRange{UInt32}}, Any[Float64, Float64, Matrix{Float64}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Interpolations.Extrapolation{Float64, 1, Interpolations.GriddedInterpolation{Float64, 1, Vector{Float64}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Tuple{Vector{Float64}}}, Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}}, Interpolations.Throw{Nothing}}, Main.nanoconc.miemfp._bhmie, Main.nanoconc.miemfp._mfp, Core.PartialStruct(UnitRange{UInt32}, Any[Core.Const(0x00000001), UInt32])])]), false)\n", + "\u001b[90m└──\u001b[39m goto #4\n", + "\u001b[90m3 ─\u001b[39m Core.Const(:($(Expr(:foreigncall, :(:jl_in_threaded_region), Int32, svec(), 0, :(:ccall)))))\n", + "\u001b[90m│ \u001b[39m Core.Const(:(%55 != 0))\n", + "\u001b[90m│ \u001b[39m Core.Const(:(goto %60 if not %56))\n", + "\u001b[90m│ \u001b[39m Core.Const(:(Base.Threads.error(\"`@threads :static` cannot be used concurrently or nested\")))\n", + "\u001b[90m│ \u001b[39m Core.Const(:(goto %61))\n", + "\u001b[90m└──\u001b[39m Core.Const(:(Base.Threads.threading_run(threadsfor_fun, true)))\n", + "\u001b[90m4 ┄\u001b[39m (val = Base.Threads.nothing)\n", + "\u001b[90m│ \u001b[39m nothing\n", + "\u001b[90m│ \u001b[39m val\n", + "\u001b[90m│ \u001b[39m %64 = Base.convert(%1, qarray)\u001b[36m::Matrix{Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %65 = Core.typeassert(%64, %1)\u001b[36m::Matrix{Float64}\u001b[39m\n", + "\u001b[90m└──\u001b[39m return %65\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: replacing module nanoconc.\n" + ] + } + ], + "source": [ + "include(\"src/nanoconc.jl\")\n", + "test_data = deserialize(\"test/data/Main.nanoconc.miemfp.qbare.ser\")\n", + "# test_data = test_data[1]\n", + "args, kwargs = test_data[1][1]\n", + "@code_warntype nanoconc.miemfp.qbare(args..., kwargs...)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MethodInstance for Distributed.pmap(::Main.miemfp._bhmie, ::Vector{Float64}, ::Vector{ComplexF64})\n", + " from pmap(\u001b[90mf\u001b[39m, \u001b[90mc1\u001b[39m, \u001b[90mc...\u001b[39m; kwargs...)\u001b[90m @\u001b[39m \u001b[90mDistributed\u001b[39m \u001b[90m/usr/share/julia/stdlib/v1.9/Distributed/src/\u001b[39m\u001b[90m\u001b[4mpmap.jl:157\u001b[24m\u001b[39m\n", + "Arguments\n", + " #self#\u001b[36m::Core.Const(Distributed.pmap)\u001b[39m\n", + " f\u001b[36m::Main.miemfp._bhmie\u001b[39m\n", + " c1\u001b[36m::Vector{Float64}\u001b[39m\n", + " c\u001b[36m::Tuple{Vector{ComplexF64}}\u001b[39m\n", + "Body\u001b[91m\u001b[1m::Any\u001b[22m\u001b[39m\n", + "\u001b[90m1 ─\u001b[39m %1 = Distributed.:(var\"#pmap#234\")\u001b[36m::Core.Const(Distributed.var\"#pmap#234\")\u001b[39m\n", + "\u001b[90m│ \u001b[39m %2 = Core.NamedTuple()\u001b[36m::Core.Const(NamedTuple())\u001b[39m\n", + "\u001b[90m│ \u001b[39m %3 = Base.pairs(%2)\u001b[36m::Core.Const(Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}())\u001b[39m\n", + "\u001b[90m│ \u001b[39m %4 = Core.tuple(%3, #self#, f, c1)\u001b[36m::Tuple{Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, typeof(pmap), Main.miemfp._bhmie, Vector{Float64}}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %5 = Core._apply_iterate(Base.iterate, %1, %4, c)\u001b[91m\u001b[1m::Any\u001b[22m\u001b[39m\n", + "\u001b[90m└──\u001b[39m return %5\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: replacing module miemfp.\n" + ] + } + ], + "source": [ + "include(\"src/miemfp.jl\")\n", + "using Distributed\n", + "test_data = deserialize(\"test/data/Main.nanoconc.miemfp.qbare.ser\")\n", + "# test_data = test_data[1]\n", + "args, kwargs = test_data[1][1]\n", + "\n", + "function qbare(wavel1::Float64, wavel2::Float64, numval::UInt32, scangles::UInt32,\n", + " refmed::Float64, radcore::Float64, omp::Float64, om0::Float64,\n", + " fv::Float64, refcore::Array{Float64,2})\n", + "\n", + " # calculate the new wavelengths\n", + " let wavelengths::StepRangeLen{Float64} = wavel1:miemfp._calc_delta_wl(wavel1, wavel2, numval):wavel2,\n", + " interp_pair::miemfp.InterpolationPair = miemfp._get_rnrk_interp_objects(refcore)\n", + "\n", + " let interp_ref_rn = interp_pair.rn, interp_ref_rk = interp_pair.rk, map_fn = miemfp._bhmie(scangles)\n", + " # @code_warntype miemfp._bhmie(scangles)(\n", + " # first(miemfp._calc_apparent_cross_section(radcore, refmed) ./ wavelengths),\n", + " # first(miemfp._mfp(fv, radcore, omp, om0).(wavelengths, interp_ref_rn(wavelengths), interp_ref_rk(wavelengths)) ./ refmed)\n", + " # )\n", + " # @code_warntype map_fn.(\n", + " # miemfp._calc_apparent_cross_section(radcore, refmed) ./ wavelengths,\n", + " # miemfp._mfp(fv, radcore, omp, om0).(wavelengths, interp_ref_rn(wavelengths), interp_ref_rk(wavelengths)) ./ refmed,\n", + " # )\n", + " @code_warntype pmap(\n", + " map_fn,\n", + " miemfp._calc_apparent_cross_section(radcore, refmed) ./ wavelengths,\n", + " miemfp._mfp(fv, radcore, omp, om0).(wavelengths, interp_ref_rn(wavelengths), interp_ref_rk(wavelengths)) ./ refmed\n", + " )\n", + " # return hcat(\n", + " # wavelengths,\n", + " # # _bhmie(scangles).(\n", + " # # _calc_apparent_cross_section(radcore, refmed) ./ wavelengths,\n", + " # # _mfp(fv, radcore, omp, om0).(wavelengths, interp_ref_rn(wavelengths), interp_ref_rk(wavelengths)) ./ refmed,\n", + " # # )\n", + " # pmap(\n", + " # @code_warntype miemfp._bhmie(scangles), # _bhmie(scangles),\n", + " # _calc_apparent_cross_section(radcore, refmed) ./ wavelengths,\n", + " # _mfp(fv, radcore, omp, om0).(wavelengths, interp_ref_rn(wavelengths), interp_ref_rk(wavelengths)) ./ refmed\n", + " # )::Vector{Float64}\n", + " # )\n", + " end\n", + " end\n", + "end\n", + "\n", + "qbare(args..., kwargs...)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "ename": "ErrorException", + "evalue": "type DataType has no field typedict", + "output_type": "error", + "traceback": [ + "type DataType has no field typedict\n", + "\n", + "Stacktrace:\n", + " [1] getproperty(x::Type, f::Symbol)\n", + " @ Base ./Base.jl:32\n", + " [2] top-level scope\n", + " @ ~/Programming/Work_Projects/nanoconc/scratch.ipynb:1" + ] + } + ], + "source": [ + "miemfp._bhmie.typedict" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "test (generic function with 1 method)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "function test()\n", + " return 0\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "metadata": {}, + "outputs": [ + { + "ename": "UndefVarError", + "evalue": "UndefVarError: `type` not defined", + "output_type": "error", + "traceback": [ + "UndefVarError: `type` not defined\n", + "\n", + "Stacktrace:\n", + " [1] top-level scope\n", + " @ ~/Programming/Work_Projects/nanoconc/scratch.ipynb:1" + ] + } + ], + "source": [ + "type(0)" + ] + }, + { + "cell_type": "code", + "execution_count": 149, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "method3 (generic function with 1 method)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "function method1(nn::Int64, y::ComplexF64)::Vector{ComplexF64}\n", + " d::Vector{ComplexF64} = fill(ComplexF64(0.0, 0.0), nn + 1)\n", + " @inbounds @simd for n in (nn:-1:2)::StepRange{Int64,Int64}\n", + " d[n-1] = let n_over_y = n / y\n", + " (n_over_y) - (1.0 / (d[n] + n_over_y))\n", + " end\n", + " end\n", + " return d\n", + "end\n", + "\n", + "function method2(nn::Int64, y::ComplexF64)::Vector{ComplexF64}\n", + " @memoize d_generator(n::Int64)::ComplexF64 =\n", + " if n == nn + 1\n", + " ComplexF64(0.0, 0.0)\n", + " else\n", + " let n_over_y = n / y\n", + " (n_over_y) - (1.0 / (d_generator(n + 1) + n_over_y))\n", + " end\n", + " end\n", + " d_generator.(2:nn+1)\n", + "end\n", + "\n", + "function method3(nn::Int64, y::ComplexF64)::Vector{ComplexF64}\n", + " d_values = Vector{ComplexF64}(undef, nn)\n", + " d_values[nn] = ComplexF64(0.0, 0.0)\n", + " for n in nn:-1:2\n", + " n_over_y = n / y\n", + " d_values[n-1] = n_over_y - (1.0 / (d_values[n] + n_over_y))\n", + " end\n", + " return d_values\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 151, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "10:-1:1" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "reverse(1:10)" + ] + }, + { + "cell_type": "code", + "execution_count": 158, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "true" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "cot(0.5) == cos(0.5) / sin(0.5)" + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "101-element Vector{ComplexF64}:\n", + " 0.8123382644430177 - 1.2103254935120225im\n", + " 1.3618993272451057 - 1.6471440230163505im\n", + " 1.8912072404172218 - 2.113276215698099im\n", + " 2.410392314803969 - 2.5921488992550263im\n", + " 2.92387985431671 - 3.0776974617009216im\n", + " 3.4338634265187062 - 3.567182086734182im\n", + " 3.9415447299890984 - 4.059183628220866im\n", + " 4.447634627099904 - 4.552892955977411im\n", + " 4.952579621422096 - 5.047814712266423im\n", + " 5.456673934482986 - 5.543628508147122im\n", + " ⋮\n", + " 46.99470928787974 - 47.00529129839747im\n", + " 47.49476468199356 - 47.50523588612103im\n", + " 47.99481892822597 - 48.005181622468555im\n", + " 48.49487206188903 - 48.505128472090405im\n", + " 48.99492411687428 - 49.00507640105976im\n", + " 49.494975379460364 - 49.50502563061513im\n", + " 49.99 - 50.01im\n", + " 0.0 + 0.0im\n", + " 0.0 + 0.0im" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "method1(100, ComplexF64(1.0, 1.0))" + ] + }, + { + "cell_type": "code", + "execution_count": 148, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "100-element Vector{ComplexF64}:\n", + " 0.8123382644430177 - 1.2103254935120225im\n", + " 1.3618993272451057 - 1.6471440230163505im\n", + " 1.8912072404172218 - 2.113276215698099im\n", + " 2.410392314803969 - 2.5921488992550263im\n", + " 2.92387985431671 - 3.0776974617009216im\n", + " 3.4338634265187062 - 3.567182086734182im\n", + " 3.9415447299890984 - 4.059183628220866im\n", + " 4.447634627099904 - 4.552892955977411im\n", + " 4.952579621422096 - 5.047814712266423im\n", + " 5.456673934482986 - 5.543628508147122im\n", + " ⋮\n", + " 46.49465270906219 - 46.50534789616018im\n", + " 46.99470928787974 - 47.00529129839747im\n", + " 47.49476468199356 - 47.50523588612103im\n", + " 47.99481892822597 - 48.005181622468555im\n", + " 48.49487206188903 - 48.505128472090405im\n", + " 48.99492411687428 - 49.00507640105976im\n", + " 49.494975379460364 - 49.50502563061513im\n", + " 49.99 - 50.01im\n", + " 0.0 + 0.0im" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "method2(100, ComplexF64(1.0, 1.0))" + ] + }, + { + "cell_type": "code", + "execution_count": 150, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "100-element Vector{ComplexF64}:\n", + " 0.8123382644430177 - 1.2103254935120225im\n", + " 1.3618993272451057 - 1.6471440230163505im\n", + " 1.8912072404172218 - 2.113276215698099im\n", + " 2.410392314803969 - 2.5921488992550263im\n", + " 2.92387985431671 - 3.0776974617009216im\n", + " 3.4338634265187062 - 3.567182086734182im\n", + " 3.9415447299890984 - 4.059183628220866im\n", + " 4.447634627099904 - 4.552892955977411im\n", + " 4.952579621422096 - 5.047814712266423im\n", + " 5.456673934482986 - 5.543628508147122im\n", + " ⋮\n", + " 46.49465270906219 - 46.50534789616018im\n", + " 46.99470928787974 - 47.00529129839747im\n", + " 47.49476468199356 - 47.50523588612103im\n", + " 47.99481892822597 - 48.005181622468555im\n", + " 48.49487206188903 - 48.505128472090405im\n", + " 48.99492411687428 - 49.00507640105976im\n", + " 49.494975379460364 - 49.50502563061513im\n", + " 49.99 - 50.01im\n", + " 0.0 + 0.0im" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "method3(100, ComplexF64(1.0, 1.0))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MethodInstance for Main.nanoconc.miemfp.bhmie(::Float64, ::ComplexF64, ::UInt32)\n", + " from bhmie(\u001b[90mx\u001b[39m::\u001b[1mFloat64\u001b[22m, \u001b[90mrefrel\u001b[39m::\u001b[1mComplexF64\u001b[22m, \u001b[90mnang\u001b[39m::\u001b[1mUInt32\u001b[22m)\u001b[90m @\u001b[39m \u001b[90mMain.nanoconc.miemfp\u001b[39m \u001b[90m~/Programming/Work_Projects/nanoconc/src/\u001b[39m\u001b[90m\u001b[4mmiemfp.jl:141\u001b[24m\u001b[39m\n", + "Arguments\n", + " #self#\u001b[36m::Core.Const(Main.nanoconc.miemfp.bhmie)\u001b[39m\n", + " x\u001b[36m::Float64\u001b[39m\n", + " refrel\u001b[36m::ComplexF64\u001b[39m\n", + " nang\u001b[36m::UInt32\u001b[39m\n", + "Locals\n", + " @_5\u001b[36m::Int64\u001b[39m\n", + " val@_6\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + " val@_7\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + " val@_8\u001b[36m::Nothing\u001b[39m\n", + " val@_9\u001b[36m::Nothing\u001b[39m\n", + " val@_10\u001b[36m::Nothing\u001b[39m\n", + " qback\u001b[36m::Float64\u001b[39m\n", + " qext\u001b[36m::Float64\u001b[39m\n", + " qsca\u001b[36m::Float64\u001b[39m\n", + " x_sq\u001b[36m::Float64\u001b[39m\n", + " s2\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + " s1\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + " tau\u001b[36m::Vector{Float64}\u001b[39m\n", + " pi1\u001b[36m::Vector{Float64}\u001b[39m\n", + " pi0\u001b[36m::Vector{Float64}\u001b[39m\n", + " s2_2\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + " s2_1\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + " s1_2\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + " s1_1\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + " chi0\u001b[36m::Float64\u001b[39m\n", + " chi1\u001b[36m::Float64\u001b[39m\n", + " xi1\u001b[36m::ComplexF64\u001b[39m\n", + " p\u001b[36m::Float64\u001b[39m\n", + " psi1\u001b[36m::Float64\u001b[39m\n", + " psi0\u001b[36m::Float64\u001b[39m\n", + " d\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + " amu\u001b[36m::Vector{Float64}\u001b[39m\n", + " dang\u001b[36m::Float64\u001b[39m\n", + " nn\u001b[36m::UInt32\u001b[39m\n", + " nstop\u001b[36m::UInt32\u001b[39m\n", + " y\u001b[36m::ComplexF64\u001b[39m\n", + " @_36\u001b[33m\u001b[1m::Union{Nothing, Tuple{Int64, Int64}}\u001b[22m\u001b[39m\n", + " r#452\u001b[36m::UnitRange{Int64}\u001b[39m\n", + " i#453\u001b[36m::Int64\u001b[39m\n", + " n#454\u001b[36m::Int64\u001b[39m\n", + " i#455\u001b[36m::Int64\u001b[39m\n", + " i\u001b[36m::Int64\u001b[39m\n", + " @_42\u001b[33m\u001b[1m::Union{Nothing, Tuple{Int64, Int64}}\u001b[22m\u001b[39m\n", + " r#456\u001b[36m::StepRange{Int64, Int64}\u001b[39m\n", + " i#457\u001b[36m::Int64\u001b[39m\n", + " n#458\u001b[36m::Int64\u001b[39m\n", + " i#459\u001b[36m::Int64\u001b[39m\n", + " n@_47\u001b[36m::Int64\u001b[39m\n", + " n_over_y\u001b[36m::ComplexF64\u001b[39m\n", + " @_49\u001b[33m\u001b[1m::Union{Nothing, Tuple{Int64, Int64}}\u001b[22m\u001b[39m\n", + " r#460\u001b[36m::UnitRange{Int64}\u001b[39m\n", + " i#461\u001b[36m::Int64\u001b[39m\n", + " n#462\u001b[36m::Int64\u001b[39m\n", + " i#463\u001b[36m::Int64\u001b[39m\n", + " pi_\u001b[36m::Vector{Float64}\u001b[39m\n", + " bn\u001b[36m::ComplexF64\u001b[39m\n", + " an\u001b[36m::ComplexF64\u001b[39m\n", + " xi\u001b[36m::ComplexF64\u001b[39m\n", + " chi\u001b[36m::Float64\u001b[39m\n", + " psi\u001b[36m::Float64\u001b[39m\n", + " fn\u001b[36m::Float64\u001b[39m\n", + " n@_61\u001b[36m::Int64\u001b[39m\n", + " an_mult\u001b[36m::ComplexF64\u001b[39m\n", + " bn_mult\u001b[36m::ComplexF64\u001b[39m\n", + " four_over_x_sq\u001b[36m::Float64\u001b[39m\n", + " @_65\u001b[36m::Float64\u001b[39m\n", + "Body\u001b[36m::Tuple{Float64, Float64, Float64, Vector{ComplexF64}, Vector{ComplexF64}}\u001b[39m\n", + "\u001b[90m1 ──\u001b[39m Core.NewvarNode(:(@_5))\n", + "\u001b[90m│ \u001b[39m Core.NewvarNode(:(val@_6))\n", + "\u001b[90m│ \u001b[39m Core.NewvarNode(:(val@_7))\n", + "\u001b[90m│ \u001b[39m Core.NewvarNode(:(val@_8))\n", + "\u001b[90m│ \u001b[39m Core.NewvarNode(:(val@_9))\n", + "\u001b[90m│ \u001b[39m Core.NewvarNode(:(val@_10))\n", + "\u001b[90m│ \u001b[39m Core.NewvarNode(:(qback))\n", + "\u001b[90m│ \u001b[39m Core.NewvarNode(:(qext))\n", + "\u001b[90m│ \u001b[39m Core.NewvarNode(:(qsca))\n", + "\u001b[90m│ \u001b[39m Core.NewvarNode(:(x_sq))\n", + "\u001b[90m│ \u001b[39m Core.NewvarNode(:(s2))\n", + "\u001b[90m│ \u001b[39m Core.NewvarNode(:(s1))\n", + "\u001b[90m│ \u001b[39m Core.NewvarNode(:(tau))\n", + "\u001b[90m│ \u001b[39m Core.NewvarNode(:(pi1))\n", + "\u001b[90m│ \u001b[39m Core.NewvarNode(:(pi0))\n", + "\u001b[90m│ \u001b[39m Core.NewvarNode(:(s2_2))\n", + "\u001b[90m│ \u001b[39m Core.NewvarNode(:(s2_1))\n", + "\u001b[90m│ \u001b[39m Core.NewvarNode(:(s1_2))\n", + "\u001b[90m│ \u001b[39m Core.NewvarNode(:(s1_1))\n", + "\u001b[90m│ \u001b[39m Core.NewvarNode(:(chi0))\n", + "\u001b[90m│ \u001b[39m Core.NewvarNode(:(chi1))\n", + "\u001b[90m│ \u001b[39m Core.NewvarNode(:(xi1))\n", + "\u001b[90m│ \u001b[39m Core.NewvarNode(:(p))\n", + "\u001b[90m│ \u001b[39m Core.NewvarNode(:(psi1))\n", + "\u001b[90m│ \u001b[39m Core.NewvarNode(:(psi0))\n", + "\u001b[90m│ \u001b[39m Core.NewvarNode(:(d))\n", + "\u001b[90m│ \u001b[39m %27 = Main.nanoconc.miemfp.Tuple\u001b[36m::Core.Const(Tuple)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %28 = Main.nanoconc.miemfp.Float64\u001b[36m::Core.Const(Float64)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %29 = Main.nanoconc.miemfp.Float64\u001b[36m::Core.Const(Float64)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %30 = Main.nanoconc.miemfp.Float64\u001b[36m::Core.Const(Float64)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %31 = Core.apply_type(Main.nanoconc.miemfp.Array, Main.nanoconc.miemfp.ComplexF64, 1)\u001b[36m::Core.Const(Vector{ComplexF64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %32 = Core.apply_type(Main.nanoconc.miemfp.Array, Main.nanoconc.miemfp.ComplexF64, 1)\u001b[36m::Core.Const(Vector{ComplexF64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %33 = Core.apply_type(%27, %28, %29, %30, %31, %32)\u001b[36m::Core.Const(Tuple{Float64, Float64, Float64, Vector{ComplexF64}, Vector{ComplexF64}})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %34 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %35 = Base.getproperty(%34, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %36 = (%35)(x, refrel)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %37 = Base.convert(Main.nanoconc.miemfp.ComplexF64, %36)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m (y = Core.typeassert(%37, Main.nanoconc.miemfp.ComplexF64))\n", + "\u001b[90m│ \u001b[39m %39 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %40 = Base.getproperty(%39, :add_fast)\u001b[36m::Core.Const(Base.FastMath.add_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %41 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %42 = Base.getproperty(%41, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %43 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %44 = Base.getproperty(%43, :cbrt_fast)\u001b[36m::Core.Const(Base.FastMath.cbrt_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %45 = (%44)(x)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %46 = (%42)(4.0, %45)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %47 = (%40)(x, %46, 2.0)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %48 = Main.nanoconc.miemfp.round(%47)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %49 = Main.nanoconc.miemfp.UInt32(%48)\u001b[36m::UInt32\u001b[39m\n", + "\u001b[90m│ \u001b[39m %50 = Base.convert(Main.nanoconc.miemfp.UInt32, %49)\u001b[36m::UInt32\u001b[39m\n", + "\u001b[90m│ \u001b[39m (nstop = Core.typeassert(%50, Main.nanoconc.miemfp.UInt32))\n", + "\u001b[90m│ \u001b[39m %52 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %53 = Base.getproperty(%52, :add_fast)\u001b[36m::Core.Const(Base.FastMath.add_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %54 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %55 = Base.getproperty(%54, :max_fast)\u001b[36m::Core.Const(Base.FastMath.max_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %56 = nstop\u001b[36m::UInt32\u001b[39m\n", + "\u001b[90m│ \u001b[39m %57 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %58 = Base.getproperty(%57, :abs_fast)\u001b[36m::Core.Const(Base.FastMath.abs_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %59 = (%58)(y)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %60 = (%55)(%56, %59)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %61 = (%53)(%60, 14)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %62 = Main.nanoconc.miemfp.round(%61)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %63 = Main.nanoconc.miemfp.UInt32(%62)\u001b[36m::UInt32\u001b[39m\n", + "\u001b[90m│ \u001b[39m %64 = Base.convert(Main.nanoconc.miemfp.UInt32, %63)\u001b[36m::UInt32\u001b[39m\n", + "\u001b[90m│ \u001b[39m (nn = Core.typeassert(%64, Main.nanoconc.miemfp.UInt32))\n", + "\u001b[90m│ \u001b[39m %66 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %67 = Base.getproperty(%66, :div_fast)\u001b[36m::Core.Const(Base.FastMath.div_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %68 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %69 = Base.getproperty(%68, :sub_fast)\u001b[36m::Core.Const(Base.FastMath.sub_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %70 = (%69)(nang, 1)\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %71 = Main.nanoconc.miemfp.Float64(%70)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %72 = (%67)(1.570796327, %71)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %73 = Base.convert(Main.nanoconc.miemfp.Float64, %72)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m (dang = Core.typeassert(%73, Main.nanoconc.miemfp.Float64))\n", + "\u001b[90m│ \u001b[39m %75 = Core.apply_type(Main.nanoconc.miemfp.Vector, Main.nanoconc.miemfp.Float64)\u001b[36m::Core.Const(Vector{Float64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %76 = Main.nanoconc.miemfp.undef\u001b[36m::Core.Const(UndefInitializer())\u001b[39m\n", + "\u001b[90m│ \u001b[39m (amu = (%75)(%76, nang))\n", + "\u001b[90m│ \u001b[39m nothing\n", + "\u001b[90m│ \u001b[39m %79 = (1:nang)\u001b[36m::Core.PartialStruct(UnitRange{Int64}, Any[Core.Const(1), Int64])\u001b[39m\n", + "\u001b[90m│ \u001b[39m %80 = Core.apply_type(Main.nanoconc.miemfp.UnitRange, Main.nanoconc.miemfp.Int64)\u001b[36m::Core.Const(UnitRange{Int64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %81 = Core.typeassert(%79, %80)\u001b[36m::Core.PartialStruct(UnitRange{Int64}, Any[Core.Const(1), Int64])\u001b[39m\n", + "\u001b[90m│ \u001b[39m (r#452 = %81)\n", + "\u001b[90m│ \u001b[39m %83 = Base.simd_outer_range\u001b[36m::Core.Const(Base.SimdLoop.simd_outer_range)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %84 = (%83)(r#452::Core.PartialStruct(UnitRange{Int64}, Any[Core.Const(1), Int64]))\u001b[36m::Core.Const(0:0)\u001b[39m\n", + "\u001b[90m│ \u001b[39m (@_36 = Base.iterate(%84))\n", + "\u001b[90m│ \u001b[39m %86 = (@_36::Core.Const((0, 0)) === nothing)\u001b[36m::Core.Const(false)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %87 = Base.not_int(%86)\u001b[36m::Core.Const(true)\u001b[39m\n", + "\u001b[90m└───\u001b[39m goto #8 if not %87\n", + "\u001b[90m2 ──\u001b[39m %89 = @_36\u001b[36m::Core.Const((0, 0))\u001b[39m\n", + "\u001b[90m│ \u001b[39m (i#453 = Core.getfield(%89, 1))\n", + "\u001b[90m│ \u001b[39m %91 = Core.getfield(%89, 2)\u001b[36m::Core.Const(0)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %92 = Base.simd_inner_length\u001b[36m::Core.Const(Base.SimdLoop.simd_inner_length)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %93 = r#452\u001b[36m::Core.PartialStruct(UnitRange{Int64}, Any[Core.Const(1), Int64])\u001b[39m\n", + "\u001b[90m│ \u001b[39m %94 = (%92)(%93, i#453::Core.Const(0))\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m (n#454 = %94)\n", + "\u001b[90m│ \u001b[39m %96 = Main.nanoconc.miemfp.zero(n#454)\u001b[36m::Core.Const(0)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %97 = (%96 < n#454)\u001b[36m::Bool\u001b[39m\n", + "\u001b[90m└───\u001b[39m goto #6 if not %97\n", + "\u001b[90m3 ──\u001b[39m %99 = Main.nanoconc.miemfp.zero(n#454)\u001b[36m::Core.Const(0)\u001b[39m\n", + "\u001b[90m└───\u001b[39m (i#455 = %99)\n", + "\u001b[90m4 ┄─\u001b[39m %101 = (i#455 < n#454)\u001b[36m::Bool\u001b[39m\n", + "\u001b[90m└───\u001b[39m goto #6 if not %101\n", + "\u001b[90m5 ──\u001b[39m %103 = Base.simd_index\u001b[36m::Core.Const(Base.SimdLoop.simd_index)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %104 = r#452\u001b[36m::Core.PartialStruct(UnitRange{Int64}, Any[Core.Const(1), Int64])\u001b[39m\n", + "\u001b[90m│ \u001b[39m %105 = i#453\u001b[36m::Core.Const(0)\u001b[39m\n", + "\u001b[90m│ \u001b[39m (i = (%103)(%104, %105, i#455))\n", + "\u001b[90m│ \u001b[39m %107 = Base" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ".FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %108 = Base.getproperty(%107, :cos_fast)\u001b[36m::Core.Const(Base.FastMath.cos_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %109 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %110 = Base.getproperty(%109, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %111 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %112 = Base.getproperty(%111, :sub_fast)\u001b[36m::Core.Const(Base.FastMath.sub_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %113 = Main.nanoconc.miemfp.Float64(i)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %114 = (%112)(%113, 1.0)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %115 = (%110)(%114, dang)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %116 = (%108)(%115)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m Base.setindex!(amu, %116, i)\n", + "\u001b[90m│ \u001b[39m (i#455 = i#455 + 1)\n", + "\u001b[90m│ \u001b[39m $(Expr(:loopinfo, Symbol(\"julia.simdloop\"), nothing))\n", + "\u001b[90m└───\u001b[39m goto #4\n", + "\u001b[90m6 ┄─\u001b[39m (@_36 = Base.iterate(%84, %91))\n", + "\u001b[90m│ \u001b[39m %122 = (@_36::Core.Const(nothing) === nothing)\u001b[36m::Core.Const(true)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %123 = Base.not_int(%122)\u001b[36m::Core.Const(false)\u001b[39m\n", + "\u001b[90m└───\u001b[39m goto #8 if not %123\n", + "\u001b[90m7 ──\u001b[39m Core.Const(:(goto %89))\n", + "\u001b[90m8 ┄─\u001b[39m (val@_10 = Main.nanoconc.miemfp.nothing)\n", + "\u001b[90m│ \u001b[39m nothing\n", + "\u001b[90m│ \u001b[39m val@_10\n", + "\u001b[90m│ \u001b[39m %129 = Main.nanoconc.miemfp.ComplexF64(0.0, 0.0)\u001b[36m::Core.Const(0.0 + 0.0im)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %130 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %131 = Base.getproperty(%130, :add_fast)\u001b[36m::Core.Const(Base.FastMath.add_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %132 = nn\u001b[36m::UInt32\u001b[39m\n", + "\u001b[90m│ \u001b[39m %133 = (%131)(%132, 1)\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %134 = Main.nanoconc.miemfp.fill(%129, %133)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %135 = Core.apply_type(Main.nanoconc.miemfp.Vector, Main.nanoconc.miemfp.ComplexF64)\u001b[36m::Core.Const(Vector{ComplexF64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %136 = Base.convert(%135, %134)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m (d = Core.typeassert(%136, %135))\n", + "\u001b[90m│ \u001b[39m nothing\n", + "\u001b[90m│ \u001b[39m %139 = (nn:-1:2)\u001b[36m::Core.PartialStruct(StepRange{Int64, Int64}, Any[Int64, Core.Const(-1), Int64])\u001b[39m\n", + "\u001b[90m│ \u001b[39m %140 = Core.apply_type(Main.nanoconc.miemfp.StepRange, Main.nanoconc.miemfp.Int64, Main.nanoconc.miemfp.Int64)\u001b[36m::Core.Const(StepRange{Int64, Int64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %141 = Core.typeassert(%139, %140)\u001b[36m::Core.PartialStruct(StepRange{Int64, Int64}, Any[Int64, Core.Const(-1), Int64])\u001b[39m\n", + "\u001b[90m│ \u001b[39m (r#456 = %141)\n", + "\u001b[90m│ \u001b[39m %143 = Base.simd_outer_range\u001b[36m::Core.Const(Base.SimdLoop.simd_outer_range)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %144 = (%143)(r#456::Core.PartialStruct(StepRange{Int64, Int64}, Any[Int64, Core.Const(-1), Int64]))\u001b[36m::Core.Const(0:0)\u001b[39m\n", + "\u001b[90m│ \u001b[39m (@_42 = Base.iterate(%144))\n", + "\u001b[90m│ \u001b[39m %146 = (@_42::Core.Const((0, 0)) === nothing)\u001b[36m::Core.Const(false)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %147 = Base.not_int(%146)\u001b[36m::Core.Const(true)\u001b[39m\n", + "\u001b[90m└───\u001b[39m goto #15 if not %147\n", + "\u001b[90m9 ──\u001b[39m %149 = @_42\u001b[36m::Core.Const((0, 0))\u001b[39m\n", + "\u001b[90m│ \u001b[39m (i#457 = Core.getfield(%149, 1))\n", + "\u001b[90m│ \u001b[39m %151 = Core.getfield(%149, 2)\u001b[36m::Core.Const(0)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %152 = Base.simd_inner_length\u001b[36m::Core.Const(Base.SimdLoop.simd_inner_length)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %153 = r#456\u001b[36m::Core.PartialStruct(StepRange{Int64, Int64}, Any[Int64, Core.Const(-1), Int64])\u001b[39m\n", + "\u001b[90m│ \u001b[39m %154 = (%152)(%153, i#457::Core.Const(0))\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m (n#458 = %154)\n", + "\u001b[90m│ \u001b[39m %156 = Main.nanoconc.miemfp.zero(n#458)\u001b[36m::Core.Const(0)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %157 = (%156 < n#458)\u001b[36m::Bool\u001b[39m\n", + "\u001b[90m└───\u001b[39m goto #13 if not %157\n", + "\u001b[90m10 ─\u001b[39m %159 = Main.nanoconc.miemfp.zero(n#458)\u001b[36m::Core.Const(0)\u001b[39m\n", + "\u001b[90m└───\u001b[39m (i#459 = %159)\n", + "\u001b[90m11 ┄\u001b[39m %161 = (i#459 < n#458)\u001b[36m::Bool\u001b[39m\n", + "\u001b[90m└───\u001b[39m goto #13 if not %161\n", + "\u001b[90m12 ─\u001b[39m %163 = Base.simd_index\u001b[36m::Core.Const(Base.SimdLoop.simd_index)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %164 = r#456\u001b[36m::Core.PartialStruct(StepRange{Int64, Int64}, Any[Int64, Core.Const(-1), Int64])\u001b[39m\n", + "\u001b[90m│ \u001b[39m %165 = i#457\u001b[36m::Core.Const(0)\u001b[39m\n", + "\u001b[90m│ \u001b[39m (n@_47 = (%163)(%164, %165, i#459))\n", + "\u001b[90m│ \u001b[39m %167 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %168 = Base.getproperty(%167, :sub_fast)\u001b[36m::Core.Const(Base.FastMath.sub_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %169 = n@_47\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %170 = (%168)(%169, 1)\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %171 = Base.getindex(d, %170)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m Core.typeassert(%171, Main.nanoconc.miemfp.ComplexF64)\n", + "\u001b[90m│ \u001b[39m %173 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %174 = Base.getproperty(%173, :div_fast)\u001b[36m::Core.Const(Base.FastMath.div_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %175 = n@_47\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %176 = (%174)(%175, y)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m (n_over_y = %176)\n", + "\u001b[90m│ \u001b[39m %178 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %179 = Base.getproperty(%178, :sub_fast)\u001b[36m::Core.Const(Base.FastMath.sub_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %180 = n_over_y\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %181 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %182 = Base.getproperty(%181, :div_fast)\u001b[36m::Core.Const(Base.FastMath.div_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %183 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %184 = Base.getproperty(%183, :add_fast)\u001b[36m::Core.Const(Base.FastMath.add_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %185 = Base.getindex(d, n@_47)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %186 = (%184)(%185, n_over_y)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %187 = (%182)(1.0, %186)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %188 = (%179)(%180, %187)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m Base.setindex!(d, %188, %170)\n", + "\u001b[90m│ \u001b[39m (i#459 = i#459 + 1)\n", + "\u001b[90m│ \u001b[39m $(Expr(:loopinfo, Symbol(\"julia.simdloop\"), nothing))\n", + "\u001b[90m└───\u001b[39m goto #11\n", + "\u001b[90m13 ┄\u001b[39m (@_42 = Base.iterate(%144, %151))\n", + "\u001b[90m│ \u001b[39m %194 = (@_42::Core.Const(nothing) === nothing)\u001b[36m::Core.Const(true)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %195 = Base.not_int(%194)\u001b[36m::Core.Const(false)\u001b[39m\n", + "\u001b[90m└───\u001b[39m goto #15 if not %195\n", + "\u001b[90m14 ─\u001b[39m Core.Const(:(goto %149))\n", + "\u001b[90m15 ┄\u001b[39m (val@_9 = Main.nanoconc.miemfp.nothing)\n", + "\u001b[90m│ \u001b[39m nothing\n", + "\u001b[90m│ \u001b[39m val@_9\n", + "\u001b[90m│ \u001b[39m %201 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %202 = Base.getproperty(%201, :cos_fast)\u001b[36m::Core.Const(Base.FastMath.cos_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m (psi0 = (%202)(x))\n", + "\u001b[90m│ \u001b[39m %204 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %205 = Base.getproperty(%204, :sin_fast)\u001b[36m::Core.Const(Base.FastMath.sin_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m (psi1 = (%205)(x))\n", + "\u001b[90m│ \u001b[39m %207 = Base.convert(Main.nanoconc.miemfp.Float64, 0.0)\u001b[36m::Core.Const(0.0)\u001b[39m\n", + "\u001b[90m│ \u001b[39m (qsca = Core.typeassert(%207, Main.nanoconc.miemfp.Float64))\n", + "\u001b[90m│ \u001b[39m %209 = Base.convert(Main.nanoconc.miemfp.Float64, -1.0)\u001b[36m::Core.Const(-1.0)\u001b[39m\n", + "\u001b[90m│ \u001b[39m (p = Core.typeassert(%209, Main.nanoconc.miemfp.Float64))\n", + "\u001b[90m│ \u001b[39m %211 = psi1\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %212 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %213 = Base.getproperty(%212, :sub_fast)\u001b[36m::Core.Const(Base.FastMath.sub_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %214 = (%213)(psi0)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m (xi1 = Main.nanoconc.miemfp.ComplexF64(%211, %214))\n", + "\u001b[90m│ \u001b[39m (chi1 = psi0)\n", + "\u001b[90m│ \u001b[39m %217 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %218 = Base.getproperty(%217, :sub_fast)\u001b[36m::Core.Const(Base.FastMath.sub_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m (chi0 = (%218)(psi1))\n", + "\u001b[90m│ \u001b[39m (s1_1 = Main.nanoconc.miemfp.zeros(Main.nanoconc.miemfp.ComplexF64, nang))\n", + "\u001b[90m│ \u001b[39m (s1_2 = Main.nanoconc.miemfp.zeros(Main.nanoconc.miemfp.ComplexF64, nang))\n", + "\u001b[90m│ \u001b[39m (s2_1 = Main.nanoconc.miemfp.zeros(Main.nanoconc.miemfp.ComplexF64, nang))\n", + "\u001b[90m│ \u001b[39m (s2_2 = Main.nanoconc.miemfp.zeros(Main.nanoconc.miemfp.ComplexF64, nang))\n", + "\u001b[90m│ \u001b[39m %224 = Main.nanoconc.miemfp.zeros(nang)\u001b[36m::Vector{Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %225 = Core.apply_type(Main.nanoconc.miemfp.Vector, Main.nanoconc.miemfp.Float64)\u001b[36m::Core.Const(Vector{Float64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %226 = Base.convert(%225, %224)\u001b[36m::Vector{Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m (pi0 = Core.typeassert(%226, %225))\n", + "\u001b[90m│ \u001b[39m %228 = Main.nanoconc.miemfp.ones(nang)\u001b[36m::Vector{Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %229 = Core.apply_type(Main.nanoconc.miemfp.Vector, Main.nanoconc.miemfp.Float64)\u001b[36m::Core.Const(Vector{Float64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %230 = Base.convert(%229, %228)\u001b[36m::Vector{Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m (pi1 = Core.typeassert(%230, %229))\n", + "\u001b[90m│ \u001b[39m %232 = Core.apply_type(Main.nanoconc.miemfp.Vector, Main.nanoconc.miemfp.Float64)\u001b[36m::Core.Const(Vector{Float64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %233 = Main.nanoconc.miemfp.similar(%232, nang)\u001b[36m::Vector{Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %234 = Core.apply_type(Main.nanoconc.miemfp.Vector, Main.nanoconc.miemfp.Float64)\u001b[36m::Core.Const(Vector{Float64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %235 = Base.convert(%234, %233)\u001b[36m::Vector{Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m (tau = Core.typeassert(%235, %234))\n", + "\u001b[90m│ \u001b[39m nothing\n", + "\u001b[90m│ \u001b[39m %238 = (1:nstop)\u001b[36m::Core.PartialStruct(UnitRange{Int64}, Any[Core.Const(1), Int64])\u001b[39m\n", + "\u001b[90m│ \u001b[39m %239 = Core.apply_type(Main.nanoconc.miemfp.UnitRange, Main.nanoconc.miemfp.Int64)\u001b[36m::Core.Const(UnitRange{Int64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %240 = Core.typeassert(%238, %239)\u001b[36m::Core.PartialStruct(UnitRange{Int64}, Any[Core.Const(1), Int64])\u001b[39m\n", + "\u001b[90m│ \u001b[39m " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(r#460 = %240)\n", + "\u001b[90m│ \u001b[39m %242 = Base.simd_outer_range\u001b[36m::Core.Const(Base.SimdLoop.simd_outer_range)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %243 = (%242)(r#460::Core.PartialStruct(UnitRange{Int64}, Any[Core.Const(1), Int64]))\u001b[36m::Core.Const(0:0)\u001b[39m\n", + "\u001b[90m│ \u001b[39m (@_49 = Base.iterate(%243))\n", + "\u001b[90m│ \u001b[39m %245 = (@_49::Core.Const((0, 0)) === nothing)\u001b[36m::Core.Const(false)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %246 = Base.not_int(%245)\u001b[36m::Core.Const(true)\u001b[39m\n", + "\u001b[90m└───\u001b[39m goto #25 if not %246\n", + "\u001b[90m16 ─\u001b[39m %248 = @_49\u001b[36m::Core.Const((0, 0))\u001b[39m\n", + "\u001b[90m│ \u001b[39m (i#461 = Core.getfield(%248, 1))\n", + "\u001b[90m│ \u001b[39m %250 = Core.getfield(%248, 2)\u001b[36m::Core.Const(0)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %251 = Base.simd_inner_length\u001b[36m::Core.Const(Base.SimdLoop.simd_inner_length)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %252 = r#460\u001b[36m::Core.PartialStruct(UnitRange{Int64}, Any[Core.Const(1), Int64])\u001b[39m\n", + "\u001b[90m│ \u001b[39m %253 = (%251)(%252, i#461::Core.Const(0))\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m (n#462 = %253)\n", + "\u001b[90m│ \u001b[39m %255 = Main.nanoconc.miemfp.zero(n#462)\u001b[36m::Core.Const(0)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %256 = (%255 < n#462)\u001b[36m::Bool\u001b[39m\n", + "\u001b[90m└───\u001b[39m goto #23 if not %256\n", + "\u001b[90m17 ─\u001b[39m %258 = Main.nanoconc.miemfp.zero(n#462)\u001b[36m::Core.Const(0)\u001b[39m\n", + "\u001b[90m└───\u001b[39m (i#463 = %258)\n", + "\u001b[90m18 ┄\u001b[39m %260 = (i#463 < n#462)\u001b[36m::Bool\u001b[39m\n", + "\u001b[90m└───\u001b[39m goto #23 if not %260\n", + "\u001b[90m19 ─\u001b[39m %262 = Base.simd_index\u001b[36m::Core.Const(Base.SimdLoop.simd_index)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %263 = r#460\u001b[36m::Core.PartialStruct(UnitRange{Int64}, Any[Core.Const(1), Int64])\u001b[39m\n", + "\u001b[90m│ \u001b[39m %264 = i#461\u001b[36m::Core.Const(0)\u001b[39m\n", + "\u001b[90m│ \u001b[39m (n@_61 = (%262)(%263, %264, i#463))\n", + "\u001b[90m│ \u001b[39m %266 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %267 = Base.getproperty(%266, :div_fast)\u001b[36m::Core.Const(Base.FastMath.div_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %268 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %269 = Base.getproperty(%268, :add_fast)\u001b[36m::Core.Const(Base.FastMath.add_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %270 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %271 = Base.getproperty(%270, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %272 = (%271)(2, n@_61)\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %273 = (%269)(%272, 1)\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %274 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %275 = Base.getproperty(%274, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %276 = n@_61\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %277 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %278 = Base.getproperty(%277, :add_fast)\u001b[36m::Core.Const(Base.FastMath.add_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %279 = n@_61\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %280 = (%278)(%279, 1)\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %281 = (%275)(%276, %280)\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m (fn = (%267)(%273, %281))\n", + "\u001b[90m│ \u001b[39m %283 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %284 = Base.getproperty(%283, :sub_fast)\u001b[36m::Core.Const(Base.FastMath.sub_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %285 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %286 = Base.getproperty(%285, :div_fast)\u001b[36m::Core.Const(Base.FastMath.div_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %287 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %288 = Base.getproperty(%287, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %289 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %290 = Base.getproperty(%289, :sub_fast)\u001b[36m::Core.Const(Base.FastMath.sub_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %291 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %292 = Base.getproperty(%291, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %293 = (%292)(2, n@_61)\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %294 = (%290)(%293, 1)\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %295 = (%288)(%294, psi1)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %296 = (%286)(%295, x)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m (psi = (%284)(%296, psi0))\n", + "\u001b[90m│ \u001b[39m %298 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %299 = Base.getproperty(%298, :sub_fast)\u001b[36m::Core.Const(Base.FastMath.sub_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %300 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %301 = Base.getproperty(%300, :div_fast)\u001b[36m::Core.Const(Base.FastMath.div_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %302 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %303 = Base.getproperty(%302, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %304 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %305 = Base.getproperty(%304, :sub_fast)\u001b[36m::Core.Const(Base.FastMath.sub_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %306 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %307 = Base.getproperty(%306, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %308 = (%307)(2, n@_61)\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %309 = (%305)(%308, 1)\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %310 = (%303)(%309, chi1)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %311 = (%301)(%310, x)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m (chi = (%299)(%311, chi0))\n", + "\u001b[90m│ \u001b[39m %313 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %314 = Base.getproperty(%313, :sub_fast)\u001b[36m::Core.Const(Base.FastMath.sub_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %315 = psi\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %316 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %317 = Base.getproperty(%316, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %318 = chi\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %319 = (%317)(%318, Main.nanoconc.miemfp.im)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m (xi = (%314)(%315, %319))\n", + "\u001b[90m│ \u001b[39m %321 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %322 = Base.getproperty(%321, :add_fast)\u001b[36m::Core.Const(Base.FastMath.add_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %323 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %324 = Base.getproperty(%323, :div_fast)\u001b[36m::Core.Const(Base.FastMath.div_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %325 = Base.getindex(d, n@_61)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %326 = (%324)(%325, refrel)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %327 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %328 = Base.getproperty(%327, :div_fast)\u001b[36m::Core.Const(Base.FastMath.div_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %329 = n@_61\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %330 = (%328)(%329, x)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %331 = (%322)(%326, %330)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %332 = Base.convert(Main.nanoconc.miemfp.ComplexF64, %331)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m (an_mult = Core.typeassert(%332, Main.nanoconc.miemfp.ComplexF64))\n", + "\u001b[90m│ \u001b[39m %334 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %335 = Base.getproperty(%334, :div_fast)\u001b[36m::Core.Const(Base.FastMath.div_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %336 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %337 = Base.getproperty(%336, :sub_fast)\u001b[36m::Core.Const(Base.FastMath.sub_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %338 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %339 = Base.getproperty(%338, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %340 = an_mult\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %341 = (%339)(%340, psi)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %342 = (%337)(%341, psi1)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %343 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %344 = Base.getproperty(%343, :sub_fast)\u001b[36m::Core.Const(Base.FastMath.sub_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %345 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %346 = Base.getproperty(%345, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %347 = an_mult\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %348 = (%346)(%347, xi)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %349 = (%344)(%348, xi1)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %350 = (%335)(%342, %349)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %351 = Base.convert(Main.nanoconc.miemfp.ComplexF64, %350)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m (an = Core.typeassert(%351, Main.nanoconc.miemfp.ComplexF64))\n", + "\u001b[90m│ \u001b[39m %353 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %354 = Base.getproperty(%353, :add_fast)\u001b[36m::Core.Const(Base.FastMath.add_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %355 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %356 = Base.getproperty(%355, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %357 = Base.getindex(d, n@_61)\u001b[36m::ComplexF64\u001b[39m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: replacing module nanoconc.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\u001b[90m│ \u001b[39m %358 = (%356)(refrel, %357)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %359 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %360 = Base.getproperty(%359, :div_fast)\u001b[36m::Core.Const(Base.FastMath.div_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %361 = n@_61\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %362 = (%360)(%361, x)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %363 = (%354)(%358, %362)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %364 = Base.convert(Main.nanoconc.miemfp.ComplexF64, %363)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m (bn_mult = Core.typeassert(%364, Main.nanoconc.miemfp.ComplexF64))\n", + "\u001b[90m│ \u001b[39m %366 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %367 = Base.getproperty(%366, :div_fast)\u001b[36m::Core.Const(Base.FastMath.div_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %368 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %369 = Base.getproperty(%368, :sub_fast)\u001b[36m::Core.Const(Base.FastMath.sub_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %370 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %371 = Base.getproperty(%370, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %372 = bn_mult\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %373 = (%371)(%372, psi)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %374 = (%369)(%373, psi1)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %375 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %376 = Base.getproperty(%375, :sub_fast)\u001b[36m::Core.Const(Base.FastMath.sub_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %377 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %378 = Base.getproperty(%377, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %379 = bn_mult\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %380 = (%378)(%379, xi)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %381 = (%376)(%380, xi1)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %382 = (%367)(%374, %381)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %383 = Base.convert(Main.nanoconc.miemfp.ComplexF64, %382)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m (bn = Core.typeassert(%383, Main.nanoconc.miemfp.ComplexF64))\n", + "\u001b[90m│ \u001b[39m %385 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %386 = Base.getproperty(%385, :add_fast)\u001b[36m::Core.Const(Base.FastMath.add_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %387 = qsca\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %388 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %389 = Base.getproperty(%388, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %390 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %391 = Base.getproperty(%390, :add_fast)\u001b[36m::Core.Const(Base.FastMath.add_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %392 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %393 = Base.getproperty(%392, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %394 = (%393)(2, n@_61)\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %395 = (%391)(%394, 1)\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %396 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %397 = Base.getproperty(%396, :add_fast)\u001b[36m::Core.Const(Base.FastMath.add_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %398 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %399 = Base.getproperty(%398, :pow_fast)\u001b[36m::Core.Const(Base.FastMath.pow_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %400 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %401 = Base.getproperty(%400, :abs_fast)\u001b[36m::Core.Const(Base.FastMath.abs_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %402 = (%401)(an)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %403 = (%399)(%402, Val{2}())\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %404 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %405 = Base.getproperty(%404, :pow_fast)\u001b[36m::Core.Const(Base.FastMath.pow_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %406 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %407 = Base.getproperty(%406, :abs_fast)\u001b[36m::Core.Const(Base.FastMath.abs_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %408 = (%407)(bn)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %409 = (%405)(%408, Val{2}())\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %410 = (%397)(%403, %409)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %411 = (%389)(%395, %410)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %412 = (%386)(%387, %411)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %413 = Base.convert(Main.nanoconc.miemfp.Float64, %412)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m (qsca = Core.typeassert(%413, Main.nanoconc.miemfp.Float64))\n", + "\u001b[90m│ \u001b[39m (pi_ = pi1)\n", + "\u001b[90m│ \u001b[39m %416 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %417 = Base.getproperty(%416, :sub_fast)\u001b[36m::Core.Const(Base.FastMath.sub_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %418 = Main.nanoconc.miemfp.:*\u001b[36m::Core.Const(*)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %419 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %420 = Base.getproperty(%419, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %421 = n@_61\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %422 = (%420)(%421, amu)\u001b[36m::Vector{Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %423 = Base.broadcasted(%418, %422, pi_)\u001b[36m::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1}, Nothing, typeof(*), Tuple{Vector{Float64}, Vector{Float64}}}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %424 = Base.materialize(%423)\u001b[36m::Vector{Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %425 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %426 = Base.getproperty(%425, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %427 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %428 = Base.getproperty(%427, :add_fast)\u001b[36m::Core.Const(Base.FastMath.add_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %429 = n@_61\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %430 = (%428)(%429, 1)\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %431 = (%426)(%430, pi0)\u001b[36m::Vector{Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %432 = (%417)(%424, %431)\u001b[36m::Vector{Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %433 = Core.apply_type(Main.nanoconc.miemfp.Vector, Main.nanoconc.miemfp.Float64)\u001b[36m::Core.Const(Vector{Float64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %434 = Base.convert(%433, %432)\u001b[36m::Vector{Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m (tau = Core.typeassert(%434, %433))\n", + "\u001b[90m│ \u001b[39m %436 = Main.nanoconc.miemfp.isodd(n@_61)\u001b[36m::Bool\u001b[39m\n", + "\u001b[90m└───\u001b[39m goto #21 if not %436\n", + "\u001b[90m20 ─\u001b[39m (@_65 = 1.0)\n", + "\u001b[90m└───\u001b[39m goto #22\n", + "\u001b[90m21 ─\u001b[39m (@_65 = -1.0)\n", + "\u001b[90m22 ┄\u001b[39m %441 = @_65\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %442 = Base.convert(Main.nanoconc.miemfp.Float64, %441)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m (p = Core.typeassert(%442, Main.nanoconc.miemfp.Float64))\n", + "\u001b[90m│ \u001b[39m %444 = s1_1\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %445 = Core.apply_type(Main.nanoconc.miemfp.Vector, Main.nanoconc.miemfp.ComplexF64)\u001b[36m::Core.Const(Vector{ComplexF64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %446 = Core.typeassert(%444, %445)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %447 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %448 = Base.getproperty(%447, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %449 = fn\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %450 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %451 = Base.getproperty(%450, :add_fast)\u001b[36m::Core.Const(Base.FastMath.add_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %452 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %453 = Base.getproperty(%452, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %454 = an\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %455 = (%453)(%454, pi_)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %456 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %457 = Base.getproperty(%456, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %458 = bn\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %459 = (%457)(%458, tau)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %460 = (%451)(%455, %459)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %461 = (%448)(%449, %460)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m (s1_1 = %446 + %461)\n", + "\u001b[90m│ \u001b[39m %463 = s1_2\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %464 = Core.apply_type(Main.nanoconc.miemfp.Vector, Main.nanoconc.miemfp.ComplexF64)\u001b[36m::Core.Const(Vector{ComplexF64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %465 = Core.typeassert(%463, %464)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %466 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %467 = Base.getproperty(%466, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %468 = fn\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %469 = p\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %470 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %471 = Base.getproperty(%470, :sub_fast)\u001b[36m::Core.Const(Base.FastMath.sub_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %472 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %473 = Base.getproperty(%472, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %474 = an\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %475 = (%473)(%474, pi_)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %476 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %477 = Base.getproperty(%476, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %478 = bn\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %479 = (%477)(%478, tau)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %480 = (%471)(%475, %479)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %481 = (%467)(%468, %469, %480)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m (s1_2 = %465 + %481)\n", + "\u001b[90m│ \u001b[39m %483 = s2_1\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %484 = Core.apply_type(Main.nanoconc.miemfp.Vector, Main.nanoconc.miemfp.ComplexF64)\u001b[36m::Core.Const(Vector{ComplexF64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %485 = Core.typeassert(%483, %484)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %486 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %487 = Base.getproperty(%486, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %488 = fn\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %489 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[90m│ \u001b[39m %490 = Base.getproperty(%489, :add_fast)\u001b[36m::Core.Const(Base.FastMath.add_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %491 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %492 = Base.getproperty(%491, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %493 = an\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %494 = (%492)(%493, tau)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %495 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %496 = Base.getproperty(%495, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %497 = bn\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %498 = (%496)(%497, pi_)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %499 = (%490)(%494, %498)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %500 = (%487)(%488, %499)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m (s2_1 = %485 + %500)\n", + "\u001b[90m│ \u001b[39m %502 = s2_2\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %503 = Core.apply_type(Main.nanoconc.miemfp.Vector, Main.nanoconc.miemfp.ComplexF64)\u001b[36m::Core.Const(Vector{ComplexF64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %504 = Core.typeassert(%502, %503)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %505 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %506 = Base.getproperty(%505, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %507 = fn\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %508 = p\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %509 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %510 = Base.getproperty(%509, :sub_fast)\u001b[36m::Core.Const(Base.FastMath.sub_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %511 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %512 = Base.getproperty(%511, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %513 = bn\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %514 = (%512)(%513, pi_)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %515 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %516 = Base.getproperty(%515, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %517 = an\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %518 = (%516)(%517, tau)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %519 = (%510)(%514, %518)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %520 = (%506)(%507, %508, %519)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m (s2_2 = %504 + %520)\n", + "\u001b[90m│ \u001b[39m (psi0 = psi1)\n", + "\u001b[90m│ \u001b[39m (chi0 = chi1)\n", + "\u001b[90m│ \u001b[39m (psi1 = psi)\n", + "\u001b[90m│ \u001b[39m (chi1 = chi)\n", + "\u001b[90m│ \u001b[39m %526 = psi1\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %527 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %528 = Base.getproperty(%527, :sub_fast)\u001b[36m::Core.Const(Base.FastMath.sub_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %529 = (%528)(chi1)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m (xi1 = Main.nanoconc.miemfp.ComplexF64(%526, %529))\n", + "\u001b[90m│ \u001b[39m %531 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %532 = Base.getproperty(%531, :div_fast)\u001b[36m::Core.Const(Base.FastMath.div_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %533 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %534 = Base.getproperty(%533, :sub_fast)\u001b[36m::Core.Const(Base.FastMath.sub_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %535 = Main.nanoconc.miemfp.:*\u001b[36m::Core.Const(*)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %536 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %537 = Base.getproperty(%536, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %538 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %539 = Base.getproperty(%538, :add_fast)\u001b[36m::Core.Const(Base.FastMath.add_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %540 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %541 = Base.getproperty(%540, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %542 = (%541)(2, n@_61)\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %543 = (%539)(%542, 1)\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %544 = (%537)(%543, amu)\u001b[36m::Vector{Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %545 = Base.broadcasted(%535, %544, pi_)\u001b[36m::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1}, Nothing, typeof(*), Tuple{Vector{Float64}, Vector{Float64}}}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %546 = Base.materialize(%545)\u001b[36m::Vector{Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %547 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %548 = Base.getproperty(%547, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %549 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %550 = Base.getproperty(%549, :add_fast)\u001b[36m::Core.Const(Base.FastMath.add_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %551 = n@_61\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %552 = (%550)(%551, 1)\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %553 = (%548)(%552, pi0)\u001b[36m::Vector{Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %554 = (%534)(%546, %553)\u001b[36m::Vector{Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %555 = (%532)(%554, n@_61)\u001b[36m::Vector{Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %556 = Core.apply_type(Main.nanoconc.miemfp.Vector, Main.nanoconc.miemfp.Float64)\u001b[36m::Core.Const(Vector{Float64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %557 = Base.convert(%556, %555)\u001b[36m::Vector{Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m (pi1 = Core.typeassert(%557, %556))\n", + "\u001b[90m│ \u001b[39m %559 = pi_\u001b[36m::Vector{Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %560 = Core.apply_type(Main.nanoconc.miemfp.Vector, Main.nanoconc.miemfp.Float64)\u001b[36m::Core.Const(Vector{Float64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %561 = Base.convert(%560, %559)\u001b[36m::Vector{Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m (pi0 = Core.typeassert(%561, %560))\n", + "\u001b[90m│ \u001b[39m (i#463 = i#463 + 1)\n", + "\u001b[90m│ \u001b[39m $(Expr(:loopinfo, Symbol(\"julia.simdloop\"), nothing))\n", + "\u001b[90m└───\u001b[39m goto #18\n", + "\u001b[90m23 ┄\u001b[39m (@_49 = Base.iterate(%243, %250))\n", + "\u001b[90m│ \u001b[39m %567 = (@_49::Core.Const(nothing) === nothing)\u001b[36m::Core.Const(true)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %568 = Base.not_int(%567)\u001b[36m::Core.Const(false)\u001b[39m\n", + "\u001b[90m└───\u001b[39m goto #25 if not %568\n", + "\u001b[90m24 ─\u001b[39m Core.Const(:(goto %248))\n", + "\u001b[90m25 ┄\u001b[39m (val@_8 = Main.nanoconc.miemfp.nothing)\n", + "\u001b[90m│ \u001b[39m nothing\n", + "\u001b[90m│ \u001b[39m val@_8\n", + "\u001b[90m│ \u001b[39m nothing\n", + "\u001b[90m│ \u001b[39m %575 = s1_1\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %576 = s1_2\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %577 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %578 = Base.getproperty(%577, :sub_fast)\u001b[36m::Core.Const(Base.FastMath.sub_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %579 = Base.lastindex(s1_2)\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %580 = (%578)(%579, 1)\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %581 = (1:%580)\u001b[36m::Core.PartialStruct(UnitRange{Int64}, Any[Core.Const(1), Int64])\u001b[39m\n", + "\u001b[90m│ \u001b[39m %582 = Base.getindex(%576, %581)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %583 = Main.nanoconc.miemfp.reverse(%582)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %584 = Main.nanoconc.miemfp.vcat(%575, %583)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %585 = Core.apply_type(Main.nanoconc.miemfp.Vector, Main.nanoconc.miemfp.ComplexF64)\u001b[36m::Core.Const(Vector{ComplexF64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %586 = Base.convert(%585, %584)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m (s1 = Core.typeassert(%586, %585))\n", + "\u001b[90m│ \u001b[39m (val@_7 = %584)\n", + "\u001b[90m│ \u001b[39m nothing\n", + "\u001b[90m│ \u001b[39m val@_7\n", + "\u001b[90m│ \u001b[39m nothing\n", + "\u001b[90m│ \u001b[39m %592 = s2_1\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %593 = s2_2\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %594 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %595 = Base.getproperty(%594, :sub_fast)\u001b[36m::Core.Const(Base.FastMath.sub_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %596 = Base.lastindex(s2_2)\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %597 = (%595)(%596, 1)\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %598 = (1:%597)\u001b[36m::Core.PartialStruct(UnitRange{Int64}, Any[Core.Const(1), Int64])\u001b[39m\n", + "\u001b[90m│ \u001b[39m %599 = Base.getindex(%593, %598)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %600 = Main.nanoconc.miemfp.reverse(%599)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %601 = Main.nanoconc.miemfp.vcat(%592, %600)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %602 = Core.apply_type(Main.nanoconc.miemfp.Vector, Main.nanoconc.miemfp.ComplexF64)\u001b[36m::Core.Const(Vector{ComplexF64})\u001b[39m\n", + "\u001b[90m│ \u001b[39m %603 = Base.convert(%602, %601)\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m (s2 = Core.typeassert(%603, %602))\n", + "\u001b[90m│ \u001b[39m (val@_6 = %601)\n", + "\u001b[90m│ \u001b[39m nothing\n", + "\u001b[90m│ \u001b[39m val@_6\n", + "\u001b[90m│ \u001b[39m %608 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %609 = Base.getproperty(%608, :pow_fast)\u001b[36m::Core.Const(Base.FastMath.pow_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %610 = (%609)(x, " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val{2}())\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %611 = Base.convert(Main.nanoconc.miemfp.Float64, %610)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m (x_sq = Core.typeassert(%611, Main.nanoconc.miemfp.Float64))\n", + "\u001b[90m│ \u001b[39m %613 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %614 = Base.getproperty(%613, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %615 = qsca\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %616 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %617 = Base.getproperty(%616, :div_fast)\u001b[36m::Core.Const(Base.FastMath.div_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %618 = (%617)(2.0, x_sq)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %619 = (%614)(%615, %618)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %620 = Base.convert(Main.nanoconc.miemfp.Float64, %619)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m (qsca = Core.typeassert(%620, Main.nanoconc.miemfp.Float64))\n", + "\u001b[90m│ \u001b[39m %622 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %623 = Base.getproperty(%622, :div_fast)\u001b[36m::Core.Const(Base.FastMath.div_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %624 = (%623)(4.0, x_sq)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %625 = Base.convert(Main.nanoconc.miemfp.Float64, %624)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m (four_over_x_sq = Core.typeassert(%625, Main.nanoconc.miemfp.Float64))\n", + "\u001b[90m│ \u001b[39m %627 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %628 = Base.getproperty(%627, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %629 = four_over_x_sq\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %630 = Base.getindex(s1, 1)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %631 = Main.nanoconc.miemfp.real(%630)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %632 = (%628)(%629, %631)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %633 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %634 = Base.getproperty(%633, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %635 = four_over_x_sq\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %636 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %637 = Base.getproperty(%636, :pow_fast)\u001b[36m::Core.Const(Base.FastMath.pow_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %638 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %639 = Base.getproperty(%638, :abs_fast)\u001b[36m::Core.Const(Base.FastMath.abs_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %640 = s1\u001b[36m::Vector{ComplexF64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %641 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %642 = Base.getproperty(%641, :sub_fast)\u001b[36m::Core.Const(Base.FastMath.sub_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %643 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %644 = Base.getproperty(%643, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %645 = (%644)(2, nang)\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %646 = (%642)(%645, 1)\u001b[36m::Int64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %647 = Base.getindex(%640, %646)\u001b[36m::ComplexF64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %648 = (%639)(%647)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %649 = (%637)(%648, Val{2}())\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %650 = (%634)(%635, %649)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %651 = Core.tuple(%632, %650)\u001b[36m::Tuple{Float64, Float64}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %652 = Base.indexed_iterate(%651, 1)\u001b[36m::Core.PartialStruct(Tuple{Float64, Int64}, Any[Float64, Core.Const(2)])\u001b[39m\n", + "\u001b[90m│ \u001b[39m %653 = Core.getfield(%652, 1)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m (@_5 = Core.getfield(%652, 2))\n", + "\u001b[90m│ \u001b[39m %655 = Base.indexed_iterate(%651, 2, @_5::Core.Const(2))\u001b[36m::Core.PartialStruct(Tuple{Float64, Int64}, Any[Float64, Core.Const(3)])\u001b[39m\n", + "\u001b[90m│ \u001b[39m %656 = Core.getfield(%655, 1)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %657 = Base.convert(Main.nanoconc.miemfp.Float64, %653)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m (qext = Core.typeassert(%657, Main.nanoconc.miemfp.Float64))\n", + "\u001b[90m│ \u001b[39m %659 = Base.convert(Main.nanoconc.miemfp.Float64, %656)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m (qback = Core.typeassert(%659, Main.nanoconc.miemfp.Float64))\n", + "\u001b[90m│ \u001b[39m %661 = Core.tuple(qext, qsca, qback, s1, s2)\u001b[36m::Tuple{Float64, Float64, Float64, Vector{ComplexF64}, Vector{ComplexF64}}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %662 = Base.convert(%33, %661)\u001b[36m::Tuple{Float64, Float64, Float64, Vector{ComplexF64}, Vector{ComplexF64}}\u001b[39m\n", + "\u001b[90m│ \u001b[39m %663 = Core.typeassert(%662, %33)\u001b[36m::Tuple{Float64, Float64, Float64, Vector{ComplexF64}, Vector{ComplexF64}}\u001b[39m\n", + "\u001b[90m└───\u001b[39m return %663\n", + "\n" + ] + } + ], + "source": [ + "include(\"src/nanoconc.jl\")\n", + "test_data = deserialize(\"test/data/Main.nanoconc.miemfp.bhmie.ser\")\n", + "args, kwargs = test_data[1][1]\n", + "@code_warntype nanoconc.miemfp.bhmie(args..., kwargs...)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MethodInstance for Main.nanoconc.quantumcalc.attencoeff(::Float64, ::Float64)\n", + " from attencoeff(\u001b[90mqext\u001b[39m::\u001b[1mFloat64\u001b[22m, \u001b[90mr\u001b[39m::\u001b[1mFloat64\u001b[22m)\u001b[90m @\u001b[39m \u001b[90mMain.nanoconc.quantumcalc\u001b[39m \u001b[90m~/Programming/Work_Projects/nanoconc/src/\u001b[39m\u001b[90m\u001b[4mquantumcalc.jl:118\u001b[24m\u001b[39m\n", + "Arguments\n", + " #self#\u001b[36m::Core.Const(Main.nanoconc.quantumcalc.attencoeff)\u001b[39m\n", + " qext\u001b[36m::Float64\u001b[39m\n", + " r\u001b[36m::Float64\u001b[39m\n", + "Body\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m1 ─\u001b[39m %1 = Main.nanoconc.quantumcalc.Float64\u001b[36m::Core.Const(Float64)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %2 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %3 = Base.getproperty(%2, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %4 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %5 = Base.getproperty(%4, :pow_fast)\u001b[36m::Core.Const(Base.FastMath.pow_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %6 = (%5)(r, Val{2}())\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %7 = (%3)(%6, qext, Main.nanoconc.quantumcalc.A_PI_LOG10_EULER_OVER_1000)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %8 = Base.convert(%1, %7)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %9 = Core.typeassert(%8, %1)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m└──\u001b[39m return %9\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: replacing module nanoconc.\n" + ] + } + ], + "source": [ + "include(\"src/nanoconc.jl\")\n", + "test_data = deserialize(\"test/data/Main.nanoconc.quantumcalc.attencoeff.ser\")\n", + "test_data = test_data[1]\n", + "args, kwargs = test_data[1]\n", + "@code_warntype nanoconc.quantumcalc.attencoeff(args..., kwargs...)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MethodInstance for Main.nanoconc.quantumcalc.attentoabs(::Float64, ::Float64, ::Float64)\n", + " from attentoabs(\u001b[90mkappa\u001b[39m::\u001b[1mFloat64\u001b[22m, \u001b[90mc\u001b[39m::\u001b[1mFloat64\u001b[22m, \u001b[90md0\u001b[39m::\u001b[1mFloat64\u001b[22m)\u001b[90m @\u001b[39m \u001b[90mMain.nanoconc.quantumcalc\u001b[39m \u001b[90m~/Programming/Work_Projects/nanoconc/src/\u001b[39m\u001b[90m\u001b[4mquantumcalc.jl:133\u001b[24m\u001b[39m\n", + "Arguments\n", + " #self#\u001b[36m::Core.Const(Main.nanoconc.quantumcalc.attentoabs)\u001b[39m\n", + " kappa\u001b[36m::Float64\u001b[39m\n", + " c\u001b[36m::Float64\u001b[39m\n", + " d0\u001b[36m::Float64\u001b[39m\n", + "Body\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m1 ─\u001b[39m %1 = Main.nanoconc.quantumcalc.Float64\u001b[36m::Core.Const(Float64)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %2 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %3 = Base.getproperty(%2, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %4 = (%3)(kappa, c, d0)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %5 = Base.convert(%1, %4)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %6 = Core.typeassert(%5, %1)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m└──\u001b[39m return %6\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: replacing module nanoconc.\n" + ] + } + ], + "source": [ + "include(\"src/nanoconc.jl\")\n", + "test_data = deserialize(\"test/data/Main.nanoconc.quantumcalc.attentoabs.ser\")\n", + "test_data = test_data[1]\n", + "args, kwargs = test_data[1]\n", + "@code_warntype nanoconc.quantumcalc.attentoabs(args..., kwargs...)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MethodInstance for Main.nanoconc.quantumcalc.numtomol(::Float64)\n", + " from numtomol(\u001b[90mn\u001b[39m::\u001b[1mFloat64\u001b[22m)\u001b[90m @\u001b[39m \u001b[90mMain.nanoconc.quantumcalc\u001b[39m \u001b[90m~/Programming/Work_Projects/nanoconc/src/\u001b[39m\u001b[90m\u001b[4mquantumcalc.jl:125\u001b[24m\u001b[39m\n", + "Arguments\n", + " #self#\u001b[36m::Core.Const(Main.nanoconc.quantumcalc.numtomol)\u001b[39m\n", + " n\u001b[36m::Float64\u001b[39m\n", + "Body\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m1 ─\u001b[39m %1 = Main.nanoconc.quantumcalc.Float64\u001b[36m::Core.Const(Float64)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %2 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %3 = Base.getproperty(%2, :mul_fast)\u001b[36m::Core.Const(Base.FastMath.mul_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %4 = (%3)(n, Main.nanoconc.quantumcalc.NUM_TO_MOL_CONV)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %5 = Base.convert(%1, %4)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %6 = Core.typeassert(%5, %1)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m└──\u001b[39m return %6\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: replacing module nanoconc.\n" + ] + } + ], + "source": [ + "include(\"src/nanoconc.jl\")\n", + "test_data = deserialize(\"test/data/Main.nanoconc.quantumcalc.numtomol.ser\")\n", + "test_data = test_data[1]\n", + "args, kwargs = test_data[1]\n", + "@code_warntype nanoconc.quantumcalc.numtomol(args..., kwargs...)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MethodInstance for Main.nanoconc.quantumcalc.predictabs(::Float64, ::Float64, ::Float64, ::Float64)\n", + " from predictabs(\u001b[90mqext\u001b[39m::\u001b[1mFloat64\u001b[22m, \u001b[90mavgr\u001b[39m::\u001b[1mFloat64\u001b[22m, \u001b[90mppml\u001b[39m::\u001b[1mFloat64\u001b[22m, \u001b[90ml\u001b[39m::\u001b[1mFloat64\u001b[22m)\u001b[90m @\u001b[39m \u001b[90mMain.nanoconc.quantumcalc\u001b[39m \u001b[90m~/Programming/Work_Projects/nanoconc/src/\u001b[39m\u001b[90m\u001b[4mquantumcalc.jl:141\u001b[24m\u001b[39m\n", + "Arguments\n", + " #self#\u001b[36m::Core.Const(Main.nanoconc.quantumcalc.predictabs)\u001b[39m\n", + " qext\u001b[36m::Float64\u001b[39m\n", + " avgr\u001b[36m::Float64\u001b[39m\n", + " ppml\u001b[36m::Float64\u001b[39m\n", + " l\u001b[36m::Float64\u001b[39m\n", + "Body\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m1 ─\u001b[39m %1 = Main.nanoconc.quantumcalc.Float64\u001b[36m::Core.Const(Float64)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %2 = Base.FastMath\u001b[36m::Core.Const(Base.FastMath)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %3 = Base.getproperty(%2, :log10_fast)\u001b[36m::Core.Const(Base.FastMath.log10_fast)\u001b[39m\n", + "\u001b[90m│ \u001b[39m %4 = Main.nanoconc.quantumcalc.attencoeff(qext, avgr)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %5 = Main.nanoconc.quantumcalc.numtomol(ppml)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %6 = Main.nanoconc.quantumcalc.attentoabs(%4, %5, l)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %7 = (%3)(%6)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %8 = Base.convert(%1, %7)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m│ \u001b[39m %9 = Core.typeassert(%8, %1)\u001b[36m::Float64\u001b[39m\n", + "\u001b[90m└──\u001b[39m return %9\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: replacing module nanoconc.\n" + ] + } + ], + "source": [ + "include(\"src/nanoconc.jl\")\n", + "test_data = deserialize(\"test/data/Main.nanoconc.quantumcalc.predictabs.ser\")\n", + "test_data = test_data[1]\n", + "args, kwargs = test_data[1]\n", + "@code_warntype nanoconc.quantumcalc.predictabs(args..., kwargs...)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "f2 (generic function with 1 method)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "function f1(n::Float64)::Float64\n", + " n * (n + 1)\n", + "end\n", + "\n", + "function f2(n::Float64)::Float64\n", + " n^2 + n\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.0" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "Float64(1)" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "ename": "OutOfMemoryError", + "evalue": "OutOfMemoryError()", + "output_type": "error", + "traceback": [ + "OutOfMemoryError()\n", + "\n", + "Stacktrace:\n", + " [1] collect(itr::Base.Generator{UnitRange{Int64}, var\"#15#16\"})\n", + " @ Base ./array.jl:0\n", + " [2] top-level scope\n", + " @ ~/Programming/Work_Projects/nanoconc/scratch.ipynb:1" + ] + } + ], + "source": [ + "n_range = [Float64(i) for i in 1:1000000000000]" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 0.003103 seconds (4 allocations: 7.629 MiB)\n" + ] + }, + { + "data": { + "text/plain": [ + "1000000-element Vector{Float64}:\n", + " 2.0\n", + " 6.0\n", + " 12.0\n", + " 20.0\n", + " 30.0\n", + " 42.0\n", + " 56.0\n", + " 72.0\n", + " 90.0\n", + " 110.0\n", + " ⋮\n", + " 9.99985000056e11\n", + " 9.99987000042e11\n", + " 9.9998900003e11\n", + " 9.9999100002e11\n", + " 9.99993000012e11\n", + " 9.99995000006e11\n", + " 9.99997000002e11\n", + " 9.99999e11\n", + " 1.000001e12" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "@time f1.(n_range)" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 0.077378 seconds (4 allocations: 7.629 MiB, 89.50% gc time)\n" + ] + }, + { + "data": { + "text/plain": [ + "1000000-element Vector{Float64}:\n", + " 2.0\n", + " 6.0\n", + " 12.0\n", + " 20.0\n", + " 30.0\n", + " 42.0\n", + " 56.0\n", + " 72.0\n", + " 90.0\n", + " 110.0\n", + " ⋮\n", + " 9.99985000056e11\n", + " 9.99987000042e11\n", + " 9.9998900003e11\n", + " 9.9999100002e11\n", + " 9.99993000012e11\n", + " 9.99995000006e11\n", + " 9.99997000002e11\n", + " 9.99999e11\n", + " 1.000001e12" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "@time f2.(n_range)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia 1.9.1", + "language": "julia", + "name": "julia-1.9" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.9.1" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/src/miemfp.jl b/src/miemfp.jl new file mode 100755 index 0000000..aa405df --- /dev/null +++ b/src/miemfp.jl @@ -0,0 +1,390 @@ +""" +A module for calculating the expected extinction coefficients and backscattering +parameters for coated/uncoated particles of a given size/material +""" +@fastmath module miemfp + +############################################################################# +# STATUS NOTES: # +# Synchronous parallelization implemented for bare calculations, notable # +# performance increase. Need to do same for coated # +############################################################################# + +using Base.Threads +using Distributed +using Memoize +using Interpolations + +const PI_5_996E3::Float64 = pi * 5.996e3 +const TWO_PI::Float64 = 2 * pi +const BHCOAT_DEL::Float64 = 1e-8 + +"Helper function for calculating om" +@memoize function _om_calc(wavel::Float64)::Float64 + PI_5_996E3 / wavel +end + +"Helper function for calculating om0" +@memoize function _om0r_calc(om0::Float64, fv::Float64, radcor::Float64)::Float64 + om0 + (fv / (radcor * 1e7)) +end + +"Helper function for calculating om^2" +@memoize function _om_sq_calc(om::Float64)::Float64 + om^2 +end + +"Helper function for calculating om0^2" +@memoize function _om0_sq_calc(om0::Float64)::Float64 + om0^2 +end + +"Helper function for calculating omp^2" +@memoize function _omp_sq_calc(omp::Float64)::Float64 + omp^2 +end + +"Helper function for calculating om0r^2" +@memoize function _om0r_sq_calc(om0r::Float64)::Float64 + om0r^2 +end + +" function that performs manipulations to om necessary for efficient mfp" +function _om_manipulations(wavel::Float64, fv::Float64, radcor::Float64, + omp::Float64, om0::Float64)::Tuple{Float64,Float64,Float64,Float64,Float64,Float64,Float64} + + om = _om_calc(wavel) + om0r = _om0r_calc(om0, fv, radcor) + om_sq = _om_sq_calc(om) + om0_sq = _om0_sq_calc(om0) + omp_sq = _omp_sq_calc(omp) + om0r_sq = _om0r_sq_calc(om0r) + om_sq_plus_om0_sq = om_sq + om0_sq + return (om, om0r, om_sq, om0_sq, omp_sq, om0r_sq, om_sq_plus_om0_sq) +end + +""" +Corrects refractive index and attenuation coefficient values to account for +the mean free-path effect on the free conductance electrons in the particles +(translated from Haiss et als FORTRAN implementation) +""" + function mfp(fv::Float64, wavel::Float64, radcor::Float64, omp::Float64, + om0::Float64, rn::Float64, rk::Float64)::Tuple{Float64,Float64,Float64} + + om, om0r, om_sq, _, omp_sq, om0r_sq, om_sq_plus_om0_sq = + _om_manipulations(wavel, fv, radcor, omp, om0) + + b1 = rn^2 - rk^2 - (1 - (omp_sq / om_sq_plus_om0_sq)) + b2 = 2 * rn * rk - (omp_sq * om0 / (om * om_sq_plus_om0_sq)) + a1r = 1 - (omp_sq / (om_sq + om0r_sq)) + a2r = omp_sq * om0r / (om * (om_sq + om0r_sq)) + + r_const = sqrt((a1r / 2 + b1 / 2)^2 + (a2r / 2 + b2 / 2)^2) + rnr = sqrt((a1r + b1) / 2 + r_const) + rkr = sqrt(-(a1r + b1) / 2 + r_const) + return (rnr, rkr, om0r) +end + +""" +Solves for Qext accounting for the effect of particle coatings on extinction +and scattering coefficients of particles (translated from Bohren/Huffman's +FORTRAN77 implementation for coated particles) +""" +function bhcoat(x::Float64, y::Float64, rfrel1::ComplexF64, rfrel2::ComplexF64 +)::Tuple{Float64,Float64,Float64} + x1::ComplexF64 = rfrel1 * x + x2::ComplexF64 = rfrel2 * x + y2::ComplexF64 = rfrel2 * y + nstop::UInt64 = UInt64(round(y + 4 * cbrt(y) + 1)) + refrel::ComplexF64 = rfrel2 / rfrel1 + + d0x1::ComplexF64 = cot(x1) + d0x2::ComplexF64 = cot(x2) + d0y2::ComplexF64 = cot(y2) + psi0y::Float64, psi1y::Float64 = cos(y), sin(y) + chi0y::Float64, chi1y::Float64 = -sin(y), cos(y) + # xi0y::ComplexF64 = ComplexF64(psi0y, -chi0y) + xi1y::ComplexF64 = ComplexF64(psi1y, -chi1y) + chi0y2::ComplexF64, chi1y2::ComplexF64 = -sin(y2), cos(y2) + chi0x2::ComplexF64, chi1x2::ComplexF64 = -sin(x2), cos(x2) + + qsca::Float64, qext::Float64, xback::ComplexF64 = 0.0, 0.0, ComplexF64(0.0, 0.0) + iflag::Bool = false + + @inbounds for n in (1:nstop)::UnitRange{Int64} + two_n_minus_1::Float64 = 2 * n - 1 + psiy::Float64 = two_n_minus_1 * psi1y / y - psi0y + chiy::Float64 = two_n_minus_1 * chi1y / y - chi0y + xiy::ComplexF64 = ComplexF64(psiy, -chiy) + d1y2::ComplexF64 = 1.0 / (n / y2 - d0y2) - n / y2 + + if iflag == false + d1x1 = 1.0 / (n / x1 - d0x1) - n / x1 + d1x2 = 1.0 / (n / x2 - d0x2) - n / x2 + chix2 = two_n_minus_1 * chi1x2 / x2 - chi0x2 + chiy2 = two_n_minus_1 * chi1y2 / y2 - chi0y2 + chipx2::ComplexF64 = chi1x2 - n * chix2 / x2 + chipy2 = chi1y2 - n * chiy2 / y2 + rack_denominator = chix2 * d1x2 - chipx2 + ancap::ComplexF64 = ((refrel * d1x1 - d1x2) / (refrel * d1x1 * chix2 - chipx2)) / rack_denominator + brack = ancap * (chiy2 * d1y2 - chipy2) + bncap::ComplexF64 = ((refrel * d1x2 - d1x1) / (refrel * chipx2 - d1x1 * chix2)) / rack_denominator + crack = bncap * (chiy2 * d1y2 - chipy2) + amess1::ComplexF64 = brack * chipy2 + amess2::ComplexF64 = brack * chiy2 + amess3::ComplexF64 = crack * chipy2 + amess4::ComplexF64 = crack * chiy2 + if !((abs(amess1) > BHCOAT_DEL * abs(d1y2)) + || (abs(amess2) > BHCOAT_DEL) + || (abs(amess3) > BHCOAT_DEL * abs(d1y2)) + || (abs(amess4) > BHCOAT_DEL)) + brack, crack = ComplexF64(0.0, 0.0), ComplexF64(0.0, 0.0) + iflag = true + end + end + dnbar::ComplexF64 = (d1y2 - brack * chipy2) / (1.0 - brack * chiy2) + gnbar::ComplexF64 = (d1y2 - crack * chipy2) / (1.0 - crack * chiy2) + n_over_y::Float64 = n / y + xiy_minus_xi1y::ComplexF64 = xiy - xi1y + psiy_minus_psi1y::Float64 = psiy - psi1y + an_mult::ComplexF64 = dnbar / rfrel2 + n_over_y + an::ComplexF64 = (an_mult * psiy_minus_psi1y) / (an_mult * xiy_minus_xi1y) + bn_mult::ComplexF64 = rfrel2 * gnbar + n_over_y + bn::ComplexF64 = (bn_mult * psiy_minus_psi1y) / (bn_mult * xiy_minus_xi1y) + two_n_plus_1::Float64 = 2 * n + 1 + qsca += two_n_plus_1 * (abs(an)^2 + abs(bn)^2) + xback_sign::Float64 = if iseven(n) + 1.0 + else + -1.0 + end + xback += xback_sign * two_n_plus_1 * (an - bn) + qext += two_n_plus_1 * (real(an) + real(bn)) + psi0y, psi1y = psi1y, psiy + chi0y, chi1y = chi1y, chiy + xi1y = psi1y - chi1y * im + chi0x2, chi1x2 = chi1x2, chix2 + chi0y2, chi1y2 = chi1y2, chiy2 + d0x1, d0x2, d0y2 = d1x1, d1x2, d1y2 + end + y_sq = y^2 + two_over_y_sq = 2.0 / y_sq + qsca = two_over_y_sq * qsca + qext = two_over_y_sq * qext + qback = real((1 / y_sq) * (xback * conj(xback))) + return (qext, qsca, qback) +end + +""" +Finds scattering parameters for uncoated particles. Heavily modified, but originally +based on a combination of the original FORTRAN77 BHMIE algorithm and a Python +implementation attributed to Herbert Kaiser hosted on ScatterLib (http://scatterlib.wikidot.com/mie) +""" +function bhmie(x::Float64, refrel::ComplexF64, nang::UInt32 +)::Tuple{Float64,Float64,Float64,Array{ComplexF64,1},Array{ComplexF64,1}} + y::ComplexF64 = x * refrel + nstop::UInt32 = UInt32(round(x + 4.0 * cbrt(x) + 2.0)) + nn::UInt32 = UInt32(round(max(nstop, abs(y)) + 14)) + amu::Vector{Float64} = cos.((1.570796327 / Float64(nang - 1)).*Float64.(0:nang-1)) + + d = Vector{ComplexF64}(undef, nn) + d[nn] = ComplexF64(0.0, 0.0) + @simd for n in nn:-1:2 + let n_over_y = n / y + @views d[n-1] = n_over_y - (1.0 / (d[n] + n_over_y)) + end + end + + psi0 = cos(x) + psi1 = sin(x) + qsca::Float64 = 0.0 + # xi0 = ComplexF64(psi0, psi1) + xi1 = ComplexF64(psi1, -psi0) + chi1 = psi0 + chi0 = -psi1 + s1_1 = zeros(ComplexF64, nang) + s1_2 = zeros(ComplexF64, nang) + s2_1 = zeros(ComplexF64, nang) + s2_2 = zeros(ComplexF64, nang) + pi0::Vector{Float64} = zeros(nang) + pi1::Vector{Float64} = ones(nang) + tau::Vector{Float64} = similar(Vector{Float64}, nang) + @inbounds @simd for n in (1:nstop)::UnitRange{Int64} + psi, chi = let nm1x2 = 2 * n - 1 + nm1x2 * psi1 / x - psi0, + nm1x2 * chi1 / x - chi0 + end + xi = psi - (chi * im) + an::ComplexF64, bn::ComplexF64 = let @views dn = d[n] + let an_mult::ComplexF64 = dn / refrel + n / x + (an_mult * psi - psi1) / (an_mult * xi - xi1) + end, + let bn_mult::ComplexF64 = refrel * dn + n / x + (bn_mult * psi - psi1) / (bn_mult * xi - xi1) + end + end + + qsca += (2 * n + 1) * ((abs(an)^2) + (abs(bn)^2)) + pi_ = pi1 + + let np1x2 = 2 * n + 1, tau = n * amu .* pi_ - (n + 1) .* pi0 + let fn = np1x2 / (n * (n + 1)), anpi = an * pi_, antau = an * tau, bnpi = bn * pi_, bntau = bn * tau + s1_1::Vector{ComplexF64} .+= fn * (anpi + bntau) + s2_1::Vector{ComplexF64} .+= fn * (antau + bnpi) + if isodd(n) + s1_2::Vector{ComplexF64} .+= fn * (anpi - bntau) + s2_2::Vector{ComplexF64} .+= fn * (bnpi - antau) + else + s1_2::Vector{ComplexF64} .-= fn * (anpi - bntau) + s2_2::Vector{ComplexF64} .-= fn * (bnpi - antau) + end + end + pi1 = (np1x2 * amu .* pi_ - (n + 1) .* pi0) / n + end + psi0, chi0 = psi1, chi1 + psi1, chi1 = psi, chi + xi1 = ComplexF64(psi1, -chi1) + pi0 = pi_ + end + @inbounds s1::Vector{ComplexF64} = vcat(s1_1, s1_2[1:-1:end-1]) + @inbounds s2::Vector{ComplexF64} = vcat(s2_1, s2_2[1:-1:end-1]) + x_sq::Float64 = x^2 + qsca *= (2.0 / (x_sq)) + qext::Float64, qback::Float64 = let four_over_x_sq::Float64 = 4.0 / x_sq + (four_over_x_sq) * real(s1[1]), + (four_over_x_sq) * (abs(s1[2*nang-1])^2) + end + return (qext, qsca, qback, s1, s2) +end + +"Helper function to calculate the apparent cross section" +@memoize function _calc_apparent_cross_section(radcore::Float64, refmed::Float64)::Float64 + TWO_PI * radcore * refmed +end + +# The following is a messy setup to allow for caching of the interpolation objects +# The reason this has been implemented this way is because Interpolations.jl has +# very confusing behavior when it comes to typing and caching. This is a workaround. +struct InterpolationPair + rn::Interpolations.Extrapolation{Float64,1,Interpolations.GriddedInterpolation{Float64,1,Vector{Float64},Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}},Tuple{Vector{Float64}}},Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}},Interpolations.Throw{Nothing}} + rk::Interpolations.Extrapolation{Float64,1,Interpolations.GriddedInterpolation{Float64,1,Vector{Float64},Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}},Tuple{Vector{Float64}}},Interpolations.Gridded{Interpolations.Linear{Interpolations.Throw{Interpolations.OnGrid}}},Interpolations.Throw{Nothing}} +end + +const _cache = Dict{UInt64,InterpolationPair}() + +"Helper function to get the interpolation objects for rn and rk" + function _get_rnrk_interp_objects(refcore::Array{Float64,2})::InterpolationPair + refcore_hash = hash(refcore) + if !haskey(_cache, refcore_hash) + _cache[refcore_hash] = InterpolationPair(LinearInterpolation(refcore[:, 1], refcore[:, 2]), LinearInterpolation(refcore[:, 1], refcore[:, 3])) + end + return _cache[refcore_hash] +end + +"Helper function to calculate the delta wavelength for a given wavelength range and number of values" +@memoize function _calc_delta_wl(wavel1::Float64, wavel2::Float64, numval::UInt32)::Float64 + (wavel2 - wavel1) / (numval - 1) +end + +"Helper function to calculate the size parameter" +@memoize function _calc_size_parameter(apparent_cross_section::Float64, wavel::Float64)::Float64 + apparent_cross_section / wavel +end + +"Wrapper for partial dispatch of the bhmie function" +struct _bhmie + nang::UInt32 +end + +function (p::_bhmie)(x::Float64, refrel::ComplexF64)::Float64 + first(bhmie(x, refrel, p.nang))::Float64 +end + +"Wrapper for partial dispatch of the mfp function" +struct _mfp + fv::Float64 + radcore::Float64 + omp::Float64 + om0::Float64 +end + +function(p::_mfp)(wavel::Float64, rn::Float64, rk::Float64)::ComplexF64 + refre1, refim1, _ = mfp(p.fv, wavel, p.radcore, p.omp, p.om0, rn, rk) + return ComplexF64(refre1, refim1)::ComplexF64 +end + +""" +Calculates the expected extinction coefficient spectrum for particles of a given +size for uncoated particles (modified/translated from Haiss et als FORTRAN implementation) +""" +function qbare(wavel1::Float64, wavel2::Float64, numval::UInt32, scangles::UInt32, + refmed::Float64, radcore::Float64, omp::Float64, om0::Float64, + fv::Float64, refcore::Array{Float64,2})::Matrix{Float64} + + # calculate the new wavelengths + qarray::Matrix{Float64} = let wavelengths::StepRangeLen{Float64} = wavel1:_calc_delta_wl(wavel1, wavel2, numval):wavel2 + hcat(wavelengths, Vector{Float64}(undef, numval)) + end + interp_pair::InterpolationPair = _get_rnrk_interp_objects(refcore) + let interp_ref_rn = interp_pair.rn, interp_ref_rk = interp_pair.rk, map_fn = _bhmie(scangles), mfp_fn = _mfp(fv, radcore, omp, om0) + @inbounds @threads for i in 0x00000001:numval + wl = qarray[i, 1] + qarray[i, 2] = map_fn( + _calc_apparent_cross_section(radcore, refmed) / wl, + mfp_fn(wl, interp_ref_rn(wl), interp_ref_rk(wl)) / refmed + ) + end + end + + return qarray +end + +""" +Calculates the expected extinction coefficient spectrum for particles of a given +size for coated particles (translated from Haiss et als FORTRAN implementation) +""" +function qcoat(wavel1::Float64, wavel2::Float64, numval::Int64, refmed::Float64, + radcor::Float64, refre1::Float64, refim1::Float64, + radcot::Float64, refre2::Float64, refim2::Float64, + omp::Float64, om0::Float64, fv::Float64, refcore::Array{Float64,2}) + # TODO: Add static output! + # refcore is an array containing the spectrum of refractive index vs particle size + tau::Float64 = (1 / om0) * 1e-14 + fmpinf::Float64 = fv * tau + delta::Float64 = (wavel2 - wavel1) / (numval - 1) + + wavrnrk::Vector{Tuple{Float64,Float64,Float64}} = Vector{Tuple{Float64,Float64,Float64}}() + k::UInt32 = 1 + @simd for i in 1:numval + wavel::Float64 = wavel1 + (i - 1) * delta + # find values for refractive index of particles using linear interpolation: + if (wavel != refcore[1, 1]) + while (refcore[k, 1] < wavel) + k += 1 + end + push!(wavrnrk, (wavel, + (refcore[k-1, 2] + (wavel - refcore[k-1, 1]) / (refcore[k, 1] - refcore[k-1, 1]) * (refcore[k, 2] - refcore[k-1, 2])), + (refcore[k-1, 3] + (wavel - refcore[k-1, 1]) / (refcore[k, 1] - refcore[k-1, 1]) * (refcore[k, 3] - refcore[k-1, 3]))) + ) + end + end + qarray::Array{Float64} = Array{Float64}(0, 4) + @inbounds @simd for vals in wavrnrk + wavel::Float64, rn::Float64, rk::Float64 = vals + # adjust for "mean free path effect" on free electrons in metal core + refre1, refim1, om0r = mfp(fv, wavel, radcor, omp, om0, rn, rk) + # calculate relative size parameters x and y for core and coating respectively + two_pi_times_refractive_ratio::Float64 = TWO_PI * (refmed / refre1) + x = radcor * two_pi_times_refractive_ratio + y = radcot * two_pi_times_refractive_ratio + # calculate ComplexF64 refractive indices: + rfrel1 = refre1 + (refim1 * im) / refmed + rfrel2 = refre2 + (refim2 * im) / refmed + # appends data to qarray as a row in the format [wavel qext qsca qback] + # bhcoat outputs are adjusted to be relative to core instead of coating + qarray = vcat(qarray, [wavel (bhcoat(x, y, rfrel1, rfrel2) .* ((radcot / radcor)^2))...]) + end + return qarray +end + +end diff --git a/src/nanoconc.jl b/src/nanoconc.jl new file mode 100755 index 0000000..791f47d --- /dev/null +++ b/src/nanoconc.jl @@ -0,0 +1,324 @@ +""" +A module that uses the functions contained in miemfp and quantumcalc to find the +concentration of a nanoparticle colloid given enough information +""" +@fastmath module nanoconc + +export fetchinfo, dispinfo, addmaterial, loadmaterial, listmaterials, delmaterial, editmaterial, qpredict, abspredict + +include("miemfp.jl") +include("quantumcalc.jl") + +using CSV +using DataFrames +using HDF5 + +const matfile = "data/materials.h5" # this is the location of the material datafile + +""" +Fetches info string for a saved material +""" +function fetchinfo(material::String)::String + return string("\nMaterial:\t\t", material, + "\n- Valence:\t\t", h5readattr(matfile, material)["z"], + "\n- Atomic Mass:\t\t", h5readattr(matfile, material)["am"], + "amu\n- Density:\t\t", h5readattr(matfile, material)["rho"], + "g/cm^3\n- Resistivity:\t\t", h5readattr(matfile, material)["res"], + "g/cm^3\nDerived values:\n- Plasma frequency:\t", h5readattr(matfile, material)["omp"], + "e14Hz\n- Collision frequency:\t", h5readattr(matfile, material)["om0"], + "e14Hz\n- Fermi Velocity:\t", h5readattr(matfile, material)["fv"], "cm/s\n", + h5readattr(matfile, material)["info"], + "\nDescription:\n\"", h5readattr(matfile, material)["description"], + "\"\n") +end + +""" +Displays info for saved material +""" +function dispinfo(material::String) + print(fetchinfo(material)) +end + +""" +stores material data for future use in the materials HDF5 data file with the given +material name and description. Requires valence (z), atomic mass (am), density (rho)(g/cm^3) +resistivity (res)(ohm*m) and a complex refractive index spectrum from a file at filepath. +Refractive index data is taken from an appropriately formatted csv file (formatted with +columns entitled "w","n" and "k" for wavelength in nm, n and k respectively) +""" +function addmaterial(z::Float64, am::Float64, rho::Float64, res::Float64, + filepath::String, material::String, description::String; + disp::Bool=true) + try + flag = h5open(matfile, "r") do file + has(file, material) + end + catch + flag = false + end + + if !flag + df::DataFrames.DataFrame = CSV.read(filepath) + data::Array{Float64,2} = (convert(Array{Float64,2}, hcat(df[:w], df[:n], df[:k]))) + h5write(matfile, material, data) + omp, om0, fv = quantumcalc.mieparams(z, am, rho, res) + println(omp) + println(om0) + println(fv) + h5writeattr(matfile, material, Dict( + "z" => z, + "am" => am, + "rho" => rho, + "res" => res, + "omp" => omp, + "om0" => om0, + "fv" => fv, + "description" => description, + "info" => string("Wavelength Range:\t", minimum(data[:, 1]), + "nm-", maximum(data[:, 1]), + "nm\nNumber of datapoints:\t", + size(data)[1]))) + if disp == true + println("\nAdded material:") + dispinfo(material) + end + elseif disp == true + println("\nMaterial ", material, " Already exists!\n\nExisting material:") + dispinfo(material) + end +end + +""" +An alternative version of the addmaterial function for materials with known mie + parameters. Requires input of plasma freq (omp) in Hz/1e14, collision freq (om0) in Hz/1e14 and + Fermi velocity (fv) in cm/s +""" +function addmaterial(omp::Float64, om0::Float64, fv::Float64, + filepath::String, material::String, description::String; + disp::Bool=true) + try + flag = h5open(matfile, "r") do file + has(file, material) + end + catch + flag = false + end + + if !flag + df::DataFrames.DataFrame = CSV.read(filepath) + data::Array{Float64,2} = (convert(Array{Float64,2}, hcat(df[:w], df[:n], df[:k]))) + h5write(matfile, material, data) + println(omp) + println(om0) + println(fv) + h5writeattr(matfile, material, Dict( + "omp" => omp, + "om0" => om0, + "fv" => fv, + "description" => description, + "info" => string("Wavelength Range:\t", minimum(data[:, 1]), + "nm-", maximum(data[:, 1]), + "nm\nNumber of datapoints:\t", + size(data)[1]))) + if disp == true + println("\nAdded material:") + dispinfo(material) + end + elseif disp == true + println("\nMaterial ", material, " Already exists!\n\nExisting material:") + dispinfo(material) + end +end + +""" +This function loads the stored miemfp data for a saved material. omp, om0, fv and +refractive index array are returned as a static tuple that can be readily splatted +into the last few args of the miemfp.qbare and miemfp.qcoat functions +""" +function loadmaterial(material::String; disp::Bool=true +)::Tuple{Float64,Float64,Float64,Array{Float64,2}} + local output::Tuple{Float64,Float64,Float64,Array{Float64,2}} + h5open(matfile, "r") do file + material_data = file[material] + output = ( + read(material_data["omp"]), + read(material_data["om0"]), + read(material_data["fv"]), + read(material_data) + ) + end + if disp == true + println("\nLoading material:") + dispinfo(material) + println() + end + return output +end + +""" +This function lists all materials for which refractive index data is stored +""" +function listmaterials() + h5open(matfile, "r") do file + flag::Bool = false + for i in file + flag = true + break + end + if flag == true + println("\nSaved materials:") + for material in file + println(name(material)) + end + else + println("\nNo materials saved!") + end + end +end + +""" +This function deletes a material from the materials datafile +""" +function delmaterial(material::String; disp::Bool=true) + h5open(matfile, "r+") do file + if exists(file, material) + if disp == true + println("\nDeleting material:") + dispinfo(material) + println() + end + o_delete(file, material) + else + println("\nMaterial \"", material, "\" not found!") + end + end +end + +""" +This function allows editing of specific parameters for a stored material +""" +function editmaterial(material::String, param::String, value; disp::Bool=true) + h5open(matfile, "r+") do file + if !exists(file, material) + if disp + println("\nMaterial \"", material, "\" not found!") + end + return + end + end + matattr = h5readattr(matfile, material) + matdata = h5read(matfile, material) + if param == "refind" + val0 = matdata + value::typeof(matdata) + matdata = value + else + val0 = matattr[param] + value::typeof(val0) + matattr[param] = value + end + h5open(matfile, "r+") do file + o_delete(file, material) + end + h5write(matfile, material, matdata) + h5writeattr(matfile, material, matattr) + if disp + println(material, " Parameter ", param, " changed from ", val0, " to ", value) + end +end + +""" +A function that predicts the expected average per particle extinction efficiency +spectrum for a colloid within a wavelength range (wavel1 - wavel2) with a set +number of points (numval) per spectrum. Also requires refractive index of the +medium, a particledata array containing the diameters of the particles in solution +(in nm) and their relative amounts, and the saved material data array +""" +function qpredict(refmed::Float64, wavel1::Float64, wavel2::Float64, + numval::UInt32, particledata::Array{Float64,2}, + materialdata::Tuple{Float64,Float64,Float64,Array{Float64,2}} +)::Array{Float64,2} + # normalise relative amounts of particles to a total of 1 + particledata[:, 2] = particledata[:, 2] ./ sum(particledata[:, 2]) + # convert particle diameters in particledata to radii + particledata[:, 1] = particledata[:, 1] ./ 2 + # define a wrapper function for later vectorised calculations + spec(x) = miemfp.qbare(wavel1, wavel2, numval, 0x00000002, refmed, x, materialdata...) + # note: the UInt32 above for "scangles" must be at least 2 for accurate Qext. Higher "scangles" + ## does not increase Qext precision but will be important if modding to also account for Qsca + # perform vectorised spectrum prediction on particledata array + spectra = spec.(particledata[:, 1]) + # for each spectrum, multiply all values by their relative amounts from the particledata array + @inbounds @simd for i in eachindex(spectra) + spectra[i][:, 2] = particledata[i, 2] .* spectra[i][:, 2] + end + # prep an array for final predicted spectrum + data::Array{Float64,2} = Array{Float64,2}(undef, numval, 2) + data[:, 1] = spectra[1][:, 1] + data[:, 2] = zeros(numval) + # for each weighted spectrum, add it to the total spectrum in the "data" array + @inbounds @simd for x in spectra + data[:, 2] = data[:, 2] .+ x[:, 2] + end + return data +end + +struct q_to_sigma + geometric_cross_section::Vector{Float64} + + function q_to_sigma(diameter::Vector{Float64})::q_to_sigma + new(π .* ((diameter ./ 2).^2)) + end +end + +function (p::q_to_sigma)(q::Matrix{Float64})::Array{Float64, 3} + # Calculate the extinction cross-section + hcat([q .* x for x in p.geometric_cross_section]) +end + +function sigmapredict(refmed::Float64, wavel1::Float64, wavel2::Float64, + numval::UInt32, particledata::Array{Float64,2}, + materialdata::Tuple{Float64,Float64,Float64,Array{Float64,2}} +)::Array{Float64,2} + # normalise relative amounts of particles to a total of 1 + particledata[:, 2] = particledata[:, 2] ./ sum(particledata[:, 2]) + # convert particle diameters in particledata to radii + particledata[:, 1] = particledata[:, 1] ./ 2 + # define a wrapper function for later vectorised calculations + spec(x) = miemfp.qbare(wavel1, wavel2, numval, 0x00000002, refmed, x, materialdata...) + # note: the UInt32 above for "scangles" must be at least 2 for accurate Qext. Higher "scangles" + ## does not increase Qext precision but will be important if modding to also account for Qsca + # perform vectorised spectrum prediction on particledata array + spectra = spec.(particledata[:, 1]) + println(size(spectra)) + # for each spectrum, multiply all values by their relative amounts from the particledata array + @inbounds @simd for i in eachindex(spectra) + spectra[i][:, 2] = particledata[i, 2] .* spectra[i][:, 2] + end + # prep an array for final predicted spectrum + data::Array{Float64,2} = Array{Float64,2}(undef, numval, 2) + data[:, 1] = spectra[1][:, 1] + data[:, 2] = zeros(numval) + # for each weighted spectrum, add it to the total spectrum in the "data" array + @inbounds @simd for x in spectra + data[:, 2] = data[:, 2] .+ x[:, 2] + end + return data +end + +function abspredict(refmed::Float64, wavel1::Float64, wavel2::Float64, + numval::UInt32, particledata::Array{Float64,2}, + materialdata::Tuple{Float64,Float64,Float64,Array{Float64,2}}, + ppml::Float64, d0::Float64)::Array{Float64,2} + data = qpredict(refmed, wavel1, wavel2, numval, particledata, materialdata) + predict(qext) = quantumcalc.predictabs( + qext, + sum([particledata[i, 1] * particledata[i, 2] for i in 1:size(particledata)[1]]) / sum(particledata[:, 2]), + ppml, + d0 + ) + data[:, 2] = predict.(data[:, 2]) + return data +end + +end diff --git a/src/quantumcalc.jl b/src/quantumcalc.jl new file mode 100755 index 0000000..3a72d43 --- /dev/null +++ b/src/quantumcalc.jl @@ -0,0 +1,196 @@ +# NOTE: Future functionality to add +# calculation of plasma frequency/collision frequency for non-metals +# can be done based on electron's "effective mass" and charge +# carrier density instead of e- density? + +""" +A module containing functions that apply various quantum physics formulae +for use with "miemfp.jl" in spectrum prediction/concentration calculation +""" +@fastmath module quantumcalc + +using Memoize + +# Planck's constant in JS according to the CODATA 2014 definition +const h::Float64 = 6.626070040e-34 +# Reduced Planck's Constant +const hbar::Float64 = h / (2 * pi) +# Fine structure constant based on the CODATA 2014 definition +const alpha::Float64 = 7.2973525664e-3 +# Speed of light in vacuum by the CODATA 2014 definition +const c::Float64 = 299752458 +# Elementary charge in C according to the CODATA 2014 definition +const ec::Float64 = 1.6021766208e-19 +# Boltzmann Constant in J/K according to CODATA 2014 definition +const kb::Float64 = 1.38064852e-23 +# Electron mass in kg according to the 2014 CODATA definition of 1amu and ref: DOI:10.1038/nature13026 +const me::Float64 = 9.109383555654034e-31 +# Bohr radius in m +const a0::Float64 = hbar / (me * c * alpha) +# Avogadro's constant in mol^-1 according to the CODATA 2014 definition +const A::Float64 = 6.022140857e23 +# Precomputed constants for optimization of functions +const A_E6::Float64 = A * 1e6 +const PI_SQUARED::Float64 = pi^2 +const THREE_PI_SQUARED::Float64 = 3 * PI_SQUARED +const TWO_PI::Float64 = 2 * pi +const FOUR_PI::Float64 = 2 * TWO_PI +const TWO_PI_TIMES_11_44E15::Float64 = TWO_PI * 11.44e15 +const EC_SQUARED::Float64 = ec^2 +const A_PI_LOG10_EULER_OVER_1000::Float64 = (A * pi * log10(ℯ)) / 1000 +const NUM_TO_MOL_CONV::Float64 = 1000 / A + + +""" +Calculates the free electron density (ne) in m^-3 of an elemental material given +its valence (z), atomic mass in amu (am) and mass density (rho) in g/cm^2 +Source: ISBN 0-03-083993-9 (page 4) +""" +function metalfed(z::Float64, rho::Float64, am::Float64)::Float64 + (A_E6 * ((z * rho) / am)) +end + +""" +Calculates the Fermi wave vector (kf) of electrons in a material given +electron density (ne) +Source: ISBN 0-03-083993-9 (page 36) +""" +function fermivec(ne::Float64)::Float64 + cbrt(ne * THREE_PI_SQUARED) +end + +""" +Calculates the Fermi velocity (fv) in m/s of electrons in a material given Fermi +wave vector (kf) +Source: ISBN 0-03-083993-9 (page 36) +""" +function fermivel(kf::Float64; mstar::Float64=me)::Float64 + (hbar / mstar) * kf +end + +""" +Calculates the electron sphere radius (rs) given its free electron density (ne) +Source: ISBN 0-03-083993-9 (page 4) +""" +function spherad(ne::Float64)::Float64 + cbrt(3 / (FOUR_PI * ne)) +end + +""" +Calculates the plasma frequency (omp) of a material in Hz give its electron +sphere radius (rs) +Source: ISBN 0-03-083993-9 (page 758) +""" +function plasmafreq(rs::Float64)::Float64 + TWO_PI_TIMES_11_44E15 * ((rs / a0)^(-1.5)) +end + +""" +Calculates the collision frequency (om0) in Hz for a material given its free +electron density (ne) and its resistivity (res) +Source: ISBN 0-03-083993-9 (page 8) +""" +function collfreq(ne::Float64, res::Float64; mstar::Float64=me)::Float64 + r((EC_SQUARED) * ne * res) / mstar +end + +""" +Calculates the plasma freq (omp) in Hz/1e14, collision freq (om0) in Hz/1e14 and +Fermi velocity (fv) in cm/s of an elemental material given its valence (z), +atomic mass (am) in amu, mass density (rho) in g/cm^2 and its resisitivity (res) +in Ohm*m as a tuple of (omp,om0,fv) for use in Mie model algorithms contained in +the "miemfp" module +""" +function mieparams(z::Float64, am::Float64, rho::Float64, res::Float64) + ne::Float64 = metalfed(z, rho, am)::Tuple{Float64,Float64,Float64} + @sync begin + @async omp = plasmafreq(spherad(ne)) * 1e-14 + @async om0 = collfreq(ne, res) * 1e-14 + @async fv = fermivel(fermivec(ne)) * 1e2 + end + + (omp, om0, fv) +end + +""" +Converts Qext to the molar attenuation coefficient (κ) based on the average radius +of the particles present. Formula sourced from ISSN 1061-933X +formula: κ = π * R^2 * Qext * Na * log(e) / 1000 +""" +function attencoeff(qext::Float64, r::Float64)::Float64 + (r^2) * qext * A_PI_LOG10_EULER_OVER_1000 +end + +""" +Converts units per millilitre to moles per litre +""" +@memoize function numtomol(n::Float64)::Float64 + n * NUM_TO_MOL_CONV +end + +""" +Finds absorbance based on molar attenutaion coefficient (κ), concentration (molar) +(c) and path length (in cm) (d0) based on the Beer/Lambert law +""" +function attentoabs(kappa::Float64, c::Float64, d0::Float64)::Float64 + kappa * c * d0 +end + +""" +Predicts the abs value as displayed on a spectrum from the extinction efficiency +(qext), average particle radius (avgr), particles per ml (ppml) and path length (l) +""" +function predictabs(qext::Float64, avgr::Float64, ppml::Float64, l::Float64)::Float64 + log10(attentoabs(attencoeff(qext, avgr), numtomol(ppml), l)) +end + +# Below is an old, failed version of the predictabs code above, kept in case useful in later debugging +# +# @doc """ +# This function takes an absorbance (Abs), extinction coefficient (qext), average +# particle radius in nm (r) and path length (d0) and returns a count of particles +# per ml +# """ -> +# function partperml(Abs::Float64,qext::Float64,r::Float64,d0::Float64) +# return (log(10) * Abs) / (pi * (r ^ 2) *qext * d0) ::Float64 +# end +# +# @doc """ +# This function takes number of particles per ml, extinction coefficient (qext), +# average particle radius in nm (r) and path length (d0) and returns a predicted +# absorbance value (from DOI: 10.1016/j.saa.2017.10.047) +# """ -> +# function abspredict(N::Float64,qext::Float64,r::Float64,d0::Float64) +# # note: log10 here is not part of formula but it is required to convert to AU (i think) +# return log10((pi * (r^2) *qext * d0 * N) / log(10)) ::Float64 +# end + +############## FUNCTIONS BELOW THIS POINT ARE PROTOTYPES ####################### + +# NOTE: if successful change mieparams to miemetal +function XXmieionic(z::Float64, rho::Float64, mm::Float64, shc::Float64, res::Float64)::Tuple{Float64,Float64,Float64} + # mm is molar mass in g/mol + ne::Float64 = metalfed(z, rho, mm) + mstar::Float64 = (shc * hbar^2 * (3 * PI_SQUARED * ne)^(2 / 3)) / (PI_SQUARED * kb^2 * A * z) + + return ( + plasmafreq(spherad(ne)) * 1e-14, + collfreq(ne, res, mstar=mstar) * 1e-14, + fermivel(fermivec(ne), mstar=mstar) * 1e2 + ) +end + +function mieionic(z::Float64, rho::Float64, mm::Float64, shc::Float64, res::Float64)::Tuple{Float64,Float64,Float64} + # mm is molar mass in g/mol + ne::Float64 = metalfed(z, rho, mm) + rs::Float64 = spherad(ne) + mstar::Float64 = shc * me / 0.169 * z * ((rs / a0)^2) * 1e-4 + + return ( + plasmafreq(rs) * 1e-14, + collfreq(ne, res, mstar=mstar) * 1e-14, + fermivel(fermivec(ne), mstar=mstar) * 1e2 + ) +end + +end diff --git a/test/data/Main.nanoconc.abspredict.ser b/test/data/Main.nanoconc.abspredict.ser new file mode 100644 index 0000000..61640fd Binary files /dev/null and b/test/data/Main.nanoconc.abspredict.ser differ diff --git a/test/data/Main.nanoconc.loadmaterial.ser b/test/data/Main.nanoconc.loadmaterial.ser new file mode 100644 index 0000000..d7ad776 Binary files /dev/null and b/test/data/Main.nanoconc.loadmaterial.ser differ diff --git a/test/data/Main.nanoconc.miemfp.bhmie.ser b/test/data/Main.nanoconc.miemfp.bhmie.ser new file mode 100644 index 0000000..b0680ec Binary files /dev/null and b/test/data/Main.nanoconc.miemfp.bhmie.ser differ diff --git a/test/data/Main.nanoconc.miemfp.mfp.ser b/test/data/Main.nanoconc.miemfp.mfp.ser new file mode 100644 index 0000000..96f51b7 Binary files /dev/null and b/test/data/Main.nanoconc.miemfp.mfp.ser differ diff --git a/test/data/Main.nanoconc.miemfp.qbare.ser b/test/data/Main.nanoconc.miemfp.qbare.ser new file mode 100644 index 0000000..74c1a76 Binary files /dev/null and b/test/data/Main.nanoconc.miemfp.qbare.ser differ diff --git a/test/data/Main.nanoconc.qpredict.ser b/test/data/Main.nanoconc.qpredict.ser new file mode 100644 index 0000000..fc5b2e8 Binary files /dev/null and b/test/data/Main.nanoconc.qpredict.ser differ diff --git a/test/data/Main.nanoconc.quantumcalc.attencoeff.ser b/test/data/Main.nanoconc.quantumcalc.attencoeff.ser new file mode 100644 index 0000000..8ce67df Binary files /dev/null and b/test/data/Main.nanoconc.quantumcalc.attencoeff.ser differ diff --git a/test/data/Main.nanoconc.quantumcalc.attentoabs.ser b/test/data/Main.nanoconc.quantumcalc.attentoabs.ser new file mode 100644 index 0000000..a7f0817 Binary files /dev/null and b/test/data/Main.nanoconc.quantumcalc.attentoabs.ser differ diff --git a/test/data/Main.nanoconc.quantumcalc.numtomol.ser b/test/data/Main.nanoconc.quantumcalc.numtomol.ser new file mode 100644 index 0000000..86adeae Binary files /dev/null and b/test/data/Main.nanoconc.quantumcalc.numtomol.ser differ diff --git a/test/data/Main.nanoconc.quantumcalc.predictabs.ser b/test/data/Main.nanoconc.quantumcalc.predictabs.ser new file mode 100644 index 0000000..8b5a799 Binary files /dev/null and b/test/data/Main.nanoconc.quantumcalc.predictabs.ser differ diff --git a/test/miemfp_tests.jl b/test/miemfp_tests.jl new file mode 100644 index 0000000..ef3447b --- /dev/null +++ b/test/miemfp_tests.jl @@ -0,0 +1,31 @@ +using Test + +if !@isdefined TestUtils + include("testutils.jl") +end +if !@isdefined nanoconc + include("../src/nanoconc.jl") +end + +@testset "miemfp" begin + @testset "miemfp.bhmie" begin + TestUtils.test_from_serialized( + nanoconc.miemfp.bhmie, + "test/data/Main.nanoconc.miemfp.bhmie.ser" + ) + end + + @testset "miemfp.mfp" begin + TestUtils.test_from_serialized( + nanoconc.miemfp.mfp, + "test/data/Main.nanoconc.miemfp.mfp.ser" + ) + end + + @testset "miemfp.qbare" begin + TestUtils.test_from_serialized( + nanoconc.miemfp.qbare, + "test/data/Main.nanoconc.miemfp.qbare.ser" + ) + end +end \ No newline at end of file diff --git a/test/nanoconc_tests.jl b/test/nanoconc_tests.jl new file mode 100644 index 0000000..0e4b63b --- /dev/null +++ b/test/nanoconc_tests.jl @@ -0,0 +1,24 @@ +using Test + +if !@isdefined TestUtils + include("testutils.jl") +end +if !@isdefined nanoconc + include("../src/nanoconc.jl") +end + +@testset "nanoconc" begin + @testset "qpredict" begin + TestUtils.test_from_serialized( + nanoconc.qpredict, + "test/data/Main.nanoconc.qpredict.ser" + ) + end + + @testset "nanoconc" begin + TestUtils.test_from_serialized( + nanoconc.abspredict, + "test/data/Main.nanoconc.abspredict.ser" + ) + end +end \ No newline at end of file diff --git a/test/quantumcalc_tests.jl b/test/quantumcalc_tests.jl new file mode 100644 index 0000000..f8985f8 --- /dev/null +++ b/test/quantumcalc_tests.jl @@ -0,0 +1,38 @@ +using Test + +if !@isdefined TestUtils + include("testutils.jl") +end +if !@isdefined nanoconc + include("../src/nanoconc.jl") +end + +@testset "quantumcalc" begin + @testset "quantumcalc.attencoeff" begin + TestUtils.test_from_serialized( + nanoconc.quantumcalc.attencoeff, + "test/data/Main.nanoconc.quantumcalc.attencoeff.ser" + ) + end + + @testset "quantumcalc.attentoabs" begin + TestUtils.test_from_serialized( + nanoconc.quantumcalc.attentoabs, + "test/data/Main.nanoconc.quantumcalc.attentoabs.ser" + ) + end + + @testset "quantumcalc.numtomol" begin + TestUtils.test_from_serialized( + nanoconc.quantumcalc.numtomol, + "test/data/Main.nanoconc.quantumcalc.numtomol.ser" + ) + end + + @testset "quantumcalc.predictabs" begin + TestUtils.test_from_serialized( + nanoconc.quantumcalc.predictabs, + "test/data/Main.nanoconc.quantumcalc.predictabs.ser" + ) + end +end \ No newline at end of file diff --git a/test/runtests.jl b/test/runtests.jl new file mode 100644 index 0000000..62221ee --- /dev/null +++ b/test/runtests.jl @@ -0,0 +1,8 @@ +using Test + +include("testutils.jl") +include("../src/nanoconc.jl") + +include("nanoconc_tests.jl") +include("miemfp_tests.jl") +include("quantumcalc_tests.jl") \ No newline at end of file diff --git a/test/testutils.jl b/test/testutils.jl new file mode 100644 index 0000000..a8181cc --- /dev/null +++ b/test/testutils.jl @@ -0,0 +1,25 @@ +module TestUtils +using Serialization + +using Test + +function fieldvalues(obj) + [getfield(obj, f) for f in fieldnames(typeof(obj))] +end + +deep_compare(a, b; rtol::Real=sqrt(eps()), atol::Real=0.) = a == b # base case: use == +deep_compare(a::Union{AbstractFloat, Complex}, b::Union{AbstractFloat, Complex}; rtol::Real=sqrt(eps()), atol::Real=0.) = isapprox(a, b) # for floats, use isapprox +deep_compare(a::Union{Array{AbstractFloat}, Array{Complex}}, b::Union{Array{AbstractFloat}, Array{Complex}}; rtol::Real=sqrt(eps()), atol::Real=0.) = isapprox(a, b) # for arrays of floats, use isapprox element-wise +deep_compare(a::AbstractArray, b::AbstractArray; rtol::Real=sqrt(eps()), atol::Real=0.) = all(deep_compare.(a, b; rtol, atol)) # for arrays of other types, recurse +deep_compare(a::Tuple, b::Tuple; rtol::Real=sqrt(eps()), atol::Real=0.) = all(deep_compare.(a, b; rtol, atol)) # for tuples, recurse +deep_compare(a::T, b::T; rtol::Real=sqrt(eps()), atol::Real=0.) where {T <: Any} = deep_compare(fieldvalues(a), fieldvalues(b); rtol, atol) # for composite types, recurse + +function test_from_serialized(fn::Function, filename::String) + argskwargs, out = open(filename, "r") do f + deserialize(f) + end + + @test deep_compare([fn(a...; kw...) for (a, kw) in argskwargs], out) +end + +end # module TestUtils \ No newline at end of file diff --git a/val_data/size/AG_RES_1.xlsx b/val_data/size/AG_RES_1.xlsx new file mode 100644 index 0000000..99140e9 Binary files /dev/null and b/val_data/size/AG_RES_1.xlsx differ diff --git a/val_data/size/AG_RES_10.xlsx b/val_data/size/AG_RES_10.xlsx new file mode 100644 index 0000000..df67876 Binary files /dev/null and b/val_data/size/AG_RES_10.xlsx differ diff --git a/val_data/size/AG_RES_11.xlsx b/val_data/size/AG_RES_11.xlsx new file mode 100644 index 0000000..0a18c34 Binary files /dev/null and b/val_data/size/AG_RES_11.xlsx differ diff --git a/val_data/size/AG_RES_12.xlsx b/val_data/size/AG_RES_12.xlsx new file mode 100644 index 0000000..576bcca Binary files /dev/null and b/val_data/size/AG_RES_12.xlsx differ diff --git a/val_data/size/AG_RES_13.xlsx b/val_data/size/AG_RES_13.xlsx new file mode 100644 index 0000000..84e81d7 Binary files /dev/null and b/val_data/size/AG_RES_13.xlsx differ diff --git a/val_data/size/AG_RES_14.xlsx b/val_data/size/AG_RES_14.xlsx new file mode 100644 index 0000000..204bce2 Binary files /dev/null and b/val_data/size/AG_RES_14.xlsx differ diff --git a/val_data/size/AG_RES_15.xlsx b/val_data/size/AG_RES_15.xlsx new file mode 100644 index 0000000..c86897e Binary files /dev/null and b/val_data/size/AG_RES_15.xlsx differ diff --git a/val_data/size/AG_RES_16.xlsx b/val_data/size/AG_RES_16.xlsx new file mode 100644 index 0000000..01764e9 Binary files /dev/null and b/val_data/size/AG_RES_16.xlsx differ diff --git a/val_data/size/AG_RES_17.xlsx b/val_data/size/AG_RES_17.xlsx new file mode 100644 index 0000000..02a77a5 Binary files /dev/null and b/val_data/size/AG_RES_17.xlsx differ diff --git a/val_data/size/AG_RES_2.xlsx b/val_data/size/AG_RES_2.xlsx new file mode 100644 index 0000000..e146c24 Binary files /dev/null and b/val_data/size/AG_RES_2.xlsx differ diff --git a/val_data/size/AG_RES_3.xlsx b/val_data/size/AG_RES_3.xlsx new file mode 100644 index 0000000..0d00ca3 Binary files /dev/null and b/val_data/size/AG_RES_3.xlsx differ diff --git a/val_data/size/AG_RES_4.xlsx b/val_data/size/AG_RES_4.xlsx new file mode 100644 index 0000000..5fa3d73 Binary files /dev/null and b/val_data/size/AG_RES_4.xlsx differ diff --git a/val_data/size/AG_RES_5.xlsx b/val_data/size/AG_RES_5.xlsx new file mode 100644 index 0000000..4e62863 Binary files /dev/null and b/val_data/size/AG_RES_5.xlsx differ diff --git a/val_data/size/AG_RES_6.xlsx b/val_data/size/AG_RES_6.xlsx new file mode 100644 index 0000000..d8926d2 Binary files /dev/null and b/val_data/size/AG_RES_6.xlsx differ diff --git a/val_data/size/AG_RES_7.xlsx b/val_data/size/AG_RES_7.xlsx new file mode 100644 index 0000000..be04394 Binary files /dev/null and b/val_data/size/AG_RES_7.xlsx differ diff --git a/val_data/size/AG_RES_8.xlsx b/val_data/size/AG_RES_8.xlsx new file mode 100644 index 0000000..74890d3 Binary files /dev/null and b/val_data/size/AG_RES_8.xlsx differ diff --git a/val_data/size/AG_RES_9.xlsx b/val_data/size/AG_RES_9.xlsx new file mode 100644 index 0000000..38114e5 Binary files /dev/null and b/val_data/size/AG_RES_9.xlsx differ diff --git a/val_data/uv-vis/.~lock.UV VIS_Rasodyne _1.xlsx# b/val_data/uv-vis/.~lock.UV VIS_Rasodyne _1.xlsx# new file mode 100644 index 0000000..b08d06d --- /dev/null +++ b/val_data/uv-vis/.~lock.UV VIS_Rasodyne _1.xlsx# @@ -0,0 +1 @@ +Cian Hughes,cianh,cian-worklaptop,04.07.2023 11:49,file:///home/cianh/.config/libreoffice/4; \ No newline at end of file diff --git a/val_data/uv-vis/Ag_17092021/.~lock.AG1.xlsx# b/val_data/uv-vis/Ag_17092021/.~lock.AG1.xlsx# new file mode 100644 index 0000000..b046393 --- /dev/null +++ b/val_data/uv-vis/Ag_17092021/.~lock.AG1.xlsx# @@ -0,0 +1 @@ +Cian Hughes,cianh,cian-worklaptop,04.07.2023 14:52,file:///home/cianh/.config/libreoffice/4; \ No newline at end of file diff --git a/val_data/uv-vis/Ag_17092021/AG1.xlsx b/val_data/uv-vis/Ag_17092021/AG1.xlsx new file mode 100644 index 0000000..1f3e459 Binary files /dev/null and b/val_data/uv-vis/Ag_17092021/AG1.xlsx differ diff --git a/val_data/uv-vis/Ag_17092021/AG10.xlsx b/val_data/uv-vis/Ag_17092021/AG10.xlsx new file mode 100644 index 0000000..89bc2aa Binary files /dev/null and b/val_data/uv-vis/Ag_17092021/AG10.xlsx differ diff --git a/val_data/uv-vis/Ag_17092021/AG11.xlsx b/val_data/uv-vis/Ag_17092021/AG11.xlsx new file mode 100644 index 0000000..6e047d9 Binary files /dev/null and b/val_data/uv-vis/Ag_17092021/AG11.xlsx differ diff --git a/val_data/uv-vis/Ag_17092021/AG12.xlsx b/val_data/uv-vis/Ag_17092021/AG12.xlsx new file mode 100644 index 0000000..123f7bc Binary files /dev/null and b/val_data/uv-vis/Ag_17092021/AG12.xlsx differ diff --git a/val_data/uv-vis/Ag_17092021/AG13.xlsx b/val_data/uv-vis/Ag_17092021/AG13.xlsx new file mode 100644 index 0000000..b6c589c Binary files /dev/null and b/val_data/uv-vis/Ag_17092021/AG13.xlsx differ diff --git a/val_data/uv-vis/Ag_17092021/AG14.xlsx b/val_data/uv-vis/Ag_17092021/AG14.xlsx new file mode 100644 index 0000000..53b6a43 Binary files /dev/null and b/val_data/uv-vis/Ag_17092021/AG14.xlsx differ diff --git a/val_data/uv-vis/Ag_17092021/AG15.xlsx b/val_data/uv-vis/Ag_17092021/AG15.xlsx new file mode 100644 index 0000000..06cd059 Binary files /dev/null and b/val_data/uv-vis/Ag_17092021/AG15.xlsx differ diff --git a/val_data/uv-vis/Ag_17092021/AG16.xlsx b/val_data/uv-vis/Ag_17092021/AG16.xlsx new file mode 100644 index 0000000..5951406 Binary files /dev/null and b/val_data/uv-vis/Ag_17092021/AG16.xlsx differ diff --git a/val_data/uv-vis/Ag_17092021/AG17.xlsx b/val_data/uv-vis/Ag_17092021/AG17.xlsx new file mode 100644 index 0000000..cb4132c Binary files /dev/null and b/val_data/uv-vis/Ag_17092021/AG17.xlsx differ diff --git a/val_data/uv-vis/Ag_17092021/AG2.xlsx b/val_data/uv-vis/Ag_17092021/AG2.xlsx new file mode 100644 index 0000000..9b9e0f6 Binary files /dev/null and b/val_data/uv-vis/Ag_17092021/AG2.xlsx differ diff --git a/val_data/uv-vis/Ag_17092021/AG3.xlsx b/val_data/uv-vis/Ag_17092021/AG3.xlsx new file mode 100644 index 0000000..d07d239 Binary files /dev/null and b/val_data/uv-vis/Ag_17092021/AG3.xlsx differ diff --git a/val_data/uv-vis/Ag_17092021/AG4.xlsx b/val_data/uv-vis/Ag_17092021/AG4.xlsx new file mode 100644 index 0000000..5765756 Binary files /dev/null and b/val_data/uv-vis/Ag_17092021/AG4.xlsx differ diff --git a/val_data/uv-vis/Ag_17092021/AG5.xlsx b/val_data/uv-vis/Ag_17092021/AG5.xlsx new file mode 100644 index 0000000..142be6d Binary files /dev/null and b/val_data/uv-vis/Ag_17092021/AG5.xlsx differ diff --git a/val_data/uv-vis/Ag_17092021/AG6.xlsx b/val_data/uv-vis/Ag_17092021/AG6.xlsx new file mode 100644 index 0000000..43b7915 Binary files /dev/null and b/val_data/uv-vis/Ag_17092021/AG6.xlsx differ diff --git a/val_data/uv-vis/Ag_17092021/AG7.xlsx b/val_data/uv-vis/Ag_17092021/AG7.xlsx new file mode 100644 index 0000000..3a30ed6 Binary files /dev/null and b/val_data/uv-vis/Ag_17092021/AG7.xlsx differ diff --git a/val_data/uv-vis/Ag_17092021/AG8.xlsx b/val_data/uv-vis/Ag_17092021/AG8.xlsx new file mode 100644 index 0000000..1ce7083 Binary files /dev/null and b/val_data/uv-vis/Ag_17092021/AG8.xlsx differ diff --git a/val_data/uv-vis/Ag_17092021/AG9.xlsx b/val_data/uv-vis/Ag_17092021/AG9.xlsx new file mode 100644 index 0000000..1ee328e Binary files /dev/null and b/val_data/uv-vis/Ag_17092021/AG9.xlsx differ diff --git a/val_data/uv-vis/Ag_17092021/AG_PLAL.xlsx b/val_data/uv-vis/Ag_17092021/AG_PLAL.xlsx new file mode 100644 index 0000000..8c89a83 Binary files /dev/null and b/val_data/uv-vis/Ag_17092021/AG_PLAL.xlsx differ diff --git a/val_data/uv-vis/Ag_17092021/AG_PLAL_20TIMES DILUTED.xlsx b/val_data/uv-vis/Ag_17092021/AG_PLAL_20TIMES DILUTED.xlsx new file mode 100644 index 0000000..cc410ad Binary files /dev/null and b/val_data/uv-vis/Ag_17092021/AG_PLAL_20TIMES DILUTED.xlsx differ diff --git a/val_data/uv-vis/Ag_17092021/LASIS_Silver_16112020_1_Ag1.xlsx b/val_data/uv-vis/Ag_17092021/LASIS_Silver_16112020_1_Ag1.xlsx new file mode 100644 index 0000000..b07d2fe Binary files /dev/null and b/val_data/uv-vis/Ag_17092021/LASIS_Silver_16112020_1_Ag1.xlsx differ diff --git a/val_data/uv-vis/Ag_17092021/~$AG1.xlsx b/val_data/uv-vis/Ag_17092021/~$AG1.xlsx new file mode 100644 index 0000000..509b39a Binary files /dev/null and b/val_data/uv-vis/Ag_17092021/~$AG1.xlsx differ diff --git a/val_data/uv-vis/UV-Vis.OPJ b/val_data/uv-vis/UV-Vis.OPJ new file mode 100644 index 0000000..7954310 Binary files /dev/null and b/val_data/uv-vis/UV-Vis.OPJ differ diff --git a/val_data/uv-vis/uv-vis.xlsx b/val_data/uv-vis/uv-vis.xlsx new file mode 100644 index 0000000..051d9f3 Binary files /dev/null and b/val_data/uv-vis/uv-vis.xlsx differ diff --git a/validation.ipynb b/validation.ipynb new file mode 100644 index 0000000..2251cb7 --- /dev/null +++ b/validation.ipynb @@ -0,0 +1,1985 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "include(\"src/nanoconc.jl\")\n", + "using .nanoconc\n", + "using XLSX\n", + "using DataFrames\n", + "using Plots" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "function get_until_missing(sheet::XLSX.Worksheet)::Matrix{Any}\n", + " x = 1\n", + " while !ismissing(sheet[x, 1])\n", + " x += 1\n", + " end\n", + " y = 1\n", + " while !ismissing(sheet[1, y])\n", + " y += 1\n", + " end\n", + " x -= 1\n", + " y -= 1\n", + " out_matrix = Matrix{Any}(undef, x, y)\n", + " for i in 1:x\n", + " for j in 1:y\n", + " out_matrix[i, j] = sheet[i, j]\n", + " end\n", + " end\n", + " return out_matrix\n", + "end\n", + "\n", + "uv_data = XLSX.openxlsx(\"val_data/uv-vis/uv-vis.xlsx\", enable_cache=false) do f\n", + " let uv_matrix = let uv_sheet = f[1][:]\n", + " uv_sheet[.!any.(ismissing, eachrow(uv_sheet)), :]\n", + " end\n", + " DataFrame(Matrix{Float64}(uv_matrix[2:end, :]), uv_matrix[1, :])\n", + " end\n", + "end\n", + "\n", + "size_data = Dict{String,DataFrame}()\n", + "d = \"val_data/size\"\n", + "for f in readdir(d)\n", + " filepath = joinpath(d, f)\n", + " sample_name = replace(f, \"_RES_\" => \"\", \".xlsx\" => \"\")\n", + " size_data[sample_name] = XLSX.openxlsx(filepath, enable_cache=false) do f\n", + " let size_matrix = get_until_missing(f[1])\n", + " let df = DataFrame(Matrix{Float64}(size_matrix[2:end, :]), [split(x, \" \")[1] for x in size_matrix[1, :]])\n", + " df[df[!, \"Intensity\"].!=0, :]\n", + " end\n", + " end\n", + " end\n", + "end\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(137.07406889988462, 0.26239882249654195, 1.390822860797353e8, [187.9 1.07 1.212; 191.6 1.1 1.232; … ; 1610.0 0.15 11.85; 1937.0 0.24 14.08])" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "refmed = 1.333 # refractive index of the medium\n", + "wavel1, wavel2 = 250.0, 700.0 # wavelengths to calculate between\n", + "numval = 0x00001000 # number of values to calculate in spectrum\n", + "materialdata = nanoconc.loadmaterial(\"Silver\", disp=false)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "using Interpolations\n", + "using QuadGK" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Dict{String, UInt128} with 17 entries:\n", + " \"AG12\" => 0x00000000000000000006d4137b65cc00\n", + " \"AG17\" => 0x0000000000000000000036257d9b0040\n", + " \"AG2\" => 0x000000000000000000000b191b649620\n", + " \"AG4\" => 0x00000000000000000d601afe5a858000\n", + " \"AG5\" => 0x00000000000000000000c18aa59a4b00\n", + " \"AG7\" => 0x00000000000000000000207f88a31ab0\n", + " \"AG8\" => 0x00000000000000008db134e7b4bd0000\n", + " \"AG9\" => 0x00000000000000000008f5c38a376800\n", + " \"AG11\" => 0x0000000000000000c9a4ee044a6d0000\n", + " \"AG14\" => 0x00000000000000036bf3062ea8ed0000\n", + " \"AG13\" => 0x000000000000000000035ab60ac8a000\n", + " \"AG15\" => 0x0000000000000000001ce235ca1de800\n", + " \"AG16\" => 0x000000000000000000010d95e2055880\n", + " \"AG1\" => 0x000000000000000000000239927da820\n", + " \"AG6\" => 0x0000000000000000002f64a8c94dc000\n", + " \"AG10\" => 0x0000000000000000000004b9d522e5b4\n", + " \"AG3\" => 0x000000000000000000379e982447f800" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ppml_data = Dict{String,UInt128}(\n", + " \"AG1\" => 2446294100000,\n", + " \"AG2\" => 12202461664800,\n", + " \"AG3\" => 15655500000000000,\n", + " \"AG4\" => 963800000000000000,\n", + " \"AG5\" => 212801228000000,\n", + " \"AG6\" => 13340000000000000,\n", + " \"AG7\" => 35732125326000,\n", + " \"AG8\" => 0x8db134e7b4bd0000,\n", + " \"AG9\" => 2522020000000000,\n", + " \"AG10\" => 5196191294900,\n", + " \"AG11\" => 0xc9a4ee044a6d0000,\n", + " \"AG12\" => 1922030000000000,\n", + " \"AG13\" => 944162841600000,\n", + " \"AG14\" => 0x00000000000000036bf3062ea8ed0000,\n", + " \"AG15\" => 8130020000000000,\n", + " \"AG16\" => 296412370000000,\n", + " \"AG17\" => 59534649000000,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Main.miemfp" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "include(\"src/miemfp.jl\")" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "struct q_to_sigma\n", + " weighted_geometric_cross_section::Vector{Float64}\n", + " total_weights::Float64\n", + "\n", + " function q_to_sigma(x::Matrix{Float64})::q_to_sigma\n", + " radii = x[:, 1] .* 1e-9\n", + " weights = x[:, 2]\n", + " new(weights .* (π .* (radii .^ 2)), sum(weights))\n", + " end\n", + "end\n", + "\n", + "function (p::q_to_sigma)(q::Matrix{Float64})\n", + " # Calculate the extinction cross-section\n", + " test = sum([x .* q[:, 2] for x in p.weighted_geometric_cross_section]) ./ p.total_weights\n", + " q[:, 2] = test\n", + "end\n", + "\n", + "function (p::q_to_sigma)(q::Vector{Matrix{Float64}})\n", + " for x in q\n", + " p(x)\n", + " end\n", + "end\n", + "\n", + "function sigmapredict(refmed::Float64, wavel1::Float64, wavel2::Float64,\n", + " numval::UInt32, particledata::Array{Float64,2},\n", + " materialdata::Tuple{Float64,Float64,Float64,Array{Float64,2}}\n", + ")::Array{Float64,2}\n", + " # normalise relative amounts of particles to a total of 1\n", + " particledata[:, 2] = particledata[:, 2] ./ sum(particledata[:, 2])\n", + " # convert particle diameters in particledata to radii\n", + " particledata[:, 1] = particledata[:, 1] ./ 2\n", + " # define a wrapper function for later vectorised calculations\n", + " spec(x) = miemfp.qbare(wavel1, wavel2, numval, 0x00000002, refmed, x, materialdata...)\n", + " # note: the UInt32 above for \"scangles\" must be at least 2 for accurate Qext. Higher \"scangles\"\n", + " ##\tdoes not increase Qext precision but will be important if modding to also account for Qsca\n", + " # perform vectorised spectrum prediction on particledata array\n", + " spectra = spec.(particledata[:, 1])::Vector{Matrix{Float64}}\n", + " q_to_sigma(particledata)(spectra)\n", + " # for each spectrum, multiply all values by their relative amounts from the particledata array\n", + " @inbounds @simd for i in eachindex(spectra)\n", + " spectra[i][:, 2] = particledata[i, 2] .* spectra[i][:, 2]\n", + " end\n", + " # prep an array for final predicted spectrum\n", + " data::Array{Float64,2} = Array{Float64,2}(undef, numval, 2)\n", + " data[:, 1] = spectra[1][:, 1]\n", + " data[:, 2] = zeros(numval)\n", + " # for each weighted spectrum, add it to the total spectrum in the \"data\" array\n", + " @inbounds @simd for x in spectra\n", + " data[:, 2] = data[:, 2] .+ x[:, 2]\n", + " end\n", + " return data\n", + "end\n", + "\n", + "pred_uv_data = Dict{String,Matrix}()\n", + "for (k, v) in size_data\n", + " pred_uv_data[k] = sigmapredict(refmed, wavel1, wavel2, numval, Matrix{Float64}(v), materialdata)\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "BY AREA: AG4: 99891546128110(0.010364343860563395%)\n", + "BY INTENSITY: AG4: 354902794327222 (0.03682328225017867%)\n", + "BY AREA: AG14: 167496787156826(0.0002653675088196005%)\n", + "BY INTENSITY: AG14: 715736683242009 (0.0011339516645468687%)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "BY AREA: AG13: 19900844840290(2.107776748189494%)\n", + "BY INTENSITY: AG13: 26380741605331 (2.79408810037743%)\n", + "BY AREA: AG16: 48126629765135(16.236376965352356%)\n", + "BY INTENSITY: AG16: 140653922687161 (47.45210960229527%)\n", + "BY AREA: AG10: 13841201270503(266.37204992987796%)\n", + "BY INTENSITY: AG10: 18299970127394 (352.18045466022784%)\n", + "BY AREA: AG12: 21738950932114(1.13104118729229%)\n", + "BY INTENSITY: AG12: 48373903507571 (2.516813135464639%)\n", + "BY AREA: AG17: 30602424501936(51.40271256480575%)\n", + "BY INTENSITY: AG17: 71888493699625 (120.75068033007972%)\n", + "BY AREA: AG2: 12321663398706(100.97686628469285%)\n", + "BY INTENSITY: AG2: 16211047801255 (132.85063495031025%)\n", + "BY AREA: AG11: 212854622964578(0.001464932023156077%)\n", + "BY INTENSITY: AG11: 903027163331146 (0.0062149150951902685%)\n", + "BY AREA: AG5: 21058317281309(9.89576868480712%)\n", + "BY INTENSITY: AG5: 31971097293818 (15.023925187977769%)\n", + "BY AREA: AG7: 12621607262196(35.32285624502738%)\n", + "BY INTENSITY: AG7: 19770659427437 (55.330208452647355%)\n", + "BY AREA: AG8: 158205761013457(0.001549517737644045%)\n", + "BY INTENSITY: AG8: 623770884665734 (0.006109411211221685%)\n", + "BY AREA: AG9: 58591842160292(2.3232108452863973%)\n", + "BY INTENSITY: AG9: 263474137616097 (10.446948779791477%)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "BY AREA: AG15: 32735084595125(0.402644576460144%)\n", + "BY INTENSITY: AG15: 68395561601672 (0.8412717508895672%)\n", + "BY AREA: AG1: 8341980646355(341.00481403094585%)\n", + "BY INTENSITY: AG1: 8659178836637 (353.971292194058%)\n", + "BY AREA: AG6: 68954423535853(0.5168997266555697%)\n", + "BY INTENSITY: AG6: 189277317427368 (1.4188704454825187%)\n", + "BY AREA: AG3: 18955584839239(0.12107939599015681%)\n", + "BY INTENSITY: AG3: 25950908683000 (0.16576224766376033%)\n" + ] + } + ], + "source": [ + "counts = Dict{String,UInt128}()\n", + "for (k, v) in pred_uv_data\n", + " measured_area, _ = quadgk(LinearInterpolation(uv_data[!, \"Wavelength\"], uv_data[!, k]), wavel1, wavel2)\n", + " pred_interp = LinearInterpolation(pred_uv_data[k][:, 1], pred_uv_data[k][:, 2])\n", + " pred_area, _ = quadgk(pred_interp, wavel1, wavel2)\n", + " actual = ppml_data[k]\n", + " predicted = UInt128(round(measured_area / pred_area))\n", + " counts[k] = predicted\n", + " println(\"BY AREA: \", k, \": \", predicted, \"(\", (predicted / actual) * 100.0, \"%)\")\n", + " pred_intensity = pred_interp(uv_data[!, \"Wavelength\"])\n", + " rel_intensity = uv_data[!, k] ./ pred_intensity\n", + " predicted = UInt128(round(sum(rel_intensity) / length(rel_intensity)))\n", + " println(\"BY INTENSITY: \", k, \": \", predicted, \" (\", (predicted / actual) * 100.0, \"%)\")\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sample = \"AG3\"\n", + "plot(uv_data[!, \"Wavelength\"], uv_data[!, sample], label=\"Measured\")\n", + "plot!(pred_uv_data[sample][:, 1], counts[sample] * pred_uv_data[sample][:, 2], label=\"Predicted\")" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Material:\t\tSilver\n", + "- Valence:\t\t1.0\n", + "- Atomic Mass:\t\t107.8682amu\n", + "- Density:\t\t10.49g/cm^3\n", + "- Resistivity:\t\t1.59e-8g/cm^3\n", + "Derived values:\n", + "- Plasma frequency:\t137.07406889988462e14Hz\n", + "- Collision frequency:\t0.26239882249654195e14Hz\n", + "- Fermi Velocity:\t1.390822860797353e8cm/s\n", + "Wavelength Range:\t187.9nm-1937.0nm\n", + "Number of datapoints:\t49\n", + "Description:\n", + "\"Refractive index data from Johnson & Christy (1972)\"\n" + ] + } + ], + "source": [ + "dispinfo(\"Silver\")" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Loading material:\n", + "\n", + "Material:\t\tGold\n", + "- Valence:\t\t1.0\n", + "- Atomic Mass:\t\t196.966569amu\n", + "- Density:\t\t19.3g/cm^3\n", + "- Resistivity:\t\t2.214e-8g/cm^3\n", + "Derived values:\n", + "- Plasma frequency:\t217.6191453622e14Hz\n", + "- Collision frequency:\t0.3681502558757682e14Hz\n", + "- Fermi Velocity:\t1.3943315831262603e8cm/s\n", + "Wavelength Range:\t187.9nm-1937.0nm\n", + "Number of datapoints:\t49\n", + "Description:\n", + "\"Refind data from Johnson & Christy, 1972\"\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "49×3 Matrix{Float64}:\n", + " 187.9 1.28 1.188\n", + " 191.6 1.32 1.203\n", + " 195.3 1.34 1.226\n", + " 199.3 1.33 1.251\n", + " 203.3 1.33 1.277\n", + " 207.3 1.3 1.304\n", + " 211.9 1.3 1.35\n", + " 216.4 1.3 1.387\n", + " 221.4 1.3 1.427\n", + " 226.2 1.31 1.46\n", + " ⋮ \n", + " 756.0 0.14 4.542\n", + " 821.1 0.16 5.083\n", + " 892.0 0.17 5.663\n", + " 984.0 0.22 6.35\n", + " 1088.0 0.27 7.15\n", + " 1216.0 0.35 8.145\n", + " 1393.0 0.43 9.519\n", + " 1610.0 0.56 11.21\n", + " 1937.0 0.92 13.78" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "loadmaterial(\"Gold\")[4]" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "49×3 Matrix{Float64}:\n", + " 187.9 1.07 1.212\n", + " 191.6 1.1 1.232\n", + " 195.3 1.12 1.255\n", + " 199.3 1.14 1.277\n", + " 203.3 1.15 1.296\n", + " 207.3 1.18 1.312\n", + " 211.9 1.2 1.325\n", + " 216.4 1.22 1.336\n", + " 221.4 1.25 1.342\n", + " 226.2 1.26 1.344\n", + " ⋮ \n", + " 756.0 0.03 5.242\n", + " 821.1 0.04 5.727\n", + " 892.0 0.04 6.312\n", + " 984.0 0.04 6.992\n", + " 1088.0 0.04 7.795\n", + " 1216.0 0.09 8.828\n", + " 1393.0 0.13 10.1\n", + " 1610.0 0.15 11.85\n", + " 1937.0 0.24 14.08" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "materialdata[4]" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot(materialdata[4][:,1], materialdata[4][:,2])\n", + "plot!(materialdata[4][:,1], materialdata[4][:,3])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia 1.9.1", + "language": "julia", + "name": "julia-1.9" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.9.1" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +}