You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
178 lines
4.5 KiB
Fortran
178 lines
4.5 KiB
Fortran
! File: psb_iasb.f90
|
|
!
|
|
! Subroutine: psb_iasb
|
|
! Assembles a dense matrix for PSBLAS routines
|
|
!
|
|
! Parameters:
|
|
! x - integer,pointer,dimension(:,:). The matrix to be assembled.
|
|
! desc_a - type(<psb_desc_type>). The communication descriptor.
|
|
! info - integer. Eventually returns an error code
|
|
subroutine psb_iasb(x, desc_a, info)
|
|
!....assembly dense matrix x .....
|
|
use psb_descriptor_type
|
|
use psb_const_mod
|
|
use psb_psblas_mod
|
|
use psb_error_mod
|
|
implicit none
|
|
|
|
type(psb_desc_type), intent(in) :: desc_a
|
|
integer, pointer :: x(:,:)
|
|
integer, intent(out) :: info
|
|
|
|
! local variables
|
|
integer :: icontxt,nprow,npcol,me,mypcol,temp,lwork,nrow,ncol,err_act
|
|
integer, pointer :: itemp(:,:)
|
|
integer :: int_err(5), i1sz, i2sz, dectype, i
|
|
real(kind(1.d0)) :: real_err(5)
|
|
logical, parameter :: debug=.false.
|
|
character(len=20) :: name, char_err
|
|
|
|
if(psb_get_errstatus().ne.0) return
|
|
info=0
|
|
name='psb_iasb'
|
|
call psb_erractionsave(err_act)
|
|
|
|
if ((.not.associated(desc_a%matrix_data))) then
|
|
info=3110
|
|
call psb_errpush(info,name)
|
|
return
|
|
endif
|
|
|
|
icontxt=desc_a%matrix_data(psb_ctxt_)
|
|
dectype=desc_a%matrix_data(psb_dec_type_)
|
|
|
|
call blacs_gridinfo(icontxt, nprow, npcol, me, mypcol)
|
|
if (nprow.eq.-1) then
|
|
info = 2010
|
|
call psb_errpush(info,name)
|
|
goto 9999
|
|
else if (npcol.ne.1) then
|
|
info = 2030
|
|
int_err(1) = npcol
|
|
call psb_errpush(info,name,int_err)
|
|
goto 9999
|
|
endif
|
|
|
|
! check size
|
|
icontxt=desc_a%matrix_data(psb_ctxt_)
|
|
nrow=desc_a%matrix_data(psb_n_row_)
|
|
ncol=desc_a%matrix_data(psb_n_col_)
|
|
i1sz = size(x,dim=1)
|
|
i2sz = size(x,dim=2)
|
|
if (debug) write(*,*) 'asb: ',i1sz,i2sz,nrow,ncol
|
|
if (i1sz.lt.ncol) then
|
|
allocate(itemp(ncol,i2sz),stat=info)
|
|
if (info.ne.0) then
|
|
info=2025
|
|
int_err(1)=ncol
|
|
call psb_errpush(info,name,int_err)
|
|
goto 9999
|
|
endif
|
|
itemp(nrow+1:,:) = 0
|
|
itemp(1:nrow,:) = x(1:nrow,:)
|
|
deallocate(x)
|
|
x => itemp
|
|
endif
|
|
|
|
! ..update halo elements..
|
|
call psb_halo(x,desc_a,info,alpha=done)
|
|
|
|
call psb_erractionrestore(err_act)
|
|
return
|
|
|
|
9999 continue
|
|
call psb_erractionrestore(err_act)
|
|
if (err_act.eq.act_abort) then
|
|
call psb_error(icontxt)
|
|
return
|
|
end if
|
|
return
|
|
|
|
end subroutine psb_iasb
|
|
|
|
|
|
|
|
! Subroutine: psb_iasbv
|
|
! Assembles a dense matrix for PSBLAS routines
|
|
!
|
|
! Parameters:
|
|
! x - integer,pointer,dimension(:). The matrix to be assembled.
|
|
! desc_a - type(<psb_desc_type>). The communication descriptor.
|
|
! info - integer. Eventually returns an error code
|
|
subroutine psb_iasbv(x, desc_a, info)
|
|
!....assembly dense matrix x .....
|
|
use psb_descriptor_type
|
|
use psb_const_mod
|
|
use psb_psblas_mod
|
|
use psb_error_mod
|
|
implicit none
|
|
|
|
type(psb_desc_type), intent(in) :: desc_a
|
|
integer, pointer :: x(:)
|
|
integer, intent(out) :: info
|
|
|
|
! local variables
|
|
integer :: icontxt,nprow,npcol,me,mypcol,temp,lwork, err_act
|
|
integer :: int_err(5), i1sz,nrow,ncol, dectype, i
|
|
integer, pointer :: itemp(:)
|
|
real(kind(1.d0)) :: real_err(5)
|
|
logical, parameter :: debug=.false.
|
|
character(len=20) :: name, ch_err
|
|
|
|
if(psb_get_errstatus().ne.0) return
|
|
info=0
|
|
call psb_erractionsave(err_act)
|
|
name = 'psb_iasbv'
|
|
|
|
|
|
icontxt=desc_a%matrix_data(psb_ctxt_)
|
|
dectype=desc_a%matrix_data(psb_dec_type_)
|
|
|
|
call blacs_gridinfo(icontxt, nprow, npcol, me, mypcol)
|
|
if (nprow.eq.-1) then
|
|
info = 2010
|
|
call psb_errpush(info,name)
|
|
goto 9999
|
|
else if (npcol.ne.1) then
|
|
info = 2030
|
|
int_err(1) = npcol
|
|
call psb_errpush(info,name,int_err)
|
|
goto 9999
|
|
endif
|
|
|
|
nrow=desc_a%matrix_data(psb_n_row_)
|
|
ncol=desc_a%matrix_data(psb_n_col_)
|
|
if (debug) write(*,*) name,' sizes: ',nrow,ncol
|
|
i1sz = size(x)
|
|
if (debug) write(*,*) 'dasb: sizes ',i1sz,ncol
|
|
if (i1sz.lt.ncol) then
|
|
allocate(itemp(ncol),stat=info)
|
|
if (info.ne.0) then
|
|
info=2025
|
|
int_err(1)=ncol
|
|
call psb_errpush(info,name,int_err)
|
|
goto 9999
|
|
endif
|
|
itemp(nrow+1:) = 0
|
|
itemp(1:nrow) = x(1:nrow)
|
|
deallocate(x)
|
|
x => itemp
|
|
endif
|
|
|
|
! ..update halo elements..
|
|
call psb_halo(x,desc_a,info,alpha=done)
|
|
|
|
call psb_erractionrestore(err_act)
|
|
return
|
|
|
|
9999 continue
|
|
call psb_erractionrestore(err_act)
|
|
if (err_act.eq.act_abort) then
|
|
call psb_error(icontxt)
|
|
return
|
|
end if
|
|
return
|
|
|
|
end subroutine psb_iasbv
|
|
|