# 1 "<stdin>"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "<stdin>"
module hypotenusei
! Inverse normal moveout
  use adj_mod
  implicit none
  integer, private :: nt
  integer ,private, dimension (:), allocatable :: iz
  contains
  subroutine hypotenusei_init ( nt_in,t0,dt,xs )
    integer :: nt_in
    integer it
    real t0, dt, xs, t, zsquared
    nt = nt_in
    if (.not. allocated(iz)) then
      allocate(iz ( nt))
    end if
    do it= 1, nt
      t = t0 + dt*(it-1)
      zsquared = t * t - xs * xs
      if ( zsquared >= 0.) then
        iz (it) = 1.5 + (sqrt( zsquared) - t0) /dt
      else
        iz (it) = 0
      end if
    end do
  end subroutine
  function hypotenusei_lop ( adj, add, zz, tt) result(stat)
    integer :: stat
    logical,intent(in) :: adj,add
    real,dimension(:) :: zz,tt
    call adjnull (adj,add,zz,tt )
    call hypotenusei_lop2(adj,add,zz,tt )
    stat=0
  end function
  subroutine hypotenusei_lop2(adj,add,zz,tt)
    logical,intent(in) :: adj,add
    real, dimension (:) :: zz
    real, dimension (:) :: tt
    integer it
    do it= 1, nt
      if ( iz (it) > 0 ) then
        if ( adj) then
          zz( iz(it)) = zz( iz(it)) + tt( it )
        else
          tt(it) = tt(it) + zz( iz(it))
        end if
      end if
    end do
  end subroutine
  subroutine hypotenusei_close()
    deallocate( iz )
  end subroutine
end module
