mirror of
https://github.com/sfilippone/psblas3.git
synced 2026-10-18 11:52:11 +00:00
Merged changes for serial version.
This commit is contained in:
@@ -2,6 +2,10 @@ Changelog. A lot less detailed than usual, at least for past
|
||||
history.
|
||||
|
||||
|
||||
2007/02/01: Merged serial version: we provide a minimal fake mpi to
|
||||
allow compiling and running without mpi and blacs. Only
|
||||
tested with gnu42 so far.
|
||||
|
||||
2007/01/23: Defined new field ext_index in desc_type, and
|
||||
fixed long standing inconsistency in usage of overlap for
|
||||
AS preconditioners. Modified halo to accept selector for
|
||||
|
||||
+5
-1
@@ -1,6 +1,6 @@
|
||||
.mod=.mod
|
||||
.fh=.fh
|
||||
.SUFFIXES: .f90 $(.mod) .F90
|
||||
.SUFFIXES: .f90 $(.mod) .F90 .F
|
||||
|
||||
|
||||
####################### Section 1 #######################
|
||||
@@ -78,8 +78,12 @@ $(.mod).o:
|
||||
$(F90) $(F90COPT) $(INCDIRS) -c $<
|
||||
.f90.o:
|
||||
$(F90) $(F90COPT) $(INCDIRS) -c $<
|
||||
.F.o:
|
||||
$(F90) $(F90COPT) $(INCDIRS) $(FDEFINES) -c $<
|
||||
.F90.o:
|
||||
$(F90) $(F90COPT) $(INCDIRS) $(FDEFINES) -c $<
|
||||
.F90$(.mod):
|
||||
$(F90) $(F90COPT) $(INCDIRS) $(FDEFINES) -c $<
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
.mod=.mod
|
||||
.fh=.fh
|
||||
.SUFFIXES: .f90 $(.mod) .F90 .F
|
||||
|
||||
|
||||
####################### Section 1 #######################
|
||||
# Define your compilers and compiler flags here #
|
||||
##########################################################
|
||||
F90=/usr/local/gcc42/bin/gfortran
|
||||
FC=$(F90)
|
||||
F77=$(FC)
|
||||
CC=/usr/local/gcc42/bin/gcc
|
||||
F90COPT=-O3 -ggdb
|
||||
FCOPT=-O3 -ggdb
|
||||
CCOPT=-O3 -ggdb
|
||||
|
||||
####################### Section 2 #######################
|
||||
# Define your linker and linker flags here #
|
||||
##########################################################
|
||||
F90LINK=$(FC)
|
||||
FLINK=$(FC)
|
||||
MPF90=$(FC)
|
||||
MPF77=$(FC)
|
||||
MPCC=$(CC)
|
||||
|
||||
####################### Section 3 #######################
|
||||
# Specify paths to libraries #
|
||||
##########################################################
|
||||
BLAS=-lblas-gcc42 -L$(HOME)/LIB
|
||||
# No BLACS in serialMPI. But we need the fakempi.o
|
||||
#BLACS=-lmpiblacs-gcc42 -L$(HOME)/LIB
|
||||
EXTRA_COBJS=fakempi.o
|
||||
|
||||
|
||||
####################### Section 4 #######################
|
||||
# Other useful tools&defines #
|
||||
##########################################################
|
||||
SLUDIR=/usr/local/SuperLU_3.0
|
||||
SLU=-lslu_lx_gcc42 -L$(SLUDIR)
|
||||
SLUDEF=-DHave_SLU_ -I$(SLUDIR)
|
||||
|
||||
UMFDIR=$(HOME)/LIB/Umfpack_gcc41
|
||||
UMF=-lumfpack -lamd -L$(UMFDIR)
|
||||
UMFDEF=-DHave_UMF_ -I$(UMFDIR)
|
||||
#
|
||||
# We are using the public domain tool METIS from U. Minnesota. To get it
|
||||
# check URL http://www.cs.umn.edu:~karypis
|
||||
#
|
||||
METIS_LIB = -L$(HOME)/NUMERICAL/metis-4.0 -lmetis
|
||||
LDLIBS=$(BLACS) $(SLU) $(UMF) $(BLAS) $(METIS_LIB)
|
||||
|
||||
# Add -DLargeFptr for 64-bit addresses
|
||||
CDEFINES=-DAdd_ $(SLUDEF) $(UMFDEF)
|
||||
FDEFINES=-DHAVE_MOVE_ALLOC -DSERIAL_MPI
|
||||
|
||||
AR=ar -cur
|
||||
RANLIB=ranlib
|
||||
|
||||
|
||||
|
||||
####################### Section 5 #######################
|
||||
# Do not edit this #
|
||||
##########################################################
|
||||
LIBDIR=lib
|
||||
BASELIBNAME=libpsb_base.a
|
||||
PRECLIBNAME=libpsb_prec.a
|
||||
METHDLIBNAME=libpsb_krylov.a
|
||||
UTILLIBNAME=libpsb_util.a
|
||||
|
||||
# Under Linux/gmake there is a rule interpreting .mod as Modula source!
|
||||
$(.mod).o:
|
||||
|
||||
.f.o:
|
||||
$(FC) $(FCOPT) $(INCDIRS) -c $<
|
||||
.c.o:
|
||||
$(CC) $(CCOPT) $(INCDIRS) $(CDEFINES) -c $<
|
||||
.f$(.mod):
|
||||
$(F90) $(FCOPT) $(INCDIRS) -c $<
|
||||
.f90$(.mod):
|
||||
$(F90) $(F90COPT) $(INCDIRS) -c $<
|
||||
.f90.o:
|
||||
$(F90) $(F90COPT) $(INCDIRS) -c $<
|
||||
.F.o:
|
||||
$(F90) $(F90COPT) $(INCDIRS) $(FDEFINES) -c $<
|
||||
.F90.o:
|
||||
$(F90) $(F90COPT) $(INCDIRS) $(FDEFINES) -c $<
|
||||
.F90$(.mod):
|
||||
$(F90) $(F90COPT) $(INCDIRS) $(FDEFINES) -c $<
|
||||
|
||||
|
||||
|
||||
|
||||
+5
-1
@@ -1,6 +1,6 @@
|
||||
.mod=.mod
|
||||
.fh=.fh
|
||||
.SUFFIXES: .f90 $(.mod) .F90
|
||||
.SUFFIXES: .f90 $(.mod) .F90 .F
|
||||
|
||||
|
||||
####################### Section 1 #######################
|
||||
@@ -80,8 +80,12 @@ $(.mod).o:
|
||||
$(F90) $(F90COPT) $(INCDIRS) -c $<
|
||||
.f90.o:
|
||||
$(F90) $(F90COPT) $(INCDIRS) -c $<
|
||||
.F.o:
|
||||
$(F90) $(F90COPT) $(INCDIRS) $(FDEFINES) -c $<
|
||||
.F90.o:
|
||||
$(F90) $(F90COPT) $(INCDIRS) $(FDEFINES) -c $<
|
||||
.F90$(.mod):
|
||||
$(F90) $(F90COPT) $(INCDIRS) $(FDEFINES) -c $<
|
||||
|
||||
|
||||
|
||||
|
||||
+6
-2
@@ -1,13 +1,13 @@
|
||||
.mod=.mod
|
||||
.fh=.fh
|
||||
.SUFFIXES: .f90 $(.mod) .F90
|
||||
.SUFFIXES: .f90 $(.mod) .F90 .F
|
||||
|
||||
|
||||
####################### Section 1 #######################
|
||||
# Define your compilers and compiler flags here #
|
||||
##########################################################
|
||||
F90=xlf95 -qsuffix=f=f90:cpp=F90
|
||||
FC=xlf
|
||||
FC=xlf -qsuffix=cpp=F
|
||||
F77=$(FC)
|
||||
CC=xlc
|
||||
F90COPT= -O3
|
||||
@@ -78,8 +78,12 @@ $(.mod).o:
|
||||
$(F90) $(F90COPT) $(INCDIRS) -c $<
|
||||
.f90.o:
|
||||
$(F90) $(F90COPT) $(INCDIRS) -c $<
|
||||
.F.o:
|
||||
$(F90) $(F90COPT) $(INCDIRS) $(FDEFINES) -c $<
|
||||
.F90.o:
|
||||
$(F90) $(F90COPT) $(INCDIRS) $(FDEFINES) -c $<
|
||||
.F90$(.mod):
|
||||
$(F90) $(F90COPT) $(INCDIRS) $(FDEFINES) -c $<
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
include Make.inc
|
||||
#PREC=../mld2p4
|
||||
PREC=baseprec
|
||||
PREC=../mld2p4
|
||||
#PREC=baseprec
|
||||
|
||||
library:
|
||||
( [ -d lib ] || mkdir lib)
|
||||
|
||||
@@ -121,7 +121,6 @@ subroutine psb_iscatterm(globx, locx, desc_a, info, iroot)
|
||||
n = psb_cd_get_global_cols(desc_a)
|
||||
|
||||
call psb_bcast(ictxt,k,root=iiroot)
|
||||
|
||||
! there should be a global check on k here!!!
|
||||
|
||||
call psb_chkglobvect(m,n,size(globx),iglobx,jglobx,desc_a,info)
|
||||
|
||||
@@ -11,8 +11,7 @@ COBJS = avltree.o srcht.o
|
||||
|
||||
MPFOBJS = psi_dswapdata.o psi_dswaptran.o psi_iswapdata.o \
|
||||
psi_iswaptran.o psi_desc_index.o \
|
||||
psi_zswapdata.o psi_zswaptran.o
|
||||
MPFOBJS2 = psi_extrct_dl.o
|
||||
psi_zswapdata.o psi_zswaptran.o psi_extrct_dl.o
|
||||
LIBDIR = ..
|
||||
MODDIR = ../modules
|
||||
INCDIRS = -I $(LIBDIR) -I $(MODDIR) -I .
|
||||
@@ -25,7 +24,6 @@ lib: mpfobjs $(FOBJS) $(FOBJS2) $(COBJS) $(MPFOBJS2)
|
||||
|
||||
mpfobjs: psi_gthsct.o
|
||||
(make $(MPFOBJS) F90="$(MPF90)" FC="$(MPF90)" FCOPT="$(F90COPT)")
|
||||
(make $(MPFOBJS2) F90="$(MPF77)" FC="$(MPF77)" FCOPT="$(FCOPT)")
|
||||
(make $(FOBJS2) F90="$(MPF77)" FC="$(MPF77)" FCOPT="$(FCOPT)")
|
||||
clean:
|
||||
/bin/rm -f $(MPFOBJS) $(FOBJS) $(COBJS) $(FOBJS2) $(MPFOBJS2)
|
||||
|
||||
@@ -1,282 +0,0 @@
|
||||
C
|
||||
C Parallel Sparse BLAS v2.0
|
||||
C (C) Copyright 2006 Salvatore Filippone University of Rome Tor Vergata
|
||||
C Alfredo Buttari University of Rome Tor Vergata
|
||||
C
|
||||
C Redistribution and use in source and binary forms, with or without
|
||||
C modification, are permitted provided that the following conditions
|
||||
C are met:
|
||||
C 1. Redistributions of source code must retain the above copyright
|
||||
C notice, this list of conditions and the following disclaimer.
|
||||
C 2. Redistributions in binary form must reproduce the above copyright
|
||||
C notice, this list of conditions, and the following disclaimer in the
|
||||
C documentation and/or other materials provided with the distribution.
|
||||
C 3. The name of the PSBLAS group or the names of its contributors may
|
||||
C not be used to endorse or promote products derived from this
|
||||
C software without specific written permission.
|
||||
C
|
||||
C THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
C ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
C TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
C PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PSBLAS GROUP OR ITS CONTRIBUTORS
|
||||
C BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
C CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
C SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
C INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
C CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
C ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
C POSSIBILITY OF SUCH DAMAGE.
|
||||
C
|
||||
C
|
||||
subroutine psi_extract_dep_list(desc_data,
|
||||
+ desc_str,dep_list,
|
||||
+ length_dl,np,dl_lda,mode,info)
|
||||
|
||||
c internal routine
|
||||
c ================
|
||||
c
|
||||
c _____called by psi_crea_halo and psi_crea_ovrlap ______
|
||||
c
|
||||
c purpose
|
||||
c =======
|
||||
c process root (pid=0) extracts for each process "k" the ordered list of process
|
||||
c to which "k" must communicate. this list with its order is extracted from
|
||||
c desc_str list
|
||||
c
|
||||
c
|
||||
c input
|
||||
c =======
|
||||
c desc_data :integer array
|
||||
c explanation:
|
||||
c name explanation
|
||||
c ------------------ -------------------------------------------------------
|
||||
c desc_data array of integer that contains some local and global
|
||||
c information of matrix.
|
||||
c
|
||||
c
|
||||
c now we explain each of the above vectors.
|
||||
c
|
||||
c let a be a generic sparse matrix. we denote with matdata_a the matrix_data
|
||||
c array for matrix a.
|
||||
c data stored in matrix_data array are:
|
||||
c
|
||||
c notation stored in explanation
|
||||
c --------------- ---------------------- -------------------------------------
|
||||
c dec_type matdata_a[psb_dec_type_] decomposition type
|
||||
c m matdata_a[m_] total number of equations
|
||||
c n matdata_a[n_] total number of variables
|
||||
c n_row matdata_a[psb_n_row_] number of local equations
|
||||
c n_col matdata_a[psb_n_col_] number of local variables
|
||||
c psb_ctxt_a matdata_a[ctxt_] the blacs context handle, indicating
|
||||
c the global context of the operation
|
||||
c on the matrix.
|
||||
c the context itself is global.
|
||||
c desc_str integer array
|
||||
c explanation:
|
||||
c let desc_str_p be the array desc_str for local process.
|
||||
c this is composed of variable dimension blocks for each process to
|
||||
c communicate to.
|
||||
c each block contain indexes of local halo elements to exchange with other
|
||||
c process.
|
||||
c let p be the pointer to the first element of a block in desc_str_p.
|
||||
c this block is stored in desc_str_p as :
|
||||
c
|
||||
c notation stored in explanation
|
||||
c --------------- --------------------------- -----------------------------------
|
||||
c process_id desc_str_p[p+psb_proc_id_] identifier of process which exchange
|
||||
c data with.
|
||||
c n_elements_recv desc_str_p[p+n_elem_recv_] number of elements to receive.
|
||||
c elements_recv desc_str_p[p+elem_recv_+i] indexes of local elements to
|
||||
c receive. these are stored in the
|
||||
c array from location p+elem_recv_ to
|
||||
c location p+elem_recv_+
|
||||
c desc_str_p[p+n_elem_recv_]-1.
|
||||
c if desc_data(psb_dec_type_) == 0
|
||||
c then also will be:
|
||||
c n_elements_send desc_str_p[p+n_elem_send_] number of elements to send.
|
||||
c elements_send desc_str_p[p+elem_send_+i] indexes of local elements to
|
||||
c send. these are stored in the
|
||||
c array from location p+elem_send_ to
|
||||
c location p+elem_send_+
|
||||
c desc_str_p[p+n_elem_send_]-1.
|
||||
c list is ended by -1 value
|
||||
c
|
||||
c np integer (global input)
|
||||
c number of grid process.
|
||||
c
|
||||
c mode integer (global input)
|
||||
c if mode =0 then will be inserted also duplicate element in
|
||||
c a same dependence list
|
||||
c if mode =1 then not will be inserted duplicate element in
|
||||
c a same dependence list
|
||||
c output
|
||||
c =====
|
||||
c only for root (pid=0) process:
|
||||
c dep_list integer array(dl_lda,0:np)
|
||||
c dependence list dep_list(*,i) is the list of process identifiers to which process i
|
||||
c must communicate with. this list with its order is extracted from
|
||||
c desc_str list.
|
||||
c length_dl integer array(0:np)
|
||||
c length_dl(i) is the length of dep_list(*,i) list
|
||||
use psb_penv_mod
|
||||
use psb_const_mod
|
||||
use psb_error_mod
|
||||
use psb_descriptor_type
|
||||
implicit none
|
||||
include 'mpif.h'
|
||||
c ....scalar parameters...
|
||||
integer np,dl_lda,mode, info
|
||||
|
||||
c ....array parameters....
|
||||
integer desc_str(*),desc_data(*),
|
||||
+ dep_list(dl_lda,0:np),length_dl(0:np)
|
||||
integer, pointer :: itmp(:)
|
||||
c .....local arrays....
|
||||
integer int_err(5)
|
||||
double precision real_err(5)
|
||||
|
||||
c .....local scalars...
|
||||
integer i,nprow,npcol,me,mycol,pointer_dep_list,proc,j,err_act
|
||||
integer ictxt, err, icomm
|
||||
logical debug
|
||||
parameter (debug=.false.)
|
||||
character name*20
|
||||
name='psi_extrct_dl'
|
||||
|
||||
call psb_erractionsave(err_act)
|
||||
|
||||
info = 0
|
||||
ictxt = desc_data(psb_ctxt_)
|
||||
|
||||
|
||||
call psb_info(ictxt,me,nprow)
|
||||
do i=0,np
|
||||
length_dl(i) = 0
|
||||
enddo
|
||||
i=1
|
||||
if (debug) write(0,*) 'extract: info ',info,
|
||||
+ desc_data(psb_dec_type_)
|
||||
pointer_dep_list=1
|
||||
c$$$ if (desc_data(psb_dec_type_).eq.psb_desc_bld_) then
|
||||
if (psb_is_bld_dec(desc_data(psb_dec_type_))) then
|
||||
do while (desc_str(i).ne.-1)
|
||||
if (debug) write(0,*) me,' extract: looping ',i,
|
||||
+ desc_str(i),desc_str(i+1),desc_str(i+2)
|
||||
|
||||
c ...with different decomposition type we have different
|
||||
c structure of indices lists............................
|
||||
if ((desc_str(i+1).ne.0).or.(desc_str(i+2).ne.0)) then
|
||||
c ..if number of element to be exchanged !=0
|
||||
proc=desc_str(i)
|
||||
if ((proc.lt.0).or.(proc.ge.nprow)) then
|
||||
if (debug) write(0,*) 'extract error ',i,desc_str(i)
|
||||
info = 9999
|
||||
int_err(1) = i
|
||||
int_err(2) = desc_str(i)
|
||||
goto 998
|
||||
endif
|
||||
! if((me.eq.1).and.(proc.eq.3))write(0,*)'found 3'
|
||||
if (mode.eq.1) then
|
||||
c ...search if already exist proc
|
||||
c in dep_list(*,me)...
|
||||
j=1
|
||||
do while ((j.lt.pointer_dep_list).and.
|
||||
+ (dep_list(j,me).ne.proc))
|
||||
j=j+1
|
||||
enddo
|
||||
|
||||
if (j.eq.pointer_dep_list) then
|
||||
c ...if not found.....
|
||||
dep_list(pointer_dep_list,me)=proc
|
||||
pointer_dep_list=pointer_dep_list+1
|
||||
endif
|
||||
else if (mode.eq.0) then
|
||||
if (pointer_dep_list.gt.dl_lda) then
|
||||
info = 4000
|
||||
goto 998
|
||||
endif
|
||||
dep_list(pointer_dep_list,me)=proc
|
||||
pointer_dep_list=pointer_dep_list+1
|
||||
endif
|
||||
endif
|
||||
i=i+desc_str(i+1)+2
|
||||
enddo
|
||||
c$$$ else if (desc_data(psb_dec_type_).eq.psb_desc_upd_) then
|
||||
else if (psb_is_upd_dec(desc_data(psb_dec_type_))) then
|
||||
do while (desc_str(i).ne.-1)
|
||||
if (debug) write(0,*) 'extract: looping ',i,desc_str(i)
|
||||
|
||||
c ...with different decomposition type we have different
|
||||
c structure of indices lists............................
|
||||
if (desc_str(i+1).ne.0) then
|
||||
|
||||
proc=desc_str(i)
|
||||
c ..if number of element to be exchanged !=0
|
||||
|
||||
if (mode.eq.1) then
|
||||
c ...search if already exist proc....
|
||||
j=1
|
||||
do while ((j.lt.pointer_dep_list).and.
|
||||
+ (dep_list(j,me).ne.proc))
|
||||
j=j+1
|
||||
enddo
|
||||
if (j.eq.pointer_dep_list) then
|
||||
c ...if not found.....
|
||||
if (pointer_dep_list.gt.dl_lda) then
|
||||
info = 4000
|
||||
goto 998
|
||||
endif
|
||||
dep_list(pointer_dep_list,me)=proc
|
||||
pointer_dep_list=pointer_dep_list+1
|
||||
endif
|
||||
else if (mode.eq.0) then
|
||||
if (pointer_dep_list.gt.dl_lda) then
|
||||
info = 4000
|
||||
goto 998
|
||||
endif
|
||||
dep_list(pointer_dep_list,me)=proc
|
||||
pointer_dep_list=pointer_dep_list+1
|
||||
endif
|
||||
endif
|
||||
i=i+desc_str(i+1)+2
|
||||
enddo
|
||||
else
|
||||
write(0,*) 'invalid dec_type',desc_data(psb_dec_type_)
|
||||
info = 2020
|
||||
goto 9999
|
||||
endif
|
||||
|
||||
length_dl(me)=pointer_dep_list-1
|
||||
|
||||
c ... check for errors...
|
||||
998 continue
|
||||
if (debug) write(0,*) 'extract: info ',info
|
||||
err = info
|
||||
|
||||
if (err.ne.0) goto 9999
|
||||
|
||||
call psb_sum(ictxt,length_dl(0:np))
|
||||
call psb_get_mpicomm(ictxt,icomm )
|
||||
allocate(itmp(dl_lda),stat=info)
|
||||
if (info /= 0) goto 9999
|
||||
itmp(1:dl_lda) = dep_list(1:dl_lda,me)
|
||||
call mpi_allgather(itmp,dl_lda,mpi_integer,
|
||||
+ dep_list,dl_lda,mpi_integer,icomm,info)
|
||||
deallocate(itmp)
|
||||
|
||||
call psb_erractionrestore(err_act)
|
||||
return
|
||||
|
||||
|
||||
9999 continue
|
||||
|
||||
call psb_errpush(info,name,i_err=int_err)
|
||||
call psb_erractionrestore(err_act)
|
||||
if (err_act.eq.psb_act_ret_) then
|
||||
return
|
||||
else
|
||||
call psb_error()
|
||||
endif
|
||||
return
|
||||
|
||||
end
|
||||
@@ -0,0 +1,276 @@
|
||||
!!$
|
||||
!!$ Parallel Sparse BLAS v2.0
|
||||
!!$ (C) Copyright 2006 Salvatore Filippone University of Rome Tor Vergata
|
||||
!!$ Alfredo Buttari University of Rome Tor Vergata
|
||||
!!$
|
||||
!!$ 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 PSBLAS 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 PSBLAS 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 psi_extract_dep_list(desc_data,desc_str,dep_list,&
|
||||
& length_dl,np,dl_lda,mode,info)
|
||||
|
||||
! internal routine
|
||||
! ================
|
||||
!
|
||||
! _____called by psi_crea_halo and psi_crea_ovrlap ______
|
||||
!
|
||||
! purpose
|
||||
! =======
|
||||
! process root (pid=0) extracts for each process "k" the ordered list of process
|
||||
! to which "k" must communicate. this list with its order is extracted from
|
||||
! desc_str list
|
||||
!
|
||||
!
|
||||
! input
|
||||
! =======
|
||||
! desc_data :integer array
|
||||
! explanation:
|
||||
! name explanation
|
||||
! ------------------ -------------------------------------------------------
|
||||
! desc_data array of integer that contains some local and global
|
||||
! information of matrix.
|
||||
!
|
||||
!
|
||||
! now we explain each of the above vectors.
|
||||
!
|
||||
! let a be a generic sparse matrix. we denote with matdata_a the matrix_data
|
||||
! array for matrix a.
|
||||
! data stored in matrix_data array are:
|
||||
!
|
||||
! notation stored in explanation
|
||||
! --------------- ---------------------- -------------------------------------
|
||||
! dec_type matdata_a[psb_dec_type_] decomposition type
|
||||
! m matdata_a[m_] total number of equations
|
||||
! n matdata_a[n_] total number of variables
|
||||
! n_row matdata_a[psb_n_row_] number of local equations
|
||||
! n_col matdata_a[psb_n_col_] number of local variables
|
||||
! psb_ctxt_a matdata_a[ctxt_] the blacs context handle, indicating
|
||||
! the global context of the operation
|
||||
! on the matrix.
|
||||
! the context itself is global.
|
||||
! desc_str integer array
|
||||
! explanation:
|
||||
! let desc_str_p be the array desc_str for local process.
|
||||
!! this is composed of variable dimension blocks for each process to
|
||||
! communicate to.
|
||||
! each block contain indexes of local halo elements to exchange with other
|
||||
! process.
|
||||
! let p be the pointer to the first element of a block in desc_str_p.
|
||||
! this block is stored in desc_str_p as :
|
||||
!
|
||||
! notation stored in explanation
|
||||
! --------------- --------------------------- -----------------------------------
|
||||
! process_id desc_str_p[p+psb_proc_id_] identifier of process which exchange
|
||||
! data with.
|
||||
! n_elements_recv desc_str_p[p+n_elem_recv_] number of elements to receive.
|
||||
! elements_recv desc_str_p[p+elem_recv_+i] indexes of local elements to
|
||||
! receive. these are stored in the
|
||||
! array from location p+elem_recv_ to
|
||||
! location p+elem_recv_+
|
||||
! desc_str_p[p+n_elem_recv_]-1.
|
||||
! if desc_data(psb_dec_type_) == 0
|
||||
! then also will be:
|
||||
! n_elements_send desc_str_p[p+n_elem_send_] number of elements to send.
|
||||
! elements_send desc_str_p[p+elem_send_+i] indexes of local elements to
|
||||
! send. these are stored in the
|
||||
! array from location p+elem_send_ to
|
||||
! location p+elem_send_+
|
||||
! desc_str_p[p+n_elem_send_]-1.
|
||||
! list is ended by -1 value
|
||||
!
|
||||
! np integer (global input)
|
||||
! number of grid process.
|
||||
!
|
||||
! mode integer (global input)
|
||||
! if mode =0 then will be inserted also duplicate element in
|
||||
! a same dependence list
|
||||
! if mode =1 then not will be inserted duplicate element in
|
||||
! a same dependence list
|
||||
! output
|
||||
! =====
|
||||
! only for root (pid=0) process:
|
||||
! dep_list integer array(dl_lda,0:np)
|
||||
! dependence list dep_list(*,i) is the list of process identifiers to which process i
|
||||
! must communicate with. this list with its order is extracted from
|
||||
! desc_str list.
|
||||
! length_dl integer array(0:np)
|
||||
! length_dl(i) is the length of dep_list(*,i) list
|
||||
use mpi
|
||||
use psb_penv_mod
|
||||
use psb_const_mod
|
||||
use psb_error_mod
|
||||
use psb_descriptor_type
|
||||
implicit none
|
||||
! ....scalar parameters...
|
||||
integer np,dl_lda,mode, info
|
||||
|
||||
! ....array parameters....
|
||||
integer :: desc_str(*),desc_data(*),dep_list(dl_lda,0:np),length_dl(0:np)
|
||||
integer, pointer :: itmp(:)
|
||||
! .....local arrays....
|
||||
integer int_err(5)
|
||||
double precision real_err(5)
|
||||
|
||||
! .....local scalars...
|
||||
integer i,nprow,npcol,me,mycol,pointer_dep_list,proc,j,err_act
|
||||
integer ictxt, err, icomm
|
||||
logical, parameter :: debug=.false.
|
||||
character name*20
|
||||
name='psi_extrct_dl'
|
||||
|
||||
call psb_erractionsave(err_act)
|
||||
|
||||
info = 0
|
||||
ictxt = desc_data(psb_ctxt_)
|
||||
|
||||
|
||||
call psb_info(ictxt,me,nprow)
|
||||
do i=0,np
|
||||
length_dl(i) = 0
|
||||
enddo
|
||||
i=1
|
||||
if (debug) write(0,*) 'extract: info ',info,desc_data(psb_dec_type_)
|
||||
pointer_dep_list=1
|
||||
if (psb_is_bld_dec(desc_data(psb_dec_type_))) then
|
||||
do while (desc_str(i) /= -1)
|
||||
if (debug) write(0,*) me,' extract: looping ',i,&
|
||||
& desc_str(i),desc_str(i+1),desc_str(i+2)
|
||||
|
||||
! ...with different decomposition type we have different
|
||||
! structure of indices lists............................
|
||||
if ((desc_str(i+1) /= 0).or.(desc_str(i+2) /= 0)) then
|
||||
! ..if number of element to be exchanged !=0
|
||||
proc=desc_str(i)
|
||||
if ((proc < 0).or.(proc.ge.nprow)) then
|
||||
if (debug) write(0,*) 'extract error ',i,desc_str(i)
|
||||
info = 9999
|
||||
int_err(1) = i
|
||||
int_err(2) = desc_str(i)
|
||||
goto 998
|
||||
endif
|
||||
! if((me == 1).and.(proc == 3))write(0,*)'found 3'
|
||||
if (mode == 1) then
|
||||
! ...search if already exist proc
|
||||
! in dep_list(*,me)...
|
||||
j=1
|
||||
do while ((j < pointer_dep_list).and.&
|
||||
& (dep_list(j,me) /= proc))
|
||||
j=j+1
|
||||
enddo
|
||||
|
||||
if (j == pointer_dep_list) then
|
||||
! ...if not found.....
|
||||
dep_list(pointer_dep_list,me)=proc
|
||||
pointer_dep_list=pointer_dep_list+1
|
||||
endif
|
||||
else if (mode == 0) then
|
||||
if (pointer_dep_list.gt.dl_lda) then
|
||||
info = 4000
|
||||
goto 998
|
||||
endif
|
||||
dep_list(pointer_dep_list,me)=proc
|
||||
pointer_dep_list=pointer_dep_list+1
|
||||
endif
|
||||
endif
|
||||
i=i+desc_str(i+1)+2
|
||||
enddo
|
||||
else if (psb_is_upd_dec(desc_data(psb_dec_type_))) then
|
||||
do while (desc_str(i) /= -1)
|
||||
if (debug) write(0,*) 'extract: looping ',i,desc_str(i)
|
||||
|
||||
! ...with different decomposition type we have different
|
||||
! structure of indices lists............................
|
||||
if (desc_str(i+1) /= 0) then
|
||||
|
||||
proc=desc_str(i)
|
||||
! ..if number of element to be exchanged !=0
|
||||
|
||||
if (mode == 1) then
|
||||
! ...search if already exist proc....
|
||||
j=1
|
||||
do while ((j < pointer_dep_list).and.&
|
||||
& (dep_list(j,me) /= proc))
|
||||
j=j+1
|
||||
enddo
|
||||
if (j == pointer_dep_list) then
|
||||
! ...if not found.....
|
||||
if (pointer_dep_list.gt.dl_lda) then
|
||||
info = 4000
|
||||
goto 998
|
||||
endif
|
||||
dep_list(pointer_dep_list,me)=proc
|
||||
pointer_dep_list=pointer_dep_list+1
|
||||
endif
|
||||
else if (mode == 0) then
|
||||
if (pointer_dep_list.gt.dl_lda) then
|
||||
info = 4000
|
||||
goto 998
|
||||
endif
|
||||
dep_list(pointer_dep_list,me)=proc
|
||||
pointer_dep_list=pointer_dep_list+1
|
||||
endif
|
||||
endif
|
||||
i=i+desc_str(i+1)+2
|
||||
enddo
|
||||
else
|
||||
write(0,*) 'invalid dec_type',desc_data(psb_dec_type_)
|
||||
info = 2020
|
||||
goto 9999
|
||||
endif
|
||||
|
||||
length_dl(me)=pointer_dep_list-1
|
||||
|
||||
! ... check for errors...
|
||||
998 continue
|
||||
if (debug) write(0,*) 'extract: info ',info
|
||||
err = info
|
||||
|
||||
if (err /= 0) goto 9999
|
||||
|
||||
call psb_sum(ictxt,length_dl(0:np))
|
||||
call psb_get_mpicomm(ictxt,icomm )
|
||||
allocate(itmp(dl_lda),stat=info)
|
||||
if (info /= 0) goto 9999
|
||||
itmp(1:dl_lda) = dep_list(1:dl_lda,me)
|
||||
call mpi_allgather(itmp,dl_lda,mpi_integer,&
|
||||
& dep_list,dl_lda,mpi_integer,icomm,info)
|
||||
deallocate(itmp)
|
||||
|
||||
call psb_erractionrestore(err_act)
|
||||
return
|
||||
|
||||
|
||||
9999 continue
|
||||
|
||||
call psb_errpush(info,name,i_err=int_err)
|
||||
call psb_erractionrestore(err_act)
|
||||
if (err_act == psb_act_ret_) then
|
||||
return
|
||||
else
|
||||
call psb_error()
|
||||
endif
|
||||
return
|
||||
|
||||
end subroutine psi_extract_dep_list
|
||||
@@ -12,7 +12,7 @@ MODULES = psb_realloc_mod.o psb_string_mod.o psb_spmat_type.o \
|
||||
|
||||
LIBMOD=psb_base_mod$(.mod)
|
||||
MPFOBJS=psb_penv_mod.o
|
||||
OBJS = error.o psb_base_mod.o
|
||||
OBJS = error.o psb_base_mod.o $(EXTRA_COBJS)
|
||||
LIBDIR = ..
|
||||
INCDIRS = -I .
|
||||
|
||||
|
||||
@@ -23,15 +23,23 @@ subroutine psb_restore_coher(ictxt,isvch)
|
||||
end subroutine psb_restore_coher
|
||||
subroutine psb_get_mpicomm(ictxt,comm)
|
||||
integer :: ictxt, comm
|
||||
#if !defined(SERIAL_MPI)
|
||||
call blacs_get(ictxt,10,comm)
|
||||
#else
|
||||
comm = ictxt
|
||||
#endif
|
||||
end subroutine psb_get_mpicomm
|
||||
subroutine psb_get_rank(rank,ictxt,id)
|
||||
integer :: rank,ictxt, id
|
||||
integer :: blacs_pnum
|
||||
#if defined(SERIAL_MPI)
|
||||
rank = 0
|
||||
#else
|
||||
rank = blacs_pnum(ictxt,id,0)
|
||||
#endif
|
||||
end subroutine psb_get_rank
|
||||
|
||||
#ifdef ESSL_BLACS
|
||||
#if defined(ESSL_BLACS) || defined(SERIAL_MPI)
|
||||
!
|
||||
! Need these, as they are not in the ESSL implementation
|
||||
! of the BLACS.
|
||||
|
||||
@@ -101,7 +101,7 @@ subroutine FCpsb_get_errverbosity(v)
|
||||
|
||||
integer, intent(out) :: v
|
||||
|
||||
call psb_get_errverbosity(v)
|
||||
v = psb_get_errverbosity()
|
||||
|
||||
end subroutine FCpsb_get_errverbosity
|
||||
|
||||
|
||||
@@ -0,0 +1,134 @@
|
||||
#include <sys/time.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef Add_
|
||||
#define mpi_wtime mpi_wtime_
|
||||
#define mpi_send mpi_send_
|
||||
#define mpi_irecv mpi_irecv_
|
||||
#define mpi_wait mpi_wait_
|
||||
#define mpi_alltoall mpi_alltoall_
|
||||
#define mpi_alltoallv mpi_alltoallv_
|
||||
#define mpi_allgather mpi_allgather_
|
||||
#define mpi_allgatherv mpi_allgatherv_
|
||||
#endif
|
||||
#define mpi_integer 1
|
||||
#define mpi_double 3
|
||||
#define mpi_double_complex 5
|
||||
|
||||
double mpi_wtime()
|
||||
{
|
||||
struct timeval tt;
|
||||
struct timezone tz;
|
||||
double temp;
|
||||
if (gettimeofday(&tt,&tz) != 0) {
|
||||
fprintf(stderr,"Fatal error for gettimeofday ??? \n");
|
||||
temp=0.0;
|
||||
} else {
|
||||
temp = ((double)tt.tv_sec) + ((double)tt.tv_usec)*1.0e-6;
|
||||
}
|
||||
return(temp);
|
||||
}
|
||||
|
||||
|
||||
void mpi_wait()
|
||||
{
|
||||
return;
|
||||
}
|
||||
void mpi_send()
|
||||
{
|
||||
return;
|
||||
}
|
||||
void mpi_irecv()
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
void mpi_alltoall(void* sdb, int* sdc, int* sdt,
|
||||
void* rvb, int* rvc, int* rvt, int* comm, int* ierr)
|
||||
{
|
||||
int i,j,k;
|
||||
|
||||
if (*sdt == mpi_integer) {
|
||||
memcpy(rvb,sdb, (*sdc)*sizeof(int));
|
||||
}
|
||||
if (*sdt == mpi_double) {
|
||||
memcpy(rvb,sdb, (*sdc)*sizeof(double));
|
||||
}
|
||||
if (*sdt == mpi_double_complex) {
|
||||
memcpy(rvb,sdb, (*sdc)*2*sizeof(double));
|
||||
}
|
||||
*ierr = 0;
|
||||
}
|
||||
|
||||
void mpi_alltoallv(void* sdb, int* sdc, int* sdspl, int* sdt,
|
||||
void* rvb, int* rvc, int* rdspl, int* rvt, int* comm, int* ierr)
|
||||
{
|
||||
int i,j,k;
|
||||
|
||||
|
||||
if (*sdt == mpi_integer) {
|
||||
memcpy((rvb+rdspl[0]*sizeof(int)),
|
||||
(sdb+sdspl[0]*sizeof(int)),(*sdc)*sizeof(int));
|
||||
}
|
||||
if (*sdt == mpi_double) {
|
||||
memcpy((rvb+rdspl[0]*sizeof(double)),
|
||||
(sdb+sdspl[0]*sizeof(double)),(*sdc)*sizeof(double));
|
||||
}
|
||||
if (*sdt == mpi_double_complex) {
|
||||
memcpy((rvb+rdspl[0]*2*sizeof(double)),
|
||||
(sdb+sdspl[0]*2*sizeof(double)),(*sdc)*2*sizeof(double));
|
||||
}
|
||||
*ierr = 0;
|
||||
}
|
||||
|
||||
|
||||
void mpi_allgather(void* sdb, int* sdc, int* sdt,
|
||||
void* rvb, int* rvc, int* rvt, int* comm, int* ierr)
|
||||
{
|
||||
int i,j,k;
|
||||
|
||||
if (*sdt == mpi_integer) {
|
||||
memcpy(rvb,sdb, (*sdc)*sizeof(int));
|
||||
}
|
||||
if (*sdt == mpi_double) {
|
||||
memcpy(rvb,sdb, (*sdc)*sizeof(double));
|
||||
}
|
||||
if (*sdt == mpi_double_complex) {
|
||||
memcpy(rvb,sdb, (*sdc)*2*sizeof(double));
|
||||
}
|
||||
*ierr = 0;
|
||||
}
|
||||
|
||||
void mpi_allgatherv(void* sdb, int* sdc, int* sdt,
|
||||
void* rvb, int* rvc, int* rdspl,
|
||||
int* rvt, int* comm, int* ierr)
|
||||
{
|
||||
int i,j,k;
|
||||
|
||||
if (*sdt == mpi_integer) {
|
||||
memcpy(rvb,sdb, (*sdc)*sizeof(int));
|
||||
}
|
||||
if (*sdt == mpi_double) {
|
||||
memcpy(rvb,sdb, (*sdc)*sizeof(double));
|
||||
}
|
||||
if (*sdt == mpi_double_complex) {
|
||||
memcpy(rvb,sdb, (*sdc)*2*sizeof(double));
|
||||
}
|
||||
if (*sdt == mpi_integer) {
|
||||
memcpy((rvb+rdspl[0]*sizeof(int)),
|
||||
(sdb),(*sdc)*sizeof(int));
|
||||
}
|
||||
if (*sdt == mpi_double) {
|
||||
memcpy((rvb+rdspl[0]*sizeof(double)),
|
||||
(sdb),(*sdc)*sizeof(double));
|
||||
}
|
||||
if (*sdt == mpi_double_complex) {
|
||||
memcpy((rvb+rdspl[0]*2*sizeof(double)),
|
||||
(sdb),(*sdc)*2*sizeof(double));
|
||||
}
|
||||
|
||||
|
||||
*ierr = 0;
|
||||
}
|
||||
@@ -112,8 +112,10 @@ contains
|
||||
integer :: temp(2)
|
||||
integer, parameter :: ione=1
|
||||
! Cannot use psb_amx or otherwise we have a recursion in module usage
|
||||
#if !defined(SERIAL_MPI)
|
||||
call igamx2d(ictxt, 'A', ' ', ione, ione, err, ione,&
|
||||
&temp ,temp,-ione ,-ione,-ione)
|
||||
#endif
|
||||
end subroutine psb_errcomm
|
||||
|
||||
|
||||
@@ -127,10 +129,11 @@ contains
|
||||
|
||||
|
||||
! returns verbosity of the error message
|
||||
subroutine psb_get_errverbosity(v)
|
||||
integer, intent(out) :: v
|
||||
v=verbosity_level
|
||||
end subroutine psb_get_errverbosity
|
||||
function psb_get_errverbosity()
|
||||
integer :: psb_get_errverbosity
|
||||
|
||||
psb_get_errverbosity=verbosity_level
|
||||
end function psb_get_errverbosity
|
||||
|
||||
|
||||
|
||||
@@ -203,7 +206,6 @@ contains
|
||||
integer :: nprow, npcol, me, mypcol
|
||||
integer, parameter :: ione=1, izero=0
|
||||
|
||||
call blacs_gridinfo(ictxt, nprow, npcol, me, mypcol)
|
||||
|
||||
if(error_status.gt.0) then
|
||||
if(verbosity_level.gt.1) then
|
||||
@@ -214,7 +216,11 @@ contains
|
||||
call psb_errmsg(err_c, r_name, i_e_d, a_e_d,me)
|
||||
! write(0,'(50("="))')
|
||||
end do
|
||||
#if defined(SERIAL_MPI)
|
||||
stop
|
||||
#else
|
||||
call blacs_abort(ictxt,-1)
|
||||
#endif
|
||||
else
|
||||
|
||||
call psb_errpop(err_c, r_name, i_e_d, a_e_d)
|
||||
@@ -222,12 +228,20 @@ contains
|
||||
do while (error_stack%n_elems.gt.0)
|
||||
call psb_errpop(err_c, r_name, i_e_d, a_e_d)
|
||||
end do
|
||||
#if defined(SERIAL_MPI)
|
||||
stop
|
||||
#else
|
||||
call blacs_abort(ictxt,-1)
|
||||
#endif
|
||||
end if
|
||||
end if
|
||||
|
||||
if(error_status.gt.izero) then
|
||||
#if defined(SERIAL_MPI)
|
||||
stop
|
||||
#else
|
||||
call blacs_abort(ictxt,err_c)
|
||||
#endif
|
||||
end if
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -100,8 +100,10 @@ C
|
||||
DOUBLE PRECISION HIS( 2 )
|
||||
* ..
|
||||
* .. External Subroutines ..
|
||||
#if !defined(SERIAL_MPI)
|
||||
EXTERNAL BLACS_GRIDINFO, DGEBR2D, DGEBS2D,
|
||||
$ DGERV2D, DGESD2D
|
||||
#endif
|
||||
* ..
|
||||
* .. External Functions ..
|
||||
LOGICAL LSAME
|
||||
@@ -122,6 +124,8 @@ C
|
||||
TRDEST = RDEST0
|
||||
TCDEST = CDEST0
|
||||
END IF
|
||||
#if !defined(SERIAL_MPI)
|
||||
|
||||
*
|
||||
* Get grid parameters.
|
||||
*
|
||||
@@ -234,6 +238,7 @@ C
|
||||
$ TRDEST, TCDEST )
|
||||
END IF
|
||||
END IF
|
||||
#endif
|
||||
*
|
||||
RETURN
|
||||
*
|
||||
@@ -69,12 +69,18 @@ subroutine psb_cd_inloc(v, ictxt, desc_a, info)
|
||||
call psb_info(ictxt, me, np)
|
||||
if (debug) write(*,*) 'psb_cdall: ',np,me
|
||||
|
||||
|
||||
loc_row = size(v)
|
||||
m = loc_row
|
||||
call psb_sum(ictxt,m)
|
||||
|
||||
|
||||
if (.false.) then
|
||||
loc_row = size(v)
|
||||
m = loc_row
|
||||
call psb_sum(ictxt,m)
|
||||
else
|
||||
m = maxval(v)
|
||||
call psb_max(ictxt,m)
|
||||
end if
|
||||
|
||||
n = m
|
||||
|
||||
!... check m and n parameters....
|
||||
if (m < 1) then
|
||||
info = 10
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
! desc_a - type(<psb_desc_type>). The communication descriptor.
|
||||
! info - integer. Eventually returns an error code.
|
||||
subroutine psb_icdasb(desc_a,info,ext_hv)
|
||||
use mpi
|
||||
use psb_descriptor_type
|
||||
use psb_serial_mod
|
||||
use psb_const_mod
|
||||
@@ -44,8 +45,6 @@ subroutine psb_icdasb(desc_a,info,ext_hv)
|
||||
use psb_error_mod
|
||||
use psb_penv_mod
|
||||
implicit none
|
||||
|
||||
include 'mpif.h'
|
||||
!...Parameters....
|
||||
type(psb_desc_type), intent(inout) :: desc_a
|
||||
integer, intent(out) :: info
|
||||
|
||||
@@ -121,14 +121,14 @@ Subroutine psb_zsphalo(a,desc_a,blk,info,rwcnv,clcnv,outfmt)
|
||||
sdsz(:)=0
|
||||
rvsz(:)=0
|
||||
ipx = 1
|
||||
blk%k = a%k
|
||||
blk%m = 0
|
||||
brvindx(ipx) = 0
|
||||
bsdindx(ipx) = 0
|
||||
counter=1
|
||||
idx = 0
|
||||
idxs = 0
|
||||
idxr = 0
|
||||
blk%k = a%k
|
||||
blk%m = 0
|
||||
! For all rows in the halo descriptor, extract and send/receive.
|
||||
Do
|
||||
proc=desc_a%halo_index(counter)
|
||||
|
||||
@@ -52,7 +52,7 @@ subroutine psb_zbaseprc_aply(alpha,prec,x,beta,y,desc_data,trans,work,info)
|
||||
character ::diagl, diagu
|
||||
integer :: ictxt,np,me,i, isz, nrg, err_act
|
||||
real(kind(1.d0)) :: t1, t2, t3, t4, t5, t6, t7
|
||||
logical,parameter :: debug=.false., debugprt=.
|
||||
logical,parameter :: debug=.false., debugprt=.false.
|
||||
character(len=20) :: name, ch_err
|
||||
|
||||
interface psb_bjac_aply
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
10 Number of inputs
|
||||
young1r.mtx This (and others) from: http://math.nist.gov/MatrixMarket/ or
|
||||
lapl600x600.mtx young1r.mtx This (and others) from: http://math.nist.gov/MatrixMarket/ or
|
||||
NONE http://www.cise.ufl.edu/research/sparse/matrices/index.html
|
||||
BICGSTAB
|
||||
CSR
|
||||
@@ -7,6 +7,6 @@ CSR
|
||||
1 ISTOPC
|
||||
00800 ITMAX
|
||||
-1 ITRACE
|
||||
4 IPREC 0:NONE 1:DIAGSC 2:ILU 3: AS 4: RAS 5: ASH 6: RASH
|
||||
2 IPREC 0:NONE 1:DIAGSC 2:ILU
|
||||
1 ML
|
||||
1.d-6 EPS
|
||||
|
||||
Reference in New Issue
Block a user