diff --git a/base/modules/desc/psb_hash_map_mod.F90 b/base/modules/desc/psb_hash_map_mod.F90 index 6c132285..8d8ae3cd 100644 --- a/base/modules/desc/psb_hash_map_mod.F90 +++ b/base/modules/desc/psb_hash_map_mod.F90 @@ -1118,43 +1118,50 @@ contains nxt = ncol + 1 call hash_inner_cnv(ip,lip,idxmap%hashvmask,idxmap%hashv,& & idxmap%glb_lc,ncol) - if (lip < 0) then + if (i==1) write(0,*) me,' v1 icnv:',i,lip + if (lip > 0) then + idx(i) = lip + info = psb_success_ + else call psb_hash_searchinskey(ip,tlip,nxt,idxmap%hash,info) lip = tlip - end if + if (i==1) write(0,*) me,' v1 srchins:',i,lip - if (info >=0) then - if (nxt == lip) then - ncol = nxt - call psb_ensure_size(ncol,idxmap%loc_to_glob,info,& - & pad=-1_psb_lpk_) - if (info /= psb_success_) then - write(0,*)'Problem 7:',info,lip,size(idxmap%loc_to_glob) - info = lip - call psb_errpush(psb_err_from_subroutine_ai_,name,& - & a_err='psb_ensure_size',i_err=(/info/)) - isLoopValid = .false. - end if - idxmap%loc_to_glob(nxt) = ip - call idxmap%set_lc(ncol) - endif + if (info >=0) then + if (nxt == lip) then + ncol = nxt + call psb_ensure_size(ncol,idxmap%loc_to_glob,info,& + & pad=-1_psb_lpk_) + if (info /= psb_success_) then + write(0,*)'Problem 7:',info,lip,size(idxmap%loc_to_glob) + info = lip + call psb_errpush(psb_err_from_subroutine_ai_,name,& + & a_err='psb_ensure_size',i_err=(/info/)) + isLoopValid = .false. + end if + idxmap%loc_to_glob(nxt) = ip + call idxmap%set_lc(ncol) + endif + info = psb_success_ + else + call psb_errpush(psb_err_from_subroutine_ai_,name,& + & a_err='SearchInsKeyVal',i_err=(/info/)) + isLoopValid = .false. + end if + idx(i) = lip info = psb_success_ - else - call psb_errpush(psb_err_from_subroutine_ai_,name,& - & a_err='SearchInsKeyVal',i_err=(/info/)) - isLoopValid = .false. end if - idx(i) = lip - info = psb_success_ else idx(i) = -1 end if enddo +! write(0,*) me,' v1 after cleanup ',idx(1:is) #else call psb_tic(ins_phase1) ncol = idxmap%get_lc() call hash_inner_cnv(is,idx,idxmap%hashvmask,idxmap%hashv,& & idxmap%glb_lc,nrm=ncol, mask=mask) +! write(0,*) me,' v2 after hash_inner_cnv ',idx(1:is) call psb_toc(ins_phase1) call psb_tic(ins_phase2) do i = 1, is @@ -1164,6 +1171,7 @@ contains ip = idx(i) call psb_hash_searchinskey(ip,tlip,nxt,idxmap%hash,info) lip = tlip + if (i==1) write(0,*) me,' v2 isrchins:',i,lip if (info >=0) then if (nxt == lip) then @@ -1188,8 +1196,11 @@ contains end if idx(i) = lip info = psb_success_ + else if (.not.mask(i)) then + idx(i) = -1 end if enddo +! write(0,*) me,' v2 after cleanup ',idx(1:is) call psb_toc(ins_phase2) #endif else if (.not.present(mask)) then @@ -1204,37 +1215,40 @@ contains nxt = ncol + 1 call hash_inner_cnv(ip,lip,idxmap%hashvmask,idxmap%hashv,& & idxmap%glb_lc,ncol) - if (lip < 0) then + if (lip > 0) then + idx(i) = lip + info = psb_success_ + else call psb_hash_searchinskey(ip,tlip,nxt,idxmap%hash,info) lip = tlip - end if - - if (info >=0) then - if (nxt == lip) then - ncol = nxt - call psb_ensure_size(ncol,idxmap%loc_to_glob,info,& - & pad=-1_psb_lpk_) - if (info /= psb_success_) then - write(0,*)'Problem 8:',info,lip,size(idxmap%loc_to_glob) - info = lip - 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/)) - isLoopValid = .false. - - end if - idxmap%loc_to_glob(nxt) = ip - call idxmap%set_lc(ncol) - endif + + if (info >=0) then + if (nxt == lip) then + ncol = nxt + call psb_ensure_size(ncol,idxmap%loc_to_glob,info,& + & pad=-1_psb_lpk_) + if (info /= psb_success_) then + write(0,*)'Problem 8:',info,lip,size(idxmap%loc_to_glob) + info = lip + 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/)) + isLoopValid = .false. + + 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/)) + isLoopValid = .false. + end if + idx(i) = lip 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/)) - isLoopValid = .false. end if - idx(i) = lip - info = psb_success_ enddo end if @@ -1591,320 +1605,7 @@ contains res = 'HASH' end function hash_get_fmt -#if 0 - subroutine hash_inner_cnvs1(x,hashmask,hashv,glb_lc,nrm) - implicit none - integer(psb_lpk_), intent(in) :: hashmask,glb_lc(:,:) - integer(psb_ipk_), intent(in) :: hashv(0:) - integer(psb_lpk_), intent(inout) :: x - integer(psb_ipk_), intent(in) :: nrm - integer(psb_ipk_) :: idx,nh,tmp,lb,ub,lm - integer(psb_lpk_) :: key, ih - ! - ! When a large descriptor is assembled the indices - ! are kept in a (hashed) list of ordered lists. - ! Thus we first hash the index, then we do a binary search on the - ! ordered sublist. The hashing is based on the low-order bits - ! for a width of psb_hash_bits - ! - - key = x - ih = iand(key,hashmask) - idx = hashv(ih) - nh = hashv(ih+1) - hashv(ih) - if (nh > 0) then - tmp = -1 - lb = idx - ub = idx+nh-1 - do - if (lb>ub) exit - lm = (lb+ub)/2 - if (key == glb_lc(lm,1)) then - tmp = lm - exit - else if (key 0) then - x = glb_lc(tmp,2) - if (x > nrm) then - x = -1 - end if - else - x = tmp - end if - end subroutine hash_inner_cnvs1 - - subroutine hash_inner_cnvs2(x,y,hashmask,hashv,glb_lc,nrm) - implicit none - integer(psb_ipk_), intent(in) :: hashv(0:) - integer(psb_lpk_), intent(in) :: hashmask, x, glb_lc(:,:) - integer(psb_ipk_), intent(out) :: y - integer(psb_ipk_), intent(in) :: nrm - integer(psb_ipk_) :: idx,nh,tmp,lb,ub,lm - integer(psb_lpk_) :: ih, key - ! - ! When a large descriptor is assembled the indices - ! are kept in a (hashed) list of ordered lists. - ! Thus we first hash the index, then we do a binary search on the - ! ordered sublist. The hashing is based on the low-order bits - ! for a width of psb_hash_bits - ! - - key = x - ih = iand(key,hashmask) - idx = hashv(ih) - nh = hashv(ih+1) - hashv(ih) - if (nh > 0) then - tmp = -1 - lb = idx - ub = idx+nh-1 - do - if (lb>ub) exit - lm = (lb+ub)/2 - if (key == glb_lc(lm,1)) then - tmp = lm - exit - else if (key 0) then - y = glb_lc(tmp,2) - if (y > nrm) then - y = -1 - end if - else - y = tmp - end if - end subroutine hash_inner_cnvs2 - - - subroutine hash_inner_cnv1(n,x,hashmask,hashv,glb_lc,mask,nrm) - implicit none - integer(psb_ipk_), intent(in) :: n, hashv(0:) - integer(psb_lpk_), intent(in) :: glb_lc(:,:),hashmask - logical, intent(in), optional :: mask(:) - integer(psb_ipk_), intent(in), optional :: nrm - integer(psb_lpk_), intent(inout) :: x(:) - - integer(psb_ipk_) :: i, nh,tmp,lb,ub,lm - integer(psb_lpk_) :: ih, key, idx - ! - ! When a large descriptor is assembled the indices - ! are kept in a (hashed) list of ordered lists. - ! Thus we first hash the index, then we do a binary search on the - ! ordered sublist. The hashing is based on the low-order bits - ! for a width of psb_hash_bits - ! - if (present(mask)) then - ! $ o m p parallel do default(none) schedule(dynamic) & - ! $ o m p shared(n,hashv,hashmask,x,glb_lc,nrm,mask) & - ! $ o m p private(i,key,idx,ih,nh,tmp,lb,ub,lm) - do i=1, n - if (mask(i)) then - key = x(i) - ih = iand(key,hashmask) - idx = hashv(ih) - nh = hashv(ih+1) - hashv(ih) - if (nh > 0) then - tmp = -1 - lb = idx - ub = idx+nh-1 - do - if (lb>ub) exit - lm = (lb+ub)/2 - if (key == glb_lc(lm,1)) then - tmp = lm - exit - else if (key 0) then - x(i) = glb_lc(tmp,2) - if (present(nrm)) then - if (x(i) > nrm) then - x(i) = -1 - end if - end if - else - x(i) = tmp - end if - end if - end do - ! $ o m p end parallel do - else - ! $ o m p parallel do default(none) schedule(dynamic) & - ! $ o m p shared(n,hashv,hashmask,x,glb_lc,nrm) & - ! $ o m p private(i,key,idx,ih,nh,tmp,lb,ub,lm) - do i=1, n - key = x(i) - ih = iand(key,hashmask) - idx = hashv(ih) - nh = hashv(ih+1) - hashv(ih) - if (nh > 0) then - tmp = -1 - lb = idx - ub = idx+nh-1 - do - if (lb>ub) exit - lm = (lb+ub)/2 - if (key == glb_lc(lm,1)) then - tmp = lm - exit - else if (key 0) then - x(i) = glb_lc(tmp,2) - if (present(nrm)) then - if (x(i) > nrm) then - x(i) = -1 - end if - end if - else - x(i) = tmp - end if - end do - ! $ o m p end parallel do - end if - end subroutine hash_inner_cnv1 - - subroutine hash_inner_cnv2(n,x,y,hashmask,hashv,glb_lc,mask,nrm) - implicit none - integer(psb_ipk_), intent(in) :: n, hashv(0:) - integer(psb_lpk_), intent(in) :: hashmask,glb_lc(:,:) - logical, intent(in), optional :: mask(:) - integer(psb_ipk_), intent(in), optional :: nrm - integer(psb_lpk_), intent(in) :: x(:) - integer(psb_ipk_), intent(out) :: y(:) - - integer(psb_ipk_) :: i, idx,nh,tmp,lb,ub,lm - integer(psb_lpk_) :: ih, key - ! - ! When a large descriptor is assembled the indices - ! are kept in a (hashed) list of ordered lists. - ! Thus we first hash the index, then we do a binary search on the - ! ordered sublist. The hashing is based on the low-order bits - ! for a width of psb_hash_bits - ! - if (present(mask)) then - ! $ o m p parallel do default(none) schedule(dynamic) & - ! $ o m p shared(n,hashv,hashmask,x,y,glb_lc,nrm,mask,psb_err_unit) & - ! $ o m p private(i,key,idx,ih,nh,tmp,lb,ub,lm) - do i=1, n - if (mask(i)) then - key = x(i) - ih = iand(key,hashmask) - if (ih > ubound(hashv,1) ) then - write(psb_err_unit,*) ' In inner cnv: ',ih,ubound(hashv) - end if - idx = hashv(ih) - nh = hashv(ih+1) - hashv(ih) - if (nh > 0) then - tmp = -1 - lb = idx - ub = idx+nh-1 - do - if (lb>ub) exit - lm = (lb+ub)/2 - if (key == glb_lc(lm,1)) then - tmp = lm - exit - else if (key 0) then - y(i) = glb_lc(tmp,2) - if (present(nrm)) then - if (y(i) > nrm) then - y(i) = -1 - end if - end if - else - y(i) = tmp - end if - end if - end do - ! $ o m p end parallel do - else - - ! $ o m p parallel do default(none) schedule(dynamic) & - ! $ o m p shared(n,hashv,hashmask,x,y,glb_lc,nrm,psb_err_unit) & - ! $ o m p private(i,key,idx,ih,nh,tmp,lb,ub,lm) - do i=1, n - key = x(i) - ih = iand(key,hashmask) - if (ih > ubound(hashv,1) ) then - write(psb_err_unit,*) ' In inner cnv: ',ih,ubound(hashv) - end if - idx = hashv(ih) - nh = hashv(ih+1) - hashv(ih) - if (nh > 0) then - tmp = -1 - lb = idx - ub = idx+nh-1 - do - if (lb>ub) exit - lm = (lb+ub)/2 - if (key == glb_lc(lm,1)) then - tmp = lm - exit - else if (key 0) then - y(i) = glb_lc(tmp,2) - if (present(nrm)) then - if (y(i) > nrm) then - y(i) = -1 - end if - end if - else - y(i) = tmp - end if - end do - ! $ o m p end parallel do - end if - end subroutine hash_inner_cnv2 - -#else - + subroutine hash_inner_cnvs1(x,hashmask,hashv,glb_lc,nrm) implicit none integer(psb_lpk_), intent(in) :: hashmask,glb_lc(:,:) @@ -2192,8 +1893,6 @@ contains end if end function hash_srch_lpk -#endif - subroutine hash_clone(idxmap,outmap,info) use psb_penv_mod use psb_error_mod