[petsc-users] newbie question on the parallel allocation of matrices

Matthew Knepley knepley at gmail.com
Wed Nov 30 10:05:26 CST 2011


On Wed, Nov 30, 2011 at 9:59 AM, Treue, Frederik <frtr at risoe.dtu.dk> wrote:

> Hi everyone,****
>
> ** **
>
> Caveat: I have just started using petsc, so the answer to my question may
> very well be fairly trivial.
>

See SNES ex5<http://www.mcs.anl.gov/petsc/petsc-dev/src/snes/examples/tutorials/ex5.c.html>for
the right way to interact with the DMDA. We will preallocate the
matrix
for you and allow
you to set values using a stencil.

  Matt


>
>
> I’m trying to run the following bits of code:****
>
> ** **
>
> DMDACreate2d(PETSC_COMM_WORLD, DMDA_BOUNDARY_GHOSTED,
> DMDA_BOUNDARY_GHOSTED,
> DMDA_STENCIL_BOX,10,10,PETSC_DECIDE,PETSC_DECIDE,1,1,PETSC_NULL,PETSC_NULL,&da);
> ****
>
> [snip]****
>
> MatCreate(PETSC_COMM_WORLD,&((*FD).ddx));****
>
>   MatSetSizes((*FD).ddx,PETSC_DECIDE,PETSC_DECIDE,100,100);****
>
>   MatSetFromOptions((*FD).ddx);****
>
> ** **
>
>   for (i=0;i<10;i++) {****
>
>     col[0]=i*10;col[1]=i*10+1; row[0]=i*10;****
>
>     val[0]=1;val[1]=1;****
>
>     MatSetValues((*FD).ddx,1,row,2,col,val,INSERT_VALUES);****
>
>     for (j=1;j<10-1;j++) {****
>
>       col[0]=i*10+j-1;col[1]=i*10+j+1; row[0]=i*10+j;****
>
>       val[0]=-1;val[1]=1;****
>
>       MatSetValues((*FD).ddx,1,row,2,col,val,INSERT_VALUES);****
>
>     }****
>
>     col[0]=i*10+10-2;col[1]=i*10+10-1; row[0]=i*10+10-1;****
>
>     val[0]=-1;val[1]=-1;****
>
>     MatSetValues((*FD).ddx,1,row,2,col,val,INSERT_VALUES);****
>
>   }****
>
>   MatAssemblyBegin((*FD).ddx,MAT_FINAL_ASSEMBLY);****
>
> MatAssemblyEnd((*FD).ddx,MAT_FINAL_ASSEMBLY);****
>
> ** **
>
> MatScale((*FD).ddx,1/(2*(1/9)));****
>
> [snip]****
>
>   DMCreateGlobalVector(da,&tmpvec2);****
>
>   VecSet(tmpvec2,1.0);****
>
>   VecAssemblyBegin(tmpvec2);****
>
>   VecAssemblyEnd(tmpvec2);****
>
>   DMCreateGlobalVector(da,&tmpvec3);****
>
>   VecSet(tmpvec3,1.0);****
>
>   VecAssemblyBegin(tmpvec3);****
>
>   VecAssemblyEnd(tmpvec3);****
>
>   MatView((*FD).ddx,PETSC_VIEWER_STDOUT_WORLD);****
>
>   VecView(tmpvec2,PETSC_VIEWER_STDOUT_WORLD);****
>
>   MatMult((*FD).ddx,tmpvec2,tmpvec3);****
>
>   VecView(tmpvec3,PETSC_VIEWER_STDOUT_WORLD);****
>
>   int tid,first,last;****
>
>   MPI_Comm_rank(PETSC_COMM_WORLD, &tid);****
>
>   sleep(1);****
>
>   MatGetOwnershipRange((*FD).ddx,&first,&last);****
>
>   printf("rank: %d,first: %d,last: %d\n",tid,first,last);****
>
> ** **
>
> When running it on a single processor, everything works as expected, see
> attached file seqRes****
>
> However when running with 4 processors (mpirun –np 4 ./progname) I get the
> output in mpiRes. Notice that there really is a difference, its not just a
> surprising division of points between the processes – I checked this with
> PETSC_VIEWER_DRAW_WORLD. How come? I notice that although in the end each
> process postulates that it has 25 rows, the result of matview is****
>
> Matrix Object: 1 MPI processes****
>
> type: mpiaij****
>
> Is this OK? And if not, what am I doing wrong, presumably in the matrix
> allocation code?****
>
> ** **
>
> ** **
>
> ---****
>
> yours sincerily****
>
> Frederik Treue****
>
> ** **
>



-- 
What most experimenters take for granted before they begin their
experiments is infinitely more interesting than any results to which their
experiments lead.
-- Norbert Wiener
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20111130/1eef4fcc/attachment-0001.htm>


More information about the petsc-users mailing list