static char help[] = "We load a 2d mesh from msh file and create a corresponding DMPlex.\n\n\n"; #include #include #include void top_displacement(const PetscReal x[], PetscScalar *u, void *ctx) { *u = x[1]==0.0? 0.0:0.2; } #undef __FUNCT__ #define __FUNCT__ "main" int main(int argc, char **argv) { MPI_Comm comm; DM dm; KSP ksp; Vec u,r; PetscErrorCode ierr; const char * filename = "/home/luc/research/simulations/Petsc_DMPlex/simple_test/square.msh"; ierr = PetscInitialize(&argc, &argv, (char *)0, help);CHKERRQ(ierr); comm = PETSC_COMM_WORLD; //Create the DM using a gmsh file ierr = DMPlexCreateFromFile(comm, filename, PETSC_TRUE, &dm);CHKERRQ(ierr); ierr = DMPlexSetRefinementUniform(dm, PETSC_FALSE);CHKERRQ(ierr); ierr = DMPlexAddBoundary(dm, PETSC_TRUE,"wall","marker",(void (*)())top_displacement,1,&id,user) /* Must have boundary marker for Dirichlet conditions */ ierr = DMViewFromOptions(dm, NULL, "-dm_view");CHKERRQ(ierr); ierr = KSPCreate(comm, &ksp);CHKERRQ(ierr); ierr = KSPSetDM(ksp, dm);CHKERRQ(ierr); ierr = PetscFinalize(); return(0); }