Completed reorganization of preconditioner build routines. Now it

should even work with multilevel L>2, even though we don't have a test
program right now. Started modifying the prc_aply set.
psblas3-type-indexed
Salvatore Filippone 19 years ago
parent 5126b55538
commit 580605c087

@ -270,8 +270,8 @@ subroutine psb_dbicg(a,prec,b,x,eps,desc_a,info,&
itx = itx + 1
if (debug) write(*,*) 'iteration: ',itx
call psb_prcaply(prec,r,z,desc_a,info,work=aux)
call psb_prcaply(prec,rt,zt,desc_a,info,trans='t',work=aux)
call psb_prc_aply(prec,r,z,desc_a,info,work=aux)
call psb_prc_aply(prec,rt,zt,desc_a,info,trans='t',work=aux)
rho_old = rho
rho = psb_dot(rt,z,desc_a,info)

@ -215,7 +215,7 @@ Subroutine psb_dcg(a,prec,b,x,eps,desc_a,info,&
it = it + 1
itx = itx + 1
Call psb_prcaply(prec,r,z,desc_a,info,work=aux)
Call psb_prc_aply(prec,r,z,desc_a,info,work=aux)
rho_old = rho
rho = psb_dot(r,z,desc_a,info)

@ -274,7 +274,7 @@ Subroutine psb_dcgs(a,prec,b,x,eps,desc_a,info,&
End If
Call psb_prcaply(prec,p,f,desc_a,info,work=aux)
Call psb_prc_aply(prec,p,f,desc_a,info,work=aux)
Call psb_spmm(one,a,f,zero,v,desc_a,info,&
& work=aux)
@ -292,7 +292,7 @@ Subroutine psb_dcgs(a,prec,b,x,eps,desc_a,info,&
Call psb_axpby(one,uv,zero,s,desc_a,info)
Call psb_axpby(one,q,one,s,desc_a,info)
Call psb_prcaply(prec,s,z,desc_a,info,work=aux)
Call psb_prc_aply(prec,s,z,desc_a,info,work=aux)
Call psb_axpby(alpha,z,one,x,desc_a,info)

@ -300,7 +300,7 @@ Subroutine psb_dcgstab(a,prec,b,x,eps,desc_a,info,&
Call psb_axpby(one,r,beta,p,desc_a,info)
End If
Call psb_prcaply(prec,p,f,desc_a,info,work=aux)
Call psb_prc_aply(prec,p,f,desc_a,info,work=aux)
Call psb_spmm(one,a,f,zero,v,desc_a,info,&
& work=aux)
@ -323,9 +323,9 @@ Subroutine psb_dcgstab(a,prec,b,x,eps,desc_a,info,&
goto 9999
end if
Call psb_prcaply(prec,s,z,desc_a,info,work=aux)
Call psb_prc_aply(prec,s,z,desc_a,info,work=aux)
if(info.ne.0) then
call psb_errpush(4010,name,a_err='psb_prcaply')
call psb_errpush(4010,name,a_err='psb_prc_aply')
goto 9999
end if

@ -237,7 +237,7 @@ Subroutine psb_dcgstabl(a,prec,b,x,eps,desc_a,info,&
Call psb_axpby(one,b,zero,r,desc_a,info)
Call psb_spmm(-one,a,x,one,r,desc_a,info,work=aux)
call psb_prcaply(prec,r,desc_a,info)
call psb_prc_aply(prec,r,desc_a,info)
Call psb_axpby(one,r,zero,rt0,desc_a,info)
Call psb_axpby(one,r,zero,rh(:,0),desc_a,info)
@ -301,7 +301,7 @@ Subroutine psb_dcgstabl(a,prec,b,x,eps,desc_a,info,&
If (debug) Write(0,*) 'bicg part: ',rh(1,0),beta
Call psb_spmm(one,a,uh(:,j),zero,uh(:,j+1),desc_a,info,work=aux)
call psb_prcaply(prec,uh(:,j+1),desc_a,info)
call psb_prc_aply(prec,uh(:,j+1),desc_a,info)
gamma(j) = psb_dot(uh(:,j+1),rt0,desc_a,info)
If (gamma(j)==zero) Then
@ -315,7 +315,7 @@ Subroutine psb_dcgstabl(a,prec,b,x,eps,desc_a,info,&
Call psb_axpby(alpha,uh(:,0),one,x,desc_a,info)
Call psb_spmm(one,a,rh(:,j),zero,rh(:,j+1),desc_a,info,work=aux)
call psb_prcaply(prec,rh(:,j+1),desc_a,info)
call psb_prc_aply(prec,rh(:,j+1),desc_a,info)
Enddo

@ -234,7 +234,7 @@ Subroutine psb_dgmresr(a,prec,b,x,eps,desc_a,info,&
End If
Call psb_spmm(-one,a,x,one,v(:,1),desc_a,info,work=aux)
call psb_prcaply(prec,v(:,1),desc_a,info)
call psb_prc_aply(prec,v(:,1),desc_a,info)
rs(1) = psb_nrm2(v(:,1),desc_a,info)
if (info.ne.0) Then
info=4011
@ -279,7 +279,7 @@ Subroutine psb_dgmresr(a,prec,b,x,eps,desc_a,info,&
itx = itx + 1
Call psb_spmm(one,a,v(:,i),zero,w,desc_a,info,work=aux)
call psb_prcaply(prec,w,desc_a,info)
call psb_prc_aply(prec,w,desc_a,info)
do k = 1, i
h(k,i) = psb_dot(v(:,k),w,desc_a,info)

@ -40,7 +40,7 @@ module psb_prec_mod
type(psb_dspmat_type), intent(in), target :: a
type(psb_desc_type), intent(in) :: desc_a
type(psb_dspmat_type), intent(out), target :: ac
type(psb_dbase_prec), intent(inout) :: p
type(psb_dbaseprc_type), intent(inout) :: p
type(psb_desc_type), intent(inout) :: desc_p
integer, intent(out) :: info
end subroutine psb_dbldaggrmat
@ -100,19 +100,6 @@ end interface
end subroutine psb_dprecfree
end interface
interface psb_cslu
subroutine psb_dcslu(a,desc_data,p,upd,info)
use psb_serial_mod
use psb_descriptor_type
use psb_prec_type
integer, intent(out) :: info
type(psb_dspmat_type), intent(in), target :: a
type(psb_desc_type),intent(in) :: desc_data
type(psb_dbase_prec), intent(inout) :: p
character, intent(in) :: upd
end subroutine psb_dcslu
end interface
interface psb_asmatbld
Subroutine psb_dasmatbld(ptype,novr,a,blk,desc_data,upd,desc_p,info,outfmt)
use psb_serial_mod
@ -129,8 +116,8 @@ end interface
end Subroutine psb_dasmatbld
end interface
interface psb_prcaply
subroutine psb_dprecaply(prec,x,y,desc_data,info,trans,work)
interface psb_prc_aply
subroutine psb_dprc_aply(prec,x,y,desc_data,info,trans,work)
use psb_serial_mod
use psb_descriptor_type
use psb_prec_type
@ -140,8 +127,8 @@ end interface
integer, intent(out) :: info
character(len=1), optional :: trans
real(kind(0.d0)),intent(inout), optional, target :: work(:)
end subroutine psb_dprecaply
subroutine psb_dprecaply1(prec,x,desc_data,info,trans)
end subroutine psb_dprc_aply
subroutine psb_dprc_aply1(prec,x,desc_data,info,trans)
use psb_serial_mod
use psb_descriptor_type
use psb_prec_type
@ -150,7 +137,7 @@ end interface
real(kind(0.d0)),intent(inout) :: x(:)
integer, intent(out) :: info
character(len=1), optional :: trans
end subroutine psb_dprecaply1
end subroutine psb_dprc_aply1
end interface

@ -82,7 +82,7 @@ module psb_prec_type
integer, parameter :: smth_avsz=6, max_avsz=smth_avsz
type psb_dbase_prec
type psb_dbaseprc_type
type(psb_dspmat_type), pointer :: av(:) => null() !
real(kind(1.d0)), pointer :: d(:) => null()
@ -94,13 +94,13 @@ module psb_prec_type
type(psb_dspmat_type), pointer :: aorig => null() !
real(kind(1.d0)), pointer :: dorig(:) => null() !
end type psb_dbase_prec
end type psb_dbaseprc_type
type psb_dprec_type
type(psb_dbase_prec), pointer :: baseprecv(:) => null()
type(psb_dbaseprc_type), pointer :: baseprecv(:) => null()
! contain type of preconditioning to be performed
integer :: prec, base_prec
end type psb_dprec_type
end type psb_dprec_type
character(len=15), parameter, private :: &
@ -424,7 +424,7 @@ contains
use psb_serial_mod
use psb_descriptor_type
use psb_tools_mod
type(psb_dbase_prec), intent(inout) :: p
type(psb_dbaseprc_type), intent(inout) :: p
integer, intent(out) :: info
integer :: i
@ -494,7 +494,7 @@ contains
subroutine psb_nullify_baseprec(p)
use psb_descriptor_type
type(psb_dbase_prec), intent(inout) :: p
type(psb_dbaseprc_type), intent(inout) :: p
nullify(p%av,p%d,p%iprcparm,p%dprcparm,p%perm,p%invperm,p%mlia,&
& p%nlaggr,p%aorig,p%dorig,p%desc_data)

@ -7,7 +7,7 @@ MPFOBJS=psb_dilu_bld.o psb_dbldaggrmat.o
F90OBJS=psb_dasmatbld.o psb_dslu_bld.o psb_dumf_bld.o psb_dilu_fct.o\
psb_dmlprc_bld.o psb_dsp_renum.o\
psb_dprec.o psb_dprecbld.o gps.o psb_dprecfree.o psb_dprecset.o \
psb_dgenaggrmap.o $(MPFOBJS)
psb_dbaseprc_bld.o psb_dgenaggrmap.o $(MPFOBJS)
COBJS=psb_slu_impl.o psb_umf_impl.o
INCDIRS=-I. -I.. -I$(LIBDIR)

@ -0,0 +1,308 @@
!!$
!!$
!!$ MPcube: Multilevel Parallel Preconditioners Package
!!$ for
!!$ Parallel Sparse BLAS v2.0
!!$ (C) Copyright 2006 Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari University of Rome Tor Vergata
!!$ Daniela Di Serafino II University of Naples
!!$ Pasqua D'Ambra ICAR-CNR
!!$
!!$ Redistribution and use in source and binary forms, with or without
!!$ modification, are permitted provided that the following conditions
!!$ are met:
!!$ 1. Redistributions of source code must retain the above copyright
!!$ notice, this list of conditions and the following disclaimer.
!!$ 2. Redistributions in binary form must reproduce the above copyright
!!$ notice, this list of conditions, and the following disclaimer in the
!!$ documentation and/or other materials provided with the distribution.
!!$ 3. The name of the MPCUBE group or the names of its contributors may
!!$ not be used to endorse or promote products derived from this
!!$ software without specific written permission.
!!$
!!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
!!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
!!$ TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
!!$ PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MPCUBE GROUP OR ITS CONTRIBUTORS
!!$ BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
!!$ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
!!$ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
!!$ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
!!$ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
!!$ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
!!$ POSSIBILITY OF SUCH DAMAGE.
!!$
!!$
subroutine psb_dbaseprc_bld(a,desc_a,p,info,upd)
use psb_serial_mod
Use psb_spmat_type
use psb_descriptor_type
use psb_prec_type
use psb_tools_mod
use psb_comm_mod
use psb_const_mod
use psb_psblas_mod
use psb_error_mod
Implicit None
type(psb_dspmat_type), target :: a
type(psb_desc_type), intent(in) :: desc_a
type(psb_dbaseprc_type),intent(inout) :: p
integer, intent(out) :: info
character, intent(in), optional :: upd
interface psb_ilu_bld
subroutine psb_dilu_bld(a,desc_data,p,upd,info)
use psb_serial_mod
use psb_descriptor_type
use psb_prec_type
integer, intent(out) :: info
type(psb_dspmat_type), intent(in), target :: a
type(psb_desc_type),intent(in) :: desc_data
type(psb_dbaseprc_type), intent(inout) :: p
character, intent(in) :: upd
end subroutine psb_dilu_bld
end interface
interface psb_slu_bld
subroutine psb_dslu_bld(a,desc_a,p,info)
use psb_serial_mod
use psb_descriptor_type
use psb_prec_type
use psb_const_mod
implicit none
type(psb_dspmat_type), intent(in) :: a
type(psb_desc_type), intent(in) :: desc_a
type(psb_dbaseprc_type), intent(inout) :: p
integer, intent(out) :: info
end subroutine psb_dslu_bld
end interface
interface psb_umf_bld
subroutine psb_dumf_bld(a,desc_a,p,info)
use psb_serial_mod
use psb_descriptor_type
use psb_prec_type
use psb_const_mod
implicit none
type(psb_dspmat_type), intent(in) :: a
type(psb_desc_type), intent(in) :: desc_a
type(psb_dbaseprc_type), intent(inout) :: p
integer, intent(out) :: info
end subroutine psb_dumf_bld
end interface
! Local scalars
Integer :: err, nnzero, n_row, n_col,I,j,k,icontxt,&
& me,mycol,nprow,npcol,mglob,lw, mtype, nrg, nzg, err_act
real(kind(1.d0)) :: temp, real_err(5)
real(kind(1.d0)),pointer :: gd(:), work(:)
integer :: int_err(5)
character :: iupd
logical, parameter :: debug=.false.
integer,parameter :: iroot=0,iout=60,ilout=40
character(len=20) :: name, ch_err
if(psb_get_errstatus().ne.0) return
info=0
err=0
call psb_erractionsave(err_act)
name = 'psb_baseprc_bld'
if (debug) write(0,*) 'Entering baseprc_bld'
info = 0
int_err(1) = 0
icontxt = desc_a%matrix_data(psb_ctxt_)
n_row = desc_a%matrix_data(psb_n_row_)
n_col = desc_a%matrix_data(psb_n_col_)
mglob = desc_a%matrix_data(psb_m_)
if (debug) write(0,*) 'Preconditioner Blacs_gridinfo'
call blacs_gridinfo(icontxt, nprow, npcol, me, mycol)
if (present(upd)) then
if (debug) write(0,*) 'UPD ', upd
if ((UPD.eq.'F').or.(UPD.eq.'T')) then
IUPD=UPD
else
IUPD='F'
endif
else
IUPD='F'
endif
!
! Should add check to ensure all procs have the same...
!
! ALso should define symbolic names for the preconditioners.
!
call psb_check_def(p%iprcparm(p_type_),'base_prec',&
& diagsc_,is_legal_base_prec)
allocate(p%desc_data,stat=info)
if (info /= 0) then
call psb_errpush(4010,name,a_err='Allocate')
goto 9999
end if
call psb_nullify_desc(p%desc_data)
select case(p%iprcparm(p_type_))
case (noprec_)
! Do nothing.
case (diagsc_)
if (debug) write(0,*) 'Precond: Diagonal scaling'
! diagonal scaling
call psb_realloc(n_col,p%d,info)
if (info /= 0) then
call psb_errpush(4010,name,a_err='psb_realloc')
goto 9999
end if
call psb_csrws(p%d,a,info,trans='N')
if(info /= 0) then
info=4010
ch_err='psb_csrws'
call psb_errpush(info,name,a_err=ch_err)
goto 9999
end if
if (debug) write(ilout+me,*) 'VDIAG ',n_row
do i=1,n_row
if (p%d(i).eq.0.0d0) then
p%d(i)=1.d0
else
p%d(i) = 1.d0/p%d(i)
endif
if (debug) write(ilout+me,*) i,desc_a%loc_to_glob(i), p%d(i)
if (p%d(i).lt.0.d0) then
write(0,*) me,'Negative RWS? ',i,p%d(i)
endif
end do
if (a%pl(1) /= 0) then
allocate(work(n_row),stat=info)
if (info /= 0) then
info=4000
call psb_errpush(info,name)
goto 9999
end if
call psb_gelp('n',a%pl,p%d,desc_a,info)
if(info /= 0) then
info=4010
ch_err='psb_dgelp'
call psb_errpush(info,name,a_err=ch_err)
goto 9999
end if
deallocate(work)
endif
if (debug) then
allocate(gd(mglob),stat=info)
if (info /= 0) then
call psb_errpush(4010,name,a_err='Allocate')
goto 9999
end if
call psb_gather(gd, p%d, desc_a, info, iroot=iroot)
if(info /= 0) then
info=4010
ch_err='psb_dgatherm'
call psb_errpush(info,name,a_err=ch_err)
goto 9999
end if
if (me.eq.iroot) then
write(iout+nprow,*) 'VDIAG CHECK ',mglob
do i=1,mglob
write(iout+nprow,*) i,gd(i)
enddo
endif
deallocate(gd)
endif
if (debug) write(*,*) 'Preconditioner DIAG computed OK'
case (bja_,asm_)
call psb_check_def(p%iprcparm(n_ovr_),'overlap',&
& 0,is_legal_n_ovr)
call psb_check_def(p%iprcparm(restr_),'restriction',&
& psb_halo_,is_legal_restrict)
call psb_check_def(p%iprcparm(prol_),'prolongator',&
& psb_none_,is_legal_prolong)
call psb_check_def(p%iprcparm(iren_),'renumbering',&
& renum_none_,is_legal_renum)
call psb_check_def(p%iprcparm(f_type_),'fact',&
& f_ilu_n_,is_legal_ml_fact)
if (debug) write(0,*)me, ': Calling PSB_ILU_BLD'
select case(p%iprcparm(f_type_))
case(f_ilu_n_,f_ilu_e_)
call psb_ilu_bld(a,desc_a,p,iupd,info)
if(debug) write(0,*)me,': out of psb_ilu_bld'
if(info /= 0) then
info=4010
ch_err='psb_ilu_bld'
call psb_errpush(info,name,a_err=ch_err)
goto 9999
end if
case(f_slu_)
if(debug) write(0,*)me,': calling slu_bld'
call psb_slu_bld(a,desc_a,p,info)
if(info /= 0) then
info=4010
ch_err='slu_bld'
call psb_errpush(info,name,a_err=ch_err)
goto 9999
end if
case(f_umf_)
if(debug) write(0,*)me,': calling umf_bld'
call psb_umf_bld(a,desc_a,p,info)
if(info /= 0) then
info=4010
ch_err='umf_bld'
call psb_errpush(info,name,a_err=ch_err)
goto 9999
end if
case(f_none_)
write(0,*) 'Fact=None in BASEPRC_BLD Bja/ASM??'
case default
write(0,*) 'Unknown factor type in baseprc_bld bja/asm: ',&
&p%iprcparm(f_type_)
end select
end select
call psb_erractionrestore(err_act)
return
9999 continue
call psb_erractionrestore(err_act)
if (err_act.eq.act_abort) then
call psb_error()
return
end if
return
end subroutine psb_dbaseprc_bld

@ -44,7 +44,7 @@ subroutine psb_dbldaggrmat(a,desc_a,ac,p,desc_p,info)
implicit none
type(psb_dspmat_type), intent(in), target :: a
type(psb_dbase_prec), intent(inout) :: p
type(psb_dbaseprc_type), intent(inout) :: p
type(psb_dspmat_type), intent(out), target :: ac
type(psb_desc_type), intent(in) :: desc_a
type(psb_desc_type), intent(inout) :: desc_p

@ -63,7 +63,7 @@ subroutine psb_dilu_bld(a,desc_a,p,upd,info)
integer, intent(out) :: info
! .. array Arguments ..
type(psb_dspmat_type), intent(in), target :: a
type(psb_dbase_prec), intent(inout) :: p
type(psb_dbaseprc_type), intent(inout) :: p
type(psb_desc_type), intent(in) :: desc_a
character, intent(in) :: upd
@ -118,10 +118,10 @@ subroutine psb_dilu_bld(a,desc_a,p,upd,info)
implicit none
! .. array Arguments ..
type(psb_dspmat_type), intent(in) :: a,blck
type(psb_dspmat_type), intent(inout) :: atmp
type(psb_dbase_prec), intent(inout) :: p
type(psb_desc_type), intent(in) :: desc_a
type(psb_dspmat_type), intent(in) :: a,blck
type(psb_dspmat_type), intent(inout) :: atmp
type(psb_dbaseprc_type), intent(inout) :: p
type(psb_desc_type), intent(in) :: desc_a
integer, intent(out) :: info
end subroutine psb_dsp_renum
end interface

@ -45,7 +45,7 @@ subroutine psb_dmlprc_bld(a,desc_a,p,info)
type(psb_dspmat_type), intent(in), target :: a
type(psb_desc_type), intent(in) :: desc_a
type(psb_dbase_prec), intent(inout) :: p
type(psb_dbaseprc_type), intent(inout) :: p
integer, intent(out) :: info
type(psb_desc_type), pointer :: desc_p
@ -55,15 +55,17 @@ subroutine psb_dmlprc_bld(a,desc_a,p,info)
logical, parameter :: debug=.false.
type(psb_dspmat_type) :: ac
interface psb_ilu_fct
subroutine psb_dilu_fct(a,l,u,d,info,blck)
use psb_spmat_type
integer, intent(out) :: info
type(psb_dspmat_type),intent(in) :: a
type(psb_dspmat_type),intent(inout) :: l,u
type(psb_dspmat_type),intent(in), optional, target :: blck
real(kind(1.d0)), intent(inout) :: d(:)
end subroutine psb_dilu_fct
interface psb_baseprc_bld
subroutine psb_dbaseprc_bld(a,desc_a,p,info,upd)
Use psb_spmat_type
use psb_descriptor_type
use psb_prec_type
type(psb_dspmat_type), target :: a
type(psb_desc_type), intent(in) :: desc_a
type(psb_dbaseprc_type),intent(inout) :: p
integer, intent(out) :: info
character, intent(in), optional :: upd
end subroutine psb_dbaseprc_bld
end interface
interface psb_genaggrmap
@ -85,7 +87,7 @@ subroutine psb_dmlprc_bld(a,desc_a,p,info)
use psb_descriptor_type
use psb_spmat_type
type(psb_dspmat_type), intent(in), target :: a
type(psb_dbase_prec), intent(inout) :: p
type(psb_dbaseprc_type), intent(inout) :: p
type(psb_dspmat_type), intent(out),target :: ac
type(psb_desc_type), intent(in) :: desc_a
type(psb_desc_type), intent(inout) :: desc_p
@ -93,49 +95,6 @@ subroutine psb_dmlprc_bld(a,desc_a,p,info)
end subroutine psb_dbldaggrmat
end interface
interface psb_ilu_bld
subroutine psb_dilu_bld(a,desc_data,p,upd,info)
use psb_serial_mod
use psb_descriptor_type
use psb_prec_type
integer, intent(out) :: info
type(psb_dspmat_type), intent(in), target :: a
type(psb_desc_type),intent(in) :: desc_data
type(psb_dbase_prec), intent(inout) :: p
character, intent(in) :: upd
end subroutine psb_dilu_bld
end interface
interface psb_slu_bld
subroutine psb_dslu_bld(a,desc_a,p,info)
use psb_serial_mod
use psb_descriptor_type
use psb_prec_type
use psb_const_mod
implicit none
type(psb_dspmat_type), intent(in) :: a
type(psb_desc_type), intent(in) :: desc_a
type(psb_dbase_prec), intent(inout) :: p
integer, intent(out) :: info
end subroutine psb_dslu_bld
end interface
interface psb_umf_bld
subroutine psb_dumf_bld(a,desc_a,p,info)
use psb_serial_mod
use psb_descriptor_type
use psb_prec_type
use psb_const_mod
implicit none
type(psb_dspmat_type), intent(in) :: a
type(psb_desc_type), intent(in) :: desc_a
type(psb_dbase_prec), intent(inout) :: p
integer, intent(out) :: info
end subroutine psb_dumf_bld
end interface
integer :: icontxt, nprow, npcol, me, mycol
name='psb_mlprec_bld'
@ -144,6 +103,37 @@ subroutine psb_dmlprc_bld(a,desc_a,p,info)
call psb_erractionsave(err_act)
call psb_nullify_sp(ac)
if (.not.associated(p%iprcparm)) then
info = 2222
call psb_errpush(info,name)
goto 9999
endif
call psb_check_def(p%iprcparm(ml_type_),'Multilevel type',&
& mult_ml_prec_,is_legal_ml_type)
call psb_check_def(p%iprcparm(aggr_alg_),'aggregation',&
& loc_aggr_,is_legal_ml_aggr_kind)
call psb_check_def(p%iprcparm(smth_kind_),'Smoother kind',&
& smth_omg_,is_legal_ml_smth_kind)
call psb_check_def(p%iprcparm(coarse_mat_),'Coarse matrix',&
& mat_distr_,is_legal_ml_coarse_mat)
call psb_check_def(p%iprcparm(smth_pos_),'smooth_pos',&
& pre_smooth_,is_legal_ml_smooth_pos)
nullify(p%desc_data)
select case(p%iprcparm(f_type_))
case(f_ilu_n_)
call psb_check_def(p%iprcparm(ilu_fill_in_),'Level',0,is_legal_ml_lev)
case(f_ilu_e_)
call psb_check_def(p%dprcparm(fact_eps_),'Eps',0.0d0,is_legal_ml_eps)
end select
call psb_check_def(p%dprcparm(smooth_omega_),'omega',0.0d0,is_legal_omega)
call psb_check_def(p%iprcparm(jac_sweeps_),'Jacobi sweeps',&
& 1,is_legal_jac_sweeps)
p%aorig => a
allocate(p%av(max_avsz),stat=info)
@ -180,41 +170,9 @@ subroutine psb_dmlprc_bld(a,desc_a,p,info)
end if
if (debug) write(0,*) 'Out from bldaggrmat',desc_p%matrix_data(:)
allocate(p%desc_data)
select case(p%iprcparm(f_type_))
case(f_ilu_n_,f_ilu_e_)
call psb_ilu_bld(ac,desc_p,p,'F',info)
if(debug) write(0,*)me,': out of psb_ilu_bld'
if(info /= 0) then
info=4010
ch_err='psb_ilu_bld'
call psb_errpush(info,name,a_err=ch_err)
goto 9999
end if
case(f_slu_)
call psb_slu_bld(ac,desc_p,p,info)
if(debug) write(0,*)me,': out of psb_slu_bld'
if(info /= 0) then
info=4010
ch_err='psb_slu_bld'
call psb_errpush(info,name,a_err=ch_err)
goto 9999
end if
case(f_umf_)
call psb_umf_bld(ac,desc_p,p,info)
if(debug) write(0,*)me,': out of psb_umf_bld'
if(info /= 0) then
info=4010
ch_err='psb_umf_bld'
call psb_errpush(info,name,a_err=ch_err)
goto 9999
end if
end select
call psb_baseprc_bld(ac,desc_p,p,info)
!
! We have used a separate ac because:

@ -33,7 +33,7 @@
!!$ POSSIBILITY OF SUCH DAMAGE.
!!$
!!$
subroutine psb_dprecaply(prec,x,y,desc_data,info,trans, work)
subroutine psb_dprc_aply(prec,x,y,desc_data,info,trans, work)
use psb_serial_mod
use psb_descriptor_type
@ -59,35 +59,35 @@ subroutine psb_dprecaply(prec,x,y,desc_data,info,trans, work)
external mpi_wtime
character(len=20) :: name, ch_err
interface
subroutine psb_dbaseprcaply(prec,x,beta,y,desc_data,trans,work,info)
interface psb_baseprc_aply
subroutine psb_dbaseprc_aply(prec,x,beta,y,desc_data,trans,work,info)
use psb_descriptor_type
use psb_prec_type
type(psb_desc_type),intent(in) :: desc_data
type(psb_dbase_prec), intent(in) :: prec
real(kind(0.d0)),intent(inout) :: x(:), y(:)
real(kind(0.d0)),intent(in) :: beta
character(len=1) :: trans
real(kind(0.d0)),target :: work(:)
integer, intent(out) :: info
end subroutine psb_dbaseprcaply
type(psb_desc_type),intent(in) :: desc_data
type(psb_dbaseprc_type), intent(in) :: prec
real(kind(0.d0)),intent(inout) :: x(:), y(:)
real(kind(0.d0)),intent(in) :: beta
character(len=1) :: trans
real(kind(0.d0)),target :: work(:)
integer, intent(out) :: info
end subroutine psb_dbaseprc_aply
end interface
interface
subroutine psb_dmlprcaply(baseprecv,x,beta,y,desc_data,trans,work,info)
interface psb_mlprc_aply
subroutine psb_dmlprc_aply(baseprecv,x,beta,y,desc_data,trans,work,info)
use psb_descriptor_type
use psb_prec_type
type(psb_desc_type),intent(in) :: desc_data
type(psb_dbase_prec), intent(in) :: baseprecv(:)
real(kind(0.d0)),intent(in) :: beta
real(kind(0.d0)),intent(inout) :: x(:), y(:)
character :: trans
real(kind(0.d0)),target :: work(:)
integer, intent(out) :: info
end subroutine psb_dmlprcaply
type(psb_desc_type),intent(in) :: desc_data
type(psb_dbaseprc_type), intent(in) :: baseprecv(:)
real(kind(0.d0)),intent(in) :: beta
real(kind(0.d0)),intent(inout) :: x(:), y(:)
character :: trans
real(kind(0.d0)),target :: work(:)
integer, intent(out) :: info
end subroutine psb_dmlprc_aply
end interface
name='psb_dprecaply'
name='psb_dprc_aply'
info = 0
call psb_erractionsave(err_act)
@ -115,15 +115,15 @@ subroutine psb_dprecaply(prec,x,y,desc_data,info,trans, work)
write(0,*) 'Inconsistent preconditioner: neither SMTH nor BASE?'
end if
if (size(prec%baseprecv) >1) then
if (debug) write(0,*) 'Into mlprcaply',size(x),size(y)
call psb_dmlprcaply(prec%baseprecv,x,zero,y,desc_data,trans_,work_,info)
if (debug) write(0,*) 'Into mlprc_aply',size(x),size(y)
call psb_mlprc_aply(prec%baseprecv,x,zero,y,desc_data,trans_,work_,info)
if(info /= 0) then
call psb_errpush(4010,name,a_err='psb_dmlprcaply')
call psb_errpush(4010,name,a_err='psb_dmlprc_aply')
goto 9999
end if
else if (size(prec%baseprecv) == 1) then
call psb_dbaseprcaply(prec%baseprecv(1),x,zero,y,desc_data,trans_, work_,info)
call psb_baseprc_aply(prec%baseprecv(1),x,zero,y,desc_data,trans_, work_,info)
else
write(0,*) 'Inconsistent preconditioner: size of baseprecv???'
endif
@ -144,7 +144,7 @@ subroutine psb_dprecaply(prec,x,y,desc_data,info,trans, work)
end if
return
end subroutine psb_dprecaply
end subroutine psb_dprc_aply
!!$
@ -183,7 +183,7 @@ end subroutine psb_dprecaply
!!$
!!$
subroutine psb_dbaseprcaply(prec,x,beta,y,desc_data,trans,work,info)
subroutine psb_dbaseprc_aply(prec,x,beta,y,desc_data,trans,work,info)
!
! Compute Y <- beta*Y + K^-1 X
! where K is a a basic preconditioner stored in prec
@ -197,13 +197,13 @@ subroutine psb_dbaseprcaply(prec,x,beta,y,desc_data,trans,work,info)
use psb_error_mod
implicit none
type(psb_desc_type),intent(in) :: desc_data
type(psb_dbase_prec), intent(in) :: prec
real(kind(0.d0)),intent(inout) :: x(:), y(:)
real(kind(0.d0)),intent(in) :: beta
character(len=1) :: trans
real(kind(0.d0)),target :: work(:)
integer, intent(out) :: info
type(psb_desc_type),intent(in) :: desc_data
type(psb_dbaseprc_type), intent(in) :: prec
real(kind(0.d0)),intent(inout) :: x(:), y(:)
real(kind(0.d0)),intent(in) :: beta
character(len=1) :: trans
real(kind(0.d0)),target :: work(:)
integer, intent(out) :: info
! Local variables
integer :: n_row,n_col, int_err(5)
@ -216,21 +216,21 @@ subroutine psb_dbaseprcaply(prec,x,beta,y,desc_data,trans,work,info)
external mpi_wtime
character(len=20) :: name, ch_err
interface
subroutine psb_dbjacaply(prec,x,beta,y,desc_data,trans,work,info)
interface psb_bjac_aply
subroutine psb_dbjac_aply(prec,x,beta,y,desc_data,trans,work,info)
use psb_descriptor_type
use psb_prec_type
type(psb_desc_type), intent(in) :: desc_data
type(psb_dbase_prec), intent(in) :: prec
type(psb_dbaseprc_type), intent(in) :: prec
real(kind(0.d0)),intent(inout) :: x(:), y(:)
real(kind(0.d0)),intent(in) :: beta
character(len=1) :: trans
real(kind(0.d0)),target :: work(:)
integer, intent(out) :: info
end subroutine psb_dbjacaply
end subroutine psb_dbjac_aply
end interface
name='psb_dbaseprcaply'
name='psb_dbaseprc_aply'
info = 0
call psb_erractionsave(err_act)
@ -280,10 +280,10 @@ subroutine psb_dbaseprcaply(prec,x,beta,y,desc_data,trans,work,info)
case(bja_)
call psb_dbjacaply(prec,x,beta,y,desc_data,trans,work,info)
call psb_bjac_aply(prec,x,beta,y,desc_data,trans,work,info)
if(info.ne.0) then
info=4010
ch_err='psb_bjacaply'
ch_err='psb_bjac_aply'
goto 9999
end if
@ -291,7 +291,7 @@ subroutine psb_dbaseprcaply(prec,x,beta,y,desc_data,trans,work,info)
if (prec%iprcparm(n_ovr_)==0) then
! shortcut: this fixes performance for RAS(0) == BJA
call psb_dbjacaply(prec,x,beta,y,desc_data,trans,work,info)
call psb_bjac_aply(prec,x,beta,y,desc_data,trans,work,info)
if(info.ne.0) then
info=4010
ch_err='psb_bjacaply'
@ -350,7 +350,7 @@ subroutine psb_dbaseprcaply(prec,x,beta,y,desc_data,trans,work,info)
goto 9999
end if
else if (prec%iprcparm(restr_) /= psb_none_) then
write(0,*) 'Problem in PRCAPLY: Unknown value for restriction ',&
write(0,*) 'Problem in PRC_APLY: Unknown value for restriction ',&
&prec%iprcparm(restr_)
end if
@ -363,10 +363,10 @@ subroutine psb_dbaseprcaply(prec,x,beta,y,desc_data,trans,work,info)
end if
endif
call psb_dbjacaply(prec,tx,zero,ty,prec%desc_data,trans,aux,info)
call psb_bjac_aply(prec,tx,zero,ty,prec%desc_data,trans,aux,info)
if(info.ne.0) then
info=4010
ch_err='psb_bjacaply'
ch_err='psb_bjac_aply'
goto 9999
end if
@ -395,7 +395,7 @@ subroutine psb_dbaseprcaply(prec,x,beta,y,desc_data,trans,work,info)
end if
case default
write(0,*) 'Problem in PRCAPLY: Unknown value for prolongation ',&
write(0,*) 'Problem in PRC_APLY: Unknown value for prolongation ',&
& prec%iprcparm(prol_)
end select
@ -440,7 +440,7 @@ subroutine psb_dbaseprcaply(prec,x,beta,y,desc_data,trans,work,info)
end if
return
end subroutine psb_dbaseprcaply
end subroutine psb_dbaseprc_aply
@ -479,7 +479,7 @@ end subroutine psb_dbaseprcaply
!!$ POSSIBILITY OF SUCH DAMAGE.
!!$
!!$
subroutine psb_dbjacaply(prec,x,beta,y,desc_data,trans,work,info)
subroutine psb_dbjac_aply(prec,x,beta,y,desc_data,trans,work,info)
!
! Compute Y <- beta*Y + K^-1 X
! where K is a a Block Jacobi preconditioner stored in prec
@ -496,7 +496,7 @@ subroutine psb_dbjacaply(prec,x,beta,y,desc_data,trans,work,info)
implicit none
type(psb_desc_type), intent(in) :: desc_data
type(psb_dbase_prec), intent(in) :: prec
type(psb_dbaseprc_type), intent(in) :: prec
real(kind(0.d0)),intent(inout) :: x(:), y(:)
real(kind(0.d0)),intent(in) :: beta
character(len=1) :: trans
@ -514,7 +514,7 @@ subroutine psb_dbjacaply(prec,x,beta,y,desc_data,trans,work,info)
external mpi_wtime
character(len=20) :: name, ch_err
name='psb_dbjacaply'
name='psb_bjac_aply'
info = 0
call psb_erractionsave(err_act)
@ -630,7 +630,7 @@ subroutine psb_dbjacaply(prec,x,beta,y,desc_data,trans,work,info)
endif
case default
write(0,*) 'Unknown factorization type in bjac_prcaply',prec%iprcparm(f_type_)
write(0,*) 'Unknown factorization type in bjac_aply',prec%iprcparm(f_type_)
end select
if (debugprt) write(0,*)' Y: ',y(:)
@ -739,7 +739,7 @@ subroutine psb_dbjacaply(prec,x,beta,y,desc_data,trans,work,info)
end if
return
end subroutine psb_dbjacaply
end subroutine psb_dbjac_aply
!!$
@ -777,7 +777,7 @@ end subroutine psb_dbjacaply
!!$ POSSIBILITY OF SUCH DAMAGE.
!!$
!!$
subroutine psb_dmlprcaply(baseprecv,x,beta,y,desc_data,trans,work,info)
subroutine psb_dmlprc_aply(baseprecv,x,beta,y,desc_data,trans,work,info)
!
! Compute Y <- beta*Y + K^-1 X
! where K is a multilevel (actually 2-level) preconditioner stored in prec
@ -792,13 +792,13 @@ subroutine psb_dmlprcaply(baseprecv,x,beta,y,desc_data,trans,work,info)
use psb_error_mod
implicit none
type(psb_desc_type),intent(in) :: desc_data
type(psb_dbase_prec), intent(in) :: baseprecv(:)
real(kind(0.d0)),intent(in) :: beta
real(kind(0.d0)),intent(inout) :: x(:), y(:)
character :: trans
real(kind(0.d0)),target :: work(:)
integer, intent(out) :: info
type(psb_desc_type),intent(in) :: desc_data
type(psb_dbaseprc_type), intent(in) :: baseprecv(:)
real(kind(0.d0)),intent(in) :: beta
real(kind(0.d0)),intent(inout) :: x(:), y(:)
character :: trans
real(kind(0.d0)),target :: work(:)
integer, intent(out) :: info
! Local variables
@ -815,21 +815,21 @@ subroutine psb_dmlprcaply(baseprecv,x,beta,y,desc_data,trans,work,info)
external mpi_wtime
character(len=20) :: name, ch_err
interface
subroutine psb_dbaseprcaply(prec,x,beta,y,desc_data,trans,work,info)
interface psb_baseprc_aply
subroutine psb_dbaseprc_aply(prec,x,beta,y,desc_data,trans,work,info)
use psb_descriptor_type
use psb_prec_type
type(psb_desc_type),intent(in) :: desc_data
type(psb_dbase_prec), intent(in) :: prec
real(kind(0.d0)),intent(inout) :: x(:), y(:)
real(kind(0.d0)),intent(in) :: beta
character(len=1) :: trans
real(kind(0.d0)),target :: work(:)
integer, intent(out) :: info
end subroutine psb_dbaseprcaply
type(psb_desc_type),intent(in) :: desc_data
type(psb_dbaseprc_type), intent(in) :: prec
real(kind(0.d0)),intent(inout) :: x(:), y(:)
real(kind(0.d0)),intent(in) :: beta
character(len=1) :: trans
real(kind(0.d0)),target :: work(:)
integer, intent(out) :: info
end subroutine psb_dbaseprc_aply
end interface
name='psb_dmlprcaply'
name='psb_dmlprc_aply'
info = 0
call psb_erractionsave(err_act)
@ -843,7 +843,7 @@ subroutine psb_dmlprcaply(baseprecv,x,beta,y,desc_data,trans,work,info)
select case(baseprecv(2)%iprcparm(ml_type_))
case(no_ml_)
! Should not really get here.
write(0,*) 'Smooth preconditioner with no multilevel in MLPRCAPLY????'
write(0,*) 'Smooth preconditioner with no multilevel in MLPRC_APLY????'
case(add_ml_prec_)
@ -853,7 +853,7 @@ subroutine psb_dmlprcaply(baseprecv,x,beta,y,desc_data,trans,work,info)
t1 = mpi_wtime()
n_row = desc_data%matrix_data(psb_n_row_)
n_col = baseprecv(1)%desc_data%matrix_data(psb_n_col_)
call psb_dbaseprcaply(baseprecv(1),x,beta,y,desc_data,trans,work,info)
call psb_baseprc_aply(baseprecv(1),x,beta,y,desc_data,trans,work,info)
if(info /=0) goto 9999
nr2l = baseprecv(2)%desc_data%matrix_data(psb_n_col_)
@ -912,7 +912,8 @@ subroutine psb_dmlprcaply(baseprecv,x,beta,y,desc_data,trans,work,info)
endif
w2l=t2l
call psb_dbaseprcaply(baseprecv(2),w2l,zero,t2l,baseprecv(2)%desc_data,'N',work,info)
call psb_baseprc_aply(baseprecv(2),w2l,zero,t2l,baseprecv(2)%desc_data,&
& 'N',work,info)
if (ismth /= no_smth_) then
@ -1015,7 +1016,8 @@ subroutine psb_dmlprcaply(baseprecv,x,beta,y,desc_data,trans,work,info)
t6 = mpi_wtime()
w2l=t2l
call psb_dbaseprcaply(baseprecv(2),w2l,zero,t2l,baseprecv(2)%desc_data,'N',work,info)
call psb_baseprc_aply(baseprecv(2),w2l,zero,t2l,baseprecv(2)%desc_data,&
&'N',work,info)
if(info /=0) goto 9999
if (ismth /= no_smth_) then
@ -1039,7 +1041,8 @@ subroutine psb_dmlprcaply(baseprecv,x,beta,y,desc_data,trans,work,info)
call psb_spmm(-one,baseprecv(2)%aorig,ty,one,tx,desc_data,info,work=work)
if(info /=0) goto 9999
call psb_dbaseprcaply(baseprecv(1),tx,one,ty,desc_data,trans,work,info)
call psb_baseprc_aply(baseprecv(1),tx,one,ty,desc_data,trans,&
& work,info)
if(info /=0) goto 9999
call psb_axpby(one,ty,beta,y,desc_data,info)
@ -1073,7 +1076,8 @@ subroutine psb_dmlprcaply(baseprecv,x,beta,y,desc_data,trans,work,info)
call psb_axpby(one,y,zero,ty,desc_data,info)
if(info /=0) goto 9999
call psb_dbaseprcaply(baseprecv(1),x,zero,tty,desc_data,trans,work,info)
call psb_baseprc_aply(baseprecv(1),x,zero,tty,desc_data,&
& trans,work,info)
if(info /=0) goto 9999
call psb_spmm(-one,baseprecv(2)%aorig,tty,one,tx,desc_data,info,work=work)
@ -1115,7 +1119,8 @@ subroutine psb_dmlprcaply(baseprecv,x,beta,y,desc_data,trans,work,info)
t6 = mpi_wtime()
w2l=t2l
call psb_dbaseprcaply(baseprecv(2),w2l,zero,t2l,baseprecv(2)%desc_data,'N',work,info)
call psb_baseprc_aply(baseprecv(2),w2l,zero,t2l,baseprecv(2)%desc_data,&
& 'N',work,info)
if(info /=0) goto 9999
if (ismth /= no_smth_) then
@ -1170,7 +1175,7 @@ subroutine psb_dmlprcaply(baseprecv,x,beta,y,desc_data,trans,work,info)
call psb_axpby(one,y,zero,ty,desc_data,info)
if(info /=0) goto 9999
call psb_dbaseprcaply(baseprecv(1),tx,zero,tty,desc_data,trans,work,info)
call psb_baseprc_aply(baseprecv(1),tx,zero,tty,desc_data,trans,work,info)
if(info /=0) goto 9999
call psb_spmm(-one,baseprecv(2)%aorig,tty,one,tx,desc_data,info,work=work)
@ -1206,7 +1211,8 @@ subroutine psb_dmlprcaply(baseprecv,x,beta,y,desc_data,trans,work,info)
t6 = mpi_wtime()
w2l=t2l
call psb_dbaseprcaply(baseprecv(2),w2l,zero,t2l,baseprecv(2)%desc_data,'N',work,info)
call psb_baseprc_aply(baseprecv(2),w2l,zero,t2l,baseprecv(2)%desc_data,&
& 'N',work,info)
if(info /=0) goto 9999
if (ismth /= no_smth_) then
@ -1232,7 +1238,7 @@ subroutine psb_dmlprcaply(baseprecv,x,beta,y,desc_data,trans,work,info)
call psb_spmm(-one,baseprecv(2)%aorig,tty,one,tx,desc_data,info,work=work)
if(info /=0) goto 9999
call psb_dbaseprcaply(baseprecv(1),tx,one,tty,desc_data,'N',work,info)
call psb_baseprc_aply(baseprecv(1),tx,one,tty,desc_data,'N',work,info)
call psb_axpby(one,tty,beta,y,desc_data,info)
@ -1247,7 +1253,7 @@ subroutine psb_dmlprcaply(baseprecv,x,beta,y,desc_data,trans,work,info)
end select
case default
write(0,*) me, 'Wrong mltype into PRCAPLY ',&
write(0,*) me, 'Wrong mltype into PRC_APLY ',&
& baseprecv(2)%iprcparm(ml_type_)
end select
@ -1263,7 +1269,7 @@ subroutine psb_dmlprcaply(baseprecv,x,beta,y,desc_data,trans,work,info)
end if
return
end subroutine psb_dmlprcaply
end subroutine psb_dmlprc_aply
!!$
!!$
@ -1301,7 +1307,7 @@ end subroutine psb_dmlprcaply
!!$
!!$
subroutine psb_dprecaply1(prec,x,desc_data,info,trans)
subroutine psb_dprc_aply1(prec,x,desc_data,info,trans)
use psb_serial_mod
use psb_descriptor_type
@ -1320,7 +1326,7 @@ subroutine psb_dprecaply1(prec,x,desc_data,info,trans)
real(kind(1.d0)), parameter :: one=1.d0, zero=0.d0
interface
subroutine psb_dprecaply(prec,x,y,desc_data,info,trans, work)
subroutine psb_dprc_aply(prec,x,y,desc_data,info,trans, work)
use psb_descriptor_type
use psb_prec_type
@ -1332,7 +1338,7 @@ subroutine psb_dprecaply1(prec,x,desc_data,info,trans)
integer, intent(out) :: info
character(len=1), optional :: trans
real(kind(0.d0)), optional, target :: work(:)
end subroutine psb_dprecaply
end subroutine psb_dprc_aply
end interface
! Local variables
@ -1358,8 +1364,8 @@ subroutine psb_dprecaply1(prec,x,desc_data,info,trans)
call psb_errpush(4010,name,a_err='Allocate')
goto 9999
end if
if (debug) write(0,*) 'Prcaply1 Size(x) ',size(x), size(ww),size(w1)
call psb_dprecaply(prec,x,ww,desc_data,info,trans_,work=w1)
if (debug) write(0,*) 'Prc_aply1 Size(x) ',size(x), size(ww),size(w1)
call psb_dprc_aply(prec,x,ww,desc_data,info,trans_,work=w1)
if(info /=0) goto 9999
x(:) = ww(:)
deallocate(ww,W1)
@ -1375,4 +1381,4 @@ subroutine psb_dprecaply1(prec,x,desc_data,info,trans)
return
end if
return
end subroutine psb_dprecaply1
end subroutine psb_dprc_aply1

@ -52,47 +52,17 @@ subroutine psb_dprecbld(a,desc_a,p,info,upd)
integer, intent(out) :: info
character, intent(in), optional :: upd
interface psb_ilu_bld
subroutine psb_dilu_bld(a,desc_data,p,upd,info)
use psb_serial_mod
interface psb_baseprc_bld
subroutine psb_dbaseprc_bld(a,desc_a,p,info,upd)
Use psb_spmat_type
use psb_descriptor_type
use psb_prec_type
integer, intent(out) :: info
type(psb_dspmat_type), intent(in), target :: a
type(psb_desc_type),intent(in) :: desc_data
type(psb_dbase_prec), intent(inout) :: p
character, intent(in) :: upd
end subroutine psb_dilu_bld
end interface
interface psb_slu_bld
subroutine psb_dslu_bld(a,desc_a,p,info)
use psb_serial_mod
use psb_descriptor_type
use psb_prec_type
use psb_const_mod
implicit none
type(psb_dspmat_type), intent(in) :: a
type(psb_desc_type), intent(in) :: desc_a
type(psb_dbase_prec), intent(inout) :: p
integer, intent(out) :: info
end subroutine psb_dslu_bld
end interface
interface psb_umf_bld
subroutine psb_dumf_bld(a,desc_a,p,info)
use psb_serial_mod
use psb_descriptor_type
use psb_prec_type
use psb_const_mod
implicit none
type(psb_dspmat_type), intent(in) :: a
type(psb_desc_type), intent(in) :: desc_a
type(psb_dbase_prec), intent(inout) :: p
integer, intent(out) :: info
end subroutine psb_dumf_bld
type(psb_dspmat_type), target :: a
type(psb_desc_type), intent(in) :: desc_a
type(psb_dbaseprc_type),intent(inout) :: p
integer, intent(out) :: info
character, intent(in), optional :: upd
end subroutine psb_dbaseprc_bld
end interface
interface psb_mlprc_bld
@ -103,16 +73,16 @@ subroutine psb_dprecbld(a,desc_a,p,info,upd)
use psb_const_mod
implicit none
type(psb_dspmat_type), intent(in) :: a
type(psb_desc_type), intent(in) :: desc_a
type(psb_dbase_prec), intent(inout) :: p
integer, intent(out) :: info
type(psb_dspmat_type), intent(in) :: a
type(psb_desc_type), intent(in) :: desc_a
type(psb_dbaseprc_type), intent(inout) :: p
integer, intent(out) :: info
end subroutine psb_dmlprc_bld
end interface
! Local scalars
Integer :: err, nnzero, n_row, n_col,I,j,k,icontxt,&
& me,mycol,nprow,npcol,mglob,lw, mtype, nrg, nzg, err_act
Integer :: err, nnzero, I,j,k,icontxt,&
& me,mycol,nprow,npcol,lw, mtype, nrg, nzg, err_act
real(kind(1.d0)) :: temp, real_err(5)
real(kind(1.d0)),pointer :: gd(:), work(:)
integer :: int_err(5)
@ -132,25 +102,27 @@ subroutine psb_dprecbld(a,desc_a,p,info,upd)
info = 0
int_err(1) = 0
icontxt = desc_a%matrix_data(psb_ctxt_)
n_row = desc_a%matrix_data(psb_n_row_)
n_col = desc_a%matrix_data(psb_n_col_)
mglob = desc_a%matrix_data(psb_m_)
if (debug) write(0,*) 'Preconditioner Blacs_gridinfo'
call blacs_gridinfo(icontxt, nprow, npcol, me, mycol)
if (present(upd)) then
if (debug) write(0,*) 'UPD ', upd
if ((UPD.eq.'F').or.(UPD.eq.'T')) then
IUPD=UPD
if ((upd.eq.'F').or.(upd.eq.'T')) then
iupd=upd
else
IUPD='F'
iupd='F'
endif
else
IUPD='F'
iupd='F'
endif
if (.not.associated(p%baseprecv)) then
!! Error 1: should call precset
info=4010
ch_err='unassociated bpv'
call psb_errpush(info,name,a_err=ch_err)
goto 9999
end if
!
! Should add check to ensure all procs have the same...
@ -158,201 +130,60 @@ subroutine psb_dprecbld(a,desc_a,p,info,upd)
! ALso should define symbolic names for the preconditioners.
!
call psb_check_def(p%baseprecv(1)%iprcparm(p_type_),'base_prec',&
& diagsc_,is_legal_base_prec)
allocate(p%baseprecv(1)%desc_data,stat=info)
if (info /= 0) then
call psb_errpush(4010,name,a_err='Allocate')
goto 9999
end if
call psb_nullify_desc(p%baseprecv(1)%desc_data)
select case(p%baseprecv(1)%iprcparm(p_type_))
case (noprec_)
! Do nothing.
case (diagsc_)
if (debug) write(0,*) 'Precond: Diagonal scaling'
! diagonal scaling
call psb_realloc(n_col,p%baseprecv(1)%d,info)
if (size(p%baseprecv) >= 1) then
call init_baseprc_av(p%baseprecv(1),info)
if (info /= 0) then
call psb_errpush(4010,name,a_err='psb_realloc')
goto 9999
end if
call psb_csrws(p%baseprecv(1)%d,a,info,trans='N')
if(info /= 0) then
info=4010
ch_err='psb_csrws'
ch_err='allocate'
call psb_errpush(info,name,a_err=ch_err)
goto 9999
end if
if (debug) write(ilout+me,*) 'VDIAG ',n_row
do i=1,n_row
if (p%baseprecv(1)%d(i).eq.0.0d0) then
p%baseprecv(1)%d(i)=1.d0
else
p%baseprecv(1)%d(i) = 1.d0/p%baseprecv(1)%d(i)
endif
if (debug) write(ilout+me,*) i,desc_a%loc_to_glob(i),&
& p%baseprecv(1)%d(i)
if (p%baseprecv(1)%d(i).lt.0.d0) then
write(0,*) me,'Negative RWS? ',i,p%baseprecv(1)%d(i)
endif
end do
if (a%pl(1) /= 0) then
allocate(work(n_row),stat=info)
if (info /= 0) then
info=4000
call psb_errpush(info,name)
goto 9999
end if
call psb_gelp('n',a%pl,p%baseprecv(1)%d,desc_a,info)
if(info /= 0) then
info=4010
ch_err='psb_dgelp'
call psb_errpush(info,name,a_err=ch_err)
goto 9999
end if
deallocate(work)
endif
if (debug) then
allocate(gd(mglob),stat=info)
if (info /= 0) then
call psb_errpush(4010,name,a_err='Allocate')
goto 9999
end if
call psb_gather(gd, p%baseprecv(1)%d, desc_a, info, iroot=iroot)
if(info /= 0) then
info=4010
ch_err='psb_dgatherm'
call psb_errpush(info,name,a_err=ch_err)
goto 9999
end if
if (me.eq.iroot) then
write(iout+nprow,*) 'VDIAG CHECK ',mglob
do i=1,mglob
write(iout+nprow,*) i,gd(i)
enddo
endif
deallocate(gd)
endif
if (debug) write(*,*) 'Preconditioner DIAG computed OK'
case (bja_,asm_)
call psb_check_def(p%baseprecv(1)%iprcparm(n_ovr_),'overlap',&
& 0,is_legal_n_ovr)
call psb_check_def(p%baseprecv(1)%iprcparm(restr_),'restriction',&
& psb_halo_,is_legal_restrict)
call psb_check_def(p%baseprecv(1)%iprcparm(prol_),'prolongator',&
& psb_none_,is_legal_prolong)
call psb_check_def(p%baseprecv(1)%iprcparm(iren_),'renumbering',&
& renum_none_,is_legal_renum)
if (debug) write(0,*)me, ': Calling PSB_ILU_BLD'
!!$ allocate(p%baseprecv(1)%av(bp_ilu_avsz),stat=info)
allocate(p%baseprecv(1)%av(max_avsz),stat=info)
do k=1,size(p%baseprecv(1)%av)
call psb_nullify_sp(p%baseprecv(1)%av(k))
end do
select case(p%baseprecv(1)%iprcparm(f_type_))
case(f_ilu_n_,f_ilu_e_)
call psb_ilu_bld(a,desc_a,p%baseprecv(1),iupd,info)
if(debug) write(0,*)me,': out of psb_ilu_bld'
if(info /= 0) then
info=4010
ch_err='psb_ilu_bld'
call psb_errpush(info,name,a_err=ch_err)
goto 9999
end if
case(f_slu_)
if(debug) write(0,*)me,': calling slu_bld'
call psb_slu_bld(a,desc_a,p%baseprecv(1),info)
if(info /= 0) then
info=4010
ch_err='slu_bld'
call psb_errpush(info,name,a_err=ch_err)
goto 9999
end if
case(f_umf_)
if(debug) write(0,*)me,': calling umf_bld'
call psb_umf_bld(a,desc_a,p%baseprecv(1),info)
if(info /= 0) then
info=4010
ch_err='umf_bld'
call psb_errpush(info,name,a_err=ch_err)
goto 9999
end if
case(f_none_)
write(0,*) 'Fact=None in PRECBLD Bja/ASM??'
case default
write(0,*) 'Unknown factor type in precbld bja/asm: ',&
&p%baseprecv(1)%iprcparm(f_type_)
end select
end select
call psb_baseprc_bld(a,desc_a,p%baseprecv(1),info,iupd)
else
info=4010
ch_err='size bpv'
call psb_errpush(info,name,a_err=ch_err)
goto 9999
if (size(p%baseprecv) >1) then
endif
if (.not.associated(p%baseprecv(2)%iprcparm)) then
info = 2222
call psb_errpush(info,name)
if (size(p%baseprecv) > 1) then
call init_baseprc_av(p%baseprecv(2),info)
if (info /= 0) then
info=4010
ch_err='allocate'
call psb_errpush(info,name,a_err=ch_err)
goto 9999
endif
call psb_check_def(p%baseprecv(2)%iprcparm(ml_type_),'Multilevel type',&
& mult_ml_prec_,is_legal_ml_type)
call psb_check_def(p%baseprecv(2)%iprcparm(aggr_alg_),'aggregation',&
& loc_aggr_,is_legal_ml_aggr_kind)
call psb_check_def(p%baseprecv(2)%iprcparm(smth_kind_),'Smoother kind',&
& smth_omg_,is_legal_ml_smth_kind)
call psb_check_def(p%baseprecv(2)%iprcparm(coarse_mat_),'Coarse matrix',&
& mat_distr_,is_legal_ml_coarse_mat)
call psb_check_def(p%baseprecv(2)%iprcparm(smth_pos_),'smooth_pos',&
& pre_smooth_,is_legal_ml_smooth_pos)
call psb_check_def(p%baseprecv(2)%iprcparm(f_type_),'fact',f_ilu_n_,is_legal_ml_fact)
nullify(p%baseprecv(2)%desc_data)
select case(p%baseprecv(2)%iprcparm(f_type_))
case(f_ilu_n_)
call psb_check_def(p%baseprecv(2)%iprcparm(ilu_fill_in_),'Level',0,is_legal_ml_lev)
case(f_ilu_e_)
call psb_check_def(p%baseprecv(2)%dprcparm(fact_eps_),'Eps',0.0d0,is_legal_ml_eps)
end select
call psb_check_def(p%baseprecv(2)%dprcparm(smooth_omega_),'omega',0.0d0,is_legal_omega)
call psb_check_def(p%baseprecv(2)%iprcparm(jac_sweeps_),'Jacobi sweeps',&
& 1,is_legal_jac_sweeps)
call psb_mlprc_bld(a,desc_a,p%baseprecv(2),info)
if(info /= 0) then
info=4010
ch_err='psb_mlprc_bld'
call psb_errpush(info,name,a_err=ch_err)
goto 9999
end if
!
! Note: this here has not been tried out. We probably need
! a different baseprc field %desc_ac, in case we try RAS on lev. 2 of
! a 3-level prec.
!
do i=3, size(p%baseprecv)
call init_baseprc_av(p%baseprecv(i),info)
if (info /= 0) then
info=4010
ch_err='allocate'
call psb_errpush(info,name,a_err=ch_err)
goto 9999
endif
call psb_mlprc_bld(p%baseprecv(i-1)%av(ac_),p%baseprecv(i-1)%desc_data,&
& p%baseprecv(i),info)
end do
endif
@ -367,5 +198,20 @@ subroutine psb_dprecbld(a,desc_a,p,info,upd)
end if
return
contains
subroutine init_baseprc_av(p,info)
type(psb_dbaseprc_type), intent(inout) :: p
integer :: info
if (associated(p%av)) then
! Have not decided what to do yet
end if
allocate(p%av(max_avsz),stat=info)
if (info /= 0) return
do k=1,size(p%av)
call psb_nullify_sp(p%av(k))
end do
end subroutine init_baseprc_av
end subroutine psb_dprecbld

@ -48,7 +48,7 @@ subroutine psb_dprecset(p,ptype,iv,rs,rv,info)
real(kind(1.d0)), optional, intent(in) :: rv(:)
integer, optional, intent(out) :: info
type(psb_dbase_prec), pointer :: bpv(:)=>null()
type(psb_dbaseprc_type), pointer :: bpv(:)=>null()
character(len=len(ptype)) :: typeup
integer :: isz, err

@ -41,10 +41,10 @@ subroutine psb_dslu_bld(a,desc_a,p,info)
use psb_const_mod
implicit none
type(psb_dspmat_type), intent(in) :: a
type(psb_desc_type), intent(in) :: desc_a
type(psb_dbase_prec), intent(inout) :: p
integer, intent(out) :: info
type(psb_dspmat_type), intent(in) :: a
type(psb_desc_type), intent(in) :: desc_a
type(psb_dbaseprc_type), intent(inout) :: p
integer, intent(out) :: info
type(psb_dspmat_type) :: blck, atmp

@ -45,10 +45,10 @@ subroutine psb_dsp_renum(a,desc_a,blck,p,atmp,info)
implicit none
! .. array Arguments ..
type(psb_dspmat_type), intent(in) :: a,blck
type(psb_dspmat_type), intent(inout) :: atmp
type(psb_dbase_prec), intent(inout) :: p
type(psb_desc_type), intent(in) :: desc_a
type(psb_dspmat_type), intent(in) :: a,blck
type(psb_dspmat_type), intent(inout) :: atmp
type(psb_dbaseprc_type), intent(inout) :: p
type(psb_desc_type), intent(in) :: desc_a
integer, intent(out) :: info

@ -42,10 +42,10 @@ subroutine psb_dumf_bld(a,desc_a,p,info)
use psb_const_mod
implicit none
type(psb_dspmat_type), intent(in) :: a
type(psb_desc_type), intent(in) :: desc_a
type(psb_dbase_prec), intent(inout) :: p
integer, intent(out) :: info
type(psb_dspmat_type), intent(in) :: a
type(psb_desc_type), intent(in) :: desc_a
type(psb_dbaseprc_type), intent(inout) :: p
integer, intent(out) :: info
type(psb_dspmat_type) :: blck, atmp

Loading…
Cancel
Save