Compare commits

...
6 Commits
Author SHA1 Message Date
paul dee3c87c66 Add strong scaling GPU actions table 2024-03-11 07:00:58 +01:00
paul 3ba78c5f11 Add timing script for investigating action contribution 2024-03-11 04:31:14 +01:00
paul dac08095c4 Add weak timings 2024-03-11 01:45:18 +01:00
paul 79227e93d9 Add weak scaling config generation script 2024-03-11 00:14:03 +01:00
paul d41d8b564b Add booster strong scaling configs 2024-03-10 16:54:00 +01:00
paul 59d5935567 Add more... 2024-03-09 23:34:48 +01:00
28 changed files with 990 additions and 29921 deletions
+3
View File
@@ -4,6 +4,9 @@ generate-batch-strong-cpu:
generate-batch-strong-gpu: generate-batch-strong-gpu:
python scripts/substitute.py strong-batch.j2 < strong-gpu.json python scripts/substitute.py strong-batch.j2 < strong-gpu.json
generate-batch-strong-booster:
python scripts/substitute.py strong-batch.j2 < strong-booster.json
clean-logs: clean-logs:
rm logs/* rm logs/*
@@ -0,0 +1,4 @@
label,BC:cells,BC:dynamicecm,Sweep:Cells,Sweep:DynamicECM,Sweep:DynamicECMDampers,Filling,Other
CPU,0.04629667717328299,3.88243023434036,0.002164069189058585,82.18255346583861,13.842310640806883,0.005797982839735358,0.03844692981207934
GPU,0.034897486509106485,41.227398706349675,13.180664898871365,22.432483220415783,19.749714111977486,1.9939606413394697,1.3808809345371023
Booster,0.09128030041871667,42.736382370072874,12.260298369798207,22.36492489089858,16.070196185259338,4.364304866307413,2.1126130172448816
1 label BC:cells BC:dynamicecm Sweep:Cells Sweep:DynamicECM Sweep:DynamicECMDampers Filling Other
2 CPU 0.04629667717328299 3.88243023434036 0.002164069189058585 82.18255346583861 13.842310640806883 0.005797982839735358 0.03844692981207934
3 GPU 0.034897486509106485 41.227398706349675 13.180664898871365 22.432483220415783 19.749714111977486 1.9939606413394697 1.3808809345371023
4 Booster 0.09128030041871667 42.736382370072874 12.260298369798207 22.36492489089858 16.070196185259338 4.364304866307413 2.1126130172448816
+4
View File
@@ -0,0 +1,4 @@
label,BC:cells,BC:dynamicecm,Sweep:Cells,Sweep:DynamicECM,Sweep:DynamicECMDampers,Other
CPU,0.9047934333333334,75.87579921250001,0.04229322083333333,1606.12465625,270.5255006333333,0.8646950250000001
GPU,0.11372260000000001,134.35027680000002,42.952648800000006,73.102122,64.3596162,10.9978052
Booster,0.155221,72.67267939999999,20.848482800000003,38.0312728,27.327165999999995,11.013917200000002
1 label BC:cells BC:dynamicecm Sweep:Cells Sweep:DynamicECM Sweep:DynamicECMDampers Other
2 CPU 0.9047934333333334 75.87579921250001 0.04229322083333333 1606.12465625 270.5255006333333 0.8646950250000001
3 GPU 0.11372260000000001 134.35027680000002 42.952648800000006 73.102122 64.3596162 10.9978052
4 Booster 0.155221 72.67267939999999 20.848482800000003 38.0312728 27.327165999999995 11.013917200000002
File diff suppressed because one or more lines are too long
+9
View File
@@ -0,0 +1,9 @@
label nodes tasks mean_time std_time speedup speedup_std speedup_error
1 1 1 161.08257980000002 1.0725827874500897 1.0 0.0066585895804611986 0.004614167168572558
1 1 2 109.2771463 1.3498701967829918 1.474073813730255 0.018208823861030076 0.012618071172974463
1 1 4 94.5763083 2.921107861707173 1.7032022363258181 0.052605536545441436 0.03645377698685362
2 2 8 75.06436665 5.345617315509918 2.145926049720424 0.15281950626022228 0.10589851499069955
4 4 16 42.842002025 1.5314070839490197 3.759921856733072 0.13440013758310768 0.09313454370387199
8 8 32 16.40522446875 4.395440141154071 9.818980539208297 2.6307924825691393 1.823046180232846
16 16 64 9.361684956249999 5.010216046116417 17.206579857449583 9.208671612370724 6.381283859970849
32 32 128 5.214438346875 0.113661681579046 30.891645290338204 0.6733604113945479 0.4666149588180552
1 label nodes tasks mean_time std_time speedup speedup_std speedup_error
2 1 1 1 161.08257980000002 1.0725827874500897 1.0 0.0066585895804611986 0.004614167168572558
3 1 1 2 109.2771463 1.3498701967829918 1.474073813730255 0.018208823861030076 0.012618071172974463
4 1 1 4 94.5763083 2.921107861707173 1.7032022363258181 0.052605536545441436 0.03645377698685362
5 2 2 8 75.06436665 5.345617315509918 2.145926049720424 0.15281950626022228 0.10589851499069955
6 4 4 16 42.842002025 1.5314070839490197 3.759921856733072 0.13440013758310768 0.09313454370387199
7 8 8 32 16.40522446875 4.395440141154071 9.818980539208297 2.6307924825691393 1.823046180232846
8 16 16 64 9.361684956249999 5.010216046116417 17.206579857449583 9.208671612370724 6.381283859970849
9 32 32 128 5.214438346875 0.113661681579046 30.891645290338204 0.6733604113945479 0.4666149588180552
File diff suppressed because one or more lines are too long
+10 -10
View File
@@ -1,10 +1,10 @@
label nodes mean_time std_time speedup speedup_std label nodes tasks mean_time std_time speedup speedup_std speedup_error
1 1 1132.1093720291667 18.428644622186628 1.0 0.016278148629010596 1 1 48 1953.3832839708334 14.087268287606769 1.0 0.007211727674340593 0.004711662080569187
2 2 619.9614289104168 7.890810670766857 1.8260964621925766 0.029725469622481192 2 2 96 1046.3540047312501 6.0880471399828595 1.866847429396085 0.010861959816590314 0.007096480413505672
4 4 348.657283046875 3.3739994706945122 3.247054993762918 0.052856043795043856 4 4 192 566.0709002166666 5.005298021298787 3.4507749527897755 0.030512356378918384 0.019934739500893344
8 8 200.79244575312498 1.259910347938215 5.63820699420684 0.09177957145282603 8 8 384 318.1225953708333 9.706195475255436 6.1403475024896865 0.18734731205020752 0.12240024387280224
16 16 111.37033198671875 0.3943541234366863 10.16526889911915 0.16547175799372044 16 16 768 178.56471887994792 9.393026972005948 10.939357428631386 0.5754422263707719 0.375955587895571
32 32 65.69918741145833 0.43464214827532205 17.231710415823503 0.28050034328084494 32 32 1536 99.82801128216144 1.4413062581268035 19.56748670921274 0.28251330150299214 0.18457535698195485
64 64 38.56257490957031 0.12227397957602136 29.35772247273364 0.4778893698204027 64 64 3072 55.75610567220052 1.0303316198245824 35.034428255357376 0.6474103379133267 0.42297475410337343
128 128 21.433497051595047 0.14016683538819355 52.81962944749218 0.8598057786755426 128 128 6144 31.589132888118492 0.32226687791817415 61.83719226764697 0.6308523555205254 0.41215687227340997
256 256 13.247708324598525 0.030540850807946187 85.45699711149668 1.3910817003698723 256 256 12288 19.11704500200738 0.18528928846832715 102.18018965617955 0.9903672160087601 0.6470399144590566
1 label nodes tasks mean_time std_time speedup speedup_std speedup_error
2 1 1 48 1132.1093720291667 1953.3832839708334 18.428644622186628 14.087268287606769 1.0 0.016278148629010596 0.007211727674340593 0.004711662080569187
3 2 2 96 619.9614289104168 1046.3540047312501 7.890810670766857 6.0880471399828595 1.8260964621925766 1.866847429396085 0.029725469622481192 0.010861959816590314 0.007096480413505672
4 4 4 192 348.657283046875 566.0709002166666 3.3739994706945122 5.005298021298787 3.247054993762918 3.4507749527897755 0.052856043795043856 0.030512356378918384 0.019934739500893344
5 8 8 384 200.79244575312498 318.1225953708333 1.259910347938215 9.706195475255436 5.63820699420684 6.1403475024896865 0.09177957145282603 0.18734731205020752 0.12240024387280224
6 16 16 768 111.37033198671875 178.56471887994792 0.3943541234366863 9.393026972005948 10.16526889911915 10.939357428631386 0.16547175799372044 0.5754422263707719 0.375955587895571
7 32 32 1536 65.69918741145833 99.82801128216144 0.43464214827532205 1.4413062581268035 17.231710415823503 19.56748670921274 0.28050034328084494 0.28251330150299214 0.18457535698195485
8 64 64 3072 38.56257490957031 55.75610567220052 0.12227397957602136 1.0303316198245824 29.35772247273364 35.034428255357376 0.4778893698204027 0.6474103379133267 0.42297475410337343
9 128 128 6144 21.433497051595047 31.589132888118492 0.14016683538819355 0.32226687791817415 52.81962944749218 61.83719226764697 0.8598057786755426 0.6308523555205254 0.41215687227340997
10 256 256 12288 13.247708324598525 19.11704500200738 0.030540850807946187 0.18528928846832715 85.45699711149668 102.18018965617955 1.3910817003698723 0.9903672160087601 0.6470399144590566
@@ -0,0 +1,9 @@
label,BC:cells,BC:dynamicecm,Sweep:Cells,Sweep:DynamicECM,Sweep:DynamicECMDampers,Filling,Other
1,0.034897486509106485,41.227398706349675,13.180664898871365,22.432483220415783,19.749714111977486,1.9939606413394697,1.3808809345371023
2,0.7137918070198439,50.7137377526309,8.923981074147767,19.35772833011394,17.571497161475467,1.320924803923136,1.3983390706889622
4,0.6647403410134337,58.291944402330074,7.087118055335309,16.67352093599457,15.236952119238136,1.092645293437499,0.953078852650984
8,0.6788278363464717,65.05900206274784,5.2089254465999275,14.249993130938188,13.176763096049008,0.7851584656500297,0.8413299616685318
16,1.441574901760373,61.1245906198054,4.832237599492141,16.029377636605524,14.996293924006913,0.716990077435801,0.858935240893841
32,3.3736940900007966,47.94830950907802,5.622259685491874,21.238716402604393,19.97281149065964,0.8196124452570666,1.0245963769081996
64,6.284545018581091,45.28808866195176,4.502683326147901,21.66574860147326,20.522789117514915,0.6460791296539419,1.0900661446771265
128,11.788574344478201,40.04977497065291,3.2677482351392375,22.1995263401806,21.209134936528987,0.4598839494487746,1.0253572235712836
1 label BC:cells BC:dynamicecm Sweep:Cells Sweep:DynamicECM Sweep:DynamicECMDampers Filling Other
2 1 0.034897486509106485 41.227398706349675 13.180664898871365 22.432483220415783 19.749714111977486 1.9939606413394697 1.3808809345371023
3 2 0.7137918070198439 50.7137377526309 8.923981074147767 19.35772833011394 17.571497161475467 1.320924803923136 1.3983390706889622
4 4 0.6647403410134337 58.291944402330074 7.087118055335309 16.67352093599457 15.236952119238136 1.092645293437499 0.953078852650984
5 8 0.6788278363464717 65.05900206274784 5.2089254465999275 14.249993130938188 13.176763096049008 0.7851584656500297 0.8413299616685318
6 16 1.441574901760373 61.1245906198054 4.832237599492141 16.029377636605524 14.996293924006913 0.716990077435801 0.858935240893841
7 32 3.3736940900007966 47.94830950907802 5.622259685491874 21.238716402604393 19.97281149065964 0.8196124452570666 1.0245963769081996
8 64 6.284545018581091 45.28808866195176 4.502683326147901 21.66574860147326 20.522789117514915 0.6460791296539419 1.0900661446771265
9 128 11.788574344478201 40.04977497065291 3.2677482351392375 22.1995263401806 21.209134936528987 0.4598839494487746 1.0253572235712836
File diff suppressed because one or more lines are too long
+9 -8
View File
@@ -1,8 +1,9 @@
label nodes tasks mean_time std_time speedup speedup_std label nodes tasks mean_time std_time speedup speedup_std speedup_error
1 1 1 157.5217688 0.5311809049610176 1.0 0.003372111099358209 1 1 1 316.56674059999995 1.3298279828832311 1.0 0.004200782370133899 0.002910993666206366
1 1 2 120.15237200000001 0.299200156243067 1.3110167213344732 0.004420894037456185 1 1 2 239.7297573 1.3705192585818793 1.3205150005797797 0.007549297425250635 0.00523139621453709
1 1 4 75.69762635 0.5769735213369493 2.0809340582447473 0.007017140834839633 1 1 4 150.86725470000002 1.463195211854327 2.098313124537819 0.020350616990413285 0.014102258089746373
2 2 8 52.110670325 0.940887445857671 3.022831366735062 0.010193323203255446 2 2 8 103.758313 1.3959932139830615 3.051001230137579 0.041049019495199714 0.028445519245192213
4 4 16 28.215493675000005 0.5598524922936691 5.582811012077745 0.018825858979446598 4 4 16 56.423368849999996 0.8293394846143929 5.610560784514376 0.08246688711191473 0.057146637198176795
8 8 32 12.422501156249998 0.31940690526235005 12.680358554102268 0.04275957782413007 8 8 32 24.168551143749998 0.5503559531334744 13.09829202078025 0.29826872726631265 0.20668968287257275
16 16 64 7.70770194375 0.04068644910316383 20.43693048194875 0.06891560011499148 16 16 64 15.05716248125 0.04648043269670786 21.024329185144023 0.06490066896072916 0.044973869063161365
32 32 128 9.9111531140625 0.08848604506395903 31.940455056721632 0.28516203039001964 0.19760720531719309
1 label nodes tasks mean_time std_time speedup speedup_std speedup_error
2 1 1 1 157.5217688 316.56674059999995 0.5311809049610176 1.3298279828832311 1.0 0.003372111099358209 0.004200782370133899 0.002910993666206366
3 1 1 2 120.15237200000001 239.7297573 0.299200156243067 1.3705192585818793 1.3110167213344732 1.3205150005797797 0.004420894037456185 0.007549297425250635 0.00523139621453709
4 1 1 4 75.69762635 150.86725470000002 0.5769735213369493 1.463195211854327 2.0809340582447473 2.098313124537819 0.007017140834839633 0.020350616990413285 0.014102258089746373
5 2 2 8 52.110670325 103.758313 0.940887445857671 1.3959932139830615 3.022831366735062 3.051001230137579 0.010193323203255446 0.041049019495199714 0.028445519245192213
6 4 4 16 28.215493675000005 56.423368849999996 0.5598524922936691 0.8293394846143929 5.582811012077745 5.610560784514376 0.018825858979446598 0.08246688711191473 0.057146637198176795
7 8 8 32 12.422501156249998 24.168551143749998 0.31940690526235005 0.5503559531334744 12.680358554102268 13.09829202078025 0.04275957782413007 0.29826872726631265 0.20668968287257275
8 16 16 64 7.70770194375 15.05716248125 0.04068644910316383 0.04648043269670786 20.43693048194875 21.024329185144023 0.06891560011499148 0.06490066896072916 0.044973869063161365
9 32 32 128 9.9111531140625 0.08848604506395903 31.940455056721632 0.28516203039001964 0.19760720531719309
File diff suppressed because one or more lines are too long
+9
View File
@@ -0,0 +1,9 @@
nodes tasks mean_time std_time efficiency efficiency_error
1 1 41.98463099999999 1.4067920862965122 1.0 0.023219381860496473
1 2 49.85189340000001 1.7669363566083227 0.8421872899214694 0.020685165974491628
1 4 59.9694977 2.209151778903949 0.7000997608822725 0.01787171173813342
2 8 72.810012625 0.5538313058789631 0.5766326565034021 0.003039461920431096
4 16 84.718001525 5.20969191162485 0.4955809892140865 0.021118450727088397
8 32 87.22569569999999 1.7018797711775082 0.4813332890390463 0.0065079080866405825
16 64 85.36740952500001 1.0197522041876155 0.49181099946232654 0.004071100890302765
32 128 87.5995021046875 0.8707125543332932 0.47927933368645675 0.003301208459097849
1 nodes tasks mean_time std_time efficiency efficiency_error
2 1 1 41.98463099999999 1.4067920862965122 1.0 0.023219381860496473
3 1 2 49.85189340000001 1.7669363566083227 0.8421872899214694 0.020685165974491628
4 1 4 59.9694977 2.209151778903949 0.7000997608822725 0.01787171173813342
5 2 8 72.810012625 0.5538313058789631 0.5766326565034021 0.003039461920431096
6 4 16 84.718001525 5.20969191162485 0.4955809892140865 0.021118450727088397
7 8 32 87.22569569999999 1.7018797711775082 0.4813332890390463 0.0065079080866405825
8 16 64 85.36740952500001 1.0197522041876155 0.49181099946232654 0.004071100890302765
9 32 128 87.5995021046875 0.8707125543332932 0.47927933368645675 0.003301208459097849
File diff suppressed because one or more lines are too long
+10
View File
@@ -0,0 +1,10 @@
nodes tasks mean_time std_time efficiency efficiency_error
1 48 234.09125610833334 4.9756238110995765 1.0 0.013886639526655382
2 96 234.09269640000002 1.9886350551995884 0.9999938473447108 0.005550081636855162
4 192 239.06532950520833 1.8931447841474947 0.9791936647310181 0.005066063671757703
8 384 241.32357499479167 0.977728668984766 0.9700306160033705 0.0025676679349660694
16 768 260.8008324059896 12.802824235961744 0.8975863073317291 0.028787758154736998
32 1536 266.59983470546877 13.970338204797093 0.8780622702446538 0.03006125980502309
64 3072 281.61153985800786 25.95560834859075 0.8312559074332151 0.05005532970709546
128 6144 293.4177162058594 10.8076489888669 0.7978088683101088 0.019198998510810975
256 12288 310.9775802693196 14.459893325743863 0.7527592693518308 0.022867934404056486
1 nodes tasks mean_time std_time efficiency efficiency_error
2 1 48 234.09125610833334 4.9756238110995765 1.0 0.013886639526655382
3 2 96 234.09269640000002 1.9886350551995884 0.9999938473447108 0.005550081636855162
4 4 192 239.06532950520833 1.8931447841474947 0.9791936647310181 0.005066063671757703
5 8 384 241.32357499479167 0.977728668984766 0.9700306160033705 0.0025676679349660694
6 16 768 260.8008324059896 12.802824235961744 0.8975863073317291 0.028787758154736998
7 32 1536 266.59983470546877 13.970338204797093 0.8780622702446538 0.03006125980502309
8 64 3072 281.61153985800786 25.95560834859075 0.8312559074332151 0.05005532970709546
9 128 6144 293.4177162058594 10.8076489888669 0.7978088683101088 0.019198998510810975
10 256 12288 310.9775802693196 14.459893325743863 0.7527592693518308 0.022867934404056486
File diff suppressed because one or more lines are too long
+9
View File
@@ -0,0 +1,9 @@
nodes tasks mean_time std_time efficiency efficiency_error
1 1 60.658062599999994 1.8711952545625232 1.0 0.021376748626269895
1 2 80.6903592 1.1554429061827625 0.751738661240214 0.007459415624087278
1 4 89.01234124999999 1.3979557323025515 0.6814567704677693 0.00741639040919915
2 8 101.357940575 4.784240687736861 0.5984539766286584 0.01957478845779047
4 16 106.2530252 1.5044057675724636 0.5708831582519497 0.005601211794070455
8 32 113.70197445 2.069642901549501 0.5334829310873062 0.006729131548114211
16 64 119.22770070624999 0.7600051865549382 0.5087581345667959 0.00224730403456563
32 128 121.8124414140625 0.5170666166834136 0.4979627852118346 0.0014647476739746731
1 nodes tasks mean_time std_time efficiency efficiency_error
2 1 1 60.658062599999994 1.8711952545625232 1.0 0.021376748626269895
3 1 2 80.6903592 1.1554429061827625 0.751738661240214 0.007459415624087278
4 1 4 89.01234124999999 1.3979557323025515 0.6814567704677693 0.00741639040919915
5 2 8 101.357940575 4.784240687736861 0.5984539766286584 0.01957478845779047
6 4 16 106.2530252 1.5044057675724636 0.5708831582519497 0.005601211794070455
7 8 32 113.70197445 2.069642901549501 0.5334829310873062 0.006729131548114211
8 16 64 119.22770070624999 0.7600051865549382 0.5087581345667959 0.00224730403456563
9 32 128 121.8124414140625 0.5170666166834136 0.4979627852118346 0.0014647476739746731
@@ -3,6 +3,7 @@
import argparse import argparse
import json import json
import math
def print_table(data, spec): def print_table(data, spec):
@@ -19,18 +20,33 @@ def print_table(data, spec):
if __name__ == "__main__": if __name__ == "__main__":
p = argparse.ArgumentParser(description="Turn files generated by timing.py into pgf datafiles") p = argparse.ArgumentParser(description="Turn files generated by timing.py into pgf datafiles")
p.add_argument("timing_file") p.add_argument("timing_file")
p.add_argument("--weak", action="store_true")
args = p.parse_args() args = p.parse_args()
with open(args.timing_file, "r", encoding="utf8") as f: with open(args.timing_file, "r", encoding="utf8") as f:
jobs = json.load(f) jobs = json.load(f)
scaling_spec = { if not args.weak:
"label": lambda job: job["accounting"][0]["nodes"]["count"], scaling_spec = {
"nodes": lambda job: job["accounting"][0]["nodes"]["count"], "label": lambda job: job["accounting"][0]["nodes"]["count"],
"tasks": lambda job: job["accounting"][0]["tasks"]["count"], "nodes": lambda job: job["accounting"][0]["nodes"]["count"],
"mean_time": lambda job: job["means"]["TimeStep"], "tasks": lambda job: job["accounting"][0]["tasks"]["count"],
"std_time": lambda job: job["stds"]["TimeStep"], "mean_time": lambda job: job["means"]["TimeStep"],
"speedup": lambda job: jobs[0]["means"]["TimeStep"] / job["means"]["TimeStep"], "std_time": lambda job: job["stds"]["TimeStep"],
"speedup_std": lambda job: jobs[0]["stds"]["TimeStep"] / job["means"]["TimeStep"], "speedup": lambda job: jobs[0]["means"]["TimeStep"] / job["means"]["TimeStep"],
} # Standard deviation scaled to speedup
"speedup_std": lambda job: (jobs[0]["means"]["TimeStep"] / job["means"]["TimeStep"]) * (job["stds"]["TimeStep"] / job["means"]["TimeStep"]),
# 95% confidence interval
"speedup_error": lambda job: (jobs[0]["means"]["TimeStep"] / job["means"]["TimeStep"]) * (job["stds"]["TimeStep"] / job["means"]["TimeStep"]) / math.sqrt(len(jobs)) * 1.96,
}
else:
scaling_spec = {
"nodes": lambda job: job["accounting"][0]["nodes"]["count"],
"tasks": lambda job: job["accounting"][0]["tasks"]["count"],
"mean_time": lambda job: job["means"]["TimeStep"],
"std_time": lambda job: job["stds"]["TimeStep"],
"efficiency": lambda job: jobs[0]["means"]["TimeStep"] / job["means"]["TimeStep"],
"efficiency_error": lambda job: (jobs[0]["means"]["TimeStep"] / job["means"]["TimeStep"]) * (job["stds"]["TimeStep"] / job["means"]["TimeStep"]) / math.sqrt(len(jobs)) * 1.96,
}
print_table(jobs, scaling_spec) print_table(jobs, scaling_spec)
@@ -0,0 +1,34 @@
#!/usr/bin/env python
import copy
import json
from pathlib import Path
SIZE = [384, 384, 384]
with (Path(__file__).parent.parent / "templates" / "strong-booster.json").open(encoding="utf8") as f:
template = json.load(f)
configs = [
[ 1, 1, 1],
[ 1, 1, 2],
[ 1, 2, 2],
[ 2, 2, 2],
[ 2, 2, 4],
[ 2, 4, 4],
[ 4, 4, 4],
[ 4, 4, 8],
]
out_path = Path(__file__).parent.parent / "generated" / "config"
for c in configs:
nc = copy.deepcopy(template)
nc["Geometry"]["blockcount"] = c
nc["Geometry"]["blocksize"] = [bs // bc for bc, bs in zip(c, SIZE)]
nc_out_path = out_path / f"strong-booster-{c[0]:02}-{c[1]:02}-{c[2]:02}.json"
print(f"Dumping {(c[0] * c[1] * c[2])} to {nc_out_path}")
with nc_out_path.open("w", encoding="utf8") as f:
json.dump(nc, f)
+207
View File
@@ -0,0 +1,207 @@
#!/usr/bin/env python
import jinja2
import json
import sys
from dataclasses import dataclass
from pathlib import Path
from typing import Tuple
SIZE = (192, 192, 192)
templates_env = jinja2.Environment(
loader=jinja2.FileSystemLoader(Path(__file__).parent.parent / "templates"),
autoescape=jinja2.select_autoescape()
)
@dataclass
class Experiment:
job_name: str
account: str
partition: str
nastja_binary_path: str
nodes: int
tasks: int
num_blocks: Tuple[int, int, int]
domain_scale: Tuple[int, int, int]
time: str = "00:15:00"
extra_sbatch_line: str = ""
logfile_path: str = "/p/project/cellsinsilico/paulslustigebude/ma/experiments/eval/logs/%x-%A.%a"
config_path: str = "/p/project/cellsinsilico/paulslustigebude/ma/experiments/eval/generated/config/${SLURM_JOB_NAME}.json"
output_dir_path: str = "/p/scratch/cellsinsilico/paul/nastja-out/${SLURM_JOB_NAME}-${SLURM_ARRAY_JOB_ID}.${SLURM_ARRAY_TASK_ID}"
def get_config(self):
with (Path(__file__).parent.parent / "templates" / "weak.json").open(encoding="utf8") as f:
config = json.load(f)
size = (
SIZE[0] * self.domain_scale[0],
SIZE[1] * self.domain_scale[1],
SIZE[2] * self.domain_scale[2],
)
blocksize = (
size[0] // self.num_blocks[0],
size[1] // self.num_blocks[1],
size[2] // self.num_blocks[2],
)
config["Geometry"] = {
"blockcount": list(self.num_blocks),
"blocksize": list(blocksize),
}
cells_filling = [{
"box": [
[0, 0, 0],
list(size)
],
"celltype": 0,
"component": 0,
"pattern": "const",
"seed": 0,
"shape": "cube",
"value": 0,
}]
for z in range(self.domain_scale[2]):
for y in range(self.domain_scale[1]):
for x in range(self.domain_scale[0]):
cx = x * SIZE[0] + SIZE[0] // 2
cy = y * SIZE[1] + SIZE[1] // 2
cz = z * SIZE[2] + SIZE[2] // 2
cells_filling.append({
"shape": "sphere",
"pattern": "voronoi",
"count": 715,
"radius": 38,
"center": [cx, cy, cz],
"box": [
[cx - 38, cy - 38, cz - 38],
[cx + 38, cy + 38, cz + 38]
],
"celltype": 9,
"seed": 758960,
})
config["Filling"]["cells"] = cells_filling
return config
def write_batch_file(self, out_path: Path):
t = templates_env.get_template("strong-batch.j2")
t.stream(
name=self.job_name,
account=self.account,
partition=self.partition,
nodes=self.nodes,
tasks=self.tasks,
extra_sbatch_line=self.extra_sbatch_line,
time=self.time,
logfile_path=self.logfile_path,
nastja_binary_path=self.nastja_binary_path,
config_path=self.config_path,
output_dir_path=self.output_dir_path,
).dump(str(out_path))
def make_cpu_ex(x: int, y: int, z: int) -> Experiment:
num_blocks = x * y * z
assert num_blocks % 48 == 0
num_nodes = num_blocks // 48
assert x % 4 == 0
assert y % 4 == 0
assert z % 3 == 0
return Experiment(
job_name=f"weak-cpu-{x:02}-{y:02}-{z:02}",
account="cellsinsilico",
partition="batch",
nastja_binary_path="/p/project/cellsinsilico/paulslustigebude/nastja/build-nocuda/nastja",
nodes=num_nodes,
tasks=num_blocks,
num_blocks=(x, y, z),
domain_scale=(x // 4, y // 4, z // 3),
)
def make_gpu_ex(x: int, y: int, z: int) -> Experiment:
num_blocks = x * y * z
gpus_per_node = num_blocks if num_blocks <= 4 else 4
num_nodes = 1 if num_blocks <= 4 else num_blocks // 4
return Experiment(
job_name=f"weak-gpu-{x:02}-{y:02}-{z:02}",
account="cellsinsilico",
partition="gpus",
extra_sbatch_line=f"#SBATCH --gres=gpu:{gpus_per_node}",
nastja_binary_path="/p/project/cellsinsilico/paulslustigebude/nastja/build-cuda/nastja",
nodes=num_nodes,
tasks=num_blocks,
num_blocks=(x, y, z),
domain_scale=(x, y, z),
)
def make_booster_ex(x: int, y: int, z: int) -> Experiment:
num_blocks = x * y * z
gpus_per_node = num_blocks if num_blocks <= 4 else 4
num_nodes = 1 if num_blocks <= 4 else num_blocks // 4
return Experiment(
job_name=f"weak-booster-{x:02}-{y:02}-{z:02}",
account="hkf6",
partition="booster",
extra_sbatch_line=f"#SBATCH --gres=gpu:{gpus_per_node}",
nastja_binary_path="/p/project/cellsinsilico/paulslustigebude/nastja/build-cuda/nastja",
nodes=num_nodes,
tasks=num_blocks,
num_blocks=(x, y, z),
domain_scale=(x, y, z),
)
experiments = [
make_cpu_ex(4, 4, 3),
make_cpu_ex(4, 4, 6),
make_cpu_ex(4, 4, 12),
make_cpu_ex(4, 8, 12),
make_cpu_ex(8, 8, 12),
make_cpu_ex(8, 8, 24),
make_cpu_ex(8, 16, 24),
make_cpu_ex(16, 16, 24),
make_cpu_ex(16, 16, 48),
make_gpu_ex(1, 1, 1),
make_gpu_ex(1, 1, 2),
make_gpu_ex(1, 2, 2),
make_gpu_ex(2, 2, 2),
make_gpu_ex(2, 2, 4),
make_gpu_ex(2, 4, 4),
make_gpu_ex(4, 4, 4),
make_gpu_ex(4, 4, 8),
make_booster_ex(1, 1, 1),
make_booster_ex(1, 1, 2),
make_booster_ex(1, 2, 2),
make_booster_ex(2, 2, 2),
make_booster_ex(2, 2, 4),
make_booster_ex(2, 4, 4),
make_booster_ex(4, 4, 4),
make_booster_ex(4, 4, 8),
]
if __name__ == "__main__":
outdir = Path(__file__).parent.parent / "generated"
for e in experiments:
print(f"Generating config for {e.job_name}", file=sys.stderr)
config_path = (outdir / "config" / e.job_name).with_suffix(".json")
with config_path.open("w", encoding="utf8") as f:
json.dump(e.get_config(), f, indent=2)
print(f"Generating batch file for {e.job_name}", file=sys.stderr)
e.write_batch_file(outdir / "batch" / e.job_name)
+24
View File
@@ -0,0 +1,24 @@
#!/usr/bin/env python
import argparse
import pandas
def show_seconds(s: float) -> str:
return f"{s:.2f}s"
if __name__ == '__main__':
p = argparse.ArgumentParser(description="Make a latex table from a timings tsv")
p.add_argument("timingfile")
p.add_argument("--weak", action="store_true")
args = p.parse_args()
df = pandas.read_csv(args.timingfile, sep="\t")
for i in range(len(df)):
if not args.weak:
print(f"{df['nodes'][i]} & {df['tasks'][i]} & {show_seconds(df['mean_time'][i])} & {show_seconds(df['std_time'][i])} & {df['speedup'][i]:.02f} & {df['speedup_error'][i]:.02f} \\\\")
else:
print(f"{df['nodes'][i]} & {df['tasks'][i]} & {show_seconds(df['mean_time'][i])} & {show_seconds(df['std_time'][i])} & {df['efficiency'][i]:.02f} & {df['efficiency_error'][i]:.02f} \\\\")
+61
View File
@@ -0,0 +1,61 @@
#!/usr/bin/env python
import argparse
import sys
import timing
ignore = ["TimeStep"]
if __name__ == "__main__":
p = argparse.ArgumentParser()
p.add_argument("jobs", nargs="+")
p.add_argument("--normalize", action="store_true")
p.add_argument("--extra-columns", nargs="*")
args = p.parse_args()
columns = [
"BC:cells",
"BC:dynamicecm",
"Sweep:Cells",
"Sweep:DynamicECM",
"Sweep:DynamicECMDampers",
] + (args.extra_columns or [])
dfs = dict()
labels = []
for label, jobid in [jobarg.split(":") for jobarg in args.jobs]:
jobs, excluded_array_indices = timing.get_jobs(jobid)
df = timing.load_array_mean_timings(jobid, excluded_array_indices).mean()
dfs[label] = df
labels.extend(df.index)
labels = set(labels)
print(",".join(["label"] + columns + ["Other"]))
values_by_label = dict()
for label, df in dfs.items():
values = {"Other": 0}
for c in df.index:
if c in ignore:
continue
elif c not in columns:
values["Other"] += df[c]
print(f"Others+= {c}={df[c]}", file=sys.stderr)
else:
values[c] = df[c]
values_by_label[label] = values
if args.normalize:
print("Normalizing data to 100%...", file=sys.stderr)
for values in values_by_label.values():
row_length = sum(values.values())
for c in values.keys():
values[c] *= 100 / row_length
for label, values in values_by_label.items():
print(label + "," + ",".join(f"{values[c]}" for c in columns + ["Other"]))
+33 -9
View File
@@ -44,12 +44,13 @@ def get_outdirs(jobid: str):
return sorted(Path("/p/scratch/cellsinsilico/paul/nastja-out").glob(f"*{jobid}*")) return sorted(Path("/p/scratch/cellsinsilico/paul/nastja-out").glob(f"*{jobid}*"))
def load_array_mean_timings(jobid: str): def load_array_mean_timings(jobid: str, excluded_array_indices):
mts = [ mts = []
load_mean_timings(outdir_path) for outdir_path in get_outdirs(jobid):
for outdir_path if any(str(outdir_path).endswith(str(i)) for i in excluded_array_indices):
in get_outdirs(jobid) print(f"Not loading timings for {outdir_path} because it was excluded.", file=sys.stderr)
] continue
mts.append(load_mean_timings(outdir_path))
return pandas.DataFrame(list(mts), columns=mts[0].index) return pandas.DataFrame(list(mts), columns=mts[0].index)
@@ -71,22 +72,45 @@ def get_accounting_data(jobid: str):
return json.loads(sacct_results.stdout.decode("utf8")) return json.loads(sacct_results.stdout.decode("utf8"))
def get_jobs(jobid: str):
accounting_data = get_accounting_data(jobid)
jobs = []
excluded_array_indices = []
for array_job in accounting_data["jobs"]:
# Get metadata related to array
array_main_job = array_job["array"]["job_id"]
array_index = array_job["array"]["task_id"]
# The last step is the actual job we want the data for
# The steps before set up cluster etc.
last_step = array_job["steps"][-1]
if last_step["state"] != "COMPLETED":
print(f"WARNING: {array_main_job}.{array_index} has state {last_step['state']}, excluding it from measurements", file=sys.stderr)
excluded_array_indices.append(array_index)
continue
jobs.append(last_step)
return jobs, excluded_array_indices
if __name__ == "__main__": if __name__ == "__main__":
p = argparse.ArgumentParser(description="Load and analzye data from nastja timing files") p = argparse.ArgumentParser(description="Load and analzye data from nastja timing files")
p.add_argument("jobid", nargs="+") p.add_argument("jobid", nargs="+")
p.add_argument("--prettify", action="store_true") p.add_argument("--prettify", action="store_true")
p.add_argument("--dump-timings", action="store_true")
args = p.parse_args() args = p.parse_args()
results = [] results = []
for i, jobid in enumerate(args.jobid, 1): for i, jobid in enumerate(args.jobid, 1):
print(f"({i:2}/{len(args.jobid):2}) Loading accounting data for {jobid}", file=sys.stderr) print(f"({i:2}/{len(args.jobid):2}) Loading accounting data for {jobid}", file=sys.stderr)
accounting_data = get_accounting_data(jobid) jobs, excluded_array_indices = get_jobs(jobid)
array_mean_timings = load_array_mean_timings(jobid) array_mean_timings = load_array_mean_timings(jobid, excluded_array_indices)
if args.dump_timings:
print(array_mean_timings, file=sys.stderr)
results.append({ results.append({
"jobid": jobid, "jobid": jobid,
"means": array_mean_timings.mean().to_dict(), "means": array_mean_timings.mean().to_dict(),
"stds": array_mean_timings.std().to_dict(), "stds": array_mean_timings.std().to_dict(),
"accounting": [array_job["steps"][-1] for array_job in accounting_data["jobs"]] "accounting": jobs
}) })
print(json.dumps(results, indent=2 if args.prettify else None)) print(json.dumps(results, indent=2 if args.prettify else None))
+63
View File
@@ -0,0 +1,63 @@
{
"common": {
"account": "hkf6",
"partition": "booster",
"extra_sbatch_line": "#SBATCH --gres=gpu:4",
"logfile_path": "/p/project/cellsinsilico/paulslustigebude/ma/experiments/eval/logs/%x-%A.%a",
"nastja_binary_path": "/p/project/cellsinsilico/paulslustigebude/nastja/build-cuda/nastja",
"config_path": "/p/project/cellsinsilico/paulslustigebude/ma/experiments/eval/generated/config/${SLURM_JOB_NAME}.json",
"output_dir_path": "/p/scratch/cellsinsilico/paul/nastja-out/${SLURM_JOB_NAME}-${SLURM_ARRAY_JOB_ID}.${SLURM_ARRAY_TASK_ID}"
},
"batches": [
{
"name": "strong-booster-01-01-01",
"nodes": 1,
"tasks": 1,
"time": "00:15:00",
"extra_sbatch_line": "#SBATCH --gres=gpu:1"
},
{
"name": "strong-booster-01-01-02",
"nodes": 1,
"tasks": 2,
"time": "00:15:00",
"extra_sbatch_line": "#SBATCH --gres=gpu:2"
},
{
"name": "strong-booster-01-02-02",
"nodes": 1,
"tasks": 4,
"time": "00:15:00"
},
{
"name": "strong-booster-02-02-02",
"nodes": 2,
"tasks": 8,
"time": "00:15:00"
},
{
"name": "strong-booster-02-02-04",
"nodes": 4,
"tasks": 16,
"time": "00:15:00"
},
{
"name": "strong-booster-02-04-04",
"nodes": 8,
"tasks": 32,
"time": "00:15:00"
},
{
"name": "strong-booster-04-04-04",
"nodes": 16,
"tasks": 64,
"time": "00:15:00"
},
{
"name": "strong-booster-04-04-08",
"nodes": 32,
"tasks": 128,
"time": "00:15:00"
}
]
}
+3 -3
View File
@@ -13,19 +13,19 @@
"name": "strong-cpu-04-04-03", "name": "strong-cpu-04-04-03",
"nodes": 1, "nodes": 1,
"tasks": 48, "tasks": 48,
"time": "00:30:00" "time": "01:00:00"
}, },
{ {
"name": "strong-cpu-04-04-06", "name": "strong-cpu-04-04-06",
"nodes": 2, "nodes": 2,
"tasks": 96, "tasks": 96,
"time": "00:30:00" "time": "01:00:00"
}, },
{ {
"name": "strong-cpu-04-04-12", "name": "strong-cpu-04-04-12",
"nodes": 4, "nodes": 4,
"tasks": 192, "tasks": 192,
"time": "00:10:00" "time": "00:20:00"
}, },
{ {
"name": "strong-cpu-04-08-12", "name": "strong-cpu-04-08-12",
@@ -0,0 +1,263 @@
{
"Application": "Cells",
"CellsInSilico": {
"2D": false,
"adhesion": {
"matrix": [
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 450.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 450.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 50.0]
],
"polarityenabled": false
},
"centerofmass": {
"steps": 1
},
"cleaner": {
"killdistance": 0,
"steps": 100
},
"contactinhibition": {
"enabled": false
},
"division": {
"condition": [
"",
"",
"",
"",
"",
"",
"",
"",
"",
"( volume >= 0.9 * volume0 ) & ( rnd() <= 0.00001 ) & generation < 1"
],
"enabled": true,
"halveSignals": false
},
"dynamicecm": {
"alpha": 2.0,
"beta": 0.5,
"c": 4.0,
"deltat": 0.10000000149011612,
"ecmCellID": 0,
"enabled": true,
"eta": 0.25,
"k0": 0.10000000149011612,
"k1": 0.10000000149011612,
"lambda": 10.0,
"phi": 1.0,
"pushSteps": 10,
"pushWeight": 0.5,
"stepsPerMcs": 100
},
"ecmdegradation": {
"enabled": false
},
"energyfunctions": [
"Volume00",
"Surface01",
"Motility00",
"Adhesion01",
"DynamicECM00"
],
"liquid": 6,
"logcellproperties": {
"enabled": false
},
"orientation": {
"enabled": true,
"motility": "persistentRandomWalk",
"motilityamount": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"numRandomNumbers": 5,
"persistenceMagnitude": 0.0,
"persistentDecay": 0.8,
"recalculationtime": 200
},
"polarity": {
"enabled": false
},
"signaling": {
"constant": false,
"enabled": false
},
"surface": {
"default": {
"storage": "const",
"value": 400.0
},
"lambda": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
5.625,
5.625,
1.0
],
"sizechange": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
-0.05,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
},
"temperature": 50.0,
"visitor": {
"checkerboard": "01",
"stepwidth": 10
},
"volume": {
"default": {
"storage": "const",
"value": 500.0
},
"lambda": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
7.5,
7.5,
7.5
],
"sizechange": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
-0.05,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
}
},
"DefineFunctions": [
"r_angle()=360*rnd()",
"r_size()=400*rnd()"
],
"Filling": {
"cells": [
{
"box": [
[
0,
0,
0
],
[
384,
384,
384
]
],
"celltype": 0,
"component": 0,
"pattern": "const",
"seed": 0,
"shape": "cube",
"value": 0
},
{
"box": [
[117, 117, 177],
[267, 267, 267]
],
"celltype": 9,
"center": [192, 192, 192],
"component": 0,
"count": 5500,
"pattern": "voronoi",
"radius": 75,
"seed": 758960,
"shape": "sphere",
"value": 8
}
],
"initialoutput": false,
"randomseed": 758959
},
"Geometry": {
"blockcount": [
4,
4,
3
],
"blockdefault": "fill",
"blocksize": [
96,
96,
128
],
"blocktype": [
[
[
1
]
]
]
},
"Settings": {
"deltat": 1.0,
"deltax": 1.0,
"handleFPE": "signal",
"logger": {
"group": 0,
"steps": 100
},
"randomseed": 42,
"statusoutput": 1,
"timestepguard": 1,
"timesteps": 10,
"cuda": {
"subblocks": {
"blockDim": [8, 8, 8]
}
}
}
}
+1 -1
View File
@@ -253,6 +253,6 @@
"randomseed": 42, "randomseed": 42,
"statusoutput": 1, "statusoutput": 1,
"timestepguard": 1, "timestepguard": 1,
"timesteps": 5 "timesteps": 10
} }
} }
+1 -1
View File
@@ -253,7 +253,7 @@
"randomseed": 42, "randomseed": 42,
"statusoutput": 1, "statusoutput": 1,
"timestepguard": 1, "timestepguard": 1,
"timesteps": 5, "timesteps": 10,
"cuda": { "cuda": {
"subblocks": { "subblocks": {
"blockDim": [8, 8, 8] "blockDim": [8, 8, 8]
+193
View File
@@ -0,0 +1,193 @@
{
"Application": "Cells",
"CellsInSilico": {
"2D": false,
"adhesion": {
"matrix": [
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 450.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 450.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 50.0]
],
"polarityenabled": false
},
"centerofmass": {
"steps": 1
},
"cleaner": {
"killdistance": 0,
"steps": 100
},
"contactinhibition": {
"enabled": false
},
"division": {
"condition": [
"",
"",
"",
"",
"",
"",
"",
"",
"",
"( volume >= 0.9 * volume0 ) & ( rnd() <= 0.00001 ) & generation < 1"
],
"enabled": true,
"halveSignals": false
},
"dynamicecm": {
"alpha": 2.0,
"beta": 0.5,
"c": 4.0,
"deltat": 0.1,
"ecmCellID": 0,
"enabled": true,
"eta": 0.25,
"k0": 0.1,
"k1": 0.1,
"lambda": 10.0,
"phi": 1.0,
"pushSteps": 10,
"pushWeight": 0.5,
"stepsPerMcs": 100
},
"ecmdegradation": {
"enabled": false
},
"energyfunctions": [
"Volume00",
"Surface01",
"Motility00",
"Adhesion01",
"DynamicECM00"
],
"liquid": 6,
"logcellproperties": {
"enabled": false
},
"orientation": {
"enabled": true,
"motility": "persistentRandomWalk",
"motilityamount": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"numRandomNumbers": 5,
"persistenceMagnitude": 0.0,
"persistentDecay": 0.8,
"recalculationtime": 200
},
"polarity": {
"enabled": false
},
"signaling": {
"constant": false,
"enabled": false
},
"surface": {
"default": {
"storage": "const",
"value": 400.0
},
"lambda": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
5.625,
5.625,
1.0
],
"sizechange": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
-0.05,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
},
"temperature": 50.0,
"visitor": {
"checkerboard": "01",
"stepwidth": 10
},
"volume": {
"default": {
"storage": "const",
"value": 500.0
},
"lambda": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
7.5,
7.5,
7.5
],
"sizechange": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
-0.05,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
}
},
"DefineFunctions": [
"r_angle()=360*rnd()",
"r_size()=400*rnd()"
],
"Filling": {
"initialoutput": false,
"randomseed": 758959
},
"Settings": {
"randomseed": 42,
"statusoutput": 1,
"timesteps": 10
}
}