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