Skip to content

Commit cee4e07

Browse files
committed
insert_element_every_ds: Compensated Sum
1 parent ea52e9f commit cee4e07

File tree

2 files changed

+8
-6
lines changed

2 files changed

+8
-6
lines changed

src/elements/transformation/Insert.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
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;

tests/python/test_lattice_insert.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ def test_element_insert():
3636
filter(lambda el: el.to_dict()["type"] == "BeamMonitor", fodo)
3737
)
3838

39-
assert len(fodo) == 63
40-
assert len(inserted_monitors) == 29
39+
assert len(fodo) == 64
40+
assert len(inserted_monitors) == 30
4141

4242
# clean shutdown
4343
monitor.finalize()

0 commit comments

Comments
 (0)