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); }
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); }
#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)); }