xref: /petsc/src/dm/impls/forest/tests/ex1.c (revision 30602db00db74b7e41a0c75e517aefe6711423f0)
10bb0ac0dSMatthew G. Knepley static char help[] = "Test HDF5 input and output.\n\
20bb0ac0dSMatthew G. Knepley This exposed a bug with sharing discretizations.\n\n\n";
30bb0ac0dSMatthew G. Knepley 
40bb0ac0dSMatthew G. Knepley #include <petscdmforest.h>
50bb0ac0dSMatthew G. Knepley #include <petscdmplex.h>
60bb0ac0dSMatthew G. Knepley #include <petscviewerhdf5.h>
70bb0ac0dSMatthew G. Knepley 
80bb0ac0dSMatthew G. Knepley int main (int argc, char **argv)
90bb0ac0dSMatthew G. Knepley {
100bb0ac0dSMatthew G. Knepley 
110bb0ac0dSMatthew G. Knepley   DM             base, forest, plex;
120bb0ac0dSMatthew G. Knepley   Vec            g, g2;
130bb0ac0dSMatthew G. Knepley   PetscSection   s;
140bb0ac0dSMatthew G. Knepley   PetscViewer    viewer;
150bb0ac0dSMatthew G. Knepley   PetscReal      diff;
160bb0ac0dSMatthew G. Knepley   PetscInt       min_refine = 2, overlap = 0;
170bb0ac0dSMatthew G. Knepley   PetscInt       vStart, vEnd, v;
180bb0ac0dSMatthew G. Knepley   PetscErrorCode ierr;
190bb0ac0dSMatthew G. Knepley 
200bb0ac0dSMatthew G. Knepley   ierr = PetscInitialize(&argc, &argv, NULL, help);if (ierr) return ierr;
210bb0ac0dSMatthew G. Knepley 
22*30602db0SMatthew G. Knepley   ierr = DMCreate(PETSC_COMM_WORLD, &base);CHKERRQ(ierr);
23*30602db0SMatthew G. Knepley   ierr = DMSetType(base, DMPLEX);CHKERRQ(ierr);
240bb0ac0dSMatthew G. Knepley   ierr = DMSetFromOptions(base);CHKERRQ(ierr);
250bb0ac0dSMatthew G. Knepley 
260bb0ac0dSMatthew G. Knepley   ierr = DMCreate(PETSC_COMM_WORLD, &forest);CHKERRQ(ierr);
270bb0ac0dSMatthew G. Knepley   ierr = DMSetType(forest, DMP4EST);CHKERRQ(ierr);
280bb0ac0dSMatthew G. Knepley   ierr = DMForestSetBaseDM(forest, base);CHKERRQ(ierr);
290bb0ac0dSMatthew G. Knepley   ierr = DMForestSetInitialRefinement(forest, min_refine);CHKERRQ(ierr);
300bb0ac0dSMatthew G. Knepley   ierr = DMForestSetPartitionOverlap(forest, overlap);CHKERRQ(ierr);
310bb0ac0dSMatthew G. Knepley   ierr = DMSetUp(forest);CHKERRQ(ierr);
320bb0ac0dSMatthew G. Knepley   ierr = DMDestroy(&base);CHKERRQ(ierr);
330bb0ac0dSMatthew G. Knepley   ierr = DMViewFromOptions(forest, NULL, "-dm_view");CHKERRQ(ierr);
340bb0ac0dSMatthew G. Knepley 
350bb0ac0dSMatthew G. Knepley   ierr = DMConvert(forest, DMPLEX, &plex);CHKERRQ(ierr);
360bb0ac0dSMatthew G. Knepley   ierr = DMPlexGetDepthStratum(plex, 0, &vStart, &vEnd);CHKERRQ(ierr);
370bb0ac0dSMatthew G. Knepley   ierr = DMDestroy(&plex);CHKERRQ(ierr);
380bb0ac0dSMatthew G. Knepley   ierr = PetscSectionCreate(PetscObjectComm((PetscObject) forest), &s);CHKERRQ(ierr);
390bb0ac0dSMatthew G. Knepley   ierr = PetscSectionSetChart(s, vStart, vEnd);CHKERRQ(ierr);
400bb0ac0dSMatthew G. Knepley   for (v = vStart; v < vEnd; ++v) {ierr = PetscSectionSetDof(s, v, 1);CHKERRQ(ierr);}
410bb0ac0dSMatthew G. Knepley   ierr = PetscSectionSetUp(s);CHKERRQ(ierr);
420bb0ac0dSMatthew G. Knepley   ierr = DMSetLocalSection(forest, s);CHKERRQ(ierr);
430bb0ac0dSMatthew G. Knepley   ierr = PetscSectionDestroy(&s);CHKERRQ(ierr);
440bb0ac0dSMatthew G. Knepley 
450bb0ac0dSMatthew G. Knepley   ierr = DMCreateGlobalVector(forest, &g);CHKERRQ(ierr);
460bb0ac0dSMatthew G. Knepley   ierr = PetscObjectSetName((PetscObject) g, "g");CHKERRQ(ierr);
470bb0ac0dSMatthew G. Knepley   ierr = VecSet(g, 1.0);CHKERRQ(ierr);
480bb0ac0dSMatthew G. Knepley   ierr = PetscViewerHDF5Open(PETSC_COMM_WORLD, "forest.h5", FILE_MODE_WRITE, &viewer);
490bb0ac0dSMatthew G. Knepley   ierr = VecView(g, viewer);CHKERRQ(ierr);
500bb0ac0dSMatthew G. Knepley   ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
510bb0ac0dSMatthew G. Knepley 
520bb0ac0dSMatthew G. Knepley   ierr = DMCreateGlobalVector(forest, &g2);CHKERRQ(ierr);
530bb0ac0dSMatthew G. Knepley   ierr = PetscObjectSetName((PetscObject) g2, "g");CHKERRQ(ierr);
540bb0ac0dSMatthew G. Knepley   ierr = PetscViewerHDF5Open(PETSC_COMM_WORLD, "forest.h5", FILE_MODE_READ, &viewer);
550bb0ac0dSMatthew G. Knepley   ierr = VecLoad(g2, viewer);CHKERRQ(ierr);
560bb0ac0dSMatthew G. Knepley   ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
570bb0ac0dSMatthew G. Knepley 
580bb0ac0dSMatthew G. Knepley   /*  Check if the data is the same*/
590bb0ac0dSMatthew G. Knepley   ierr = VecAXPY(g2, -1.0, g);CHKERRQ(ierr);
600bb0ac0dSMatthew G. Knepley   ierr = VecNorm(g2, NORM_INFINITY, &diff);CHKERRQ(ierr);
610bb0ac0dSMatthew G. Knepley   if (diff > PETSC_MACHINE_EPSILON) {ierr = PetscPrintf(PETSC_COMM_WORLD, "Check failed: %g\n", (double) diff);CHKERRQ(ierr);}
620bb0ac0dSMatthew G. Knepley 
630bb0ac0dSMatthew G. Knepley   ierr = VecDestroy(&g);CHKERRQ(ierr);
640bb0ac0dSMatthew G. Knepley   ierr = VecDestroy(&g2);CHKERRQ(ierr);
650bb0ac0dSMatthew G. Knepley   ierr = DMDestroy(&forest);CHKERRQ(ierr);
660bb0ac0dSMatthew G. Knepley   ierr = PetscFinalize();
670bb0ac0dSMatthew G. Knepley   return ierr;
680bb0ac0dSMatthew G. Knepley }
690bb0ac0dSMatthew G. Knepley 
700bb0ac0dSMatthew G. Knepley /*TEST
710bb0ac0dSMatthew G. Knepley 
720bb0ac0dSMatthew G. Knepley   build:
730bb0ac0dSMatthew G. Knepley     requires: hdf5 p4est
740bb0ac0dSMatthew G. Knepley 
750bb0ac0dSMatthew G. Knepley   test:
76*30602db0SMatthew G. Knepley     args: -dm_plex_simplex 0 -dm_plex_box_faces 3,3
770bb0ac0dSMatthew G. Knepley 
780bb0ac0dSMatthew G. Knepley TEST*/
79