1c4762a1bSJed Brown static char help[] = "Test DMCreateLocalVector_Plex, DMPlexGetCellFields and DMPlexRestoreCellFields work properly for 0 fields/cells/DS dimension\n\n"; 2c4762a1bSJed Brown static char FILENAME[] = "ex25.c"; 3c4762a1bSJed Brown 4c4762a1bSJed Brown #include <petscdmplex.h> 5c4762a1bSJed Brown #include <petscds.h> 6c4762a1bSJed Brown #include <petscsnes.h> 7c4762a1bSJed Brown 8c4762a1bSJed Brown typedef struct { 9c4762a1bSJed Brown PetscInt test; 10c4762a1bSJed Brown } AppCtx; 11c4762a1bSJed Brown 12d71ae5a4SJacob Faibussowitsch static PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options) 13d71ae5a4SJacob Faibussowitsch { 14c4762a1bSJed Brown PetscFunctionBegin; 15c4762a1bSJed Brown options->test = 0; 16d0609cedSBarry Smith PetscOptionsBegin(comm, "", "Zero-sized DMPlexGetCellFields Test Options", "DMPLEX"); 179566063dSJacob Faibussowitsch PetscCall(PetscOptionsBoundedInt("-test", "Test to run", FILENAME, options->test, &options->test, NULL, 0)); 18d0609cedSBarry Smith PetscOptionsEnd(); 193ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 20c4762a1bSJed Brown } 21c4762a1bSJed Brown 22d71ae5a4SJacob Faibussowitsch static PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *options, DM *dm) 23d71ae5a4SJacob Faibussowitsch { 24c4762a1bSJed Brown PetscFunctionBegin; 259566063dSJacob Faibussowitsch PetscCall(DMCreate(comm, dm)); 269566063dSJacob Faibussowitsch PetscCall(DMSetType(*dm, DMPLEX)); 279566063dSJacob Faibussowitsch PetscCall(DMSetFromOptions(*dm)); 289566063dSJacob Faibussowitsch PetscCall(DMViewFromOptions(*dm, NULL, "-dm_view")); 293ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 30c4762a1bSJed Brown } 31c4762a1bSJed Brown 32c4762a1bSJed Brown /* no discretization is given so DMGetNumFields yields 0 */ 33d71ae5a4SJacob Faibussowitsch static PetscErrorCode test0(DM dm, AppCtx *options) 34d71ae5a4SJacob Faibussowitsch { 35c4762a1bSJed Brown Vec locX; 36c4762a1bSJed Brown 37c4762a1bSJed Brown PetscFunctionBegin; 389566063dSJacob Faibussowitsch PetscCall(DMGetLocalVector(dm, &locX)); 399566063dSJacob Faibussowitsch PetscCall(DMRestoreLocalVector(dm, &locX)); 403ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 41c4762a1bSJed Brown } 42c4762a1bSJed Brown 43c4762a1bSJed Brown /* no discretization is given so DMGetNumFields and PetscDSGetTotalDimension yield 0 */ 44d71ae5a4SJacob Faibussowitsch static PetscErrorCode test1(DM dm, AppCtx *options) 45d71ae5a4SJacob Faibussowitsch { 46c4762a1bSJed Brown IS cells; 47c4762a1bSJed Brown Vec locX, locX_t, locA; 48c4762a1bSJed Brown PetscScalar *u, *u_t, *a; 49c4762a1bSJed Brown 50c4762a1bSJed Brown PetscFunctionBegin; 519566063dSJacob Faibussowitsch PetscCall(ISCreateStride(PETSC_COMM_SELF, 0, 0, 1, &cells)); 529566063dSJacob Faibussowitsch PetscCall(DMGetLocalVector(dm, &locX)); 539566063dSJacob Faibussowitsch PetscCall(DMGetLocalVector(dm, &locX_t)); 549566063dSJacob Faibussowitsch PetscCall(DMGetLocalVector(dm, &locA)); 559566063dSJacob Faibussowitsch PetscCall(DMPlexGetCellFields(dm, cells, locX, locX_t, locA, &u, &u_t, &a)); 569566063dSJacob Faibussowitsch PetscCall(DMPlexRestoreCellFields(dm, cells, locX, locX_t, locA, &u, &u_t, &a)); 579566063dSJacob Faibussowitsch PetscCall(DMRestoreLocalVector(dm, &locX)); 589566063dSJacob Faibussowitsch PetscCall(DMRestoreLocalVector(dm, &locX_t)); 599566063dSJacob Faibussowitsch PetscCall(DMRestoreLocalVector(dm, &locA)); 609566063dSJacob Faibussowitsch PetscCall(ISDestroy(&cells)); 613ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 62c4762a1bSJed Brown } 63c4762a1bSJed Brown 64c4762a1bSJed Brown /* no discretization is given so DMGetNumFields and PetscDSGetTotalDimension yield 0 */ 65d71ae5a4SJacob Faibussowitsch static PetscErrorCode test2(DM dm, AppCtx *options) 66d71ae5a4SJacob Faibussowitsch { 67c4762a1bSJed Brown IS cells; 68c4762a1bSJed Brown Vec locX, locX_t, locA; 69c4762a1bSJed Brown PetscScalar *u, *u_t, *a; 70c4762a1bSJed Brown PetscMPIInt rank; 71c4762a1bSJed Brown 72c4762a1bSJed Brown PetscFunctionBegin; 739566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)dm), &rank)); 749566063dSJacob Faibussowitsch PetscCall(ISCreateStride(PETSC_COMM_SELF, rank ? 0 : 1, 0, 1, &cells)); 759566063dSJacob Faibussowitsch PetscCall(DMGetLocalVector(dm, &locX)); 769566063dSJacob Faibussowitsch PetscCall(DMGetLocalVector(dm, &locX_t)); 779566063dSJacob Faibussowitsch PetscCall(DMGetLocalVector(dm, &locA)); 789566063dSJacob Faibussowitsch PetscCall(DMPlexGetCellFields(dm, cells, locX, locX_t, locA, &u, &u_t, &a)); 799566063dSJacob Faibussowitsch PetscCall(DMPlexRestoreCellFields(dm, cells, locX, locX_t, locA, &u, &u_t, &a)); 809566063dSJacob Faibussowitsch PetscCall(DMRestoreLocalVector(dm, &locX)); 819566063dSJacob Faibussowitsch PetscCall(DMRestoreLocalVector(dm, &locX_t)); 829566063dSJacob Faibussowitsch PetscCall(DMRestoreLocalVector(dm, &locA)); 839566063dSJacob Faibussowitsch PetscCall(ISDestroy(&cells)); 843ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 85c4762a1bSJed Brown } 86c4762a1bSJed Brown 87d71ae5a4SJacob Faibussowitsch static PetscErrorCode test3(DM dm, AppCtx *options) 88d71ae5a4SJacob Faibussowitsch { 89c4762a1bSJed Brown PetscDS ds; 90c4762a1bSJed Brown PetscFE fe; 9130602db0SMatthew G. Knepley PetscInt dim; 9230602db0SMatthew G. Knepley PetscBool simplex; 93c4762a1bSJed Brown 94c4762a1bSJed Brown PetscFunctionBegin; 959566063dSJacob Faibussowitsch PetscCall(DMGetDimension(dm, &dim)); 969566063dSJacob Faibussowitsch PetscCall(DMPlexIsSimplex(dm, &simplex)); 979566063dSJacob Faibussowitsch PetscCall(DMGetDS(dm, &ds)); 989566063dSJacob Faibussowitsch PetscCall(PetscFECreateDefault(PetscObjectComm((PetscObject)dm), dim, 1, simplex, NULL, -1, &fe)); 999566063dSJacob Faibussowitsch PetscCall(PetscDSSetDiscretization(ds, 0, (PetscObject)fe)); 1009566063dSJacob Faibussowitsch PetscCall(PetscFEDestroy(&fe)); 1019566063dSJacob Faibussowitsch PetscCall(test1(dm, options)); 1023ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 103c4762a1bSJed Brown } 104c4762a1bSJed Brown 105d71ae5a4SJacob Faibussowitsch static PetscErrorCode test4(DM dm, AppCtx *options) 106d71ae5a4SJacob Faibussowitsch { 107c4762a1bSJed Brown PetscFE fe; 10830602db0SMatthew G. Knepley PetscInt dim; 10930602db0SMatthew G. Knepley PetscBool simplex; 110c4762a1bSJed Brown 111c4762a1bSJed Brown PetscFunctionBegin; 1129566063dSJacob Faibussowitsch PetscCall(DMGetDimension(dm, &dim)); 1139566063dSJacob Faibussowitsch PetscCall(DMPlexIsSimplex(dm, &simplex)); 1149566063dSJacob Faibussowitsch PetscCall(PetscFECreateDefault(PetscObjectComm((PetscObject)dm), dim, 1, simplex, NULL, -1, &fe)); 1159566063dSJacob Faibussowitsch PetscCall(DMSetField(dm, 0, NULL, (PetscObject)fe)); 1169566063dSJacob Faibussowitsch PetscCall(PetscFEDestroy(&fe)); 1179566063dSJacob Faibussowitsch PetscCall(DMCreateDS(dm)); 1189566063dSJacob Faibussowitsch PetscCall(test2(dm, options)); 1193ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 120c4762a1bSJed Brown } 121c4762a1bSJed Brown 122d71ae5a4SJacob Faibussowitsch static PetscErrorCode test5(DM dm, AppCtx *options) 123d71ae5a4SJacob Faibussowitsch { 124c4762a1bSJed Brown IS cells; 125c4762a1bSJed Brown Vec locX, locX_t, locA; 126c4762a1bSJed Brown PetscScalar *u, *u_t, *a; 127c4762a1bSJed Brown 128c4762a1bSJed Brown PetscFunctionBegin; 129c4762a1bSJed Brown locX_t = NULL; 130c4762a1bSJed Brown locA = NULL; 1319566063dSJacob Faibussowitsch PetscCall(ISCreateStride(PETSC_COMM_SELF, 0, 0, 1, &cells)); 1329566063dSJacob Faibussowitsch PetscCall(DMGetLocalVector(dm, &locX)); 1339566063dSJacob Faibussowitsch PetscCall(DMPlexGetCellFields(dm, cells, locX, locX_t, locA, &u, &u_t, &a)); 1349566063dSJacob Faibussowitsch PetscCall(DMPlexRestoreCellFields(dm, cells, locX, locX_t, locA, &u, &u_t, &a)); 1359566063dSJacob Faibussowitsch PetscCall(DMRestoreLocalVector(dm, &locX)); 1369566063dSJacob Faibussowitsch PetscCall(ISDestroy(&cells)); 1373ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 138c4762a1bSJed Brown } 139c4762a1bSJed Brown 140d71ae5a4SJacob Faibussowitsch static PetscErrorCode test6(DM dm, AppCtx *options) 141d71ae5a4SJacob Faibussowitsch { 142c4762a1bSJed Brown IS cells; 143c4762a1bSJed Brown Vec locX, locX_t, locA; 144c4762a1bSJed Brown PetscScalar *u, *u_t, *a; 145c4762a1bSJed Brown PetscMPIInt rank; 146c4762a1bSJed Brown 147c4762a1bSJed Brown PetscFunctionBegin; 1489566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)dm), &rank)); 149c4762a1bSJed Brown locX_t = NULL; 150c4762a1bSJed Brown locA = NULL; 1519566063dSJacob Faibussowitsch PetscCall(ISCreateStride(PETSC_COMM_SELF, rank ? 0 : 1, 0, 1, &cells)); 1529566063dSJacob Faibussowitsch PetscCall(DMGetLocalVector(dm, &locX)); 1539566063dSJacob Faibussowitsch PetscCall(DMPlexGetCellFields(dm, cells, locX, locX_t, locA, &u, &u_t, &a)); 1549566063dSJacob Faibussowitsch PetscCall(DMPlexRestoreCellFields(dm, cells, locX, locX_t, locA, &u, &u_t, &a)); 1559566063dSJacob Faibussowitsch PetscCall(DMRestoreLocalVector(dm, &locX)); 1569566063dSJacob Faibussowitsch PetscCall(ISDestroy(&cells)); 1573ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 158c4762a1bSJed Brown } 159c4762a1bSJed Brown 160d71ae5a4SJacob Faibussowitsch static PetscErrorCode test7(DM dm, AppCtx *options) 161d71ae5a4SJacob Faibussowitsch { 162c4762a1bSJed Brown PetscFE fe; 16330602db0SMatthew G. Knepley PetscInt dim; 16430602db0SMatthew G. Knepley PetscBool simplex; 165c4762a1bSJed Brown 166c4762a1bSJed Brown PetscFunctionBegin; 1679566063dSJacob Faibussowitsch PetscCall(DMGetDimension(dm, &dim)); 1689566063dSJacob Faibussowitsch PetscCall(DMPlexIsSimplex(dm, &simplex)); 1699566063dSJacob Faibussowitsch PetscCall(PetscFECreateDefault(PetscObjectComm((PetscObject)dm), dim, 1, simplex, NULL, -1, &fe)); 1709566063dSJacob Faibussowitsch PetscCall(DMSetField(dm, 0, NULL, (PetscObject)fe)); 1719566063dSJacob Faibussowitsch PetscCall(PetscFEDestroy(&fe)); 1729566063dSJacob Faibussowitsch PetscCall(DMCreateDS(dm)); 1739566063dSJacob Faibussowitsch PetscCall(test5(dm, options)); 1743ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 175c4762a1bSJed Brown } 176c4762a1bSJed Brown 177d71ae5a4SJacob Faibussowitsch static PetscErrorCode test8(DM dm, AppCtx *options) 178d71ae5a4SJacob Faibussowitsch { 179c4762a1bSJed Brown PetscFE fe; 18030602db0SMatthew G. Knepley PetscInt dim; 18130602db0SMatthew G. Knepley PetscBool simplex; 182c4762a1bSJed Brown 183c4762a1bSJed Brown PetscFunctionBegin; 1849566063dSJacob Faibussowitsch PetscCall(DMGetDimension(dm, &dim)); 1859566063dSJacob Faibussowitsch PetscCall(DMPlexIsSimplex(dm, &simplex)); 1869566063dSJacob Faibussowitsch PetscCall(PetscFECreateDefault(PetscObjectComm((PetscObject)dm), dim, 1, simplex, NULL, -1, &fe)); 1879566063dSJacob Faibussowitsch PetscCall(DMSetField(dm, 0, NULL, (PetscObject)fe)); 1889566063dSJacob Faibussowitsch PetscCall(PetscFEDestroy(&fe)); 1899566063dSJacob Faibussowitsch PetscCall(DMCreateDS(dm)); 1909566063dSJacob Faibussowitsch PetscCall(test6(dm, options)); 1913ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 192c4762a1bSJed Brown } 193c4762a1bSJed Brown 194d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv) 195d71ae5a4SJacob Faibussowitsch { 196c4762a1bSJed Brown MPI_Comm comm; 197c4762a1bSJed Brown DM dm; 198c4762a1bSJed Brown AppCtx options; 199c4762a1bSJed Brown 200327415f7SBarry Smith PetscFunctionBeginUser; 2019566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 202c4762a1bSJed Brown comm = PETSC_COMM_WORLD; 2039566063dSJacob Faibussowitsch PetscCall(ProcessOptions(comm, &options)); 2049566063dSJacob Faibussowitsch PetscCall(CreateMesh(comm, &options, &dm)); 205c4762a1bSJed Brown 206c4762a1bSJed Brown switch (options.test) { 207d71ae5a4SJacob Faibussowitsch case 0: 208d71ae5a4SJacob Faibussowitsch PetscCall(test0(dm, &options)); 209d71ae5a4SJacob Faibussowitsch break; 210d71ae5a4SJacob Faibussowitsch case 1: 211d71ae5a4SJacob Faibussowitsch PetscCall(test1(dm, &options)); 212d71ae5a4SJacob Faibussowitsch break; 213d71ae5a4SJacob Faibussowitsch case 2: 214d71ae5a4SJacob Faibussowitsch PetscCall(test2(dm, &options)); 215d71ae5a4SJacob Faibussowitsch break; 216d71ae5a4SJacob Faibussowitsch case 3: 217d71ae5a4SJacob Faibussowitsch PetscCall(test3(dm, &options)); 218d71ae5a4SJacob Faibussowitsch break; 219d71ae5a4SJacob Faibussowitsch case 4: 220d71ae5a4SJacob Faibussowitsch PetscCall(test4(dm, &options)); 221d71ae5a4SJacob Faibussowitsch break; 222d71ae5a4SJacob Faibussowitsch case 5: 223d71ae5a4SJacob Faibussowitsch PetscCall(test5(dm, &options)); 224d71ae5a4SJacob Faibussowitsch break; 225d71ae5a4SJacob Faibussowitsch case 6: 226d71ae5a4SJacob Faibussowitsch PetscCall(test6(dm, &options)); 227d71ae5a4SJacob Faibussowitsch break; 228d71ae5a4SJacob Faibussowitsch case 7: 229d71ae5a4SJacob Faibussowitsch PetscCall(test7(dm, &options)); 230d71ae5a4SJacob Faibussowitsch break; 231d71ae5a4SJacob Faibussowitsch case 8: 232d71ae5a4SJacob Faibussowitsch PetscCall(test8(dm, &options)); 233d71ae5a4SJacob Faibussowitsch break; 234d71ae5a4SJacob Faibussowitsch default: 235d71ae5a4SJacob Faibussowitsch SETERRQ(comm, PETSC_ERR_ARG_OUTOFRANGE, "No such test: %" PetscInt_FMT, options.test); 236c4762a1bSJed Brown } 237c4762a1bSJed Brown 2389566063dSJacob Faibussowitsch PetscCall(DMDestroy(&dm)); 2399566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 240b122ec5aSJacob Faibussowitsch return 0; 241c4762a1bSJed Brown } 242c4762a1bSJed Brown 243c4762a1bSJed Brown /*TEST 244c4762a1bSJed Brown 24530602db0SMatthew G. Knepley testset: 24630602db0SMatthew G. Knepley args: -dm_plex_dim 3 -dm_plex_interpolate 0 247*3886731fSPierre Jolivet output_file: output/empty.out 24830602db0SMatthew G. Knepley 249c4762a1bSJed Brown test: 250c4762a1bSJed Brown suffix: 0 251c4762a1bSJed Brown requires: ctetgen 252c4762a1bSJed Brown args: -test 0 253c4762a1bSJed Brown test: 254c4762a1bSJed Brown suffix: 1 255c4762a1bSJed Brown requires: ctetgen 256c4762a1bSJed Brown args: -test 1 257c4762a1bSJed Brown test: 258c4762a1bSJed Brown suffix: 2 259c4762a1bSJed Brown requires: ctetgen 260c4762a1bSJed Brown args: -test 2 261c4762a1bSJed Brown test: 262c4762a1bSJed Brown suffix: 3 263c4762a1bSJed Brown requires: ctetgen 264c4762a1bSJed Brown args: -test 3 265c4762a1bSJed Brown test: 266c4762a1bSJed Brown suffix: 4 267c4762a1bSJed Brown requires: ctetgen 268c4762a1bSJed Brown args: -test 4 269c4762a1bSJed Brown test: 270c4762a1bSJed Brown suffix: 5 271c4762a1bSJed Brown requires: ctetgen 272c4762a1bSJed Brown args: -test 5 273c4762a1bSJed Brown test: 274c4762a1bSJed Brown suffix: 6 275c4762a1bSJed Brown requires: ctetgen 276c4762a1bSJed Brown args: -test 6 277c4762a1bSJed Brown test: 278c4762a1bSJed Brown suffix: 7 279c4762a1bSJed Brown requires: ctetgen 280c4762a1bSJed Brown args: -test 7 281c4762a1bSJed Brown test: 282c4762a1bSJed Brown suffix: 8 283c4762a1bSJed Brown requires: ctetgen 284c4762a1bSJed Brown args: -test 8 285c4762a1bSJed Brown test: 286c4762a1bSJed Brown suffix: 9 287c4762a1bSJed Brown requires: ctetgen 288c4762a1bSJed Brown nsize: 2 289e600fa54SMatthew G. Knepley args: -test 1 290c4762a1bSJed Brown test: 291c4762a1bSJed Brown suffix: 10 292c4762a1bSJed Brown requires: ctetgen 293c4762a1bSJed Brown nsize: 2 294e600fa54SMatthew G. Knepley args: -test 2 295c4762a1bSJed Brown test: 296c4762a1bSJed Brown suffix: 11 297c4762a1bSJed Brown requires: ctetgen 298c4762a1bSJed Brown nsize: 2 299e600fa54SMatthew G. Knepley args: -test 3 300c4762a1bSJed Brown test: 301c4762a1bSJed Brown suffix: 12 302c4762a1bSJed Brown requires: ctetgen 303c4762a1bSJed Brown nsize: 2 304e600fa54SMatthew G. Knepley args: -test 4 305c4762a1bSJed Brown 306c4762a1bSJed Brown TEST*/ 307