[petsc-users] DA matrices and vectors ordering
Jed Brown
jed at 59A2.org
Tue Jun 22 09:11:09 CDT 2010
On Tue, 22 Jun 2010 09:41:15 -0400, Valerio Grazioso <graziosov at me.queensu.ca> wrote:
> Hi Jed,
>
> On 2010-06-22, at 6:03 AM, Jed Brown wrote:
>
> > On Tue, 22 Jun 2010 04:02:29 -0400, Valerio Grazioso <graziosov at me.queensu.ca> wrote:
> >> and I've got a matrix A ordered in a Petsc ordering: rows and variables have a sequential numbering relative to each processor.
> >
> > This is always the order used internally, but your application code
> > doesn't have to "see" this ordering. I suggest using
> > MatSetValuesStencil() which allows you to effectively insert values in
> > the natural ordering (as coordinates k,j,i) which will get mapped
> > appropriately to the internal storage.
>
> Yes I've used MatSetValuesStencil() to insert the values and it worked perfectly.
> When I say that I've got a matrix in Petsc ordering is
> because when I see it with -mat_view (at run time) that is what is printed at screen.
Yeah, that's PETSc's ordering (the one used internally). There isn't
much point outputting a matrix in a different ordering, it's just nice
to assemble it using natural indexing (MatSetValuesStencil).
> Also in this case, when I say that I get a naturally ordered vector is because when I use
>
>
> .....
>
> call DALocalToGlobal(da,qloc,INSERT_VALUES,q,err)
> call vecView(q,PETSC_VIEWER_STDOUT_WORLD,err)
>
> .....
>
> that what is printed at screen (a naturally ordered vector).
This is because it's often convenient to have a vector in the natural
format (because you might read it in on a different number of
processes). This is only done for DA vectors, you can
PetscViewerPushFormat(viewer,PETSC_VIEWER_NATIVE) to write it in PETSc's
ordering (consistent with the matrix).
> But if I'm understanding well what you suggest, at the end, no matter
> what I see printed at screen (for the matrix), I should be already
> working in natural ordering for both the matrix and the rhs?
This is easiest, unstructured codes usually require you to deal with
both a local and global ordering, and there usually isn't any concept of
a "natural ordering", just a concatenation of the owned local spaces
(equivalent to "PETSc ordering" for structured grids).
> >
> >> cont=cont+1
> >> qloc_a(cont)=....
> >
> > Can use qloc_a(i,j,k) here.
>
> I didn't manage to do this. I get compiling errors (I'm using ifort) if I define a qloc_a(:,:,:) pointer array: PetscScalar, pointer :: qloc_a(:,:,:)
Define the qloc_a(:) as usual, but index it with i,j,k (looks weird, I
know), see src/snes/examples/tutorials/ex5f90.F.
Jed
More information about the petsc-users
mailing list