<div dir="ltr"><br><div class="gmail_extra"><div class="gmail_quote">On Wed, Oct 9, 2013 at 10:51 PM, Barry Smith <span dir="ltr"><<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><br>
On Oct 9, 2013, at 2:04 PM, Christophe Ortiz <<a href="mailto:christophe.ortiz@ciemat.es" target="_blank">christophe.ortiz@ciemat.es</a>> wrote:<br>
<br>
><br>
> On Wed, Oct 9, 2013 at 3:13 PM, Christophe Ortiz <<a href="mailto:christophe.ortiz@ciemat.es" target="_blank">christophe.ortiz@ciemat.es</a>> wrote:<br>
><br>
</div><div>> > For instance, if we take the example from petsc (MatSetValuesBlocked page),<br>
> > what should I do to pass the block of values 3, 4, 7 and 8 with<br>
> > MatSetValuesBlocked ?<br>
> ><br>
> >   1  2  | 3  4<br>
> >   5  6  | 7  8<br>
> >     - - - | - - -<br>
> >  9  10 | 11 12<br>
> > 13 14 | 15 16<br>
><br>
> Block row 0, block column 1.  (Count from 0.)<br>
><br>
><br>
><br>
> 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] ?<br>
<br>
</div>   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).<br>


<br>
   Note that the ordering you use on the numerical values is the same for both MatSetValues() and MatSetValuesBlocked().<br></blockquote><div><br></div><div><br></div><div>I am facing some problems with this when filling in the Jacobian for a problem of 2 diffusion equations (dof=2). See ex25.c.</div>

<div><br></div><div>If I'm right, then for node i, there should be 3 blocks of 2x2:</div><div><br></div><div>X  0  |  Y  0  |  X  0</div><div>0  X  |  0  Y  |  0  X</div><div><br></div><div>Is it correct ?</div><div>
<br></div><div>First I tried what you said, to pass a one dimensional array:<br>
</div><div>   row = i;</div><div>   cols[0] = i-1; cols[1] = i; cols[2] = i+1;</div><div><br></div><div><div>   j = 0;</div><div>   vallin[j] = X; vallin[j++] = 0; vallin[j++] = Y; vallin[j++] = 0;  vallin[j++] = X; vallin[j++] = 0;</div>

<div>      </div><div>   vallin[j++] = 0; vallin[j++] = X; vallin[j++] = 0; vallin[j++] = Y; vallin[j++] = 0; vallin[j++] = X;</div></div><div><br></div><div>  ierr = MatSetValuesBlocked(*Jpre,1,&row,3,cols,&vallin[0],INSERT_VALUES);<br>

</div><div><br></div><div>I hit the following message:</div><div><br></div><div><div>[0]PETSC ERROR: --------------------- Error Message ------------------------------------</div><div>[0]PETSC ERROR: Floating point exception!</div>

<div>[0]PETSC ERROR: Vec entry at local location 0 is not-a-number or infinite at end of function: Parameter number 3!</div></div><div><br></div><div><br></div><div>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.</div>

<div><br></div><div><div>      j = 0; k = 0;</div><div>      valdiff[j][k] = X; valdiff[j][k++] = 0;</div><div>      valdiff[j][k++] = Y; valdiff[j][k++] = 0;</div><div>      valdiff[j][k++] = X; valdiff[j][k++] = 0;</div>

<div>      </div><div>      j= 1; k = 0;</div><div>      valdiff[j][k] = 0; valdiff[j][k++] = X;</div><div>      valdiff[j][k++] = 0; valdiff[j][k++] = Y;</div><div>      valdiff[j][k++] = 0; valdiff[j][k++] = X;</div></div>

<div><br></div><div><div>  ierr = MatSetValuesBlocked(*Jpre,1,&row,3,cols,&valdiff[0][0],INSERT_VALUES);<br></div></div><div><br></div><div>I get the same error message.</div><div>What did I do wrong ?</div><div>
<br>
</div><div>In ex25.c they use a 3-dimensional array:</div><div><br></div><div><div> const PetscScalar vals[2][3][2] = {{{dxxL,0},{a *hx+dxx0,0},{dxxR,0}},</div><div>                                                           {{0,dxxL},{0,a*hx+dxx0},{0,dxxR}}};</div>

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

Christophe</div><div><br></div><div><br></div></div></div></div>