psblas3-type-index:


			
			
				psblas3-type-indexed
			
			
		
Salvatore Filippone 13 years ago
commit dacc4e566d

@ -1,5 +1,65 @@
Changelog. A lot less detailed than usual, at least for past Changelog. A lot less detailed than usual, at least for past
history. history.
2012/06/08: Fix silly bug in GPS renumbering.
2012/05/25: Fixed docs for release 3.0
2012/05/21: Fix configure script to work around configure failure on Cray.
2012/04/30: Change descriptor's move_alloc and free to work on
uninitialized input.
2012/04/15: New LOCAL argument to geins/spins. New LIDX argument to CDALL
with VL to allow for user-specified local numbering.
2012/04/05: Default implementation of MV_TO_COO and MV_FROM_COO based on
CP.
2012/03/01: Make ISO_C_BINDING a prerequisite.
2012/02/21: Added experimental support for 8-bytes integers.
Refactored the problem generation methods and the pargen
sample programs.
2012/02/15: Fixed major perf problem with genblock.
2012/01/30: Reworked norms 1 and infty, added sparse mat norm1.
2012/01/10: Bunch of fixes and configury improvements from Cray FTN
2012/01/03: Split preconditioners into interface/implementation.
2011/11/27: Merged may routines from preprocessing project psblas-testpre.
2011/11/21: Added test for ISO_C_BINDING and AMD renumbering.
2011/11/19: Added the scratch option to the vect ASB routine.
2011/11/11: Makefile fixes allowing for parallel make.
2011/10/25: Major upgrade defining the encapsulated vector types,
providing further support for GPU.
2011/10/05: Split preconditioner modules to alleviate memory pressure
on the compiler, esp. XLF.
Fixed bug in glist map.
2011/08/01: MOLD methods and various fixes for NAG configry.
2011/07/25: Bunch of fixes for problems uncovered by Cray FTN.
2011/06/15: Changed get_local_rows and friends into methods.
2011/03/25: Added version identification constants.
2011/03/10: Added support for sparse dot products. Changed intent of X in
preconditioner apply to allow for GPU extensions.
2011/02/27: Reworked PRINT methods, for vectors as well.
2011/02/11: Changes to accommodate Cray compiler.
2011/01/07: Silly bugs in spgather MPI data types and in z_nubmm calling 2011/01/07: Silly bugs in spgather MPI data types and in z_nubmm calling
cnumbmm. Also, don't use allocate on assignment with GNU. cnumbmm. Also, don't use allocate on assignment with GNU.

