! ! Parallel Sparse BLAS version 3.5 ! (C) Copyright 2006-2018 ! Salvatore Filippone ! Alfredo Buttari ! ! 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. ! ! ! == =================================== ! ! ! ! Computational routines ! ! ! ! ! ! ! == =================================== subroutine psb_d_scsr_csmv(alpha,a,x,beta,y,info,trans) use psb_error_mod use psb_string_mod use psb_d_scsr_mat_mod, psb_protect_name => psb_d_scsr_csmv implicit none class(psb_d_scsr_sparse_mat), intent(in) :: a real(psb_dpk_), intent(in) :: alpha, beta, x(:) real(psb_dpk_), intent(inout) :: y(:) integer(psb_ipk_), intent(out) :: info character, optional, intent(in) :: trans character :: trans_ integer(psb_ipk_) :: i,j,k,m,n, nnz, ir, jc real(psb_dpk_) :: acc logical :: tra, ctra integer(psb_ipk_) :: err_act integer(psb_ipk_) :: ierr(5) character(len=20) :: name='d_scsr_csmv' logical, parameter :: debug=.false. call psb_erractionsave(err_act) info = psb_success_ ! This whole data structure is for the sake of a special ! case with beta==one and A non unit, revert to base otherwise. if ((beta /= done).or.(a%is_unit())) then call a%psb_d_csr_sparse_mat%csmv(alpha,x,beta,y,info,trans) if (info /= psb_success_) then info = psb_err_internal_error_ call psb_errpush(info,name) goto 9999 end if end if if (present(trans)) then trans_ = trans else trans_ = 'N' end if if (.not.a%is_asb()) then info = psb_err_invalid_mat_state_ call psb_errpush(info,name) goto 9999 endif tra = (psb_toupper(trans_) == 'T') ctra = (psb_toupper(trans_) == 'C') if (tra.or.ctra) then m = a%get_ncols() n = a%get_nrows() else n = a%get_ncols() m = a%get_nrows() end if if (size(x,1) psb_d_scsr_csmm implicit none class(psb_d_scsr_sparse_mat), intent(in) :: a real(psb_dpk_), intent(in) :: alpha, beta, x(:,:) real(psb_dpk_), intent(inout) :: y(:,:) integer(psb_ipk_), intent(out) :: info character, optional, intent(in) :: trans character :: trans_ integer(psb_ipk_) :: i,j,k,m,n, nnz, ir, jc, nc real(psb_dpk_), allocatable :: acc(:) logical :: tra, ctra integer(psb_ipk_) :: err_act integer(psb_ipk_) :: ierr(5) character(len=20) :: name='d_scsr_csmm' logical, parameter :: debug=.false. info = psb_success_ call psb_erractionsave(err_act) ! This whole data structure is for the sake of a special ! case with beta==one and A non unit, revert to base otherwise. if ((beta /= done).or.(a%is_unit())) then call a%psb_d_csr_sparse_mat%csmm(alpha,x,beta,y,info,trans) if (info /= psb_success_) then info = psb_err_internal_error_ call psb_errpush(info,name) goto 9999 end if end if if (present(trans)) then trans_ = trans else trans_ = 'N' end if if (.not.a%is_asb()) then info = psb_err_invalid_mat_state_ call psb_errpush(info,name) goto 9999 endif tra = (psb_toupper(trans_) == 'T') ctra = (psb_toupper(trans_) == 'C') if (tra.or.ctra) then m = a%get_ncols() n = a%get_nrows() else n = a%get_ncols() m = a%get_nrows() end if if (size(x,1) psb_d_scsr_cssv !!$ implicit none !!$ class(psb_d_scsr_sparse_mat), intent(in) :: a !!$ real(psb_dpk_), intent(in) :: alpha, beta, x(:) !!$ real(psb_dpk_), intent(inout) :: y(:) !!$ integer(psb_ipk_), intent(out) :: info !!$ character, optional, intent(in) :: trans !!$ !!$ character :: trans_ !!$ integer(psb_ipk_) :: i,j,k,m,n, nnz, ir, jc !!$ real(psb_dpk_) :: acc !!$ real(psb_dpk_), allocatable :: tmp(:) !!$ logical :: tra,ctra !!$ integer(psb_ipk_) :: err_act !!$ integer(psb_ipk_) :: ierr(5) !!$ character(len=20) :: name='d_scsr_cssv' !!$ logical, parameter :: debug=.false. !!$ !!$ info = psb_success_ !!$ call psb_erractionsave(err_act) !!$ if (present(trans)) then !!$ trans_ = trans !!$ else !!$ trans_ = 'N' !!$ end if !!$ if (.not.a%is_asb()) then !!$ info = psb_err_invalid_mat_state_ !!$ call psb_errpush(info,name) !!$ goto 9999 !!$ endif !!$ !!$ tra = (psb_toupper(trans_) == 'T') !!$ ctra = (psb_toupper(trans_) == 'C') !!$ m = a%get_nrows() !!$ !!$ if (.not. (a%is_triangle())) then !!$ info = psb_err_invalid_mat_state_ !!$ call psb_errpush(info,name) !!$ goto 9999 !!$ end if !!$ !!$ if (size(x) psb_d_scsr_cssm !!$ implicit none !!$ class(psb_d_scsr_sparse_mat), intent(in) :: a !!$ real(psb_dpk_), intent(in) :: alpha, beta, x(:,:) !!$ real(psb_dpk_), intent(inout) :: y(:,:) !!$ integer(psb_ipk_), intent(out) :: info !!$ character, optional, intent(in) :: trans !!$ !!$ character :: trans_ !!$ integer(psb_ipk_) :: i,j,k,m,n, nnz, ir, jc, nc !!$ real(psb_dpk_) :: acc !!$ real(psb_dpk_), allocatable :: tmp(:,:) !!$ logical :: tra, ctra !!$ integer(psb_ipk_) :: err_act !!$ integer(psb_ipk_) :: ierr(5) !!$ character(len=20) :: name='d_scsr_cssm' !!$ logical, parameter :: debug=.false. !!$ !!$ info = psb_success_ !!$ call psb_erractionsave(err_act) !!$ !!$ if (present(trans)) then !!$ trans_ = trans !!$ else !!$ trans_ = 'N' !!$ end if !!$ if (.not.a%is_asb()) then !!$ info = psb_err_invalid_mat_state_ !!$ call psb_errpush(info,name) !!$ goto 9999 !!$ endif !!$ !!$ !!$ tra = (psb_toupper(trans_) == 'T') !!$ ctra = (psb_toupper(trans_) == 'C') !!$ !!$ m = a%get_nrows() !!$ nc = min(size(x,2) , size(y,2)) !!$ !!$ if (.not. (a%is_triangle())) then !!$ info = psb_err_invalid_mat_state_ !!$ call psb_errpush(info,name) !!$ goto 9999 !!$ end if !!$ !!$ !!$ if (alpha == dzero) then !!$ if (beta == dzero) then !!$ do i = 1, m !!$ y(i,:) = dzero !!$ enddo !!$ else !!$ do i = 1, m !!$ y(i,:) = beta*y(i,:) !!$ end do !!$ endif !!$ return !!$ end if !!$ !!$ if (beta == dzero) then !!$ call inner_scsrsm(tra,ctra,a%is_lower(),a%is_unit(),a%get_nrows(),nc,& !!$ & a%irp,a%ja,a%val,x,size(x,1,kind=psb_ipk_),y,size(y,1,kind=psb_ipk_),info) !!$ do i = 1, m !!$ y(i,1:nc) = alpha*y(i,1:nc) !!$ end do !!$ else !!$ allocate(tmp(m,nc), stat=info) !!$ if(info /= psb_success_) then !!$ info=psb_err_from_subroutine_ !!$ call psb_errpush(info,name,a_err='allocate') !!$ goto 9999 !!$ end if !!$ !!$ call inner_scsrsm(tra,ctra,a%is_lower(),a%is_unit(),a%get_nrows(),nc,& !!$ & a%irp,a%ja,a%val,x,size(x,1,kind=psb_ipk_),tmp,size(tmp,1,kind=psb_ipk_),info) !!$ do i = 1, m !!$ y(i,1:nc) = alpha*tmp(i,1:nc) + beta*y(i,1:nc) !!$ end do !!$ end if !!$ !!$ if(info /= psb_success_) then !!$ info=psb_err_from_subroutine_ !!$ call psb_errpush(info,name,a_err='inner_scsrsm') !!$ goto 9999 !!$ end if !!$ !!$ call psb_erractionrestore(err_act) !!$ return !!$ !!$ !!$9999 call psb_error_handler(err_act) !!$ return !!$ !!$ !!$contains !!$ !!$ subroutine inner_scsrsm(tra,ctra,lower,unit,nr,nc,& !!$ & irp,ja,val,x,ldx,y,ldy,info) !!$ implicit none !!$ logical, intent(in) :: tra,ctra,lower,unit !!$ integer(psb_ipk_), intent(in) :: nr,nc,ldx,ldy,irp(*),ja(*) !!$ real(psb_dpk_), intent(in) :: val(*), x(ldx,*) !!$ real(psb_dpk_), intent(out) :: y(ldy,*) !!$ integer(psb_ipk_), intent(out) :: info !!$ integer(psb_ipk_) :: i,j,k,m, ir, jc !!$ real(psb_dpk_), allocatable :: acc(:) !!$ !!$ info = psb_success_ !!$ allocate(acc(nc), stat=info) !!$ if(info /= psb_success_) then !!$ info=psb_err_from_subroutine_ !!$ return !!$ end if !!$ !!$ !!$ if ((.not.tra).and.(.not.ctra)) then !!$ if (lower) then !!$ if (unit) then !!$ do i=1, nr !!$ acc = dzero !!$ do j=irp(i), irp(i+1)-1 !!$ acc = acc + val(j)*y(ja(j),1:nc) !!$ end do !!$ y(i,1:nc) = x(i,1:nc) - acc !!$ end do !!$ else if (.not.unit) then !!$ do i=1, nr !!$ acc = dzero !!$ do j=irp(i), irp(i+1)-2 !!$ acc = acc + val(j)*y(ja(j),1:nc) !!$ end do !!$ y(i,1:nc) = (x(i,1:nc) - acc)/val(irp(i+1)-1) !!$ end do !!$ end if !!$ else if (.not.lower) then !!$ !!$ if (unit) then !!$ do i=nr, 1, -1 !!$ acc = dzero !!$ do j=irp(i), irp(i+1)-1 !!$ acc = acc + val(j)*y(ja(j),1:nc) !!$ end do !!$ y(i,1:nc) = x(i,1:nc) - acc !!$ end do !!$ else if (.not.unit) then !!$ do i=nr, 1, -1 !!$ acc = dzero !!$ do j=irp(i)+1, irp(i+1)-1 !!$ acc = acc + val(j)*y(ja(j),1:nc) !!$ end do !!$ y(i,1:nc) = (x(i,1:nc) - acc)/val(irp(i)) !!$ end do !!$ end if !!$ !!$ end if !!$ !!$ else if (tra) then !!$ !!$ do i=1, nr !!$ y(i,1:nc) = x(i,1:nc) !!$ end do !!$ !!$ if (lower) then !!$ if (unit) then !!$ do i=nr, 1, -1 !!$ acc = y(i,1:nc) !!$ do j=irp(i), irp(i+1)-1 !!$ jc = ja(j) !!$ y(jc,1:nc) = y(jc,1:nc) - val(j)*acc !!$ end do !!$ end do !!$ else if (.not.unit) then !!$ do i=nr, 1, -1 !!$ y(i,1:nc) = y(i,1:nc)/val(irp(i+1)-1) !!$ acc = y(i,1:nc) !!$ do j=irp(i), irp(i+1)-2 !!$ jc = ja(j) !!$ y(jc,1:nc) = y(jc,1:nc) - val(j)*acc !!$ end do !!$ end do !!$ end if !!$ else if (.not.lower) then !!$ !!$ if (unit) then !!$ do i=1, nr !!$ acc = y(i,1:nc) !!$ do j=irp(i), irp(i+1)-1 !!$ jc = ja(j) !!$ y(jc,1:nc) = y(jc,1:nc) - val(j)*acc !!$ end do !!$ end do !!$ else if (.not.unit) then !!$ do i=1, nr !!$ y(i,1:nc) = y(i,1:nc)/val(irp(i)) !!$ acc = y(i,1:nc) !!$ do j=irp(i)+1, irp(i+1)-1 !!$ jc = ja(j) !!$ y(jc,1:nc) = y(jc,1:nc) - val(j)*acc !!$ end do !!$ end do !!$ end if !!$ !!$ end if !!$ !!$ else if (ctra) then !!$ !!$ do i=1, nr !!$ y(i,1:nc) = x(i,1:nc) !!$ end do !!$ !!$ if (lower) then !!$ if (unit) then !!$ do i=nr, 1, -1 !!$ acc = y(i,1:nc) !!$ do j=irp(i), irp(i+1)-1 !!$ jc = ja(j) !!$ y(jc,1:nc) = y(jc,1:nc) - (val(j))*acc !!$ end do !!$ end do !!$ else if (.not.unit) then !!$ do i=nr, 1, -1 !!$ y(i,1:nc) = y(i,1:nc)/(val(irp(i+1)-1)) !!$ acc = y(i,1:nc) !!$ do j=irp(i), irp(i+1)-2 !!$ jc = ja(j) !!$ y(jc,1:nc) = y(jc,1:nc) - (val(j))*acc !!$ end do !!$ end do !!$ end if !!$ else if (.not.lower) then !!$ !!$ if (unit) then !!$ do i=1, nr !!$ acc = y(i,1:nc) !!$ do j=irp(i), irp(i+1)-1 !!$ jc = ja(j) !!$ y(jc,1:nc) = y(jc,1:nc) - (val(j))*acc !!$ end do !!$ end do !!$ else if (.not.unit) then !!$ do i=1, nr !!$ y(i,1:nc) = y(i,1:nc)/(val(irp(i))) !!$ acc = y(i,1:nc) !!$ do j=irp(i)+1, irp(i+1)-1 !!$ jc = ja(j) !!$ y(jc,1:nc) = y(jc,1:nc) - (val(j))*acc !!$ end do !!$ end do !!$ end if !!$ !!$ end if !!$ end if !!$ end subroutine inner_scsrsm !!$ !!$end subroutine psb_d_scsr_cssm !!$ !!$function psb_d_scsr_maxval(a) result(res) !!$ use psb_error_mod !!$ use psb_d_scsr_mat_mod, psb_protect_name => psb_d_scsr_maxval !!$ implicit none !!$ class(psb_d_scsr_sparse_mat), intent(in) :: a !!$ real(psb_dpk_) :: res !!$ !!$ integer(psb_ipk_) :: i,j,k,m,n, nnz, ir, jc, nc, info !!$ integer(psb_ipk_) :: ierr(5) !!$ character(len=20) :: name='d_scsr_maxval' !!$ logical, parameter :: debug=.false. !!$ !!$ !!$ res = dzero !!$ nnz = a%get_nzeros() !!$ if (allocated(a%val)) then !!$ nnz = min(nnz,size(a%val)) !!$ res = maxval(abs(a%val(1:nnz))) !!$ end if !!$end function psb_d_scsr_maxval !!$ !!$function psb_d_scsr_csnmi(a) result(res) !!$ use psb_error_mod !!$ use psb_d_scsr_mat_mod, psb_protect_name => psb_d_scsr_csnmi !!$ implicit none !!$ class(psb_d_scsr_sparse_mat), intent(in) :: a !!$ real(psb_dpk_) :: res !!$ !!$ integer(psb_ipk_) :: i,j,k,m,n, nr, ir, jc, nc !!$ real(psb_dpk_) :: acc !!$ logical :: tra !!$ integer(psb_ipk_) :: err_act !!$ integer(psb_ipk_) :: ierr(5) !!$ character(len=20) :: name='d_csnmi' !!$ logical, parameter :: debug=.false. !!$ !!$ !!$ res = dzero !!$ !!$ do i = 1, a%get_nrows() !!$ acc = dzero !!$ do j=a%irp(i),a%irp(i+1)-1 !!$ acc = acc + abs(a%val(j)) !!$ end do !!$ res = max(res,acc) !!$ end do !!$ !!$end function psb_d_scsr_csnmi !!$ !!$function psb_d_scsr_csnm1(a) result(res) !!$ use psb_error_mod !!$ use psb_const_mod !!$ use psb_d_scsr_mat_mod, psb_protect_name => psb_d_scsr_csnm1 !!$ !!$ implicit none !!$ class(psb_d_scsr_sparse_mat), intent(in) :: a !!$ real(psb_dpk_) :: res !!$ !!$ integer(psb_ipk_) :: i,j,k,m,n, nnz, ir, jc, nc, info !!$ real(psb_dpk_) :: acc !!$ real(psb_dpk_), allocatable :: vt(:) !!$ logical :: tra !!$ integer(psb_ipk_) :: err_act !!$ integer(psb_ipk_) :: ierr(5) !!$ character(len=20) :: name='d_scsr_csnm1' !!$ logical, parameter :: debug=.false. !!$ !!$ !!$ res = dzero !!$ nnz = a%get_nzeros() !!$ m = a%get_nrows() !!$ n = a%get_ncols() !!$ allocate(vt(n),stat=info) !!$ if (info /= 0) return !!$ vt(:) = dzero !!$ do i=1, m !!$ do j=a%irp(i),a%irp(i+1)-1 !!$ k = a%ja(j) !!$ vt(k) = vt(k) + abs(a%val(j)) !!$ end do !!$ end do !!$ res = maxval(vt(1:n)) !!$ deallocate(vt,stat=info) !!$ !!$ return !!$ !!$end function psb_d_scsr_csnm1 !!$ !!$subroutine psb_d_scsr_rowsum(d,a) !!$ use psb_error_mod !!$ use psb_const_mod !!$ use psb_d_scsr_mat_mod, psb_protect_name => psb_d_scsr_rowsum !!$ class(psb_d_scsr_sparse_mat), intent(in) :: a !!$ real(psb_dpk_), intent(out) :: d(:) !!$ !!$ integer(psb_ipk_) :: i,j,k,m,n, nnz, ir, jc, nc !!$ real(psb_dpk_) :: acc !!$ real(psb_dpk_), allocatable :: vt(:) !!$ logical :: tra !!$ integer(psb_ipk_) :: err_act, info !!$ integer(psb_ipk_) :: ierr(5) !!$ character(len=20) :: name='rowsum' !!$ logical, parameter :: debug=.false. !!$ !!$ call psb_erractionsave(err_act) !!$ !!$ m = a%get_nrows() !!$ if (size(d) < m) then !!$ info=psb_err_input_asize_small_i_ !!$ ierr(1) = 1; ierr(2) = size(d); ierr(3) = m !!$ call psb_errpush(info,name,i_err=ierr) !!$ goto 9999 !!$ end if !!$ !!$ do i = 1, a%get_nrows() !!$ d(i) = dzero !!$ do j=a%irp(i),a%irp(i+1)-1 !!$ d(i) = d(i) + (a%val(j)) !!$ end do !!$ end do !!$ !!$ if (a%is_unit()) then !!$ do i=1, m !!$ d(i) = d(i) + done !!$ end do !!$ end if !!$ !!$ return !!$ call psb_erractionrestore(err_act) !!$ return !!$ !!$9999 call psb_error_handler(err_act) !!$ return !!$ !!$end subroutine psb_d_scsr_rowsum !!$ !!$subroutine psb_d_scsr_arwsum(d,a) !!$ use psb_error_mod !!$ use psb_const_mod !!$ use psb_d_scsr_mat_mod, psb_protect_name => psb_d_scsr_arwsum !!$ class(psb_d_scsr_sparse_mat), intent(in) :: a !!$ real(psb_dpk_), intent(out) :: d(:) !!$ !!$ integer(psb_ipk_) :: i,j,k,m,n, nnz, ir, jc, nc !!$ real(psb_dpk_) :: acc !!$ real(psb_dpk_), allocatable :: vt(:) !!$ logical :: tra !!$ integer(psb_ipk_) :: err_act, info !!$ integer(psb_ipk_) :: ierr(5) !!$ character(len=20) :: name='rowsum' !!$ logical, parameter :: debug=.false. !!$ !!$ call psb_erractionsave(err_act) !!$ !!$ m = a%get_nrows() !!$ if (size(d) < m) then !!$ info=psb_err_input_asize_small_i_ !!$ ierr(1) = 1; ierr(2) = size(d); ierr(3) = m !!$ call psb_errpush(info,name,i_err=ierr) !!$ goto 9999 !!$ end if !!$ !!$ !!$ do i = 1, a%get_nrows() !!$ d(i) = dzero !!$ do j=a%irp(i),a%irp(i+1)-1 !!$ d(i) = d(i) + abs(a%val(j)) !!$ end do !!$ end do !!$ !!$ if (a%is_unit()) then !!$ do i=1, m !!$ d(i) = d(i) + done !!$ end do !!$ end if !!$ !!$ call psb_erractionrestore(err_act) !!$ return !!$ !!$9999 call psb_error_handler(err_act) !!$ return !!$ !!$end subroutine psb_d_scsr_arwsum !!$ !!$subroutine psb_d_scsr_colsum(d,a) !!$ use psb_error_mod !!$ use psb_const_mod !!$ use psb_d_scsr_mat_mod, psb_protect_name => psb_d_scsr_colsum !!$ class(psb_d_scsr_sparse_mat), intent(in) :: a !!$ real(psb_dpk_), intent(out) :: d(:) !!$ !!$ integer(psb_ipk_) :: i,j,k,m,n, nnz, ir, jc, nc !!$ real(psb_dpk_) :: acc !!$ real(psb_dpk_), allocatable :: vt(:) !!$ logical :: tra !!$ integer(psb_ipk_) :: err_act, info !!$ integer(psb_ipk_) :: ierr(5) !!$ character(len=20) :: name='colsum' !!$ logical, parameter :: debug=.false. !!$ !!$ call psb_erractionsave(err_act) !!$ !!$ m = a%get_nrows() !!$ n = a%get_ncols() !!$ if (size(d) < n) then !!$ info=psb_err_input_asize_small_i_ !!$ ierr(1) = 1; ierr(2) = size(d); ierr(3) = n !!$ call psb_errpush(info,name,i_err=ierr) !!$ goto 9999 !!$ end if !!$ !!$ d = dzero !!$ !!$ do i=1, m !!$ do j=a%irp(i),a%irp(i+1)-1 !!$ k = a%ja(j) !!$ d(k) = d(k) + (a%val(j)) !!$ end do !!$ end do !!$ !!$ if (a%is_unit()) then !!$ do i=1, n !!$ d(i) = d(i) + done !!$ end do !!$ end if !!$ !!$ return !!$ call psb_erractionrestore(err_act) !!$ return !!$ !!$9999 call psb_error_handler(err_act) !!$ return !!$ !!$end subroutine psb_d_scsr_colsum !!$ !!$subroutine psb_d_scsr_aclsum(d,a) !!$ use psb_error_mod !!$ use psb_const_mod !!$ use psb_d_scsr_mat_mod, psb_protect_name => psb_d_scsr_aclsum !!$ class(psb_d_scsr_sparse_mat), intent(in) :: a !!$ real(psb_dpk_), intent(out) :: d(:) !!$ !!$ integer(psb_ipk_) :: i,j,k,m,n, nnz, ir, jc, nc !!$ real(psb_dpk_) :: acc !!$ real(psb_dpk_), allocatable :: vt(:) !!$ logical :: tra !!$ integer(psb_ipk_) :: err_act, info !!$ integer(psb_ipk_) :: ierr(5) !!$ character(len=20) :: name='aclsum' !!$ logical, parameter :: debug=.false. !!$ !!$ call psb_erractionsave(err_act) !!$ !!$ m = a%get_nrows() !!$ n = a%get_ncols() !!$ if (size(d) < n) then !!$ info=psb_err_input_asize_small_i_ !!$ ierr(1) = 1; ierr(2) = size(d); ierr(3) = n !!$ call psb_errpush(info,name,i_err=ierr) !!$ goto 9999 !!$ end if !!$ !!$ d = dzero !!$ !!$ do i=1, m !!$ do j=a%irp(i),a%irp(i+1)-1 !!$ k = a%ja(j) !!$ d(k) = d(k) + abs(a%val(j)) !!$ end do !!$ end do !!$ !!$ if (a%is_unit()) then !!$ do i=1, n !!$ d(i) = d(i) + done !!$ end do !!$ end if !!$ !!$ return !!$ call psb_erractionrestore(err_act) !!$ return !!$ !!$9999 call psb_error_handler(err_act) !!$ return !!$ !!$end subroutine psb_d_scsr_aclsum !!$ !!$subroutine psb_d_scsr_get_diag(a,d,info) !!$ use psb_error_mod !!$ use psb_const_mod !!$ use psb_d_scsr_mat_mod, psb_protect_name => psb_d_scsr_get_diag !!$ implicit none !!$ class(psb_d_scsr_sparse_mat), intent(in) :: a !!$ real(psb_dpk_), intent(out) :: d(:) !!$ integer(psb_ipk_), intent(out) :: info !!$ !!$ integer(psb_ipk_) :: err_act, mnm, i, j, k !!$ integer(psb_ipk_) :: ierr(5) !!$ character(len=20) :: name='get_diag' !!$ logical, parameter :: debug=.false. !!$ !!$ info = psb_success_ !!$ call psb_erractionsave(err_act) !!$ !!$ mnm = min(a%get_nrows(),a%get_ncols()) !!$ if (size(d) < mnm) then !!$ info=psb_err_input_asize_invalid_i_ !!$ ierr(1) = 2; ierr(2) = size(d); !!$ call psb_errpush(info,name,i_err=ierr) !!$ goto 9999 !!$ end if !!$ !!$ !!$ if (a%is_unit()) then !!$ d(1:mnm) = done !!$ else !!$ do i=1, mnm !!$ d(i) = dzero !!$ do k=a%irp(i),a%irp(i+1)-1 !!$ j=a%ja(k) !!$ if ((j == i) .and.(j <= mnm )) then !!$ d(i) = a%val(k) !!$ endif !!$ enddo !!$ end do !!$ end if !!$ do i=mnm+1,size(d) !!$ d(i) = dzero !!$ end do !!$ !!$ call psb_erractionrestore(err_act) !!$ return !!$ !!$9999 call psb_error_handler(err_act) !!$ return !!$ !!$end subroutine psb_d_scsr_get_diag !!$ !!$ !!$subroutine psb_d_scsr_scal(d,a,info,side) !!$ use psb_error_mod !!$ use psb_const_mod !!$ use psb_d_scsr_mat_mod, psb_protect_name => psb_d_scsr_scal !!$ use psb_string_mod !!$ implicit none !!$ class(psb_d_scsr_sparse_mat), intent(inout) :: a !!$ real(psb_dpk_), intent(in) :: d(:) !!$ integer(psb_ipk_), intent(out) :: info !!$ character, intent(in), optional :: side !!$ !!$ integer(psb_ipk_) :: err_act,mnm, i, j, m !!$ integer(psb_ipk_) :: ierr(5) !!$ character(len=20) :: name='scal' !!$ character :: side_ !!$ logical :: left !!$ logical, parameter :: debug=.false. !!$ !!$ info = psb_success_ !!$ call psb_erractionsave(err_act) !!$ !!$ if (a%is_unit()) then !!$ call a%make_nonunit() !!$ end if !!$ !!$ side_ = 'L' !!$ if (present(side)) then !!$ side_ = psb_toupper(side) !!$ end if !!$ !!$ left = (side_ == 'L') !!$ !!$ if (left) then !!$ m = a%get_nrows() !!$ if (size(d) < m) then !!$ info=psb_err_input_asize_invalid_i_ !!$ ierr(1) = 2; ierr(2) = size(d); !!$ call psb_errpush(info,name,i_err=ierr) !!$ goto 9999 !!$ end if !!$ !!$ do i=1, m !!$ do j = a%irp(i), a%irp(i+1) -1 !!$ a%val(j) = a%val(j) * d(i) !!$ end do !!$ enddo !!$ else !!$ m = a%get_ncols() !!$ if (size(d) < m) then !!$ info=psb_err_input_asize_invalid_i_ !!$ ierr(1) = 2; ierr(2) = size(d); !!$ call psb_errpush(info,name,i_err=ierr) !!$ goto 9999 !!$ end if !!$ !!$ do i=1,a%get_nzeros() !!$ j = a%ja(i) !!$ a%val(i) = a%val(i) * d(j) !!$ enddo !!$ end if !!$ !!$ !!$ !!$ call psb_erractionrestore(err_act) !!$ return !!$ !!$9999 call psb_error_handler(err_act) !!$ return !!$ !!$end subroutine psb_d_scsr_scal !!$ !!$ !!$subroutine psb_d_scsr_scals(d,a,info) !!$ use psb_error_mod !!$ use psb_const_mod !!$ use psb_d_scsr_mat_mod, psb_protect_name => psb_d_scsr_scals !!$ implicit none !!$ class(psb_d_scsr_sparse_mat), intent(inout) :: a !!$ real(psb_dpk_), intent(in) :: d !!$ integer(psb_ipk_), intent(out) :: info !!$ !!$ integer(psb_ipk_) :: err_act,mnm, i, j, m !!$ integer(psb_ipk_) :: ierr(5) !!$ character(len=20) :: name='scal' !!$ logical, parameter :: debug=.false. !!$ !!$ info = psb_success_ !!$ call psb_erractionsave(err_act) !!$ !!$ if (a%is_unit()) then !!$ call a%make_nonunit() !!$ end if !!$ !!$ do i=1,a%get_nzeros() !!$ a%val(i) = a%val(i) * d !!$ enddo !!$ !!$ call psb_erractionrestore(err_act) !!$ return !!$ !!$9999 call psb_error_handler(err_act) !!$ return !!$ !!$end subroutine psb_d_scsr_scals !!$ ! == =================================== ! ! ! ! Data management ! ! ! ! ! ! == =================================== !!$ !!$subroutine psb_d_scsr_reallocate_nz(nz,a) !!$ use psb_error_mod !!$ use psb_realloc_mod !!$ use psb_d_scsr_mat_mod, psb_protect_name => psb_d_scsr_reallocate_nz !!$ implicit none !!$ integer(psb_ipk_), intent(in) :: nz !!$ class(psb_d_scsr_sparse_mat), intent(inout) :: a !!$ integer(psb_ipk_) :: err_act, info !!$ integer(psb_ipk_) :: ierr(5) !!$ character(len=20) :: name='d_scsr_reallocate_nz' !!$ logical, parameter :: debug=.false. !!$ !!$ call psb_erractionsave(err_act) !!$ !!$ call psb_realloc(nz,a%ja,info) !!$ if (info == psb_success_) call psb_realloc(nz,a%val,info) !!$ if (info == psb_success_) call psb_realloc(& !!$ & max(nz,a%get_nrows()+1,a%get_ncols()+1),a%irp,info) !!$ if (info /= psb_success_) then !!$ call psb_errpush(psb_err_alloc_dealloc_,name) !!$ goto 9999 !!$ end if !!$ !!$ call psb_erractionrestore(err_act) !!$ return !!$ !!$9999 call psb_error_handler(err_act) !!$ return !!$ !!$end subroutine psb_d_scsr_reallocate_nz subroutine psb_d_scsr_mold(a,b,info) use psb_d_scsr_mat_mod, psb_protect_name => psb_d_scsr_mold use psb_error_mod implicit none class(psb_d_scsr_sparse_mat), intent(in) :: a class(psb_d_base_sparse_mat), intent(inout), allocatable :: b integer(psb_ipk_), intent(out) :: info integer(psb_ipk_) :: err_act integer(psb_ipk_) :: ierr(5) character(len=20) :: name='scsr_mold' logical, parameter :: debug=.false. call psb_get_erraction(err_act) info = 0 if (allocated(b)) then call b%free() deallocate(b,stat=info) end if if (info == 0) allocate(psb_d_scsr_sparse_mat :: b, stat=info) if (info /= 0) then info = psb_err_alloc_dealloc_ call psb_errpush(info, name) goto 9999 end if return 9999 call psb_error_handler(err_act) return end subroutine psb_d_scsr_mold !!$subroutine psb_d_scsr_allocate_mnnz(m,n,a,nz) !!$ use psb_error_mod !!$ use psb_realloc_mod !!$ use psb_d_scsr_mat_mod, psb_protect_name => psb_d_scsr_allocate_mnnz !!$ implicit none !!$ integer(psb_ipk_), intent(in) :: m,n !!$ class(psb_d_scsr_sparse_mat), intent(inout) :: a !!$ integer(psb_ipk_), intent(in), optional :: nz !!$ integer(psb_ipk_) :: err_act, info, nz_ !!$ integer(psb_ipk_) :: ierr(5) !!$ character(len=20) :: name='allocate_mnz' !!$ logical, parameter :: debug=.false. !!$ !!$ call psb_erractionsave(err_act) !!$ info = psb_success_ !!$ if (m < 0) then !!$ info = psb_err_iarg_neg_ !!$ ierr(1) = ione; ierr(2) = izero; !!$ call psb_errpush(info,name,i_err=ierr) !!$ goto 9999 !!$ endif !!$ if (n < 0) then !!$ info = psb_err_iarg_neg_ !!$ ierr(1) = 2; ierr(2) = izero; !!$ call psb_errpush(info,name,i_err=ierr) !!$ goto 9999 !!$ endif !!$ if (present(nz)) then !!$ nz_ = nz !!$ else !!$ nz_ = max(7*m,7*n,1) !!$ end if !!$ if (nz_ < 0) then !!$ info = psb_err_iarg_neg_ !!$ ierr(1) = 3; ierr(2) = izero; !!$ call psb_errpush(info,name,i_err=ierr) !!$ goto 9999 !!$ endif !!$ !!$ if (info == psb_success_) call psb_realloc(m+1,a%irp,info) !!$ if (info == psb_success_) call psb_realloc(nz_,a%ja,info) !!$ if (info == psb_success_) call psb_realloc(nz_,a%val,info) !!$ if (info == psb_success_) then !!$ a%irp=0 !!$ call a%set_nrows(m) !!$ call a%set_ncols(n) !!$ call a%set_bld() !!$ call a%set_triangle(.false.) !!$ call a%set_unit(.false.) !!$ call a%set_dupl(psb_dupl_def_) !!$ end if !!$ !!$ call psb_erractionrestore(err_act) !!$ return !!$ !!$9999 call psb_error_handler(err_act) !!$ return !!$ !!$end subroutine psb_d_scsr_allocate_mnnz !!$ !!$ !!$subroutine psb_d_scsr_csgetptn(imin,imax,a,nz,ia,ja,info,& !!$ & jmin,jmax,iren,append,nzin,rscale,cscale) !!$ ! Output is always in COO format !!$ use psb_error_mod !!$ use psb_const_mod !!$ use psb_error_mod !!$ use psb_d_base_mat_mod !!$ use psb_d_scsr_mat_mod, psb_protect_name => psb_d_scsr_csgetptn !!$ implicit none !!$ !!$ class(psb_d_scsr_sparse_mat), intent(in) :: a !!$ integer(psb_ipk_), intent(in) :: imin,imax !!$ integer(psb_ipk_), intent(out) :: nz !!$ integer(psb_ipk_), allocatable, intent(inout) :: ia(:), ja(:) !!$ integer(psb_ipk_),intent(out) :: info !!$ logical, intent(in), optional :: append !!$ integer(psb_ipk_), intent(in), optional :: iren(:) !!$ integer(psb_ipk_), intent(in), optional :: jmin,jmax, nzin !!$ logical, intent(in), optional :: rscale,cscale !!$ !!$ logical :: append_, rscale_, cscale_ !!$ integer(psb_ipk_) :: nzin_, jmin_, jmax_, err_act, i !!$ integer(psb_ipk_) :: ierr(5) !!$ character(len=20) :: name='csget' !!$ logical, parameter :: debug=.false. !!$ !!$ call psb_erractionsave(err_act) !!$ info = psb_success_ !!$ !!$ if (present(jmin)) then !!$ jmin_ = jmin !!$ else !!$ jmin_ = 1 !!$ endif !!$ if (present(jmax)) then !!$ jmax_ = jmax !!$ else !!$ jmax_ = a%get_ncols() !!$ endif !!$ !!$ if ((imax psb_d_scsr_csgetrow !!$ implicit none !!$ !!$ class(psb_d_scsr_sparse_mat), intent(in) :: a !!$ integer(psb_ipk_), intent(in) :: imin,imax !!$ integer(psb_ipk_), intent(out) :: nz !!$ integer(psb_ipk_), allocatable, intent(inout) :: ia(:), ja(:) !!$ real(psb_dpk_), allocatable, intent(inout) :: val(:) !!$ integer(psb_ipk_),intent(out) :: info !!$ logical, intent(in), optional :: append !!$ integer(psb_ipk_), intent(in), optional :: iren(:) !!$ integer(psb_ipk_), intent(in), optional :: jmin,jmax, nzin !!$ logical, intent(in), optional :: rscale,cscale !!$ !!$ logical :: append_, rscale_, cscale_ !!$ integer(psb_ipk_) :: nzin_, jmin_, jmax_, err_act, i !!$ integer(psb_ipk_) :: ierr(5) !!$ character(len=20) :: name='csget' !!$ logical, parameter :: debug=.false. !!$ !!$ call psb_erractionsave(err_act) !!$ info = psb_success_ !!$ !!$ if (present(jmin)) then !!$ jmin_ = jmin !!$ else !!$ jmin_ = 1 !!$ endif !!$ if (present(jmax)) then !!$ jmax_ = jmax !!$ else !!$ jmax_ = a%get_ncols() !!$ endif !!$ !!$ if ((imax psb_d_scsr_csgetblk !!$ implicit none !!$ !!$ class(psb_d_scsr_sparse_mat), intent(in) :: a !!$ class(psb_d_coo_sparse_mat), intent(inout) :: b !!$ integer(psb_ipk_), intent(in) :: imin,imax !!$ integer(psb_ipk_),intent(out) :: info !!$ logical, intent(in), optional :: append !!$ integer(psb_ipk_), intent(in), optional :: iren(:) !!$ integer(psb_ipk_), intent(in), optional :: jmin,jmax !!$ logical, intent(in), optional :: rscale,cscale !!$ integer(psb_ipk_) :: err_act, nzin, nzout !!$ integer(psb_ipk_) :: ierr(5) !!$ character(len=20) :: name='csget' !!$ logical :: append_ !!$ logical, parameter :: debug=.false. !!$ !!$ call psb_erractionsave(err_act) !!$ info = psb_success_ !!$ !!$ if (present(append)) then !!$ append_ = append !!$ else !!$ append_ = .false. !!$ endif !!$ if (append_) then !!$ nzin = a%get_nzeros() !!$ else !!$ nzin = 0 !!$ endif !!$ !!$ call a%csget(imin,imax,nzout,b%ia,b%ja,b%val,info,& !!$ & jmin=jmin, jmax=jmax, iren=iren, append=append_, & !!$ & nzin=nzin, rscale=rscale, cscale=cscale) !!$ !!$ if (info /= psb_success_) goto 9999 !!$ !!$ call b%set_nzeros(nzin+nzout) !!$ call b%fix(info) !!$ if (info /= psb_success_) goto 9999 !!$ !!$ call psb_erractionrestore(err_act) !!$ return !!$ !!$9999 call psb_error_handler(err_act) !!$ return !!$ !!$end subroutine psb_d_scsr_csgetblk !!$ !!$ !!$ !!$subroutine psb_d_scsr_csput_a(nz,ia,ja,val,a,imin,imax,jmin,jmax,info,gtl) !!$ use psb_error_mod !!$ use psb_realloc_mod !!$ use psb_d_scsr_mat_mod, psb_protect_name => psb_d_scsr_csput_a !!$ implicit none !!$ !!$ class(psb_d_scsr_sparse_mat), intent(inout) :: a !!$ real(psb_dpk_), intent(in) :: val(:) !!$ integer(psb_ipk_), intent(in) :: nz, ia(:), ja(:), imin,imax,jmin,jmax !!$ integer(psb_ipk_), intent(out) :: info !!$ integer(psb_ipk_), intent(in), optional :: gtl(:) !!$ !!$ !!$ integer(psb_ipk_) :: err_act !!$ integer(psb_ipk_) :: ierr(5) !!$ character(len=20) :: name='d_scsr_csput' !!$ logical, parameter :: debug=.false. !!$ integer(psb_ipk_) :: nza, i,j,k, nzl, isza !!$ !!$ !!$ call psb_erractionsave(err_act) !!$ info = psb_success_ !!$ !!$ if (nz <= 0) then !!$ info = psb_err_iarg_neg_ !!$ ierr(1)=1 !!$ call psb_errpush(info,name,i_err=ierr) !!$ goto 9999 !!$ end if !!$ if (size(ia) < nz) then !!$ info = psb_err_input_asize_invalid_i_ !!$ ierr(1)=2 !!$ call psb_errpush(info,name,i_err=ierr) !!$ goto 9999 !!$ end if !!$ !!$ if (size(ja) < nz) then !!$ info = psb_err_input_asize_invalid_i_ !!$ ierr(1)=3 !!$ call psb_errpush(info,name,i_err=ierr) !!$ goto 9999 !!$ end if !!$ if (size(val) < nz) then !!$ info = psb_err_input_asize_invalid_i_ !!$ ierr(1)=4 !!$ call psb_errpush(info,name,i_err=ierr) !!$ goto 9999 !!$ end if !!$ !!$ if (nz == 0) return !!$ !!$ nza = a%get_nzeros() !!$ !!$ if (a%is_bld()) then !!$ ! Build phase should only ever be in COO !!$ info = psb_err_invalid_mat_state_ !!$ !!$ else if (a%is_upd()) then !!$ call psb_d_scsr_srch_upd(nz,ia,ja,val,a,& !!$ & imin,imax,jmin,jmax,info,gtl) !!$ !!$ if (info /= psb_success_) then !!$ !!$ info = psb_err_invalid_mat_state_ !!$ end if !!$ !!$ else !!$ ! State is wrong. !!$ info = psb_err_invalid_mat_state_ !!$ end if !!$ if (info /= psb_success_) then !!$ call psb_errpush(info,name) !!$ goto 9999 !!$ end if !!$ !!$ call psb_erractionrestore(err_act) !!$ return !!$ !!$9999 call psb_error_handler(err_act) !!$ return !!$ !!$ !!$contains !!$ !!$ subroutine psb_d_scsr_srch_upd(nz,ia,ja,val,a,& !!$ & imin,imax,jmin,jmax,info,gtl) !!$ !!$ use psb_const_mod !!$ use psb_realloc_mod !!$ use psb_string_mod !!$ use psb_sort_mod !!$ implicit none !!$ !!$ class(psb_d_scsr_sparse_mat), intent(inout) :: a !!$ integer(psb_ipk_), intent(in) :: nz, imin,imax,jmin,jmax !!$ integer(psb_ipk_), intent(in) :: ia(:),ja(:) !!$ real(psb_dpk_), intent(in) :: val(:) !!$ integer(psb_ipk_), intent(out) :: info !!$ integer(psb_ipk_), intent(in), optional :: gtl(:) !!$ integer(psb_ipk_) :: i,ir,ic, ilr, ilc, ip, & !!$ & i1,i2,nr,nc,nnz,dupl,ng !!$ integer(psb_ipk_) :: debug_level, debug_unit !!$ character(len=20) :: name='d_scsr_srch_upd' !!$ !!$ info = psb_success_ !!$ debug_unit = psb_get_debug_unit() !!$ debug_level = psb_get_debug_level() !!$ !!$ dupl = a%get_dupl() !!$ !!$ if (.not.a%is_sorted()) then !!$ info = -4 !!$ return !!$ end if !!$ !!$ ilr = -1 !!$ ilc = -1 !!$ nnz = a%get_nzeros() !!$ nr = a%get_nrows() !!$ nc = a%get_ncols() !!$ !!$ if (present(gtl)) then !!$ ng = size(gtl) !!$ !!$ select case(dupl) !!$ case(psb_dupl_ovwrt_,psb_dupl_err_) !!$ ! Overwrite. !!$ ! Cannot test for error, should have been caught earlier. !!$ !!$ ilr = -1 !!$ ilc = -1 !!$ do i=1, nz !!$ ir = ia(i) !!$ ic = ja(i) !!$ if ((ir >=1).and.(ir<=ng).and.(ic>=1).and.(ic<=ng)) then !!$ ir = gtl(ir) !!$ ic = gtl(ic) !!$ if ((ir > 0).and.(ir <= nr)) then !!$ i1 = a%irp(ir) !!$ i2 = a%irp(ir+1) !!$ nc=i2-i1 !!$ !!$ ip = psb_ibsrch(ic,nc,a%ja(i1:i2-1)) !!$ if (ip>0) then !!$ a%val(i1+ip-1) = val(i) !!$ else !!$ if (debug_level >= psb_debug_serial_) & !!$ & write(debug_unit,*) trim(name),& !!$ & ': Was searching ',ic,' in: ',i1,i2,& !!$ & ' : ',a%ja(i1:i2-1) !!$ info = i !!$ return !!$ end if !!$ !!$ else !!$ !!$ if (debug_level >= psb_debug_serial_) & !!$ & write(debug_unit,*) trim(name),& !!$ & ': Discarding row that does not belong to us.' !!$ end if !!$ end if !!$ end do !!$ !!$ case(psb_dupl_add_) !!$ ! Add !!$ ilr = -1 !!$ ilc = -1 !!$ do i=1, nz !!$ ir = ia(i) !!$ ic = ja(i) !!$ if ((ir >=1).and.(ir<=ng).and.(ic>=1).and.(ic<=ng)) then !!$ ir = gtl(ir) !!$ ic = gtl(ic) !!$ if ((ir > 0).and.(ir <= nr)) then !!$ i1 = a%irp(ir) !!$ i2 = a%irp(ir+1) !!$ nc = i2-i1 !!$ ip = psb_ibsrch(ic,nc,a%ja(i1:i2-1)) !!$ if (ip>0) then !!$ a%val(i1+ip-1) = a%val(i1+ip-1) + val(i) !!$ else !!$ if (debug_level >= psb_debug_serial_) & !!$ & write(debug_unit,*) trim(name),& !!$ & ': Was searching ',ic,' in: ',i1,i2,& !!$ & ' : ',a%ja(i1:i2-1) !!$ info = i !!$ return !!$ end if !!$ else !!$ if (debug_level >= psb_debug_serial_) & !!$ & write(debug_unit,*) trim(name),& !!$ & ': Discarding row that does not belong to us.' !!$ end if !!$ !!$ end if !!$ end do !!$ !!$ case default !!$ info = -3 !!$ if (debug_level >= psb_debug_serial_) & !!$ & write(debug_unit,*) trim(name),& !!$ & ': Duplicate handling: ',dupl !!$ end select !!$ !!$ else !!$ !!$ select case(dupl) !!$ case(psb_dupl_ovwrt_,psb_dupl_err_) !!$ ! Overwrite. !!$ ! Cannot test for error, should have been caught earlier. !!$ !!$ ilr = -1 !!$ ilc = -1 !!$ do i=1, nz !!$ ir = ia(i) !!$ ic = ja(i) !!$ !!$ if ((ir > 0).and.(ir <= nr)) then !!$ !!$ i1 = a%irp(ir) !!$ i2 = a%irp(ir+1) !!$ nc=i2-i1 !!$ !!$ ip = psb_ibsrch(ic,nc,a%ja(i1:i2-1)) !!$ if (ip>0) then !!$ a%val(i1+ip-1) = val(i) !!$ else !!$ if (debug_level >= psb_debug_serial_) & !!$ & write(debug_unit,*) trim(name),& !!$ & ': Was searching ',ic,' in: ',i1,i2,& !!$ & ' : ',a%ja(i1:i2-1) !!$ info = i !!$ return !!$ end if !!$ !!$ else !!$ if (debug_level >= psb_debug_serial_) & !!$ & write(debug_unit,*) trim(name),& !!$ & ': Discarding row that does not belong to us.' !!$ end if !!$ !!$ end do !!$ !!$ case(psb_dupl_add_) !!$ ! Add !!$ ilr = -1 !!$ ilc = -1 !!$ do i=1, nz !!$ ir = ia(i) !!$ ic = ja(i) !!$ if ((ir > 0).and.(ir <= nr)) then !!$ i1 = a%irp(ir) !!$ i2 = a%irp(ir+1) !!$ nc = i2-i1 !!$ ip = psb_ibsrch(ic,nc,a%ja(i1:i2-1)) !!$ if (ip>0) then !!$ a%val(i1+ip-1) = a%val(i1+ip-1) + val(i) !!$ else !!$ info = i !!$ return !!$ end if !!$ else !!$ if (debug_level >= psb_debug_serial_) & !!$ & write(debug_unit,*) trim(name),& !!$ & ': Discarding row that does not belong to us.' !!$ end if !!$ end do !!$ !!$ case default !!$ info = -3 !!$ if (debug_level >= psb_debug_serial_) & !!$ & write(debug_unit,*) trim(name),& !!$ & ': Duplicate handling: ',dupl !!$ end select !!$ !!$ end if !!$ !!$ end subroutine psb_d_scsr_srch_upd !!$ !!$end subroutine psb_d_scsr_csput_a !!$ !!$ !!$subroutine psb_d_scsr_reinit(a,clear) !!$ use psb_error_mod !!$ use psb_d_scsr_mat_mod, psb_protect_name => psb_d_scsr_reinit !!$ implicit none !!$ !!$ class(psb_d_scsr_sparse_mat), intent(inout) :: a !!$ logical, intent(in), optional :: clear !!$ !!$ integer(psb_ipk_) :: err_act, info !!$ integer(psb_ipk_) :: ierr(5) !!$ character(len=20) :: name='reinit' !!$ logical :: clear_ !!$ logical, parameter :: debug=.false. !!$ !!$ call psb_erractionsave(err_act) !!$ info = psb_success_ !!$ !!$ !!$ if (present(clear)) then !!$ clear_ = clear !!$ else !!$ clear_ = .true. !!$ end if !!$ !!$ if (a%is_bld() .or. a%is_upd()) then !!$ ! do nothing !!$ return !!$ else if (a%is_asb()) then !!$ if (clear_) a%val(:) = dzero !!$ call a%set_upd() !!$ else !!$ info = psb_err_invalid_mat_state_ !!$ call psb_errpush(info,name) !!$ goto 9999 !!$ end if !!$ !!$ call psb_erractionrestore(err_act) !!$ return !!$ !!$9999 call psb_error_handler(err_act) !!$ return !!$ !!$end subroutine psb_d_scsr_reinit subroutine psb_d_scsr_trim(a) use psb_realloc_mod use psb_error_mod use psb_d_scsr_mat_mod, psb_protect_name => psb_d_scsr_trim implicit none class(psb_d_scsr_sparse_mat), intent(inout) :: a integer(psb_ipk_) :: err_act, info, nz, m integer(psb_ipk_) :: ierr(5) character(len=20) :: name='trim' logical, parameter :: debug=.false. call psb_erractionsave(err_act) info = psb_success_ call a%psb_d_csr_sparse_mat%trim() call psb_realloc(a%nnerws,a%nerwids,info) if (info /= psb_success_) goto 9999 call psb_erractionrestore(err_act) return 9999 call psb_error_handler(err_act) return end subroutine psb_d_scsr_trim !!$subroutine psb_d_scsr_print(iout,a,iv,head,ivr,ivc) !!$ use psb_string_mod !!$ use psb_d_scsr_mat_mod, psb_protect_name => psb_d_scsr_print !!$ implicit none !!$ !!$ integer(psb_ipk_), intent(in) :: iout !!$ class(psb_d_scsr_sparse_mat), intent(in) :: a !!$ integer(psb_ipk_), intent(in), optional :: iv(:) !!$ character(len=*), optional :: head !!$ integer(psb_ipk_), intent(in), optional :: ivr(:), ivc(:) !!$ !!$ integer(psb_ipk_) :: err_act !!$ integer(psb_ipk_) :: ierr(5) !!$ character(len=20) :: name='d_scsr_print' !!$ logical, parameter :: debug=.false. !!$ character(len=*), parameter :: datatype='real' !!$ character(len=80) :: frmtv !!$ integer(psb_ipk_) :: irs,ics,i,j, nmx, ni, nr, nc, nz !!$ !!$ if (present(head)) then !!$ write(iout,'(a)') '%%MatrixMarket matrix coordinate real general' !!$ write(iout,'(a,a)') '% ',head !!$ write(iout,'(a)') '%' !!$ write(iout,'(a,a)') '% COO' !!$ endif !!$ !!$ nr = a%get_nrows() !!$ nc = a%get_ncols() !!$ nz = a%get_nzeros() !!$ nmx = max(nr,nc,1) !!$ ni = floor(log10(1.0*nmx)) + 1 !!$ !!$ if (datatype=='real') then !!$ write(frmtv,'(a,i3.3,a,i3.3,a)') '(2(i',ni,',1x),es26.18,1x,2(i',ni,',1x))' !!$ else !!$ write(frmtv,'(a,i3.3,a,i3.3,a)') '(2(i',ni,',1x),2(es26.18,1x),2(i',ni,',1x))' !!$ end if !!$ write(iout,*) nr, nc, nz !!$ if(present(iv)) then !!$ do i=1, nr !!$ do j=a%irp(i),a%irp(i+1)-1 !!$ write(iout,frmtv) iv(i),iv(a%ja(j)),a%val(j) !!$ end do !!$ enddo !!$ else !!$ if (present(ivr).and..not.present(ivc)) then !!$ do i=1, nr !!$ do j=a%irp(i),a%irp(i+1)-1 !!$ write(iout,frmtv) ivr(i),(a%ja(j)),a%val(j) !!$ end do !!$ enddo !!$ else if (present(ivr).and.present(ivc)) then !!$ do i=1, nr !!$ do j=a%irp(i),a%irp(i+1)-1 !!$ write(iout,frmtv) ivr(i),ivc(a%ja(j)),a%val(j) !!$ end do !!$ enddo !!$ else if (.not.present(ivr).and.present(ivc)) then !!$ do i=1, nr !!$ do j=a%irp(i),a%irp(i+1)-1 !!$ write(iout,frmtv) (i),ivc(a%ja(j)),a%val(j) !!$ end do !!$ enddo !!$ else if (.not.present(ivr).and..not.present(ivc)) then !!$ do i=1, nr !!$ do j=a%irp(i),a%irp(i+1)-1 !!$ write(iout,frmtv) (i),(a%ja(j)),a%val(j) !!$ end do !!$ enddo !!$ endif !!$ endif !!$ !!$end subroutine psb_d_scsr_print !!$ !!$ !!$subroutine psb_d_cp_scsr_from_coo(a,b,info) !!$ use psb_const_mod !!$ use psb_realloc_mod !!$ use psb_d_base_mat_mod !!$ use psb_d_scsr_mat_mod, psb_protect_name => psb_d_cp_scsr_from_coo !!$ implicit none !!$ !!$ class(psb_d_scsr_sparse_mat), intent(inout) :: a !!$ class(psb_d_coo_sparse_mat), intent(in) :: b !!$ integer(psb_ipk_), intent(out) :: info !!$ !!$ type(psb_d_coo_sparse_mat) :: tmp !!$ integer(psb_ipk_), allocatable :: itemp(:) !!$ !locals !!$ logical :: rwshr_ !!$ integer(psb_ipk_) :: nza, nr, i,j,irw, err_act, nc !!$ integer(psb_ipk_), Parameter :: maxtry=8 !!$ integer(psb_ipk_) :: debug_level, debug_unit !!$ character(len=20) :: name !!$ !!$ info = psb_success_ !!$ ! This is to have fix_coo called behind the scenes !!$ call tmp%cp_from_coo(b,info) !!$ if (info == psb_success_) call a%mv_from_coo(tmp,info) !!$ !!$end subroutine psb_d_cp_scsr_from_coo !!$ !!$ !!$ !!$subroutine psb_d_cp_scsr_to_coo(a,b,info) !!$ use psb_const_mod !!$ use psb_d_base_mat_mod !!$ use psb_d_scsr_mat_mod, psb_protect_name => psb_d_cp_scsr_to_coo !!$ implicit none !!$ !!$ class(psb_d_scsr_sparse_mat), intent(in) :: a !!$ class(psb_d_coo_sparse_mat), intent(inout) :: b !!$ integer(psb_ipk_), intent(out) :: info !!$ !!$ integer(psb_ipk_), allocatable :: itemp(:) !!$ !locals !!$ logical :: rwshr_ !!$ integer(psb_ipk_) :: nza, nr, nc,i,j,irw, err_act !!$ integer(psb_ipk_), Parameter :: maxtry=8 !!$ integer(psb_ipk_) :: debug_level, debug_unit !!$ character(len=20) :: name !!$ !!$ info = psb_success_ !!$ !!$ nr = a%get_nrows() !!$ nc = a%get_ncols() !!$ nza = a%get_nzeros() !!$ !!$ call b%allocate(nr,nc,nza) !!$ b%psb_d_base_sparse_mat = a%psb_d_base_sparse_mat !!$ !!$ do i=1, nr !!$ do j=a%irp(i),a%irp(i+1)-1 !!$ b%ia(j) = i !!$ b%ja(j) = a%ja(j) !!$ b%val(j) = a%val(j) !!$ end do !!$ end do !!$ call b%set_nzeros(a%get_nzeros()) !!$ call b%fix(info) !!$ !!$ !!$end subroutine psb_d_cp_scsr_to_coo !!$ !!$ !!$subroutine psb_d_mv_scsr_to_coo(a,b,info) !!$ use psb_const_mod !!$ use psb_realloc_mod !!$ use psb_d_base_mat_mod !!$ use psb_d_scsr_mat_mod, psb_protect_name => psb_d_mv_scsr_to_coo !!$ implicit none !!$ !!$ class(psb_d_scsr_sparse_mat), intent(inout) :: a !!$ class(psb_d_coo_sparse_mat), intent(inout) :: b !!$ integer(psb_ipk_), intent(out) :: info !!$ !!$ integer(psb_ipk_), allocatable :: itemp(:) !!$ !locals !!$ logical :: rwshr_ !!$ integer(psb_ipk_) :: nza, nr, nc,i,j,irw, err_act !!$ integer(psb_ipk_), Parameter :: maxtry=8 !!$ integer(psb_ipk_) :: debug_level, debug_unit !!$ character(len=20) :: name !!$ !!$ info = psb_success_ !!$ !!$ nr = a%get_nrows() !!$ nc = a%get_ncols() !!$ nza = a%get_nzeros() !!$ !!$ b%psb_d_base_sparse_mat = a%psb_d_base_sparse_mat !!$ call b%set_nzeros(a%get_nzeros()) !!$ call move_alloc(a%ja,b%ja) !!$ call move_alloc(a%val,b%val) !!$ call psb_realloc(nza,b%ia,info) !!$ if (info /= psb_success_) return !!$ do i=1, nr !!$ do j=a%irp(i),a%irp(i+1)-1 !!$ b%ia(j) = i !!$ end do !!$ end do !!$ call a%free() !!$ call b%fix(info) !!$ !!$ !!$end subroutine psb_d_mv_scsr_to_coo !!$ subroutine psb_d_mv_scsr_from_coo(a,b,info) use psb_const_mod use psb_realloc_mod use psb_error_mod use psb_d_base_mat_mod use psb_d_scsr_mat_mod, psb_protect_name => psb_d_mv_scsr_from_coo implicit none class(psb_d_scsr_sparse_mat), intent(inout) :: a class(psb_d_coo_sparse_mat), intent(inout) :: b integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), allocatable :: itemp(:) !locals logical :: rwshr_ integer(psb_ipk_) :: nza, nr, i integer(psb_ipk_), Parameter :: maxtry=8 integer(psb_ipk_) :: debug_level, debug_unit character(len=20) :: name='mv_from_coo' info = psb_success_ debug_unit = psb_get_debug_unit() debug_level = psb_get_debug_level() call a%psb_d_csr_sparse_mat%mv_from_coo(b,info) if (info /= psb_success_) return nr = a%get_nrows() call psb_realloc(nr,a%nerwids,info) if (info /= psb_success_) return associate(nnerws => a%nnerws, irp => a%irp, nerwids => a%nerwids) nnerws = 0 do i=1, nr if ((irp(i+1)-irp(i)) > 0) then nnerws = nnerws + 1 nerwids(nnerws) = i end if end do end associate end subroutine psb_d_mv_scsr_from_coo !!$subroutine psb_d_mv_scsr_to_fmt(a,b,info) !!$ use psb_const_mod !!$ use psb_d_base_mat_mod !!$ use psb_d_scsr_mat_mod, psb_protect_name => psb_d_mv_scsr_to_fmt !!$ implicit none !!$ !!$ class(psb_d_scsr_sparse_mat), intent(inout) :: a !!$ class(psb_d_base_sparse_mat), intent(inout) :: b !!$ integer(psb_ipk_), intent(out) :: info !!$ !!$ !locals !!$ type(psb_d_coo_sparse_mat) :: tmp !!$ logical :: rwshr_ !!$ integer(psb_ipk_) :: nza, nr, i,j,irw, err_act, nc !!$ integer(psb_ipk_), Parameter :: maxtry=8 !!$ integer(psb_ipk_) :: debug_level, debug_unit !!$ character(len=20) :: name !!$ !!$ info = psb_success_ !!$ !!$ select type (b) !!$ type is (psb_d_coo_sparse_mat) !!$ call a%mv_to_coo(b,info) !!$ ! Need to fix trivial copies! !!$ type is (psb_d_scsr_sparse_mat) !!$ b%psb_d_base_sparse_mat = a%psb_d_base_sparse_mat !!$ call move_alloc(a%irp, b%irp) !!$ call move_alloc(a%ja, b%ja) !!$ call move_alloc(a%val, b%val) !!$ call a%free() !!$ !!$ class default !!$ call a%mv_to_coo(tmp,info) !!$ if (info == psb_success_) call b%mv_from_coo(tmp,info) !!$ end select !!$ !!$end subroutine psb_d_mv_scsr_to_fmt !!$subroutine psb_d_cp_scsr_to_fmt(a,b,info) !!$ use psb_const_mod !!$ use psb_d_base_mat_mod !!$ use psb_realloc_mod !!$ use psb_d_scsr_mat_mod, psb_protect_name => psb_d_cp_scsr_to_fmt !!$ implicit none !!$ !!$ class(psb_d_scsr_sparse_mat), intent(in) :: a !!$ class(psb_d_base_sparse_mat), intent(inout) :: b !!$ integer(psb_ipk_), intent(out) :: info !!$ !!$ !locals !!$ type(psb_d_coo_sparse_mat) :: tmp !!$ logical :: rwshr_ !!$ integer(psb_ipk_) :: nza, nr, i,j,irw, err_act, nc !!$ integer(psb_ipk_), Parameter :: maxtry=8 !!$ integer(psb_ipk_) :: debug_level, debug_unit !!$ character(len=20) :: name !!$ !!$ info = psb_success_ !!$ !!$ !!$ select type (b) !!$ type is (psb_d_coo_sparse_mat) !!$ call a%cp_to_coo(b,info) !!$ !!$ type is (psb_d_scsr_sparse_mat) !!$ b%psb_d_base_sparse_mat = a%psb_d_base_sparse_mat !!$ if (info == 0) call psb_safe_cpy( a%irp, b%irp , info) !!$ if (info == 0) call psb_safe_cpy( a%ja , b%ja , info) !!$ if (info == 0) call psb_safe_cpy( a%val, b%val , info) !!$ !!$ class default !!$ call a%cp_to_coo(tmp,info) !!$ if (info == psb_success_) call b%mv_from_coo(tmp,info) !!$ end select !!$ !!$end subroutine psb_d_cp_scsr_to_fmt subroutine psb_d_mv_scsr_from_fmt(a,b,info) use psb_const_mod use psb_d_base_mat_mod use psb_d_scsr_mat_mod, psb_protect_name => psb_d_mv_scsr_from_fmt implicit none class(psb_d_scsr_sparse_mat), intent(inout) :: a class(psb_d_base_sparse_mat), intent(inout) :: b integer(psb_ipk_), intent(out) :: info !locals type(psb_d_coo_sparse_mat) :: tmp logical :: rwshr_ integer(psb_ipk_) :: nza, nr, i,j,irw, err_act, nc integer(psb_ipk_), Parameter :: maxtry=8 integer(psb_ipk_) :: debug_level, debug_unit character(len=20) :: name info = psb_success_ select type (b) type is (psb_d_coo_sparse_mat) call a%mv_from_coo(b,info) type is (psb_d_scsr_sparse_mat) a%psb_d_base_sparse_mat = b%psb_d_base_sparse_mat a%nnerws = b%nnerws call move_alloc(b%irp, a%irp) call move_alloc(b%ja, a%ja) call move_alloc(b%val, a%val) call move_alloc(b%nerwids, a%nerwids) call b%free() class is (psb_d_csr_sparse_mat) a%psb_d_base_sparse_mat = b%psb_d_base_sparse_mat call move_alloc(b%irp, a%irp) call move_alloc(b%ja, a%ja) call move_alloc(b%val, a%val) nr = a%get_nrows() call psb_realloc(nr,a%nerwids,info) associate(nnerws => a%nnerws, irp => a%irp, nerwids => a%nerwids) nnerws = 0 do i=1, nr if ((irp(i+1)-irp(i)) > 0) then nnerws = nnerws + 1 nerwids(nnerws) = i end if end do end associate class default call b%mv_to_coo(tmp,info) if (info == psb_success_) call a%mv_from_coo(tmp,info) end select end subroutine psb_d_mv_scsr_from_fmt subroutine psb_d_cp_scsr_from_fmt(a,b,info) use psb_const_mod use psb_d_base_mat_mod use psb_realloc_mod use psb_d_scsr_mat_mod, psb_protect_name => psb_d_cp_scsr_from_fmt implicit none class(psb_d_scsr_sparse_mat), intent(inout) :: a class(psb_d_base_sparse_mat), intent(in) :: b integer(psb_ipk_), intent(out) :: info !locals type(psb_d_coo_sparse_mat) :: tmp logical :: rwshr_ integer(psb_ipk_) :: nz, nr, i,j,irw, err_act, nc integer(psb_ipk_), Parameter :: maxtry=8 integer(psb_ipk_) :: debug_level, debug_unit character(len=20) :: name info = psb_success_ select type (b) type is (psb_d_coo_sparse_mat) call a%cp_from_coo(b,info) type is (psb_d_scsr_sparse_mat) a%psb_d_base_sparse_mat = b%psb_d_base_sparse_mat a%nnerws = b%nnerws if (info == 0) call psb_safe_cpy( b%irp, a%irp , info) if (info == 0) call psb_safe_cpy( b%ja , a%ja , info) if (info == 0) call psb_safe_cpy( b%val, a%val , info) if (info == 0) call psb_safe_cpy( b%nerwids, a%nerwids , info) class is (psb_d_csr_sparse_mat) a%psb_d_base_sparse_mat = b%psb_d_base_sparse_mat if (info == 0) call psb_safe_cpy( b%irp, a%irp , info) if (info == 0) call psb_safe_cpy( b%ja , a%ja , info) if (info == 0) call psb_safe_cpy( b%val, a%val , info) nr = a%get_nrows() call psb_realloc(nr,a%nerwids,info) associate(nnerws => a%nnerws, irp => a%irp, nerwids => a%nerwids) nnerws = 0 do i=1, nr if ((irp(i+1)-irp(i)) > 0) then nnerws = nnerws + 1 nerwids(nnerws) = i end if end do end associate class default call b%cp_to_coo(tmp,info) if (info == psb_success_) call a%mv_from_coo(tmp,info) end select end subroutine psb_d_cp_scsr_from_fmt