88 * License: BSD-3-Clause-LBNL
99 */
1010#include " elements/transformation/Insert.H"
11+ #include " CompensatedReal.H"
1112
1213#include < stdexcept>
1314#include < type_traits>
@@ -36,8 +37,9 @@ namespace impactx::elements::transformation
3637
3738 std::list<elements::KnownElements> new_list;
3839
39- double s = 0.0 ; // in meters // TODO: if we can avoid a global s, we can avoid wasting significant digits for long lattices
40- double s_next_insert = ds; // in meters
40+ // using compensated arithmetic for precision in long sums along s
41+ CompensatedReal<double > s (0.0 ); // in meters
42+ CompensatedReal<double > s_next_insert (ds); // in meters
4143
4244 while (!list.empty ())
4345 {
@@ -46,7 +48,7 @@ namespace impactx::elements::transformation
4648 list.pop_front ();
4749
4850 // check where the current element ends
49- double cur_s_out; // in meters
51+ CompensatedReal< double > cur_s_out; // in meters
5052 std::visit ([&s, &cur_s_out](auto &&cur_element)
5153 {
5254 cur_s_out = s + cur_element.ds ();
@@ -55,7 +57,7 @@ namespace impactx::elements::transformation
5557 // case 1: current element is thick and ends after next insert
5658 if (s_next_insert < cur_s_out)
5759 {
58- double const s_rel_insert = s_next_insert - s;
60+ CompensatedReal< double > const s_rel_insert = s_next_insert - s;
5961
6062 // split element and shorten each part
6163 elements::KnownElements cur_element_leftover = cur_element_variant;
0 commit comments