diff --git a/.gitignore b/.gitignore index 080c11d0..b73002fa 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,5 @@ myenv/ *.DS_Store launcher/config.yaml launcher/run.sh +*.warning +*ipynb diff --git a/datafiles/test_validation/case118.m/G_valid.txt b/datafiles/test_validation/case118.m/G_valid.txt index 6264dd0b..0c33e612 100644 --- a/datafiles/test_validation/case118.m/G_valid.txt +++ b/datafiles/test_validation/case118.m/G_valid.txt @@ -1,237 +1,237 @@ 236 -2.4424906541753444e-15 -7.8548278992229825e-15 --1.6653345369377348e-16 --1.6375789613221059e-15 --3.4416913763379853e-15 --3.1918911957973251e-15 --9.7699626167013776e-15 --4.3853809472693683e-14 -1.3322676295501878e-14 -2.8699265186560297e-14 --1.1102230246251565e-15 --2.0899948438568572e-14 +-6.5503158452884236e-14 +1.992850329202156e-14 +-2.3869795029440866e-15 +1.6125989432680399e-14 +3.4416913763379853e-15 +1.9900747716405931e-14 +-3.6637359812630166e-14 +3.6126657221302594e-13 +-3.9213077229760529e-13 +3.4267033655055457e-13 +8.6486373618299694e-13 +2.133015986061082e-13 -3.0531133177191805e-15 -1.1084883011491797e-14 -5.9828691112429055e-08 -3.1765439056918865e-07 --5.1173582260588546e-08 --6.2713603199426871e-07 --1.1455012050021196e-08 -3.096439040728427e-07 --1.5543122344752192e-15 --5.7454041524351851e-15 -4.1078251911130792e-15 -1.4432899320127035e-15 -1.27675647831893e-15 -1.6375789613221059e-15 -5.5511151231257827e-16 -3.767819389821625e-15 -6.6613381477509392e-16 -8.7152507433074788e-15 --1.1102230246251565e-15 -3.6082248300317588e-16 -6.4392935428259079e-15 -1.9290125052862095e-14 --4.9960036108132044e-16 --7.7715611723760958e-16 --1.6375789613221059e-15 -2.2759572004815709e-15 -1.609823385706477e-15 --1.1379786002407855e-15 -2.1094237467877974e-15 -3.4833247397614286e-15 --3.3306690738754696e-16 --7.0776717819853729e-16 -3.8333206386909069e-08 -1.2253454581556689e-07 --3.8339040275836567e-11 -1.3045120539345589e-15 --5.5277088240046623e-08 --4.6095156797099079e-07 --7.9029900401650366e-09 -2.7927213164247178e-07 -2.3173858276770432e-08 -5.8120155965735165e-08 -9.7144514654701197e-16 -5.0515147620444623e-15 --2.4424906541753444e-15 --8.021361352916756e-15 --6.6613381477509392e-16 --3.5527136788005009e-15 --1.7208456881689926e-15 --2.4980018054066022e-15 -3.1086244689504383e-15 -8.1878948066105295e-15 -3.0696085950854268e-09 -9.8633369527423298e-09 -4.2675200151442994e-08 -1.5246768239607356e-07 -6.9159228899273728e-09 -2.944569046925416e-08 -4.163336342344337e-15 -4.7989390239422391e-14 --5.8219135956605328e-08 --2.5625674549001332e-07 --2.6328057511904035e-09 -4.2206670158861925e-08 -4.3698453744411836e-09 -1.3036587490078411e-08 -3.1083929319386527e-09 -7.9625719073828094e-09 --1.1102230246251565e-16 -3.0253577421035516e-15 -1.7763568394002505e-15 --2.7755575615628914e-16 --1.6653345369377348e-16 -6.106226635438361e-16 -1.0824674490095276e-15 +2.0648413534551935e-13 +-9.0594198809412774e-14 +1.4560574967958928e-12 +1.4654943925052066e-13 +-1.4210854715202004e-14 +-8.8817841970012523e-14 +3.9979131116751887e-13 +-9.1038288019262836e-15 +3.1363800445660672e-15 +-6.0951244051921094e-14 +2.2570834090629432e-13 +-5.5344617777564054e-14 +6.1589622291080559e-14 +-7.6938455606523348e-14 +8.6368412421933272e-14 +5.4984905517585503e-12 +-2.4480972804497014e-12 +4.418687638008123e-14 +6.1645133442311817e-14 +3.9235281690253032e-13 +-2.9559688030644793e-14 +5.1356696673110491e-12 +3.8641867483590886e-12 +1.9720891586416656e-12 +5.6540994108900122e-11 +4.2460479576789112e-13 +-2.9559688030644793e-14 +1.8995915951336428e-13 +1.0588752097362431e-14 +2.206013149930186e-13 +-6.0368376963992887e-15 +2.4136248555350903e-13 +-1.0907941216942163e-14 1.429412144204889e-15 -4.4408920985006262e-16 -5.7315263646273706e-15 -1.1102230246251565e-16 -3.3029134982598407e-15 -1.4039219564665473e-08 -3.2171496577859671e-08 -5.5511151231257827e-17 -1.0408340855860843e-15 -7.4738799926699073e-08 -2.4616311994352102e-07 -5.5511151231257827e-16 -3.5180192092809648e-15 -2.7755575615628914e-15 --4.5102810375396984e-15 -7.2164496600635175e-16 -1.9567680809018384e-15 -2.7755575615628914e-17 -1.457167719820518e-15 -7.9158901655773661e-14 --1.4432899320127035e-15 -4.6185277824406512e-14 -1.0824674490095276e-15 -1.1102230246251565e-14 -5.0975890175664063e-13 -1.2212453270876722e-15 --2.0261570199409107e-15 -4.7739590058881731e-15 -6.3837823915946501e-16 -6.6613381477509392e-15 +2.5156265959225266e-13 +2.042810365310288e-14 +-1.7763568394002505e-15 -4.8849813083506888e-15 --2.2204460492503131e-16 -1.1296519275560968e-14 --1.1657341758564144e-15 -5.6621374255882984e-15 -9.0366552019105484e-09 -4.5447928670450111e-08 --4.4408920985006262e-16 +9.2814644858663087e-14 +-9.9920072216264089e-15 +1.0597078770047119e-13 +1.3405943022348765e-14 +-2.0539125955565396e-15 +2.5979218776228663e-14 +-6.2450045135165055e-15 +2.6600943670018751e-13 +2.3625545964023331e-13 +-1.8152146452621309e-14 +2.1338486533295509e-13 +1.9872992140790302e-14 +1.2234657731369225e-13 +1.0261236305098009e-13 +8.8068441428390543e-14 +4.3221537460169657e-11 +5.1473464379725442e-11 +1.5358325722303334e-11 +-1.2113365865928927e-12 +3.6712299866792364e-12 +2.1813234551970595e-10 +2.2084778450448539e-11 +-1.7597034940308731e-12 +-4.1744385725905886e-14 +4.4764192352886312e-13 +2.354560990625032e-12 +-3.2272795547072519e-13 +-7.6338935173225764e-13 +2.2842533420330824e-11 +1.2464473897466632e-12 +-1.0888512314011223e-13 +8.6886053907164751e-13 +9.943157408542902e-13 +3.3534286458802853e-13 +3.4361402612148595e-14 +2.5265900482907e-13 +3.3875680038875089e-14 +1.5165646516379638e-13 +9.0205620750793969e-15 +-4.2132963784524691e-14 +4.7450932072479191e-13 +1.3322676295501878e-15 +1.7763568394002505e-15 +5.1625370645069779e-15 +4.7045700668491008e-15 +2.2777335573209712e-12 +-1.3662404541037176e-12 +2.8187452372208099e-12 +-3.3843067237526725e-13 +2.5345281429167699e-12 +-3.5534075681908917e-13 +7.7210460247556512e-13 +-1.8367252163642434e-13 +4.3523518122867699e-13 +-6.5156213757688874e-14 +1.4069889697765348e-10 +2.4766633188733067e-11 +9.20234999313152e-11 +3.4102165535898621e-12 +2.2624457862718828e-11 +9.0389434825866033e-10 +3.2395197635537443e-12 +-3.9016012642889564e-13 +3.6511904610847523e-12 +-5.5713766933251918e-13 +1.0738299138779439e-11 +-1.2378986724570495e-12 +1.7985612998927536e-14 +3.3029134982598407e-15 +1.3988810110276972e-14 +-3.1252778143198157e-14 +-1.5765166949677223e-14 +2.2737367544323206e-13 +9.9920072216264089e-15 +7.1054273576010019e-15 +-3.9968028886505635e-15 +-1.4210854715202004e-14 +6.3060667798708891e-14 +3.4061642395499803e-13 +1.9872992140790302e-14 -3.5527136788005009e-15 -3.3306690738754696e-15 -1.4210854715202004e-14 -1.3535342846537901e-09 -2.975817872119535e-07 --1.0641273817668662e-07 --6.5472079735506838e-07 -2.6523071960937727e-08 -9.8561244221695432e-08 -9.9670196540557754e-09 -2.8585239775225091e-07 --1.3314838231970327e-07 --5.7684568810500991e-07 -2.6049245149817324e-08 -7.3168364367326433e-08 -2.4424906541753444e-15 +1.1102230246251565e-15 +5.0515147620444623e-15 +1.2456702336294256e-13 +-2.4868995751603507e-14 +1.6875389974302379e-14 +8.4376949871511897e-15 +1.9761969838327786e-14 +1.9378942894832107e-13 +3.5527136788005009e-14 -6.2172489379008766e-15 -4.3021142204224816e-16 -1.9914625504213745e-15 --1.8735013540549517e-16 --4.891920202254596e-15 --8.8817841970012523e-16 --1.0602629885170245e-14 -3.2329554366938851e-08 -7.0652755312927695e-08 --1.8873791418627661e-15 --6.2727600891321345e-15 -1.125471977836412e-07 -3.1083419271826784e-07 --1.1546319456101628e-14 --1.9317880628477724e-14 -2.8670041340994601e-08 -1.0987524567962481e-07 --1.7138208097122742e-07 --8.0154368337082005e-07 -5.6796399527936359e-10 -2.2921460285374451e-07 +1.9331758416285538e-14 +1.0533240946131173e-14 +4.6976311729451936e-15 +2.9171109972025988e-14 +-4.4408920985006262e-15 +-7.382983113757291e-15 +6.8833827526759706e-15 +1.4432899320127035e-15 +4.1078251911130792e-15 +1.1934897514720433e-15 +1.532107773982716e-14 +2.0616841567289157e-13 2.6645352591003757e-15 -1.1435297153639112e-14 --1.4988010832439613e-15 --5.134781488891349e-15 --7.7715611723760958e-16 -1.4988010832439613e-15 -6.8485304094423327e-09 -5.8712512879255385e-08 -5.8286708792820718e-16 -1.2490009027033011e-15 --6.9388939039072284e-17 +9.1038288019262836e-15 +1.6653345369377348e-15 +-1.1712852909795402e-14 +6.6724403779971908e-14 +9.4535490546832079e-14 +-5.9299787302791174e-14 +7.1054273576010019e-15 +2.6645352591003757e-14 +4.4686476741162551e-15 +4.4020342926387457e-14 +-6.2866378769399489e-15 +1.6542323066914832e-14 +-4.7184478546569153e-15 +3.5837999234900053e-13 +-5.0709436649754025e-14 +4.6876391657235672e-13 +5.0986992405910314e-14 +-2.8809593599632422e-13 +3.5785957530620749e-12 +2.1760371282653068e-14 3.6082248300317588e-16 -3.5550524968286368e-08 -1.4038331955235073e-07 --1.7782608963123891e-07 --6.1924752886577394e-07 -4.601924352698461e-08 -1.464605403067587e-07 --6.2589338989393895e-09 -3.6377151291233645e-15 -6.5693034789759963e-08 -2.5901755673629623e-07 -3.3306690738754696e-16 --2.7755575615628914e-16 --1.609823385706477e-15 -4.3298697960381105e-15 -2.7200464103316335e-15 --2.2759572004815709e-15 -1.0111191550699061e-08 -4.2622062851327414e-08 -1.8713332744502154e-08 -8.3925519117622471e-08 -1.8042963512154842e-08 -7.2410083193363839e-08 -4.9979361205210182e-09 -3.7955695496305619e-08 -1.1779466291272911e-13 -9.1593399531575415e-15 -2.4980018054066022e-16 --2.1371793224034263e-15 --1.1657341758564144e-15 +4.7739590058881731e-14 +-9.1593399531575415e-16 +3.1086244689504383e-15 +6.7168492989821971e-15 +7.4940054162198066e-16 +8.0317696937726168e-16 +3.5416114485542494e-14 +1.0658141036401503e-14 +-1.1102230246251565e-16 +-3.8302694349567901e-15 +3.5471625636773751e-14 +3.1863400806741993e-14 +3.6082248300317588e-15 +8.3821838359199319e-15 +3.0753177782116836e-14 +2.3619994848900205e-14 +1.8735013540549517e-14 +1.3877787807814457e-16 +5.1458837191376006e-14 +3.1905034170165436e-14 +5.2513549064769904e-14 +3.8212488728817107e-14 +7.0678130015267016e-11 +-4.9527049128528233e-12 +1.2240208846492351e-14 +6.744604874597826e-15 +6.6058269965196814e-15 +2.4147350785597155e-15 +8.7599927311998727e-11 +-2.3894108913680157e-11 +2.1494250823650418e-11 +2.2908781815988988e-09 +3.8540337587988915e-10 +-1.1009332334666055e-10 +1.8318679906315083e-15 +3.5388358909926865e-14 +-3.0492275371329924e-13 +1.1102230246251565e-13 +1.3752887717544127e-14 +9.0951551845463996e-15 +2.3911428392864309e-14 +4.1910919179599659e-15 +-1.103006574965093e-13 +6.8267613784200876e-13 +-2.7366997557010109e-14 +-1.8091734707570417e-13 +7.3274719625260332e-14 +-2.1077584122508597e-13 +-1.3539169785303784e-13 +1.3937184739631903e-12 +4.3715031594615539e-15 -1.1379786002407855e-15 -1.4210854715202004e-13 --2.2704060853584451e-14 -5.0459636469213365e-14 -3.6820824167449473e-12 -6.1728400169158704e-13 --1.2023715356690445e-13 -7.2164496600635175e-16 --2.8033131371785203e-15 --2.2204460492503131e-16 -1.1102230246251565e-16 --4.8988590961585032e-15 --8.6684132094561051e-15 +1.890154699424329e-14 +-2.7755575615628914e-16 +-2.8421709430404007e-14 +7.9644624229047167e-13 +2.0539125955565396e-15 -9.5756735873919752e-16 -6.3837823915946501e-16 --3.6637359812630166e-15 --1.0103029524088925e-14 -1.8873791418627661e-15 -4.0093796338513954e-15 -2.1649348980190553e-15 -1.3045120539345589e-15 --2.5118795932144167e-15 -8.174017018802715e-15 -1.7069679003611782e-15 --8.2434059578417873e-15 -2.4702462297909733e-15 -1.2156942119645464e-14 --6.5075942412562426e-09 --7.5786599218474748e-14 -5.5511151231257827e-17 -8.1878948066105295e-16 -3.4972025275692431e-15 -1.4155343563970746e-15 +5.2735593669694936e-15 +8.5209617139980764e-15 diff --git a/datafiles/test_validation/case118.m/Hess_valid.bin b/datafiles/test_validation/case118.m/Hess_valid.bin index b902f68a..3de70591 100644 Binary files a/datafiles/test_validation/case118.m/Hess_valid.bin and b/datafiles/test_validation/case118.m/Hess_valid.bin differ diff --git a/datafiles/test_validation/case118.m/Jeq_valid.bin b/datafiles/test_validation/case118.m/Jeq_valid.bin index 93b98980..fd4f7a10 100644 Binary files a/datafiles/test_validation/case118.m/Jeq_valid.bin and b/datafiles/test_validation/case118.m/Jeq_valid.bin differ diff --git a/datafiles/test_validation/case118.m/Lambda_valid.txt b/datafiles/test_validation/case118.m/Lambda_valid.txt index 54fde11d..57fe02a7 100644 --- a/datafiles/test_validation/case118.m/Lambda_valid.txt +++ b/datafiles/test_validation/case118.m/Lambda_valid.txt @@ -1,237 +1,237 @@ 236 -4052.9781708333267 -28.143883065761599 -4049.0371949806304 -16.812326405496126 -4030.2535307602502 -22.710834557040421 -3933.2757687677372 -1.1823174748104821e-07 -3922.1086276737924 -6.6079183430585022 -3997.2201946836126 -2.6820604217937249e-06 -4008.9958150917641 -0.31775465569133943 -3923.0331858750615 --1.3165043893810264e-07 -3855.3265421209112 --13.679932857232192 -3786.1090144713053 --1.2485367781584201e-06 -4012.9371919230834 -10.429487368174621 -4018.678448857504 -2.8573750522366113e-07 -4063.9743619861083 -24.183402575944225 -4041.0114073391705 --3.0400475677201211 -4041.7677603202706 -9.3181102035136438e-06 -4028.6453520122741 -5.8369321266968557 -3967.116213747076 --4.4555773090482216 -4026.4522956452406 -2.0792442227533833e-06 -4043.1665388307406 -0.69652885809859455 -4054.0853754621708 -12.283117555767992 -4036.5821011978619 -20.166755413775647 -3993.7688358843193 -18.361346779260984 -3900.11415210322 -2.8215548183116868 -3929.5646503296734 --1.1397229742723228e-08 -3761.9439547781794 --13.222632609608754 -3781.9248937246361 --3.8728778460859444e-09 -4019.844966048649 -4.0103631525916647e-08 -4060.3521012450519 -6.124544155751078 -4080.8357428360587 -3.5417392472902272 -3945.8453232922411 --1.7360402144698912 -4070.9344324561812 -4.2741473047454168e-08 -4029.7251621203586 -1.5203281935727666e-06 -4051.3874838948345 -6.7025297288630732 -4009.77561076244 --0.42844028242442833 -4020.633753752702 -0.63203298060629853 -4021.3254107387684 -1.4269428837252772e-05 -3991.1994332851036 --3.0934243254396079 -3966.5451686813053 -1.5997510992090964 -4082.7505211351872 -7.5298568105327943 -4098.6436528133854 -4.525871714415221e-08 -4124.7691383031442 -6.5534629545872027 -4081.9899258453825 -3.4643307391553232e-08 -4084.1727917088674 -1.7204493746040743 -4112.3657911187929 --2.4028262352724163 -4094.7845683772498 -8.204562744284928 -4004.1018200130347 --5.8252238997009184e-08 -3935.506855570492 --1.5637264564461726 -3939.8913116304661 --7.899280612959136 -3895.4148255577866 --3.0161382604524307e-07 -3969.2655648411569 -5.2544996430503144 -4065.9001777854173 -21.456984385246983 -4101.4654062526779 -23.899283217624365 -4109.1883743473136 -19.457089825989588 -4064.26297065683 -5.4990151978521918e-08 -4064.2684448533591 -2.0686763044234675e-05 -4065.1203422798199 -0.26314695937619786 -4042.8652630591564 -3.629389084169818 -4079.3859401329696 -13.371327428394141 -3931.6749358395887 -3.8128577368055361e-07 -3874.4371641174421 -0.32877033514645104 -3855.1852650866367 --2.6993025481466592e-07 -3874.523296475179 -3.1092270337040083e-07 -3896.2256746823059 -0.3963768737593617 -3859.501295577028 --2.4619667173747501 -3801.7199343075022 --0.58451254742662084 -3779.8895377480676 --21.50505302269849 -3846.3667621865279 --6.4710462969951967 -3794.4727339373494 -0.33917149805372709 -3757.0335326414756 --2.0075626440164008e-07 -3972.6641043457103 -2.0667542027361414e-05 -3976.1970933229031 --1.0215172701598003 -3974.307174695492 --7.3187520844362821e-08 -3980.0270552428983 --3.1166585804837432e-08 -4033.8625148332749 -22.911043021902927 -4003.5520295420429 -25.995838936897254 -4045.7060611145284 -44.464040505376602 -3894.2822977336582 -1.4548429648916106 -3904.6745545055537 -9.0755958496188622 -3890.239781288124 -10.218831509439214 -3806.4615696966166 --2.0860694592611096e-07 -3798.3448421127077 -1.5536019085150565 -3912.6084641449011 -11.674348458769101 -3890.0142570421481 -9.4361804382346417 -3829.6642546838957 -18.197940022081699 -3777.3715188587316 -10.367889970763914 -3820.2509601851666 -11.738684271125839 -3813.1048437277282 --6.0723896186576282e-07 -3730.679602150642 -11.670665673257487 -3653.5226975533328 --1.6071668476693689e-07 -3828.6300150649759 -7.5488277680394296e-08 -3812.4456651523101 -2.184481575575655e-08 -3760.8709940698627 -10.912424960718615 -3826.7949266982305 -24.483136011150478 -3865.4101186234848 -26.105722842504758 -3899.6707081933878 -42.090533472009497 -3889.9357899629449 -23.725510154560528 -3858.2559261817105 -17.032318351856979 -3852.4890705227313 -4.7814951267953667 -3864.8722940549674 --4.4584678997132653e-08 -3835.6706501776575 --9.0442337419730529e-08 -3830.3466619766464 -19.070088435592179 -3786.7371200676239 -14.544176213793186 -3912.3115249795196 --1.4823223434547134e-07 -3988.6169210714293 -0.43172087940023124 -4010.3261697689736 -1.0123443028188306e-06 -4021.5524879543591 -9.3557453668404253 -4058.0550406979573 -1.1430744811647788e-08 -4020.9075339143915 -0.82160944598409591 -4023.5735806935636 -1.455155761107793 -4014.0681939299157 -1.8569377633153272e-05 -3957.8799685097074 --6.3325103765305921e-07 -4072.9644595233813 --5.6535351525267232e-07 -3978.4734535666389 --4.4788677558421686e-07 -4041.6594364438492 -4.33038632895465 -4042.3140654807221 -4.7159845376393665 -3799.0927604274993 -9.0038647239925962e-10 -4068.4332788732781 -16.517680719325245 -4043.7163848163505 -43.502549091649747 +4052.9780135367537 +28.14388753082331 +4049.0369669322422 +16.812322630300734 +4030.2533288306822 +22.710816220422952 +3933.2755230740886 +1.5318599682461511e-06 +3922.1083731975696 +6.6078752091429713 +3997.2197893957882 +3.4749061074089642e-05 +4008.9954534495268 +0.31776732344539593 +3923.0329531351103 +-1.7057119525455135e-06 +3855.3263179658002 +-13.679883678786007 +3786.108797566761 +-1.6176505029082751e-05 +4012.9369351844821 +10.429481695605167 +4018.6781735506961 +3.7021080569730936e-06 +4063.9741499622669 +24.183420927503231 +4041.0111696223894 +-3.0400473160681556 +4041.7676420874359 +0.00012074067826136515 +4028.6451173329165 +5.8369143111735919 +3967.116059840494 +-4.4555580972760476 +4026.4521821606281 +2.6941634934618132e-05 +4043.1664392360922 +0.69699601113371523 +4054.0852804703004 +12.283442755893718 +4036.5819897386937 +20.166991565841538 +3993.7686998967579 +18.361487281873416 +3900.1139999532834 +2.8215698833220522 +3929.5644684811105 +-1.4766633494615744e-07 +3761.9438338862847 +-13.222576388802766 +3781.9247647731277 +-5.0178053669738563e-08 +4019.8448672551026 +5.1959894381686211e-07 +4060.3520024852501 +6.1245287984859855 +4080.8356420707291 +3.541728420054302 +3945.845155457399 +-1.7360567453726123 +4070.934327510498 +5.5377610463985401e-07 +4029.7250589741184 +1.9697827132044224e-05 +4051.3873418307526 +6.7023835242961969 +4009.7754470263699 +-0.42897080295400591 +4020.6335978087332 +0.63210365865729246 +4021.3252569719398 +0.00018594950597414017 +3991.1992745417556 +-3.0937869535341687 +3966.5450300716684 +1.5995608931711605 +4082.7504186624619 +7.5297123346462325 +4098.6435907634495 +5.8638653318391232e-07 +4124.769095627913 +6.5534591975435017 +4081.9898922642346 +4.4885248364632998e-07 +4084.1726325870604 +1.720014219949439 +4112.3656885504379 +-2.4030272988069861 +4094.7844882472959 +8.204466560668271 +4004.1017402090843 +-7.5474949936436746e-07 +3935.5067776722399 +-1.5637449285413476 +3939.8912335130608 +-7.899302015655465 +3895.4147538619791 +-3.9078330485643252e-06 +3969.2654969635337 +5.2546197445619249 +4065.900156539652 +21.457183206410324 +4101.465400926093 +23.899436022723105 +4109.18836957653 +19.457149042977374 +4064.262951376098 +7.1254523370100386e-07 +4064.2684278682013 +0.00026949912219590051 +4065.1203257735669 +0.26373131088387991 +4042.8652257797339 +3.6297703278876483 +4079.3859288259277 +13.37168976865993 +3931.6748598301051 +4.9401131184844155e-06 +3874.43707977535 +0.32876433208207051 +3855.1851782706585 +-3.497349926632914e-06 +3874.5232140287508 +4.0282407048826059e-06 +3896.2255936457918 +0.39639125919154022 +3859.5012118572104 +-2.4619656426728498 +3801.7198633155563 +-0.58458082185339566 +3779.8894787014428 +-21.505015878225425 +3846.3666865477799 +-6.4710535198439505 +3794.4726583263287 +0.33916064585985184 +3757.0334556285061 +-2.6010683051126212e-06 +3972.6639479898381 +0.00026774985364286957 +3976.1968960247391 +-1.0214096696038557 +3974.3069243410432 +-9.4824514830321944e-07 +3980.0268293857794 +-4.0378023506467058e-07 +4033.8624506082865 +22.911291955596557 +4003.5519579085872 +25.996047122296911 +4045.7060300010571 +44.464280710374787 +3894.2822172303277 +1.4550347379658601 +3904.6744789624313 +9.0757540812283946 +3890.2397039416187 +10.218942622783061 +3806.4614910952751 +-2.7027589284056723e-06 +3798.3447644057419 +1.5535989270194746 +3912.6083566543871 +11.67438205449292 +3890.0141355904852 +9.4361869496584951 +3829.6641003835102 +18.197918518447995 +3777.3713513220328 +10.36787274250403 +3820.2507107801648 +11.738820269016957 +3813.1045080738977 +-7.8676602393014391e-06 +3730.6794579576508 +11.670630153347496 +3653.5225823691876 +-2.0822886849131659e-06 +3828.6298825133167 +9.7805685532277724e-07 +3812.4455122459653 +2.83024418563602e-07 +3760.8708353145953 +10.912394984379361 +3826.7947605786244 +24.483098528181461 +3865.4099525819415 +26.105700517773627 +3899.6705694430825 +42.090511671099733 +3889.9356709268277 +23.725481588263289 +3858.2558224615923 +17.032283804908317 +3852.4889220447158 +4.7814313693033048 +3864.8720921870618 +-5.776729287307108e-07 +3835.6704077047775 +-1.1717936566619643e-06 +3830.3464519538088 +19.07004057597101 +3786.7369388695538 +14.544119915372098 +3912.3112990845971 +-1.9193757284992271e-06 +3988.6167655949098 +0.43323617127932462 +4010.3260469734523 +1.3156046369416962e-05 +4021.5523793065367 +9.3557588083835217 +4058.0549900026035 +1.4810173586725449e-07 +4020.9074146028975 +0.82168916465369946 +4023.573464830688 +1.4552701399581971 +4014.0680769671035 +0.00024056603388397503 +3957.8797788274392 +-8.2046542864710138e-06 +4072.9644269490814 +-7.3249470495050187e-06 +3978.4732722231283 +-5.8030118934518438e-06 +4041.6593357926349 +4.3303814001942849 +4042.3139654408355 +4.7159782259688265 +3799.0926845657141 +1.1664974994931771e-08 +4068.4330131474449 +16.517658864516665 +4043.7163411651832 +43.502775494729136 diff --git a/datafiles/test_validation/case118.m/X_valid.txt b/datafiles/test_validation/case118.m/X_valid.txt index a8fe7f58..d07a401b 100644 --- a/datafiles/test_validation/case118.m/X_valid.txt +++ b/datafiles/test_validation/case118.m/X_valid.txt @@ -1,345 +1,345 @@ 344 -0.29835425287410255 -1.0331697033016569 -0.26489086263838546 -0.14999998506907955 -0.3000514816042073 -1.0387967945707413 -0.30611500796805713 -1.0380037651724436 -0.35138837493530251 -1.0599999978438677 -5.1571483535978252e-10 -0.71517739665337055 -0.35911307532081782 -1.0574525055459874 -0.31914492646123305 -1.0526943509844715 -2.424063783197273e-07 -0.33285903416511503 -0.31394852756652353 -1.0510172953106192 -0.43113652036308475 -1.0409882257186989 -0 --0.78632437911854747 -0.54015616230668584 -1.0600000000000001 -0.65708686805309091 -1.0529795615027151 -4.0187452859062232 --0.99676503929616689 -0.31681494195659743 -1.0460055501259766 -0.31121371540058312 -1.0499550340762787 -0.85793833952452359 -0.54439509565320399 -0.29727090861885069 -1.0344770184035015 -0.30142763541029988 -1.0488068316776593 -0.30071311018018632 -1.0485625928934612 -0.20883881396594398 -0.23840567341669983 -0.30616911704353783 -1.0461369563363305 -0.33340453959720801 -1.0599999943002061 -0.30590511710597434 -1.0503238421750103 -0.13226150070842196 -0.30453617746616951 -0.2994474747119496 -1.0477868474329799 -0.21583270593439088 -0.23999900264533242 -0.30490403917410569 -1.0361853570117543 -0.32318827400403943 -1.0313270495958318 -0.35575651644455702 -1.0345717224562545 -0.42246810998926604 -1.0487436017846368 -0.41338686245074313 -1.0462081752270054 -0 --0.073051955806020946 -0.53307572822774574 -1.0600000000000001 -1.9381383481044354 --0.46999995693545543 -0.56136670747432438 -1.0267818673979581 -2.7976220790279505 --0.27577253991374295 -0.34634239728528199 -1.0413721147572215 -0.099224861705238546 -0.25533848386361674 -0.32207294436275258 -1.0348811867084466 -0.30911918911234193 -1.0354315009177124 -0.40106030658752967 -1.0311990205323283 -0.31165149024846239 -1.0385626047618532 -0.072482705377674442 -0.27186810836959668 -0.33903901044454077 -1.0410403352020723 -0.14862583008576669 -0.21829629257098865 -0.29175319398360888 -1.0461533194864272 -0.30211003393058544 -1.0559212136974845 -0.048878121899405221 --0.079998372005584156 -0.29625852625153437 -1.0539852219168742 -0.29646699822675526 -1.0542609456202092 -0.10662708266904343 -0.19821342466733688 -0.30913104885228304 -1.0600000000000001 -0.37142920820558761 -1.0150293554310879 -0.27975413518448677 -1.0424525338969253 -0.27627277872717643 -1.0424887083849785 -0.49321826425730003 -0.28759590024346654 -0.2687480206545893 -1.0354647709506435 -0.29142362062027122 -1.0406221179101391 -0.4099496318390054 -0.22097683268265542 -0.2895786318303406 -1.0399686234002909 -0.31126617747362201 -1.0309005433115765 -0.33448045031733842 -1.0252648981437733 -0.37501495086474335 -1.0377211010707492 -0.1903896733560145 --0.041439435254253393 -0.40707672479568879 -1.0450156194816873 -0.39965156688610404 -1.0473020752878484 -0.41675561686152945 -1.0495620387036246 -1.9333231234937538 -0.1967997092964312 -0.38525577879406847 -1.0392119143053034 -0.34578253676344495 -1.0222158055519004 -0.33123480978441566 -1.0166493410863782 -0.31810010247414877 -1.0162984149774303 -0.3334462964602945 -1.0312457822083672 -0.49542311391918642 -0.34793157611129316 -0.33237710215093957 -1.0311699461992618 -0.32134223001491213 -0.19974972596445989 -0.33336050965208081 -1.0308952303301153 -0.32560171697174234 -0.14999733859757025 -0.34887950829557213 -1.0317509174322703 -0.33585888598732627 -1.0238559223338883 -0.37881541156014531 -1.046781894451992 -1.4970480758710056 -0.95668772298557681 -0.42944924481195307 -1.045740692771379 -0.44271681730939194 -1.0481190796342295 -1.4841482119444771 -0.31962880904426838 -0.43385116348379688 -1.0438410825366571 -0 -0.0088452435615244563 -0.42516680848907051 -1.0156705377671027 -0.45039086982873927 -1.0227094807270507 -0.49932709158338523 -1.015561892119712 -3.5223624668861233 --0.66999880959345903 -0.50387550531359515 -1.0600000000000001 -3.4885834909078888 --0.66999997737264561 -0.45820844515664877 -1.0465561486792343 -0.4887452013216681 -1.014644420731551 +0.29835432085008595 +1.0331694724037841 +0.26489017744779098 +0.14999968698512062 +0.30005157706609481 +1.0387965694826591 +0.30611509129432474 +1.0380035546855699 +0.35138848829703784 +1.0599998453020569 +1.2624542792473826e-07 +0.71517743723357274 +0.35911318956007887 +1.0574523572716725 +0.319145122838349 +1.0526941282164581 +3.2626258315138611e-06 +0.33285677229779254 +0.31394869283378057 +1.0510170742182623 +0.43113661711906953 +1.040988165123012 +1.0811425956570941e-07 +-0.78632195760697898 +0.54015624975175647 +1.0599999964219746 +0.65708693529672502 +1.0529795953375878 +4.0187447898248152 +-0.99676359346042365 +0.31681505137571692 +1.0460053508812566 +0.31121383167045436 +1.049954815056463 +0.85793822308098344 +0.54439428731526562 +0.29727099408532653 +1.0344767952997633 +0.30142772660367667 +1.0488065936716897 +0.30071314264071919 +1.0485623069799814 +0.20883837063844374 +0.23840716332010858 +0.30616920232262596 +1.0461367430324524 +0.33340457301907894 +1.0599997992758916 +0.30590513162358918 +1.0503236275621879 +0.13226120209292358 +0.30454110810165025 +0.29944754019270653 +1.0477863873388336 +0.21583234881628893 +0.2399868198629318 +0.30490409020119663 +1.036184982592995 +0.32318832289778876 +1.0313267400436859 +0.35575656584684928 +1.0345714905951784 +0.42246815363865786 +1.0487435000602974 +0.41338691911263681 +1.0462080841804238 +1.1906703050501758e-07 +-0.073051495800033658 +0.53307575317744993 +1.0600000025453371 +1.9381382125715674 +-0.46999932247081144 +0.56136673255807545 +1.0267819124266198 +2.7976218714702661 +-0.27576942201018767 +0.34634240918829617 +1.0413719674992252 +0.099224743910764274 +0.25533826825435019 +0.32207295357361221 +1.0348810250898377 +0.30911919936441984 +1.0354313253384617 +0.40106035637548981 +1.0311989263562438 +0.31165150351810234 +1.0385624250060805 +0.072482705461172289 +0.27186798276052859 +0.3390390271223549 +1.0410401671850225 +0.14862554731362287 +0.21829568664944413 +0.29175319056223509 +1.0461531136483764 +0.30210997969024916 +1.0559211602129215 +0.04887811729850159 +-0.079977267157200577 +0.29625854304839272 +1.0539848862679961 +0.29646702654435209 +1.0542605639008615 +0.10662666027638147 +0.19819590440671933 +0.30913101550342359 +1.0599998921764593 +0.37142921021160502 +1.01502928537007 +0.27975410163239739 +1.0424523249585034 +0.27627274856169137 +1.0424884450162599 +0.49321795628390086 +0.28759381604580547 +0.26874798259096738 +1.0354645137961551 +0.29142358117548184 +1.0406218856595959 +0.40994949516456464 +0.2209765078342372 +0.28957858212806092 +1.039968543627515 +0.31126614061597618 +1.0309004284073384 +0.33448042143969497 +1.0252647732295876 +0.37501493817120951 +1.0377209597119397 +0.19038966916339189 +-0.041439936866558648 +0.40707671194552825 +1.0450155138370567 +0.39965155153927018 +1.0473019584639773 +0.41675560193572819 +1.0495619304453208 +1.9333230470579144 +0.19679986580822231 +0.3852557766549411 +1.0392117399846421 +0.34578252967216117 +1.0222155932473456 +0.33123479203158501 +1.0166491428850226 +0.31810007035966731 +1.0162982610987183 +0.33344626194362154 +1.0312456650751782 +0.49542311131089395 +0.34796148735270765 +0.33237709732642784 +1.0311697009360212 +0.32134221381603323 +0.19975611089760445 +0.33336054644910224 +1.0308948567495089 +0.32560170106936592 +0.1499570772229728 +0.34887952787657694 +1.0317506263242915 +0.33585889581264583 +1.0238556402976788 +0.37881539361509803 +1.0467817640895274 +1.4970480151319421 +0.95668861734533572 +0.42944923528386236 +1.0457405772607358 +0.44271681055633472 +1.0481189634103594 +1.4841481409991519 +0.31962559261915507 +0.43385115402634794 +1.0438409772541959 +6.2450911583474268e-08 +0.0088448004581737141 +0.42516680145754882 +1.0156704658750721 +0.45039086410278856 +1.0227094394114227 +0.4993270733776683 +1.0155619818611175 +3.5223623209337549 +-0.66998445764050052 +0.50387548192491038 +1.0600000046036602 +3.4885833684026828 +-0.66999958726565245 +0.45820842856477773 +1.0465560966651837 +0.48874519612986123 +1.0146444240939116 0.52359877559829882 -1.0600000000000001 -4.5366605723631466 --1.1109652770152652 -0.41354120340057071 -1.0392651958119046 -1.5667821795297655e-08 -0.28877700969441394 -0.40971778802833569 -1.039458588177915 -0.40113081166055115 -1.0397961704788763 -1.7309292562908183e-08 --0.052012553237442243 -0.40732094311996797 -1.03826211839864 -2.5130162528866573e-08 --0.02219845747722226 -0.39981338172749081 -1.0219247791182777 -0.1693125906636869 -0.08999997937490567 -0.41497668973981916 -1.0241578424879751 -0.39974577507452896 -1.0118090296707247 -0.22853031637655555 -0.22999999421976608 -0.45589905517664076 -1.047058986448 -0 -0.69999952771246943 -0.4511129076904733 -1.042379848980614 -0.45590404882538121 -1.0436901751956706 -0.49307823392070654 -1.0600000000000001 -4.3084108402986834 --0.094332084755208087 -0.49060036612800606 -1.0107505674494499 -0.44459705037480945 -1.0377017639630275 -0.45236360549546861 -1.0400159487306027 -0.47424506713452025 -1.0427402649146671 -0.48983631482360385 -1.0505035926809094 -0 -0.22999994232443194 -0.47038420739734521 -1.0443220901443755 -0.47565261231358752 -1.0571042248517577 -0.036262097247563421 -0.035415368010693088 -0.5265177536313288 -1.0481492130713954 -0.58174276094342636 -1.0600000000000001 -5.0184413803382082 --0.24016116167420515 -0.48726367047532204 -1.0417816917295524 -0 -0.47214682394585805 -0.49246574295231932 -1.0456496026064612 -0 -0.015562910291431557 -0.5134952033649679 -1.0500035723854402 -0 -0.089999945701494083 -0.48424577603263885 -1.040008993257969 -0.46585019488540658 -1.0378903237971575 -0.45284380200688029 -1.0267611579007991 -0.45332036771476747 -1.0354646250021247 -0.46717205635864117 -1.0431441808034363 -0.46577739547397284 -1.0519319560744156 -0.45718776873667988 -1.0540449951208133 -0 --0.031739169228046669 -0.47378229643318731 -1.0584504938988741 -2.3129450178559554 -0.45758071551438961 -0.47693602085257508 -1.0427932497464698 -0.49972328503755664 -1.0468424200329551 -0.43818908190220635 -1.0514003713689282 -0.38246230522490549 -0.11701840544162181 -0.4007063712798366 -1.0426391686232916 -5.1639941294557807e-08 -0.22999836765432699 -0.39147931363106409 -1.0403414558618951 -0.051630913094523348 -0.092120205923378357 -0.38706599648683132 -1.0342727371002263 -0.37071694342002698 -1.03416035146106 -0.2902752106326536 -0.032573688018865482 -0.38627624093566609 -1.0393142896207124 -0.3847171780086428 -1.0390038923025147 -0.38584890066451105 -1.0414258495624991 -0.070341015750958941 -0.19675368021262765 -0.41003246985804676 -1.0491249540140826 -0.35241839428283928 --0.0024821409163338208 -0.36698071709880603 -1.0340802583369555 -0.36482230170999314 -0.10279865099785082 -0.33320524818238806 -1.0553786223108599 -2.259476984451187e-08 --0.10232896766086093 -0.33364309177435919 -1.0366516441882696 -0.33345436776955734 -1.0362836708646035 -0.48145726583660703 -1.0145939272301987 -0 -0.064159166363670764 -0.28728847460754525 -1.0350708619705065 -0.40072554415700734 -1.012346432487486 +1.0599999996162099 +4.5366603721284617 +-1.1109608265618025 +0.41354127960715692 +1.0392650005472026 +3.2256026017516831e-07 +0.28877280692180085 +0.40971786751199446 +1.0394584551962629 +0.40113090322348399 +1.0397960784900693 +3.4382614631994449e-07 +-0.052012393932720488 +0.4073210278961133 +1.0382620538212062 +4.4515380283730775e-07 +-0.022196971068819987 +0.39981342216751337 +1.0219246039183696 +0.16931246678767384 +0.089999613213682092 +0.41497672529953122 +1.0241576928327369 +0.39974580076221067 +1.0118088643979963 +0.22853028998529992 +0.22999980554592028 +0.45589908598316448 +1.0470588373683918 +7.5992221706672763e-08 +0.69999376190285079 +0.45111293237227562 +1.0423797121648692 +0.45590406710702386 +1.0436900641369966 +0.49307823537027146 +1.0599999749082432 +4.3084106437890464 +-0.094323809739913667 +0.49060036412222885 +1.0107505577362768 +0.44459707535952164 +1.0377015867223924 +0.45236363417444431 +1.0400157554931684 +0.47424510606445147 +1.0427400494441694 +0.48983636084644044 +1.0505033684082403 +3.0834405394913829e-08 +0.2299991331679096 +0.47038431084804261 +1.0443216056072042 +0.47565277889946533 +1.0571033174749438 +0.036262094994336518 +0.035413201565139704 +0.52651778450358033 +1.0481491167548485 +0.58174277901880056 +1.0600000031223575 +5.0184410234171404 +-0.24015433417187368 +0.48726369678077891 +1.0417816299956482 +4.3048386239845161e-08 +0.47214646623172163 +0.49246577999334301 +1.0456494992813132 +3.8470758637664756e-08 +0.015562573260373554 +0.51349524274239 +1.0500034457650795 +2.8016728592408594e-08 +0.089999176924778462 +0.48424581822860474 +1.0400088177659992 +0.46585023985551788 +1.037890107431271 +0.45284383439399828 +1.0267609622738945 +0.45332039060688356 +1.0354644602798324 +0.46717206891868879 +1.0431440798200227 +0.46577742406862283 +1.0519318062901895 +0.45718783278602071 +1.0540446947933457 +5.7276315837130054e-08 +-0.031740003657319014 +0.47378238147041268 +1.0584501543919043 +2.3129447081530281 +0.45758157805299998 +0.47693608212850613 +1.0427929979079571 +0.49972333218690301 +1.0468422515663414 +0.43818916228588745 +1.0513999577661055 +0.38246226278396023 +0.11702353575262611 +0.40070662602745488 +1.042637976003316 +7.8860828198782319e-07 +0.22996869239232917 +0.39147936382807674 +1.040340993290509 +0.051631067310145509 +0.092140881993002147 +0.38706603587196553 +1.0342722873017316 +0.37071695861323339 +1.0341598845378941 +0.29027504255901243 +0.032573739671296044 +0.38627629469294938 +1.0393137679982336 +0.3847172333652053 +1.0390033469488467 +0.38584896533155055 +1.0414252442745395 +0.070340982144528955 +0.19674973238608426 +0.41003253572982246 +1.0491244332668423 +0.35241836292619527 +-0.0024810033424443258 +0.36698072741265736 +1.034079717792622 +0.36482218777718145 +0.10279985170983824 +0.33320529050462716 +1.0553784256569165 +4.1230618463889958e-07 +-0.10232926411618698 +0.33364310393827112 +1.0366514839728793 +0.33345437938825961 +1.0362835120686025 +0.4814572621984809 +1.0145939128707631 +3.5249265019535526e-08 +0.064154722862809238 +0.28728858096992332 +1.0350706384958028 +0.40072557299085715 +1.0123462744242362 diff --git a/datafiles/test_validation/case118.m/grad_valid.txt b/datafiles/test_validation/case118.m/grad_valid.txt index 5a54fea8..be26b7c8 100644 --- a/datafiles/test_validation/case118.m/grad_valid.txt +++ b/datafiles/test_validation/case118.m/grad_valid.txt @@ -1,7 +1,7 @@ 344 0 0 -4052.9781725276771 +4052.9780354895579 0 0 0 @@ -9,31 +9,31 @@ 0 0 0 -4000.0000001031431 +4000.0000252490859 0 0 0 0 0 -4000.0000484812758 +4000.0006525251665 0 0 0 0 0 -4000 +4000.0000216228523 0 0 0 0 0 -3786.1090141722125 +3786.1087936915865 0 0 0 0 0 -4018.6784489680731 +4018.6781749832717 0 0 0 @@ -41,7 +41,7 @@ 0 0 0 -4041.7677627931889 +4041.7676741276887 0 0 0 @@ -49,11 +49,11 @@ 0 0 0 -4026.4523001416842 +4026.4522404185846 0 0 0 -4043.1665411868785 +4043.1664697632577 0 0 0 @@ -65,19 +65,19 @@ 0 0 0 -4000 +4000.0000238134062 0 0 0 -3761.9439545841578 +3761.94383137246 0 0 0 -3781.9248934527463 +3781.9247612504 0 0 0 -4019.8449723410477 +4019.8449487821526 0 0 0 @@ -87,23 +87,23 @@ 0 0 0 -4070.9344414330617 +4070.9344438187145 0 0 0 -4029.7251660171532 +4029.725109462724 0 0 0 0 0 -4009.7756243798813 +4009.7756234597 0 0 0 0 0 -4021.3254165338085 +4021.3253320552767 0 0 0 @@ -113,13 +113,13 @@ 0 0 0 -4098.6436528514605 +4098.6435912567795 0 0 0 0 0 -4081.9899263678012 +4081.9898990329129 0 0 0 @@ -129,7 +129,7 @@ 0 0 0 -4004.1018229964607 +4004.1017788635913 0 0 0 @@ -137,7 +137,7 @@ 0 0 0 -3895.4148252866958 +3895.4147503495983 0 0 0 @@ -149,15 +149,15 @@ 0 0 0 -4064.2629713604565 +4064.2629604925701 0 0 0 -4064.2684460029827 +4064.2684427632071 0 0 0 -4065.1203433943488 +4065.1203402138735 0 0 0 @@ -165,17 +165,17 @@ 0 0 0 -3931.6749356419123 +3931.6748572689262 0 0 0 0 0 -3855.1852649305965 +3855.18517624894 0 0 0 -4000 +4000.0000124901826 0 0 0 @@ -183,11 +183,11 @@ 0 0 0 -3801.7199340010548 +3801.7198593451126 0 0 0 -3779.8895374590147 +3779.8894749563588 0 0 0 @@ -195,35 +195,35 @@ 0 0 0 -3757.0335325965411 +3757.0334550463144 0 0 0 -4000.0000031335644 +4000.0000645120522 0 0 0 0 0 -4000.0000034618588 +4000.0000687652296 0 0 0 -4000.0000050260323 +4000.0000890307601 0 0 0 -4033.8625181327375 +4033.8624933575347 0 0 0 0 0 -4045.7060632753114 +4045.7060579970603 0 0 0 -4000 +4000.0000151984445 0 0 0 @@ -231,7 +231,7 @@ 0 0 0 -3806.4615693794126 +3806.461486985434 0 0 0 @@ -243,31 +243,31 @@ 0 0 0 -4000 +4000.0000061668816 0 0 0 0 0 -3813.1048623781708 +3813.1047497168256 0 0 0 0 0 -3653.5226973511385 +3653.5225797494691 0 0 0 -4000 +4000.0000086096775 0 0 0 -4000 +4000.0000076941519 0 0 0 -4000 +4000.0000056033459 0 0 0 @@ -283,11 +283,11 @@ 0 0 0 -4000 +4000.0000114552636 0 0 0 -3835.6706498997228 +3835.6704041037488 0 0 0 @@ -295,21 +295,21 @@ 0 0 0 -3912.3115261245275 +3912.3113139198013 0 0 0 -4000.0000103279881 +4000.0001577216567 0 0 0 -4010.3261826189046 +4010.3262134620295 0 0 0 0 0 -4058.0550421265307 +4058.0550085118025 0 0 0 @@ -317,19 +317,19 @@ 0 0 0 -4014.0682031501919 +4014.068196428906 0 0 0 -3957.8799698042999 +3957.879795600722 0 0 0 -4072.9644603419983 +4072.9644375554367 0 0 0 -4000.0000045189536 +4000.0000824612371 0 0 0 @@ -337,7 +337,7 @@ 0 0 0 -4000 +4000.0000070498531 0 0 0 diff --git a/datafiles/test_validation/case118.m/obj_value_valid.txt b/datafiles/test_validation/case118.m/obj_value_valid.txt index 6baf451e..b2193628 100644 --- a/datafiles/test_validation/case118.m/obj_value_valid.txt +++ b/datafiles/test_validation/case118.m/obj_value_valid.txt @@ -1 +1 @@ -129660.69419396459 +129660.69434043927 diff --git a/datafiles/test_validation/case9mod.m/G_valid.txt b/datafiles/test_validation/case9mod.m/G_valid.txt index e2e4c3c1..5dabfda3 100644 --- a/datafiles/test_validation/case9mod.m/G_valid.txt +++ b/datafiles/test_validation/case9mod.m/G_valid.txt @@ -1,37 +1,37 @@ 36 --4.674038933671909e-13 -1.7784662631470383e-12 --1.0130456917778474e-08 -1.756370559477527e-07 --7.0574276422874505e-09 -1.8736264773000499e-07 -1.1590728377086634e-13 -5.3290705182007514e-14 -1.6903453747829644e-08 -6.3813931028278148e-08 -1.8120373312946469e-08 -6.0348277652888527e-08 --3.1255916632666469e-08 --3.9143376806549668e-07 -3.9270550145076299e-08 -2.5640788015035554e-07 --2.7431972915437086e-08 --3.5765027917022962e-07 -0.53547468107454055 -0.53260342008402439 -1.3038182501273037 -1.315131401151246 -0.69849833874804679 -0.7158208467197722 -0.088128842463233673 -0.16403463423120926 -0.20126473747328963 -0.21191008842859441 -0.26305975751436789 -0.24053218661116582 -0.23947661709898585 -0.2645345033726002 -0.44370700318366701 -0.46396293219461243 -0.15105063481862782 -0.11663436794787219 +-6.1165511544558626e-09 +2.3394322395953182e-08 +-1.4666801106955063e-10 +2.5782811441388276e-09 +-7.6664119497138472e-11 +2.1129044347478754e-09 +1.5161090161086577e-09 +6.1101168569166475e-10 +2.8274371732806003e-09 +3.4195668519032552e-10 +3.5045738533412418e-09 +-1.1101503050170436e-10 +1.1911723829527432e-09 +-6.3573146746875864e-11 +2.4602542225693469e-13 +1.6292522886374172e-12 +9.1255680789714688e-10 +-7.8041573203790904e-11 +0.53546194255442514 +0.53259524800884794 +1.3038132395966704 +1.315119137627212 +0.69847595311137944 +0.71579443921300812 +0.088120787347156906 +0.16400622492710837 +0.2012677512693615 +0.21189738568216121 +0.26307958581099539 +0.24051804234977969 +0.23949411357491232 +0.26451365423146944 +0.44370853972198282 +0.46396442700286333 +0.15105001400817544 +0.11663358959576239 diff --git a/datafiles/test_validation/case9mod.m/Gl_valid.txt b/datafiles/test_validation/case9mod.m/Gl_valid.txt index 33548402..32e4324b 100644 --- a/datafiles/test_validation/case9mod.m/Gl_valid.txt +++ b/datafiles/test_validation/case9mod.m/Gl_valid.txt @@ -17,21 +17,21 @@ 0 0 0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 diff --git a/datafiles/test_validation/case9mod.m/Hess_valid.bin b/datafiles/test_validation/case9mod.m/Hess_valid.bin index e5d7ee8c..21447fb1 100644 Binary files a/datafiles/test_validation/case9mod.m/Hess_valid.bin and b/datafiles/test_validation/case9mod.m/Hess_valid.bin differ diff --git a/datafiles/test_validation/case9mod.m/Jeq_valid.bin b/datafiles/test_validation/case9mod.m/Jeq_valid.bin index d6d1207e..19903d0b 100644 Binary files a/datafiles/test_validation/case9mod.m/Jeq_valid.bin and b/datafiles/test_validation/case9mod.m/Jeq_valid.bin differ diff --git a/datafiles/test_validation/case9mod.m/Jineq_valid.bin b/datafiles/test_validation/case9mod.m/Jineq_valid.bin index 063e9d3c..62d7f3de 100644 Binary files a/datafiles/test_validation/case9mod.m/Jineq_valid.bin and b/datafiles/test_validation/case9mod.m/Jineq_valid.bin differ diff --git a/datafiles/test_validation/case9mod.m/Lambda_valid.txt b/datafiles/test_validation/case9mod.m/Lambda_valid.txt index 0e40ad3e..d2041b6b 100644 --- a/datafiles/test_validation/case9mod.m/Lambda_valid.txt +++ b/datafiles/test_validation/case9mod.m/Lambda_valid.txt @@ -1,37 +1,37 @@ 36 -2102.9086663512744 -6.1306946295948432e-10 -2059.179541044316 --4.62748272565405e-10 -2065.1543262166392 --2.1285785324908794e-09 -2103.1654286550606 -0.073878039131393805 -2113.4551625514218 -7.2897208384013279 -2129.8491696453198 -1.6170337692196257 -2059.5677508172553 --0.040574380927577681 -2079.3366384601891 -2.993779243335001 -2065.4281022443943 --0.091959905314282178 --7.2802605626985914e-08 --7.3211447539374619e-08 --2.2900140694230898e-08 --2.2613826444279118e-08 --5.3162360001513064e-08 --5.1747432531114327e-08 --4.5348736891177274e-07 --2.4051127647719883e-07 --1.9475039806504457e-07 --1.846175922102021e-07 --1.4735860533921016e-07 --1.6181803004742765e-07 --1.491427698468234e-07 --1.3284902323843737e-07 --8.4395884589172149e-08 --8.038196184696344e-08 --2.4910572117722817e-07 --3.2862313230871992e-07 +2102.9079634210389 +6.1220377665946746e-08 +2059.1797960654344 +-4.6224401917281595e-08 +2065.1547679563073 +-2.1281063325811355e-07 +2103.1648320715931 +0.076586327725526218 +2113.4551660418597 +7.2926695064320874 +2129.8495497014083 +1.6195230784287684 +2059.5680126881643 +-0.040509810555207589 +2079.3369863656708 +2.9938200241221296 +2065.4285464563391 +-0.091928930753423954 +2.9155816558962288e-07 +2.9149805905007038e-07 +8.1969101022843035e-07 +8.2156903328103992e-07 +4.883692207718736e-07 +4.8939026342424309e-07 +6.5796414008143865e-07 +6.661687238108096e-07 +6.7027270808254565e-07 +6.7145274700404157e-07 +6.7719334866254405e-07 +6.746507886323467e-07 +2.016638764707258e-06 +2.0420514337907957e-06 +6.9826153581018147e-07 +7.0070616787085982e-07 +1.9316612285223102e-06 +1.900498148919173e-06 diff --git a/datafiles/test_validation/case9mod.m/X_valid.txt b/datafiles/test_validation/case9mod.m/X_valid.txt index e3b4b1cd..b1945343 100644 --- a/datafiles/test_validation/case9mod.m/X_valid.txt +++ b/datafiles/test_validation/case9mod.m/X_valid.txt @@ -1,25 +1,25 @@ 24 0 -1.0999999739148179 -0.72859484836415755 -0.068001676539553579 -0.068551873482099845 -1.0952499275309213 -1.1406938476832171 --0.051340404468459271 -0.037005604170935118 -1.0865624663659503 -0.80210380663388758 --0.23479335901176734 --0.034778693883437885 -1.0970331503629294 --0.053398521299280348 -1.0793820389889608 --0.068534875725253394 -1.0868304611653803 -0.0093373471108720227 -1.1000000000000001 --0.030016945043488549 -1.089474581127974 --0.0023502874332940672 -1.1000000000000001 +1.0999836660729239 +0.72859453109464656 +0.067911394838317735 +0.068548922053077901 +1.0952528500726237 +1.1406939986945643 +-0.051287830310427385 +0.037002550344052247 +1.0865650279112309 +0.80210398840604913 +-0.23474485299886796 +-0.034779569929213293 +1.097021541545258 +-0.053400220727804731 +1.0793740853777092 +-0.068536896941845754 +1.0868225805490532 +0.0093345452746387055 +1.0999999148509831 +-0.030019822318232293 +1.0894744859549679 +-0.0023532564357853255 +1.0999999221032057 diff --git a/datafiles/test_validation/case9mod.m/grad_valid.txt b/datafiles/test_validation/case9mod.m/grad_valid.txt index b0baf8be..d9980d94 100644 --- a/datafiles/test_validation/case9mod.m/grad_valid.txt +++ b/datafiles/test_validation/case9mod.m/grad_valid.txt @@ -1,15 +1,15 @@ 24 0 0 -2102.9086664011465 +2102.9079684082221 0 0 0 -2059.1795410614691 +2059.1797977807596 0 0 0 -2065.1543262530245 +2065.15477159482 0 0 0 diff --git a/datafiles/test_validation/case9mod.m/obj_value_valid.txt b/datafiles/test_validation/case9mod.m/obj_value_valid.txt index 63aa194d..50e6099b 100644 --- a/datafiles/test_validation/case9mod.m/obj_value_valid.txt +++ b/datafiles/test_validation/case9mod.m/obj_value_valid.txt @@ -1 +1 @@ -4144.4605338128149 +4144.4605529712244 diff --git a/datafiles/test_validation/case_ACTIVSg200.m/G_valid.txt b/datafiles/test_validation/case_ACTIVSg200.m/G_valid.txt index 32019fd7..5fbf35ed 100644 --- a/datafiles/test_validation/case_ACTIVSg200.m/G_valid.txt +++ b/datafiles/test_validation/case_ACTIVSg200.m/G_valid.txt @@ -1,891 +1,891 @@ 890 -2.2204460492503131e-16 --1.1013412404281553e-13 -1.9456658506555868e-14 --1.5005358067199381e-14 --7.1054273576010019e-15 --2.8421709430404007e-14 -4.0939474033052647e-15 -1.1186364334836441e-14 -9.7699626167013776e-15 --4.2632564145606011e-14 +7.1054273576010019e-15 +-6.5725203057809267e-14 +-8.9650509238481391e-15 +-7.1848776928007396e-14 +1.4210854715202004e-14 +7.460698725481052e-14 4.0939474033052647e-15 +-4.5657054525971574e-14 +-5.773159728050814e-15 +4.9737991503207013e-14 +1.8304802118507268e-14 -6.8122590901609215e-14 -5.3290705182007514e-15 --4.9737991503207013e-14 --8.0768725041480138e-15 --5.8938964819787998e-14 -1.7763568394002505e-14 -4.2632564145606011e-14 -1.4155343563970746e-14 +4.6629367034256575e-14 +1.3145040611561853e-13 +2.0344836926255994e-14 +-2.095545958979983e-15 +4.4408920985006262e-15 +3.1974423109204508e-14 +3.5471625636773751e-14 -8.1878948066105295e-16 -3.9968028886505635e-15 -4.6185277824406512e-14 -1.4097230327525523e-14 --1.4552161559100441e-15 -1.8873791418627661e-15 +6.7723604502134549e-14 +1.7408297026122455e-13 +6.991802969924521e-15 +5.5388202704897971e-14 +1.609823385706477e-14 4.5201689613527662e-14 -4.4408920985006262e-15 --7.1054273576010019e-15 -1.1102230246251565e-16 --7.9491968563161208e-14 --1.5543122344752192e-14 -8.4210416417818124e-14 --2.8421709430404007e-14 --1.0480505352461478e-13 -1.2993946196804274e-14 --9.5496527352523231e-15 -2.149842803778057e-14 -9.7497964562931472e-14 -1.5676696052402406e-14 -1.2114484762570932e-13 --2.6922908347160046e-15 +7.6538775317658292e-13 +-3.5527136788005009e-14 +-7.6605388699135801e-15 +3.6082248300317588e-15 +2.2604140781368187e-13 +2.7366997557010109e-14 +-3.8191672047105385e-14 +-3.3217872896784684e-13 +5.8885188392032717e-15 +4.7293766125555692e-14 +7.2875733225785666e-15 +4.0654545702123457e-14 +1.465841337200402e-15 +7.4580099040932879e-15 +4.4131365228849972e-15 4.829470157119431e-14 --1.3988810110276972e-14 -1.1368683772161603e-13 --1.3324411018977855e-14 --1.3278614319212068e-13 --9.0899510141184692e-16 +1.7763568394002505e-15 +-1.9539925233402755e-14 +1.5097298411426152e-14 +3.7744113390303369e-14 +1.3301859613790157e-14 1.6375789613221059e-15 -7.1054273576010019e-15 --1.7763568394002505e-14 +2.3536728122053319e-14 +8.1712414612411521e-14 -7.6154360595381831e-15 -4.4201187848758039e-14 --2.1094237467877974e-15 -3.0198066269804258e-14 --2.7408630920433552e-14 --1.3715157481941631e-13 +-2.8421709430404007e-14 +-1.4654943925052066e-13 +1.0130785099704553e-15 +-2.3464737097800281e-14 +1.1102230246251565e-14 +-7.815970093361102e-14 +2.3536728122053319e-14 +-1.9650947535865271e-14 9.7699626167013776e-15 --7.460698725481052e-14 --4.8849813083506888e-15 -3.7192471324942744e-14 --2.6645352591003757e-15 -1.6697754290362354e-13 -8.3336115785925813e-15 +-1.1368683772161603e-13 +1.5439038936193583e-14 3.5470324594166769e-14 --6.2311267257086911e-15 -1.4460654895742664e-14 --1.2878587085651816e-14 --8.5265128291212022e-14 --1.354472090042691e-14 --8.940070905794073e-14 --4.4408920985006262e-15 --2.4868995751603507e-14 --5.620504062164855e-15 --1.1123046927963287e-13 -1.9428902930940239e-15 --9.3217100705089706e-14 -5.7176485768195562e-15 -3.1408903256036069e-14 --9.298117831235686e-15 +1.5085155347094314e-14 +-4.2382763965065351e-14 +-3.5527136788005009e-15 +-1.0658141036401503e-14 +4.3298697960381105e-14 +2.4286128663675299e-14 +9.7699626167013776e-15 +-2.8421709430404007e-14 +-2.6936786134967861e-14 +-5.4387050418824856e-14 +5.1680881796301037e-14 +1.3415657473814235e-13 +3.0531133177191805e-15 +8.8252322116844084e-14 +-2.350897254643769e-14 -2.2010171463193728e-14 -6.0813441005169722e-08 -3.8827006570985034e-07 -8.0491169285323849e-16 --3.9933334416986099e-15 -1.1934897514720433e-15 +2.7200464103316335e-15 +2.4980018054066022e-15 +-6.5225602696727947e-15 +3.1120939159023919e-15 +6.9805272673306717e-14 3.0921445959286586e-15 --9.7144514654701197e-16 -8.552186736565659e-16 -4.1078251911130792e-15 -2.1316282072803006e-14 -9.9920072216264089e-16 -3.1051550219984847e-15 --5.2735593669694936e-16 --1.1060596882828122e-14 -2.2204460492503131e-16 -5.6794846603480664e-15 --9.9827700689170129e-09 -5.126107871511465e-16 --9.9827688060383224e-09 -8.5348395018058909e-16 --9.9827700272836495e-09 -4.640385298237959e-16 --9.982768833793898e-09 -7.4506373293203865e-16 --9.9827811017583201e-09 -1.1952244749480201e-15 -2.9420910152566648e-15 -7.0568551002736513e-15 -8.2156503822261584e-15 -2.3092638912203256e-14 --3.8857805861880479e-16 --1.6245685352522798e-14 --8.8817841970012523e-16 --6.2241878318047839e-15 -1.1102230246251565e-15 --2.2204460492503131e-16 -1.1102230246251565e-16 -1.2663481374630692e-15 -8.3266726846886741e-16 --5.027228633380787e-15 -2.2204460492503131e-16 +-1.5404344466674047e-14 +1.1513359710058069e-14 +2.9676261448230434e-13 +3.1974423109204508e-14 +2.6478819137309983e-14 +6.6578687007989856e-15 +5.2458037913538647e-15 +3.1502578323738817e-15 +6.1617377866696188e-15 +-7.1991024253037494e-15 +-6.5746019739520989e-16 +2.4921037455882811e-14 +1.3704315460216776e-16 +4.4235448637408581e-17 +-4.0766001685454967e-16 +1.32836450172924e-14 +-2.9490299091605721e-17 +-1.4814538484841933e-15 +-5.863365348801608e-16 +1.3318339486811936e-14 +2.0261570199409107e-14 +1.4162282457874653e-14 +1.7205126212616051e-12 +-1.5809575870662229e-13 +3.8857805861880479e-16 +5.0705967202802071e-15 +1.2434497875801753e-14 +7.9866668833972199e-15 +1.3322676295501878e-14 +-3.7747582837255322e-15 +3.6637359812630166e-15 +6.5954186556638206e-15 +1.6653345369377348e-16 +7.4072692424209663e-15 +2.1538326677728037e-14 -1.9775847626135601e-15 --1.0547118733938987e-15 --1.0602629885170245e-14 -1.3877787807814457e-16 +1.2712053631958042e-14 +-3.4972025275692431e-15 +2.656208586415687e-14 -2.1649348980190553e-15 -7.7715611723760958e-16 -3.5527136788005009e-15 -9.9684488441553754e-09 -2.2412627309620348e-15 --1.9428902930940239e-15 -1.3322676295501878e-14 --9.9826087378990236e-09 -2.3852447794681098e-16 --9.9826533428437614e-09 -9.4368957093138306e-16 --9.98265012319699e-09 -2.7269853042355408e-15 --9.9826534538660638e-09 -2.1233015345956119e-15 --9.9826488464405116e-09 -1.4363510381087963e-15 --9.9826490684851166e-09 --3.4902636336653359e-15 --9.9826535648883663e-09 -5.6898930012039273e-16 --6.3837823915946501e-16 --3.2127078775090467e-15 -1.1657341758564144e-15 --6.4184768611141862e-16 --9.9870768772991614e-09 -1.506607338885857e-15 --9.9870678220426168e-09 -1.4415552085367267e-15 +9.9920072216264089e-15 +-1.7763568394002505e-15 +-2.3647750424515834e-14 +6.4628857820991925e-14 +9.2703622556200571e-15 +1.5099033134902129e-14 +-8.3839185593959087e-15 +3.9494449377563967e-14 +-2.1316282072803006e-14 +3.7039815659056785e-14 +-2.0206059048177849e-14 +2.3835100559921329e-14 +-2.0969337377607644e-14 +3.4514058278034554e-14 +-1.9581558596826198e-14 +2.4376334284426093e-14 +-1.9761969838327786e-14 +2.5070223674816816e-14 +-2.0969337377607644e-14 +3.4042213492568862e-14 +8.2434059578417873e-15 +3.4000580129145419e-16 +8.0435658134092591e-14 +5.6864235542519737e-15 +-3.6255720647915268e-15 +3.3091585027733572e-14 +-4.1101670678056479e-14 +1.987987899298993e-12 +-1.1102230246251565e-16 0 0 --2.7755575615628914e-17 -1.7763568394002505e-15 -1.0388899601698753e-08 -7.7585842653271619e-08 -3.8857805861880479e-16 --2.1316282072803006e-14 -1.4988010832439613e-15 --2.7200464103316335e-15 -7.7715611723760958e-16 --7.679620828149325e-15 -3.6082248300317588e-16 --3.4833247397614286e-15 --1.1102230246251565e-15 -1.8735013540549517e-16 --4.4408920985006262e-16 --1.2732870313669764e-14 -1.0769163338864018e-14 --2.1316282072803006e-14 -7.1054273576010019e-15 -1.8596235662471372e-14 --4.4408920985006262e-16 --1.8041124150158794e-15 --9.9870947102564944e-09 -1.9849573373864615e-15 --9.9871041436827568e-09 -5.2562121322097255e-16 --5.5511151231257827e-17 --4.4408920985006262e-16 --1.3877787807814457e-17 --4.5935477643865852e-15 --9.9826421851023639e-09 --2.9397331409442007e-09 -6.3837823915946501e-16 --1.9984014443252818e-15 --7.2164496600635175e-16 --7.0707328880814657e-15 -5.5511151231257827e-16 --2.8067825841304739e-15 --7.7715611723760958e-16 +0 +-5.8286708792820718e-16 +-2.6506574712925612e-15 +1.8268719870206951e-13 +-2.4868995751603507e-14 +4.9960036108132044e-16 +1.149080830487037e-14 +3.4416913763379853e-15 +-5.7419347054832315e-16 +8.0296880256014447e-14 +-1.0588752097362431e-14 +-7.7715611723760958e-15 +-3.3653635433950058e-15 +5.773159728050814e-15 +-2.0747292772682613e-15 +1.2673195826096162e-12 +-3.1974423109204508e-13 +1.0266232308708823e-12 +1.9623191960249642e-13 +1.7319479184152442e-14 +-1.8013368574543165e-14 +-1.0113437864944785e-15 +1.1304152058855266e-13 +1.4918621893400541e-16 +-3.7201144942322628e-15 +0 +0 +1.5806800313100666e-14 +-1.0408340855860843e-15 +-1.181693631835401e-14 +3.2786273695961654e-15 +5.9674487573602164e-15 +-8.3821838359199319e-15 +6.106226635438361e-16 +-1.5952517085082718e-14 +-6.106226635438361e-15 +2.5222879340702775e-15 +-8.1046280797636427e-15 -7.1054273576010019e-15 -1.6653345369377348e-15 --1.8596235662471372e-14 --1.4340685405844766e-07 --9.8289376060378686e-07 --1.2212453270876722e-15 --2.8477220581635265e-14 -7.7715611723760958e-15 -1.7763568394002505e-15 -1.1102230246251565e-15 -3.5527136788005009e-15 -9.9685624199707945e-09 -5.8928556478932137e-15 -1.544855576796067e-08 -5.1209037010835345e-15 -9.4368957093138306e-16 -3.0921445959286586e-15 -1.5543122344752192e-15 --9.6866958898544908e-15 -3.8857805861880479e-16 --1.4883927423881005e-15 -3.3306690738754696e-16 +7.9936057773011271e-15 +2.7200464103316335e-15 +9.6589403142388619e-15 +-8.992806499463768e-15 +3.219646771412954e-15 +-4.2688075296837269e-14 +3.3533176235778228e-12 +-2.6822988274943782e-13 +1.0658141036401503e-14 +-3.5527136788005009e-15 +-1.4976908602193362e-13 +6.454618090012687e-12 +-1.1666223542761145e-12 +2.222992623313047e-11 +3.1641356201816961e-15 +-4.6056908287184228e-16 +4.1144865292608301e-13 +1.5182299861749016e-14 +1.3933298959045715e-14 +1.1761425167122752e-15 +2.55351295663786e-15 2.2828960943854781e-15 -3.5110803153770576e-15 -2.5826563110342704e-14 --1.3877787807814457e-15 -1.6514567491299204e-15 -5.0626169922907138e-14 -7.5495165674510645e-15 -7.7715611723760958e-16 -3.5527136788005009e-15 -9.9686693483258537e-09 -3.2397435428821453e-13 -1.3318624869640416e-08 --5.6621374255882984e-15 -8.8817841970012523e-16 --7.1054273576010019e-15 -3.3306690738754696e-16 --1.8818280267396403e-14 --1.1102230246251565e-16 +8.840150833577809e-15 +-9.7005736776623053e-15 +8.3266726846886741e-16 +-1.9012569296705806e-15 +1.028617191423109e-09 +-7.3005601564091194e-11 +1.9839685450051547e-13 +8.5265128291212022e-14 +-4.2159780874739816e-11 +7.1900172083499969e-09 +-1.3763212791673141e-11 +3.0796171168745445e-10 +-3.3306690738754696e-14 +0 +5.5511151231257827e-14 +4.2743586448068527e-15 +-1.4432899320127035e-15 4.7878367936959876e-15 -1.5820678100908481e-15 --7.0776717819853729e-16 -1.1102230246251565e-15 -3.0045410603918299e-15 -2.6645352591003757e-15 -1.0658141036401503e-14 -3.3306690738754696e-16 --7.5842110369706006e-15 --2.2204460492503131e-16 --3.3750779948604759e-14 --6.2172489379008766e-15 --2.1316282072803006e-14 --9.9829260968853362e-09 -3.8719027983802334e-15 --9.982908055761186e-09 -9.2703622556200571e-15 --9.9829040034471461e-09 -1.0408340855860843e-14 +9.5756735873919752e-15 +-6.0368376963992887e-15 +-4.2188474935755949e-15 +1.2281842209915794e-15 +7.0077277314339881e-13 +-1.0658141036401503e-14 +5.0959236830294685e-14 +-5.8078541975703502e-15 +-2.886579864025407e-15 +0 +8.8817841970012523e-16 +0 +-1.7985612998927536e-14 +-9.5479180117763462e-15 +-2.9531932455029164e-14 +1.4910295220715852e-13 +-5.6621374255882984e-15 +-1.4402368186949843e-13 +2.4908963780490012e-12 +-2.1671553440683056e-13 +5.7309712531150581e-13 +5.1125770283988459e-14 +4.1910919179599659e-15 +-3.7296554733501353e-15 +1.9317880628477724e-14 +1.9706458687096529e-14 +1.0919043447188415e-13 +-1.1088352458443751e-14 +4.454214774796128e-13 +0 +-1.0436096431476471e-14 -1.7763568394002505e-15 --5.6843418860808015e-14 -2.886579864025407e-15 -1.2045919817182948e-14 -5.2735593669694936e-16 --1.7694179454963432e-16 -3.3306690738754696e-15 --1.5820678100908481e-14 -1.9428902930940239e-15 -1.3461454173580023e-15 --2.6645352591003757e-15 --3.5527136788005009e-14 --2.2204460492503131e-15 -1.5987211554602254e-14 --1.3375442087237843e-08 -1.1379786002407855e-14 --1.3375441199059424e-08 -1.0436096431476471e-14 -8.3266726846886741e-16 +-2.6867397195928788e-14 +-1.3977707880030721e-13 +-1.7541523789077473e-14 +-1.149080830487037e-13 +1.1934897514720433e-14 5.863365348801608e-16 -1.3045120539345589e-15 -1.0430892261048541e-14 -1.2212453270876722e-15 -4.5900783174346316e-15 --4.9960036108132044e-16 --4.0800696154974503e-15 +1.1934897514720433e-15 +4.2136433231476644e-15 +4.7739590058881731e-15 +1.9255430583342559e-15 +1.7208456881689926e-15 +-2.3037127760971998e-15 2.2204460492503131e-16 -6.0021432268797525e-15 -1.9428902930940239e-15 -1.301736496372996e-14 -4.4408920985006262e-16 -1.8041124150158794e-16 -4.3021142204224816e-16 --1.1553258350005535e-15 -1.9984014443252818e-15 -6.3976601794024646e-15 -4.4408920985006262e-16 --8.8817841970012523e-15 -9.9686036092450081e-09 -9.5479180117763462e-15 +-1.5314138845923253e-14 +2.4591439995447217e-14 +1.6570078642530461e-14 2.4424906541753444e-15 --7.4801276284119922e-15 -2.2791601939076145e-11 --5.375699885235008e-13 -6.6613381477509392e-16 -1.2434497875801753e-14 --9.9869905505201029e-09 -4.8834357998378541e-10 --9.9827934807450447e-09 -6.867340029970137e-12 --9.9826915067602329e-09 -1.7763082671429231e-12 --9.9827008326336397e-09 -4.7695597471530959e-12 --9.9826947541625799e-09 -4.6053993951744587e-12 --6.6613381477509392e-15 --1.4210854715202004e-14 -7.7715611723760958e-16 -5.7454041524351851e-15 --1.6653345369377348e-15 --2.5590640717609858e-14 -4.163336342344337e-16 -1.2875117638699862e-14 --2.7755575615628914e-17 -5.3290705182007514e-15 +-2.4841240175987878e-15 +1.1088352458443751e-14 +4.1737446832001979e-15 +3.9901415505028126e-13 +4.6213033400022141e-15 +-7.5495165674510645e-15 +-8.8817841970012523e-15 +-1.4432899320127035e-14 +-2.5451862839531714e-14 +2.4202861936828413e-14 +3.1780134079895106e-15 +2.414962285701705e-09 +-5.4845017416482733e-11 +-2.2204460492503131e-16 +3.2152058793144533e-13 +-4.7910440198473125e-10 +5.1889360099498238e-08 +-1.4601875264474984e-11 +7.0504583421504563e-10 +-2.9923563626965688e-12 +1.6886886680667068e-10 +-5.1829096570088495e-12 +4.8648163275544221e-10 +-4.5613790522480713e-12 +4.6898091660141361e-10 +-2.2537527399890678e-14 +2.4868995751603507e-14 +3.091971123581061e-14 +3.9690473130349346e-15 +2.9420910152566648e-14 +-2.4980018054066022e-15 -2.7755575615628914e-17 --1.7763568394002505e-15 -9.298117831235686e-16 -2.4494295480792516e-15 --1.8318679906315083e-15 -1.0602629885170245e-14 -3.3306690738754696e-16 +-8.4411644341031433e-15 +-1.3045120539345589e-15 +1.7763568394002505e-15 +2.7755575615628914e-17 +1.7763568394002505e-15 +2.0400348077487251e-15 +6.7307270867900115e-16 +5.440092820663267e-15 +-6.7168492989821971e-15 +2.2204460492503131e-16 3.5527136788005009e-15 -1.3877787807814457e-17 -4.4408920985006262e-16 +2.7755575615628914e-17 +8.8817841970012523e-16 2.7755575615628914e-17 4.4408920985006262e-16 --9.9870907065147119e-09 --6.6358995728932335e-09 +4.5102810375396984e-17 +-9.4195484745540625e-16 1.3877787807814457e-17 0 -1.3877787807814457e-17 -0 --9.9870918444933121e-09 --6.6064395828902001e-09 --5.8286708792820718e-16 --4.1772141301521515e-15 --2.9143354396410359e-16 -1.0200174038743626e-15 -7.2164496600635175e-16 -9.540979117872439e-16 -2.0146041002089277e-08 -1.55851092670245e-07 -2.7755575615628914e-16 -2.2898349882893854e-15 -2.0816681711721685e-15 -1.9706458687096529e-15 -1.3322676295501878e-15 -2.2204460492503131e-15 +2.7755575615628914e-17 +8.8817841970012523e-16 +-4.5102810375396984e-17 +1.1032841307212493e-15 +1.3850032232198828e-14 +6.4809269062493513e-15 +3.7470027081099033e-16 +-4.3090531143263888e-15 +1.1657341758564144e-15 +6.2831684299879953e-15 +2.3869795029440866e-15 +2.4147350785597155e-15 +-2.3869795029440866e-15 +-1.2628786905111156e-15 +4.1064374123322978e-13 +1.2628786905111156e-14 +3.8413716652030416e-14 +3.9968028886505635e-15 +7.9047879353311146e-14 +3.5527136788005009e-15 +6.2172489379008766e-15 +1.8290924330699454e-14 +1.3100631690576847e-14 +-8.8956619848090668e-15 +3.1115110488144637e-12 +-2.3875346144563991e-13 +-4.2063574845485618e-14 +7.4022246665528257e-12 +-8.4654505627668186e-16 +1.5977077300055598e-11 +1.6431300764452317e-14 +-3.524958103184872e-15 +2.4835689060864752e-13 +-4.8364090510233382e-15 +4.7462034302725442e-15 +-7.3344108564299404e-15 +2.3803181647963356e-13 +2.4868995751603507e-14 1.7763568394002505e-15 +1.7763568394002505e-15 +-4.0412118096355698e-14 +2.5146551507759796e-14 +9.8254737679326354e-15 +-2.2759572004815709e-15 +2.0289325775024736e-14 +4.8572257327350599e-17 +4.4086956307864966e-13 +-1.9206858326015208e-14 +5.3290705182007514e-15 +-3.1516456111546631e-14 +2.8189117706745037e-12 +-1.6925350010410511e-13 +1.1199374760906267e-14 +9.7699626167013776e-15 +1.1102230246251565e-16 0 -3.0074815970948521e-08 -2.3461430539994943e-07 --6.6613381477509392e-16 --5.3429483060085659e-15 -2.2037927038809357e-14 --1.7152945730458669e-14 --9.9824707597284679e-09 -8.0361065024625589e-14 --9.9824834787209937e-09 -1.8224310949221945e-13 -1.9560853381506149e-08 -1.3005906754348651e-07 -1.4432899320127035e-15 -2.2690183065776637e-15 -5.2735593669694936e-16 --1.0887124535230441e-14 +2.7755575615628914e-17 +1.7763568394002505e-15 +7.4662498406041777e-15 +1.9081958235744878e-15 8.8817841970012523e-16 -1.7763568394002505e-14 -6.6613381477509392e-16 -0 --4.4408920985006262e-16 -2.5091040356528538e-14 -9.4368957093138306e-16 -1.27675647831893e-15 -3.0531133177191805e-16 -2.7131075164277263e-15 -3.3306690738754696e-16 --1.4432899320127035e-15 --2.2204460492503131e-15 --3.8621883469147633e-14 -2.4702462297909733e-14 -6.6058269965196814e-15 --2.1094237467877974e-15 --7.9936057773011271e-15 --1.1102230246251565e-16 --3.5527136788005009e-15 -0 --8.8817841970012523e-16 -1.3877787807814457e-16 --5.1972315340265141e-15 -0 -6.6613381477509392e-16 -1.1657341758564144e-15 -3.3757718842508666e-15 -0.0059034402651635363 -0.0059022099999977533 -0.015235302565741559 -0.015932603561970488 -0.16785660030169333 -0.16805694767011917 -0.0451000225577005 -0.045653840399253867 -0.00031205408221509148 -0.00031203999999975348 -0.018144625925236701 -0.018032249954923762 -0.022941911874240412 -0.023094106610910266 -0.0068325551275924207 -0.006831010000002428 -0.074504614332013649 -0.07422727861383617 -0.12435597626081132 -0.12484294117275072 -0.060981329869108855 -0.060942050000011808 -0.016240566115970682 -0.015946453022374487 -0.064001796791108331 -0.06366754603932373 -0.01789752720240104 -0.018555695478868692 -0.1971976767042467 -0.19694479999998812 -0.16658328439475711 -0.16695669900943358 -0.0001395378940148183 -6.7281683782974627e-05 -0.00094954527433982136 -0.0010524861220133272 -0.0051261789817331673 -0.0049568008647685189 +-5.5511151231257827e-15 +-1.3711254354120683e-14 +-1.7694179454963432e-16 +0.0059034402694266297 +0.0059022100000043418 +0.015235248269158225 +0.015932423541641462 +0.16785626444488322 +0.16805662751850906 +0.045100158582678983 +0.045653980621624249 +0.00031205408221206716 +0.00031204000000029916 +0.018144621332452843 +0.018032358654602162 +0.022941972081351354 +0.023094084472451298 +0.0068325551265819148 +0.0068310100000001685 +0.074504534211583498 +0.074227243907456691 +0.12435608162283611 +0.12484300863646847 +0.060981330007882098 +0.060942049999990609 +0.016240543894786713 +0.015946434658006565 +0.064001844870990449 +0.063667594492880147 +0.017897530288008213 +0.018555696807128829 +0.1971976776022602 +0.19694479999996994 +0.16658317782946991 +0.16695660970913501 +0.00013953112961220809 +6.7279268934465996e-05 +0.00094954050672607193 +0.0010524761436223697 +0.0051261974171171228 +0.0049568157603876581 9.810080165468711e-06 -9.809999999918037e-06 -0.00068692879521433726 -0.00068687999999925402 -0.023202987053044945 -0.021962394245765047 -0.0008639011381652191 -0.00019330599938838483 -0.01523798730348391 -0.016871186073409601 -0.37991235159664838 -0.38290288660941335 -1.8331132882768872 -1.8715240132167277 -0.573738501904418 -0.58621678286681234 -0.21686902604883382 -0.21662751999999241 -5.4411083450682811e-05 -5.4409999999853683e-05 -6.4131199667900011e-05 -6.4129999999239945e-05 -0.00013793426171274944 -0.00013792999999887037 -0.0022971411758447163 -0.0022968199999989828 -0.10310050077296426 -0.10336387158634018 -0.061466216947393203 -0.061391138779951497 -0.00021481796710913498 -0.00021481000000143802 -0.0006222799503184962 -0.0006222400000000215 -0.000969859137146034 -0.00032964601301410087 -0.00086741710794188275 -0.0017383834447276148 -0.00019746683494141975 +9.8099999998583516e-06 +0.00068692879515800049 +0.0006868799999985378 +0.023202655165267989 +0.021962163438582597 +0.00086391017842574766 +0.00019330712160760963 +0.015237515249591507 +0.016870643853374258 +0.37991409457625497 +0.38290471408720517 +1.8331186104093415 +1.8715299606514442 +0.57373893869135562 +0.58621589577860156 +0.21686902587170859 +0.21662751999979066 +5.4411083452980852e-05 +5.4409999999727197e-05 +6.413119967027619e-05 +6.4129999999708889e-05 +0.00013793426172226437 +0.00013792999999991912 +0.0022971411765544342 +0.0022968199999983279 +0.10310003805779237 +0.10336345373145882 +0.061465959239365882 +0.061390813994752498 +0.00021481796709710299 +0.0002148099999992723 +0.00062227995025777871 +0.00062223999999933932 +0.00096984155627709615 +0.00032963848669910934 +0.00086740509368810168 +0.0017383621608870019 +0.00019746683493557007 0.00019746000000055042 -0.27581182630879675 -0.27702499196419667 -0.26326591151299727 -0.26107793815056696 -0.00058782055023761813 -0.00058778000000311512 -0.001856622989659819 -0.00087456294030249522 -0.00023667029386528749 -0.0018600094322058067 -0.37813967124914766 -0.37752136999999325 -0.14488115399236146 -0.14485726377638725 -0.05494121798011161 -0.054247550734197188 -2.8260452881843549e-05 -2.8259999999808591e-05 -0.0044867068593387634 -0.0044859200000002706 -0.027918733798954664 -0.026075221547835294 -0.010709081692451796 -0.012487332184138555 -0.04663006023966447 -0.046602400000016211 -0.13938827375781709 -0.13970528728027251 -0.02694834234678262 -0.026679173954242609 -0.0013786569943125943 -0.0013785300000026702 -0.096170940651152476 -0.096088610000014674 -0.010028925105626099 -0.0077628083378534808 -0.080706713805021424 -0.08101025595224419 -0.00044982250030876946 -0.00044980000000063473 -0.032747404568248928 -0.032659237336969675 -0.007542285133326972 -0.0073849022520561577 -0.13050013174828562 -0.12819659130460404 -0.018627484513624074 -0.019738259553785387 -0.072769899488432141 -0.075040791686327657 -0.020431463605814621 -0.020465677028566553 -0.0018223758697709042 -0.0014721295687635449 -0.040399061658843154 -0.040479209424335263 -0.032405133993029654 -0.032444430493596729 -0.03404410076662865 -0.03429729831801271 -0.097904877804962695 -0.097744552328622211 -0.063379329083757319 -0.059361152543442736 -0.033963252233842368 -0.033157199867985619 -0.14628067777780104 -0.15772233553137521 -0.0082544546060806228 -0.0086689929186934741 -0.026324768227510339 -0.025750061900247163 -0.015930676791462095 -0.016152376912685649 -0.020154924541404447 -0.019993452446681562 -0.00021158898178723787 -0.0002127449103011673 -0.00022665370479990328 -0.00022780429663420111 -0.00021158895911933237 -0.00021290130824138295 -0.00022665371337645654 -0.00022774162705946837 -0.0007829386179897728 -0.00078906597860955031 -0.11324831296849744 -0.11298228342209211 -0.0751078887073654 -0.075015544724707645 -0.0043570035385465571 -0.0043512226537710582 -0.58081956648759514 -0.56423120441081909 -0.86266249416547969 -0.86646759376887617 -0.0049857882948470223 -0.008819862790328304 -0.078538625588559993 -0.082835261415843228 -0.0027859414216297959 -0.0028125737341130408 -0.011295263159913945 -0.011244336243458646 -0.02460196220526489 -0.020643341780664487 -0.015362807444692133 -0.01827480150953956 -0.0027888318018209281 -0.0032375255777687085 -0.010344131349331352 -0.010004280680411207 -0.1253770027809932 -0.12478422681828401 -0.15414104819573143 -0.15489967236794461 -0.014557102117761695 -0.01414350208662412 -0.031607766757661721 -0.031693084907185351 -0.0044737468409261705 -0.0034861995920560567 -0.01434997386351565 -0.017181103551734422 -0.012375640017273483 -0.0074237167240053378 -0.76026563829118776 -0.75069451722052516 -0.00023151365055083383 -0.00023129962949239007 -0.0083110707112485412 -0.0081852476356770679 -0.0082267299656167431 -0.0081852477576683583 -0.0082768168956743448 -0.0081852476349728778 -0.0082210858262132328 -0.0081852477958595966 -0.0082176337525328661 -0.0081852477955576593 -0.0082496478327178414 -0.0081852476344871795 -0.020051041525313989 -0.018251282979823771 -0.022417513479191072 -0.021922258933891593 -0.00016978330523043607 -0.00017108958938080786 -5.7757135955867932e-05 -5.8355034634858681e-05 +0.27581133155140125 +0.27702451348679208 +0.26326540015726652 +0.26107741944741691 +0.00058782055017462013 +0.00058778000000026724 +0.0018565772116224803 +0.00087456855410253745 +0.00023665892944170963 +0.0018599776710890939 +0.37813967344888194 +0.37752136999997882 +0.14488103370164135 +0.14485715497031612 +0.054941287283437744 +0.054247620396963708 +2.8260452882717551e-05 +2.8259999999736116e-05 +0.004486706861490425 +0.0044859199999996166 +0.027918735236950605 +0.02607523773060335 +0.010709054280841988 +0.012487290824018841 +0.046630060209503908 +0.046602399999979151 +0.13938899872707833 +0.13970598173184412 +0.026948269774636158 +0.026679196275799566 +0.0013786569946491814 +0.0013785300000030325 +0.096170940867472729 +0.096088609999946367 +0.010029469984645319 +0.0077632745923225839 +0.080706646610556043 +0.081010240580329171 +0.00044982250033358506 +0.00044980000000121456 +0.032747146163662894 +0.032659043575767981 +0.0075422962439966011 +0.0073848507442327233 +0.13049962973748366 +0.12819608575804572 +0.018628167682850506 +0.019738959312694745 +0.072769230046957484 +0.075040055257282259 +0.020431262945784148 +0.020465550695469785 +0.0018224514685547749 +0.0014721516758491174 +0.040399050256807817 +0.040479174837931849 +0.032405108726508848 +0.032444439206523866 +0.034043867014960379 +0.034297149370891247 +0.09790494844481186 +0.097744634721984941 +0.063377048046544288 +0.059359986043980212 +0.033962931349766183 +0.033157611787375675 +0.14627633135974757 +0.15771587544706239 +0.0082545555233229841 +0.0086691423407570436 +0.026325055215805082 +0.025750236472962727 +0.015930743349985118 +0.016152473717787698 +0.020155010432275342 +0.019993503610980314 +0.00021159168089340753 +0.00021274767402632862 +0.00022664607624363616 +0.00022779653435833587 +0.00021158932046347407 +0.00021290167827772824 +0.00022664697804105049 +0.00022773478048311417 +0.00078293759117000514 +0.00078906487523096053 +0.11324844784843636 +0.11298245195348008 +0.075108226268057077 +0.075015831021827864 +0.0043570050950738626 +0.004351224659300457 +0.58082182623207868 +0.56423245110147302 +0.86266088450287326 +0.8664657173323832 +0.0049856727622154505 +0.0088221429542606374 +0.078538933654034276 +0.082836970889243633 +0.0027859460816415625 +0.0028125726034545747 +0.011295264035186268 +0.011244440541041118 +0.02460396537553345 +0.020645213800771167 +0.015363235156546414 +0.018275328415757623 +0.0027888829530444441 +0.0032376556961565333 +0.010344267660263168 +0.010004349495528718 +0.1253765345301294 +0.12478371425494265 +0.15414048373490916 +0.15489912630715941 +0.014556941137303861 +0.014143386366913729 +0.031607750969021922 +0.031693029235704669 +0.0044735238428200976 +0.0034860162196598569 +0.014349334040361303 +0.017180373140241637 +0.012374842640013473 +0.0074230828319869881 +0.76026420617953694 +0.75069391885827907 +0.00023149348923485078 +0.00023127958992754416 +0.0083109249557763252 +0.0081851120088841899 +0.0082266032214608348 +0.0081851242004255167 +0.0082766736922437797 +0.0081851119381297355 +0.008220963393792179 +0.0081851280175824648 +0.0082175115242423564 +0.0081851279873300289 +0.0082495066629361975 +0.008185111889219783 +0.020049851101836252 +0.018250136029336231 +0.022417337827143908 +0.021922153103499924 +0.00016977346163280248 +0.00017107945355223714 +5.7749221505442059e-05 +5.8346687329670786e-05 +3.0814879110195774e-33 +1.2325951644078309e-32 0 0 -3.0814879110195774e-33 -3.1562139928618021e-30 -0.016010376911529307 -0.016411600201472913 -0.020588200101851077 -0.020612285217172035 -0.01071422953955262 -0.0070172232373595291 -0.012261750252370094 -0.016870413951416148 -0.13982980322674934 -0.13902978528767418 -0.16486057166576953 -0.1469270271167582 -0.086591982172828541 -0.086743285947201335 -0.32862551788622413 -0.33040488225725717 -0.066162831479438106 -0.065941173518649282 -0.057035205473808671 -0.057128076376569151 -0.052763196785589786 -0.052684807386956169 -0.0072701193228718814 -0.0070274868738785289 -0.00016297211385327007 -0.00024468676672041788 -0.014001312362476556 -0.013431656422235193 -0.42859198849672919 -0.42803695686936305 -0.42859198849671559 -0.42930013679962109 -0.066921243302352287 -0.066624468757348135 -0.08897529601622936 -0.089261928425634227 -0.042277125174532901 -0.040752508272740871 -0.00010654854269766011 -0.00010511973718211866 -0.00025631013710487708 -0.00025524960975086632 -7.9579425302080585e-31 -2.0029671421627253e-31 -0.047880445624398922 -0.04337087512974494 -0.39246883522999831 -0.39554748969290826 -0.003433428112191684 -0.0033999990512230114 -0.0010192659647076463 -6.0012885339848485e-05 -0.083524361927789254 -0.084957883752438706 -0.12473437261553517 -0.12281793787340914 -0.0098610088612316339 -0.0093982200254878676 -0.077937304085221246 -0.077675439435924976 -0.27425226578388318 -0.27222542098357705 -0.27425226578388584 -0.2622839948098532 -0.15625322367625577 -0.15597248539483133 -0.058484614175039404 -0.061555554120153913 -0.17048914114233529 -0.17247440446431431 -0.021518956947132333 -0.02487962883523135 -0.00017366909747962327 -0.0001366625464088364 -0.14340871500433949 -0.14363350334120881 -0.0010076378903878767 -0.0009482554441440996 -0.11077313578725061 -0.11049353577817266 -0.45655086082995194 -0.45704055727077492 -2.393369117495654 -2.4004608916911438 -0.60969215573044733 -0.60855773069517682 -0.071861306113485665 -0.071618353375061714 -0.061002462065094062 -0.060849412920648348 -0.077393842072330396 -0.076740279011276863 -0.10698902632932249 -0.1070110654396248 -0.0050596507278534777 -0.0047834674823237647 -0.0010423487171669224 -0.0019666911725144706 -0.13991812805765289 -0.1404196441482658 -0.01095727274897831 -0.010648744510836899 -0.0068276142944595757 -0.0066793864307276097 -0.00016981559470328396 -4.5882396745670983e-05 -0.86267264273741684 -0.84492984943240723 -0.00020461577882725316 -0.00020536508694049909 -1.7966405813284441 -1.8379745287698064 -0.25979506315319101 -0.26015825835478179 -0.16626451820814467 -0.16604350287348507 -0.54266036657422356 -0.53617183220073961 -0.54266036657422501 -0.52897336309301624 -0.010578476766071473 -0.012237797739856955 -0.0096665260956382421 -0.0093745163957369669 -0.094270332934996995 -0.09501992053024598 -0.13163831569517009 -0.13178554520778343 -0.001268362618364231 -0.00071293947668388225 -0.078160538135969057 -0.078148676487012764 -0.50501031482864012 -0.46850565125003846 -5.5147120693574454 -5.5241899574912665 -2.763436322517796 -2.7269064693468565 -0.15431703289259349 -0.15633988152071418 -0.17507595161553502 -0.17832441716211925 -0.20245092583987156 -0.20506146455657842 -0.58781274097940783 -0.58724941210403681 -0.031993072777782287 -0.031555700873924536 -0.20511957876731535 -0.20420418292185613 -1.3008086869753013 -1.2709967294534752 -0.25335978244640811 -0.22146318405027457 -0.041103995211717981 -0.041032171265332214 -1.4699355561025833 -1.4637489613564847 -1.8376462991310702 -1.864548743381796 -1.8376463316258889 -1.8596255652495044 -0.22013492259699355 -0.22136932392770761 -0.10066896166738577 -0.10124489865858669 -0.019198558024612303 -0.019942467094091414 -0.028516282154973566 -0.028986950695414761 -0.036001131244235512 -0.036171059115408938 -0.03766105488124509 -0.038709465439081006 -0.021962261056616365 -0.021697754038938193 -0.012463014362940047 -0.012375239967879864 -0.010768161932376426 -0.01034361451286943 -0.0061971075456920422 -0.0057243559197935924 -0.85184651191606708 -0.86613226710726676 -0.12152806515460372 -0.12116272724636183 -1.0836276046537168 -1.0856034149922515 -0.00030611362324909583 -0.00030412178132722002 -0.057278938005897298 -0.056529941151955927 -0.054317244344686828 -0.054033841149815832 -0.057278936451082355 -0.056740564816422374 -0.057278936318270246 -0.056757768661037294 -0.034259185797255697 -0.035135788440944976 -0.3814935451273625 -0.38110902467316754 -0.086102774206592944 -0.085837084063382779 +0.016010345985020356 +0.016411542261680193 +0.02058821407643719 +0.020612234232745556 +0.010714359652552847 +0.0070173052750418692 +0.012261861182590114 +0.016870561551465768 +0.13982984968371448 +0.13902983584865755 +0.16486263445425237 +0.14692765905681865 +0.086592030298704617 +0.086743329240379224 +0.32862527338103525 +0.33040462125078113 +0.066162755276726548 +0.065941090284576911 +0.057035196854139873 +0.057128048966108645 +0.052762864921197646 +0.052684533742546301 +0.007270140916645274 +0.0070275031190782412 +0.00016298049159970196 +0.00024470111203860095 +0.01400131913398658 +0.013431665103441319 +0.42859264569615968 +0.42803738548717657 +0.42859264569450839 +0.42930044263038425 +0.066921353871859809 +0.066624564197773295 +0.088975268573657229 +0.089261900407607495 +0.04227380903497796 +0.040749263956359139 +0.00010653339066995157 +0.00010510560739333783 +0.0002562898373572347 +0.00025522979116822695 +0 +0 +0.047877431445647094 +0.04336795719784603 +0.39246889106238469 +0.39554758433452508 +0.0034333960380787693 +0.0033999684844131083 +0.0010191795635004083 +6.0015492599576439e-05 +0.083524434117727669 +0.084957972149270283 +0.12473439284000275 +0.1228179401233746 +0.0098610207377622487 +0.0093982247832814485 +0.07793697908735292 +0.077675049982980221 +0.27425204339063031 +0.2722252019818765 +0.27425204339064035 +0.26228389349567111 +0.15625306268325764 +0.15597230892632377 +0.058484956919915232 +0.06155592421857814 +0.17049063835068928 +0.17247589126524115 +0.021518234715063478 +0.024878809571961868 +0.00017366215746847304 +0.00013665795106784369 +0.14340891572353934 +0.14363370195832137 +0.0010076265742236881 +0.00094824943956493444 +0.11077314538508502 +0.11049354205508886 +0.45655043941203799 +0.45704068235625672 +2.3933672046859331 +2.400463071585953 +0.60969130945863503 +0.60855828870890627 +0.07186129743552494 +0.071618379369885299 +0.061002458426004935 +0.060849443443835437 +0.07739366422241746 +0.076740117228817725 +0.10698912023463061 +0.10701114770592884 +0.0050595713582163443 +0.0047834001762438452 +0.0010423519532841215 +0.0019666243253964356 +0.13991756379952275 +0.1404191107808066 +0.010957247206164474 +0.010648723763799516 +0.0068276280493499821 +0.0066793953776975064 +0.00016980802441958834 +4.5881711059375121e-05 +0.86267217196144186 +0.84492934544578113 +0.0002041803515723105 +0.00020491690070721305 +1.7966492878208706 +1.8379896115342726 +0.25979449890585415 +0.26015684288095081 +0.16626429497990958 +0.16604327164378516 +0.54265980758624377 +0.53617131254070993 +0.54265980758629107 +0.52897303786135619 +0.010578357436630619 +0.012237634054098287 +0.0096666095348451435 +0.0093744992188169642 +0.094270292457048113 +0.095019866693052749 +0.13163847883447344 +0.13178571502730299 +0.0012683064723409462 +0.00071291147938468916 +0.078160389741476349 +0.078148500461634296 +0.50500961748462447 +0.46850547872077142 +5.514719362475792 +5.5241970683764725 +2.7634332471648131 +2.7269035527356631 +0.15431682191972065 +0.15633961769922194 +0.17507330006901956 +0.17832155485097495 +0.20245062145505605 +0.20506115821413101 +0.58781320839456186 +0.58724967069541878 +0.031993138641189557 +0.031555706671358132 +0.20511940520062361 +0.20420399460264552 +1.3008098136722366 +1.2709975450748072 +0.25335527312776318 +0.22146140988498109 +0.041103963611633765 +0.041032255719912716 +1.4699324856214124 +1.4637460137937297 +1.8376436506043514 +1.8645455094926242 +1.8376469165589682 +1.8596263571104803 +0.2201349357959374 +0.22136953714237334 +0.10066906664416203 +0.10124499733482724 +0.019198410604622681 +0.019942207145073949 +0.028516316302865771 +0.028987144276275689 +0.036001205004132994 +0.036171073938587525 +0.037661059052651852 +0.038709463389537041 +0.021962256405527555 +0.021697751403208732 +0.012462975623782574 +0.012375242148078334 +0.010768151962510962 +0.01034360850974957 +0.0061971170735556419 +0.0057243600781081219 +0.851845979287988 +0.86613076734234995 +0.12152798409937239 +0.12116259328978352 +1.0836260214086533 +1.0856011434495338 +0.00030175185336121985 +0.00029989952409609271 +0.05728956626370843 +0.056539193050478442 +0.054319656091536966 +0.054035473181623835 +0.05728940441967266 +0.056750047140365939 +0.057289390626519672 +0.056767268336683996 +0.034259195224605431 +0.035135804055431714 +0.38148915090123586 +0.38110452300543463 +0.086102870713273744 +0.085837166865821907 3.1562139928618021e-30 3.1562139928618021e-30 -0.0034861995920553966 -0.0029992519689337471 -3.1677695725281255e-30 -1.2732708048332894e-29 -1.9740781929969167e-31 +0.0034860162196599541 +0.0029990916713624354 +1.2325951644078309e-32 +1.2671078290112502e-29 1.9740781929969167e-31 +7.896312771987667e-31 1.9798559828300785e-31 1.9798559828300785e-31 -0.00090610053253868412 -0.000903399574754939 -1.9259299443872359e-34 +0.00090609355584781706 +0.00090339271914250004 1.9259299443872359e-34 1.9259299443872359e-34 1.9259299443872359e-34 -0.00090876436395945931 -0.00090339957414210662 -0.24155171772217593 -0.24271713007876067 -0.0029657531180686146 -0.0044375607269470036 -0.015342949112477404 -0.01348224319499244 -0.0054492325601215247 -0.0046095836982332026 -0.01486058494605624 -0.017020703876281268 -0.029037786996659185 -0.028202106535581476 -0.0064671621285548424 -0.0068290160268569162 -0.17520418264924595 -0.17889510661997535 -1.1401038957162022 -1.1494500292628442 -0.0044172742208171637 -0.0045603040457376431 -0.11535264158643917 -0.11795952355144391 -0.0028188524624426742 -0.0028342028226287313 -0.0067327110160213567 -0.0067635351951383987 -0.14703430063867659 -0.14660665198148315 -1.2889436252359978 -1.2964455201807235 -14.991404178762776 -14.917646331646601 -1.2634100435180267e-29 -1.2634100435180267e-29 -7.8886090522101181e-31 -7.8886090522101181e-31 +7.896312771987667e-31 +0.00090875721160419256 +0.00090339265787726659 +0.24155165263932021 +0.24271706446610117 +0.0029654221046543439 +0.0044371465034269732 +0.015342471105311796 +0.01348185706599395 +0.005449203283631833 +0.0046095740972933574 +0.014860571640957925 +0.017020660366994553 +0.02903775550221345 +0.028202087898531982 +0.0064671516305345629 +0.0068289977012555327 +0.17520449147956635 +0.17889542918936868 +1.1401055742680835 +1.1494521085430132 +0.0044173197089566038 +0.0045602493719361682 +0.11535237656206544 +0.11795922988673828 +0.0028187369851003495 +0.0028340761480721518 +0.0067319832660693371 +0.0067627784385408717 +0.14704341373493721 +0.14661572824674876 +1.2889435859452087 +1.2964453033090237 +14.991383553918126 +14.917629422482641 +1.2325951644078309e-32 +1.2325951644078309e-32 +7.8905349821545053e-31 +3.1562139928618021e-30 diff --git a/datafiles/test_validation/case_ACTIVSg200.m/Gl_valid.txt b/datafiles/test_validation/case_ACTIVSg200.m/Gl_valid.txt index d59990a7..fcbb97e9 100644 --- a/datafiles/test_validation/case_ACTIVSg200.m/Gl_valid.txt +++ b/datafiles/test_validation/case_ACTIVSg200.m/Gl_valid.txt @@ -399,493 +399,493 @@ 0 0 0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 +-4.4942328371557893e+307 diff --git a/datafiles/test_validation/case_ACTIVSg200.m/Hess_valid.bin b/datafiles/test_validation/case_ACTIVSg200.m/Hess_valid.bin index 1170318a..7d56bc8b 100644 Binary files a/datafiles/test_validation/case_ACTIVSg200.m/Hess_valid.bin and b/datafiles/test_validation/case_ACTIVSg200.m/Hess_valid.bin differ diff --git a/datafiles/test_validation/case_ACTIVSg200.m/Jeq_valid.bin b/datafiles/test_validation/case_ACTIVSg200.m/Jeq_valid.bin index dbae8c0f..46d5da5f 100644 Binary files a/datafiles/test_validation/case_ACTIVSg200.m/Jeq_valid.bin and b/datafiles/test_validation/case_ACTIVSg200.m/Jeq_valid.bin differ diff --git a/datafiles/test_validation/case_ACTIVSg200.m/Jineq_valid.bin b/datafiles/test_validation/case_ACTIVSg200.m/Jineq_valid.bin index 3cb19748..6bf1732c 100644 Binary files a/datafiles/test_validation/case_ACTIVSg200.m/Jineq_valid.bin and b/datafiles/test_validation/case_ACTIVSg200.m/Jineq_valid.bin differ diff --git a/datafiles/test_validation/case_ACTIVSg200.m/Lambda_valid.txt b/datafiles/test_validation/case_ACTIVSg200.m/Lambda_valid.txt index bfb66dc6..22a9453f 100644 --- a/datafiles/test_validation/case_ACTIVSg200.m/Lambda_valid.txt +++ b/datafiles/test_validation/case_ACTIVSg200.m/Lambda_valid.txt @@ -1,891 +1,891 @@ 890 -685.31458123204459 -1.0862008296050825 -685.37431070619107 -1.103187074470575 -694.86888854762685 -0.0064505331187552726 -694.88081850442995 -0.0098195965895053802 -673.73949335125405 -0.10823254029600178 -673.80391439163191 -0.12656098768498997 -687.85335519966418 -1.8580128620108773 -688.03783222744084 -1.9107458571090168 -686.70142076355637 -1.5664589139787084 -687.00628845082599 -1.65378691604788 -686.88473774917247 --2.3695919653587065 -686.88654955707455 --2.3690484090468762 -686.90267882458147 --2.3644645140224791 -685.67287024967538 --1.7485004547851828 -685.83460528338617 --2.2186983899860233 -686.11741863839802 --2.1377217771597188 -689.37523377243974 -0.86353534179144342 -689.37955620803916 -0.86475303652581215 -689.38001525435061 -0.86490157969043657 -689.38374334645516 -0.86594541728622743 -689.40985633359492 -0.87337951412911019 -687.85553146758696 --2.3871130358697066 -687.86561029099596 --2.3842533953468066 -687.87472400869876 --2.3816739228710109 -674.48171320365316 --1.5787954136040006 -674.4911072504508 --1.576081239798947 -687.65943599335446 --2.6808642727247136 -687.67513292705007 --2.6763492771166382 -685.2843763254599 -1.3850554570339351 -685.77917779553979 -1.5268767459767258 -679.83562899291894 -0.86513781728383965 -679.83965968801226 -0.86632338521402996 -679.87613286978399 -0.87671889808369918 -692.33971356047914 --0.31184182450885312 -692.48480106697718 --0.27036751005215753 -681.80010295043064 -0.02869369039967563 -681.82317408814015 -0.035287865897724889 -682.03416430504114 -0.095648898675682825 -696.57291094483321 -0.78537301476503474 -696.58567892533563 -0.78900386200287798 -685.80974764659265 --7.2364721261621812 -698.52799756818422 -0.40691008965910969 -681.81884351015094 -1.3742583659575165 -696.58737791742112 -0.5800184387438343 -673.63732015164658 --0.25851634559074754 -673.62274283329157 --0.32497602039601725 -688.46890627996299 --1.1217425572042301 -675.92220584966844 -0.16467016150275721 -675.48948006238311 --6.261666645543779e-07 -675.57596664168909 --3.0208089564531547e-07 -675.48948005655859 --6.2222409802524477e-07 -675.57596663625179 --3.0325536626648361e-07 -675.2464246951439 --5.6689557380075261e-07 -689.50134301740241 --0.89781310206620635 -674.35212841101554 --0.23639054438185919 -673.71433532342064 --0.13438299948813368 -696.31440953265371 -0.29043590465303898 -680.90048230727518 --1.2492313935521926 -687.80724883168227 -0.54448246337238437 -684.23652155506079 -0.46207067046794237 -674.47407787047598 --0.001123723737727312 -699.26227998251568 -0.67304984461387818 -687.76583827867591 --3.7445924756313502 -670.27438986797688 --0.1711546916096171 -669.00088252554303 --6.9431103194215097e-08 -687.20622068325986 --1.3269424804129872 -686.8579689079246 --1.1853984444278238 -686.55826139894134 --1.0483135993487898 -686.78128242316677 --1.1505170268406479 -686.54825453649244 --1.0477762242809967 -686.86756006881183 --1.1867384236146175 -686.86635768437918 --1.1864428024870441 -686.54016819012031 --1.0474057540087107 -679.31272790552384 -0.4702705496664914 -683.37466063036675 -0.22865625557860766 -682.83593849501813 --8.0856450021955396e-07 -682.7014786411894 --1.8307843998672787e-06 -683.37466062229771 -0.22865608425654937 -683.37466062028045 -0.22865599324544009 -684.10320840912595 --6.7691806774156351 -678.91603061672424 --1.7512893004688599 -679.0096170703265 --1.5260684697736342 -678.85136679143704 -0.19363329681882163 -679.60532755226018 -1.1718751636544424 -694.64908669205977 -0.86100164441883609 -687.34116398489243 -1.719631652586191 -695.36453680656973 --0.12795899595040341 -696.14164758794982 -0.01629076698462259 -680.63126973817361 --1.3117869597638949 -680.00249821361115 --1.0622970886641321 -680.21822185160784 --1.1572529429905616 -680.63126971760198 --1.3117873409355831 -686.73487168586416 --3.2420798649434452 -686.13792106588244 --2.9896546543486631 -680.90733858664771 --3.2180128807433563 -676.95932640943693 --1.6205140270302307 -689.23250380563195 -0.75787950098205248 -684.15279676986108 -0.84770026634107121 -684.33790121063032 -0.93116479563148147 -685.00116025011005 --9.8444238536660329 -686.72350689560676 -1.5857144644833348 -673.06012244354906 --0.062156496103178471 -673.72895710184775 --0.076270189541431457 -671.4440446102675 --3.6078260858507362e-08 -671.35109590940863 --1.2935137609331253e-09 -675.84377079451065 -0.093400500513622212 -679.41210532601849 -1.4694167102826288 -684.78060899013826 -0.39722126909009253 -685.60503486067807 -0.67404743305641479 -686.74766248478136 -1.5784888154587384 -686.21707570204546 --6.2794924438276398 -674.80159801689138 -0.20542785821361068 -677.35530759025119 -0.94346067903750808 -673.83888066726411 -3.5352061218556723e-05 -672.84743650433472 -2.0644272925099745e-07 -683.55695197623709 -0.94549032298247437 -684.14557936087022 -1.099556138791342 -684.75336193986186 -0.93386694730639008 -688.35497808557307 -1.0125688708830169 -692.4728622212067 -0.85240347374508463 -675.04530969646498 --0.7953784134669748 -674.81109463243047 --0.77272496663540913 -681.60110817528187 -0.25974225742184637 -682.57607882590605 -0.57184775730907678 -679.58485582206026 --5.588391178524435e-08 -680.93307422052578 --1.8447258283159666e-08 -681.14953467535452 -1.7747698839110342e-09 -675.53913988978002 -0.2487679004458439 -676.99989464317457 -0.95529444193287016 -677.59980639153332 -0.23631599865306208 -686.95009831731647 -1.5937450770884003 -684.81483027741479 -1.6923633925626602 -680.22679641251113 -0.10621620517937716 -680.2230118879512 -0.11485397195083484 -679.5637867848759 --1.4380546251622773e-08 -679.56378678686656 --1.4745512465829493e-08 -693.74871024728634 --0.15476761202328015 -681.93326499527564 --0.97204489014224982 -686.78870457763776 -0.14864290753166165 -683.52594431833757 -0.93299961147640254 -686.84844101458282 -1.5853785959003641 -687.47393309466077 -1.7760039101675686 -682.83674709747856 --3.2052554141640042 -682.16788276168495 -0.7182468799835765 -698.58933092189034 -0.58022499697427476 -675.07469291920404 -0.10712616896544302 -672.44232380773269 -1.2254897740541447e-07 -689.24330622911316 -2.2033346106413587 -694.03105685456853 --0.18230655401198939 -694.52057471257285 --0.21659873904342056 -693.58611595641923 --0.00032179648610663884 -693.33243665705209 --4.6532173315732141e-07 -692.49349206164368 --2.2372005912929703e-07 -693.33243665137252 --4.9127895848835268e-07 -693.33243665087991 --4.9347026573343963e-07 -681.32555211327167 -0.21753330235846433 -681.39183652131544 -0.22143343691553471 -687.51585512086081 --1.9639603433631201 -697.33563439016416 -0.5514412014294805 -698.93096529298782 -0.28648232976008103 -698.93096529236891 -0.28648229401525699 -682.83203213735192 -0.77203936484916813 -685.73497914581867 --6.3804806404363461 -685.73497913382005 --6.3804808056575464 -685.73497913499989 --6.3804810814604913 -685.73497912188861 --6.3804811990320403 -685.45146608140828 --6.2743793003768209 -685.73497911950278 --6.3804813582561275 -685.73497912188884 --6.3804812200001262 -685.3115164010386 --6.219913562851735 -681.16220376126876 --0.34158314765667308 -682.76028909710294 --4.7423908407625612 -685.45435375519867 --6.3201171530596367 -682.71782595995364 --6.5788724644276506 -686.17895602849376 --6.2566227643765897 -697.51207445416514 -0.34600550375096306 -679.03805648256889 -0.15650869565797754 -681.88832738090889 --3.8150537467697134 -682.54712371944447 --5.8661631458882271 -683.78444975743832 --5.3285499961713674 -698.74553990454012 -0.10918218038442939 -698.03745337598832 --4.0817271398008735e-07 -698.29215555806366 --2.0015639912214231e-07 -686.99631259851844 --7.2295315099121211 -697.56083996689711 -0.35572338049345986 -681.72610617329553 -0.34296449931183304 -672.30783028901976 --0.3082259131480502 -674.81606591309253 --1.3266600401439383 -671.00000000143814 --0.11479073517698846 -681.12790605364626 -0.28941429099239552 -686.36937683658994 --4.346112860702485 -679.95258919413425 -1.4672270982759381 -686.33464393226564 -1.4511237469112246 -696.81781945582634 --0.77705424082368035 -680.13134136965573 --1.1975918310852236 -680.13134136725091 --1.1975918817495761 -680.13134136725091 --1.1975919926730991 -685.20759000254645 -0.71768577167009351 -679.68258506983216 --3.5425138486875087 -693.48569322342473 -0.81433354690037718 --3.5542477205191114e-06 --3.5549930237784847e-06 --1.3811125383394679e-06 --1.3204766351065577e-06 --1.2127689028441593e-07 --1.2112679162997631e-07 --4.6366105700550517e-07 --4.5798311248620278e-07 --6.7617790470548325e-05 --6.7620842884552187e-05 --1.1589668920263004e-06 --1.1662169317953017e-06 --9.1570996020704323e-07 --9.0964638652965295e-07 --3.0680221295572996e-06 --3.0687209344082913e-06 --2.7892226169250678e-07 --2.7998103243140673e-07 --1.6530537155045141e-07 --1.6464284423811435e-07 --3.2365486776791625e-07 --3.2387890629753865e-07 --1.2953551612797176e-06 --1.3193265867959985e-06 --3.2542300191449583e-07 --3.2715472487406727e-07 --1.1750281870084913e-06 --1.1331957940038436e-06 --8.0745645105972765e-08 --8.0891361142301421e-08 --1.2223928512941889e-07 --1.2195553454382029e-07 --0.00015125374088213349 --0.0003136705129130226 --2.2224692931674255e-05 --2.005055199530806e-05 --4.1132924042166618e-06 --4.253994694255714e-06 --0.0021494188531807081 --0.0021494363999893288 --3.0706029748119136e-05 --3.0708212541194081e-05 --9.0535832518119704e-07 --9.5674545327993709e-07 --2.4428250728336253e-05 --0.00010918302472079776 --1.3808694975186423e-06 --1.2467751205507438e-06 --5.3110657969015192e-08 --5.2675880402493469e-08 --1.0044383881882447e-08 --9.8041157545059085e-09 --3.5438004532666361e-08 --3.4653793800807405e-08 --7.0376193718441957e-08 --7.0493009908951348e-08 --0.00038783726129945157 --0.00038784498319057966 --0.00032906024331812904 --0.00032906639841487085 --0.00015299484285725691 --0.00015299957034416783 --9.1674739542798047e-06 --9.1687588476040705e-06 --2.0031818741166841e-07 --1.997963010297762e-07 --3.3902988224372985e-07 --3.3944989175138732e-07 --9.8232727882001015e-05 --9.8236371859369482e-05 --3.3898232560491413e-05 --3.3900410285746618e-05 --2.1759088403238244e-05 --6.402500332042538e-05 --2.432932481914395e-05 --1.2137732555371248e-05 --0.00010686571735690611 --0.00010686941698475232 --7.1953271043603747e-08 --7.1616925280836716e-08 --7.5612678591882827e-08 --7.6286756432066439e-08 --3.5886630400292794e-05 --3.5889107592235924e-05 --1.1364459286684922e-05 --2.4130519020133517e-05 --8.9177724045737866e-05 --1.134376579059282e-05 --2.1876990614034199e-08 --2.2002126740992785e-08 --1.4123987135464999e-07 --1.4126392176733431e-07 --3.798195528386859e-07 --3.847327978484718e-07 --0.00074661258790815685 --0.00074662454886830799 --4.6832778647674769e-06 --4.6841030758709989e-06 --7.516969898700567e-07 --8.0515046634467616e-07 --1.9666779451569481e-06 --1.6859967738284235e-06 --4.3052218951453654e-07 --4.3079150352033865e-07 --1.4698624613619936e-07 --1.4664232731883624e-07 --7.7892201316200594e-07 --7.8682478319388948e-07 --1.528906703938327e-05 --1.5290477453596148e-05 --1.9612714240827894e-07 --1.9631732499278652e-07 --2.1003556879112488e-06 --2.7147558361005853e-06 --2.5714520598683824e-07 --2.5616497351689691e-07 --4.6902288124602782e-05 --4.6904635318415312e-05 --6.4021270313814382e-07 --6.4195291522187799e-07 --2.7942495223501572e-06 --2.8538897912490444e-06 --1.5730787000575045e-07 --1.6021635681916631e-07 --1.1288132796262397e-06 --1.0650441372320983e-06 --2.8567734015649393e-07 --2.7689743172337164e-07 --1.0287592639851674e-06 --1.02703241136708e-06 --1.1578148302406771e-05 --1.4333782609529394e-05 --5.1812534829822781e-07 --5.1709076834075475e-07 --6.4702130681238274e-07 --6.462323694834476e-07 --6.1566110894536716e-07 --6.1108381083037096e-07 --2.0702061276380861e-07 --2.0737480045324392e-07 --3.3172751090793534e-07 --3.5427150269704195e-07 --6.2017831588849215e-07 --6.3528789470353572e-07 --1.4297971525692733e-07 --1.3251105048625132e-07 --2.5527987848615339e-06 --2.4305215291710718e-06 --7.9747714120753659e-07 --8.1537290306390527e-07 --1.3206376573188109e-06 --1.3024516505965153e-06 --1.0429351773186432e-06 --1.051393258660253e-06 --9.9500123050367888e-05 --9.8958149890539661e-05 --9.2866816874919136e-05 --9.2396491027311884e-05 --9.9394719826870477e-05 --9.8779854181869873e-05 --9.2764951172715971e-05 --9.2320120643538423e-05 --2.6788696479248181e-05 --2.6579341090996445e-05 --1.8196378649839129e-07 --1.8240289709844952e-07 --2.7664619273468809e-07 --2.7699221743893215e-07 --4.8362682873256999e-06 --4.8427045834060215e-06 --3.4988878551881475e-08 --3.6058739306909575e-08 --2.3090870291214761e-08 --2.2983076654041942e-08 --4.2322506023506855e-06 --2.3919121830364285e-06 --2.6744514629482787e-07 --2.5350472513086625e-07 --7.5721481182146612e-06 --7.5004060237437268e-06 --1.8643891598779698e-06 --1.872853585879336e-06 --8.5363028635131987e-07 --1.0181606999354209e-06 --1.3696158588350994e-06 --1.1506821283588123e-06 --7.5643014011436738e-06 --6.5153633042798912e-06 --2.0362178850571778e-06 --2.1055359134766468e-06 --1.6392210370446601e-07 --1.6472239903587992e-07 --1.3247896050470259e-07 --1.318075938728964e-07 --1.4456586895030014e-06 --1.4880615178414832e-06 --6.634538689786512e-07 --6.6165605246844467e-07 --4.71378492502896e-06 --6.0502960374112695e-06 --1.4665854701947194e-06 --1.2242033323709698e-06 --1.7012458162650712e-06 --2.838933368164149e-06 --2.0869581820934032e-08 --2.1245041314413147e-08 --9.0933155938796277e-05 --9.1017511951272688e-05 --2.4994645464133634e-06 --2.5385143419781051e-06 --2.5225556050120872e-06 --2.5355622446579826e-06 --2.5070245514566669e-06 --2.5355621640437576e-06 --2.5210255701399035e-06 --2.532270705235857e-06 --2.5221044821274364e-06 --2.5322707050372142e-06 --2.5076566339006657e-06 --2.5277953048744125e-06 --1.0483613267351641e-06 --1.1521692945943589e-06 --9.3723227349673619e-07 --9.5850421005182469e-07 --0.00012395651451464166 --0.00012300742991230975 --0.00036149889592047347 --0.00035775541289411806 --2.1107672227682843 --2.1107672227682843 --2.1107672179932782 --2.1107672179932782 --1.3140417902199118e-06 --1.2818105729745281e-06 --1.0208948691010664e-06 --1.0196971629760583e-06 --1.9657294651553045e-06 --3.0036508379343142e-06 --1.7170946277038714e-06 --1.246831982470667e-06 --1.4749807718532419e-07 --1.4836715470402554e-07 --1.2671635757318707e-07 --1.4234521301595519e-07 --2.3936443607700026e-07 --2.3893911360780819e-07 --5.9601182625132031e-08 --5.9253469947931011e-08 --3.1464900909417639e-07 --3.1572159700746865e-07 --3.6571262016972596e-07 --3.6511090385155188e-07 --3.9568020889814834e-07 --3.9627552968090473e-07 --2.8990182405075868e-06 --2.9992596244237756e-06 --0.00012950514813390982 --8.6256463215629451e-05 --1.5032183948532272e-06 --1.5671561718703007e-06 --4.7463335156657523e-08 --4.7527276302086315e-08 --4.7909627234789626e-08 --4.782832396641165e-08 --3.110329327279958e-07 --3.1243816976313691e-07 --2.3283282564285238e-07 --2.3207078279002243e-07 --4.9490885427069336e-07 --5.135884207598566e-07 --0.00019518870259967825 --0.00019788145913215001 --8.2142016266611837e-05 --8.2484156490132462e-05 --2.1107671033360482 --2.1107671033360482 --4.3647929845523949e-07 --4.8232041923418373e-07 --4.9087065578589504e-08 --4.8665250719052582e-08 --6.0924507563568382e-06 --6.1528999231412756e-06 --2.0703996766344507e-05 --0.00035165824411518659 --2.4831988085094897e-07 --2.4405446826890345e-07 --1.6479010509142227e-07 --1.674323870769276e-07 --2.1361899833672779e-06 --2.2415939535482106e-06 --2.6644099977619444e-07 --2.6735425927580437e-07 --7.343221367645958e-08 --7.4006447340187451e-08 --7.5638169855690811e-08 --7.9151129277821417e-08 --1.3062593122608433e-07 --1.3086933994066184e-07 --3.565395748589663e-07 --3.3853139973869192e-07 --1.1933268834803841e-07 --1.1790573284161534e-07 --9.7654650581542837e-07 --8.4404861923973898e-07 --0.000121528113675018 --0.00015443523016042665 --1.4273712112267288e-07 --1.4250656323923394e-07 --2.0943141026593045e-05 --2.2254919223134318e-05 --1.8711047764273905e-07 --1.8759281185315298e-07 --2.9120182326455068e-08 --2.9063849101124428e-08 --3.9853722882747175e-09 --3.9514538463510805e-09 --3.326538793955314e-08 --3.3330025274831155e-08 --2.8934565946611118e-07 --2.903423065814942e-07 --3.4164102515420562e-07 --3.4251146834083096e-07 --2.6834332937525676e-07 --2.7066665305638805e-07 --1.9287376828533543e-07 --1.9283311544478927e-07 --4.1674316978795669e-06 --4.408296353988803e-06 --2.0245586037279695e-05 --1.072822380625655e-05 --1.4641223156206771e-07 --1.4587296948762905e-07 --1.9220325560428191e-06 --1.9778456268900504e-06 --3.0871869749786422e-06 --3.1557932557309959e-06 --0.00012428581410063174 --0.00045993370518230929 --2.2614154701417365e-08 --2.3130840086552334e-08 --0.00010261747083115068 --0.00010224100949142055 --2.168643692555719e-09 --1.7212882166534902e-09 --7.9922325216414251e-08 --7.9808861057705558e-08 --1.2248251485482063e-07 --1.2265170605631186e-07 --3.6400870225597823e-08 --3.6873495180189681e-08 --3.7547633995776226e-08 --3.8555251276000353e-08 --1.9910114483342402e-06 --1.7204623879754064e-06 --2.1792561042691325e-06 --2.2472724324973134e-06 --2.1950307748461144e-07 --2.1773605385200285e-07 --1.559086644389155e-07 --1.5572939117410102e-07 --1.6637253632261728e-05 --2.9601867886505294e-05 --2.6467320322384563e-07 --2.64714201595728e-07 --4.0450729837647861e-08 --4.3710527710520695e-08 --1.8501559553101251e-09 --1.8418317799561393e-09 --6.0435481508947986e-09 --6.1502588100793176e-09 --1.2906551809406989e-07 --1.2729002311085046e-07 --1.1278818146014989e-07 --1.105826172816004e-07 --9.640678367371217e-08 --9.5071854923647692e-08 --3.4555916597799354e-08 --3.4590411177605421e-08 --6.5845115413071293e-07 --6.675954925769093e-07 --9.8397311858951767e-08 --9.8859485868982216e-08 --1.1961704552963814e-08 --1.2367844162979188e-08 --8.1986463630949948e-08 --9.3988149522438532e-08 --5.0916418918867473e-07 --5.1006319030896065e-07 --1.2906898645900815e-08 --1.2968208384716812e-08 --1.082253908376381e-08 --1.0656248757068106e-08 --1.0822539508674859e-08 --1.0686322433698917e-08 --9.4563385181185898e-08 --9.4028608502211124e-08 --2.0526549212887468e-07 --2.0407221903957285e-07 --1.0951046399201894e-06 --1.0540915661110465e-06 --7.3585384600296598e-07 --7.2383483690460028e-07 --5.8195586175623766e-07 --5.7920126495391403e-07 --5.5611272497793623e-07 --5.409321269799078e-07 --9.5675058705344386e-07 --9.6846698787828795e-07 --1.6892945016932123e-06 --1.7013072285567961e-06 --1.9558633382377321e-06 --2.0363185622875e-06 --3.4017242510763744e-06 --3.6830155788313041e-06 --5.6387904847952802e-11 -7.7300616934818375e-10 --1.6925768776977081e-07 --1.6978173188352756e-07 --1.8063643103891226e-08 --1.8028002629377186e-08 --6.8261920073270016e-05 --6.8716521315750196e-05 --3.4612719735984637e-07 --3.5102638237390426e-07 --3.6628223185635191e-07 --3.6832630393464659e-07 --3.4612717638039372e-07 --3.4963563527673889e-07 --3.4612717458826407e-07 --3.495224918315232e-07 --6.1176873371945082e-07 --5.9639646744153669e-07 --5.0645680085447287e-08 --5.070190174347653e-08 --2.4277708438204327e-07 --2.4353595118827388e-07 --2.1107672662270116 --2.1107672662270116 --6.0502960374102835e-06 --7.0332992708982566e-06 --2.1107672101973232 --2.1107672101973232 --2.1107672227682843 --2.1107672227682843 --2.1107671530692693 --2.1107671530692693 --2.3174528633287774e-05 --2.32441759231857e-05 --2.1107671408043256 --2.1107671408043256 --2.1107671408043256 --2.1107671408043256 --2.3058770561877095e-05 --2.3196705794213841e-05 --8.284140814451035e-08 --8.2420693933122589e-08 --7.112760244255954e-06 --4.7522427648442756e-06 --1.3713905046120575e-06 --1.561257748080772e-06 --3.8691837530350536e-06 --4.5747527800493677e-06 --1.4160477707265469e-06 --1.2357839705142612e-06 --7.2255974434901723e-07 --7.4409997949221289e-07 --3.2594942448058491e-06 --3.0865518740970525e-06 --1.1599640177979836e-07 --1.1350728521030424e-07 --1.4383071969011187e-08 --1.4224968035893142e-08 --4.7741100362538415e-06 --4.6242284260078631e-06 --1.7856171320914236e-07 --1.7451539128132904e-07 --7.4294657964815084e-06 --7.3889040499548792e-06 --3.0842782055368566e-06 --3.0699853210138679e-06 --1.3910553911912279e-07 --1.3952469218525391e-07 --1.4941129775639312e-08 --1.4845637959280105e-08 --8.7722263792708163e-10 --8.8516676977643763e-10 --2.1107672452836677 --2.1107672452836677 --2.1107672452836677 --2.1107672452836677 +685.31456837708481 +1.086204891282698 +685.37429969704817 +1.103191473384898 +694.86887468781094 +0.0062774073975816226 +694.88080934035463 +0.0096476577324609812 +673.73951446512433 +0.1082250348210726 +673.80393706850805 +0.12655372037959184 +687.85335129408156 +1.8580179804866201 +688.03783139200834 +1.910751711273893 +686.70141179299151 +1.5664631078264943 +687.00628516884456 +1.653792542987043 +686.88474783151662 +-2.3697423722884059 +686.88658540213578 +-2.3691914092942787 +686.9026921121432 +-2.3646143320106772 +685.67287390422359 +-1.7486398754866757 +685.83460706775247 +-2.2188351441488186 +686.11742477017253 +-2.1378576620658216 +689.37521113426635 +0.86343927357800321 +689.37954462109769 +0.86465986867477629 +689.38000279399967 +0.86480825464920763 +689.3837276964781 +0.86585115035481541 +689.40983578639828 +0.87328382920786973 +687.85554696749148 +-2.3872889010947911 +687.86563137291807 +-2.38442791982497 +687.87474286074166 +-2.3818490670141208 +674.48174826258412 +-1.5787101762166194 +674.49114813836798 +-1.5759945772231623 +687.65945138273241 +-2.6810294292382029 +687.67515175902975 +-2.676513771335522 +685.28436233728917 +1.3850615236484354 +685.77917361474783 +1.5268854571291697 +679.83561779516094 +0.86517058865190977 +679.83966373576311 +0.86636041474337155 +679.87612351637404 +0.87675198373441321 +692.33971246295653 +-0.3120257161956082 +692.48480173482619 +-0.27055105810939462 +681.80008432624186 +0.028689474363367835 +681.82315796258206 +0.03528410130784581 +682.03414924696665 +0.095645433052884823 +696.57288727306673 +0.78522977706050479 +696.58565922982382 +0.78886163010908283 +685.80985438286314 +-7.2359802989662869 +698.5279634445069 +0.40679727602458277 +681.81883771784237 +1.3742961124986377 +696.58734971074875 +0.5799208201492061 +673.63730995645881 +-0.2584887937391121 +673.62273534188353 +-0.32494743230012563 +688.4689225409204 +-1.1219218985444466 +675.92222273885011 +0.16465656395848563 +675.48948885130449 +-6.2609334697466556e-05 +675.57597576061823 +-3.0220157633786729e-05 +675.48948826506455 +-6.2220876208962628e-05 +675.57597521767946 +-3.0335981182631783e-05 +675.24643630253263 +-5.6691322581965497e-05 +689.50135471345118 +-0.89799349358223701 +674.35211462240682 +-0.23634296509785088 +673.71431923087312 +-0.13436034191835813 +696.31438947799359 +0.29027424018427023 +680.9004680842072 +-1.2492306700022862 +687.80725529261736 +0.5444854640157013 +684.23649487926582 +0.46204990660765538 +674.47406839953135 +-0.0011020748118095287 +699.26225080802419 +0.67291107611047396 +687.76589014354215 +-3.7445355311699742 +670.27441871794008 +-0.17114674059284907 +669.00091073279634 +-6.9425875725178527e-06 +687.20624294765878 +-1.3271185982840346 +686.85798482709822 +-1.1856246916838018 +686.55829002487394 +-1.0485198981107846 +686.78130549728473 +-1.1507079878190229 +686.54828108814195 +-1.0479796711767879 +686.86758252884783 +-1.1869263354073305 +686.86637995398223 +-1.1866303170978743 +686.54019290435212 +-1.0476065306625786 +679.31274337898083 +0.47026482070371345 +683.37463262802862 +0.22863324075903971 +682.83589639946263 +-8.0882346360269813e-05 +682.70141592652965 +-0.00018321958745197458 +683.3746318212269 +0.22861611076715888 +683.37463161952644 +0.22860701083079904 +684.10329315986769 +-6.7687634569687569 +678.91604301547352 +-1.7511915356280923 +679.00962966062309 +-1.5260039677597246 +678.85133527219477 +0.19363669233359257 +679.60531998005979 +1.1719240861439455 +694.64906428252937 +0.86087026962302959 +687.34115819259989 +1.7196365083841092 +695.3645079198883 +-0.12825282299337329 +696.14160800041589 +0.015990830176840658 +680.63127336392495 +-1.3117762385673088 +680.00248574676243 +-1.0625713022727239 +680.21821746564717 +-1.1573357738187509 +680.63127130683267 +-1.3118143546262921 +686.73489387676818 +-3.2421760324006099 +686.1379435785384 +-2.9897807293403136 +680.90733261327466 +-3.2180169466357165 +676.95934300663498 +-1.6204180297735074 +689.23248136962104 +0.75783133460207208 +684.15277568235047 +0.84770602710677678 +684.337880873372 +0.93117123018517234 +685.00128781570027 +-9.8437759611741864 +686.72349767662934 +1.585720285910474 +673.06010474712116 +-0.062129855298826198 +673.72894207439663 +-0.076251738416929671 +671.44401925341833 +-3.6070104131348831e-06 +671.35107179965564 +-1.2894865670238354e-07 +675.84375526612928 +0.093407383202979824 +679.41210266410246 +1.4694727266308059 +684.78058799908933 +0.397197493372691 +685.60501115372392 +0.67398915406271764 +686.74765779016161 +1.578491656479573 +686.21717623183656 +-6.2790560669229096 +674.80157799295534 +0.20552830170452827 +677.35529780316506 +0.94352166276260985 +673.83878728214256 +0.0051554983464614573 +672.84740022556548 +2.0648149398498251e-05 +683.55693223889455 +0.94549500039287682 +684.14556365529256 +1.0995659687104375 +684.75334747119109 +0.93386146703113393 +688.35498289637064 +1.0125716251561614 +692.47284002828042 +0.85228647110307165 +675.0453175348274 +-0.79536469673795718 +674.81110010048087 +-0.77269596626561265 +681.60107900493892 +0.25975039830308216 +682.5760548520941 +0.57185538253679402 +679.58481671638162 +-5.5885012299662639e-06 +680.93304033426421 +-1.8450089416203822e-06 +681.14950222911875 +1.7744360015251314e-07 +675.53912286999832 +0.24883423984956438 +676.99988699718745 +0.95534835166074805 +677.59979108262598 +0.23631761050386232 +686.95009529254457 +1.5937429056719374 +684.81482662116355 +1.6923882907103052 +680.22676342041359 +0.10622279994068545 +680.22297965765529 +0.1148568087509316 +679.56375069382273 +-1.4380818498815067e-06 +679.5637508942458 +-1.4745495418304993e-06 +693.74870164726792 +-0.15494676105349856 +681.93327570859867 +-0.97201103649156351 +686.78871207548195 +0.14864945827265133 +683.52592341974798 +0.9330027740243958 +686.84843463318725 +1.5853832946457427 +687.47392358093907 +1.776012362333842 +682.83679726659352 +-3.2050285406816328 +682.16786783756811 +0.71824311899098547 +698.58928328027412 +0.57991517755782318 +675.07465011375859 +0.10715331691935326 +672.44225820761051 +1.2253194433530882e-05 +689.24330842456766 +2.2033404456388106 +694.0310328942287 +-0.18261200055813054 +694.5205403964784 +-0.21690604686805726 +693.58625237667957 +-0.010012902795595482 +693.33241368206689 +-4.6645025818310582e-05 +692.49346885763862 +-2.238869633714449e-05 +693.33241311984818 +-4.9249820193079153e-05 +693.33241307095068 +-4.9469710639309344e-05 +681.32552164934657 +0.21753931644027594 +681.39180669429891 +0.22141738632692071 +687.51587106863087 +-1.9641287919468857 +697.33561050391859 +0.55129224285444756 +698.93093119925413 +0.28635353318020124 +698.93093113737189 +0.28634995879384539 +682.83201702853091 +0.7720366555516297 +685.73507709811304 +-6.3800330499220443 +685.73507589824919 +-6.3800495719932151 +685.7350760162326 +-6.380077152199874 +685.73507470511015 +-6.3800889093179958 +685.45155458687327 +-6.2739569859456834 +685.73507446651161 +-6.3801048316764 +685.73507470511015 +-6.3800910061195495 +685.31160029209093 +-6.2195088108822141 +681.16221802958967 +-0.34156146262388731 +682.76035205668052 +-4.7421439754202117 +685.45444261590001 +-6.3197014231195938 +682.71790555129996 +-6.5784521162277905 +686.1790483730947 +-6.2562017641836087 +697.51203045427633 +0.34570126157989112 +679.03803566559441 +0.1565301990118301 +681.88837287322474 +-3.8148513082389224 +682.54719684631084 +-5.8657419285193724 +683.78452224041462 +-5.3282526419925524 +698.74550287959062 +0.10906105955773089 +698.03741296801502 +-4.0836198124317503e-05 +698.29211536912476 +-2.0033755393231442e-05 +686.99641239085543 +-7.2291420073230093 +697.56079470329064 +0.35541180904160879 +681.72607825320733 +0.34294304197148257 +672.30783196422612 +-0.30821652655554566 +674.81607418888814 +-1.3265840306423156 +671.00000014378668 +-0.114788088579303 +681.1279215427262 +0.28942066094562691 +686.3694254371502 +-4.3460449914557628 +679.95258686855686 +1.4672804264671921 +686.33463470573759 +1.4511280902308166 +696.81777989659565 +-0.77730690843965056 +680.13135348463084 +-1.1975472172524488 +680.13135324413577 +-1.1975522835149233 +680.13135324413577 +-1.1975633754889627 +685.20757680813006 +0.71767054976622902 +679.68263595199562 +-3.5423235218307307 +693.48567049644714 +0.81425966904155411 +2.1232809305781285e-06 +2.1232783028352456e-06 +4.3310909634537164e-07 +4.3317106909096612e-07 +4.4711237136599649e-07 +4.471313502210877e-07 +4.3577981023910639e-07 +4.3582964766481689e-07 +2.1114050230836762e-06 +2.1114049933408448e-06 +4.3336783197884058e-07 +4.333578423291846e-07 +4.3379514358275802e-07 +4.3380870654382714e-07 +2.125267293965809e-06 +2.125263987539943e-06 +4.3844171588034736e-07 +4.3841646151727043e-07 +4.4302972836041753e-07 +4.4307501559122279e-07 +2.2478226442096723e-06 +2.247728618794926e-06 +4.3319846367850581e-07 +4.3317231450421832e-07 +4.3748720879543098e-07 +4.374568996021351e-07 +4.3334584521377504e-07 +4.3340441394379066e-07 +2.6292279459259931e-06 +2.6284000101322023e-06 +4.4699181919190774e-07 +4.4702717373980182e-07 +4.3177155521289494e-07 +4.3176517327436267e-07 +4.3184311545297136e-07 +4.318522109739249e-07 +4.3221247928219921e-07 +4.321974876714794e-07 +2.1107668509457517e-06 +2.1107668507765378e-06 +2.112197087432249e-06 +2.1121969842953752e-06 +4.3381838355247111e-07 +4.3370779814921633e-07 +4.3183554996297962e-07 +4.3177630533572819e-07 +4.3310929526293891e-07 +4.3325449365513635e-07 +2.448450447367177e-07 +2.4493002731013275e-07 +1.4700676032556962e-07 +1.4740119995988385e-07 +1.3514915960738462e-07 +1.3525725213157359e-07 +2.6952716538514704e-06 +2.6944407220084154e-06 +2.1108609993282088e-06 +2.1108609970410416e-06 +2.1108815186633332e-06 +2.1108815161307834e-06 +2.1110373312311868e-06 +2.1110373222331982e-06 +2.1156060381291287e-06 +2.1156053570750424e-06 +4.4106177346669369e-07 +4.4108605422613744e-07 +4.3725736591210753e-07 +4.3725055896827014e-07 +2.1111996720983446e-06 +2.1111996552744263e-06 +2.1120604499403506e-06 +2.1120603655096032e-06 +4.3184490935691073e-07 +4.3178834814222013e-07 +4.3183585819746942e-07 +4.3191282681998649e-07 +2.1111630327928855e-06 +2.1111630183602305e-06 +4.5757700832287175e-07 +4.5769739215743838e-07 +4.5633578082302757e-07 +4.5612000294387332e-07 +2.1119876260703199e-06 +2.1119875403776102e-06 +4.3192327599122574e-07 +4.3183649112229616e-07 +4.3178013474170538e-07 +4.3192357648948374e-07 +3.3942575567429686e-06 +3.3908860449442247e-06 +4.4494673782811859e-07 +4.4494449792474962e-07 +4.366670973774966e-07 +4.3660443727838832e-07 +2.1108057968705568e-06 +2.1108057959145717e-06 +2.1202592201465902e-06 +2.1202575442620457e-06 +4.3423931621927381e-07 +4.3407467600384981e-07 +4.3270718010078686e-07 +4.3286499054333216e-07 +2.2139853996621659e-06 +2.2139211663458457e-06 +4.4443216296444815e-07 +4.4446183026878337e-07 +4.341526407401223e-07 +4.3412861167316819e-07 +2.1136601854168949e-06 +2.1136599166201535e-06 +2.3353400184539618e-06 +2.3351273070140137e-06 +4.3264690937225791e-07 +4.3244601619044206e-07 +4.390073351925725e-07 +4.3903505988408086e-07 +2.1116960418255589e-06 +2.1116959942898366e-06 +4.3467114177440683e-07 +4.3466325463944465e-07 +4.3242643631227723e-07 +4.3241248758860623e-07 +4.4360179727614723e-07 +4.4338712605126196e-07 +4.3341086000966254e-07 +4.3350974554679714e-07 +4.3828372342246942e-07 +4.3849050002652348e-07 +4.3357140442443328e-07 +4.3357445802061737e-07 +4.3192025915348111e-07 +4.3188929821067333e-07 +4.3535722643571083e-07 +4.3536442151419537e-07 +4.3464052377141829e-07 +4.3464404497486926e-07 +4.3478725616159365e-07 +4.3480994302956136e-07 +8.5728423714856982e-07 +8.5722841876531755e-07 +1.308712347511019e-07 +1.3083863594152421e-07 +1.3063291699001549e-07 +1.3062640443074164e-07 +1.3154759422850648e-07 +1.316414775757974e-07 +4.3248955010336135e-07 +4.3252629553702188e-07 +4.3409698751292147e-07 +4.3404567199287023e-07 +4.3317091966357885e-07 +4.3319063318498532e-07 +4.3354679910816404e-07 +4.3353241614398937e-07 +2.5336457097605408e-05 +2.5336808665624341e-05 +2.5696430481464304e-05 +2.5696790383394864e-05 +3.5874550517150715e-05 +3.5875350705784113e-05 +3.5883734133196517e-05 +3.5884397745319811e-05 +1.7046205307130474e-05 +1.7047048843622538e-05 +4.4199915918503295e-07 +4.4197453864479851e-07 +4.3849670714002655e-07 +4.3848828989632332e-07 +8.259030357627159e-07 +8.2590116761370576e-07 +1.3521049535166021e-07 +1.3506691922496774e-07 +1.3769724411649533e-07 +1.3773144176303935e-07 +1.3039898821572178e-07 +1.3042990743593934e-07 +1.3099441501122381e-07 +1.3102937501325166e-07 +4.3200544058745535e-07 +4.3200779525472235e-07 +4.3275919988002676e-07 +4.3275468990498458e-07 +4.3394337327606057e-07 +4.3359045628069689e-07 +4.3312046948613001e-07 +4.3337945963428509e-07 +4.3200570043119179e-07 +4.3204538735030742e-07 +4.3267482925144302e-07 +4.3264468049926163e-07 +4.4312465091165049e-07 +4.4306950413665501e-07 +4.4581700423044795e-07 +4.4588845721717066e-07 +4.3304881837500158e-07 +4.3301207542440686e-07 +4.3456916611899447e-07 +4.3457679677566295e-07 +4.3215471753817723e-07 +4.3206735346314376e-07 +4.3303037528276664e-07 +4.3328204895068992e-07 +4.3285502147369996e-07 +4.3241587783929618e-07 +6.8937542233368017e-07 +6.8722725479836978e-07 +2.3513426240436775e-05 +2.3513370212235647e-05 +4.0236372971899387e-06 +4.022672527691281e-06 +4.3182566322640736e-06 +4.317890217588849e-06 +4.3186990283695462e-06 +4.3178901130817918e-06 +4.6474131916807636e-06 +4.6470465310675619e-06 +4.6473778702807331e-06 +4.6470465307337412e-06 +5.0953674694127786e-06 +5.0945755191476778e-06 +4.3353742968772849e-07 +4.3337721666860884e-07 +4.3374837240609459e-07 +4.3370423530199672e-07 +3.5849072871714422e-05 +3.5849868058310795e-05 +0.00038956553023377082 +0.00038960849642453418 +4.9958776444415563e-06 +4.9958776444415563e-06 +5.4733782922699092e-06 +5.4733782922699092e-06 +4.3317799691810817e-07 +4.3321366908661936e-07 +4.3358538268859192e-07 +4.3358752282851645e-07 +4.3270765854341027e-07 +4.3237992738598583e-07 +4.3284498689554267e-07 +4.3325448863752064e-07 +3.4543036220791798e-07 +3.4538513754695611e-07 +1.3170019274751407e-07 +1.3155293303569075e-07 +4.3954542308039926e-07 +4.3955927345509578e-07 +4.628770342734061e-07 +4.63057735448051e-07 +4.3768325798548604e-07 +4.376631394963698e-07 +4.3685635520994878e-07 +4.3686475092584167e-07 +4.364703797999586e-07 +4.3646330923657828e-07 +4.324023250524514e-07 +4.323808311249037e-07 +4.317736265494216e-07 +4.3178084518276638e-07 +4.3299945413132712e-07 +4.3294885571586026e-07 +1.785335407171757e-07 +1.7852515480372436e-07 +1.3390432868471823e-07 +1.3391034385094186e-07 +4.3775212088757398e-07 +4.3772517600749774e-07 +4.3976369107618634e-07 +4.3978995684559156e-07 +4.3552569707196301e-07 +4.3538872374056473e-07 +0.00028956363418288373 +0.00028950692700125053 +2.0664658807478224e-05 +2.0664444350218764e-05 +1.6939101293887749e-05 +1.6939101293887742e-05 +4.3602985461512302e-07 +4.3562401364230601e-07 +4.6945015209561957e-07 +4.6977184493716718e-07 +5.5225461993236543e-06 +5.5220632423889426e-06 +4.3184926976114168e-07 +4.3176453163747802e-07 +4.3926479447774379e-07 +4.3939589149050773e-07 +4.430649131151566e-07 +4.4288673310380111e-07 +4.3263196927422022e-07 +4.325909311472206e-07 +4.3875456978962909e-07 +4.3873068074652856e-07 +3.5320116022234015e-07 +3.5308139571801941e-07 +1.3260555488591529e-07 +1.3250589469018698e-07 +4.4601603021739812e-07 +4.4598956952616047e-07 +4.3698748325588211e-07 +4.3726551271875274e-07 +4.4736202758206357e-07 +4.4755035675320015e-07 +4.3366824410130358e-07 +4.3396790599967992e-07 +4.3177456997727989e-07 +4.3177130138501069e-07 +4.4480869387676697e-07 +4.4482976736313843e-07 +4.3184824799814086e-07 +4.3184300143722667e-07 +3.4379535356418263e-07 +3.4377969561875686e-07 +1.7112506944714906e-06 +1.7119309031369754e-06 +4.8336451554567168e-07 +4.841511718685214e-07 +1.3546108475274776e-07 +1.354512304539923e-07 +4.3820110058998493e-07 +4.381790009013124e-07 +4.3721538001818296e-07 +4.3720152164239469e-07 +4.3870501930268328e-07 +4.3864543028913149e-07 +4.4142052933271047e-07 +4.4142256298593303e-07 +4.3220658167512561e-07 +4.3218213971509123e-07 +4.3185131643298281e-07 +4.319330038084783e-07 +4.4448163858711319e-07 +4.4452859176126503e-07 +4.327292071035832e-07 +4.3270183586163012e-07 +4.3236312674583263e-07 +4.3234999780738918e-07 +4.3177422961969205e-07 +4.3176328328055245e-07 +1.8533996700899843e-07 +1.8505160013459209e-07 +5.3040113868172521e-05 +5.3041102410237757e-05 +9.57957281509115e-07 +9.7627332664444965e-07 +1.3248518536559755e-07 +1.324882016215014e-07 +4.4696164031850185e-07 +4.4694072063611896e-07 +2.4955703164024081e-07 +2.4936570162705202e-07 +1.348806686384719e-07 +1.3476276812858056e-07 +4.3269559052820588e-07 +4.3284283227629437e-07 +4.3261472913878297e-07 +4.3258882755576819e-07 +4.4024941175305276e-07 +4.4031825819938668e-07 +4.4370800149584938e-07 +4.4372173637055172e-07 +4.3187128373758079e-07 +4.3182220823639464e-07 +5.3818735300663159e-07 +5.3818572171937764e-07 +1.3455683940341085e-07 +1.342443461058409e-07 +1.9771552799728354e-07 +1.9789124993734261e-07 +1.5944374961015354e-07 +1.590048768663554e-07 +7.7154749594859004e-07 +7.7211842469119075e-07 +7.7744640156099758e-07 +7.7837771270502912e-07 +7.8536618039296046e-07 +7.8612980194814865e-07 +1.3527109694514837e-07 +1.3526621029479244e-07 +1.3061698869307906e-07 +1.3061345196979179e-07 +4.5066995530371589e-07 +4.5058188117267317e-07 +4.2646629491300452e-07 +4.2391266032578153e-07 +1.3243163899844105e-07 +1.3216708415826944e-07 +4.3542053797505558e-07 +4.3541409661799364e-07 +1.452478160395148e-07 +1.4518599112273198e-07 +6.6350302346461865e-08 +6.6406493817210539e-08 +6.6350308865976311e-08 +6.6396211433186697e-08 +1.3215610471016051e-07 +1.3216632425314292e-07 +4.4083781548448928e-07 +4.4089085277445519e-07 +4.334616232487537e-07 +4.3352784872264401e-07 +4.3429272306737542e-07 +4.3433480262163489e-07 +4.3496264111862085e-07 +4.3497786884928541e-07 +4.3511148258564987e-07 +4.3520554704253777e-07 +4.3370780860616603e-07 +4.3368423606926063e-07 +4.328628410138481e-07 +4.3285505241561532e-07 +4.327124313256498e-07 +4.3267477086015933e-07 +4.3230728788661219e-07 +4.3226542953007569e-07 +2.4722111004799037e-06 +2.5142777834129135e-06 +4.4276687861731104e-07 +4.4273294107082087e-07 +1.41485621174099e-07 +1.4150436201204016e-07 +5.3171329155621104e-05 +5.3168812196241668e-05 +2.2390148072603243e-06 +2.2372346603350946e-06 +2.231987106773416e-06 +2.2313169038023966e-06 +2.239014424919729e-06 +2.2377346007181852e-06 +2.2390143924723511e-06 +2.237775442839671e-06 +4.3480654191315357e-07 +4.3488507950834644e-07 +4.6830652981648804e-07 +4.6826656818479574e-07 +2.3677400206535477e-07 +2.3676694396181681e-07 +6.5000496140688701e-07 +6.5000496140688701e-07 +4.3206735346314376e-07 +4.3202428861216433e-07 +6.2529737886491926e-06 +6.2529737886491926e-06 +4.9958776444415563e-06 +4.9958776444415563e-06 +1.1965779079794794e-05 +1.1965779079794794e-05 +1.2027559763342132e-05 +1.2027374662763779e-05 +1.3192273522354311e-05 +1.3192273522354311e-05 +1.3192273522354311e-05 +1.3192273522354311e-05 +1.6775098951864492e-05 +1.6774383787404159e-05 +4.542033766332504e-07 +4.5431732001713847e-07 +4.3202131323749139e-07 +4.321515012602062e-07 +4.3311862858653252e-07 +4.3295331546937968e-07 +4.3224107065696392e-07 +4.3216675726112133e-07 +4.3307579817468007e-07 +4.3326783919073537e-07 +4.3433932654561071e-07 +4.3426464397071663e-07 +4.3233120088407917e-07 +4.3236324819455523e-07 +4.478094682486135e-07 +4.4816043339262232e-07 +4.1305341936293231e-07 +4.138103588130683e-07 +4.3214974456510283e-07 +4.321623931168695e-07 +4.4219399503124578e-07 +4.4243564162943998e-07 +5.8503788276280541e-06 +5.8506276020097437e-06 +5.0767710476872452e-06 +5.0771471597020409e-06 +4.4514952905056434e-07 +4.4510937858164303e-07 +1.4346058330627995e-07 +1.4353378733618318e-07 +5.3055097032110677e-08 +5.2956845199158783e-08 +2.7443393900898944e-06 +2.7443393900898944e-06 +2.7443393900898944e-06 +2.7443393900898944e-06 diff --git a/datafiles/test_validation/case_ACTIVSg200.m/X_valid.txt b/datafiles/test_validation/case_ACTIVSg200.m/X_valid.txt index e30638b2..b7efa03b 100644 --- a/datafiles/test_validation/case_ACTIVSg200.m/X_valid.txt +++ b/datafiles/test_validation/case_ACTIVSg200.m/X_valid.txt @@ -1,477 +1,477 @@ 476 --0.11441771903263417 -1.0726248741977866 --0.11461992543566139 -1.0725131019328886 --0.16070526633175852 -1.0650954162055417 --0.16075234009352701 -1.0650713833967718 --0.055775036220483763 -1.0748185307513589 --0.055991126762469243 -1.0746969930810129 --0.12556650233466371 -1.0670332839777581 --0.12619394132888553 -1.0666895748514795 --0.12051564060335671 -1.0695401148595598 --0.12193446946700269 -1.0688541317734366 --0.12145535820403862 -1.0818099930737601 --0.12146400413255833 -1.0818055729229852 --0.12152919954363957 -1.0817715698135846 --0.099787663673378338 -1.0818517470728626 --0.11371815135195872 -1.0861013768061432 --0.11487320192233076 -1.0854964653483321 --0.13374504744004265 -1.0711662224437462 --0.13376846467551773 -1.0711555576859413 --0.13376472477027751 -1.0711562035295141 --0.13377619415711398 -1.0711496745634945 --0.13389628029166598 -1.0710913370277371 --0.12798033601340508 -1.078626863704315 --0.12801726713817191 -1.0786068616125772 --0.12803959034133525 -1.0785922392734781 --0.0633009584982199 -1.0807050939462539 --0.063334419744914161 -1.0806863905055497 --0.12728613617266815 -1.0801134827464938 --0.12736193587183439 -1.0800762268099025 --0.11394396562071414 -1.0717232114075133 --0.11545421449171619 -1.0708466584450147 --0.094386728443270881 -1.0731571572466141 --0.09440305960704852 -1.0731485583872062 --0.094581798929392155 -1.0730630502787712 --0.1491005672785938 -1.0661896271167535 --0.14974177427212981 -1.0658733565053566 --0.100087248208274 -1.0793720914136589 --0.10018439853256006 -1.0793223773534077 --0.10093708994980342 -1.0789099745113138 --0.16851330670805764 -1.0637634116365888 --0.16856665957570918 -1.0637368063613497 --0.12813150632207612 -1.0903246530668882 --0.17767744751877027 -1.0656776329181119 --0.10335255216442159 -1.0695937091609773 --0.16696817003183581 -1.0673994753830447 --0.033914538267287866 -1.0847835826621914 --0.046977561646806006 -1.0838950176207507 --0.13047294402555215 -1.0714288393250861 --0.066086336650561725 -1.0734499428625024 --0.059948042988096216 -1.0763781230267393 -0.013600000000000001 -0.0052711651304439425 --0.061451252246763913 -1.0761711408846497 -0.013600000000000001 -0.0065455762286754995 --0.059001219390139838 -1.0767737539607547 -0.013600000000000001 -0.0052859795471249327 --0.061737231582201527 -1.0760230815564433 -0.013600000000000001 -0.0065407873066375731 --0.05265804440662103 -1.0776422230626739 -0.027200000000000002 -0.0070161614628460305 --0.13538931854123698 -1.0700120563984077 --0.037830458688311697 -1.085076023928957 --0.044795574774589321 -1.0843559440102923 --0.16761889786207246 -1.064223708833582 --0.097657186897735143 -1.0853545547767174 --0.12387203662904826 -1.0702875572807815 --0.10606414606029628 -1.0792975470359876 --0.0505128432543306 -1.0822642992884508 --0.18172880295484356 -1.0621172892224613 --0.13151088653451962 -1.0793746785890179 --0.039151311470906031 -1.0780287239864026 -0.037057771475449107 -1.0712214828351143 -0.86499999999999999 --0.049694063781390095 --0.12471525265612986 -1.0728526304105859 --0.12283699158662049 -1.072356620465734 -0.0141 --0.0056999921931402296 --0.10506735746612401 -1.0647005862375192 -0.083800000000000013 --0.034099989864657287 --0.11765092138995793 -1.0701443526526333 -0.083800000000000013 --0.034099991653380242 --0.10990747926277611 -1.066901456574342 -0.083800000000000013 --0.034099989854333393 --0.11866063690950131 -1.0705116428601182 -0.083800000000000013 --0.034099992213364787 --0.11916854985631152 -1.0707364701543292 -0.083800000000000013 --0.034099992208933179 --0.11380786552260941 -1.0686568579079734 -0.083800000000000013 --0.034099989847210424 --0.081796865582216605 -1.0697056130942653 --0.09908532041240864 -1.0814463758045232 --0.091238902564830887 -1.0855986375298921 -0.012 -0.0052047890514926231 --0.085832908797074753 -1.087029500510196 -0.0071999999999999998 -0.0025524847597053774 --0.09908532041240864 -1.0814463758045232 --0.099085320412408653 -1.0814463758045234 --0.11692894912195032 -1.0924284080564211 --0.063157922217858459 -1.0847974787614594 --0.076336121274082097 -1.0816897638099374 --0.083821276953801205 -1.0821866969449949 --0.094361212643984477 -1.071081687765983 --0.15893177401430589 -1.0657757733668647 --0.12305200702089211 -1.0681730981907553 --0.14820833171052275 -1.0688036160253933 --0.16780361317847389 -1.0681113352462752 --0.096758005879525821 -1.0831898736844254 --0.07779045506808184 -1.0759026258835285 -0.0095999999999999992 --0.0035999901297436442 --0.090192986512358589 -1.0809466084380692 -0.014999999999999999 --0.0054999917603480702 --0.096758005879525835 -1.0831898736844252 --0.12318302127807376 -1.0831958971885567 --0.11000378556054578 -1.0779098112326593 -0.054000000000000006 --0.022000000000000002 --0.099357705607616323 -1.0940265145341064 --0.074493186103517878 -1.0845909678556951 --0.13001788083115551 -1.0738614700805547 --0.092479144455483275 -1.0793536680286686 --0.10571543312150623 -1.0753578225386893 --0.12638610593875538 -1.1000000000000001 --0.12073932514070709 -1.0691170310913565 --0.030742727427333649 -1.0854509707174085 --0.046125887777957522 -1.0840802238725247 -0.019583626873771853 -1.0860329420443573 -0.67599999999999993 -0.0080339151898959262 -0.047236376951635455 -1.0870579270488405 -1.548 -0.064473590425956781 --0.058446172446393357 -1.0821253883541253 --0.095237972639081819 -1.067806366893373 --0.10662199193929091 -1.0791869275282284 --0.11495918793866203 -1.075501105059167 --0.12086598002418991 -1.0691775227605793 --0.12992093748760947 -1.0868866610566734 --0.039509585458265425 -1.0839771149740314 --0.0849440342817291 -1.0727719935502273 --0.034503792054512893 -1.0859600769079922 -0.013999999999999999 -0.0030601973491386379 -0.030805701659961781 -1.0963753311181124 -1.335 -0.23611330587046664 --0.08792485434421532 -1.0792081689757436 --0.10926392349207859 -1.0727367756339585 --0.10934749882851533 -1.075375239510908 --0.12704486318448027 -1.0687584889368424 --0.14890581592852833 -1.0681169163934092 --0.041053076975681245 -1.0836299072288389 --0.056059585212480854 -1.0835476782321554 --0.078355980872450423 -1.0847253485239439 --0.10223083046543587 -1.077532007333452 --0.044140696638147493 -1.0918117056278256 -0.39020000000000005 -0.063905002240740708 --0.056854423463410499 -1.09474242285197 -0.39020000000000005 -0.1614570684509587 --0.068107425565612029 -1.091696537649155 -0.39020000000000005 -0.22979432618589993 --0.043504931773819228 -1.0832106265781778 --0.085400857407034236 -1.0707261616068731 --0.06851668699306146 -1.0804452375246543 --0.12071374905926192 -1.0696658266034287 --0.11518949539583963 -1.0673032091822374 --0.071649852048877055 -1.0862217692956593 --0.085198285211987954 -1.0839335398898224 --0.033975593315529212 -1.094143817881954 -1.3391999999999999 -0.26663109197273654 --0.040734545181430659 -1.092698357842248 -1.3391999999999999 -0.25723328142812485 --0.15558908949141778 -1.0656554671834451 --0.091927747789911418 -1.0781048458402298 --0.11856043358201114 -1.0719810952373974 --0.10350329520416329 -1.0762386183709816 --0.12129893176568307 -1.0691550755936001 --0.12280649054782466 -1.0680101656045138 --0.10548638217172952 -1.0823591588306816 --0.095913857523302073 -1.0754276203372859 --0.17913008494523061 -1.0635342511753101 --0.065887700771190036 -1.0853000129869541 -0.013165410622254995 -1.0943626001280369 -0.92400000000000004 -0.11115866446339173 --0.13180231632871692 -1.0643403836668166 --0.14157996094205305 -1.069820565693187 --0.15997204266477089 -1.0707954392941064 --0.1325686904716637 -1.0663342929366901 -0.016200000000000003 --0.006456168462119819 --0.11258605954628055 -1.0628028989973286 -0.23170000000000002 --0.053339064284208371 --0.10401170373352539 -1.0670259920420992 -0.23170000000000002 --0.018680358022836026 --0.12051939154991928 -1.0647810095991996 -0.23170000000000002 --0.055278200431391908 --0.12115384713968091 -1.0649424203895075 -0.23170000000000002 --0.055433593492831806 --0.077164493175545995 -1.0850056505051779 --0.088448497999990605 -1.083330338424751 --0.12590364910032431 -1.0768547335194334 --0.17244381492604843 -1.0635643006227655 --0.18036490724484255 -1.0649426413111809 --0.18036490724484255 -1.0649426413111809 --0.10060795580844932 -1.0748925562635894 --0.12761600502923207 -1.087602644202829 --0.12761600502923207 -1.0876026442028293 --0.12761600502923207 -1.087602644202829 --0.12761600502923207 -1.087602644202829 --0.12283218557622341 -1.0859804394307253 -0.028199999999999999 --0.0104 --0.12761600502923207 -1.087602644202829 --0.12761600502923207 -1.087602644202829 --0.11850733555589341 -1.0843876213933694 -0.028199999999999999 --0.0104 --0.08905788887023415 -1.0734333555889823 --0.10804363960457795 -1.0858895203050412 --0.12601647708396957 -1.0886326257936472 --0.11237411403453058 -1.0931575657468295 --0.12964318448612683 -1.0872315157009091 --0.17394738329653212 -1.0654950331765207 --0.088412018214107213 -1.0794940835317235 --0.078917495432068288 -1.0864259573963535 --0.11130782924931025 -1.0908699197308345 --0.11436857701233735 -1.0869719323713198 --0.17958919656423328 -1.0662927236083399 --0.16596276424557255 -1.0691920868540414 -0.052499999999999998 -0.008829148927651095 --0.17166913340487377 -1.0687308250283041 -0.07980000000000001 -0.019887101054085587 --0.13309988679847162 -1.0899325305989442 --0.17431287791223696 -1.0655530087972003 --0.09594587279831604 -1.080275391849848 --0.025711301075463835 -1.0834336987069768 --0.068868807368146823 -1.0865820186097583 +-0.11441766680749052 +1.072623018478658 +-0.11461987391025616 +1.0725112460202693 +-0.16070537177346192 +1.0650955642131916 +-0.16075244552214715 +1.0650715314077617 +-0.055775191990762196 +1.0748188786027475 +-0.055991282392861975 +1.0746973409717608 +-0.12556648951786953 +1.0670314015643196 +-0.12619393072661234 +1.0666876918305512 +-0.12051560734654462 +1.0695382217163614 +-0.12193444123624395 +1.068852237410634 +-0.12145551345037668 +1.0818106252136237 +-0.12146415936879214 +1.0818062050654318 +-0.12152935470367843 +1.0817722019759053 +-0.099787777645800144 +1.0818520423690761 +-0.11371826489795253 +1.0861017736426313 +-0.11487331462379496 +1.0854968624066175 +-0.13374503627207082 +1.0711650402482253 +-0.13376845355923553 +1.0711543754786494 +-0.13376471364574005 +1.0711550213229353 +-0.13377618305789366 +1.0711484923497088 +-0.13389626945753511 +1.07109015474953 +-0.12798051581450665 +1.0786276654195774 +-0.12801744688437253 +1.0786076633427082 +-0.12803977005434963 +1.0785930410144804 +-0.063301122973723145 +1.080705552678233 +-0.063334584192010032 +1.0806868492454689 +-0.12728631246329328 +1.0801142605219902 +-0.12736211205329109 +1.0800770046122332 +-0.11394390639405287 +1.0717213115062305 +-0.11545416062406454 +1.0708447569829302 +-0.094386663922041911 +1.0731556862613139 +-0.094402995130590528 +1.073147087390119 +-0.094581734942980583 +1.0730615791643991 +-0.14910071777634332 +1.0661902071117126 +-0.14974192407205392 +1.0658739366727041 +-0.10008717307432144 +1.0793706759128812 +-0.10018432365342785 +1.0793209617874149 +-0.10093701704579584 +1.0789085584029678 +-0.16851336413124546 +1.0637628177891001 +-0.16856671705846721 +1.0637362124990062 +-0.12813157767480976 +1.0903246667994742 +-0.17767747291960342 +1.0656767959789257 +-0.10335251213775794 +1.0695921027897888 +-0.16696818989654288 +1.0673984244556389 +-0.033914465301068078 +1.0847828845218146 +-0.046977513702847605 +1.0838943858612142 +-0.13047314342623595 +1.0714297169826483 +-0.06608646382850504 +1.0734501215826413 +-0.059948178200408923 +1.0763784283998432 +0.013599991722998561 +0.0052714228781662355 +-0.061451368189804755 +1.0761710956699961 +0.01359999172312021 +0.006544979716499766 +-0.059001348849510457 +1.0767739495476396 +0.013599991722998561 +0.005286010160032756 +-0.061737348985444945 +1.0760230742793884 +0.01359999172312021 +0.006540260362875177 +-0.05265817306040313 +1.0776423556892627 +0.027199991721892355 +0.007016076222490235 +-0.13538950403852129 +1.0700128570676515 +-0.037830351442485088 +1.0850750831835498 +-0.044795485729083866 +1.0843550600937157 +-0.16761897962343991 +1.0642235526192771 +-0.097657133661029571 +1.0853533639518882 +-0.12387205586811788 +1.0702861583270451 +-0.10606404419389939 +1.0792958586349082 +-0.050512782249996502 +1.0822635429203447 +-0.18172885380066797 +1.0621167499219735 +-0.1315110532162109 +1.0793753564528159 +-0.039151510768163908 +1.0780292833258192 +0.037057444548462229 +1.071222620649591 +0.86500000684489631 +-0.049688097333826745 +-0.12471546886341343 +1.0728535873103588 +-0.12283724344071702 +1.072357815971934 +0.014099991739109087 +-0.0056982298027796457 +-0.10506762986101045 +1.0647020511085883 +0.083799991734696072 +-0.034097996922915555 +-0.11765115813191228 +1.0701454736914473 +0.083799991735014068 +-0.034098175693753806 +-0.10990773894865627 +1.0669027941411215 +0.083799991734681806 +-0.034097995885430929 +-0.1186608699878627 +1.0705127363345845 +0.083799991735137122 +-0.034098231666442165 +-0.11916878191173368 +1.0707375519497697 +0.083799991735135415 +-0.034098231222840371 +-0.11380811583629898 +1.0686580932398539 +0.083799991734670273 +-0.03409799516826191 +-0.081796966577053681 +1.0697056262276128 +-0.099085185525199085 +1.081444220696097 +-0.091238698582684089 +1.085595787252476 +0.011999991292297913 +0.0052038123079867146 +-0.08583256709638476 +1.0870240653400089 +0.0071999912932143488 +0.002550845486845121 +-0.099085185525199099 +1.081444220696097 +-0.099085185525199085 +1.081444220696097 +-0.11692900823526545 +1.0924282788307085 +-0.06315789394636652 +1.0847968247657764 +-0.076336115251317976 +1.0816891286869825 +-0.083821132117418443 +1.0821850929458252 +-0.094361158688304733 +1.071080151886185 +-0.15893181643231205 +1.0657749812239379 +-0.12305198477379628 +1.0681712117016684 +-0.14820847719952868 +1.0688042087488265 +-0.16780374576068843 +1.0681116434498579 +-0.09675803716489062 +1.0831894286075447 +-0.077790643603364587 +1.0759063758926242 +0.0095999912905300848 +-0.0035980237097491749 +-0.090193054917102583 +1.0809470053314618 +0.014999991289583754 +-0.0054981862900954073 +-0.09675803716489062 +1.0831894286075447 +-0.12318317973133169 +1.0831965453008754 +-0.11000396808278215 +1.0779106456137495 +0.053999991735796844 +-0.021999304010545454 +-0.099357698004402348 +1.0940257109889011 +-0.074493212538598794 +1.0845906596354546 +-0.1300178384193568 +1.073859964878517 +-0.092479011576343306 +1.0793517352921089 +-0.10571534645672588 +1.0753559004097157 +-0.12638617398586718 +1.0999999934047902 +-0.12073929626096971 +1.0691151603335158 +-0.030742619439301302 +1.0854501154511345 +-0.046125803756896309 +1.0840793535139781 +0.019583769520197723 +1.0860327361650217 +0.6760000068563764 +0.0080419578794266276 +0.047236527214564082 +1.0870579984978277 +1.5480000123359412 +0.064490568260974726 +-0.058446093611934494 +1.0821243919598103 +-0.095237936333225248 +1.0678049325933641 +-0.10662189020150124 +1.0791848243972639 +-0.11495912940185743 +1.0754997076511899 +-0.12086595071357362 +1.0691756473758194 +-0.12992100155225111 +1.0868866148574692 +-0.039509405717595932 +1.0839756553908122 +-0.084943965071669514 +1.0727705218249515 +-0.034499685988742666 +1.0859290328667768 +0.014000006867549269 +0.0029860788094578216 +0.030805918075115291 +1.0963756968497393 +1.3350000102129331 +0.23614526071264125 +-0.087924719365595455 +1.0792063229245179 +-0.10926386368590228 +1.07273497330858 +-0.10934742187567288 +1.0753733343834575 +-0.12704487585827551 +1.0687569115201578 +-0.14890583822731251 +1.0681159609957647 +-0.041053094907119468 +1.0836297225661526 +-0.056059594444304382 +1.0835473018730153 +-0.078355797131371072 +1.0847234103707386 +-0.10223073011207733 +1.0775301053643322 +-0.044140377095413297 +1.0918095799333767 +0.39019999170770853 +0.063902927714944324 +-0.05685414198196919 +1.0947399708623047 +0.39019999170957331 +0.16144820011631833 +-0.068107204638077151 +1.09169459227679 +0.39019999170987307 +0.22979365675278465 +-0.043504787610228975 +1.0832093705517027 +-0.085400808866557057 +1.0707247999035936 +-0.068516613325315973 +1.0804441303663384 +-0.1207137149529223 +1.0696639249576174 +-0.11518947402852842 +1.0673015015330134 +-0.07164965434100902 +1.0862198958029519 +-0.085198126467631502 +1.0839317110706943 +-0.033975257816562486 +1.094141770352377 +1.3391999882647976 +0.26662501931427351 +-0.040734242974362608 +1.0926965319177426 +1.3391999882647976 +0.25723481207284615 +-0.15558921437592835 +1.0656558141514949 +-0.091927753932472267 +1.0781040761853107 +-0.11856045328130528 +1.0719798528318412 +-0.10350319905947644 +1.0762367463995213 +-0.12129890301107576 +1.0691531939449239 +-0.12280646657062309 +1.068008263532457 +-0.10548643008172996 +1.0823589230800621 +-0.095913803045656276 +1.0754261527152622 +-0.17913021293404432 +1.0635345764431028 +-0.065887490384336875 +1.0852982945279108 +0.013165929619937814 +1.0943602619715864 +0.92400000686104322 +0.11115194403686482 +-0.13180232499190825 +1.0643384936275087 +-0.1415801235518295 +1.0698212544942407 +-0.15997218660517409 +1.070795790691238 +-0.13257720447277224 +1.0665326057006697 +0.016199991748682023 +-0.0061204936186555889 +-0.11258575209124042 +1.0627919535481118 +0.23169999173592032 +-0.053425714428115646 +-0.10401143777644142 +1.0670191049342923 +0.23169999173472344 +-0.018723969116172193 +-0.12051922910620901 +1.0647733716228254 +0.23169999173592032 +-0.055363896414623803 +-0.12115369409918528 +1.0649350440075047 +0.23169999173592032 +-0.0555192058701049 +-0.077164307155504139 +1.0850037262509298 +-0.088448348952087322 +1.0833283325420375 +-0.12590383691619866 +1.0768555615112618 +-0.17244387832984634 +1.0635638753323782 +-0.18036493804341017 +1.0649420017775764 +-0.18036493804341017 +1.0649420017775764 +-0.10060790065569981 +1.0748909815906651 +-0.12761606951522153 +1.087602608290092 +-0.12761606951522153 +1.0876026082900923 +-0.12761606951522153 +1.0876026082900923 +-0.12761606951522153 +1.0876026082900923 +-0.12283225275338283 +1.0859804638466337 +0.028199991290928771 +-0.010399673568627978 +-0.12761606951522153 +1.087602608290092 +-0.12761606951522153 +1.0876026082900923 +-0.11850740467458844 +1.0843877019411419 +0.028199991290818283 +-0.01039967062339308 +-0.089057935530736931 +1.0734329774592011 +-0.10804374963159893 +1.085889786196766 +-0.12601653890572712 +1.0886325465520865 +-0.11237417184925913 +1.0931574574152654 +-0.12964324773145003 +1.0872314529184606 +-0.17394751294817701 +1.0654953468451018 +-0.088411917925969488 +1.0794926022016298 +-0.078917522491602027 +1.0864256363675111 +-0.11130787599357246 +1.0908697810119372 +-0.11436867848219728 +1.0869721488699726 +-0.17958921607982473 +1.0662920288909239 +-0.16596267085597097 +1.0691893967269495 +0.052499991753037809 +0.0088219620196941725 +-0.17166905007166941 +1.0687281000175111 +0.079799991751819635 +0.019868058644861551 +-0.13309999391809849 +1.0899328153038097 +-0.17431301060935925 +1.065553346692967 +-0.095945759503760872 +1.0802738092759883 +-0.025711303660724008 +1.0834334818618063 +-0.068868832732008625 +1.0865817268128994 0 -1.0807651604459552 -3.8340367243876217 --0.4666998261127413 --0.089782553615058783 -1.0696654670526065 --0.12439882290995571 -1.085017663932083 --0.096783770622815027 -1.0681670070766971 --0.11905879563790212 -1.0701991791001311 --0.1715721883021617 -1.0719935938331673 --0.082708020970910998 -1.0794781329354688 --0.082708020970910998 -1.0794781329354688 --0.082708020970910998 -1.0794781329354688 --0.11074504092668087 -1.0764984554124375 --0.091445520564687049 -1.084021108786293 --0.15056801086060331 -1.06970559947663 +1.0807650750574289 +3.8340367351568299 +-0.46668162161256205 +-0.089782629588481461 +1.0696652943823433 +-0.12439895216784046 +1.0850181254033016 +-0.096783731402019721 +1.0681655489267543 +-0.1190587584847291 +1.0701972974760092 +-0.17157228949871361 +1.0719936160806764 +-0.082708027964779482 +1.079477509101858 +-0.082708027964779482 +1.079477509101858 +-0.082708027964779482 +1.0794775091018582 +-0.11074496469105133 +1.0764964895159834 +-0.091445648648123434 +1.0840214443784923 +-0.15056801026757227 +1.0697042983497047 diff --git a/datafiles/test_validation/case_ACTIVSg200.m/grad_valid.txt b/datafiles/test_validation/case_ACTIVSg200.m/grad_valid.txt index 4c8cb328..3d3b4540 100644 --- a/datafiles/test_validation/case_ACTIVSg200.m/grad_valid.txt +++ b/datafiles/test_validation/case_ACTIVSg200.m/grad_valid.txt @@ -97,23 +97,23 @@ 0 0 0 -1900.5440000000001 +1900.5439996689197 0 0 0 -1900.5440000000001 +1900.5439996689247 0 0 0 -1900.5440000000001 +1900.5439996689197 0 0 0 -1900.5440000000001 +1900.5439996689247 0 0 0 -1901.088 +1901.0879996688757 0 0 0 @@ -145,31 +145,31 @@ 0 0 0 -1900.5639999999999 +1900.5639996695643 0 0 0 -1903.3519999999999 +1903.3519996693879 0 0 0 -1903.3519999999999 +1903.3519996694004 0 0 0 -1903.3519999999999 +1903.3519996693872 0 0 0 -1903.3519999999999 +1903.3519996694054 0 0 0 -1903.3519999999999 +1903.3519996694054 0 0 0 -1903.3519999999999 +1903.3519996693869 0 0 0 @@ -177,11 +177,11 @@ 0 0 0 -2316.1799999999998 +2316.179999651692 0 0 0 -2314.8880000000004 +2314.8879996517289 0 0 0 @@ -209,11 +209,11 @@ 0 0 0 -2315.5840000000003 +2315.5839996516215 0 0 0 -2317 +2316.9999996515835 0 0 0 @@ -221,7 +221,7 @@ 0 0 0 -1902.1599999999999 +1902.159999669432 0 0 0 @@ -293,15 +293,15 @@ 0 0 0 -1915.6079999999999 +1915.6079996683084 0 0 0 -1915.6079999999999 +1915.6079996683829 0 0 0 -1915.6079999999999 +1915.607999668395 0 0 0 @@ -319,11 +319,11 @@ 0 0 0 -1953.568 +1953.567999530592 0 0 0 -1953.568 +1953.567999530592 0 0 0 @@ -357,23 +357,23 @@ 0 0 0 -1900.6479999999999 +1900.6479996699472 0 0 0 -1909.268 +1909.2679996694369 0 0 0 -1909.268 +1909.2679996693889 0 0 0 -1909.268 +1909.2679996694369 0 0 0 -1909.268 +1909.2679996694369 0 0 0 @@ -399,7 +399,7 @@ 0 0 0 -2320.5279999999998 +2320.5279996516369 0 0 0 @@ -407,7 +407,7 @@ 0 0 0 -2320.5279999999998 +2320.5279996516329 0 0 0 @@ -433,11 +433,11 @@ 0 0 0 -1902.1000000000001 +1902.0999996701214 0 0 0 -1903.192 +1903.1919996700728 0 0 0 diff --git a/datafiles/test_validation/case_ACTIVSg200.m/obj_value_valid.txt b/datafiles/test_validation/case_ACTIVSg200.m/obj_value_valid.txt index b8f9eb90..6aebfcb6 100644 --- a/datafiles/test_validation/case_ACTIVSg200.m/obj_value_valid.txt +++ b/datafiles/test_validation/case_ACTIVSg200.m/obj_value_valid.txt @@ -1 +1 @@ -27557.571048064096 +27557.570526047872 diff --git a/datafiles/unit/opflow/objective/OF_unittestx3.m b/datafiles/unit/opflow/objective/testx3.m similarity index 100% rename from datafiles/unit/opflow/objective/OF_unittestx3.m rename to datafiles/unit/opflow/objective/testx3.m diff --git a/datafiles/unit/opflow/objective/OF_unittestx600.m b/datafiles/unit/opflow/objective/testx600.m similarity index 100% rename from datafiles/unit/opflow/objective/OF_unittestx600.m rename to datafiles/unit/opflow/objective/testx600.m diff --git a/src/opflow/CMakeLists.txt b/src/opflow/CMakeLists.txt index d0553657..863f45f4 100644 --- a/src/opflow/CMakeLists.txt +++ b/src/opflow/CMakeLists.txt @@ -20,6 +20,7 @@ if(EXAGO_ENABLE_RAJA) set(OPFLOW_FORM_SRC ${OPFLOW_FORM_SRC} model/power_bal_hiop/pbpolrajahiopsparse.cpp model/power_bal_hiop/pbpolrajahiopsparsekernels.cpp + model/power_bal_hiop/pbpolrajahiopsparse_gpu.cpp ) endif() endif() @@ -39,8 +40,8 @@ set_source_files_properties(${OPFLOW_SRC} PROPERTIES LANGUAGE CXX) if(EXAGO_ENABLE_RAJA AND EXAGO_ENABLE_CUDA) set_source_files_properties( model/power_bal_hiop/pbpolrajahiopkernels.cpp - model/power_bal_hiop/pbpolrajahiopsparsekernels.cpp PROPERTIES LANGUAGE - CUDA + model/power_bal_hiop/pbpolrajahiopsparsekernels.cpp + model/power_bal_hiop/pbpolrajahiopsparse_gpu.cpp PROPERTIES LANGUAGE CUDA ) endif() diff --git a/src/opflow/model/power_bal_hiop/paramsrajahiop.cpp b/src/opflow/model/power_bal_hiop/paramsrajahiop.cpp index 27e2cfa0..fbe44e4e 100644 --- a/src/opflow/model/power_bal_hiop/paramsrajahiop.cpp +++ b/src/opflow/model/power_bal_hiop/paramsrajahiop.cpp @@ -27,6 +27,11 @@ int BUSParamsRajaHiop::destroy(OPFLOW opflow) { h_allocator_.deallocate(jacsp_idx); h_allocator_.deallocate(jacsq_idx); } + h_allocator_.deallocate(ispv); + h_allocator_.deallocate(gineqidx); + h_allocator_.deallocate(ineqjacsp_idx); + h_allocator_.deallocate(genoffset); + h_allocator_.deallocate(ngenONbus); #ifdef EXAGO_ENABLE_GPU d_allocator_.deallocate(isref_dev_); @@ -46,6 +51,11 @@ int BUSParamsRajaHiop::destroy(OPFLOW opflow) { d_allocator_.deallocate(jacsp_idx_dev_); d_allocator_.deallocate(jacsq_idx_dev_); } + d_allocator_.deallocate(ispv_dev_); + d_allocator_.deallocate(gineqidx_dev_); + d_allocator_.deallocate(ineqjacsp_idx_dev_); + d_allocator_.deallocate(genoffset_dev_); + d_allocator_.deallocate(ngenONbus_dev_); #endif return 0; @@ -80,6 +90,11 @@ int BUSParamsRajaHiop::copy(OPFLOW opflow) { resmgr.copy(jacsq_idx_dev_, jacsq_idx); resmgr.copy(powerimbalance_penalty_dev_, powerimbalance_penalty); } + resmgr.copy(ispv_dev_, ispv); + resmgr.copy(gineqidx_dev_, gineqidx); + resmgr.copy(ineqjacsp_idx_dev_, ineqjacsp_idx); + resmgr.copy(genoffset_dev_, genoffset); + resmgr.copy(ngenONbus_dev_, ngenONbus); #else isref_dev_ = isref; isisolated_dev_ = isisolated; @@ -96,6 +111,11 @@ int BUSParamsRajaHiop::copy(OPFLOW opflow) { jacsp_idx_dev_ = jacsp_idx; jacsq_idx_dev_ = jacsq_idx; powerimbalance_penalty_dev_ = powerimbalance_penalty; + ispv_dev_ = ispv; + gineqidx_dev_ = gineqidx; + ineqjacsp_idx_dev_ = ineqjacsp_idx; + genoffset_dev_ = genoffset; + ngenONbus_dev_ = ngenONbus; #endif return 0; } @@ -132,18 +152,31 @@ int BUSParamsRajaHiop::allocate(OPFLOW opflow) { jacsp_idx = paramAlloc(h_allocator_, nbus); jacsq_idx = paramAlloc(h_allocator_, nbus); } + ispv = paramAlloc(h_allocator_, nbus); + gineqidx = paramAlloc(h_allocator_, nbus); + ineqjacsp_idx = paramAlloc(h_allocator_, nbus); + genoffset = paramAlloc(h_allocator_, nbus); + ngenONbus = paramAlloc(h_allocator_, nbus); /* Memzero arrays */ resmgr.memset(isref, 0, nbus * sizeof(int)); resmgr.memset(ispvpq, 0, nbus * sizeof(int)); resmgr.memset(isisolated, 0, nbus * sizeof(int)); + resmgr.memset(ispv, 0, nbus * sizeof(int)); + resmgr.memset(gineqidx, 0, nbus * sizeof(int)); + resmgr.memset(ineqjacsp_idx, 0, nbus * sizeof(int)); + resmgr.memset(genoffset, 0, nbus * sizeof(int)); + resmgr.memset(ngenONbus, 0, nbus * sizeof(int)); + int genoff = 0; for (int i = 0; i < nbus; i++) { bus = &ps->bus[i]; loc = bus->startxVloc; xidx[i] = opflow->idxn2sd_map[loc]; gidx[i] = bus->starteqloc; + genoffset[i] = genoff; + genoff += bus->ngenON; if (bus->ide == REF_BUS) isref[i] = 1; @@ -152,6 +185,12 @@ int BUSParamsRajaHiop::allocate(OPFLOW opflow) { else ispvpq[i] = 1; + if (bus->ide == PV_BUS) + ispv[i] = 1; + + ngenONbus[i] = bus->ngenON; + gineqidx[i] = bus->startineqloc; + if (opflow->genbusvoltagetype == FIXED_AT_SETPOINT) { if (bus->ide == REF_BUS || bus->ide == PV_BUS) { /* Hold voltage at reference and PV buses */ @@ -200,6 +239,11 @@ int BUSParamsRajaHiop::allocate(OPFLOW opflow) { jacsp_idx_dev_ = paramAlloc(d_allocator_, nbus); jacsq_idx_dev_ = paramAlloc(d_allocator_, nbus); } + ispv_dev_ = paramAlloc(d_allocator_, nbus); + gineqidx_dev_ = paramAlloc(d_allocator_, nbus); + ineqjacsp_idx_dev_ = paramAlloc(d_allocator_, nbus); + genoffset_dev_ = paramAlloc(d_allocator_, nbus); + ngenONbus_dev_ = paramAlloc(d_allocator_, nbus); #endif return 0; } @@ -231,6 +275,8 @@ int LINEParamsRajaHiop::copy(OPFLOW opflow) { resmgr.copy(gineqidx_dev_, gineqidx); resmgr.copy(gbineqidx_dev_, gbineqidx); resmgr.copy(linelimidx_dev_, linelimidx); + resmgr.copy(ineqjacsp_idx_dev_, ineqjacsp_idx); + resmgr.copy(xslackidx_dev_, xslackidx); } #else Gff_dev_ = Gff; @@ -250,6 +296,8 @@ int LINEParamsRajaHiop::copy(OPFLOW opflow) { gineqidx_dev_ = gineqidx; gbineqidx_dev_ = gbineqidx; linelimidx_dev_ = linelimidx; + ineqjacsp_idx_dev_ = ineqjacsp_idx; + xslackidx_dev_ = xslackidx; } #endif return 0; @@ -277,6 +325,8 @@ int LINEParamsRajaHiop::destroy(OPFLOW opflow) { h_allocator_.deallocate(gineqidx); h_allocator_.deallocate(gbineqidx); h_allocator_.deallocate(linelimidx); + h_allocator_.deallocate(ineqjacsp_idx); + h_allocator_.deallocate(xslackidx); } #ifdef EXAGO_ENABLE_GPU @@ -301,6 +351,8 @@ int LINEParamsRajaHiop::destroy(OPFLOW opflow) { d_allocator_.deallocate(gineqidx_dev_); d_allocator_.deallocate(gbineqidx_dev_); d_allocator_.deallocate(linelimidx_dev_); + d_allocator_.deallocate(ineqjacsp_idx_dev_); + d_allocator_.deallocate(xslackidx_dev_); } #endif @@ -348,6 +400,8 @@ int LINEParamsRajaHiop::allocate(OPFLOW opflow) { linelimidx = paramAlloc(h_allocator_, nlinelim); gineqidx = paramAlloc(h_allocator_, nlinelim); gbineqidx = paramAlloc(h_allocator_, nlinelim); + ineqjacsp_idx = paramAlloc(h_allocator_, nlinelim); + xslackidx = paramAlloc(h_allocator_, nlinelim); } PetscInt j = 0; @@ -391,6 +445,9 @@ int LINEParamsRajaHiop::allocate(OPFLOW opflow) { gbineqidx[j] = opflow->nconeq + line->startineqloc; gineqidx[j] = line->startineqloc; linelimidx[j] = linei; + if (opflow->allow_lineflow_violation) { + xslackidx[j] = opflow->idxn2sd_map[line->startxslackloc]; + } j++; } @@ -420,6 +477,8 @@ int LINEParamsRajaHiop::allocate(OPFLOW opflow) { gineqidx_dev_ = paramAlloc(d_allocator_, nlinelim); gbineqidx_dev_ = paramAlloc(d_allocator_, nlinelim); linelimidx_dev_ = paramAlloc(d_allocator_, nlinelim); + ineqjacsp_idx_dev_ = paramAlloc(d_allocator_, nlinelim); + xslackidx_dev_ = paramAlloc(d_allocator_, nlinelim); } #endif return 0; @@ -558,7 +617,10 @@ int GENParamsRajaHiop::destroy(OPFLOW opflow) { h_allocator_.deallocate(qt); h_allocator_.deallocate(qb); h_allocator_.deallocate(isrenewable); + h_allocator_.deallocate(apf); + h_allocator_.deallocate(vs); h_allocator_.deallocate(xidx); + h_allocator_.deallocate(xpdevidx); h_allocator_.deallocate(gidxbus); h_allocator_.deallocate(eqjacspbus_idx); h_allocator_.deallocate(eqjacsqbus_idx); @@ -581,7 +643,10 @@ int GENParamsRajaHiop::destroy(OPFLOW opflow) { d_allocator_.deallocate(qt_dev_); d_allocator_.deallocate(qb_dev_); d_allocator_.deallocate(isrenewable_dev_); + d_allocator_.deallocate(apf_dev_); + d_allocator_.deallocate(vs_dev_); d_allocator_.deallocate(xidx_dev_); + d_allocator_.deallocate(xpdevidx_dev_); d_allocator_.deallocate(gidxbus_dev_); d_allocator_.deallocate(eqjacspbus_idx_dev_); d_allocator_.deallocate(eqjacsqbus_idx_dev_); @@ -615,8 +680,11 @@ int GENParamsRajaHiop::copy(OPFLOW opflow) { resmgr.copy(qt_dev_, qt); resmgr.copy(qb_dev_, qb); resmgr.copy(isrenewable_dev_, isrenewable); + resmgr.copy(apf_dev_, apf); + resmgr.copy(vs_dev_, vs); resmgr.copy(xidx_dev_, xidx); + resmgr.copy(xpdevidx_dev_, xpdevidx); resmgr.copy(gidxbus_dev_, gidxbus); resmgr.copy(eqjacspbus_idx_dev_, eqjacspbus_idx); @@ -639,7 +707,10 @@ int GENParamsRajaHiop::copy(OPFLOW opflow) { qt_dev_ = qt; qb_dev_ = qb; isrenewable_dev_ = isrenewable; + apf_dev_ = apf; + vs_dev_ = vs; xidx_dev_ = xidx; + xpdevidx_dev_ = xpdevidx; gidxbus_dev_ = gidxbus; eqjacspbus_idx_dev_ = eqjacspbus_idx; eqjacsqbus_idx_dev_ = eqjacsqbus_idx; @@ -682,8 +753,11 @@ int GENParamsRajaHiop::allocate(OPFLOW opflow) { qt = paramAlloc(h_allocator_, ngenON); qb = paramAlloc(h_allocator_, ngenON); isrenewable = paramAlloc(h_allocator_, ngenON); + apf = paramAlloc(h_allocator_, ngenON); + vs = paramAlloc(h_allocator_, ngenON); xidx = paramAlloc(h_allocator_, ngenON); + xpdevidx = paramAlloc(h_allocator_, ngenON); gidxbus = paramAlloc(h_allocator_, ngenON); eqjacspbus_idx = paramAlloc(h_allocator_, ngenON); @@ -720,11 +794,16 @@ int GENParamsRajaHiop::allocate(OPFLOW opflow) { qt[geni] = gen->qt; qb[geni] = gen->qb; isrenewable[geni] = (int)gen->isrenewable; + apf[geni] = gen->apf; + vs[geni] = gen->vs; if (opflow->has_gensetpoint) { pgs[geni] = gen->pgs; } xidx[geni] = opflow->idxn2sd_map[loc]; + xpdevidx[geni] = (opflow->has_gensetpoint && !gen->isrenewable) + ? opflow->idxn2sd_map[gen->startxpdevloc] + : -1; gidxbus[geni] = gloc; if (opflow->has_gensetpoint) { geqidxgen[geni] = gen->starteqloc; @@ -748,8 +827,11 @@ int GENParamsRajaHiop::allocate(OPFLOW opflow) { qt_dev_ = paramAlloc(d_allocator_, ngenON); qb_dev_ = paramAlloc(d_allocator_, ngenON); isrenewable_dev_ = paramAlloc(d_allocator_, ngenON); + apf_dev_ = paramAlloc(d_allocator_, ngenON); + vs_dev_ = paramAlloc(d_allocator_, ngenON); xidx_dev_ = paramAlloc(d_allocator_, ngenON); + xpdevidx_dev_ = paramAlloc(d_allocator_, ngenON); gidxbus_dev_ = paramAlloc(d_allocator_, ngenON); eqjacspbus_idx_dev_ = paramAlloc(d_allocator_, ngenON); diff --git a/src/opflow/model/power_bal_hiop/paramsrajahiop.h b/src/opflow/model/power_bal_hiop/paramsrajahiop.h index 91f1fb9f..d274f990 100644 --- a/src/opflow/model/power_bal_hiop/paramsrajahiop.h +++ b/src/opflow/model/power_bal_hiop/paramsrajahiop.h @@ -28,7 +28,12 @@ struct BUSParamsRajaHiop { vector */ int *jacsp_idx; /* Location number in the sparse Jacobian for Pimb */ int *jacsq_idx; /* Location number in the sparse Jacobian for Qimb */ - int *hesssp_idx; /* Location number in the Hessian */ + int *hesssp_idx; /* KS: Hessian indices */ + int *ispv; /* KS: ispv[i] = 1 if bus is PV bus */ + int *gineqidx; /* KS: starting position of bus ineq constraints */ + int *ineqjacsp_idx; /* KS: index in flat sparse ineq Jacobian array */ + int *genoffset; /* KS: Offset into flattened gen array for this bus */ + int *ngenONbus; /* KS: Number of ON generators on this bus */ // Device data int *isref_dev_; /* isref[i] = 1 if bus is reference bus */ @@ -46,9 +51,14 @@ struct BUSParamsRajaHiop { X vector */ int *gidx_dev_; /* starting locations for bus balance equations in constraint vector */ - int *jacsp_idx_dev_; /* Location number in the sparse Jacobian for Pimb */ - int *jacsq_idx_dev_; /* Location number in the sparse Jacobian for Qimb */ - int *hesssp_idx_dev_; /* Location number in the Hessian */ + int *jacsp_idx_dev_; /* Location number in the sparse Jacobian for Pimb */ + int *jacsq_idx_dev_; /* Location number in the sparse Jacobian for Qimb */ + int *hesssp_idx_dev_; /* Location number in the Hessian */ + int *ispv_dev_; /* KS: dev counterpart of ispv */ + int *gineqidx_dev_; /* KS: dev counterpart of gineqidx */ + int *ineqjacsp_idx_dev_; /* KS: device counterpart of ineqjacsp_idx_ */ + int *genoffset_dev_; /* KS: dev counterpart of genoffset */ + int *ngenONbus_dev_; /* KS: dev counterpart of ngenONbus */ int allocate(OPFLOW); int destroy(OPFLOW); @@ -72,9 +82,12 @@ struct GENParamsRajaHiop { double *qt; /* min. reactive power gen. limits */ double *qb; /* max. reactive power gen. limits */ double *pgs; /* real power output setpoint */ + double *apf; /* generator AGC participation factor */ + double *vs; /* voltage setpoint */ int *isrenewable; /* Is renewable generator? */ - int *xidx; /* starting locations in X vector */ + int *xidx; /* starting locations in X vector */ + int *xpdevidx; /* KS: tarting locations of deviation variables in X vector */ int * gidxbus; /* starting locations in constraint vector for bus constraints */ int *geqidxgen; /* starting locations in equality constraint vector for gen @@ -104,9 +117,12 @@ struct GENParamsRajaHiop { double *qt_dev_; /* min. reactive power gen. limits */ double *qb_dev_; /* max. reactive power gen. limits */ double *pgs_dev_; /* real power output setpoint */ + double *apf_dev_; /* KS: device counterpart of apf */ + double *vs_dev_; /* KS: device counterpart of vs */ int *isrenewable_dev_; /* Is renewable generator? */ int *xidx_dev_; /* starting locations in X vector */ + int *xpdevidx_dev_; /* KS: device coutnerpart of xpdevidx*/ int *gidxbus_dev_; /* starting locations in constraint vector for bus constraints */ int *geqidxgen_dev_; /* starting locations in equality constraint vector for @@ -143,7 +159,7 @@ struct LOADParamsRajaHiop { double *pl; /* active power demand */ double *ql; /* reactive power demand */ double *loadloss_penalty; /* Penalty for load loss */ - int *xidx; /* starting location in X vector */ + int *xidx; /* KS: starting location in X vector */ int *gidx; /* starting location in constraint vector */ /* The following members are only used with HIOP */ @@ -192,9 +208,11 @@ struct LINEParamsRajaHiop { contribution in constraints vector */ int *gineqidx; /* Starting location to insert contribution to inequality constraint */ - int *gbineqidx; /* Starting location to insert contribution to inequality - constraint bound */ - int *linelimidx; /* Indices for subset of lines that have finite limits */ + int *gbineqidx; /* Starting location to insert contribution to inequality + constraint bound */ + int *linelimidx; /* Indices for subset of lines that have finite limits */ + int *ineqjacsp_idx; /* KS: Position in flat sparse ineq Jacobian array */ + int *xslackidx; /* Starting location of slack variables in X vector */ // Device data double *Gff_dev_; /* From side self conductance */ @@ -218,6 +236,8 @@ struct LINEParamsRajaHiop { constraint bound */ int * linelimidx_dev_; /* Indices for subset of lines that have finite limits */ + int *ineqjacsp_idx_dev_; /* KS: Position in flat sparse ineq Jacobian array */ + int *xslackidx_dev_; /* Starting location of slack variables in X vector */ int allocate(OPFLOW); int destroy(OPFLOW); @@ -248,6 +268,9 @@ struct PbpolModelRajaHiop : public _p_FormPBPOLRAJAHIOP { LINEParamsRajaHiop lineparams; BUSParamsRajaHiop busparams; + int agc_xidx; /* KS: X-vector index for the AGC delta-P variable + (ps->startxloc) */ + // Arrays to store Jacobian and Hessian indices and entries on CPU (used with // GPU sparse model) int *i_jaceq, diff --git a/src/opflow/model/power_bal_hiop/pbpolhiopkernels.cpp b/src/opflow/model/power_bal_hiop/pbpolhiopkernels.cpp index 7f396acb..c1f6e70c 100644 --- a/src/opflow/model/power_bal_hiop/pbpolhiopkernels.cpp +++ b/src/opflow/model/power_bal_hiop/pbpolhiopkernels.cpp @@ -170,10 +170,10 @@ PetscErrorCode OPFLOWSetConstraintBoundsArray_PBPOLHIOP(OPFLOW opflow, /* Inequality constraints */ for (i = 0; i < lineparams->nlinelim; i++) { int j = lineparams->linelimidx[i]; - gl[lineparams->gbineqidx[i]] = 0.0; + gl[lineparams->gbineqidx[i]] = PETSC_NINFINITY; gu[lineparams->gbineqidx[i]] = (lineparams->rateA[j] / ps->MVAbase) * (lineparams->rateA[j] / ps->MVAbase); - gl[lineparams->gbineqidx[i] + 1] = 0.0; + gl[lineparams->gbineqidx[i] + 1] = PETSC_NINFINITY; gu[lineparams->gbineqidx[i] + 1] = (lineparams->rateA[j] / ps->MVAbase) * (lineparams->rateA[j] / ps->MVAbase); } diff --git a/src/opflow/model/power_bal_hiop/pbpolrajahiopkernels.cpp b/src/opflow/model/power_bal_hiop/pbpolrajahiopkernels.cpp index 0aa506bb..37772894 100644 --- a/src/opflow/model/power_bal_hiop/pbpolrajahiopkernels.cpp +++ b/src/opflow/model/power_bal_hiop/pbpolrajahiopkernels.cpp @@ -75,9 +75,9 @@ PetscErrorCode OPFLOWSetConstraintBoundsArray_PBPOLRAJAHIOP(OPFLOW opflow, RAJA::RangeSegment(0, lineparams->nlinelim), RAJA_LAMBDA(RAJA::Index_type i) { int j = linelimidx[i]; - gl_dev[gbineqidx[i]] = 0.0; + gl_dev[gbineqidx[i]] = PETSC_NINFINITY; gu_dev[gbineqidx[i]] = (rateA[j] / MVAbase) * (rateA[j] / MVAbase); - gl_dev[gbineqidx[i] + 1] = 0.0; + gl_dev[gbineqidx[i] + 1] = PETSC_NINFINITY; gu_dev[gbineqidx[i] + 1] = (rateA[j] / MVAbase) * (rateA[j] / MVAbase); }); diff --git a/src/opflow/model/power_bal_hiop/pbpolrajahiopsparse.cpp b/src/opflow/model/power_bal_hiop/pbpolrajahiopsparse.cpp index fa609378..cac87986 100644 --- a/src/opflow/model/power_bal_hiop/pbpolrajahiopsparse.cpp +++ b/src/opflow/model/power_bal_hiop/pbpolrajahiopsparse.cpp @@ -6,11 +6,20 @@ #include #include "pbpolrajahiopsparsekernels.hpp" -/* Initialization is done on the host through this function. Copying over values +/** + * @brief `extern` initial guess function from PBPOL model. + * + * Initialization is done on the host through this function. Copying over values * to the device is done in OPFLOWSetInitialGuessArray_PBPOLRAJAHIOPSPARSE */ extern PetscErrorCode OPFLOWSetInitialGuess_PBPOL(OPFLOW, Vec, Vec); +/** + * @brief Set the initial guess for the PBPOL model with Raja and HiOp sparse. + * + * This function sets the initial guess by calling the same function from + * the PBPOL model. + */ PetscErrorCode OPFLOWSetInitialGuess_PBPOLRAJAHIOPSPARSE(OPFLOW opflow, Vec X, Vec Lambda) { PetscErrorCode ierr; @@ -23,9 +32,14 @@ PetscErrorCode OPFLOWSetInitialGuess_PBPOLRAJAHIOPSPARSE(OPFLOW opflow, Vec X, PetscFunctionReturn(0); } +/// @brief `extern` constraint bounds function from PBPOL model. extern PetscErrorCode OPFLOWSetConstraintBounds_PBPOL(OPFLOW, Vec, Vec); -/* The constraint bounds are also calculated on the host. +/** + * @brief Set the constraint bounds for the PBPOLHIOPSPARSE model. + * + * The constraint bounds are also calculated on the host by matching function + * from PBPOL model. */ PetscErrorCode OPFLOWSetConstraintBounds_PBPOLRAJAHIOPSPARSE(OPFLOW opflow, Vec Gl, Vec Gu) { @@ -37,9 +51,14 @@ PetscErrorCode OPFLOWSetConstraintBounds_PBPOLRAJAHIOPSPARSE(OPFLOW opflow, PetscFunctionReturn(0); } +/// @brief `extern` variable bounds function from PBPOL model. extern PetscErrorCode OPFLOWSetVariableBounds_PBPOL(OPFLOW, Vec, Vec); -/* The variable bounds are also calculated on the host. +/** + * @brief Set the variable bounds for the PBPOLHIOPSPARSE model. + * + * The variable bounds are also calculated on the host by matching function + * from PBPOL model. */ PetscErrorCode OPFLOWSetVariableBounds_PBPOLRAJAHIOPSPARSE(OPFLOW opflow, Vec Xl, Vec Xu) { @@ -51,6 +70,10 @@ PetscErrorCode OPFLOWSetVariableBounds_PBPOLRAJAHIOPSPARSE(OPFLOW opflow, PetscFunctionReturn(0); } +/** + * @brief Store PBPOLRAJAHIOPSPARSE solution to the PS structure. + * + */ PetscErrorCode OPFLOWSolutionToPS_PBPOLRAJAHIOPSPARSE(OPFLOW opflow) { PetscErrorCode ierr; PS ps = (PS)opflow->ps; @@ -99,8 +122,8 @@ PetscErrorCode OPFLOWSolutionToPS_PBPOLRAJAHIOPSPARSE(OPFLOW opflow) { if (opflow->include_powerimbalance_variables) { loc = bus->startxpimbloc; - bus->pimb = x[loc]; - bus->qimb = x[loc + 1]; + bus->pimb = x[loc] - x[loc + 1]; + bus->qimb = x[loc + 2] - x[loc + 3]; } for (k = 0; k < bus->ngen; k++) { @@ -115,7 +138,7 @@ PetscErrorCode OPFLOWSolutionToPS_PBPOLRAJAHIOPSPARSE(OPFLOW opflow) { gen->pg = x[loc]; gen->qg = x[loc + 1]; - if (opflow->has_gensetpoint) { + if (opflow->has_gensetpoint && !gen->isrenewable) { gloc += gen->nconeq; } } @@ -125,8 +148,8 @@ PetscErrorCode OPFLOWSolutionToPS_PBPOLRAJAHIOPSPARSE(OPFLOW opflow) { ierr = PSBUSGetLoad(bus, k, &load); CHKERRQ(ierr); loc = load->startxloadlossloc; - load->pl = load->pl - x[loc]; - load->ql = load->ql - x[loc + 1]; + load->pl_loss = x[loc]; + load->ql_loss = x[loc + 1]; } } } @@ -199,10 +222,20 @@ PetscErrorCode OPFLOWSolutionToPS_PBPOLRAJAHIOPSPARSE(OPFLOW opflow) { } /* Reuse PBPOL model set up for obtaining locations */ +/// @brief `extern` set up function from PBPOL model. extern PetscErrorCode OPFLOWModelSetUp_PBPOL(OPFLOW); +/** @brief Set up the PBPOLRAJAHIOPSPARSE model. + * + * This function initializes the host objects for the PBPOLRAJAHIOPSPARSE + * model by calling the corresponding function from the PBPOL model, and then + * allocates structures with device data, defined in `paramsrajahiop.cpp`. + */ PetscErrorCode OPFLOWModelSetUp_PBPOLRAJAHIOPSPARSE(OPFLOW opflow) { PetscErrorCode ierr; + + // This struct is defined in `paramsrajahiop.h`. It inherits from + // _p_FormPBPOLRAJAHIOP, which is unwise mixture of C and C++ approaches. PbpolModelRajaHiop *pbpolrajahiopsparse = reinterpret_cast(opflow->model); @@ -221,9 +254,85 @@ PetscErrorCode OPFLOWModelSetUp_PBPOLRAJAHIOPSPARSE(OPFLOW opflow) { LOADParamsRajaHiop *loadparams = &pbpolrajahiopsparse->loadparams; LINEParamsRajaHiop *lineparams = &pbpolrajahiopsparse->lineparams; - /* Need to compute the number of nonzeros in equality, inequality constraint - * Jacobians and Hessian */ + PS ps = opflow->ps; + PSBUS bus; + PSGEN gen; + PSLINE line; + PetscInt i, k; + + /* KS: Store the AGC variable index (scalar) */ + if (opflow->use_agc) { + pbpolrajahiopsparse->agc_xidx = opflow->idxn2sd_map[ps->startxloc]; + } else { + pbpolrajahiopsparse->agc_xidx = -1; + } + + /* KS: Compute the number of nonzeros in equality, inequality constraint + * Jacobians and Hessian. Equality and Hessian counts are still obtained + * from PETSc via get_sparse_blocks_info; inequality count is computed + * axplicitly so we can skip PETSc */ int nnz_eqjacsp = 0, nnz_ineqjacsp = 0, nnz_hesssp = 0; + + /* + * KS: Count inequality Jacobian non-zeros. The traversal order must match + * the startineqloc assignment in OPFLOWModelSetUp_PBPOL: for each bus + * (bus ineq, then gen ineq), then for each line. + */ + int geni = 0, gi; + for (i = 0; i < ps->nbus; i++) { + bus = &ps->bus[i]; + + /* Bus voltage-Q-bounds constraints (FIXED_WITHIN_QBOUNDS) */ + if (opflow->genbusvoltagetype == FIXED_WITHIN_QBOUNDS) { + if (bus->ide == PV_BUS || bus->ide == REF_BUS) { + busparams->ineqjacsp_idx[i] = nnz_ineqjacsp; + /* 2 rows, each with ngenON + 1 entries (one per gen Qg + one for V) */ + nnz_ineqjacsp += 2 * (bus->ngenON + 1); + } + } + + /* KS: Generator set-point constraints */ + gi = 0; + if (opflow->has_gensetpoint) { + for (k = 0; k < bus->ngen; k++) { + ierr = PSBUSGetGen(bus, k, &gen); + CHKERRQ(ierr); + if (!gen->status) + continue; + if (!gen->isrenewable) { + genparams->ineqjacspgen_idx[geni + gi] = nnz_ineqjacsp; + if (opflow->use_agc) { + nnz_ineqjacsp += 6; /* 2 rows x 3 entries (Pg, delPg, delP) */ + } + } + gi++; + } + } + + geni += bus->ngenON; + } + + /* Line flow constraints */ + int linej = 0; + for (i = 0; i < ps->nline; i++) { + line = &ps->line[i]; + if (!line->status) + continue; + if (line->isdcline) + continue; + + if (linej < opflow->nlinesmon && opflow->linesmon[linej] == i) { + lineparams->ineqjacsp_idx[linej] = nnz_ineqjacsp; + /* 2 rows x 4 entries (thetaf, Vmf, thetat, Vmt) */ + int entries_per_line = 8; + if (opflow->allow_lineflow_violation) { + entries_per_line += 2; /* 1 slack entry per row */ + } + nnz_ineqjacsp += entries_per_line; + linej++; + } + } + opflow->nnz_eqjacsp = nnz_eqjacsp; opflow->nnz_ineqjacsp = nnz_ineqjacsp; opflow->nnz_hesssp = nnz_hesssp; @@ -236,6 +345,10 @@ PetscErrorCode OPFLOWModelSetUp_PBPOLRAJAHIOPSPARSE(OPFLOW opflow) { PetscFunctionReturn(0); } +/** + * @brief Destructor for the PBPOLRAJAHIOPSPARSE model. + * + */ PetscErrorCode OPFLOWModelDestroy_PBPOLRAJAHIOPSPARSE(OPFLOW opflow) { PbpolModelRajaHiop *pbpolrajahiopsparse = reinterpret_cast(opflow->model); @@ -264,10 +377,22 @@ extern PetscErrorCode OPFLOWSolutionCallback_PBPOLRAJAHIOPSPARSE( OPFLOW, const double *, const double *, const double *, const double *, const double *, double); +/** + * @brief Constructor for the PBPOLRAJAHIOPSPARSE model. + * + * This function creates a new PBPOLRAJAHIOPSPARSE model and sets pointers + * to the model's methods implementations. + * + * @param opflow The pointer to the object to instantiate. + * @return PetscErrorCode indicating success or failure. + */ PetscErrorCode OPFLOWModelCreate_PBPOLRAJAHIOPSPARSE(OPFLOW opflow) { PetscFunctionBegin; + // This may be confusing: The class PbpolModelRajaHiop is a sparse model + // using HiOp solver, but is implemented in file with HiOp mixed dense-sparse + // model implementation. PbpolModelRajaHiop *pbpolrajahiopsparse = new PbpolModelRajaHiop(); opflow->model = pbpolrajahiopsparse; diff --git a/src/opflow/model/power_bal_hiop/pbpolrajahiopsparse_gpu.cpp b/src/opflow/model/power_bal_hiop/pbpolrajahiopsparse_gpu.cpp new file mode 100644 index 00000000..05705a35 --- /dev/null +++ b/src/opflow/model/power_bal_hiop/pbpolrajahiopsparse_gpu.cpp @@ -0,0 +1,244 @@ + +#include + +#if defined(EXAGO_ENABLE_RAJA) +#if defined(EXAGO_ENABLE_HIOP_SPARSE) + +#include +#include + +#include "pbpolrajahiopsparse_gpu.hpp" + +void ComputeIneqJacValuesGPU_PBPOLRAJAHIOPSPARSE(OPFLOW opflow, + const double *x_dev, + double *jacd_dev) { + PbpolModelRajaHiop *pbpolrajahiopsparse = + reinterpret_cast(opflow->model); + GENParamsRajaHiop *genparams = &pbpolrajahiopsparse->genparams; + BUSParamsRajaHiop *busparams = &pbpolrajahiopsparse->busparams; + + /* + * Generator set-point inequality Jacobian (has_gensetpoint && use_agc). + * + * PETSc reference (pbpol.cpp:1191-1232): + * Row gloc: [apf*delP - delPg, -(Pg - pt), apf*(Pg - pt)] + * Row gloc+1: [apf*delP - delPg, (pb - Pg), -apf*(pb - Pg)] + * + * Flat array layout per generator (6 entries): + * [0..2] = row 0 values (Pg, delPg, delP columns) + * [3..5] = row 1 values (Pg, delPg, delP columns) + */ + if (opflow->has_gensetpoint && opflow->use_agc) { + int *g_ineqjacsp_idx = genparams->ineqjacspgen_idx_dev_; + int *g_xidx = genparams->xidx_dev_; + int *g_xpdevidx = genparams->xpdevidx_dev_; + int *g_isrenewable = genparams->isrenewable_dev_; + double *g_apf = genparams->apf_dev_; + double *g_pt = genparams->pt_dev_; + double *g_pb = genparams->pb_dev_; + int agc_xidx = pbpolrajahiopsparse->agc_xidx; + + RAJA::forall( + RAJA::RangeSegment(0, genparams->ngenON), + RAJA_LAMBDA(RAJA::Index_type i) { + if (g_isrenewable[i]) + return; + + int base = g_ineqjacsp_idx[i]; + double Pg = x_dev[g_xidx[i]]; + double delPg = x_dev[g_xpdevidx[i]]; + double delP = x_dev[agc_xidx]; + double apf = g_apf[i]; + double pt = g_pt[i]; + double pb = g_pb[i]; + + double apf_delP_minus_delPg = apf * delP - delPg; + + /* Row 0: d/d{Pg, delPg, delP} of (apf*delP - delPg)*(Pg - pt) */ + jacd_dev[base + 0] = apf_delP_minus_delPg; + jacd_dev[base + 1] = -(Pg - pt); + jacd_dev[base + 2] = apf * (Pg - pt); + + /* Row 1: d/d{Pg, delPg, delP} of (delPg - apf*delP)*(pb - Pg) */ + jacd_dev[base + 3] = apf_delP_minus_delPg; + jacd_dev[base + 4] = pb - Pg; + jacd_dev[base + 5] = -apf * (pb - Pg); + }); + } + + /* + * FIXED_WITHIN_QBOUNDS voltage constraint Jacobian. + * + * PETSc reference (pbpol.cpp:1235-1278): + * For each PV/REF bus with ngenON generators: + * Row 0 (gloc): [Vset_0-V, Vset_1-V, ..., Qmax-Q] + * Row 1 (gloc+1): [Vset_0-V, Vset_1-V, ..., Qmin-Q] + * + * Flat array layout per bus (2 * (ngenON + 1) entries): + * Row 0: ngenON Qg derivative entries + 1 V derivative entry + * Row 1: ngenON Qg derivative entries + 1 V derivative entry + * + * This kernel parallelizes over buses. The inner loop over generators + * is sequential within each thread (variable-length per bus). + */ + if (opflow->genbusvoltagetype == FIXED_WITHIN_QBOUNDS) { + int *b_ispv = busparams->ispv_dev_; + int *b_isref = busparams->isref_dev_; + int *b_xidx = busparams->xidx_dev_; + int *b_ineqjacsp_idx = busparams->ineqjacsp_idx_dev_; + int *b_genoffset = busparams->genoffset_dev_; + int *b_ngenONbus = busparams->ngenONbus_dev_; + int *g_xidx = genparams->xidx_dev_; + double *g_qt = genparams->qt_dev_; + double *g_qb = genparams->qb_dev_; + double *g_vs = genparams->vs_dev_; + + RAJA::forall( + RAJA::RangeSegment(0, busparams->nbus), + RAJA_LAMBDA(RAJA::Index_type i) { + if (!b_ispv[i] && !b_isref[i]) + return; + + int base = b_ineqjacsp_idx[i]; + int ngen = b_ngenONbus[i]; + int goff = b_genoffset[i]; + double V = x_dev[b_xidx[i] + 1]; + + double Q = 0.0, Qmax = 0.0, Qmin = 0.0; + double Vset = 0.0; + + /* Row 0 and Row 1: Qg derivative entries */ + for (int k = 0; k < ngen; k++) { + int gidx = goff + k; + double Qg = x_dev[g_xidx[gidx] + 1]; + Q += Qg; + Qmax += g_qt[gidx]; + Qmin += g_qb[gidx]; + Vset = g_vs[gidx]; + + double dQg = Vset - V; + /* Row 0 entry for this gen's Qg */ + jacd_dev[base + k] = dQg; + /* Row 1 entry for this gen's Qg */ + jacd_dev[base + ngen + 1 + k] = dQg; + } + + /* Row 0: V derivative entry (last in this row) */ + jacd_dev[base + ngen] = Qmax - Q; + /* Row 1: V derivative entry (last in this row) */ + jacd_dev[base + ngen + 1 + ngen] = Qmin - Q; + }); + } + + /* + * Line flow constraint Jacobian. + * + * Computes dSf2/d{thetaf,Vmf,thetat,Vmt} and dSt2/d{thetaf,Vmf,thetat,Vmt} + * for each monitored line, plus optional slack variable entries (-1.0). + * + * Flat array layout per line (8 entries without slack, 10 with): + * Row 0 (Sf2): [dSf2_dthetaf, dSf2_dVmf, dSf2_dthetat, dSf2_dVmt, + * (-1.0 if slack)] + * Row 1 (St2): [dSt2_dthetaf, dSt2_dVmf, dSt2_dthetat, dSt2_dVmt, + * (-1.0 if slack)] + */ + LINEParamsRajaHiop *lineparams = &pbpolrajahiopsparse->lineparams; + + if (lineparams->nlinelim) { + double *Gff_arr = lineparams->Gff_dev_; + double *Bff_arr = lineparams->Bff_dev_; + double *Gft_arr = lineparams->Gft_dev_; + double *Bft_arr = lineparams->Bft_dev_; + double *Gtf_arr = lineparams->Gtf_dev_; + double *Btf_arr = lineparams->Btf_dev_; + double *Gtt_arr = lineparams->Gtt_dev_; + double *Btt_arr = lineparams->Btt_dev_; + int *linelimidx = lineparams->linelimidx_dev_; + int *xidxf = lineparams->xidxf_dev_; + int *xidxt = lineparams->xidxt_dev_; + int *ineqjacsp_idx = lineparams->ineqjacsp_idx_dev_; + int has_slack = (int)opflow->allow_lineflow_violation; + int row_stride = 4 + has_slack; + + RAJA::forall( + RAJA::RangeSegment(0, lineparams->nlinelim), + RAJA_LAMBDA(RAJA::Index_type i) { + int j = linelimidx[i]; + int base = ineqjacsp_idx[i]; + + double thetaf = x_dev[xidxf[j]]; + double Vmf = x_dev[xidxf[j] + 1]; + double thetat = x_dev[xidxt[j]]; + double Vmt = x_dev[xidxt[j] + 1]; + double thetaft = thetaf - thetat; + double thetatf = thetat - thetaf; + + double Gff = Gff_arr[j], Bff = Bff_arr[j]; + double Gft = Gft_arr[j], Bft = Bft_arr[j]; + double Gtf = Gtf_arr[j], Btf = Btf_arr[j]; + double Gtt = Gtt_arr[j], Btt = Btt_arr[j]; + + double sin_ft = sin(thetaft), cos_ft = cos(thetaft); + double sin_tf = sin(thetatf), cos_tf = cos(thetatf); + + double Pf = + Gff * Vmf * Vmf + Vmf * Vmt * (Gft * cos_ft + Bft * sin_ft); + double Qf = + -Bff * Vmf * Vmf + Vmf * Vmt * (-Bft * cos_ft + Gft * sin_ft); + double Pt = + Gtt * Vmt * Vmt + Vmt * Vmf * (Gtf * cos_tf + Btf * sin_tf); + double Qt = + -Btt * Vmt * Vmt + Vmt * Vmf * (-Btf * cos_tf + Gtf * sin_tf); + + double dSf2_dPf = 2 * Pf, dSf2_dQf = 2 * Qf; + double dSt2_dPt = 2 * Pt, dSt2_dQt = 2 * Qt; + + double dPf_dthetaf = Vmf * Vmt * (-Gft * sin_ft + Bft * cos_ft); + double dPf_dVmf = 2 * Gff * Vmf + Vmt * (Gft * cos_ft + Bft * sin_ft); + double dPf_dthetat = Vmf * Vmt * (Gft * sin_ft - Bft * cos_ft); + double dPf_dVmt = Vmf * (Gft * cos_ft + Bft * sin_ft); + + double dQf_dthetaf = Vmf * Vmt * (Bft * sin_ft + Gft * cos_ft); + double dQf_dVmf = + -2 * Bff * Vmf + Vmt * (-Bft * cos_ft + Gft * sin_ft); + double dQf_dthetat = Vmf * Vmt * (-Bft * sin_ft - Gft * cos_ft); + double dQf_dVmt = Vmf * (-Bft * cos_ft + Gft * sin_ft); + + double dPt_dthetat = Vmt * Vmf * (-Gtf * sin_tf + Btf * cos_tf); + double dPt_dVmt = 2 * Gtt * Vmt + Vmf * (Gtf * cos_tf + Btf * sin_tf); + double dPt_dthetaf = Vmt * Vmf * (Gtf * sin_tf - Btf * cos_tf); + double dPt_dVmf = Vmt * (Gtf * cos_tf + Btf * sin_tf); + + double dQt_dthetat = Vmt * Vmf * (Btf * sin_tf + Gtf * cos_tf); + double dQt_dVmt = + -2 * Btt * Vmt + Vmf * (-Btf * cos_tf + Gtf * sin_tf); + double dQt_dthetaf = Vmt * Vmf * (-Btf * sin_tf - Gtf * cos_tf); + double dQt_dVmf = Vmt * (-Btf * cos_tf + Gtf * sin_tf); + + /* Row 0 (Sf2): derivatives w.r.t. thetaf, Vmf, thetat, Vmt */ + jacd_dev[base + 0] = dSf2_dPf * dPf_dthetaf + dSf2_dQf * dQf_dthetaf; + jacd_dev[base + 1] = dSf2_dPf * dPf_dVmf + dSf2_dQf * dQf_dVmf; + jacd_dev[base + 2] = dSf2_dPf * dPf_dthetat + dSf2_dQf * dQf_dthetat; + jacd_dev[base + 3] = dSf2_dPf * dPf_dVmt + dSf2_dQf * dQf_dVmt; + + /* Row 1 (St2): derivatives w.r.t. thetaf, Vmf, thetat, Vmt */ + jacd_dev[base + row_stride + 0] = + dSt2_dPt * dPt_dthetaf + dSt2_dQt * dQt_dthetaf; + jacd_dev[base + row_stride + 1] = + dSt2_dPt * dPt_dVmf + dSt2_dQt * dQt_dVmf; + jacd_dev[base + row_stride + 2] = + dSt2_dPt * dPt_dthetat + dSt2_dQt * dQt_dthetat; + jacd_dev[base + row_stride + 3] = + dSt2_dPt * dPt_dVmt + dSt2_dQt * dQt_dVmt; + + /* Slack variable entries (Step 5) */ + if (has_slack) { + jacd_dev[base + 4] = -1.0; + jacd_dev[base + row_stride + 4] = -1.0; + } + }); + } +} + +#endif // EXAGO_ENABLE_HIOP_SPARSE +#endif // EXAGO_ENABLE_RAJA diff --git a/src/opflow/model/power_bal_hiop/pbpolrajahiopsparse_gpu.hpp b/src/opflow/model/power_bal_hiop/pbpolrajahiopsparse_gpu.hpp new file mode 100644 index 00000000..938686a7 --- /dev/null +++ b/src/opflow/model/power_bal_hiop/pbpolrajahiopsparse_gpu.hpp @@ -0,0 +1,30 @@ +#include + +#if defined(EXAGO_ENABLE_RAJA) +#if defined(EXAGO_ENABLE_HIOP_SPARSE) + +#pragma once + +#include +#include "pbpolrajahiopsparse.hpp" + +/** + * GPU-only (PETSc-free) computation of inequality constraint Jacobian values. + * + * Replaces the PETSc-based path that calls + * opflow->modelops.computeinequalityconstraintjacobian followed by + * MatGetRow extraction. Writes directly into device memory using RAJA + * kernels, without PETSc Mat/Vec operations; no H2D, D2H copies back and forth. + * + * @param opflow The OPFLOW problem context + * @param x_dev Device array of variable values + * @param jacd_dev Device output array for inequality Jacobian values + * (points to the ineq portion of the sparse Jacobian, + * i.e. MJacS_dev + nnz_eqjacsp) + */ +void ComputeIneqJacValuesGPU_PBPOLRAJAHIOPSPARSE(OPFLOW opflow, + const double *x_dev, + double *jacd_dev); + +#endif // EXAGO_ENABLE_HIOP_SPARSE +#endif // EXAGO_ENABLE_RAJA diff --git a/src/opflow/model/power_bal_hiop/pbpolrajahiopsparsekernels.cpp b/src/opflow/model/power_bal_hiop/pbpolrajahiopsparsekernels.cpp index adc10c8e..efddb6f6 100644 --- a/src/opflow/model/power_bal_hiop/pbpolrajahiopsparsekernels.cpp +++ b/src/opflow/model/power_bal_hiop/pbpolrajahiopsparsekernels.cpp @@ -14,7 +14,17 @@ #include #include "pbpolrajahiopsparsekernels.hpp" #include "pbpolrajahiopsparse.hpp" - +#include "pbpolrajahiopsparse_gpu.hpp" + +/** + * @brief Set the initial guess array for the PBPOLRAJAHIOPSPARSE model. + * + * Sets the inital guess on the host and copies it to `x0_dev`. + * + * @param opflow The OPFLOW object. + * @param x0_dev The device array for the initial guess. + * @return PetscErrorCode indicating success or failure. + */ PetscErrorCode OPFLOWSetInitialGuessArray_PBPOLRAJAHIOPSPARSE(OPFLOW opflow, double *x0_dev) { PetscErrorCode ierr; @@ -43,6 +53,17 @@ PetscErrorCode OPFLOWSetInitialGuessArray_PBPOLRAJAHIOPSPARSE(OPFLOW opflow, PetscFunctionReturn(0); } +/** + * @brief Set the variable bounds arrays for the PBPOLRAJAHIOPSPARSE model. + * + * Sets lower and upper variable bounds on the host and copies them to `xl_dev` + * and `xu_dev`, respectively. + * + * @param opflow The OPFLOW object. + * @param xl_dev The device array for the lower constraint bounds. + * @param xu_dev The device array for the upper constraint bounds. + * @return PetscErrorCode indicating success or failure. + */ PetscErrorCode OPFLOWSetVariableBoundsArray_PBPOLRAJAHIOPSPARSE(OPFLOW opflow, double *xl_dev, double *xu_dev) { @@ -75,6 +96,17 @@ OPFLOWSetVariableBoundsArray_PBPOLRAJAHIOPSPARSE(OPFLOW opflow, double *xl_dev, PetscFunctionReturn(0); } +/** + * @brief Set the constraint bounds arrays for the PBPOLRAJAHIOPSPARSE model. + * + * Sets the constraint bounds on the host and copies them to `gl_dev` and + * `gu_dev`. + * + * @param opflow The OPFLOW object. + * @param gl_dev The device array for the lower constraint bounds. + * @param gu_dev The device array for the upper constraint bounds. + * @return PetscErrorCode indicating success or failure. + */ PetscErrorCode OPFLOWSetConstraintBoundsArray_PBPOLRAJAHIOPSPARSE( OPFLOW opflow, double *gl_dev, double *gu_dev) { @@ -110,11 +142,24 @@ PetscErrorCode OPFLOWSetConstraintBoundsArray_PBPOLRAJAHIOPSPARSE( PetscFunctionReturn(0); } -/** EQUALITY CONSTRAINTS */ +/** + * @brief Compute the equality constraints residual for the PBPOLRAJAHIOPSPARSE + * model. + * + * Computes the equality constraints on the device using the current iterate + * `x_dev` and stores the result in `ge_dev`. + * + * @param opflow The OPFLOW object. + * @param x_dev The device array for the current solutioniterate. + * @param ge_dev The device array for the equality constraint residuals. + * @return PetscErrorCode indicating success or failure. + */ PetscErrorCode OPFLOWComputeEqualityConstraintsArray_PBPOLRAJAHIOPSPARSE( OPFLOW opflow, const double *x_dev, double *ge_dev) { PbpolModelRajaHiop *pbpolrajahiopsparse = reinterpret_cast(opflow->model); + + // Get device pointers for model parameters BUSParamsRajaHiop *busparams = &pbpolrajahiopsparse->busparams; GENParamsRajaHiop *genparams = &pbpolrajahiopsparse->genparams; LOADParamsRajaHiop *loadparams = &pbpolrajahiopsparse->loadparams; @@ -128,7 +173,7 @@ PetscErrorCode OPFLOWComputeEqualityConstraintsArray_PBPOLRAJAHIOPSPARSE( PetscFunctionBegin; // PetscPrintf(MPI_COMM_SELF,"Entered Equality constraints\n"); - // Zero out array + // Zero out array with constraint residuals auto &resmgr = umpire::ResourceManager::getInstance(); resmgr.memset(ge_dev, 0, opflow->nconeq * sizeof(double)); @@ -263,7 +308,18 @@ PetscErrorCode OPFLOWComputeEqualityConstraintsArray_PBPOLRAJAHIOPSPARSE( PetscFunctionReturn(0); } -/** INEQUALITY CONSTRAINTS **/ +/** + * @brief Compute the inequality constraints residual for the + * PBPOLRAJAHIOPSPARSE model. + * + * Computes the inequality constraints on the device using the current solution + * iterate `x_dev` and stores the result in `gi_dev`. + * + * @param opflow The OPFLOW object. + * @param x_dev The device array for the current solution iterate. + * @param gi_dev The device array for the inequality constraint residuals. + * @return PetscErrorCode indicating success or failure. + */ PetscErrorCode OPFLOWComputeInequalityConstraintsArray_PBPOLRAJAHIOPSPARSE( OPFLOW opflow, const double *x_dev, double *gi_dev) { PbpolModelRajaHiop *pbpolrajahiopsparse = @@ -275,7 +331,7 @@ PetscErrorCode OPFLOWComputeInequalityConstraintsArray_PBPOLRAJAHIOPSPARSE( PetscFunctionBegin; // PetscPrintf(MPI_COMM_SELF,"Entered Inequality Constraints\n"); - // Zero out array + // Zero out residual array auto &resmgr = umpire::ResourceManager::getInstance(); resmgr.memset(gi_dev, 0, opflow->nconineq * sizeof(double)); @@ -329,10 +385,24 @@ PetscErrorCode OPFLOWComputeInequalityConstraintsArray_PBPOLRAJAHIOPSPARSE( PetscFunctionReturn(0); } -/** OBJECTIVE FUNCTION **/ -// Note: This kernel (and all the kernels for this model assume that the data -// has been already allocated on the device. x_dev is pointer to array on the -// GPU +/** @brief Compute the objective function value for the PBPOLRAJAHIOPSPARSE + * model. + * + * Computes the objective function value on the device using the current + * solution iterate `x_dev` and stores the result in `obj`. + * + * @param[inout] opflow The OPFLOW object. + * @param[in] x_dev The device array for the current solution iterate. + * @param[out] obj The pointer to the scalar with the objective function value. + * @return PetscErrorCode indicating success or failure. + * + * @note This kernel (and all the kernels for this model assume that the data + * has been already allocated on the device. x_dev is pointer to array on the + * GPU. + * + * @todo We need to figure out how to manage PetscScalar vs double types in + * these kernels. + */ PetscErrorCode OPFLOWComputeObjectiveArray_PBPOLRAJAHIOPSPARSE( OPFLOW opflow, const double *x_dev, double *obj) { PbpolModelRajaHiop *pbpolrajahiopsparse = @@ -356,10 +426,10 @@ PetscErrorCode OPFLOWComputeObjectiveArray_PBPOLRAJAHIOPSPARSE( int *l_xidx = loadparams->xidx_dev_; int *b_xidxpimb = busparams->xidxpimb_dev_; - /* Generator objective function contributions */ // Set up reduce sum object RAJA::ReduceSum obj_val_sum(0.0); - // Compute reduction on CUDA device + + // Generation cost contributions to the objective function RAJA::forall( RAJA::RangeSegment(0, genparams->ngenON), RAJA_LAMBDA(RAJA::Index_type i) { @@ -368,6 +438,7 @@ PetscErrorCode OPFLOWComputeObjectiveArray_PBPOLRAJAHIOPSPARSE( cost_beta[i] * Pg + cost_gamma[i]); }); + // Load loss contributions to the objective function if (opflow->include_loadloss_variables) { RAJA::forall( RAJA::RangeSegment(0, loadparams->nload), @@ -392,6 +463,7 @@ PetscErrorCode OPFLOWComputeObjectiveArray_PBPOLRAJAHIOPSPARSE( }); } + // Copy value of the sum reduction to the output value. *obj = static_cast(obj_val_sum.get()); ierr = PetscLogFlops(genparams->ngenON * 8.0); CHKERRQ(ierr); @@ -400,7 +472,17 @@ PetscErrorCode OPFLOWComputeObjectiveArray_PBPOLRAJAHIOPSPARSE( PetscFunctionReturn(0); } -/** GRADIENT **/ +/** @brief Compute the gradient of the objective function for the + * PBPOLRAJAHIOPSPARSE model. + * + * Computes the objective function gradient on the device using the + * current solution iterate `x_dev` and stores the result in `grad_dev`. + * + * @param opflow The OPFLOW object. + * @param x_dev The device array with the current solution iterate. + * @param grad_dev The device array for the objective function gradient. + * @return PetscErrorCode indicating success or failure. + */ PetscErrorCode OPFLOWComputeGradientArray_PBPOLRAJAHIOPSPARSE( OPFLOW opflow, const double *x_dev, double *grad_dev) { PbpolModelRajaHiop *pbpolrajahiopsparse = @@ -468,6 +550,23 @@ PetscErrorCode OPFLOWComputeGradientArray_PBPOLRAJAHIOPSPARSE( PetscFunctionReturn(0); } +/** + * @brief Compute the Jacobian of the inequality constraints for the + * PBPOLRAJAHIOPSPARSE model. + * + * Takes current iterate of the solution vector x_dev and computes the + * Jacobian of the inequality constraints. The solution is stored in triplet + * format on the device in vectors iJacS_dev, jJacS_dev, and MJacS_dev, + * respectively. + * + * @param[inout] opflow The OPFLOW object. + * @param[in] x_dev The device array with the current solution iterate. + * @param[out] iJacS_dev The device array for the row indices of the Jacobian. + * @param[out] jJacS_dev The device array for the column indices of the + * Jacobian. + * @param[out] MJacS_dev The device array for the values of the Jacobian. + * @return PetscErrorCode indicating success or failure. + */ PetscErrorCode OPFLOWComputeSparseInequalityConstraintJacobian_PBPOLRAJAHIOPSPARSE( OPFLOW opflow, const double *x_dev, int *iJacS_dev, int *jJacS_dev, @@ -487,11 +586,11 @@ OPFLOWComputeSparseInequalityConstraintJacobian_PBPOLRAJAHIOPSPARSE( PetscFunctionBegin; - if (MJacS_dev == NULL) { - /* Set locations only */ + // If sparsity pattern does not exist, create it! + if (iJacS_dev != NULL && jJacS_dev != NULL) { + // Create arrays on host to store i,j, and val arrays if (opflow->Nconineq) { - // Create arrays on host to store i,j, and val arrays umpire::Allocator h_allocator_ = resmgr.getAllocator("HOST"); pbpolrajahiopsparse->i_jacineq = @@ -540,45 +639,20 @@ OPFLOWComputeSparseInequalityConstraintJacobian_PBPOLRAJAHIOPSPARSE( ierr = PetscLogEventEnd(opflow->ineqconsjaclogger, 0, 0, 0, 0); CHKERRQ(ierr); } - } else { + } + + // TODO: This is bad! If MJacS_dev is NULL, this function will quietly do + // nothing. We should at least throw an error or warning. + if (MJacS_dev != NULL) { if (opflow->Nconineq) { ierr = PetscLogEventBegin(opflow->ineqconsjaclogger, 0, 0, 0, 0); CHKERRQ(ierr); - ierr = VecGetArray(opflow->X, &x); - CHKERRQ(ierr); - - // Copy from device to host - umpire::Allocator h_allocator_ = resmgr.getAllocator("HOST"); - registerWith(x, opflow->nx, resmgr, h_allocator_); - resmgr.copy((double *)x, (double *)x_dev); - - ierr = VecRestoreArray(opflow->X, &x); - CHKERRQ(ierr); - - /* Compute inequality constraint jacobian */ - ierr = (*opflow->modelops.computeinequalityconstraintjacobian)( - opflow, opflow->X, opflow->Jac_Gi); - CHKERRQ(ierr); - - ierr = MatGetSize(opflow->Jac_Gi, &nrow, &ncol); - CHKERRQ(ierr); - - values = pbpolrajahiopsparse->val_jacineq; - /* Copy over values */ - for (i = 0; i < nrow; i++) { - ierr = MatGetRow(opflow->Jac_Gi, i, &nvals, &cols, &vals); - CHKERRQ(ierr); - for (j = 0; j < nvals; j++) { - values[j] = vals[j]; - } - values += nvals; - ierr = MatRestoreRow(opflow->Jac_Gi, i, &nvals, &cols, &vals); - CHKERRQ(ierr); - } - // Copy over val_jacineq to device - resmgr.copy(MJacS_dev + opflow->nnz_eqjacsp, - pbpolrajahiopsparse->val_jacineq); + /* KS: Compute inequality constraint Jacobian directly on device. + No H2D, D2H copies: x_dev is already on device, output goes + straight into the ineq portion of MJacS_dev. */ + ComputeIneqJacValuesGPU_PBPOLRAJAHIOPSPARSE( + opflow, x_dev, MJacS_dev + opflow->nnz_eqjacsp); ierr = PetscLogEventEnd(opflow->ineqconsjaclogger, 0, 0, 0, 0); CHKERRQ(ierr); @@ -588,6 +662,23 @@ OPFLOWComputeSparseInequalityConstraintJacobian_PBPOLRAJAHIOPSPARSE( PetscFunctionReturn(0); } +/** + * @brief Compute the Jacobian of the equality constraints for the + * PBPOLRAJAHIOPSPARSE model. + * + * Takes current iterate of the solution vector x_dev and computes the + * Jacobian of the equality constraints. The solution is stored in triplet + * format on the device in vectors iJacS_dev, jJacS_dev, and MJacS_dev, + * respectively. + * + * @param[inout] opflow The OPFLOW object. + * @param[in] x_dev The device array with the current solution iterate. + * @param[out] iJacS_dev The device array for the row indices of the Jacobian. + * @param[out] jJacS_dev The device array for the column indices of the + * Jacobian. + * @param[out] MJacS_dev The device array for the values of the Jacobian. + * @return PetscErrorCode indicating success or failure. + */ PetscErrorCode OPFLOWComputeSparseEqualityConstraintJacobian_PBPOLRAJAHIOPSPARSE( OPFLOW opflow, const double *x_dev, int *iJacS_dev, int *jJacS_dev, @@ -607,13 +698,16 @@ OPFLOWComputeSparseEqualityConstraintJacobian_PBPOLRAJAHIOPSPARSE( PetscFunctionBegin; - if (MJacS_dev == NULL) { + // If sparsity pattern has not been created, create it. + // This only needs to be done once since the sparsity pattern of the Jacobian + // does not change during the optimization. + if (iJacS_dev != NULL && jJacS_dev != NULL) { /* Set locations only */ roffset = 0; coffset = 0; - // Create arrays on host to store i,j, and val arrays + // Create arrays on the host to store i, j, and val arrays umpire::Allocator h_allocator_ = resmgr.getAllocator("HOST"); pbpolrajahiopsparse->i_jaceq = @@ -626,6 +720,9 @@ OPFLOWComputeSparseEqualityConstraintJacobian_PBPOLRAJAHIOPSPARSE( iRowstart = pbpolrajahiopsparse->i_jaceq; jColstart = pbpolrajahiopsparse->j_jaceq; + // Function pointer computeequalityconstraintjacobian points to + // OPFLOWComputeEqualityConstraintJacobian_PBPOL function. + // Use function from PBPOL model to create the sparsity pattern. ierr = (*opflow->modelops.computeequalityconstraintjacobian)( opflow, opflow->X, opflow->Jac_Ge); CHKERRQ(ierr); @@ -651,7 +748,9 @@ OPFLOWComputeSparseEqualityConstraintJacobian_PBPOLRAJAHIOPSPARSE( // Copy over i_jaceq and j_jaceq arrays to device resmgr.copy(iJacS_dev, pbpolrajahiopsparse->i_jaceq); resmgr.copy(jJacS_dev, pbpolrajahiopsparse->j_jaceq); - } else { + } + + if (MJacS_dev != NULL) { ierr = PetscLogEventBegin(opflow->eqconsjaclogger, 0, 0, 0, 0); CHKERRQ(ierr); @@ -666,7 +765,10 @@ OPFLOWComputeSparseEqualityConstraintJacobian_PBPOLRAJAHIOPSPARSE( ierr = VecRestoreArray(opflow->X, &x); CHKERRQ(ierr); - /* Compute equality constraint jacobian */ + // Compute equality constraint jacobian on the host + // Function pointer computeequalityconstraintjacobian points to the + // implementation OPFLOWComputeEqualityConstraintJacobian_PBPOL in the + // PBPOL model. ierr = (*opflow->modelops.computeequalityconstraintjacobian)( opflow, opflow->X, opflow->Jac_Ge); CHKERRQ(ierr); @@ -676,7 +778,8 @@ OPFLOWComputeSparseEqualityConstraintJacobian_PBPOLRAJAHIOPSPARSE( values = pbpolrajahiopsparse->val_jaceq; - /* Copy over values */ + // Unpack PETSc matrix and copy values to the host array in the + // PbpolModelRajaHiop struct. for (i = 0; i < nrow; i++) { ierr = MatGetRow(opflow->Jac_Ge, i, &nvals, &cols, &vals); CHKERRQ(ierr); @@ -688,7 +791,7 @@ OPFLOWComputeSparseEqualityConstraintJacobian_PBPOLRAJAHIOPSPARSE( CHKERRQ(ierr); } - // Copy over val_ineq to device + // Copy over val_jaceq to device resmgr.copy(MJacS_dev, pbpolrajahiopsparse->val_jaceq); ierr = PetscLogEventEnd(opflow->eqconsjaclogger, 0, 0, 0, 0); @@ -698,6 +801,19 @@ OPFLOWComputeSparseEqualityConstraintJacobian_PBPOLRAJAHIOPSPARSE( PetscFunctionReturn(0); } +/** + * @brief Compute the Hessian of the Lagrangian for the PBPOLRAJAHIOPSPARSE + * model. + * + * @param[inout] opflow The OPFLOW object. + * @param[in] x_dev The device array with the current solution iterate. + * @param[out] lambda_dev The device array with the current Lagrange + * multipliers. + * @param[out] iHSS_dev The device array for the row indices of the Hessian. + * @param[out] jHSS_dev The device array for the column indices of the Hessian. + * @param[out] MHSS_dev The device array for the values of the Hessian. + * @return PetscErrorCode indicating success or failure. + */ PetscErrorCode OPFLOWComputeSparseHessian_PBPOLRAJAHIOPSPARSE( OPFLOW opflow, const double *x_dev, const double *lambda_dev, int *iHSS_dev, int *jHSS_dev, double *MHSS_dev) { @@ -731,16 +847,19 @@ PetscErrorCode OPFLOWComputeSparseHessian_PBPOLRAJAHIOPSPARSE( iRow = pbpolrajahiopsparse->i_hess; jCol = pbpolrajahiopsparse->j_hess; + // Function pointer computehessian points to the function + // OPFLOWComputeHessian_PBPOL in PBPOL model. ierr = (*opflow->modelops.computehessian)( opflow, opflow->X, opflow->Lambdae, opflow->Lambdai, opflow->Hes); CHKERRQ(ierr); ierr = MatGetSize(opflow->Hes, &nrow, &nrow); CHKERRQ(ierr); - /* Copy over locations to triplet format */ - /* Note that HIOP requires a upper triangular Hessian as oppposed - to IPOPT which requires a lower triangular Hessian - */ + // Copy over locations to triplet format + // + // Note that HIOP requires a upper triangular Hessian as oppposed + // to IPOPT which requires a lower triangular Hessian + // for (i = 0; i < nrow; i++) { ierr = MatGetRow(opflow->Hes, i, &nvals, &cols, &vals); CHKERRQ(ierr); @@ -788,7 +907,9 @@ PetscErrorCode OPFLOWComputeSparseHessian_PBPOLRAJAHIOPSPARSE( CHKERRQ(ierr); } - /* Compute Hessian */ + // Compute Hessian on the host + // Function pointer computehessian points to the function + // OPFLOWComputeHessian_PBPOL in PBPOL model. ierr = (*opflow->modelops.computehessian)( opflow, opflow->X, opflow->Lambdae, opflow->Lambdai, opflow->Hes); CHKERRQ(ierr); @@ -803,6 +924,8 @@ PetscErrorCode OPFLOWComputeSparseHessian_PBPOLRAJAHIOPSPARSE( ierr = VecRestoreArray(opflow->Lambda, &lambda); CHKERRQ(ierr); + // It does not seem that computeauxhessian is set, so this if + // condition will evaluate to false. if (opflow->modelops.computeauxhessian) { ierr = VecGetArray(opflow->X, &x); CHKERRQ(ierr); diff --git a/src/opflow/model/power_bal_hiop/pbpolrajahiopsparsekernels.hpp b/src/opflow/model/power_bal_hiop/pbpolrajahiopsparsekernels.hpp index 9b941f3e..2392748b 100644 --- a/src/opflow/model/power_bal_hiop/pbpolrajahiopsparsekernels.hpp +++ b/src/opflow/model/power_bal_hiop/pbpolrajahiopsparsekernels.hpp @@ -13,9 +13,9 @@ /** @brief Takes a raw pointer to some data and registers it with the - allocator and resource manager. + Umpire allocator and resource manager. - TODO: Ensure that we do not have to deregister the allocation with + @todo Ensure that we do not have to deregister the allocation with the resource manager. This is done with `resmgr.deregisterAllocation(T* ptr)`, but must we do this with ever allocation? Will we incurr a memory leak if not? diff --git a/src/opflow/solver/hiop/opflow_hiopsparsegpu.cpp b/src/opflow/solver/hiop/opflow_hiopsparsegpu.cpp index d7a9539d..d768e738 100644 --- a/src/opflow/solver/hiop/opflow_hiopsparsegpu.cpp +++ b/src/opflow/solver/hiop/opflow_hiopsparsegpu.cpp @@ -69,20 +69,10 @@ bool OPFLOWHIOPSPARSEGPUInterface::get_sparse_blocks_info( nnz_sparse_Jaceq = opflow->nnz_eqjacsp = info_eq.nz_used; - nnz_sparse_Jacineq = 0; - if (opflow->Nconineq) { - ierr = (*opflow->modelops.computeinequalityconstraintjacobian)( - opflow, opflow->X, opflow->Jac_Gi); - CHKERRQ(ierr); - ierr = - MatSetOption(opflow->Jac_Gi, MAT_NEW_NONZERO_LOCATION_ERR, PETSC_TRUE); - CHKERRQ(ierr); - - ierr = MatGetInfo(opflow->Jac_Gi, MAT_LOCAL, &info_ineq); - CHKERRQ(ierr); - - nnz_sparse_Jacineq = opflow->nnz_ineqjacsp = info_ineq.nz_used; - } + /* KS: Use pre-computed nnz_ineqjacsp from model setup (avoids PETSc Mat + assembly just for counting non-zeros -- not sure if faster or if it scales + but hey no PETSc!). */ + nnz_sparse_Jacineq = opflow->nnz_ineqjacsp; /* Compute non-zeros for Hessian */ ierr = (*opflow->modelops.computehessian)(opflow, opflow->X, opflow->Lambdae, diff --git a/tests/unit/CMakeLists.txt b/tests/unit/CMakeLists.txt index ace550c4..b052d727 100644 --- a/tests/unit/CMakeLists.txt +++ b/tests/unit/CMakeLists.txt @@ -13,6 +13,17 @@ add_executable(test_pflow test_pflow.cpp utils/test_acopf_utils.cpp) target_link_libraries(test_pflow ExaGO::PFLOW) target_include_directories(test_pflow PRIVATE ./utils) +if(EXAGO_ENABLE_RAJA AND EXAGO_ENABLE_HIOP_SPARSE) + if(EXAGO_ENABLE_CUDA) + set_source_files_properties(test_ineqjac_gpu.cpp PROPERTIES LANGUAGE CUDA) + endif() + add_executable(test_ineqjac_gpu test_ineqjac_gpu.cpp) + target_link_libraries(test_ineqjac_gpu ExaGO::OPFLOW) + target_include_directories( + test_ineqjac_gpu PRIVATE ${CMAKE_SOURCE_DIR}/src/opflow + ) +endif() + add_executable(test_error_handler test_error_handler.cpp) target_link_libraries(test_error_handler ExaGO::UTILS) @@ -49,6 +60,22 @@ if(EXAGO_RUN_TESTS) ${network_files} ) + if(EXAGO_ENABLE_RAJA AND EXAGO_ENABLE_HIOP_SPARSE) + exago_add_test( + NAME + "UNIT_TEST_INEQJAC_GPU" + DEPENDS + HIOP + COMMAND + ${RUNCMD} + $ + -opflow_genbusvoltage + VARIABLE_WITHIN_BOUNDS + NETFILES + ${network_files} + ) + endif() + exago_add_test( NAME UNIT_TESTS_UTILS COMMAND $ ) diff --git a/tests/unit/opflow/CMakeLists.txt b/tests/unit/opflow/CMakeLists.txt index 2f09e12f..a312cf31 100644 --- a/tests/unit/opflow/CMakeLists.txt +++ b/tests/unit/opflow/CMakeLists.txt @@ -1 +1,2 @@ add_subdirectory(objective) +add_subdirectory(constraint_jacobian) diff --git a/tests/unit/opflow/constraint_jacobian/CMakeLists.txt b/tests/unit/opflow/constraint_jacobian/CMakeLists.txt new file mode 100644 index 00000000..5a69e533 --- /dev/null +++ b/tests/unit/opflow/constraint_jacobian/CMakeLists.txt @@ -0,0 +1,2 @@ +add_subdirectory(equality) +add_subdirectory(inequality) diff --git a/tests/unit/opflow/constraint_jacobian/equality/CECJ_unittest1.m b/tests/unit/opflow/constraint_jacobian/equality/CECJ_unittest1.m index 223e8ba3..854dd4e3 100644 --- a/tests/unit/opflow/constraint_jacobian/equality/CECJ_unittest1.m +++ b/tests/unit/opflow/constraint_jacobian/equality/CECJ_unittest1.m @@ -4,17 +4,19 @@ mpc.baseMVA = 100.00; %% bus data +% bus_i type Pd Qd Gs Bs area Vm Va baseKV zone Vmax Vmin mpc.bus = [ -1 1 0.00 0.00 0.00 0.00 1 2.0000000 0.000000 138.00 1 1.100 0.900 -2 1 0.00 0.00 0.25 -0.05 1 2.0000000 0.000000 138.00 1 1.100 0.900 -3 3 0.00 0.00 0.00 0.00 1 2.0000000 30.000000 13.80 1 1.100 0.900 -4 1 -3.40 8.80 0.00 0.00 1 2.0000000 0.000000 138.00 1 1.100 0.900 -5 1 0.00 0.00 0.00 0.00 1 2.0000000 0.000000 138.00 1 1.100 0.900 + 1 1 0.00 0.00 0.00 0.00 1 2.0000000 0.000000 138.00 1 1.100 0.900 + 2 1 0.00 0.00 0.25 -0.05 1 2.0000000 0.000000 138.00 1 1.100 0.900 + 3 3 0.00 0.00 0.00 0.00 1 2.0000000 30.000000 13.80 1 1.100 0.900 + 4 1 -3.40 8.80 0.00 0.00 1 2.0000000 0.000000 138.00 1 1.100 0.900 + 5 1 0.00 0.00 0.00 0.00 1 2.0000000 0.000000 138.00 1 1.100 0.900 ]; %% generator data +% bus Pg Qg Qmax Qmin Vg mBase status Pmax Pmin Pc1 Pc2 Qc1min Qc1max Qc2min Qc2max ramp_agc ramp_10 ramp_30 ramp_q apf mpc.gen = [ -3 1.60 -2.20 9900.00 -9900.00 2.0000 100.00 1 1.60 1.60 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 10.0000 + 3 1.60 -2.20 9900.00 -9900.00 2.0000 100.00 1 1.60 1.60 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 10.0000 ]; %% generator cost data @@ -23,11 +25,12 @@ ]; %% branch data +% fbus tbus r x b rateA rateB rateC ratio angle status angmin angmax mpc.branch = [ -1 2 2.000000 1.000000 1.20000 0.00 0.00 0.00 0.00000 0.000 1 0.00 0.00 0.00 0.00 0.00 0.00 -2 3 2.000000 1.000000 1.20000 0.00 0.00 0.00 2.00000 60.000 1 0.00 0.00 0.00 0.00 0.00 0.00 -2 4 2.000000 1.000000 1.20000 0.00 0.00 0.00 0.00000 0.000 1 0.00 0.00 0.00 0.00 0.00 0.00 -4 5 2.000000 1.000000 1.20000 0.00 0.00 0.00 0.00000 0.000 1 0.00 0.00 0.00 0.00 0.00 0.00 + 1 2 2.000000 1.000000 1.20000 0.00 0.00 0.00 0.00000 0.000 1 0.00 0.00 0.00 0.00 0.00 0.00 + 2 3 2.000000 1.000000 1.20000 0.00 0.00 0.00 2.00000 60.000 1 0.00 0.00 0.00 0.00 0.00 0.00 + 2 4 2.000000 1.000000 1.20000 0.00 0.00 0.00 0.00000 0.000 1 0.00 0.00 0.00 0.00 0.00 0.00 + 4 5 2.000000 1.000000 1.20000 0.00 0.00 0.00 0.00000 0.000 1 0.00 0.00 0.00 0.00 0.00 0.00 ]; %% bus names diff --git a/tests/unit/opflow/constraint_jacobian/equality/CMakeLists.txt b/tests/unit/opflow/constraint_jacobian/equality/CMakeLists.txt new file mode 100644 index 00000000..8288f4ce --- /dev/null +++ b/tests/unit/opflow/constraint_jacobian/equality/CMakeLists.txt @@ -0,0 +1,90 @@ +find_package(Python) +if(NOT Python_FOUND) + return() +endif() + +if(EXAGO_ENABLE_RAJA AND EXAGO_ENABLE_CUDA) + set_source_files_properties(jac_eq_acopf.cpp PROPERTIES LANGUAGE CUDA) +endif() + +add_executable( + jac_eq_acopf jac_eq_acopf.cpp + ${CMAKE_SOURCE_DIR}/tests/unit/utils/test_acopf_utils.cpp +) +target_link_libraries(jac_eq_acopf ExaGO::OPFLOW) +target_include_directories( + jac_eq_acopf PRIVATE ${CMAKE_SOURCE_DIR}/tests/unit/utils +) +target_include_directories( + jac_eq_acopf PRIVATE ${CMAKE_SOURCE_DIR}/tests/unit/opflow +) + +# Network files to run on - doing 3 and 600 bus examples. +set(prefix ${CMAKE_SOURCE_DIR}/datafiles/unit/opflow/objective/) +# Map num_copies to a specific netfile +set(num_copies 1 3 600) + +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/cecj.csv ${CMAKE_CURRENT_BINARY_DIR}/cecj.csv + COPYONLY +) +foreach(n IN LISTS num_copies) + execute_process( + COMMAND ${Python_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/gen_network.py ${n} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + ) +endforeach() + +set(solvers "") +set(models "") +set(dependencies "") + +# Set up Ipopt solver tests if enabled +if(EXAGO_ENABLE_IPOPT) + list(APPEND solvers IPOPT) + list(APPEND models POWER_BALANCE_POLAR) + list(APPEND dependencies IPOPT) +endif() + +# Set up HIOPSPARSE solver tests if enabled +if(TARGET HiOp::SPARSE) + list(APPEND solvers HIOPSPARSE) + list(APPEND models POWER_BALANCE_POLAR) + list(APPEND dependencies HIOP_SPARSE) +endif() + +if(EXAGO_RUN_TESTS) + foreach( + model + solver + dependency + IN + ZIP_LISTS + models + solvers + dependencies + ) + # Iterate over networks, matching network file to num_copies + foreach(num IN LISTS num_copies) + set(testname + "UNIT_TESTS_EQUALITY_CONSTRAINT_JACOBIAN_${num}_${solver}_${model}" + ) + exago_add_test( + NAME + ${testname} + DEPENDS + ${dependency} + COMMAND + ${RUNCMD} + $ + -opflow_model + ${model} + -opflow_solver + ${solver} + -num_copies + ${num} + ) + set_tests_properties(${testname} PROPERTIES SKIP_RETURN_CODE 2) + endforeach() + endforeach() +endif() diff --git a/tests/unit/opflow/constraint_jacobian/equality/Jacobian.JPG b/tests/unit/opflow/constraint_jacobian/equality/Jacobian.jpg similarity index 100% rename from tests/unit/opflow/constraint_jacobian/equality/Jacobian.JPG rename to tests/unit/opflow/constraint_jacobian/equality/Jacobian.jpg diff --git a/tests/unit/opflow/constraint_jacobian/equality/compute_equality_constraints_jacobian_test_design.md b/tests/unit/opflow/constraint_jacobian/equality/README.md similarity index 92% rename from tests/unit/opflow/constraint_jacobian/equality/compute_equality_constraints_jacobian_test_design.md rename to tests/unit/opflow/constraint_jacobian/equality/README.md index 895238cb..1a7cd6f8 100644 --- a/tests/unit/opflow/constraint_jacobian/equality/compute_equality_constraints_jacobian_test_design.md +++ b/tests/unit/opflow/constraint_jacobian/equality/README.md @@ -73,7 +73,7 @@ In general, solution vector has following elements per bus: For the 5-bus system **CECJ-unittestx1.m**, solution vector is: - +
0 2 0 2 30 2 1.6 -2.2 0 2 0 20 2 0 2 30*PI/180.0 2 1.6 -2.2 0 2 0 2
@@ -132,10 +132,10 @@ With the parameters of the example network the matrix is: Q1 -1.6 -2.0 1.6 -0.4 0 0 0 0 0 0 0 0 -P2 -0.8 -0.8 0.8 2.8 0.8 -0.2 0 0 -0.8 -0.8 0 0 +P2 -0.8 -0.8 0.8 1.81 0.8 -0.2 0 0 -0.8 -0.8 0 0 -Q2 1.6 -0.4 -3.6 -3.8 0.4 0.4 0 0 1.6 -0.4 0 0 +Q2 1.6 -0.4 -3.6 -3.998 0.4 0.4 0 0 1.6 -0.4 0 0 P3 0 0 -0.8 0.2 0.8 1.8 -1 0 0 0 0 0 @@ -170,7 +170,7 @@ To scale the solution vector, following needs to be done: For N=3 the solution vector is: - +
0 2 0 2 30 2 1.6 -2.2 0 2 0 2 0 2 30 2 1.6 -2.2 0 2 0 20 2 30 2 1.6 -2.2 0 2 0 20 2 0 2 30*PI/180.0 2 1.6 -2.2 0 2 0 2 0 2 30*PI/180.0 2 1.6 -2.2 0 2 0 20 2 30*PI/180.0 2 1.6 -2.2 0 2 0 2
diff --git a/tests/unit/opflow/constraint_jacobian/equality/Untitled.m b/tests/unit/opflow/constraint_jacobian/equality/Untitled.m index 643f3bef..dc40f4f5 100644 --- a/tests/unit/opflow/constraint_jacobian/equality/Untitled.m +++ b/tests/unit/opflow/constraint_jacobian/equality/Untitled.m @@ -11,6 +11,7 @@ theta4=deg2rad(0); theta5=deg2rad(0); +mvabase = 100; R=2; X=1; @@ -28,8 +29,8 @@ Pd=-3.4; Qd=8.8; -Gl=0.25; -Bl=-0.05; +Gl=0.25 / mvabase; +Bl=-0.05 / mvabase; theta12=theta1-theta2; diff --git a/tests/unit/opflow/constraint_jacobian/equality/cecj.csv b/tests/unit/opflow/constraint_jacobian/equality/cecj.csv index b6c4eb6d..a1591b6f 100644 --- a/tests/unit/opflow/constraint_jacobian/equality/cecj.csv +++ b/tests/unit/opflow/constraint_jacobian/equality/cecj.csv @@ -10,7 +10,7 @@ 3,1,-0.8 3,2,-0.8 3,3,0.8 -3,4,2.8 +3,4,1.81 3,5,0.8 3,6,-0.2 3,9,-0.8 @@ -18,7 +18,7 @@ 4,1,1.6 4,2,-0.4 4,3,-3.6 -4,4,-3.8 +4,4,-3.998 4,5,0.4 4,6,0.4 4,9,1.6 diff --git a/tests/unit/opflow/constraint_jacobian/equality/gen_network.py b/tests/unit/opflow/constraint_jacobian/equality/gen_network.py new file mode 100644 index 00000000..254306f9 --- /dev/null +++ b/tests/unit/opflow/constraint_jacobian/equality/gen_network.py @@ -0,0 +1,133 @@ +#!/usr/bin/python + +import sys + + +def header(bus_size): + output = [] + output.append("function mpc = CECJ_unittestx" + bus_size + "\n") + output.append("mpc.version = '2';\n") + output.append("mpc.baseMVA = 100.00;\n") + output.append("\n") + return output + + +def bus(bus_size): + output = [] + output.append("%% bus data\n") + output.append("mpc.bus = [\n") + output.append( "1 1 0.00 0.00 0.00 0.00 1 2.0000000 0.000000 138.00 1 1.100 0.900\n") + output.append( "2 1 0.00 0.00 0.25 -0.05 1 2.0000000 0.000000 138.00 1 1.100 0.900\n") + output.append( "3 3 0.00 0.00 0.00 0.00 1 2.0000000 30.000000 13.80 1 1.100 0.900\n") + output.append( "4 1 -3.40 8.00 0.00 0.00 1 2.0000000 0.000000 138.00 1 1.100 0.900\n") + output.append( "5 1 0.00 0.00 0.00 0.00 1 2.0000000 0.000000 138.00 1 1.100 0.900\n") + for i in range(1, int(bus_size)): + bus_idx = (i + 1) * 4 + output.append(f"{bus_idx - 2} " + + "1 0.00 0.00 0.25 -0.05 1 2.0000000 0.000000 138.00 1 1.100 0.900\n") + output.append(f"{bus_idx - 1} " + + "2 0.00 0.00 0.00 0.00 1 2.0000000 30.000000 13.80 1 1.100 0.900\n") + output.append(f"{bus_idx} " + + "1 -3.40 8.00 0.00 0.00 1 2.0000000 0.000000 138.00 1 1.100 0.900\n") + output.append(f"{bus_idx + 1} " + + "1 0.00 0.00 0.00 0.00 1 2.0000000 0.000000 138.00 1 1.100 0.900\n") + output.append("];\n") + output.append("\n") + return output + + +def generator(bus_size): + output = [] + output.append("%% generator data\n") + output.append("mpc.gen = [\n") + for i in range(3, int(bus_size) * 4, 4): + output.append( + f"{i} 1.60 -2.20 9900.00 -9900.00 2.0000 100.00 1 1.60 1.60 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 10.0000\n") + output.append("];\n") + output.append("\n") + return output + + +def gen_cost(bus_size): + output = [] + output.append("%% generator cost data\n") + output.append("mpc.gencost = [\n") + for _ in range(int(bus_size)): + output.append("2 0 0 3 0.010 0.100 8.00 0.0000 \n") + output.append("];\n") + output.append("\n") + return output + + +def branch(bus_size): + output = [] + output.append("%% branch data\n") + output.append("mpc.branch = [\n") + for i in range(int(bus_size)): + bus_idx = (4 * i + 1) + output.append(f"{bus_idx} {bus_idx + 1} " + + "2.000000 1.000000 1.20000 0.00 0.00 0.00 1.00000 0.000 1 0.00 0.00 0.00 0.00 0.00 0.00\n") + output.append(f"{bus_idx + 1} {bus_idx + 2} " + + "2.000000 1.000000 1.20000 0.00 0.00 0.00 2.00000 60.000 1 0.00 0.00 0.00 0.00 0.00 0.00\n") + output.append(f"{bus_idx + 1} {bus_idx + 3} " + + "2.000000 1.000000 1.20000 0.00 0.00 0.00 1.00000 0.000 1 0.00 0.00 0.00 0.00 0.00 0.00\n") + output.append(f"{bus_idx + 3} {bus_idx + 4} " + + "2.000000 1.000000 1.20000 0.00 0.00 0.00 1.00000 0.000 1 0.00 0.00 0.00 0.00 0.00 0.00\n") + output.append("];\n") + output.append("\n") + return output + + +def bus_names(bus_size): + output = [] + output.append("%% bus names\n") + output.append("mpc.bus_name = {\n") + for i in range(int(bus_size) * 4 + 1): + output.append(f"'{i + 1}';\n") + output.append("};\n") + output.append("\n") + return output + + +def gen_types(bus_size): + output = [] + output.append("%% Generator Unit Types\n") + output.append("mpc.gentype = {\n") + for i in range(int(bus_size)): + output.append("'UN';\n") + output.append("};\n") + output.append("\n") + return output + + +def gen_fuel(bus_size): + output = [] + output.append("%% Generator Fuel Types\n") + output.append("mpc.genfuel = {\n") + for i in range(int(bus_size)): + output.append("'unknown';\n") + output.append("};\n") + return output + + +if __name__ == '__main__': + network_length = 0 + + # Script can be called with CLI argument + if (len(sys.argv) < 2): + network_length = input('Enter a network size: ') + else: + network_length = sys.argv[1] + + print(f'Generating a network of size {network_length}') + + output_filename = 'CECJ_unittestx' + network_length + '.m' + + f = open(output_filename, "w+") + + # Loop over file component functions and append to file + for section in [header, bus, generator, gen_cost, branch, bus_names, gen_types, gen_fuel]: + for line in section(network_length): + f.write(line) + + f.close() diff --git a/tests/unit/opflow/constraint_jacobian/equality/jac_eq_acopf.cpp b/tests/unit/opflow/constraint_jacobian/equality/jac_eq_acopf.cpp new file mode 100644 index 00000000..c441fb4a --- /dev/null +++ b/tests/unit/opflow/constraint_jacobian/equality/jac_eq_acopf.cpp @@ -0,0 +1,219 @@ +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +// #include "opflow_tests.h" +#include "test_acopf_utils.h" + +inline constexpr double PI = 3.14159265358979323846; + +PetscErrorCode ConstructSolutionVector(Vec *X, int num_copies); +PetscErrorCode ConstructReferenceJacobian(Mat *J, int num_copies); + +/** + * @brief Unit test driver for objective function + * @see opflow/OpflowTests.hpp for kernel tested by this driver + * + * You can pass two options to the objectiveAcopf executatable through the + * command line (implemented using PETSc options): + * + * ~ -netfile : Specifies the input data file to test against. + * Default value is `//datafiles/case9/case9mod.m`. See directory + * datafiles for other potential inputs. + * + * ~ -num_copies : Specifies the number of replications of the + * network given through `-netfile`. If this is not set properly, test may fail + * + */ +int main(int argc, char **argv) { + PetscBool flg; + + char appname[] = "opflow"; + char help[] = "Unit tests for equality constraint Jacobians running opflow\n"; + + /** Use `ExaGOLogSetLoggingFileName("opflow-logfile");` to log the output. */ + PetscErrorCode ierr = + ExaGOInitialize(MPI_COMM_WORLD, &argc, &argv, appname, help); + if (ierr) { + fprintf(stderr, "Could not initialize ExaGO application %s.\n", appname); + return ierr; + } + + /* Get num_copies from command line */ + int num_copies = 1; + PetscCall(PetscOptionsGetInt(NULL, NULL, "-num_copies", &num_copies, &flg)); + + std::string netfile = "CECJ_unittestx" + std::to_string(num_copies) + ".m"; + // std::string netfile = "CECJ_unittest1.m"; + + Mat J_eq_ref; + ConstructReferenceJacobian(&J_eq_ref, num_copies); + Vec X; + + OPFLOW opflowtest; + // exago::tests::TestOpflow test; + + /* Set up test opflow */ + PetscCall(OPFLOWCreate(PETSC_COMM_WORLD, &opflowtest)); + PetscCall(OPFLOWReadMatPowerData(opflowtest, netfile.c_str())); + PetscCall(OPFLOWSetInitializationType(opflowtest, OPFLOWINIT_FROMFILE)); + PetscCall(OPFLOWSetUp(opflowtest)); + // PetscCall(OPFLOWGetSolution(opflowtest, &X)); + + ConstructSolutionVector(&X, num_copies); + + // If we are using HIOP, need to convert X + // The string lengths must be 65 + std::string modelname; + std::string solvername; + PetscCall(OPFLOWGetModel(opflowtest, &modelname)); + PetscCall(OPFLOWGetSolver(opflowtest, &solvername)); + + int fail = 0; + // if (solvername == "IPOPT") { + Mat J_eq; + Mat J_ineq = nullptr; + PetscCall(OPFLOWGetConstraintJacobian(opflowtest, &J_eq, &J_ineq)); + PetscCall(OPFLOWComputeConstraintJacobian(opflowtest, X, J_eq, J_ineq)); + + // PetscViewerPushFormat(PETSC_VIEWER_STDOUT_SELF, + // PETSC_VIEWER_ASCII_DENSE); PetscCall(MatView(J_eq_ref, + // PETSC_VIEWER_STDOUT_SELF)); PetscCall(VecView(X, + // PETSC_VIEWER_STDOUT_SELF)); PetscCall(MatView(J_eq, + // PETSC_VIEWER_STDOUT_SELF)); + + PetscCall(MatAXPY(J_eq, -1.0, J_eq_ref, UNKNOWN_NONZERO_PATTERN)); + PetscReal norm = 0.0; + PetscCall(MatNorm(J_eq, NORM_INFINITY, &norm)); + std::cout << "Error norm: " << norm << std::endl; + if (norm >= exago::tests::eps) { + ++fail; + ExaGOLog( + EXAGO_LOG_INFO, + "Error between Equality Constraint Jacobians ({}) exceeds tolerance {}", + norm, exago::tests::eps); + } + // } + // TODO: handle other solver types specially as necessary + // else if (solvername == "HIOP") { + // } + // else if (solvername == "HIOPSPARSE") { + // } + // else { + // throw ExaGOError("Unsupported solver name: " + solvername); + // } + + PetscCall(OPFLOWDestroy(&opflowtest)); + + PetscCall(VecDestroy(&X)); + PetscCall(MatDestroy(&J_eq_ref)); + + ExaGOFinalize(); + return fail; +} + +PetscErrorCode ConstructSolutionVector(Vec *X, int num_copies) { + PetscFunctionBeginUser; + + std::vector x_base = {0, 2, 0, 2, 30 * PI / 180.0, 2, 1.6, -2.2, + 0, 2, 0, 2}; + int nvals_base = 12; + int nvals = (nvals_base - 2) * num_copies + 2; + std::vector x; + x.reserve(nvals); + x.assign(begin(x_base), end(x_base)); + std::vector is(nvals); + std::iota(begin(is), end(is), 0); + + for (int n = 1; n < num_copies; ++n) { + for (int i = 2; i < nvals_base; ++i) { + x.push_back(x_base[i]); + } + } + + PetscCall(VecCreateSeq(PETSC_COMM_WORLD, nvals, X)); + PetscCall(VecSetValues(*X, is.size(), is.data(), x.data(), ADD_VALUES)); + PetscCall(VecAssemblyBegin(*X)); + PetscCall(VecAssemblyEnd(*X)); + + PetscFunctionReturn(PETSC_SUCCESS); +} + +PetscErrorCode ConstructReferenceJacobian(Mat *J, int num_copies) { + PetscFunctionBeginUser; + + // Read base Jacobian from file + std::ifstream ifs("cecj.csv"); + if (!ifs) { + throw ExaGOError("Unable to open file: cecj.csv"); + } + std::string line; + int nrows_base, ncols_base; + std::vector i_base; + std::vector j_base; + std::vector v_base; + // Read matrix dimensions + std::getline(ifs, line); + std::istringstream iss(line); + std::string dimstr; + std::getline(iss, dimstr, ','); + std::istringstream(dimstr) >> nrows_base; + std::getline(iss, dimstr, ','); + std::istringstream(dimstr) >> ncols_base; + // Read triples + std::string estr; + while (std::getline(ifs, line)) { + PetscInt i, j; + PetscReal v; + iss = std::istringstream(line); + std::getline(iss, estr, ','); + std::istringstream(estr) >> i; + std::getline(iss, estr, ','); + std::istringstream(estr) >> j; + std::getline(iss, estr, ','); + std::istringstream(estr) >> v; + i_base.push_back(i - 1); + j_base.push_back(j - 1); + v_base.push_back(v); + } + + int nrows = (nrows_base - 2) * num_copies + 2; + int ncols = (ncols_base - 2) * num_copies + 2; + + std::vector i_coo; + std::vector j_coo; + std::vector v_coo; + + std::size_t ncoo = i_base.size() * num_copies; + i_coo.reserve(ncoo); + j_coo.reserve(ncoo); + v_coo.reserve(ncoo); + + i_coo.assign(begin(i_base), end(i_base)); + j_coo.assign(begin(j_base), end(j_base)); + v_coo.assign(begin(v_base), end(v_base)); + + for (int n = 1; n < num_copies; ++n) { + auto row_start = n * (nrows_base - 2); + auto col_start = n * (ncols_base - 2); + for (std::size_t c = 0; c < v_base.size(); ++c) { + i_coo.push_back(row_start + i_base[c]); + j_coo.push_back(col_start + j_base[c]); + v_coo.push_back(v_base[c]); + } + } + + PetscCall(MatCreateSeqAIJFromTriple(PETSC_COMM_WORLD, nrows, ncols, + i_coo.data(), j_coo.data(), v_coo.data(), + J, v_coo.size(), PETSC_FALSE)); + + PetscFunctionReturn(PETSC_SUCCESS); +} diff --git a/tests/unit/opflow/constraint_jacobian/inequality/CICJ_unittest1.m b/tests/unit/opflow/constraint_jacobian/inequality/CICJ_unittest1.m index a3f80557..7e2fb943 100644 --- a/tests/unit/opflow/constraint_jacobian/inequality/CICJ_unittest1.m +++ b/tests/unit/opflow/constraint_jacobian/inequality/CICJ_unittest1.m @@ -24,10 +24,10 @@ %% branch data mpc.branch = [ -1 2 2.000000 1.000000 1.20000 0.00 0.00 0.00 0.00000 0.000 1 0.00 0.00 0.00 -240.00 0.00 -240.00 +1 2 2.000000 1.000000 1.20000 0.00 0.00 0.00 1.00000 0.000 1 0.00 0.00 0.00 -240.00 0.00 -240.00 2 3 2.000000 1.000000 1.20000 0.00 0.00 0.00 2.00000 60.000 1 0.00 0.00 0.00 -140.00 200.00 -240.00 -2 4 2.000000 1.000000 1.20000 0.00 0.00 0.00 0.00000 0.000 1 0.00 0.00 0.00 -240.00 0.00 -240.00 -4 5 2.000000 1.000000 1.20000 0.00 0.00 0.00 0.00000 0.000 1 0.00 0.00 0.00 -240.00 0.00 -240.00 +2 4 2.000000 1.000000 1.20000 0.00 0.00 0.00 1.00000 0.000 1 0.00 0.00 0.00 -240.00 0.00 -240.00 +4 5 2.000000 1.000000 1.20000 0.00 0.00 0.00 1.00000 0.000 1 0.00 0.00 0.00 -240.00 0.00 -240.00 ]; %% bus names diff --git a/tests/unit/opflow/constraint_jacobian/inequality/CMakeLists.txt b/tests/unit/opflow/constraint_jacobian/inequality/CMakeLists.txt new file mode 100644 index 00000000..63d9a252 --- /dev/null +++ b/tests/unit/opflow/constraint_jacobian/inequality/CMakeLists.txt @@ -0,0 +1,90 @@ +find_package(Python) +if(NOT Python_FOUND) + return() +endif() + +if(EXAGO_ENABLE_RAJA AND EXAGO_ENABLE_CUDA) + set_source_files_properties(jac_ineq_acopf.cpp PROPERTIES LANGUAGE CUDA) +endif() + +add_executable( + jac_ineq_acopf jac_ineq_acopf.cpp + ${CMAKE_SOURCE_DIR}/tests/unit/utils/test_acopf_utils.cpp +) +target_link_libraries(jac_ineq_acopf ExaGO::OPFLOW) +target_include_directories( + jac_ineq_acopf PRIVATE ${CMAKE_SOURCE_DIR}/tests/unit/utils +) +target_include_directories( + jac_ineq_acopf PRIVATE ${CMAKE_SOURCE_DIR}/tests/unit/opflow +) + +# Network files to run on - doing 3 and 600 bus examples. +set(prefix ${CMAKE_SOURCE_DIR}/datafiles/unit/opflow/objective/) +# Map num_copies to a specific netfile +set(num_copies 1 3 600) + +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/cicj.csv ${CMAKE_CURRENT_BINARY_DIR}/cicj.csv + COPYONLY +) +foreach(n IN LISTS num_copies) + execute_process( + COMMAND ${Python_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/gen_network.py ${n} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + ) +endforeach() + +set(solvers "") +set(models "") +set(dependencies "") + +# Set up Ipopt solver tests if enabled +if(EXAGO_ENABLE_IPOPT) + list(APPEND solvers IPOPT) + list(APPEND models POWER_BALANCE_POLAR) + list(APPEND dependencies IPOPT) +endif() + +# Set up HIOPSPARSE solver tests if enabled +if(TARGET HiOp::SPARSE) + list(APPEND solvers HIOPSPARSE) + list(APPEND models POWER_BALANCE_POLAR) + list(APPEND dependencies HIOP_SPARSE) +endif() + +if(EXAGO_RUN_TESTS) + foreach( + model + solver + dependency + IN + ZIP_LISTS + models + solvers + dependencies + ) + # Iterate over networks, matching network file to num_copies + foreach(num IN LISTS num_copies) + set(testname + "UNIT_TESTS_INEQUALITY_CONSTRAINT_JACOBIAN_${num}_${solver}_${model}" + ) + exago_add_test( + NAME + ${testname} + DEPENDS + ${dependency} + COMMAND + ${RUNCMD} + $ + -opflow_model + ${model} + -opflow_solver + ${solver} + -num_copies + ${num} + ) + set_tests_properties(${testname} PROPERTIES SKIP_RETURN_CODE 2) + endforeach() + endforeach() +endif() diff --git a/tests/unit/opflow/constraint_jacobian/inequality/compute_inequality_constraints_jacobian_test_design.md b/tests/unit/opflow/constraint_jacobian/inequality/README.md similarity index 95% rename from tests/unit/opflow/constraint_jacobian/inequality/compute_inequality_constraints_jacobian_test_design.md rename to tests/unit/opflow/constraint_jacobian/inequality/README.md index a65c5176..deb47feb 100644 --- a/tests/unit/opflow/constraint_jacobian/inequality/compute_inequality_constraints_jacobian_test_design.md +++ b/tests/unit/opflow/constraint_jacobian/inequality/README.md @@ -107,7 +107,7 @@ In general, solution vector has following elements per bus: 3. Generator MW (if generator bus) 4. Generator MVar (if generator bus) -For the 5-bus system **CEC-unittestx1.m**, solution vector is: +For the 5-bus system **CICJ-unittestx1.m**, solution vector is: @@ -163,10 +163,10 @@ With the parameters of the example network the matrix is: - + - + @@ -184,13 +184,13 @@ With the parameters of the example network the matrix is: - + - + - +
0 2 0 2 30*PI/180.0 2 1.6 -2.2 0 2 0 2 theta1 Vm1 theta2 Vm2 theta3 Vm3 Pg3 Qg3 theta4 Vm4 theta5 Vm5
IEC1 0 0 0 0 0 200 0 -1.5 0 0 0 0IEC1 0 0 0 0 0 4.178 0 -1.5 0 0 0 0
IEC2 0 0 0 0 0 -200 0 -1.5 0 0 0 0IEC2 0 0 0 0 0 0.178 0 -1.5 0 0 0 0
Sf12 7.68 9.6 -7.68 1.92 0 0 0 0 0 0 0 0Sf24 0 0 7.68 9.6 0 0 0 0 -7.68 1.92 0 0
St24 0 0 -7.68 1.92 0 0 0 0 7.68 9.6 1.6 -0.4St24 0 0 -7.68 1.92 0 0 0 0 7.68 9.6 0 0
Sf45 0 0 0 0 0 0 0 0 15.36 19.2 -15.36 3.84Sf45 0 0 0 0 0 0 0 0 7.68 9.6 -7.68 1.92
St45 0 0 0 0 0 0 0 0 -15.36 3.94 15.36 19.2St45 0 0 0 0 0 0 0 0 -7.68 1.92 7.68 9.6
diff --git a/tests/unit/opflow/constraint_jacobian/inequality/Untitled.m b/tests/unit/opflow/constraint_jacobian/inequality/Untitled.m index a88021f1..09862ada 100644 --- a/tests/unit/opflow/constraint_jacobian/inequality/Untitled.m +++ b/tests/unit/opflow/constraint_jacobian/inequality/Untitled.m @@ -12,6 +12,7 @@ theta4=deg2rad(0); theta5=deg2rad(0); +mvabase=100; R=2; X=1; @@ -25,8 +26,8 @@ Pg=1.6; Qg=-2.2; -Qmax=197.8; -Qmin=-202.2; +Qmax=197.8 / mvabase; +Qmin=-202.2 = mvabase; Pd=-3.4; Qd=8.8; @@ -247,10 +248,10 @@ Sf45 = Pf45*Pf45 + Qf45*Qf45; St45 = Pt45*Pt45 + Qt45*Qt45; -dSf45dPf45 = 4*Pf45; -dSf45dQf45 = 4*Qf45; -dSt45dPt45 = 4*Pt45; -dSt45dQt45 = 4*Qt45; +dSf45dPf45 = 2*Pf45; +dSf45dQf45 = 2*Qf45; +dSt45dPt45 = 2*Pt45; +dSt45dQt45 = 2*Qt45; dSf45dVm4 = (dSf45dPf45*dPf45dVm4+ dSf45dQf45*dQf45dVm4)*multiplier; dSf45dVm5 = (dSf45dPf45*dPf45dVm5+ dSf45dQf45*dQf45dVm5)*multiplier; diff --git a/tests/unit/opflow/constraint_jacobian/inequality/cicj.csv b/tests/unit/opflow/constraint_jacobian/inequality/cicj.csv index 97fbb421..539bcfb4 100644 --- a/tests/unit/opflow/constraint_jacobian/inequality/cicj.csv +++ b/tests/unit/opflow/constraint_jacobian/inequality/cicj.csv @@ -1,7 +1,7 @@ 10,12,0 -1,6,200 +1,6,4.178 1,8,-1.5 -2,6,-200 +2,6,0.178 2,8,-1.5 3,1,7.68 3,2,9.6 @@ -12,7 +12,6 @@ 4,3,7.68 4,4,9.6 5,3,-0.32 -5,4,-4.44089209850062e-17 5,5,0.32 5,6,0.32 6,3,-1.28 @@ -27,29 +26,11 @@ 8,4,1.92 8,9,7.68 8,10,9.6 -9,9,15.36 -9,10,19.2 -9,11,-15.36 -9,12,3.84 -10,9,-15.36 -10,10,3.84 -10,11,15.36 -10,12,19.2 -7,9,1.6 -7,10,1.6 -7,11,-0.8 -7,12,-0.8 -8,3,1.6 -8,4,-0.4 -8,9,-3.2 -8,10,-4 -8,11,1.6 -8,12,-0.4 -9,9,-0.8 -9,10,-0.8 -9,11,0.8 -9,12,0.8 -10,9,1.6 -10,10,-0.4 -10,11,-1.6 -10,12,-2 +9,9,7.68 +9,10,9.6 +9,11,-7.68 +9,12,1.92 +10,9,-7.68 +10,10,1.92 +10,11,7.68 +10,12,9.6 diff --git a/tests/unit/opflow/constraint_jacobian/inequality/gen_network.py b/tests/unit/opflow/constraint_jacobian/inequality/gen_network.py new file mode 100644 index 00000000..ffa8f4d1 --- /dev/null +++ b/tests/unit/opflow/constraint_jacobian/inequality/gen_network.py @@ -0,0 +1,133 @@ +#!/usr/bin/python + +import sys + + +def header(bus_size): + output = [] + output.append("function mpc = CICJ_unittestx" + bus_size + "\n") + output.append("mpc.version = '2';\n") + output.append("mpc.baseMVA = 100.00;\n") + output.append("\n") + return output + + +def bus(bus_size): + output = [] + output.append("%% bus data\n") + output.append("mpc.bus = [\n") + output.append( "1 1 0.00 0.00 0.00 0.00 1 2.0000000 0.000000 138.00 1 1.100 0.900\n") + output.append( "2 1 0.00 0.00 0.25 -0.05 1 2.0000000 0.000000 138.00 1 1.100 0.900\n") + output.append( "3 3 0.00 0.00 0.00 0.00 1 0.5000000 30.000000 13.80 1 1.100 0.900\n") + output.append( "4 1 -3.40 8.00 0.00 0.00 1 2.0000000 0.000000 138.00 1 1.100 0.900\n") + output.append( "5 1 0.00 0.00 0.00 0.00 1 2.0000000 0.000000 138.00 1 1.100 0.900\n") + for i in range(1, int(bus_size)): + bus_idx = (i + 1) * 4 + output.append(f"{bus_idx - 2} " + + "1 0.00 0.00 0.25 -0.05 1 2.0000000 0.000000 138.00 1 1.100 0.900\n") + output.append(f"{bus_idx - 1} " + + "2 0.00 0.00 0.00 0.00 1 0.5000000 30.000000 13.80 1 1.100 0.900\n") + output.append(f"{bus_idx} " + + "1 -3.40 8.00 0.00 0.00 1 2.0000000 0.000000 138.00 1 1.100 0.900\n") + output.append(f"{bus_idx + 1} " + + "1 0.00 0.00 0.00 0.00 1 2.0000000 0.000000 138.00 1 1.100 0.900\n") + output.append("];\n") + output.append("\n") + return output + + +def generator(bus_size): + output = [] + output.append("%% generator data\n") + output.append("mpc.gen = [\n") + for i in range(3, int(bus_size) * 4, 4): + output.append( + f"{i} 1.60 -2.20 197.80 -202.20 0.5000 100.00 1 1.60 1.60 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 10.0000\n") + output.append("];\n") + output.append("\n") + return output + + +def gen_cost(bus_size): + output = [] + output.append("%% generator cost data\n") + output.append("mpc.gencost = [\n") + for _ in range(int(bus_size)): + output.append("2 0 0 3 0.010 0.100 8.00 0.0000 \n") + output.append("];\n") + output.append("\n") + return output + + +def branch(bus_size): + output = [] + output.append("%% branch data\n") + output.append("mpc.branch = [\n") + for i in range(int(bus_size)): + bus_idx = (4 * i + 1) + output.append(f"{bus_idx} {bus_idx + 1} " + + "2.000000 1.000000 1.20000 230.00 230.00 230.00 1.00000 0.000 1 0.00 0.00 0.00 -240.00 0.00 -240.00\n") + output.append(f"{bus_idx + 1} {bus_idx + 2} " + + "2.000000 1.000000 1.20000 230.00 230.00 230.00 2.00000 60.000 1 0.00 0.00 0.00 -140.00 200.00 -240.00\n") + output.append(f"{bus_idx + 1} {bus_idx + 3} " + + "2.000000 1.000000 1.20000 230.00 230.00 230.00 1.00000 0.000 1 0.00 0.00 0.00 -240.00 0.00 -240.00\n") + output.append(f"{bus_idx + 3} {bus_idx + 4} " + + "2.000000 1.000000 1.20000 230.00 230.00 230.00 1.00000 0.000 1 0.00 0.00 0.00 -240.00 0.00 -240.00\n") + output.append("];\n") + output.append("\n") + return output + + +def bus_names(bus_size): + output = [] + output.append("%% bus names\n") + output.append("mpc.bus_name = {\n") + for i in range(int(bus_size) * 4 + 1): + output.append(f"'{i + 1}';\n") + output.append("};\n") + output.append("\n") + return output + + +def gen_types(bus_size): + output = [] + output.append("%% Generator Unit Types\n") + output.append("mpc.gentype = {\n") + for i in range(int(bus_size)): + output.append("'UN';\n") + output.append("};\n") + output.append("\n") + return output + + +def gen_fuel(bus_size): + output = [] + output.append("%% Generator Fuel Types\n") + output.append("mpc.genfuel = {\n") + for i in range(int(bus_size)): + output.append("'unknown';\n") + output.append("};\n") + return output + + +if __name__ == '__main__': + network_length = 0 + + # Script can be called with CLI argument + if (len(sys.argv) < 2): + network_length = input('Enter a network size: ') + else: + network_length = sys.argv[1] + + print(f'Generating a network of size {network_length}') + + output_filename = 'CICJ_unittestx' + network_length + '.m' + + f = open(output_filename, "w+") + + # Loop over file component functions and append to file + for section in [header, bus, generator, gen_cost, branch, bus_names, gen_types, gen_fuel]: + for line in section(network_length): + f.write(line) + + f.close() diff --git a/tests/unit/opflow/constraint_jacobian/inequality/jac_ineq_acopf.cpp b/tests/unit/opflow/constraint_jacobian/inequality/jac_ineq_acopf.cpp new file mode 100644 index 00000000..933c33de --- /dev/null +++ b/tests/unit/opflow/constraint_jacobian/inequality/jac_ineq_acopf.cpp @@ -0,0 +1,217 @@ +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +// #include "opflow_tests.h" +#include "test_acopf_utils.h" + +inline constexpr double PI = 3.14159265358979323846; + +PetscErrorCode ConstructSolutionVector(Vec *X, int num_copies); +PetscErrorCode ConstructReferenceJacobian(Mat *J, int num_copies); + +/** + * @brief Unit test driver for objective function + * @see opflow/OpflowTests.hpp for kernel tested by this driver + * + * You can pass two options to the objectiveAcopf executatable through the + * command line (implemented using PETSc options): + * + * ~ -netfile : Specifies the input data file to test against. + * Default value is `//datafiles/case9/case9mod.m`. See directory + * datafiles for other potential inputs. + * + * ~ -num_copies : Specifies the number of replications of the + * network given through `-netfile`. If this is not set properly, test may fail + * + */ +int main(int argc, char **argv) { + PetscBool flg; + + char appname[] = "opflow"; + char help[] = + "Unit tests for inequality constraint Jacobians running opflow\n"; + + /** Use `ExaGOLogSetLoggingFileName("opflow-logfile");` to log the output. */ + PetscErrorCode ierr = + ExaGOInitialize(PETSC_COMM_WORLD, &argc, &argv, appname, help); + if (ierr) { + fprintf(stderr, "Could not initialize ExaGO application %s.\n", appname); + return ierr; + } + + /* Get num_copies from command line */ + int num_copies = 1; + PetscCall(PetscOptionsGetInt(NULL, NULL, "-num_copies", &num_copies, &flg)); + + std::string netfile = "CICJ_unittestx" + std::to_string(num_copies) + ".m"; + + Mat J_ineq_ref; + ConstructReferenceJacobian(&J_ineq_ref, num_copies); + Vec X; + + OPFLOW opflowtest; + // exago::tests::TestOpflow test; + + /* Set up test opflow */ + PetscCall(OPFLOWCreate(PETSC_COMM_WORLD, &opflowtest)); + PetscCall(OPFLOWReadMatPowerData(opflowtest, netfile.c_str())); + // PetscCall(OPFLOWSetInitializationType(opflowtest, OPFLOWINIT_FROMFILE)); + PetscCall(OPFLOWSetGenBusVoltageType(opflowtest, FIXED_WITHIN_QBOUNDS)); + PetscCall(OPFLOWSetUp(opflowtest)); + // PetscCall(OPFLOWGetSolution(opflowtest, &X)); + + ConstructSolutionVector(&X, num_copies); + + // If we are using HIOP, need to convert X + // The string lengths must be 65 + std::string modelname; + std::string solvername; + PetscCall(OPFLOWGetModel(opflowtest, &modelname)); + PetscCall(OPFLOWGetSolver(opflowtest, &solvername)); + + int fail = 0; + // if (solvername == "IPOPT") { + Mat J_eq; + Mat J_ineq; + PetscCall(OPFLOWGetConstraintJacobian(opflowtest, &J_eq, &J_ineq)); + PetscCall(OPFLOWComputeConstraintJacobian(opflowtest, X, J_eq, J_ineq)); + + // PetscViewerPushFormat(PETSC_VIEWER_STDOUT_SELF, PETSC_VIEWER_ASCII_DENSE); + // PetscCall(MatView(J_ineq_ref, PETSC_VIEWER_STDOUT_SELF)); + // PetscCall(VecView(X, PETSC_VIEWER_STDOUT_SELF)); + // PetscCall(MatView(J_ineq, PETSC_VIEWER_STDOUT_SELF)); + + PetscCall(MatAXPY(J_ineq, -1.0, J_ineq_ref, UNKNOWN_NONZERO_PATTERN)); + PetscReal norm = 0.0; + PetscCall(MatNorm(J_ineq, NORM_INFINITY, &norm)); + std::cout << "Error norm: " << norm << std::endl; + if (norm >= exago::tests::eps) { + ++fail; + ExaGOLog(EXAGO_LOG_INFO, + "Error between Inequality Constraint Jacobians ({}) exceeds " + "tolerance {}", + norm, exago::tests::eps); + } + // } + // TODO: handle other solver types specially as necessary + + PetscCall(OPFLOWDestroy(&opflowtest)); + + PetscCall(VecDestroy(&X)); + PetscCall(MatDestroy(&J_ineq_ref)); + + ExaGOFinalize(); + return fail; +} + +PetscErrorCode ConstructSolutionVector(Vec *X, int num_copies) { + PetscFunctionBeginUser; + + std::vector x_base = {0, 2, 0, 2, 30 * PI / 180.0, 2, 1.6, -2.2, + 0, 2, 0, 2}; + int nvals_base = 12; + int nvals = (nvals_base - 2) * num_copies + 2; + std::vector x; + x.reserve(nvals); + x.assign(begin(x_base), end(x_base)); + std::vector is(nvals); + std::iota(begin(is), end(is), 0); + + for (int n = 1; n < num_copies; ++n) { + for (int i = 2; i < nvals_base; ++i) { + x.push_back(x_base[i]); + } + } + + PetscCall(VecCreateSeq(PETSC_COMM_WORLD, nvals, X)); + PetscCall(VecSetValues(*X, is.size(), is.data(), x.data(), ADD_VALUES)); + PetscCall(VecAssemblyBegin(*X)); + PetscCall(VecAssemblyEnd(*X)); + PetscFunctionReturn(PETSC_SUCCESS); +} + +PetscErrorCode ConstructReferenceJacobian(Mat *J, int num_copies) { + PetscFunctionBeginUser; + + // Read base Jacobian from file + std::ifstream ifs("cicj.csv"); + if (!ifs) { + throw ExaGOError("Unable to open file: cicj.csv"); + } + std::string line; + int nrows_base, ncols_base; + std::vector i_base; + std::vector j_base; + std::vector v_base; + // Read matrix dimensions + std::getline(ifs, line); + std::istringstream iss(line); + std::string dimstr; + std::getline(iss, dimstr, ','); + std::istringstream(dimstr) >> nrows_base; + std::getline(iss, dimstr, ','); + std::istringstream(dimstr) >> ncols_base; + // Read triples + std::string estr; + while (std::getline(ifs, line)) { + PetscInt i, j; + PetscReal v; + iss = std::istringstream(line); + std::getline(iss, estr, ','); + std::istringstream(estr) >> i; + std::getline(iss, estr, ','); + std::istringstream(estr) >> j; + std::getline(iss, estr, ','); + std::istringstream(estr) >> v; + i_base.push_back(i - 1); + j_base.push_back(j - 1); + v_base.push_back(v); + } + + int nrows = (nrows_base - 2) * num_copies + 2; + int ncols = (ncols_base - 2) * num_copies + 2; + + std::vector i_coo; + std::vector j_coo; + std::vector v_coo; + + std::size_t ncoo = i_base.size() * num_copies; + i_coo.reserve(ncoo); + j_coo.reserve(ncoo); + v_coo.reserve(ncoo); + + i_coo.assign(begin(i_base), end(i_base)); + j_coo.assign(begin(j_base), end(j_base)); + v_coo.assign(begin(v_base), end(v_base)); + + for (int n = 1; n < num_copies; ++n) { + auto row_start_top = n * 2; + auto row_start = n * (nrows_base - 2); + auto col_start = n * (ncols_base - 2); + for (std::size_t c = 0; c < v_base.size(); ++c) { + auto i = i_base[c]; + if (i < 2) { + i_coo.push_back(row_start_top + i); + } else { + i_coo.push_back(row_start + i_base[c]); + } + j_coo.push_back(col_start + j_base[c]); + v_coo.push_back(v_base[c]); + } + } + + PetscCall(MatCreateSeqAIJFromTriple(PETSC_COMM_WORLD, nrows, ncols, + i_coo.data(), j_coo.data(), v_coo.data(), + J, v_coo.size(), PETSC_FALSE)); + + PetscFunctionReturn(PETSC_SUCCESS); +} diff --git a/tests/unit/opflow/gradient/README.md b/tests/unit/opflow/gradient/README.md index 18c85660..cc8d6d59 100644 --- a/tests/unit/opflow/gradient/README.md +++ b/tests/unit/opflow/gradient/README.md @@ -1,5 +1,5 @@ -See [objective_function_g_test_design.md](./tests/unit/opflow/gradient/objective_function_g_test_design.md) for a description of how this unit test is formulated. +See [objective_function_g_test_design.md](./objective_function_g_test_design.md) for a description of how this unit test is formulated. -Please use the script [gen_network.py](./tests/unit/opflow/objective/gen_network.py) to generate a new network if necessary. The script takes either a command line argument, or prompts you for the desired network size. +Please use the script [gen_network.py](./gen_network.py) to generate a new network if necessary. The script takes either a command line argument, or prompts you for the desired network size. -The existing datafiles for this unit test is stored in [datafiles/unit/opflow/gradient](./datafiles/unit/opflow/gradient). +The existing datafiles for this unit test is stored in [datafiles/unit/opflow/gradient](../../../../datafiles/unit/opflow/gradient). diff --git a/tests/unit/opflow/objective/CMakeLists.txt b/tests/unit/opflow/objective/CMakeLists.txt index 0b89bff6..07b52079 100644 --- a/tests/unit/opflow/objective/CMakeLists.txt +++ b/tests/unit/opflow/objective/CMakeLists.txt @@ -11,7 +11,7 @@ target_include_directories(objective_acopf PRIVATE ../) # Network files to run on - doing 3 and 600 bus examples. set(prefix ${CMAKE_SOURCE_DIR}/datafiles/unit/opflow/objective/) -set(obj_network_files OF_unittestx3.m OF_unittestx600.m) +set(obj_network_files testx3.m testx600.m) # Map num_copies to a specific netfile set(num_copies 3 600) @@ -40,7 +40,7 @@ if(EXAGO_RUN_TESTS) # Iterate over networks, matching network file to num_copies foreach(network num IN ZIP_LISTS obj_network_files num_copies) get_filename_component(net ${network} NAME) - set(testname "UNIT_TESTS_OBJECTIVE_SIZE_${net}_${solver}_${model}") + set(testname "UNIT_TESTS_OBJECTIVE_${net}_${solver}_${model}") exago_add_test( NAME ${testname} diff --git a/tests/unit/opflow/objective/README.md b/tests/unit/opflow/objective/README.md index 08db26a6..2c9f7c29 100644 --- a/tests/unit/opflow/objective/README.md +++ b/tests/unit/opflow/objective/README.md @@ -1,5 +1,5 @@ -See [objective_function_test_design.md](./tests/unit/opflow/objective/objective_function_test_design.md) for a description of how this unit test is formulated. +See [objective_function_test_design.md](./objective_function_test_design.md) for a description of how this unit test is formulated. -Please use the script [gen_network.py](./tests/unit/opflow/objective/gen_network.py) to generate a new network if necessary. The script takes either a command line argument, or prompts you for the desired network size. +Please use the script [gen_network.py](./gen_network.py) to generate a new network if necessary. The script takes either a command line argument, or prompts you for the desired network size. -The existing datafiles for this unit test is stored in [datafiles/unit/opflow/objective](./datafiles/unit/opflow/objective). +The existing datafiles for this unit test is stored in [datafiles/unit/opflow/objective](../../../../datafiles/unit/opflow/objective). diff --git a/tests/unit/opflow/opflow_tests.h b/tests/unit/opflow/opflow_tests.h index e061a41e..12572d39 100644 --- a/tests/unit/opflow/opflow_tests.h +++ b/tests/unit/opflow/opflow_tests.h @@ -447,13 +447,20 @@ class TestOpflow : public TestBase { Vec temp1, temp2; PetscInt nrow, ncol; + // Create constraint Jacobian matrices to compare against ierr = MatDuplicate(Jeqref, MAT_DO_NOT_COPY_VALUES, &Jeq); CHKERRQ(ierr); - ierr = MatDuplicate(Jineqref, MAT_DO_NOT_COPY_VALUES, &Jineq); - CHKERRQ(ierr); + std::cout << "opflow->Nconineq: " << opflow->Nconineq << "\n"; + if (opflow->Nconineq) { + ierr = MatDuplicate(Jineqref, MAT_DO_NOT_COPY_VALUES, &Jineq); + CHKERRQ(ierr); + } + + // Compute constraint Jacobians ierr = OPFLOWComputeConstraintJacobian(opflow, X, Jeq, Jineq); CHKERRQ(ierr); + // Verify equality constraint Jacobian ierr = MatGetSize(Jeq, &nrow, &ncol); CHKERRQ(ierr); ierr = VecCreate(MPI_COMM_SELF, &temp1); @@ -480,36 +487,40 @@ class TestOpflow : public TestBase { ierr = VecDestroy(&temp2); CHKERRQ(ierr); - ierr = MatGetSize(Jineq, &nrow, &ncol); - CHKERRQ(ierr); - ierr = VecCreate(MPI_COMM_SELF, &temp1); - CHKERRQ(ierr); - ierr = VecSetSizes(temp1, nrow, nrow); + ierr = MatDestroy(&Jeq); CHKERRQ(ierr); - ierr = VecSetFromOptions(temp1); - ierr = VecDuplicate(temp1, &temp2); - CHKERRQ(ierr); + if (opflow->Nconineq) { + // Verify inequality constraint Jacobian + ierr = MatGetSize(Jineq, &nrow, &ncol); + CHKERRQ(ierr); + ierr = VecCreate(MPI_COMM_SELF, &temp1); + CHKERRQ(ierr); + ierr = VecSetSizes(temp1, nrow, nrow); + CHKERRQ(ierr); + ierr = VecSetFromOptions(temp1); - ierr = VecSet(temp1, 0.0); - ierr = VecSet(temp2, 0.0); + ierr = VecDuplicate(temp1, &temp2); + CHKERRQ(ierr); - ierr = MatMult(Jineq, X, temp1); - CHKERRQ(ierr); - ierr = MatMult(Jineqref, X, temp2); - CHKERRQ(ierr); + ierr = VecSet(temp1, 0.0); + ierr = VecSet(temp2, 0.0); - fail += verifyAnswer(temp1, temp2); + ierr = MatMult(Jineq, X, temp1); + CHKERRQ(ierr); + ierr = MatMult(Jineqref, X, temp2); + CHKERRQ(ierr); - ierr = VecDestroy(&temp1); - CHKERRQ(ierr); - ierr = VecDestroy(&temp2); - CHKERRQ(ierr); + fail += verifyAnswer(temp1, temp2); - ierr = MatDestroy(&Jeq); - CHKERRQ(ierr); - ierr = MatDestroy(&Jineq); - CHKERRQ(ierr); + ierr = VecDestroy(&temp1); + CHKERRQ(ierr); + ierr = VecDestroy(&temp2); + CHKERRQ(ierr); + + ierr = MatDestroy(&Jineq); + CHKERRQ(ierr); + } cleanup(fail, opflow); } @@ -691,8 +702,103 @@ class TestOpflow : public TestBase { } #if defined(EXAGO_ENABLE_RAJA) +#if defined(EXAGO_ENABLE_HIOP_SPARSE) /** * @brief Specific test for computing the constraint Jacobian using HiOp + * Sparse + * + * @param x is in sparse-dense ordering + * @param Jeqref is in application ordering + * @param Jineqref is in application ordering + * + * @pre The flag _opflow_->nconineq determines the presence of inequality + * constraints. If the flag is set, checking against Jineqref_nat can be + * skipped entirely. + * @pre _Jeqref_nat_ and _Jineqref_nat_ have the same number of columns, but + * not the same number of rows + */ + LocalOrdinalType computeConstraintJacobian(OPFLOW opflow, double *x_dev, + Mat Jeqref_nat, Mat Jineqref_nat, + umpire::ResourceManager &resmgr) { + PetscErrorCode ierr; + LocalOrdinalType fail = 0; + + // Get allocators + umpire::Allocator h_allocator = resmgr.getAllocator("HOST"); + + // Get the hiop sparse matrix solution to test against + int *iRow, *jCol, *iRow_dev, *jCol_dev; + double *values, *values_dev; + int nnz = opflow->nnz_eqjacsp + opflow->nnz_ineqjacsp; + + iRow = static_cast(h_allocator.allocate(nnz * sizeof(int))); + jCol = static_cast(h_allocator.allocate(nnz * sizeof(int))); + values = static_cast(h_allocator.allocate(nnz * sizeof(double))); + +#ifdef EXAGO_ENABLE_GPU + umpire::Allocator d_allocator = resmgr.getAllocator("DEVICE"); + iRow_dev = static_cast(d_allocator.allocate(nnz * sizeof(int))); + jCol_dev = static_cast(d_allocator.allocate(nnz * sizeof(int))); + values_dev = + static_cast(d_allocator.allocate(nnz * sizeof(double))); +#else + iRow_dev = iRow; + jCol_dev = jCol; + values_dev = values; +#endif + + // Compute equality constraints + ierr = (*opflow->modelops.computesparseequalityconstraintjacobianhiop)( + opflow, x_dev, iRow_dev, jCol_dev, values_dev); + CHKERRQ(ierr); + + // Checking for the presence of inequality constraints on the given problem + // Compute inequality constraints + if (opflow->Nconineq) { + ierr = (*opflow->modelops.computesparseinequalityconstraintjacobianhiop)( + opflow, x_dev, iRow_dev, jCol_dev, values_dev); + CHKERRQ(ierr); + } + + // Copy from device to host + resmgr.copy(iRow, iRow_dev); + resmgr.copy(jCol, jCol_dev); + resmgr.copy(values, values_dev); + + // Verify equality constraints + fail += verifyAnswer(Jeqref_nat, opflow->nnz_eqjacsp, iRow, jCol, values); + + // Checking for the presence of inequality constraints on the given problem + // Verify inequality constraints + if (opflow->Nconineq) { + // The equality and inequality constraint Jacobians are stacked one after + // the other. Offset row and nnz + int nnz_offset = opflow->nnz_eqjacsp; + int row_offset = opflow->nconeq; + for (int i = 0; i < opflow->nnz_ineqjacsp; i++) { + iRow[i + nnz_offset] -= row_offset; + } + + fail += + verifyAnswer(Jineqref_nat, opflow->nnz_ineqjacsp, iRow + nnz_offset, + jCol + nnz_offset, values + nnz_offset); + } + + // Cleanup + h_allocator.deallocate(iRow); + h_allocator.deallocate(jCol); + h_allocator.deallocate(values); +#ifdef EXAGO_ENABLE_GPU + d_allocator.deallocate(iRow_dev); + d_allocator.deallocate(jCol_dev); + d_allocator.deallocate(values_dev); +#endif + cleanup(fail, opflow); + } + +#else + /** + * @brief Specific test for computing the constraint Jacobian using HiOp MDS * * @param x is in sparse-dense ordering * @param Jeqref is in application ordering @@ -915,7 +1021,8 @@ class TestOpflow : public TestBase { #endif cleanup(fail, opflow); } -#endif +#endif // EXAGO_ENABLE_HIOP_SPARSE +#endif // EXAGO_ENABLE_RAJA LocalOrdinalType computeHessian(OPFLOW opflow, Vec X, Vec Lambda, PetscScalar obj_factor, Mat Hessref) { diff --git a/tests/unit/test_acopf.cpp b/tests/unit/test_acopf.cpp index 2849e442..835a829f 100644 --- a/tests/unit/test_acopf.cpp +++ b/tests/unit/test_acopf.cpp @@ -65,12 +65,25 @@ void spdensetonatural(const double *xin, double *xout, int *idxn2sd_map, * */ int main(int argc, char **argv) { - const bool isTestOpflowModelPBPOL = false; + bool testOpflowModelPBPOL = false; + bool testOpflowModelPBPOLHIOP = false; + bool testOpflowModelPBPOLRAJAHIOP = false; + bool testOpflowModelPBPOLRAJAHIOPSPARSE = false; + +#if defined(EXAGO_ENABLE_IPOPT) + testOpflowModelPBPOL = true; +#endif + +#if defined(EXAGO_ENABLE_HIOP) + testOpflowModelPBPOLHIOP = true; +#endif + #if defined(EXAGO_ENABLE_RAJA) - const bool isTestOpflowModelPBPOLRAJAHIOP = true; - const bool isTestOpflowModelPBPOLHIOP = false; +#if defined(EXAGO_ENABLE_HIOP_SPARSE) + testOpflowModelPBPOLRAJAHIOPSPARSE = true; #else - const bool isTestOpflowModelPBPOLHIOP = true; + testOpflowModelPBPOLRAJAHIOP = true; +#endif #endif PetscErrorCode ierr; PetscBool flg, gen_test_data, write_test_data; @@ -245,13 +258,13 @@ int main(int argc, char **argv) { ierr = PetscLogStagePush(stages[1]); CHKERRQ(ierr); - if (isTestOpflowModelPBPOLHIOP) { + if (testOpflowModelPBPOLHIOP) { OPFLOW opflowtest; exago::tests::TestOpflow test; std::cout << "\nTesting custom power balance model in polar coordinates for HIOP" - << "(componentwise assembly) ... \n"; + << " (componentwise assembly) ... \n"; // Create optimal power flow model ierr = OPFLOWCreate(PETSC_COMM_WORLD, &opflowtest); @@ -372,13 +385,17 @@ int main(int argc, char **argv) { } #if defined(EXAGO_ENABLE_RAJA) - if (isTestOpflowModelPBPOLRAJAHIOP) { + if (testOpflowModelPBPOLRAJAHIOP || testOpflowModelPBPOLRAJAHIOPSPARSE) { OPFLOW opflowtest; exago::tests::TestOpflow test; std::cout << "\nTesting custom power balance model in polar coordinates " "for HIOP using RAJA" - << "(PBPOLHIOPRAJA) ... \n"; +#if defined(EXAGO_ENABLE_HIOP_SPARSE) + << " (PBPOLRAJAHIOPSPARSE) ... \n"; +#else + << " (PBPOLRAJAHIOP) ... \n"; +#endif // Create optimal power flow model ierr = OPFLOWCreate(PETSC_COMM_WORLD, &opflowtest); @@ -389,11 +406,19 @@ int main(int argc, char **argv) { CHKERRQ(ierr); /* Set opflow model type to custom model for hiop using RAJA */ +#if defined(EXAGO_ENABLE_HIOP_SPARSE) + ierr = OPFLOWSetModel(opflowtest, OPFLOWMODEL_PBPOLRAJAHIOPSPARSE); +#else ierr = OPFLOWSetModel(opflowtest, OPFLOWMODEL_PBPOLRAJAHIOP); +#endif CHKERRQ(ierr); /* Set solver to HIOP */ +#if defined(EXAGO_ENABLE_HIOP_SPARSE) + ierr = OPFLOWSetSolver(opflowtest, OPFLOWSOLVER_HIOPSPARSEGPU); +#else ierr = OPFLOWSetSolver(opflowtest, OPFLOWSOLVER_HIOP); +#endif CHKERRQ(ierr); /* Set up */ @@ -505,6 +530,7 @@ int main(int argc, char **argv) { fail += test.computeConstraintJacobian(opflowtest, x_ref_dev, Jeq, Jineq, resmgr); +#ifndef EXAGO_ENABLE_HIOP_SPARSE // skip hessian test for now with HIOP_SPARSE int nxdense = 2 * opflowtest->ps->nbus; double *hess_dense, *hess_dense_dev; @@ -527,6 +553,7 @@ int main(int argc, char **argv) { d_allocator.deallocate(x_ref_dev); d_allocator.deallocate(lambda_ref_dev); d_allocator.deallocate(hess_dense_dev); +#endif #endif ierr = PetscFree(x_ref); @@ -563,7 +590,7 @@ int main(int argc, char **argv) { } #endif - if (isTestOpflowModelPBPOL) { + if (testOpflowModelPBPOL) { OPFLOW opflowtest; exago::tests::TestOpflow test; diff --git a/tests/unit/test_ineqjac_gpu.cpp b/tests/unit/test_ineqjac_gpu.cpp new file mode 100644 index 00000000..bc473c70 --- /dev/null +++ b/tests/unit/test_ineqjac_gpu.cpp @@ -0,0 +1,406 @@ +#include +#include +#include +#include +#include + +#include +#include +#include + +#if defined(EXAGO_ENABLE_RAJA) +#include +#include +#include +#include +#endif + +#include "model/power_bal_hiop/paramsrajahiop.h" +#include "model/power_bal_hiop/pbpolrajahiopsparse_gpu.hpp" + +static const double TOL = 1e-8; + +static int compare_arrays(const double *ref, const double *gpu, int n, + const char *label) { + int fail = 0; + for (int i = 0; i < n; i++) { + if (std::abs(ref[i] - gpu[i]) / (1.0 + std::abs(ref[i])) > TOL) { + std::cout << " MISMATCH " << label << "[" << i << "]: PETSc=" << ref[i] + << " GPU=" << gpu[i] << " diff=" << std::abs(ref[i] - gpu[i]) + << std::endl; + fail++; + } + } + return fail; +} + +/** + * @brief Validate GPU inequality constraint Jacobian values against PETSc. + * + * First solves with IPOPT/PBPOL to obtain a realistic solution, then + * sets up the PBPOLRAJAHIOPSPARSE model and evaluates the inequality + * Jacobian at the converged solution using both the PETSc reference + * path and the GPU RAJA kernel. Compares element-by-element. + */ +int main(int argc, char **argv) { + PetscErrorCode ierr; + PetscBool flg; + char file_c_str[PETSC_MAX_PATH_LEN]; + std::string file; + char appname[] = "opflow"; + MPI_Comm comm = MPI_COMM_WORLD; + char help[] = "Test 8: GPU ineq Jacobian validation\n"; + int fail = 0; + + ierr = ExaGOInitialize(comm, &argc, &argv, appname, help); + if (ierr) { + fprintf(stderr, "Could not initialize ExaGO.\n"); + return ierr; + } + + ierr = PetscOptionsGetString(NULL, NULL, "-netfile", file_c_str, + PETSC_MAX_PATH_LEN, &flg); + CHKERRQ(ierr); + if (!flg) + file = "../datafiles/case9/case9mod.m"; + else + file.assign(file_c_str); + + std::cout << "=== Test 8: GPU Inequality Jacobian Validation ===" + << std::endl; + std::cout << "Network file: " << file << std::endl; + + /* ------------------------------------------------------------------ + * Step 1: Solve with IPOPT/PBPOL to get a realistic solution + * ------------------------------------------------------------------ */ + OPFLOW opflow_ref; + Vec Xsol; + + ierr = OPFLOWCreate(PETSC_COMM_WORLD, &opflow_ref); + CHKERRQ(ierr); + ierr = OPFLOWReadMatPowerData(opflow_ref, file.c_str()); + CHKERRQ(ierr); + ierr = OPFLOWSetModel(opflow_ref, OPFLOWMODEL_PBPOL); + CHKERRQ(ierr); + ierr = OPFLOWSetSolver(opflow_ref, OPFLOWSOLVER_IPOPT); + CHKERRQ(ierr); + ierr = OPFLOWSolve(opflow_ref); + CHKERRQ(ierr); + ierr = OPFLOWGetSolution(opflow_ref, &Xsol); + CHKERRQ(ierr); + + std::cout << "IPOPT solve complete." << std::endl; + + /* Get the solution array (natural ordering) */ + PetscInt nx_ref; + ierr = VecGetSize(Xsol, &nx_ref); + CHKERRQ(ierr); + double *xsol_nat; + ierr = VecGetArray(Xsol, &xsol_nat); + CHKERRQ(ierr); + + /* ------------------------------------------------------------------ + * Step 2: Create the PBPOLRAJAHIOPSPARSE model and set up + * ------------------------------------------------------------------ */ + OPFLOW opflow; + ierr = OPFLOWCreate(PETSC_COMM_WORLD, &opflow); + CHKERRQ(ierr); + ierr = OPFLOWReadMatPowerData(opflow, file.c_str()); + CHKERRQ(ierr); + ierr = OPFLOWSetModel(opflow, OPFLOWMODEL_PBPOLRAJAHIOPSPARSE); + CHKERRQ(ierr); + ierr = OPFLOWSetSolver(opflow, OPFLOWSOLVER_HIOPSPARSEGPU); + CHKERRQ(ierr); + ierr = OPFLOWSetUp(opflow); + CHKERRQ(ierr); + + int nx, nconeq, nconineq; + ierr = OPFLOWGetSizes(opflow, &nx, &nconeq, &nconineq); + CHKERRQ(ierr); + + std::cout << "nx=" << nx << " nconeq=" << nconeq << " nconineq=" << nconineq + << " nnz_ineqjacsp=" << opflow->nnz_ineqjacsp << std::endl; + + if (!nconineq) { + std::cout << "No inequality constraints -- nothing to test. PASS." + << std::endl; + ierr = VecRestoreArray(Xsol, &xsol_nat); + CHKERRQ(ierr); + ierr = OPFLOWDestroy(&opflow_ref); + CHKERRQ(ierr); + ierr = OPFLOWDestroy(&opflow); + CHKERRQ(ierr); + ExaGOFinalize(); + return 0; + } + + /* ------------------------------------------------------------------ + * Step 3: Copy IPOPT solution into opflow->X (natural ordering) + * ------------------------------------------------------------------ */ + double *x_nat; + ierr = VecGetArray(opflow->X, &x_nat); + CHKERRQ(ierr); + for (int i = 0; i < nx; i++) + x_nat[i] = xsol_nat[i]; + ierr = VecRestoreArray(opflow->X, &x_nat); + CHKERRQ(ierr); + + ierr = VecRestoreArray(Xsol, &xsol_nat); + CHKERRQ(ierr); + + std::cout << "Evaluating Jacobian at IPOPT-converged solution." << std::endl; + + /* ------------------------------------------------------------------ + * Step 4: Compute reference inequality Jacobian via PETSc. + * The first call establishes the sparsity pattern, the second + * computes the actual values at the converged solution. + * ------------------------------------------------------------------ */ + ierr = (*opflow->modelops.computeinequalityconstraintjacobian)( + opflow, opflow->X, opflow->Jac_Gi); + CHKERRQ(ierr); + ierr = MatSetOption(opflow->Jac_Gi, MAT_NEW_NONZERO_LOCATION_ERR, PETSC_TRUE); + CHKERRQ(ierr); + ierr = (*opflow->modelops.computeinequalityconstraintjacobian)( + opflow, opflow->X, opflow->Jac_Gi); + CHKERRQ(ierr); + + int nnz = opflow->nnz_ineqjacsp; + + auto &resmgr = umpire::ResourceManager::getInstance(); + umpire::Allocator h_allocator = resmgr.getAllocator("HOST"); + + double *ref_vals = + static_cast(h_allocator.allocate(nnz * sizeof(double))); + + PetscInt nrow, ncol; + ierr = MatGetSize(opflow->Jac_Gi, &nrow, &ncol); + CHKERRQ(ierr); + + double *vptr = ref_vals; + for (int i = 0; i < nrow; i++) { + PetscInt nvals; + const PetscInt *cols; + const PetscScalar *vals; + ierr = MatGetRow(opflow->Jac_Gi, i, &nvals, &cols, &vals); + CHKERRQ(ierr); + for (int j = 0; j < nvals; j++) + vptr[j] = vals[j]; + vptr += nvals; + ierr = MatRestoreRow(opflow->Jac_Gi, i, &nvals, &cols, &vals); + CHKERRQ(ierr); + } + + int ref_count = (int)(vptr - ref_vals); + std::cout << "PETSc extracted " << ref_count << " ineq Jacobian values" + << " (expected " << nnz << ")" << std::endl; + + if (ref_count != nnz) { + std::cout << "FAIL: NNZ mismatch! PETSc=" << ref_count + << " analytical=" << nnz << std::endl; + fail++; + } + + /* ------------------------------------------------------------------ + * Step 5: Compute GPU inequality Jacobian at the same solution + * ------------------------------------------------------------------ */ + double *x_host; + ierr = VecGetArray(opflow->X, &x_host); + CHKERRQ(ierr); + + double *x_sd = + static_cast(h_allocator.allocate(nx * sizeof(double))); + for (int i = 0; i < nx; i++) + x_sd[opflow->idxn2sd_map[i]] = x_host[i]; + + ierr = VecRestoreArray(opflow->X, &x_host); + CHKERRQ(ierr); + + double *gpu_vals; + double *x_dev, *gpu_vals_dev; + +#ifdef EXAGO_ENABLE_GPU + umpire::Allocator d_allocator = resmgr.getAllocator("DEVICE"); + x_dev = static_cast(d_allocator.allocate(nx * sizeof(double))); + gpu_vals_dev = + static_cast(d_allocator.allocate(nnz * sizeof(double))); + resmgr.memset(gpu_vals_dev, 0, nnz * sizeof(double)); +#else + x_dev = x_sd; + gpu_vals_dev = + static_cast(h_allocator.allocate(nnz * sizeof(double))); + memset(gpu_vals_dev, 0, nnz * sizeof(double)); +#endif + + umpire::util::AllocationRecord rec_x{x_sd, sizeof(double) * nx, + h_allocator.getAllocationStrategy()}; + resmgr.registerAllocation(x_sd, rec_x); +#ifdef EXAGO_ENABLE_GPU + resmgr.copy(x_dev, x_sd); +#endif + + std::cout << "Running RAJA GPU inequality Jacobian kernel..." << std::endl; + ComputeIneqJacValuesGPU_PBPOLRAJAHIOPSPARSE(opflow, x_dev, gpu_vals_dev); + + gpu_vals = static_cast(h_allocator.allocate(nnz * sizeof(double))); +#ifdef EXAGO_ENABLE_GPU + resmgr.copy(gpu_vals, gpu_vals_dev); +#else + memcpy(gpu_vals, gpu_vals_dev, nnz * sizeof(double)); +#endif + + /* ------------------------------------------------------------------ + * Step 6: Compare + * ------------------------------------------------------------------ */ + std::cout << "Comparing " << nnz << " inequality Jacobian values..." + << std::endl; + int cmp_fail = compare_arrays(ref_vals, gpu_vals, nnz, "ineqjac"); + fail += cmp_fail; + + if (cmp_fail == 0) + std::cout << "PASS: All " << nnz + << " inequality Jacobian values match within tol=" << TOL + << std::endl; + else + std::cout << "FAIL: " << cmp_fail << " of " << nnz << " values differ" + << std::endl; + + /* ------------------------------------------------------------------ + * Step 7: Performance comparison (enabled with -benchmark flag) + * ------------------------------------------------------------------ */ + PetscBool run_benchmark = PETSC_FALSE; + ierr = PetscOptionsGetBool(NULL, NULL, "-benchmark", NULL, &run_benchmark); + CHKERRQ(ierr); + + if (run_benchmark) { + int niters = 1000; + PetscInt bench_nrow, bench_ncol; + ierr = MatGetSize(opflow->Jac_Gi, &bench_nrow, &bench_ncol); + CHKERRQ(ierr); + + double *bench_vals = + static_cast(h_allocator.allocate(nnz * sizeof(double))); + + std::cout << "\n=== Performance Benchmark (" << niters + << " iterations) ===" << std::endl; + + /* --- PETSc path: compute + MatGetRow extraction + copy to device --- */ + { + double *bench_dev; + size_t nnz_bytes = nnz * sizeof(double); +#ifdef EXAGO_ENABLE_GPU + bench_dev = static_cast(d_allocator.allocate(nnz_bytes)); +#else + bench_dev = static_cast(h_allocator.allocate(nnz_bytes)); +#endif + + auto t0 = std::chrono::high_resolution_clock::now(); + for (int iter = 0; iter < niters; iter++) { + ierr = (*opflow->modelops.computeinequalityconstraintjacobian)( + opflow, opflow->X, opflow->Jac_Gi); + + double *vp = bench_vals; + for (int i = 0; i < bench_nrow; i++) { + PetscInt nv; + const PetscInt *c; + const PetscScalar *v; + MatGetRow(opflow->Jac_Gi, i, &nv, &c, &v); + for (int j = 0; j < nv; j++) + vp[j] = v[j]; + vp += nv; + MatRestoreRow(opflow->Jac_Gi, i, &nv, &c, &v); + } +#ifdef EXAGO_ENABLE_GPU + resmgr.copy(bench_dev, bench_vals); +#else + memcpy(bench_dev, bench_vals, nnz_bytes); +#endif + } + auto t1 = std::chrono::high_resolution_clock::now(); + double petsc_us = + std::chrono::duration(t1 - t0).count() / niters; + std::cout << " PETSc path (compute + MatGetRow + copy): " << petsc_us + << " us/iter" << std::endl; + +#ifdef EXAGO_ENABLE_GPU + d_allocator.deallocate(bench_dev); +#else + h_allocator.deallocate(bench_dev); +#endif + } + + /* --- PETSc path: CPU compute only --- */ + { + auto t0 = std::chrono::high_resolution_clock::now(); + + for (int iter = 0; iter < niters; iter++) { + ierr = (*opflow->modelops.computeinequalityconstraintjacobian)( + opflow, opflow->X, opflow->Jac_Gi); + } + + auto t1 = std::chrono::high_resolution_clock::now(); + + double petsc_us = + std::chrono::duration(t1 - t0).count() / niters; + std::cout << " PETSc path (compute only): " << petsc_us + << " us/iter" << std::endl; + } + + /* --- GPU path: RAJA kernels, no copies --- */ + { + double *bench_dev; +#ifdef EXAGO_ENABLE_GPU + bench_dev = + static_cast(d_allocator.allocate(nnz * sizeof(double))); +#else + bench_dev = + static_cast(h_allocator.allocate(nnz * sizeof(double))); +#endif + +#ifdef EXAGO_ENABLE_HIP + (void)hipDeviceSynchronize(); +#endif + auto t0 = std::chrono::high_resolution_clock::now(); + for (int iter = 0; iter < niters; iter++) { + ComputeIneqJacValuesGPU_PBPOLRAJAHIOPSPARSE(opflow, x_dev, bench_dev); + } +#ifdef EXAGO_ENABLE_HIP + (void)hipDeviceSynchronize(); +#endif + auto t1 = std::chrono::high_resolution_clock::now(); + double gpu_us = + std::chrono::duration(t1 - t0).count() / niters; + std::cout << " GPU path (RAJA kernels, no copies): " << gpu_us + << " us/iter" << std::endl; + +#ifdef EXAGO_ENABLE_GPU + d_allocator.deallocate(bench_dev); +#else + h_allocator.deallocate(bench_dev); +#endif + } + + h_allocator.deallocate(bench_vals); + std::cout << "=== End Benchmark ===" << std::endl; + } + + /* ------------------------------------------------------------------ + * Cleanup + * ------------------------------------------------------------------ */ + h_allocator.deallocate(ref_vals); + h_allocator.deallocate(gpu_vals); + h_allocator.deallocate(x_sd); +#ifdef EXAGO_ENABLE_GPU + d_allocator.deallocate(x_dev); + d_allocator.deallocate(gpu_vals_dev); +#else + h_allocator.deallocate(gpu_vals_dev); +#endif + + ierr = OPFLOWDestroy(&opflow); + CHKERRQ(ierr); + ierr = OPFLOWDestroy(&opflow_ref); + CHKERRQ(ierr); + ExaGOFinalize(); + + return fail; +} diff --git a/tests/unit/utils/test_base.h b/tests/unit/utils/test_base.h index f03dc5bf..0e2d018c 100644 --- a/tests/unit/utils/test_base.h +++ b/tests/unit/utils/test_base.h @@ -35,7 +35,7 @@ static const RealType three = 3.0; // static const RealType eps = 10*std::numeric_limits::epsilon(); static const RealType eps = 1e-8; -static const LocalOrdinalType SKIP_TEST = -1; +static const LocalOrdinalType SKIP_TEST = 2; /** @brief Base class for all testing classes. Each child class will call the