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