subroutine beam_moments(beam, bunch_moments) use bmad use beam_mod use multibunch_mod implicit none type (beam_struct) beam type(moment_struct), allocatable :: bunch_moments(:) integer i,j,k,n do j = 1, size(beam%bunch) ! loop over bunches bunch_moments(j)%sigma(:,:)=0. bunch_moments(j)%ave(:) = 0. bunch_moments(j)%sigma_t = 0 bunch_moments(j)%ave_t = 0 n=0 !number of alive particles do i = 1, size(beam%bunch(j)%particle) ! loop over particles in bunch j if(beam%bunch(j)%particle(i)%state == alive$)then bunch_moments(j)%ave(1:6)=bunch_moments(j)%ave(1:6) + beam%bunch(j)%particle(i)%vec(1:6) bunch_moments(j)%ave_t=bunch_moments(j)%ave_t + beam%bunch(j)%particle(i)%t n=n+1 endif end do if(n == 0)return bunch_moments(j)%ave(1:6) = bunch_moments(j)%ave(1:6)/float(n) bunch_moments(j)%ave_t = bunch_moments(j)%ave_t/float(n) end do do j = 1, size(beam%bunch) ! loop over bunches n=0 !number of alive particles do i = 1, size(beam%bunch(j)%particle) ! loop over particles in bunch j if(beam%bunch(j)%particle(i)%state == alive$)then do k=1,6 bunch_moments(j)%sigma(1:6,k)=bunch_moments(j)%sigma(1:6,k) + (beam%bunch(j)%particle(i)%vec(1:6)-bunch_moments(j)%ave(1:6))**2 ! print '(2i10,3es12.4)',i,j,bunch_moments(j)%sigma(1,1),bunch_moments(j)%sigma(3,3),bunch_moments(j)%sigma(5,5) end do bunch_moments(j)%sigma_t=bunch_moments(j)%sigma_t + (beam%bunch(j)%particle(i)%t-bunch_moments(j)%ave_t)**2 n=n+1 endif !alive end do bunch_moments(j)%sigma(1:6,1:6) = sqrt(bunch_moments(j)%sigma(1:6,1:6)/n) bunch_moments(j)%sigma_t = sqrt(bunch_moments(j)%sigma_t/n) ! print '(3es12.4)',bunch_moments(j)%sigma(1,1),bunch_moments(j)%sigma(3,3),bunch_moments(j)%sigma(5,5) bunch_moments(j)%n_alive = n end do return end !type moment_struct ! real(rp) sigma(6,6), ave(6) ! real(rp) max_sigma(6,6), min_sigma(6,6), max_ave(6), min_ave(6) !end type