module nsignoi {
  use nhelicon
  use npolydiv
  use solver_mod
  use cgstep_mod
	use hell_chain_mod
  integer, private                      :: i
  integer                               :: niter, nd
	logical                               :: spitz
  real                                  :: eps
  type( nfilter),  pointer :: nn, ss
  real, dimension (nd), allocatable     :: dd
#% _init (nn, ss, niter, nd, eps, spitz)
#% _lop (data, sign)
    integer stat1
		integer,external :: getch
		real,allocatable,dimension(:):: err
		character(len=128) :: temp_ch



    call nhelicon_init (nn)
    call npolydiv_init (nd, ss ) 

		stat1=nhelicon_lop(.false.,.false.,data,dd)  #Nd

		allocate(err(niter))
		if(.not. spitz){
    call solver_prec (nhelicon_lop, cgstep, niter= niter, x=sign, dat = dd,
	         prec= npolydiv_lop, nprec= nd, eps= eps)
		}
		else{
		call init_hell_chain(nd)
		
    call solver_prec (nhelicon_lop, cgstep, niter= niter, x=sign, dat = dd,
	         prec= hell_chain_op, nprec= nd, eps= eps,verb=.true.,err=err)
		call clean_hell_chain()
		if(1==getch("signoi_err","s",temp_ch)){
			call auxputch("n1","d",niter,"signoi_err")
			call srite("signoi_err",err,size(err)*4)
		}
		deallocate(err);
		}
    call cgstep_close()
#% _close
    call npolydiv_close()
}
