1 #include <petsc/private/dmpleximpl.h> /*I "petscdmplex.h" I*/ 2 #include <petsc/private/tsimpl.h> /*I "petscts.h" I*/ 3 #include <petsc/private/snesimpl.h> 4 #include <petscds.h> 5 #include <petscfv.h> 6 7 PetscErrorCode DMPlexTSComputeRHSFunctionFVMCEED(DM dm, PetscReal time, Vec locX, Vec F, void *user) 8 { 9 PetscFV fv; 10 Vec locF; 11 Ceed ceed; 12 DMCeed sd = dm->dmceed; 13 CeedVector clocX, clocF; 14 15 PetscFunctionBegin; 16 PetscCall(DMGetCeed(dm, &ceed)); 17 PetscCheck(sd, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_WRONGSTATE, "This DM has no CEED data. Call DMCeedCreate() before computing the residual."); 18 if (time == 0.) PetscCall(DMCeedComputeGeometry(dm, sd)); 19 PetscCall(DMGetField(dm, 0, NULL, (PetscObject *)&fv)); 20 PetscCall(DMPlexInsertBoundaryValuesFVM(dm, fv, locX, time, NULL)); 21 PetscCall(DMGetLocalVector(dm, &locF)); 22 PetscCall(VecZeroEntries(locF)); 23 PetscCall(VecGetCeedVectorRead(locX, ceed, &clocX)); 24 PetscCall(VecGetCeedVector(locF, ceed, &clocF)); 25 PetscCallCEED(CeedOperatorApplyAdd(sd->op, clocX, clocF, CEED_REQUEST_IMMEDIATE)); 26 PetscCall(VecRestoreCeedVectorRead(locX, &clocX)); 27 PetscCall(VecRestoreCeedVector(locF, &clocF)); 28 PetscCall(DMLocalToGlobalBegin(dm, locF, ADD_VALUES, F)); 29 PetscCall(DMLocalToGlobalEnd(dm, locF, ADD_VALUES, F)); 30 PetscCall(DMRestoreLocalVector(dm, &locF)); 31 PetscCall(VecViewFromOptions(F, NULL, "-fv_rhs_view")); 32 PetscFunctionReturn(PETSC_SUCCESS); 33 } 34