feat(control): dynamic prototype, penalty_iteration, error while disabling surrogate fixed

This commit is contained in:
rastogi 2025-10-02 13:20:53 +02:00
parent f33dcb99f1
commit 2d5def9a7f
25 changed files with 513 additions and 197 deletions

View File

@ -28,12 +28,12 @@ if (POET_PREPROCESS_BENCHS)
endif()
# as tug will also pull in doctest as a dependency
set(TUG_ENABLE_TESTING ON CACHE BOOL "" FORCE)
set(TUG_ENABLE_TESTING OFF CACHE BOOL "" FORCE)
add_subdirectory(ext/tug EXCLUDE_FROM_ALL)
add_subdirectory(ext/iphreeqc EXCLUDE_FROM_ALL)
option(POET_ENABLE_TESTING "Build test suite for POET" ON)
option(POET_ENABLE_TESTING "Build test suite for POET" OFF)
if (POET_ENABLE_TESTING)
add_subdirectory(test)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
bin/dolo/timings.qs2 Normal file

Binary file not shown.

View File

@ -1,13 +1,17 @@
iterations <- 500
dt <- 200
dt <- 100
control_iteration <- 20
species_epsilon <- c(.0, 1e-12, 1e-1, 1e-1, 1e-2, 1e-2, 1e+1, 1e+1, 1e-3, 0, 1e-1, .0, 1e-1, .0)
species_epsilon <- c(.0, 1e-12, 1e-1, 1e-1, 1e-2, 1e-2, 1e+1, 1e+1, 1e-3, 0, 1e-1, .0, 0.12, .0)
out_save <- seq(50, iterations, by = 50)
penalty_iteration <- 40
max_penalty_iteration <- 80
list(
timesteps = rep(dt, iterations),
store_result = TRUE,
out_save = out_save,
control_iteration = control_iteration,
species_epsilon = species_epsilon
species_epsilon = species_epsilon,
penalty_iteration = penalty_iteration,
max_penalty_iteration = max_penalty_iteration
)

BIN
bin/poet

Binary file not shown.

View File

