xref: /petsc/src/dm/impls/plex/tests/ex41.c (revision efa12513287cff49a2b9648ae83199dcbfaad71a)
1 static const char help[] = "Tests for adaptive refinement";
2 
3 #include <petscdmplex.h>
4 
5 typedef struct {
6   PetscBool metric;  /* Flag to use metric adaptation, instead of tagging */
7   PetscInt *refcell; /* A cell to be refined on each process */
8 } AppCtx;
9 
10 static PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
11 {
12   PetscMPIInt    size;
13   PetscInt       n;
14   PetscErrorCode ierr;
15 
16   PetscFunctionBeginUser;
17   options->metric  = PETSC_FALSE;
18   ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr);
19   ierr = PetscCalloc1(size, &options->refcell);CHKERRQ(ierr);
20   n    = size;
21 
22   ierr = PetscOptionsBegin(comm, "", "Parallel Mesh Adaptation Options", "DMPLEX");CHKERRQ(ierr);
23   ierr = PetscOptionsBool("-metric", "Flag for metric refinement", "ex41.c", options->metric, &options->metric, NULL);CHKERRQ(ierr);
24   ierr = PetscOptionsIntArray("-refcell", "The cell to be refined", "ex41.c", options->refcell, &n, NULL);CHKERRQ(ierr);
25   if (n && n != size) SETERRQ2(comm, PETSC_ERR_ARG_SIZ, "Only gave %D cells to refine, must give one for all %D processes", n, size);
26   ierr = PetscOptionsEnd();
27   PetscFunctionReturn(0);
28 }
29 
30 static PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *ctx, DM *dm)
31 {
32   PetscErrorCode ierr;
33 
34   PetscFunctionBegin;
35   ierr = DMPlexCreateBoxMesh(comm, 2, PETSC_TRUE, NULL, NULL, NULL, NULL, PETSC_TRUE, dm);CHKERRQ(ierr);
36   ierr = DMSetFromOptions(*dm);CHKERRQ(ierr);
37   ierr = PetscObjectSetName((PetscObject) *dm, "Mesh");CHKERRQ(ierr);
38   ierr = DMViewFromOptions(*dm, NULL, "-dm_view");CHKERRQ(ierr);
39   PetscFunctionReturn(0);
40 }
41 
42 static PetscErrorCode CreateAdaptLabel(DM dm, AppCtx *ctx, DMLabel *adaptLabel)
43 {
44   PetscMPIInt    rank;
45   PetscErrorCode ierr;
46 
47   PetscFunctionBegin;
48   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject) dm), &rank);CHKERRQ(ierr);
49   ierr = DMLabelCreate(PETSC_COMM_SELF, "Adaptation Label", adaptLabel);CHKERRQ(ierr);
50   if (ctx->refcell[rank] >= 0) {ierr = DMLabelSetValue(*adaptLabel, ctx->refcell[rank], DM_ADAPT_REFINE);CHKERRQ(ierr);}
51   PetscFunctionReturn(0);
52 }
53 
54 int main(int argc, char **argv)
55 {
56   DM             dm, dma;
57   DMLabel        adaptLabel;
58   AppCtx         ctx;
59   PetscErrorCode ierr;
60 
61   ierr = PetscInitialize(&argc, &argv, NULL, help); if (ierr) return ierr;
62   ierr = ProcessOptions(PETSC_COMM_WORLD, &ctx);CHKERRQ(ierr);
63   ierr = CreateMesh(PETSC_COMM_WORLD, &ctx, &dm);CHKERRQ(ierr);
64   ierr = CreateAdaptLabel(dm, &ctx, &adaptLabel);CHKERRQ(ierr);
65   ierr = DMAdaptLabel(dm, adaptLabel, &dma);CHKERRQ(ierr);
66   ierr = PetscObjectSetName((PetscObject) dma, "Adapted Mesh");CHKERRQ(ierr);
67   ierr = DMLabelDestroy(&adaptLabel);CHKERRQ(ierr);
68   ierr = DMDestroy(&dm);CHKERRQ(ierr);
69   ierr = DMViewFromOptions(dma, NULL, "-adapt_dm_view");CHKERRQ(ierr);
70   ierr = DMDestroy(&dma);CHKERRQ(ierr);
71   ierr = PetscFree(ctx.refcell);CHKERRQ(ierr);
72   ierr = PetscFinalize();
73   return ierr;
74 }
75 
76 /*TEST
77 
78   test:
79     suffix: 0
80     requires: triangle
81     args: -dm_plex_adaptor cellrefiner -dm_plex_cell_refiner sbr -dm_view -adapt_dm_view
82 
83   test:
84     suffix: 1
85     requires: triangle
86     args: -refcell 2 -dm_plex_adaptor cellrefiner -dm_plex_cell_refiner sbr -dm_view ::ascii_info_detail -adapt_dm_view ::ascii_info_detail
87 
88   test:
89     suffix: 2
90     requires: triangle
91     nsize: 2
92     args: -refcell 2,-1 -dm_distribute -petscpartitioner_type simple -dm_plex_adaptor cellrefiner -dm_plex_cell_refiner sbr -dm_view -adapt_dm_view
93 
94 TEST*/
95