module missif {  # MISSIF -- find MISSing Input data and Filter 
  use pefconv
  use helicon
  use cgstep_mod
  use solver_mod
contains
  subroutine missif1 (niter, xx, aa, lag, kk, known) {
    integer, intent (in)                               :: niter     # iteration
    real,    dimension (:)                             :: xx, aa    # data, PEF
    logical, dimension (:), pointer                    :: kk, known # selectors
    real,    dimension (:), pointer                    :: yy, bb
    integer, dimension (:), pointer                    :: lag
    real,    dimension (size (xx))                     :: dat
    real,    dimension (size (xx) + size (aa)), target :: mm
    integer                                            :: nx
    nx = size (xx); mm = 0.; dat = 0.	
    yy => mm (1 : nx  ) ; where (known (1 : nx )) yy = xx
    bb => mm (1 + nx :) 
    call pefconv_init (bb, lag, yy, kk)
    call solver (pefconv_lop, cgstep, niter = niter, x0 = mm, x = mm, 
                 dat = dat, nloper = helicon_lop, known = known)
    call cgstep_close ()
    xx = yy ; aa = bb
  }
}