@ -1,5 +1,5 @@
Parallel Sparse BLAS version 3.0 Parallel Sparse BLAS version 3.0
(C) Copyright 2010 (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
Salvatore Filippone University of Rome Tor Vergata Salvatore Filippone University of Rome Tor Vergata
Alfredo Buttari CNRS-IRIT, Toulouse Alfredo Buttari CNRS-IRIT, Toulouse

@ -34,7 +34,7 @@ clean:
cd prec && $(MAKE) clean cd prec && $(MAKE) clean
cd krylov && $(MAKE) clean cd krylov && $(MAKE) clean
cd util && $(MAKE) clean cd util && $(MAKE) clean
cd opt && $(MAKE) clean # cd opt && $(MAKE) clean
check: all check: all
make check -C test/serial make check -C test/serial

@ -1,8 +1,4 @@
This directory contains the PSBLAS library, version 3.0-pre-release. This directory contains the PSBLAS library, version 3.0.
WARNING: This is higly experimental, unstable, and almost undocumented.
Do not count on anything to remain unchanged by the time 3.0
really comes out.
This version requires a working Fortran 2003 compiler; we do not use This version requires a working Fortran 2003 compiler; we do not use
all of the language features (specifically, so far we did not employ all of the language features (specifically, so far we did not employ
@ -10,26 +6,21 @@ FINAL subroutines), but the features we use were sufficient in
identifying bugs in ALL compilers we tried (all the bugs have been identifying bugs in ALL compilers we tried (all the bugs have been
reported and mostly fixed by the respective vendors). reported and mostly fixed by the respective vendors).
Notes: This code is confirmed to work with the following compilers
(as well as newer versions):
NAGware 5.2 and subsequent;
XLF 13.1;
GNU 4.6.1;
Cray CCE 7.4.4;
All these are recognized by the configure script.
If you find it working with other compilers, please let us
know.
The Intel compiler up to version 12.1 fails.
The "undocumented" in the warning above refers to the The new internals have been completely overhauled, and in many cases
internals; the new internals have been completely overhauled, rewritten; they now enable a much better interfacing with user-defined
and in many cases rewritten; they now enable a much storage formats. If the user is only interested in the predefined
better interfacing with user-defined storage formats. If the formats, then the user's guide should be sufficient; what is somewhat
user is only interested in the predefined formats, then the lacking is documentation on how to add to the library, i.e. a
user's guide should be sufficient; what is lacking is developers' guide; stay tuned.
documentation on how to add to the library. This will come.
The architecture of the Fortran 2003 sparse BLAS is described in
S. Filippone, A. Buttari:
Object-Oriented Techniques for Sparse Matrix Computations in Fortran
2003,
ACM Trans. on Math. Software, vol. 38, No. 4, 2012.
Version 1.0 of the library was described in: Version 1.0 of the library was described in:
S. Filippone, M. Colajanni S. Filippone, M. Colajanni
@ -46,22 +37,24 @@ DOCUMENTATION
See docs/psblas-3.0.pdf; an HTML version of the same document is See docs/psblas-3.0.pdf; an HTML version of the same document is
available in docs/html. available in docs/html.
Please consult the sample programs, especially test/pargen/ppde.f90. Please consult the sample programs, especially
test/pargen/ppde[23]d.f90
OTHER SOFTWARE CREDITS OTHER SOFTWARE CREDITS
We include our modified implementation of some of the Sparker (serial We originally included a modified implementation of some of the
sparse BLAS) material, e.g. Jagged diagonal, plus a number of Sparker (serial sparse BLAS) material; this has been completely
extensions of our own design. The original file spblas.f can be rewritten, way beyond the intention(s) and responsibilities of the
downloaded from matisa.cc.rl.ac.uk; of course any bugs in our original developers.
implementation are our own to fix. The main reference for the serial The main reference for the serial sparse BLAS is:
sparse BLAS is:
Duff, I., Marrone, M., Radicati, G., and Vittoli, C. Duff, I., Marrone, M., Radicati, G., and Vittoli, C.
Level 3 basic linear algebra subprograms for sparse matrices: a user Level 3 basic linear algebra subprograms for sparse matrices: a user
level interface level interface
ACM Trans. Math. Softw., 23(3), 379-401, 1997. ACM Trans. Math. Softw., 23(3), 379-401, 1997.
INSTALLING INSTALLING
To compile and run our software you will need the following To compile and run our software you will need the following
@ -76,7 +69,10 @@ prerequisites (see also SERIAL below):
3. We have had good results with the METIS library, from 3. We have had good results with the METIS library, from
http://www-users.cs.umn.edu/~karypis/metis/metis/main.html http://www-users.cs.umn.edu/~karypis/metis/metis/main.html
This is optional; it is used in the util and test/fileread This is optional; it is used in the util and test/fileread
directories but only if you define the HAVE_METIS directive. directories but only if you specify --with-metis.
4. If you have the AMD package of Davis, Duff and Amestoy, you can
specify --with-amd (see ./configure --help for more details).
The configure script will generate a Make.inc file suitable for The configure script will generate a Make.inc file suitable for
building the library. building the library.
@ -105,6 +101,48 @@ If you specify --prefix=/path you can do make install and the
libraries will be installed under /path/lib, while the module files libraries will be installed under /path/lib, while the module files
will be installed under /path/include. will be installed under /path/include.
SERIAL
Configuring with --enable-serial will provide a fake MPI stub library
that enables running in pure serial mode; no MPI installation is
needed in this case (but note that the fake MPI stubs are only
guaranteed to cover what we use internally, it's not a complete
replacement).
EXPERIMENTAL
We have an experimental flag --long-integers that will enable having
8-byte integer data, allowing an index space larger than 2G; some
small cases have been tested but we do not offer full guarantee (yet).
COMPILER NOTES.
This code is confirmed to work with the following compilers (or
later versions thereof):
NAGware 5.2;
GNU 4.6.1;
Cray CCE 8.0.1;
They are all recognized by the configure script.
To make the script work with the Cray CCE environment, it is
recommended to use the following:
./configure FC=ftn F77=ftn CC=cc MPF90=ftn MPF77=ftn MPCC=cc
with both CCE and GNU lower-level compilers.
XLF 13.1 configures correctly, but then fails with ICEs (Internal
Compiler Error) at build time. We do not yet know whether XLF 14
compiles correctly.
For the GNU compilers 4.6.x we are aware of a number of memory management
issues that might surface in your applications; all of them (that
we're aware of) are solved in version 4.7.0.
The Intel compiler up to version 12.1 fails to compile, as of the last
version we got access to.
KNOWN ISSUES. KNOWN ISSUES.

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -50,7 +50,7 @@ subroutine psb_cgatherm(globx, locx, desc_a, info, iroot)
implicit none implicit none
complex(psb_spk_), intent(in) :: locx(:,:) complex(psb_spk_), intent(in) :: locx(:,:)
complex(psb_spk_), intent(out) :: globx(:,:) complex(psb_spk_), intent(out), allocatable :: globx(:,:)
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: iroot integer(psb_ipk_), intent(in), optional :: iroot
@ -100,15 +100,12 @@ subroutine psb_cgatherm(globx, locx, desc_a, info, iroot)
ilocx = 1 ilocx = 1
jlocx = 1 jlocx = 1
lda_globx = size(globx,1)
lda_locx = size(locx, 1)
m = desc_a%get_global_rows() m = desc_a%get_global_rows()
n = desc_a%get_global_cols() n = desc_a%get_global_cols()
lda_globx = m
lock=size(locx,2)-jlocx+1 lda_locx = size(locx, 1)
globk=size(globx,2)-jglobx+1 lock = size(locx,2)
maxk=min(lock,globk) maxk = lock
k = maxk k = maxk
call psb_bcast(ictxt,k,root=iiroot) call psb_bcast(ictxt,k,root=iiroot)
@ -131,12 +128,19 @@ subroutine psb_cgatherm(globx, locx, desc_a, info, iroot)
goto 9999 goto 9999
end if end if
call psb_realloc(m,k,globx,info)
if (info /= psb_success_) then
info=psb_err_alloc_dealloc_
call psb_errpush(info,name)
goto 9999
end if
globx(:,:)=czero globx(:,:)=czero
do j=1,k do j=1,k
do i=1,desc_a%get_local_rows() do i=1,desc_a%get_local_rows()
call psb_loc_to_glob(i,idx,desc_a,info) call psb_loc_to_glob(i,idx,desc_a,info)
globx(idx,jglobx+j-1) = locx(i,jlx+j-1) globx(idx,j) = locx(i,jlx+j-1)
end do end do
end do end do
@ -146,12 +150,12 @@ subroutine psb_cgatherm(globx, locx, desc_a, info, iroot)
if (me /= desc_a%ovrlap_elem(i,3)) then if (me /= desc_a%ovrlap_elem(i,3)) then
idx = desc_a%ovrlap_elem(i,1) idx = desc_a%ovrlap_elem(i,1)
call psb_loc_to_glob(idx,desc_a,info) call psb_loc_to_glob(idx,desc_a,info)
globx(idx,jglobx+j-1) = czero globx(idx,j) = czero
end if end if
end do end do
end do end do
call psb_sum(ictxt,globx(1:m,jglobx:jglobx+k-1),root=root) call psb_sum(ictxt,globx(1:m,1:k),root=root)
call psb_erractionrestore(err_act) call psb_erractionrestore(err_act)
return return
@ -174,7 +178,7 @@ end subroutine psb_cgatherm
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -223,7 +227,7 @@ subroutine psb_cgatherv(globx, locx, desc_a, info, iroot)
implicit none implicit none
complex(psb_spk_), intent(in) :: locx(:) complex(psb_spk_), intent(in) :: locx(:)
complex(psb_spk_), intent(out) :: globx(:) complex(psb_spk_), intent(out), allocatable :: globx(:)
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: iroot integer(psb_ipk_), intent(in), optional :: iroot
@ -268,12 +272,12 @@ subroutine psb_cgatherv(globx, locx, desc_a, info, iroot)
jlocx=1 jlocx=1
ilocx = 1 ilocx = 1
lda_globx = size(globx)
lda_locx = size(locx)
m = desc_a%get_global_rows() m = desc_a%get_global_rows()
n = desc_a%get_global_cols() n = desc_a%get_global_cols()
lda_globx = m
lda_locx = size(locx)
k = 1 k = 1
@ -295,6 +299,13 @@ subroutine psb_cgatherv(globx, locx, desc_a, info, iroot)
goto 9999 goto 9999
end if end if
call psb_realloc(m,globx,info)
if (info /= psb_success_) then
info=psb_err_alloc_dealloc_
call psb_errpush(info,name)
goto 9999
end if
globx(:)=czero globx(:)=czero
do i=1,desc_a%get_local_rows() do i=1,desc_a%get_local_rows()
@ -334,7 +345,7 @@ subroutine psb_cgather_vect(globx, locx, desc_a, info, iroot)
implicit none implicit none
type(psb_c_vect_type), intent(inout) :: locx type(psb_c_vect_type), intent(inout) :: locx
complex(psb_spk_), intent(out) :: globx(:) complex(psb_spk_), intent(out), allocatable :: globx(:)
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: iroot integer(psb_ipk_), intent(in), optional :: iroot
@ -379,11 +390,11 @@ subroutine psb_cgather_vect(globx, locx, desc_a, info, iroot)
jlocx=1 jlocx=1
ilocx = 1 ilocx = 1
lda_globx = size(globx)
lda_locx = locx%get_nrows()
m = desc_a%get_global_rows() m = desc_a%get_global_rows()
n = desc_a%get_global_cols() n = desc_a%get_global_cols()
lda_globx = m
lda_locx = locx%get_nrows()
k = 1 k = 1
@ -406,6 +417,13 @@ subroutine psb_cgather_vect(globx, locx, desc_a, info, iroot)
goto 9999 goto 9999
end if end if
call psb_realloc(m,globx,info)
if (info /= psb_success_) then
info=psb_err_alloc_dealloc_
call psb_errpush(info,name)
goto 9999
end if
globx(:) = czero globx(:) = czero
llocx = locx%get_vect() llocx = locx%get_vect()

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -223,7 +223,7 @@ end subroutine psb_chalom
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -204,7 +204,7 @@ subroutine psb_covrlm(x,desc_a,info,jx,ik,work,update,mode)
end subroutine psb_covrlm end subroutine psb_covrlm
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -242,7 +242,7 @@ end subroutine psb_covrlm
! x(:) - complex The local part of the dense vector. ! x(:) - complex The local part of the dense vector.
! desc_a - type(psb_desc_type). The communication descriptor. ! desc_a - type(psb_desc_type). The communication descriptor.
! info - integer. Return code. ! info - integer. Return code.
! work - real(optional). A work area. ! work - complex(optional). A work area.
! update - integer(optional). Type of update: ! update - integer(optional). Type of update:
! psb_none_ do nothing ! psb_none_ do nothing
! psb_sum_ sum of overlaps ! psb_sum_ sum of overlaps

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -235,7 +235,7 @@ end subroutine psb_cscatterm
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,8 +1,41 @@
!!$
!!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$
!!$ 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.
!!$
!!$
! File: psb_cspgather.f90
subroutine psb_csp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keeploc) subroutine psb_csp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keeploc)
use psb_descriptor_type use psb_descriptor_type
use psb_error_mod use psb_error_mod
use psb_mat_mod
use psb_penv_mod use psb_penv_mod
use psb_mat_mod
use psb_tools_mod
#ifdef MPI_MOD #ifdef MPI_MOD
use mpi use mpi
#endif #endif
@ -20,7 +53,7 @@ subroutine psb_csp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keep
type(psb_c_coo_sparse_mat) :: loc_coo, glob_coo type(psb_c_coo_sparse_mat) :: loc_coo, glob_coo
integer(psb_mpik_) :: ictxt,np,me, icomm, minfo integer(psb_mpik_) :: ictxt,np,me, icomm, minfo
integer(psb_ipk_) :: err_act, dupl_, nrg, ncg, nzg integer(psb_ipk_) :: err_act, dupl_, nrg, ncg, nzg
integer(psb_ipk_) :: ip, ndx,naggrm1,naggrp1, i, j, k integer(psb_ipk_) :: ip, ndx,naggrm1,naggrp1, i, j, k, nzl
logical :: keepnum_, keeploc_ logical :: keepnum_, keeploc_
integer(psb_mpik_), allocatable :: nzbr(:), idisp(:) integer(psb_mpik_), allocatable :: nzbr(:), idisp(:)
integer(psb_ipk_) :: ierr(5) integer(psb_ipk_) :: ierr(5)
@ -59,9 +92,18 @@ subroutine psb_csp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keep
call psb_errpush(info,name,i_err=ierr,a_err='integer') call psb_errpush(info,name,i_err=ierr,a_err='integer')
goto 9999 goto 9999
end if end if
if (keeploc_) then
call loca%cp_to(loc_coo)
else
call loca%mv_to(loc_coo) call loca%mv_to(loc_coo)
end if
nzl = loc_coo%get_nzeros()
call psb_loc_to_glob(loc_coo%ia(1:nzl),desc_a,info,iact='I')
call psb_loc_to_glob(loc_coo%ja(1:nzl),desc_a,info,iact='I')
nzbr(:) = 0 nzbr(:) = 0
nzbr(me+1) = loc_coo%get_nzeros() nzbr(me+1) = nzl
call psb_sum(ictxt,nzbr(1:np)) call psb_sum(ictxt,nzbr(1:np))
nzg = sum(nzbr) nzg = sum(nzbr)
if (info == psb_success_) call glob_coo%allocate(nrg,ncg,nzg) if (info == psb_success_) call glob_coo%allocate(nrg,ncg,nzg)
@ -86,11 +128,7 @@ subroutine psb_csp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keep
goto 9999 goto 9999
end if end if
if (keeploc_) then
call loca%mv_from(loc_coo)
else
call loc_coo%free() call loc_coo%free()
end if
call glob_coo%set_nzeros(nzg) call glob_coo%set_nzeros(nzg)
if (present(dupl)) call glob_coo%set_dupl(dupl) if (present(dupl)) call glob_coo%set_dupl(dupl)
call globa%mv_from(glob_coo) call globa%mv_from(glob_coo)

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -50,7 +50,7 @@ subroutine psb_dgatherm(globx, locx, desc_a, info, iroot)
implicit none implicit none
real(psb_dpk_), intent(in) :: locx(:,:) real(psb_dpk_), intent(in) :: locx(:,:)
real(psb_dpk_), intent(out) :: globx(:,:) real(psb_dpk_), intent(out), allocatable :: globx(:,:)
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: iroot integer(psb_ipk_), intent(in), optional :: iroot
@ -100,15 +100,12 @@ subroutine psb_dgatherm(globx, locx, desc_a, info, iroot)
ilocx = 1 ilocx = 1
jlocx = 1 jlocx = 1
lda_globx = size(globx,1)
lda_locx = size(locx, 1)
m = desc_a%get_global_rows() m = desc_a%get_global_rows()
n = desc_a%get_global_cols() n = desc_a%get_global_cols()
lda_globx = m
lock=size(locx,2)-jlocx+1 lda_locx = size(locx, 1)
globk=size(globx,2)-jglobx+1 lock = size(locx,2)
maxk=min(lock,globk) maxk = lock
k = maxk k = maxk
call psb_bcast(ictxt,k,root=iiroot) call psb_bcast(ictxt,k,root=iiroot)
@ -131,12 +128,19 @@ subroutine psb_dgatherm(globx, locx, desc_a, info, iroot)
goto 9999 goto 9999
end if end if
call psb_realloc(m,k,globx,info)
if (info /= psb_success_) then
info=psb_err_alloc_dealloc_
call psb_errpush(info,name)
goto 9999
end if
globx(:,:)=dzero globx(:,:)=dzero
do j=1,k do j=1,k
do i=1,desc_a%get_local_rows() do i=1,desc_a%get_local_rows()
call psb_loc_to_glob(i,idx,desc_a,info) call psb_loc_to_glob(i,idx,desc_a,info)
globx(idx,jglobx+j-1) = locx(i,jlx+j-1) globx(idx,j) = locx(i,jlx+j-1)
end do end do
end do end do
@ -146,12 +150,12 @@ subroutine psb_dgatherm(globx, locx, desc_a, info, iroot)
if (me /= desc_a%ovrlap_elem(i,3)) then if (me /= desc_a%ovrlap_elem(i,3)) then
idx = desc_a%ovrlap_elem(i,1) idx = desc_a%ovrlap_elem(i,1)
call psb_loc_to_glob(idx,desc_a,info) call psb_loc_to_glob(idx,desc_a,info)
globx(idx,jglobx+j-1) = dzero globx(idx,j) = dzero
end if end if
end do end do
end do end do
call psb_sum(ictxt,globx(1:m,jglobx:jglobx+k-1),root=root) call psb_sum(ictxt,globx(1:m,1:k),root=root)
call psb_erractionrestore(err_act) call psb_erractionrestore(err_act)
return return
@ -174,7 +178,7 @@ end subroutine psb_dgatherm
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -223,7 +227,7 @@ subroutine psb_dgatherv(globx, locx, desc_a, info, iroot)
implicit none implicit none
real(psb_dpk_), intent(in) :: locx(:) real(psb_dpk_), intent(in) :: locx(:)
real(psb_dpk_), intent(out) :: globx(:) real(psb_dpk_), intent(out), allocatable :: globx(:)
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: iroot integer(psb_ipk_), intent(in), optional :: iroot
@ -268,12 +272,12 @@ subroutine psb_dgatherv(globx, locx, desc_a, info, iroot)
jlocx=1 jlocx=1
ilocx = 1 ilocx = 1
lda_globx = size(globx)
lda_locx = size(locx)
m = desc_a%get_global_rows() m = desc_a%get_global_rows()
n = desc_a%get_global_cols() n = desc_a%get_global_cols()
lda_globx = m
lda_locx = size(locx)
k = 1 k = 1
@ -295,6 +299,13 @@ subroutine psb_dgatherv(globx, locx, desc_a, info, iroot)
goto 9999 goto 9999
end if end if
call psb_realloc(m,globx,info)
if (info /= psb_success_) then
info=psb_err_alloc_dealloc_
call psb_errpush(info,name)
goto 9999
end if
globx(:)=dzero globx(:)=dzero
do i=1,desc_a%get_local_rows() do i=1,desc_a%get_local_rows()
@ -334,7 +345,7 @@ subroutine psb_dgather_vect(globx, locx, desc_a, info, iroot)
implicit none implicit none
type(psb_d_vect_type), intent(inout) :: locx type(psb_d_vect_type), intent(inout) :: locx
real(psb_dpk_), intent(out) :: globx(:) real(psb_dpk_), intent(out), allocatable :: globx(:)
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: iroot integer(psb_ipk_), intent(in), optional :: iroot
@ -379,11 +390,11 @@ subroutine psb_dgather_vect(globx, locx, desc_a, info, iroot)
jlocx=1 jlocx=1
ilocx = 1 ilocx = 1
lda_globx = size(globx)
lda_locx = locx%get_nrows()
m = desc_a%get_global_rows() m = desc_a%get_global_rows()
n = desc_a%get_global_cols() n = desc_a%get_global_cols()
lda_globx = m
lda_locx = locx%get_nrows()
k = 1 k = 1
@ -406,6 +417,13 @@ subroutine psb_dgather_vect(globx, locx, desc_a, info, iroot)
goto 9999 goto 9999
end if end if
call psb_realloc(m,globx,info)
if (info /= psb_success_) then
info=psb_err_alloc_dealloc_
call psb_errpush(info,name)
goto 9999
end if
globx(:) = dzero globx(:) = dzero
llocx = locx%get_vect() llocx = locx%get_vect()

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -223,7 +223,7 @@ end subroutine psb_dhalom
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -204,7 +204,7 @@ subroutine psb_dovrlm(x,desc_a,info,jx,ik,work,update,mode)
end subroutine psb_dovrlm end subroutine psb_dovrlm
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -235,7 +235,7 @@ end subroutine psb_dscatterm
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,8 +1,41 @@
!!$
!!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$
!!$ 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.
!!$
!!$
! File: psb_dspgather.f90
subroutine psb_dsp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keeploc) subroutine psb_dsp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keeploc)
use psb_descriptor_type use psb_descriptor_type
use psb_error_mod use psb_error_mod
use psb_mat_mod
use psb_penv_mod use psb_penv_mod
use psb_mat_mod
use psb_tools_mod
#ifdef MPI_MOD #ifdef MPI_MOD
use mpi use mpi
#endif #endif
@ -20,7 +53,7 @@ subroutine psb_dsp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keep
type(psb_d_coo_sparse_mat) :: loc_coo, glob_coo type(psb_d_coo_sparse_mat) :: loc_coo, glob_coo
integer(psb_mpik_) :: ictxt,np,me, icomm, minfo integer(psb_mpik_) :: ictxt,np,me, icomm, minfo
integer(psb_ipk_) :: err_act, dupl_, nrg, ncg, nzg integer(psb_ipk_) :: err_act, dupl_, nrg, ncg, nzg
integer(psb_ipk_) :: ip, ndx,naggrm1,naggrp1, i, j, k integer(psb_ipk_) :: ip, ndx,naggrm1,naggrp1, i, j, k, nzl
logical :: keepnum_, keeploc_ logical :: keepnum_, keeploc_
integer(psb_mpik_), allocatable :: nzbr(:), idisp(:) integer(psb_mpik_), allocatable :: nzbr(:), idisp(:)
integer(psb_ipk_) :: ierr(5) integer(psb_ipk_) :: ierr(5)
@ -59,9 +92,18 @@ subroutine psb_dsp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keep
call psb_errpush(info,name,i_err=ierr,a_err='integer') call psb_errpush(info,name,i_err=ierr,a_err='integer')
goto 9999 goto 9999
end if end if
if (keeploc_) then
call loca%cp_to(loc_coo)
else
call loca%mv_to(loc_coo) call loca%mv_to(loc_coo)
end if
nzl = loc_coo%get_nzeros()
call psb_loc_to_glob(loc_coo%ia(1:nzl),desc_a,info,iact='I')
call psb_loc_to_glob(loc_coo%ja(1:nzl),desc_a,info,iact='I')
nzbr(:) = 0 nzbr(:) = 0
nzbr(me+1) = loc_coo%get_nzeros() nzbr(me+1) = nzl
call psb_sum(ictxt,nzbr(1:np)) call psb_sum(ictxt,nzbr(1:np))
nzg = sum(nzbr) nzg = sum(nzbr)
if (info == psb_success_) call glob_coo%allocate(nrg,ncg,nzg) if (info == psb_success_) call glob_coo%allocate(nrg,ncg,nzg)
@ -86,11 +128,7 @@ subroutine psb_dsp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keep
goto 9999 goto 9999
end if end if
if (keeploc_) then
call loca%mv_from(loc_coo)
else
call loc_coo%free() call loc_coo%free()
end if
call glob_coo%set_nzeros(nzg) call glob_coo%set_nzeros(nzg)
if (present(dupl)) call glob_coo%set_dupl(dupl) if (present(dupl)) call glob_coo%set_dupl(dupl)
call globa%mv_from(glob_coo) call globa%mv_from(glob_coo)

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -51,7 +51,7 @@ subroutine psb_igatherm(globx, locx, desc_a, info, iroot)
implicit none implicit none
integer(psb_ipk_), intent(in) :: locx(:,:) integer(psb_ipk_), intent(in) :: locx(:,:)
integer(psb_ipk_), intent(out) :: globx(:,:) integer(psb_ipk_), intent(out), allocatable :: globx(:,:)
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: iroot integer(psb_ipk_), intent(in), optional :: iroot
@ -100,15 +100,12 @@ subroutine psb_igatherm(globx, locx, desc_a, info, iroot)
ilocx = 1 ilocx = 1
jlocx = 1 jlocx = 1
lda_globx = size(globx,1)
lda_locx = size(locx, 1)
m = desc_a%get_global_rows() m = desc_a%get_global_rows()
n = desc_a%get_global_cols() n = desc_a%get_global_cols()
lda_globx = m
lock=size(locx,2)-jlocx+1 lda_locx = size(locx, 1)
globk=size(globx,2)-jglobx+1 lock = size(locx,2)
maxk=min(lock,globk) maxk = lock
k = maxk k = maxk
call psb_bcast(ictxt,k,root=iiroot) call psb_bcast(ictxt,k,root=iiroot)
@ -131,12 +128,19 @@ subroutine psb_igatherm(globx, locx, desc_a, info, iroot)
goto 9999 goto 9999
end if end if
globx(:,:)=0 call psb_realloc(m,k,globx,info)
if (info /= psb_success_) then
info=psb_err_alloc_dealloc_
call psb_errpush(info,name)
goto 9999
end if
globx(:,:)=izero
do j=1,k do j=1,k
do i=1,desc_a%get_local_rows() do i=1,desc_a%get_local_rows()
call psb_loc_to_glob(i,idx,desc_a,info) call psb_loc_to_glob(i,idx,desc_a,info)
globx(idx,jglobx+j-1) = locx(i,jlx+j-1) globx(idx,j) = locx(i,jlx+j-1)
end do end do
end do end do
@ -146,12 +150,12 @@ subroutine psb_igatherm(globx, locx, desc_a, info, iroot)
if (me /= desc_a%ovrlap_elem(i,3)) then if (me /= desc_a%ovrlap_elem(i,3)) then
idx = desc_a%ovrlap_elem(i,1) idx = desc_a%ovrlap_elem(i,1)
call psb_loc_to_glob(idx,desc_a,info) call psb_loc_to_glob(idx,desc_a,info)
globx(idx,jglobx+j-1) = izero globx(idx,j) = izero
end if end if
end do end do
end do end do
call psb_sum(ictxt,globx(1:m,jglobx:jglobx+k-1),root=root) call psb_sum(ictxt,globx(1:m,1:k),root=root)
call psb_erractionrestore(err_act) call psb_erractionrestore(err_act)
return return
@ -174,7 +178,7 @@ end subroutine psb_igatherm
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -222,7 +226,7 @@ subroutine psb_igatherv(globx, locx, desc_a, info, iroot)
implicit none implicit none
integer(psb_ipk_), intent(in) :: locx(:) integer(psb_ipk_), intent(in) :: locx(:)
integer(psb_ipk_), intent(out) :: globx(:) integer(psb_ipk_), intent(out), allocatable :: globx(:)
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: iroot integer(psb_ipk_), intent(in), optional :: iroot
@ -294,7 +298,7 @@ subroutine psb_igatherv(globx, locx, desc_a, info, iroot)
goto 9999 goto 9999
end if end if
globx(:)=0 globx(:)=izero
do i=1,desc_a%get_local_rows() do i=1,desc_a%get_local_rows()
call psb_loc_to_glob(i,idx,desc_a,info) call psb_loc_to_glob(i,idx,desc_a,info)
@ -325,3 +329,121 @@ subroutine psb_igatherv(globx, locx, desc_a, info, iroot)
return return
end subroutine psb_igatherv end subroutine psb_igatherv
subroutine psb_igather_vect(globx, locx, desc_a, info, iroot)
use psb_base_mod, psb_protect_name => psb_igather_vect
implicit none
type(psb_i_vect_type), intent(inout) :: locx
integer(psb_ipk_), intent(out), allocatable :: globx(:)
type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: iroot
! locals
integer(psb_mpik_) :: ictxt, np, me, root, iiroot, icomm, myrank, rootrank
integer(psb_ipk_) :: ierr(5), err_act, n, ilocx, iglobx, jlocx,&
& jglobx, lda_locx, lda_globx, m, k, jlx, ilx, i, idx
integer(psb_ipk_), allocatable :: llocx(:)
character(len=20) :: name, ch_err
name='psb_igatherv'
if(psb_get_errstatus() /= 0) return
info=psb_success_
call psb_erractionsave(err_act)
ictxt=desc_a%get_context()
! check on blacs grid
call psb_info(ictxt, me, np)
if (np == -1) then
info = psb_err_context_error_
call psb_errpush(info,name)
goto 9999
endif
if (present(iroot)) then
root = iroot
if((root < -1).or.(root > np)) then
info=psb_err_input_value_invalid_i_
ierr(1)=5; ierr(2)=root;
call psb_errpush(info,name,i_err=ierr)
goto 9999
end if
else
root = -1
end if
jglobx=1
iglobx = 1
jlocx=1
ilocx = 1
m = desc_a%get_global_rows()
n = desc_a%get_global_cols()
lda_globx = m
lda_locx = locx%get_nrows()
k = 1
! there should be a global check on k here!!!
call psb_chkglobvect(m,n,lda_globx,iglobx,jglobx,desc_a,info)
if (info == psb_success_) &
& call psb_chkvect(m,n,locx%get_nrows(),ilocx,jlocx,desc_a,info,ilx,jlx)
if(info /= psb_success_) then
info=psb_err_from_subroutine_
ch_err='psb_chk(glob)vect'
call psb_errpush(info,name,a_err=ch_err)
goto 9999
end if
if ((ilx /= 1).or.(iglobx /= 1)) then
info=psb_err_ix_n1_iy_n1_unsupported_
call psb_errpush(info,name)
goto 9999
end if
call psb_realloc(m,globx,info)
if (info /= psb_success_) then
info=psb_err_alloc_dealloc_
call psb_errpush(info,name)
goto 9999
end if
globx(:) = izero
llocx = locx%get_vect()
do i=1,desc_a%get_local_rows()
call psb_loc_to_glob(i,idx,desc_a,info)
globx(idx) = llocx(i)
end do
! adjust overlapped elements
do i=1, size(desc_a%ovrlap_elem,1)
if (me /= desc_a%ovrlap_elem(i,3)) then
idx = desc_a%ovrlap_elem(i,1)
call psb_loc_to_glob(idx,desc_a,info)
globx(idx) = izero
end if
end do
call psb_sum(ictxt,globx(1:m),root=root)
call psb_erractionrestore(err_act)
return
9999 continue
call psb_erractionrestore(err_act)
if (err_act == psb_act_abort_) then
call psb_error(ictxt)
return
end if
return
end subroutine psb_igather_vect

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -62,7 +62,7 @@ subroutine psb_ihalom(x,desc_a,info,alpha,jx,ik,work,tran,mode,data)
integer(psb_ipk_), intent(inout), target :: x(:,:) integer(psb_ipk_), intent(inout), target :: x(:,:)
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
real(psb_dpk_), intent(in), optional :: alpha integer(psb_ipk_), intent(in), optional :: alpha
integer(psb_ipk_), intent(inout), optional, target :: work(:) integer(psb_ipk_), intent(inout), optional, target :: work(:)
integer(psb_ipk_), intent(in), optional :: mode,jx,ik,data integer(psb_ipk_), intent(in), optional :: mode,jx,ik,data
character, intent(in), optional :: tran character, intent(in), optional :: tran
@ -227,7 +227,7 @@ end subroutine psb_ihalom
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -287,7 +287,7 @@ subroutine psb_ihalov(x,desc_a,info,alpha,work,tran,mode,data)
integer(psb_ipk_), intent(inout) :: x(:) integer(psb_ipk_), intent(inout) :: x(:)
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
real(psb_dpk_), intent(in), optional :: alpha integer(psb_ipk_), intent(in), optional :: alpha
integer(psb_ipk_), intent(inout), optional, target :: work(:) integer(psb_ipk_), intent(inout), optional, target :: work(:)
integer(psb_ipk_), intent(in), optional :: mode,data integer(psb_ipk_), intent(in), optional :: mode,data
character, intent(in), optional :: tran character, intent(in), optional :: tran
@ -427,3 +427,153 @@ end subroutine psb_ihalov
subroutine psb_ihalo_vect(x,desc_a,info,alpha,work,tran,mode,data)
use psb_base_mod, psb_protect_name => psb_ihalo_vect
use psi_mod
implicit none
type(psb_i_vect_type), intent(inout) :: x
type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: alpha
integer(psb_ipk_), target, optional, intent(inout) :: work(:)
integer(psb_ipk_), intent(in), optional :: mode,data
character, intent(in), optional :: tran
! locals
integer(psb_ipk_) :: ictxt, np, me,&
& err_act, m, n, iix, jjx, ix, ijx, nrow, imode,&
& err, liwork,data_
integer(psb_ipk_),pointer :: iwork(:)
character :: tran_
character(len=20) :: name, ch_err
logical :: aliw
name='psb_ihalov'
if(psb_get_errstatus() /= 0) return
info=psb_success_
call psb_erractionsave(err_act)
ictxt=desc_a%get_context()
! check on blacs grid
call psb_info(ictxt, me, np)
if (np == -1) then
info = psb_err_context_error_
call psb_errpush(info,name)
goto 9999
endif
if (.not.allocated(x%v)) then
info = psb_err_invalid_vect_state_
call psb_errpush(info,name)
goto 9999
endif
ix = 1
ijx = 1
m = desc_a%get_global_rows()
n = desc_a%get_global_cols()
nrow = desc_a%get_local_rows()
if (present(tran)) then
tran_ = psb_toupper(tran)
else
tran_ = 'N'
endif
if (present(data)) then
data_ = data
else
data_ = psb_comm_halo_
endif
if (present(mode)) then
imode = mode
else
imode = IOR(psb_swap_send_,psb_swap_recv_)
endif
! check vector correctness
call psb_chkvect(m,ione,x%get_nrows(),ix,ijx,desc_a,info,iix,jjx)
if(info /= psb_success_) then
info=psb_err_from_subroutine_
ch_err='psb_chkvect'
call psb_errpush(info,name,a_err=ch_err)
end if
if (iix /= 1) then
info=psb_err_ix_n1_iy_n1_unsupported_
call psb_errpush(info,name)
end if
err=info
call psb_errcomm(ictxt,err)
if(err /= 0) goto 9999
if(present(alpha)) then
if(alpha /= done) then
call x%scal(alpha)
end if
end if
liwork=nrow
if (present(work)) then
if(size(work) >= liwork) then
iwork => work
aliw=.false.
else
aliw=.true.
allocate(iwork(liwork),stat=info)
if(info /= psb_success_) then
info=psb_err_from_subroutine_
ch_err='psb_realloc'
call psb_errpush(info,name,a_err=ch_err)
goto 9999
end if
end if
else
aliw=.true.
allocate(iwork(liwork),stat=info)
if(info /= psb_success_) then
info=psb_err_from_subroutine_
ch_err='psb_realloc'
call psb_errpush(info,name,a_err=ch_err)
goto 9999
end if
end if
! exchange halo elements
if(tran_ == 'N') then
call psi_swapdata(imode,izero,x%v,&
& desc_a,iwork,info,data=data_)
else if((tran_ == 'T').or.(tran_ == 'C')) then
call psi_swaptran(imode,ione,x%v,&
& desc_a,iwork,info)
else
info = psb_err_internal_error_
call psb_errpush(info,name,a_err='invalid tran')
goto 9999
end if
if (info /= psb_success_) then
ch_err='PSI_swapdata'
call psb_errpush(psb_err_from_subroutine_,name,a_err=ch_err)
goto 9999
end if
if (aliw) deallocate(iwork)
nullify(iwork)
call psb_erractionrestore(err_act)
return
9999 continue
call psb_erractionrestore(err_act)
if (err_act == psb_act_abort_) then
call psb_error(ictxt)
return
end if
return
end subroutine psb_ihalo_vect

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -203,7 +203,7 @@ end subroutine psb_iovrlm
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -388,3 +388,133 @@ subroutine psb_iovrlv(x,desc_a,info,work,update,mode)
end if end if
return return
end subroutine psb_iovrlv end subroutine psb_iovrlv
subroutine psb_iovrl_vect(x,desc_a,info,work,update,mode)
use psb_base_mod, psb_protect_name => psb_iovrl_vect
use psi_mod
implicit none
type(psb_i_vect_type), intent(inout) :: x
type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), optional, target, intent(inout) :: work(:)
integer(psb_ipk_), intent(in), optional :: update,mode
! locals
integer(psb_ipk_) :: ictxt, np, me, &
& err_act, m, n, iix, jjx, ix, ijx, nrow, ncol, k, update_,&
& mode_, err, liwork,ldx
integer(psb_ipk_),pointer :: iwork(:)
logical :: do_swap
character(len=20) :: name, ch_err
logical :: aliw
name='psb_iovrlv'
if(psb_get_errstatus() /= 0) return
info=psb_success_
call psb_erractionsave(err_act)
ictxt=desc_a%get_context()
! check on blacs grid
call psb_info(ictxt, me, np)
if (np == -1) then
info = psb_err_context_error_
call psb_errpush(info,name)
goto 9999
endif
if (.not.allocated(x%v)) then
info = psb_err_invalid_vect_state_
call psb_errpush(info,name)
goto 9999
endif
ix = 1
ijx = 1
m = desc_a%get_global_rows()
n = desc_a%get_global_cols()
nrow = desc_a%get_local_rows()
ncol = desc_a%get_local_cols()
k = 1
if (present(update)) then
update_ = update
else
update_ = psb_avg_
endif
if (present(mode)) then
mode_ = mode
else
mode_ = IOR(psb_swap_send_,psb_swap_recv_)
endif
do_swap = (mode_ /= 0)
! check vector correctness
call psb_chkvect(m,ione,x%get_nrows(),ix,ijx,desc_a,info,iix,jjx)
if(info /= psb_success_) then
info=psb_err_from_subroutine_
ch_err='psb_chkvect'
call psb_errpush(info,name,a_err=ch_err)
end if
if (iix /= 1) then
info=psb_err_ix_n1_iy_n1_unsupported_
call psb_errpush(info,name)
end if
err=info
call psb_errcomm(ictxt,err)
if(err /= 0) goto 9999
! check for presence/size of a work area
liwork=ncol
if (present(work)) then
if(size(work) >= liwork) then
aliw=.false.
else
aliw=.true.
end if
else
aliw=.true.
end if
if (aliw) then
allocate(iwork(liwork),stat=info)
if(info /= psb_success_) then
info=psb_err_from_subroutine_
call psb_errpush(info,name,a_err='Allocate')
goto 9999
end if
else
iwork => work
end if
! exchange overlap elements
if (do_swap) then
call psi_swapdata(mode_,ione,x%v,&
& desc_a,iwork,info,data=psb_comm_ovr_)
end if
if (info == psb_success_) call psi_ovrl_upd(x%v,desc_a,update_,info)
if (info /= psb_success_) then
call psb_errpush(psb_err_from_subroutine_,name,a_err='Inner updates')
goto 9999
end if
if (aliw) deallocate(iwork)
nullify(iwork)
call psb_erractionrestore(err_act)
return
9999 continue
call psb_erractionrestore(err_act)
if (err_act == psb_act_abort_) then
call psb_error(ictxt)
return
end if
return
end subroutine psb_iovrl_vect

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -233,7 +233,7 @@ end subroutine psb_iscatterm
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -50,7 +50,7 @@ subroutine psb_sgatherm(globx, locx, desc_a, info, iroot)
implicit none implicit none
real(psb_spk_), intent(in) :: locx(:,:) real(psb_spk_), intent(in) :: locx(:,:)
real(psb_spk_), intent(out) :: globx(:,:) real(psb_spk_), intent(out), allocatable :: globx(:,:)
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: iroot integer(psb_ipk_), intent(in), optional :: iroot
@ -100,15 +100,12 @@ subroutine psb_sgatherm(globx, locx, desc_a, info, iroot)
ilocx = 1 ilocx = 1
jlocx = 1 jlocx = 1
lda_globx = size(globx,1)
lda_locx = size(locx, 1)
m = desc_a%get_global_rows() m = desc_a%get_global_rows()
n = desc_a%get_global_cols() n = desc_a%get_global_cols()
lda_globx = m
lock=size(locx,2)-jlocx+1 lda_locx = size(locx, 1)
globk=size(globx,2)-jglobx+1 lock = size(locx,2)
maxk=min(lock,globk) maxk = lock
k = maxk k = maxk
call psb_bcast(ictxt,k,root=iiroot) call psb_bcast(ictxt,k,root=iiroot)
@ -131,12 +128,19 @@ subroutine psb_sgatherm(globx, locx, desc_a, info, iroot)
goto 9999 goto 9999
end if end if
call psb_realloc(m,k,globx,info)
if (info /= psb_success_) then
info=psb_err_alloc_dealloc_
call psb_errpush(info,name)
goto 9999
end if
globx(:,:)=szero globx(:,:)=szero
do j=1,k do j=1,k
do i=1,desc_a%get_local_rows() do i=1,desc_a%get_local_rows()
call psb_loc_to_glob(i,idx,desc_a,info) call psb_loc_to_glob(i,idx,desc_a,info)
globx(idx,jglobx+j-1) = locx(i,jlx+j-1) globx(idx,j) = locx(i,jlx+j-1)
end do end do
end do end do
@ -146,12 +150,12 @@ subroutine psb_sgatherm(globx, locx, desc_a, info, iroot)
if (me /= desc_a%ovrlap_elem(i,3)) then if (me /= desc_a%ovrlap_elem(i,3)) then
idx = desc_a%ovrlap_elem(i,1) idx = desc_a%ovrlap_elem(i,1)
call psb_loc_to_glob(idx,desc_a,info) call psb_loc_to_glob(idx,desc_a,info)
globx(idx,jglobx+j-1) = szero globx(idx,j) = szero
end if end if
end do end do
end do end do
call psb_sum(ictxt,globx(1:m,jglobx:jglobx+k-1),root=root) call psb_sum(ictxt,globx(1:m,1:k),root=root)
call psb_erractionrestore(err_act) call psb_erractionrestore(err_act)
return return
@ -174,7 +178,7 @@ end subroutine psb_sgatherm
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -223,7 +227,7 @@ subroutine psb_sgatherv(globx, locx, desc_a, info, iroot)
implicit none implicit none
real(psb_spk_), intent(in) :: locx(:) real(psb_spk_), intent(in) :: locx(:)
real(psb_spk_), intent(out) :: globx(:) real(psb_spk_), intent(out), allocatable :: globx(:)
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: iroot integer(psb_ipk_), intent(in), optional :: iroot
@ -268,12 +272,12 @@ subroutine psb_sgatherv(globx, locx, desc_a, info, iroot)
jlocx=1 jlocx=1
ilocx = 1 ilocx = 1
lda_globx = size(globx)
lda_locx = size(locx)
m = desc_a%get_global_rows() m = desc_a%get_global_rows()
n = desc_a%get_global_cols() n = desc_a%get_global_cols()
lda_globx = m
lda_locx = size(locx)
k = 1 k = 1
@ -295,6 +299,13 @@ subroutine psb_sgatherv(globx, locx, desc_a, info, iroot)
goto 9999 goto 9999
end if end if
call psb_realloc(m,globx,info)
if (info /= psb_success_) then
info=psb_err_alloc_dealloc_
call psb_errpush(info,name)
goto 9999
end if
globx(:)=szero globx(:)=szero
do i=1,desc_a%get_local_rows() do i=1,desc_a%get_local_rows()
@ -334,7 +345,7 @@ subroutine psb_sgather_vect(globx, locx, desc_a, info, iroot)
implicit none implicit none
type(psb_s_vect_type), intent(inout) :: locx type(psb_s_vect_type), intent(inout) :: locx
real(psb_spk_), intent(out) :: globx(:) real(psb_spk_), intent(out), allocatable :: globx(:)
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: iroot integer(psb_ipk_), intent(in), optional :: iroot
@ -379,11 +390,11 @@ subroutine psb_sgather_vect(globx, locx, desc_a, info, iroot)
jlocx=1 jlocx=1
ilocx = 1 ilocx = 1
lda_globx = size(globx)
lda_locx = locx%get_nrows()
m = desc_a%get_global_rows() m = desc_a%get_global_rows()
n = desc_a%get_global_cols() n = desc_a%get_global_cols()
lda_globx = m
lda_locx = locx%get_nrows()
k = 1 k = 1
@ -406,6 +417,13 @@ subroutine psb_sgather_vect(globx, locx, desc_a, info, iroot)
goto 9999 goto 9999
end if end if
call psb_realloc(m,globx,info)
if (info /= psb_success_) then
info=psb_err_alloc_dealloc_
call psb_errpush(info,name)
goto 9999
end if
globx(:) = szero globx(:) = szero
llocx = locx%get_vect() llocx = locx%get_vect()

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -223,7 +223,7 @@ end subroutine psb_shalom
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -204,7 +204,7 @@ subroutine psb_sovrlm(x,desc_a,info,jx,ik,work,update,mode)
end subroutine psb_sovrlm end subroutine psb_sovrlm
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -235,7 +235,7 @@ end subroutine psb_sscatterm
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,8 +1,41 @@
!!$
!!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$
!!$ 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.
!!$
!!$
! File: psb_sspgather.f90
subroutine psb_ssp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keeploc) subroutine psb_ssp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keeploc)
use psb_descriptor_type use psb_descriptor_type
use psb_error_mod use psb_error_mod
use psb_mat_mod
use psb_penv_mod use psb_penv_mod
use psb_mat_mod
use psb_tools_mod
#ifdef MPI_MOD #ifdef MPI_MOD
use mpi use mpi
#endif #endif
@ -20,7 +53,7 @@ subroutine psb_ssp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keep
type(psb_s_coo_sparse_mat) :: loc_coo, glob_coo type(psb_s_coo_sparse_mat) :: loc_coo, glob_coo
integer(psb_mpik_) :: ictxt,np,me, icomm, minfo integer(psb_mpik_) :: ictxt,np,me, icomm, minfo
integer(psb_ipk_) :: err_act, dupl_, nrg, ncg, nzg integer(psb_ipk_) :: err_act, dupl_, nrg, ncg, nzg
integer(psb_ipk_) :: ip, ndx,naggrm1,naggrp1, i, j, k integer(psb_ipk_) :: ip, ndx,naggrm1,naggrp1, i, j, k, nzl
logical :: keepnum_, keeploc_ logical :: keepnum_, keeploc_
integer(psb_mpik_), allocatable :: nzbr(:), idisp(:) integer(psb_mpik_), allocatable :: nzbr(:), idisp(:)
integer(psb_ipk_) :: ierr(5) integer(psb_ipk_) :: ierr(5)
@ -59,9 +92,18 @@ subroutine psb_ssp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keep
call psb_errpush(info,name,i_err=ierr,a_err='integer') call psb_errpush(info,name,i_err=ierr,a_err='integer')
goto 9999 goto 9999
end if end if
if (keeploc_) then
call loca%cp_to(loc_coo)
else
call loca%mv_to(loc_coo) call loca%mv_to(loc_coo)
end if
nzl = loc_coo%get_nzeros()
call psb_loc_to_glob(loc_coo%ia(1:nzl),desc_a,info,iact='I')
call psb_loc_to_glob(loc_coo%ja(1:nzl),desc_a,info,iact='I')
nzbr(:) = 0 nzbr(:) = 0
nzbr(me+1) = loc_coo%get_nzeros() nzbr(me+1) = nzl
call psb_sum(ictxt,nzbr(1:np)) call psb_sum(ictxt,nzbr(1:np))
nzg = sum(nzbr) nzg = sum(nzbr)
if (info == psb_success_) call glob_coo%allocate(nrg,ncg,nzg) if (info == psb_success_) call glob_coo%allocate(nrg,ncg,nzg)
@ -86,11 +128,7 @@ subroutine psb_ssp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keep
goto 9999 goto 9999
end if end if
if (keeploc_) then
call loca%mv_from(loc_coo)
else
call loc_coo%free() call loc_coo%free()
end if
call glob_coo%set_nzeros(nzg) call glob_coo%set_nzeros(nzg)
if (present(dupl)) call glob_coo%set_dupl(dupl) if (present(dupl)) call glob_coo%set_dupl(dupl)
call globa%mv_from(glob_coo) call globa%mv_from(glob_coo)

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -50,7 +50,7 @@ subroutine psb_zgatherm(globx, locx, desc_a, info, iroot)
implicit none implicit none
complex(psb_dpk_), intent(in) :: locx(:,:) complex(psb_dpk_), intent(in) :: locx(:,:)
complex(psb_dpk_), intent(out) :: globx(:,:) complex(psb_dpk_), intent(out), allocatable :: globx(:,:)
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: iroot integer(psb_ipk_), intent(in), optional :: iroot
@ -100,15 +100,12 @@ subroutine psb_zgatherm(globx, locx, desc_a, info, iroot)
ilocx = 1 ilocx = 1
jlocx = 1 jlocx = 1
lda_globx = size(globx,1)
lda_locx = size(locx, 1)
m = desc_a%get_global_rows() m = desc_a%get_global_rows()
n = desc_a%get_global_cols() n = desc_a%get_global_cols()
lda_globx = m
lock=size(locx,2)-jlocx+1 lda_locx = size(locx, 1)
globk=size(globx,2)-jglobx+1 lock = size(locx,2)
maxk=min(lock,globk) maxk = lock
k = maxk k = maxk
call psb_bcast(ictxt,k,root=iiroot) call psb_bcast(ictxt,k,root=iiroot)
@ -131,12 +128,19 @@ subroutine psb_zgatherm(globx, locx, desc_a, info, iroot)
goto 9999 goto 9999
end if end if
call psb_realloc(m,k,globx,info)
if (info /= psb_success_) then
info=psb_err_alloc_dealloc_
call psb_errpush(info,name)
goto 9999
end if
globx(:,:)=zzero globx(:,:)=zzero
do j=1,k do j=1,k
do i=1,desc_a%get_local_rows() do i=1,desc_a%get_local_rows()
call psb_loc_to_glob(i,idx,desc_a,info) call psb_loc_to_glob(i,idx,desc_a,info)
globx(idx,jglobx+j-1) = locx(i,jlx+j-1) globx(idx,j) = locx(i,jlx+j-1)
end do end do
end do end do
@ -146,12 +150,12 @@ subroutine psb_zgatherm(globx, locx, desc_a, info, iroot)
if (me /= desc_a%ovrlap_elem(i,3)) then if (me /= desc_a%ovrlap_elem(i,3)) then
idx = desc_a%ovrlap_elem(i,1) idx = desc_a%ovrlap_elem(i,1)
call psb_loc_to_glob(idx,desc_a,info) call psb_loc_to_glob(idx,desc_a,info)
globx(idx,jglobx+j-1) = zzero globx(idx,j) = zzero
end if end if
end do end do
end do end do
call psb_sum(ictxt,globx(1:m,jglobx:jglobx+k-1),root=root) call psb_sum(ictxt,globx(1:m,1:k),root=root)
call psb_erractionrestore(err_act) call psb_erractionrestore(err_act)
return return
@ -174,7 +178,7 @@ end subroutine psb_zgatherm
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -223,7 +227,7 @@ subroutine psb_zgatherv(globx, locx, desc_a, info, iroot)
implicit none implicit none
complex(psb_dpk_), intent(in) :: locx(:) complex(psb_dpk_), intent(in) :: locx(:)
complex(psb_dpk_), intent(out) :: globx(:) complex(psb_dpk_), intent(out), allocatable :: globx(:)
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: iroot integer(psb_ipk_), intent(in), optional :: iroot
@ -268,12 +272,12 @@ subroutine psb_zgatherv(globx, locx, desc_a, info, iroot)
jlocx=1 jlocx=1
ilocx = 1 ilocx = 1
lda_globx = size(globx)
lda_locx = size(locx)
m = desc_a%get_global_rows() m = desc_a%get_global_rows()
n = desc_a%get_global_cols() n = desc_a%get_global_cols()
lda_globx = m
lda_locx = size(locx)
k = 1 k = 1
@ -295,6 +299,13 @@ subroutine psb_zgatherv(globx, locx, desc_a, info, iroot)
goto 9999 goto 9999
end if end if
call psb_realloc(m,globx,info)
if (info /= psb_success_) then
info=psb_err_alloc_dealloc_
call psb_errpush(info,name)
goto 9999
end if
globx(:)=zzero globx(:)=zzero
do i=1,desc_a%get_local_rows() do i=1,desc_a%get_local_rows()
@ -334,7 +345,7 @@ subroutine psb_zgather_vect(globx, locx, desc_a, info, iroot)
implicit none implicit none
type(psb_z_vect_type), intent(inout) :: locx type(psb_z_vect_type), intent(inout) :: locx
complex(psb_dpk_), intent(out) :: globx(:) complex(psb_dpk_), intent(out), allocatable :: globx(:)
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: iroot integer(psb_ipk_), intent(in), optional :: iroot
@ -379,11 +390,11 @@ subroutine psb_zgather_vect(globx, locx, desc_a, info, iroot)
jlocx=1 jlocx=1
ilocx = 1 ilocx = 1
lda_globx = size(globx)
lda_locx = locx%get_nrows()
m = desc_a%get_global_rows() m = desc_a%get_global_rows()
n = desc_a%get_global_cols() n = desc_a%get_global_cols()
lda_globx = m
lda_locx = locx%get_nrows()
k = 1 k = 1
@ -406,6 +417,13 @@ subroutine psb_zgather_vect(globx, locx, desc_a, info, iroot)
goto 9999 goto 9999
end if end if
call psb_realloc(m,globx,info)
if (info /= psb_success_) then
info=psb_err_alloc_dealloc_
call psb_errpush(info,name)
goto 9999
end if
globx(:) = zzero globx(:) = zzero
llocx = locx%get_vect() llocx = locx%get_vect()

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -223,7 +223,7 @@ end subroutine psb_zhalom
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -204,7 +204,7 @@ subroutine psb_zovrlm(x,desc_a,info,jx,ik,work,update,mode)
end subroutine psb_zovrlm end subroutine psb_zovrlm
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -242,7 +242,7 @@ end subroutine psb_zovrlm
! x(:) - complex The local part of the dense vector. ! x(:) - complex The local part of the dense vector.
! desc_a - type(psb_desc_type). The communication descriptor. ! desc_a - type(psb_desc_type). The communication descriptor.
! info - integer. Return code. ! info - integer. Return code.
! work - real(optional). A work area. ! work - complex(optional). A work area.
! update - integer(optional). Type of update: ! update - integer(optional). Type of update:
! psb_none_ do nothing ! psb_none_ do nothing
! psb_sum_ sum of overlaps ! psb_sum_ sum of overlaps

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -235,7 +235,7 @@ end subroutine psb_zscatterm
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,8 +1,41 @@
!!$
!!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$
!!$ 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.
!!$
!!$
! File: psb_zspgather.f90
subroutine psb_zsp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keeploc) subroutine psb_zsp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keeploc)
use psb_descriptor_type use psb_descriptor_type
use psb_error_mod use psb_error_mod
use psb_mat_mod
use psb_penv_mod use psb_penv_mod
use psb_mat_mod
use psb_tools_mod
#ifdef MPI_MOD #ifdef MPI_MOD
use mpi use mpi
#endif #endif
@ -20,7 +53,7 @@ subroutine psb_zsp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keep
type(psb_z_coo_sparse_mat) :: loc_coo, glob_coo type(psb_z_coo_sparse_mat) :: loc_coo, glob_coo
integer(psb_mpik_) :: ictxt,np,me, icomm, minfo integer(psb_mpik_) :: ictxt,np,me, icomm, minfo
integer(psb_ipk_) :: err_act, dupl_, nrg, ncg, nzg integer(psb_ipk_) :: err_act, dupl_, nrg, ncg, nzg
integer(psb_ipk_) :: ip, ndx,naggrm1,naggrp1, i, j, k integer(psb_ipk_) :: ip, ndx,naggrm1,naggrp1, i, j, k, nzl
logical :: keepnum_, keeploc_ logical :: keepnum_, keeploc_
integer(psb_mpik_), allocatable :: nzbr(:), idisp(:) integer(psb_mpik_), allocatable :: nzbr(:), idisp(:)
integer(psb_ipk_) :: ierr(5) integer(psb_ipk_) :: ierr(5)
@ -59,9 +92,18 @@ subroutine psb_zsp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keep
call psb_errpush(info,name,i_err=ierr,a_err='integer') call psb_errpush(info,name,i_err=ierr,a_err='integer')
goto 9999 goto 9999
end if end if
if (keeploc_) then
call loca%cp_to(loc_coo)
else
call loca%mv_to(loc_coo) call loca%mv_to(loc_coo)
end if
nzl = loc_coo%get_nzeros()
call psb_loc_to_glob(loc_coo%ia(1:nzl),desc_a,info,iact='I')
call psb_loc_to_glob(loc_coo%ja(1:nzl),desc_a,info,iact='I')
nzbr(:) = 0 nzbr(:) = 0
nzbr(me+1) = loc_coo%get_nzeros() nzbr(me+1) = nzl
call psb_sum(ictxt,nzbr(1:np)) call psb_sum(ictxt,nzbr(1:np))
nzg = sum(nzbr) nzg = sum(nzbr)
if (info == psb_success_) call glob_coo%allocate(nrg,ncg,nzg) if (info == psb_success_) call glob_coo%allocate(nrg,ncg,nzg)
@ -86,11 +128,7 @@ subroutine psb_zsp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keep
goto 9999 goto 9999
end if end if
if (keeploc_) then
call loca%mv_from(loc_coo)
else
call loc_coo%free() call loc_coo%free()
end if
call glob_coo%set_nzeros(nzg) call glob_coo%set_nzeros(nzg)
if (present(dupl)) call glob_coo%set_dupl(dupl) if (present(dupl)) call glob_coo%set_dupl(dupl)
call globa%mv_from(glob_coo) call globa%mv_from(glob_coo)

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -100,7 +100,7 @@ subroutine psi_bld_tmphalo(desc,info)
helem(i) = n_row+i ! desc%loc_to_glob(n_row+i) helem(i) = n_row+i ! desc%loc_to_glob(n_row+i)
end do end do
call desc%indxmap%l2g(helem(1:nh),info) call desc%indxmap%l2gip(helem(1:nh),info)
call desc%indxmap%fnd_owner(helem(1:nh),hproc,info) call desc%indxmap%fnd_owner(helem(1:nh),hproc,info)
if (info /= psb_success_) then if (info /= psb_success_) then

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -1522,6 +1522,7 @@ subroutine psi_dswapidx_vect(iictxt,iicomm,flag,beta,y,idx,totxch,totsnd,totrcv,
return return
contains contains
subroutine receive_routine(v,recvtype,procSender,tag,communicator, rvhd,info) subroutine receive_routine(v,recvtype,procSender,tag,communicator, rvhd,info)
use iso_c_binding use iso_c_binding
real(c_double), intent(in), target :: v(*) real(c_double), intent(in), target :: v(*)

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
C C
C Parallel Sparse BLAS version 3.0 C Parallel Sparse BLAS version 3.0
C (C) Copyright 2006, 2007, 2008, 2009, 2010 C (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
C Salvatore Filippone University of Rome Tor Vergata C Salvatore Filippone University of Rome Tor Vergata
C Alfredo Buttari CNRS-IRIT, Toulouse C Alfredo Buttari CNRS-IRIT, Toulouse
C C

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -112,7 +112,7 @@ subroutine psi_idx_cnv1(nv,idxin,desc,info,mask,owned)
end if end if
endif endif
call desc%indxmap%g2l(idxin(1:nv),info,mask=mask,owned=owned) call desc%indxmap%g2lip(idxin(1:nv),info,mask=mask,owned=owned)
if (info /= 0) then if (info /= 0) then
call psb_errpush(psb_err_from_subroutine_,name,a_err='g2l') call psb_errpush(psb_err_from_subroutine_,name,a_err='g2l')
@ -136,7 +136,7 @@ subroutine psi_idx_cnv1(nv,idxin,desc,info,mask,owned)
end subroutine psi_idx_cnv1 end subroutine psi_idx_cnv1
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -260,7 +260,7 @@ subroutine psi_idx_cnv2(nv,idxin,idxout,desc,info,mask,owned)
end subroutine psi_idx_cnv2 end subroutine psi_idx_cnv2
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -48,7 +48,7 @@
! info - integer. return code. ! info - integer. return code.
! mask(:) - logical, optional Only do the conversion for specific indices. ! mask(:) - logical, optional Only do the conversion for specific indices.
! !
subroutine psi_idx_ins_cnv1(nv,idxin,desc,info,mask) subroutine psi_idx_ins_cnv1(nv,idxin,desc,info,mask,lidx)
use psi_mod, psb_protect_name => psi_idx_ins_cnv1 use psi_mod, psb_protect_name => psi_idx_ins_cnv1
use psb_descriptor_type use psb_descriptor_type
use psb_serial_mod use psb_serial_mod
@ -61,6 +61,7 @@ subroutine psi_idx_ins_cnv1(nv,idxin,desc,info,mask)
type(psb_desc_type), intent(inout) :: desc type(psb_desc_type), intent(inout) :: desc
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
logical, intent(in), optional :: mask(:) logical, intent(in), optional :: mask(:)
integer, intent(in), optional :: lidx(:)
integer(psb_ipk_) :: ictxt,mglob, nglob integer(psb_ipk_) :: ictxt,mglob, nglob
integer(psb_ipk_) :: np, me integer(psb_ipk_) :: np, me
integer(psb_ipk_) :: nrow,ncol, err_act integer(psb_ipk_) :: nrow,ncol, err_act
@ -82,7 +83,7 @@ subroutine psi_idx_ins_cnv1(nv,idxin,desc,info,mask)
call psb_info(ictxt, me, np) call psb_info(ictxt, me, np)
if ((.not.allocated(desc%indxmap)).or.& if ((.not.allocated(desc%indxmap)).or.&
& (.not.psb_is_bld_desc(desc))) then & (.not.desc%is_bld())) then
info = psb_err_invalid_cd_state_ info = psb_err_invalid_cd_state_
call psb_errpush(info,name) call psb_errpush(info,name)
goto 9999 goto 9999
@ -112,7 +113,7 @@ subroutine psi_idx_ins_cnv1(nv,idxin,desc,info,mask)
endif endif
call desc%indxmap%g2l_ins(idxin(1:nv),info,mask) call desc%indxmap%g2lip_ins(idxin(1:nv),info,mask=mask,lidx=lidx)
if (info /= 0) then if (info /= 0) then
call psb_errpush(psb_err_from_subroutine_,name,a_err='g2l_ins') call psb_errpush(psb_err_from_subroutine_,name,a_err='g2l_ins')
@ -137,7 +138,7 @@ subroutine psi_idx_ins_cnv1(nv,idxin,desc,info,mask)
end subroutine psi_idx_ins_cnv1 end subroutine psi_idx_ins_cnv1
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -184,7 +185,7 @@ end subroutine psi_idx_ins_cnv1
! info - integer. return code. ! info - integer. return code.
! mask(:) - logical, optional Only do the conversion for specific indices. ! mask(:) - logical, optional Only do the conversion for specific indices.
! !
subroutine psi_idx_ins_cnv2(nv,idxin,idxout,desc,info,mask) subroutine psi_idx_ins_cnv2(nv,idxin,idxout,desc,info,mask,lidx)
use psi_mod, psb_protect_name => psi_idx_ins_cnv2 use psi_mod, psb_protect_name => psi_idx_ins_cnv2
use psb_descriptor_type use psb_descriptor_type
use psb_serial_mod use psb_serial_mod
@ -197,6 +198,8 @@ subroutine psi_idx_ins_cnv2(nv,idxin,idxout,desc,info,mask)
type(psb_desc_type), intent(inout) :: desc type(psb_desc_type), intent(inout) :: desc
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
logical, intent(in), optional :: mask(:) logical, intent(in), optional :: mask(:)
integer, intent(in), optional :: lidx(:)
integer(psb_ipk_) :: i,ictxt,k,mglob, nglob integer(psb_ipk_) :: i,ictxt,k,mglob, nglob
integer(psb_ipk_) :: np, me, isize integer(psb_ipk_) :: np, me, isize
integer(psb_ipk_) :: pnt_halo,nrow,ncol, nh, ip, err_act,lip,nxt,lipf integer(psb_ipk_) :: pnt_halo,nrow,ncol, nh, ip, err_act,lip,nxt,lipf
@ -216,8 +219,9 @@ subroutine psi_idx_ins_cnv2(nv,idxin,idxout,desc,info,mask)
call psb_info(ictxt, me, np) call psb_info(ictxt, me, np)
if (.not.psb_is_ok_desc(desc)) then if ((.not.allocated(desc%indxmap)).or.&
info = psb_err_input_matrix_unassembled_ & (.not.desc%is_bld())) then
info = psb_err_invalid_cd_state_
call psb_errpush(info,name) call psb_errpush(info,name)
goto 9999 goto 9999
endif endif
@ -242,7 +246,7 @@ subroutine psi_idx_ins_cnv2(nv,idxin,idxout,desc,info,mask)
end if end if
idxout(1:nv) = idxin(1:nv) idxout(1:nv) = idxin(1:nv)
call psi_idx_ins_cnv(nv,idxout,desc,info,mask) call psi_idx_ins_cnv(nv,idxout,desc,info,mask=mask,lidx=lidx)
call psb_erractionrestore(err_act) call psb_erractionrestore(err_act)
return return
@ -261,7 +265,7 @@ subroutine psi_idx_ins_cnv2(nv,idxin,idxout,desc,info,mask)
end subroutine psi_idx_ins_cnv2 end subroutine psi_idx_ins_cnv2
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -307,7 +311,7 @@ end subroutine psi_idx_ins_cnv2
! info - integer. return code. ! info - integer. return code.
! mask - logical, optional Only do the conversion for specific indices. ! mask - logical, optional Only do the conversion for specific indices.
! !
subroutine psi_idx_ins_cnvs2(idxin,idxout,desc,info,mask) subroutine psi_idx_ins_cnvs2(idxin,idxout,desc,info,mask,lidx)
use psi_mod, psb_protect_name => psi_idx_ins_cnvs2 use psi_mod, psb_protect_name => psi_idx_ins_cnvs2
use psb_descriptor_type use psb_descriptor_type
integer(psb_ipk_), intent(in) :: idxin integer(psb_ipk_), intent(in) :: idxin
@ -315,7 +319,8 @@ subroutine psi_idx_ins_cnvs2(idxin,idxout,desc,info,mask)
type(psb_desc_type), intent(inout) :: desc type(psb_desc_type), intent(inout) :: desc
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
logical, intent(in), optional :: mask logical, intent(in), optional :: mask
integer(psb_ipk_) :: iout(1) integer, intent(in), optional :: lidx
integer(psb_ipk_) :: iout(1),lidxv(1)
logical :: mask_(1) logical :: mask_(1)
if (present(mask)) then if (present(mask)) then
@ -325,14 +330,19 @@ subroutine psi_idx_ins_cnvs2(idxin,idxout,desc,info,mask)
end if end if
iout(1) = idxin iout(1) = idxin
call psi_idx_ins_cnv(ione,iout,desc,info,mask_) if (present(lidx)) then
lidxv(1) = lidx
call psi_idx_ins_cnv(ione,iout,desc,info,mask=mask_,lidx=lidxv)
else
call psi_idx_ins_cnv(ione,iout,desc,info,mask=mask_)
end if
idxout = iout(1) idxout = iout(1)
return return
end subroutine psi_idx_ins_cnvs2 end subroutine psi_idx_ins_cnvs2
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -378,14 +388,15 @@ end subroutine psi_idx_ins_cnvs2
! info - integer. return code. ! info - integer. return code.
! mask - logical, optional Only do the conversion for specific indices. ! mask - logical, optional Only do the conversion for specific indices.
! !
subroutine psi_idx_ins_cnvs1(idxin,desc,info,mask) subroutine psi_idx_ins_cnvs1(idxin,desc,info,mask,lidx)
use psi_mod, psb_protect_name => psi_idx_ins_cnvs1 use psi_mod, psb_protect_name => psi_idx_ins_cnvs1
use psb_descriptor_type use psb_descriptor_type
integer(psb_ipk_), intent(inout) :: idxin integer(psb_ipk_), intent(inout) :: idxin
type(psb_desc_type), intent(inout) :: desc type(psb_desc_type), intent(inout) :: desc
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
logical, intent(in), optional :: mask logical, intent(in), optional :: mask
integer(psb_ipk_) :: iout(1) integer, intent(in), optional :: lidx
integer(psb_ipk_) :: iout(1),lidxv(1)
logical :: mask_(1) logical :: mask_(1)
if (present(mask)) then if (present(mask)) then
@ -395,7 +406,12 @@ subroutine psi_idx_ins_cnvs1(idxin,desc,info,mask)
end if end if
iout(1) = idxin iout(1) = idxin
if (present(lidx)) then
lidxv(1) = lidx
call psi_idx_ins_cnv(ione,iout,desc,info,mask=mask_,lidx=lidxv)
else
call psi_idx_ins_cnv(ione,iout,desc,info,mask_) call psi_idx_ins_cnv(ione,iout,desc,info,mask_)
end if
idxin = iout(1) idxin = iout(1)
return return

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -1014,440 +1014,440 @@ subroutine psi_iswapidxv(iictxt,iicomm,flag,beta,y,idx,totxch,totsnd,totrcv,work
return return
end subroutine psi_iswapidxv end subroutine psi_iswapidxv
!!$subroutine psi_iswapdata_vect(flag,beta,y,desc_a,work,info,data) subroutine psi_iswapdata_vect(flag,beta,y,desc_a,work,info,data)
!!$
!!$ use psi_mod, psb_protect_name => psi_iswapdata_vect use psi_mod, psb_protect_name => psi_iswapdata_vect
!!$ use psb_i_base_vect_mod use psb_i_base_vect_mod
!!$ use psb_error_mod use psb_error_mod
!!$ use psb_descriptor_type use psb_descriptor_type
!!$ use psb_penv_mod use psb_penv_mod
!!$#ifdef MPI_MOD #ifdef MPI_MOD
!!$ use mpi use mpi
!!$#endif #endif
!!$ implicit none implicit none
!!$#ifdef MPI_H #ifdef MPI_H
!!$ include 'mpif.h' include 'mpif.h'
!!$#endif #endif
!!$
!!$ integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(in) :: flag
!!$ integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
!!$ class(psb_i_base_vect_type) :: y class(psb_i_base_vect_type) :: y
!!$ integer(psb_ipk_) :: beta integer(psb_ipk_) :: beta
!!$ integer(psb_ipk_), target :: work(:) integer(psb_ipk_), target :: work(:)
!!$ type(psb_desc_type),target :: desc_a type(psb_desc_type),target :: desc_a
!!$ integer(psb_ipk_), optional :: data integer(psb_ipk_), optional :: data
!!$
!!$ ! locals ! locals
!!$ integer(psb_ipk_) :: ictxt, np, me, icomm, idxs, idxr, totxch, data_, err_act integer(psb_ipk_) :: ictxt, np, me, icomm, idxs, idxr, totxch, data_, err_act
!!$ integer(psb_ipk_), pointer :: d_idx(:) integer(psb_ipk_), pointer :: d_idx(:)
!!$ character(len=20) :: name character(len=20) :: name
!!$
!!$ info=psb_success_ info=psb_success_
!!$ name='psi_swap_datav' name='psi_swap_datav'
!!$ call psb_erractionsave(err_act) call psb_erractionsave(err_act)
!!$
!!$ ictxt=desc_a%get_context() ictxt=desc_a%get_context()
!!$ call psb_info(ictxt,me,np) call psb_info(ictxt,me,np)
!!$ if (np == -1) then if (np == -1) then
!!$ info=psb_err_context_error_ info=psb_err_context_error_
!!$ call psb_errpush(info,name) call psb_errpush(info,name)
!!$ goto 9999 goto 9999
!!$ endif endif
!!$
!!$ if (.not.psb_is_asb_desc(desc_a)) then if (.not.psb_is_asb_desc(desc_a)) then
!!$ info=psb_err_invalid_cd_state_ info=psb_err_invalid_cd_state_
!!$ call psb_errpush(info,name) call psb_errpush(info,name)
!!$ goto 9999 goto 9999
!!$ endif endif
!!$
!!$ icomm = desc_a%get_mpic() icomm = desc_a%get_mpic()
!!$
!!$ if(present(data)) then if(present(data)) then
!!$ data_ = data data_ = data
!!$ else else
!!$ data_ = psb_comm_halo_ data_ = psb_comm_halo_
!!$ end if end if
!!$
!!$ call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info)
!!$ if (info /= psb_success_) then if (info /= psb_success_) then
!!$ call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list')
!!$ goto 9999 goto 9999
!!$ end if end if
!!$
!!$ call psi_swapdata(ictxt,icomm,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) call psi_swapdata(ictxt,icomm,flag,beta,y,d_idx,totxch,idxs,idxr,work,info)
!!$ if (info /= psb_success_) goto 9999 if (info /= psb_success_) goto 9999
!!$
!!$ call psb_erractionrestore(err_act) call psb_erractionrestore(err_act)
!!$ return return
!!$
!!$9999 continue 9999 continue
!!$ call psb_erractionrestore(err_act) call psb_erractionrestore(err_act)
!!$ if (err_act == psb_act_abort_) then if (err_act == psb_act_abort_) then
!!$ call psb_error(ictxt) call psb_error(ictxt)
!!$ return return
!!$ end if end if
!!$ return return
!!$end subroutine psi_iswapdata_vect end subroutine psi_iswapdata_vect
!!$
!!$
!!$subroutine psi_iswapidx_vect(iictxt,iicomm,flag,beta,y,idx,totxch,totsnd,totrcv,work,info) subroutine psi_iswapidx_vect(iictxt,iicomm,flag,beta,y,idx,totxch,totsnd,totrcv,work,info)
!!$
!!$ use psi_mod, psb_protect_name => psi_iswapidx_vect use psi_mod, psb_protect_name => psi_iswapidx_vect
!!$ use psb_error_mod use psb_error_mod
!!$ use psb_descriptor_type use psb_descriptor_type
!!$ use psb_penv_mod use psb_penv_mod
!!$ use psb_i_base_vect_mod use psb_i_base_vect_mod
!!$#ifdef MPI_MOD #ifdef MPI_MOD
!!$ use mpi use mpi
!!$#endif #endif
!!$ implicit none implicit none
!!$#ifdef MPI_H #ifdef MPI_H
!!$ include 'mpif.h' include 'mpif.h'
!!$#endif #endif
!!$
!!$ integer(psb_ipk_), intent(in) :: iictxt,iicomm,flag integer(psb_ipk_), intent(in) :: iictxt,iicomm,flag
!!$ integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
!!$ class(psb_i_base_vect_type) :: y class(psb_i_base_vect_type) :: y
!!$ integer(psb_ipk_) :: beta integer(psb_ipk_) :: beta
!!$ integer(psb_ipk_), target :: work(:) integer(psb_ipk_), target :: work(:)
!!$ integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv
!!$
!!$ ! locals ! locals
!!$ integer(psb_mpik_) :: ictxt, icomm, np, me,& integer(psb_mpik_) :: ictxt, icomm, np, me,&
!!$ & proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret & proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret
!!$ integer(psb_mpik_), allocatable, dimension(:) :: bsdidx, brvidx,& integer(psb_mpik_), allocatable, dimension(:) :: bsdidx, brvidx,&
!!$ & sdsz, rvsz, prcid, rvhd, sdhd & sdsz, rvsz, prcid, rvhd, sdhd
!!$ integer(psb_ipk_) :: nesd, nerv,& integer(psb_ipk_) :: nesd, nerv,&
!!$ & err_act, i, idx_pt, totsnd_, totrcv_,& & err_act, i, idx_pt, totsnd_, totrcv_,&
!!$ & snd_pt, rcv_pt, pnti, n & snd_pt, rcv_pt, pnti, n
!!$ integer(psb_ipk_) :: ierr(5) integer(psb_ipk_) :: ierr(5)
!!$ logical :: swap_mpi, swap_sync, swap_send, swap_recv,& logical :: swap_mpi, swap_sync, swap_send, swap_recv,&
!!$ & albf,do_send,do_recv & albf,do_send,do_recv
!!$ logical, parameter :: usersend=.false. logical, parameter :: usersend=.false.
!!$
!!$ integer(psb_ipk_), pointer, dimension(:) :: sndbuf, rcvbuf integer(psb_ipk_), pointer, dimension(:) :: sndbuf, rcvbuf
!!$#ifdef HAVE_VOLATILE #ifdef HAVE_VOLATILE
!!$ volatile :: sndbuf, rcvbuf volatile :: sndbuf, rcvbuf
!!$#endif #endif
!!$ character(len=20) :: name character(len=20) :: name
!!$
!!$ info=psb_success_ info=psb_success_
!!$ name='psi_swap_datav' name='psi_swap_datav'
!!$ call psb_erractionsave(err_act) call psb_erractionsave(err_act)
!!$ ictxt = iictxt ictxt = iictxt
!!$ icomm = iicomm icomm = iicomm
!!$ call psb_info(ictxt,me,np) call psb_info(ictxt,me,np)
!!$ if (np == -1) then if (np == -1) then
!!$ info=psb_err_context_error_ info=psb_err_context_error_
!!$ call psb_errpush(info,name) call psb_errpush(info,name)
!!$ goto 9999 goto 9999
!!$ endif endif
!!$
!!$ n=1 n=1
!!$
!!$ swap_mpi = iand(flag,psb_swap_mpi_) /= 0 swap_mpi = iand(flag,psb_swap_mpi_) /= 0
!!$ swap_sync = iand(flag,psb_swap_sync_) /= 0 swap_sync = iand(flag,psb_swap_sync_) /= 0
!!$ swap_send = iand(flag,psb_swap_send_) /= 0 swap_send = iand(flag,psb_swap_send_) /= 0
!!$ swap_recv = iand(flag,psb_swap_recv_) /= 0 swap_recv = iand(flag,psb_swap_recv_) /= 0
!!$ do_send = swap_mpi .or. swap_sync .or. swap_send do_send = swap_mpi .or. swap_sync .or. swap_send
!!$ do_recv = swap_mpi .or. swap_sync .or. swap_recv do_recv = swap_mpi .or. swap_sync .or. swap_recv
!!$
!!$ totrcv_ = totrcv * n totrcv_ = totrcv * n
!!$ totsnd_ = totsnd * n totsnd_ = totsnd * n
!!$
!!$ if (swap_mpi) then if (swap_mpi) then
!!$ allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),&
!!$ & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),&
!!$ & stat=info) & stat=info)
!!$ if(info /= psb_success_) then if(info /= psb_success_) then
!!$ call psb_errpush(psb_err_alloc_dealloc_,name) call psb_errpush(psb_err_alloc_dealloc_,name)
!!$ goto 9999 goto 9999
!!$ end if end if
!!$
!!$ rvhd(:) = mpi_request_null rvhd(:) = mpi_request_null
!!$ sdsz(:) = 0 sdsz(:) = 0
!!$ rvsz(:) = 0 rvsz(:) = 0
!!$
!!$ ! prepare info for communications ! prepare info for communications
!!$
!!$ pnti = 1 pnti = 1
!!$ snd_pt = 1 snd_pt = 1
!!$ rcv_pt = 1 rcv_pt = 1
!!$ do i=1, totxch do i=1, totxch
!!$ proc_to_comm = idx(pnti+psb_proc_id_) proc_to_comm = idx(pnti+psb_proc_id_)
!!$ nerv = idx(pnti+psb_n_elem_recv_) nerv = idx(pnti+psb_n_elem_recv_)
!!$ nesd = idx(pnti+nerv+psb_n_elem_send_) nesd = idx(pnti+nerv+psb_n_elem_send_)
!!$ call psb_get_rank(prcid(proc_to_comm),ictxt,proc_to_comm) call psb_get_rank(prcid(proc_to_comm),ictxt,proc_to_comm)
!!$
!!$ brvidx(proc_to_comm) = rcv_pt brvidx(proc_to_comm) = rcv_pt
!!$ rvsz(proc_to_comm) = nerv rvsz(proc_to_comm) = nerv
!!$
!!$ bsdidx(proc_to_comm) = snd_pt bsdidx(proc_to_comm) = snd_pt
!!$ sdsz(proc_to_comm) = nesd sdsz(proc_to_comm) = nesd
!!$
!!$ rcv_pt = rcv_pt + nerv rcv_pt = rcv_pt + nerv
!!$ snd_pt = snd_pt + nesd snd_pt = snd_pt + nesd
!!$ pnti = pnti + nerv + nesd + 3 pnti = pnti + nerv + nesd + 3
!!$
!!$ end do end do
!!$
!!$ else else
!!$ allocate(rvhd(totxch),prcid(totxch),stat=info) allocate(rvhd(totxch),prcid(totxch),stat=info)
!!$ if(info /= psb_success_) then if(info /= psb_success_) then
!!$ call psb_errpush(psb_err_alloc_dealloc_,name) call psb_errpush(psb_err_alloc_dealloc_,name)
!!$ goto 9999 goto 9999
!!$ end if end if
!!$ end if end if
!!$
!!$
!!$ totrcv_ = max(totrcv_,1) totrcv_ = max(totrcv_,1)
!!$ totsnd_ = max(totsnd_,1) totsnd_ = max(totsnd_,1)
!!$ if((totrcv_+totsnd_) < size(work)) then if((totrcv_+totsnd_) < size(work)) then
!!$ sndbuf => work(1:totsnd_) sndbuf => work(1:totsnd_)
!!$ rcvbuf => work(totsnd_+1:totsnd_+totrcv_) rcvbuf => work(totsnd_+1:totsnd_+totrcv_)
!!$ albf=.false. albf=.false.
!!$ else else
!!$ allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info)
!!$ if(info /= psb_success_) then if(info /= psb_success_) then
!!$ call psb_errpush(psb_err_alloc_dealloc_,name) call psb_errpush(psb_err_alloc_dealloc_,name)
!!$ goto 9999 goto 9999
!!$ end if end if
!!$ albf=.true. albf=.true.
!!$ end if end if
!!$
!!$
!!$ if (do_send) then if (do_send) then
!!$
!!$ ! Pack send buffers ! Pack send buffers
!!$ pnti = 1 pnti = 1
!!$ snd_pt = 1 snd_pt = 1
!!$ do i=1, totxch do i=1, totxch
!!$ nerv = idx(pnti+psb_n_elem_recv_) nerv = idx(pnti+psb_n_elem_recv_)
!!$ nesd = idx(pnti+nerv+psb_n_elem_send_) nesd = idx(pnti+nerv+psb_n_elem_send_)
!!$ idx_pt = 1+pnti+nerv+psb_n_elem_send_ idx_pt = 1+pnti+nerv+psb_n_elem_send_
!!$ call y%gth(nesd,idx(idx_pt:idx_pt+nesd-1),& call y%gth(nesd,idx(idx_pt:idx_pt+nesd-1),&
!!$ & sndbuf(snd_pt:snd_pt+nesd-1)) & sndbuf(snd_pt:snd_pt+nesd-1))
!!$ snd_pt = snd_pt + nesd snd_pt = snd_pt + nesd
!!$ pnti = pnti + nerv + nesd + 3 pnti = pnti + nerv + nesd + 3
!!$ end do end do
!!$
!!$ end if end if
!!$
!!$ ! Case SWAP_MPI ! Case SWAP_MPI
!!$ if (swap_mpi) then if (swap_mpi) then
!!$
!!$ ! swap elements using mpi_alltoallv ! swap elements using mpi_alltoallv
!!$ call mpi_alltoallv(sndbuf,sdsz,bsdidx,& call mpi_alltoallv(sndbuf,sdsz,bsdidx,&
!!$ & psb_mpi_ipk_integer,rcvbuf,rvsz,& & psb_mpi_ipk_integer,rcvbuf,rvsz,&
!!$ & brvidx,psb_mpi_ipk_integer,icomm,iret) & brvidx,psb_mpi_ipk_integer,icomm,iret)
!!$ if(iret /= mpi_success) then if(iret /= mpi_success) then
!!$ ierr(1) = iret ierr(1) = iret
!!$ info=psb_err_mpi_error_ info=psb_err_mpi_error_
!!$ call psb_errpush(info,name,i_err=ierr) call psb_errpush(info,name,i_err=ierr)
!!$ goto 9999 goto 9999
!!$ end if end if
!!$
!!$ else if (swap_sync) then else if (swap_sync) then
!!$
!!$ pnti = 1 pnti = 1
!!$ snd_pt = 1 snd_pt = 1
!!$ rcv_pt = 1 rcv_pt = 1
!!$ do i=1, totxch do i=1, totxch
!!$ proc_to_comm = idx(pnti+psb_proc_id_) proc_to_comm = idx(pnti+psb_proc_id_)
!!$ nerv = idx(pnti+psb_n_elem_recv_) nerv = idx(pnti+psb_n_elem_recv_)
!!$ nesd = idx(pnti+nerv+psb_n_elem_send_) nesd = idx(pnti+nerv+psb_n_elem_send_)
!!$
!!$ if (proc_to_comm < me) then if (proc_to_comm < me) then
!!$ if (nesd>0) call psb_snd(ictxt,& if (nesd>0) call psb_snd(ictxt,&
!!$ & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm)
!!$ if (nerv>0) call psb_rcv(ictxt,& if (nerv>0) call psb_rcv(ictxt,&
!!$ & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm)
!!$ else if (proc_to_comm > me) then else if (proc_to_comm > me) then
!!$ if (nerv>0) call psb_rcv(ictxt,& if (nerv>0) call psb_rcv(ictxt,&
!!$ & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm)
!!$ if (nesd>0) call psb_snd(ictxt,& if (nesd>0) call psb_snd(ictxt,&
!!$ & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm)
!!$ else if (proc_to_comm == me) then else if (proc_to_comm == me) then
!!$ if (nesd /= nerv) then if (nesd /= nerv) then
!!$ write(psb_err_unit,*) & write(psb_err_unit,*) &
!!$ & 'Fatal error in swapdata: mismatch on self send',& & 'Fatal error in swapdata: mismatch on self send',&
!!$ & nerv,nesd & nerv,nesd
!!$ end if end if
!!$ rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1)
!!$ end if end if
!!$ rcv_pt = rcv_pt + nerv rcv_pt = rcv_pt + nerv
!!$ snd_pt = snd_pt + nesd snd_pt = snd_pt + nesd
!!$ pnti = pnti + nerv + nesd + 3 pnti = pnti + nerv + nesd + 3
!!$ end do end do
!!$
!!$
!!$ else if (swap_send .and. swap_recv) then else if (swap_send .and. swap_recv) then
!!$
!!$ ! First I post all the non blocking receives ! First I post all the non blocking receives
!!$ pnti = 1 pnti = 1
!!$ snd_pt = 1 snd_pt = 1
!!$ rcv_pt = 1 rcv_pt = 1
!!$ do i=1, totxch do i=1, totxch
!!$ proc_to_comm = idx(pnti+psb_proc_id_) proc_to_comm = idx(pnti+psb_proc_id_)
!!$ nerv = idx(pnti+psb_n_elem_recv_) nerv = idx(pnti+psb_n_elem_recv_)
!!$ nesd = idx(pnti+nerv+psb_n_elem_send_) nesd = idx(pnti+nerv+psb_n_elem_send_)
!!$
!!$ call psb_get_rank(prcid(i),ictxt,proc_to_comm) call psb_get_rank(prcid(i),ictxt,proc_to_comm)
!!$ if ((nerv>0).and.(proc_to_comm /= me)) then if ((nerv>0).and.(proc_to_comm /= me)) then
!!$ p2ptag = psb_int_swap_tag p2ptag = psb_int_swap_tag
!!$ call mpi_irecv(rcvbuf(rcv_pt),nerv,& call mpi_irecv(rcvbuf(rcv_pt),nerv,&
!!$ & psb_mpi_ipk_integer,prcid(i),& & psb_mpi_ipk_integer,prcid(i),&
!!$ & p2ptag, icomm,rvhd(i),iret) & p2ptag, icomm,rvhd(i),iret)
!!$ end if end if
!!$ rcv_pt = rcv_pt + nerv rcv_pt = rcv_pt + nerv
!!$ snd_pt = snd_pt + nesd snd_pt = snd_pt + nesd
!!$ pnti = pnti + nerv + nesd + 3 pnti = pnti + nerv + nesd + 3
!!$ end do end do
!!$
!!$
!!$ ! Then I post all the blocking sends ! Then I post all the blocking sends
!!$ if (usersend) call mpi_barrier(icomm,iret) if (usersend) call mpi_barrier(icomm,iret)
!!$
!!$ pnti = 1 pnti = 1
!!$ snd_pt = 1 snd_pt = 1
!!$ rcv_pt = 1 rcv_pt = 1
!!$ do i=1, totxch do i=1, totxch
!!$ proc_to_comm = idx(pnti+psb_proc_id_) proc_to_comm = idx(pnti+psb_proc_id_)
!!$ nerv = idx(pnti+psb_n_elem_recv_) nerv = idx(pnti+psb_n_elem_recv_)
!!$ nesd = idx(pnti+nerv+psb_n_elem_send_) nesd = idx(pnti+nerv+psb_n_elem_send_)
!!$
!!$ p2ptag = psb_int_swap_tag p2ptag = psb_int_swap_tag
!!$
!!$ if ((nesd>0).and.(proc_to_comm /= me)) then if ((nesd>0).and.(proc_to_comm /= me)) then
!!$ if (usersend) then if (usersend) then
!!$ call mpi_rsend(sndbuf(snd_pt),nesd,& call mpi_rsend(sndbuf(snd_pt),nesd,&
!!$ & psb_mpi_ipk_integer,prcid(i),& & psb_mpi_ipk_integer,prcid(i),&
!!$ & p2ptag,icomm,iret) & p2ptag,icomm,iret)
!!$ else else
!!$ call mpi_send(sndbuf(snd_pt),nesd,& call mpi_send(sndbuf(snd_pt),nesd,&
!!$ & psb_mpi_ipk_integer,prcid(i),& & psb_mpi_ipk_integer,prcid(i),&
!!$ & p2ptag,icomm,iret) & p2ptag,icomm,iret)
!!$ end if end if
!!$
!!$ if(iret /= mpi_success) then if(iret /= mpi_success) then
!!$ ierr(1) = iret ierr(1) = iret
!!$ info=psb_err_mpi_error_ info=psb_err_mpi_error_
!!$ call psb_errpush(info,name,i_err=ierr) call psb_errpush(info,name,i_err=ierr)
!!$ goto 9999 goto 9999
!!$ end if end if
!!$ end if end if
!!$ rcv_pt = rcv_pt + nerv rcv_pt = rcv_pt + nerv
!!$ snd_pt = snd_pt + nesd snd_pt = snd_pt + nesd
!!$ pnti = pnti + nerv + nesd + 3 pnti = pnti + nerv + nesd + 3
!!$ end do end do
!!$
!!$
!!$ pnti = 1 pnti = 1
!!$ do i=1, totxch do i=1, totxch
!!$ proc_to_comm = idx(pnti+psb_proc_id_) proc_to_comm = idx(pnti+psb_proc_id_)
!!$ nerv = idx(pnti+psb_n_elem_recv_) nerv = idx(pnti+psb_n_elem_recv_)
!!$ nesd = idx(pnti+nerv+psb_n_elem_send_) nesd = idx(pnti+nerv+psb_n_elem_send_)
!!$
!!$ p2ptag = psb_int_swap_tag p2ptag = psb_int_swap_tag
!!$
!!$ if ((proc_to_comm /= me).and.(nerv>0)) then if ((proc_to_comm /= me).and.(nerv>0)) then
!!$ call mpi_wait(rvhd(i),p2pstat,iret) call mpi_wait(rvhd(i),p2pstat,iret)
!!$ if(iret /= mpi_success) then if(iret /= mpi_success) then
!!$ ierr(1) = iret ierr(1) = iret
!!$ info=psb_err_mpi_error_ info=psb_err_mpi_error_
!!$ call psb_errpush(info,name,i_err=ierr) call psb_errpush(info,name,i_err=ierr)
!!$ goto 9999 goto 9999
!!$ end if end if
!!$ else if (proc_to_comm == me) then else if (proc_to_comm == me) then
!!$ if (nesd /= nerv) then if (nesd /= nerv) then
!!$ write(psb_err_unit,*) & write(psb_err_unit,*) &
!!$ & 'Fatal error in swapdata: mismatch on self send',& & 'Fatal error in swapdata: mismatch on self send',&
!!$ & nerv,nesd & nerv,nesd
!!$ end if end if
!!$ rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1)
!!$ end if end if
!!$ pnti = pnti + nerv + nesd + 3 pnti = pnti + nerv + nesd + 3
!!$ end do end do
!!$
!!$
!!$ else if (swap_send) then else if (swap_send) then
!!$
!!$ pnti = 1 pnti = 1
!!$ snd_pt = 1 snd_pt = 1
!!$ rcv_pt = 1 rcv_pt = 1
!!$ do i=1, totxch do i=1, totxch
!!$ proc_to_comm = idx(pnti+psb_proc_id_) proc_to_comm = idx(pnti+psb_proc_id_)
!!$ nerv = idx(pnti+psb_n_elem_recv_) nerv = idx(pnti+psb_n_elem_recv_)
!!$ nesd = idx(pnti+nerv+psb_n_elem_send_) nesd = idx(pnti+nerv+psb_n_elem_send_)
!!$ if (nesd>0) call psb_snd(ictxt,& if (nesd>0) call psb_snd(ictxt,&
!!$ & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm)
!!$ rcv_pt = rcv_pt + nerv rcv_pt = rcv_pt + nerv
!!$ snd_pt = snd_pt + nesd snd_pt = snd_pt + nesd
!!$ pnti = pnti + nerv + nesd + 3 pnti = pnti + nerv + nesd + 3
!!$ end do end do
!!$
!!$ else if (swap_recv) then else if (swap_recv) then
!!$
!!$ pnti = 1 pnti = 1
!!$ snd_pt = 1 snd_pt = 1
!!$ rcv_pt = 1 rcv_pt = 1
!!$ do i=1, totxch do i=1, totxch
!!$ proc_to_comm = idx(pnti+psb_proc_id_) proc_to_comm = idx(pnti+psb_proc_id_)
!!$ nerv = idx(pnti+psb_n_elem_recv_) nerv = idx(pnti+psb_n_elem_recv_)
!!$ nesd = idx(pnti+nerv+psb_n_elem_send_) nesd = idx(pnti+nerv+psb_n_elem_send_)
!!$ if (nerv>0) call psb_rcv(ictxt,& if (nerv>0) call psb_rcv(ictxt,&
!!$ & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm)
!!$ rcv_pt = rcv_pt + nerv rcv_pt = rcv_pt + nerv
!!$ snd_pt = snd_pt + nesd snd_pt = snd_pt + nesd
!!$ pnti = pnti + nerv + nesd + 3 pnti = pnti + nerv + nesd + 3
!!$ end do end do
!!$
!!$ end if end if
!!$
!!$ if (do_recv) then if (do_recv) then
!!$
!!$ pnti = 1 pnti = 1
!!$ snd_pt = 1 snd_pt = 1
!!$ rcv_pt = 1 rcv_pt = 1
!!$ do i=1, totxch do i=1, totxch
!!$ proc_to_comm = idx(pnti+psb_proc_id_) proc_to_comm = idx(pnti+psb_proc_id_)
!!$ nerv = idx(pnti+psb_n_elem_recv_) nerv = idx(pnti+psb_n_elem_recv_)
!!$ nesd = idx(pnti+nerv+psb_n_elem_send_) nesd = idx(pnti+nerv+psb_n_elem_send_)
!!$ idx_pt = 1+pnti+psb_n_elem_recv_ idx_pt = 1+pnti+psb_n_elem_recv_
!!$ call y%sct(nerv,idx(idx_pt:idx_pt+nerv-1),& call y%sct(nerv,idx(idx_pt:idx_pt+nerv-1),&
!!$ & rcvbuf(rcv_pt:rcv_pt+nerv-1),beta) & rcvbuf(rcv_pt:rcv_pt+nerv-1),beta)
!!$ rcv_pt = rcv_pt + nerv rcv_pt = rcv_pt + nerv
!!$ snd_pt = snd_pt + nesd snd_pt = snd_pt + nesd
!!$ pnti = pnti + nerv + nesd + 3 pnti = pnti + nerv + nesd + 3
!!$ end do end do
!!$
!!$ end if end if
!!$
!!$ if (swap_mpi) then if (swap_mpi) then
!!$ deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,&
!!$ & stat=info) & stat=info)
!!$ else else
!!$ deallocate(rvhd,prcid,stat=info) deallocate(rvhd,prcid,stat=info)
!!$ end if end if
!!$ if(info /= psb_success_) then if(info /= psb_success_) then
!!$ call psb_errpush(psb_err_alloc_dealloc_,name) call psb_errpush(psb_err_alloc_dealloc_,name)
!!$ goto 9999 goto 9999
!!$ end if end if
!!$ if(albf) deallocate(sndbuf,rcvbuf,stat=info) if(albf) deallocate(sndbuf,rcvbuf,stat=info)
!!$ if(info /= psb_success_) then if(info /= psb_success_) then
!!$ call psb_errpush(psb_err_alloc_dealloc_,name) call psb_errpush(psb_err_alloc_dealloc_,name)
!!$ goto 9999 goto 9999
!!$ end if end if
!!$
!!$ call psb_erractionrestore(err_act) call psb_erractionrestore(err_act)
!!$ return return
!!$
!!$9999 continue 9999 continue
!!$ call psb_erractionrestore(err_act) call psb_erractionrestore(err_act)
!!$ if (err_act == psb_act_abort_) then if (err_act == psb_act_abort_) then
!!$ call psb_error(ictxt) call psb_error(ictxt)
!!$ return return
!!$ end if end if
!!$ return return
!!$end subroutine psi_iswapidx_vect end subroutine psi_iswapidx_vect
!!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -1041,453 +1041,453 @@ subroutine psi_itranidxv(iictxt,iicomm,flag,beta,y,idx,totxch,totsnd,totrcv,work
end subroutine psi_itranidxv end subroutine psi_itranidxv
!!$subroutine psi_iswaptran_vect(flag,beta,y,desc_a,work,info,data) subroutine psi_iswaptran_vect(flag,beta,y,desc_a,work,info,data)
!!$
!!$ use psi_mod, psb_protect_name => psi_iswaptran_vect use psi_mod, psb_protect_name => psi_iswaptran_vect
!!$ use psb_error_mod use psb_error_mod
!!$ use psb_descriptor_type use psb_descriptor_type
!!$ use psb_penv_mod use psb_penv_mod
!!$ use psb_i_base_vect_mod use psb_i_base_vect_mod
!!$#ifdef MPI_MOD #ifdef MPI_MOD
!!$ use mpi use mpi
!!$#endif #endif
!!$ implicit none implicit none
!!$#ifdef MPI_H #ifdef MPI_H
!!$ include 'mpif.h' include 'mpif.h'
!!$#endif #endif
!!$
!!$ integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(in) :: flag
!!$ integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
!!$ class(psb_i_base_vect_type) :: y class(psb_i_base_vect_type) :: y
!!$ integer(psb_ipk_) :: beta integer(psb_ipk_) :: beta
!!$ integer(psb_ipk_), target :: work(:) integer(psb_ipk_), target :: work(:)
!!$ type(psb_desc_type),target :: desc_a type(psb_desc_type),target :: desc_a
!!$ integer(psb_ipk_), optional :: data integer(psb_ipk_), optional :: data
!!$
!!$ ! locals ! locals
!!$ integer(psb_ipk_) :: ictxt, np, me, icomm, idxs, idxr, totxch, err_act, data_ integer(psb_ipk_) :: ictxt, np, me, icomm, idxs, idxr, totxch, err_act, data_
!!$ integer(psb_ipk_), pointer :: d_idx(:) integer(psb_ipk_), pointer :: d_idx(:)
!!$ integer(psb_ipk_) :: ierr(5) integer(psb_ipk_) :: ierr(5)
!!$ character(len=20) :: name character(len=20) :: name
!!$
!!$ info=psb_success_ info=psb_success_
!!$ name='psi_swap_tranv' name='psi_swap_tranv'
!!$ call psb_erractionsave(err_act) call psb_erractionsave(err_act)
!!$
!!$ ictxt = desc_a%get_context() ictxt = desc_a%get_context()
!!$ icomm = desc_a%get_mpic() icomm = desc_a%get_mpic()
!!$ call psb_info(ictxt,me,np) call psb_info(ictxt,me,np)
!!$ if (np == -1) then if (np == -1) then
!!$ info=psb_err_context_error_ info=psb_err_context_error_
!!$ call psb_errpush(info,name) call psb_errpush(info,name)
!!$ goto 9999 goto 9999
!!$ endif endif
!!$
!!$ if (.not.psb_is_asb_desc(desc_a)) then if (.not.psb_is_asb_desc(desc_a)) then
!!$ info=psb_err_invalid_cd_state_ info=psb_err_invalid_cd_state_
!!$ call psb_errpush(info,name) call psb_errpush(info,name)
!!$ goto 9999 goto 9999
!!$ endif endif
!!$
!!$ if (present(data)) then if (present(data)) then
!!$ data_ = data data_ = data
!!$ else else
!!$ data_ = psb_comm_halo_ data_ = psb_comm_halo_
!!$ end if end if
!!$
!!$ call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info)
!!$ if (info /= psb_success_) then if (info /= psb_success_) then
!!$ call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list')
!!$ goto 9999 goto 9999
!!$ end if end if
!!$
!!$ call psi_swaptran(ictxt,icomm,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) call psi_swaptran(ictxt,icomm,flag,beta,y,d_idx,totxch,idxs,idxr,work,info)
!!$ if (info /= psb_success_) goto 9999 if (info /= psb_success_) goto 9999
!!$
!!$ call psb_erractionrestore(err_act) call psb_erractionrestore(err_act)
!!$ return return
!!$
!!$9999 continue 9999 continue
!!$ call psb_erractionrestore(err_act) call psb_erractionrestore(err_act)
!!$ if (err_act == psb_act_abort_) then if (err_act == psb_act_abort_) then
!!$ call psb_error(ictxt) call psb_error(ictxt)
!!$ return return
!!$ end if end if
!!$ return return
!!$end subroutine psi_iswaptran_vect end subroutine psi_iswaptran_vect
!!$
!!$
!!$
!!$subroutine psi_itranidx_vect(iictxt,iicomm,flag,beta,y,idx,& subroutine psi_itranidx_vect(iictxt,iicomm,flag,beta,y,idx,&
!!$ & totxch,totsnd,totrcv,work,info) & totxch,totsnd,totrcv,work,info)
!!$
!!$ use psi_mod, psb_protect_name => psi_itranidx_vect use psi_mod, psb_protect_name => psi_itranidx_vect
!!$ use psb_error_mod use psb_error_mod
!!$ use psb_descriptor_type use psb_descriptor_type
!!$ use psb_penv_mod use psb_penv_mod
!!$ use psb_i_base_vect_mod use psb_i_base_vect_mod
!!$#ifdef MPI_MOD #ifdef MPI_MOD
!!$ use mpi use mpi
!!$#endif #endif
!!$ implicit none implicit none
!!$#ifdef MPI_H #ifdef MPI_H
!!$ include 'mpif.h' include 'mpif.h'
!!$#endif #endif
!!$
!!$ integer(psb_ipk_), intent(in) :: iictxt,iicomm,flag integer(psb_ipk_), intent(in) :: iictxt,iicomm,flag
!!$ integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
!!$ class(psb_i_base_vect_type) :: y class(psb_i_base_vect_type) :: y
!!$ integer(psb_ipk_) :: beta integer(psb_ipk_) :: beta
!!$ integer(psb_ipk_), target :: work(:) integer(psb_ipk_), target :: work(:)
!!$ integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv
!!$
!!$ ! locals ! locals
!!$ integer(psb_mpik_) :: ictxt, icomm, np, me,& integer(psb_mpik_) :: ictxt, icomm, np, me,&
!!$ & proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret & proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret
!!$ integer(psb_mpik_), allocatable, dimension(:) :: bsdidx, brvidx,& integer(psb_mpik_), allocatable, dimension(:) :: bsdidx, brvidx,&
!!$ & sdsz, rvsz, prcid, rvhd, sdhd & sdsz, rvsz, prcid, rvhd, sdhd
!!$ integer(psb_ipk_) :: nesd, nerv,& integer(psb_ipk_) :: nesd, nerv,&
!!$ & err_act, i, idx_pt, totsnd_, totrcv_,& & err_act, i, idx_pt, totsnd_, totrcv_,&
!!$ & snd_pt, rcv_pt, pnti, n & snd_pt, rcv_pt, pnti, n
!!$ integer(psb_ipk_) :: ierr(5) integer(psb_ipk_) :: ierr(5)
!!$ logical :: swap_mpi, swap_sync, swap_send, swap_recv,& logical :: swap_mpi, swap_sync, swap_send, swap_recv,&
!!$ & albf,do_send,do_recv & albf,do_send,do_recv
!!$ logical, parameter :: usersend=.false. logical, parameter :: usersend=.false.
!!$
!!$ integer(psb_ipk_), pointer, dimension(:) :: sndbuf, rcvbuf integer(psb_ipk_), pointer, dimension(:) :: sndbuf, rcvbuf
!!$#ifdef HAVE_VOLATILE #ifdef HAVE_VOLATILE
!!$ volatile :: sndbuf, rcvbuf volatile :: sndbuf, rcvbuf
!!$#endif #endif
!!$ character(len=20) :: name character(len=20) :: name
!!$
!!$ info=psb_success_ info=psb_success_
!!$ name='psi_swap_tran' name='psi_swap_tran'
!!$ call psb_erractionsave(err_act) call psb_erractionsave(err_act)
!!$ ictxt = iictxt ictxt = iictxt
!!$ icomm = iicomm icomm = iicomm
!!$
!!$ call psb_info(ictxt,me,np) call psb_info(ictxt,me,np)
!!$ if (np == -1) then if (np == -1) then
!!$ info=psb_err_context_error_ info=psb_err_context_error_
!!$ call psb_errpush(info,name) call psb_errpush(info,name)
!!$ goto 9999 goto 9999
!!$ endif endif
!!$
!!$ n=1 n=1
!!$ swap_mpi = iand(flag,psb_swap_mpi_) /= 0 swap_mpi = iand(flag,psb_swap_mpi_) /= 0
!!$ swap_sync = iand(flag,psb_swap_sync_) /= 0 swap_sync = iand(flag,psb_swap_sync_) /= 0
!!$ swap_send = iand(flag,psb_swap_send_) /= 0 swap_send = iand(flag,psb_swap_send_) /= 0
!!$ swap_recv = iand(flag,psb_swap_recv_) /= 0 swap_recv = iand(flag,psb_swap_recv_) /= 0
!!$ do_send = swap_mpi .or. swap_sync .or. swap_send do_send = swap_mpi .or. swap_sync .or. swap_send
!!$ do_recv = swap_mpi .or. swap_sync .or. swap_recv do_recv = swap_mpi .or. swap_sync .or. swap_recv
!!$
!!$ totrcv_ = totrcv * n totrcv_ = totrcv * n
!!$ totsnd_ = totsnd * n totsnd_ = totsnd * n
!!$
!!$ if (swap_mpi) then if (swap_mpi) then
!!$ allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),&
!!$ & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),&
!!$ & stat=info) & stat=info)
!!$ if(info /= psb_success_) then if(info /= psb_success_) then
!!$ call psb_errpush(psb_err_alloc_dealloc_,name) call psb_errpush(psb_err_alloc_dealloc_,name)
!!$ goto 9999 goto 9999
!!$ end if end if
!!$
!!$ rvhd(:) = mpi_request_null rvhd(:) = mpi_request_null
!!$ sdsz(:) = 0 sdsz(:) = 0
!!$ rvsz(:) = 0 rvsz(:) = 0
!!$
!!$ ! prepare info for communications ! prepare info for communications
!!$
!!$
!!$ pnti = 1 pnti = 1
!!$ snd_pt = 1 snd_pt = 1
!!$ rcv_pt = 1 rcv_pt = 1
!!$ do i=1, totxch do i=1, totxch
!!$ proc_to_comm = idx(pnti+psb_proc_id_) proc_to_comm = idx(pnti+psb_proc_id_)
!!$ nerv = idx(pnti+psb_n_elem_recv_) nerv = idx(pnti+psb_n_elem_recv_)
!!$ nesd = idx(pnti+nerv+psb_n_elem_send_) nesd = idx(pnti+nerv+psb_n_elem_send_)
!!$ call psb_get_rank(prcid(proc_to_comm),ictxt,proc_to_comm) call psb_get_rank(prcid(proc_to_comm),ictxt,proc_to_comm)
!!$
!!$ brvidx(proc_to_comm) = rcv_pt brvidx(proc_to_comm) = rcv_pt
!!$ rvsz(proc_to_comm) = nerv rvsz(proc_to_comm) = nerv
!!$
!!$ bsdidx(proc_to_comm) = snd_pt bsdidx(proc_to_comm) = snd_pt
!!$ sdsz(proc_to_comm) = nesd sdsz(proc_to_comm) = nesd
!!$
!!$ rcv_pt = rcv_pt + nerv rcv_pt = rcv_pt + nerv
!!$ snd_pt = snd_pt + nesd snd_pt = snd_pt + nesd
!!$ pnti = pnti + nerv + nesd + 3 pnti = pnti + nerv + nesd + 3
!!$
!!$ end do end do
!!$
!!$ else else
!!$ allocate(rvhd(totxch),prcid(totxch),stat=info) allocate(rvhd(totxch),prcid(totxch),stat=info)
!!$ if(info /= psb_success_) then if(info /= psb_success_) then
!!$ call psb_errpush(psb_err_alloc_dealloc_,name) call psb_errpush(psb_err_alloc_dealloc_,name)
!!$ goto 9999 goto 9999
!!$ end if end if
!!$ end if end if
!!$
!!$
!!$ totrcv_ = max(totrcv_,1) totrcv_ = max(totrcv_,1)
!!$ totsnd_ = max(totsnd_,1) totsnd_ = max(totsnd_,1)
!!$ if((totrcv_+totsnd_) < size(work)) then if((totrcv_+totsnd_) < size(work)) then
!!$ sndbuf => work(1:totsnd_) sndbuf => work(1:totsnd_)
!!$ rcvbuf => work(totsnd_+1:totsnd_+totrcv_) rcvbuf => work(totsnd_+1:totsnd_+totrcv_)
!!$ albf=.false. albf=.false.
!!$ else else
!!$ allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info)
!!$ if(info /= psb_success_) then if(info /= psb_success_) then
!!$ call psb_errpush(psb_err_alloc_dealloc_,name) call psb_errpush(psb_err_alloc_dealloc_,name)
!!$ goto 9999 goto 9999
!!$ end if end if
!!$ albf=.true. albf=.true.
!!$ end if end if
!!$
!!$
!!$ if (do_send) then if (do_send) then
!!$
!!$ ! Pack send buffers ! Pack send buffers
!!$ pnti = 1 pnti = 1
!!$ snd_pt = 1 snd_pt = 1
!!$ rcv_pt = 1 rcv_pt = 1
!!$ do i=1, totxch do i=1, totxch
!!$ proc_to_comm = idx(pnti+psb_proc_id_) proc_to_comm = idx(pnti+psb_proc_id_)
!!$ nerv = idx(pnti+psb_n_elem_recv_) nerv = idx(pnti+psb_n_elem_recv_)
!!$ nesd = idx(pnti+nerv+psb_n_elem_send_) nesd = idx(pnti+nerv+psb_n_elem_send_)
!!$ idx_pt = 1+pnti+psb_n_elem_recv_ idx_pt = 1+pnti+psb_n_elem_recv_
!!$
!!$ call y%gth(nerv,idx(idx_pt:idx_pt+nerv-1),& call y%gth(nerv,idx(idx_pt:idx_pt+nerv-1),&
!!$ & rcvbuf(rcv_pt:rcv_pt+nerv-1)) & rcvbuf(rcv_pt:rcv_pt+nerv-1))
!!$
!!$ rcv_pt = rcv_pt + nerv rcv_pt = rcv_pt + nerv
!!$ snd_pt = snd_pt + nesd snd_pt = snd_pt + nesd
!!$ pnti = pnti + nerv + nesd + 3 pnti = pnti + nerv + nesd + 3
!!$ end do end do
!!$
!!$ end if end if
!!$
!!$ ! Case SWAP_MPI ! Case SWAP_MPI
!!$ if (swap_mpi) then if (swap_mpi) then
!!$
!!$ ! swap elements using mpi_alltoallv ! swap elements using mpi_alltoallv
!!$ call mpi_alltoallv(rcvbuf,rvsz,brvidx,& call mpi_alltoallv(rcvbuf,rvsz,brvidx,&
!!$ & psb_mpi_ipk_integer,& & psb_mpi_ipk_integer,&
!!$ & sndbuf,sdsz,bsdidx,psb_mpi_ipk_integer,icomm,iret) & sndbuf,sdsz,bsdidx,psb_mpi_ipk_integer,icomm,iret)
!!$ if(iret /= mpi_success) then if(iret /= mpi_success) then
!!$ ierr(1) = iret ierr(1) = iret
!!$ info=psb_err_mpi_error_ info=psb_err_mpi_error_
!!$ call psb_errpush(info,name,i_err=ierr) call psb_errpush(info,name,i_err=ierr)
!!$ goto 9999 goto 9999
!!$ end if end if
!!$
!!$ else if (swap_sync) then else if (swap_sync) then
!!$
!!$ pnti = 1 pnti = 1
!!$ snd_pt = 1 snd_pt = 1
!!$ rcv_pt = 1 rcv_pt = 1
!!$ do i=1, totxch do i=1, totxch
!!$ proc_to_comm = idx(pnti+psb_proc_id_) proc_to_comm = idx(pnti+psb_proc_id_)
!!$ nerv = idx(pnti+psb_n_elem_recv_) nerv = idx(pnti+psb_n_elem_recv_)
!!$ nesd = idx(pnti+nerv+psb_n_elem_send_) nesd = idx(pnti+nerv+psb_n_elem_send_)
!!$
!!$ if (proc_to_comm < me) then if (proc_to_comm < me) then
!!$ if (nerv>0) call psb_snd(ictxt,& if (nerv>0) call psb_snd(ictxt,&
!!$ & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm)
!!$ if (nesd>0) call psb_rcv(ictxt,& if (nesd>0) call psb_rcv(ictxt,&
!!$ & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm)
!!$ else if (proc_to_comm > me) then else if (proc_to_comm > me) then
!!$ if (nesd>0) call psb_rcv(ictxt,& if (nesd>0) call psb_rcv(ictxt,&
!!$ & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm)
!!$ if (nerv>0) call psb_snd(ictxt,& if (nerv>0) call psb_snd(ictxt,&
!!$ & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm)
!!$ else if (proc_to_comm == me) then else if (proc_to_comm == me) then
!!$ if (nesd /= nerv) then if (nesd /= nerv) then
!!$ write(psb_err_unit,*) & write(psb_err_unit,*) &
!!$ & 'Fatal error in swaptran: mismatch on self send',& & 'Fatal error in swaptran: mismatch on self send',&
!!$ & nerv,nesd & nerv,nesd
!!$ end if end if
!!$ sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1)
!!$ end if end if
!!$ rcv_pt = rcv_pt + nerv rcv_pt = rcv_pt + nerv
!!$ snd_pt = snd_pt + nesd snd_pt = snd_pt + nesd
!!$ pnti = pnti + nerv + nesd + 3 pnti = pnti + nerv + nesd + 3
!!$
!!$ end do end do
!!$
!!$
!!$ else if (swap_send .and. swap_recv) then else if (swap_send .and. swap_recv) then
!!$
!!$ ! First I post all the non blocking receives ! First I post all the non blocking receives
!!$ pnti = 1 pnti = 1
!!$ snd_pt = 1 snd_pt = 1
!!$ rcv_pt = 1 rcv_pt = 1
!!$ do i=1, totxch do i=1, totxch
!!$ proc_to_comm = idx(pnti+psb_proc_id_) proc_to_comm = idx(pnti+psb_proc_id_)
!!$ nerv = idx(pnti+psb_n_elem_recv_) nerv = idx(pnti+psb_n_elem_recv_)
!!$ nesd = idx(pnti+nerv+psb_n_elem_send_) nesd = idx(pnti+nerv+psb_n_elem_send_)
!!$ call psb_get_rank(prcid(i),ictxt,proc_to_comm) call psb_get_rank(prcid(i),ictxt,proc_to_comm)
!!$ if ((nesd>0).and.(proc_to_comm /= me)) then if ((nesd>0).and.(proc_to_comm /= me)) then
!!$ p2ptag = psb_int_swap_tag p2ptag = psb_int_swap_tag
!!$ call mpi_irecv(sndbuf(snd_pt),nesd,& call mpi_irecv(sndbuf(snd_pt),nesd,&
!!$ & psb_mpi_ipk_integer,prcid(i),& & psb_mpi_ipk_integer,prcid(i),&
!!$ & p2ptag,icomm,rvhd(i),iret) & p2ptag,icomm,rvhd(i),iret)
!!$ end if end if
!!$ rcv_pt = rcv_pt + nerv rcv_pt = rcv_pt + nerv
!!$ snd_pt = snd_pt + nesd snd_pt = snd_pt + nesd
!!$ pnti = pnti + nerv + nesd + 3 pnti = pnti + nerv + nesd + 3
!!$ end do end do
!!$
!!$
!!$ ! Then I post all the blocking sends ! Then I post all the blocking sends
!!$ if (usersend) call mpi_barrier(icomm,iret) if (usersend) call mpi_barrier(icomm,iret)
!!$
!!$ pnti = 1 pnti = 1
!!$ snd_pt = 1 snd_pt = 1
!!$ rcv_pt = 1 rcv_pt = 1
!!$ do i=1, totxch do i=1, totxch
!!$ proc_to_comm = idx(pnti+psb_proc_id_) proc_to_comm = idx(pnti+psb_proc_id_)
!!$ nerv = idx(pnti+psb_n_elem_recv_) nerv = idx(pnti+psb_n_elem_recv_)
!!$ nesd = idx(pnti+nerv+psb_n_elem_send_) nesd = idx(pnti+nerv+psb_n_elem_send_)
!!$
!!$ if ((nerv>0).and.(proc_to_comm /= me)) then if ((nerv>0).and.(proc_to_comm /= me)) then
!!$ p2ptag = psb_int_swap_tag p2ptag = psb_int_swap_tag
!!$ if (usersend) then if (usersend) then
!!$ call mpi_rsend(rcvbuf(rcv_pt),nerv,& call mpi_rsend(rcvbuf(rcv_pt),nerv,&
!!$ & psb_mpi_ipk_integer,prcid(i),& & psb_mpi_ipk_integer,prcid(i),&
!!$ & p2ptag, icomm,iret) & p2ptag, icomm,iret)
!!$ else else
!!$ call mpi_send(rcvbuf(rcv_pt),nerv,& call mpi_send(rcvbuf(rcv_pt),nerv,&
!!$ & psb_mpi_ipk_integer,prcid(i),& & psb_mpi_ipk_integer,prcid(i),&
!!$ & p2ptag, icomm,iret) & p2ptag, icomm,iret)
!!$ end if end if
!!$
!!$ if(iret /= mpi_success) then if(iret /= mpi_success) then
!!$ ierr(1) = iret ierr(1) = iret
!!$ info=psb_err_mpi_error_ info=psb_err_mpi_error_
!!$ call psb_errpush(info,name,i_err=ierr) call psb_errpush(info,name,i_err=ierr)
!!$ goto 9999 goto 9999
!!$ end if end if
!!$ end if end if
!!$ rcv_pt = rcv_pt + nerv rcv_pt = rcv_pt + nerv
!!$ snd_pt = snd_pt + nesd snd_pt = snd_pt + nesd
!!$ pnti = pnti + nerv + nesd + 3 pnti = pnti + nerv + nesd + 3
!!$
!!$ end do end do
!!$
!!$
!!$ pnti = 1 pnti = 1
!!$ do i=1, totxch do i=1, totxch
!!$ proc_to_comm = idx(pnti+psb_proc_id_) proc_to_comm = idx(pnti+psb_proc_id_)
!!$ nerv = idx(pnti+psb_n_elem_recv_) nerv = idx(pnti+psb_n_elem_recv_)
!!$ nesd = idx(pnti+nerv+psb_n_elem_send_) nesd = idx(pnti+nerv+psb_n_elem_send_)
!!$ p2ptag = psb_int_swap_tag p2ptag = psb_int_swap_tag
!!$
!!$ if ((proc_to_comm /= me).and.(nesd>0)) then if ((proc_to_comm /= me).and.(nesd>0)) then
!!$ call mpi_wait(rvhd(i),p2pstat,iret) call mpi_wait(rvhd(i),p2pstat,iret)
!!$ if(iret /= mpi_success) then if(iret /= mpi_success) then
!!$ ierr(1) = iret ierr(1) = iret
!!$ info=psb_err_mpi_error_ info=psb_err_mpi_error_
!!$ call psb_errpush(info,name,i_err=ierr) call psb_errpush(info,name,i_err=ierr)
!!$ goto 9999 goto 9999
!!$ end if end if
!!$ else if (proc_to_comm == me) then else if (proc_to_comm == me) then
!!$ if (nesd /= nerv) then if (nesd /= nerv) then
!!$ write(psb_err_unit,*) & write(psb_err_unit,*) &
!!$ & 'Fatal error in swaptran: mismatch on self send', & & 'Fatal error in swaptran: mismatch on self send', &
!!$ & nerv,nesd & nerv,nesd
!!$ end if end if
!!$ sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1)
!!$ end if end if
!!$ pnti = pnti + nerv + nesd + 3 pnti = pnti + nerv + nesd + 3
!!$ end do end do
!!$
!!$
!!$ else if (swap_send) then else if (swap_send) then
!!$
!!$ pnti = 1 pnti = 1
!!$ snd_pt = 1 snd_pt = 1
!!$ rcv_pt = 1 rcv_pt = 1
!!$ do i=1, totxch do i=1, totxch
!!$ proc_to_comm = idx(pnti+psb_proc_id_) proc_to_comm = idx(pnti+psb_proc_id_)
!!$ nerv = idx(pnti+psb_n_elem_recv_) nerv = idx(pnti+psb_n_elem_recv_)
!!$ nesd = idx(pnti+nerv+psb_n_elem_send_) nesd = idx(pnti+nerv+psb_n_elem_send_)
!!$ if (nerv>0) call psb_snd(ictxt,& if (nerv>0) call psb_snd(ictxt,&
!!$ & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm)
!!$ rcv_pt = rcv_pt + nerv rcv_pt = rcv_pt + nerv
!!$ snd_pt = snd_pt + nesd snd_pt = snd_pt + nesd
!!$ pnti = pnti + nerv + nesd + 3 pnti = pnti + nerv + nesd + 3
!!$
!!$ end do end do
!!$
!!$ else if (swap_recv) then else if (swap_recv) then
!!$
!!$ pnti = 1 pnti = 1
!!$ snd_pt = 1 snd_pt = 1
!!$ rcv_pt = 1 rcv_pt = 1
!!$ do i=1, totxch do i=1, totxch
!!$ proc_to_comm = idx(pnti+psb_proc_id_) proc_to_comm = idx(pnti+psb_proc_id_)
!!$ nerv = idx(pnti+psb_n_elem_recv_) nerv = idx(pnti+psb_n_elem_recv_)
!!$ nesd = idx(pnti+nerv+psb_n_elem_send_) nesd = idx(pnti+nerv+psb_n_elem_send_)
!!$ if (nesd>0) call psb_rcv(ictxt,& if (nesd>0) call psb_rcv(ictxt,&
!!$ & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm)
!!$ rcv_pt = rcv_pt + nerv rcv_pt = rcv_pt + nerv
!!$ snd_pt = snd_pt + nesd snd_pt = snd_pt + nesd
!!$ pnti = pnti + nerv + nesd + 3 pnti = pnti + nerv + nesd + 3
!!$
!!$ end do end do
!!$
!!$ end if end if
!!$
!!$
!!$ if (do_recv) then if (do_recv) then
!!$
!!$ pnti = 1 pnti = 1
!!$ snd_pt = 1 snd_pt = 1
!!$ rcv_pt = 1 rcv_pt = 1
!!$ do i=1, totxch do i=1, totxch
!!$ proc_to_comm = idx(pnti+psb_proc_id_) proc_to_comm = idx(pnti+psb_proc_id_)
!!$ nerv = idx(pnti+psb_n_elem_recv_) nerv = idx(pnti+psb_n_elem_recv_)
!!$ nesd = idx(pnti+nerv+psb_n_elem_send_) nesd = idx(pnti+nerv+psb_n_elem_send_)
!!$ idx_pt = 1+pnti+nerv+psb_n_elem_send_ idx_pt = 1+pnti+nerv+psb_n_elem_send_
!!$ call y%sct(nesd,idx(idx_pt:idx_pt+nesd-1),& call y%sct(nesd,idx(idx_pt:idx_pt+nesd-1),&
!!$ & sndbuf(snd_pt:snd_pt+nesd-1),beta) & sndbuf(snd_pt:snd_pt+nesd-1),beta)
!!$ rcv_pt = rcv_pt + nerv rcv_pt = rcv_pt + nerv
!!$ snd_pt = snd_pt + nesd snd_pt = snd_pt + nesd
!!$ pnti = pnti + nerv + nesd + 3 pnti = pnti + nerv + nesd + 3
!!$ end do end do
!!$
!!$ end if end if
!!$
!!$
!!$ if (swap_mpi) then if (swap_mpi) then
!!$ deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,&
!!$ & stat=info) & stat=info)
!!$ else else
!!$ deallocate(rvhd,prcid,stat=info) deallocate(rvhd,prcid,stat=info)
!!$ end if end if
!!$ if(info /= psb_success_) then if(info /= psb_success_) then
!!$ call psb_errpush(psb_err_alloc_dealloc_,name) call psb_errpush(psb_err_alloc_dealloc_,name)
!!$ goto 9999 goto 9999
!!$ end if end if
!!$ if(albf) deallocate(sndbuf,rcvbuf,stat=info) if(albf) deallocate(sndbuf,rcvbuf,stat=info)
!!$ if(info /= psb_success_) then if(info /= psb_success_) then
!!$ call psb_errpush(psb_err_alloc_dealloc_,name) call psb_errpush(psb_err_alloc_dealloc_,name)
!!$ goto 9999 goto 9999
!!$ end if end if
!!$
!!$ call psb_erractionrestore(err_act) call psb_erractionrestore(err_act)
!!$ return return
!!$
!!$9999 continue 9999 continue
!!$ call psb_erractionrestore(err_act) call psb_erractionrestore(err_act)
!!$ if (err_act == psb_act_abort_) then if (err_act == psb_act_abort_) then
!!$ call psb_error(ictxt) call psb_error(ictxt)
!!$ return return
!!$ end if end if
!!$ return return
!!$end subroutine psi_itranidx_vect end subroutine psi_itranidx_vect
!!$
!!$
!!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -531,6 +531,51 @@ end subroutine psi_iovrl_restrr2
subroutine psi_iovrl_restr_vect(x,xs,desc_a,info)
use psi_mod, psi_protect_name => psi_iovrl_restr_vect
use psb_i_base_vect_mod
implicit none
class(psb_i_base_vect_type) :: x
integer(psb_ipk_) :: xs(:)
type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info
! locals
integer(psb_ipk_) :: ictxt, np, me, err_act, i, idx, isz
character(len=20) :: name, ch_err
name='psi_iovrl_restrr1'
if (psb_get_errstatus() /= 0) return
info = psb_success_
call psb_erractionsave(err_act)
ictxt = desc_a%get_context()
call psb_info(ictxt, me, np)
if (np == -1) then
info = psb_err_context_error_
call psb_errpush(info,name)
goto 9999
endif
isz = size(desc_a%ovrlap_elem,1)
call x%sct(isz,desc_a%ovrlap_elem(:,1),xs,izero)
call psb_erractionrestore(err_act)
return
9999 continue
call psb_erractionrestore(err_act)
if (err_act == psb_act_abort_) then
call psb_error(ictxt)
return
end if
return
end subroutine psi_iovrl_restr_vect
subroutine psi_sovrl_restr_vect(x,xs,desc_a,info) subroutine psi_sovrl_restr_vect(x,xs,desc_a,info)
use psi_mod, psi_protect_name => psi_sovrl_restr_vect use psi_mod, psi_protect_name => psi_sovrl_restr_vect
use psb_s_base_vect_mod use psb_s_base_vect_mod

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -579,6 +579,57 @@ end subroutine psi_iovrl_saver2
subroutine psi_iovrl_save_vect(x,xs,desc_a,info)
use psi_mod, psi_protect_name => psi_iovrl_save_vect
use psb_realloc_mod
use psb_i_base_vect_mod
implicit none
class(psb_i_base_vect_type) :: x
integer(psb_ipk_), allocatable :: xs(:)
type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info
! locals
integer(psb_ipk_) :: ictxt, np, me, err_act, i, idx, isz
character(len=20) :: name, ch_err
name='psi_iovrl_saver1'
if (psb_get_errstatus() /= 0) return
info = psb_success_
call psb_erractionsave(err_act)
ictxt = desc_a%get_context()
call psb_info(ictxt, me, np)
if (np == -1) then
info = psb_err_context_error_
call psb_errpush(info,name)
goto 9999
endif
isz = size(desc_a%ovrlap_elem,1)
call psb_realloc(isz,xs,info)
if (info /= psb_success_) then
info = psb_err_alloc_dealloc_
call psb_errpush(info,name)
goto 9999
endif
call x%gth(isz,desc_a%ovrlap_elem(:,1),xs)
call psb_erractionrestore(err_act)
return
9999 continue
call psb_erractionrestore(err_act)
if (err_act == psb_act_abort_) then
call psb_error(ictxt)
return
end if
return
end subroutine psi_iovrl_save_vect
subroutine psi_sovrl_save_vect(x,xs,desc_a,info) subroutine psi_sovrl_save_vect(x,xs,desc_a,info)
use psi_mod, psi_protect_name => psi_sovrl_save_vect use psi_mod, psi_protect_name => psi_sovrl_save_vect
use psb_realloc_mod use psb_realloc_mod

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -748,6 +748,90 @@ subroutine psi_iovrl_updr2(x,desc_a,update,info)
end subroutine psi_iovrl_updr2 end subroutine psi_iovrl_updr2
subroutine psi_iovrl_upd_vect(x,desc_a,update,info)
use psi_mod, psi_protect_name => psi_iovrl_upd_vect
use psb_realloc_mod
use psb_i_base_vect_mod
implicit none
class(psb_i_base_vect_type) :: x
type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(in) :: update
integer(psb_ipk_), intent(out) :: info
! locals
integer(psb_ipk_), allocatable :: xs(:)
integer(psb_ipk_) :: ictxt, np, me, err_act, i, idx, ndm, nx
integer(psb_ipk_) :: ierr(5)
character(len=20) :: name, ch_err
name='psi_iovrl_updr1'
if (psb_get_errstatus() /= 0) return
info = psb_success_
call psb_erractionsave(err_act)
ictxt = desc_a%get_context()
call psb_info(ictxt, me, np)
if (np == -1) then
info = psb_err_context_error_
call psb_errpush(info,name)
goto 9999
endif
nx = size(desc_a%ovrlap_elem,1)
call psb_realloc(nx,xs,info)
if (info /= psb_success_) then
info = psb_err_alloc_Dealloc_
call psb_errpush(info,name)
goto 9999
end if
if (update /= psb_sum_) then
call x%gth(nx,desc_a%ovrlap_elem(:,1),xs)
! switch on update type
select case (update)
case(psb_square_root_)
do i=1,nx
ndm = desc_a%ovrlap_elem(i,2)
xs(i) = xs(i)/sqrt(real(ndm))
end do
case(psb_avg_)
do i=1,nx
ndm = desc_a%ovrlap_elem(i,2)
xs(i) = xs(i)/real(ndm)
end do
case(psb_setzero_)
do i=1,nx
if (me /= desc_a%ovrlap_elem(i,3))&
& xs(i) = izero
end do
case(psb_sum_)
! do nothing
case default
! wrong value for choice argument
info = psb_err_iarg_invalid_value_
ierr(1) = 3; ierr(2)=update;
call psb_errpush(info,name,i_err=ierr)
goto 9999
end select
call x%sct(nx,desc_a%ovrlap_elem(:,1),xs,izero)
end if
call psb_erractionrestore(err_act)
return
9999 continue
call psb_erractionrestore(err_act)
if (err_act == psb_act_abort_) then
call psb_error(ictxt)
return
end if
return
end subroutine psi_iovrl_upd_vect
subroutine psi_sovrl_upd_vect(x,desc_a,update,info) subroutine psi_sovrl_upd_vect(x,desc_a,update,info)
use psi_mod, psi_protect_name => psi_sovrl_upd_vect use psi_mod, psi_protect_name => psi_sovrl_upd_vect
use psb_realloc_mod use psb_realloc_mod

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,7 +1,8 @@
#include <stdio.h> #include <stdio.h>
#include <mpi.h> #include <mpi.h>
int receiveRoutine(double * y, int recvtype, int procSender,int tag, int comm, int *handle){ int receiveRoutine(double * y, int recvtype, int procSender,
int tag, int comm, int *handle){
MPI_Comm co = MPI_Comm_f2c(comm); MPI_Comm co = MPI_Comm_f2c(comm);
MPI_Datatype dt = MPI_Type_f2c(recvtype); MPI_Datatype dt = MPI_Type_f2c(recvtype);

@ -1,6 +1,6 @@
C C
C Parallel Sparse BLAS version 3.0 C Parallel Sparse BLAS version 3.0
C (C) Copyright 2006, 2007, 2008, 2009, 2010 C (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
C Salvatore Filippone University of Rome Tor Vergata C Salvatore Filippone University of Rome Tor Vergata
C Alfredo Buttari CNRS-IRIT, Toulouse C Alfredo Buttari CNRS-IRIT, Toulouse
C C

@ -6,13 +6,14 @@ UTIL_MODS = psb_string_mod.o psb_desc_const_mod.o psb_indx_map_mod.o\
psb_gen_block_map_mod.o psb_list_map_mod.o psb_repl_map_mod.o\ psb_gen_block_map_mod.o psb_list_map_mod.o psb_repl_map_mod.o\
psb_glist_map_mod.o psb_hash_map_mod.o \ psb_glist_map_mod.o psb_hash_map_mod.o \
psb_desc_type.o psb_sort_mod.o psb_serial_mod.o \ psb_desc_type.o psb_sort_mod.o psb_serial_mod.o \
psb_base_tools_mod.o psb_s_tools_mod.o psb_d_tools_mod.o\ psb_cd_tools_mod.o psb_i_tools_mod.o psb_s_tools_mod.o psb_d_tools_mod.o\
psb_c_tools_mod.o psb_z_tools_mod.o psb_tools_mod.o \ psb_c_tools_mod.o psb_z_tools_mod.o psb_tools_mod.o \
psb_penv_mod.o $(COMMINT) psb_error_impl.o \ psb_penv_mod.o $(COMMINT) psb_error_impl.o \
psb_base_linmap_mod.o psb_linmap_mod.o \ psb_base_linmap_mod.o psb_linmap_mod.o \
psb_s_linmap_mod.o psb_d_linmap_mod.o psb_c_linmap_mod.o psb_z_linmap_mod.o \ psb_s_linmap_mod.o psb_d_linmap_mod.o psb_c_linmap_mod.o psb_z_linmap_mod.o \
psb_comm_mod.o psb_i_comm_mod.o psb_s_comm_mod.o psb_d_comm_mod.o\ psb_comm_mod.o psb_i_comm_mod.o psb_s_comm_mod.o psb_d_comm_mod.o\
psb_c_comm_mod.o psb_z_comm_mod.o \ psb_c_comm_mod.o psb_z_comm_mod.o \
psb_i_base_vect_mod.o psb_i_vect_mod.o\
psb_d_base_vect_mod.o psb_d_vect_mod.o\ psb_d_base_vect_mod.o psb_d_vect_mod.o\
psb_s_base_vect_mod.o psb_s_vect_mod.o\ psb_s_base_vect_mod.o psb_s_vect_mod.o\
psb_c_base_vect_mod.o psb_c_vect_mod.o\ psb_c_base_vect_mod.o psb_c_vect_mod.o\
@ -62,7 +63,7 @@ psb_s_base_mat_mod.o: psb_s_base_vect_mod.o
psb_d_base_mat_mod.o: psb_d_base_vect_mod.o psb_d_base_mat_mod.o: psb_d_base_vect_mod.o
psb_c_base_mat_mod.o: psb_c_base_vect_mod.o psb_c_base_mat_mod.o: psb_c_base_vect_mod.o
psb_z_base_mat_mod.o: psb_z_base_vect_mod.o psb_z_base_mat_mod.o: psb_z_base_vect_mod.o
psb_c_base_vect_mod.o psb_s_base_vect_mod.o psb_d_base_vect_mod.o psb_z_base_vect_mod.o: psi_serial_mod.o psb_realloc_mod.o psb_i_base_vect_mod.o psb_c_base_vect_mod.o psb_s_base_vect_mod.o psb_d_base_vect_mod.o psb_z_base_vect_mod.o: psi_serial_mod.o psb_realloc_mod.o
psb_s_mat_mod.o: psb_s_base_mat_mod.o psb_s_csr_mat_mod.o psb_s_csc_mat_mod.o psb_s_vect_mod.o psb_s_mat_mod.o: psb_s_base_mat_mod.o psb_s_csr_mat_mod.o psb_s_csc_mat_mod.o psb_s_vect_mod.o
psb_d_mat_mod.o: psb_d_base_mat_mod.o psb_d_csr_mat_mod.o psb_d_csc_mat_mod.o psb_d_vect_mod.o psb_d_mat_mod.o: psb_d_base_mat_mod.o psb_d_csr_mat_mod.o psb_d_csc_mat_mod.o psb_d_vect_mod.o
psb_c_mat_mod.o: psb_c_base_mat_mod.o psb_c_csr_mat_mod.o psb_c_csc_mat_mod.o psb_c_vect_mod.o psb_c_mat_mod.o: psb_c_base_mat_mod.o psb_c_csr_mat_mod.o psb_c_csc_mat_mod.o psb_c_vect_mod.o
@ -75,11 +76,11 @@ psb_mat_mod.o: psb_vect_mod.o psb_s_mat_mod.o psb_d_mat_mod.o psb_c_mat_mod.o ps
error.o psb_realloc_mod.o: psb_error_mod.o error.o psb_realloc_mod.o: psb_error_mod.o
psb_error_impl.o: psb_penv_mod.o psb_error_impl.o: psb_penv_mod.o
psb_spmat_type.o: psb_string_mod.o psb_sort_mod.o psb_spmat_type.o: psb_string_mod.o psb_sort_mod.o
psi_i_mod.o: psb_desc_type.o psi_i_mod.o: psb_desc_type.o psb_i_vect_mod.o
psi_s_mod.o: psb_desc_type.o psb_s_base_vect_mod.o psi_s_mod.o: psb_desc_type.o psb_s_vect_mod.o
psi_d_mod.o: psb_desc_type.o psb_d_base_vect_mod.o psi_d_mod.o: psb_desc_type.o psb_d_vect_mod.o
psi_c_mod.o: psb_desc_type.o psb_c_base_vect_mod.o psi_c_mod.o: psb_desc_type.o psb_c_vect_mod.o
psi_z_mod.o: psb_desc_type.o psb_z_base_vect_mod.o psi_z_mod.o: psb_desc_type.o psb_z_vect_mod.o
psi_mod.o: psb_penv_mod.o psb_desc_type.o psi_serial_mod.o psb_serial_mod.o\ psi_mod.o: psb_penv_mod.o psb_desc_type.o psi_serial_mod.o psb_serial_mod.o\
psi_i_mod.o psi_s_mod.o psi_d_mod.o psi_c_mod.o psi_z_mod.o psi_i_mod.o psi_s_mod.o psi_d_mod.o psi_c_mod.o psi_z_mod.o
psb_desc_type.o: psb_penv_mod.o psb_realloc_mod.o\ psb_desc_type.o: psb_penv_mod.o psb_realloc_mod.o\
@ -103,13 +104,15 @@ psb_base_linmap_mod.o: psb_desc_type.o psb_serial_mod.o psb_comm_mod.o
psb_comm_mod.o: psb_desc_type.o psb_mat_mod.o psb_comm_mod.o: psb_desc_type.o psb_mat_mod.o
psb_check_mod.o: psb_desc_type.o psb_check_mod.o: psb_desc_type.o
psb_serial_mod.o: psb_mat_mod.o psb_string_mod.o psb_sort_mod.o psi_serial_mod.o psb_serial_mod.o: psb_mat_mod.o psb_string_mod.o psb_sort_mod.o psi_serial_mod.o
psb_i_vect_mod.o: psb_i_base_vect_mod.o
psb_s_vect_mod.o: psb_s_base_vect_mod.o psb_s_vect_mod.o: psb_s_base_vect_mod.o
psb_d_vect_mod.o: psb_d_base_vect_mod.o psb_d_vect_mod.o: psb_d_base_vect_mod.o
psb_c_vect_mod.o: psb_c_base_vect_mod.o psb_c_vect_mod.o: psb_c_base_vect_mod.o
psb_z_vect_mod.o: psb_z_base_vect_mod.o psb_z_vect_mod.o: psb_z_base_vect_mod.o
psb_tools_mod.o: psb_base_tools_mod.o psb_s_tools_mod.o psb_d_tools_mod.o\ psb_tools_mod.o: psb_cd_tools_mod.o psb_s_tools_mod.o psb_d_tools_mod.o\
psb_c_tools_mod.o psb_z_tools_mod.o psb_i_tools_mod.o psb_c_tools_mod.o psb_z_tools_mod.o
psb_base_tools_mod.o psb_s_tools_mod.o psb_d_tools_mod.o psb_c_tools_mod.o psb_z_tools_mod.o: psb_desc_type.o psi_mod.o psb_mat_mod.o psb_cd_tools_mod.o psb_i_tools_mod.o psb_s_tools_mod.o psb_d_tools_mod.o psb_c_tools_mod.o psb_z_tools_mod.o: psb_desc_type.o psi_mod.o psb_mat_mod.o
psb_i_tools_mod.o: psb_i_vect_mod.o
psb_s_tools_mod.o: psb_s_vect_mod.o psb_s_tools_mod.o: psb_s_vect_mod.o
psb_d_tools_mod.o: psb_d_vect_mod.o psb_d_tools_mod.o: psb_d_vect_mod.o
psb_c_tools_mod.o: psb_c_vect_mod.o psb_c_tools_mod.o: psb_c_vect_mod.o
@ -121,9 +124,9 @@ psb_c_psblas_mod.o: psb_c_vect_mod.o psb_c_mat_mod.o
psb_z_psblas_mod.o: psb_z_vect_mod.o psb_z_mat_mod.o psb_z_psblas_mod.o: psb_z_vect_mod.o psb_z_mat_mod.o
psb_psblas_mod.o: psb_s_psblas_mod.o psb_c_psblas_mod.o psb_d_psblas_mod.o psb_z_psblas_mod.o psb_psblas_mod.o: psb_s_psblas_mod.o psb_c_psblas_mod.o psb_d_psblas_mod.o psb_z_psblas_mod.o
psb_s_psblas_mod.o psb_c_psblas_mod.o psb_d_psblas_mod.o psb_z_psblas_mod.o: psb_mat_mod.o psb_desc_type.o psb_s_psblas_mod.o psb_c_psblas_mod.o psb_d_psblas_mod.o psb_z_psblas_mod.o: psb_mat_mod.o psb_desc_type.o
psb_vect_mod.o: psb_d_vect_mod.o psb_s_vect_mod.o psb_c_vect_mod.o psb_z_vect_mod.o psb_vect_mod.o: psb_i_vect_mod.o psb_d_vect_mod.o psb_s_vect_mod.o psb_c_vect_mod.o psb_z_vect_mod.o
psb_comm_mod.o: psb_i_comm_mod.o psb_s_comm_mod.o psb_d_comm_mod.o psb_c_comm_mod.o psb_z_comm_mod.o psb_comm_mod.o: psb_i_comm_mod.o psb_s_comm_mod.o psb_d_comm_mod.o psb_c_comm_mod.o psb_z_comm_mod.o
psb_i_comm_mod.o: psb_desc_type.o psb_i_comm_mod.o: psb_i_vect_mod.o psb_desc_type.o
psb_s_comm_mod.o: psb_s_vect_mod.o psb_desc_type.o psb_mat_mod.o psb_s_comm_mod.o: psb_s_vect_mod.o psb_desc_type.o psb_mat_mod.o
psb_d_comm_mod.o: psb_d_vect_mod.o psb_desc_type.o psb_mat_mod.o psb_d_comm_mod.o: psb_d_vect_mod.o psb_desc_type.o psb_mat_mod.o
psb_c_comm_mod.o: psb_c_vect_mod.o psb_desc_type.o psb_mat_mod.o psb_c_comm_mod.o: psb_c_vect_mod.o psb_desc_type.o psb_mat_mod.o

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -83,38 +83,38 @@ contains
end subroutine base_set_kind end subroutine base_set_kind
function base_is_ok(map) result(this) function base_is_ok(map) result(res)
use psb_descriptor_type use psb_descriptor_type
implicit none implicit none
class(psb_base_linmap_type), intent(in) :: map class(psb_base_linmap_type), intent(in) :: map
logical :: this logical :: res
this = .false. res = .false.
select case(map%get_kind()) select case(map%get_kind())
case (psb_map_aggr_) case (psb_map_aggr_)
if (.not.associated(map%p_desc_X)) return if (.not.associated(map%p_desc_X)) return
if (.not.associated(map%p_desc_Y)) return if (.not.associated(map%p_desc_Y)) return
this = map%p_desc_X%is_ok().and.map%p_desc_Y%is_ok() res = map%p_desc_X%is_ok().and.map%p_desc_Y%is_ok()
case(psb_map_gen_linear_) case(psb_map_gen_linear_)
this = map%desc_X%is_ok().and.map%desc_Y%is_ok() res = map%desc_X%is_ok().and.map%desc_Y%is_ok()
end select end select
end function base_is_ok end function base_is_ok
function base_is_asb(map) result(this) function base_is_asb(map) result(res)
use psb_descriptor_type use psb_descriptor_type
implicit none implicit none
class(psb_base_linmap_type), intent(in) :: map class(psb_base_linmap_type), intent(in) :: map
logical :: this logical :: res
this = .false. res = .false.
select case(map%get_kind()) select case(map%get_kind())
case (psb_map_aggr_) case (psb_map_aggr_)
if (.not.associated(map%p_desc_X)) return if (.not.associated(map%p_desc_X)) return
if (.not.associated(map%p_desc_Y)) return if (.not.associated(map%p_desc_Y)) return
this = map%p_desc_X%is_asb().and.map%p_desc_Y%is_asb() res = map%p_desc_X%is_asb().and.map%p_desc_Y%is_asb()
case(psb_map_gen_linear_) case(psb_map_gen_linear_)
this = map%desc_X%is_asb().and.map%desc_Y%is_asb() res = map%desc_X%is_asb().and.map%desc_Y%is_asb()
end select end select
end function base_is_asb end function base_is_asb
@ -140,7 +140,7 @@ contains
use psb_descriptor_type use psb_descriptor_type
use psb_mat_mod, only : psb_move_alloc use psb_mat_mod, only : psb_move_alloc
implicit none implicit none
type(psb_base_linmap_type) :: mapin,mapout type(psb_base_linmap_type), intent(inout) :: mapin,mapout
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
mapout%kind = mapin%kind mapout%kind = mapin%kind

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -68,6 +68,7 @@ module psb_c_base_vect_mod
procedure, pass(x) :: bld_n => c_base_bld_n procedure, pass(x) :: bld_n => c_base_bld_n
generic, public :: bld => bld_x, bld_n generic, public :: bld => bld_x, bld_n
procedure, pass(x) :: all => c_base_all procedure, pass(x) :: all => c_base_all
procedure, pass(x) :: mold => c_base_mold
! !
! Insert/set. Assembly and free. ! Insert/set. Assembly and free.
! Assembly does almost nothing here, but is important ! Assembly does almost nothing here, but is important
@ -219,6 +220,18 @@ contains
end subroutine c_base_all end subroutine c_base_all
subroutine c_base_mold(x, y, info)
use psi_serial_mod
use psb_realloc_mod
implicit none
class(psb_c_base_vect_type), intent(in) :: x
class(psb_c_base_vect_type), intent(out), allocatable :: y
integer(psb_ipk_), intent(out) :: info
allocate(psb_c_base_vect_type :: y, stat=info)
end subroutine c_base_mold
! !
! Insert a bunch of values at specified positions. ! Insert a bunch of values at specified positions.
! !

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -128,7 +128,7 @@ module psb_c_comm_mod
subroutine psb_cgatherm(globx, locx, desc_a, info, root) subroutine psb_cgatherm(globx, locx, desc_a, info, root)
use psb_descriptor_type use psb_descriptor_type
complex(psb_spk_), intent(in) :: locx(:,:) complex(psb_spk_), intent(in) :: locx(:,:)
complex(psb_spk_), intent(out) :: globx(:,:) complex(psb_spk_), intent(out), allocatable :: globx(:,:)
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: root integer(psb_ipk_), intent(in), optional :: root
@ -136,7 +136,7 @@ module psb_c_comm_mod
subroutine psb_cgatherv(globx, locx, desc_a, info, root) subroutine psb_cgatherv(globx, locx, desc_a, info, root)
use psb_descriptor_type use psb_descriptor_type
complex(psb_spk_), intent(in) :: locx(:) complex(psb_spk_), intent(in) :: locx(:)
complex(psb_spk_), intent(out) :: globx(:) complex(psb_spk_), intent(out), allocatable :: globx(:)
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: root integer(psb_ipk_), intent(in), optional :: root
@ -145,7 +145,7 @@ module psb_c_comm_mod
use psb_descriptor_type use psb_descriptor_type
use psb_c_vect_mod use psb_c_vect_mod
type(psb_c_vect_type), intent(inout) :: locx type(psb_c_vect_type), intent(inout) :: locx
complex(psb_spk_), intent(out) :: globx(:) complex(psb_spk_), intent(out), allocatable :: globx(:)
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: root integer(psb_ipk_), intent(in), optional :: root

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -551,15 +551,11 @@ contains
class(psb_c_csc_sparse_mat), intent(in) :: a class(psb_c_csc_sparse_mat), intent(in) :: a
integer(psb_ipk_) :: res integer(psb_ipk_) :: res
res = 0 res = -1
if (allocated(a%ia)) then if (allocated(a%ia)) then
if (res >= 0) then
res = min(res,size(a%ia))
else
res = size(a%ia) res = size(a%ia)
end if end if
end if
if (allocated(a%val)) then if (allocated(a%val)) then
if (res >= 0) then if (res >= 0) then
res = min(res,size(a%val)) res = min(res,size(a%val))

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -554,15 +554,11 @@ contains
class(psb_c_csr_sparse_mat), intent(in) :: a class(psb_c_csr_sparse_mat), intent(in) :: a
integer(psb_ipk_) :: res integer(psb_ipk_) :: res
res = 0 res = -1
if (allocated(a%ja)) then if (allocated(a%ja)) then
if (res >= 0) then
res = min(res,size(a%ja))
else
res = size(a%ja) res = size(a%ja)
end if end if
end if
if (allocated(a%val)) then if (allocated(a%val)) then
if (res >= 0) then if (res >= 0) then
res = min(res,size(a%val)) res = min(res,size(a%val))

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -167,7 +167,7 @@ Module psb_c_tools_mod
interface psb_geins interface psb_geins
subroutine psb_cinsi(m,irw,val, x, desc_a,info,dupl) subroutine psb_cinsi(m,irw,val, x, desc_a,info,dupl,local)
import :: psb_desc_type, psb_spk_, psb_ipk_, & import :: psb_desc_type, psb_spk_, psb_ipk_, &
& psb_c_base_vect_type, psb_c_vect_type, & & psb_c_base_vect_type, psb_c_vect_type, &
& psb_cspmat_type, psb_c_base_sparse_mat & psb_cspmat_type, psb_c_base_sparse_mat
@ -178,8 +178,9 @@ Module psb_c_tools_mod
complex(psb_spk_), intent(in) :: val(:,:) complex(psb_spk_), intent(in) :: val(:,:)
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), optional, intent(in) :: dupl integer(psb_ipk_), optional, intent(in) :: dupl
logical, intent(in), optional :: local
end subroutine psb_cinsi end subroutine psb_cinsi
subroutine psb_cinsvi(m, irw,val, x,desc_a,info,dupl) subroutine psb_cinsvi(m, irw,val, x,desc_a,info,dupl,local)
import :: psb_desc_type, psb_spk_, psb_ipk_, & import :: psb_desc_type, psb_spk_, psb_ipk_, &
& psb_c_base_vect_type, psb_c_vect_type, & & psb_c_base_vect_type, psb_c_vect_type, &
& psb_cspmat_type, psb_c_base_sparse_mat & psb_cspmat_type, psb_c_base_sparse_mat
@ -190,8 +191,9 @@ Module psb_c_tools_mod
complex(psb_spk_), intent(in) :: val(:) complex(psb_spk_), intent(in) :: val(:)
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), optional, intent(in) :: dupl integer(psb_ipk_), optional, intent(in) :: dupl
logical, intent(in), optional :: local
end subroutine psb_cinsvi end subroutine psb_cinsvi
subroutine psb_cins_vect(m,irw,val,x,desc_a,info,dupl) subroutine psb_cins_vect(m,irw,val,x,desc_a,info,dupl,local)
import :: psb_desc_type, psb_spk_, psb_ipk_, & import :: psb_desc_type, psb_spk_, psb_ipk_, &
& psb_c_base_vect_type, psb_c_vect_type, & & psb_c_base_vect_type, psb_c_vect_type, &
& psb_cspmat_type, psb_c_base_sparse_mat & psb_cspmat_type, psb_c_base_sparse_mat
@ -202,8 +204,9 @@ Module psb_c_tools_mod
complex(psb_spk_), intent(in) :: val(:) complex(psb_spk_), intent(in) :: val(:)
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), optional, intent(in) :: dupl integer(psb_ipk_), optional, intent(in) :: dupl
logical, intent(in), optional :: local
end subroutine psb_cins_vect end subroutine psb_cins_vect
subroutine psb_cins_vect_r2(m,irw,val,x,desc_a,info,dupl) subroutine psb_cins_vect_r2(m,irw,val,x,desc_a,info,dupl,local)
import :: psb_desc_type, psb_spk_, psb_ipk_, & import :: psb_desc_type, psb_spk_, psb_ipk_, &
& psb_c_base_vect_type, psb_c_vect_type, & & psb_c_base_vect_type, psb_c_vect_type, &
& psb_cspmat_type, psb_c_base_sparse_mat & psb_cspmat_type, psb_c_base_sparse_mat
@ -214,6 +217,7 @@ Module psb_c_tools_mod
complex(psb_spk_), intent(in) :: val(:,:) complex(psb_spk_), intent(in) :: val(:,:)
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), optional, intent(in) :: dupl integer(psb_ipk_), optional, intent(in) :: dupl
logical, intent(in), optional :: local
end subroutine psb_cins_vect_r2 end subroutine psb_cins_vect_r2
end interface end interface
@ -270,7 +274,7 @@ Module psb_c_tools_mod
interface psb_spins interface psb_spins
subroutine psb_cspins(nz,ia,ja,val,a,desc_a,info,rebuild) subroutine psb_cspins(nz,ia,ja,val,a,desc_a,info,rebuild,local)
import :: psb_desc_type, psb_spk_, psb_ipk_, & import :: psb_desc_type, psb_spk_, psb_ipk_, &
& psb_c_base_vect_type, psb_c_vect_type, & & psb_c_base_vect_type, psb_c_vect_type, &
& psb_cspmat_type, psb_c_base_sparse_mat & psb_cspmat_type, psb_c_base_sparse_mat
@ -280,6 +284,7 @@ Module psb_c_tools_mod
complex(psb_spk_), intent(in) :: val(:) complex(psb_spk_), intent(in) :: val(:)
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
logical, intent(in), optional :: rebuild logical, intent(in), optional :: rebuild
logical, intent(in), optional :: local
end subroutine psb_cspins end subroutine psb_cspins
subroutine psb_cspins_2desc(nz,ia,ja,val,a,desc_ar,desc_ac,info) subroutine psb_cspins_2desc(nz,ia,ja,val,a,desc_ar,desc_ac,info)
import :: psb_desc_type, psb_spk_, psb_ipk_, & import :: psb_desc_type, psb_spk_, psb_ipk_, &

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -100,7 +100,11 @@ contains
integer(psb_ipk_) :: info integer(psb_ipk_) :: info
if (present(mold)) then if (present(mold)) then
#ifdef HAVE_MOLD
allocate(x%v,stat=info,mold=mold) allocate(x%v,stat=info,mold=mold)
#else
call mold%mold(x%v,info)
#endif
else else
allocate(psb_c_base_vect_type :: x%v,stat=info) allocate(psb_c_base_vect_type :: x%v,stat=info)
endif endif
@ -117,7 +121,11 @@ contains
integer(psb_ipk_) :: info integer(psb_ipk_) :: info
if (present(mold)) then if (present(mold)) then
#ifdef HAVE_MOLD
allocate(x%v,stat=info,mold=mold) allocate(x%v,stat=info,mold=mold)
#else
call mold%mold(x%v,info)
#endif
else else
allocate(psb_c_base_vect_type :: x%v,stat=info) allocate(psb_c_base_vect_type :: x%v,stat=info)
endif endif
@ -411,7 +419,11 @@ contains
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
if (present(mold)) then if (present(mold)) then
#ifdef HAVE_MOLD
allocate(x%v,stat=info,mold=mold) allocate(x%v,stat=info,mold=mold)
#else
call mold%mold(x%v,info)
#endif
else else
allocate(psb_c_base_vect_type :: x%v,stat=info) allocate(psb_c_base_vect_type :: x%v,stat=info)
endif endif
@ -531,7 +543,11 @@ contains
complex(psb_spk_), allocatable :: invect(:) complex(psb_spk_), allocatable :: invect(:)
integer(psb_ipk_) :: info integer(psb_ipk_) :: info
#ifdef HAVE_MOLD
allocate(tmp,stat=info,mold=mold) allocate(tmp,stat=info,mold=mold)
#else
call mold%mold(tmp,info)
#endif
call x%v%sync() call x%v%sync()
if (info == psb_success_) call tmp%bld(x%v%v) if (info == psb_success_) call tmp%bld(x%v%v)
call x%v%free(info) call x%v%free(info)

@ -0,0 +1,213 @@
!!$
!!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$
!!$ 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.
!!$
!!$
module psb_cd_tools_mod
use psb_const_mod
use psb_descriptor_type
use psb_gen_block_map_mod
use psb_list_map_mod
use psb_glist_map_mod
use psb_hash_map_mod
use psb_repl_map_mod
interface psb_cd_set_bld
subroutine psb_cd_set_bld(desc,info)
import :: psb_ipk_, psb_desc_type
type(psb_desc_type), intent(inout) :: desc
integer(psb_ipk_) :: info
end subroutine psb_cd_set_bld
end interface
interface psb_cd_set_ovl_bld
subroutine psb_cd_set_ovl_bld(desc,info)
import :: psb_ipk_, psb_desc_type
type(psb_desc_type), intent(inout) :: desc
integer(psb_ipk_) :: info
end subroutine psb_cd_set_ovl_bld
end interface
interface psb_cd_reinit
Subroutine psb_cd_reinit(desc,info)
import :: psb_ipk_, psb_desc_type
Implicit None
! .. Array Arguments ..
Type(psb_desc_type), Intent(inout) :: desc
integer(psb_ipk_), intent(out) :: info
end Subroutine psb_cd_reinit
end interface
interface psb_cdcpy
subroutine psb_cdcpy(desc_in, desc_out, info)
import :: psb_ipk_, psb_desc_type
implicit none
!....parameters...
type(psb_desc_type), intent(in) :: desc_in
type(psb_desc_type), intent(out) :: desc_out
integer(psb_ipk_), intent(out) :: info
end subroutine psb_cdcpy
end interface
interface psb_cdprt
subroutine psb_cdprt(iout,desc_p,glob,short)
import :: psb_ipk_, psb_desc_type
implicit none
type(psb_desc_type), intent(in) :: desc_p
integer(psb_ipk_), intent(in) :: iout
logical, intent(in), optional :: glob,short
end subroutine psb_cdprt
end interface
interface psb_cdins
subroutine psb_cdinsrc(nz,ia,ja,desc_a,info,ila,jla)
import :: psb_ipk_, psb_desc_type
type(psb_desc_type), intent(inout) :: desc_a
integer(psb_ipk_), intent(in) :: nz,ia(:),ja(:)
integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), optional, intent(out) :: ila(:), jla(:)
end subroutine psb_cdinsrc
subroutine psb_cdinsc(nz,ja,desc,info,jla,mask,lidx)
import :: psb_ipk_, psb_desc_type
type(psb_desc_type), intent(inout) :: desc
integer(psb_ipk_), intent(in) :: nz,ja(:)
integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), optional, intent(out) :: jla(:)
logical, optional, target, intent(in) :: mask(:)
integer(psb_ipk_), intent(in), optional :: lidx(:)
end subroutine psb_cdinsc
end interface
interface psb_cdbldext
Subroutine psb_cd_lstext(desc_a,in_list,desc_ov,info, mask,extype)
import :: psb_ipk_, psb_desc_type
Implicit None
Type(psb_desc_type), Intent(in), target :: desc_a
integer(psb_ipk_), intent(in) :: in_list(:)
Type(psb_desc_type), Intent(out) :: desc_ov
integer(psb_ipk_), intent(out) :: info
logical, intent(in), optional, target :: mask(:)
integer(psb_ipk_), intent(in),optional :: extype
end Subroutine psb_cd_lstext
end interface
interface psb_cdren
subroutine psb_cdren(trans,iperm,desc_a,info)
import :: psb_ipk_, psb_desc_type
type(psb_desc_type), intent(inout) :: desc_a
integer(psb_ipk_), intent(inout) :: iperm(:)
character, intent(in) :: trans
integer(psb_ipk_), intent(out) :: info
end subroutine psb_cdren
end interface
interface psb_get_overlap
subroutine psb_get_ovrlap(ovrel,desc,info)
import :: psb_ipk_, psb_desc_type
implicit none
integer(psb_ipk_), allocatable, intent(out) :: ovrel(:)
type(psb_desc_type), intent(in) :: desc
integer(psb_ipk_), intent(out) :: info
end subroutine psb_get_ovrlap
end interface
interface psb_icdasb
subroutine psb_icdasb(desc,info,ext_hv)
import :: psb_ipk_, psb_desc_type
Type(psb_desc_type), intent(inout) :: desc
integer(psb_ipk_), intent(out) :: info
logical, intent(in),optional :: ext_hv
end subroutine psb_icdasb
end interface
interface psb_cdall
subroutine psb_cdall(ictxt, desc, info,mg,ng,parts,vg,vl,flag,nl,repl,&
& globalcheck,lidx)
import :: psb_ipk_, psb_desc_type, psb_parts
implicit None
procedure(psb_parts) :: parts
integer(psb_ipk_), intent(in) :: mg,ng,ictxt, vg(:), vl(:),nl,lidx(:)
integer(psb_ipk_), intent(in) :: flag
logical, intent(in) :: repl, globalcheck
integer(psb_ipk_), intent(out) :: info
type(psb_desc_type), intent(out) :: desc
optional :: mg,ng,parts,vg,vl,flag,nl,repl, globalcheck,lidx
end subroutine psb_cdall
end interface
interface psb_cdasb
module procedure psb_cdasb
end interface
interface psb_get_boundary
module procedure psb_get_boundary
end interface
interface
subroutine psb_cd_switch_ovl_indxmap(desc,info)
import :: psb_ipk_, psb_desc_type
implicit None
include 'parts.fh'
type(psb_desc_type), intent(inout) :: desc
integer(psb_ipk_), intent(out) :: info
end subroutine psb_cd_switch_ovl_indxmap
end interface
contains
subroutine psb_get_boundary(bndel,desc,info)
use psi_mod, only : psi_crea_bnd_elem
implicit none
integer(psb_ipk_), allocatable, intent(out) :: bndel(:)
type(psb_desc_type), intent(in) :: desc
integer(psb_ipk_), intent(out) :: info
call psi_crea_bnd_elem(bndel,desc,info)
end subroutine psb_get_boundary
subroutine psb_cdasb(desc,info)
Type(psb_desc_type), intent(inout) :: desc
integer(psb_ipk_), intent(out) :: info
call psb_icdasb(desc,info,ext_hv=.false.)
end subroutine psb_cdasb
end module psb_cd_tools_mod

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -45,14 +45,17 @@ module psb_const_mod
integer, parameter :: longndig=12 integer, parameter :: longndig=12
integer, parameter :: psb_long_int_k_ = selected_int_kind(longndig) integer, parameter :: psb_long_int_k_ = selected_int_kind(longndig)
! This is always a 4-byte integer, for MPI-related stuff ! This is always a 4-byte integer, for MPI-related stuff
integer, parameter :: mpindig=8 integer, parameter :: psb_mpik_ = kind(1)
integer, parameter :: psb_mpik_ = selected_int_kind(mpindig)
! !
! These must be the kind parameter corresponding to MPI_DOUBLE_PRECISION ! These must be the kind parameter corresponding to MPI_DOUBLE_PRECISION
! and MPI_REAL ! and MPI_REAL
! !
integer(psb_ipk_), parameter :: psb_dpk_ = kind(1.d0) integer(psb_mpik_), parameter :: psb_spk_p_ = 6
integer(psb_ipk_), parameter :: psb_spk_ = kind(1.e0) integer(psb_mpik_), parameter :: psb_spk_r_ = 37
integer(psb_mpik_), parameter :: psb_spk_ = selected_real_kind(psb_spk_p_,psb_spk_r_)
integer(psb_mpik_), parameter :: psb_dpk_p_ = 15
integer(psb_mpik_), parameter :: psb_dpk_r_ = 307
integer(psb_mpik_), parameter :: psb_dpk_ = selected_real_kind(psb_dpk_p_,psb_dpk_r_)
integer(psb_ipk_), save :: psb_sizeof_dp, psb_sizeof_sp integer(psb_ipk_), save :: psb_sizeof_dp, psb_sizeof_sp
integer(psb_ipk_), save :: psb_sizeof_int, psb_sizeof_long_int integer(psb_ipk_), save :: psb_sizeof_int, psb_sizeof_long_int
! !
@ -61,6 +64,10 @@ module psb_const_mod
integer(psb_mpik_), save :: psb_mpi_ipk_integer integer(psb_mpik_), save :: psb_mpi_ipk_integer
integer(psb_mpik_), save :: psb_mpi_def_integer integer(psb_mpik_), save :: psb_mpi_def_integer
integer(psb_mpik_), save :: psb_mpi_lng_integer integer(psb_mpik_), save :: psb_mpi_lng_integer
integer(psb_mpik_), save :: psb_mpi_r_spk_
integer(psb_mpik_), save :: psb_mpi_r_dpk_
integer(psb_mpik_), save :: psb_mpi_c_spk_
integer(psb_mpik_), save :: psb_mpi_c_dpk_
! !
! Version ! Version
! !
@ -75,14 +82,14 @@ module psb_const_mod
integer(psb_ipk_), parameter :: izero=0, ione=1 integer(psb_ipk_), parameter :: izero=0, ione=1
integer(psb_ipk_), parameter :: itwo=2, ithree=3,mone=-1 integer(psb_ipk_), parameter :: itwo=2, ithree=3,mone=-1
integer(psb_ipk_), parameter :: psb_root_=0 integer(psb_ipk_), parameter :: psb_root_=0
real(psb_spk_), parameter :: szero=0.e0, sone=1.e0 real(psb_spk_), parameter :: szero=0.0_psb_spk_, sone=1.0_psb_spk_
real(psb_dpk_), parameter :: dzero=0.d0, done=1.d0 real(psb_dpk_), parameter :: dzero=0.0_psb_dpk_, done=1.0_psb_dpk_
complex(psb_spk_), parameter :: czero=(0.e0,0.0e0) complex(psb_spk_), parameter :: czero=(0.0_psb_spk_,0.0_psb_spk_)
complex(psb_spk_), parameter :: cone=(1.e0,0.0e0) complex(psb_spk_), parameter :: cone=(1.0_psb_spk_,0.0_psb_spk_)
complex(psb_dpk_), parameter :: zzero=(0.d0,0.0d0) complex(psb_dpk_), parameter :: zzero=(0.0_psb_dpk_,0.0_psb_dpk_)
complex(psb_dpk_), parameter :: zone=(1.d0,0.0d0) complex(psb_dpk_), parameter :: zone=(1.0_psb_dpk_,0.0_psb_dpk_)
real(psb_dpk_), parameter :: d_epstol=1.1d-16 ! Unit roundoff. real(psb_dpk_), parameter :: d_epstol=1.1e-16_psb_dpk_ ! Unit roundoff.
real(psb_spk_), parameter :: s_epstol=5.e-8 ! Is this right? real(psb_spk_), parameter :: s_epstol=5.e-8_psb_spk_ ! Is this right?
character, parameter :: psb_all_='A', psb_topdef_=' ' character, parameter :: psb_all_='A', psb_topdef_=' '
logical, parameter :: psb_i_is_complex_ = .false. logical, parameter :: psb_i_is_complex_ = .false.
logical, parameter :: psb_s_is_complex_ = .false. logical, parameter :: psb_s_is_complex_ = .false.

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -68,6 +68,7 @@ module psb_d_base_vect_mod
procedure, pass(x) :: bld_n => d_base_bld_n procedure, pass(x) :: bld_n => d_base_bld_n
generic, public :: bld => bld_x, bld_n generic, public :: bld => bld_x, bld_n
procedure, pass(x) :: all => d_base_all procedure, pass(x) :: all => d_base_all
procedure, pass(x) :: mold => d_base_mold
! !
! Insert/set. Assembly and free. ! Insert/set. Assembly and free.
! Assembly does almost nothing here, but is important ! Assembly does almost nothing here, but is important
@ -219,6 +220,18 @@ contains
end subroutine d_base_all end subroutine d_base_all
subroutine d_base_mold(x, y, info)
use psi_serial_mod
use psb_realloc_mod
implicit none
class(psb_d_base_vect_type), intent(in) :: x
class(psb_d_base_vect_type), intent(out), allocatable :: y
integer(psb_ipk_), intent(out) :: info
allocate(psb_d_base_vect_type :: y, stat=info)
end subroutine d_base_mold
! !
! Insert a bunch of values at specified positions. ! Insert a bunch of values at specified positions.
! !

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -57,7 +57,7 @@ module psb_d_comm_mod
real(psb_dpk_), intent(inout), optional, target :: work(:) real(psb_dpk_), intent(inout), optional, target :: work(:)
integer(psb_ipk_), intent(in), optional :: update,mode integer(psb_ipk_), intent(in), optional :: update,mode
end subroutine psb_dovrl_vect end subroutine psb_dovrl_vect
end interface end interface psb_ovrl
interface psb_halo interface psb_halo
subroutine psb_dhalom(x,desc_a,info,alpha,jx,ik,work,tran,mode,data) subroutine psb_dhalom(x,desc_a,info,alpha,jx,ik,work,tran,mode,data)
@ -91,7 +91,7 @@ module psb_d_comm_mod
integer(psb_ipk_), intent(in), optional :: mode,data integer(psb_ipk_), intent(in), optional :: mode,data
character, intent(in), optional :: tran character, intent(in), optional :: tran
end subroutine psb_dhalo_vect end subroutine psb_dhalo_vect
end interface end interface psb_halo
interface psb_scatter interface psb_scatter
@ -111,7 +111,7 @@ module psb_d_comm_mod
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: root integer(psb_ipk_), intent(in), optional :: root
end subroutine psb_dscatterv end subroutine psb_dscatterv
end interface end interface psb_scatter
interface psb_gather interface psb_gather
subroutine psb_dsp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keeploc) subroutine psb_dsp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keeploc)
@ -128,7 +128,7 @@ module psb_d_comm_mod
subroutine psb_dgatherm(globx, locx, desc_a, info, root) subroutine psb_dgatherm(globx, locx, desc_a, info, root)
use psb_descriptor_type use psb_descriptor_type
real(psb_dpk_), intent(in) :: locx(:,:) real(psb_dpk_), intent(in) :: locx(:,:)
real(psb_dpk_), intent(out) :: globx(:,:) real(psb_dpk_), intent(out), allocatable :: globx(:,:)
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: root integer(psb_ipk_), intent(in), optional :: root
@ -136,7 +136,7 @@ module psb_d_comm_mod
subroutine psb_dgatherv(globx, locx, desc_a, info, root) subroutine psb_dgatherv(globx, locx, desc_a, info, root)
use psb_descriptor_type use psb_descriptor_type
real(psb_dpk_), intent(in) :: locx(:) real(psb_dpk_), intent(in) :: locx(:)
real(psb_dpk_), intent(out) :: globx(:) real(psb_dpk_), intent(out), allocatable :: globx(:)
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: root integer(psb_ipk_), intent(in), optional :: root
@ -145,11 +145,11 @@ module psb_d_comm_mod
use psb_descriptor_type use psb_descriptor_type
use psb_d_vect_mod use psb_d_vect_mod
type(psb_d_vect_type), intent(inout) :: locx type(psb_d_vect_type), intent(inout) :: locx
real(psb_dpk_), intent(out) :: globx(:) real(psb_dpk_), intent(out), allocatable :: globx(:)
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: root integer(psb_ipk_), intent(in), optional :: root
end subroutine psb_dgather_vect end subroutine psb_dgather_vect
end interface end interface psb_gather
end module psb_d_comm_mod end module psb_d_comm_mod

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -551,15 +551,11 @@ contains
class(psb_d_csc_sparse_mat), intent(in) :: a class(psb_d_csc_sparse_mat), intent(in) :: a
integer(psb_ipk_) :: res integer(psb_ipk_) :: res
res = 0 res = -1
if (allocated(a%ia)) then if (allocated(a%ia)) then
if (res >= 0) then
res = min(res,size(a%ia))
else
res = size(a%ia) res = size(a%ia)
end if end if
end if
if (allocated(a%val)) then if (allocated(a%val)) then
if (res >= 0) then if (res >= 0) then
res = min(res,size(a%val)) res = min(res,size(a%val))

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -554,15 +554,11 @@ contains
class(psb_d_csr_sparse_mat), intent(in) :: a class(psb_d_csr_sparse_mat), intent(in) :: a
integer(psb_ipk_) :: res integer(psb_ipk_) :: res
res = 0 res = -1
if (allocated(a%ja)) then if (allocated(a%ja)) then
if (res >= 0) then
res = min(res,size(a%ja))
else
res = size(a%ja) res = size(a%ja)
end if end if
end if
if (allocated(a%val)) then if (allocated(a%val)) then
if (res >= 0) then if (res >= 0) then
res = min(res,size(a%val)) res = min(res,size(a%val))

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -167,7 +167,7 @@ Module psb_d_tools_mod
interface psb_geins interface psb_geins
subroutine psb_dinsi(m,irw,val, x, desc_a,info,dupl) subroutine psb_dinsi(m,irw,val, x, desc_a,info,dupl,local)
import :: psb_desc_type, psb_dpk_, psb_ipk_, & import :: psb_desc_type, psb_dpk_, psb_ipk_, &
& psb_d_base_vect_type, psb_d_vect_type, & & psb_d_base_vect_type, psb_d_vect_type, &
& psb_dspmat_type, psb_d_base_sparse_mat & psb_dspmat_type, psb_d_base_sparse_mat
@ -178,8 +178,9 @@ Module psb_d_tools_mod
real(psb_dpk_), intent(in) :: val(:,:) real(psb_dpk_), intent(in) :: val(:,:)
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), optional, intent(in) :: dupl integer(psb_ipk_), optional, intent(in) :: dupl
logical, intent(in), optional :: local
end subroutine psb_dinsi end subroutine psb_dinsi
subroutine psb_dinsvi(m, irw,val, x,desc_a,info,dupl) subroutine psb_dinsvi(m, irw,val, x,desc_a,info,dupl,local)
import :: psb_desc_type, psb_dpk_, psb_ipk_, & import :: psb_desc_type, psb_dpk_, psb_ipk_, &
& psb_d_base_vect_type, psb_d_vect_type, & & psb_d_base_vect_type, psb_d_vect_type, &
& psb_dspmat_type, psb_d_base_sparse_mat & psb_dspmat_type, psb_d_base_sparse_mat
@ -190,8 +191,9 @@ Module psb_d_tools_mod
real(psb_dpk_), intent(in) :: val(:) real(psb_dpk_), intent(in) :: val(:)
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), optional, intent(in) :: dupl integer(psb_ipk_), optional, intent(in) :: dupl
logical, intent(in), optional :: local
end subroutine psb_dinsvi end subroutine psb_dinsvi
subroutine psb_dins_vect(m,irw,val,x,desc_a,info,dupl) subroutine psb_dins_vect(m,irw,val,x,desc_a,info,dupl,local)
import :: psb_desc_type, psb_dpk_, psb_ipk_, & import :: psb_desc_type, psb_dpk_, psb_ipk_, &
& psb_d_base_vect_type, psb_d_vect_type, & & psb_d_base_vect_type, psb_d_vect_type, &
& psb_dspmat_type, psb_d_base_sparse_mat & psb_dspmat_type, psb_d_base_sparse_mat
@ -202,8 +204,9 @@ Module psb_d_tools_mod
real(psb_dpk_), intent(in) :: val(:) real(psb_dpk_), intent(in) :: val(:)
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), optional, intent(in) :: dupl integer(psb_ipk_), optional, intent(in) :: dupl
logical, intent(in), optional :: local
end subroutine psb_dins_vect end subroutine psb_dins_vect
subroutine psb_dins_vect_r2(m,irw,val,x,desc_a,info,dupl) subroutine psb_dins_vect_r2(m,irw,val,x,desc_a,info,dupl,local)
import :: psb_desc_type, psb_dpk_, psb_ipk_, & import :: psb_desc_type, psb_dpk_, psb_ipk_, &
& psb_d_base_vect_type, psb_d_vect_type, & & psb_d_base_vect_type, psb_d_vect_type, &
& psb_dspmat_type, psb_d_base_sparse_mat & psb_dspmat_type, psb_d_base_sparse_mat
@ -214,6 +217,7 @@ Module psb_d_tools_mod
real(psb_dpk_), intent(in) :: val(:,:) real(psb_dpk_), intent(in) :: val(:,:)
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), optional, intent(in) :: dupl integer(psb_ipk_), optional, intent(in) :: dupl
logical, intent(in), optional :: local
end subroutine psb_dins_vect_r2 end subroutine psb_dins_vect_r2
end interface end interface
@ -270,7 +274,7 @@ Module psb_d_tools_mod
interface psb_spins interface psb_spins
subroutine psb_dspins(nz,ia,ja,val,a,desc_a,info,rebuild) subroutine psb_dspins(nz,ia,ja,val,a,desc_a,info,rebuild,local)
import :: psb_desc_type, psb_dpk_, psb_ipk_, & import :: psb_desc_type, psb_dpk_, psb_ipk_, &
& psb_d_base_vect_type, psb_d_vect_type, & & psb_d_base_vect_type, psb_d_vect_type, &
& psb_dspmat_type, psb_d_base_sparse_mat & psb_dspmat_type, psb_d_base_sparse_mat
@ -280,6 +284,7 @@ Module psb_d_tools_mod
real(psb_dpk_), intent(in) :: val(:) real(psb_dpk_), intent(in) :: val(:)
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
logical, intent(in), optional :: rebuild logical, intent(in), optional :: rebuild
logical, intent(in), optional :: local
end subroutine psb_dspins end subroutine psb_dspins
subroutine psb_dspins_2desc(nz,ia,ja,val,a,desc_ar,desc_ac,info) subroutine psb_dspins_2desc(nz,ia,ja,val,a,desc_ar,desc_ac,info)
import :: psb_desc_type, psb_dpk_, psb_ipk_, & import :: psb_desc_type, psb_dpk_, psb_ipk_, &

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -100,7 +100,11 @@ contains
integer(psb_ipk_) :: info integer(psb_ipk_) :: info
if (present(mold)) then if (present(mold)) then
#ifdef HAVE_MOLD
allocate(x%v,stat=info,mold=mold) allocate(x%v,stat=info,mold=mold)
#else
call mold%mold(x%v,info)
#endif
else else
allocate(psb_d_base_vect_type :: x%v,stat=info) allocate(psb_d_base_vect_type :: x%v,stat=info)
endif endif
@ -117,7 +121,11 @@ contains
integer(psb_ipk_) :: info integer(psb_ipk_) :: info
if (present(mold)) then if (present(mold)) then
#ifdef HAVE_MOLD
allocate(x%v,stat=info,mold=mold) allocate(x%v,stat=info,mold=mold)
#else
call mold%mold(x%v,info)
#endif
else else
allocate(psb_d_base_vect_type :: x%v,stat=info) allocate(psb_d_base_vect_type :: x%v,stat=info)
endif endif
@ -411,7 +419,11 @@ contains
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
if (present(mold)) then if (present(mold)) then
#ifdef HAVE_MOLD
allocate(x%v,stat=info,mold=mold) allocate(x%v,stat=info,mold=mold)
#else
call mold%mold(x%v,info)
#endif
else else
allocate(psb_d_base_vect_type :: x%v,stat=info) allocate(psb_d_base_vect_type :: x%v,stat=info)
endif endif
@ -531,7 +543,11 @@ contains
real(psb_dpk_), allocatable :: invect(:) real(psb_dpk_), allocatable :: invect(:)
integer(psb_ipk_) :: info integer(psb_ipk_) :: info
#ifdef HAVE_MOLD
allocate(tmp,stat=info,mold=mold) allocate(tmp,stat=info,mold=mold)
#else
call mold%mold(tmp,info)
#endif
call x%v%sync() call x%v%sync()
if (info == psb_success_) call tmp%bld(x%v%v) if (info == psb_success_) call tmp%bld(x%v%v)
call x%v%free(info) call x%v%free(info)

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -229,6 +229,7 @@ module psb_descriptor_type
procedure, pass(desc) :: get_list => psb_cd_get_list procedure, pass(desc) :: get_list => psb_cd_get_list
procedure, pass(desc) :: sizeof => psb_cd_sizeof procedure, pass(desc) :: sizeof => psb_cd_sizeof
procedure, pass(desc) :: free => psb_cdfree procedure, pass(desc) :: free => psb_cdfree
procedure, pass(desc) :: destroy => psb_cd_destroy
procedure, pass(desc) :: nullify => nullify_desc procedure, pass(desc) :: nullify => nullify_desc
end type psb_desc_type end type psb_desc_type
@ -632,120 +633,78 @@ contains
integer(psb_ipk_) :: ictxt,np,me, err_act integer(psb_ipk_) :: ictxt,np,me, err_act
character(len=20) :: name character(len=20) :: name
if(psb_get_errstatus() /= 0) return
info=psb_success_ info=psb_success_
call psb_erractionsave(err_act) call psb_erractionsave(err_act)
name = 'psb_cdfree' name = 'psb_cdfree'
call desc%destroy()
ictxt=psb_cd_get_context(desc) call psb_erractionrestore(err_act)
return
call psb_info(ictxt, me, np)
! ....verify blacs grid correctness..
if (np == -1) then
info = psb_err_context_error_
call psb_errpush(info,name)
goto 9999
endif
if (.not.allocated(desc%halo_index)) then
info=298
call psb_errpush(info,name)
goto 9999
end if
!deallocate halo_index field 9999 continue
deallocate(desc%halo_index,stat=info) call psb_erractionrestore(err_act)
if (info /= psb_success_) then
info=2053
call psb_errpush(info,name)
goto 9999
end if
if (.not.allocated(desc%bnd_elem)) then if (err_act == psb_act_ret_) then
!!$ info=296 return
!!$ call psb_errpush(info,name)
!!$ goto 9999
!!$ end if
else else
!deallocate halo_index field if (ictxt == -1) then
deallocate(desc%bnd_elem,stat=info) call psb_error()
if (info /= psb_success_) then else
info=2054 call psb_error(ictxt)
call psb_errpush(info,name)
goto 9999
end if end if
end if end if
return
if (.not.allocated(desc%ovrlap_index)) then end subroutine psb_cdfree
info=299
call psb_errpush(info,name)
goto 9999
end if
!deallocate ovrlap_index field !
deallocate(desc%ovrlap_index,stat=info) ! Subroutine: psb_cdfree
if (info /= psb_success_) then ! Frees a descriptor data structure.
info=2055 !
call psb_errpush(info,name) ! Arguments:
goto 9999 ! desc_a - type(psb_desc_type). The communication descriptor to be freed.
end if subroutine psb_cd_destroy(desc)
!...free descriptor structure...
use psb_const_mod
use psb_error_mod
use psb_penv_mod
implicit none
!....parameters...
class(psb_desc_type), intent(inout) :: desc
!...locals....
integer(psb_ipk_) :: info
!deallocate ovrlap_elem field
deallocate(desc%ovrlap_elem,stat=info)
if (info /= psb_success_) then
info=2056
call psb_errpush(info,name)
goto 9999
end if
!deallocate ovrlap_index field if (allocated(desc%halo_index)) &
deallocate(desc%ovr_mst_idx,stat=info) & deallocate(desc%halo_index,stat=info)
if (info /= psb_success_) then
info=2055 if (allocated(desc%bnd_elem)) &
call psb_errpush(info,name) & deallocate(desc%bnd_elem,stat=info)
goto 9999
end if
if (allocated(desc%ovrlap_index)) &
& deallocate(desc%ovrlap_index,stat=info)
if (allocated(desc%ovrlap_elem)) &
& deallocate(desc%ovrlap_elem,stat=info)
if (allocated(desc%ovr_mst_idx)) &
& deallocate(desc%ovr_mst_idx,stat=info)
if (allocated(desc%lprm)) & if (allocated(desc%lprm)) &
& deallocate(desc%lprm,stat=info) & deallocate(desc%lprm,stat=info)
if (info /= psb_success_) then if (allocated(desc%idx_space)) &
info=2057 & deallocate(desc%idx_space,stat=info)
call psb_errpush(info,name)
goto 9999
end if
if (allocated(desc%indxmap)) then if (allocated(desc%indxmap)) then
call desc%indxmap%free() call desc%indxmap%free()
deallocate(desc%indxmap, stat=info) deallocate(desc%indxmap, stat=info)
end if end if
if (allocated(desc%idx_space)) then
deallocate(desc%idx_space,stat=info)
if (info /= psb_success_) then
info=2056
call psb_errpush(info,name)
goto 9999
end if
end if
call desc%nullify() call desc%nullify()
call psb_erractionrestore(err_act)
return return
9999 continue end subroutine psb_cd_destroy
call psb_erractionrestore(err_act)
if (err_act == psb_act_ret_) then
return
else
call psb_error(ictxt)
end if
return
end subroutine psb_cdfree
! !
! Subroutine: psb_cdtransfer ! Subroutine: psb_cdtransfer
! Transfers data and allocation from in to out; behaves like MOVE_ALLOC, i.e. ! Transfers data and allocation from in to out; behaves like MOVE_ALLOC, i.e.
@ -782,11 +741,13 @@ contains
name = 'psb_cdtransfer' name = 'psb_cdtransfer'
debug_unit = psb_get_debug_unit() debug_unit = psb_get_debug_unit()
debug_level = psb_get_debug_level() debug_level = psb_get_debug_level()
!
! Note: this might be called even
! when desc_in is empty.
!
if (desc_in%is_valid()) then
ictxt = psb_cd_get_context(desc_in) ictxt = psb_cd_get_context(desc_in)
call psb_info(ictxt,me,np) call psb_info(ictxt,me,np)
! Should not require ictxt to be present: this
! function might be called even when desc_in is
! empty.
if (info == psb_success_) & if (info == psb_success_) &
& call psb_move_alloc( desc_in%halo_index , desc_out%halo_index , info) & call psb_move_alloc( desc_in%halo_index , desc_out%halo_index , info)
@ -813,6 +774,10 @@ contains
endif endif
if (debug_level >= psb_debug_ext_) & if (debug_level >= psb_debug_ext_) &
& write(debug_unit,*) me,' ',trim(name),': end' & write(debug_unit,*) me,' ',trim(name),': end'
else
call desc_out%free(info)
end if
call desc_in%free(info)
call psb_erractionrestore(err_act) call psb_erractionrestore(err_act)
return return

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -144,7 +144,7 @@ contains
end if end if
idxv(1) = idx idxv(1) = idx
call idxmap%l2g(idxv,info,owned=owned) call idxmap%l2gip(idxv,info,owned=owned)
idx = idxv(1) idx = idxv(1)
end subroutine block_l2gs1 end subroutine block_l2gs1
@ -159,7 +159,7 @@ contains
logical, intent(in), optional :: owned logical, intent(in), optional :: owned
idxout = idxin idxout = idxin
call idxmap%l2g(idxout,info,mask,owned) call idxmap%l2gip(idxout,info,mask,owned)
end subroutine block_l2gs2 end subroutine block_l2gs2
@ -234,7 +234,7 @@ contains
is = size(idxin) is = size(idxin)
im = min(is,size(idxout)) im = min(is,size(idxout))
idxout(1:im) = idxin(1:im) idxout(1:im) = idxin(1:im)
call idxmap%l2g(idxout(1:im),info,mask,owned) call idxmap%l2gip(idxout(1:im),info,mask,owned)
if (is > im) then if (is > im) then
info = -3 info = -3
end if end if
@ -257,7 +257,7 @@ contains
end if end if
idxv(1) = idx idxv(1) = idx
call idxmap%g2l(idxv,info,owned=owned) call idxmap%g2lip(idxv,info,owned=owned)
idx = idxv(1) idx = idxv(1)
end subroutine block_g2ls1 end subroutine block_g2ls1
@ -272,7 +272,7 @@ contains
logical, intent(in), optional :: owned logical, intent(in), optional :: owned
idxout = idxin idxout = idxin
call idxmap%g2l(idxout,info,mask,owned) call idxmap%g2lip(idxout,info,mask,owned)
end subroutine block_g2ls2 end subroutine block_g2ls2
@ -399,14 +399,14 @@ contains
is = size(idxin) is = size(idxin)
im = min(is,size(idxout)) im = min(is,size(idxout))
idxout(1:im) = idxin(1:im) idxout(1:im) = idxin(1:im)
call idxmap%g2l(idxout(1:im),info,mask,owned) call idxmap%g2lip(idxout(1:im),info,mask,owned)
if (is > im) info = -3 if (is > im) info = -3
end subroutine block_g2lv2 end subroutine block_g2lv2
subroutine block_g2ls1_ins(idx,idxmap,info,mask) subroutine block_g2ls1_ins(idx,idxmap,info,mask, lidx)
use psb_realloc_mod use psb_realloc_mod
use psb_sort_mod use psb_sort_mod
implicit none implicit none
@ -414,34 +414,41 @@ contains
integer(psb_ipk_), intent(inout) :: idx integer(psb_ipk_), intent(inout) :: idx
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
logical, intent(in), optional :: mask logical, intent(in), optional :: mask
integer, intent(in), optional :: lidx
integer(psb_ipk_) :: idxv(1) integer(psb_ipk_) :: idxv(1), lidxv(1)
info = 0 info = 0
if (present(mask)) then if (present(mask)) then
if (.not.mask) return if (.not.mask) return
end if end if
idxv(1) = idx idxv(1) = idx
call idxmap%g2l_ins(idxv,info) if (present(lidx)) then
lidxv(1) = lidx
call idxmap%g2lip_ins(idxv,info,lidx=lidxv)
else
call idxmap%g2lip_ins(idxv,info)
end if
idx = idxv(1) idx = idxv(1)
end subroutine block_g2ls1_ins end subroutine block_g2ls1_ins
subroutine block_g2ls2_ins(idxin,idxout,idxmap,info,mask) subroutine block_g2ls2_ins(idxin,idxout,idxmap,info,mask,lidx)
implicit none implicit none
class(psb_gen_block_map), intent(inout) :: idxmap class(psb_gen_block_map), intent(inout) :: idxmap
integer(psb_ipk_), intent(in) :: idxin integer(psb_ipk_), intent(in) :: idxin
integer(psb_ipk_), intent(out) :: idxout integer(psb_ipk_), intent(out) :: idxout
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
logical, intent(in), optional :: mask logical, intent(in), optional :: mask
integer, intent(in), optional :: lidx
idxout = idxin idxout = idxin
call idxmap%g2l_ins(idxout,info) call idxmap%g2lip_ins(idxout,info,mask=mask,lidx=lidx)
end subroutine block_g2ls2_ins end subroutine block_g2ls2_ins
subroutine block_g2lv1_ins(idx,idxmap,info,mask) subroutine block_g2lv1_ins(idx,idxmap,info,mask,lidx)
use psb_realloc_mod use psb_realloc_mod
use psb_sort_mod use psb_sort_mod
implicit none implicit none
@ -449,6 +456,8 @@ contains
integer(psb_ipk_), intent(inout) :: idx(:) integer(psb_ipk_), intent(inout) :: idx(:)
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
logical, intent(in), optional :: mask(:) logical, intent(in), optional :: mask(:)
integer, intent(in), optional :: lidx(:)
integer(psb_ipk_) :: i, nv, is, ix integer(psb_ipk_) :: i, nv, is, ix
integer(psb_ipk_) :: ip, lip, nxt integer(psb_ipk_) :: ip, lip, nxt
@ -462,6 +471,12 @@ contains
return return
end if end if
end if end if
if (present(lidx)) then
if (size(lidx) < size(idx)) then
info = -1
return
end if
end if
if (idxmap%is_asb()) then if (idxmap%is_asb()) then
@ -471,6 +486,87 @@ contains
else if (idxmap%is_valid()) then else if (idxmap%is_valid()) then
if (present(lidx)) then
if (present(mask)) then
do i=1, is
if (mask(i)) then
if ((idxmap%min_glob_row <= idx(i)).and.(idx(i) <= idxmap%max_glob_row)) then
idx(i) = idx(i) - idxmap%min_glob_row + 1
else if ((1<= idx(i)).and.(idx(i) <= idxmap%global_rows)) then
if (lidx(i) <= idxmap%local_rows) then
info = -5
return
end if
nxt = lidx(i)-idxmap%local_rows
ip = idx(i)
call psb_hash_searchinskey(ip,lip,nxt,idxmap%hash,info)
if (info >= 0) then
if (lip == nxt) then
! We have added one item
call psb_ensure_size(nxt,idxmap%loc_to_glob,info,addsz=laddsz)
if (info /= 0) then
info = -4
return
end if
idxmap%local_cols = max(lidx(i),idxmap%local_cols)
idxmap%loc_to_glob(nxt) = idx(i)
end if
info = psb_success_
else
info = -5
return
end if
idx(i) = lip + idxmap%local_rows
else
idx(i) = -1
info = -1
end if
end if
end do
else if (.not.present(mask)) then
do i=1, is
if ((idxmap%min_glob_row <= idx(i)).and.(idx(i) <= idxmap%max_glob_row)) then
idx(i) = idx(i) - idxmap%min_glob_row + 1
else if ((1<= idx(i)).and.(idx(i) <= idxmap%global_rows)) then
if (lidx(i) <= idxmap%local_rows) then
info = -5
return
end if
nxt = lidx(i)-idxmap%local_rows
ip = idx(i)
call psb_hash_searchinskey(ip,lip,nxt,idxmap%hash,info)
if (info >= 0) then
if (lip == nxt) then
! We have added one item
call psb_ensure_size(nxt,idxmap%loc_to_glob,info,addsz=laddsz)
if (info /= 0) then
info = -4
return
end if
idxmap%local_cols = max(lidx(i),idxmap%local_cols)
idxmap%loc_to_glob(nxt) = idx(i)
end if
info = psb_success_
else
info = -5
return
end if
idx(i) = lip + idxmap%local_rows
else
idx(i) = -1
info = -1
end if
end do
end if
else if (.not.present(lidx)) then
if (present(mask)) then if (present(mask)) then
do i=1, is do i=1, is
if (mask(i)) then if (mask(i)) then
@ -540,6 +636,7 @@ contains
end if end if
end do end do
end if end if
end if
else else
idx = -1 idx = -1
@ -548,19 +645,21 @@ contains
end subroutine block_g2lv1_ins end subroutine block_g2lv1_ins
subroutine block_g2lv2_ins(idxin,idxout,idxmap,info,mask) subroutine block_g2lv2_ins(idxin,idxout,idxmap,info,mask,lidx)
implicit none implicit none
class(psb_gen_block_map), intent(inout) :: idxmap class(psb_gen_block_map), intent(inout) :: idxmap
integer(psb_ipk_), intent(in) :: idxin(:) integer(psb_ipk_), intent(in) :: idxin(:)
integer(psb_ipk_), intent(out) :: idxout(:) integer(psb_ipk_), intent(out) :: idxout(:)
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
logical, intent(in), optional :: mask(:) logical, intent(in), optional :: mask(:)
integer, intent(in), optional :: lidx(:)
integer(psb_ipk_) :: is, im integer(psb_ipk_) :: is, im
is = size(idxin) is = size(idxin)
im = min(is,size(idxout)) im = min(is,size(idxout))
idxout(1:im) = idxin(1:im) idxout(1:im) = idxin(1:im)
call idxmap%g2l_ins(idxout(1:im),info,mask) call idxmap%g2lip_ins(idxout(1:im),info,mask=mask,lidx=lidx)
if (is > im) then if (is > im) then
!!$ write(0,*) 'g2lv2_ins err -3' !!$ write(0,*) 'g2lv2_ins err -3'
info = -3 info = -3

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -167,7 +167,7 @@ contains
end if end if
idxv(1) = idx idxv(1) = idx
call idxmap%l2g(idxv,info,owned=owned) call idxmap%l2gip(idxv,info,owned=owned)
idx = idxv(1) idx = idxv(1)
end subroutine hash_l2gs1 end subroutine hash_l2gs1
@ -182,7 +182,7 @@ contains
logical, intent(in), optional :: owned logical, intent(in), optional :: owned
idxout = idxin idxout = idxin
call idxmap%l2g(idxout,info,mask,owned) call idxmap%l2gip(idxout,info,mask,owned)
end subroutine hash_l2gs2 end subroutine hash_l2gs2
@ -255,7 +255,7 @@ contains
is = size(idxin) is = size(idxin)
im = min(is,size(idxout)) im = min(is,size(idxout))
idxout(1:im) = idxin(1:im) idxout(1:im) = idxin(1:im)
call idxmap%l2g(idxout(1:im),info,mask,owned) call idxmap%l2gip(idxout(1:im),info,mask,owned)
if (is > im) then if (is > im) then
write(0,*) 'l2gv2 err -3' write(0,*) 'l2gv2 err -3'
info = -3 info = -3
@ -279,7 +279,7 @@ contains
end if end if
idxv(1) = idx idxv(1) = idx
call idxmap%g2l(idxv,info,owned=owned) call idxmap%g2lip(idxv,info,owned=owned)
idx = idxv(1) idx = idxv(1)
end subroutine hash_g2ls1 end subroutine hash_g2ls1
@ -294,7 +294,7 @@ contains
logical, intent(in), optional :: owned logical, intent(in), optional :: owned
idxout = idxin idxout = idxin
call idxmap%g2l(idxout,info,mask,owned) call idxmap%g2lip(idxout,info,mask,owned)
end subroutine hash_g2ls2 end subroutine hash_g2ls2
@ -429,7 +429,7 @@ contains
is = size(idxin) is = size(idxin)
im = min(is,size(idxout)) im = min(is,size(idxout))
idxout(1:im) = idxin(1:im) idxout(1:im) = idxin(1:im)
call idxmap%g2l(idxout(1:im),info,mask,owned) call idxmap%g2lip(idxout(1:im),info,mask,owned)
if (is > im) then if (is > im) then
write(0,*) 'g2lv2 err -3' write(0,*) 'g2lv2 err -3'
info = -3 info = -3
@ -439,7 +439,7 @@ contains
subroutine hash_g2ls1_ins(idx,idxmap,info,mask) subroutine hash_g2ls1_ins(idx,idxmap,info,mask,lidx)
use psb_realloc_mod use psb_realloc_mod
use psb_sort_mod use psb_sort_mod
implicit none implicit none
@ -447,34 +447,43 @@ contains
integer(psb_ipk_), intent(inout) :: idx integer(psb_ipk_), intent(inout) :: idx
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
logical, intent(in), optional :: mask logical, intent(in), optional :: mask
integer, intent(in), optional :: lidx
integer(psb_ipk_) :: idxv(1) integer(psb_ipk_) :: idxv(1), lidxv(1)
info = 0 info = 0
if (present(mask)) then if (present(mask)) then
if (.not.mask) return if (.not.mask) return
end if end if
idxv(1) = idx idxv(1) = idx
call idxmap%g2l_ins(idxv,info) if (present(lidx)) then
lidxv(1) = lidx
call idxmap%g2lip_ins(idxv,info,lidx=lidxv)
else
call idxmap%g2lip_ins(idxv,info)
end if
idx = idxv(1) idx = idxv(1)
end subroutine hash_g2ls1_ins end subroutine hash_g2ls1_ins
subroutine hash_g2ls2_ins(idxin,idxout,idxmap,info,mask) subroutine hash_g2ls2_ins(idxin,idxout,idxmap,info,mask,lidx)
implicit none implicit none
class(psb_hash_map), intent(inout) :: idxmap class(psb_hash_map), intent(inout) :: idxmap
integer(psb_ipk_), intent(in) :: idxin integer(psb_ipk_), intent(in) :: idxin
integer(psb_ipk_), intent(out) :: idxout integer(psb_ipk_), intent(out) :: idxout
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
logical, intent(in), optional :: mask logical, intent(in), optional :: mask
integer, intent(in), optional :: lidx
idxout = idxin idxout = idxin
call idxmap%g2l_ins(idxout,info,mask=mask) call idxmap%g2lip_ins(idxout,info,mask=mask,lidx=lidx)
end subroutine hash_g2ls2_ins end subroutine hash_g2ls2_ins
subroutine hash_g2lv1_ins(idx,idxmap,info,mask) subroutine hash_g2lv1_ins(idx,idxmap,info,mask,lidx)
use psb_error_mod use psb_error_mod
use psb_realloc_mod use psb_realloc_mod
use psb_sort_mod use psb_sort_mod
@ -484,6 +493,8 @@ contains
integer(psb_ipk_), intent(inout) :: idx(:) integer(psb_ipk_), intent(inout) :: idx(:)
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
logical, intent(in), optional :: mask(:) logical, intent(in), optional :: mask(:)
integer, intent(in), optional :: lidx(:)
integer(psb_ipk_) :: i, is, mglob, ip, lip, nrow, ncol, & integer(psb_ipk_) :: i, is, mglob, ip, lip, nrow, ncol, &
& nxt, err_act & nxt, err_act
integer(psb_mpik_) :: ictxt, me, np integer(psb_mpik_) :: ictxt, me, np
@ -504,12 +515,113 @@ contains
return return
end if end if
end if end if
if (present(lidx)) then
if (size(lidx) < size(idx)) then
info = -1
return
end if
end if
mglob = idxmap%get_gr() mglob = idxmap%get_gr()
nrow = idxmap%get_lr() nrow = idxmap%get_lr()
if (idxmap%is_bld()) then if (idxmap%is_bld()) then
if (present(lidx)) then
if (present(mask)) then
do i = 1, is
ncol = idxmap%get_lc()
if (mask(i)) then
ip = idx(i)
if ((ip < 1 ).or.(ip>mglob) ) then
idx(i) = -1
cycle
endif
call hash_inner_cnv(ip,lip,idxmap%hashvmask,idxmap%hashv,idxmap%glb_lc,ncol)
if (lip < 0) then
nxt = lidx(i)
if (nxt <= nrow) then
idx(i) = -1
cycle
endif
call psb_hash_searchinskey(ip,lip,nxt,idxmap%hash,info)
if (info >=0) then
if (nxt == lip) then
ncol = max(ncol,nxt)
call psb_ensure_size(ncol,idxmap%loc_to_glob,info,pad=-ione,addsz=laddsz)
if (info /= psb_success_) then
info=1
ch_err='psb_ensure_size'
call psb_errpush(psb_err_from_subroutine_ai_,name,&
&a_err=ch_err,i_err=(/info,izero,izero,izero,izero/))
goto 9999
end if
idxmap%loc_to_glob(nxt) = ip
call idxmap%set_lc(ncol)
endif
info = psb_success_
else
ch_err='SearchInsKeyVal'
call psb_errpush(psb_err_from_subroutine_ai_,name,&
& a_err=ch_err,i_err=(/info,izero,izero,izero,izero/))
goto 9999
end if
end if
idx(i) = lip
info = psb_success_
else
idx(i) = -1
end if
enddo
else if (.not.present(mask)) then
do i = 1, is
ncol = idxmap%get_lc()
ip = idx(i)
if ((ip < 1 ).or.(ip>mglob)) then
idx(i) = -1
cycle
endif
call hash_inner_cnv(ip,lip,idxmap%hashvmask,idxmap%hashv,idxmap%glb_lc,ncol)
if (lip < 0) then
nxt = lidx(i)
if (nxt <= nrow) then
idx(i) = -1
cycle
endif
call psb_hash_searchinskey(ip,lip,nxt,idxmap%hash,info)
if (info >=0) then
if (nxt == lip) then
ncol = max(nxt,ncol)
call psb_ensure_size(ncol,idxmap%loc_to_glob,info,pad=-ione,addsz=laddsz)
if (info /= psb_success_) then
info=1
ch_err='psb_ensure_size'
call psb_errpush(psb_err_from_subroutine_ai_,name,&
&a_err=ch_err,i_err=(/info,izero,izero,izero,izero/))
goto 9999
end if
idxmap%loc_to_glob(nxt) = ip
call idxmap%set_lc(ncol)
endif
info = psb_success_
else
ch_err='SearchInsKeyVal'
call psb_errpush(psb_err_from_subroutine_ai_,name,&
& a_err=ch_err,i_err=(/info,izero,izero,izero,izero/))
goto 9999
end if
end if
idx(i) = lip
info = psb_success_
enddo
end if
else if (.not.present(lidx)) then
if (present(mask)) then if (present(mask)) then
do i = 1, is do i = 1, is
ncol = idxmap%get_lc() ncol = idxmap%get_lc()
@ -552,7 +664,8 @@ contains
end if end if
enddo enddo
else else if (.not.present(mask)) then
do i = 1, is do i = 1, is
ncol = idxmap%get_lc() ncol = idxmap%get_lc()
ip = idx(i) ip = idx(i)
@ -592,7 +705,7 @@ contains
end if end if
end if
else else
! Wrong state ! Wrong state
idx = -1 idx = -1
@ -613,19 +726,21 @@ contains
end subroutine hash_g2lv1_ins end subroutine hash_g2lv1_ins
subroutine hash_g2lv2_ins(idxin,idxout,idxmap,info,mask) subroutine hash_g2lv2_ins(idxin,idxout,idxmap,info,mask,lidx)
implicit none implicit none
class(psb_hash_map), intent(inout) :: idxmap class(psb_hash_map), intent(inout) :: idxmap
integer(psb_ipk_), intent(in) :: idxin(:) integer(psb_ipk_), intent(in) :: idxin(:)
integer(psb_ipk_), intent(out) :: idxout(:) integer(psb_ipk_), intent(out) :: idxout(:)
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
logical, intent(in), optional :: mask(:) logical, intent(in), optional :: mask(:)
integer, intent(in), optional :: lidx(:)
integer(psb_ipk_) :: is, im integer(psb_ipk_) :: is, im
is = size(idxin) is = size(idxin)
im = min(is,size(idxout)) im = min(is,size(idxout))
idxout(1:im) = idxin(1:im) idxout(1:im) = idxin(1:im)
call idxmap%g2l_ins(idxout(1:im),info,mask) call idxmap%g2lip_ins(idxout(1:im),info,mask=mask,lidx=lidx)
if (is > im) then if (is > im) then
write(0,*) 'g2lv2_ins err -3' write(0,*) 'g2lv2_ins err -3'
info = -3 info = -3
@ -646,7 +761,7 @@ contains
! To be implemented ! To be implemented
integer(psb_mpik_) :: iam, np integer(psb_mpik_) :: iam, np
integer(psb_ipk_) :: i, nlu, nl, m, nrt,int_err(5) integer(psb_ipk_) :: i, nlu, nl, m, nrt,int_err(5)
integer(psb_ipk_), allocatable :: vlu(:) integer(psb_ipk_), allocatable :: vlu(:), ix(:)
character(len=20), parameter :: name='hash_map_init_vl' character(len=20), parameter :: name='hash_map_init_vl'
info = 0 info = 0
@ -664,7 +779,7 @@ contains
call psb_sum(ictxt,nrt) call psb_sum(ictxt,nrt)
call psb_max(ictxt,m) call psb_max(ictxt,m)
allocate(vlu(nl), stat=info) allocate(vlu(nl), ix(nl), stat=info)
if (info /= 0) then if (info /= 0) then
info = -1 info = -1
return return
@ -687,16 +802,21 @@ contains
& ' Warning: globalcheck=.false., but there is a mismatch' & ' Warning: globalcheck=.false., but there is a mismatch'
write(psb_err_unit,*) trim(name),& write(psb_err_unit,*) trim(name),&
& ' : in the global sizes!',m,nrt & ' : in the global sizes!',m,nrt
end if end if
!
! Now sort the input items, and check for duplicates call psb_msort(vlu,ix)
! (unlikely, but possible) nlu = 1
! do i=2,nl
call psb_msort_unique(vlu,nlu) if (vlu(i) /= vlu(nlu)) then
if (nlu /= nl) then nlu = nlu + 1
write(0,*) 'Warning: duplicates in input' vlu(nlu) = vlu(i)
ix(nlu) = ix(i)
end if end if
end do
call psb_msort(ix(1:nlu),vlu(1:nlu),flag=psb_sort_keep_idx_)
nlu = nl
call hash_init_vlu(idxmap,ictxt,m,nlu,vlu,info) call hash_init_vlu(idxmap,ictxt,m,nlu,vlu,info)
end subroutine hash_init_vl end subroutine hash_init_vl

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -30,26 +30,28 @@
!!$ !!$
!!$ !!$
! !
! package: psb_hash_mod
!
! This module implements a very simple minded hash table.
! The hash is based on the idea of open addressing with double hashing;
! the primary hash function h1(K) is simply the remainder modulo 2^N, while
! the secondary hash function is 1 if H1(k) == 0, otherwise IOR((2^N-H1(k)),1)
! (See Knuth: TAOCP, Vol. 3, sec. 6.4)
! These hash functions are not very smart; however they are very simple and fast.
! The intended usage of this hash table is to store indices of halo points, which
! are supposed to be few compared to the internal indices (which are stored elsewhere).
! Therefore, either the table has a very low occupancy, and this scheme will work,
! or we have lots more to worry about in parallel performance than the efficiency
! of this hashing scheme.
!
!
! !
module psb_hash_mod module psb_hash_mod
use psb_const_mod use psb_const_mod
! !> \class psb_hash_mod
!! \brief Simple hash module for storing integer keys.
!!
!! This module implements a very simple minded hash table.
!! The hash is based on the idea of open addressing with double hashing;
!! the primary hash function h1(K) is simply the remainder modulo 2^N, while
!! the secondary hash function is 1 if H1(k) == 0, otherwise IOR((2^N-H1(k)),1)
!! (See Knuth: TAOCP, Vol. 3, sec. 6.4)
!!
!! These hash functions are not very smart; however they are very simple and fast.
!! The intended usage of this hash table is to store indices of halo points, which
!! are supposed to be few compared to the internal indices
!! (which are stored elsewhere).
!! Therefore, either the table has a very low occupancy, and this scheme will work,
!! or we have lots more to worry about in parallel performance than the efficiency
!! of this hashing scheme.
!!
!!
! For us a hash is a Nx2 table. ! For us a hash is a Nx2 table.
! Note: we are assuming that the keys are positive numbers. ! Note: we are assuming that the keys are positive numbers.
! Allocatable scalars would be a nice solution... ! Allocatable scalars would be a nice solution...

