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 12c4762a1bSJed Brown static PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options) 13c4762a1bSJed Brown { 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(); 19c4762a1bSJed Brown PetscFunctionReturn(0); 20c4762a1bSJed Brown } 21c4762a1bSJed Brown 22c4762a1bSJed Brown static PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *options, DM *dm) 23c4762a1bSJed Brown { 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")); 29c4762a1bSJed Brown PetscFunctionReturn(0); 30c4762a1bSJed Brown } 31c4762a1bSJed Brown 32c4762a1bSJed Brown /* no discretization is given so DMGetNumFields yields 0 */ 33c4762a1bSJed Brown static PetscErrorCode test0(DM dm, AppCtx *options) 34c4762a1bSJed Brown { 35c4762a1bSJed Brown Vec locX; 36c4762a1bSJed Brown 37c4762a1bSJed Brown PetscFunctionBegin; 389566063dSJacob Faibussowitsch PetscCall(DMGetLocalVector(dm, &locX)); 399566063dSJacob Faibussowitsch PetscCall(DMRestoreLocalVector(dm, &locX)); 40c4762a1bSJed Brown PetscFunctionReturn(0); 41c4762a1bSJed Brown } 42c4762a1bSJed Brown 43c4762a1bSJed Brown /* no discretization is given so DMGetNumFields and PetscDSGetTotalDimension yield 0 */ 44c4762a1bSJed Brown static PetscErrorCode test1(DM dm, AppCtx *options) 45c4762a1bSJed Brown { 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)); 61c4762a1bSJed Brown PetscFunctionReturn(0); 62c4762a1bSJed Brown } 63c4762a1bSJed Brown 64c4762a1bSJed Brown /* no discretization is given so DMGetNumFields and PetscDSGetTotalDimension yield 0 */ 65c4762a1bSJed Brown static PetscErrorCode test2(DM dm, AppCtx *options) 66c4762a1bSJed Brown { 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)); 84c4762a1bSJed Brown PetscFunctionReturn(0); 85c4762a1bSJed Brown } 86c4762a1bSJed Brown 87c4762a1bSJed Brown static PetscErrorCode test3(DM dm, AppCtx *options) 88c4762a1bSJed Brown { 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)); 102c4762a1bSJed Brown PetscFunctionReturn(0); 103c4762a1bSJed Brown } 104c4762a1bSJed Brown 105c4762a1bSJed Brown static PetscErrorCode test4(DM dm, AppCtx *options) 106c4762a1bSJed Brown { 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)); 119c4762a1bSJed Brown PetscFunctionReturn(0); 120c4762a1bSJed Brown } 121c4762a1bSJed Brown 122c4762a1bSJed Brown static PetscErrorCode test5(DM dm, AppCtx *options) 123c4762a1bSJed Brown { 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)); 137c4762a1bSJed Brown PetscFunctionReturn(0); 138c4762a1bSJed Brown } 139c4762a1bSJed Brown 140c4762a1bSJed Brown static PetscErrorCode test6(DM dm, AppCtx *options) 141c4762a1bSJed Brown { 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)); 157c4762a1bSJed Brown PetscFunctionReturn(0); 158c4762a1bSJed Brown } 159c4762a1bSJed Brown 160c4762a1bSJed Brown static PetscErrorCode test7(DM dm, AppCtx *options) 161c4762a1bSJed Brown { 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)); 174c4762a1bSJed Brown PetscFunctionReturn(0); 175c4762a1bSJed Brown } 176c4762a1bSJed Brown 177c4762a1bSJed Brown static PetscErrorCode test8(DM dm, AppCtx *options) 178c4762a1bSJed Brown { 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)); 191c4762a1bSJed Brown PetscFunctionReturn(0); 192c4762a1bSJed Brown } 193c4762a1bSJed Brown 194c4762a1bSJed Brown int main(int argc, char **argv) 195c4762a1bSJed Brown { 196c4762a1bSJed Brown MPI_Comm comm; 197c4762a1bSJed Brown DM dm; 198c4762a1bSJed Brown AppCtx options; 199c4762a1bSJed Brown 200*327415f7SBarry 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) { 2079566063dSJacob Faibussowitsch case 0: PetscCall(test0(dm, &options)); break; 2089566063dSJacob Faibussowitsch case 1: PetscCall(test1(dm, &options)); break; 2099566063dSJacob Faibussowitsch case 2: PetscCall(test2(dm, &options)); break; 2109566063dSJacob Faibussowitsch case 3: PetscCall(test3(dm, &options)); break; 2119566063dSJacob Faibussowitsch case 4: PetscCall(test4(dm, &options)); break; 2129566063dSJacob Faibussowitsch case 5: PetscCall(test5(dm, &options)); break; 2139566063dSJacob Faibussowitsch case 6: PetscCall(test6(dm, &options)); break; 2149566063dSJacob Faibussowitsch case 7: PetscCall(test7(dm, &options)); break; 2159566063dSJacob Faibussowitsch case 8: PetscCall(test8(dm, &options)); break; 21663a3b9bcSJacob Faibussowitsch default: SETERRQ(comm, PETSC_ERR_ARG_OUTOFRANGE, "No such test: %" PetscInt_FMT, options.test); 217c4762a1bSJed Brown } 218c4762a1bSJed Brown 2199566063dSJacob Faibussowitsch PetscCall(DMDestroy(&dm)); 2209566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 221b122ec5aSJacob Faibussowitsch return 0; 222c4762a1bSJed Brown } 223c4762a1bSJed Brown 224c4762a1bSJed Brown /*TEST 225c4762a1bSJed Brown 22630602db0SMatthew G. Knepley testset: 22730602db0SMatthew G. Knepley args: -dm_plex_dim 3 -dm_plex_interpolate 0 22830602db0SMatthew G. Knepley 229c4762a1bSJed Brown test: 230c4762a1bSJed Brown suffix: 0 231c4762a1bSJed Brown requires: ctetgen 232c4762a1bSJed Brown args: -test 0 233c4762a1bSJed Brown test: 234c4762a1bSJed Brown suffix: 1 235c4762a1bSJed Brown requires: ctetgen 236c4762a1bSJed Brown args: -test 1 237c4762a1bSJed Brown test: 238c4762a1bSJed Brown suffix: 2 239c4762a1bSJed Brown requires: ctetgen 240c4762a1bSJed Brown args: -test 2 241c4762a1bSJed Brown test: 242c4762a1bSJed Brown suffix: 3 243c4762a1bSJed Brown requires: ctetgen 244c4762a1bSJed Brown args: -test 3 245c4762a1bSJed Brown test: 246c4762a1bSJed Brown suffix: 4 247c4762a1bSJed Brown requires: ctetgen 248c4762a1bSJed Brown args: -test 4 249c4762a1bSJed Brown test: 250c4762a1bSJed Brown suffix: 5 251c4762a1bSJed Brown requires: ctetgen 252c4762a1bSJed Brown args: -test 5 253c4762a1bSJed Brown test: 254c4762a1bSJed Brown suffix: 6 255c4762a1bSJed Brown requires: ctetgen 256c4762a1bSJed Brown args: -test 6 257c4762a1bSJed Brown test: 258c4762a1bSJed Brown suffix: 7 259c4762a1bSJed Brown requires: ctetgen 260c4762a1bSJed Brown args: -test 7 261c4762a1bSJed Brown test: 262c4762a1bSJed Brown suffix: 8 263c4762a1bSJed Brown requires: ctetgen 264c4762a1bSJed Brown args: -test 8 265c4762a1bSJed Brown test: 266c4762a1bSJed Brown suffix: 9 267c4762a1bSJed Brown requires: ctetgen 268c4762a1bSJed Brown nsize: 2 269e600fa54SMatthew G. Knepley args: -test 1 270c4762a1bSJed Brown test: 271c4762a1bSJed Brown suffix: 10 272c4762a1bSJed Brown requires: ctetgen 273c4762a1bSJed Brown nsize: 2 274e600fa54SMatthew G. Knepley args: -test 2 275c4762a1bSJed Brown test: 276c4762a1bSJed Brown suffix: 11 277c4762a1bSJed Brown requires: ctetgen 278c4762a1bSJed Brown nsize: 2 279e600fa54SMatthew G. Knepley args: -test 3 280c4762a1bSJed Brown test: 281c4762a1bSJed Brown suffix: 12 282c4762a1bSJed Brown requires: ctetgen 283c4762a1bSJed Brown nsize: 2 284e600fa54SMatthew G. Knepley args: -test 4 285c4762a1bSJed Brown 286c4762a1bSJed Brown TEST*/ 287