diff --git a/opt/psb_d_rsb_mat_mod.F03 b/opt/psb_d_rsb_mat_mod.F03 index bf17975f..5d8970fb 100644 --- a/opt/psb_d_rsb_mat_mod.F03 +++ b/opt/psb_d_rsb_mat_mod.F03 @@ -1,10 +1,12 @@ ! ! -! FIXME: +! FIXME/TODO: ! * some RSB constants are used in their value form, and with no explanation ! * error handling ! * PSBLAS interface adherence ! * should test and fix all the problems that for sure will occur +! * duplicate handling is not defined +! * the printing function is not complete ! * .. ! module psb_d_rsb_mat_mod @@ -18,17 +20,17 @@ module psb_d_rsb_mat_mod #else #define PSBRSB_DEBUG(MSG) #endif - integer :: c_f_order=2 ! FIXME: here should use RSB_FLAG_WANT_COLUMN_MAJOR_ORDER - integer, parameter :: c_f_index=1 ! 0x001000 ! FIXME: here should use RSB_FLAG_FORTRAN_INDICES_INTERFACE - integer, parameter :: c_d_typecode=68 ! FIXME: here should use .. - integer, parameter :: c_def_flags =c_f_index ! FIXME: here should use .. - integer :: c_srt_flags =4 ! flags if rsb input is row major sorted .. - integer :: c_own_flags =2 ! flags if rsb input shall not be freed by rsb - integer :: c_upd_flags =c_f_index ! flags for when updating the assembled rsb matrix - integer :: c_tri_flags =16777216 ! flags for specifying a triangle - integer :: c_low_flags =16384 ! flags for specifying a lower triangle/symmetry - integer :: c_upp_flags =33554432 ! flags for specifying a lower triangle/symmetry - integer :: c_idi_flags =262144 ! flags for specifying diagonal implicit + integer, parameter :: c_d_typecode=68 ! FIXME: this is only valid for 'double' + integer, parameter :: c_for_flags=1 ! : here should use RSB_FLAG_FORTRAN_INDICES_INTERFACE + integer, parameter :: c_srt_flags =4 ! flags if rsb input is row major sorted .. + !integer, parameter :: c_own_flags =-1 ! flags if rsb input shall not be freed by rsb + integer, parameter :: c_tri_flags =8 ! flags for specifying a triangle + integer, parameter :: c_low_flags =16 ! flags for specifying a lower triangle/symmetry + integer, parameter :: c_upp_flags =32 ! flags for specifying a lower triangle/symmetry + integer, parameter :: c_idi_flags =64 ! flags for specifying diagonal implicit + integer, parameter :: c_def_flags =c_for_flags ! FIXME: here should use .. + integer :: c_f_order=c_for_flags ! FIXME: here should use RSB_FLAG_WANT_COLUMN_MAJOR_ORDER + integer, parameter :: c_upd_flags =c_for_flags ! flags for when updating the assembled rsb matrix type, extends(psb_d_base_sparse_mat) :: psb_d_rsb_sparse_mat #ifdef HAVE_LIBRSB type(c_ptr) :: rsbmptr=c_null_ptr @@ -336,6 +338,7 @@ subroutine psb_d_rsb_csmm(alpha,a,x,beta,y,info,trans) character :: trans_ integer :: ldy,ldx,nc PSBRSB_DEBUG('') + PSBRSB_DEBUG('ERROR: UNIMPLEMENTED') if (present(trans)) then trans_ = trans @@ -344,7 +347,8 @@ subroutine psb_d_rsb_csmm(alpha,a,x,beta,y,info,trans) end if ldx=size(x,1); ldy=size(y,1) nc=min(size(x,2),size(y,2) ) -!!$ info=d_rsb_to_psb_info(rsb_spmm(a%rsbmptr,x,y,ldx,ldy,nc,rsb_psblas_trans_to_rsb_trans(trans_),alpha,beta,c_f_order)) + info=-1 + info=d_rsb_to_psb_info(rsb_spmm(a%rsbmptr,x,y,ldx,ldy,nc,rsb_psblas_trans_to_rsb_trans(trans_),alpha,beta,c_f_order)) end subroutine psb_d_rsb_csmm subroutine psb_d_rsb_cssm(alpha,a,x,beta,y,info,trans) @@ -358,6 +362,7 @@ subroutine psb_d_rsb_cssm(alpha,a,x,beta,y,info,trans) integer :: ldy,ldx,nc character :: trans_ PSBRSB_DEBUG('') + PSBRSB_DEBUG('ERROR: UNIMPLEMENTED') if (present(trans)) then trans_ = trans else @@ -365,7 +370,8 @@ subroutine psb_d_rsb_cssm(alpha,a,x,beta,y,info,trans) end if ldx=size(x,1); ldy=size(y,1) nc=min(size(x,2),size(y,2) ) -!!$ info=d_rsb_to_psb_info(rsb_spsm(a%rsbmptr,y,ldy,nc,rsb_psblas_trans_to_rsb_trans(trans_),alpha,beta,c_f_order)) + info=-1 + info=d_rsb_to_psb_info(rsb_spsm(a%rsbmptr,y,ldy,nc,rsb_psblas_trans_to_rsb_trans(trans_),alpha,beta,c_f_order)) end subroutine subroutine psb_d_rsb_rowsum(d,a) @@ -432,7 +438,7 @@ end subroutine psb_d_rsb_reinit integer :: info PSBRSB_DEBUG('') res=0 - res=rsb_get_rows_nnz(a%rsbmptr,idx,idx,c_f_index,info) + res=rsb_get_rows_nnz(a%rsbmptr,idx,idx,c_for_flags,info) info=d_rsb_to_psb_info(info) if(info.ne.0)res=0 end function d_rsb_get_nz_row @@ -456,7 +462,7 @@ subroutine psb_d_cp_rsb_to_coo(a,b,info) nza = a%get_nzeros() call b%allocate(nr,nc,nza) call b%psb_d_base_sparse_mat%cp_from(a%psb_d_base_sparse_mat) - info=d_rsb_to_psb_info(rsb_get_coo(a%rsbmptr,b%val,b%ia,b%ja,c_f_index)) + info=d_rsb_to_psb_info(rsb_get_coo(a%rsbmptr,b%val,b%ia,b%ja,c_for_flags)) call b%set_nzeros(a%get_nzeros()) call b%set_nrows(a%get_nrows()) call b%set_ncols(a%get_ncols()) @@ -644,7 +650,7 @@ subroutine psb_d_rsb_csgetrow(imin,imax,a,nz,ia,ja,val,info,& goto 9999 end if - nzrsb = rsb_get_block_nnz(a%rsbmptr,imin,imax,jmin_,jmax_,c_f_index,info) + nzrsb = rsb_get_block_nnz(a%rsbmptr,imin,imax,jmin_,jmax_,c_for_flags,info) ! FIXME: unfinished; missing error handling .. call psb_ensure_size(nzin_+nzrsb,ia,info) @@ -655,7 +661,7 @@ subroutine psb_d_rsb_csgetrow(imin,imax,a,nz,ia,ja,val,info,& info=d_rsb_to_psb_info(rsb_get_block_sparse(a%rsbmptr,& & val(nzin_+1:),imin,imax,jmin_,jmax_,& & ia(nzin_+1:),ja(nzin_+1:),& - & c_null_ptr,c_null_ptr,nz,c_f_index)) + & c_null_ptr,c_null_ptr,nz,c_for_flags)) ! FIXME: unfinished; missing error handling .. if (nz /= nzrsb) then write(0,*) 'Mismatch in output from rsb_getblk: ',nz,nzrsb @@ -704,7 +710,7 @@ subroutine psb_d_rsb_csgetptn(imin,imax,a,nz,ia,ja,info,& if (info == psb_success_) call psb_ensure_size(nzin_,ja,info) if (info /= psb_success_) return - nzin_=rsb_get_block_nnz(a%rsbmptr,imin,imax,imin,imax,c_f_index,info) + nzin_=rsb_get_block_nnz(a%rsbmptr,imin,imax,imin,imax,c_for_flags,info) ! FIXME: unfinished; missing error handling .. call psb_ensure_size(nzin_,ia,info) @@ -712,7 +718,7 @@ subroutine psb_d_rsb_csgetptn(imin,imax,a,nz,ia,ja,info,& if (info /= psb_success_) return info=d_rsb_to_psb_info(rsb_get_block_sparse_pattern& - &(a%rsbmptr,imin,imax,jmin,jmax,ia,ja,c_null_ptr,c_null_ptr,nzin_,c_f_index)) + &(a%rsbmptr,imin,imax,jmin,jmax,ia,ja,c_null_ptr,c_null_ptr,nzin_,c_for_flags)) ! FIXME: unfinished; missing error handling .. end subroutine psb_d_rsb_csgetptn diff --git a/opt/rsb_mod.f03 b/opt/rsb_mod.f03 index 0b0bd155..bcf8b39c 100644 --- a/opt/rsb_mod.f03 +++ b/opt/rsb_mod.f03 @@ -186,6 +186,25 @@ use iso_c_binding end function rsb_spmv end interface +interface +integer(c_int) function & + &rsb_spmm& + &(matrix,b,c,ldb,ldc,nrhs,transa,alphap,betap,order)& + &bind(c,name='rsb_spmm') +use iso_c_binding + type(c_ptr), value :: matrix + real(c_double) :: b(*) + real(c_double) :: c(*) + integer(c_int), value :: ldb + integer(c_int), value :: ldc + integer(c_int), value :: nrhs + integer(c_int), value :: transa + real(c_double) :: alphap + real(c_double) :: betap + integer(c_int), value :: order + end function rsb_spmm +end interface + interface integer(c_int) function & &rsb_infinity_norm& @@ -776,16 +795,6 @@ use iso_c_binding end function rsb_print_matrix_t end interface -interface -integer(c_int) function & - &rsb_print_matrix_unsorted_coo& - &(matrix)& - &bind(c,name='rsb_print_matrix_unsorted_coo') -use iso_c_binding - type(c_ptr), value :: matrix - end function rsb_print_matrix_unsorted_coo -end interface - interface integer(c_int) function & &rsb_save_matrix_file_as_matrix_market&