From 65c21c6033ffd1a8ef677ee8e37ab9e97e6674be Mon Sep 17 00:00:00 2001 From: Remy Moll Date: Mon, 16 Dec 2024 16:23:27 +0100 Subject: [PATCH] most static helpers up and running --- .gitignore | 1 + Pipfile | 1 + Pipfile.lock | 532 ++++++++++-------- .../Explicit_ODE_Sovlers_Solutions.ipynb | 412 ++++++++++++++ nbody/checklist.md | 11 + nbody/data/data.txt | 1 + nbody/notebook.ipynb | 422 ++++++++++++++ nbody/utils/__init__.py | 7 + nbody/utils/forces.py | 77 +++ nbody/utils/integrate.py | 69 +++ nbody/utils/load.py | 18 + nbody/utils/mesh.py | 0 nbody/utils/model.py | 12 + nbody/utils/particles.py | 124 ++++ 14 files changed, 1437 insertions(+), 250 deletions(-) create mode 100644 .gitignore create mode 100644 integration/Explicit_ODE_Sovlers_Solutions.ipynb create mode 100644 nbody/checklist.md create mode 100644 nbody/notebook.ipynb create mode 100644 nbody/utils/__init__.py create mode 100644 nbody/utils/forces.py create mode 100644 nbody/utils/integrate.py create mode 100644 nbody/utils/mesh.py create mode 100644 nbody/utils/model.py create mode 100644 nbody/utils/particles.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7e99e36 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.pyc \ No newline at end of file diff --git a/Pipfile b/Pipfile index fd5e5da..3cdc4b9 100644 --- a/Pipfile +++ b/Pipfile @@ -9,6 +9,7 @@ ipython = "*" jupyter = "*" matplotlib = "*" scipy = "*" +spacepy = "*" [dev-packages] diff --git a/Pipfile.lock b/Pipfile.lock index 46f5bcd..3d97e0f 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "ee1fe0bf58915e71ceca2822901cddf7d578638631d3698ada321e7c0472519f" + "sha256": "d33c15770abf2c4b05283382da131b41c3adb982d6e486352357938ed088724a" }, "pipfile-spec": 6, "requires": { @@ -301,74 +301,63 @@ }, "contourpy": { "hashes": [ - "sha256:00ccd0dbaad6d804ab259820fa7cb0b8036bda0686ef844d24125d8287178ce0", - "sha256:0be4d8425bfa755e0fd76ee1e019636ccc7c29f77a7c86b4328a9eb6a26d0639", - "sha256:0dce35502151b6bd35027ac39ba6e5a44be13a68f55735c3612c568cac3805fd", - "sha256:0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad", - "sha256:14e262f67bd7e6eb6880bc564dcda30b15e351a594657e55b7eec94b6ef72843", - "sha256:167d6c890815e1dac9536dca00828b445d5d0df4d6a8c6adb4a7ec3166812fa8", - "sha256:1ec4dc6bf570f5b22ed0d7efba0dfa9c5b9e0431aeea7581aa217542d9e809a4", - "sha256:303c252947ab4b14c08afeb52375b26781ccd6a5ccd81abcdfc1fafd14cf93c1", - "sha256:31cd3a85dbdf1fc002280c65caa7e2b5f65e4a973fcdf70dd2fdcb9868069294", - "sha256:32b238b3b3b649e09ce9aaf51f0c261d38644bdfa35cbaf7b263457850957a84", - "sha256:33c92cdae89ec5135d036e7218e69b0bb2851206077251f04a6c4e0e21f03927", - "sha256:345af746d7766821d05d72cb8f3845dfd08dd137101a2cb9b24de277d716def8", - "sha256:3634b5385c6716c258d0419c46d05c8aa7dc8cb70326c9a4fb66b69ad2b52e09", - "sha256:364174c2a76057feef647c802652f00953b575723062560498dc7930fc9b1cb7", - "sha256:36e0cff201bcb17a0a8ecc7f454fe078437fa6bda730e695a92f2d9932bd507f", - "sha256:36f965570cff02b874773c49bfe85562b47030805d7d8360748f3eca570f4cab", - "sha256:3bb3808858a9dc68f6f03d319acd5f1b8a337e6cdda197f02f4b8ff67ad2057b", - "sha256:3e1c7fa44aaae40a2247e2e8e0627f4bea3dd257014764aa644f319a5f8600e3", - "sha256:3faeb2998e4fcb256542e8a926d08da08977f7f5e62cf733f3c211c2a5586223", - "sha256:420d39daa61aab1221567b42eecb01112908b2cab7f1b4106a52caaec8d36973", - "sha256:4553c421929ec95fb07b3aaca0fae668b2eb5a5203d1217ca7c34c063c53d087", - "sha256:4865cd1d419e0c7a7bf6de1777b185eebdc51470800a9f42b9e9decf17762081", - "sha256:4cfb5c62ce023dfc410d6059c936dcf96442ba40814aefbfa575425a3a7f19dc", - "sha256:4d63ee447261e963af02642ffcb864e5a2ee4cbfd78080657a9880b8b1868e18", - "sha256:570ef7cf892f0afbe5b2ee410c507ce12e15a5fa91017a0009f79f7d93a1268f", - "sha256:637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d", - "sha256:68a32389b06b82c2fdd68276148d7b9275b5f5cf13e5417e4252f6d1a34f72a2", - "sha256:69375194457ad0fad3a839b9e29aa0b0ed53bb54db1bfb6c3ae43d111c31ce41", - "sha256:6cb6cc968059db9c62cb35fbf70248f40994dfcd7aa10444bbf8b3faeb7c2d67", - "sha256:710a26b3dc80c0e4febf04555de66f5fd17e9cf7170a7b08000601a10570bda6", - "sha256:732896af21716b29ab3e988d4ce14bc5133733b85956316fb0c56355f398099b", - "sha256:75ee7cb1a14c617f34a51d11fa7524173e56551646828353c4af859c56b766e2", - "sha256:76a896b2f195b57db25d6b44e7e03f221d32fe318d03ede41f8b4d9ba1bff53c", - "sha256:76c905ef940a4474a6289c71d53122a4f77766eef23c03cd57016ce19d0f7b42", - "sha256:7a52040312b1a858b5e31ef28c2e865376a386c60c0e248370bbea2d3f3b760d", - "sha256:7ffa0db17717a8ffb127efd0c95a4362d996b892c2904db72428d5b52e1938a4", - "sha256:81cb5ed4952aae6014bc9d0421dec7c5835c9c8c31cdf51910b708f548cf58e5", - "sha256:834e0cfe17ba12f79963861e0f908556b2cedd52e1f75e6578801febcc6a9f49", - "sha256:87ddffef1dbe5e669b5c2440b643d3fdd8622a348fe1983fad7a0f0ccb1cd67b", - "sha256:880ea32e5c774634f9fcd46504bf9f080a41ad855f4fef54f5380f5133d343c7", - "sha256:8ca947601224119117f7c19c9cdf6b3ab54c5726ef1d906aa4a69dfb6dd58102", - "sha256:90f73a5116ad1ba7174341ef3ea5c3150ddf20b024b98fb0c3b29034752c8aeb", - "sha256:92f8557cbb07415a4d6fa191f20fd9d2d9eb9c0b61d1b2f52a8926e43c6e9af7", - "sha256:94e848a6b83da10898cbf1311a815f770acc9b6a3f2d646f330d57eb4e87592e", - "sha256:9c0da700bf58f6e0b65312d0a5e695179a71d0163957fa381bb3c1f72972537c", - "sha256:a11077e395f67ffc2c44ec2418cfebed032cd6da3022a94fc227b6faf8e2acb8", - "sha256:aea348f053c645100612b333adc5983d87be69acdc6d77d3169c090d3b01dc35", - "sha256:b11b39aea6be6764f84360fce6c82211a9db32a7c7de8fa6dd5397cf1d079c3b", - "sha256:c6c7c2408b7048082932cf4e641fa3b8ca848259212f51c8c59c45aa7ac18f14", - "sha256:c6ec93afeb848a0845a18989da3beca3eec2c0f852322efe21af1931147d12cb", - "sha256:cacd81e2d4b6f89c9f8a5b69b86490152ff39afc58a95af002a398273e5ce589", - "sha256:d402880b84df3bec6eab53cd0cf802cae6a2ef9537e70cf75e91618a3801c20c", - "sha256:d51fca85f9f7ad0b65b4b9fe800406d0d77017d7270d31ec3fb1cc07358fdea0", - "sha256:d73f659398a0904e125280836ae6f88ba9b178b2fed6884f3b1f95b989d2c8da", - "sha256:d78ab28a03c854a873787a0a42254a0ccb3cb133c672f645c9f9c8f3ae9d0800", - "sha256:da84c537cb8b97d153e9fb208c221c45605f73147bd4cadd23bdae915042aad6", - "sha256:dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66", - "sha256:e12968fdfd5bb45ffdf6192a590bd8ddd3ba9e58360b29683c6bb71a7b41edca", - "sha256:e1fd23e9d01591bab45546c089ae89d926917a66dceb3abcf01f6105d927e2cb", - "sha256:e8134301d7e204c88ed7ab50028ba06c683000040ede1d617298611f9dc6240c", - "sha256:eb8b141bb00fa977d9122636b16aa67d37fd40a3d8b52dd837e536d64b9a4d06", - "sha256:eca7e17a65f72a5133bdbec9ecf22401c62bcf4821361ef7811faee695799779", - "sha256:f317576606de89da6b7e0861cf6061f6146ead3528acabff9236458a6ba467f8", - "sha256:fd2a0fc506eccaaa7595b7e1418951f213cf8255be2600f1ea1b61e46a60c55f", - "sha256:fe41b41505a5a33aeaed2a613dccaeaa74e0e3ead6dd6fd3a118fb471644fd6c" + "sha256:041b640d4ec01922083645a94bb3b2e777e6b626788f4095cf21abbe266413c1", + "sha256:05e806338bfeaa006acbdeba0ad681a10be63b26e1b17317bfac3c5d98f36cda", + "sha256:08d9d449a61cf53033612cb368f3a1b26cd7835d9b8cd326647efe43bca7568d", + "sha256:0ffa84be8e0bd33410b17189f7164c3589c229ce5db85798076a3fa136d0e509", + "sha256:113231fe3825ebf6f15eaa8bc1f5b0ddc19d42b733345eae0934cb291beb88b6", + "sha256:14c102b0eab282427b662cb590f2e9340a9d91a1c297f48729431f2dcd16e14f", + "sha256:174e758c66bbc1c8576992cec9599ce8b6672b741b5d336b5c74e35ac382b18e", + "sha256:19c1555a6801c2f084c7ddc1c6e11f02eb6a6016ca1318dd5452ba3f613a1751", + "sha256:19d40d37c1c3a4961b4619dd9d77b12124a453cc3d02bb31a07d58ef684d3d86", + "sha256:1bf98051f1045b15c87868dbaea84f92408337d4f81d0e449ee41920ea121d3b", + "sha256:20914c8c973f41456337652a6eeca26d2148aa96dd7ac323b74516988bea89fc", + "sha256:287ccc248c9e0d0566934e7d606201abd74761b5703d804ff3df8935f523d546", + "sha256:2ba94a401342fc0f8b948e57d977557fbf4d515f03c67682dd5c6191cb2d16ec", + "sha256:31c1b55c1f34f80557d3830d3dd93ba722ce7e33a0b472cba0ec3b6535684d8f", + "sha256:36987a15e8ace5f58d4d5da9dca82d498c2bbb28dff6e5d04fbfcc35a9cb3a82", + "sha256:3a04ecd68acbd77fa2d39723ceca4c3197cb2969633836ced1bea14e219d077c", + "sha256:3e8b974d8db2c5610fb4e76307e265de0edb655ae8169e8b21f41807ccbeec4b", + "sha256:3ea9924d28fc5586bf0b42d15f590b10c224117e74409dd7a0be3b62b74a501c", + "sha256:4318af1c925fb9a4fb190559ef3eec206845f63e80fb603d47f2d6d67683901c", + "sha256:44a29502ca9c7b5ba389e620d44f2fbe792b1fb5734e8b931ad307071ec58c53", + "sha256:47734d7073fb4590b4a40122b35917cd77be5722d80683b249dac1de266aac80", + "sha256:4d76d5993a34ef3df5181ba3c92fabb93f1eaa5729504fb03423fcd9f3177242", + "sha256:4dbbc03a40f916a8420e420d63e96a1258d3d1b58cbdfd8d1f07b49fcbd38e85", + "sha256:500360b77259914f7805af7462e41f9cb7ca92ad38e9f94d6c8641b089338124", + "sha256:523a8ee12edfa36f6d2a49407f705a6ef4c5098de4f498619787e272de93f2d5", + "sha256:573abb30e0e05bf31ed067d2f82500ecfdaec15627a59d63ea2d95714790f5c2", + "sha256:5b75aa69cb4d6f137b36f7eb2ace9280cfb60c55dc5f61c731fdf6f037f958a3", + "sha256:61332c87493b00091423e747ea78200659dc09bdf7fd69edd5e98cef5d3e9a8d", + "sha256:805617228ba7e2cbbfb6c503858e626ab528ac2a32a04a2fe88ffaf6b02c32bc", + "sha256:841ad858cff65c2c04bf93875e384ccb82b654574a6d7f30453a04f04af71342", + "sha256:89785bb2a1980c1bd87f0cb1517a71cde374776a5f150936b82580ae6ead44a1", + "sha256:8eb96e79b9f3dcadbad2a3891672f81cdcab7f95b27f28f1c67d75f045b6b4f1", + "sha256:974d8145f8ca354498005b5b981165b74a195abfae9a8129df3e56771961d595", + "sha256:9ddeb796389dadcd884c7eb07bd14ef12408aaae358f0e2ae24114d797eede30", + "sha256:a045f341a77b77e1c5de31e74e966537bba9f3c4099b35bf4c2e3939dd54cdab", + "sha256:a0cffcbede75c059f535725c1680dfb17b6ba8753f0c74b14e6a9c68c29d7ea3", + "sha256:a761d9ccfc5e2ecd1bf05534eda382aa14c3e4f9205ba5b1684ecfe400716ef2", + "sha256:a7895f46d47671fa7ceec40f31fae721da51ad34bdca0bee83e38870b1f47ffd", + "sha256:a9fa36448e6a3a1a9a2ba23c02012c43ed88905ec80163f2ffe2421c7192a5d7", + "sha256:ab29962927945d89d9b293eabd0d59aea28d887d4f3be6c22deaefbb938a7277", + "sha256:abbb49fb7dac584e5abc6636b7b2a7227111c4f771005853e7d25176daaf8453", + "sha256:ac4578ac281983f63b400f7fe6c101bedc10651650eef012be1ccffcbacf3697", + "sha256:adce39d67c0edf383647a3a007de0a45fd1b08dedaa5318404f1a73059c2512b", + "sha256:ade08d343436a94e633db932e7e8407fe7de8083967962b46bdfc1b0ced39454", + "sha256:b2bdca22a27e35f16794cf585832e542123296b4687f9fd96822db6bae17bfc9", + "sha256:b2f926efda994cdf3c8d3fdb40b9962f86edbc4457e739277b961eced3d0b4c1", + "sha256:b457d6430833cee8e4b8e9b6f07aa1c161e5e0d52e118dc102c8f9bd7dd060d6", + "sha256:c414fc1ed8ee1dbd5da626cf3710c6013d3d27456651d156711fa24f24bd1291", + "sha256:cb76c1a154b83991a3cbbf0dfeb26ec2833ad56f95540b442c73950af2013750", + "sha256:dfd97abd83335045a913e3bcc4a09c0ceadbe66580cf573fe961f4a825efa699", + "sha256:e914a8cb05ce5c809dd0fe350cfbb4e881bde5e2a38dc04e3afe1b3e58bd158e", + "sha256:ece6df05e2c41bd46776fbc712e0996f7c94e0d0543af1656956d150c4ca7c81", + "sha256:efa874e87e4a647fd2e4f514d5e91c7d493697127beb95e77d2f7561f6905bd9", + "sha256:f611e628ef06670df83fce17805c344710ca5cde01edfdc72751311da8585375" ], - "markers": "python_version >= '3.9'", - "version": "==1.3.0" + "markers": "python_version >= '3.10'", + "version": "==1.3.1" }, "cycler": { "hashes": [ @@ -439,57 +428,59 @@ }, "fonttools": { "hashes": [ - "sha256:07e005dc454eee1cc60105d6a29593459a06321c21897f769a281ff2d08939f6", - "sha256:0a911591200114969befa7f2cb74ac148bce5a91df5645443371aba6d222e263", - "sha256:0d1d353ef198c422515a3e974a1e8d5b304cd54a4c2eebcae708e37cd9eeffb1", - "sha256:0e88e3018ac809b9662615072dcd6b84dca4c2d991c6d66e1970a112503bba7e", - "sha256:1d152d1be65652fc65e695e5619e0aa0982295a95a9b29b52b85775243c06556", - "sha256:262705b1663f18c04250bd1242b0515d3bbae177bee7752be67c979b7d47f43d", - "sha256:278913a168f90d53378c20c23b80f4e599dca62fbffae4cc620c8eed476b723e", - "sha256:301540e89cf4ce89d462eb23a89464fef50915255ece765d10eee8b2bf9d75b2", - "sha256:31c32d7d4b0958600eac75eaf524b7b7cb68d3a8c196635252b7a2c30d80e986", - "sha256:357cacb988a18aace66e5e55fe1247f2ee706e01debc4b1a20d77400354cddeb", - "sha256:37cddd62d83dc4f72f7c3f3c2bcf2697e89a30efb152079896544a93907733bd", - "sha256:41bb0b250c8132b2fcac148e2e9198e62ff06f3cc472065dff839327945c5882", - "sha256:4aa4817f0031206e637d1e685251ac61be64d1adef111060df84fdcbc6ab6c44", - "sha256:4e10d2e0a12e18f4e2dd031e1bf7c3d7017be5c8dbe524d07706179f355c5dac", - "sha256:5419771b64248484299fa77689d4f3aeed643ea6630b2ea750eeab219588ba20", - "sha256:54471032f7cb5fca694b5f1a0aaeba4af6e10ae989df408e0216f7fd6cdc405d", - "sha256:58974b4987b2a71ee08ade1e7f47f410c367cdfc5a94fabd599c88165f56213a", - "sha256:58d29b9a294573d8319f16f2f79e42428ba9b6480442fa1836e4eb89c4d9d61c", - "sha256:5eb2474a7c5be8a5331146758debb2669bf5635c021aee00fd7c353558fc659d", - "sha256:6e37561751b017cf5c40fce0d90fd9e8274716de327ec4ffb0df957160be3bff", - "sha256:76ae5091547e74e7efecc3cbf8e75200bc92daaeb88e5433c5e3e95ea8ce5aa7", - "sha256:7965af9b67dd546e52afcf2e38641b5be956d68c425bef2158e95af11d229f10", - "sha256:7e3b7d44e18c085fd8c16dcc6f1ad6c61b71ff463636fcb13df7b1b818bd0c02", - "sha256:7ed7ee041ff7b34cc62f07545e55e1468808691dddfd315d51dd82a6b37ddef2", - "sha256:82834962b3d7c5ca98cb56001c33cf20eb110ecf442725dc5fdf36d16ed1ab07", - "sha256:8583e563df41fdecef31b793b4dd3af8a9caa03397be648945ad32717a92885b", - "sha256:8fa92cb248e573daab8d032919623cc309c005086d743afb014c836636166f08", - "sha256:93d458c8a6a354dc8b48fc78d66d2a8a90b941f7fec30e94c7ad9982b1fa6bab", - "sha256:957f669d4922f92c171ba01bef7f29410668db09f6c02111e22b2bce446f3285", - "sha256:9dc080e5a1c3b2656caff2ac2633d009b3a9ff7b5e93d0452f40cd76d3da3b3c", - "sha256:9ef1b167e22709b46bf8168368b7b5d3efeaaa746c6d39661c1b4405b6352e58", - "sha256:a7a310c6e0471602fe3bf8efaf193d396ea561486aeaa7adc1f132e02d30c4b9", - "sha256:ab774fa225238986218a463f3fe151e04d8c25d7de09df7f0f5fce27b1243dbc", - "sha256:ada215fd079e23e060157aab12eba0d66704316547f334eee9ff26f8c0d7b8ab", - "sha256:c39287f5c8f4a0c5a55daf9eaf9ccd223ea59eed3f6d467133cc727d7b943a55", - "sha256:c9c563351ddc230725c4bdf7d9e1e92cbe6ae8553942bd1fb2b2ff0884e8b714", - "sha256:d26732ae002cc3d2ecab04897bb02ae3f11f06dd7575d1df46acd2f7c012a8d8", - "sha256:d3b659d1029946f4ff9b6183984578041b520ce0f8fb7078bb37ec7445806b33", - "sha256:dd9cc95b8d6e27d01e1e1f1fae8559ef3c02c76317da650a19047f249acd519d", - "sha256:e4564cf40cebcb53f3dc825e85910bf54835e8a8b6880d59e5159f0f325e637e", - "sha256:e7d82b9e56716ed32574ee106cabca80992e6bbdcf25a88d97d21f73a0aae664", - "sha256:e8a4b261c1ef91e7188a30571be6ad98d1c6d9fa2427244c545e2fa0a2494dd7", - "sha256:e96bc94c8cda58f577277d4a71f51c8e2129b8b36fd05adece6320dd3d57de8a", - "sha256:ed2f80ca07025551636c555dec2b755dd005e2ea8fbeb99fc5cdff319b70b23b", - "sha256:f5b8a096e649768c2f4233f947cf9737f8dbf8728b90e2771e2497c6e3d21d13", - "sha256:f8e953cc0bddc2beaf3a3c3b5dd9ab7554677da72dfaf46951e193c9653e515a", - "sha256:fda582236fee135d4daeca056c8c88ec5f6f6d88a004a79b84a02547c8f57386", - "sha256:fdb062893fd6d47b527d39346e0c5578b7957dcea6d6a3b6794569370013d9ac" + "sha256:09fe922a3eff181fd07dd724cdb441fb6b9fc355fd1c0f1aa79aca60faf1fbdd", + "sha256:0ecd1c2b1c2ec46bb73685bc5473c72e16ed0930ef79bc2919ccadc43a99fb16", + "sha256:10aff204e2edee1d312fa595c06f201adf8d528a3b659cfb34cd47eceaaa6a26", + "sha256:131591ac8d7a47043aaf29581aba755ae151d46e49d2bf49608601efd71e8b4d", + "sha256:18f082445b8fe5e91c53e6184f4c1c73f3f965c8bcc614c6cd6effd573ce6c1a", + "sha256:22ef222740eb89d189bf0612eb98fbae592c61d7efeac51bfbc2a1592d469557", + "sha256:25062b6ca03464dd5179fc2040fb19e03391b7cc49b9cc4f879312e638605c5c", + "sha256:27c0f91adbbd706e8acd1db73e3e510118e62d0ffb651864567dccc5b2339f90", + "sha256:2df61d9fc15199cc86dad29f64dd686874a3a52dda0c2d8597d21f509f95c332", + "sha256:3d8ccce035320d63dba0c35f52499322f5531dbe85bba1514c7cea26297e4c54", + "sha256:3d9bbc1e380fdaf04ad9eabd8e3e6a4301eaf3487940893e9fd98537ea2e283b", + "sha256:42a9afedff07b6f75aa0f39b5e49922ac764580ef3efce035ca30284b2ee65c8", + "sha256:42aca564b575252fd9954ed0d91d97a24de24289a16ce8ff74ed0bdf5ecebf11", + "sha256:44cf2a98aa661dbdeb8c03f5e405b074e2935196780bb729888639f5276067d9", + "sha256:45947e7b3f9673f91df125d375eb57b9a23f2a603f438a1aebf3171bffa7a205", + "sha256:487e1e8b524143a799bda0169c48b44a23a6027c1bb1957d5a172a7d3a1dd704", + "sha256:4c83381c3e3e3d9caa25527c4300543578341f21aae89e4fbbb4debdda8d82a2", + "sha256:508ebb42956a7a931c4092dfa2d9b4ffd4f94cea09b8211199090d2bd082506b", + "sha256:5b1a6e576db0c83c1b91925bf1363478c4bb968dbe8433147332fb5782ce6190", + "sha256:5cfa67414d7414442a5635ff634384101c54f53bb7b0e04aa6a61b013fcce194", + "sha256:616368b15716781bc84df5c2191dc0540137aaef56c2771eb4b89b90933f347a", + "sha256:627cf10d6f5af5bec6324c18a2670f134c29e1b7dce3fb62e8ef88baa6cba7a9", + "sha256:663eba5615d6abaaf616432354eb7ce951d518e43404371bcc2b0694ef21e8d6", + "sha256:6b5917ef79cac8300b88fd6113003fd01bbbbea2ea060a27b95d8f77cb4c65c2", + "sha256:6fc88cfb58b0cd7b48718c3e61dd0d0a3ee8e2c86b973342967ce09fbf1db6d4", + "sha256:7bbae4f3915225c2c37670da68e2bf18a21206060ad31dfb95fec91ef641caa7", + "sha256:803d5cef5fc47f44f5084d154aa3d6f069bb1b60e32390c225f897fa19b0f939", + "sha256:81ccd2b3a420b8050c7d9db3be0555d71662973b3ef2a1d921a2880b58957db8", + "sha256:8b02b10648d69d67a7eb055f4d3eedf4a85deb22fb7a19fbd9acbae7c7538199", + "sha256:8bc5f100de0173cc39102c0399bd6c3bd544bbdf224957933f10ee442d43cddd", + "sha256:8e2d89fbe9b08d96e22c7a81ec04a4e8d8439c31223e2dc6f2f9fc8ff14bdf9f", + "sha256:9008438ad59e5a8e403a62fbefef2b2ff377eb3857d90a3f2a5f4d674ff441b2", + "sha256:93f439ca27e55f585e7aaa04a74990acd983b5f2245e41d6b79f0a8b44e684d8", + "sha256:944228b86d472612d3b48bcc83b31c25c2271e63fdc74539adfcfa7a96d487fb", + "sha256:96e126df9615df214ec7f04bebcf60076297fbc10b75c777ce58b702d7708ffb", + "sha256:9b1726872e09268bbedb14dc02e58b7ea31ecdd1204c6073eda4911746b44797", + "sha256:9f0e55f5da594b85f269cfbecd2f6bd3e07d0abba68870bc3f34854de4fa4678", + "sha256:bbea0ab841113ac8e8edde067e099b7288ffc6ac2dded538b131c2c0595d5f77", + "sha256:bef0f8603834643b1a6419d57902f18e7d950ec1a998fb70410635c598dc1a1e", + "sha256:c1b9de46ef7b683d50400abf9f1578eaceee271ff51c36bf4b7366f2be29f498", + "sha256:c6457f650ebe15baa17fc06e256227f0a47f46f80f27ec5a0b00160de8dc2c13", + "sha256:d0bf24d2b02dbc9376d795a63062632ff73e3e9e60c0229373f500aed7e86dd7", + "sha256:d1100d8e665fe386a79cab59446992de881ea74d0d6c191bb988642692aa2421", + "sha256:d337ec087da8216a828574aa0525d869df0a2ac217a2efc1890974ddd1fbc5b9", + "sha256:d34525e8141286fa976e14806639d32294bfb38d28bbdb5f6be9f46a1cd695a6", + "sha256:d4ff250ed4ff05015dfd9cf2adf7570c7a383ca80f4d9732ac484a5ed0d8453c", + "sha256:d559eb1744c7dcfa90ae60cb1a4b3595e898e48f4198738c321468c01180cd83", + "sha256:dbdc251c5e472e5ae6bc816f9b82718b8e93ff7992e7331d6cf3562b96aa268e", + "sha256:e857fe1859901ad8c5cab32e0eebc920adb09f413d2d73b74b677cf47b28590c", + "sha256:f1c76f423f1a241df08f87614364dff6e0b7ce23c962c1b74bd995ec7c0dad13" ], "markers": "python_version >= '3.8'", - "version": "==4.54.1" + "version": "==4.55.2" }, "fqdn": { "hashes": [ @@ -506,6 +497,38 @@ "markers": "python_version >= '3.7'", "version": "==0.14.0" }, + "h5py": { + "hashes": [ + "sha256:018a4597f35092ae3fb28ee851fdc756d2b88c96336b8480e124ce1ac6fb9166", + "sha256:050a4f2c9126054515169c49cb900949814987f0c7ae74c341b0c9f9b5056834", + "sha256:06a903a4e4e9e3ebbc8b548959c3c2552ca2d70dac14fcfa650d9261c66939ed", + "sha256:1473348139b885393125126258ae2d70753ef7e9cec8e7848434f385ae72069e", + "sha256:2f0f1a382cbf494679c07b4371f90c70391dedb027d517ac94fa2c05299dacda", + "sha256:326d70b53d31baa61f00b8aa5f95c2fcb9621a3ee8365d770c551a13dbbcbfdf", + "sha256:3b15d8dbd912c97541312c0e07438864d27dbca857c5ad634de68110c6beb1c2", + "sha256:3fdf95092d60e8130ba6ae0ef7a9bd4ade8edbe3569c13ebbaf39baefffc5ba4", + "sha256:4532c7e97fbef3d029735db8b6f5bf01222d9ece41e309b20d63cfaae2fb5c4d", + "sha256:513171e90ed92236fc2ca363ce7a2fc6f2827375efcbb0cc7fbdd7fe11fecafc", + "sha256:52ab036c6c97055b85b2a242cb540ff9590bacfda0c03dd0cf0661b311f522f8", + "sha256:577d618d6b6dea3da07d13cc903ef9634cde5596b13e832476dd861aaf651f3e", + "sha256:59400f88343b79655a242068a9c900001a34b63e3afb040bd7cdf717e440f653", + "sha256:59685fe40d8c1fbbee088c88cd4da415a2f8bee5c270337dc5a1c4aa634e3307", + "sha256:5c4b41d1019322a5afc5082864dfd6359f8935ecd37c11ac0029be78c5d112c9", + "sha256:62be1fc0ef195891949b2c627ec06bc8e837ff62d5b911b6e42e38e0f20a897d", + "sha256:6fdf6d7936fa824acfa27305fe2d9f39968e539d831c5bae0e0d83ed521ad1ac", + "sha256:7b3b8f3b48717e46c6a790e3128d39c61ab595ae0a7237f06dfad6a3b51d5351", + "sha256:84342bffd1f82d4f036433e7039e241a243531a1d3acd7341b35ae58cdab05bf", + "sha256:ad8a76557880aed5234cfe7279805f4ab5ce16b17954606cca90d578d3e713ef", + "sha256:ba51c0c5e029bb5420a343586ff79d56e7455d496d18a30309616fdbeed1068f", + "sha256:cb65f619dfbdd15e662423e8d257780f9a66677eae5b4b3fc9dca70b5fd2d2a3", + "sha256:ccd9006d92232727d23f784795191bfd02294a4f2ba68708825cb1da39511a93", + "sha256:d2b8dd64f127d8b324f5d2cd1c0fd6f68af69084e9e47d27efeb9e28e685af3e", + "sha256:d3e465aee0ec353949f0f46bf6c6f9790a2006af896cee7c178a8c3e5090aa32", + "sha256:e4d51919110a030913201422fb07987db4338eba5ec8c5a15d6fab8e03d443fc" + ], + "markers": "python_version >= '3.9'", + "version": "==3.12.1" + }, "httpcore": { "hashes": [ "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f", @@ -897,50 +920,51 @@ }, "matplotlib": { "hashes": [ - "sha256:039082812cacd6c6bec8e17a9c1e6baca230d4116d522e81e1f63a74d01d2e21", - "sha256:03ba9c1299c920964e8d3857ba27173b4dbb51ca4bab47ffc2c2ba0eb5e2cbc5", - "sha256:050598c2b29e0b9832cde72bcf97627bf00262adbc4a54e2b856426bb2ef0697", - "sha256:18128cc08f0d3cfff10b76baa2f296fc28c4607368a8402de61bb3f2eb33c7d9", - "sha256:1cd93b91ab47a3616b4d3c42b52f8363b88ca021e340804c6ab2536344fad9ca", - "sha256:1d94ff717eb2bd0b58fe66380bd8b14ac35f48a98e7c6765117fe67fb7684e64", - "sha256:306c8dfc73239f0e72ac50e5a9cf19cc4e8e331dd0c54f5e69ca8758550f1e1e", - "sha256:37e51dd1c2db16ede9cfd7b5cabdfc818b2c6397c83f8b10e0e797501c963a03", - "sha256:3fd595f34aa8a55b7fc8bf9ebea8aa665a84c82d275190a61118d33fbc82ccae", - "sha256:4876d7d40219e8ae8bb70f9263bcbe5714415acfdf781086601211335e24f8aa", - "sha256:5413401594cfaff0052f9d8b1aafc6d305b4bd7c4331dccd18f561ff7e1d3bd3", - "sha256:5816b1e1fe8c192cbc013f8f3e3368ac56fbecf02fb41b8f8559303f24c5015e", - "sha256:65aacf95b62272d568044531e41de26285d54aec8cb859031f511f84bd8b495a", - "sha256:6758baae2ed64f2331d4fd19be38b7b4eae3ecec210049a26b6a4f3ae1c85dcc", - "sha256:6d1ce5ed2aefcdce11904fc5bbea7d9c21fff3d5f543841edf3dea84451a09ea", - "sha256:6d9f07a80deab4bb0b82858a9e9ad53d1382fd122be8cde11080f4e7dfedb38b", - "sha256:7741f26a58a240f43bee74965c4882b6c93df3e7eb3de160126d8c8f53a6ae6e", - "sha256:8912ef7c2362f7193b5819d17dae8629b34a95c58603d781329712ada83f9447", - "sha256:909645cce2dc28b735674ce0931a4ac94e12f5b13f6bb0b5a5e65e7cea2c192b", - "sha256:96ab43906269ca64a6366934106fa01534454a69e471b7bf3d79083981aaab92", - "sha256:9d78bbc0cbc891ad55b4f39a48c22182e9bdaea7fc0e5dbd364f49f729ca1bbb", - "sha256:ab68d50c06938ef28681073327795c5db99bb4666214d2d5f880ed11aeaded66", - "sha256:ac43031375a65c3196bee99f6001e7fa5bdfb00ddf43379d3c0609bdca042df9", - "sha256:ae82a14dab96fbfad7965403c643cafe6515e386de723e498cf3eeb1e0b70cc7", - "sha256:b2696efdc08648536efd4e1601b5fd491fd47f4db97a5fbfd175549a7365c1b2", - "sha256:b82c5045cebcecd8496a4d694d43f9cc84aeeb49fe2133e036b207abe73f4d30", - "sha256:be0fc24a5e4531ae4d8e858a1a548c1fe33b176bb13eff7f9d0d38ce5112a27d", - "sha256:bf81de2926c2db243c9b2cbc3917619a0fc85796c6ba4e58f541df814bbf83c7", - "sha256:c375cc72229614632c87355366bdf2570c2dac01ac66b8ad048d2dabadf2d0d4", - "sha256:c797dac8bb9c7a3fd3382b16fe8f215b4cf0f22adccea36f1545a6d7be310b41", - "sha256:cef2a73d06601437be399908cf13aee74e86932a5ccc6ccdf173408ebc5f6bb2", - "sha256:d52a3b618cb1cbb769ce2ee1dcdb333c3ab6e823944e9a2d36e37253815f9556", - "sha256:d719465db13267bcef19ea8954a971db03b9f48b4647e3860e4bc8e6ed86610f", - "sha256:d8dd059447824eec055e829258ab092b56bb0579fc3164fa09c64f3acd478772", - "sha256:dbe196377a8248972f5cede786d4c5508ed5f5ca4a1e09b44bda889958b33f8c", - "sha256:e0830e188029c14e891fadd99702fd90d317df294c3298aad682739c5533721a", - "sha256:f053c40f94bc51bc03832a41b4f153d83f2062d88c72b5e79997072594e97e51", - "sha256:f32c7410c7f246838a77d6d1eff0c0f87f3cb0e7c4247aebea71a6d5a68cab49", - "sha256:f6ee45bc4245533111ced13f1f2cace1e7f89d1c793390392a80c139d6cf0e6c", - "sha256:f7c0410f181a531ec4e93bbc27692f2c71a15c2da16766f5ba9761e7ae518413" + "sha256:026bdf3137ab6022c866efa4813b6bbeddc2ed4c9e7e02f0e323a7bca380dfa0", + "sha256:031b7f5b8e595cc07def77ec5b58464e9bb67dc5760be5d6f26d9da24892481d", + "sha256:0a0a63cb8404d1d1f94968ef35738900038137dab8af836b6c21bb6f03d75465", + "sha256:0a361bd5583bf0bcc08841df3c10269617ee2a36b99ac39d455a767da908bbbc", + "sha256:10d3e5c7a99bd28afb957e1ae661323b0800d75b419f24d041ed1cc5d844a764", + "sha256:1c40c244221a1adbb1256692b1133c6fb89418df27bf759a31a333e7912a4010", + "sha256:203d18df84f5288973b2d56de63d4678cc748250026ca9e1ad8f8a0fd8a75d83", + "sha256:213d6dc25ce686516208d8a3e91120c6a4fdae4a3e06b8505ced5b716b50cc04", + "sha256:3119b2f16de7f7b9212ba76d8fe6a0e9f90b27a1e04683cd89833a991682f639", + "sha256:3fb0b37c896172899a4a93d9442ffdc6f870165f59e05ce2e07c6fded1c15749", + "sha256:41b016e3be4e740b66c79a031a0a6e145728dbc248142e751e8dab4f3188ca1d", + "sha256:4a8d279f78844aad213c4935c18f8292a9432d51af2d88bca99072c903948045", + "sha256:4e6eefae6effa0c35bbbc18c25ee6e0b1da44d2359c3cd526eb0c9e703cf055d", + "sha256:5f2a4ea08e6876206d511365b0bc234edc813d90b930be72c3011bbd7898796f", + "sha256:66d7b171fecf96940ce069923a08ba3df33ef542de82c2ff4fe8caa8346fa95a", + "sha256:687df7ceff57b8f070d02b4db66f75566370e7ae182a0782b6d3d21b0d6917dc", + "sha256:6be0ba61f6ff2e6b68e4270fb63b6813c9e7dec3d15fc3a93f47480444fd72f0", + "sha256:6e9de2b390d253a508dd497e9b5579f3a851f208763ed67fdca5dc0c3ea6849c", + "sha256:760a5e89ebbb172989e8273024a1024b0f084510b9105261b3b00c15e9c9f006", + "sha256:816a966d5d376bf24c92af8f379e78e67278833e4c7cbc9fa41872eec629a060", + "sha256:87ad73763d93add1b6c1f9fcd33af662fd62ed70e620c52fcb79f3ac427cf3a6", + "sha256:896774766fd6be4571a43bc2fcbcb1dcca0807e53cab4a5bf88c4aa861a08e12", + "sha256:8e0143975fc2a6d7136c97e19c637321288371e8f09cff2564ecd73e865ea0b9", + "sha256:90a85a004fefed9e583597478420bf904bb1a065b0b0ee5b9d8d31b04b0f3f70", + "sha256:9b081dac96ab19c54fd8558fac17c9d2c9cb5cc4656e7ed3261ddc927ba3e2c5", + "sha256:9d6b2e8856dec3a6db1ae51aec85c82223e834b228c1d3228aede87eee2b34f9", + "sha256:9f459c8ee2c086455744723628264e43c884be0c7d7b45d84b8cd981310b4815", + "sha256:9fa6e193c14d6944e0685cdb527cb6b38b0e4a518043e7212f214113af7391da", + "sha256:a42b9dc42de2cfe357efa27d9c50c7833fc5ab9b2eb7252ccd5d5f836a84e1e4", + "sha256:b651b0d3642991259109dc0351fc33ad44c624801367bb8307be9bfc35e427ad", + "sha256:b6c12514329ac0d03128cf1dcceb335f4fbf7c11da98bca68dca8dcb983153a9", + "sha256:c52f48eb75fcc119a4fdb68ba83eb5f71656999420375df7c94cc68e0e14686e", + "sha256:c96eeeb8c68b662c7747f91a385688d4b449687d29b691eff7068a4602fe6dc4", + "sha256:cd1077b9a09b16d8c3c7075a8add5ffbfe6a69156a57e290c800ed4d435bef1d", + "sha256:cd5dbbc8e25cad5f706845c4d100e2c8b34691b412b93717ce38d8ae803bcfa5", + "sha256:cf2a60daf6cecff6828bc608df00dbc794380e7234d2411c0ec612811f01969d", + "sha256:d3c93796b44fa111049b88a24105e947f03c01966b5c0cc782e2ee3887b790a3", + "sha256:d796272408f8567ff7eaa00eb2856b3a00524490e47ad505b0b4ca6bb8a7411f", + "sha256:e0fcb7da73fbf67b5f4bdaa57d85bb585a4e913d4a10f3e15b32baea56a67f0a", + "sha256:e14485bb1b83eeb3d55b6878f9560240981e7bbc7a8d4e1e8c38b9bd6ec8d2de", + "sha256:edd14cf733fdc4f6e6fe3f705af97676a7e52859bf0044aa2c84e55be739241c" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==3.9.2" + "version": "==3.9.3" }, "matplotlib-inline": { "hashes": [ @@ -1078,11 +1102,11 @@ }, "packaging": { "hashes": [ - "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", - "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" + "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", + "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" ], "markers": "python_version >= '3.8'", - "version": "==24.1" + "version": "==24.2" }, "pandocfilters": { "hashes": [ @@ -1110,89 +1134,84 @@ }, "pillow": { "hashes": [ - "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885", - "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea", - "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df", - "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5", - "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c", - "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d", - "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd", - "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06", - "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908", - "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a", - "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be", - "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0", - "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b", - "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80", - "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a", - "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e", - "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9", - "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696", - "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b", - "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309", - "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e", - "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab", - "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d", - "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060", - "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d", - "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d", - "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4", - "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3", - "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6", - "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb", - "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94", - "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b", - "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496", - "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0", - "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319", - "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b", - "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856", - "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef", - "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680", - "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b", - "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42", - "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e", - "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597", - "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a", - "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8", - "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3", - "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736", - "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da", - "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126", - "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd", - "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5", - "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b", - "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026", - "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b", - "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc", - "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46", - "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2", - "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c", - "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe", - "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984", - "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a", - "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70", - "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca", - "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b", - "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91", - "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3", - "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84", - "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1", - "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5", - "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be", - "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f", - "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc", - "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9", - "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e", - "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141", - "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef", - "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22", - "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27", - "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e", - "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1" + "sha256:00177a63030d612148e659b55ba99527803288cea7c75fb05766ab7981a8c1b7", + "sha256:006bcdd307cc47ba43e924099a038cbf9591062e6c50e570819743f5607404f5", + "sha256:084a07ef0821cfe4858fe86652fffac8e187b6ae677e9906e192aafcc1b69903", + "sha256:0ae08bd8ffc41aebf578c2af2f9d8749d91f448b3bfd41d7d9ff573d74f2a6b2", + "sha256:0e038b0745997c7dcaae350d35859c9715c71e92ffb7e0f4a8e8a16732150f38", + "sha256:1187739620f2b365de756ce086fdb3604573337cc28a0d3ac4a01ab6b2d2a6d2", + "sha256:16095692a253047fe3ec028e951fa4221a1f3ed3d80c397e83541a3037ff67c9", + "sha256:1a61b54f87ab5786b8479f81c4b11f4d61702830354520837f8cc791ebba0f5f", + "sha256:1c1d72714f429a521d8d2d018badc42414c3077eb187a59579f28e4270b4b0fc", + "sha256:1e2688958a840c822279fda0086fec1fdab2f95bf2b717b66871c4ad9859d7e8", + "sha256:20ec184af98a121fb2da42642dea8a29ec80fc3efbaefb86d8fdd2606619045d", + "sha256:21a0d3b115009ebb8ac3d2ebec5c2982cc693da935f4ab7bb5c8ebe2f47d36f2", + "sha256:224aaa38177597bb179f3ec87eeefcce8e4f85e608025e9cfac60de237ba6316", + "sha256:2679d2258b7f1192b378e2893a8a0a0ca472234d4c2c0e6bdd3380e8dfa21b6a", + "sha256:27a7860107500d813fcd203b4ea19b04babe79448268403172782754870dac25", + "sha256:290f2cc809f9da7d6d622550bbf4c1e57518212da51b6a30fe8e0a270a5b78bd", + "sha256:2e46773dc9f35a1dd28bd6981332fd7f27bec001a918a72a79b4133cf5291dba", + "sha256:3107c66e43bda25359d5ef446f59c497de2b5ed4c7fdba0894f8d6cf3822dafc", + "sha256:375b8dd15a1f5d2feafff536d47e22f69625c1aa92f12b339ec0b2ca40263273", + "sha256:45c566eb10b8967d71bf1ab8e4a525e5a93519e29ea071459ce517f6b903d7fa", + "sha256:499c3a1b0d6fc8213519e193796eb1a86a1be4b1877d678b30f83fd979811d1a", + "sha256:4ad70c4214f67d7466bea6a08061eba35c01b1b89eaa098040a35272a8efb22b", + "sha256:4b60c9520f7207aaf2e1d94de026682fc227806c6e1f55bba7606d1c94dd623a", + "sha256:5178952973e588b3f1360868847334e9e3bf49d19e169bbbdfaf8398002419ae", + "sha256:52a2d8323a465f84faaba5236567d212c3668f2ab53e1c74c15583cf507a0291", + "sha256:598b4e238f13276e0008299bd2482003f48158e2b11826862b1eb2ad7c768b97", + "sha256:5bd2d3bdb846d757055910f0a59792d33b555800813c3b39ada1829c372ccb06", + "sha256:5c39ed17edea3bc69c743a8dd3e9853b7509625c2462532e62baa0732163a904", + "sha256:5d203af30149ae339ad1b4f710d9844ed8796e97fda23ffbc4cc472968a47d0b", + "sha256:5ddbfd761ee00c12ee1be86c9c0683ecf5bb14c9772ddbd782085779a63dd55b", + "sha256:607bbe123c74e272e381a8d1957083a9463401f7bd01287f50521ecb05a313f8", + "sha256:61b887f9ddba63ddf62fd02a3ba7add935d053b6dd7d58998c630e6dbade8527", + "sha256:6619654954dc4936fcff82db8eb6401d3159ec6be81e33c6000dfd76ae189947", + "sha256:674629ff60030d144b7bca2b8330225a9b11c482ed408813924619c6f302fdbb", + "sha256:6ec0d5af64f2e3d64a165f490d96368bb5dea8b8f9ad04487f9ab60dc4bb6003", + "sha256:6f4dba50cfa56f910241eb7f883c20f1e7b1d8f7d91c750cd0b318bad443f4d5", + "sha256:70fbbdacd1d271b77b7721fe3cdd2d537bbbd75d29e6300c672ec6bb38d9672f", + "sha256:72bacbaf24ac003fea9bff9837d1eedb6088758d41e100c1552930151f677739", + "sha256:7326a1787e3c7b0429659e0a944725e1b03eeaa10edd945a86dead1913383944", + "sha256:73853108f56df97baf2bb8b522f3578221e56f646ba345a372c78326710d3830", + "sha256:73e3a0200cdda995c7e43dd47436c1548f87a30bb27fb871f352a22ab8dcf45f", + "sha256:75acbbeb05b86bc53cbe7b7e6fe00fbcf82ad7c684b3ad82e3d711da9ba287d3", + "sha256:8069c5179902dcdce0be9bfc8235347fdbac249d23bd90514b7a47a72d9fecf4", + "sha256:846e193e103b41e984ac921b335df59195356ce3f71dcfd155aa79c603873b84", + "sha256:8594f42df584e5b4bb9281799698403f7af489fba84c34d53d1c4bfb71b7c4e7", + "sha256:86510e3f5eca0ab87429dd77fafc04693195eec7fd6a137c389c3eeb4cfb77c6", + "sha256:8853a3bf12afddfdf15f57c4b02d7ded92c7a75a5d7331d19f4f9572a89c17e6", + "sha256:88a58d8ac0cc0e7f3a014509f0455248a76629ca9b604eca7dc5927cc593c5e9", + "sha256:8ba470552b48e5835f1d23ecb936bb7f71d206f9dfeee64245f30c3270b994de", + "sha256:8c676b587da5673d3c75bd67dd2a8cdfeb282ca38a30f37950511766b26858c4", + "sha256:8ec4a89295cd6cd4d1058a5e6aec6bf51e0eaaf9714774e1bfac7cfc9051db47", + "sha256:94f3e1780abb45062287b4614a5bc0874519c86a777d4a7ad34978e86428b8dd", + "sha256:9a0f748eaa434a41fccf8e1ee7a3eed68af1b690e75328fd7a60af123c193b50", + "sha256:a5629742881bcbc1f42e840af185fd4d83a5edeb96475a575f4da50d6ede337c", + "sha256:a65149d8ada1055029fcb665452b2814fe7d7082fcb0c5bed6db851cb69b2086", + "sha256:b3c5ac4bed7519088103d9450a1107f76308ecf91d6dabc8a33a2fcfb18d0fba", + "sha256:b4fd7bd29610a83a8c9b564d457cf5bd92b4e11e79a4ee4716a63c959699b306", + "sha256:bcd1fb5bb7b07f64c15618c89efcc2cfa3e95f0e3bcdbaf4642509de1942a699", + "sha256:c12b5ae868897c7338519c03049a806af85b9b8c237b7d675b8c5e089e4a618e", + "sha256:c26845094b1af3c91852745ae78e3ea47abf3dbcd1cf962f16b9a5fbe3ee8488", + "sha256:c6a660307ca9d4867caa8d9ca2c2658ab685de83792d1876274991adec7b93fa", + "sha256:c809a70e43c7977c4a42aefd62f0131823ebf7dd73556fa5d5950f5b354087e2", + "sha256:c8b2351c85d855293a299038e1f89db92a2f35e8d2f783489c6f0b2b5f3fe8a3", + "sha256:cb929ca942d0ec4fac404cbf520ee6cac37bf35be479b970c4ffadf2b6a1cad9", + "sha256:d2c0a187a92a1cb5ef2c8ed5412dd8d4334272617f532d4ad4de31e0495bd923", + "sha256:d69bfd8ec3219ae71bcde1f942b728903cad25fafe3100ba2258b973bd2bc1b2", + "sha256:daffdf51ee5db69a82dd127eabecce20729e21f7a3680cf7cbb23f0829189790", + "sha256:e58876c91f97b0952eb766123bfef372792ab3f4e3e1f1a2267834c2ab131734", + "sha256:eda2616eb2313cbb3eebbe51f19362eb434b18e3bb599466a1ffa76a033fb916", + "sha256:ee217c198f2e41f184f3869f3e485557296d505b5195c513b2bfe0062dc537f1", + "sha256:f02541ef64077f22bf4924f225c0fd1248c168f86e4b7abdedd87d6ebaceab0f", + "sha256:f1b82c27e89fffc6da125d5eb0ca6e68017faf5efc078128cfaa42cf5cb38798", + "sha256:fba162b8872d30fea8c52b258a542c5dfd7b235fb5cb352240c8d63b414013eb", + "sha256:fbbcb7b57dc9c794843e3d1258c0fbf0f48656d46ffe9e09b63bbd6e8cd5d0a2", + "sha256:fcb4621042ac4b7865c179bb972ed0da0218a076dc1820ffc48b1d74c1e37fe9" ], - "markers": "python_version >= '3.8'", - "version": "==10.4.0" + "markers": "python_version >= '3.9'", + "version": "==11.0.0" }, "platformdirs": { "hashes": [ @@ -1273,11 +1292,11 @@ }, "pyparsing": { "hashes": [ - "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c", - "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032" + "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84", + "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c" ], - "markers": "python_full_version >= '3.6.8'", - "version": "==3.1.4" + "markers": "python_version >= '3.9'", + "version": "==3.2.0" }, "python-dateutil": { "hashes": [ @@ -1668,11 +1687,11 @@ }, "six": { "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", + "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==1.16.0" + "version": "==1.17.0" }, "sniffio": { "hashes": [ @@ -1690,6 +1709,19 @@ "markers": "python_version >= '3.8'", "version": "==2.6" }, + "spacepy": { + "hashes": [ + "sha256:44b2542837a3f07ee8a77a4ac16754ea5b26b90cdf895182696cb566123561b4", + "sha256:61b160bb422e3a85dac2e5ee163d3f01112524d7f30da1d64ae839ebad7cbd27", + "sha256:7cca4f39ac796d8b8c8dc362639fed019ee2c1fb164b7f9cf8404ead292ffead", + "sha256:a55f30865bb4ebf6f292d2d1a0abfb89045ad0702e052ac40456eb4add25d852", + "sha256:aba3d27e27c43dd310152eb618698f517c1d5117579e6d8cd062f7834ebf78d6", + "sha256:d970de02b1b8ec8451bc2f8077b8c9cc2597e897f52d6ab160a4e05fe5b4d192" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==0.7.0" + }, "stack-data": { "hashes": [ "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", diff --git a/integration/Explicit_ODE_Sovlers_Solutions.ipynb b/integration/Explicit_ODE_Sovlers_Solutions.ipynb new file mode 100644 index 0000000..c6f5a03 --- /dev/null +++ b/integration/Explicit_ODE_Sovlers_Solutions.ipynb @@ -0,0 +1,412 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Explicit ODE Schemes" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Schemes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Explicit Euler" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def explicit_euler(y0 : np.ndarray, t : float, f, dt : float):\n", + " return y0 + f(y0, t) * dt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Runge-Kutta 2" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def runge_kutta_2(y0 : np.ndarray, t : float, f, dt : float):\n", + " k1 = f(y0, t)\n", + " k2 = f(y0 + k1 * dt, t + dt)\n", + " return y0 + (k1 + k2)/2 * dt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Runge-Kutta 4" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def runge_kutta_4(y0 : np.ndarray, t : float, f, dt : float):\n", + " k1 = f(y0, t)\n", + " k2 = f(y0 + k1/2 * dt, t + dt/2)\n", + " k3 = f(y0 + k2/2 * dt, t + dt/2)\n", + " k4 = f(y0 + k3 * dt, t + dt)\n", + " return y0 + (k1 + 2*k2 + 2*k3 + k4)/6 * dt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Leapfrog" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def leapfrog(y0 : np.ndarray, t : float, f, dt : float):\n", + " \n", + " # split y0 into position and velocity\n", + " r_0 = y0[:2]\n", + " v_0 = y0[2:]\n", + "\n", + " def f_v(r):\n", + " return f(np.concatenate((r, (0, 0))), t)[2:]\n", + "\n", + " # take the first leap for the velocity\n", + " v_1_div_2 = v_0 + f_v(r_0) * dt/2\n", + " r_1 = r_0 + v_1_div_2 * dt\n", + " v_1 = v_1_div_2 + f_v(r_1) * dt/2\n", + "\n", + " return np.concatenate((r_1, v_1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Semi-implicit Euler" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def semi_implicit_euler(y0 : np.ndarray, t : float, f, dt : float):\n", + " \n", + " # split y0 into position and velocity\n", + " r_0 = y0[:2]\n", + " v_0 = y0[2:]\n", + "\n", + " # split the function into position and velocity parts\n", + " f_r = lambda v : f(np.concatenate(((0, 0), v)), t)[:2]\n", + " f_v = lambda r : f(np.concatenate((r, (0, 0))), t)[2:]\n", + "\n", + " # take the leaps\n", + " v_1 = v_0 + f_v(r_0) * dt\n", + " r_1 = r_0 + f_r(v_1) * dt\n", + "\n", + " return np.concatenate((r_1, v_1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Wrapper" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The user calls the wrapper function `integrate`, which, in turn, calls the appropriate scheme." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def integrate(y0 : np.ndarray, f, method : str, dt : float, t_end : float):\n", + " \"\"\"Integrate the ODE y' = f(y, t) up to t_end with timestep dt using the given method.\"\"\"\n", + " \n", + " t = np.arange(0, t_end, dt)\n", + " y = np.zeros((len(t), len(y0)))\n", + " y[0] = y0\n", + " \n", + " if method == \"explicit_euler\":\n", + " integrator = explicit_euler\n", + " \n", + " elif method == \"runge_kutta_2\":\n", + " integrator = runge_kutta_2\n", + "\n", + " elif method == \"runge_kutta_4\":\n", + " integrator = runge_kutta_4\n", + "\n", + " elif method == \"leapfrog\":\n", + " integrator = leapfrog\n", + "\n", + " elif method == \"semi_implicit_euler\":\n", + " integrator = semi_implicit_euler\n", + "\n", + " for i in range(1, len(t)):\n", + " y[i] = integrator(y0 = y[i-1], t = t[i], f = f, dt = dt)\n", + " \n", + " return t, y\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Example: Kepler Problem" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Initial conditions and setup" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Equations of motion: $\\ddot{\\vec{r}} = -\\frac{G M}{r^3} \\vec{r}$" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "# inital conditions\n", + "# implicit: GM = 1\n", + "# star is at rest at the origin\n", + "\n", + "#planet\n", + "e = 0.5 # eccentricity\n", + "r0 = np.array([1, 0]) # planet's position\n", + "v0 = np.array([0, np.sqrt(1+e)]) # planet's velocity\n", + "\n", + "y0 = np.array([r0, v0]).flatten() # the flatten method converts the 2D array into a 1D array\n", + "\n", + "def f(y_vec, t):\n", + " x, y, vx, vy = y_vec\n", + " r_pow_3_div_2 = np.linalg.norm([x, y])**3\n", + " return np.array([vx, vy, - x / r_pow_3_div_2, - y / r_pow_3_div_2])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Integration" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\FLOORV~1\\AppData\\Local\\Temp/ipykernel_10040/3945168747.py:16: RuntimeWarning: invalid value encountered in double_scalars\n", + " return np.array([vx, vy, - x / r_pow_3_div_2, - y / r_pow_3_div_2])\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "t_orbit = 2*np.pi\n", + "dt = t_orbit/1000\n", + "t_end = 3*t_orbit\n", + "\n", + "t_ee, y_ee = integrate(y0 = y0, f = f, method = \"explicit_euler\", dt = dt, t_end = t_end)\n", + "t_rk2, y_rk2 = integrate(y0, f, \"runge_kutta_2\", dt = dt, t_end = t_end)\n", + "t_rk4, y_rk4 = integrate(y0, f, \"runge_kutta_4\", dt = dt, t_end = t_end)\n", + "t_leapfrog, y_leapfrog = integrate(y0, f, \"leapfrog\", dt = dt, t_end = t_end)\n", + "t_semi_implicit, y_semi_implicit = integrate(y0, f, \"semi_implicit_euler\", dt = dt, t_end = t_end)\n", + "\n", + "fig, ax = plt.subplots(figsize = (10,10))\n", + "ax.set_aspect(\"equal\")\n", + "ax.plot(y_ee[:,0], y_ee[:,1], label = \"Explicit Euler\")\n", + "ax.plot(y_rk2[:,0], y_rk2[:,1], label = \"Runge-Kutta 2\")\n", + "ax.plot(y_rk4[:,0], y_rk4[:,1], label = \"Runge-Kutta 4\")\n", + "ax.plot(y_leapfrog[:,0], y_leapfrog[:,1], label = \"Leapfrog\")\n", + "ax.plot(y_semi_implicit[:,0], y_semi_implicit[:,1], label = \"Semi-Implicit Euler\")\n", + "ax.set_title(\"Orbit of a planet around a star\")\n", + "ax.set_xlim(-4.2, 1.2)\n", + "ax.set_ylim(-3, 3)\n", + "ax.set_xlabel(\"x\")\n", + "ax.set_ylabel(\"y\")\n", + "ax.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Rebound example" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "import rebound\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Create a simulation\n", + "sim = rebound.Simulation()\n", + "\n", + "# Set simulation time\n", + "time = 1e3\n", + "\n", + "# Set units\n", + "sim.units = ('yr', 'AU', 'Msun')\n", + "\n", + "# Add particles: Sun and Jupiter\n", + "sim.add(m=1, hash=\"Sun\")\n", + "sim.add(m=1e-3, a=5.5, r=4.676e-4, hash=\"Jupiter\")\n", + "\n", + "# Move to the barycenter frame\n", + "sim.move_to_com()\n", + "\n", + "# Choose a valid integrator\n", + "sim.integrator = \"ias15\" # 'ias15' is a general-purpose, high-accuracy integrator\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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3LhxeO655wAAO3fuxAcffHDQMh566CF89913qFOnDnbu3HnQ9GXLlmHkyJGVHuvbty+WLVt24N+rVq3CnDlzkJGRgfHjx2PJkiX49NNPsWvXLvTu3bvSlnvt2rVx7733Ij8/H48//niiq6gSNnKiNFVaan4KC4GCAmDvXmDPHmDbNvPYvn1A3brA7t3Al1+2xJYtQOPGpq5ePSA7GzjkEKBOHaBhQ+DQQ4GsLCAjw+9XRmE3YsSIA3/eeOONUWu//vprfPXVVzj11FMBACUlJWjVqtWB6RdccEG1z+vZsycuvPBCnH322Tj77LMPmq6q1Z6AVvGx8847DxkV3vC//vWvUa9ePdSrVw+5ublYsGABevXqFTW/G9jIiVLE/v2m6X7+OTB/vmnImZnA5MlASUmic+/qRkT07g0MGADk5gLHHAN06ADUru3KrClGbmw5xyszMxOlpaUH/l31squKzdLpbG5VRffu3TF//vxqp9d0l7XZs2fjww8/xJtvvon77rsPy5YtQ2ZmeUvs3r078vPzcdZZZx14bOHChejWrVuN866aNVlXCPAYOVHILF4MXHQRIFL5p04doEkT4LTTgLvvBv76V2DiRDeauHu+/BKYMgU491ygSxeTuerr6NMHePxxYOPGYGUn97Rr1w7Lly/Hvn378NNPP+H999+vNL3s+PGMGTNwwgknHPT8Bg0aoKCgAADQpUsXbN269UAjLyoqqrT7uzqlpaVYv349cnNz8cgjj2Dnzp0oLCysVHPttddi6tSpWBQ5/rB9+3aMHTsWt956a43zfeONN7B3715s374deXl56NevX4253cQtcqKAKS0FNm8GZswAJkwAIuftpI0vvjA/119f+fGLLgIuvhho0QLo2tV8CaBwKS4uRp06ddC2bVucf/756NmzJzp37ozevXtXqtu3bx+OP/54lJaW4qWXXjpoPpdeeimuuuoq1KtXD/Pnz8fMmTNxww034KeffkJxcTHGjBmD7t2715ijpKQEF110EX766SeoKm688UY0bty4Uk2rVq0wbdo0XHnllSgoKICqYsyYMRg2bFiN8+3fvz+GDh2KdevW4c4770Tr1q2xdu3aA9Nzc3Px0EMPoVevXrj99ttr3O0fM1UNzU+fPn1UVXXevHlK0XEd2QnCevrhB9Vrr1UF+BPPz9FHq775puqePX7/JoPxfopm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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Set up simulation time and time steps\n", + "time = 1e3 # Total time to simulate (years)\n", + "N_steps = 1000 # Number of steps for plotting\n", + "times = np.linspace(0, time, N_steps)\n", + "\n", + "# Arrays to store positions\n", + "x_jupiter = []\n", + "y_jupiter = []\n", + "\n", + "# Integrate while collecting data\n", + "for t in times:\n", + " sim.integrate(t)\n", + " jupiter = sim.particles[1]\n", + " x_jupiter.append(jupiter.x)\n", + " y_jupiter.append(jupiter.y)\n", + "\n", + "# Plot results\n", + "plt.figure(figsize=(8, 8))\n", + "plt.plot(x_jupiter, y_jupiter, label=\"Jupiter's Orbit\", color=\"blue\")\n", + "plt.scatter(0, 0, color=\"orange\", label=\"Sun\", s=100) # Sun at the origin\n", + "plt.xlabel(\"x (AU)\")\n", + "plt.ylabel(\"y (AU)\")\n", + "plt.title(\"Jupiter's Orbit Around the Sun\")\n", + "plt.axis(\"equal\")\n", + "plt.grid()\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/nbody/checklist.md b/nbody/checklist.md new file mode 100644 index 0000000..d8d6632 --- /dev/null +++ b/nbody/checklist.md @@ -0,0 +1,11 @@ +# N-Body project - Checklist + +### Task 1 +- [ ] Compute characteristic quantities/scales +- [x] Compare analytical model and particle density distribution +- [ ] Compute forces through nbody simulation +- [ ] vary softening length and compare results +- [ ] compare with the analytical expectation from Newtons 2nd law +- [ ] compute the relaxation time + +### Task 2 diff --git a/nbody/data/data.txt b/nbody/data/data.txt index 4f22b89..009bc15 100644 --- a/nbody/data/data.txt +++ b/nbody/data/data.txt @@ -1,3 +1,4 @@ +ID MASS X Y Z VX VY VZ SOFTENING ? 0 92.4259 -0.00381649 -0.0796699 -0.019072 3779.62 354.734 -73.4501 0.1 0.0130215 1 92.4259 -0.0322979 -0.249461 -0.01089 3250.59 -674.28 -18.3347 0.1 0.0130215 2 92.4259 0.067577 -0.810356 -0.00684857 2190.86 199.053 3.86061 0.1 0.0130215 diff --git a/nbody/notebook.ipynb b/nbody/notebook.ipynb new file mode 100644 index 0000000..d8bbb4e --- /dev/null +++ b/nbody/notebook.ipynb @@ -0,0 +1,422 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "from pathlib import Path\n", + "import numpy as np\n", + "import utils\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import logging\n", + "# logging.basicConfig(level=logging.INFO)\n", + "logging.basicConfig(level=logging.DEBUG)\n", + "logger = logging.getLogger(__name__)\n", + "\n", + "# silence some debug messages\n", + "logging.getLogger('matplotlib.font_manager').setLevel(logging.WARNING)\n", + "logging.getLogger('matplotlib.ticker').setLevel(logging.WARNING)\n", + "logging.getLogger('matplotlib.pyplot').setLevel(logging.WARNING)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('data')\n", + "# DATA_NAME = 'data.txt'\n", + "DATA_NAME = 'data0.txt'\n", + "# DATA_NAME = 'data1.txt'\n", + "NBINS = 50" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:utils.load:Loaded 1008 rows and 9 columns from data/data0.txt\n", + "DEBUG:__main__:Fetched 1008 points, columns: ['ID', 'M', 'x', 'y', 'z', 'vx', 'vy', 'vz', 'eps']\n" + ] + } + ], + "source": [ + "points, columns = utils.load_data(DATA_ROOT / DATA_NAME)\n", + "logger.debug(f\"Fetched {points.shape[0]} points, columns: {columns}\")\n", + "# reorder the columns to match the expected order (x, y, z, mass)\n", + "particles = points[:, [2, 3, 4, 1]]\n", + "\n", + "particles = particles[::10, ...]\n", + "# particles = particles[:5000, ...]\n", + "# TODO: remove this\n", + "\n", + "particles = utils.remove_outliers(particles)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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vIjo6Gh88MEHmD9/Pt5++21cvXoVSqUSV69exYULF5CXl4fm5mYoFAqd+yeE4IsvvsDLL7+Mo0ePYtasWVY+Q91MnjwZGRkZWLlyJf744w/8+uuvePrpp/H3v/+dUbQ1NjYiMjKSCU+srq7Ghg0bkJ2djdraWnz77bdYvnw5Zs+ezQQGpqWlISoqCg888ADy8/Px/fff4z//+Q+eeuopro3AzuAKzw0ITdjUNe0w0JTDQNMUdHv6v4bsk2Nw/vGPf/Sb3gT6pkXj4uKwceNGFBcXIzs7G9OnT8euXbswb948bNmyBZWVlVAqlaitrcWFCxeQm5uLxsZGpkGYEIKvv/4aa9asweHDhzF37lwrn93gfPXVV4iMjMT8+fORmZmJWbNmYefOnczzCoUC5eXl6OrqAgC4uLjghx9+QFpaGiIjI7F69WosW7YMx44dY17j6OiI48ePw9HREampqbj//vuxfPlyjb4fDvuA6+O5QUlJSUFycjLee+89AH29G6NGjcLTTz+NF198sd/2d999N7q6ujR+yDNmzEBMTAx27NgBQgjCwsKwZs0arF69GkDfHXtwcDD27NmDv//979Y5sZsYQggqKyuZYLu8vDzMnDkTmZmZSElJgVqtxvvvv4+6ujpERETg+PHjOHjwIDIzM2196BwcmthO18BhSfbt20dcXV3Jnj17SElJCXnssceIn58faWlpIYQQ8sADD5AXX3yR2f7XX38lTk5O5I033iClpaVk/fr1OuXUfn5+5OjRo6SgoIDcdtttnJzaRqjVanL16lWybds2kpqaShwdHcnMmTPJc889R9LT0wmPxyOOjo5kzpw55L333iONjY22PmQODgau8NzAvPfee2TUqFHExcWFJCcnk99//515bs6cOeTBBx/U2P6bb74hEydOJC4uLmTKlCkDNpCGhIQQV1dXMn/+fFJeXs48//7775PRo0cTV1dXkpycTC5dujTgse3cuZPMmjWL+Pn5ET8/PzJ//vx+2z/44IP95Ljp6ekm/EVuTNRqNamrqyPbt28nqampBAD55JNPSENDA3nvvffI3LlzycyZM219mBwcDNxUG4dZ2L9/P5YvX44dO3YgJSUF27dvx4EDB1BeXt4v+gHo8+qaOXMmZsyYATc3N2zZsgWHDx9GcXExRowYAQBYsWIF+Hw+du/ezbzO1dXVYlYyNwKE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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot the distribution of the particles\n", + "fig = plt.figure()\n", + "ax = fig.add_subplot(111, projection='3d')\n", + "ax.scatter(particles[:,0], particles[:,1], particles[:,2], cmap='viridis', c=particles[:,3])\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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FeTl5WHbtm2IiIiQK2QiIiKjYCN3AFRz2dnZKCkpgZubm9pxNzc3nDx5EgBgY2ODefPmoUePHigtLcXbb7/NjjEiIrJ4TIQsSP/+/dG/f3+5wyAiIjIaLI2ZgYYNG8La2hqZmZlqxzMzM+Hu7i5TVERERMaPiZAZsLW1RXBwMBITE1XHSktLkZiYiLCwMBkjIyIiMm4sjZmIvLw8nD17VvX8woULSE1NRf369dGkSRPExMRg9OjR6NSpE0JDQ7FgwQLk5+dj7NixMkZNRERk3LjFhonYvXs3evToUeb46NGjER8fDwBYvHgxPv30U1y/fh1BQUFYtGgROnfubOBIiYiITAcTISIiIrJYnCNEREREFouJEBEREVksJkJERERksZgIERERkcViIkREREQWi4kQERERWSwmQkRERGSxmAgRERGRxWIiRERERBaLiRARERFZLCZCREREZLGYCBERASgqKpI7BCKSgY3cARARyaF79+4ICAiAjY0N1q1bh3bt2mHXrl1yh0VEBsZEiIgs1urVqzFhwgTs27dP7lCISCYKSZIkuYMgIjK07t27Izc3F0eOHJE7FCKSEecIEZHFCg4OljsEIpIZEyEisliOjo5yh0BEMmMiRERERBaLiRARERFZLCZCREREZLHYNUZEREQWiyNCREREZLGYCBEREZHFYiJEREREFouJEBEREVksJkJERERksZgIERERkcViIkREREQWi4kQERERWSwmQkRERGSxmAgRERGRxWIiRERERBbr/wBjFhop4Gz8qQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "all_r = utils.r_distribution(particles)\n", + "rbins = np.logspace(np.min(all_r), np.max(all_r), NBINS)\n", + "rho, err = utils.density_distribution(rbins, particles, ret_error=True)\n", + "rho_t = utils.model_density_distribution(rbins)\n", + "\n", + "\n", + "plt.figure()\n", + "plt.title('Density distribution')\n", + "# set the scale to log-log\n", + "plt.xscale('log')\n", + "plt.yscale('log')\n", + "plt.xlabel('r')\n", + "plt.ylabel('rho')\n", + "plt.errorbar(rbins, rho, yerr=err, fmt='o', label=\"Particle data\")\n", + "plt.plot(rbins, rho_t, 'r-', label=\"Analytic model\")\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Choice of units" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# Set G = 1\n", + "G = 1\n", + "\n", + "# Since we have an elliptical galaxy, we can use typical values\n", + "M_TOT = 1e12 # Msol\n", + "R_TOT = 100 # kpc\n", + "\n", + "# For this system the virial theorem gives the typical velocity\n", + "V_MEAN = np.sqrt(G * M_TOT / R_TOT)\n", + "# For units of time we use the dynamical time or crossing time\n", + "T_MEAN = R_TOT / V_MEAN\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "DEBUG:utils.particles:Half mass radius: 0.0 for 0th particle of 101\n", + "DEBUG:utils.particles:Number of particles within half mass radius: 0 of 101\n", + "/home/remy/Documents/Uni/HS24/Computational Astrophysics/projects/nbody/utils/particles.py:73: RuntimeWarning: invalid value encountered in scalar divide\n", + " rho = n_half_mass / (4/3 * np.pi * r_half_mass**3)\n", + "INFO:__main__:Mean interparticle distance: nan\n", + "DEBUG:utils.forces:Computing forces for 101 particles using n^2 algorithm\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "DEBUG:utils.forces:Particle 0 done\n", + "DEBUG:utils.forces:Computing forces for 101 particles using n^2 algorithm\n", + "DEBUG:utils.forces:Particle 0 done\n", + "DEBUG:utils.forces:Computing forces for 101 particles using n^2 algorithm\n", + "DEBUG:utils.forces:Particle 0 done\n", + "DEBUG:utils.forces:Computing forces for 101 particles using n^2 algorithm\n", + "DEBUG:utils.forces:Particle 0 done\n", + "DEBUG:utils.forces:Computing forces for 101 particles using n^2 algorithm\n", + "DEBUG:utils.forces:Particle 0 done\n", + "DEBUG:utils.forces:Computing forces for 101 particles using n^2 algorithm\n", + "DEBUG:utils.forces:Particle 0 done\n", + "DEBUG:utils.forces:Computing forces for 101 particles using n^2 algorithm\n", + "DEBUG:utils.forces:Particle 0 done\n", + "DEBUG:utils.forces:Computing forces for 101 particles using spherical approximation\n", + "/home/remy/Documents/Uni/HS24/Computational Astrophysics/projects/nbody/utils/forces.py:71: RuntimeWarning: invalid value encountered in scalar divide\n", + " f = - m_current * m_enclosed / r_current**2\n", + "DEBUG:utils.forces:Particle 0 done\n" + ] + } + ], + "source": [ + "### Direct N body force computation\n", + "epsilon = utils.mean_interparticle_distance(particles)\n", + "logger.info(f\"Mean interparticle distance: {epsilon}\")\n", + "\n", + "f_nsquare = utils.n_body_forces(particles, G, 0)\n", + "f_nsquare_1e = utils.n_body_forces(particles, G, epsilon)\n", + "f_nsquare_2e = utils.n_body_forces(particles, G, 2*epsilon)\n", + "f_nsquare_5e = utils.n_body_forces(particles, G, 5*epsilon)\n", + "f_nsquare_05e = utils.n_body_forces(particles, G, 0.5*epsilon)\n", + "f_nsquare_01e = utils.n_body_forces(particles, G, 0.1*epsilon)\n", + "f_nsquare_001e = utils.n_body_forces(particles, G, 0.01*epsilon)\n", + "\n", + "f_analytical = utils.analytical_forces(particles)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/remy/.local/share/virtualenvs/projects-X-9bmgL6/lib/python3.12/site-packages/matplotlib/axes/_axes.py:6973: RuntimeWarning: All-NaN slice encountered\n", + " xmin = min(xmin, np.nanmin(xi))\n", + "/home/remy/.local/share/virtualenvs/projects-X-9bmgL6/lib/python3.12/site-packages/matplotlib/axes/_axes.py:6974: RuntimeWarning: All-NaN slice encountered\n", + " xmax = max(xmax, np.nanmax(xi))\n" + ] + }, + { + "ename": "ValueError", + "evalue": "autodetected range of [nan, nan] is not finite", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[9], line 13\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[38;5;66;03m# plot the distribution of the error\u001b[39;00m\n\u001b[1;32m 11\u001b[0m \u001b[38;5;66;03m# create 4 stacked histograms, sharing the same x axis\u001b[39;00m\n\u001b[1;32m 12\u001b[0m fig, ax \u001b[38;5;241m=\u001b[39m plt\u001b[38;5;241m.\u001b[39msubplots(\u001b[38;5;241m4\u001b[39m, sharex\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[0;32m---> 13\u001b[0m \u001b[43max\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhist\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdiff_mag\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbins\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mNBINS\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 14\u001b[0m ax[\u001b[38;5;241m0\u001b[39m]\u001b[38;5;241m.\u001b[39mset_title(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mMagnitude of the force difference\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 15\u001b[0m ax[\u001b[38;5;241m0\u001b[39m]\u001b[38;5;241m.\u001b[39mset_yscale(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlog\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", + "File \u001b[0;32m~/.local/share/virtualenvs/projects-X-9bmgL6/lib/python3.12/site-packages/matplotlib/__init__.py:1476\u001b[0m, in \u001b[0;36m_preprocess_data..inner\u001b[0;34m(ax, data, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1473\u001b[0m \u001b[38;5;129m@functools\u001b[39m\u001b[38;5;241m.\u001b[39mwraps(func)\n\u001b[1;32m 1474\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minner\u001b[39m(ax, \u001b[38;5;241m*\u001b[39margs, data\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 1475\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m data \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m-> 1476\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1477\u001b[0m \u001b[43m \u001b[49m\u001b[43max\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1478\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mmap\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43msanitize_sequence\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1479\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m{\u001b[49m\u001b[43mk\u001b[49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43msanitize_sequence\u001b[49m\u001b[43m(\u001b[49m\u001b[43mv\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mk\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mv\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mkwargs\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mitems\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m}\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1481\u001b[0m bound \u001b[38;5;241m=\u001b[39m new_sig\u001b[38;5;241m.\u001b[39mbind(ax, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[1;32m 1482\u001b[0m auto_label \u001b[38;5;241m=\u001b[39m (bound\u001b[38;5;241m.\u001b[39marguments\u001b[38;5;241m.\u001b[39mget(label_namer)\n\u001b[1;32m 1483\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m bound\u001b[38;5;241m.\u001b[39mkwargs\u001b[38;5;241m.\u001b[39mget(label_namer))\n", + "File \u001b[0;32m~/.local/share/virtualenvs/projects-X-9bmgL6/lib/python3.12/site-packages/matplotlib/axes/_axes.py:7001\u001b[0m, in \u001b[0;36mAxes.hist\u001b[0;34m(self, x, bins, range, density, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, color, label, stacked, **kwargs)\u001b[0m\n\u001b[1;32m 6997\u001b[0m \u001b[38;5;66;03m# Loop through datasets\u001b[39;00m\n\u001b[1;32m 6998\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(nx):\n\u001b[1;32m 6999\u001b[0m \u001b[38;5;66;03m# this will automatically overwrite bins,\u001b[39;00m\n\u001b[1;32m 7000\u001b[0m \u001b[38;5;66;03m# so that each histogram uses the same bins\u001b[39;00m\n\u001b[0;32m-> 7001\u001b[0m m, bins \u001b[38;5;241m=\u001b[39m \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhistogram\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m[\u001b[49m\u001b[43mi\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbins\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mweights\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mw\u001b[49m\u001b[43m[\u001b[49m\u001b[43mi\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mhist_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 7002\u001b[0m tops\u001b[38;5;241m.\u001b[39mappend(m)\n\u001b[1;32m 7003\u001b[0m tops \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39marray(tops, \u001b[38;5;28mfloat\u001b[39m) \u001b[38;5;66;03m# causes problems later if it's an int\u001b[39;00m\n", + "File \u001b[0;32m~/.local/share/virtualenvs/projects-X-9bmgL6/lib/python3.12/site-packages/numpy/lib/_histograms_impl.py:797\u001b[0m, in \u001b[0;36mhistogram\u001b[0;34m(a, bins, range, density, weights)\u001b[0m\n\u001b[1;32m 688\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124mr\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 689\u001b[0m \u001b[38;5;124;03mCompute the histogram of a dataset.\u001b[39;00m\n\u001b[1;32m 690\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 793\u001b[0m \n\u001b[1;32m 794\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 795\u001b[0m a, weights \u001b[38;5;241m=\u001b[39m _ravel_and_check_weights(a, weights)\n\u001b[0;32m--> 797\u001b[0m bin_edges, uniform_bins \u001b[38;5;241m=\u001b[39m \u001b[43m_get_bin_edges\u001b[49m\u001b[43m(\u001b[49m\u001b[43ma\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbins\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mrange\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mweights\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 799\u001b[0m \u001b[38;5;66;03m# Histogram is an integer or a float array depending on the weights.\u001b[39;00m\n\u001b[1;32m 800\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m weights \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "File \u001b[0;32m~/.local/share/virtualenvs/projects-X-9bmgL6/lib/python3.12/site-packages/numpy/lib/_histograms_impl.py:430\u001b[0m, in \u001b[0;36m_get_bin_edges\u001b[0;34m(a, bins, range, weights)\u001b[0m\n\u001b[1;32m 427\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m n_equal_bins \u001b[38;5;241m<\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[1;32m 428\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m`bins` must be positive, when an integer\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m--> 430\u001b[0m first_edge, last_edge \u001b[38;5;241m=\u001b[39m \u001b[43m_get_outer_edges\u001b[49m\u001b[43m(\u001b[49m\u001b[43ma\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mrange\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 432\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m np\u001b[38;5;241m.\u001b[39mndim(bins) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[1;32m 433\u001b[0m bin_edges \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39masarray(bins)\n", + "File \u001b[0;32m~/.local/share/virtualenvs/projects-X-9bmgL6/lib/python3.12/site-packages/numpy/lib/_histograms_impl.py:323\u001b[0m, in \u001b[0;36m_get_outer_edges\u001b[0;34m(a, range)\u001b[0m\n\u001b[1;32m 321\u001b[0m first_edge, last_edge \u001b[38;5;241m=\u001b[39m a\u001b[38;5;241m.\u001b[39mmin(), a\u001b[38;5;241m.\u001b[39mmax()\n\u001b[1;32m 322\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (np\u001b[38;5;241m.\u001b[39misfinite(first_edge) \u001b[38;5;129;01mand\u001b[39;00m np\u001b[38;5;241m.\u001b[39misfinite(last_edge)):\n\u001b[0;32m--> 323\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 324\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mautodetected range of [\u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m, \u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m] is not finite\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mformat(first_edge, last_edge))\n\u001b[1;32m 326\u001b[0m \u001b[38;5;66;03m# expand empty range to avoid divide by zero\u001b[39;00m\n\u001b[1;32m 327\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m first_edge \u001b[38;5;241m==\u001b[39m last_edge:\n", + "\u001b[0;31mValueError\u001b[0m: autodetected range of [nan, nan] is not finite" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi4AAAGiCAYAAADA0E3hAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/GU6VOAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAo9klEQVR4nO3df2xT937/8ZcTiAMS9qVNaxNqSFt64XLLkpA0wdxdcZkiWSpi5K+b9k5NFgF36HZVwdKAtIwMul1X5YLQvYRRLmNM6r3jxwR0AhSWeUPoXjIhApGAljsxKAkSNqQlNuQyp43P948K95uRcHOCneQTPx/S+cOf+/mc8z68oX7dc2wfh2VZlgAAAAyQM9oFAAAADBXBBQAAGIPgAgAAjEFwAQAAxiC4AAAAYxBcAACAMQguAADAGAQXAABgDIILAAAwBsEFAAAYw3ZwOX36tJYuXarCwkI5HA4dPXr0D645deqU5s+fL6fTqVmzZmnfvn3DKBUAAGQ728Glp6dHxcXFampqGtL869eva8mSJVq8eLHa29u1evVqrVixQidPnrRdLAAAyG6OJ3nIosPh0JEjR1RdXT3onHXr1un48eO6dOlSauy1115Td3e3mpubh3toAACQhSZk+gCtra2qqqrqNxYIBLR69epB1yQSCSUSidTrZDKpL774Qk8//bQcDkemSgUAAGlkWZbu3bunwsJC5eSk52O1GQ8ukUhEHo+n35jH41E8HteDBw80adKkR9aEQiFt2rQp06UBAIAR0NnZqeeeey4t+8p4cBmOhoYGBYPB1OtYLKYZM2aos7NTLpdrFCsDAABDFY/H5fP5NGXKlLTtM+PBxev1KhqN9huLRqNyuVwDXm2RJKfTKafT+ci4y+UiuAAAYJh0fswj47/j4vf7FQ6H+421tLTI7/dn+tAAAGCcsR1c7t+/r/b2drW3t0v6+uvO7e3t6ujokPT1bZ7a2trU/FWrVunatWtau3atrly5op07d+rgwYNas2ZNes4AAABkDdvB5dy5cyotLVVpaakkKRgMqrS0VBs3bpQk3bp1KxViJOn555/X8ePH1dLSouLiYm3dulV79uxRIBBI0ykAAIBs8US/4zJS4vG43G63YrEYn3EBAMAQmXj/5llFAADAGAQXAABgDIILAAAwBsEFAAAYg+ACAACMQXABAADGILgAAABjEFwAAIAxCC4AAMAYBBcAAGAMggsAADAGwQUAABiD4AIAAIxBcAEAAMYguAAAAGMQXAAAgDEILgAAwBgEFwAAYAyCCwAAMAbBBQAAGIPgAgAAjEFwAQAAxiC4AAAAYxBcAACAMQguAADAGAQXAABgDIILAAAwBsEFAAAYg+ACAACMMazg0tTUpKKiIuXn56uyslJnz54ddO6+ffvkcDj6bfn5+cMuGAAAZC/bweXAgQMKBoNqbGzU+fPnVVxcrEAgoNu3bw+6xuVy6datW6ntxo0bT1Q0AADITraDy7Zt27Ry5UrV19dr7ty52rVrlyZPnqy9e/cOusbhcMjr9aY2j8fzREUDAIDsZCu49Pb2qq2tTVVVVd/sICdHVVVVam1tHXTd/fv3NXPmTPl8Pi1btkyXL19+7HESiYTi8Xi/DQAAwFZw6erqUl9f3yNXTDwejyKRyIBrZs+erb179+rjjz/WRx99pGQyqYULF+rmzZuDHicUCsntdqc2n89np0wAADBOZfxbRX6/X7W1tSopKdGiRYt0+PBhPfPMM/rwww8HXdPQ0KBYLJbaOjs7M10mAAAwwAQ7kwsKCpSbm6toNNpvPBqNyuv1DmkfEydOVGlpqa5evTroHKfTKafTaac0AACQBWxdccnLy1NZWZnC4XBqLJlMKhwOy+/3D2kffX19unjxoqZNm2avUgAAkPVsXXGRpGAwqLq6OpWXl6uiokLbt29XT0+P6uvrJUm1tbWaPn26QqGQJGnz5s1asGCBZs2ape7ubm3ZskU3btzQihUr0nsmAABg3LMdXGpqanTnzh1t3LhRkUhEJSUlam5uTn1gt6OjQzk531zIuXv3rlauXKlIJKKpU6eqrKxMZ86c0dy5c9N3FgAAICs4LMuyRruIPyQej8vtdisWi8nlco12OQAAYAgy8f7Ns4oAAIAxCC4AAMAYBBcAAGAMggsAADAGwQUAABiD4AIAAIxBcAEAAMYguAAAAGMQXAAAgDEILgAAwBgEFwAAYAyCCwAAMAbBBQAAGIPgAgAAjEFwAQAAxiC4AAAAYxBcAACAMQguAADAGAQXAABgDIILAAAwBsEFAAAYg+ACAACMQXABAADGILgAAABjEFwAAIAxCC4AAMAYBBcAAGAMggsAADAGwQUAABhjWMGlqalJRUVFys/PV2Vlpc6ePfvY+YcOHdKcOXOUn5+vefPm6cSJE8MqFgAAZDfbweXAgQMKBoNqbGzU+fPnVVxcrEAgoNu3bw84/8yZM3r99de1fPlyXbhwQdXV1aqurtalS5eeuHgAAJBdHJZlWXYWVFZW6pVXXtGOHTskSclkUj6fT2+99ZbWr1//yPyamhr19PTo2LFjqbEFCxaopKREu3btGtIx4/G43G63YrGYXC6XnXIBAMAoycT79wQ7k3t7e9XW1qaGhobUWE5OjqqqqtTa2jrgmtbWVgWDwX5jgUBAR48eHfQ4iURCiUQi9ToWi0n6+g8AAACY4eH7ts1rJI9lK7h0dXWpr69PHo+n37jH49GVK1cGXBOJRAacH4lEBj1OKBTSpk2bHhn3+Xx2ygUAAGPA559/LrfbnZZ92QouI6WhoaHfVZru7m7NnDlTHR0daTtxDE88HpfP51NnZye37UYZvRg76MXYQj/GjlgsphkzZuipp55K2z5tBZeCggLl5uYqGo32G49Go/J6vQOu8Xq9tuZLktPplNPpfGTc7Xbzl3CMcLlc9GKMoBdjB70YW+jH2JGTk75fX7G1p7y8PJWVlSkcDqfGksmkwuGw/H7/gGv8fn+/+ZLU0tIy6HwAAIDB2L5VFAwGVVdXp/LyclVUVGj79u3q6elRfX29JKm2tlbTp09XKBSSJL399ttatGiRtm7dqiVLlmj//v06d+6cdu/end4zAQAA457t4FJTU6M7d+5o48aNikQiKikpUXNzc+oDuB0dHf0uCS1cuFC//vWvtWHDBr3zzjt66aWXdPToUb388stDPqbT6VRjY+OAt48wsujF2EEvxg56MbbQj7EjE72w/TsuAAAAo4VnFQEAAGMQXAAAgDEILgAAwBgEFwAAYAyCCwAAMIbt4HL69GktXbpUhYWFcjgcj31Y4kOnTp3S/Pnz5XQ6NWvWLO3bt28YpQIAgGxnO7j09PSouLhYTU1NQ5p//fp1LVmyRIsXL1Z7e7tWr16tFStW6OTJk7aLBQAA2e2JfsfF4XDoyJEjqq6uHnTOunXrdPz4cV26dCk19tprr6m7u1vNzc3DPTQAAMhCGX86dGtrq6qqqvqNBQIBrV69etA1iURCiUQi9TqZTOqLL77Q008/LYfDkalSAQBAGlmWpXv37qmwsDBtD1rMeHCJRCKpxwE85PF4FI/H9eDBA02aNOmRNaFQSJs2bcp0aQAAYAR0dnbqueeeS8u+Mh5chqOhoUHBYDD1OhaLacaMGers7OQR5QAAGCIej8vn82nKlClp22fGg4vX61U0Gu03Fo1G5XK5BrzaIn39UKaBHsjkcrkILgAAGCadH/PI+O+4+P1+hcPhfmMtLS3y+/2ZPjQAABhnbAeX+/fvq729Xe3t7ZK+/rpze3u7Ojo6JH19m6e2tjY1f9WqVbp27ZrWrl2rK1euaOfOnTp48KDWrFmTnjMAAABZw3ZwOXfunEpLS1VaWipJCgaDKi0t1caNGyVJt27dSoUYSXr++ed1/PhxtbS0qLi4WFu3btWePXsUCATSdAoAACBbPNHvuIyUeDwut9utWCzGZ1wAADBEJt6/eVYRAAAwBsEFAAAYg+ACAACMQXABAADGILgAAABjEFwAAIAxCC4AAMAYBBcAAGAMggsAADAGwQUAABiD4AIAAIxBcAEAAMYguAAAAGMQXAAAgDEILgAAwBgEFwAAYAyCCwAAMAbBBQAAGIPgAgAAjEFwAQAAxiC4AAAAYxBcAACAMQguAADAGAQXAABgDIILAAAwBsEFAAAYg+ACAACMQXABAADGILgAAABjEFwAAIAxhhVcmpqaVFRUpPz8fFVWVurs2bODzt23b58cDke/LT8/f9gFAwCA7GU7uBw4cEDBYFCNjY06f/68iouLFQgEdPv27UHXuFwu3bp1K7XduHHjiYoGAADZyXZw2bZtm1auXKn6+nrNnTtXu3bt0uTJk7V3795B1zgcDnm93tTm8Xgee4xEIqF4PN5vAwAAsBVcent71dbWpqqqqm92kJOjqqoqtba2Drru/v37mjlzpnw+n5YtW6bLly8/9jihUEhutzu1+Xw+O2UCAIBxylZw6erqUl9f3yNXTDwejyKRyIBrZs+erb179+rjjz/WRx99pGQyqYULF+rmzZuDHqehoUGxWCy1dXZ22ikTAACMUxMyfQC/3y+/3596vXDhQn3nO9/Rhx9+qPfee2/ANU6nU06nM9OlAQAAw9i64lJQUKDc3FxFo9F+49FoVF6vd0j7mDhxokpLS3X16lU7hwYAALAXXPLy8lRWVqZwOJwaSyaTCofD/a6qPE5fX58uXryoadOm2asUAABkPdu3ioLBoOrq6lReXq6Kigpt375dPT09qq+vlyTV1tZq+vTpCoVCkqTNmzdrwYIFmjVrlrq7u7VlyxbduHFDK1asSO+ZAACAcc92cKmpqdGdO3e0ceNGRSIRlZSUqLm5OfWB3Y6ODuXkfHMh5+7du1q5cqUikYimTp2qsrIynTlzRnPnzk3fWQAAgKzgsCzLGu0i/pB4PC63261YLCaXyzXa5QAAgCHIxPs3zyoCAADGILgAAABjEFwAAIAxCC4AAMAYBBcAAGAMggsAADAGwQUAABiD4AIAAIxBcAEAAMYguAAAAGMQXAAAgDEILgAAwBgEFwAAYAyCCwAAMAbBBQAAGIPgAgAAjEFwAQAAxiC4AAAAYxBcAACAMQguAADAGAQXAABgDIILAAAwBsEFAAAYg+ACAACMQXABAADGILgAAABjEFwAAIAxCC4AAMAYBBcAAGCMYQWXpqYmFRUVKT8/X5WVlTp79uxj5x86dEhz5sxRfn6+5s2bpxMnTgyrWAAAkN1sB5cDBw4oGAyqsbFR58+fV3FxsQKBgG7fvj3g/DNnzuj111/X8uXLdeHCBVVXV6u6ulqXLl164uIBAEB2cViWZdlZUFlZqVdeeUU7duyQJCWTSfl8Pr311ltav379I/NramrU09OjY8eOpcYWLFigkpIS7dq1a8BjJBIJJRKJ1OtYLKYZM2aos7NTLpfLTrkAAGCUxONx+Xw+dXd3y+12p2WfE+xM7u3tVVtbmxoaGlJjOTk5qqqqUmtr64BrWltbFQwG+40FAgEdPXp00OOEQiFt2rTpkXGfz2enXAAAMAZ8/vnnoxNcurq61NfXJ4/H02/c4/HoypUrA66JRCIDzo9EIoMep6GhoV/Y6e7u1syZM9XR0ZG2E8fwPEzPXP0affRi7KAXYwv9GDse3jF56qmn0rZPW8FlpDidTjmdzkfG3W43fwnHCJfLRS/GCHoxdtCLsYV+jB05Oen7ErOtPRUUFCg3N1fRaLTfeDQaldfrHXCN1+u1NR8AAGAwtoJLXl6eysrKFA6HU2PJZFLhcFh+v3/ANX6/v998SWppaRl0PgAAwGBs3yoKBoOqq6tTeXm5KioqtH37dvX09Ki+vl6SVFtbq+nTpysUCkmS3n77bS1atEhbt27VkiVLtH//fp07d067d+8e8jGdTqcaGxsHvH2EkUUvxg56MXbQi7GFfowdmeiF7a9DS9KOHTu0ZcsWRSIRlZSU6Oc//7kqKyslST/4wQ9UVFSkffv2peYfOnRIGzZs0GeffaaXXnpJH3zwgV599dW0nQQAAMgOwwouAAAAo4FnFQEAAGMQXAAAgDEILgAAwBgEFwAAYAyCCwAAMIbt4HL69GktXbpUhYWFcjgcj31Y4kOnTp3S/Pnz5XQ6NWvWrH5flQYAABgq28Glp6dHxcXFampqGtL869eva8mSJVq8eLHa29u1evVqrVixQidPnrRdLAAAyG5P9DsuDodDR44cUXV19aBz1q1bp+PHj+vSpUupsddee03d3d1qbm4e7qEBAEAWyvjToVtbW1VVVdVvLBAIaPXq1YOuSSQSSiQSqdfJZFJffPGFnn76aTkcjkyVCgAA0siyLN27d0+FhYVpe0J0xoNLJBKRx+PpN+bxeBSPx/XgwQNNmjTpkTWhUEibNm3KdGkAAGAEdHZ26rnnnkvLvjIeXIajoaFBwWAw9ToWi2nGjBnq7OyUy+UaxcoAAMBQxeNx+Xw+TZkyJW37zHhw8Xq9ikaj/cai0ahcLteAV1ukr58mOdCTJF0uF8EFAADDpPNjHhn/HRe/369wONxvrKWlRX6/P9OHBgAA44zt4HL//n21t7ervb1d0tdfd25vb1dHR4ekr2/z1NbWpuavWrVK165d09q1a3XlyhXt3LlTBw8e1Jo1a9JzBgAAIGvYDi7nzp1TaWmpSktLJUnBYFClpaXauHGjJOnWrVupECNJzz//vI4fP66WlhYVFxdr69at2rNnjwKBQJpOAQAAZIsn+h2XkRKPx+V2uxWLxfiMCwAAhsjE+zfPKgIAAMYguAAAAGMQXAAAgDEILgAAwBgEFwAAYAyCCwAAMAbBBQAAGIPgAgAAjEFwAQAAxiC4AAAAYxBcAACAMQguAADAGAQXAABgDIILAAAwBsEFAAAYg+ACAACMQXABAADGILgAAABjEFwAAIAxCC4AAMAYBBcAAGAMggsAADAGwQUAABiD4AIAAIxBcAEAAMYguAAAAGMQXAAAgDEILgAAwBgEFwAAYIxhBZempiYVFRUpPz9flZWVOnv27KBz9+3bJ4fD0W/Lz88fdsEAACB72Q4uBw4cUDAYVGNjo86fP6/i4mIFAgHdvn170DUul0u3bt1KbTdu3HiiogEAQHayHVy2bdumlStXqr6+XnPnztWuXbs0efJk7d27d9A1DodDXq83tXk8nicqGgAAZCdbwaW3t1dtbW2qqqr6Zgc5OaqqqlJra+ug6+7fv6+ZM2fK5/Np2bJlunz58mOPk0gkFI/H+20AAAC2gktXV5f6+voeuWLi8XgUiUQGXDN79mzt3btXH3/8sT766CMlk0ktXLhQN2/eHPQ4oVBIbrc7tfl8PjtlAgCAcSrj3yry+/2qra1VSUmJFi1apMOHD+uZZ57Rhx9+OOiahoYGxWKx1NbZ2ZnpMgEAgAEm2JlcUFCg3NxcRaPRfuPRaFRer3dI+5g4caJKS0t19erVQec4nU45nU47pQEAgCxg64pLXl6eysrKFA6HU2PJZFLhcFh+v39I++jr69PFixc1bdo0e5UCAICsZ+uKiyQFg0HV1dWpvLxcFRUV2r59u3p6elRfXy9Jqq2t1fTp0xUKhSRJmzdv1oIFCzRr1ix1d3dry5YtunHjhlasWJHeMwEAAOOe7eBSU1OjO3fuaOPGjYpEIiopKVFzc3PqA7sdHR3KyfnmQs7du3e1cuVKRSIRTZ06VWVlZTpz5ozmzp2bvrMAAABZwWFZljXaRfwh8XhcbrdbsVhMLpdrtMsBAABDkIn3b55VBAAAjEFwAQAAxiC4AAAAYxBcAACAMQguAADAGAQXAABgDIILAAAwBsEFAAAYg+ACAACMQXABAADGILgAAABjEFwAAIAxCC4AAMAYBBcAAGAMggsAADAGwQUAABiD4AIAAIxBcAEAAMYguAAAAGMQXAAAgDEILgAAwBgEFwAAYAyCCwAAMAbBBQAAGIPgAgAAjEFwAQAAxiC4AAAAYxBcAACAMQguAADAGMMKLk1NTSoqKlJ+fr4qKyt19uzZx84/dOiQ5syZo/z8fM2bN08nTpwYVrEAACC72Q4uBw4cUDAYVGNjo86fP6/i4mIFAgHdvn17wPlnzpzR66+/ruXLl+vChQuqrq5WdXW1Ll269MTFAwCA7OKwLMuys6CyslKvvPKKduzYIUlKJpPy+Xx66623tH79+kfm19TUqKenR8eOHUuNLViwQCUlJdq1a9eQjhmPx+V2uxWLxeRyueyUCwAARkkm3r8n2Jnc29urtrY2NTQ0pMZycnJUVVWl1tbWAde0trYqGAz2GwsEAjp69Oigx0kkEkokEqnXsVhM0td/AAAAwAwP37dtXiN5LFvBpaurS319ffJ4PP3GPR6Prly5MuCaSCQy4PxIJDLocUKhkDZt2vTIuM/ns1MuAAAYAz7//HO53e607MtWcBkpDQ0N/a7SdHd3a+bMmero6EjbiWN44vG4fD6fOjs7uW03yujF2EEvxhb6MXbEYjHNmDFDTz31VNr2aSu4FBQUKDc3V9FotN94NBqV1+sdcI3X67U1X5KcTqecTucj4263m7+EY4TL5aIXYwS9GDvoxdhCP8aOnJz0/fqKrT3l5eWprKxM4XA4NZZMJhUOh+X3+wdc4/f7+82XpJaWlkHnAwAADMb2raJgMKi6ujqVl5eroqJC27dvV09Pj+rr6yVJtbW1mj59ukKhkCTp7bff1qJFi7R161YtWbJE+/fv17lz57R79+70ngkAABj3bAeXmpoa3blzRxs3blQkElFJSYmam5tTH8Dt6Ojod0lo4cKF+vWvf60NGzbonXfe0UsvvaSjR4/q5ZdfHvIxnU6nGhsbB7x9hJFFL8YOejF20IuxhX6MHZnohe3fcQEAABgtPKsIAAAYg+ACAACMQXABAADGILgAAABjEFwAAIAxbAeX06dPa+nSpSosLJTD4XjswxIfOnXqlObPny+n06lZs2Zp3759wygVAABkO9vBpaenR8XFxWpqahrS/OvXr2vJkiVavHix2tvbtXr1aq1YsUInT560XSwAAMhuT/Q7Lg6HQ0eOHFF1dfWgc9atW6fjx4/r0qVLqbHXXntN3d3dam5uHu6hAQBAFsr406FbW1tVVVXVbywQCGj16tWDrkkkEkokEqnXyWRSX3zxhZ5++mk5HI5MlQoAANLIsizdu3dPhYWFaXvQYsaDSyQSST0O4CGPx6N4PK4HDx5o0qRJj6wJhULatGlTpksDAAAjoLOzU88991xa9pXx4DIcDQ0NCgaDqdexWEwzZsxQZ2cnjygHAMAQ8XhcPp9PU6ZMSds+Mx5cvF6votFov7FoNCqXyzXg1Rbp64cyDfRAJpfLRXABAMAw6fyYR8Z/x8Xv9yscDvcba2lpkd/vz/ShAQDAOGM7uNy/f1/t7e1qb2+X9PXXndvb29XR0SHp69s8tbW1qfmrVq3StWvXtHbtWl25ckU7d+7UwYMHtWbNmvScAQAAyBq2g8u5c+dUWlqq0tJSSVIwGFRpaak2btwoSbp161YqxEjS888/r+PHj6ulpUXFxcXaunWr9uzZo0AgkKZTAAAA2eKJfsdlpMTjcbndbsViMT7jAgCAITLx/s2zigAAgDEILgAAwBgEFwAAYAyCCwAAMAbBBQAAGIPgAgAAjEFwAQAAxiC4AAAAYxBcAACAMQguAADAGAQXAABgDIILAAAwBsEFAAAYg+ACAACMQXABAADGILgAAABjEFwAAIAxCC4AAMAYBBcAAGAMggsAADAGwQUAABiD4AIAAIxBcAEAAMYguAAAAGMQXAAAgDEILgAAwBgEFwAAYAyCCwAAMAbBBQAAGGNYwaWpqUlFRUXKz89XZWWlzp49O+jcffv2yeFw9Nvy8/OHXTAAAMhetoPLgQMHFAwG1djYqPPnz6u4uFiBQEC3b98edI3L5dKtW7dS240bN56oaAAAkJ1sB5dt27Zp5cqVqq+v19y5c7Vr1y5NnjxZe/fuHXSNw+GQ1+tNbR6P54mKBgAA2clWcOnt7VVbW5uqqqq+2UFOjqqqqtTa2jrouvv372vmzJny+XxatmyZLl++/NjjJBIJxePxfhsAAICt4NLV1aW+vr5Hrph4PB5FIpEB18yePVt79+7Vxx9/rI8++kjJZFILFy7UzZs3Bz1OKBSS2+1ObT6fz06ZAABgnMr4t4r8fr9qa2tVUlKiRYsW6fDhw3rmmWf04YcfDrqmoaFBsVgstXV2dma6TAAAYIAJdiYXFBQoNzdX0Wi033g0GpXX6x3SPiZOnKjS0lJdvXp10DlOp1NOp9NOaQAAIAvYuuKSl5ensrIyhcPh1FgymVQ4HJbf7x/SPvr6+nTx4kVNmzbNXqUAACDr2briIknBYFB1dXUqLy9XRUWFtm/frp6eHtXX10uSamtrNX36dIVCIUnS5s2btWDBAs2aNUvd3d3asmWLbty4oRUrVqT3TAAAwLhnO7jU1NTozp072rhxoyKRiEpKStTc3Jz6wG5HR4dycr65kHP37l2tXLlSkUhEU6dOVVlZmc6cOaO5c+em7ywAAEBWcFiWZY12EX9IPB6X2+1WLBaTy+Ua7XIAAMAQZOL9m2cVAQAAYxBcAACAMQguAADAGAQXAABgDIILAAAwBsEFAAAYg+ACAACMQXABAADGILgAAABjEFwAAIAxCC4AAMAYBBcAAGAMggsAADAGwQUAABiD4AIAAIxBcAEAAMYguAAAAGMQXAAAgDEILgAAwBgEFwAAYAyCCwAAMAbBBQAAGIPgAgAAjEFwAQAAxiC4AAAAYxBcAACAMQguAADAGAQXAABgDIILAAAwBsEFAAAYY1jBpampSUVFRcrPz1dlZaXOnj372PmHDh3SnDlzlJ+fr3nz5unEiRPDKhYAAGQ328HlwIEDCgaDamxs1Pnz51VcXKxAIKDbt28POP/MmTN6/fXXtXz5cl24cEHV1dWqrq7WpUuXnrh4AACQXRyWZVl2FlRWVuqVV17Rjh07JEnJZFI+n09vvfWW1q9f/8j8mpoa9fT06NixY6mxBQsWqKSkRLt27RrwGIlEQolEIvU6FotpxowZ6uzslMvlslMuAAAYJfF4XD6fT93d3XK73WnZ5wQ7k3t7e9XW1qaGhobUWE5OjqqqqtTa2jrgmtbWVgWDwX5jgUBAR48eHfQ4oVBImzZtemTc5/PZKRcAAIwBn3/++egEl66uLvX19cnj8fQb93g8unLlyoBrIpHIgPMjkcigx2loaOgXdrq7uzVz5kx1dHSk7cQxPA/TM1e/Rh+9GDvoxdhCP8aOh3dMnnrqqbTt01ZwGSlOp1NOp/ORcbfbzV/CMcLlctGLMYJejB30YmyhH2NHTk76vsRsa08FBQXKzc1VNBrtNx6NRuX1egdc4/V6bc0HAAAYjK3gkpeXp7KyMoXD4dRYMplUOByW3+8fcI3f7+83X5JaWloGnQ8AADAY27eKgsGg6urqVF5eroqKCm3fvl09PT2qr6+XJNXW1mr69OkKhUKSpLfffluLFi3S1q1btWTJEu3fv1/nzp3T7t27h3xMp9OpxsbGAW8fYWTRi7GDXowd9GJsoR9jRyZ6Yfvr0JK0Y8cObdmyRZFIRCUlJfr5z3+uyspKSdIPfvADFRUVad++fan5hw4d0oYNG/TZZ5/ppZde0gcffKBXX301bScBAACyw7CCCwAAwGjgWUUAAMAYBBcAAGAMggsAADAGwQUAABhjzASXpqYmFRUVKT8/X5WVlTp79uxj5x86dEhz5sxRfn6+5s2bpxMnToxQpeOfnV788pe/1Pe//31NnTpVU6dOVVVV1R/sHYbO7r+Lh/bv3y+Hw6Hq6urMFphF7Paiu7tbb775pqZNmyan06lvf/vb/HcqTez2Yvv27Zo9e7YmTZokn8+nNWvW6H//939HqNrx6/Tp01q6dKkKCwvlcDge+wzCh06dOqX58+fL6XRq1qxZ/b6BPGTWGLB//34rLy/P2rt3r3X58mVr5cqV1re+9S0rGo0OOP+3v/2tlZuba33wwQfWJ598Ym3YsMGaOHGidfHixRGufPyx24sf/ehHVlNTk3XhwgXr008/tf78z//ccrvd1s2bN0e48vHHbi8eun79ujV9+nTr+9//vrVs2bKRKXacs9uLRCJhlZeXW6+++qr1m9/8xrp+/bp16tQpq729fYQrH3/s9uJXv/qV5XQ6rV/96lfW9evXrZMnT1rTpk2z1qxZM8KVjz8nTpyw3n33Xevw4cOWJOvIkSOPnX/t2jVr8uTJVjAYtD755BPrF7/4hZWbm2s1NzfbOu6YCC4VFRXWm2++mXrd19dnFRYWWqFQaMD5P/zhD60lS5b0G6usrLT+4i/+IqN1ZgO7vfi/vvrqK2vKlCnWP/3TP2WqxKwxnF589dVX1sKFC609e/ZYdXV1BJc0sduLv//7v7deeOEFq7e3d6RKzBp2e/Hmm29af/Inf9JvLBgMWt/73vcyWme2GUpwWbt2rfXd736331hNTY0VCARsHWvUbxX19vaqra1NVVVVqbGcnBxVVVWptbV1wDWtra395ktSIBAYdD6GZji9+L9+//vf68svv0zrk0Cz0XB7sXnzZj377LNavnz5SJSZFYbTi3/913+V3+/Xm2++KY/Ho5dfflk//elP1dfXN1Jlj0vD6cXChQvV1taWup107do1nThxgh9BHQXpeu8e9adDd3V1qa+vTx6Pp9+4x+PRlStXBlwTiUQGnB+JRDJWZzYYTi/+r3Xr1qmwsPCRv5ywZzi9+M1vfqN/+Id/UHt7+whUmD2G04tr167pP/7jP/Rnf/ZnOnHihK5evaqf/OQn+vLLL9XY2DgSZY9Lw+nFj370I3V1demP//iPZVmWvvrqK61atUrvvPPOSJSM/89g793xeFwPHjzQpEmThrSfUb/igvHj/fff1/79+3XkyBHl5+ePdjlZ5d69e3rjjTf0y1/+UgUFBaNdTtZLJpN69tlntXv3bpWVlammpkbvvvuudu3aNdqlZZ1Tp07ppz/9qXbu3Knz58/r8OHDOn78uN57773RLg3DNOpXXAoKCpSbm6toNNpvPBqNyuv1DrjG6/Xamo+hGU4vHvrZz36m999/X//+7/+uP/qjP8pkmVnBbi/+53/+R5999pmWLl2aGksmk5KkCRMm6He/+51efPHFzBY9Tg3n38W0adM0ceJE5ebmpsa+853vKBKJqLe3V3l5eRmtebwaTi/++q//Wm+88YZWrFghSZo3b556enr04x//WO+++65ycvj/7yNlsPdul8s15Kst0hi44pKXl6eysjKFw+HUWDKZVDgclt/vH3CN3+/vN1+SWlpaBp2PoRlOLyTpgw8+0Hvvvafm5maVl5ePRKnjnt1ezJkzRxcvXlR7e3tq+9M//VMtXrxY7e3t8vl8I1n+uDKcfxff+973dPXq1VR4lKT//u//1rRp0wgtT2A4vfj973//SDh5GCgtHtU3otL23m3vc8OZsX//fsvpdFr79u2zPvnkE+vHP/6x9a1vfcuKRCKWZVnWG2+8Ya1fvz41/7e//a01YcIE62c/+5n16aefWo2NjXwdOk3s9uL999+38vLyrH/5l3+xbt26ldru3bs3Wqcwbtjtxf/Ft4rSx24vOjo6rClTplh/+Zd/af3ud7+zjh07Zj377LPW3/7t347WKYwbdnvR2NhoTZkyxfrnf/5n69q1a9a//du/WS+++KL1wx/+cLROYdy4d++edeHCBevChQuWJGvbtm3WhQsXrBs3bliWZVnr16+33njjjdT8h1+H/qu/+ivr008/tZqamsz9OrRlWdYvfvELa8aMGVZeXp5VUVFh/dd//Vfqf1u0aJFVV1fXb/7Bgwetb3/721ZeXp713e9+1zp+/PgIVzx+2enFzJkzLUmPbI2NjSNf+Dhk99/F/4/gkl52e3HmzBmrsrLScjqd1gsvvGD93d/9nfXVV1+NcNXjk51efPnll9bf/M3fWC+++KKVn59v+Xw+6yc/+Yl19+7dkS98nPnP//zPAf/7//DPv66uzlq0aNEja0pKSqy8vDzrhRdesP7xH//R9nEdlsW1MgAAYIZR/4wLAADAUBFcAACAMQguAADAGAQXAABgDIILAAAwBsEFAAAYg+ACAACMQXABAADGILgAAABjEFwAAIAxCC4AAMAY/w8XZFZJeZVquAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "## compare the two force calculations\n", + "# since the forces were computed for each particle, rather than comparing them directly we compare the relative error in the magnitude and direction of the forces\n", + "\n", + "\n", + "# f_diff = f_nsquare_1e - f_analytical\n", + "f_diff = f_nsquare_2e - f_analytical\n", + "diff_mag = np.linalg.norm(f_diff, axis=1)\n", + "\n", + "\n", + "# plot the distribution of the error\n", + "# create 4 stacked histograms, sharing the same x axis\n", + "fig, ax = plt.subplots(4, sharex=True)\n", + "ax[0].hist(diff_mag, bins=NBINS)\n", + "ax[0].set_title('Magnitude of the force difference')\n", + "ax[0].set_yscale('log')\n", + "\n", + "ax[1].hist(f_diff[:,0], bins=NBINS)\n", + "ax[1].set_title('X component of the force difference')\n", + "ax[1].set_yscale('log')\n", + "\n", + "ax[2].hist(f_diff[:,1], bins=NBINS)\n", + "ax[2].set_title('Y component of the force difference')\n", + "ax[2].set_yscale('log')\n", + "\n", + "ax[3].hist(f_diff[:,2], bins=NBINS)\n", + "ax[3].set_title('Z component of the force difference')\n", + "ax[3].set_yscale('log')\n", + "\n", + "plt.title('Error in forces')\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "## Plot the radial force behaviour\n", + "r = np.linalg.norm(particles[:,:3], axis=1)\n", + "r_sort = np.argsort(r)\n", + "# r = r[r_sort]\n", + "# f_nsquare_1e = f_nsquare_1e[r_sort]\n", + "# f_nsquare_2e = f_nsquare_2e[r_sort]\n", + "# f_analytical = f_analytical[r_sort]\n", + "\n", + "plt.figure()\n", + "plt.title('Radial force behaviour')\n", + "plt.xscale('log')\n", + "plt.yscale('log')\n", + "plt.xlabel('r')\n", + "plt.ylabel('f')\n", + "\n", + "plt.plot(r, np.linalg.norm(f_analytical, axis=1), 'o', label=\"Analytical\")\n", + "\n", + "plt.plot(r, np.linalg.norm(f_nsquare, axis=1), 'o', label=\"N^2\")\n", + "plt.plot(r, np.linalg.norm(f_nsquare_1e, axis=1), 'o', label=\"N^2 - 1epsilon\")\n", + "plt.plot(r, np.linalg.norm(f_nsquare_2e, axis=1), 'o', label=\"N^2 - 2epsilon\")\n", + "plt.plot(r, np.linalg.norm(f_nsquare_5e, axis=1), 'o', label=\"N^2 - 5epsilon\")\n", + "# plt.plot(r, np.linalg.norm(f_nsquare_05e, axis=1), 'o', label=\"N^2 - 0.5epsilon\")\n", + "# plt.plot(r, np.linalg.norm(f_nsquare_01e, axis=1), 'o', label=\"N^2 - 0.1epsilon\")\n", + "# plt.plot(r, np.linalg.norm(f_nsquare_001e, axis=1), 'o', label=\"N^2 - 0.01epsilon\")\n", + "\n", + "plt.legend()\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Task 2 - Particle mesh" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "DEBUG:utils.integrate:Reshaped (1008, 7) to y0 with (6048,) and masses with (1008,)\n", + "DEBUG:utils.integrate:y with shape (6048,)\n", + "DEBUG:utils.integrate:Unstacked y into x with shape (1008, 3) and v with shape (1008, 3)\n", + "DEBUG:utils.forces:Computing forces for 1008 particles using n^2 algorithm\n", + "DEBUG:utils.forces:Particle 0 done\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "DEBUG:utils.forces:Particle 1000 done\n", + "DEBUG:utils.integrate:y with shape (6048,)\n", + "DEBUG:utils.integrate:Unstacked y into x with shape (1008, 3) and v with shape (1008, 3)\n", + "DEBUG:utils.forces:Computing forces for 1008 particles using n^2 algorithm\n", + "DEBUG:utils.forces:Particle 0 done\n", + "DEBUG:utils.forces:Particle 1000 done\n", + "DEBUG:utils.integrate:y with shape (6048,)\n", + "DEBUG:utils.integrate:Unstacked y into x with shape (1008, 3) and v with shape (1008, 3)\n", + "DEBUG:utils.forces:Computing forces for 1008 particles using n^2 algorithm\n", + "DEBUG:utils.forces:Particle 0 done\n", + "DEBUG:utils.forces:Particle 1000 done\n", + "/tmp/ipykernel_36731/3498856150.py:13: ODEintWarning: Excess accuracy requested (tolerances too small). Run with full_output = 1 to get quantitative information.\n", + " sol = spi.odeint(y_prime, y0, np.arange(0, n_steps*dt, dt), atol=1e3,rtol=1e2)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " lsoda-- at t (=r1), too much accuracy requested \u0000\u0000\n", + " for precision of machine.. see tolsf (=r2) \u0000\u0000\n", + " in above, r1 = 0.1000000000000D+00 r2 = NaN\n" + ] + } + ], + "source": [ + "# load the particles in the format [x, y, z, vx, vy, vz, mass]\n", + "particles = points[:, [2, 3, 4, 5, 6, 7, 1]]\n", + "\n", + "# we can now integrate this system for a few steps\n", + "dt = 0.1\n", + "n_steps = 10\n", + "force_function = lambda x: utils.n_body_forces(x, G, epsilon)\n", + "y0, y_prime = utils.ode_setup(particles, force_function)\n", + "\n", + "import scipy.integrate as spi\n", + "\n", + "# integrate the system\n", + "sol = spi.odeint(y_prime, y0, np.arange(0, n_steps*dt, dt), atol=1e3,rtol=1e2)\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "projects-X-9bmgL6", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/nbody/utils/__init__.py b/nbody/utils/__init__.py new file mode 100644 index 0000000..bb2d1cf --- /dev/null +++ b/nbody/utils/__init__.py @@ -0,0 +1,7 @@ +# Import all functions in all the files in the current directory +from .load import * +from .mesh import * +from .model import * +from .particles import * +from .forces import * +from .integrate import * \ No newline at end of file diff --git a/nbody/utils/forces.py b/nbody/utils/forces.py new file mode 100644 index 0000000..60678df --- /dev/null +++ b/nbody/utils/forces.py @@ -0,0 +1,77 @@ +import numpy as np +import logging +logger = logging.getLogger(__name__) + + +def n_body_forces(particles: np.ndarray, G: float, softening: float = 0): + """ + Computes the gravitational forces between a set of particles. + Assumes that the particles array has the following columns: x, y, z, m. + """ + if particles.shape[1] != 4: + raise ValueError("Particles array must have 4 columns: x, y, z, m") + + x_vec = particles[:, 0:3] + masses = particles[:, 3] + + n = particles.shape[0] + forces = np.zeros((n, 3)) + logger.debug(f"Computing forces for {n} particles using n^2 algorithm") + + for i in range(n): + # the current particle is at x_current + x_current = x_vec[i, :] + m_current = masses[i] + + # first compute the displacement to all other particles + displacements = x_vec - x_current + # and its magnitude + r = np.linalg.norm(displacements, axis=1) + # add softening to the denominator + r_adjusted = r**2 + softening**2 + # the numerator is tricky: + # m is a list of scalars and displacements is a list of vectors (2D array) + # we only want row_wise multiplication + num = G * (masses * displacements.T).T + + # a zero value is expected where we have the same particle + r_adjusted[i] = 1 + num[i] = 0 + + f = np.sum((num.T / r_adjusted**1.5).T, axis=0) * m_current + forces[i] = -f + + if i % 1000 == 0: + logger.debug(f"Particle {i} done") + + return forces + + + +def analytical_forces(particles: np.ndarray): + """ + Computes the interparticle forces without computing the n^2 interactions. + This is done by using newton's second theorem for a spherical mass distribution. + The force on a particle at radius r is simply the force exerted by a point mass with the enclosed mass. + Assumes that the particles array has the following columns: x, y, z, m. + """ + n = particles.shape[0] + forces = np.zeros((n, 3)) + + logger.debug(f"Computing forces for {n} particles using spherical approximation") + + for i in range(n): + r_current = np.linalg.norm(particles[i, 0:3]) + m_current = particles[i, 3] + + r_particles = np.linalg.norm(particles[:, :3], axis=1) + m_enclosed = np.sum(particles[r_particles < r_current, 3]) + + # the force is the same as the force exerted by a point mass at the center + f = - m_current * m_enclosed / r_current**2 + forces[i] = f + + if i % 1000 == 0: + logger.debug(f"Particle {i} done") + + return forces diff --git a/nbody/utils/integrate.py b/nbody/utils/integrate.py new file mode 100644 index 0000000..bbc001f --- /dev/null +++ b/nbody/utils/integrate.py @@ -0,0 +1,69 @@ +import numpy as np +import scipy.integrate as spi + +import logging +logger = logging.getLogger(__name__) + + +def ode_setup(particles: np.ndarray, force_function: callable) -> tuple[np.ndarray, callable]: + """ + Linearizes the ODE system for the particles interacting gravitationally. + Returns: + - the Y0 array corresponding to the initial conditions (x0 and v0) + - the function that computes the right hand side of the ODE with function signature f(t, y) + Assumes that the particles array has the following columns: x, y, z, vx, vy, vz, m. + """ + if particles.shape[1] != 7: + raise ValueError("Particles array must have 7 columns: x, y, z, vx, vy, vz, m") + + n = particles.shape[0] + # for scipy integrators we need to flatten the n 3D positions and n 3D velocities + y0 = np.zeros(6*n) + y0[:3*n] = particles[:, :3].flatten() + y0[3*n:] = particles[:, 3:6].flatten() + + # the masses don't change we can define them once + masses = particles[:, 6] + logger.debug(f"Reshaped {particles.shape} to y0 with {y0.shape} and masses with {masses.shape}") + + + def f(y, t): + """ + Computes the right hand side of the ODE system. + The ODE system is linearized around the current positions and velocities. + """ + n = y.size // 6 + logger.debug(f"y with shape {y.shape}") + # unsqueeze and unstack to extract the positions and velocities + y = y.reshape((2*n, 3)) + x = y[:n, ...] + v = y[n:, ...] + logger.debug(f"Unstacked y into x with shape {x.shape} and v with shape {v.shape}") + + # compute the forces + x_with_m = np.zeros((n, 4)) + x_with_m[:, :3] = x + x_with_m[:, 3] = masses + forces = force_function(x_with_m) + + # compute the accelerations + a = forces / masses[:, None] + a.flatten() + # the [:, None] is to force broadcasting in order to divide each row of forces by the corresponding mass + + # reshape into a 1D array + return np.vstack((v, a)).flatten() + + return y0, f + + +def to_particles(y: np.ndarray) -> np.ndarray: + """ + Converts the 1D array y into a 2D array with the shape (n, 6) where n is the number of particles. + The columns are x, y, z, vx, vy, vz + """ + n = y.size // 6 + y = y.reshape((2*n, 3)) + x = y[:n, ...] + v = y[n:, ...] + return np.hstack((x, v)) \ No newline at end of file diff --git a/nbody/utils/load.py b/nbody/utils/load.py index e69de29..45c61a4 100644 --- a/nbody/utils/load.py +++ b/nbody/utils/load.py @@ -0,0 +1,18 @@ +import numpy as np +from pathlib import Path +import logging + +logger = logging.getLogger(__name__) + + +def load_data(file: Path) -> tuple[np.ndarray, list]: + try: + data = np.loadtxt(file) + columns = [] + except ValueError: + data = np.loadtxt(file, skiprows=1) + header = file.read_text().splitlines()[0] + columns = header.split() + logger.info(f"Loaded {data.shape[0]} rows and {data.shape[1]} columns from {file}") + return data, columns + diff --git a/nbody/utils/mesh.py b/nbody/utils/mesh.py new file mode 100644 index 0000000..e69de29 diff --git a/nbody/utils/model.py b/nbody/utils/model.py new file mode 100644 index 0000000..7c334b2 --- /dev/null +++ b/nbody/utils/model.py @@ -0,0 +1,12 @@ +import numpy as np + +M = 5 +a = 5 + +def model_density_distribution(r_bins: np.ndarray): + """ + Generate a density distribution for a spherical galaxy model, as per the Hernquist model. + See https://doi.org/10.1086%2F168845 for more information. + """ + rho = M / (2 * np.pi) * a / (r_bins * (r_bins + a)**3) + return rho diff --git a/nbody/utils/particles.py b/nbody/utils/particles.py new file mode 100644 index 0000000..4e59a89 --- /dev/null +++ b/nbody/utils/particles.py @@ -0,0 +1,124 @@ +import numpy as np +import logging +logger = logging.getLogger(__name__) + + +def density_distribution(r_bins: np.ndarray, particles: np.ndarray, ret_error: bool = False): + """ + Computes the radial density distribution of a set of particles. + Assumes that the particles array has the following columns: x, y, z, m. + """ + if particles.shape[1] != 4: + raise ValueError("Particles array must have 4 columns: x, y, z, m") + + m = particles[:, 3] + r = np.linalg.norm(particles[:, :3], axis=1) + density = [np.sum(m[(r >= r_bins[i]) & (r < r_bins[i + 1])]) for i in range(len(r_bins) - 1)] + + # add the first volume which should be wrt 0 + volume = 4/3 * np.pi * (r_bins[1:]**3 - r_bins[:-1]**3) + volume = np.insert(volume, 0, 4/3 * np.pi * r_bins[0]**3) + density = r_bins / volume + if ret_error: + return density, density / np.sqrt(r_bins) + else: + return density + + + +def r_distribution(particles: np.ndarray): + """ + Computes the distribution of distances (to the origin) of a set of particles. + Assumes that the particles array has the following columns: x, y, z ... + """ + if particles.shape[1] < 3: + raise ValueError("Particles array must have at least 3 columns: x, y, z") + + r = np.linalg.norm(particles[:, :3], axis=1) + return r + + + +def remove_outliers(particles: np.ndarray, std_threshold: float = 3): + """ + Removes outliers from a set of particles. + Assumes that the particles array has the following columns: x, y, z ... + """ + if particles.shape[1] < 3: + raise ValueError("Particles array must have at least 3 columns: x, y, z") + + r = np.linalg.norm(particles[:, :3], axis=1) + r_std = np.std(r) + r_mean = np.mean(r) + mask = np.abs(r - r_mean) < std_threshold * r_std + return particles[mask] + + + +def mean_interparticle_distance(particles: np.ndarray): + """ + Computes the mean interparticle distance of a set of particles. + Assumes that the particles array has the following columns: x, y, z ... + """ + if particles.shape[1] < 3: + raise ValueError("Particles array must have at least 3 columns: x, y, z") + + + r_half_mass = half_mass_radius(particles) + r = np.linalg.norm(particles[:, :3], axis=1) + + n_half_mass = np.sum(r < r_half_mass) + logger.debug(f"Number of particles within half mass radius: {n_half_mass} of {particles.shape[0]}") + + rho = n_half_mass / (4/3 * np.pi * r_half_mass**3) + # the mean distance between particles is the inverse of the density + return (1 / rho)**(1/3) + # TODO: check if this is correct + + + +def half_mass_radius(particles: np.ndarray): + """ + Computes the half mass radius of a set of particles. + Assumes that the particles array has the following columns: x, y, z ... + """ + if particles.shape[1] < 3: + raise ValueError("Particles array must have at least 3 columns: x, y, z") + + # even though in the simple example, all the masses are the same, we will consider the general case + total_mass = np.sum(particles[:, 3]) + half_mass = total_mass / 2 + + # sort the particles by distance + r = np.linalg.norm(particles[:, :3], axis=1) + indices = np.argsort(r) + r = r[indices] + masses = particles[indices, 3] + masses_cumsum = np.cumsum(masses) + + i = np.argmin(np.abs(masses_cumsum - half_mass)) + logger.debug(f"Half mass radius: {r[i]} for {i}th particle of {particles.shape[0]}") + r_hm = r[i] + + return r_hm + + + +def relaxation_timescale(particles: np.ndarray, G:float) -> float: + """ + Computes the relaxation timescale of a set of particles using the velocity at the half mass radius. + Assumes that the particles array has the following columns: x, y, z ... + """ + m_half = np.sum(particles[:, 3]) / 2 # enclosed mass at half mass radius + r_half = half_mass_radius(particles) + n_half = np.sum(np.linalg.norm(particles[:, :3], axis=1) < r_half) # number of enclosed particles + v_c = np.sqrt(G * m_half / r_half) + + # the crossing time for the half mass system is + t_c = r_half / v_c + logger.debug(f"Crossing time for half mass system: {t_c}") + + # the relaxation timescale is t_c * N/(10 * log(N)) + t_rel = t_c * n_half / (10 * np.ln(n_half)) + + return t_rel