int main(int argc, char *argv[]) { MPI_Init(&argc, &argv); typedef rokko::grid_row_major grid_major; typedef rokko::matrix_col_major matrix_major; //typedef rokko::matrix_row_major matrix_major; rokko::solver solver("scalapack"); solver.initialize(argc, argv); MPI_Comm comm = MPI_COMM_WORLD; rokko::grid<grid_major> g(comm); int myrank = g.myrank; const int root = 0; const int dim = 10; rokko::distributed_matrix<matrix_major> mat(dim, dim, g); rokko::generate_frank_matrix(mat); mat.print(); Eigen::MatrixXd global_mat; rokko::gather(mat, global_mat, root); if (myrank == root) std::cout << "global_mat:" << std::endl << global_mat << std::endl; Eigen::VectorXd w(dim); rokko::distributed_matrix<matrix_major> Z(dim, dim, g); //, true); solver.diagonalize(mat, w, Z); // gather of eigenvectors Eigen::MatrixXd eigvec_global; Eigen::MatrixXd eigvec_sorted(dim, dim); Eigen::VectorXd eigval_sorted(dim); rokko::gather(Z, eigvec_global, root); Z.print(); if (myrank == root) { std::cout << "eigvec:" << std::endl << eigvec_global << std::endl; } std::cout.precision(20); /* std::cout << "w=" << std::endl; for (int i=0; i<dim; ++i) { std::cout << w[i] << " "; } std::cout << std::endl; */ if (myrank == root) { rokko::sort_eigenpairs(w, eigvec_global, eigval_sorted, eigvec_sorted); std::cout << "Computed Eigenvalues= " << eigval_sorted.transpose() << std::endl; std::cout.precision(3); std::cout << "Check the orthogonality of Eigenvectors:" << std::endl << eigvec_sorted * eigvec_sorted.transpose() << std::endl; // Is it equal to indentity matrix? //<< eigvec_global.transpose() * eigvec_global << std::endl; // Is it equal to indentity matrix? std::cout << "residual := A x - lambda x = " << std::endl << global_mat * eigvec_sorted.col(1) - eigval_sorted(1) * eigvec_sorted.col(1) << std::endl; std::cout << "Are all the following values equal to some eigenvalue = " << std::endl << (global_mat * eigvec_sorted.col(0)).array() / eigvec_sorted.col(0).array() << std::endl; //cout << "global_matrix=" << std::endl << global_matrix << std::endl; } /* double time; if (rank == 0) { time = end - start; std::cout << "time=" << time << std::endl; ofs << "time=" << time << std::endl; //cout << "iter=" << iter << std::endl; //ofs << "iter=" << iter << std::endl; } */ solver.finalize(); MPI_Finalize(); return 0; }
int main(int argc, char *argv[]) { MPI_Init(&argc, &argv); //typedef rokko::matrix_row_major matrix_major; typedef rokko::matrix_col_major matrix_major; if (argc <= 2) { std::cerr << "error: " << argv[0] << " solver_name alps_parameter_file_name" << std::endl; MPI_Abort(MPI_COMM_WORLD, 34); } std::string solver_name(argv[1]); std::ifstream ifs(argv[2]); alps::Parameters params(ifs); std::ostream& out = std::cout; barista::Hamiltonian<> hamiltonian(params); int dim = hamiltonian.dimension(); rokko::parallel_dense_solver solver(solver_name); solver.initialize(argc, argv); MPI_Comm comm = MPI_COMM_WORLD; rokko::grid g(comm, rokko::grid_col_major); int myrank = g.get_myrank(); const int root = 0; rokko::distributed_matrix<matrix_major> mat(dim, dim, g, solver); hamiltonian.fill(mat); mat.print(); rokko::localized_matrix<matrix_major> lmat(dim, dim); rokko::gather(mat, lmat, root); if (myrank == root) std::cout << "lmat:" << std::endl << lmat << std::endl; rokko::localized_vector w(dim); rokko::distributed_matrix<matrix_major> Z(dim, dim, g, solver); try { solver.diagonalize(mat, w, Z); } catch (const char *e) { std::cout << "Exception : " << e << std::endl; MPI_Abort(MPI_COMM_WORLD, 22); } // gather of eigenvectors rokko::localized_matrix<matrix_major> eigvec_global; rokko::localized_matrix<matrix_major> eigvec_sorted(dim, dim); rokko::localized_vector eigval_sorted(dim); rokko::gather(Z, eigvec_global, root); Z.print(); if (myrank == root) { std::cout << "eigvec:" << std::endl << eigvec_global << std::endl; } std::cout.precision(20); /* std::cout << "w=" << std::endl; for (int i=0; i<dim; ++i) { std::cout << w[i] << " "; } std::cout << std::endl; */ if (myrank == root) { rokko::sort_eigenpairs(w, eigvec_global, eigval_sorted, eigvec_sorted); std::cout << "Computed Eigenvalues= " << eigval_sorted.transpose() << std::endl; std::cout.precision(3); std::cout << "Check the orthogonality of Eigenvectors:" << std::endl << eigvec_sorted * eigvec_sorted.transpose() << std::endl; // Is it equal to indentity matrix? //<< eigvec_global.transpose() * eigvec_global << std::endl; // Is it equal to indentity matrix? std::cout << "residual := A x - lambda x = " << std::endl << lmat * eigvec_sorted.col(1) - eigval_sorted(1) * eigvec_sorted.col(1) << std::endl; std::cout << "Are all the following values equal to some eigenvalue = " << std::endl << (lmat * eigvec_sorted.col(0)).array() / eigvec_sorted.col(0).array() << std::endl; //cout << "lmat=" << std::endl << lmat << std::endl; } solver.finalize(); MPI_Finalize(); return 0; }