diff --git a/base/internals/psi_cswapdata.F90 b/base/internals/psi_cswapdata.F90 index f9798abf..c29bf016 100644 --- a/base/internals/psi_cswapdata.F90 +++ b/base/internals/psi_cswapdata.F90 @@ -1495,7 +1495,7 @@ subroutine psi_cswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & goto 9999 endif - n=1 + n = y%get_ncols() swap_mpi = iand(flag,psb_swap_mpi_) /= 0 swap_sync = iand(flag,psb_swap_sync_) /= 0 @@ -1525,20 +1525,22 @@ subroutine psi_cswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & call psb_realloc(totxch,prcid,info) ! First I post all the non blocking receives pnti = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - - rcv_pt = 1+pnti+psb_n_elem_recv_ call psb_get_rank(prcid(i),ictxt,proc_to_comm) if ((nerv>0).and.(proc_to_comm /= me)) then if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt p2ptag = psb_complex_swap_tag - call mpi_irecv(y%combuf(rcv_pt),nerv,& + call mpi_irecv(y%combuf(rcv_pt),n*nerv,& & psb_mpi_c_spk_,prcid(i),& & p2ptag, icomm,y%comid(i,2),iret) end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do if (debug) write(*,*) me,' Gather ' @@ -1546,13 +1548,15 @@ subroutine psi_cswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & ! Then gather for sending. ! pnti = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 do i=1, totxch nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - idx_pt = snd_pt - call y%gth(idx_pt,nesd,idx) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call y%gth(idx_pt,snd_pt,nesd,idx) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do @@ -1567,18 +1571,16 @@ subroutine psi_cswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & ! pnti = 1 - snd_pt = 1 + snd_pt = totrcv_+1 rcv_pt = 1 p2ptag = psb_complex_swap_tag do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ if ((nesd>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(snd_pt),nesd,& + call mpi_isend(y%combuf(snd_pt),n*nesd,& & psb_mpi_c_spk_,prcid(i),& & p2ptag,icomm,y%comid(i,1),iret) end if @@ -1589,7 +1591,8 @@ subroutine psi_cswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & call psb_errpush(info,name,i_err=ierr) goto 9999 end if - + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do end if @@ -1609,14 +1612,13 @@ subroutine psi_cswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & if (debug) write(*,*) me,' wait' pnti = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 p2ptag = psb_complex_swap_tag do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - if (proc_to_comm /= me)then if (nesd>0) then call mpi_wait(y%comid(i,1),p2pstat,iret) @@ -1642,26 +1644,29 @@ subroutine psi_cswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & & 'Fatal error in swapdata: mismatch on self send',& & nerv,nesd end if - y%combuf(rcv_pt:rcv_pt+nerv-1) = y%combuf(snd_pt:snd_pt+nesd-1) + y%combuf(rcv_pt:rcv_pt+n*nerv-1) = y%combuf(snd_pt:snd_pt+n*nesd-1) end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 + end do if (debug) write(*,*) me,' scatter' pnti = 1 - snd_pt = 1 + snd_pt = totrcv_+1 rcv_pt = 1 do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) idx_pt = 1+pnti+psb_n_elem_recv_ - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(rcv_pt:rcv_pt+nerv-1) - call y%sct(rcv_pt,nerv,idx,beta) + & y%combuf(rcv_pt:rcv_pt+n*nerv-1) + call y%sct(idx_pt,rcv_pt,nerv,idx,beta) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do diff --git a/base/internals/psi_cswaptran.F90 b/base/internals/psi_cswaptran.F90 index 61849cae..b7bf1b98 100644 --- a/base/internals/psi_cswaptran.F90 +++ b/base/internals/psi_cswaptran.F90 @@ -1525,7 +1525,8 @@ subroutine psi_ctran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& goto 9999 endif - n=1 + n = y%get_ncols() + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 swap_sync = iand(flag,psb_swap_sync_) /= 0 swap_send = iand(flag,psb_swap_send_) /= 0 @@ -1555,21 +1556,22 @@ subroutine psi_ctran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& call psb_realloc(totxch,prcid,info) ! First I post all the non blocking receives pnti = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 p2ptag = psb_complex_swap_tag do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ call psb_get_rank(prcid(i),ictxt,proc_to_comm) if ((nesd>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt - call mpi_irecv(y%combuf(snd_pt),nesd,& + if (debug) write(*,*) me,'Posting receive from',prcid(i),snd_pt + call mpi_irecv(y%combuf(snd_pt),n*nesd,& & psb_mpi_c_spk_,prcid(i),& & p2ptag, icomm,y%comid(i,2),iret) end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do @@ -1578,16 +1580,15 @@ subroutine psi_ctran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& ! Then gather for sending. ! pnti = 1 - snd_pt = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 do i=1, totxch nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - idx_pt = rcv_pt - call y%gth(idx_pt,nerv,idx) - + idx_pt = 1+pnti+psb_n_elem_recv_ + call y%gth(idx_pt,rcv_pt,nerv,idx) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do @@ -1603,18 +1604,17 @@ subroutine psi_ctran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& ! pnti = 1 - snd_pt = 1 + snd_pt = totrcv_+1 rcv_pt = 1 p2ptag = psb_complex_swap_tag do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ + idx_pt = 1+pnti+psb_n_elem_recv_ if ((nerv>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(rcv_pt),nerv,& + call mpi_isend(y%combuf(rcv_pt),n*nerv,& & psb_mpi_c_spk_,prcid(i),& & p2ptag,icomm,y%comid(i,1),iret) end if @@ -1625,7 +1625,8 @@ subroutine psi_ctran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& call psb_errpush(info,name,i_err=ierr) goto 9999 end if - + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do end if @@ -1645,14 +1646,13 @@ subroutine psi_ctran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& if (debug) write(*,*) me,' wait' pnti = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 p2ptag = psb_complex_swap_tag do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - if (proc_to_comm /= me)then if (nerv>0) then call mpi_wait(y%comid(i,1),p2pstat,iret) @@ -1678,26 +1678,30 @@ subroutine psi_ctran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& & 'Fatal error in swapdata: mismatch on self send',& & nerv,nesd end if - y%combuf(snd_pt:snd_pt+nesd-1) = y%combuf(rcv_pt:rcv_pt+nerv-1) + y%combuf(snd_pt:snd_pt+n*nesd-1) = y%combuf(rcv_pt:rcv_pt+n*nerv-1) end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do if (debug) write(*,*) me,' scatter' + + pnti = 1 - snd_pt = 1 + snd_pt = totrcv_+1 rcv_pt = 1 do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ + idx_pt = 1+pnti+nerv+psb_n_elem_send_ if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(snd_pt:snd_pt+nesd-1) - call y%sct(snd_pt,nesd,idx,beta) + & y%combuf(snd_pt:snd_pt+n*nesd-1) + call y%sct(idx_pt,snd_pt,nesd,idx,beta) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do diff --git a/base/internals/psi_dswapdata.F90 b/base/internals/psi_dswapdata.F90 index d05253ea..d09fba45 100644 --- a/base/internals/psi_dswapdata.F90 +++ b/base/internals/psi_dswapdata.F90 @@ -1495,7 +1495,7 @@ subroutine psi_dswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & goto 9999 endif - n=1 + n = y%get_ncols() swap_mpi = iand(flag,psb_swap_mpi_) /= 0 swap_sync = iand(flag,psb_swap_sync_) /= 0 @@ -1525,20 +1525,22 @@ subroutine psi_dswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & call psb_realloc(totxch,prcid,info) ! First I post all the non blocking receives pnti = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - - rcv_pt = 1+pnti+psb_n_elem_recv_ call psb_get_rank(prcid(i),ictxt,proc_to_comm) if ((nerv>0).and.(proc_to_comm /= me)) then if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt p2ptag = psb_double_swap_tag - call mpi_irecv(y%combuf(rcv_pt),nerv,& + call mpi_irecv(y%combuf(rcv_pt),n*nerv,& & psb_mpi_r_dpk_,prcid(i),& & p2ptag, icomm,y%comid(i,2),iret) end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do if (debug) write(*,*) me,' Gather ' @@ -1546,13 +1548,15 @@ subroutine psi_dswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & ! Then gather for sending. ! pnti = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 do i=1, totxch nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - idx_pt = snd_pt - call y%gth(idx_pt,nesd,idx) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call y%gth(idx_pt,snd_pt,nesd,idx) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do @@ -1567,18 +1571,16 @@ subroutine psi_dswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & ! pnti = 1 - snd_pt = 1 + snd_pt = totrcv_+1 rcv_pt = 1 p2ptag = psb_double_swap_tag do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ if ((nesd>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(snd_pt),nesd,& + call mpi_isend(y%combuf(snd_pt),n*nesd,& & psb_mpi_r_dpk_,prcid(i),& & p2ptag,icomm,y%comid(i,1),iret) end if @@ -1589,7 +1591,8 @@ subroutine psi_dswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & call psb_errpush(info,name,i_err=ierr) goto 9999 end if - + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do end if @@ -1609,14 +1612,13 @@ subroutine psi_dswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & if (debug) write(*,*) me,' wait' pnti = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 p2ptag = psb_double_swap_tag do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - if (proc_to_comm /= me)then if (nesd>0) then call mpi_wait(y%comid(i,1),p2pstat,iret) @@ -1642,26 +1644,29 @@ subroutine psi_dswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & & 'Fatal error in swapdata: mismatch on self send',& & nerv,nesd end if - y%combuf(rcv_pt:rcv_pt+nerv-1) = y%combuf(snd_pt:snd_pt+nesd-1) + y%combuf(rcv_pt:rcv_pt+n*nerv-1) = y%combuf(snd_pt:snd_pt+n*nesd-1) end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 + end do if (debug) write(*,*) me,' scatter' pnti = 1 - snd_pt = 1 + snd_pt = totrcv_+1 rcv_pt = 1 do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) idx_pt = 1+pnti+psb_n_elem_recv_ - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(rcv_pt:rcv_pt+nerv-1) - call y%sct(rcv_pt,nerv,idx,beta) + & y%combuf(rcv_pt:rcv_pt+n*nerv-1) + call y%sct(idx_pt,rcv_pt,nerv,idx,beta) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do diff --git a/base/internals/psi_dswaptran.F90 b/base/internals/psi_dswaptran.F90 index 3872d6bc..3715449b 100644 --- a/base/internals/psi_dswaptran.F90 +++ b/base/internals/psi_dswaptran.F90 @@ -1525,7 +1525,8 @@ subroutine psi_dtran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& goto 9999 endif - n=1 + n = y%get_ncols() + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 swap_sync = iand(flag,psb_swap_sync_) /= 0 swap_send = iand(flag,psb_swap_send_) /= 0 @@ -1555,21 +1556,22 @@ subroutine psi_dtran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& call psb_realloc(totxch,prcid,info) ! First I post all the non blocking receives pnti = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 p2ptag = psb_double_swap_tag do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ call psb_get_rank(prcid(i),ictxt,proc_to_comm) if ((nesd>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt - call mpi_irecv(y%combuf(snd_pt),nesd,& + if (debug) write(*,*) me,'Posting receive from',prcid(i),snd_pt + call mpi_irecv(y%combuf(snd_pt),n*nesd,& & psb_mpi_r_dpk_,prcid(i),& & p2ptag, icomm,y%comid(i,2),iret) end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do @@ -1578,16 +1580,15 @@ subroutine psi_dtran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& ! Then gather for sending. ! pnti = 1 - snd_pt = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 do i=1, totxch nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - idx_pt = rcv_pt - call y%gth(idx_pt,nerv,idx) - + idx_pt = 1+pnti+psb_n_elem_recv_ + call y%gth(idx_pt,rcv_pt,nerv,idx) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do @@ -1603,18 +1604,17 @@ subroutine psi_dtran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& ! pnti = 1 - snd_pt = 1 + snd_pt = totrcv_+1 rcv_pt = 1 p2ptag = psb_double_swap_tag do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ + idx_pt = 1+pnti+psb_n_elem_recv_ if ((nerv>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(rcv_pt),nerv,& + call mpi_isend(y%combuf(rcv_pt),n*nerv,& & psb_mpi_r_dpk_,prcid(i),& & p2ptag,icomm,y%comid(i,1),iret) end if @@ -1625,7 +1625,8 @@ subroutine psi_dtran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& call psb_errpush(info,name,i_err=ierr) goto 9999 end if - + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do end if @@ -1645,14 +1646,13 @@ subroutine psi_dtran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& if (debug) write(*,*) me,' wait' pnti = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 p2ptag = psb_double_swap_tag do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - if (proc_to_comm /= me)then if (nerv>0) then call mpi_wait(y%comid(i,1),p2pstat,iret) @@ -1678,26 +1678,30 @@ subroutine psi_dtran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& & 'Fatal error in swapdata: mismatch on self send',& & nerv,nesd end if - y%combuf(snd_pt:snd_pt+nesd-1) = y%combuf(rcv_pt:rcv_pt+nerv-1) + y%combuf(snd_pt:snd_pt+n*nesd-1) = y%combuf(rcv_pt:rcv_pt+n*nerv-1) end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do if (debug) write(*,*) me,' scatter' + + pnti = 1 - snd_pt = 1 + snd_pt = totrcv_+1 rcv_pt = 1 do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ + idx_pt = 1+pnti+nerv+psb_n_elem_send_ if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(snd_pt:snd_pt+nesd-1) - call y%sct(snd_pt,nesd,idx,beta) + & y%combuf(snd_pt:snd_pt+n*nesd-1) + call y%sct(idx_pt,snd_pt,nesd,idx,beta) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do diff --git a/base/internals/psi_iswapdata.F90 b/base/internals/psi_iswapdata.F90 index f7bb6ed7..31afc78b 100644 --- a/base/internals/psi_iswapdata.F90 +++ b/base/internals/psi_iswapdata.F90 @@ -1495,7 +1495,7 @@ subroutine psi_iswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & goto 9999 endif - n=1 + n = y%get_ncols() swap_mpi = iand(flag,psb_swap_mpi_) /= 0 swap_sync = iand(flag,psb_swap_sync_) /= 0 @@ -1525,20 +1525,22 @@ subroutine psi_iswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & call psb_realloc(totxch,prcid,info) ! First I post all the non blocking receives pnti = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - - rcv_pt = 1+pnti+psb_n_elem_recv_ call psb_get_rank(prcid(i),ictxt,proc_to_comm) if ((nerv>0).and.(proc_to_comm /= me)) then if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt p2ptag = psb_int_swap_tag - call mpi_irecv(y%combuf(rcv_pt),nerv,& + call mpi_irecv(y%combuf(rcv_pt),n*nerv,& & psb_mpi_ipk_integer,prcid(i),& & p2ptag, icomm,y%comid(i,2),iret) end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do if (debug) write(*,*) me,' Gather ' @@ -1546,13 +1548,15 @@ subroutine psi_iswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & ! Then gather for sending. ! pnti = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 do i=1, totxch nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - idx_pt = snd_pt - call y%gth(idx_pt,nesd,idx) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call y%gth(idx_pt,snd_pt,nesd,idx) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do @@ -1567,18 +1571,16 @@ subroutine psi_iswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & ! pnti = 1 - snd_pt = 1 + snd_pt = totrcv_+1 rcv_pt = 1 p2ptag = psb_int_swap_tag do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ if ((nesd>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(snd_pt),nesd,& + call mpi_isend(y%combuf(snd_pt),n*nesd,& & psb_mpi_ipk_integer,prcid(i),& & p2ptag,icomm,y%comid(i,1),iret) end if @@ -1589,7 +1591,8 @@ subroutine psi_iswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & call psb_errpush(info,name,i_err=ierr) goto 9999 end if - + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do end if @@ -1609,14 +1612,13 @@ subroutine psi_iswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & if (debug) write(*,*) me,' wait' pnti = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 p2ptag = psb_int_swap_tag do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - if (proc_to_comm /= me)then if (nesd>0) then call mpi_wait(y%comid(i,1),p2pstat,iret) @@ -1642,26 +1644,29 @@ subroutine psi_iswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & & 'Fatal error in swapdata: mismatch on self send',& & nerv,nesd end if - y%combuf(rcv_pt:rcv_pt+nerv-1) = y%combuf(snd_pt:snd_pt+nesd-1) + y%combuf(rcv_pt:rcv_pt+n*nerv-1) = y%combuf(snd_pt:snd_pt+n*nesd-1) end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 + end do if (debug) write(*,*) me,' scatter' pnti = 1 - snd_pt = 1 + snd_pt = totrcv_+1 rcv_pt = 1 do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) idx_pt = 1+pnti+psb_n_elem_recv_ - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(rcv_pt:rcv_pt+nerv-1) - call y%sct(rcv_pt,nerv,idx,beta) + & y%combuf(rcv_pt:rcv_pt+n*nerv-1) + call y%sct(idx_pt,rcv_pt,nerv,idx,beta) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do diff --git a/base/internals/psi_iswaptran.F90 b/base/internals/psi_iswaptran.F90 index 205ad54e..6c9907bb 100644 --- a/base/internals/psi_iswaptran.F90 +++ b/base/internals/psi_iswaptran.F90 @@ -1525,7 +1525,8 @@ subroutine psi_itran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& goto 9999 endif - n=1 + n = y%get_ncols() + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 swap_sync = iand(flag,psb_swap_sync_) /= 0 swap_send = iand(flag,psb_swap_send_) /= 0 @@ -1555,21 +1556,22 @@ subroutine psi_itran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& call psb_realloc(totxch,prcid,info) ! First I post all the non blocking receives pnti = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 p2ptag = psb_int_swap_tag do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ call psb_get_rank(prcid(i),ictxt,proc_to_comm) if ((nesd>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt - call mpi_irecv(y%combuf(snd_pt),nesd,& + if (debug) write(*,*) me,'Posting receive from',prcid(i),snd_pt + call mpi_irecv(y%combuf(snd_pt),n*nesd,& & psb_mpi_ipk_integer,prcid(i),& & p2ptag, icomm,y%comid(i,2),iret) end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do @@ -1578,16 +1580,15 @@ subroutine psi_itran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& ! Then gather for sending. ! pnti = 1 - snd_pt = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 do i=1, totxch nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - idx_pt = rcv_pt - call y%gth(idx_pt,nerv,idx) - + idx_pt = 1+pnti+psb_n_elem_recv_ + call y%gth(idx_pt,rcv_pt,nerv,idx) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do @@ -1603,18 +1604,17 @@ subroutine psi_itran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& ! pnti = 1 - snd_pt = 1 + snd_pt = totrcv_+1 rcv_pt = 1 p2ptag = psb_int_swap_tag do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ + idx_pt = 1+pnti+psb_n_elem_recv_ if ((nerv>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(rcv_pt),nerv,& + call mpi_isend(y%combuf(rcv_pt),n*nerv,& & psb_mpi_ipk_integer,prcid(i),& & p2ptag,icomm,y%comid(i,1),iret) end if @@ -1625,7 +1625,8 @@ subroutine psi_itran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& call psb_errpush(info,name,i_err=ierr) goto 9999 end if - + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do end if @@ -1645,14 +1646,13 @@ subroutine psi_itran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& if (debug) write(*,*) me,' wait' pnti = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 p2ptag = psb_int_swap_tag do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - if (proc_to_comm /= me)then if (nerv>0) then call mpi_wait(y%comid(i,1),p2pstat,iret) @@ -1678,26 +1678,30 @@ subroutine psi_itran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& & 'Fatal error in swapdata: mismatch on self send',& & nerv,nesd end if - y%combuf(snd_pt:snd_pt+nesd-1) = y%combuf(rcv_pt:rcv_pt+nerv-1) + y%combuf(snd_pt:snd_pt+n*nesd-1) = y%combuf(rcv_pt:rcv_pt+n*nerv-1) end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do if (debug) write(*,*) me,' scatter' + + pnti = 1 - snd_pt = 1 + snd_pt = totrcv_+1 rcv_pt = 1 do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ + idx_pt = 1+pnti+nerv+psb_n_elem_send_ if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(snd_pt:snd_pt+nesd-1) - call y%sct(snd_pt,nesd,idx,beta) + & y%combuf(snd_pt:snd_pt+n*nesd-1) + call y%sct(idx_pt,snd_pt,nesd,idx,beta) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do diff --git a/base/internals/psi_sswapdata.F90 b/base/internals/psi_sswapdata.F90 index a90557b1..8402c0ad 100644 --- a/base/internals/psi_sswapdata.F90 +++ b/base/internals/psi_sswapdata.F90 @@ -1495,7 +1495,7 @@ subroutine psi_sswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & goto 9999 endif - n=1 + n = y%get_ncols() swap_mpi = iand(flag,psb_swap_mpi_) /= 0 swap_sync = iand(flag,psb_swap_sync_) /= 0 @@ -1525,20 +1525,22 @@ subroutine psi_sswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & call psb_realloc(totxch,prcid,info) ! First I post all the non blocking receives pnti = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - - rcv_pt = 1+pnti+psb_n_elem_recv_ call psb_get_rank(prcid(i),ictxt,proc_to_comm) if ((nerv>0).and.(proc_to_comm /= me)) then if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt p2ptag = psb_real_swap_tag - call mpi_irecv(y%combuf(rcv_pt),nerv,& + call mpi_irecv(y%combuf(rcv_pt),n*nerv,& & psb_mpi_r_spk_,prcid(i),& & p2ptag, icomm,y%comid(i,2),iret) end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do if (debug) write(*,*) me,' Gather ' @@ -1546,13 +1548,15 @@ subroutine psi_sswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & ! Then gather for sending. ! pnti = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 do i=1, totxch nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - idx_pt = snd_pt - call y%gth(idx_pt,nesd,idx) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call y%gth(idx_pt,snd_pt,nesd,idx) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do @@ -1567,18 +1571,16 @@ subroutine psi_sswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & ! pnti = 1 - snd_pt = 1 + snd_pt = totrcv_+1 rcv_pt = 1 p2ptag = psb_real_swap_tag do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ if ((nesd>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(snd_pt),nesd,& + call mpi_isend(y%combuf(snd_pt),n*nesd,& & psb_mpi_r_spk_,prcid(i),& & p2ptag,icomm,y%comid(i,1),iret) end if @@ -1589,7 +1591,8 @@ subroutine psi_sswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & call psb_errpush(info,name,i_err=ierr) goto 9999 end if - + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do end if @@ -1609,14 +1612,13 @@ subroutine psi_sswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & if (debug) write(*,*) me,' wait' pnti = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 p2ptag = psb_real_swap_tag do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - if (proc_to_comm /= me)then if (nesd>0) then call mpi_wait(y%comid(i,1),p2pstat,iret) @@ -1642,26 +1644,29 @@ subroutine psi_sswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & & 'Fatal error in swapdata: mismatch on self send',& & nerv,nesd end if - y%combuf(rcv_pt:rcv_pt+nerv-1) = y%combuf(snd_pt:snd_pt+nesd-1) + y%combuf(rcv_pt:rcv_pt+n*nerv-1) = y%combuf(snd_pt:snd_pt+n*nesd-1) end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 + end do if (debug) write(*,*) me,' scatter' pnti = 1 - snd_pt = 1 + snd_pt = totrcv_+1 rcv_pt = 1 do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) idx_pt = 1+pnti+psb_n_elem_recv_ - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(rcv_pt:rcv_pt+nerv-1) - call y%sct(rcv_pt,nerv,idx,beta) + & y%combuf(rcv_pt:rcv_pt+n*nerv-1) + call y%sct(idx_pt,rcv_pt,nerv,idx,beta) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do diff --git a/base/internals/psi_sswaptran.F90 b/base/internals/psi_sswaptran.F90 index 28a976d0..8d275de8 100644 --- a/base/internals/psi_sswaptran.F90 +++ b/base/internals/psi_sswaptran.F90 @@ -1525,7 +1525,8 @@ subroutine psi_stran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& goto 9999 endif - n=1 + n = y%get_ncols() + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 swap_sync = iand(flag,psb_swap_sync_) /= 0 swap_send = iand(flag,psb_swap_send_) /= 0 @@ -1555,21 +1556,22 @@ subroutine psi_stran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& call psb_realloc(totxch,prcid,info) ! First I post all the non blocking receives pnti = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 p2ptag = psb_real_swap_tag do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ call psb_get_rank(prcid(i),ictxt,proc_to_comm) if ((nesd>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt - call mpi_irecv(y%combuf(snd_pt),nesd,& + if (debug) write(*,*) me,'Posting receive from',prcid(i),snd_pt + call mpi_irecv(y%combuf(snd_pt),n*nesd,& & psb_mpi_r_spk_,prcid(i),& & p2ptag, icomm,y%comid(i,2),iret) end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do @@ -1578,16 +1580,15 @@ subroutine psi_stran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& ! Then gather for sending. ! pnti = 1 - snd_pt = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 do i=1, totxch nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - idx_pt = rcv_pt - call y%gth(idx_pt,nerv,idx) - + idx_pt = 1+pnti+psb_n_elem_recv_ + call y%gth(idx_pt,rcv_pt,nerv,idx) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do @@ -1603,18 +1604,17 @@ subroutine psi_stran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& ! pnti = 1 - snd_pt = 1 + snd_pt = totrcv_+1 rcv_pt = 1 p2ptag = psb_real_swap_tag do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ + idx_pt = 1+pnti+psb_n_elem_recv_ if ((nerv>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(rcv_pt),nerv,& + call mpi_isend(y%combuf(rcv_pt),n*nerv,& & psb_mpi_r_spk_,prcid(i),& & p2ptag,icomm,y%comid(i,1),iret) end if @@ -1625,7 +1625,8 @@ subroutine psi_stran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& call psb_errpush(info,name,i_err=ierr) goto 9999 end if - + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do end if @@ -1645,14 +1646,13 @@ subroutine psi_stran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& if (debug) write(*,*) me,' wait' pnti = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 p2ptag = psb_real_swap_tag do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - if (proc_to_comm /= me)then if (nerv>0) then call mpi_wait(y%comid(i,1),p2pstat,iret) @@ -1678,26 +1678,30 @@ subroutine psi_stran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& & 'Fatal error in swapdata: mismatch on self send',& & nerv,nesd end if - y%combuf(snd_pt:snd_pt+nesd-1) = y%combuf(rcv_pt:rcv_pt+nerv-1) + y%combuf(snd_pt:snd_pt+n*nesd-1) = y%combuf(rcv_pt:rcv_pt+n*nerv-1) end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do if (debug) write(*,*) me,' scatter' + + pnti = 1 - snd_pt = 1 + snd_pt = totrcv_+1 rcv_pt = 1 do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ + idx_pt = 1+pnti+nerv+psb_n_elem_send_ if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(snd_pt:snd_pt+nesd-1) - call y%sct(snd_pt,nesd,idx,beta) + & y%combuf(snd_pt:snd_pt+n*nesd-1) + call y%sct(idx_pt,snd_pt,nesd,idx,beta) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do diff --git a/base/internals/psi_zswapdata.F90 b/base/internals/psi_zswapdata.F90 index 0eed2a59..34996b6c 100644 --- a/base/internals/psi_zswapdata.F90 +++ b/base/internals/psi_zswapdata.F90 @@ -1495,7 +1495,7 @@ subroutine psi_zswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & goto 9999 endif - n=1 + n = y%get_ncols() swap_mpi = iand(flag,psb_swap_mpi_) /= 0 swap_sync = iand(flag,psb_swap_sync_) /= 0 @@ -1525,20 +1525,22 @@ subroutine psi_zswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & call psb_realloc(totxch,prcid,info) ! First I post all the non blocking receives pnti = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - - rcv_pt = 1+pnti+psb_n_elem_recv_ call psb_get_rank(prcid(i),ictxt,proc_to_comm) if ((nerv>0).and.(proc_to_comm /= me)) then if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt p2ptag = psb_dcomplex_swap_tag - call mpi_irecv(y%combuf(rcv_pt),nerv,& + call mpi_irecv(y%combuf(rcv_pt),n*nerv,& & psb_mpi_c_dpk_,prcid(i),& & p2ptag, icomm,y%comid(i,2),iret) end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do if (debug) write(*,*) me,' Gather ' @@ -1546,13 +1548,15 @@ subroutine psi_zswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & ! Then gather for sending. ! pnti = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 do i=1, totxch nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - idx_pt = snd_pt - call y%gth(idx_pt,nesd,idx) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call y%gth(idx_pt,snd_pt,nesd,idx) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do @@ -1567,18 +1571,16 @@ subroutine psi_zswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & ! pnti = 1 - snd_pt = 1 + snd_pt = totrcv_+1 rcv_pt = 1 p2ptag = psb_dcomplex_swap_tag do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ if ((nesd>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(snd_pt),nesd,& + call mpi_isend(y%combuf(snd_pt),n*nesd,& & psb_mpi_c_dpk_,prcid(i),& & p2ptag,icomm,y%comid(i,1),iret) end if @@ -1589,7 +1591,8 @@ subroutine psi_zswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & call psb_errpush(info,name,i_err=ierr) goto 9999 end if - + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do end if @@ -1609,14 +1612,13 @@ subroutine psi_zswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & if (debug) write(*,*) me,' wait' pnti = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 p2ptag = psb_dcomplex_swap_tag do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - if (proc_to_comm /= me)then if (nesd>0) then call mpi_wait(y%comid(i,1),p2pstat,iret) @@ -1642,26 +1644,29 @@ subroutine psi_zswap_vidx_multivect(iictxt,iicomm,flag,beta,y,idx, & & 'Fatal error in swapdata: mismatch on self send',& & nerv,nesd end if - y%combuf(rcv_pt:rcv_pt+nerv-1) = y%combuf(snd_pt:snd_pt+nesd-1) + y%combuf(rcv_pt:rcv_pt+n*nerv-1) = y%combuf(snd_pt:snd_pt+n*nesd-1) end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 + end do if (debug) write(*,*) me,' scatter' pnti = 1 - snd_pt = 1 + snd_pt = totrcv_+1 rcv_pt = 1 do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) idx_pt = 1+pnti+psb_n_elem_recv_ - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(rcv_pt:rcv_pt+nerv-1) - call y%sct(rcv_pt,nerv,idx,beta) + & y%combuf(rcv_pt:rcv_pt+n*nerv-1) + call y%sct(idx_pt,rcv_pt,nerv,idx,beta) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do diff --git a/base/internals/psi_zswaptran.F90 b/base/internals/psi_zswaptran.F90 index a26a5c2f..901f3f3f 100644 --- a/base/internals/psi_zswaptran.F90 +++ b/base/internals/psi_zswaptran.F90 @@ -1525,7 +1525,8 @@ subroutine psi_ztran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& goto 9999 endif - n=1 + n = y%get_ncols() + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 swap_sync = iand(flag,psb_swap_sync_) /= 0 swap_send = iand(flag,psb_swap_send_) /= 0 @@ -1555,21 +1556,22 @@ subroutine psi_ztran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& call psb_realloc(totxch,prcid,info) ! First I post all the non blocking receives pnti = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 p2ptag = psb_dcomplex_swap_tag do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ call psb_get_rank(prcid(i),ictxt,proc_to_comm) if ((nesd>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt - call mpi_irecv(y%combuf(snd_pt),nesd,& + if (debug) write(*,*) me,'Posting receive from',prcid(i),snd_pt + call mpi_irecv(y%combuf(snd_pt),n*nesd,& & psb_mpi_c_dpk_,prcid(i),& & p2ptag, icomm,y%comid(i,2),iret) end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do @@ -1578,16 +1580,15 @@ subroutine psi_ztran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& ! Then gather for sending. ! pnti = 1 - snd_pt = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 do i=1, totxch nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - idx_pt = rcv_pt - call y%gth(idx_pt,nerv,idx) - + idx_pt = 1+pnti+psb_n_elem_recv_ + call y%gth(idx_pt,rcv_pt,nerv,idx) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do @@ -1603,18 +1604,17 @@ subroutine psi_ztran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& ! pnti = 1 - snd_pt = 1 + snd_pt = totrcv_+1 rcv_pt = 1 p2ptag = psb_dcomplex_swap_tag do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ + idx_pt = 1+pnti+psb_n_elem_recv_ if ((nerv>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(rcv_pt),nerv,& + call mpi_isend(y%combuf(rcv_pt),n*nerv,& & psb_mpi_c_dpk_,prcid(i),& & p2ptag,icomm,y%comid(i,1),iret) end if @@ -1625,7 +1625,8 @@ subroutine psi_ztran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& call psb_errpush(info,name,i_err=ierr) goto 9999 end if - + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do end if @@ -1645,14 +1646,13 @@ subroutine psi_ztran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& if (debug) write(*,*) me,' wait' pnti = 1 + snd_pt = totrcv_+1 + rcv_pt = 1 p2ptag = psb_dcomplex_swap_tag do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - if (proc_to_comm /= me)then if (nerv>0) then call mpi_wait(y%comid(i,1),p2pstat,iret) @@ -1678,26 +1678,30 @@ subroutine psi_ztran_vidx_multivect(iictxt,iicomm,flag,beta,y,idx,& & 'Fatal error in swapdata: mismatch on self send',& & nerv,nesd end if - y%combuf(snd_pt:snd_pt+nesd-1) = y%combuf(rcv_pt:rcv_pt+nerv-1) + y%combuf(snd_pt:snd_pt+n*nesd-1) = y%combuf(rcv_pt:rcv_pt+n*nerv-1) end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do if (debug) write(*,*) me,' scatter' + + pnti = 1 - snd_pt = 1 + snd_pt = totrcv_+1 rcv_pt = 1 do i=1, totxch proc_to_comm = idx%v(pnti+psb_proc_id_) nerv = idx%v(pnti+psb_n_elem_recv_) nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ + idx_pt = 1+pnti+nerv+psb_n_elem_send_ if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(snd_pt:snd_pt+nesd-1) - call y%sct(snd_pt,nesd,idx,beta) + & y%combuf(snd_pt:snd_pt+n*nesd-1) + call y%sct(idx_pt,snd_pt,nesd,idx,beta) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do diff --git a/base/modules/psb_c_base_vect_mod.f90 b/base/modules/psb_c_base_vect_mod.f90 index 47a170f4..3b8b6158 100644 --- a/base/modules/psb_c_base_vect_mod.f90 +++ b/base/modules/psb_c_base_vect_mod.f90 @@ -2564,9 +2564,9 @@ contains ! ! New comm internals impl. ! - subroutine c_base_mlv_gthzbuf(i,n,idx,x) + subroutine c_base_mlv_gthzbuf(i,ixb,n,idx,x) use psi_serial_mod - integer(psb_ipk_) :: i,n + integer(psb_ipk_) :: i, ixb, n class(psb_i_base_vect_type) :: idx class(psb_c_base_multivect_type) :: x integer(psb_ipk_) :: nc @@ -2578,7 +2578,7 @@ contains if (idx%is_dev()) call idx%sync() if (x%is_dev()) call x%sync() nc = x%get_ncols() - call x%gth(n,idx%v(i:),x%combuf((i-1)*nc+1:)) + call x%gth(n,idx%v(i:),x%combuf(ixb:)) end subroutine c_base_mlv_gthzbuf @@ -2620,9 +2620,9 @@ contains end subroutine c_base_mlv_sctb_x - subroutine c_base_mlv_sctb_buf(i,n,idx,beta,y) + subroutine c_base_mlv_sctb_buf(i,iyb,n,idx,beta,y) use psi_serial_mod - integer(psb_ipk_) :: i, n + integer(psb_ipk_) :: i, iyb, n class(psb_i_base_vect_type) :: idx complex(psb_spk_) :: beta class(psb_c_base_multivect_type) :: y @@ -2635,7 +2635,7 @@ contains if (y%is_dev()) call y%sync() if (idx%is_dev()) call idx%sync() nc = y%get_ncols() - call y%sct(n,idx%v(i:),y%combuf((i-1)*nc+1:),beta) + call y%sct(n,idx%v(i:),y%combuf(iyb:),beta) call y%set_host() end subroutine c_base_mlv_sctb_buf diff --git a/base/modules/psb_d_base_vect_mod.f90 b/base/modules/psb_d_base_vect_mod.f90 index eaebdcfe..a23195d8 100644 --- a/base/modules/psb_d_base_vect_mod.f90 +++ b/base/modules/psb_d_base_vect_mod.f90 @@ -2564,9 +2564,9 @@ contains ! ! New comm internals impl. ! - subroutine d_base_mlv_gthzbuf(i,n,idx,x) + subroutine d_base_mlv_gthzbuf(i,ixb,n,idx,x) use psi_serial_mod - integer(psb_ipk_) :: i,n + integer(psb_ipk_) :: i, ixb, n class(psb_i_base_vect_type) :: idx class(psb_d_base_multivect_type) :: x integer(psb_ipk_) :: nc @@ -2578,7 +2578,7 @@ contains if (idx%is_dev()) call idx%sync() if (x%is_dev()) call x%sync() nc = x%get_ncols() - call x%gth(n,idx%v(i:),x%combuf((i-1)*nc+1:)) + call x%gth(n,idx%v(i:),x%combuf(ixb:)) end subroutine d_base_mlv_gthzbuf @@ -2620,9 +2620,9 @@ contains end subroutine d_base_mlv_sctb_x - subroutine d_base_mlv_sctb_buf(i,n,idx,beta,y) + subroutine d_base_mlv_sctb_buf(i,iyb,n,idx,beta,y) use psi_serial_mod - integer(psb_ipk_) :: i, n + integer(psb_ipk_) :: i, iyb, n class(psb_i_base_vect_type) :: idx real(psb_dpk_) :: beta class(psb_d_base_multivect_type) :: y @@ -2635,7 +2635,7 @@ contains if (y%is_dev()) call y%sync() if (idx%is_dev()) call idx%sync() nc = y%get_ncols() - call y%sct(n,idx%v(i:),y%combuf((i-1)*nc+1:),beta) + call y%sct(n,idx%v(i:),y%combuf(iyb:),beta) call y%set_host() end subroutine d_base_mlv_sctb_buf diff --git a/base/modules/psb_i_base_vect_mod.f90 b/base/modules/psb_i_base_vect_mod.f90 index 5a90ace7..0f8caef1 100644 --- a/base/modules/psb_i_base_vect_mod.f90 +++ b/base/modules/psb_i_base_vect_mod.f90 @@ -1593,9 +1593,9 @@ contains ! ! New comm internals impl. ! - subroutine i_base_mlv_gthzbuf(i,n,idx,x) + subroutine i_base_mlv_gthzbuf(i,ixb,n,idx,x) use psi_serial_mod - integer(psb_ipk_) :: i,n + integer(psb_ipk_) :: i, ixb, n class(psb_i_base_vect_type) :: idx class(psb_i_base_multivect_type) :: x integer(psb_ipk_) :: nc @@ -1607,7 +1607,7 @@ contains if (idx%is_dev()) call idx%sync() if (x%is_dev()) call x%sync() nc = x%get_ncols() - call x%gth(n,idx%v(i:),x%combuf((i-1)*nc+1:)) + call x%gth(n,idx%v(i:),x%combuf(ixb:)) end subroutine i_base_mlv_gthzbuf @@ -1649,9 +1649,9 @@ contains end subroutine i_base_mlv_sctb_x - subroutine i_base_mlv_sctb_buf(i,n,idx,beta,y) + subroutine i_base_mlv_sctb_buf(i,iyb,n,idx,beta,y) use psi_serial_mod - integer(psb_ipk_) :: i, n + integer(psb_ipk_) :: i, iyb, n class(psb_i_base_vect_type) :: idx integer(psb_ipk_) :: beta class(psb_i_base_multivect_type) :: y @@ -1664,7 +1664,7 @@ contains if (y%is_dev()) call y%sync() if (idx%is_dev()) call idx%sync() nc = y%get_ncols() - call y%sct(n,idx%v(i:),y%combuf((i-1)*nc+1:),beta) + call y%sct(n,idx%v(i:),y%combuf(iyb:),beta) call y%set_host() end subroutine i_base_mlv_sctb_buf diff --git a/base/modules/psb_s_base_vect_mod.f90 b/base/modules/psb_s_base_vect_mod.f90 index cb08261a..60bb9346 100644 --- a/base/modules/psb_s_base_vect_mod.f90 +++ b/base/modules/psb_s_base_vect_mod.f90 @@ -2564,9 +2564,9 @@ contains ! ! New comm internals impl. ! - subroutine s_base_mlv_gthzbuf(i,n,idx,x) + subroutine s_base_mlv_gthzbuf(i,ixb,n,idx,x) use psi_serial_mod - integer(psb_ipk_) :: i,n + integer(psb_ipk_) :: i, ixb, n class(psb_i_base_vect_type) :: idx class(psb_s_base_multivect_type) :: x integer(psb_ipk_) :: nc @@ -2578,7 +2578,7 @@ contains if (idx%is_dev()) call idx%sync() if (x%is_dev()) call x%sync() nc = x%get_ncols() - call x%gth(n,idx%v(i:),x%combuf((i-1)*nc+1:)) + call x%gth(n,idx%v(i:),x%combuf(ixb:)) end subroutine s_base_mlv_gthzbuf @@ -2620,9 +2620,9 @@ contains end subroutine s_base_mlv_sctb_x - subroutine s_base_mlv_sctb_buf(i,n,idx,beta,y) + subroutine s_base_mlv_sctb_buf(i,iyb,n,idx,beta,y) use psi_serial_mod - integer(psb_ipk_) :: i, n + integer(psb_ipk_) :: i, iyb, n class(psb_i_base_vect_type) :: idx real(psb_spk_) :: beta class(psb_s_base_multivect_type) :: y @@ -2635,7 +2635,7 @@ contains if (y%is_dev()) call y%sync() if (idx%is_dev()) call idx%sync() nc = y%get_ncols() - call y%sct(n,idx%v(i:),y%combuf((i-1)*nc+1:),beta) + call y%sct(n,idx%v(i:),y%combuf(iyb:),beta) call y%set_host() end subroutine s_base_mlv_sctb_buf diff --git a/base/modules/psb_z_base_vect_mod.f90 b/base/modules/psb_z_base_vect_mod.f90 index 0c028a51..bb096967 100644 --- a/base/modules/psb_z_base_vect_mod.f90 +++ b/base/modules/psb_z_base_vect_mod.f90 @@ -2564,9 +2564,9 @@ contains ! ! New comm internals impl. ! - subroutine z_base_mlv_gthzbuf(i,n,idx,x) + subroutine z_base_mlv_gthzbuf(i,ixb,n,idx,x) use psi_serial_mod - integer(psb_ipk_) :: i,n + integer(psb_ipk_) :: i, ixb, n class(psb_i_base_vect_type) :: idx class(psb_z_base_multivect_type) :: x integer(psb_ipk_) :: nc @@ -2578,7 +2578,7 @@ contains if (idx%is_dev()) call idx%sync() if (x%is_dev()) call x%sync() nc = x%get_ncols() - call x%gth(n,idx%v(i:),x%combuf((i-1)*nc+1:)) + call x%gth(n,idx%v(i:),x%combuf(ixb:)) end subroutine z_base_mlv_gthzbuf @@ -2620,9 +2620,9 @@ contains end subroutine z_base_mlv_sctb_x - subroutine z_base_mlv_sctb_buf(i,n,idx,beta,y) + subroutine z_base_mlv_sctb_buf(i,iyb,n,idx,beta,y) use psi_serial_mod - integer(psb_ipk_) :: i, n + integer(psb_ipk_) :: i, iyb, n class(psb_i_base_vect_type) :: idx complex(psb_dpk_) :: beta class(psb_z_base_multivect_type) :: y @@ -2635,7 +2635,7 @@ contains if (y%is_dev()) call y%sync() if (idx%is_dev()) call idx%sync() nc = y%get_ncols() - call y%sct(n,idx%v(i:),y%combuf((i-1)*nc+1:),beta) + call y%sct(n,idx%v(i:),y%combuf(iyb:),beta) call y%set_host() end subroutine z_base_mlv_sctb_buf