|
|
|
@ -80,36 +80,36 @@ program mld_dexample_ml
|
|
|
|
|
|
|
|
|
|
implicit none
|
|
|
|
|
|
|
|
|
|
! input parameters
|
|
|
|
|
! input parameters
|
|
|
|
|
|
|
|
|
|
! sparse matrices
|
|
|
|
|
! sparse matrices
|
|
|
|
|
type(psb_dspmat_type) :: A
|
|
|
|
|
|
|
|
|
|
! sparse matrices descriptor
|
|
|
|
|
! sparse matrices descriptor
|
|
|
|
|
type(psb_desc_type):: desc_A
|
|
|
|
|
|
|
|
|
|
! preconditioner
|
|
|
|
|
! preconditioner
|
|
|
|
|
type(mld_dprec_type) :: P
|
|
|
|
|
|
|
|
|
|
! right-hand side, solution and residual vectors
|
|
|
|
|
! right-hand side, solution and residual vectors
|
|
|
|
|
real(psb_dpk_), allocatable , save :: b(:), x(:), r(:)
|
|
|
|
|
|
|
|
|
|
! solver and preconditioner parameters
|
|
|
|
|
! solver and preconditioner parameters
|
|
|
|
|
real(psb_dpk_) :: tol, err
|
|
|
|
|
integer :: itmax, iter, istop
|
|
|
|
|
integer :: nlev
|
|
|
|
|
|
|
|
|
|
! parallel environment parameters
|
|
|
|
|
! parallel environment parameters
|
|
|
|
|
integer :: ictxt, iam, np
|
|
|
|
|
|
|
|
|
|
! other variables
|
|
|
|
|
! other variables
|
|
|
|
|
integer :: choice
|
|
|
|
|
integer :: i,info,j,amatsize,descsize,precsize
|
|
|
|
|
integer :: idim, ierr, ircode
|
|
|
|
|
real(psb_dpk_) :: t1, t2, tprec, resmx, resmxp
|
|
|
|
|
character(len=20) :: name
|
|
|
|
|
|
|
|
|
|
! initialize the parallel environment
|
|
|
|
|
! initialize the parallel environment
|
|
|
|
|
|
|
|
|
|
call psb_init(ictxt)
|
|
|
|
|
call psb_info(ictxt,iam,np)
|
|
|
|
@ -125,11 +125,11 @@ program mld_dexample_ml
|
|
|
|
|
info=0
|
|
|
|
|
call psb_set_errverbosity(2)
|
|
|
|
|
|
|
|
|
|
! get parameters
|
|
|
|
|
! get parameters
|
|
|
|
|
|
|
|
|
|
call get_parms(ictxt,choice,idim,itmax,tol)
|
|
|
|
|
|
|
|
|
|
! allocate and fill in the coefficient matrix, rhs and initial guess
|
|
|
|
|
! allocate and fill in the coefficient matrix, rhs and initial guess
|
|
|
|
|
|
|
|
|
|
call psb_barrier(ictxt)
|
|
|
|
|
t1 = psb_wtime()
|
|
|
|
@ -149,19 +149,19 @@ program mld_dexample_ml
|
|
|
|
|
|
|
|
|
|
case(1)
|
|
|
|
|
|
|
|
|
|
! initialize the default multi-level preconditioner, i.e. hybrid
|
|
|
|
|
! Schwarz, using RAS (with overlap 1 and ILU(0) on the blocks)
|
|
|
|
|
! as post-smoother and 4 block-Jacobi sweeps (with UMFPACK LU
|
|
|
|
|
! on the blocks) as distributed coarse-level solver
|
|
|
|
|
! initialize the default multi-level preconditioner, i.e. hybrid
|
|
|
|
|
! Schwarz, using RAS (with overlap 1 and ILU(0) on the blocks)
|
|
|
|
|
! as post-smoother and 4 block-Jacobi sweeps (with UMFPACK LU
|
|
|
|
|
! on the blocks) as distributed coarse-level solver
|
|
|
|
|
|
|
|
|
|
call mld_precinit(P,'ML',info)
|
|
|
|
|
|
|
|
|
|
case(2)
|
|
|
|
|
|
|
|
|
|
! set a three-level hybrid Schwarz preconditioner, which uses
|
|
|
|
|
! block Jacobi (with ILU(0) on the blocks) as post-smoother,
|
|
|
|
|
! a coarsest matrix replicated on the processors, and the
|
|
|
|
|
! LU factorization from UMFPACK as coarse-level solver
|
|
|
|
|
! set a three-level hybrid Schwarz preconditioner, which uses
|
|
|
|
|
! block Jacobi (with ILU(0) on the blocks) as post-smoother,
|
|
|
|
|
! a coarsest matrix replicated on the processors, and the
|
|
|
|
|
! LU factorization from UMFPACK as coarse-level solver
|
|
|
|
|
|
|
|
|
|
call mld_precinit(P,'ML',info,nlev=3)
|
|
|
|
|
call mld_precset(P,mld_smoother_type_,'BJAC',info)
|
|
|
|
@ -170,10 +170,10 @@ program mld_dexample_ml
|
|
|
|
|
|
|
|
|
|
case(3)
|
|
|
|
|
|
|
|
|
|
! set a three-level additive Schwarz preconditioner, which uses
|
|
|
|
|
! RAS (with overlap 1 and ILU(0) on the blocks) as pre- and
|
|
|
|
|
! post-smoother, and 5 block-Jacobi sweeps (with UMFPACK LU
|
|
|
|
|
! on the blocks) as distributed coarsest-level solver
|
|
|
|
|
! set a three-level additive Schwarz preconditioner, which uses
|
|
|
|
|
! RAS (with overlap 1 and ILU(0) on the blocks) as pre- and
|
|
|
|
|
! post-smoother, and 5 block-Jacobi sweeps (with UMFPACK LU
|
|
|
|
|
! on the blocks) as distributed coarsest-level solver
|
|
|
|
|
|
|
|
|
|
call mld_precinit(P,'ML',info,nlev=3)
|
|
|
|
|
call mld_precset(P,mld_ml_type_,'ADD',info)
|
|
|
|
@ -182,7 +182,7 @@ program mld_dexample_ml
|
|
|
|
|
|
|
|
|
|
end select
|
|
|
|
|
|
|
|
|
|
! build the preconditioner
|
|
|
|
|
! build the preconditioner
|
|
|
|
|
|
|
|
|
|
call psb_barrier(ictxt)
|
|
|
|
|
t1 = psb_wtime()
|
|
|
|
@ -197,13 +197,13 @@ program mld_dexample_ml
|
|
|
|
|
goto 9999
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
|
|
! set the solver parameters and the initial guess
|
|
|
|
|
! set the solver parameters and the initial guess
|
|
|
|
|
|
|
|
|
|
call psb_geall(x,desc_A,info)
|
|
|
|
|
x(:) =0.0
|
|
|
|
|
call psb_geasb(x,desc_A,info)
|
|
|
|
|
|
|
|
|
|
! solve Ax=b with preconditioned BiCGSTAB
|
|
|
|
|
! solve Ax=b with preconditioned BiCGSTAB
|
|
|
|
|
|
|
|
|
|
call psb_barrier(ictxt)
|
|
|
|
|
t1 = psb_wtime()
|
|
|
|
@ -334,10 +334,8 @@ contains
|
|
|
|
|
integer :: x,y,z,ia,indx_owner
|
|
|
|
|
integer :: np, iam
|
|
|
|
|
integer :: element
|
|
|
|
|
integer :: nv, inv
|
|
|
|
|
integer, allocatable :: irow(:),icol(:)
|
|
|
|
|
real(psb_dpk_), allocatable :: val(:)
|
|
|
|
|
integer, allocatable :: prv(:)
|
|
|
|
|
! deltah dimension of each grid cell
|
|
|
|
|
! deltat discretization time
|
|
|
|
|
real(psb_dpk_) :: deltah
|
|
|
|
@ -367,11 +365,11 @@ contains
|
|
|
|
|
if(iam == psb_root_) write(0,'("Generating Matrix (size=",i0x,")...")')n
|
|
|
|
|
|
|
|
|
|
call psb_cdall(ictxt,desc_a,info,mg=n,parts=parts)
|
|
|
|
|
call psb_spall(a,desc_a,info,nnz=nnz)
|
|
|
|
|
if (info == 0) call psb_spall(a,desc_a,info,nnz=nnz)
|
|
|
|
|
! define rhs from boundary conditions; also build initial guess
|
|
|
|
|
call psb_geall(b,desc_a,info)
|
|
|
|
|
call psb_geall(xv,desc_a,info)
|
|
|
|
|
if(info /= 0) then
|
|
|
|
|
if (info == 0) call psb_geall(b,desc_a,info)
|
|
|
|
|
if (info == 0) call psb_geall(xv,desc_a,info)
|
|
|
|
|
if (info /= 0) then
|
|
|
|
|
info=4010
|
|
|
|
|
call psb_errpush(info,name)
|
|
|
|
|
goto 9999
|
|
|
|
@ -382,7 +380,7 @@ contains
|
|
|
|
|
! a bunch of rows per call.
|
|
|
|
|
!
|
|
|
|
|
allocate(val(20*nbmax),irow(20*nbmax),&
|
|
|
|
|
&icol(20*nbmax),prv(np),stat=info)
|
|
|
|
|
&icol(20*nbmax),stat=info)
|
|
|
|
|
if (info /= 0 ) then
|
|
|
|
|
info=4000
|
|
|
|
|
call psb_errpush(info,name)
|
|
|
|
@ -397,10 +395,8 @@ contains
|
|
|
|
|
! distribution.
|
|
|
|
|
|
|
|
|
|
do glob_row = 1, n
|
|
|
|
|
call parts(glob_row,n,np,prv,nv)
|
|
|
|
|
do inv = 1, nv
|
|
|
|
|
indx_owner = prv(inv)
|
|
|
|
|
if (indx_owner == iam) then
|
|
|
|
|
! Figure out which rows are local to the current process:
|
|
|
|
|
if (psb_is_owned(glob_row,desc_a)) then
|
|
|
|
|
! local matrix pointer
|
|
|
|
|
element=1
|
|
|
|
|
! compute gridpoint coordinates
|
|
|
|
@ -534,7 +530,6 @@ contains
|
|
|
|
|
if(info /= 0) exit
|
|
|
|
|
end if
|
|
|
|
|
end do
|
|
|
|
|
end do
|
|
|
|
|
|
|
|
|
|
call psb_barrier(ictxt)
|
|
|
|
|
t2 = psb_wtime()-t1
|
|
|
|
@ -563,7 +558,7 @@ contains
|
|
|
|
|
call psb_amx(ictxt,tasb)
|
|
|
|
|
|
|
|
|
|
if(iam == psb_root_) then
|
|
|
|
|
write(*,'("The matrix has been generated and assembeld in ",a3," format.")')&
|
|
|
|
|
write(*,'("The matrix has been generated and assembled in ",a3," format.")')&
|
|
|
|
|
& a%fida(1:3)
|
|
|
|
|
write(*,'("-pspins time : ",es10.4)')tins
|
|
|
|
|
write(*,'("-insert time : ",es10.4)')t2
|
|
|
|
|