@ -0,0 +1,820 @@
!!$
!!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$
!!$ 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.
!!$
!!$
!
! package: psb_i_base_vect_mod
!
! This module contains the definition of the psb_i_base_vect type which
! is a container for dense vectors.
! This is encapsulated instead of being just a simple array to allow for
! more complicated situations, such as GPU programming, where the memory
! area we are interested in is not easily accessible from the host/Fortran
! side. It is also meant to be encapsulated in an outer type, to allow
! runtime switching as per the STATE design pattern, similar to the
! sparse matrix types.
!
!
module psb_i_base_vect_mod
use psb_const_mod
use psb_error_mod
!> \namespace psb_base_mod \class psb_i_base_vect_type
!! The psb_i_base_vect_type
!! defines a middle level integer(psb_ipk_) encapsulated dense vector.
!! The encapsulation is needed, in place of a simple array, to allow
!! for complicated situations, such as GPU programming, where the memory
!! area we are interested in is not easily accessible from the host/Fortran
!! side. It is also meant to be encapsulated in an outer type, to allow
!! runtime switching as per the STATE design pattern, similar to the
!! sparse matrix types.
!!
type psb_i_base_vect_type
integer(psb_ipk_), allocatable :: v(:)
contains
!
! Constructors/allocators
!
procedure, pass(x) :: bld_x => i_base_bld_x
procedure, pass(x) :: bld_n => i_base_bld_n
generic, public :: bld => bld_x, bld_n
procedure, pass(x) :: all => i_base_all
procedure, pass(x) :: mold => i_base_mold
!
! Insert/set. Assembly and free.
! Assembly does almost nothing here, but is important
! in derived classes.
!
procedure, pass(x) :: ins => i_base_ins
procedure, pass(x) :: zero => i_base_zero
procedure, pass(x) :: asb => i_base_asb
procedure, pass(x) :: free => i_base_free
!
! Sync: centerpiece of handling of external storage.
! Any derived class having extra storage upon sync
! will guarantee that both fortran/host side and
! external side contain the same data. The base
! version is only a placeholder.
!
procedure, pass(x) :: sync => i_base_sync
procedure, pass(x) :: is_host => i_base_is_host
procedure, pass(x) :: is_dev => i_base_is_dev
procedure, pass(x) :: is_sync => i_base_is_sync
procedure, pass(x) :: set_host => i_base_set_host
procedure, pass(x) :: set_dev => i_base_set_dev
procedure, pass(x) :: set_sync => i_base_set_sync
!
! Basic info
procedure, pass(x) :: get_nrows => i_base_get_nrows
procedure, pass(x) :: sizeof => i_base_sizeof
!
! Set/get data from/to an external array; also
! overload assignment.
!
procedure, pass(x) :: get_vect => i_base_get_vect
procedure, pass(x) :: set_scal => i_base_set_scal
procedure, pass(x) :: set_vect => i_base_set_vect
generic, public :: set => set_vect, set_scal
!
! Dot product and AXPBY
!
procedure, pass(x) :: dot_v => i_base_dot_v
procedure, pass(x) :: dot_a => i_base_dot_a
generic, public :: dot => dot_v, dot_a
procedure, pass(y) :: axpby_v => i_base_axpby_v
procedure, pass(y) :: axpby_a => i_base_axpby_a
generic, public :: axpby => axpby_v, axpby_a
!
! Vector by vector multiplication. Need all variants
! to handle multiple requirements from preconditioners
!
procedure, pass(y) :: mlt_v => i_base_mlt_v
procedure, pass(y) :: mlt_a => i_base_mlt_a
procedure, pass(z) :: mlt_a_2 => i_base_mlt_a_2
procedure, pass(z) :: mlt_v_2 => i_base_mlt_v_2
procedure, pass(z) :: mlt_va => i_base_mlt_va
procedure, pass(z) :: mlt_av => i_base_mlt_av
generic, public :: mlt => mlt_v, mlt_a, mlt_a_2, mlt_v_2, mlt_av, mlt_va
!
! Scaling and norms
!
procedure, pass(x) :: scal => i_base_scal
procedure, pass(x) :: nrm2 => i_base_nrm2
procedure, pass(x) :: amax => i_base_amax
procedure, pass(x) :: asum => i_base_asum
!
! Gather/scatter. These are needed for MPI interfacing.
! May have to be reworked.
!
procedure, pass(x) :: gthab => i_base_gthab
procedure, pass(x) :: gthzv => i_base_gthzv
generic, public :: gth => gthab, gthzv
procedure, pass(y) :: sctb => i_base_sctb
generic, public :: sct => sctb
end type psb_i_base_vect_type
public :: psb_i_base_vect
private :: constructor, size_const
interface psb_i_base_vect
module procedure constructor, size_const
end interface psb_i_base_vect
contains
!
! Constructors.
!
function constructor(x) result(this)
integer(psb_ipk_) :: x(:)
type(psb_i_base_vect_type) :: this
integer(psb_ipk_) :: info
this%v = x
call this%asb(size(x,kind=psb_ipk_),info)
end function constructor
function size_const(n) result(this)
integer(psb_ipk_), intent(in) :: n
type(psb_i_base_vect_type) :: this
integer(psb_ipk_) :: info
call this%asb(n,info)
end function size_const
!
! Build from a sample
!
subroutine i_base_bld_x(x,this)
use psb_realloc_mod
integer(psb_ipk_), intent(in) :: this(:)
class(psb_i_base_vect_type), intent(inout) :: x
integer(psb_ipk_) :: info
call psb_realloc(size(this),x%v,info)
if (info /= 0) then
call psb_errpush(psb_err_alloc_dealloc_,'base_vect_bld')
return
end if
x%v(:) = this(:)
end subroutine i_base_bld_x
!
! Create with size, but no initialization
!
subroutine i_base_bld_n(x,n)
use psb_realloc_mod
integer(psb_ipk_), intent(in) :: n
class(psb_i_base_vect_type), intent(inout) :: x
integer(psb_ipk_) :: info
call psb_realloc(n,x%v,info)
call x%asb(n,info)
end subroutine i_base_bld_n
subroutine i_base_all(n, x, info)
use psi_serial_mod
use psb_realloc_mod
implicit none
integer(psb_ipk_), intent(in) :: n
class(psb_i_base_vect_type), intent(out) :: x
integer(psb_ipk_), intent(out) :: info
call psb_realloc(n,x%v,info)
end subroutine i_base_all
subroutine i_base_mold(x, y, info)
use psi_serial_mod
use psb_realloc_mod
implicit none
class(psb_i_base_vect_type), intent(in) :: x
class(psb_i_base_vect_type), intent(out), allocatable :: y
integer(psb_ipk_), intent(out) :: info
allocate(psb_i_base_vect_type :: y, stat=info)
end subroutine i_base_mold
!
! Insert a bunch of values at specified positions.
!
subroutine i_base_ins(n,irl,val,dupl,x,info)
use psi_serial_mod
implicit none
class(psb_i_base_vect_type), intent(inout) :: x
integer(psb_ipk_), intent(in) :: n, dupl
integer(psb_ipk_), intent(in) :: irl(:)
integer(psb_ipk_), intent(in) :: val(:)
integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_) :: i
info = 0
if (psb_errstatus_fatal()) return
if (.not.allocated(x%v)) then
info = psb_err_invalid_vect_state_
else if (n > min(size(irl),size(val))) then
info = psb_err_invalid_input_
else
select case(dupl)
case(psb_dupl_ovwrt_)
do i = 1, n
!loop over all val's rows
! row actual block row
if (irl(i) > 0) then
! this row belongs to me
! copy i-th row of block val in x
x%v(irl(i)) = val(i)
end if
enddo
case(psb_dupl_add_)
do i = 1, n
!loop over all val's rows
if (irl(i) > 0) then
! this row belongs to me
! copy i-th row of block val in x
x%v(irl(i)) = x%v(irl(i)) + val(i)
end if
enddo
case default
info = 321
!!$ call psb_errpush(info,name)
!!$ goto 9999
end select
end if
if (info /= 0) then
call psb_errpush(info,'base_vect_ins')
return
end if
end subroutine i_base_ins
!
subroutine i_base_zero(x)
use psi_serial_mod
implicit none
class(psb_i_base_vect_type), intent(inout) :: x
if (allocated(x%v)) x%v=izero
end subroutine i_base_zero
!
! Assembly.
! For derived classes: after this the vector
! storage is supposed to be in sync.
!
subroutine i_base_asb(n, x, info)
use psi_serial_mod
use psb_realloc_mod
implicit none
integer(psb_ipk_), intent(in) :: n
class(psb_i_base_vect_type), intent(inout) :: x
integer(psb_ipk_), intent(out) :: info
if (x%get_nrows() < n) &
& call psb_realloc(n,x%v,info)
if (info /= 0) &
& call psb_errpush(psb_err_alloc_dealloc_,'vect_asb')
end subroutine i_base_asb
subroutine i_base_free(x, info)
use psi_serial_mod
use psb_realloc_mod
implicit none
class(psb_i_base_vect_type), intent(inout) :: x
integer(psb_ipk_), intent(out) :: info
info = 0
if (allocated(x%v)) deallocate(x%v, stat=info)
if (info /= 0) call &
& psb_errpush(psb_err_alloc_dealloc_,'vect_free')
end subroutine i_base_free
!
! The base version of SYNC & friends does nothing, it's just
! a placeholder.
!
subroutine i_base_sync(x)
implicit none
class(psb_i_base_vect_type), intent(inout) :: x
end subroutine i_base_sync
subroutine i_base_set_host(x)
implicit none
class(psb_i_base_vect_type), intent(inout) :: x
end subroutine i_base_set_host
subroutine i_base_set_dev(x)
implicit none
class(psb_i_base_vect_type), intent(inout) :: x
end subroutine i_base_set_dev
subroutine i_base_set_sync(x)
implicit none
class(psb_i_base_vect_type), intent(inout) :: x
end subroutine i_base_set_sync
function i_base_is_dev(x) result(res)
implicit none
class(psb_i_base_vect_type), intent(in) :: x
logical :: res
res = .false.
end function i_base_is_dev
function i_base_is_host(x) result(res)
implicit none
class(psb_i_base_vect_type), intent(in) :: x
logical :: res
res = .true.
end function i_base_is_host
function i_base_is_sync(x) result(res)
implicit none
class(psb_i_base_vect_type), intent(in) :: x
logical :: res
res = .true.
end function i_base_is_sync
!
! Size info.
!
function i_base_get_nrows(x) result(res)
implicit none
class(psb_i_base_vect_type), intent(in) :: x
integer(psb_ipk_) :: res
res = 0
if (allocated(x%v)) res = size(x%v)
end function i_base_get_nrows
function i_base_sizeof(x) result(res)
implicit none
class(psb_i_base_vect_type), intent(in) :: x
integer(psb_long_int_k_) :: res
! Force 8-byte integers.
res = (1_psb_long_int_k_ * psb_sizeof_int) * x%get_nrows()
end function i_base_sizeof
!
! Two versions of extracting an array: one of them
! overload the assignment.
!
function i_base_get_vect(x) result(res)
class(psb_i_base_vect_type), intent(inout) :: x
integer(psb_ipk_), allocatable :: res(:)
integer(psb_ipk_) :: info
if (.not.allocated(x%v)) return
call x%sync()
allocate(res(x%get_nrows()),stat=info)
if (info /= 0) then
call psb_errpush(psb_err_alloc_dealloc_,'base_get_vect')
return
end if
res(:) = x%v(:)
end function i_base_get_vect
!
! Reset all values
!
subroutine i_base_set_scal(x,val)
class(psb_i_base_vect_type), intent(inout) :: x
integer(psb_ipk_), intent(in) :: val
integer(psb_ipk_) :: info
x%v = val
end subroutine i_base_set_scal
subroutine i_base_set_vect(x,val)
class(psb_i_base_vect_type), intent(inout) :: x
integer(psb_ipk_), intent(in) :: val(:)
integer(psb_ipk_) :: nr
integer(psb_ipk_) :: info
if (allocated(x%v)) then
nr = min(size(x%v),size(val))
x%v(1:nr) = val(1:nr)
else
x%v = val
end if
end subroutine i_base_set_vect
!
! Dot products
!
function i_base_dot_v(n,x,y) result(res)
implicit none
class(psb_i_base_vect_type), intent(inout) :: x, y
integer(psb_ipk_), intent(in) :: n
integer(psb_ipk_) :: res
integer(psb_ipk_), external :: idot
res = izero
!
! Note: this is the base implementation.
! When we get here, we are sure that X is of
! TYPE psb_i_base_vect.
! If Y is not, throw the burden on it, implicitly
! calling dot_a
!
select type(yy => y)
type is (psb_i_base_vect_type)
res = idot(n,x%v,1,y%v,1)
class default
res = y%dot(n,x%v)
end select
end function i_base_dot_v
!
! Base workhorse is good old BLAS1
!
function i_base_dot_a(n,x,y) result(res)
implicit none
class(psb_i_base_vect_type), intent(inout) :: x
integer(psb_ipk_), intent(in) :: y(:)
integer(psb_ipk_), intent(in) :: n
integer(psb_ipk_) :: res
integer(psb_ipk_), external :: idot
res = idot(n,y,1,x%v,1)
end function i_base_dot_a
!
! AXPBY is invoked via Y, hence the structure below.
!
subroutine i_base_axpby_v(m,alpha, x, beta, y, info)
use psi_serial_mod
implicit none
integer(psb_ipk_), intent(in) :: m
class(psb_i_base_vect_type), intent(inout) :: x
class(psb_i_base_vect_type), intent(inout) :: y
integer(psb_ipk_), intent (in) :: alpha, beta
integer(psb_ipk_), intent(out) :: info
select type(xx => x)
type is (psb_i_base_vect_type)
call psb_geaxpby(m,alpha,x%v,beta,y%v,info)
class default
call y%axpby(m,alpha,x%v,beta,info)
end select
end subroutine i_base_axpby_v
subroutine i_base_axpby_a(m,alpha, x, beta, y, info)
use psi_serial_mod
implicit none
integer(psb_ipk_), intent(in) :: m
integer(psb_ipk_), intent(in) :: x(:)
class(psb_i_base_vect_type), intent(inout) :: y
integer(psb_ipk_), intent (in) :: alpha, beta
integer(psb_ipk_), intent(out) :: info
call psb_geaxpby(m,alpha,x,beta,y%v,info)
end subroutine i_base_axpby_a
!
! Multiple variants of two operations:
! Simple multiplication Y(:) = X(:)*Y(:)
! blas-like: Z(:) = alpha*X(:)*Y(:)+beta*Z(:)
!
! Variants expanded according to the dynamic type
! of the involved entities
!
subroutine i_base_mlt_v(x, y, info)
use psi_serial_mod
implicit none
class(psb_i_base_vect_type), intent(inout) :: x
class(psb_i_base_vect_type), intent(inout) :: y
integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_) :: i, n
info = 0
select type(xx => x)
type is (psb_i_base_vect_type)
n = min(size(y%v), size(xx%v))
do i=1, n
y%v(i) = y%v(i)*xx%v(i)
end do
class default
call y%mlt(x%v,info)
end select
end subroutine i_base_mlt_v
subroutine i_base_mlt_a(x, y, info)
use psi_serial_mod
implicit none
integer(psb_ipk_), intent(in) :: x(:)
class(psb_i_base_vect_type), intent(inout) :: y
integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_) :: i, n
info = 0
n = min(size(y%v), size(x))
do i=1, n
y%v(i) = y%v(i)*x(i)
end do
end subroutine i_base_mlt_a
subroutine i_base_mlt_a_2(alpha,x,y,beta,z,info)
use psi_serial_mod
implicit none
integer(psb_ipk_), intent(in) :: alpha,beta
integer(psb_ipk_), intent(in) :: y(:)
integer(psb_ipk_), intent(in) :: x(:)
class(psb_i_base_vect_type), intent(inout) :: z
integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_) :: i, n
info = 0
n = min(size(z%v), size(x), size(y))
!!$ write(0,*) 'Mlt_a_2: ',n
if (alpha == izero) then
if (beta == ione) then
return
else
do i=1, n
z%v(i) = beta*z%v(i)
end do
end if
else
if (alpha == ione) then
if (beta == izero) then
do i=1, n
z%v(i) = y(i)*x(i)
end do
else if (beta == ione) then
do i=1, n
z%v(i) = z%v(i) + y(i)*x(i)
end do
else
do i=1, n
z%v(i) = beta*z%v(i) + y(i)*x(i)
end do
end if
else if (alpha == -ione) then
if (beta == izero) then
do i=1, n
z%v(i) = -y(i)*x(i)
end do
else if (beta == ione) then
do i=1, n
z%v(i) = z%v(i) - y(i)*x(i)
end do
else
do i=1, n
z%v(i) = beta*z%v(i) - y(i)*x(i)
end do
end if
else
if (beta == izero) then
do i=1, n
z%v(i) = alpha*y(i)*x(i)
end do
else if (beta == ione) then
do i=1, n
z%v(i) = z%v(i) + alpha*y(i)*x(i)
end do
else
do i=1, n
z%v(i) = beta*z%v(i) + alpha*y(i)*x(i)
end do
end if
end if
end if
end subroutine i_base_mlt_a_2
subroutine i_base_mlt_v_2(alpha,x,y,beta,z,info,conjgx,conjgy)
use psi_serial_mod
use psb_string_mod
implicit none
integer(psb_ipk_), intent(in) :: alpha,beta
class(psb_i_base_vect_type), intent(inout) :: x
class(psb_i_base_vect_type), intent(inout) :: y
class(psb_i_base_vect_type), intent(inout) :: z
integer(psb_ipk_), intent(out) :: info
character(len=1), intent(in), optional :: conjgx, conjgy
integer(psb_ipk_) :: i, n
logical :: conjgx_, conjgy_
info = 0
if (.not.psb_i_is_complex_) then
call z%mlt(alpha,x%v,y%v,beta,info)
else
conjgx_=.false.
if (present(conjgx)) conjgx_ = (psb_toupper(conjgx)=='C')
conjgy_=.false.
if (present(conjgy)) conjgy_ = (psb_toupper(conjgy)=='C')
if (conjgx_) x%v=(x%v)
if (conjgy_) y%v=(y%v)
call z%mlt(alpha,x%v,y%v,beta,info)
if (conjgx_) x%v=(x%v)
if (conjgy_) y%v=(y%v)
end if
end subroutine i_base_mlt_v_2
subroutine i_base_mlt_av(alpha,x,y,beta,z,info)
use psi_serial_mod
implicit none
integer(psb_ipk_), intent(in) :: alpha,beta
integer(psb_ipk_), intent(in) :: x(:)
class(psb_i_base_vect_type), intent(inout) :: y
class(psb_i_base_vect_type), intent(inout) :: z
integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_) :: i, n
info = 0
call z%mlt(alpha,x,y%v,beta,info)
end subroutine i_base_mlt_av
subroutine i_base_mlt_va(alpha,x,y,beta,z,info)
use psi_serial_mod
implicit none
integer(psb_ipk_), intent(in) :: alpha,beta
integer(psb_ipk_), intent(in) :: y(:)
class(psb_i_base_vect_type), intent(inout) :: x
class(psb_i_base_vect_type), intent(inout) :: z
integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_) :: i, n
info = 0
call z%mlt(alpha,y,x,beta,info)
end subroutine i_base_mlt_va
!
! Simple scaling
!
subroutine i_base_scal(alpha, x)
use psi_serial_mod
implicit none
class(psb_i_base_vect_type), intent(inout) :: x
integer(psb_ipk_), intent (in) :: alpha
if (allocated(x%v)) x%v = alpha*x%v
end subroutine i_base_scal
!
! Norms 1, 2 and infinity
!
function i_base_nrm2(n,x) result(res)
implicit none
class(psb_i_base_vect_type), intent(inout) :: x
integer(psb_ipk_), intent(in) :: n
integer(psb_ipk_) :: res
integer(psb_ipk_), external :: inrm2
res = inrm2(n,x%v,1)
end function i_base_nrm2
function i_base_amax(n,x) result(res)
implicit none
class(psb_i_base_vect_type), intent(inout) :: x
integer(psb_ipk_), intent(in) :: n
integer(psb_ipk_) :: res
res = maxval(abs(x%v(1:n)))
end function i_base_amax
function i_base_asum(n,x) result(res)
implicit none
class(psb_i_base_vect_type), intent(inout) :: x
integer(psb_ipk_), intent(in) :: n
integer(psb_ipk_) :: res
res = sum(abs(x%v(1:n)))
end function i_base_asum
!
! Gather: Y = beta * Y + alpha * X(IDX(:))
!
subroutine i_base_gthab(n,idx,alpha,x,beta,y)
use psi_serial_mod
integer(psb_ipk_) :: n, idx(:)
integer(psb_ipk_) :: alpha, beta, y(:)
class(psb_i_base_vect_type) :: x
call x%sync()
call psi_gth(n,idx,alpha,x%v,beta,y)
end subroutine i_base_gthab
!
! shortcut alpha=1 beta=0
!
subroutine i_base_gthzv(n,idx,x,y)
use psi_serial_mod
integer(psb_ipk_) :: n, idx(:)
integer(psb_ipk_) :: y(:)
class(psb_i_base_vect_type) :: x
call x%sync()
call psi_gth(n,idx,x%v,y)
end subroutine i_base_gthzv
!
! Scatter:
! Y(IDX(:)) = beta*Y(IDX(:)) + X(:)
!
subroutine i_base_sctb(n,idx,x,beta,y)
use psi_serial_mod
integer(psb_ipk_) :: n, idx(:)
integer(psb_ipk_) :: beta, x(:)
class(psb_i_base_vect_type) :: y
call y%sync()
call psi_sct(n,idx,x,beta,y%v)
call y%set_host()
end subroutine i_base_sctb
end module psb_i_base_vect_mod

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -48,7 +48,16 @@ module psb_i_comm_mod
integer(psb_ipk_), intent(inout), optional, target :: work(:) integer(psb_ipk_), intent(inout), optional, target :: work(:)
integer(psb_ipk_), intent(in), optional :: update,mode integer(psb_ipk_), intent(in), optional :: update,mode
end subroutine psb_iovrlv end subroutine psb_iovrlv
end interface subroutine psb_iovrl_vect(x,desc_a,info,work,update,mode)
use psb_descriptor_type
use psb_i_vect_mod
type(psb_i_vect_type), intent(inout) :: x
type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(inout), optional, target :: work(:)
integer(psb_ipk_), intent(in), optional :: update,mode
end subroutine psb_iovrl_vect
end interface psb_ovrl
interface psb_halo interface psb_halo
subroutine psb_ihalom(x,desc_a,info,alpha,jx,ik,work,tran,mode,data) subroutine psb_ihalom(x,desc_a,info,alpha,jx,ik,work,tran,mode,data)
@ -56,8 +65,8 @@ module psb_i_comm_mod
integer(psb_ipk_), intent(inout), target :: x(:,:) integer(psb_ipk_), intent(inout), target :: x(:,:)
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
real(psb_dpk_), intent(in), optional :: alpha integer(psb_ipk_), intent(in), optional :: alpha
integer(psb_ipk_), intent(inout), optional, target :: work(:) integer(psb_ipk_), target, optional, intent(inout) :: work(:)
integer(psb_ipk_), intent(in), optional :: mode,jx,ik,data integer(psb_ipk_), intent(in), optional :: mode,jx,ik,data
character, intent(in), optional :: tran character, intent(in), optional :: tran
end subroutine psb_ihalom end subroutine psb_ihalom
@ -66,12 +75,23 @@ module psb_i_comm_mod
integer(psb_ipk_), intent(inout) :: x(:) integer(psb_ipk_), intent(inout) :: x(:)
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
real(psb_dpk_), intent(in), optional :: alpha integer(psb_ipk_), intent(in), optional :: alpha
integer(psb_ipk_), intent(inout), optional, target :: work(:) integer(psb_ipk_), target, optional, intent(inout) :: work(:)
integer(psb_ipk_), intent(in), optional :: mode,data integer(psb_ipk_), intent(in), optional :: mode,data
character, intent(in), optional :: tran character, intent(in), optional :: tran
end subroutine psb_ihalov end subroutine psb_ihalov
end interface subroutine psb_ihalo_vect(x,desc_a,info,alpha,work,tran,mode,data)
use psb_descriptor_type
use psb_i_vect_mod
type(psb_i_vect_type), intent(inout) :: x
type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: alpha
integer(psb_ipk_), target, optional, intent(inout) :: work(:)
integer(psb_ipk_), intent(in), optional :: mode,data
character, intent(in), optional :: tran
end subroutine psb_ihalo_vect
end interface psb_halo
interface psb_scatter interface psb_scatter
@ -91,13 +111,24 @@ module psb_i_comm_mod
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: root integer(psb_ipk_), intent(in), optional :: root
end subroutine psb_iscatterv end subroutine psb_iscatterv
end interface end interface psb_scatter
interface psb_gather interface psb_gather
!!$ subroutine psb_isp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keeploc)
! !$ use psb_descriptor_type
! !$ use psb_mat_mod
! !$ implicit none
! !$ type(psb_ispmat_type), intent(inout) :: loca
! !$ type(psb_ispmat_type), intent(out) :: globa
! !$ type(psb_desc_type), intent(in) :: desc_a
! !$ integer(psb_ipk_), intent(out) :: info
! !$ integer(psb_ipk_), intent(in), optional :: root,dupl
! !$ logical, intent(in), optional :: keepnum,keeploc
! !$ end subroutine psb_isp_allgather
subroutine psb_igatherm(globx, locx, desc_a, info, root) subroutine psb_igatherm(globx, locx, desc_a, info, root)
use psb_descriptor_type use psb_descriptor_type
integer(psb_ipk_), intent(in) :: locx(:,:) integer(psb_ipk_), intent(in) :: locx(:,:)
integer(psb_ipk_), intent(out) :: globx(:,:) integer(psb_ipk_), intent(out), allocatable :: globx(:,:)
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: root integer(psb_ipk_), intent(in), optional :: root
@ -105,11 +136,20 @@ module psb_i_comm_mod
subroutine psb_igatherv(globx, locx, desc_a, info, root) subroutine psb_igatherv(globx, locx, desc_a, info, root)
use psb_descriptor_type use psb_descriptor_type
integer(psb_ipk_), intent(in) :: locx(:) integer(psb_ipk_), intent(in) :: locx(:)
integer(psb_ipk_), intent(out) :: globx(:) integer(psb_ipk_), intent(out), allocatable :: globx(:)
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: root integer(psb_ipk_), intent(in), optional :: root
end subroutine psb_igatherv end subroutine psb_igatherv
end interface subroutine psb_igather_vect(globx, locx, desc_a, info, root)
use psb_descriptor_type
use psb_i_vect_mod
type(psb_i_vect_type), intent(inout) :: locx
integer(psb_ipk_), intent(out), allocatable :: globx(:)
type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), intent(in), optional :: root
end subroutine psb_igather_vect
end interface psb_gather
end module psb_i_comm_mod end module psb_i_comm_mod

