module levint { # LEVeler INverse INTerpolation in 1-D while finding PEF.
  use tcai2
  use peftc
  use lint1
  use cgstep_mod
  use solver_mod
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 ()
  }
}
