|
|
|
@ -82,31 +82,16 @@ module psb_gen_block_map_mod
|
|
|
|
|
procedure, pass(idxmap) :: reinit => block_reinit
|
|
|
|
|
procedure, nopass :: get_fmt => block_get_fmt
|
|
|
|
|
|
|
|
|
|
!!$ procedure, pass(idxmap) :: l2gs1 => block_l2gs1
|
|
|
|
|
!!$ procedure, pass(idxmap) :: l2gs2 => block_l2gs2
|
|
|
|
|
!!$ procedure, pass(idxmap) :: l2gv1 => block_l2gv1
|
|
|
|
|
!!$ procedure, pass(idxmap) :: l2gv2 => block_l2gv2
|
|
|
|
|
|
|
|
|
|
procedure, pass(idxmap) :: ll2gs1 => block_ll2gs1
|
|
|
|
|
procedure, pass(idxmap) :: ll2gs2 => block_ll2gs2
|
|
|
|
|
procedure, pass(idxmap) :: ll2gv1 => block_ll2gv1
|
|
|
|
|
procedure, pass(idxmap) :: ll2gv2 => block_ll2gv2
|
|
|
|
|
|
|
|
|
|
!!$ procedure, pass(idxmap) :: g2ls1 => block_g2ls1
|
|
|
|
|
!!$ procedure, pass(idxmap) :: g2ls2 => block_g2ls2
|
|
|
|
|
!!$ procedure, pass(idxmap) :: g2lv1 => block_g2lv1
|
|
|
|
|
!!$ procedure, pass(idxmap) :: g2lv2 => block_g2lv2
|
|
|
|
|
|
|
|
|
|
procedure, pass(idxmap) :: lg2ls1 => block_lg2ls1
|
|
|
|
|
procedure, pass(idxmap) :: lg2ls2 => block_lg2ls2
|
|
|
|
|
procedure, pass(idxmap) :: lg2lv1 => block_lg2lv1
|
|
|
|
|
procedure, pass(idxmap) :: lg2lv2 => block_lg2lv2
|
|
|
|
|
|
|
|
|
|
!!$ procedure, pass(idxmap) :: g2ls1_ins => block_g2ls1_ins
|
|
|
|
|
!!$ procedure, pass(idxmap) :: g2ls2_ins => block_g2ls2_ins
|
|
|
|
|
!!$ procedure, pass(idxmap) :: g2lv1_ins => block_g2lv1_ins
|
|
|
|
|
!!$ procedure, pass(idxmap) :: g2lv2_ins => block_g2lv2_ins
|
|
|
|
|
|
|
|
|
|
procedure, pass(idxmap) :: lg2ls1_ins => block_lg2ls1_ins
|
|
|
|
|
procedure, pass(idxmap) :: lg2ls2_ins => block_lg2ls2_ins
|
|
|
|
|
procedure, pass(idxmap) :: lg2lv1_ins => block_lg2lv1_ins
|
|
|
|
@ -173,165 +158,6 @@ contains
|
|
|
|
|
|
|
|
|
|
end subroutine block_free
|
|
|
|
|
|
|
|
|
|
!!$
|
|
|
|
|
!!$ subroutine block_l2gs1(idx,idxmap,info,mask,owned)
|
|
|
|
|
!!$ implicit none
|
|
|
|
|
!!$ class(psb_gen_block_map), intent(in) :: idxmap
|
|
|
|
|
!!$ integer(psb_ipk_), intent(inout) :: idx
|
|
|
|
|
!!$ integer(psb_ipk_), intent(out) :: info
|
|
|
|
|
!!$ logical, intent(in), optional :: mask
|
|
|
|
|
!!$ logical, intent(in), optional :: owned
|
|
|
|
|
!!$ integer(psb_ipk_) :: idxv(1)
|
|
|
|
|
!!$ info = 0
|
|
|
|
|
!!$ if (present(mask)) then
|
|
|
|
|
!!$ if (.not.mask) return
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$
|
|
|
|
|
!!$ idxv(1) = idx
|
|
|
|
|
!!$ call idxmap%l2gip(idxv,info,owned=owned)
|
|
|
|
|
!!$ idx = idxv(1)
|
|
|
|
|
!!$
|
|
|
|
|
!!$ end subroutine block_l2gs1
|
|
|
|
|
!!$
|
|
|
|
|
!!$ subroutine block_l2gs2(idxin,idxout,idxmap,info,mask,owned)
|
|
|
|
|
!!$ implicit none
|
|
|
|
|
!!$ class(psb_gen_block_map), intent(in) :: idxmap
|
|
|
|
|
!!$ integer(psb_ipk_), intent(in) :: idxin
|
|
|
|
|
!!$ integer(psb_ipk_), intent(out) :: idxout
|
|
|
|
|
!!$ integer(psb_ipk_), intent(out) :: info
|
|
|
|
|
!!$ logical, intent(in), optional :: mask
|
|
|
|
|
!!$ logical, intent(in), optional :: owned
|
|
|
|
|
!!$
|
|
|
|
|
!!$ idxout = idxin
|
|
|
|
|
!!$ call idxmap%l2gip(idxout,info,mask,owned)
|
|
|
|
|
!!$
|
|
|
|
|
!!$ end subroutine block_l2gs2
|
|
|
|
|
!!$
|
|
|
|
|
!!$
|
|
|
|
|
!!$ subroutine block_l2gv1(idx,idxmap,info,mask,owned)
|
|
|
|
|
!!$ implicit none
|
|
|
|
|
!!$ class(psb_gen_block_map), intent(in) :: idxmap
|
|
|
|
|
!!$ integer(psb_ipk_), intent(inout) :: idx(:)
|
|
|
|
|
!!$ integer(psb_ipk_), intent(out) :: info
|
|
|
|
|
!!$ logical, intent(in), optional :: mask(:)
|
|
|
|
|
!!$ logical, intent(in), optional :: owned
|
|
|
|
|
!!$ integer(psb_ipk_) :: i
|
|
|
|
|
!!$ logical :: owned_
|
|
|
|
|
!!$ info = 0
|
|
|
|
|
!!$
|
|
|
|
|
!!$ if (present(mask)) then
|
|
|
|
|
!!$ if (size(mask) < size(idx)) then
|
|
|
|
|
!!$ info = -1
|
|
|
|
|
!!$ return
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ if (present(owned)) then
|
|
|
|
|
!!$ owned_ = owned
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$ owned_ = .false.
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$
|
|
|
|
|
!!$ if (present(mask)) then
|
|
|
|
|
!!$
|
|
|
|
|
!!$ do i=1, size(idx)
|
|
|
|
|
!!$ if (mask(i)) then
|
|
|
|
|
!!$ if ((1<=idx(i)).and.(idx(i) <= idxmap%local_rows)) then
|
|
|
|
|
!!$ idx(i) = idxmap%min_glob_row + idx(i) - 1
|
|
|
|
|
!!$ else if ((idxmap%local_rows < idx(i)).and.(idx(i) <= idxmap%local_cols)&
|
|
|
|
|
!!$ & .and.(.not.owned_)) then
|
|
|
|
|
!!$ idx(i) = idxmap%loc_to_glob(idx(i)-idxmap%local_rows)
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$ idx(i) = -1
|
|
|
|
|
!!$ info = -1
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end do
|
|
|
|
|
!!$
|
|
|
|
|
!!$ else if (.not.present(mask)) then
|
|
|
|
|
!!$
|
|
|
|
|
!!$ do i=1, size(idx)
|
|
|
|
|
!!$ if ((1<=idx(i)).and.(idx(i) <= idxmap%local_rows)) then
|
|
|
|
|
!!$ idx(i) = idxmap%min_glob_row + idx(i) - 1
|
|
|
|
|
!!$ else if ((idxmap%local_rows < idx(i)).and.(idx(i) <= idxmap%local_cols)&
|
|
|
|
|
!!$ & .and.(.not.owned_)) then
|
|
|
|
|
!!$ idx(i) = idxmap%loc_to_glob(idx(i)-idxmap%local_rows)
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$ idx(i) = -1
|
|
|
|
|
!!$ info = -1
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end do
|
|
|
|
|
!!$
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$
|
|
|
|
|
!!$ end subroutine block_l2gv1
|
|
|
|
|
!!$
|
|
|
|
|
!!$ subroutine block_l2gv2(idxin,idxout,idxmap,info,mask,owned)
|
|
|
|
|
!!$ implicit none
|
|
|
|
|
!!$ class(psb_gen_block_map), intent(in) :: idxmap
|
|
|
|
|
!!$ integer(psb_ipk_), intent(in) :: idxin(:)
|
|
|
|
|
!!$ integer(psb_ipk_), intent(out) :: idxout(:)
|
|
|
|
|
!!$ integer(psb_ipk_), intent(out) :: info
|
|
|
|
|
!!$ logical, intent(in), optional :: mask(:)
|
|
|
|
|
!!$ logical, intent(in), optional :: owned
|
|
|
|
|
!!$ integer(psb_ipk_) :: is, im, i
|
|
|
|
|
!!$ logical :: owned_
|
|
|
|
|
!!$
|
|
|
|
|
!!$ info = 0
|
|
|
|
|
!!$
|
|
|
|
|
!!$ is = size(idxin)
|
|
|
|
|
!!$ im = min(is,size(idxout))
|
|
|
|
|
!!$
|
|
|
|
|
!!$ if (present(mask)) then
|
|
|
|
|
!!$ if (size(mask) < im) then
|
|
|
|
|
!!$ info = -1
|
|
|
|
|
!!$ return
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ if (present(owned)) then
|
|
|
|
|
!!$ owned_ = owned
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$ owned_ = .false.
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$
|
|
|
|
|
!!$ if (present(mask)) then
|
|
|
|
|
!!$
|
|
|
|
|
!!$ do i=1, im
|
|
|
|
|
!!$ if (mask(i)) then
|
|
|
|
|
!!$ if ((1<=idxin(i)).and.(idxin(i) <= idxmap%local_rows)) then
|
|
|
|
|
!!$ idxout(i) = idxmap%min_glob_row + idxin(i) - 1
|
|
|
|
|
!!$ else if ((idxmap%local_rows < idxin(i)).and.(idxin(i) <= idxmap%local_cols)&
|
|
|
|
|
!!$ & .and.(.not.owned_)) then
|
|
|
|
|
!!$ idxout(i) = idxmap%loc_to_glob(idxin(i)-idxmap%local_rows)
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$ idxout(i) = -1
|
|
|
|
|
!!$ info = -1
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end do
|
|
|
|
|
!!$
|
|
|
|
|
!!$ else if (.not.present(mask)) then
|
|
|
|
|
!!$
|
|
|
|
|
!!$ do i=1, im
|
|
|
|
|
!!$ if ((1<=idxin(i)).and.(idxin(i) <= idxmap%local_rows)) then
|
|
|
|
|
!!$ idxout(i) = idxmap%min_glob_row + idxin(i) - 1
|
|
|
|
|
!!$ else if ((idxmap%local_rows < idxin(i)).and.(idxin(i) <= idxmap%local_cols)&
|
|
|
|
|
!!$ & .and.(.not.owned_)) then
|
|
|
|
|
!!$ idxout(i) = idxmap%loc_to_glob(idxin(i)-idxmap%local_rows)
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$ idxout(i) = -1
|
|
|
|
|
!!$ info = -1
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end do
|
|
|
|
|
!!$
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$
|
|
|
|
|
!!$ if (is > im) then
|
|
|
|
|
!!$ info = -3
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$
|
|
|
|
|
!!$ end subroutine block_l2gv2
|
|
|
|
|
!!$
|
|
|
|
|
|
|
|
|
|
subroutine block_ll2gs1(idx,idxmap,info,mask,owned)
|
|
|
|
|
implicit none
|
|
|
|
|
class(psb_gen_block_map), intent(in) :: idxmap
|
|
|
|
@ -365,7 +191,6 @@ contains
|
|
|
|
|
|
|
|
|
|
end subroutine block_ll2gs2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
subroutine block_ll2gv1(idx,idxmap,info,mask,owned)
|
|
|
|
|
implicit none
|
|
|
|
|
class(psb_gen_block_map), intent(in) :: idxmap
|
|
|
|
@ -489,269 +314,6 @@ contains
|
|
|
|
|
|
|
|
|
|
end subroutine block_ll2gv2
|
|
|
|
|
|
|
|
|
|
!!$ subroutine block_g2ls1(idx,idxmap,info,mask,owned)
|
|
|
|
|
!!$ implicit none
|
|
|
|
|
!!$ class(psb_gen_block_map), intent(in) :: idxmap
|
|
|
|
|
!!$ integer(psb_ipk_), intent(inout) :: idx
|
|
|
|
|
!!$ integer(psb_ipk_), intent(out) :: info
|
|
|
|
|
!!$ logical, intent(in), optional :: mask
|
|
|
|
|
!!$ logical, intent(in), optional :: owned
|
|
|
|
|
!!$ integer(psb_ipk_) :: idxv(1)
|
|
|
|
|
!!$ info = 0
|
|
|
|
|
!!$
|
|
|
|
|
!!$ if (present(mask)) then
|
|
|
|
|
!!$ if (.not.mask) return
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$
|
|
|
|
|
!!$ idxv(1) = idx
|
|
|
|
|
!!$ call idxmap%g2lip(idxv,info,owned=owned)
|
|
|
|
|
!!$ idx = idxv(1)
|
|
|
|
|
!!$
|
|
|
|
|
!!$ end subroutine block_g2ls1
|
|
|
|
|
!!$
|
|
|
|
|
!!$ subroutine block_g2ls2(idxin,idxout,idxmap,info,mask,owned)
|
|
|
|
|
!!$ implicit none
|
|
|
|
|
!!$ class(psb_gen_block_map), intent(in) :: idxmap
|
|
|
|
|
!!$ integer(psb_ipk_), intent(in) :: idxin
|
|
|
|
|
!!$ integer(psb_ipk_), intent(out) :: idxout
|
|
|
|
|
!!$ integer(psb_ipk_), intent(out) :: info
|
|
|
|
|
!!$ logical, intent(in), optional :: mask
|
|
|
|
|
!!$ logical, intent(in), optional :: owned
|
|
|
|
|
!!$
|
|
|
|
|
!!$ idxout = idxin
|
|
|
|
|
!!$ call idxmap%g2lip(idxout,info,mask,owned)
|
|
|
|
|
!!$
|
|
|
|
|
!!$ end subroutine block_g2ls2
|
|
|
|
|
!!$
|
|
|
|
|
!!$
|
|
|
|
|
!!$ subroutine block_g2lv1(idx,idxmap,info,mask,owned)
|
|
|
|
|
!!$ use psb_penv_mod
|
|
|
|
|
!!$ use psb_sort_mod
|
|
|
|
|
!!$ implicit none
|
|
|
|
|
!!$ class(psb_gen_block_map), intent(in) :: idxmap
|
|
|
|
|
!!$ integer(psb_ipk_), intent(inout) :: idx(:)
|
|
|
|
|
!!$ integer(psb_ipk_), intent(out) :: info
|
|
|
|
|
!!$ logical, intent(in), optional :: mask(:)
|
|
|
|
|
!!$ logical, intent(in), optional :: owned
|
|
|
|
|
!!$ integer(psb_ipk_) :: i, nv, is, ip, lip
|
|
|
|
|
!!$ integer(psb_lpk_) :: tidx
|
|
|
|
|
!!$ integer(psb_mpk_) :: ctxt, iam, np
|
|
|
|
|
!!$ logical :: owned_
|
|
|
|
|
!!$
|
|
|
|
|
!!$ info = 0
|
|
|
|
|
!!$ ctxt = idxmap%get_ctxt()
|
|
|
|
|
!!$ call psb_info(ctxt,iam,np)
|
|
|
|
|
!!$
|
|
|
|
|
!!$ if (present(mask)) then
|
|
|
|
|
!!$ if (size(mask) < size(idx)) then
|
|
|
|
|
!!$! !$ write(0,*) 'Block g2l: size of mask', size(mask),size(idx)
|
|
|
|
|
!!$ info = -1
|
|
|
|
|
!!$ return
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ if (present(owned)) then
|
|
|
|
|
!!$ owned_ = owned
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$ owned_ = .false.
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$
|
|
|
|
|
!!$ is = size(idx)
|
|
|
|
|
!!$ if (present(mask)) then
|
|
|
|
|
!!$
|
|
|
|
|
!!$ if (idxmap%is_asb()) 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)&
|
|
|
|
|
!!$ &.and.(.not.owned_)) then
|
|
|
|
|
!!$ nv = size(idxmap%srt_g2l,1)
|
|
|
|
|
!!$ tidx = idx(i)
|
|
|
|
|
!!$ idx(i) = psb_bsrch(tidx,nv,idxmap%srt_g2l(:,1))
|
|
|
|
|
!!$ if (idx(i) > 0) idx(i) = idxmap%srt_g2l(idx(i),2)+idxmap%local_rows
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$ idx(i) = -1
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end do
|
|
|
|
|
!!$ else if (idxmap%is_valid()) 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)&
|
|
|
|
|
!!$ &.and.(.not.owned_)) then
|
|
|
|
|
!!$ ip = idx(i)
|
|
|
|
|
!!$ call psb_hash_searchkey(ip,lip,idxmap%hash,info)
|
|
|
|
|
!!$ if (lip > 0) idx(i) = lip + idxmap%local_rows
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$ idx(i) = -1
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end do
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$! !$ write(0,*) 'Block status: invalid ',idxmap%get_state()
|
|
|
|
|
!!$ idx(1:is) = -1
|
|
|
|
|
!!$ info = -1
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$
|
|
|
|
|
!!$ else if (.not.present(mask)) then
|
|
|
|
|
!!$
|
|
|
|
|
!!$ if (idxmap%is_asb()) 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)&
|
|
|
|
|
!!$ &.and.(.not.owned_)) then
|
|
|
|
|
!!$ nv = size(idxmap%srt_g2l,1)
|
|
|
|
|
!!$ tidx = idx(i)
|
|
|
|
|
!!$ idx(i) = psb_bsrch(tidx,nv,idxmap%srt_g2l(:,1))
|
|
|
|
|
!!$ if (idx(i) > 0) idx(i) = idxmap%srt_g2l(idx(i),2)+idxmap%local_rows
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$ idx(i) = -1
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end do
|
|
|
|
|
!!$
|
|
|
|
|
!!$ else if (idxmap%is_valid()) 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)&
|
|
|
|
|
!!$ &.and.(.not.owned_)) then
|
|
|
|
|
!!$ ip = idx(i)
|
|
|
|
|
!!$ call psb_hash_searchkey(ip,lip,idxmap%hash,info)
|
|
|
|
|
!!$ if (lip > 0) idx(i) = lip + idxmap%local_rows
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$ idx(i) = -1
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end do
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$! !$ write(0,*) 'Block status: invalid ',idxmap%get_state()
|
|
|
|
|
!!$ idx(1:is) = -1
|
|
|
|
|
!!$ info = -1
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$
|
|
|
|
|
!!$ end subroutine block_g2lv1
|
|
|
|
|
!!$
|
|
|
|
|
!!$ subroutine block_g2lv2(idxin,idxout,idxmap,info,mask,owned)
|
|
|
|
|
!!$ use psb_penv_mod
|
|
|
|
|
!!$ use psb_sort_mod
|
|
|
|
|
!!$ implicit none
|
|
|
|
|
!!$ class(psb_gen_block_map), intent(in) :: idxmap
|
|
|
|
|
!!$ integer(psb_ipk_), intent(in) :: idxin(:)
|
|
|
|
|
!!$ integer(psb_ipk_), intent(out) :: idxout(:)
|
|
|
|
|
!!$ integer(psb_ipk_), intent(out) :: info
|
|
|
|
|
!!$ logical, intent(in), optional :: mask(:)
|
|
|
|
|
!!$ logical, intent(in), optional :: owned
|
|
|
|
|
!!$
|
|
|
|
|
!!$ integer(psb_ipk_) :: i, nv, is, ip, lip, im
|
|
|
|
|
!!$ integer(psb_lpk_) :: tidx
|
|
|
|
|
!!$ integer(psb_mpk_) :: ctxt, iam, np
|
|
|
|
|
!!$ logical :: owned_
|
|
|
|
|
!!$
|
|
|
|
|
!!$ info = 0
|
|
|
|
|
!!$ ctxt = idxmap%get_ctxt()
|
|
|
|
|
!!$ call psb_info(ctxt,iam,np)
|
|
|
|
|
!!$ is = size(idxin)
|
|
|
|
|
!!$ im = min(is,size(idxout))
|
|
|
|
|
!!$
|
|
|
|
|
!!$ if (present(mask)) then
|
|
|
|
|
!!$ if (size(mask) < im) then
|
|
|
|
|
!!$! !$ write(0,*) 'Block g2l: size of mask', size(mask),size(idx)
|
|
|
|
|
!!$ info = -1
|
|
|
|
|
!!$ return
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ if (present(owned)) then
|
|
|
|
|
!!$ owned_ = owned
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$ owned_ = .false.
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$
|
|
|
|
|
!!$ if (present(mask)) then
|
|
|
|
|
!!$
|
|
|
|
|
!!$ if (idxmap%is_asb()) then
|
|
|
|
|
!!$ do i=1, im
|
|
|
|
|
!!$ if (mask(i)) then
|
|
|
|
|
!!$ if ((idxmap%min_glob_row <= idxin(i)).and.(idxin(i) <= idxmap%max_glob_row)) then
|
|
|
|
|
!!$ idxout(i) = idxin(i) - idxmap%min_glob_row + 1
|
|
|
|
|
!!$ else if ((1<= idxin(i)).and.(idxin(i) <= idxmap%global_rows)&
|
|
|
|
|
!!$ &.and.(.not.owned_)) then
|
|
|
|
|
!!$ nv = size(idxmap%srt_g2l,1)
|
|
|
|
|
!!$ tidx = idxin(i)
|
|
|
|
|
!!$ idxout(i) = psb_bsrch(tidx,nv,idxmap%srt_g2l(:,1))
|
|
|
|
|
!!$ if (idxout(i) > 0) idxout(i) = idxmap%srt_g2l(idxout(i),2)+idxmap%local_rows
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$ idxout(i) = -1
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end do
|
|
|
|
|
!!$ else if (idxmap%is_valid()) then
|
|
|
|
|
!!$ do i=1,im
|
|
|
|
|
!!$ if (mask(i)) then
|
|
|
|
|
!!$ if ((idxmap%min_glob_row <= idxin(i)).and.(idxin(i) <= idxmap%max_glob_row)) then
|
|
|
|
|
!!$ idxout(i) = idxin(i) - idxmap%min_glob_row + 1
|
|
|
|
|
!!$ else if ((1<= idxin(i)).and.(idxin(i) <= idxmap%global_rows)&
|
|
|
|
|
!!$ &.and.(.not.owned_)) then
|
|
|
|
|
!!$ ip = idxin(i)
|
|
|
|
|
!!$ call psb_hash_searchkey(ip,lip,idxmap%hash,info)
|
|
|
|
|
!!$ if (lip > 0) idxout(i) = lip + idxmap%local_rows
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$ idxout(i) = -1
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end do
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$! !$ write(0,*) 'Block status: invalid ',idxmap%get_state()
|
|
|
|
|
!!$ idxout(1:im) = -1
|
|
|
|
|
!!$ info = -1
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$
|
|
|
|
|
!!$ else if (.not.present(mask)) then
|
|
|
|
|
!!$
|
|
|
|
|
!!$ if (idxmap%is_asb()) then
|
|
|
|
|
!!$ do i=1, im
|
|
|
|
|
!!$ if ((idxmap%min_glob_row <= idxin(i)).and.(idxin(i) <= idxmap%max_glob_row)) then
|
|
|
|
|
!!$ idxout(i) = idxin(i) - idxmap%min_glob_row + 1
|
|
|
|
|
!!$ else if ((1<= idxin(i)).and.(idxin(i) <= idxmap%global_rows)&
|
|
|
|
|
!!$ &.and.(.not.owned_)) then
|
|
|
|
|
!!$ nv = size(idxmap%srt_g2l,1)
|
|
|
|
|
!!$ tidx = idxin(i)
|
|
|
|
|
!!$ idxout(i) = psb_bsrch(tidx,nv,idxmap%srt_g2l(:,1))
|
|
|
|
|
!!$ if (idxout(i) > 0) idxout(i) = idxmap%srt_g2l(idxout(i),2)+idxmap%local_rows
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$ idxout(i) = -1
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end do
|
|
|
|
|
!!$
|
|
|
|
|
!!$ else if (idxmap%is_valid()) then
|
|
|
|
|
!!$ do i=1,im
|
|
|
|
|
!!$ if ((idxmap%min_glob_row <= idxin(i)).and.(idxin(i) <= idxmap%max_glob_row)) then
|
|
|
|
|
!!$ idxout(i) = idxin(i) - idxmap%min_glob_row + 1
|
|
|
|
|
!!$ else if ((1<= idxin(i)).and.(idxin(i) <= idxmap%global_rows)&
|
|
|
|
|
!!$ &.and.(.not.owned_)) then
|
|
|
|
|
!!$ ip = idxin(i)
|
|
|
|
|
!!$ call psb_hash_searchkey(ip,lip,idxmap%hash,info)
|
|
|
|
|
!!$ if (lip > 0) idxout(i) = lip + idxmap%local_rows
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$ idxout(i) = -1
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end do
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$! !$ write(0,*) 'Block status: invalid ',idxmap%get_state()
|
|
|
|
|
!!$ idxout(1:im) = -1
|
|
|
|
|
!!$ info = -1
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$
|
|
|
|
|
!!$ if (is > im) info = -3
|
|
|
|
|
!!$
|
|
|
|
|
!!$ end subroutine block_g2lv2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
subroutine block_lg2ls1(idx,idxmap,info,mask,owned)
|
|
|
|
|
implicit none
|
|
|
|
|
class(psb_gen_block_map), intent(in) :: idxmap
|
|
|
|
@ -794,7 +356,6 @@ contains
|
|
|
|
|
|
|
|
|
|
end subroutine block_lg2ls2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
subroutine block_lg2lv1(idx,idxmap,info,mask,owned)
|
|
|
|
|
use psb_penv_mod
|
|
|
|
|
use psb_sort_mod
|
|
|
|
@ -1033,449 +594,6 @@ contains
|
|
|
|
|
|
|
|
|
|
end subroutine block_lg2lv2
|
|
|
|
|
|
|
|
|
|
!!$ subroutine block_g2ls1_ins(idx,idxmap,info,mask, lidx)
|
|
|
|
|
!!$ use psb_realloc_mod
|
|
|
|
|
!!$ use psb_sort_mod
|
|
|
|
|
!!$ implicit none
|
|
|
|
|
!!$ class(psb_gen_block_map), intent(inout) :: idxmap
|
|
|
|
|
!!$ integer(psb_ipk_), intent(inout) :: idx
|
|
|
|
|
!!$ integer(psb_ipk_), intent(out) :: info
|
|
|
|
|
!!$ logical, intent(in), optional :: mask
|
|
|
|
|
!!$ integer(psb_ipk_), intent(in), optional :: lidx
|
|
|
|
|
!!$
|
|
|
|
|
!!$ integer(psb_ipk_) :: idxv(1), lidxv(1)
|
|
|
|
|
!!$
|
|
|
|
|
!!$ info = 0
|
|
|
|
|
!!$ if (present(mask)) then
|
|
|
|
|
!!$ if (.not.mask) return
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ idxv(1) = idx
|
|
|
|
|
!!$ 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)
|
|
|
|
|
!!$
|
|
|
|
|
!!$ end subroutine block_g2ls1_ins
|
|
|
|
|
!!$
|
|
|
|
|
!!$ subroutine block_g2ls2_ins(idxin,idxout,idxmap,info,mask,lidx)
|
|
|
|
|
!!$ implicit none
|
|
|
|
|
!!$ class(psb_gen_block_map), intent(inout) :: idxmap
|
|
|
|
|
!!$ integer(psb_ipk_), intent(in) :: idxin
|
|
|
|
|
!!$ integer(psb_ipk_), intent(out) :: idxout
|
|
|
|
|
!!$ integer(psb_ipk_), intent(out) :: info
|
|
|
|
|
!!$ logical, intent(in), optional :: mask
|
|
|
|
|
!!$ integer(psb_ipk_), intent(in), optional :: lidx
|
|
|
|
|
!!$
|
|
|
|
|
!!$ idxout = idxin
|
|
|
|
|
!!$ call idxmap%g2lip_ins(idxout,info,mask=mask,lidx=lidx)
|
|
|
|
|
!!$
|
|
|
|
|
!!$ end subroutine block_g2ls2_ins
|
|
|
|
|
!!$
|
|
|
|
|
!!$
|
|
|
|
|
!!$ subroutine block_g2lv1_ins(idx,idxmap,info,mask,lidx)
|
|
|
|
|
!!$ use psb_realloc_mod
|
|
|
|
|
!!$ use psb_sort_mod
|
|
|
|
|
!!$ implicit none
|
|
|
|
|
!!$ class(psb_gen_block_map), intent(inout) :: idxmap
|
|
|
|
|
!!$ integer(psb_ipk_), intent(inout) :: idx(:)
|
|
|
|
|
!!$ integer(psb_ipk_), intent(out) :: info
|
|
|
|
|
!!$ logical, intent(in), optional :: mask(:)
|
|
|
|
|
!!$ integer(psb_ipk_), intent(in), optional :: lidx(:)
|
|
|
|
|
!!$
|
|
|
|
|
!!$ integer(psb_ipk_) :: i, nv, is, ix
|
|
|
|
|
!!$ integer(psb_ipk_) :: ip, lip, nxt
|
|
|
|
|
!!$
|
|
|
|
|
!!$
|
|
|
|
|
!!$ info = 0
|
|
|
|
|
!!$ is = size(idx)
|
|
|
|
|
!!$
|
|
|
|
|
!!$ if (present(mask)) then
|
|
|
|
|
!!$ if (size(mask) < size(idx)) then
|
|
|
|
|
!!$ info = -1
|
|
|
|
|
!!$ return
|
|
|
|
|
!!$ 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
|
|
|
|
|
!!$ ! State is wrong for this one !
|
|
|
|
|
!!$ idx = -1
|
|
|
|
|
!!$ info = -1
|
|
|
|
|
!!$
|
|
|
|
|
!!$ 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
|
|
|
|
|
!!$ 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
|
|
|
|
|
!!$ nv = idxmap%local_cols-idxmap%local_rows
|
|
|
|
|
!!$ nxt = nv + 1
|
|
|
|
|
!!$ 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 = nxt + idxmap%local_rows
|
|
|
|
|
!!$ 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
|
|
|
|
|
!!$ nv = idxmap%local_cols-idxmap%local_rows
|
|
|
|
|
!!$ nxt = nv + 1
|
|
|
|
|
!!$ 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 = nxt + idxmap%local_rows
|
|
|
|
|
!!$ 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
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$ idx = -1
|
|
|
|
|
!!$ info = -1
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$
|
|
|
|
|
!!$ end subroutine block_g2lv1_ins
|
|
|
|
|
!!$
|
|
|
|
|
!!$ subroutine block_g2lv2_ins(idxin,idxout,idxmap,info,mask,lidx)
|
|
|
|
|
!!$ use psb_realloc_mod
|
|
|
|
|
!!$ use psb_sort_mod
|
|
|
|
|
!!$ implicit none
|
|
|
|
|
!!$ class(psb_gen_block_map), intent(inout) :: idxmap
|
|
|
|
|
!!$ integer(psb_ipk_), intent(in) :: idxin(:)
|
|
|
|
|
!!$ integer(psb_ipk_), intent(out) :: idxout(:)
|
|
|
|
|
!!$ integer(psb_ipk_), intent(out) :: info
|
|
|
|
|
!!$ logical, intent(in), optional :: mask(:)
|
|
|
|
|
!!$ integer(psb_ipk_), intent(in), optional :: lidx(:)
|
|
|
|
|
!!$
|
|
|
|
|
!!$ integer(psb_ipk_) :: i, nv, is, ix, im
|
|
|
|
|
!!$ integer(psb_ipk_) :: ip, lip, nxt
|
|
|
|
|
!!$
|
|
|
|
|
!!$
|
|
|
|
|
!!$ info = 0
|
|
|
|
|
!!$
|
|
|
|
|
!!$ is = size(idxin)
|
|
|
|
|
!!$ im = min(is,size(idxout))
|
|
|
|
|
!!$
|
|
|
|
|
!!$ if (present(mask)) then
|
|
|
|
|
!!$ if (size(mask) < im) then
|
|
|
|
|
!!$ info = -1
|
|
|
|
|
!!$ return
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ if (present(lidx)) then
|
|
|
|
|
!!$ if (size(lidx) < im) then
|
|
|
|
|
!!$ info = -1
|
|
|
|
|
!!$ return
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$
|
|
|
|
|
!!$ if (idxmap%is_asb()) then
|
|
|
|
|
!!$ ! State is wrong for this one !
|
|
|
|
|
!!$ idxout = -1
|
|
|
|
|
!!$ info = -1
|
|
|
|
|
!!$
|
|
|
|
|
!!$ else if (idxmap%is_valid()) then
|
|
|
|
|
!!$
|
|
|
|
|
!!$ if (present(lidx)) then
|
|
|
|
|
!!$ if (present(mask)) then
|
|
|
|
|
!!$
|
|
|
|
|
!!$ do i=1, im
|
|
|
|
|
!!$ if (mask(i)) then
|
|
|
|
|
!!$ if ((idxmap%min_glob_row <= idxin(i)).and.(idxin(i) <= idxmap%max_glob_row)) then
|
|
|
|
|
!!$ idxout(i) = idxin(i) - idxmap%min_glob_row + 1
|
|
|
|
|
!!$ else if ((1<= idxin(i)).and.(idxin(i) <= idxmap%global_rows)) then
|
|
|
|
|
!!$
|
|
|
|
|
!!$ if (lidx(i) <= idxmap%local_rows) then
|
|
|
|
|
!!$ info = -5
|
|
|
|
|
!!$ return
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ nxt = lidx(i)-idxmap%local_rows
|
|
|
|
|
!!$ ip = idxin(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) = idxin(i)
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ info = psb_success_
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$ info = -5
|
|
|
|
|
!!$ return
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ idxout(i) = lip + idxmap%local_rows
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$ idxout(i) = -1
|
|
|
|
|
!!$ info = -1
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end do
|
|
|
|
|
!!$
|
|
|
|
|
!!$ else if (.not.present(mask)) then
|
|
|
|
|
!!$
|
|
|
|
|
!!$ do i=1, im
|
|
|
|
|
!!$
|
|
|
|
|
!!$ if ((idxmap%min_glob_row <= idxin(i)).and.(idxin(i) <= idxmap%max_glob_row)) then
|
|
|
|
|
!!$ idxout(i) = idxin(i) - idxmap%min_glob_row + 1
|
|
|
|
|
!!$ else if ((1<= idxin(i)).and.(idxin(i) <= idxmap%global_rows)) then
|
|
|
|
|
!!$ if (lidx(i) <= idxmap%local_rows) then
|
|
|
|
|
!!$ info = -5
|
|
|
|
|
!!$ return
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ nxt = lidx(i)-idxmap%local_rows
|
|
|
|
|
!!$ ip = idxin(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) = idxin(i)
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ info = psb_success_
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$ info = -5
|
|
|
|
|
!!$ return
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ idxout(i) = lip + idxmap%local_rows
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$ idxout(i) = -1
|
|
|
|
|
!!$ info = -1
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end do
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$
|
|
|
|
|
!!$ else if (.not.present(lidx)) then
|
|
|
|
|
!!$
|
|
|
|
|
!!$ if (present(mask)) then
|
|
|
|
|
!!$ do i=1, im
|
|
|
|
|
!!$ if (mask(i)) then
|
|
|
|
|
!!$ if ((idxmap%min_glob_row <= idxin(i)).and.(idxin(i) <= idxmap%max_glob_row)) then
|
|
|
|
|
!!$ idxout(i) = idxin(i) - idxmap%min_glob_row + 1
|
|
|
|
|
!!$ else if ((1<= idxin(i)).and.(idxin(i) <= idxmap%global_rows)) then
|
|
|
|
|
!!$ nv = idxmap%local_cols-idxmap%local_rows
|
|
|
|
|
!!$ nxt = nv + 1
|
|
|
|
|
!!$ ip = idxin(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 = nxt + idxmap%local_rows
|
|
|
|
|
!!$ idxmap%loc_to_glob(nxt) = idxin(i)
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ info = psb_success_
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$ info = -5
|
|
|
|
|
!!$ return
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ idxout(i) = lip + idxmap%local_rows
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$ idxout(i) = -1
|
|
|
|
|
!!$ info = -1
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end do
|
|
|
|
|
!!$
|
|
|
|
|
!!$ else if (.not.present(mask)) then
|
|
|
|
|
!!$
|
|
|
|
|
!!$ do i=1, im
|
|
|
|
|
!!$
|
|
|
|
|
!!$ if ((idxmap%min_glob_row <= idxin(i)).and.(idxin(i) <= idxmap%max_glob_row)) then
|
|
|
|
|
!!$ idxout(i) = idxin(i) - idxmap%min_glob_row + 1
|
|
|
|
|
!!$ else if ((1<= idxin(i)).and.(idxin(i) <= idxmap%global_rows)) then
|
|
|
|
|
!!$ nv = idxmap%local_cols-idxmap%local_rows
|
|
|
|
|
!!$ nxt = nv + 1
|
|
|
|
|
!!$ ip = idxin(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 = nxt + idxmap%local_rows
|
|
|
|
|
!!$ idxmap%loc_to_glob(nxt) = idxin(i)
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ info = psb_success_
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$ info = -5
|
|
|
|
|
!!$ return
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ idxout(i) = lip + idxmap%local_rows
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$ idxout(i) = -1
|
|
|
|
|
!!$ info = -1
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end do
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$
|
|
|
|
|
!!$ else
|
|
|
|
|
!!$ idxout = -1
|
|
|
|
|
!!$ info = -1
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$
|
|
|
|
|
!!$ if (is > im) then
|
|
|
|
|
!!$! !$ write(0,*) 'g2lv2_ins err -3'
|
|
|
|
|
!!$ info = -3
|
|
|
|
|
!!$ end if
|
|
|
|
|
!!$
|
|
|
|
|
!!$ end subroutine block_g2lv2_ins
|
|
|
|
|
|
|
|
|
|
subroutine block_lg2ls1_ins(idx,idxmap,info,mask, lidx)
|
|
|
|
|
use psb_realloc_mod
|
|
|
|
|
use psb_sort_mod
|
|
|
|
@ -1518,7 +636,6 @@ contains
|
|
|
|
|
idxout = tidx
|
|
|
|
|
end subroutine block_lg2ls2_ins
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
subroutine block_lg2lv1_ins(idx,idxmap,info,mask,lidx)
|
|
|
|
|
use psb_realloc_mod
|
|
|
|
|
use psb_sort_mod
|
|
|
|
|