int main(int argc, char* argv[]) { info("Desired number of eigenvalues: %d.", NUMBER_OF_EIGENVALUES); // Load the mesh. Mesh mesh; H2DReader mloader; mloader.load("domain.mesh", &mesh); // Perform initial mesh refinements (optional). for (int i = 0; i < INIT_REF_NUM; i++) mesh.refine_all_elements(); // Enter boundary markers. BCTypes bc_types; bc_types.add_bc_dirichlet(Hermes::Tuple<int>(BDY_BOTTOM, BDY_RIGHT, BDY_TOP, BDY_LEFT)); // Enter Dirichlet boundary values. BCValues bc_values; bc_values.add_zero(Hermes::Tuple<int>(BDY_BOTTOM, BDY_RIGHT, BDY_TOP, BDY_LEFT)); // Create an H1 space with default shapeset. H1Space space(&mesh, &bc_types, &bc_values, P_INIT); int ndof = Space::get_num_dofs(&space); info("ndof: %d.", ndof); // Initialize the weak formulation for the left hand side, i.e., H. WeakForm wf_left, wf_right; wf_left.add_matrix_form(callback(bilinear_form_left)); wf_right.add_matrix_form(callback(bilinear_form_right)); // Initialize matrices. SparseMatrix* matrix_left = create_matrix(matrix_solver); SparseMatrix* matrix_right = create_matrix(matrix_solver); // Assemble the matrices. bool is_linear = true; DiscreteProblem dp_left(&wf_left, &space, is_linear); dp_left.assemble(matrix_left); DiscreteProblem dp_right(&wf_right, &space, is_linear); dp_right.assemble(matrix_right); // Write matrix_left in MatrixMarket format. write_matrix_mm("mat_left.mtx", matrix_left); // Write matrix_left in MatrixMarket format. write_matrix_mm("mat_right.mtx", matrix_right); // Calling Python eigensolver. Solution will be written to "eivecs.dat". info("Calling Pysparse..."); char call_cmd[255]; sprintf(call_cmd, "python solveGenEigenFromMtx.py mat_left.mtx mat_right.mtx %g %d %g %d", TARGET_VALUE, NUMBER_OF_EIGENVALUES, TOL, MAX_ITER); system(call_cmd); info("Pysparse finished."); // Initializing solution vector, solution and ScalarView. double* coeff_vec = new double[ndof]; Solution sln; ScalarView view("Solution", new WinGeom(0, 0, 440, 350)); // Reading solution vectors from file and visualizing. double* eigenval = new double[NUMBER_OF_EIGENVALUES]; FILE *file = fopen("eivecs.dat", "r"); char line [64]; // Maximum line size. fgets(line, sizeof line, file); // ndof int n = atoi(line); if (n != ndof) error("Mismatched ndof in the eigensolver output file."); fgets(line, sizeof line, file); // Number of eigenvectors in the file. int neig = atoi(line); if (neig != NUMBER_OF_EIGENVALUES) error("Mismatched number of eigenvectors in the eigensolver output file."); for (int ieig = 0; ieig < neig; ieig++) { // Get next eigenvalue from the file fgets(line, sizeof line, file); eigenval[ieig] = atof(line); // Get the corresponding eigenvector. for (int i = 0; i < ndof; i++) { fgets(line, sizeof line, file); coeff_vec[i] = atof(line); } // Convert coefficient vector into a Solution. Solution::vector_to_solution(coeff_vec, &space, &sln); // Visualize the solution. char title[100]; sprintf(title, "Solution %d, val = %g", ieig, eigenval[ieig]); view.set_title(title); view.show(&sln); // Wait for keypress. View::wait(HERMES_WAIT_KEYPRESS); } fclose(file); delete [] coeff_vec; return 0; };
int main(int argc, char* argv[]) { info("Desired number of eigenvalues: %d.", NUMBER_OF_EIGENVALUES); // Load the mesh. info("Loading and refining mesh..."); Mesh mesh; H3DReader mloader; mloader.load("hexahedron.mesh3d", &mesh); // Perform initial mesh refinements (optional). for (int i = 0; i < INIT_REF_NUM; i++) mesh.refine_all_elements(H3D_H3D_H3D_REFT_HEX_XYZ); // Create an H1 space with default shapeset. H1Space space(&mesh, bc_types, essential_bc_values, Ord3(P_INIT_X, P_INIT_Y, P_INIT_Z)); int ndof = Space::get_num_dofs(&space); info("ndof: %d.", ndof); // Initialize the weak formulation for the left hand side, i.e., H. info("Initializing weak form..."); WeakForm wf_left, wf_right; wf_left.add_matrix_form(bilinear_form_left, bilinear_form_left_ord, HERMES_SYM, HERMES_ANY ); wf_right.add_matrix_form(callback(bilinear_form_right), HERMES_SYM, HERMES_ANY ); // Initialize matrices and matrix solver. SparseMatrix* matrix_left = create_matrix(matrix_solver); SparseMatrix* matrix_right = create_matrix(matrix_solver); Solver* solver = create_linear_solver(matrix_solver, matrix_left); // Assemble the matrices. info("Assembling matrices..."); bool is_linear = true; DiscreteProblem dp_left(&wf_left, &space, is_linear); dp_left.assemble(matrix_left); DiscreteProblem dp_right(&wf_right, &space, is_linear); dp_right.assemble(matrix_right); // Write matrix_left in MatrixMarket format. write_matrix_mm("mat_left.mtx", matrix_left); // Write matrix_right in MatrixMarket format. write_matrix_mm("mat_right.mtx", matrix_right); // Calling Python eigensolver. Solution will be written to "eivecs.dat". info("Using eigensolver..."); char call_cmd[255]; sprintf(call_cmd, "python solveGenEigenFromMtx.py mat_left.mtx mat_right.mtx %g %d %g %d", TARGET_VALUE, NUMBER_OF_EIGENVALUES, TOL, MAX_ITER); system(call_cmd); // Initializing solution vector, solution and ScalarView. info("Initializing solution vector..."); double* coeff_vec = new double[ndof]; Solution sln(space.get_mesh()); // Reading solution vectors from file and visualizing. info("Reading solution vectors from file and saving as solutions in paraview format..."); FILE *file = fopen("eivecs.dat", "r"); char line [64]; // Maximum line size. fgets(line, sizeof line, file); // ndof int n = atoi(line); if (n != ndof) error("Mismatched ndof in the eigensolver output file."); fgets(line, sizeof line, file); // Number of eigenvectors in the file. int neig = atoi(line); if (neig != NUMBER_OF_EIGENVALUES) error("Mismatched number of eigenvectors in the eigensolver output file."); for (int ieig = 0; ieig < neig; ieig++) { // Get next eigenvector from the file. for (int i = 0; i < ndof; i++) { fgets(line, sizeof line, file); coeff_vec[i] = atof(line); } // Convert coefficient vector into a Solution. Solution::vector_to_solution(coeff_vec, &space, &sln); out_fn_vtk(&sln, "sln", ieig ); } fclose(file); delete [] coeff_vec; return 0; };