@ -1,121 +1,376 @@
Iteration, Species, MAPE, RRSME
20, ID, 0, 0
20, H, 1.94487e-14, 3.25056e-16
20, O, 0.0528344, 0.00055045
20, Charge, 0.0232427, 0.000242925
20, C, 0.000542246, 6.49017e-05
20, Ca, 0.000542337, 6.48991e-05
20, Cl, 6.90514, 0.172115
20, Mg, 7.0869, 0.189878
20, Calcite, 0.000326491, 3.92374e-05
20, H, 1.41445e-14, 2.35911e-16
20, O, 0.0553419, 0.000567653
20, Charge, 0.0182496, 0.000187253
20, C, 9.41889e-05, 1.47295e-05
20, Ca, 9.42715e-05, 1.47294e-05
20, Cl, 6.0345, 0.0869993
20, Mg, 6.09838, 0.0882693
20, Calcite, 5.63369e-05, 8.82505e-06
20, Calcite_p1, 0, 0
20, Dolomite, 9.272e-06, 1.12903e-05
20, Dolomite, 4.13256e-09, 1.16886e-08
20, Dolomite_p1, 0, 0
20, O2g_eq, 0.138625, 0.00144473
20, O2g_eq, 0.145118, 0.0014895
20, O2g_si, 0, 0
40, ID, 0, 0
40, H, 2.29246e-14, 4.17955e-16
40, O, 0.0517847, 0.000555411
40, Charge, 0.0217087, 0.000234719
40, C, 0.000766768, 6.66735e-05
40, Ca, 0.000766918, 6.66873e-05
40, Cl, 3.46466, 0.11824
40, Mg, 3.68055, 0.142815
40, Calcite, 0.000466118, 4.0896e-05
40, H, 3.88971e-14, 4.87626e-16
40, O, 0.056556, 0.000586363
40, Charge, 0.0175789, 0.000183408
40, C, 0.000325979, 3.81983e-05
40, Ca, 0.000326053, 3.8197e-05
40, Cl, 3.04641, 0.058268
40, Mg, 3.09965, 0.0603568
40, Calcite, 0.000196233, 2.30896e-05
40, Calcite_p1, 0, 0
40, Dolomite, 0.00272905, 0.00235336
40, Dolomite, 8.48003e-06, 8.69316e-06
40, Dolomite_p1, 0, 0
40, O2g_eq, 0.136023, 0.00145884
40, O2g_eq, 0.148463, 0.00154008
40, O2g_si, 0, 0
60, ID, 0, 0
60, H, 2.74641e-14, 4.7951e-16
60, O, 0.0486809, 0.000533318
60, Charge, 0.0201468, 0.000226065
60, C, 0.000891453, 6.49626e-05
60, Ca, 0.000892045, 6.503e-05
60, Cl, 2.08155, 0.0862112
60, Mg, 2.24499, 0.111759
60, Calcite, 0.000548445, 4.07929e-05
60, H, 0, 0
60, O, 0, 0
60, Charge, 0, 0
60, C, 0, 0
60, Ca, 0, 0
60, Cl, 0, 0
60, Mg, 0, 0
60, Calcite, 0, 0
60, Calcite_p1, 0, 0
60, Dolomite, 0.00501748, 0.00466921
60, Dolomite, 0, 0
60, Dolomite_p1, 0, 0
60, O2g_eq, 0.127509, 0.00139778
60, O2g_eq, 0, 0
60, O2g_si, 0, 0
80, ID, 0, 0
80, H, 4.18117e-14, 6.18699e-16
80, O, 0.0456397, 0.000511564
80, Charge, 0.0186293, 0.000217503
80, C, 0.000902581, 5.51404e-05
80, Ca, 0.000903436, 5.52293e-05
80, Cl, 1.46119, 0.0709428
80, Mg, 1.59876, 0.0991399
80, Calcite, 0.000555002, 3.46365e-05
80, H, 0, 0
80, O, 0, 0
80, Charge, 0, 0
80, C, 0, 0
80, Ca, 0, 0
80, Cl, 0, 0
80, Mg, 0, 0
80, Calcite, 0, 0
80, Calcite_p1, 0, 0
80, Dolomite, 0.00232338, 0.000711624
80, Dolomite, 0, 0
80, Dolomite_p1, 0, 0
80, O2g_eq, 0.119228, 0.00133794
80, O2g_eq, 0, 0
80, O2g_si, 0, 0
100, ID, 0, 0
100, H, 3.65551e-14, 5.95887e-16
100, O, 0.0427519, 0.000490935
100, Charge, 0.0170819, 0.000208342
100, C, 0.000953495, 5.18182e-05
100, Ca, 0.000954977, 5.19698e-05
100, Cl, 1.08948, 0.0602524
100, Mg, 1.21451, 0.0897367
100, Calcite, 0.000592906, 3.32084e-05
100, H, 2.52054e-14, 4.54572e-16
100, O, 0.0499718, 0.000533381
100, Charge, 0.0157197, 0.000172845
100, C, 0.000521522, 3.64097e-05
100, Ca, 0.000521537, 3.64034e-05
100, Cl, 1.79663, 0.0479452
100, Mg, 1.89434, 0.050751
100, Calcite, 0.000314689, 2.20679e-05
100, Calcite_p1, 0, 0
100, Dolomite, 0.0030105, 0.000956423
100, Dolomite, 0.000611171, 0.000558382
100, Dolomite_p1, 0, 0
100, O2g_eq, 0.111391, 0.00128101
100, O2g_eq, 0.130299, 0.0013932
100, O2g_si, 0, 0
120, ID, 0, 0
120, H, 3.50261e-14, 6.3007e-16
120, O, 0.0402783, 0.000474447
120, Charge, 0.0155968, 0.000199072
120, C, 0.00106331, 5.708e-05
120, Ca, 0.00106484, 5.72572e-05
120, Cl, 0.840976, 0.0523175
120, Mg, 0.960964, 0.0851715
120, Calcite, 0.000662119, 3.72101e-05
120, H, 2.45742e-14, 4.82097e-16
120, O, 0.0511434, 0.000552565
120, Charge, 0.0151224, 0.000169403
120, C, 0.00055729, 3.68181e-05
120, Ca, 0.000557564, 3.68497e-05
120, Cl, 1.26629, 0.0384465
120, Mg, 1.33603, 0.0414565
120, Calcite, 0.000344085, 2.33848e-05
120, Calcite_p1, 0, 0
120, Dolomite, 0.0267412, 0.0144917
120, Dolomite, 0.00565502, 0.0070734
120, Dolomite_p1, 0, 0
120, O2g_eq, 0.104765, 0.00123562
120, O2g_eq, 0.133569, 0.00144506
120, O2g_si, 0, 0
140, ID, 0, 0
140, H, 4.14022e-14, 6.85264e-16
140, O, 0.0379425, 0.000458507
140, Charge, 0.0143378, 0.000190886
140, C, 0.00103922, 5.03887e-05
140, Ca, 0.00104158, 5.0623e-05
140, Cl, 0.663446, 0.046461
140, Mg, 0.776981, 0.0796788
140, Calcite, 0.000647302, 3.25312e-05
140, H, 0, 0
140, O, 0, 0
140, Charge, 0, 0
140, C, 0, 0
140, Ca, 0, 0
140, Cl, 0, 0
140, Mg, 0, 0
140, Calcite, 0, 0
140, Calcite_p1, 0, 0
140, Dolomite, 0.0240131, 0.0137403
140, Dolomite, 0, 0
140, Dolomite_p1, 0, 0
140, O2g_eq, 0.0985411, 0.00119191
140, O2g_eq, 0, 0
140, O2g_si, 0, 0
160, ID, 0, 0
160, H, 3.71028e-14, 6.90547e-16
160, O, 0.0354217, 0.000441511
160, Charge, 0.0132313, 0.000183316
160, C, 0.00108786, 5.02857e-05
160, Ca, 0.00109084, 5.06277e-05
160, Cl, 0.525261, 0.0418011
160, Mg, 0.638517, 0.0765625
160, Calcite, 0.000679934, 3.27925e-05
160, H, 0, 0
160, O, 0, 0
160, Charge, 0, 0
160, C, 0, 0
160, Ca, 0, 0
160, Cl, 0, 0
160, Mg, 0, 0
160, Calcite, 0, 0
160, Calcite_p1, 0, 0
160, Dolomite, 0.0124243, 0.00966693
160, Dolomite, 0, 0
160, Dolomite_p1, 0, 0
160, O2g_eq, 0.091823, 0.00114555
160, O2g_eq, 0, 0
160, O2g_si, 0, 0
180, ID, 0, 0
180, H, 4.21264e-14, 6.43691e-16
180, O, 0.0451131, 0.000507232
180, Charge, 0.0133282, 0.000158663
180, C, 0.000689696, 3.58042e-05
180, Ca, 0.000689595, 3.57904e-05
180, Cl, 0.920225, 0.0359217
180, Mg, 0.986528, 0.0403564
180, Calcite, 0.000420255, 2.2125e-05
180, Calcite_p1, 0, 0
180, Dolomite, 0.0148754, 0.00869066
180, Dolomite_p1, 0, 0
180, O2g_eq, 0.117169, 0.00131922
180, O2g_si, 0, 0
200, ID, 0, 0
200, H, 3.09518e-14, 5.96967e-16
200, O, 0.0460042, 0.000524667
200, Charge, 0.0127803, 0.000155455
200, C, 0.000624372, 3.16039e-05
200, Ca, 0.000624798, 3.16382e-05
200, Cl, 0.711112, 0.0301469
200, Mg, 0.766742, 0.0335527
200, Calcite, 0.000388114, 2.04472e-05
200, Calcite_p1, 0, 0
200, Dolomite, 0.00418652, 0.00305248
200, Dolomite_p1, 0, 0
200, O2g_eq, 0.119619, 0.00136598
200, O2g_si, 0, 0
220, ID, 0, 0
220, H, 3.38653e-14, 6.03322e-16
220, O, 0.0448395, 0.000519484
220, Charge, 0.0122, 0.000151847
220, C, 0.000602414, 3.03438e-05
220, Ca, 0.000602795, 3.0383e-05
220, Cl, 0.57974, 0.026681
220, Mg, 0.630163, 0.0304884
220, Calcite, 0.000371929, 1.92166e-05
220, Calcite_p1, 0, 0
220, Dolomite, 0.027979, 0.0156879
220, Dolomite_p1, 0, 0
220, O2g_eq, 0.116433, 0.00135073
220, O2g_si, 0, 0
240, ID, 0, 0
240, H, 4.01928e-14, 6.63038e-16
240, O, 0.0437732, 0.00051452
240, Charge, 0.0116593, 0.000148471
240, C, 0.000622541, 3.15577e-05
240, Ca, 0.000623301, 3.1637e-05
240, Cl, 0.486397, 0.0242533
240, Mg, 0.532535, 0.0278207
240, Calcite, 0.000388216, 2.05683e-05
240, Calcite_p1, 0, 0
240, Dolomite, 0.0318458, 0.0173306
240, Dolomite_p1, 0, 0
240, O2g_eq, 0.113552, 0.00133602
240, O2g_si, 0, 0
260, ID, 0, 0
260, H, 3.49348e-14, 6.34319e-16
260, O, 0.0426325, 0.000508416
260, Charge, 0.011194, 0.000145704
260, C, 0.000560489, 2.68571e-05
260, Ca, 0.000561128, 2.69044e-05
260, Cl, 0.416622, 0.023058
260, Mg, 0.459164, 0.026071
260, Calcite, 0.000347105, 1.71572e-05
260, Calcite_p1, 0, 0
260, Dolomite, 0.0209413, 0.012389
260, Dolomite_p1, 0, 0
260, O2g_eq, 0.110485, 0.00131874
260, O2g_si, 0, 0
280, ID, 0, 0
280, H, 3.60996e-14, 6.6192e-16
280, O, 0.0413622, 0.000500831
280, Charge, 0.0107693, 0.000142997
280, C, 0.000577356, 2.6604e-05
280, Ca, 0.000578462, 2.6685e-05
280, Cl, 0.360292, 0.0214539
280, Mg, 0.401591, 0.0253684
280, Calcite, 0.000364216, 1.81639e-05
280, Calcite_p1, 0, 0
280, Dolomite, 0.0221824, 0.0141538
280, Dolomite_p1, 0, 0
280, O2g_eq, 0.107019, 0.00129705
280, O2g_si, 0, 0
300, ID, 0, 0
300, H, 3.56994e-14, 6.52017e-16
300, O, 0.0399861, 0.000491851
300, Charge, 0.0103422, 0.000140284
300, C, 0.000604904, 2.83669e-05
300, Ca, 0.000605783, 2.84371e-05
300, Cl, 0.313853, 0.0201635
300, Mg, 0.353232, 0.0235415
300, Calcite, 0.000386924, 2.08332e-05
300, Calcite_p1, 0, 0
300, Dolomite, 0.0226333, 0.0141679
300, Dolomite_p1, 0, 0
300, O2g_eq, 0.103311, 0.00127183
300, O2g_si, 0, 0
320, ID, 0, 0
320, H, 3.40886e-14, 6.62584e-16
320, O, 0.0387726, 0.000484965
320, Charge, 0.00993204, 0.000137438
320, C, 0.000604705, 2.84329e-05
320, Ca, 0.000605988, 2.85747e-05
320, Cl, 0.274623, 0.0191566
320, Mg, 0.313395, 0.0223996
320, Calcite, 0.000376625, 1.86093e-05
320, Calcite_p1, 0, 0
320, Dolomite, 0.0134875, 0.0101849
320, Dolomite_p1, 0, 0
320, O2g_eq, 0.100005, 0.00125156
320, O2g_si, 0, 0
340, ID, 0, 0
340, H, 3.70111e-14, 6.80177e-16
340, O, 0.0376343, 0.00047866
340, Charge, 0.00956443, 0.000134982
340, C, 0.000601699, 2.71597e-05
340, Ca, 0.000603066, 2.72861e-05
340, Cl, 0.238462, 0.018479
340, Mg, 0.280258, 0.0219955
340, Calcite, 0.000385246, 1.94428e-05
340, Calcite_p1, 0, 0
340, Dolomite, 0.0318, 0.0161574
340, Dolomite_p1, 0, 0
340, O2g_eq, 0.0969628, 0.00123385
340, O2g_si, 0, 0
360, ID, 0, 0
360, H, 3.60799e-14, 6.63514e-16
360, O, 0.0365169, 0.000472697
360, Charge, 0.00920089, 0.000132444
360, C, 0.000589346, 2.56004e-05
360, Ca, 0.000590568, 2.56932e-05
360, Cl, 0.193642, 0.0171236
360, Mg, 0.248585, 0.0212179
360, Calcite, 0.000377203, 1.84335e-05
360, Calcite_p1, 0, 0
360, Dolomite, 0.0218774, 0.0141493
360, Dolomite_p1, 0, 0
360, O2g_eq, 0.0939613, 0.00121694
360, O2g_si, 0, 0
380, ID, 0, 0
380, H, 3.55796e-14, 6.8648e-16
380, O, 0.0354729, 0.000466356
380, Charge, 0.0088669, 0.000130032
380, C, 0.00063697, 2.96211e-05
380, Ca, 0.000638083, 2.97091e-05
380, Cl, 0.140909, 0.0150374
380, Mg, 0.216507, 0.0225187
380, Calcite, 0.000406558, 2.07877e-05
380, Calcite_p1, 0, 0
380, Dolomite, 0.047141, 0.021219
380, Dolomite_p1, 0, 0
380, O2g_eq, 0.0911081, 0.00119849
380, O2g_si, 0, 0
400, ID, 0, 0
400, H, 3.6232e-14, 7.02432e-16
400, O, 0.0345795, 0.0004623
400, Charge, 0.00852493, 0.000127455
400, C, 0.000603678, 2.58639e-05
400, Ca, 0.000605169, 2.59922e-05
400, Cl, 0.10123, 0.014209
400, Mg, 0.175309, 0.020241
400, Calcite, 0.000381044, 1.74899e-05
400, Calcite_p1, 0, 0
400, Dolomite, 0.0368562, 0.018712
400, Dolomite_p1, 0, 0
400, O2g_eq, 0.0887188, 0.0011865
400, O2g_si, 0, 0
420, ID, 0, 0
420, H, 3.83382e-14, 6.68783e-16
420, O, 0.0335484, 0.000455385
420, Charge, 0.00817171, 0.000124832
420, C, 0.000603529, 2.54134e-05
420, Ca, 0.000605869, 2.56068e-05
420, Cl, 0.067397, 0.0126332
420, Mg, 0.132868, 0.0190658
420, Calcite, 0.000382948, 1.74596e-05
420, Calcite_p1, 0, 0
420, Dolomite, 0.0226142, 0.0141506
420, Dolomite_p1, 0, 0
420, O2g_eq, 0.0859497, 0.00116688
420, O2g_si, 0, 0
440, ID, 0, 0
440, H, 3.67274e-14, 6.59047e-16
440, O, 0.0326937, 0.000451041
440, Charge, 0.0078609, 0.000122411
440, C, 0.0006084, 2.44131e-05
440, Ca, 0.000610448, 2.45656e-05
440, Cl, 0.03675, 0.0100792
440, Mg, 0.0979748, 0.0177069
440, Calcite, 0.000390181, 1.72703e-05
440, Calcite_p1, 0, 0
440, Dolomite, 0.0246411, 0.0142021
440, Dolomite_p1, 0, 0
440, O2g_eq, 0.0836881, 0.0011549
440, O2g_si, 0, 0
460, ID, 0, 0
460, H, 3.51522e-14, 6.28657e-16
460, O, 0.0317917, 0.000445065
460, Charge, 0.00753923, 0.000119952
460, C, 0.000598644, 2.42974e-05
460, Ca, 0.000600299, 2.44311e-05
460, Cl, 0.0143973, 0.00637336
460, Mg, 0.0677921, 0.0158669
460, Calcite, 0.0003902, 1.9257e-05
460, Calcite_p1, 0, 0
460, Dolomite, 0.0128875, 0.0100163
460, Dolomite_p1, 0, 0
460, O2g_eq, 0.0812584, 0.00113768
460, O2g_si, 0, 0
480, ID, 0, 0
480, H, 3.58576e-14, 6.04745e-16
480, O, 0.0309867, 0.000441054
480, Charge, 0.00722698, 0.000117467
480, C, 0.000607134, 2.35285e-05
480, Ca, 0.00060929, 2.37256e-05
480, Cl, 0.00374346, 0.00196574
480, Mg, 0.04042, 0.0134234
480, Calcite, 0.000388391, 1.64682e-05
480, Calcite_p1, 0, 0
480, Dolomite, 0.00312571, 0.000640164
480, Dolomite_p1, 0, 0
480, O2g_eq, 0.0791289, 0.00112619
480, O2g_si, 0, 0
500, ID, 0, 0
500, H, 3.64637e-14, 6.36339e-16
500, O, 0.0302192, 0.000436687
500, Charge, 0.00693139, 0.000114918
500, C, 0.000609576, 2.32842e-05
500, Ca, 0.000612185, 2.34914e-05
500, Cl, 0.000865377, 0.000464931
500, Mg, 0.017595, 0.00765859
500, Calcite, 0.000387095, 1.60962e-05
500, Calcite_p1, 0, 0
500, Dolomite, 0.00378159, 0.000835746
500, Dolomite_p1, 0, 0
500, O2g_eq, 0.0770378, 0.00111302
500, O2g_si, 0, 0

