/*@C DMPlexProjectField - This projects the given function of the fields into the function space provided. Input Parameters: + dm - The DM . U - The input field vector . funcs - The functions to evaluate, one per field - mode - The insertion mode for values Output Parameter: . X - The output vector Level: developer .seealso: DMPlexProjectFunction(), DMPlexComputeL2Diff() @*/ PetscErrorCode DMPlexProjectField(DM dm, Vec U, void (**funcs)(const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscReal [], PetscScalar []), InsertMode mode, Vec X) { Vec localX, localU; PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeaderSpecific(dm, DM_CLASSID, 1); ierr = DMGetLocalVector(dm, &localX);CHKERRQ(ierr); ierr = DMGetLocalVector(dm, &localU);CHKERRQ(ierr); ierr = DMGlobalToLocalBegin(dm, U, INSERT_VALUES, localU);CHKERRQ(ierr); ierr = DMGlobalToLocalEnd(dm, U, INSERT_VALUES, localU);CHKERRQ(ierr); ierr = DMPlexProjectFieldLocal(dm, localU, funcs, mode, localX);CHKERRQ(ierr); ierr = DMLocalToGlobalBegin(dm, localX, mode, X);CHKERRQ(ierr); ierr = DMLocalToGlobalEnd(dm, localX, mode, X);CHKERRQ(ierr); if (mode == INSERT_VALUES || mode == INSERT_ALL_VALUES || mode == INSERT_BC_VALUES) { Mat cMat; ierr = DMGetDefaultConstraints(dm, NULL, &cMat);CHKERRQ(ierr); if (cMat) { ierr = DMGlobalToLocalSolve(dm, localX, X);CHKERRQ(ierr); } } ierr = DMRestoreLocalVector(dm, &localX);CHKERRQ(ierr); ierr = DMRestoreLocalVector(dm, &localU);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C DMProjectField - This projects the given function of the fields into the function space provided. Input Parameters: + dm - The DM . time - The time . U - The input field vector . funcs - The functions to evaluate, one per field - mode - The insertion mode for values Output Parameter: . X - The output vector Level: developer .seealso: DMProjectFunction(), DMComputeL2Diff() @*/ PetscErrorCode DMProjectField(DM dm, PetscReal time, Vec U, void (**funcs)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, const PetscReal[], PetscScalar[]), InsertMode mode, Vec X) { Vec localX, localU; PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeaderSpecific(dm, DM_CLASSID, 1); ierr = DMGetLocalVector(dm, &localX);CHKERRQ(ierr); /* We currently check whether locU == locX to see if we need to apply BC */ if (U != X) {ierr = DMGetLocalVector(dm, &localU);CHKERRQ(ierr);} else {localU = localX;} ierr = DMGlobalToLocalBegin(dm, U, INSERT_VALUES, localU);CHKERRQ(ierr); ierr = DMGlobalToLocalEnd(dm, U, INSERT_VALUES, localU);CHKERRQ(ierr); ierr = DMProjectFieldLocal(dm, time, localU, funcs, mode, localX);CHKERRQ(ierr); ierr = DMLocalToGlobalBegin(dm, localX, mode, X);CHKERRQ(ierr); ierr = DMLocalToGlobalEnd(dm, localX, mode, X);CHKERRQ(ierr); if (mode == INSERT_VALUES || mode == INSERT_ALL_VALUES || mode == INSERT_BC_VALUES) { Mat cMat; ierr = DMGetDefaultConstraints(dm, NULL, &cMat);CHKERRQ(ierr); if (cMat) { ierr = DMGlobalToLocalSolve(dm, localX, X);CHKERRQ(ierr); } } ierr = DMRestoreLocalVector(dm, &localX);CHKERRQ(ierr); if (U != X) {ierr = DMRestoreLocalVector(dm, &localU);CHKERRQ(ierr);} PetscFunctionReturn(0); }