matrix_solver_t * NETLIB_NAME(solver)::create_solver(int size, const bool use_specific) { if (use_specific && m_N == 1) return palloc(matrix_solver_direct1_t(&m_params)); else if (use_specific && m_N == 2) return palloc(matrix_solver_direct2_t(&m_params)); else { if (size >= m_gs_threshold) { if (pstring("SOR_MAT").equals(m_iterative_solver)) { typedef matrix_solver_SOR_mat_t<m_N,_storage_N> solver_mat; return palloc(solver_mat(&m_params, size)); } else if (pstring("SOR").equals(m_iterative_solver)) { typedef matrix_solver_SOR_t<m_N,_storage_N> solver_GS; return palloc(solver_GS(&m_params, size)); } else if (pstring("GMRES").equals(m_iterative_solver)) { typedef matrix_solver_GMRES_t<m_N,_storage_N> solver_GMRES; return palloc(solver_GMRES(&m_params, size)); } else { netlist().log().fatal("Unknown solver type: {1}\n", m_iterative_solver.Value()); return NULL; } } else { typedef matrix_solver_direct_t<m_N,_storage_N> solver_D; return palloc(solver_D(&m_params, size)); } } }
matrix_solver_t * NETLIB_NAME(solver)::create_solver(int size, const bool use_specific) { pstring solvername = pfmt("Solver_{1}")(m_mat_solvers.size()); if (use_specific && m_N == 1) return palloc(matrix_solver_direct1_t(netlist(), solvername, &m_params)); else if (use_specific && m_N == 2) return palloc(matrix_solver_direct2_t(netlist(), solvername, &m_params)); else { if (size >= m_gs_threshold) { if (pstring("SOR_MAT").equals(m_iterative_solver)) { typedef matrix_solver_SOR_mat_t<m_N,_storage_N> solver_sor_mat; return palloc(solver_sor_mat(netlist(), solvername, &m_params, size)); } else if (pstring("MAT_CR").equals(m_iterative_solver)) { typedef matrix_solver_GCR_t<m_N,_storage_N> solver_mat; return palloc(solver_mat(netlist(), solvername, &m_params, size)); } else if (pstring("MAT").equals(m_iterative_solver)) { typedef matrix_solver_direct_t<m_N,_storage_N> solver_mat; return palloc(solver_mat(netlist(), solvername, &m_params, size)); } else if (pstring("SM").equals(m_iterative_solver)) { /* Sherman-Morrison Formula */ typedef matrix_solver_sm_t<m_N,_storage_N> solver_mat; return palloc(solver_mat(netlist(), solvername, &m_params, size)); } else if (pstring("W").equals(m_iterative_solver)) { /* Woodbury Formula */ typedef matrix_solver_w_t<m_N,_storage_N> solver_mat; return palloc(solver_mat(netlist(), solvername, &m_params, size)); } else if (pstring("SOR").equals(m_iterative_solver)) { typedef matrix_solver_SOR_t<m_N,_storage_N> solver_GS; return palloc(solver_GS(netlist(), solvername, &m_params, size)); } else if (pstring("GMRES").equals(m_iterative_solver)) { typedef matrix_solver_GMRES_t<m_N,_storage_N> solver_GMRES; return palloc(solver_GMRES(netlist(), solvername, &m_params, size)); } else { netlist().log().fatal("Unknown solver type: {1}\n", m_iterative_solver.Value()); return nullptr; } } else { typedef matrix_solver_direct_t<m_N,_storage_N> solver_D; return palloc(solver_D(netlist(), solvername, &m_params, size)); } } }