CSR Sparse Matrix Query

Tim Stitt timothy.stitt at ichec.ie
Sat Apr 21 09:15:52 CDT 2007


Randall,

Many thanks for that...very helpful indeed.

Just out of curiosity...what do you mean by "Distributed Arrays". This 
is not the same as PETSc distributed arrays which I thought are implicit 
in the Matrix and Vector generation routines (depending on whether 
multiple nodes are available or not)?

Regards,

Tim.

Randall Mackie wrote:
> Hi Tim,
>
> There's no need to generate a dense matrix if you're dealing with sparse
> matrices. There are many approaches, but if you just want to get your
> existing matrix into PETSc, you can use something like the following 
> (written
> in Fortran, but almost the same in C):
>
> Assume the global vector length is np:
>
>       call VecCreateMPI(PETSC_COMM_WORLD,PETSC_DECIDE,np,b,ierr)
>       call VecDuplicate(b,xsol,ierr)
>       call VecGetLocalSize(b,mloc,ierr)
>       call VecGetOwnershipRange(b,Istart,Iend,ierr)
>
>       do i=Istart+1,Iend
>         loc(i)=i-1
>       end do
>
>
>       ALLOCATE (d_nnz(mloc), o_nnz(mloc), STAT=istat)
>
> Note: the d_nnz and o_nnz are used to determine the pre-allocation of 
> the global matrix
> according to the PETSc manual (basically just looping through and 
> figuring out which
> elements are in d_nnz and which are in o_nnz).
>
> Then you can create the matrix:
>
>
>       call MatCreateMPIAIJ(PETSC_COMM_WORLD,mloc,mloc,np,np,
>      .     PETSC_NULL_INTEGER, d_nnz, PETSC_NULL_INTEGER,
>      .     o_nnz,P,ierr)
>
>
> And then I had a subroutine to fill it like this (the critical part is 
> the check
> whether that part of the matrix is owned by the current processor):
>
>       jj=0
>
>       do i=1,l
>         do k=2,n
>           do j=2,m
>
>             jj=jj+1
>             row = jj-1
>
>             IF (jj >= Istart+1 .and. jj <= Iend) THEN
>
>               if(k.ne.2) then
>                 fact=-rijcy*dx*dy/z(k-1)       ! Hxijc
>                 ic=ic+1
>                 v(ic)=fact
>                 col(ic)=ijkhx(i,j,k-1)-1
>               end if
>
> [snip code]
>
>               call MatSetValues(A,i1,row,ic,col,v,INSERT_VALUES,
>      .             ierr)
>
>
> [and finally at the end you assemble the matrix]
>
>       call MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY,ierr)
>       call MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY,ierr)
>
>
> Since these early days, I've switched over to using Distributed Arrays,
> which in my opinion are much better and much easier to use.
>
> Hope this helps,
>
> Randy
>
>
> Dr. Timothy Stitt wrote:
>> Hi all,
>>
>> I have just begun to use PETSc and I have already ran into a problem. 
>> Apologies if this has been dealt with before.
>>
>> My code currently generates its own non-distributed Hamiltonian 
>> sparse matrix in CSR format (due to the large size of the dense 
>> representation). I want to exploit PETSc's (actually SLEPc's) 
>> eigensolver routines and hence I need to convert my CSR 
>> representation into PETSc CSR representation for use by the eigensolver.
>>  From reading the documentation I am under the impression that you 
>> initially supply the dense matrix to the PETSc matrix routines for 
>> conversion to PETSc CSR representation. In my case I do not generate 
>> the dense matrix. I would be grateful if someone could guide me on to 
>> how to create a PETSC sparse matrix from my own in-code generated 
>> sparse matrix.
>>
>> Thanks in advance for any assistance that can be provided.
>>
>> Regards,
>>
>> Tim.
>>
>


-- 
Dr. Timothy Stitt <timothy_dot_stitt_at_ichec.ie>
HPC Application Consultant - ICHEC (www.ichec.ie)

Dublin Institute for Advanced Studies
5 Merrion Square - Dublin 2 - Ireland

+353-1-6621333 (tel) / +353-1-6621477 (fax) / +353-874195427 (mobile)




More information about the petsc-users mailing list