Example #1
0
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;
}
Example #2
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;
  }
}
Example #3
0
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;
  */
}
Example #4
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;
  }
}
Example #5
0
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;
    }
}