// MFEM Example 0 // // Compile with: make ex0 // // Sample runs: ex0 // ex0 -m ../data/fichera.mesh // ex0 -m ../data/square-disc.mesh -o 2 // // Description: This example code demonstrates the most basic usage of MFEM to // define a simple finite element discretization of the Laplace // problem -Delta u = 1 with zero Dirichlet boundary conditions. // General 2D/3D mesh files and finite element polynomial degrees // can be specified by command line options. #include "mfem.hpp" #include #include using namespace std; using namespace mfem; int main(int argc, char *argv[]) { // 1. Parse command line options. string mesh_file = "../data/star.mesh"; int order = 1; OptionsParser args(argc, argv); args.AddOption(&mesh_file, "-m", "--mesh", "Mesh file to use."); args.AddOption(&order, "-o", "--order", "Finite element polynomial degree"); args.ParseCheck(); // 2. Read the mesh from the given mesh file, and refine once uniformly. Mesh mesh(mesh_file); mesh.UniformRefinement(); // 3. Define a finite element space on the mesh. Here we use H1 continuous // high-order Lagrange finite elements of the given order. H1_FECollection fec(order, mesh.Dimension()); FiniteElementSpace fespace(&mesh, &fec); cout << "Number of unknowns: " << fespace.GetTrueVSize() << endl; // 4. Extract the list of all the boundary DOFs. These will be marked as // Dirichlet in order to enforce zero boundary conditions. Array boundary_dofs; fespace.GetBoundaryTrueDofs(boundary_dofs); // 5. Define the solution x as a finite element grid function in fespace. Set // the initial guess to zero, which also sets the boundary conditions. GridFunction x(&fespace); x = 0.0; // 6. Set up the linear form b(.) corresponding to the right-hand side. ConstantCoefficient one(1.0); LinearForm b(&fespace); b.AddDomainIntegrator(new DomainLFIntegrator(one)); b.Assemble(); // 7. Set up the bilinear form a(.,.) corresponding to the -Delta operator. BilinearForm a(&fespace); a.AddDomainIntegrator(new DiffusionIntegrator); a.Assemble(); // 8. Form the linear system A X = B. This includes eliminating boundary // conditions, applying AMR constraints, and other transformations. SparseMatrix A; Vector B, X; a.FormLinearSystem(boundary_dofs, x, b, A, X, B); // 9. Solve the system using PCG with symmetric Gauss-Seidel preconditioner. GSSmoother M(A); PCG(A, M, B, X, 1, 200, 1e-12, 0.0); // 10. Recover the solution x as a grid function and save to file. The output // can be viewed using GLVis as follows: "glvis -m mesh.mesh -g sol.gf" a.RecoverFEMSolution(X, b, x); x.Save("sol.gf"); mesh.Save("mesh.mesh"); return 0; }