int main(int argc, char* argv[]) { // Load the mesh. Mesh mesh; MeshReaderH2D mloader; mloader.load("square_2_elem.mesh", &mesh); // Perform initial mesh refinements. for(int i = 0; i < UNIFORM_REF_LEVEL; i++) mesh.refine_all_elements(); // Create an H1 space with default shapeset. H1Space<double> space(&mesh, P_INIT); int ndof = Space<double>::get_num_dofs(&space); info("ndof = %d", ndof); // Initialize the right-hand side. CustomRightHandSide rhs_value(K); // Initialize the weak formulation. CustomWeakForm wf(&rhs_value, BDY_LEFT_RIGHT, K); Solution<double> sln; // NON-ADAPTIVE VERSION // Initialize the linear problem. DiscreteProblem<double> dp(&wf, &space); // Select matrix solver. SparseMatrix<double>* matrix = create_matrix<double>(matrix_solver_type); Vector<double>* rhs = create_vector<double>(matrix_solver_type); LinearSolver<double>* solver = create_linear_solver<double>(matrix_solver_type, matrix, rhs); // Assemble stiffness matrix and rhs. dp.assemble(matrix, rhs); // Solve the linear system of the reference problem. If successful, obtain the solutions. if(solver->solve()) Solution<double>::vector_to_solution(solver->get_sln_vector(), &space, &sln); else error ("Matrix solver failed.\n"); // Visualize the solution. ScalarView view("Solution", new WinGeom(0, 0, 440, 350)); view.show(&sln); // Calculate error wrt. exact solution. CustomExactSolution sln_exact(&mesh, K); double err = Global<double>::calc_abs_error(&sln, &sln_exact, HERMES_H1_NORM); printf("err = %g, err_squared = %g\n\n", err, err*err); // Wait for all views to be closed. View::wait(); return 0; }
int main(int argc, char* argv[]) { // Load the mesh. Mesh mesh; H2DReader mloader; mloader.load("square.mesh", &mesh); // Perform uniform mesh refinements. for (int i=0; i<INIT_REF_NUM; i++) mesh.refine_all_elements(); // Create an L2 space with default shapeset. L2Space space(&mesh, P_INIT); // View basis functions. BaseView bview("BaseView", 0, 0, 600, 500); // Assemble and solve the finite element problem. WeakForm wf_dummy; // Initialize the exact and projected solution. Solution sln; Solution sln_exact(&mesh, F); OGProjection::project_global(&space, &sln_exact, &sln, matrix_solver, HERMES_L2_NORM); // Visualize the solution. ScalarView view1("Projection", 610, 0, 600, 500); // It will "Exception: SegFault" if we do not use View::wait() or View::close(). view1.close(); bool success = true; #define ERROR_SUCCESS 0 #define ERROR_FAILURE -1 if (success == true) { printf("Success!\n"); return ERROR_SUCCESS; } else { printf("Failure!\n"); return ERROR_FAILURE; } }
int main(int argc, char* argv[]) { // Read the command-line arguments. if (argc != 10) error("You must provide 5 real numbers (mesh vertices) and 4 integers (poly degrees)."); double x0 = atof(argv[1]); double x1 = atof(argv[2]); double x2 = atof(argv[3]); double x3 = atof(argv[4]); double x4 = atof(argv[5]); int o0 = atoi(argv[6]); int o1 = atoi(argv[7]); int o2 = atoi(argv[8]); int o3 = atoi(argv[9]); // Prepare mesh geometry. int nv = 10; double2 verts[10]; verts[0][0] = x0; verts[0][1] = 0; verts[1][0] = x1; verts[1][1] = 0; verts[2][0] = x2; verts[2][1] = 0; verts[3][0] = x3; verts[3][1] = 0; verts[4][0] = x4; verts[4][1] = 0; verts[5][0] = x0; verts[5][1] = 1; verts[6][0] = x1; verts[6][1] = 1; verts[7][0] = x2; verts[7][1] = 1; verts[8][0] = x3; verts[8][1] = 1; verts[9][0] = x4; verts[9][1] = 1; int nt = 0; int4* tris = NULL; int nq = 4; int5 quads[4]; quads[0][0] = 0; quads[0][1] = 1; quads[0][2] = 6; quads[0][3] = 5; quads[0][4] = 0; quads[1][0] = 1; quads[1][1] = 2; quads[1][2] = 7; quads[1][3] = 6; quads[1][4] = 0; quads[2][0] = 2; quads[2][1] = 3; quads[2][2] = 8; quads[2][3] = 7; quads[2][4] = 0; quads[3][0] = 3; quads[3][1] = 4; quads[3][2] = 9; quads[3][3] = 8; quads[3][4] = 0; int nm = 10; int3 mark[10]; mark[0][0] = 0; mark[0][1] = 1; mark[0][2] = 1; mark[1][0] = 1; mark[1][1] = 2; mark[1][2] = 1; mark[2][0] = 2; mark[2][1] = 3; mark[2][2] = 1; mark[3][0] = 3; mark[3][1] = 4; mark[3][2] = 1; mark[4][0] = 4; mark[4][1] = 9; mark[4][2] = 1; mark[5][0] = 9; mark[5][1] = 8; mark[5][2] = 1; mark[6][0] = 8; mark[6][1] = 7; mark[6][2] = 1; mark[7][0] = 7; mark[7][1] = 6; mark[7][2] = 1; mark[8][0] = 6; mark[8][1] = 5; mark[8][2] = 1; mark[9][0] = 5; mark[9][1] = 0; mark[9][2] = 1; // Create a mesh with 10 vertices, 4 elements and 10 boundary // edges from the above data. Mesh mesh; mesh.create(nv, verts, nt, tris, nq, quads, nm, mark); // Create an H1 space with default shapeset. H1Space space(&mesh, NULL, NULL, P_INIT); // Set element poly orders. space.set_element_order(0, H2D_MAKE_QUAD_ORDER(o0, 1)); space.set_element_order(1, H2D_MAKE_QUAD_ORDER(o1, 1)); space.set_element_order(2, H2D_MAKE_QUAD_ORDER(o2, 1)); space.set_element_order(3, H2D_MAKE_QUAD_ORDER(o3, 1)); // Perform orthogonal projection in the H1 norm. Solution sln_approx; ExactSolution sln_exact(&mesh, init_cond); project_global(&space, H2D_H1_NORM, &sln_exact, &sln_approx); // Calculate the error. double err = calc_abs_error(&sln_approx, &sln_exact, H2D_H1_NORM); printf("\nMesh: %g, %g, %g, %g, %g\n", x0, x1, x2, x3, x4); printf("Poly degrees: %d, %d, %d, %d\n", o0, o1, o2, o3); printf("err = %g, err_squared = %g\n\n", err, err*err); /* // Visualise the solution and mesh. WinGeom* sln_win_geom = new WinGeom(0, 0, 440, 350); ScalarView sview("Solution", sln_win_geom); sview.show(&sln_approx); WinGeom* mesh_win_geom = new WinGeom(450, 0, 400, 350); OrderView oview("Mesh", mesh_win_geom); oview.show(&space); // Wait for all views to be closed. View::wait(); return 0; */ }
int main(int argc, char* argv[]) { // Initialize the library's global functions. Hermes2D hermes2D; // Read the command-line arguments. if (argc != 10) error("You must provide 5 real numbers (mesh vertices) and 4 integers (poly degrees)."); double x0 = atof(argv[1]); double x1 = atof(argv[2]); double x2 = atof(argv[3]); double x3 = atof(argv[4]); double x4 = atof(argv[5]); int o0 = atoi(argv[6]); int o1 = atoi(argv[7]); int o2 = atoi(argv[8]); int o3 = atoi(argv[9]); // Prepare mesh geometry. int nv = 10; double2 verts[10]; verts[0][0] = x0; verts[0][1] = 0; verts[1][0] = x1; verts[1][1] = 0; verts[2][0] = x2; verts[2][1] = 0; verts[3][0] = x3; verts[3][1] = 0; verts[4][0] = x4; verts[4][1] = 0; verts[5][0] = x0; verts[5][1] = 1; verts[6][0] = x1; verts[6][1] = 1; verts[7][0] = x2; verts[7][1] = 1; verts[8][0] = x3; verts[8][1] = 1; verts[9][0] = x4; verts[9][1] = 1; int nt = 0; int4* tris = NULL; int nq = 4; int5 quads[4]; quads[0][0] = 0; quads[0][1] = 1; quads[0][2] = 6; quads[0][3] = 5; quads[0][4] = 0; quads[1][0] = 1; quads[1][1] = 2; quads[1][2] = 7; quads[1][3] = 6; quads[1][4] = 0; quads[2][0] = 2; quads[2][1] = 3; quads[2][2] = 8; quads[2][3] = 7; quads[2][4] = 0; quads[3][0] = 3; quads[3][1] = 4; quads[3][2] = 9; quads[3][3] = 8; quads[3][4] = 0; int nm = 10; int3 mark[10]; mark[0][0] = 0; mark[0][1] = 1; mark[0][2] = 1; mark[1][0] = 1; mark[1][1] = 2; mark[1][2] = 1; mark[2][0] = 2; mark[2][1] = 3; mark[2][2] = 1; mark[3][0] = 3; mark[3][1] = 4; mark[3][2] = 1; mark[4][0] = 4; mark[4][1] = 9; mark[4][2] = 1; mark[5][0] = 9; mark[5][1] = 8; mark[5][2] = 1; mark[6][0] = 8; mark[6][1] = 7; mark[6][2] = 1; mark[7][0] = 7; mark[7][1] = 6; mark[7][2] = 1; mark[8][0] = 6; mark[8][1] = 5; mark[8][2] = 1; mark[9][0] = 5; mark[9][1] = 0; mark[9][2] = 1; // Create a mesh with 10 vertices, 4 elements and 10 boundary // edges from the above data. Mesh mesh; mesh.create(nv, verts, nt, tris, nq, quads, nm, mark); // Create an H1 space with default shapeset. H1Space space(&mesh, P_INIT); // Set element poly orders. space.set_element_order(0, H2D_MAKE_QUAD_ORDER(o0, 1)); space.set_element_order(1, H2D_MAKE_QUAD_ORDER(o1, 1)); space.set_element_order(2, H2D_MAKE_QUAD_ORDER(o2, 1)); space.set_element_order(3, H2D_MAKE_QUAD_ORDER(o3, 1)); // Perform orthogonal projection in the H1 norm. Solution sln_approx; CustomExactSolution sln_exact(&mesh, K); OGProjection::project_global(&space, &sln_exact, &sln_approx); // Calculate the error. double err = hermes2D.calc_abs_error(&sln_approx, &sln_exact, HERMES_H1_NORM); printf("\nMesh: %g, %g, %g, %g, %g\n", x0, x1, x2, x3, x4); printf("Poly degrees: %d, %d, %d, %d\n", o0, o1, o2, o3); printf("err = %g, err_squared = %g\n\n", err, err*err); // Mesh: 0, 1, 2, 3, 4 // Poly degrees: 10, 10, 10, 10 if ((err - 0.04381394) < 1E-6) { printf("Success!\n"); return ERR_SUCCESS; } else { printf("Failure!\n"); return ERR_FAILURE; } }
int main(int argc, char* argv[]) { // Read the command-line arguments. if (argc != 10) error("You must provide 5 real numbers (mesh vertices) and 4 integers (poly degrees)."); double x0 = atof(argv[1]); double x1 = atof(argv[2]); double x2 = atof(argv[3]); double x3 = atof(argv[4]); double x4 = atof(argv[5]); int o0 = atoi(argv[6]); int o1 = atoi(argv[7]); int o2 = atoi(argv[8]); int o3 = atoi(argv[9]); // Prepare mesh geometry. int nv = 10; double2 verts[10]; verts[0][0] = x0; verts[0][1] = 0; verts[1][0] = x1; verts[1][1] = 0; verts[2][0] = x2; verts[2][1] = 0; verts[3][0] = x3; verts[3][1] = 0; verts[4][0] = x4; verts[4][1] = 0; verts[5][0] = x0; verts[5][1] = 1; verts[6][0] = x1; verts[6][1] = 1; verts[7][0] = x2; verts[7][1] = 1; verts[8][0] = x3; verts[8][1] = 1; verts[9][0] = x4; verts[9][1] = 1; int nt = 0; int4* tris = NULL; int nq = 4; int5 quads[4]; quads[0][0] = 0; quads[0][1] = 1; quads[0][2] = 6; quads[0][3] = 5; quads[0][4] = 0; quads[1][0] = 1; quads[1][1] = 2; quads[1][2] = 7; quads[1][3] = 6; quads[1][4] = 0; quads[2][0] = 2; quads[2][1] = 3; quads[2][2] = 8; quads[2][3] = 7; quads[2][4] = 0; quads[3][0] = 3; quads[3][1] = 4; quads[3][2] = 9; quads[3][3] = 8; quads[3][4] = 0; int nm = 10; int3 mark[10]; mark[0][0] = 0; mark[0][1] = 1; mark[0][2] = 1; mark[1][0] = 1; mark[1][1] = 2; mark[1][2] = 1; mark[2][0] = 2; mark[2][1] = 3; mark[2][2] = 1; mark[3][0] = 3; mark[3][1] = 4; mark[3][2] = 1; mark[4][0] = 4; mark[4][1] = 9; mark[4][2] = 1; mark[5][0] = 9; mark[5][1] = 8; mark[5][2] = 1; mark[6][0] = 8; mark[6][1] = 7; mark[6][2] = 1; mark[7][0] = 7; mark[7][1] = 6; mark[7][2] = 1; mark[8][0] = 6; mark[8][1] = 5; mark[8][2] = 1; mark[9][0] = 5; mark[9][1] = 0; mark[9][2] = 1; // Create a mesh with 10 vertices, 4 elements and 10 boundary // edges from the above data. Mesh mesh; mesh.create(nv, verts, nt, tris, nq, quads, nm, mark); // Enter boundary markers. BCTypes bc_types; bc_types.add_bc_neumann(Hermes::Tuple<int>(BDY_LEFT_RIGHT, BDY_TOP_BOTTOM)); // Create an H1 space with default shapeset. H1Space space(&mesh, &bc_types, P_INIT); // Set element poly orders. space.set_element_order(0, H2D_MAKE_QUAD_ORDER(o0, 1)); space.set_element_order(1, H2D_MAKE_QUAD_ORDER(o1, 1)); space.set_element_order(2, H2D_MAKE_QUAD_ORDER(o2, 1)); space.set_element_order(3, H2D_MAKE_QUAD_ORDER(o3, 1)); // Perform orthogonal projection in the H1 norm. Solution sln_approx; ExactSolution sln_exact(&mesh, init_cond); OGProjection::project_global(&space, &sln_exact, &sln_approx); // Calculate the error. double err = calc_abs_error(&sln_approx, &sln_exact, HERMES_H1_NORM); printf("\nMesh: %g, %g, %g, %g, %g\n", x0, x1, x2, x3, x4); printf("Poly degrees: %d, %d, %d, %d\n", o0, o1, o2, o3); printf("err = %g, err_squared = %g\n\n", err, err*err); // Mesh: 0, 1, 2, 3, 4 // Poly degrees: 10, 10, 10, 10 // err = 2.11454e-09, err_squared = 4.47128e-18 if ((err - 2.11454e-09) < 1E-6) { // err was 2.11454e-09 at the time this test was created printf("Success!\n"); return ERR_SUCCESS; } else { printf("Failure!\n"); return ERR_FAILURE; } }