Actual source code: ex61.c
1: const char help[] = "Test boundary condition insertion";
3: #include <petscdmplex.h>
5: static PetscErrorCode set_one(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar bcval[], void *ctx)
6: {
7: PetscFunctionBegin;
8: bcval[0] = 1.;
9: PetscFunctionReturn(PETSC_SUCCESS);
10: }
12: static PetscErrorCode set_two(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar bcval[], void *ctx)
13: {
14: PetscFunctionBegin;
15: bcval[0] = 2.;
16: PetscFunctionReturn(PETSC_SUCCESS);
17: }
19: int main(int argc, char **argv)
20: {
21: DM dm;
22: DMLabel label;
23: PetscInt in_value = 1;
24: PetscInt out_value = 3;
25: PetscInt comps[] = {0};
26: PetscFE fe;
27: Vec localVec;
29: PetscFunctionBeginUser;
30: PetscCall(PetscInitialize(&argc, &argv, NULL, help));
31: PetscCall(DMPlexCreateBoxMesh(PETSC_COMM_WORLD, 2, PETSC_FALSE, NULL, NULL, NULL, NULL, PETSC_TRUE, &dm));
32: PetscCall(DMGetLabel(dm, "Face Sets", &label));
33: PetscCall(PetscFECreateLagrange(PETSC_COMM_WORLD, 2, 1, PETSC_FALSE, 1, PETSC_DETERMINE, &fe));
34: PetscCall(DMAddField(dm, NULL, (PetscObject)fe));
35: PetscCall(PetscFEDestroy(&fe));
36: PetscCall(DMCreateDS(dm));
37: PetscCall(DMAddBoundary(dm, DM_BC_ESSENTIAL, "inflow condition", label, 1, &in_value, 0, 1, comps, (void (*)(void))set_one, NULL, NULL, NULL));
38: PetscCall(DMAddBoundary(dm, DM_BC_ESSENTIAL, "outflow condition", label, 1, &out_value, 0, 1, comps, (void (*)(void))set_two, NULL, NULL, NULL));
39: PetscCall(DMCreateLocalVector(dm, &localVec));
40: PetscCall(VecSet(localVec, 0.));
41: PetscCall(DMPlexInsertBoundaryValues(dm, PETSC_TRUE, localVec, 0.0, NULL, NULL, NULL));
42: PetscCall(VecView(localVec, NULL));
43: PetscCall(VecDestroy(&localVec));
44: PetscCall(DMDestroy(&dm));
45: PetscCall(PetscFinalize());
46: return 0;
47: }
49: /*TEST
51: test:
52: suffix: 0
54: TEST*/