Esempio n. 1
0
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));
		}
	}
}
Esempio n. 2
0
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));
		}
	}
}