@ -1,6 +1,6 @@
!!$ !!$
!!$ Parallel Sparse BLAS version 3.0 !!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010 !!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata !!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$ !!$
@ -29,9 +29,9 @@
!!$ POSSIBILITY OF SUCH DAMAGE. !!$ POSSIBILITY OF SUCH DAMAGE.
!!$ !!$
!!$ !!$
module psb_iv_tools_mod module psb_i_tools_mod
use psb_const_mod use psb_descriptor_type, only : psb_desc_type, psb_ipk_, psb_success_
use psb_descriptor_type use psb_i_vect_mod, only : psb_i_base_vect_type, psb_i_vect_type
interface psb_geall interface psb_geall
@ -49,6 +49,14 @@ module psb_iv_tools_mod
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), optional, intent(in) :: n integer(psb_ipk_), optional, intent(in) :: n
end subroutine psb_iallocv end subroutine psb_iallocv
subroutine psb_ialloc_vect(x, desc_a,info,n)
import :: psb_desc_type, psb_ipk_, &
& psb_i_base_vect_type, psb_i_vect_type
type(psb_i_vect_type), intent(out) :: x
type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_),intent(out) :: info
integer(psb_ipk_), optional, intent(in) :: n
end subroutine psb_ialloc_vect
end interface end interface
@ -65,6 +73,15 @@ module psb_iv_tools_mod
integer(psb_ipk_), allocatable, intent(inout) :: x(:) integer(psb_ipk_), allocatable, intent(inout) :: x(:)
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
end subroutine psb_iasbv end subroutine psb_iasbv
subroutine psb_iasb_vect(x, desc_a, info,mold, scratch)
import :: psb_desc_type, psb_ipk_, &
& psb_i_base_vect_type, psb_i_vect_type
type(psb_desc_type), intent(in) :: desc_a
type(psb_i_vect_type), intent(inout) :: x
integer(psb_ipk_), intent(out) :: info
class(psb_i_base_vect_type), intent(in), optional :: mold
logical, intent(in), optional :: scratch
end subroutine psb_iasb_vect
end interface end interface
@ -81,10 +98,17 @@ module psb_iv_tools_mod
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
end subroutine psb_ifreev end subroutine psb_ifreev
subroutine psb_ifree_vect(x, desc_a, info)
import :: psb_desc_type, psb_ipk_, &
& psb_i_base_vect_type, psb_i_vect_type
type(psb_desc_type), intent(in) :: desc_a
type(psb_i_vect_type), intent(inout) :: x
integer(psb_ipk_), intent(out) :: info
end subroutine psb_ifree_vect
end interface end interface
interface psb_geins interface psb_geins
subroutine psb_iinsi(m,irw,val, x,desc_a,info,dupl) subroutine psb_iinsi(m,irw,val, x,desc_a,info,dupl,local)
import :: psb_ipk_, psb_desc_type import :: psb_ipk_, psb_desc_type
integer(psb_ipk_), intent(in) :: m integer(psb_ipk_), intent(in) :: m
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
@ -93,8 +117,9 @@ module psb_iv_tools_mod
integer(psb_ipk_), intent(in) :: val(:,:) integer(psb_ipk_), intent(in) :: val(:,:)
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), optional, intent(in) :: dupl integer(psb_ipk_), optional, intent(in) :: dupl
logical, intent(in), optional :: local
end subroutine psb_iinsi end subroutine psb_iinsi
subroutine psb_iinsvi(m, irw,val, x,desc_a,info,dupl) subroutine psb_iinsvi(m, irw,val, x,desc_a,info,dupl,local)
import :: psb_ipk_, psb_desc_type import :: psb_ipk_, psb_desc_type
integer(psb_ipk_), intent(in) :: m integer(psb_ipk_), intent(in) :: m
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
@ -103,7 +128,20 @@ module psb_iv_tools_mod
integer(psb_ipk_), intent(in) :: val(:) integer(psb_ipk_), intent(in) :: val(:)
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), optional, intent(in) :: dupl integer(psb_ipk_), optional, intent(in) :: dupl
logical, intent(in), optional :: local
end subroutine psb_iinsvi end subroutine psb_iinsvi
subroutine psb_iins_vect(m,irw,val,x,desc_a,info,dupl,local)
import :: psb_desc_type, psb_ipk_, &
& psb_i_base_vect_type, psb_i_vect_type
integer(psb_ipk_), intent(in) :: m
type(psb_desc_type), intent(in) :: desc_a
type(psb_i_vect_type), intent(inout) :: x
integer(psb_ipk_), intent(in) :: irw(:)
integer(psb_ipk_), intent(in) :: val(:)
integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), optional, intent(in) :: dupl
logical, intent(in), optional :: local
end subroutine psb_iins_vect
end interface end interface
@ -289,199 +327,5 @@ contains
res = (lx>0) res = (lx>0)
end subroutine psb_local_index_v end subroutine psb_local_index_v
end module psb_iv_tools_mod end module psb_i_tools_mod
module psb_cd_if_tools_mod
use psb_const_mod
use psb_descriptor_type
use psb_gen_block_map_mod
use psb_list_map_mod
use psb_glist_map_mod
use psb_hash_map_mod
use psb_repl_map_mod
interface psb_cd_set_bld
subroutine psb_cd_set_bld(desc,info)
import :: psb_ipk_, psb_desc_type
type(psb_desc_type), intent(inout) :: desc
integer(psb_ipk_) :: info
end subroutine psb_cd_set_bld
end interface
interface psb_cd_set_ovl_bld
subroutine psb_cd_set_ovl_bld(desc,info)
import :: psb_ipk_, psb_desc_type
type(psb_desc_type), intent(inout) :: desc
integer(psb_ipk_) :: info
end subroutine psb_cd_set_ovl_bld
end interface
interface psb_cd_reinit
Subroutine psb_cd_reinit(desc,info)
import :: psb_ipk_, psb_desc_type
Implicit None
! .. Array Arguments ..
Type(psb_desc_type), Intent(inout) :: desc
integer(psb_ipk_), intent(out) :: info
end Subroutine psb_cd_reinit
end interface
interface psb_cdcpy
subroutine psb_cdcpy(desc_in, desc_out, info)
import :: psb_ipk_, psb_desc_type
implicit none
!....parameters...
type(psb_desc_type), intent(in) :: desc_in
type(psb_desc_type), intent(out) :: desc_out
integer(psb_ipk_), intent(out) :: info
end subroutine psb_cdcpy
end interface
interface psb_cdprt
subroutine psb_cdprt(iout,desc_p,glob,short)
import :: psb_ipk_, psb_desc_type
implicit none
type(psb_desc_type), intent(in) :: desc_p
integer(psb_ipk_), intent(in) :: iout
logical, intent(in), optional :: glob,short
end subroutine psb_cdprt
end interface
interface psb_cdins
subroutine psb_cdinsrc(nz,ia,ja,desc_a,info,ila,jla)
import :: psb_ipk_, psb_desc_type
type(psb_desc_type), intent(inout) :: desc_a
integer(psb_ipk_), intent(in) :: nz,ia(:),ja(:)
integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), optional, intent(out) :: ila(:), jla(:)
end subroutine psb_cdinsrc
subroutine psb_cdinsc(nz,ja,desc,info,jla,mask)
import :: psb_ipk_, psb_desc_type
type(psb_desc_type), intent(inout) :: desc
integer(psb_ipk_), intent(in) :: nz,ja(:)
integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_), optional, intent(out) :: jla(:)
logical, optional, target, intent(in) :: mask(:)
end subroutine psb_cdinsc
end interface
interface psb_cdbldext
Subroutine psb_cd_lstext(desc_a,in_list,desc_ov,info, mask,extype)
import :: psb_ipk_, psb_desc_type
Implicit None
Type(psb_desc_type), Intent(in), target :: desc_a
integer(psb_ipk_), intent(in) :: in_list(:)
Type(psb_desc_type), Intent(out) :: desc_ov
integer(psb_ipk_), intent(out) :: info
logical, intent(in), optional, target :: mask(:)
integer(psb_ipk_), intent(in),optional :: extype
end Subroutine psb_cd_lstext
end interface
interface psb_cdren
subroutine psb_cdren(trans,iperm,desc_a,info)
import :: psb_ipk_, psb_desc_type
type(psb_desc_type), intent(inout) :: desc_a
integer(psb_ipk_), intent(inout) :: iperm(:)
character, intent(in) :: trans
integer(psb_ipk_), intent(out) :: info
end subroutine psb_cdren
end interface
interface psb_get_overlap
subroutine psb_get_ovrlap(ovrel,desc,info)
import :: psb_ipk_, psb_desc_type
implicit none
integer(psb_ipk_), allocatable, intent(out) :: ovrel(:)
type(psb_desc_type), intent(in) :: desc
integer(psb_ipk_), intent(out) :: info
end subroutine psb_get_ovrlap
end interface
interface psb_icdasb
subroutine psb_icdasb(desc,info,ext_hv)
import :: psb_ipk_, psb_desc_type
Type(psb_desc_type), intent(inout) :: desc
integer(psb_ipk_), intent(out) :: info
logical, intent(in),optional :: ext_hv
end subroutine psb_icdasb
end interface
end module psb_cd_if_tools_mod
module psb_cd_tools_mod
use psb_const_mod
use psb_cd_if_tools_mod
interface psb_cdall
subroutine psb_cdall(ictxt, desc, info,mg,ng,parts,vg,vl,flag,nl,repl, globalcheck)
import :: psb_ipk_, psb_desc_type, psb_parts
implicit None
procedure(psb_parts) :: parts
integer(psb_ipk_), intent(in) :: mg,ng,ictxt, vg(:), vl(:),nl
integer(psb_ipk_), intent(in) :: flag
logical, intent(in) :: repl, globalcheck
integer(psb_ipk_), intent(out) :: info
type(psb_desc_type), intent(out) :: desc
optional :: mg,ng,parts,vg,vl,flag,nl,repl, globalcheck
end subroutine psb_cdall
end interface
interface psb_cdasb
module procedure psb_cdasb
end interface
interface psb_get_boundary
module procedure psb_get_boundary
end interface
interface
subroutine psb_cd_switch_ovl_indxmap(desc,info)
import :: psb_ipk_, psb_desc_type
implicit None
include 'parts.fh'
type(psb_desc_type), intent(inout) :: desc
integer(psb_ipk_), intent(out) :: info
end subroutine psb_cd_switch_ovl_indxmap
end interface
contains
subroutine psb_get_boundary(bndel,desc,info)
use psi_mod, only : psi_crea_bnd_elem
implicit none
integer(psb_ipk_), allocatable, intent(out) :: bndel(:)
type(psb_desc_type), intent(in) :: desc
integer(psb_ipk_), intent(out) :: info
call psi_crea_bnd_elem(bndel,desc,info)
end subroutine psb_get_boundary
subroutine psb_cdasb(desc,info)
Type(psb_desc_type), intent(inout) :: desc
integer(psb_ipk_), intent(out) :: info
call psb_icdasb(desc,info,ext_hv=.false.)
end subroutine psb_cdasb
end module psb_cd_tools_mod
module psb_base_tools_mod
use psb_iv_tools_mod
use psb_cd_tools_mod
end module psb_base_tools_mod

