subroutine fix_group (ing_name, ix_ing, cu_delta, u, err_flag) use cesrv_struct use cesrv_interface use expression_mod, only: linear_coef implicit none type (universe_struct), target :: u type (ele_struct), pointer :: gp_ele, slave type (group_info_struct) grp integer cu_delta, ix_var(500), ix_ele, old_coef(500), new_coef(500) integer i, j, k, ix, ix_ing, ix_attrib, idum, ixc integer ix_rec(n_var_maxx) real(rp) dcu_fit(500), dcu_design(500), dcu_data(500) real rdum(1) character(12) ing_name character(16) ele_name, name logical err_flag, ok, doit ! init group, etc. err_flag = .true. ! assume the worst call setup_group (ing_name, ix_ing, 0, 0, grp, ok, .true.) if (.not. ok) return write (ele_name(13:16), '(i4)') ix_ing ele_name(1:12) = ing_name do i = 1, 16 if (ele_name(i:i) == ' ') ele_name(i:i) = '_' enddo ix_ele = 0 do ix_ele = u%ring%n_ele_track+1, u%ring%n_ele_max if (u%ring%ele(ix_ele)%name == ele_name) exit enddo if (ix_ele == u%ring%n_ele_max + 1) then print *, 'ERROR: UNABLE TO FIND GROUP ELEMNT IN RING: ', ele_name return endif gp_ele => u%ring%ele(ix_ele) dcu_design = 0 dcu_data = 0 dcu_fit = 0 ix_var = -1 ix_rec = -1 ! ix_var() matches group records with elements in u%var array grp_loop: do i = 1, grp%n_rec if (.not. grp%rec(i)%exists) cycle do j = 1, size(u%var) if (grp%rec(i)%name == u%var(j)%db_node_name .and. & grp%rec(i)%l1 == u%var(j)%ix_db) then if (u%var(j)%exists) then ix_var(i) = j ix_rec(j) = i dcu_fit(i) = (u%var(j)%model - u%var(j)%base_model) / & u%var(j)%dvar_dcu dcu_data(i) = u%var(j)%cu_saved - u%var(j)%cu_saved_ref endif cycle grp_loop endif enddo print *, 'ERROR: CANNOT MATCH GROUP RECORD WITH ANY CESRV VARIABLE' print *, ' CANNOT MATCH: ', grp%rec(i)%name, grp%rec(i)%l1 return enddo grp_loop ! calculate theory ele_loop: do k = 1, gp_ele%n_slave slave => pointer_to_slave(gp_ele, k, ixc) name = slave%name ix_attrib = u%ring%control(ixc)%ix_attrib do j = 1, size(u%var) if (name == u%var(j)%ele_name .and. ix_attrib == u%var(j)%ix_attrib) then if (u%var(j)%exists) then i = ix_rec(j) dcu_design(i) = cu_delta * linear_coef(u%ring%control(ixc)%stack) / u%var(j)%dvar_dcu endif cycle ele_loop endif enddo print *, 'ERROR: CANNOT MATCH GROUP ELEMENT WITH ANY CESRV VARIABLE' print *, ' CANNOT MATCH: ', name, ix_attrib return enddo ele_loop ! calculate the new coefs. old_coef = nint(10000 * dcu_data / cu_delta) new_coef = nint(10000 * (dcu_design + dcu_data - dcu_fit) / cu_delta) ! print results print *, ' | dCU' print *, ' Ix Element Old_coef New_coef | Data Fit Design' do i = 1, grp%n_rec if (.not. grp%rec(i)%exists) cycle if (ix_var(i) == -1) cycle print '(i4, 2x, a9, 2i10, 1x, 3i8)', i, u%var(ix_var(i))%name, old_coef(i), new_coef(i), & nint(dcu_data(i)), nint(dcu_fit(i)), nint(dcu_design(i)) grp%rec(i)%icoef = new_coef(i) enddo ! load? doit = .false. call cesrv_logic_get ('Y', 'N', 'Load New Coefficients?', doit) if (doit) then call change_group (grp, rdum, .false., ok) print *, 'Coefficients Loaded to CESR Data Base' print *, 'Note: Group coefs in CESRV Model NOT changed.' else print *, 'Coefficients NOT Loaded.' endif end subroutine