Trouble with DA, multiple degrees of freedom

Matthew Knepley knepley at
Tue Feb 5 13:58:58 CST 2008

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;



On Feb 5, 2008 1:50 PM, Pearl Flath <pflath at> wrote:
> Dear All,
> I have a code where the velocity  (three components) and pressure are all
> stored in a distributed array with 4 degrees of freedom per node. I'd like
> to take one component of the velocity and multiply it by -1, but I am having
> trouble figuring out how to access that. I believe it must involve
> DAVecGetArrayDOF or DAVecGetArray, but I haven't managed to get either to
> work. I've attached a code fragment where it loads the velocity. Could
> someone suggest how to do this or point me to where I can find additional
> discussion of this? I've read the users manual on DA already.
>  Sincerely,
> Pearl Flath
> ICES, UT Austin
>  ---------------------------------
>               4,1,PETSC_NULL,PETSC_NULL,PETSC_NULL,&daV);
>   DACreateGlobalVector(daV, &vel);
>   // Set the velocity file to read from
>   PetscTruth flg ;
>   PetscViewer view_u;
>   char velocityfile[1024] ;
>   PetscOptionsGetString(0,"-velocityfile",velocityfile,1023,&flg);
>   PetscViewerBinaryOpen(PETSC_COMM_WORLD, velocityfile,
>                          FILE_MODE_READ, &view_u);
>   VecLoadIntoVector(view_u, vel);
>   PetscViewerDestroy(view_u);

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

More information about the petsc-users mailing list