# 1 "<stdin>"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "<stdin>"
module levint
! LEVeler INverse INTerpolation in 1-D while finding PEF.
  use tcai2
  use peftc
  use lint1
  use cgstep_mod
  use solver_mod
  implicit none
  contains
  subroutine levint1 (niter, coord, dd, o1, d1, aa, mm, mmov, rr, eps)
    integer, intent (in) :: niter
    real, intent (in) :: o1, d1, eps
    real, dimension (:), intent (in) :: dd
    real, dimension (:) :: rr
    real, dimension (:,:), intent (out) :: mmov
    real, dimension (:), pointer :: aa, mm, coord
    integer :: nr, nm
    logical, dimension (size (rr)) :: ma
    nm = size (mm)
    nr = size (rr)
    call lint1_init (o1, d1, coord)
    call peftc_init (aa, mm)
    call tcai2_init (aa, nm)
    aa (1 : 3) = (/ 1., -2., 1. /) ! starting guess
    ma (:nm) = .false.
    ma (nm+1:) = .true.
    call solver_reg (lint1_lop, cgstep,reg= peftc_lop, nreg= nr, nlreg=&
      & tcai2_lop, eps= eps,niter= niter, x0= rr, x= rr, dat= dd,xmov=&
      & mmov, known= ma)
    ma (nm+2:) = .false. ! free filter coefficients
    call cgstep_close ()
    call solver_reg (lint1_lop, cgstep,reg= peftc_lop, nreg= nr, nlreg=&
      & tcai2_lop, eps= eps,niter= niter, x0= rr, x= rr, dat= dd,xmov=&
      & mmov, known= ma)
    call cgstep_close ()
  end subroutine
end module
