module mis2_mod {
  use mask1 + helicon + polydiv + cgstep_mod 
  use solver_smp_mod + solver_reg_mod + solver_prc_mod
contains
  subroutine mis2( niter, xx, aa, known, style) {
    integer,                intent( in)     :: style
    integer,                intent( in)     :: niter
    type( filter),          intent( in)     :: aa
    logical, dimension( :), intent( in)     :: known
    real,    dimension( :), intent( in out) :: xx	# fitting variables
    real,    dimension( :), allocatable     :: dd
    logical, dimension( :), pointer         :: msk
    integer                                 :: nx
    nx = size( xx)
    allocate( dd(nx))
    allocate(msk(nx))
    if(style==0) {
	    dd = 0.
	    msk = .not.known
	    call mask1_init( msk)
	    call helicon_init( aa)
	    call solver_smp( m=xx, d=dd, Fop=helicon_lop, stepper=cgstep, 
		niter=niter, Jop=mask1_lop, m0=xx)
	    call helicon_close()
    } else if(style==1) {
	    dd=xx
	    msk = known
	    call mask1_init( msk)
	    call helicon_init( aa)
	    call solver_reg( m=xx, d=dd, Fop=mask1_lop, stepper=cgstep, 
		niter=niter, Aop=helicon_lop, nAop=nx, eps=0.1)
	    call helicon_close()
    } else {
	    dd=xx
	    msk = known
	    call mask1_init( msk)
	    call polydiv_init( nx, aa)
	    call solver_prc( m=xx, d=dd, Fop=mask1_lop, stepper=cgstep, 
		niter=niter, Sop=polydiv_lop, nSop=nx, eps=0.0)
	    call polydiv_close()
    }
    call cgstep_close( )
    deallocate( msk,dd)
  }
}


