2 Questions about DAs

Milad Fatenejad icksa1 at gmail.com
Mon May 12 13:58:35 CDT 2008


Hi,
Thanks for the reply.

If I have two global vectors from the same DA, say global1 and global2
and I try to scatter to local vectors local1 and local2 using the
command DAGlobalToLocalBegin/End in the following manner:

DAGlobalToLocalBegin(da, global1, INSERT_VALUES, local1);
DAGlobalToLocalEnd(da, global1, INSERT_VALUES, local1);

DAGlobalToLocalBegin(da, global2, INSERT_VALUES, local2);
DAGlobalToLocalEnd(da, global2, INSERT_VALUES, local2);

Everything is fine. If instead I do:

DAGlobalToLocalBegin(da, global1, INSERT_VALUES, local1);
DAGlobalToLocalBegin(da, global2, INSERT_VALUES, local2);

DAGlobalToLocalEnd(da, global1, INSERT_VALUES, local1);
DAGlobalToLocalEnd(da, global2, INSERT_VALUES, local2);

I get the error:
[0]PETSC ERROR: Object is in wrong state!
[0]PETSC ERROR:  Scatter ctx already in use!

What I would like to be able to do is overlap the scattering and that
produces the error.

Thanks
Milad

On Mon, May 12, 2008 at 1:43 PM,  <Amit.Itagi at seagate.com> wrote:
> Milad,
>
>  I have a DA with 6 vectors sharing the DA structure. I defined the DA to
>  have just 1 DOF. I generated the 6 vectors from that DA. Also, I scatter
>  the vectors separately. Things seem to work fine.
>
>  Thanks
>
>  Rgds,
>  Amit
>
>
>
>
>              "Milad Fatenejad"
>              <mfatenejad at wisc.
>              edu>                                                       To
>              Sent by:                  petsc-users at mcs.anl.gov
>              owner-petsc-users                                          cc
>              @mcs.anl.gov
>              No Phone Info                                         Subject
>              Available                 2 Questions about DAs
>
>
>              05/12/2008 12:02
>              PM
>
>
>              Please respond to
>              petsc-users at mcs.a
>                   nl.gov
>
>
>
>
>
>
>
>
>  Hello:
>  I have two separate DA questions:
>
>  1) I am writing a large finite difference code and would like to be
>  able to represent an array of vectors. I am currently doing this by
>  creating a single DA and calling DACreateGlobalVector several times,
>  but the manual also states that:
>
>  "PETSc currently provides no container for multiple arrays sharing the
>  same distributed array communication; note, however, that the dof
>  parameter handles many cases of interest."
>
>  I also found the following mailing list thread which describes how to
>  use the dof parameter to represent several vectors:
>
>  http://www-unix.mcs.anl.gov/web-mail-archive/lists/petsc-users/2008/02/msg00040.html
>
>
>  Where the following solution is proposed:
>  """
>  The easiest thing to do in C is to declare a struct:
>
>  typedef struct {
>   PetscScalar v[3];
>   PetscScalar p;
>  } Space;
>
>  and then cast pointers
>
>   Space ***array;
>
>   DAVecGetArray(da, u, (void *) &array);
>
>      array[k][j][i].v *= -1.0;
>  """
>
>  The problem with the proposed solution, is that they use a struct to
>  get the individual values, but what if you don't know the number of
>  degrees of freedom at compile time?
>
>  So my question is two fold:
>  a) Is there a problem with just having a single DA and calling
>  DACreateGlobalVector multiple times? Does this affect performance at
>  all (I have many different vectors)?
>  b) Is there a way to use the dof parameter when creating a DA when the
>  number of degrees of freedom is not known at compile time?
>  Specifically, I would like to be able to access the individual values
>  of the vector, just like the example shows...
>
>
>  2) The code I am writing has a lot of different parts which present a
>  lot of opportunities to overlap communication an computation when
>  scattering vectors to update values in the ghost points. Right now,
>  all of my vectors (there are ~50 of them) share a single DA because
>  they all have the same shape. However, by sharing a single DA, I can
>  only scatter one vector at a time. It would be nice to be able to
>  start scattering each vector right after I'm done computing it, and
>  finish scattering it right before I need it again but I can't because
>  other vectors might need to be scattered in between. I then re-wrote
>  part of my code so that each vector had its own DA object, but this
>  ended up being incredibly slow (I assume this is because I have so
>  many vectors).
>
>  My question is, is there a way to scatter multiple vectors
>  simultaneously without affecting the performance of the code? Does it
>  make sense to do this?
>
>
>  I'd really appreciate any help...
>
>  Thanks
>  Milad Fatenejad
>
>
>
>




More information about the petsc-users mailing list