[petsc-users] Suggestions for code with dof >> 1 ?

Christophe Ortiz christophe.ortiz at ciemat.es
Thu Oct 10 04:50:11 CDT 2013


On Wed, Oct 9, 2013 at 10:51 PM, Barry Smith <bsmith at mcs.anl.gov> wrote:

>
> On Oct 9, 2013, at 2:04 PM, Christophe Ortiz <christophe.ortiz at ciemat.es>
> wrote:
>
> >
> > On Wed, Oct 9, 2013 at 3:13 PM, Christophe Ortiz <
> christophe.ortiz at ciemat.es> wrote:
> >
> > > For instance, if we take the example from petsc (MatSetValuesBlocked
> page),
> > > what should I do to pass the block of values 3, 4, 7 and 8 with
> > > MatSetValuesBlocked ?
> > >
> > >   1  2  | 3  4
> > >   5  6  | 7  8
> > >     - - - | - - -
> > >  9  10 | 11 12
> > > 13 14 | 15 16
> >
> > Block row 0, block column 1.  (Count from 0.)
> >
> >
> >
> > And if with the previous case I would like to pass the values 1, 2, 3,
> 4, 5, 6, 7 and 8 (the two first rows) what is the matrix val[ ] that I
> should pass ? Should it be a matrix val[2][4] ?
>
>    It takes a one dimensional array as input; by default the values should
> be ordered by row so you would pass in the numerical values 1, 2, 3, 4,5,
> 6,7,8 in that order. If you wish to have the values ordered by column then
> you would pass 1 5 2 6 3 7 4 8 after calling
> MatSetOptions(mat,MAT_ROW_ORIENTED,PETSC_FALSE).
>
>    Note that the ordering you use on the numerical values is the same for
> both MatSetValues() and MatSetValuesBlocked().
>


I am facing some problems with this when filling in the Jacobian for a
problem of 2 diffusion equations (dof=2). See ex25.c.

If I'm right, then for node i, there should be 3 blocks of 2x2:

X  0  |  Y  0  |  X  0
0  X  |  0  Y  |  0  X

Is it correct ?

First I tried what you said, to pass a one dimensional array:
   row = i;
   cols[0] = i-1; cols[1] = i; cols[2] = i+1;

   j = 0;
   vallin[j] = X; vallin[j++] = 0; vallin[j++] = Y; vallin[j++] = 0;
 vallin[j++] = X; vallin[j++] = 0;

   vallin[j++] = 0; vallin[j++] = X; vallin[j++] = 0; vallin[j++] = Y;
vallin[j++] = 0; vallin[j++] = X;

  ierr = MatSetValuesBlocked(*Jpre,1,&row,3,cols,&vallin[0],INSERT_VALUES);

I hit the following message:

[0]PETSC ERROR: --------------------- Error Message
------------------------------------
[0]PETSC ERROR: Floating point exception!
[0]PETSC ERROR: Vec entry at local location 0 is not-a-number or infinite
at end of function: Parameter number 3!


Then, I tried a 2-dimensional array. I saw in some examples of ts/tutorials
that it is also possible to pass a multi-dimensional arrays. After all, in
memory the rows are stored contiguously, so I guess it is equivalent to a
one-dimensional array.

      j = 0; k = 0;
      valdiff[j][k] = X; valdiff[j][k++] = 0;
      valdiff[j][k++] = Y; valdiff[j][k++] = 0;
      valdiff[j][k++] = X; valdiff[j][k++] = 0;

      j= 1; k = 0;
      valdiff[j][k] = 0; valdiff[j][k++] = X;
      valdiff[j][k++] = 0; valdiff[j][k++] = Y;
      valdiff[j][k++] = 0; valdiff[j][k++] = X;

  ierr =
MatSetValuesBlocked(*Jpre,1,&row,3,cols,&valdiff[0][0],INSERT_VALUES);

I get the same error message.
What did I do wrong ?

In ex25.c they use a 3-dimensional array:

 const PetscScalar vals[2][3][2] = {{{dxxL,0},{a *hx+dxx0,0},{dxxR,0}},

 {{0,dxxL},{0,a*hx+dxx0},{0,dxxR}}};

and &vals[0][0][0] is passed in MatSetValuesBlocked (....,....,
&vals[0][0][0],...), and it works, though I don't understand how.



Christophe
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20131010/1f9a7213/attachment.html>


More information about the petsc-users mailing list