@ -0,0 +1,558 @@
!!$
!!$ Parallel Sparse BLAS version 3.0
!!$ (C) Copyright 2006, 2007, 2008, 2009, 2010, 2012
!!$ Salvatore Filippone University of Rome Tor Vergata
!!$ Alfredo Buttari CNRS-IRIT, Toulouse
!!$
!!$ 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.
!!$
!!$
!
! package: psb_i_vect_mod
!
! This module contains the definition of the psb_i_vect type which
! is the outer container for dense vectors.
! Therefore all methods simply invoke the corresponding methods of the
! inner component.
!
module psb_i_vect_mod
use psb_i_base_vect_mod
type psb_i_vect_type
class(psb_i_base_vect_type), allocatable :: v
contains
procedure, pass(x) :: get_nrows => i_vect_get_nrows
procedure, pass(x) :: sizeof => i_vect_sizeof
procedure, pass(x) :: dot_v => i_vect_dot_v
procedure, pass(x) :: dot_a => i_vect_dot_a
generic, public :: dot => dot_v, dot_a
procedure, pass(y) :: axpby_v => i_vect_axpby_v
procedure, pass(y) :: axpby_a => i_vect_axpby_a
generic, public :: axpby => axpby_v, axpby_a
procedure, pass(y) :: mlt_v => i_vect_mlt_v
procedure, pass(y) :: mlt_a => i_vect_mlt_a
procedure, pass(z) :: mlt_a_2 => i_vect_mlt_a_2
procedure, pass(z) :: mlt_v_2 => i_vect_mlt_v_2
procedure, pass(z) :: mlt_va => i_vect_mlt_va
procedure, pass(z) :: mlt_av => i_vect_mlt_av
generic, public :: mlt => mlt_v, mlt_a, mlt_a_2,&
& mlt_v_2, mlt_av, mlt_va
procedure, pass(x) :: scal => i_vect_scal
procedure, pass(x) :: nrm2 => i_vect_nrm2
procedure, pass(x) :: amax => i_vect_amax
procedure, pass(x) :: asum => i_vect_asum
procedure, pass(x) :: all => i_vect_all
procedure, pass(x) :: zero => i_vect_zero
procedure, pass(x) :: asb => i_vect_asb
procedure, pass(x) :: sync => i_vect_sync
procedure, pass(x) :: gthab => i_vect_gthab
procedure, pass(x) :: gthzv => i_vect_gthzv
generic, public :: gth => gthab, gthzv
procedure, pass(y) :: sctb => i_vect_sctb
generic, public :: sct => sctb
procedure, pass(x) :: free => i_vect_free
procedure, pass(x) :: ins => i_vect_ins
procedure, pass(x) :: bld_x => i_vect_bld_x
procedure, pass(x) :: bld_n => i_vect_bld_n
generic, public :: bld => bld_x, bld_n
procedure, pass(x) :: get_vect => i_vect_get_vect
procedure, pass(x) :: cnv => i_vect_cnv
procedure, pass(x) :: set_scal => i_vect_set_scal
procedure, pass(x) :: set_vect => i_vect_set_vect
generic, public :: set => set_vect, set_scal
end type psb_i_vect_type
public :: psb_i_vect
private :: constructor, size_const
interface psb_i_vect
module procedure constructor, size_const
end interface psb_i_vect
contains
subroutine i_vect_bld_x(x,invect,mold)
integer(psb_ipk_), intent(in) :: invect(:)
class(psb_i_vect_type), intent(out) :: x
class(psb_i_base_vect_type), intent(in), optional :: mold
integer(psb_ipk_) :: info
if (present(mold)) then
#ifdef HAVE_MOLD
allocate(x%v,stat=info,mold=mold)
#else
call mold%mold(x%v,info)
#endif
else
allocate(psb_i_base_vect_type :: x%v,stat=info)
endif
if (info == psb_success_) call x%v%bld(invect)
end subroutine i_vect_bld_x
subroutine i_vect_bld_n(x,n,mold)
integer(psb_ipk_), intent(in) :: n
class(psb_i_vect_type), intent(out) :: x
class(psb_i_base_vect_type), intent(in), optional :: mold
integer(psb_ipk_) :: info
if (present(mold)) then
#ifdef HAVE_MOLD
allocate(x%v,stat=info,mold=mold)
#else
call mold%mold(x%v,info)
#endif
else
allocate(psb_i_base_vect_type :: x%v,stat=info)
endif
if (info == psb_success_) call x%v%bld(n)
end subroutine i_vect_bld_n
function i_vect_get_vect(x) result(res)
class(psb_i_vect_type), intent(inout) :: x
integer(psb_ipk_), allocatable :: res(:)
integer(psb_ipk_) :: info
if (allocated(x%v)) then
res = x%v%get_vect()
end if
end function i_vect_get_vect
subroutine i_vect_set_scal(x,val)
class(psb_i_vect_type), intent(inout) :: x
integer(psb_ipk_), intent(in) :: val
integer(psb_ipk_) :: info
if (allocated(x%v)) call x%v%set(val)
end subroutine i_vect_set_scal
subroutine i_vect_set_vect(x,val)
class(psb_i_vect_type), intent(inout) :: x
integer(psb_ipk_), intent(in) :: val(:)
integer(psb_ipk_) :: info
if (allocated(x%v)) call x%v%set(val)
end subroutine i_vect_set_vect
function constructor(x) result(this)
integer(psb_ipk_) :: x(:)
type(psb_i_vect_type) :: this
integer(psb_ipk_) :: info
allocate(psb_i_base_vect_type :: this%v, stat=info)
if (info == 0) call this%v%bld(x)
call this%asb(size(x,kind=psb_ipk_),info)
end function constructor
function size_const(n) result(this)
integer(psb_ipk_), intent(in) :: n
type(psb_i_vect_type) :: this
integer(psb_ipk_) :: info
allocate(psb_i_base_vect_type :: this%v, stat=info)
call this%asb(n,info)
end function size_const
function i_vect_get_nrows(x) result(res)
implicit none
class(psb_i_vect_type), intent(in) :: x
integer(psb_ipk_) :: res
res = 0
if (allocated(x%v)) res = x%v%get_nrows()
end function i_vect_get_nrows
function i_vect_sizeof(x) result(res)
implicit none
class(psb_i_vect_type), intent(in) :: x
integer(psb_long_int_k_) :: res
res = 0
if (allocated(x%v)) res = x%v%sizeof()
end function i_vect_sizeof
function i_vect_dot_v(n,x,y) result(res)
implicit none
class(psb_i_vect_type), intent(inout) :: x, y
integer(psb_ipk_), intent(in) :: n
integer(psb_ipk_) :: res
res = izero
if (allocated(x%v).and.allocated(y%v)) &
& res = x%v%dot(n,y%v)
end function i_vect_dot_v
function i_vect_dot_a(n,x,y) result(res)
implicit none
class(psb_i_vect_type), intent(inout) :: x
integer(psb_ipk_), intent(in) :: y(:)
integer(psb_ipk_), intent(in) :: n
integer(psb_ipk_) :: res
res = izero
if (allocated(x%v)) &
& res = x%v%dot(n,y)
end function i_vect_dot_a
subroutine i_vect_axpby_v(m,alpha, x, beta, y, info)
use psi_serial_mod
implicit none
integer(psb_ipk_), intent(in) :: m
class(psb_i_vect_type), intent(inout) :: x
class(psb_i_vect_type), intent(inout) :: y
integer(psb_ipk_), intent (in) :: alpha, beta
integer(psb_ipk_), intent(out) :: info
if (allocated(x%v).and.allocated(y%v)) then
call y%v%axpby(m,alpha,x%v,beta,info)
else
info = psb_err_invalid_vect_state_
end if
end subroutine i_vect_axpby_v
subroutine i_vect_axpby_a(m,alpha, x, beta, y, info)
use psi_serial_mod
implicit none
integer(psb_ipk_), intent(in) :: m
integer(psb_ipk_), intent(in) :: x(:)
class(psb_i_vect_type), intent(inout) :: y
integer(psb_ipk_), intent (in) :: alpha, beta
integer(psb_ipk_), intent(out) :: info
if (allocated(y%v)) &
& call y%v%axpby(m,alpha,x,beta,info)
end subroutine i_vect_axpby_a
subroutine i_vect_mlt_v(x, y, info)
use psi_serial_mod
implicit none
class(psb_i_vect_type), intent(inout) :: x
class(psb_i_vect_type), intent(inout) :: y
integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_) :: i, n
info = 0
if (allocated(x%v).and.allocated(y%v)) &
& call y%v%mlt(x%v,info)
end subroutine i_vect_mlt_v
subroutine i_vect_mlt_a(x, y, info)
use psi_serial_mod
implicit none
integer(psb_ipk_), intent(in) :: x(:)
class(psb_i_vect_type), intent(inout) :: y
integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_) :: i, n
info = 0
if (allocated(y%v)) &
& call y%v%mlt(x,info)
end subroutine i_vect_mlt_a
subroutine i_vect_mlt_a_2(alpha,x,y,beta,z,info)
use psi_serial_mod
implicit none
integer(psb_ipk_), intent(in) :: alpha,beta
integer(psb_ipk_), intent(in) :: y(:)
integer(psb_ipk_), intent(in) :: x(:)
class(psb_i_vect_type), intent(inout) :: z
integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_) :: i, n
info = 0
if (allocated(z%v)) &
& call z%v%mlt(alpha,x,y,beta,info)
end subroutine i_vect_mlt_a_2
subroutine i_vect_mlt_v_2(alpha,x,y,beta,z,info,conjgx,conjgy)
use psi_serial_mod
implicit none
integer(psb_ipk_), intent(in) :: alpha,beta
class(psb_i_vect_type), intent(inout) :: x
class(psb_i_vect_type), intent(inout) :: y
class(psb_i_vect_type), intent(inout) :: z
integer(psb_ipk_), intent(out) :: info
character(len=1), intent(in), optional :: conjgx, conjgy
integer(psb_ipk_) :: i, n
info = 0
if (allocated(x%v).and.allocated(y%v).and.&
& allocated(z%v)) &
& call z%v%mlt(alpha,x%v,y%v,beta,info,conjgx,conjgy)
end subroutine i_vect_mlt_v_2
subroutine i_vect_mlt_av(alpha,x,y,beta,z,info)
use psi_serial_mod
implicit none
integer(psb_ipk_), intent(in) :: alpha,beta
integer(psb_ipk_), intent(in) :: x(:)
class(psb_i_vect_type), intent(inout) :: y
class(psb_i_vect_type), intent(inout) :: z
integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_) :: i, n
info = 0
if (allocated(z%v).and.allocated(y%v)) &
& call z%v%mlt(alpha,x,y%v,beta,info)
end subroutine i_vect_mlt_av
subroutine i_vect_mlt_va(alpha,x,y,beta,z,info)
use psi_serial_mod
implicit none
integer(psb_ipk_), intent(in) :: alpha,beta
integer(psb_ipk_), intent(in) :: y(:)
class(psb_i_vect_type), intent(inout) :: x
class(psb_i_vect_type), intent(inout) :: z
integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_) :: i, n
info = 0
if (allocated(z%v).and.allocated(x%v)) &
& call z%v%mlt(alpha,x%v,y,beta,info)
end subroutine i_vect_mlt_va
subroutine i_vect_scal(alpha, x)
use psi_serial_mod
implicit none
class(psb_i_vect_type), intent(inout) :: x
integer(psb_ipk_), intent (in) :: alpha
if (allocated(x%v)) call x%v%scal(alpha)
end subroutine i_vect_scal
function i_vect_nrm2(n,x) result(res)
implicit none
class(psb_i_vect_type), intent(inout) :: x
integer(psb_ipk_), intent(in) :: n
integer(psb_ipk_) :: res
if (allocated(x%v)) then
res = x%v%nrm2(n)
else
res = izero
end if
end function i_vect_nrm2
function i_vect_amax(n,x) result(res)
implicit none
class(psb_i_vect_type), intent(inout) :: x
integer(psb_ipk_), intent(in) :: n
integer(psb_ipk_) :: res
if (allocated(x%v)) then
res = x%v%amax(n)
else
res = izero
end if
end function i_vect_amax
function i_vect_asum(n,x) result(res)
implicit none
class(psb_i_vect_type), intent(inout) :: x
integer(psb_ipk_), intent(in) :: n
integer(psb_ipk_) :: res
if (allocated(x%v)) then
res = x%v%asum(n)
else
res = izero
end if
end function i_vect_asum
subroutine i_vect_all(n, x, info, mold)
implicit none
integer(psb_ipk_), intent(in) :: n
class(psb_i_vect_type), intent(out) :: x
class(psb_i_base_vect_type), intent(in), optional :: mold
integer(psb_ipk_), intent(out) :: info
if (present(mold)) then
#ifdef HAVE_MOLD
allocate(x%v,stat=info,mold=mold)
#else
call mold%mold(x%v,info)
#endif
else
allocate(psb_i_base_vect_type :: x%v,stat=info)
endif
if (info == 0) then
call x%v%all(n,info)
else
info = psb_err_alloc_dealloc_
end if
end subroutine i_vect_all
subroutine i_vect_zero(x)
use psi_serial_mod
implicit none
class(psb_i_vect_type), intent(inout) :: x
if (allocated(x%v)) call x%v%zero()
end subroutine i_vect_zero
subroutine i_vect_asb(n, x, info)
use psi_serial_mod
use psb_realloc_mod
implicit none
integer(psb_ipk_), intent(in) :: n
class(psb_i_vect_type), intent(inout) :: x
integer(psb_ipk_), intent(out) :: info
if (allocated(x%v)) &
& call x%v%asb(n,info)
end subroutine i_vect_asb
subroutine i_vect_sync(x)
implicit none
class(psb_i_vect_type), intent(inout) :: x
if (allocated(x%v)) &
& call x%v%sync()
end subroutine i_vect_sync
subroutine i_vect_gthab(n,idx,alpha,x,beta,y)
use psi_serial_mod
integer(psb_ipk_) :: n, idx(:)
integer(psb_ipk_) :: alpha, beta, y(:)
class(psb_i_vect_type) :: x
if (allocated(x%v)) &
& call x%v%gth(n,idx,alpha,beta,y)
end subroutine i_vect_gthab
subroutine i_vect_gthzv(n,idx,x,y)
use psi_serial_mod
integer(psb_ipk_) :: n, idx(:)
integer(psb_ipk_) :: y(:)
class(psb_i_vect_type) :: x
if (allocated(x%v)) &
& call x%v%gth(n,idx,y)
end subroutine i_vect_gthzv
subroutine i_vect_sctb(n,idx,x,beta,y)
use psi_serial_mod
integer(psb_ipk_) :: n, idx(:)
integer(psb_ipk_) :: beta, x(:)
class(psb_i_vect_type) :: y
if (allocated(y%v)) &
& call y%v%sct(n,idx,x,beta)
end subroutine i_vect_sctb
subroutine i_vect_free(x, info)
use psi_serial_mod
use psb_realloc_mod
implicit none
class(psb_i_vect_type), intent(inout) :: x
integer(psb_ipk_), intent(out) :: info
info = 0
if (allocated(x%v)) then
call x%v%free(info)
if (info == 0) deallocate(x%v,stat=info)
end if
end subroutine i_vect_free
subroutine i_vect_ins(n,irl,val,dupl,x,info)
use psi_serial_mod
implicit none
class(psb_i_vect_type), intent(inout) :: x
integer(psb_ipk_), intent(in) :: n, dupl
integer(psb_ipk_), intent(in) :: irl(:)
integer(psb_ipk_), intent(in) :: val(:)
integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_) :: i
info = 0
if (.not.allocated(x%v)) then
info = psb_err_invalid_vect_state_
return
end if
call x%v%ins(n,irl,val,dupl,info)
end subroutine i_vect_ins
subroutine i_vect_cnv(x,mold)
class(psb_i_vect_type), intent(inout) :: x
class(psb_i_base_vect_type), intent(in) :: mold
class(psb_i_base_vect_type), allocatable :: tmp
integer(psb_ipk_), allocatable :: invect(:)
integer(psb_ipk_) :: info
#ifdef HAVE_MOLD
allocate(tmp,stat=info,mold=mold)
#else
call mold%mold(tmp,info)
#endif
call x%v%sync()
if (info == psb_success_) call tmp%bld(x%v%v)
call x%v%free(info)
call move_alloc(tmp,x%v)
end subroutine i_vect_cnv
end module psb_i_vect_mod

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save