Binary file not shown.

View File

@ -299,6 +299,7 @@ namespace poet
CHEM_DHT_SIGNIF_VEC,
CHEM_DHT_SNAPS,
CHEM_DHT_READ_FILE,
CHEM_INTERP,
CHEM_IP_ENABLE,
CHEM_IP_MIN_ENTRIES,
CHEM_IP_SIGNIF_VEC,

View File

@ -448,6 +448,19 @@ void poet::ChemistryModule::MasterRunParallel(double dt) {
ftype = CHEM_WORK_LOOP;
PropagateFunctionType(ftype);
ftype = CHEM_INTERP;
PropagateFunctionType(ftype);
if(this->runtime_params->rollback_simulation){
this->interp_enabled = false;
int interp_flag = 0;
ChemBCast(&interp_flag, 1, MPI_INT);
} else {
this->interp_enabled = true;
int interp_flag = 1;
ChemBCast(&interp_flag, 1, MPI_INT);
}
MPI_Barrier(this->group_comm);
static uint32_t iteration = 0;

View File

@ -67,6 +67,13 @@ namespace poet
MPI_INT, 0, this->group_comm);
break;
}
case CHEM_INTERP:
{
int interp_flag;
ChemBCast(&interp_flag, 1, MPI_INT);
this->interp_enabled = (interp_flag == 1);
break;
}
case CHEM_WORK_LOOP:
{
WorkerProcessPkgs(timings, iteration);
@ -254,7 +261,7 @@ namespace poet
for (std::size_t wp_i = 0; wp_i < s_curr_wp.size; wp_i++)
{
if (!s_curr_wp.mapping[wp_i] == CHEM_PQC) // only copy if surrogate was used
if (s_curr_wp.mapping[wp_i] != CHEM_PQC) // only copy if surrogate was used
{
std::copy(s_curr_wp.output[wp_i].begin(), s_curr_wp.output[wp_i].end(),
mpi_buffer.begin() + sur_wp_offset + this->prop_count * wp_i);

View File

@ -270,6 +270,10 @@ int parseInitValues(int argc, char **argv, RuntimeParameters &params)
Rcpp::as<uint32_t>(global_rt_setup->operator[]("control_iteration"));
params.species_epsilon =
Rcpp::as<std::vector<double>>(global_rt_setup->operator[]("species_epsilon"));
params.penalty_iteration =
Rcpp::as<uint32_t>(global_rt_setup->operator[]("penalty_iteration"));
params.max_penalty_iteration =
Rcpp::as<uint32_t>(global_rt_setup->operator[]("max_penalty_iteration"));
}
catch (const std::exception &e)
{
@ -302,33 +306,52 @@ void call_master_iter_end(RInside &R, const Field &trans, const Field &chem)
bool checkAndRollback(ChemistryModule &chem, RuntimeParameters &params, uint32_t &iter)
{
for (uint32_t i = 0; i < chem.error_stats_history.size(); i++)
{
if (iter == chem.error_stats_history[i].iteration)
{
const std::vector<double> &latest_mape = chem.error_stats_history.back().mape;
for (uint32_t j = 0; j < params.species_epsilon.size(); j++)
{
if (params.species_epsilon[j] < chem.error_stats_history[i].mape[j] && chem.error_stats_history[i].mape[j] != 0 && chem.control_iteration_counter > 1)
if (params.species_epsilon[j] < latest_mape[j] && latest_mape[j] != 0)
{
uint32_t rollback_iter = iter - params.control_iteration;
uint32_t rollback_iter = iter - (iter % params.control_iteration);
std::cout << chem.getField().GetProps()[j] << " with a MAPE value of " << chem.error_stats_history[i].mape[j] << " exceeds epsilon of "
std::cout << chem.getField().GetProps()[j] << " with a MAPE value of " << latest_mape[j] << " exceeds epsilon of "
<< params.species_epsilon[j] << "! " << std::endl;
Checkpoint_s checkpoint_read{.field = chem.getField()};
read_checkpoint("checkpoint" + std::to_string(rollback_iter) + ".hdf5", checkpoint_read);
iter = checkpoint_read.iteration;
chem.control_iteration_counter--;
return true;
}
}
}
}
MSG("All spezies are below their threshold values");
return false;
}
void updatePenaltyLogic(RuntimeParameters &params, bool roolback_happend)
{
if (roolback_happend)
{
params.rollback_simulation = true;
params.penalty_counter = params.penalty_iteration;
std::cout << "Penalty counter reset to: " << params.penalty_counter << std::endl;
MSG("Rollback! Penalty phase started for " + std::to_string(params.penalty_iteration) + " iterations.");
}
else
{
if (params.rollback_simulation && params.penalty_counter == 0)
{
params.rollback_simulation = false;
MSG("Penalty phase ended. Interpolation re-enabled.");
}
else if (!params.rollback_simulation)
{
params.penalty_iteration = std::min(params.penalty_iteration *= 2, params.max_penalty_iteration);
MSG("Stable surrogate phase detected. Penalty iteration doubled to " + std::to_string(params.penalty_iteration) + " iterations.");
}
}
}
static Rcpp::List RunMasterLoop(RInsidePOET &R, RuntimeParameters &params,
DiffusionModule &diffusion,
ChemistryModule &chem)
@ -344,13 +367,21 @@ static Rcpp::List RunMasterLoop(RInsidePOET &R, RuntimeParameters &params,
}
R["TMP_PROPS"] = Rcpp::wrap(chem.getField().GetProps());
params.next_penalty_check = params.penalty_iteration;
/* SIMULATION LOOP */
double dSimTime{0};
for (uint32_t iter = 1; iter < maxiter + 1; iter++)
{
// Penalty countdown
if (params.rollback_simulation && params.penalty_counter > 0)
{
params.penalty_counter--;
std::cout << "Penalty counter: " << params.penalty_counter << std::endl;
}
params.control_iteration_active = (iter % params.control_iteration == 0 && iter != 0);
params.control_iteration_active = (iter % params.control_iteration == 0 /* && iter != 0 */);
double start_t = MPI_Wtime();
@ -459,12 +490,6 @@ static Rcpp::List RunMasterLoop(RInsidePOET &R, RuntimeParameters &params,
// TODO: write checkpoint
// checkpoint struct --> field and iteration
/*else if (iter == 2) {
Checkpoint_s checkpoint_read{.field = chem.getField()};
read_checkpoint("checkpoint1.hdf5", checkpoint_read);
iter = checkpoint_read.iteration;
}*/
diffusion.getField().update(chem.getField());
MSG("End of *coupling* iteration " + std::to_string(iter) + "/" +
@ -473,12 +498,18 @@ static Rcpp::List RunMasterLoop(RInsidePOET &R, RuntimeParameters &params,
if (iter % params.control_iteration == 0)
{
writeStatsToCSV(chem.error_stats_history, chem.getField().GetProps(), "stats_overview");
write_checkpoint("checkpoint" + std::to_string(iter) + ".hdf5",
{.field = chem.getField(), .iteration = iter});
checkAndRollback(chem, params, iter);
}
if (iter == params.next_penalty_check)
{
bool roolback_happend = checkAndRollback(chem, params, iter);
updatePenaltyLogic(params, roolback_happend);
params.next_penalty_check = iter + params.penalty_iteration;
}
// MSG();
} // END SIMULATION LOOP

View File

@ -52,6 +52,11 @@ struct RuntimeParameters {
bool print_progress = false;
std::uint32_t penalty_iteration = 0;
std::uint32_t max_penalty_iteration = 0;
std::uint32_t penalty_counter = 0;
std::uint32_t next_penalty_check = 0;
bool rollback_simulation = false;
bool control_iteration_active = false;
std::uint32_t control_iteration = 1;