Beispiel #1
0
static PetscErrorCode test5(DM dm, AppCtx *options)
{
  IS             cells;
  Vec            locX, locX_t, locA;
  PetscScalar    *u, *u_t, *a;
  PetscErrorCode ierr;

  PetscFunctionBegin;
  locX_t = NULL;
  locA = NULL;
  ierr = ISCreateStride(PETSC_COMM_SELF, 0, 0, 1, &cells);CHKERRQ(ierr);
  ierr = DMGetLocalVector(dm, &locX);CHKERRQ(ierr);
  ierr = DMPlexGetCellFields(    dm, cells, locX, locX_t, locA, &u, &u_t, &a);CHKERRQ(ierr);
  ierr = DMPlexRestoreCellFields(dm, cells, locX, locX_t, locA, &u, &u_t, &a);CHKERRQ(ierr);
  ierr = DMRestoreLocalVector(dm, &locX);CHKERRQ(ierr);
  ierr = ISDestroy(&cells);CHKERRQ(ierr);
  PetscFunctionReturn(0);
}
Beispiel #2
0
static PetscErrorCode test6(DM dm, AppCtx *options)
{
  IS             cells;
  Vec            locX, locX_t, locA;
  PetscScalar    *u, *u_t, *a;
  PetscMPIInt    rank;
  PetscErrorCode ierr;

  PetscFunctionBegin;
  ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)dm), &rank);CHKERRQ(ierr);
  locX_t = NULL;
  locA = NULL;
  ierr = ISCreateStride(PETSC_COMM_SELF, rank ? 0 : 1, 0, 1, &cells);CHKERRQ(ierr);
  ierr = DMGetLocalVector(dm, &locX);CHKERRQ(ierr);
  ierr = DMPlexGetCellFields(    dm, cells, locX, locX_t, locA, &u, &u_t, &a);CHKERRQ(ierr);
  ierr = DMPlexRestoreCellFields(dm, cells, locX, locX_t, locA, &u, &u_t, &a);CHKERRQ(ierr);
  ierr = DMRestoreLocalVector(dm, &locX);CHKERRQ(ierr);
  ierr = ISDestroy(&cells);CHKERRQ(ierr);
  PetscFunctionReturn(0);
}
Beispiel #3
0
#define dmplexrestorecellfields_   dmplexrestorecellfields
#define dmplexgetfacefields_       dmplexgetfacefields
#define dmplexrestorefacefields_   dmplexrestorefacefields
#define dmplexgetfacegeometry_     dmplexgetfacegeometry
#define dmplexrestorefacegeometry_ dmplexrestorefacegeometry
#endif

PETSC_EXTERN void PETSC_STDCALL dmplexgetcellfields_(DM *dm, PetscInt *cStart, PetscInt *cEnd, Vec *locX, Vec *locX_t, Vec *locA, F90Array1d *uPtr, F90Array1d *utPtr, F90Array1d *aPtr, int *ierr PETSC_F90_2PTR_PROTO(uPtrd) PETSC_F90_2PTR_PROTO(utPtrd) PETSC_F90_2PTR_PROTO(aPtrd))
{
  PetscDS      prob;
  PetscScalar *u, *u_t, *a;
  PetscInt     numCells = *cEnd - *cStart, totDim, totDimAux = 0;

  CHKFORTRANNULLOBJECTDEREFERENCE(locX_t);
  CHKFORTRANNULLOBJECTDEREFERENCE(locA);
  *ierr = DMPlexGetCellFields(*dm, *cStart, *cEnd, *locX, *locX_t, *locA, &u, &u_t, &a);if (*ierr) return;
  *ierr = DMGetDS(*dm, &prob);if (*ierr) return;
  *ierr = PetscDSGetTotalDimension(prob, &totDim);if (*ierr) return;
  if (locA) {
    DM      dmAux;
    PetscDS probAux;

    *ierr = VecGetDM(*locA, &dmAux);if (*ierr) return;
    *ierr = DMGetDS(dmAux, &probAux);if (*ierr) return;
    *ierr = PetscDSGetTotalDimension(probAux, &totDimAux);if (*ierr) return;
  }
  *ierr = F90Array1dCreate((void*) u,   PETSC_SCALAR, 1, numCells*totDim,               uPtr  PETSC_F90_2PTR_PARAM(uPtrd));if (*ierr) return;
  *ierr = F90Array1dCreate((void*) u_t, PETSC_SCALAR, 1, locX_t ? numCells*totDim : 0,  utPtr PETSC_F90_2PTR_PARAM(utPtrd));if (*ierr) return;
  *ierr = F90Array1dCreate((void*) a,   PETSC_SCALAR, 1, locA ? numCells*totDimAux : 0, aPtr  PETSC_F90_2PTR_PARAM(aPtrd));
}