mirror of
https://github.com/sfilippone/psblas3.git
synced 2026-10-20 04:42:08 +00:00
merged dev-openmp into omp-walther
This commit is contained in:
@@ -123,7 +123,7 @@ contains
|
||||
return
|
||||
endif
|
||||
|
||||
call psb_ensure_size(heap%last+1,heap%keys,info,addsz=(1_psb_ipk_)*psb_heap_resize)
|
||||
call psb_ensure_size(heap%last+1,heap%keys,info)
|
||||
if (info /= psb_success_) then
|
||||
write(psb_err_unit,*) 'Memory allocation failure in heap_insert'
|
||||
info = -5
|
||||
@@ -236,9 +236,9 @@ contains
|
||||
return
|
||||
endif
|
||||
|
||||
call psb_ensure_size(heap%last+1,heap%keys,info,addsz=(1_psb_ipk_)*psb_heap_resize)
|
||||
call psb_ensure_size(heap%last+1,heap%keys,info)
|
||||
if (info == psb_success_) &
|
||||
& call psb_ensure_size(heap%last+1,heap%idxs,info,addsz=(1_psb_ipk_)*psb_heap_resize)
|
||||
& call psb_ensure_size(heap%last+1,heap%idxs,info)
|
||||
if (info /= psb_success_) then
|
||||
write(psb_err_unit,*) 'Memory allocation failure in heap_insert'
|
||||
info = -5
|
||||
|
||||
@@ -768,7 +768,7 @@ Contains
|
||||
integer(psb_ipk_) :: info
|
||||
! ...Local Variables
|
||||
|
||||
integer(psb_ipk_) :: isz,err_act,lb
|
||||
integer(psb_ipk_) :: isz,err_act,lb, i
|
||||
character(len=30) :: name, char_err
|
||||
logical, parameter :: debug=.false.
|
||||
|
||||
@@ -790,7 +790,11 @@ Contains
|
||||
call psb_errpush(info,name,a_err=char_err)
|
||||
goto 9999
|
||||
else
|
||||
vout(:) = vin(:)
|
||||
!$omp parallel do private(i)
|
||||
do i=lb,lb+isz-1
|
||||
vout(i) = vin(i)
|
||||
end do
|
||||
!$omp end parallel do
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -836,7 +840,9 @@ Contains
|
||||
call psb_errpush(info,name,a_err=char_err)
|
||||
goto 9999
|
||||
else
|
||||
!$omp workshare
|
||||
vout(:,:) = vin(:,:)
|
||||
!$omp end workshare
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -991,36 +997,17 @@ Contains
|
||||
goto 9999
|
||||
end if
|
||||
|
||||
!!$ If (len > psb_size(v)) Then
|
||||
!!$ if (present(newsz)) then
|
||||
!!$ isz = (max(len+1,newsz))
|
||||
!!$ else
|
||||
!!$ if (present(addsz)) then
|
||||
!!$ isz = len+max(1,addsz)
|
||||
!!$ else
|
||||
!!$ isz = max(len+10, int(1.25*len))
|
||||
!!$ endif
|
||||
!!$ endif
|
||||
!!$
|
||||
!!$ call psb_realloc(isz,v,info,pad=pad)
|
||||
!!$ if (info /= psb_success_) then
|
||||
!!$ info=psb_err_from_subroutine_
|
||||
!!$ call psb_errpush(info,name,a_err='psb_realloc')
|
||||
!!$ goto 9999
|
||||
!!$ End If
|
||||
!!$ end If
|
||||
If (len > psb_size(v)) Then
|
||||
isz = psb_size(v)
|
||||
If (len > isz) Then
|
||||
#if defined(OPENMP)
|
||||
!$OMP CRITICAL
|
||||
if (len > psb_size(v)) then
|
||||
if (len > isz) then
|
||||
if (present(newsz)) then
|
||||
isz = (max(len+1,newsz))
|
||||
isz = max(len+1,1,newsz)
|
||||
else if (present(addsz)) then
|
||||
isz = max(len,1,isz+addsz)
|
||||
else
|
||||
if (present(addsz)) then
|
||||
isz = len+max(1,addsz)
|
||||
else
|
||||
isz = max(len+10, int(1.25*len))
|
||||
endif
|
||||
isz = max(len,1,int(1.25*isz))
|
||||
endif
|
||||
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
@@ -1033,17 +1020,18 @@ Contains
|
||||
goto 9999
|
||||
end if
|
||||
#else
|
||||
if (present(newsz)) then
|
||||
isz = (max(len+1,newsz))
|
||||
else
|
||||
if (present(addsz)) then
|
||||
isz = len+max(1,addsz)
|
||||
if (len > isz) then
|
||||
if (present(newsz)) then
|
||||
isz = max(len+1,1,newsz)
|
||||
else if (present(addsz)) then
|
||||
isz = max(len,1,isz+addsz)
|
||||
else
|
||||
isz = max(len+10, int(1.25*len))
|
||||
isz = max(len,1,int(1.25*isz))
|
||||
endif
|
||||
endif
|
||||
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
end if
|
||||
|
||||
if (info /= psb_success_) then
|
||||
info=psb_err_from_subroutine_
|
||||
call psb_errpush(info,name,a_err='psb_realloc')
|
||||
@@ -1085,16 +1073,14 @@ Contains
|
||||
info=psb_err_from_subroutine_
|
||||
goto 9999
|
||||
end if
|
||||
|
||||
If (len > psb_size(v)) Then
|
||||
if (present(newsz)) then
|
||||
isz = (max(len+1,newsz))
|
||||
isz = psb_size(v)
|
||||
If (len > isz) Then
|
||||
if (present(newsz)) then
|
||||
isz = max(len+1,1,newsz)
|
||||
else if (present(addsz)) then
|
||||
isz = max(len,1,isz+addsz)
|
||||
else
|
||||
if (present(addsz)) then
|
||||
isz = len+max(1,addsz)
|
||||
else
|
||||
isz = max(len+10, int(1.25*len))
|
||||
endif
|
||||
isz = max(len,1,int(1.25*isz))
|
||||
endif
|
||||
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
|
||||
@@ -123,7 +123,7 @@ contains
|
||||
return
|
||||
endif
|
||||
|
||||
call psb_ensure_size(heap%last+1,heap%keys,info,addsz=(1_psb_ipk_)*psb_heap_resize)
|
||||
call psb_ensure_size(heap%last+1,heap%keys,info)
|
||||
if (info /= psb_success_) then
|
||||
write(psb_err_unit,*) 'Memory allocation failure in heap_insert'
|
||||
info = -5
|
||||
@@ -236,9 +236,9 @@ contains
|
||||
return
|
||||
endif
|
||||
|
||||
call psb_ensure_size(heap%last+1,heap%keys,info,addsz=(1_psb_ipk_)*psb_heap_resize)
|
||||
call psb_ensure_size(heap%last+1,heap%keys,info)
|
||||
if (info == psb_success_) &
|
||||
& call psb_ensure_size(heap%last+1,heap%idxs,info,addsz=(1_psb_ipk_)*psb_heap_resize)
|
||||
& call psb_ensure_size(heap%last+1,heap%idxs,info)
|
||||
if (info /= psb_success_) then
|
||||
write(psb_err_unit,*) 'Memory allocation failure in heap_insert'
|
||||
info = -5
|
||||
|
||||
@@ -768,7 +768,7 @@ Contains
|
||||
integer(psb_ipk_) :: info
|
||||
! ...Local Variables
|
||||
|
||||
integer(psb_ipk_) :: isz,err_act,lb
|
||||
integer(psb_ipk_) :: isz,err_act,lb, i
|
||||
character(len=30) :: name, char_err
|
||||
logical, parameter :: debug=.false.
|
||||
|
||||
@@ -790,7 +790,11 @@ Contains
|
||||
call psb_errpush(info,name,a_err=char_err)
|
||||
goto 9999
|
||||
else
|
||||
vout(:) = vin(:)
|
||||
!$omp parallel do private(i)
|
||||
do i=lb,lb+isz-1
|
||||
vout(i) = vin(i)
|
||||
end do
|
||||
!$omp end parallel do
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -836,7 +840,9 @@ Contains
|
||||
call psb_errpush(info,name,a_err=char_err)
|
||||
goto 9999
|
||||
else
|
||||
!$omp workshare
|
||||
vout(:,:) = vin(:,:)
|
||||
!$omp end workshare
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -991,36 +997,17 @@ Contains
|
||||
goto 9999
|
||||
end if
|
||||
|
||||
!!$ If (len > psb_size(v)) Then
|
||||
!!$ if (present(newsz)) then
|
||||
!!$ isz = (max(len+1,newsz))
|
||||
!!$ else
|
||||
!!$ if (present(addsz)) then
|
||||
!!$ isz = len+max(1,addsz)
|
||||
!!$ else
|
||||
!!$ isz = max(len+10, int(1.25*len))
|
||||
!!$ endif
|
||||
!!$ endif
|
||||
!!$
|
||||
!!$ call psb_realloc(isz,v,info,pad=pad)
|
||||
!!$ if (info /= psb_success_) then
|
||||
!!$ info=psb_err_from_subroutine_
|
||||
!!$ call psb_errpush(info,name,a_err='psb_realloc')
|
||||
!!$ goto 9999
|
||||
!!$ End If
|
||||
!!$ end If
|
||||
If (len > psb_size(v)) Then
|
||||
isz = psb_size(v)
|
||||
If (len > isz) Then
|
||||
#if defined(OPENMP)
|
||||
!$OMP CRITICAL
|
||||
if (len > psb_size(v)) then
|
||||
if (len > isz) then
|
||||
if (present(newsz)) then
|
||||
isz = (max(len+1,newsz))
|
||||
isz = max(len+1,1,newsz)
|
||||
else if (present(addsz)) then
|
||||
isz = max(len,1,isz+addsz)
|
||||
else
|
||||
if (present(addsz)) then
|
||||
isz = len+max(1,addsz)
|
||||
else
|
||||
isz = max(len+10, int(1.25*len))
|
||||
endif
|
||||
isz = max(len,1,int(1.25*isz))
|
||||
endif
|
||||
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
@@ -1033,17 +1020,18 @@ Contains
|
||||
goto 9999
|
||||
end if
|
||||
#else
|
||||
if (present(newsz)) then
|
||||
isz = (max(len+1,newsz))
|
||||
else
|
||||
if (present(addsz)) then
|
||||
isz = len+max(1,addsz)
|
||||
if (len > isz) then
|
||||
if (present(newsz)) then
|
||||
isz = max(len+1,1,newsz)
|
||||
else if (present(addsz)) then
|
||||
isz = max(len,1,isz+addsz)
|
||||
else
|
||||
isz = max(len+10, int(1.25*len))
|
||||
isz = max(len,1,int(1.25*isz))
|
||||
endif
|
||||
endif
|
||||
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
end if
|
||||
|
||||
if (info /= psb_success_) then
|
||||
info=psb_err_from_subroutine_
|
||||
call psb_errpush(info,name,a_err='psb_realloc')
|
||||
@@ -1085,16 +1073,14 @@ Contains
|
||||
info=psb_err_from_subroutine_
|
||||
goto 9999
|
||||
end if
|
||||
|
||||
If (len > psb_size(v)) Then
|
||||
if (present(newsz)) then
|
||||
isz = (max(len+1,newsz))
|
||||
isz = psb_size(v)
|
||||
If (len > isz) Then
|
||||
if (present(newsz)) then
|
||||
isz = max(len+1,1,newsz)
|
||||
else if (present(addsz)) then
|
||||
isz = max(len,1,isz+addsz)
|
||||
else
|
||||
if (present(addsz)) then
|
||||
isz = len+max(1,addsz)
|
||||
else
|
||||
isz = max(len+10, int(1.25*len))
|
||||
endif
|
||||
isz = max(len,1,int(1.25*isz))
|
||||
endif
|
||||
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
|
||||
@@ -768,7 +768,7 @@ Contains
|
||||
integer(psb_ipk_) :: info
|
||||
! ...Local Variables
|
||||
|
||||
integer(psb_ipk_) :: isz,err_act,lb
|
||||
integer(psb_ipk_) :: isz,err_act,lb, i
|
||||
character(len=30) :: name, char_err
|
||||
logical, parameter :: debug=.false.
|
||||
|
||||
@@ -790,7 +790,11 @@ Contains
|
||||
call psb_errpush(info,name,a_err=char_err)
|
||||
goto 9999
|
||||
else
|
||||
vout(:) = vin(:)
|
||||
!$omp parallel do private(i)
|
||||
do i=lb,lb+isz-1
|
||||
vout(i) = vin(i)
|
||||
end do
|
||||
!$omp end parallel do
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -836,7 +840,9 @@ Contains
|
||||
call psb_errpush(info,name,a_err=char_err)
|
||||
goto 9999
|
||||
else
|
||||
!$omp workshare
|
||||
vout(:,:) = vin(:,:)
|
||||
!$omp end workshare
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -991,36 +997,17 @@ Contains
|
||||
goto 9999
|
||||
end if
|
||||
|
||||
!!$ If (len > psb_size(v)) Then
|
||||
!!$ if (present(newsz)) then
|
||||
!!$ isz = (max(len+1,newsz))
|
||||
!!$ else
|
||||
!!$ if (present(addsz)) then
|
||||
!!$ isz = len+max(1,addsz)
|
||||
!!$ else
|
||||
!!$ isz = max(len+10, int(1.25*len))
|
||||
!!$ endif
|
||||
!!$ endif
|
||||
!!$
|
||||
!!$ call psb_realloc(isz,v,info,pad=pad)
|
||||
!!$ if (info /= psb_success_) then
|
||||
!!$ info=psb_err_from_subroutine_
|
||||
!!$ call psb_errpush(info,name,a_err='psb_realloc')
|
||||
!!$ goto 9999
|
||||
!!$ End If
|
||||
!!$ end If
|
||||
If (len > psb_size(v)) Then
|
||||
isz = psb_size(v)
|
||||
If (len > isz) Then
|
||||
#if defined(OPENMP)
|
||||
!$OMP CRITICAL
|
||||
if (len > psb_size(v)) then
|
||||
if (len > isz) then
|
||||
if (present(newsz)) then
|
||||
isz = (max(len+1,newsz))
|
||||
isz = max(len+1,1,newsz)
|
||||
else if (present(addsz)) then
|
||||
isz = max(len,1,isz+addsz)
|
||||
else
|
||||
if (present(addsz)) then
|
||||
isz = len+max(1,addsz)
|
||||
else
|
||||
isz = max(len+10, int(1.25*len))
|
||||
endif
|
||||
isz = max(len,1,int(1.25*isz))
|
||||
endif
|
||||
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
@@ -1033,17 +1020,18 @@ Contains
|
||||
goto 9999
|
||||
end if
|
||||
#else
|
||||
if (present(newsz)) then
|
||||
isz = (max(len+1,newsz))
|
||||
else
|
||||
if (present(addsz)) then
|
||||
isz = len+max(1,addsz)
|
||||
if (len > isz) then
|
||||
if (present(newsz)) then
|
||||
isz = max(len+1,1,newsz)
|
||||
else if (present(addsz)) then
|
||||
isz = max(len,1,isz+addsz)
|
||||
else
|
||||
isz = max(len+10, int(1.25*len))
|
||||
isz = max(len,1,int(1.25*isz))
|
||||
endif
|
||||
endif
|
||||
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
end if
|
||||
|
||||
if (info /= psb_success_) then
|
||||
info=psb_err_from_subroutine_
|
||||
call psb_errpush(info,name,a_err='psb_realloc')
|
||||
@@ -1085,16 +1073,14 @@ Contains
|
||||
info=psb_err_from_subroutine_
|
||||
goto 9999
|
||||
end if
|
||||
|
||||
If (len > psb_size(v)) Then
|
||||
if (present(newsz)) then
|
||||
isz = (max(len+1,newsz))
|
||||
isz = psb_size(v)
|
||||
If (len > isz) Then
|
||||
if (present(newsz)) then
|
||||
isz = max(len+1,1,newsz)
|
||||
else if (present(addsz)) then
|
||||
isz = max(len,1,isz+addsz)
|
||||
else
|
||||
if (present(addsz)) then
|
||||
isz = len+max(1,addsz)
|
||||
else
|
||||
isz = max(len+10, int(1.25*len))
|
||||
endif
|
||||
isz = max(len,1,int(1.25*isz))
|
||||
endif
|
||||
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
|
||||
@@ -768,7 +768,7 @@ Contains
|
||||
integer(psb_ipk_) :: info
|
||||
! ...Local Variables
|
||||
|
||||
integer(psb_ipk_) :: isz,err_act,lb
|
||||
integer(psb_ipk_) :: isz,err_act,lb, i
|
||||
character(len=30) :: name, char_err
|
||||
logical, parameter :: debug=.false.
|
||||
|
||||
@@ -790,7 +790,11 @@ Contains
|
||||
call psb_errpush(info,name,a_err=char_err)
|
||||
goto 9999
|
||||
else
|
||||
vout(:) = vin(:)
|
||||
!$omp parallel do private(i)
|
||||
do i=lb,lb+isz-1
|
||||
vout(i) = vin(i)
|
||||
end do
|
||||
!$omp end parallel do
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -836,7 +840,9 @@ Contains
|
||||
call psb_errpush(info,name,a_err=char_err)
|
||||
goto 9999
|
||||
else
|
||||
!$omp workshare
|
||||
vout(:,:) = vin(:,:)
|
||||
!$omp end workshare
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -991,36 +997,17 @@ Contains
|
||||
goto 9999
|
||||
end if
|
||||
|
||||
!!$ If (len > psb_size(v)) Then
|
||||
!!$ if (present(newsz)) then
|
||||
!!$ isz = (max(len+1,newsz))
|
||||
!!$ else
|
||||
!!$ if (present(addsz)) then
|
||||
!!$ isz = len+max(1,addsz)
|
||||
!!$ else
|
||||
!!$ isz = max(len+10, int(1.25*len))
|
||||
!!$ endif
|
||||
!!$ endif
|
||||
!!$
|
||||
!!$ call psb_realloc(isz,v,info,pad=pad)
|
||||
!!$ if (info /= psb_success_) then
|
||||
!!$ info=psb_err_from_subroutine_
|
||||
!!$ call psb_errpush(info,name,a_err='psb_realloc')
|
||||
!!$ goto 9999
|
||||
!!$ End If
|
||||
!!$ end If
|
||||
If (len > psb_size(v)) Then
|
||||
isz = psb_size(v)
|
||||
If (len > isz) Then
|
||||
#if defined(OPENMP)
|
||||
!$OMP CRITICAL
|
||||
if (len > psb_size(v)) then
|
||||
if (len > isz) then
|
||||
if (present(newsz)) then
|
||||
isz = (max(len+1,newsz))
|
||||
isz = max(len+1,1,newsz)
|
||||
else if (present(addsz)) then
|
||||
isz = max(len,1,isz+addsz)
|
||||
else
|
||||
if (present(addsz)) then
|
||||
isz = len+max(1,addsz)
|
||||
else
|
||||
isz = max(len+10, int(1.25*len))
|
||||
endif
|
||||
isz = max(len,1,int(1.25*isz))
|
||||
endif
|
||||
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
@@ -1033,17 +1020,18 @@ Contains
|
||||
goto 9999
|
||||
end if
|
||||
#else
|
||||
if (present(newsz)) then
|
||||
isz = (max(len+1,newsz))
|
||||
else
|
||||
if (present(addsz)) then
|
||||
isz = len+max(1,addsz)
|
||||
if (len > isz) then
|
||||
if (present(newsz)) then
|
||||
isz = max(len+1,1,newsz)
|
||||
else if (present(addsz)) then
|
||||
isz = max(len,1,isz+addsz)
|
||||
else
|
||||
isz = max(len+10, int(1.25*len))
|
||||
isz = max(len,1,int(1.25*isz))
|
||||
endif
|
||||
endif
|
||||
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
end if
|
||||
|
||||
if (info /= psb_success_) then
|
||||
info=psb_err_from_subroutine_
|
||||
call psb_errpush(info,name,a_err='psb_realloc')
|
||||
@@ -1085,16 +1073,14 @@ Contains
|
||||
info=psb_err_from_subroutine_
|
||||
goto 9999
|
||||
end if
|
||||
|
||||
If (len > psb_size(v)) Then
|
||||
if (present(newsz)) then
|
||||
isz = (max(len+1,newsz))
|
||||
isz = psb_size(v)
|
||||
If (len > isz) Then
|
||||
if (present(newsz)) then
|
||||
isz = max(len+1,1,newsz)
|
||||
else if (present(addsz)) then
|
||||
isz = max(len,1,isz+addsz)
|
||||
else
|
||||
if (present(addsz)) then
|
||||
isz = len+max(1,addsz)
|
||||
else
|
||||
isz = max(len+10, int(1.25*len))
|
||||
endif
|
||||
isz = max(len,1,int(1.25*isz))
|
||||
endif
|
||||
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
|
||||
@@ -124,7 +124,7 @@ contains
|
||||
return
|
||||
endif
|
||||
|
||||
call psb_ensure_size(heap%last+1,heap%keys,info,addsz=(1_psb_ipk_)*psb_heap_resize)
|
||||
call psb_ensure_size(heap%last+1,heap%keys,info)
|
||||
if (info /= psb_success_) then
|
||||
write(psb_err_unit,*) 'Memory allocation failure in heap_insert'
|
||||
info = -5
|
||||
@@ -237,9 +237,9 @@ contains
|
||||
return
|
||||
endif
|
||||
|
||||
call psb_ensure_size(heap%last+1,heap%keys,info,addsz=(1_psb_ipk_)*psb_heap_resize)
|
||||
call psb_ensure_size(heap%last+1,heap%keys,info)
|
||||
if (info == psb_success_) &
|
||||
& call psb_ensure_size(heap%last+1,heap%idxs,info,addsz=(1_psb_ipk_)*psb_heap_resize)
|
||||
& call psb_ensure_size(heap%last+1,heap%idxs,info)
|
||||
if (info /= psb_success_) then
|
||||
write(psb_err_unit,*) 'Memory allocation failure in heap_insert'
|
||||
info = -5
|
||||
|
||||
@@ -124,7 +124,7 @@ contains
|
||||
return
|
||||
endif
|
||||
|
||||
call psb_ensure_size(heap%last+1,heap%keys,info,addsz=(1_psb_lpk_)*psb_heap_resize)
|
||||
call psb_ensure_size(heap%last+1,heap%keys,info)
|
||||
if (info /= psb_success_) then
|
||||
write(psb_err_unit,*) 'Memory allocation failure in heap_insert'
|
||||
info = -5
|
||||
@@ -237,9 +237,9 @@ contains
|
||||
return
|
||||
endif
|
||||
|
||||
call psb_ensure_size(heap%last+1,heap%keys,info,addsz=(1_psb_lpk_)*psb_heap_resize)
|
||||
call psb_ensure_size(heap%last+1,heap%keys,info)
|
||||
if (info == psb_success_) &
|
||||
& call psb_ensure_size(heap%last+1,heap%idxs,info,addsz=(1_psb_lpk_)*psb_heap_resize)
|
||||
& call psb_ensure_size(heap%last+1,heap%idxs,info)
|
||||
if (info /= psb_success_) then
|
||||
write(psb_err_unit,*) 'Memory allocation failure in heap_insert'
|
||||
info = -5
|
||||
|
||||
@@ -768,7 +768,7 @@ Contains
|
||||
integer(psb_ipk_) :: info
|
||||
! ...Local Variables
|
||||
|
||||
integer(psb_ipk_) :: isz,err_act,lb
|
||||
integer(psb_ipk_) :: isz,err_act,lb, i
|
||||
character(len=30) :: name, char_err
|
||||
logical, parameter :: debug=.false.
|
||||
|
||||
@@ -790,7 +790,11 @@ Contains
|
||||
call psb_errpush(info,name,a_err=char_err)
|
||||
goto 9999
|
||||
else
|
||||
vout(:) = vin(:)
|
||||
!$omp parallel do private(i)
|
||||
do i=lb,lb+isz-1
|
||||
vout(i) = vin(i)
|
||||
end do
|
||||
!$omp end parallel do
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -836,7 +840,9 @@ Contains
|
||||
call psb_errpush(info,name,a_err=char_err)
|
||||
goto 9999
|
||||
else
|
||||
!$omp workshare
|
||||
vout(:,:) = vin(:,:)
|
||||
!$omp end workshare
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -991,36 +997,17 @@ Contains
|
||||
goto 9999
|
||||
end if
|
||||
|
||||
!!$ If (len > psb_size(v)) Then
|
||||
!!$ if (present(newsz)) then
|
||||
!!$ isz = (max(len+1,newsz))
|
||||
!!$ else
|
||||
!!$ if (present(addsz)) then
|
||||
!!$ isz = len+max(1,addsz)
|
||||
!!$ else
|
||||
!!$ isz = max(len+10, int(1.25*len))
|
||||
!!$ endif
|
||||
!!$ endif
|
||||
!!$
|
||||
!!$ call psb_realloc(isz,v,info,pad=pad)
|
||||
!!$ if (info /= psb_success_) then
|
||||
!!$ info=psb_err_from_subroutine_
|
||||
!!$ call psb_errpush(info,name,a_err='psb_realloc')
|
||||
!!$ goto 9999
|
||||
!!$ End If
|
||||
!!$ end If
|
||||
If (len > psb_size(v)) Then
|
||||
isz = psb_size(v)
|
||||
If (len > isz) Then
|
||||
#if defined(OPENMP)
|
||||
!$OMP CRITICAL
|
||||
if (len > psb_size(v)) then
|
||||
if (len > isz) then
|
||||
if (present(newsz)) then
|
||||
isz = (max(len+1,newsz))
|
||||
isz = max(len+1,1,newsz)
|
||||
else if (present(addsz)) then
|
||||
isz = max(len,1,isz+addsz)
|
||||
else
|
||||
if (present(addsz)) then
|
||||
isz = len+max(1,addsz)
|
||||
else
|
||||
isz = max(len+10, int(1.25*len))
|
||||
endif
|
||||
isz = max(len,1,int(1.25*isz))
|
||||
endif
|
||||
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
@@ -1033,17 +1020,18 @@ Contains
|
||||
goto 9999
|
||||
end if
|
||||
#else
|
||||
if (present(newsz)) then
|
||||
isz = (max(len+1,newsz))
|
||||
else
|
||||
if (present(addsz)) then
|
||||
isz = len+max(1,addsz)
|
||||
if (len > isz) then
|
||||
if (present(newsz)) then
|
||||
isz = max(len+1,1,newsz)
|
||||
else if (present(addsz)) then
|
||||
isz = max(len,1,isz+addsz)
|
||||
else
|
||||
isz = max(len+10, int(1.25*len))
|
||||
isz = max(len,1,int(1.25*isz))
|
||||
endif
|
||||
endif
|
||||
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
end if
|
||||
|
||||
if (info /= psb_success_) then
|
||||
info=psb_err_from_subroutine_
|
||||
call psb_errpush(info,name,a_err='psb_realloc')
|
||||
@@ -1085,16 +1073,14 @@ Contains
|
||||
info=psb_err_from_subroutine_
|
||||
goto 9999
|
||||
end if
|
||||
|
||||
If (len > psb_size(v)) Then
|
||||
if (present(newsz)) then
|
||||
isz = (max(len+1,newsz))
|
||||
isz = psb_size(v)
|
||||
If (len > isz) Then
|
||||
if (present(newsz)) then
|
||||
isz = max(len+1,1,newsz)
|
||||
else if (present(addsz)) then
|
||||
isz = max(len,1,isz+addsz)
|
||||
else
|
||||
if (present(addsz)) then
|
||||
isz = len+max(1,addsz)
|
||||
else
|
||||
isz = max(len+10, int(1.25*len))
|
||||
endif
|
||||
isz = max(len,1,int(1.25*isz))
|
||||
endif
|
||||
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
|
||||
@@ -123,7 +123,7 @@ contains
|
||||
return
|
||||
endif
|
||||
|
||||
call psb_ensure_size(heap%last+1,heap%keys,info,addsz=(1_psb_ipk_)*psb_heap_resize)
|
||||
call psb_ensure_size(heap%last+1,heap%keys,info)
|
||||
if (info /= psb_success_) then
|
||||
write(psb_err_unit,*) 'Memory allocation failure in heap_insert'
|
||||
info = -5
|
||||
@@ -236,9 +236,9 @@ contains
|
||||
return
|
||||
endif
|
||||
|
||||
call psb_ensure_size(heap%last+1,heap%keys,info,addsz=(1_psb_ipk_)*psb_heap_resize)
|
||||
call psb_ensure_size(heap%last+1,heap%keys,info)
|
||||
if (info == psb_success_) &
|
||||
& call psb_ensure_size(heap%last+1,heap%idxs,info,addsz=(1_psb_ipk_)*psb_heap_resize)
|
||||
& call psb_ensure_size(heap%last+1,heap%idxs,info)
|
||||
if (info /= psb_success_) then
|
||||
write(psb_err_unit,*) 'Memory allocation failure in heap_insert'
|
||||
info = -5
|
||||
|
||||
@@ -768,7 +768,7 @@ Contains
|
||||
integer(psb_ipk_) :: info
|
||||
! ...Local Variables
|
||||
|
||||
integer(psb_ipk_) :: isz,err_act,lb
|
||||
integer(psb_ipk_) :: isz,err_act,lb, i
|
||||
character(len=30) :: name, char_err
|
||||
logical, parameter :: debug=.false.
|
||||
|
||||
@@ -790,7 +790,11 @@ Contains
|
||||
call psb_errpush(info,name,a_err=char_err)
|
||||
goto 9999
|
||||
else
|
||||
vout(:) = vin(:)
|
||||
!$omp parallel do private(i)
|
||||
do i=lb,lb+isz-1
|
||||
vout(i) = vin(i)
|
||||
end do
|
||||
!$omp end parallel do
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -836,7 +840,9 @@ Contains
|
||||
call psb_errpush(info,name,a_err=char_err)
|
||||
goto 9999
|
||||
else
|
||||
!$omp workshare
|
||||
vout(:,:) = vin(:,:)
|
||||
!$omp end workshare
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -991,36 +997,17 @@ Contains
|
||||
goto 9999
|
||||
end if
|
||||
|
||||
!!$ If (len > psb_size(v)) Then
|
||||
!!$ if (present(newsz)) then
|
||||
!!$ isz = (max(len+1,newsz))
|
||||
!!$ else
|
||||
!!$ if (present(addsz)) then
|
||||
!!$ isz = len+max(1,addsz)
|
||||
!!$ else
|
||||
!!$ isz = max(len+10, int(1.25*len))
|
||||
!!$ endif
|
||||
!!$ endif
|
||||
!!$
|
||||
!!$ call psb_realloc(isz,v,info,pad=pad)
|
||||
!!$ if (info /= psb_success_) then
|
||||
!!$ info=psb_err_from_subroutine_
|
||||
!!$ call psb_errpush(info,name,a_err='psb_realloc')
|
||||
!!$ goto 9999
|
||||
!!$ End If
|
||||
!!$ end If
|
||||
If (len > psb_size(v)) Then
|
||||
isz = psb_size(v)
|
||||
If (len > isz) Then
|
||||
#if defined(OPENMP)
|
||||
!$OMP CRITICAL
|
||||
if (len > psb_size(v)) then
|
||||
if (len > isz) then
|
||||
if (present(newsz)) then
|
||||
isz = (max(len+1,newsz))
|
||||
isz = max(len+1,1,newsz)
|
||||
else if (present(addsz)) then
|
||||
isz = max(len,1,isz+addsz)
|
||||
else
|
||||
if (present(addsz)) then
|
||||
isz = len+max(1,addsz)
|
||||
else
|
||||
isz = max(len+10, int(1.25*len))
|
||||
endif
|
||||
isz = max(len,1,int(1.25*isz))
|
||||
endif
|
||||
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
@@ -1033,17 +1020,18 @@ Contains
|
||||
goto 9999
|
||||
end if
|
||||
#else
|
||||
if (present(newsz)) then
|
||||
isz = (max(len+1,newsz))
|
||||
else
|
||||
if (present(addsz)) then
|
||||
isz = len+max(1,addsz)
|
||||
if (len > isz) then
|
||||
if (present(newsz)) then
|
||||
isz = max(len+1,1,newsz)
|
||||
else if (present(addsz)) then
|
||||
isz = max(len,1,isz+addsz)
|
||||
else
|
||||
isz = max(len+10, int(1.25*len))
|
||||
isz = max(len,1,int(1.25*isz))
|
||||
endif
|
||||
endif
|
||||
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
end if
|
||||
|
||||
if (info /= psb_success_) then
|
||||
info=psb_err_from_subroutine_
|
||||
call psb_errpush(info,name,a_err='psb_realloc')
|
||||
@@ -1085,16 +1073,14 @@ Contains
|
||||
info=psb_err_from_subroutine_
|
||||
goto 9999
|
||||
end if
|
||||
|
||||
If (len > psb_size(v)) Then
|
||||
if (present(newsz)) then
|
||||
isz = (max(len+1,newsz))
|
||||
isz = psb_size(v)
|
||||
If (len > isz) Then
|
||||
if (present(newsz)) then
|
||||
isz = max(len+1,1,newsz)
|
||||
else if (present(addsz)) then
|
||||
isz = max(len,1,isz+addsz)
|
||||
else
|
||||
if (present(addsz)) then
|
||||
isz = len+max(1,addsz)
|
||||
else
|
||||
isz = max(len+10, int(1.25*len))
|
||||
endif
|
||||
isz = max(len,1,int(1.25*isz))
|
||||
endif
|
||||
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
|
||||
@@ -123,7 +123,7 @@ contains
|
||||
return
|
||||
endif
|
||||
|
||||
call psb_ensure_size(heap%last+1,heap%keys,info,addsz=(1_psb_ipk_)*psb_heap_resize)
|
||||
call psb_ensure_size(heap%last+1,heap%keys,info)
|
||||
if (info /= psb_success_) then
|
||||
write(psb_err_unit,*) 'Memory allocation failure in heap_insert'
|
||||
info = -5
|
||||
@@ -236,9 +236,9 @@ contains
|
||||
return
|
||||
endif
|
||||
|
||||
call psb_ensure_size(heap%last+1,heap%keys,info,addsz=(1_psb_ipk_)*psb_heap_resize)
|
||||
call psb_ensure_size(heap%last+1,heap%keys,info)
|
||||
if (info == psb_success_) &
|
||||
& call psb_ensure_size(heap%last+1,heap%idxs,info,addsz=(1_psb_ipk_)*psb_heap_resize)
|
||||
& call psb_ensure_size(heap%last+1,heap%idxs,info)
|
||||
if (info /= psb_success_) then
|
||||
write(psb_err_unit,*) 'Memory allocation failure in heap_insert'
|
||||
info = -5
|
||||
|
||||
@@ -768,7 +768,7 @@ Contains
|
||||
integer(psb_ipk_) :: info
|
||||
! ...Local Variables
|
||||
|
||||
integer(psb_ipk_) :: isz,err_act,lb
|
||||
integer(psb_ipk_) :: isz,err_act,lb, i
|
||||
character(len=30) :: name, char_err
|
||||
logical, parameter :: debug=.false.
|
||||
|
||||
@@ -790,7 +790,11 @@ Contains
|
||||
call psb_errpush(info,name,a_err=char_err)
|
||||
goto 9999
|
||||
else
|
||||
vout(:) = vin(:)
|
||||
!$omp parallel do private(i)
|
||||
do i=lb,lb+isz-1
|
||||
vout(i) = vin(i)
|
||||
end do
|
||||
!$omp end parallel do
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -836,7 +840,9 @@ Contains
|
||||
call psb_errpush(info,name,a_err=char_err)
|
||||
goto 9999
|
||||
else
|
||||
!$omp workshare
|
||||
vout(:,:) = vin(:,:)
|
||||
!$omp end workshare
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -991,36 +997,17 @@ Contains
|
||||
goto 9999
|
||||
end if
|
||||
|
||||
!!$ If (len > psb_size(v)) Then
|
||||
!!$ if (present(newsz)) then
|
||||
!!$ isz = (max(len+1,newsz))
|
||||
!!$ else
|
||||
!!$ if (present(addsz)) then
|
||||
!!$ isz = len+max(1,addsz)
|
||||
!!$ else
|
||||
!!$ isz = max(len+10, int(1.25*len))
|
||||
!!$ endif
|
||||
!!$ endif
|
||||
!!$
|
||||
!!$ call psb_realloc(isz,v,info,pad=pad)
|
||||
!!$ if (info /= psb_success_) then
|
||||
!!$ info=psb_err_from_subroutine_
|
||||
!!$ call psb_errpush(info,name,a_err='psb_realloc')
|
||||
!!$ goto 9999
|
||||
!!$ End If
|
||||
!!$ end If
|
||||
If (len > psb_size(v)) Then
|
||||
isz = psb_size(v)
|
||||
If (len > isz) Then
|
||||
#if defined(OPENMP)
|
||||
!$OMP CRITICAL
|
||||
if (len > psb_size(v)) then
|
||||
if (len > isz) then
|
||||
if (present(newsz)) then
|
||||
isz = (max(len+1,newsz))
|
||||
isz = max(len+1,1,newsz)
|
||||
else if (present(addsz)) then
|
||||
isz = max(len,1,isz+addsz)
|
||||
else
|
||||
if (present(addsz)) then
|
||||
isz = len+max(1,addsz)
|
||||
else
|
||||
isz = max(len+10, int(1.25*len))
|
||||
endif
|
||||
isz = max(len,1,int(1.25*isz))
|
||||
endif
|
||||
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
@@ -1033,17 +1020,18 @@ Contains
|
||||
goto 9999
|
||||
end if
|
||||
#else
|
||||
if (present(newsz)) then
|
||||
isz = (max(len+1,newsz))
|
||||
else
|
||||
if (present(addsz)) then
|
||||
isz = len+max(1,addsz)
|
||||
if (len > isz) then
|
||||
if (present(newsz)) then
|
||||
isz = max(len+1,1,newsz)
|
||||
else if (present(addsz)) then
|
||||
isz = max(len,1,isz+addsz)
|
||||
else
|
||||
isz = max(len+10, int(1.25*len))
|
||||
isz = max(len,1,int(1.25*isz))
|
||||
endif
|
||||
endif
|
||||
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
end if
|
||||
|
||||
if (info /= psb_success_) then
|
||||
info=psb_err_from_subroutine_
|
||||
call psb_errpush(info,name,a_err='psb_realloc')
|
||||
@@ -1085,16 +1073,14 @@ Contains
|
||||
info=psb_err_from_subroutine_
|
||||
goto 9999
|
||||
end if
|
||||
|
||||
If (len > psb_size(v)) Then
|
||||
if (present(newsz)) then
|
||||
isz = (max(len+1,newsz))
|
||||
isz = psb_size(v)
|
||||
If (len > isz) Then
|
||||
if (present(newsz)) then
|
||||
isz = max(len+1,1,newsz)
|
||||
else if (present(addsz)) then
|
||||
isz = max(len,1,isz+addsz)
|
||||
else
|
||||
if (present(addsz)) then
|
||||
isz = len+max(1,addsz)
|
||||
else
|
||||
isz = max(len+10, int(1.25*len))
|
||||
endif
|
||||
isz = max(len,1,int(1.25*isz))
|
||||
endif
|
||||
|
||||
call psb_realloc(isz,v,info,pad=pad)
|
||||
|
||||
@@ -652,7 +652,7 @@ contains
|
||||
integer(psb_ipk_) :: me, np
|
||||
character(len=20) :: name,ch_err
|
||||
logical, allocatable :: mask_(:)
|
||||
logical :: use_openmp = .true.
|
||||
!!$ logical :: use_openmp = .true.
|
||||
#ifdef OPENMP
|
||||
integer(kind = OMP_lock_kind) :: ins_lck
|
||||
#endif
|
||||
@@ -683,119 +683,32 @@ contains
|
||||
mglob = idxmap%get_gr()
|
||||
nrow = idxmap%get_lr()
|
||||
!write(0,*) me,name,' before loop ',psb_errstatus_fatal()
|
||||
if (use_openmp) then
|
||||
#ifdef OPENMP
|
||||
!call OMP_init_lock(ins_lck)
|
||||
!call OMP_init_lock(ins_lck)
|
||||
|
||||
if (idxmap%is_bld()) then
|
||||
if (idxmap%is_bld()) then
|
||||
|
||||
isLoopValid = .true.
|
||||
ncol = idxmap%get_lc()
|
||||
isLoopValid = .true.
|
||||
ncol = idxmap%get_lc()
|
||||
if (present(mask)) then
|
||||
mask_ = mask
|
||||
else
|
||||
allocate(mask_(size(idx)))
|
||||
mask_ = .true.
|
||||
end if
|
||||
|
||||
if (present(lidx)) then
|
||||
if (present(mask)) then
|
||||
mask_ = mask
|
||||
else
|
||||
allocate(mask_(size(idx)))
|
||||
mask_ = .true.
|
||||
end if
|
||||
!$omp critical(hash_g2l_ins)
|
||||
|
||||
if (present(lidx)) then
|
||||
if (present(mask)) then
|
||||
!$omp critical(hash_g2l_ins)
|
||||
|
||||
! $ OMP PARALLEL DO default(none) schedule(DYNAMIC) &
|
||||
! $ OMP shared(name,me,is,idx,ins_lck,mask,mglob,idxmap,ncol,nrow,laddsz,lidx) &
|
||||
! $ OMP private(i,ip,lip,tlip,nxt,info) &
|
||||
! $ OMP reduction(.AND.:isLoopValid)
|
||||
do i = 1, is
|
||||
info = 0
|
||||
if (.not. isLoopValid) cycle
|
||||
if (mask(i)) then
|
||||
ip = idx(i)
|
||||
if ((ip < 1 ).or.(ip>mglob)) then
|
||||
idx(i) = -1
|
||||
cycle
|
||||
endif
|
||||
!call OMP_set_lock(ins_lck)
|
||||
ncol = idxmap%get_lc()
|
||||
!call OMP_unset_lock(ins_lck)
|
||||
|
||||
! At first, we check the index presence in 'idxmap'. Usually
|
||||
! the index is found. If it is not found, we repeat the checking,
|
||||
! but inside a critical region.
|
||||
call hash_inner_cnv(ip,lip,idxmap%hashvmask,&
|
||||
& idxmap%hashv,idxmap%glb_lc,ncol)
|
||||
if (lip < 0) then
|
||||
!call OMP_set_lock(ins_lck)
|
||||
|
||||
! We check again if the index is already in 'idxmap', this
|
||||
! time inside a critical region (we assume that the index
|
||||
! is often already existing).
|
||||
ncol = idxmap%get_lc()
|
||||
nxt = lidx(i)
|
||||
call hash_inner_cnv(ip,lip,idxmap%hashvmask,&
|
||||
& idxmap%hashv,idxmap%glb_lc,ncol)
|
||||
|
||||
if (lip > 0) then
|
||||
idx(i) = lip
|
||||
else if (lip < 0) then
|
||||
! Index not found
|
||||
call psb_hash_searchinskey(ip,tlip,nxt,idxmap%hash,info)
|
||||
lip = tlip
|
||||
|
||||
|
||||
if (info >= 0) then
|
||||
! 'nxt' is not equal to 'tlip' when the key is already inside
|
||||
! the hash map. In that case 'tlip' is the value corresponding
|
||||
! to the existing mapping.
|
||||
if (nxt == tlip) then
|
||||
|
||||
ncol = MAX(ncol,nxt)
|
||||
|
||||
call psb_ensure_size(ncol,idxmap%loc_to_glob,info,&
|
||||
& pad=-1_psb_lpk_,addsz=laddsz)
|
||||
|
||||
if (info /= psb_success_) then
|
||||
!write(0,*) 'Error spot 1'
|
||||
call psb_errpush(psb_err_from_subroutine_ai_,name,&
|
||||
&a_err='psb_ensure_size',i_err=(/info/))
|
||||
|
||||
isLoopValid = .false.
|
||||
idx(i) = -1
|
||||
else
|
||||
idx(i) = lip
|
||||
idxmap%loc_to_glob(nxt) = ip
|
||||
call idxmap%set_lc(ncol)
|
||||
end if
|
||||
end if
|
||||
else
|
||||
idx(i) = -1
|
||||
end if
|
||||
!call OMP_unset_lock(ins_lck)
|
||||
end if
|
||||
else
|
||||
idx(i) = lip
|
||||
end if
|
||||
else
|
||||
idx(i) = -1
|
||||
end if
|
||||
|
||||
end do
|
||||
! $ OMP END PARALLEL DO
|
||||
!$omp end critical(hash_g2l_ins)
|
||||
|
||||
if (.not. isLoopValid) then
|
||||
goto 9999
|
||||
end if
|
||||
else
|
||||
!$omp critical(hash_g2l_ins)
|
||||
|
||||
! $ OMP PARALLEL DO default(none) schedule(DYNAMIC) &
|
||||
! $ OMP shared(name,me,is,idx,ins_lck,mglob,idxmap,ncol,nrow,laddsz,lidx) &
|
||||
! $ OMP private(i,ip,lip,tlip,nxt,info) &
|
||||
! $ OMP reduction(.AND.:isLoopValid)
|
||||
do i = 1, is
|
||||
info = 0
|
||||
if (.not. isLoopValid) cycle
|
||||
! $ OMP PARALLEL DO default(none) schedule(DYNAMIC) &
|
||||
! $ OMP shared(name,me,is,idx,ins_lck,mask,mglob,idxmap,ncol,nrow,laddsz,lidx) &
|
||||
! $ OMP private(i,ip,lip,tlip,nxt,info) &
|
||||
! $ OMP reduction(.AND.:isLoopValid)
|
||||
do i = 1, is
|
||||
info = 0
|
||||
if (.not. isLoopValid) cycle
|
||||
if (mask(i)) then
|
||||
ip = idx(i)
|
||||
if ((ip < 1 ).or.(ip>mglob)) then
|
||||
idx(i) = -1
|
||||
@@ -812,6 +725,7 @@ contains
|
||||
& idxmap%hashv,idxmap%glb_lc,ncol)
|
||||
if (lip < 0) then
|
||||
!call OMP_set_lock(ins_lck)
|
||||
|
||||
! We check again if the index is already in 'idxmap', this
|
||||
! time inside a critical region (we assume that the index
|
||||
! is often already existing).
|
||||
@@ -823,9 +737,11 @@ contains
|
||||
if (lip > 0) then
|
||||
idx(i) = lip
|
||||
else if (lip < 0) then
|
||||
! Index not found
|
||||
call psb_hash_searchinskey(ip,tlip,nxt,idxmap%hash,info)
|
||||
lip = tlip
|
||||
|
||||
|
||||
if (info >= 0) then
|
||||
! 'nxt' is not equal to 'tlip' when the key is already inside
|
||||
! the hash map. In that case 'tlip' is the value corresponding
|
||||
@@ -838,7 +754,7 @@ contains
|
||||
& pad=-1_psb_lpk_,addsz=laddsz)
|
||||
|
||||
if (info /= psb_success_) then
|
||||
!write(0,*) 'Error spot 2'
|
||||
!write(0,*) 'Error spot 1'
|
||||
call psb_errpush(psb_err_from_subroutine_ai_,name,&
|
||||
&a_err='psb_ensure_size',i_err=(/info/))
|
||||
|
||||
@@ -858,160 +774,160 @@ contains
|
||||
else
|
||||
idx(i) = lip
|
||||
end if
|
||||
|
||||
end do
|
||||
! $ OMP END PARALLEL DO
|
||||
!$omp end critical(hash_g2l_ins)
|
||||
|
||||
if (.not. isLoopValid) then
|
||||
goto 9999
|
||||
else
|
||||
idx(i) = -1
|
||||
end if
|
||||
|
||||
end do
|
||||
! $ OMP END PARALLEL DO
|
||||
!$omp end critical(hash_g2l_ins)
|
||||
|
||||
if (.not. isLoopValid) then
|
||||
goto 9999
|
||||
end if
|
||||
else if (.not.present(lidx)) then
|
||||
if(present(mask)) then
|
||||
! $ OMP PARALLEL DO default(none) schedule(DYNAMIC) &
|
||||
! $ OMP shared(name,me,is,idx,ins_lck,mask,mglob,idxmap,ncol,nrow,laddsz) &
|
||||
! $ OMP private(i,ip,lip,tlip,nxt,info) &
|
||||
! $ OMP reduction(.AND.:isLoopValid)
|
||||
|
||||
!$omp critical(hash_g2l_ins)
|
||||
do i = 1, is
|
||||
info = 0
|
||||
if (.not. isLoopValid) cycle
|
||||
if (mask(i)) then
|
||||
ip = idx(i)
|
||||
if ((ip < 1 ).or.(ip>mglob)) then
|
||||
idx(i) = -1
|
||||
cycle
|
||||
endif
|
||||
!call OMP_set_lock(ins_lck)
|
||||
ncol = idxmap%get_lc()
|
||||
!call OMP_unset_lock(ins_lck)
|
||||
else
|
||||
!$omp critical(hash_g2l_ins)
|
||||
|
||||
! At first, we check the index presence in 'idxmap'. Usually
|
||||
! the index is found. If it is not found, we repeat the checking,
|
||||
! but inside a critical region.
|
||||
!write(0,*) me,name,' b hic 1 ',psb_errstatus_fatal()
|
||||
call hash_inner_cnv(ip,lip,idxmap%hashvmask,&
|
||||
& idxmap%hashv,idxmap%glb_lc,ncol)
|
||||
!write(0,*) me,name,' a hic 1 ',psb_errstatus_fatal()
|
||||
if (lip < 0) then
|
||||
!call OMP_set_lock(ins_lck)
|
||||
! We check again if the index is already in 'idxmap', this
|
||||
! time inside a critical region (we assume that the index
|
||||
! is often already existing, so this lock is relatively rare).
|
||||
ncol = idxmap%get_lc()
|
||||
nxt = ncol + 1
|
||||
!write(0,*) me,name,' b hic 2 ',psb_errstatus_fatal()
|
||||
call hash_inner_cnv(ip,lip,idxmap%hashvmask,&
|
||||
& idxmap%hashv,idxmap%glb_lc,ncol)
|
||||
!write(0,*) me,name,' a hic 2 ',psb_errstatus_fatal()
|
||||
if (lip > 0) then
|
||||
idx(i) = lip
|
||||
else if (lip < 0) then
|
||||
! Index not found
|
||||
!write(0,*) me,name,' b hsik ',psb_errstatus_fatal()
|
||||
call psb_hash_searchinskey(ip,tlip,nxt,idxmap%hash,info)
|
||||
if (psb_errstatus_fatal()) write(0,*) me,name,' a hsik ',info,omp_get_thread_num()
|
||||
!write(0,*) me,name,' a hsik ',psb_errstatus_fatal()
|
||||
lip = tlip
|
||||
! $ OMP PARALLEL DO default(none) schedule(DYNAMIC) &
|
||||
! $ OMP shared(name,me,is,idx,ins_lck,mglob,idxmap,ncol,nrow,laddsz,lidx) &
|
||||
! $ OMP private(i,ip,lip,tlip,nxt,info) &
|
||||
! $ OMP reduction(.AND.:isLoopValid)
|
||||
do i = 1, is
|
||||
info = 0
|
||||
if (.not. isLoopValid) cycle
|
||||
ip = idx(i)
|
||||
if ((ip < 1 ).or.(ip>mglob)) then
|
||||
idx(i) = -1
|
||||
cycle
|
||||
endif
|
||||
!call OMP_set_lock(ins_lck)
|
||||
ncol = idxmap%get_lc()
|
||||
!call OMP_unset_lock(ins_lck)
|
||||
|
||||
if (info >= 0) then
|
||||
!write(0,*) 'Error before spot 3', info
|
||||
! 'nxt' is not equal to 'tlip' when the key is already inside
|
||||
! the hash map. In that case 'tlip' is the value corresponding
|
||||
! to the existing mapping.
|
||||
if (nxt == tlip) then
|
||||
! At first, we check the index presence in 'idxmap'. Usually
|
||||
! the index is found. If it is not found, we repeat the checking,
|
||||
! but inside a critical region.
|
||||
call hash_inner_cnv(ip,lip,idxmap%hashvmask,&
|
||||
& idxmap%hashv,idxmap%glb_lc,ncol)
|
||||
if (lip < 0) then
|
||||
!call OMP_set_lock(ins_lck)
|
||||
! We check again if the index is already in 'idxmap', this
|
||||
! time inside a critical region (we assume that the index
|
||||
! is often already existing).
|
||||
ncol = idxmap%get_lc()
|
||||
nxt = lidx(i)
|
||||
call hash_inner_cnv(ip,lip,idxmap%hashvmask,&
|
||||
& idxmap%hashv,idxmap%glb_lc,ncol)
|
||||
|
||||
ncol = MAX(ncol,nxt)
|
||||
call psb_ensure_size(ncol,idxmap%loc_to_glob,info,&
|
||||
& pad=-1_psb_lpk_,addsz=laddsz)
|
||||
if (psb_errstatus_fatal()) write(0,*) me,name,' a esz ',info,omp_get_thread_num()
|
||||
if (info /= psb_success_) then
|
||||
!write(0,*) 'Error spot 3', info
|
||||
call psb_errpush(psb_err_from_subroutine_ai_,name,&
|
||||
&a_err='psb_ensure_size',i_err=(/info/))
|
||||
if (lip > 0) then
|
||||
idx(i) = lip
|
||||
else if (lip < 0) then
|
||||
call psb_hash_searchinskey(ip,tlip,nxt,idxmap%hash,info)
|
||||
lip = tlip
|
||||
|
||||
isLoopValid = .false.
|
||||
idx(i) = -1
|
||||
else
|
||||
idx(i) = lip
|
||||
idxmap%loc_to_glob(nxt) = ip
|
||||
call idxmap%set_lc(ncol)
|
||||
end if
|
||||
end if
|
||||
else
|
||||
if (info >= 0) then
|
||||
! 'nxt' is not equal to 'tlip' when the key is already inside
|
||||
! the hash map. In that case 'tlip' is the value corresponding
|
||||
! to the existing mapping.
|
||||
if (nxt == tlip) then
|
||||
|
||||
ncol = MAX(ncol,nxt)
|
||||
|
||||
call psb_ensure_size(ncol,idxmap%loc_to_glob,info,&
|
||||
& pad=-1_psb_lpk_,addsz=laddsz)
|
||||
|
||||
if (info /= psb_success_) then
|
||||
!write(0,*) 'Error spot 2'
|
||||
call psb_errpush(psb_err_from_subroutine_ai_,name,&
|
||||
&a_err='psb_ensure_size',i_err=(/info/))
|
||||
|
||||
isLoopValid = .false.
|
||||
idx(i) = -1
|
||||
else
|
||||
idx(i) = lip
|
||||
idxmap%loc_to_glob(nxt) = ip
|
||||
call idxmap%set_lc(ncol)
|
||||
end if
|
||||
!call OMP_unset_lock(ins_lck)
|
||||
end if
|
||||
else
|
||||
idx(i) = lip
|
||||
idx(i) = -1
|
||||
end if
|
||||
else
|
||||
idx(i) = -1
|
||||
!call OMP_unset_lock(ins_lck)
|
||||
end if
|
||||
|
||||
end do
|
||||
! $ OMP END PARALLEL DO
|
||||
!$omp end critical(hash_g2l_ins)
|
||||
|
||||
if (.not. isLoopValid) then
|
||||
goto 9999
|
||||
else
|
||||
idx(i) = lip
|
||||
end if
|
||||
else
|
||||
! $ OMP PARALLEL DO default(none) schedule(DYNAMIC) &
|
||||
! $ OMP shared(name,me,is,idx,ins_lck,mglob,idxmap,ncol,nrow,laddsz) &
|
||||
! $ OMP private(i,ip,lip,tlip,nxt,info) &
|
||||
! $ OMP reduction(.AND.:isLoopValid)
|
||||
!$omp critical(hash_g2l_ins)
|
||||
do i = 1, is
|
||||
info = 0
|
||||
if (.not. isLoopValid) cycle
|
||||
|
||||
end do
|
||||
! $ OMP END PARALLEL DO
|
||||
!$omp end critical(hash_g2l_ins)
|
||||
|
||||
if (.not. isLoopValid) then
|
||||
goto 9999
|
||||
end if
|
||||
end if
|
||||
else if (.not.present(lidx)) then
|
||||
if(present(mask)) then
|
||||
! $ OMP PARALLEL DO default(none) schedule(DYNAMIC) &
|
||||
! $ OMP shared(name,me,is,idx,ins_lck,mask,mglob,idxmap,ncol,nrow,laddsz) &
|
||||
! $ OMP private(i,ip,lip,tlip,nxt,info) &
|
||||
! $ OMP reduction(.AND.:isLoopValid)
|
||||
|
||||
!$omp critical(hash_g2l_ins)
|
||||
do i = 1, is
|
||||
info = 0
|
||||
if (.not. isLoopValid) cycle
|
||||
if (mask(i)) then
|
||||
ip = idx(i)
|
||||
if ((ip < 1 ).or.(ip>mglob)) then
|
||||
idx(i) = -1
|
||||
cycle
|
||||
endif
|
||||
!call OMP_set_lock(ins_lck)
|
||||
!call OMP_set_lock(ins_lck)
|
||||
ncol = idxmap%get_lc()
|
||||
!call OMP_unset_lock(ins_lck)
|
||||
|
||||
! At first, we check the index presence in 'idxmap'. Usually
|
||||
! the index is found. If it is not found, we repeat the checking,
|
||||
! but inside a critical region.
|
||||
!write(0,*) me,name,' b hic 1 ',psb_errstatus_fatal()
|
||||
call hash_inner_cnv(ip,lip,idxmap%hashvmask,&
|
||||
& idxmap%hashv,idxmap%glb_lc,ncol)
|
||||
!write(0,*) me,name,' a hic 1 ',psb_errstatus_fatal()
|
||||
if (lip < 0) then
|
||||
!call OMP_set_lock(ins_lck)
|
||||
! We check again if the index is already in 'idxmap', this
|
||||
! time inside a critical region (we assume that the index
|
||||
! is often already existing).
|
||||
! is often already existing, so this lock is relatively rare).
|
||||
ncol = idxmap%get_lc()
|
||||
nxt = ncol + 1
|
||||
nxt = ncol + 1
|
||||
!write(0,*) me,name,' b hic 2 ',psb_errstatus_fatal()
|
||||
call hash_inner_cnv(ip,lip,idxmap%hashvmask,&
|
||||
& idxmap%hashv,idxmap%glb_lc,ncol)
|
||||
|
||||
!write(0,*) me,name,' a hic 2 ',psb_errstatus_fatal()
|
||||
if (lip > 0) then
|
||||
idx(i) = lip
|
||||
else if (lip < 0) then
|
||||
! Index not found
|
||||
!write(0,*) me,name,' b hsik ',psb_errstatus_fatal()
|
||||
call psb_hash_searchinskey(ip,tlip,nxt,idxmap%hash,info)
|
||||
if (psb_errstatus_fatal()) write(0,*) me,name,' a hsik ',info,omp_get_thread_num()
|
||||
!write(0,*) me,name,' a hsik ',psb_errstatus_fatal()
|
||||
lip = tlip
|
||||
|
||||
if (info >= 0) then
|
||||
!write(0,*) 'Error before spot 3', info
|
||||
! 'nxt' is not equal to 'tlip' when the key is already inside
|
||||
! the hash map. In that case 'tlip' is the value corresponding
|
||||
! to the existing mapping.
|
||||
if (nxt == tlip) then
|
||||
|
||||
ncol = MAX(ncol,nxt)
|
||||
|
||||
call psb_ensure_size(ncol,idxmap%loc_to_glob,info,&
|
||||
& pad=-1_psb_lpk_,addsz=laddsz)
|
||||
|
||||
if (psb_errstatus_fatal()) write(0,*) me,name,' a esz ',info,omp_get_thread_num()
|
||||
if (info /= psb_success_) then
|
||||
!write(0,*) 'Error spot 4'
|
||||
!write(0,*) 'Error spot 3', info
|
||||
call psb_errpush(psb_err_from_subroutine_ai_,name,&
|
||||
&a_err='psb_ensure_size',i_err=(/info/))
|
||||
|
||||
@@ -1028,116 +944,145 @@ contains
|
||||
end if
|
||||
!call OMP_unset_lock(ins_lck)
|
||||
end if
|
||||
|
||||
else
|
||||
idx(i) = lip
|
||||
end if
|
||||
|
||||
end do
|
||||
! $ OMP END PARALLEL DO
|
||||
!$omp end critical(hash_g2l_ins)
|
||||
|
||||
if (.not. isLoopValid) then
|
||||
goto 9999
|
||||
else
|
||||
idx(i) = -1
|
||||
end if
|
||||
|
||||
end do
|
||||
! $ OMP END PARALLEL DO
|
||||
!$omp end critical(hash_g2l_ins)
|
||||
|
||||
if (.not. isLoopValid) then
|
||||
goto 9999
|
||||
end if
|
||||
end if
|
||||
else
|
||||
! Wrong state
|
||||
idx = -1
|
||||
info = -1
|
||||
end if
|
||||
!call OMP_destroy_lock(ins_lck)
|
||||
#endif
|
||||
else if (.not.use_openmp) then
|
||||
#ifdef OPENMP
|
||||
! $ omp parallel
|
||||
! $ omp critical
|
||||
!write(0,*) 'In cnv: ',omp_get_num_threads()
|
||||
#endif
|
||||
isLoopValid = .true.
|
||||
if (idxmap%is_bld()) then
|
||||
else
|
||||
! $ OMP PARALLEL DO default(none) schedule(DYNAMIC) &
|
||||
! $ OMP shared(name,me,is,idx,ins_lck,mglob,idxmap,ncol,nrow,laddsz) &
|
||||
! $ OMP private(i,ip,lip,tlip,nxt,info) &
|
||||
! $ OMP reduction(.AND.:isLoopValid)
|
||||
!$omp critical(hash_g2l_ins)
|
||||
do i = 1, is
|
||||
info = 0
|
||||
if (.not. isLoopValid) cycle
|
||||
ip = idx(i)
|
||||
if ((ip < 1 ).or.(ip>mglob)) then
|
||||
idx(i) = -1
|
||||
cycle
|
||||
endif
|
||||
!call OMP_set_lock(ins_lck)
|
||||
ncol = idxmap%get_lc()
|
||||
!call OMP_unset_lock(ins_lck)
|
||||
|
||||
if (present(lidx)) then
|
||||
if (present(mask)) then
|
||||
do i = 1, is
|
||||
! At first, we check the index presence in 'idxmap'. Usually
|
||||
! the index is found. If it is not found, we repeat the checking,
|
||||
! but inside a critical region.
|
||||
call hash_inner_cnv(ip,lip,idxmap%hashvmask,&
|
||||
& idxmap%hashv,idxmap%glb_lc,ncol)
|
||||
if (lip < 0) then
|
||||
!call OMP_set_lock(ins_lck)
|
||||
! We check again if the index is already in 'idxmap', this
|
||||
! time inside a critical region (we assume that the index
|
||||
! is often already existing).
|
||||
ncol = idxmap%get_lc()
|
||||
if (mask(i)) then
|
||||
ip = idx(i)
|
||||
if ((ip < 1 ).or.(ip>mglob) ) then
|
||||
idx(i) = -1
|
||||
cycle
|
||||
endif
|
||||
call hash_inner_cnv(ip,lip,idxmap%hashvmask,&
|
||||
& idxmap%hashv,idxmap%glb_lc,ncol)
|
||||
if (lip < 0) then
|
||||
tlip = lip
|
||||
nxt = lidx(i)
|
||||
if (nxt <= nrow) then
|
||||
idx(i) = -1
|
||||
cycle
|
||||
endif
|
||||
call psb_hash_searchinskey(ip,tlip,nxt,idxmap%hash,info)
|
||||
if (info >=0) then
|
||||
if (nxt == tlip) then
|
||||
ncol = max(ncol,nxt)
|
||||
call psb_ensure_size(ncol,idxmap%loc_to_glob,info,&
|
||||
& pad=-1_psb_lpk_,addsz=laddsz)
|
||||
if (info /= psb_success_) then
|
||||
!write(0,*) 'Error spot'
|
||||
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
|
||||
nxt = ncol + 1
|
||||
call hash_inner_cnv(ip,lip,idxmap%hashvmask,&
|
||||
& idxmap%hashv,idxmap%glb_lc,ncol)
|
||||
|
||||
if (lip > 0) then
|
||||
idx(i) = lip
|
||||
else if (lip < 0) then
|
||||
! Index not found
|
||||
call psb_hash_searchinskey(ip,tlip,nxt,idxmap%hash,info)
|
||||
lip = tlip
|
||||
|
||||
if (info >= 0) then
|
||||
! 'nxt' is not equal to 'tlip' when the key is already inside
|
||||
! the hash map. In that case 'tlip' is the value corresponding
|
||||
! to the existing mapping.
|
||||
if (nxt == tlip) then
|
||||
|
||||
ncol = MAX(ncol,nxt)
|
||||
|
||||
call psb_ensure_size(ncol,idxmap%loc_to_glob,info,&
|
||||
& pad=-1_psb_lpk_,addsz=laddsz)
|
||||
|
||||
if (info /= psb_success_) then
|
||||
!write(0,*) 'Error spot 4'
|
||||
call psb_errpush(psb_err_from_subroutine_ai_,name,&
|
||||
&a_err='psb_ensure_size',i_err=(/info/))
|
||||
|
||||
isLoopValid = .false.
|
||||
idx(i) = -1
|
||||
else
|
||||
idx(i) = lip
|
||||
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
|
||||
end if
|
||||
else
|
||||
idx(i) = -1
|
||||
end if
|
||||
idx(i) = lip
|
||||
info = psb_success_
|
||||
else
|
||||
idx(i) = -1
|
||||
!call OMP_unset_lock(ins_lck)
|
||||
end if
|
||||
enddo
|
||||
|
||||
else if (.not.present(mask)) then
|
||||
else
|
||||
idx(i) = lip
|
||||
end if
|
||||
|
||||
do i = 1, is
|
||||
ncol = idxmap%get_lc()
|
||||
ip = idx(i)
|
||||
if ((ip < 1 ).or.(ip>mglob)) then
|
||||
end do
|
||||
! $ OMP END PARALLEL DO
|
||||
!$omp end critical(hash_g2l_ins)
|
||||
|
||||
if (.not. isLoopValid) then
|
||||
goto 9999
|
||||
end if
|
||||
|
||||
end if
|
||||
end if
|
||||
else
|
||||
! Wrong state
|
||||
idx = -1
|
||||
info = -1
|
||||
end if
|
||||
!call OMP_destroy_lock(ins_lck)
|
||||
#else
|
||||
!!$ else if (.not.use_openmp) then
|
||||
isLoopValid = .true.
|
||||
if (idxmap%is_bld()) then
|
||||
|
||||
if (present(lidx)) then
|
||||
if (present(mask)) then
|
||||
do i = 1, is
|
||||
ncol = idxmap%get_lc()
|
||||
if (mask(i)) then
|
||||
ip = idx(i)
|
||||
if ((ip < 1 ).or.(ip>mglob) ) then
|
||||
idx(i) = -1
|
||||
cycle
|
||||
endif
|
||||
call hash_inner_cnv(ip,lip,idxmap%hashvmask,idxmap%hashv,&
|
||||
& idxmap%glb_lc,ncol)
|
||||
if (lip < 0) then
|
||||
call hash_inner_cnv(ip,lip,idxmap%hashvmask,&
|
||||
& idxmap%hashv,idxmap%glb_lc,ncol)
|
||||
if (lip < 0) then
|
||||
tlip = lip
|
||||
nxt = lidx(i)
|
||||
if (nxt <= nrow) then
|
||||
idx(i) = -1
|
||||
cycle
|
||||
endif
|
||||
call psb_hash_searchinskey(ip,tlip,nxt,idxmap%hash,info)
|
||||
lip = tlip
|
||||
|
||||
if (info >=0) then
|
||||
if (nxt == lip) then
|
||||
ncol = max(nxt,ncol)
|
||||
if (nxt == tlip) then
|
||||
ncol = max(ncol,nxt)
|
||||
call psb_ensure_size(ncol,idxmap%loc_to_glob,info,&
|
||||
& pad=-1_psb_lpk_,addsz=laddsz)
|
||||
if (info /= psb_success_) then
|
||||
info=1
|
||||
!write(0,*) 'Error spot'
|
||||
!write(0,*) 'Error spot'
|
||||
call psb_errpush(psb_err_from_subroutine_ai_,name,&
|
||||
&a_err='psb_ensure_size',i_err=(/info/))
|
||||
isLoopValid = .false.
|
||||
isLoopValid = .false.
|
||||
end if
|
||||
idxmap%loc_to_glob(nxt) = ip
|
||||
call idxmap%set_lc(ncol)
|
||||
@@ -1151,66 +1096,71 @@ contains
|
||||
end if
|
||||
idx(i) = lip
|
||||
info = psb_success_
|
||||
enddo
|
||||
else
|
||||
idx(i) = -1
|
||||
end if
|
||||
enddo
|
||||
|
||||
end if
|
||||
else if (.not.present(mask)) then
|
||||
|
||||
else if (.not.present(lidx)) then
|
||||
do i = 1, is
|
||||
ncol = idxmap%get_lc()
|
||||
ip = idx(i)
|
||||
if ((ip < 1 ).or.(ip>mglob)) then
|
||||
idx(i) = -1
|
||||
cycle
|
||||
endif
|
||||
call hash_inner_cnv(ip,lip,idxmap%hashvmask,idxmap%hashv,&
|
||||
& idxmap%glb_lc,ncol)
|
||||
if (lip < 0) then
|
||||
nxt = lidx(i)
|
||||
if (nxt <= nrow) then
|
||||
idx(i) = -1
|
||||
cycle
|
||||
endif
|
||||
call psb_hash_searchinskey(ip,tlip,nxt,idxmap%hash,info)
|
||||
lip = tlip
|
||||
|
||||
if (present(mask)) then
|
||||
do i = 1, is
|
||||
if (mask(i)) then
|
||||
ip = idx(i)
|
||||
if ((ip < 1 ).or.(ip>mglob)) then
|
||||
idx(i) = -1
|
||||
cycle
|
||||
if (info >=0) then
|
||||
if (nxt == lip) then
|
||||
ncol = max(nxt,ncol)
|
||||
call psb_ensure_size(ncol,idxmap%loc_to_glob,info,&
|
||||
& pad=-1_psb_lpk_,addsz=laddsz)
|
||||
if (info /= psb_success_) then
|
||||
info=1
|
||||
!write(0,*) 'Error spot'
|
||||
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
|
||||
ncol = idxmap%get_lc()
|
||||
nxt = ncol + 1
|
||||
call hash_inner_cnv(ip,lip,idxmap%hashvmask,idxmap%hashv,&
|
||||
& idxmap%glb_lc,ncol)
|
||||
if (lip < 0) then
|
||||
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_,addsz=laddsz)
|
||||
if (info /= psb_success_) then
|
||||
info=1
|
||||
write(0,*) 'Error spot 5'
|
||||
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
|
||||
idx(i) = -1
|
||||
call psb_errpush(psb_err_from_subroutine_ai_,name,&
|
||||
& a_err='SearchInsKeyVal',i_err=(/info/))
|
||||
isLoopValid = .false.
|
||||
end if
|
||||
enddo
|
||||
else if (.not.present(mask)) then
|
||||
end if
|
||||
idx(i) = lip
|
||||
info = psb_success_
|
||||
enddo
|
||||
|
||||
do i = 1, is
|
||||
ncol = idxmap%get_lc()
|
||||
ip = idx(i)
|
||||
end if
|
||||
|
||||
else if (.not.present(lidx)) then
|
||||
|
||||
if (present(mask)) then
|
||||
do i = 1, is
|
||||
if (mask(i)) then
|
||||
ip = idx(i)
|
||||
if ((ip < 1 ).or.(ip>mglob)) then
|
||||
idx(i) = -1
|
||||
cycle
|
||||
endif
|
||||
nxt = ncol + 1
|
||||
ncol = idxmap%get_lc()
|
||||
nxt = ncol + 1
|
||||
call hash_inner_cnv(ip,lip,idxmap%hashvmask,idxmap%hashv,&
|
||||
& idxmap%glb_lc,ncol)
|
||||
if (lip < 0) then
|
||||
@@ -1225,41 +1175,80 @@ contains
|
||||
& pad=-1_psb_lpk_,addsz=laddsz)
|
||||
if (info /= psb_success_) then
|
||||
info=1
|
||||
write(0,*) 'Error spot 6'
|
||||
ch_err='psb_ensure_size'
|
||||
write(0,*) 'Error spot 5'
|
||||
call psb_errpush(psb_err_from_subroutine_ai_,name,&
|
||||
&a_err=ch_err,i_err=(/info,izero,izero,izero,izero/))
|
||||
& 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
|
||||
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.
|
||||
& a_err='SearchInsKeyVal',i_err=(/info/))
|
||||
isLoopValid = .false.
|
||||
end if
|
||||
idx(i) = lip
|
||||
info = psb_success_
|
||||
enddo
|
||||
else
|
||||
idx(i) = -1
|
||||
end if
|
||||
enddo
|
||||
else if (.not.present(mask)) then
|
||||
|
||||
do i = 1, is
|
||||
ncol = idxmap%get_lc()
|
||||
ip = idx(i)
|
||||
if ((ip < 1 ).or.(ip>mglob)) then
|
||||
idx(i) = -1
|
||||
cycle
|
||||
endif
|
||||
nxt = ncol + 1
|
||||
call hash_inner_cnv(ip,lip,idxmap%hashvmask,idxmap%hashv,&
|
||||
& idxmap%glb_lc,ncol)
|
||||
if (lip < 0) then
|
||||
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_,addsz=laddsz)
|
||||
if (info /= psb_success_) then
|
||||
info=1
|
||||
write(0,*) 'Error spot 6'
|
||||
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_
|
||||
enddo
|
||||
|
||||
end if
|
||||
end if
|
||||
else
|
||||
! Wrong state
|
||||
idx = -1
|
||||
info = -1
|
||||
end if
|
||||
#ifdef OPENMP
|
||||
! $ omp end critical
|
||||
! $ omp end parallel
|
||||
|
||||
#endif
|
||||
if (.not. isLoopValid) goto 9999
|
||||
else
|
||||
! Wrong state
|
||||
idx = -1
|
||||
info = -1
|
||||
end if
|
||||
if (.not. isLoopValid) goto 9999
|
||||
#endif
|
||||
!write(0,*) me,name,' after loop ',psb_errstatus_fatal()
|
||||
call psb_erractionrestore(err_act)
|
||||
return
|
||||
|
||||
@@ -168,6 +168,8 @@ module psb_c_base_mat_mod
|
||||
procedure, pass(a) :: reallocate_nz => psb_c_coo_reallocate_nz
|
||||
procedure, pass(a) :: allocate_mnnz => psb_c_coo_allocate_mnnz
|
||||
procedure, pass(a) :: ensure_size => psb_c_coo_ensure_size
|
||||
procedure, pass(a) :: tril => psb_c_coo_tril
|
||||
procedure, pass(a) :: triu => psb_c_coo_triu
|
||||
procedure, pass(a) :: cp_to_coo => psb_c_cp_coo_to_coo
|
||||
procedure, pass(a) :: cp_from_coo => psb_c_cp_coo_from_coo
|
||||
procedure, pass(a) :: cp_to_fmt => psb_c_cp_coo_to_fmt
|
||||
@@ -1894,6 +1896,93 @@ module psb_c_base_mat_mod
|
||||
integer(psb_ipk_), intent(in), optional :: idir
|
||||
end subroutine psb_c_fix_coo
|
||||
end interface
|
||||
!
|
||||
!> Function tril:
|
||||
!! \memberof psb_c_coo_sparse_mat
|
||||
!! \brief Copy the lower triangle, i.e. all entries
|
||||
!! A(I,J) such that J-I <= DIAG
|
||||
!! default value is DIAG=0, i.e. lower triangle up to
|
||||
!! the main diagonal.
|
||||
!! DIAG=-1 means copy the strictly lower triangle
|
||||
!! DIAG= 1 means copy the lower triangle plus the first diagonal
|
||||
!! of the upper triangle.
|
||||
!! Moreover, apply a clipping by copying entries A(I,J) only if
|
||||
!! IMIN<=I<=IMAX
|
||||
!! JMIN<=J<=JMAX
|
||||
!!
|
||||
!! \param l the output (sub)matrix
|
||||
!! \param info return code
|
||||
!! \param diag [0] the last diagonal (J-I) to be considered.
|
||||
!! \param imin [1] the minimum row index we are interested in
|
||||
!! \param imax [a\%get_nrows()] the minimum row index we are interested in
|
||||
!! \param jmin [1] minimum col index
|
||||
!! \param jmax [a\%get_ncols()] maximum col index
|
||||
!! \param iren(:) [none] an array to return renumbered indices (iren(ia(:)),iren(ja(:))
|
||||
!! \param rscale [false] map [min(ia(:)):max(ia(:))] onto [1:max(ia(:))-min(ia(:))+1]
|
||||
!! \param cscale [false] map [min(ja(:)):max(ja(:))] onto [1:max(ja(:))-min(ja(:))+1]
|
||||
!! ( iren cannot be specified with rscale/cscale)
|
||||
!! \param append [false] append to ia,ja
|
||||
!! \param nzin [none] if append, then first new entry should go in entry nzin+1
|
||||
!! \param u [none] copy of the complementary triangle
|
||||
!!
|
||||
!
|
||||
interface
|
||||
subroutine psb_c_coo_tril(a,l,info,diag,imin,imax,&
|
||||
& jmin,jmax,rscale,cscale,u)
|
||||
import
|
||||
class(psb_c_coo_sparse_mat), intent(in) :: a
|
||||
class(psb_c_coo_sparse_mat), intent(out) :: l
|
||||
integer(psb_ipk_),intent(out) :: info
|
||||
integer(psb_ipk_), intent(in), optional :: diag,imin,imax,jmin,jmax
|
||||
logical, intent(in), optional :: rscale,cscale
|
||||
class(psb_c_coo_sparse_mat), optional, intent(out) :: u
|
||||
end subroutine psb_c_coo_tril
|
||||
end interface
|
||||
|
||||
!
|
||||
!> Function triu:
|
||||
!! \memberof psb_c_coo_sparse_mat
|
||||
!! \brief Copy the upper triangle, i.e. all entries
|
||||
!! A(I,J) such that DIAG <= J-I
|
||||
!! default value is DIAG=0, i.e. upper triangle from
|
||||
!! the main diagonal up.
|
||||
!! DIAG= 1 means copy the strictly upper triangle
|
||||
!! DIAG=-1 means copy the upper triangle plus the first diagonal
|
||||
!! of the lower triangle.
|
||||
!! Moreover, apply a clipping by copying entries A(I,J) only if
|
||||
!! IMIN<=I<=IMAX
|
||||
!! JMIN<=J<=JMAX
|
||||
!! Optionally copies the lower triangle at the same time
|
||||
!!
|
||||
!! \param u the output (sub)matrix
|
||||
!! \param info return code
|
||||
!! \param diag [0] the last diagonal (J-I) to be considered.
|
||||
!! \param imin [1] the minimum row index we are interested in
|
||||
!! \param imax [a\%get_nrows()] the minimum row index we are interested in
|
||||
!! \param jmin [1] minimum col index
|
||||
!! \param jmax [a\%get_ncols()] maximum col index
|
||||
!! \param iren(:) [none] an array to return renumbered indices (iren(ia(:)),iren(ja(:))
|
||||
!! \param rscale [false] map [min(ia(:)):max(ia(:))] onto [1:max(ia(:))-min(ia(:))+1]
|
||||
!! \param cscale [false] map [min(ja(:)):max(ja(:))] onto [1:max(ja(:))-min(ja(:))+1]
|
||||
!! ( iren cannot be specified with rscale/cscale)
|
||||
!! \param append [false] append to ia,ja
|
||||
!! \param nzin [none] if append, then first new entry should go in entry nzin+1
|
||||
!! \param l [none] copy of the complementary triangle
|
||||
!!
|
||||
!
|
||||
interface
|
||||
subroutine psb_c_coo_triu(a,u,info,diag,imin,imax,&
|
||||
& jmin,jmax,rscale,cscale,l)
|
||||
import
|
||||
class(psb_c_coo_sparse_mat), intent(in) :: a
|
||||
class(psb_c_coo_sparse_mat), intent(out) :: u
|
||||
integer(psb_ipk_),intent(out) :: info
|
||||
integer(psb_ipk_), intent(in), optional :: diag,imin,imax,jmin,jmax
|
||||
logical, intent(in), optional :: rscale,cscale
|
||||
class(psb_c_coo_sparse_mat), optional, intent(out) :: l
|
||||
end subroutine psb_c_coo_triu
|
||||
end interface
|
||||
|
||||
|
||||
!>
|
||||
!! \memberof psb_c_coo_sparse_mat
|
||||
|
||||
@@ -481,7 +481,11 @@ contains
|
||||
implicit none
|
||||
class(psb_c_base_vect_type), intent(inout) :: x
|
||||
|
||||
if (allocated(x%v)) x%v=czero
|
||||
if (allocated(x%v)) then
|
||||
!$omp workshare
|
||||
x%v(:)=czero
|
||||
!$omp end workshare
|
||||
end if
|
||||
call x%set_host()
|
||||
end subroutine c_base_zero
|
||||
|
||||
|
||||
@@ -168,6 +168,8 @@ module psb_d_base_mat_mod
|
||||
procedure, pass(a) :: reallocate_nz => psb_d_coo_reallocate_nz
|
||||
procedure, pass(a) :: allocate_mnnz => psb_d_coo_allocate_mnnz
|
||||
procedure, pass(a) :: ensure_size => psb_d_coo_ensure_size
|
||||
procedure, pass(a) :: tril => psb_d_coo_tril
|
||||
procedure, pass(a) :: triu => psb_d_coo_triu
|
||||
procedure, pass(a) :: cp_to_coo => psb_d_cp_coo_to_coo
|
||||
procedure, pass(a) :: cp_from_coo => psb_d_cp_coo_from_coo
|
||||
procedure, pass(a) :: cp_to_fmt => psb_d_cp_coo_to_fmt
|
||||
@@ -1894,6 +1896,93 @@ module psb_d_base_mat_mod
|
||||
integer(psb_ipk_), intent(in), optional :: idir
|
||||
end subroutine psb_d_fix_coo
|
||||
end interface
|
||||
!
|
||||
!> Function tril:
|
||||
!! \memberof psb_d_coo_sparse_mat
|
||||
!! \brief Copy the lower triangle, i.e. all entries
|
||||
!! A(I,J) such that J-I <= DIAG
|
||||
!! default value is DIAG=0, i.e. lower triangle up to
|
||||
!! the main diagonal.
|
||||
!! DIAG=-1 means copy the strictly lower triangle
|
||||
!! DIAG= 1 means copy the lower triangle plus the first diagonal
|
||||
!! of the upper triangle.
|
||||
!! Moreover, apply a clipping by copying entries A(I,J) only if
|
||||
!! IMIN<=I<=IMAX
|
||||
!! JMIN<=J<=JMAX
|
||||
!!
|
||||
!! \param l the output (sub)matrix
|
||||
!! \param info return code
|
||||
!! \param diag [0] the last diagonal (J-I) to be considered.
|
||||
!! \param imin [1] the minimum row index we are interested in
|
||||
!! \param imax [a\%get_nrows()] the minimum row index we are interested in
|
||||
!! \param jmin [1] minimum col index
|
||||
!! \param jmax [a\%get_ncols()] maximum col index
|
||||
!! \param iren(:) [none] an array to return renumbered indices (iren(ia(:)),iren(ja(:))
|
||||
!! \param rscale [false] map [min(ia(:)):max(ia(:))] onto [1:max(ia(:))-min(ia(:))+1]
|
||||
!! \param cscale [false] map [min(ja(:)):max(ja(:))] onto [1:max(ja(:))-min(ja(:))+1]
|
||||
!! ( iren cannot be specified with rscale/cscale)
|
||||
!! \param append [false] append to ia,ja
|
||||
!! \param nzin [none] if append, then first new entry should go in entry nzin+1
|
||||
!! \param u [none] copy of the complementary triangle
|
||||
!!
|
||||
!
|
||||
interface
|
||||
subroutine psb_d_coo_tril(a,l,info,diag,imin,imax,&
|
||||
& jmin,jmax,rscale,cscale,u)
|
||||
import
|
||||
class(psb_d_coo_sparse_mat), intent(in) :: a
|
||||
class(psb_d_coo_sparse_mat), intent(out) :: l
|
||||
integer(psb_ipk_),intent(out) :: info
|
||||
integer(psb_ipk_), intent(in), optional :: diag,imin,imax,jmin,jmax
|
||||
logical, intent(in), optional :: rscale,cscale
|
||||
class(psb_d_coo_sparse_mat), optional, intent(out) :: u
|
||||
end subroutine psb_d_coo_tril
|
||||
end interface
|
||||
|
||||
!
|
||||
!> Function triu:
|
||||
!! \memberof psb_d_coo_sparse_mat
|
||||
!! \brief Copy the upper triangle, i.e. all entries
|
||||
!! A(I,J) such that DIAG <= J-I
|
||||
!! default value is DIAG=0, i.e. upper triangle from
|
||||
!! the main diagonal up.
|
||||
!! DIAG= 1 means copy the strictly upper triangle
|
||||
!! DIAG=-1 means copy the upper triangle plus the first diagonal
|
||||
!! of the lower triangle.
|
||||
!! Moreover, apply a clipping by copying entries A(I,J) only if
|
||||
!! IMIN<=I<=IMAX
|
||||
!! JMIN<=J<=JMAX
|
||||
!! Optionally copies the lower triangle at the same time
|
||||
!!
|
||||
!! \param u the output (sub)matrix
|
||||
!! \param info return code
|
||||
!! \param diag [0] the last diagonal (J-I) to be considered.
|
||||
!! \param imin [1] the minimum row index we are interested in
|
||||
!! \param imax [a\%get_nrows()] the minimum row index we are interested in
|
||||
!! \param jmin [1] minimum col index
|
||||
!! \param jmax [a\%get_ncols()] maximum col index
|
||||
!! \param iren(:) [none] an array to return renumbered indices (iren(ia(:)),iren(ja(:))
|
||||
!! \param rscale [false] map [min(ia(:)):max(ia(:))] onto [1:max(ia(:))-min(ia(:))+1]
|
||||
!! \param cscale [false] map [min(ja(:)):max(ja(:))] onto [1:max(ja(:))-min(ja(:))+1]
|
||||
!! ( iren cannot be specified with rscale/cscale)
|
||||
!! \param append [false] append to ia,ja
|
||||
!! \param nzin [none] if append, then first new entry should go in entry nzin+1
|
||||
!! \param l [none] copy of the complementary triangle
|
||||
!!
|
||||
!
|
||||
interface
|
||||
subroutine psb_d_coo_triu(a,u,info,diag,imin,imax,&
|
||||
& jmin,jmax,rscale,cscale,l)
|
||||
import
|
||||
class(psb_d_coo_sparse_mat), intent(in) :: a
|
||||
class(psb_d_coo_sparse_mat), intent(out) :: u
|
||||
integer(psb_ipk_),intent(out) :: info
|
||||
integer(psb_ipk_), intent(in), optional :: diag,imin,imax,jmin,jmax
|
||||
logical, intent(in), optional :: rscale,cscale
|
||||
class(psb_d_coo_sparse_mat), optional, intent(out) :: l
|
||||
end subroutine psb_d_coo_triu
|
||||
end interface
|
||||
|
||||
|
||||
!>
|
||||
!! \memberof psb_d_coo_sparse_mat
|
||||
|
||||
@@ -488,7 +488,11 @@ contains
|
||||
implicit none
|
||||
class(psb_d_base_vect_type), intent(inout) :: x
|
||||
|
||||
if (allocated(x%v)) x%v=dzero
|
||||
if (allocated(x%v)) then
|
||||
!$omp workshare
|
||||
x%v(:)=dzero
|
||||
!$omp end workshare
|
||||
end if
|
||||
call x%set_host()
|
||||
end subroutine d_base_zero
|
||||
|
||||
|
||||
@@ -417,7 +417,11 @@ contains
|
||||
implicit none
|
||||
class(psb_i_base_vect_type), intent(inout) :: x
|
||||
|
||||
if (allocated(x%v)) x%v=izero
|
||||
if (allocated(x%v)) then
|
||||
!$omp workshare
|
||||
x%v(:)=izero
|
||||
!$omp end workshare
|
||||
end if
|
||||
call x%set_host()
|
||||
end subroutine i_base_zero
|
||||
|
||||
|
||||
@@ -418,7 +418,11 @@ contains
|
||||
implicit none
|
||||
class(psb_l_base_vect_type), intent(inout) :: x
|
||||
|
||||
if (allocated(x%v)) x%v=lzero
|
||||
if (allocated(x%v)) then
|
||||
!$omp workshare
|
||||
x%v(:)=lzero
|
||||
!$omp end workshare
|
||||
end if
|
||||
call x%set_host()
|
||||
end subroutine l_base_zero
|
||||
|
||||
|
||||
@@ -168,6 +168,8 @@ module psb_s_base_mat_mod
|
||||
procedure, pass(a) :: reallocate_nz => psb_s_coo_reallocate_nz
|
||||
procedure, pass(a) :: allocate_mnnz => psb_s_coo_allocate_mnnz
|
||||
procedure, pass(a) :: ensure_size => psb_s_coo_ensure_size
|
||||
procedure, pass(a) :: tril => psb_s_coo_tril
|
||||
procedure, pass(a) :: triu => psb_s_coo_triu
|
||||
procedure, pass(a) :: cp_to_coo => psb_s_cp_coo_to_coo
|
||||
procedure, pass(a) :: cp_from_coo => psb_s_cp_coo_from_coo
|
||||
procedure, pass(a) :: cp_to_fmt => psb_s_cp_coo_to_fmt
|
||||
@@ -1894,6 +1896,93 @@ module psb_s_base_mat_mod
|
||||
integer(psb_ipk_), intent(in), optional :: idir
|
||||
end subroutine psb_s_fix_coo
|
||||
end interface
|
||||
!
|
||||
!> Function tril:
|
||||
!! \memberof psb_s_coo_sparse_mat
|
||||
!! \brief Copy the lower triangle, i.e. all entries
|
||||
!! A(I,J) such that J-I <= DIAG
|
||||
!! default value is DIAG=0, i.e. lower triangle up to
|
||||
!! the main diagonal.
|
||||
!! DIAG=-1 means copy the strictly lower triangle
|
||||
!! DIAG= 1 means copy the lower triangle plus the first diagonal
|
||||
!! of the upper triangle.
|
||||
!! Moreover, apply a clipping by copying entries A(I,J) only if
|
||||
!! IMIN<=I<=IMAX
|
||||
!! JMIN<=J<=JMAX
|
||||
!!
|
||||
!! \param l the output (sub)matrix
|
||||
!! \param info return code
|
||||
!! \param diag [0] the last diagonal (J-I) to be considered.
|
||||
!! \param imin [1] the minimum row index we are interested in
|
||||
!! \param imax [a\%get_nrows()] the minimum row index we are interested in
|
||||
!! \param jmin [1] minimum col index
|
||||
!! \param jmax [a\%get_ncols()] maximum col index
|
||||
!! \param iren(:) [none] an array to return renumbered indices (iren(ia(:)),iren(ja(:))
|
||||
!! \param rscale [false] map [min(ia(:)):max(ia(:))] onto [1:max(ia(:))-min(ia(:))+1]
|
||||
!! \param cscale [false] map [min(ja(:)):max(ja(:))] onto [1:max(ja(:))-min(ja(:))+1]
|
||||
!! ( iren cannot be specified with rscale/cscale)
|
||||
!! \param append [false] append to ia,ja
|
||||
!! \param nzin [none] if append, then first new entry should go in entry nzin+1
|
||||
!! \param u [none] copy of the complementary triangle
|
||||
!!
|
||||
!
|
||||
interface
|
||||
subroutine psb_s_coo_tril(a,l,info,diag,imin,imax,&
|
||||
& jmin,jmax,rscale,cscale,u)
|
||||
import
|
||||
class(psb_s_coo_sparse_mat), intent(in) :: a
|
||||
class(psb_s_coo_sparse_mat), intent(out) :: l
|
||||
integer(psb_ipk_),intent(out) :: info
|
||||
integer(psb_ipk_), intent(in), optional :: diag,imin,imax,jmin,jmax
|
||||
logical, intent(in), optional :: rscale,cscale
|
||||
class(psb_s_coo_sparse_mat), optional, intent(out) :: u
|
||||
end subroutine psb_s_coo_tril
|
||||
end interface
|
||||
|
||||
!
|
||||
!> Function triu:
|
||||
!! \memberof psb_s_coo_sparse_mat
|
||||
!! \brief Copy the upper triangle, i.e. all entries
|
||||
!! A(I,J) such that DIAG <= J-I
|
||||
!! default value is DIAG=0, i.e. upper triangle from
|
||||
!! the main diagonal up.
|
||||
!! DIAG= 1 means copy the strictly upper triangle
|
||||
!! DIAG=-1 means copy the upper triangle plus the first diagonal
|
||||
!! of the lower triangle.
|
||||
!! Moreover, apply a clipping by copying entries A(I,J) only if
|
||||
!! IMIN<=I<=IMAX
|
||||
!! JMIN<=J<=JMAX
|
||||
!! Optionally copies the lower triangle at the same time
|
||||
!!
|
||||
!! \param u the output (sub)matrix
|
||||
!! \param info return code
|
||||
!! \param diag [0] the last diagonal (J-I) to be considered.
|
||||
!! \param imin [1] the minimum row index we are interested in
|
||||
!! \param imax [a\%get_nrows()] the minimum row index we are interested in
|
||||
!! \param jmin [1] minimum col index
|
||||
!! \param jmax [a\%get_ncols()] maximum col index
|
||||
!! \param iren(:) [none] an array to return renumbered indices (iren(ia(:)),iren(ja(:))
|
||||
!! \param rscale [false] map [min(ia(:)):max(ia(:))] onto [1:max(ia(:))-min(ia(:))+1]
|
||||
!! \param cscale [false] map [min(ja(:)):max(ja(:))] onto [1:max(ja(:))-min(ja(:))+1]
|
||||
!! ( iren cannot be specified with rscale/cscale)
|
||||
!! \param append [false] append to ia,ja
|
||||
!! \param nzin [none] if append, then first new entry should go in entry nzin+1
|
||||
!! \param l [none] copy of the complementary triangle
|
||||
!!
|
||||
!
|
||||
interface
|
||||
subroutine psb_s_coo_triu(a,u,info,diag,imin,imax,&
|
||||
& jmin,jmax,rscale,cscale,l)
|
||||
import
|
||||
class(psb_s_coo_sparse_mat), intent(in) :: a
|
||||
class(psb_s_coo_sparse_mat), intent(out) :: u
|
||||
integer(psb_ipk_),intent(out) :: info
|
||||
integer(psb_ipk_), intent(in), optional :: diag,imin,imax,jmin,jmax
|
||||
logical, intent(in), optional :: rscale,cscale
|
||||
class(psb_s_coo_sparse_mat), optional, intent(out) :: l
|
||||
end subroutine psb_s_coo_triu
|
||||
end interface
|
||||
|
||||
|
||||
!>
|
||||
!! \memberof psb_s_coo_sparse_mat
|
||||
|
||||
@@ -488,7 +488,11 @@ contains
|
||||
implicit none
|
||||
class(psb_s_base_vect_type), intent(inout) :: x
|
||||
|
||||
if (allocated(x%v)) x%v=szero
|
||||
if (allocated(x%v)) then
|
||||
!$omp workshare
|
||||
x%v(:)=szero
|
||||
!$omp end workshare
|
||||
end if
|
||||
call x%set_host()
|
||||
end subroutine s_base_zero
|
||||
|
||||
|
||||
@@ -168,6 +168,8 @@ module psb_z_base_mat_mod
|
||||
procedure, pass(a) :: reallocate_nz => psb_z_coo_reallocate_nz
|
||||
procedure, pass(a) :: allocate_mnnz => psb_z_coo_allocate_mnnz
|
||||
procedure, pass(a) :: ensure_size => psb_z_coo_ensure_size
|
||||
procedure, pass(a) :: tril => psb_z_coo_tril
|
||||
procedure, pass(a) :: triu => psb_z_coo_triu
|
||||
procedure, pass(a) :: cp_to_coo => psb_z_cp_coo_to_coo
|
||||
procedure, pass(a) :: cp_from_coo => psb_z_cp_coo_from_coo
|
||||
procedure, pass(a) :: cp_to_fmt => psb_z_cp_coo_to_fmt
|
||||
@@ -1894,6 +1896,93 @@ module psb_z_base_mat_mod
|
||||
integer(psb_ipk_), intent(in), optional :: idir
|
||||
end subroutine psb_z_fix_coo
|
||||
end interface
|
||||
!
|
||||
!> Function tril:
|
||||
!! \memberof psb_z_coo_sparse_mat
|
||||
!! \brief Copy the lower triangle, i.e. all entries
|
||||
!! A(I,J) such that J-I <= DIAG
|
||||
!! default value is DIAG=0, i.e. lower triangle up to
|
||||
!! the main diagonal.
|
||||
!! DIAG=-1 means copy the strictly lower triangle
|
||||
!! DIAG= 1 means copy the lower triangle plus the first diagonal
|
||||
!! of the upper triangle.
|
||||
!! Moreover, apply a clipping by copying entries A(I,J) only if
|
||||
!! IMIN<=I<=IMAX
|
||||
!! JMIN<=J<=JMAX
|
||||
!!
|
||||
!! \param l the output (sub)matrix
|
||||
!! \param info return code
|
||||
!! \param diag [0] the last diagonal (J-I) to be considered.
|
||||
!! \param imin [1] the minimum row index we are interested in
|
||||
!! \param imax [a\%get_nrows()] the minimum row index we are interested in
|
||||
!! \param jmin [1] minimum col index
|
||||
!! \param jmax [a\%get_ncols()] maximum col index
|
||||
!! \param iren(:) [none] an array to return renumbered indices (iren(ia(:)),iren(ja(:))
|
||||
!! \param rscale [false] map [min(ia(:)):max(ia(:))] onto [1:max(ia(:))-min(ia(:))+1]
|
||||
!! \param cscale [false] map [min(ja(:)):max(ja(:))] onto [1:max(ja(:))-min(ja(:))+1]
|
||||
!! ( iren cannot be specified with rscale/cscale)
|
||||
!! \param append [false] append to ia,ja
|
||||
!! \param nzin [none] if append, then first new entry should go in entry nzin+1
|
||||
!! \param u [none] copy of the complementary triangle
|
||||
!!
|
||||
!
|
||||
interface
|
||||
subroutine psb_z_coo_tril(a,l,info,diag,imin,imax,&
|
||||
& jmin,jmax,rscale,cscale,u)
|
||||
import
|
||||
class(psb_z_coo_sparse_mat), intent(in) :: a
|
||||
class(psb_z_coo_sparse_mat), intent(out) :: l
|
||||
integer(psb_ipk_),intent(out) :: info
|
||||
integer(psb_ipk_), intent(in), optional :: diag,imin,imax,jmin,jmax
|
||||
logical, intent(in), optional :: rscale,cscale
|
||||
class(psb_z_coo_sparse_mat), optional, intent(out) :: u
|
||||
end subroutine psb_z_coo_tril
|
||||
end interface
|
||||
|
||||
!
|
||||
!> Function triu:
|
||||
!! \memberof psb_z_coo_sparse_mat
|
||||
!! \brief Copy the upper triangle, i.e. all entries
|
||||
!! A(I,J) such that DIAG <= J-I
|
||||
!! default value is DIAG=0, i.e. upper triangle from
|
||||
!! the main diagonal up.
|
||||
!! DIAG= 1 means copy the strictly upper triangle
|
||||
!! DIAG=-1 means copy the upper triangle plus the first diagonal
|
||||
!! of the lower triangle.
|
||||
!! Moreover, apply a clipping by copying entries A(I,J) only if
|
||||
!! IMIN<=I<=IMAX
|
||||
!! JMIN<=J<=JMAX
|
||||
!! Optionally copies the lower triangle at the same time
|
||||
!!
|
||||
!! \param u the output (sub)matrix
|
||||
!! \param info return code
|
||||
!! \param diag [0] the last diagonal (J-I) to be considered.
|
||||
!! \param imin [1] the minimum row index we are interested in
|
||||
!! \param imax [a\%get_nrows()] the minimum row index we are interested in
|
||||
!! \param jmin [1] minimum col index
|
||||
!! \param jmax [a\%get_ncols()] maximum col index
|
||||
!! \param iren(:) [none] an array to return renumbered indices (iren(ia(:)),iren(ja(:))
|
||||
!! \param rscale [false] map [min(ia(:)):max(ia(:))] onto [1:max(ia(:))-min(ia(:))+1]
|
||||
!! \param cscale [false] map [min(ja(:)):max(ja(:))] onto [1:max(ja(:))-min(ja(:))+1]
|
||||
!! ( iren cannot be specified with rscale/cscale)
|
||||
!! \param append [false] append to ia,ja
|
||||
!! \param nzin [none] if append, then first new entry should go in entry nzin+1
|
||||
!! \param l [none] copy of the complementary triangle
|
||||
!!
|
||||
!
|
||||
interface
|
||||
subroutine psb_z_coo_triu(a,u,info,diag,imin,imax,&
|
||||
& jmin,jmax,rscale,cscale,l)
|
||||
import
|
||||
class(psb_z_coo_sparse_mat), intent(in) :: a
|
||||
class(psb_z_coo_sparse_mat), intent(out) :: u
|
||||
integer(psb_ipk_),intent(out) :: info
|
||||
integer(psb_ipk_), intent(in), optional :: diag,imin,imax,jmin,jmax
|
||||
logical, intent(in), optional :: rscale,cscale
|
||||
class(psb_z_coo_sparse_mat), optional, intent(out) :: l
|
||||
end subroutine psb_z_coo_triu
|
||||
end interface
|
||||
|
||||
|
||||
!>
|
||||
!! \memberof psb_z_coo_sparse_mat
|
||||
|
||||
@@ -481,7 +481,11 @@ contains
|
||||
implicit none
|
||||
class(psb_z_base_vect_type), intent(inout) :: x
|
||||
|
||||
if (allocated(x%v)) x%v=zzero
|
||||
if (allocated(x%v)) then
|
||||
!$omp workshare
|
||||
x%v(:)=zzero
|
||||
!$omp end workshare
|
||||
end if
|
||||
call x%set_host()
|
||||
end subroutine z_base_zero
|
||||
|
||||
|
||||
Reference in New Issue
Block a user