@@ -39,7 +39,7 @@ local is_nil, is_boolean, is_number, is_integer, is_decimal,
39
39
local not_mappable, not_extendable, not_mutable in concept
40
40
local implicit, observed in flags
41
41
42
- local abs, modf in math
42
+ local abs, min, modf in math
43
43
44
44
local type, getmetatable, setmetatable, assert, error, rawequal =
45
45
type, getmetatable, setmetatable, assert, error, rawequal
125
125
126
126
-- check sequence spos and elements overlapp, [clear 'at' and 'from']
127
127
local function check_drift (seq, idx)
128
- local data, ds = seq.__dat
128
+ local data, minlen, ds = seq.__dat, seq.minlen or minlen
129
129
assert(idx > 1 and idx < data.ne, "unexpected corrupted element index")
130
130
131
131
ds = data.spos[idx] - (data.spos[idx-1] + data.ds[idx-1])
155
155
156
156
-- check sequence spos and elements overlapp
157
157
local function check_pos (seq)
158
- local data = seq.__dat
158
+ local data, minlen = seq.__dat, seq.minlen or minlen
159
159
for i=1,data.ne-1 do
160
160
local ds = data.spos[i+1] - (data.spos[i] + data.ds[i])
161
161
if ds < -minlen then
295
295
296
296
-- get index from s-position (binary)
297
297
local function index_of_num (seq, num, ref_, dir_)
298
- local data = seq.__dat
298
+ local data, minlen = seq.__dat, seq.minlen or minlen
299
299
if ref_ then num = num + data.upos[index_of_ref(seq,ref_)] end
300
300
if num < 0 or num > seq.l then return nil end
301
301
local idx, dir = bsearch(data.spos, num), dir_ or 1 -- num <= spos[idx]
544
544
545
545
-- compute elements positions
546
546
local function build_pos (seq, sref)
547
- local data = seq.__dat
547
+ local data, minlen = seq.__dat, seq.minlen or minlen
548
548
local n, idx, pos = data.ne, 1, 0
549
549
for i=1,n do
550
550
if data[i].from == 'selected' then
@@ -556,8 +556,8 @@ local function build_pos (seq, sref)
556
556
local sseq = sref[idx]
557
557
if is_nil(sseq) then -- element
558
558
elem_pos(seq, idx) -- set element positions
559
- if data.spos[idx]-pos < -minlen then -- see check_pos
560
- -- if pos-minlen > data.spos[idx] then
559
+ if pos-minlen > data.spos[idx] then
560
+ -- if data.spos[idx]-pos < -minlen then -- see check_pos
561
561
seq_poserr('element', seq, idx, pos)
562
562
elseif data[idx].is_thin and data.ds[idx] ~= 0 then
563
563
seq_lenerr("thin element", seq, idx, data[idx].l)
@@ -730,12 +730,6 @@ local function finish_sequ (seq)
730
730
-- sanity checks
731
731
check_mark(seq)
732
732
if option.debug >= 2 then check_sequ(seq) end
733
-
734
- -- publish sequence in MADX environment
735
- if option.madxenv then
736
- seq.minlen = 1e-6 -- [m] for MAD-X compatibility
737
- seq:publish(MADX, true)
738
- end
739
733
end
740
734
741
735
-- sequence init (build)
@@ -757,10 +751,17 @@ local function init_mm (seq)
757
751
data.algn = table.new(ne,0)
758
752
seq.__dat, data.ne = data, ne
759
753
754
+ -- set minlen to 1e-6 [m] for MAD-X compatibility
755
+ if option.madxenv then seq.minlen = 1e-6 end
756
+
760
757
build_idx(data)
761
758
build_pos(seq, sref)
762
759
clear_sub(seq, sref)
763
760
finish_sequ(seq)
761
+
762
+ -- publish sequence elements in MADX environment
763
+ if option.madxenv then seq:publish(MADX, true) end
764
+
764
765
return seq
765
766
end
766
767
@@ -1426,6 +1427,7 @@ local function share (seq1, seq2)
1426
1427
assert(not (data1.ro or seq1:is_readonly()), "invalid write access to readonly sequence")
1427
1428
assert(not (data2.ro or seq2:is_readonly()), "invalid write access to readonly sequence")
1428
1429
1430
+ local minlen = min(seq1.minlen or minlen, seq2.minlen or minlen)
1429
1431
local elm_r, idx_r, nr = {}, {}, 1
1430
1432
for i=2,data1.ne-1 do
1431
1433
local nam = data1[i].name -- share by (unique) name
0 commit comments