/*@C DMDATSSetRHSFunctionLocal - set a local residual evaluation function Logically Collective Input Arguments: + dm - DM to associate callback with . imode - insert mode for the residual . func - local residual evaluation - ctx - optional context for local residual evaluation Calling sequence for func: $ func(DMDALocalInfo info,PetscReal t,void *x,void *f,void *ctx) + info - DMDALocalInfo defining the subdomain to evaluate the residual on . t - time at which to evaluate residual . x - array of local state information . f - output array of local residual information - ctx - optional user context Level: beginner .seealso: DMTSSetRHSFunction(), DMDATSSetRHSJacobianLocal(), DMDASNESSetFunctionLocal() @*/ PetscErrorCode DMDATSSetRHSFunctionLocal(DM dm,InsertMode imode,DMDATSRHSFunctionLocal func,void *ctx) { PetscErrorCode ierr; DMTS sdm; DMTS_DA *dmdats; PetscFunctionBegin; PetscValidHeaderSpecific(dm,DM_CLASSID,1); ierr = DMGetDMTSWrite(dm,&sdm);CHKERRQ(ierr); ierr = DMDATSGetContext(dm,sdm,&dmdats);CHKERRQ(ierr); dmdats->rhsfunctionlocalimode = imode; dmdats->rhsfunctionlocal = func; dmdats->rhsfunctionlocalctx = ctx; ierr = DMTSSetRHSFunction(dm,TSComputeRHSFunction_DMDA,dmdats);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C DMPlexTSSetRHSFunctionLocal - set a local residual evaluation function Logically Collective Input Arguments: + dm - DM to associate callback with . riemann - Riemann solver - ctx - optional context for Riemann solve Calling sequence for riemann: $ riemann(const PetscReal x[], const PetscReal n[], const PetscScalar uL[], const PetscScalar uR[], PetscScalar flux[], void *ctx) + x - The coordinates at a point on the interface . n - The normal vector to the interface . uL - The state vector to the left of the interface . uR - The state vector to the right of the interface . flux - output array of flux through the interface - ctx - optional user context Level: beginner .seealso: DMTSSetRHSFunctionLocal() @*/ PetscErrorCode DMPlexTSSetRHSFunctionLocal(DM dm, void (*riemann)(const PetscReal x[], const PetscReal n[], const PetscScalar uL[], const PetscScalar uR[], PetscScalar flux[], void *ctx), void *ctx) { DMTS dmts; DMTS_Plex *dmplexts; PetscFV fvm; PetscInt Nf; PetscBool computeGradients; PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeaderSpecific(dm, DM_CLASSID, 1); ierr = DMGetDMTSWrite(dm, &dmts);CHKERRQ(ierr); ierr = DMPlexTSGetContext(dm, dmts, &dmplexts);CHKERRQ(ierr); dmplexts->riemann = riemann; dmplexts->rhsfunctionlocalctx = ctx; ierr = DMGetNumFields(dm, &Nf);CHKERRQ(ierr); ierr = DMGetField(dm, 0, (PetscObject *) &fvm);CHKERRQ(ierr); ierr = DMPlexTSSetupGeometry(dm, fvm, dmplexts);CHKERRQ(ierr); ierr = PetscFVGetComputeGradients(fvm, &computeGradients);CHKERRQ(ierr); if (computeGradients) {ierr = DMPlexTSSetupGradient(dm, fvm, dmplexts);CHKERRQ(ierr);} ierr = DMTSSetRHSFunction(dm, TSComputeRHSFunction_DMPlex, dmplexts);CHKERRQ(ierr); PetscFunctionReturn(0); }