function mig3d_const (want_info,inv_map,inv_amp,inp_geom,out_geom, & first_samp, last_samp, max_freq, map, amp, inp_cent_coord) result (info) type(genkir3d_info_type) :: info logical, intent(in) :: want_info,inv_map,inv_amp type (seis3d_geom_type), intent(in) :: inp_geom type (seis3d_geom_type), intent(in) :: out_geom integer, dimension(:,:), intent(out) :: first_samp,last_samp real, dimension (:,:,:), intent(out) :: map,amp,max_freq real, pointer, optional, dimension (:,:,:) :: inp_cent_coord.logical in_bound integer :: n_t_mod,n_t_dat,i_samp_mod,n_tr_mod,n_tr_dat,i_tr_dat integer :: n_dim,i_dim real :: t_mod,t_mod_sq,t_dat,inv_d_t_dat,inv_d_t_mod real :: t_0_mod,t_0_dat,d_t_mod,dpos,dneg real :: dm(3)
if(.not. want_info) then !{
n_dim=out_geom%irr%n_dim n_tr_mod=out_geom%irr%n_tr n_t_mod=out_geom%irr%n_t t_0_mod=out_geom%irr%t_0 d_t_mod=out_geom%irr%d_t inv_d_t_mod=1./out_geom%irr%d_t
n_tr_dat=inp_geom%irr%n_tr n_t_dat=inp_geom%irr%n_t t_0_dat=inp_geom%irr%t_0 inv_d_t_dat=1./inp_geom%irr%d_t
max_freq=1.
if(.not. inv_map) then !{ do i_tr_dat=1,n_tr_dat !{
dpos=0. dneg=0. do i_dim=1,n_dim dm(i_dim)=(out_geom%irr%cmp(1,i_dim) - & inp_geom%irr%cmp(i_tr_dat,i_dim)) dpos = dpos + (dm(i_dim) + & .5*inp_geom%irr%off(i_tr_dat,i_dim))**2 dneg = dneg + (dm(i_dim) - & .5*inp_geom%irr%off(i_tr_dat,i_dim))**2 end do dpos=dpos*slow_sq dneg=dneg*slow_sq
in_bound = .true. first_samp(i_tr_dat,1)=1 last_samp(i_tr_dat,1)=n_t_mod i_samp_mod = first_samp(i_tr_dat,1) do while ((i_samp_mod < n_t_mod ) .and. in_bound) t_mod=.5*(t_0_mod + (i_samp_mod-1)*d_t_mod) t_mod_sq=t_mod**2 t_dat=sqrt(t_mod_sq + dpos) + sqrt(t_mod_sq + dneg) map(i_samp_mod,i_tr_dat,1)=(t_dat-t_0_dat)*inv_d_t_dat + 1
if(inv_amp) then if(t_mod_sq > 0.) then amp(i_samp_mod,i_tr_dat,1)=t_dat/t_mod else amp(i_samp_mod,i_tr_dat,1)=1. end if else if(t_dat > 0.) then amp(i_samp_mod,i_tr_dat,1)=t_mod/t_dat else amp(i_samp_mod,i_tr_dat,1)=1. end if end if
if(map(i_samp_mod,i_tr_dat,1) > n_t_dat) then in_bound=.false. last_samp(i_tr_dat,1)=i_samp_mod-1 end if i_samp_mod=i_samp_mod + 1 end do !} end do !} else !{ call seperr('mig3d_const: cannot implement inv_map with mig3d') !} end if
info=info_default info%status=0 !} else !{ info=info_default !} end if
return end function mig3d_const