Skip to content

Commit 5da4056

Browse files
authored
More fixer devel. (bmad-sim#1686)
* More fixer devel.
1 parent 4e35a2d commit 5da4056

File tree

10 files changed

+425
-202
lines changed

10 files changed

+425
-202
lines changed

bmad/modules/attribute_mod.f90

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -936,6 +936,7 @@ subroutine init_attribute_name_array ()
936936
call init_attribute_name1 (beginning_ele$, ref_time$, 'REF_TIME')
937937
call init_attribute_name1 (beginning_ele$, inherit_from_fork$, 'INHERIT_FROM_FORK')
938938
call init_attribute_name1 (beginning_ele$, deta_ds_master$, 'deta_ds_master', private$)
939+
call init_attribute_name1 (beginning_ele$, ix_fixer$, 'ix_fixer', private$)
939940

940941
attrib_array(def_line$, :) = attrib_array(beginning_ele$, :)
941942
call init_attribute_name1 (def_line$, particle$, 'PARTICLE')
@@ -1004,6 +1005,7 @@ subroutine init_attribute_name_array ()
10041005
call init_attribute_name1 (fixer$, cmat_21_stored$, 'CMAT_21_STORED')
10051006
call init_attribute_name1 (fixer$, cmat_22_stored$, 'CMAT_22_STORED')
10061007
call init_attribute_name1 (fixer$, mode_flip_stored$, 'MODE_FLIP_STORED')
1008+
call init_attribute_name1 (fixer$, ix_fixer$, 'ix_fixer', private$)
10071009

10081010
call init_attribute_name1 (feedback$, input_ele$, 'INPUT_ELE')
10091011
call init_attribute_name1 (feedback$, output_ele$, 'OUTPUT_ELE')

bmad/modules/bmad_struct.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1774,7 +1774,7 @@ module bmad_struct
17741774
integer, parameter :: ref_tilt$ = 3, direction$ = 3, repetition_frequency$ = 3, deta_ds_master$ = 3, &
17751775
kick$ = 3, x_gain_err$ = 3, taylor_order$ = 3, r_solenoid$ = 3, final_charge$ = 3
17761776
integer, parameter :: k1$ = 4, kx$ = 4, harmon$ = 4, h_displace$ = 4, y_gain_err$ = 4, s_twiss_ref$ = 4, &
1777-
critical_angle_factor$ = 4, tilt_corr$ = 4, ref_coords$ = 4, dt_max$ = 4
1777+
critical_angle_factor$ = 4, tilt_corr$ = 4, ref_coords$ = 4, dt_max$ = 4, ix_fixer$ = 4
17781778
integer, parameter :: graze_angle$ = 5, k2$ = 5, b_max$ = 5, v_displace$ = 5, gradient_tot$ = 5, harmon_master$ = 5, &
17791779
flexible$ = 5, crunch$ = 5, ref_orbit_follows$ = 5, pc_out_min$ = 5
17801780
integer, parameter :: gradient$ = 6, k3$ = 6, noise$ = 6, new_branch$ = 6, ix_branch$ = 6, g_max$ = 6, &

bmad/modules/fixer_mod.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ subroutine set_active_fixer(fixer, is_on)
5050
branch => fixer%branch
5151
on = logic_option(.true., is_on)
5252

53-
if (.not. is_on .and. .not. fixer%is_on) return
53+
if (.not. on .and. .not. fixer%is_on) return
5454

5555
do ie = 0, branch%n_ele_track
5656
ele => branch%ele(ie)

bmad/parsing/bmad_parser.f90

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ subroutine bmad_parser (lat_file, lat, make_mats6, digested_read_ok, use_line, e
3636
use wall3d_mod, dummy3 => bmad_parser
3737
use photon_target_mod, dummy4 => bmad_parser
3838
use ptc_interface_mod, only: set_ptc_com_pointers
39+
use fixer_mod, only: set_active_fixer
3940
use random_mod
4041

4142
implicit none
@@ -60,8 +61,8 @@ subroutine bmad_parser (lat_file, lat, make_mats6, digested_read_ok, use_line, e
6061
integer, allocatable :: seq_indexx(:)
6162

6263
integer :: ix_param_ele, ix_mad_beam_ele
63-
integer ix_word, i_use, i, j, k, k2, n, ix, ix1, ix2, n_track
64-
integer n_ele_use, digested_version, key, loop_counter, n_ic, n_con
64+
integer ix_word, i_use, i, j, k, k2, n, ix, ix1, ix2, n_track, ix_ele_fix
65+
integer n_ele_use, digested_version, key, loop_counter, n_ic, n_con, ix_set
6566
integer iseq_tot, iyy, n_ele_max, n_multi, n0, n_ele, ixc, n_slave, n_loc
6667
integer ib, ie, ib2, ie2, flip, n_branch, n_forks, i_loop, n_branch_max
6768
integer, pointer :: n_max
@@ -95,6 +96,7 @@ subroutine bmad_parser (lat_file, lat, make_mats6, digested_read_ok, use_line, e
9596
bp_com = bp_common_struct()
9697
allocate(bp_com%lat_file_names(1)) !! To get around an ifort bug in Versions 18+
9798
bp_com%parser_name = 'bmad_parser' ! Used for error messages.
99+
bp_com%ix_fixer = 0 ! Used to indicate last fixer set on.
98100
debug_line = ''
99101
err = .false.
100102

@@ -1158,6 +1160,22 @@ subroutine bmad_parser (lat_file, lat, make_mats6, digested_read_ok, use_line, e
11581160
return
11591161
endif
11601162

1163+
! Make sure there is only one active fixer
1164+
1165+
do n = 0, ubound(lat%branch, 1)
1166+
branch => lat%branch(n)
1167+
ix_ele_fix = 0
1168+
ix_set = 0
1169+
do i = 0, branch%n_ele_max
1170+
ele => branch%ele(i)
1171+
if (ele%key /= beginning_ele$ .and. ele%key /= fixer$) cycle
1172+
if (.not. ele%is_on .or. ele%value(ix_fixer$) < ix_set) cycle
1173+
ix_set = nint(ele%value(ix_fixer$))
1174+
ix_ele_fix = i
1175+
enddo
1176+
call set_active_fixer(branch%ele(ix_ele_fix))
1177+
enddo
1178+
11611179
! Bookkeeping...
11621180
! Must do this before calling bmad_parser2 since after an expand_lattice command the lattice
11631181
! file may contain references to dependent element parameters that are computed in lattice_bookkeeper.

bmad/parsing/bmad_parser2.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,11 @@ subroutine bmad_parser2 (lat_file, lat, orbit, make_mats6, err_flag, parse_lat)
5656

5757
character(*) lat_file
5858
character(1) delim
59-
character(16) :: r_name = 'bmad_parser2'
6059
character(40) word_1, slice_start, slice_end, temp_ele_name
6160
character(40) word_2, name, this_name, old_parser_name
6261
character(80) debug_line
6362
character(280) parse_line_save, string, extra_ele_names
63+
character(*), parameter :: r_name = 'bmad_parser2'
6464

6565
logical, optional :: make_mats6, err_flag
6666
logical parsing, found, delim_found, err, key_here, move

bmad/parsing/bmad_parser_struct.f90

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,10 +134,11 @@ module bmad_parser_struct
134134
integer :: i_const_tot = 0, i_const_init = 0
135135
integer :: ios_next_chunk = 0
136136
integer :: ios_this_chunk = 0
137-
character(400), allocatable :: lat_file_names(:) ! List of all files used to create lat
137+
integer :: ix_fixer = 0 ! Indicates order of when fixers are turned on in parsing.
138138
! Note: use %line2_file_name to ID line. %line1_file_name may be blank!
139139
character(400) :: line1_file_name = '' ! Name of file from which %input_line1 was read
140140
character(400) :: line2_file_name = '' ! Name of file from which %input_line2 was read
141+
character(400), allocatable :: lat_file_names(:) ! List of all files used to create lat
141142
character(n_parse_line_extended) :: parse_line = '' ! Current string to be parsed.
142143
character(n_parse_line_extended) :: input_line1 = '' ! Line before current line. For debug messages.
143144
character(n_parse_line_extended) :: input_line2 = '' ! Current line. For debug messages.

bmad/parsing/parser_set_attribute_mod.f90

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ subroutine parser_set_attribute (how, ele, delim, delim_found, err_flag, pele, c
4242
heterogeneous_ele_list, set_field_master)
4343

4444
use photon_reflection_mod, only: finalize_reflectivity_table
45+
use fixer_mod, only: set_active_fixer
4546

4647
implicit none
4748

@@ -1922,6 +1923,14 @@ subroutine parser_set_attribute (how, ele, delim, delim_found, err_flag, pele, c
19221923

19231924
case ('IS_ON')
19241925
call parser_get_logical (attrib_word, ele%is_on, ele%name, delim, delim_found, err_flag)
1926+
if (ele%key == beginning_ele$ .or. ele%key == fixer$) then
1927+
if (bp_com%parser_name == 'bmad_parser2') then
1928+
call set_active_fixer(ele)
1929+
elseif (ele%is_on) then
1930+
bp_com%ix_fixer = bp_com%ix_fixer + 1
1931+
ele%value(ix_fixer$) = bp_com%ix_fixer ! Used to indicate last fixer set on.
1932+
endif
1933+
endif
19251934

19261935
case ('SUPERIMPOSE')
19271936
call parser_get_logical (attrib_word, logic, ele%name, delim, delim_found, err_flag); if (err_flag) return

tao/version/tao_version_mod.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@
66
!-
77

88
module tao_version_mod
9-
character(*), parameter :: tao_version_date = "2025/08/11 19:09:49"
9+
character(*), parameter :: tao_version_date = "2025/08/11 22:12:57"
1010
end module

0 commit comments

Comments
 (0)