Remove parameter GS_THRESHOLD. It is now outdated. (nw)

master
couriersud 2017-01-08 00:51:37 +01:00
parent ff820d6fa9
commit d790daa2a7
9 changed files with 49 additions and 56 deletions

View File

@ -46,7 +46,6 @@ NETLIST_START(dummy)
PARAM(Solver.NR_LOOPS, 9000)
PARAM(Solver.SOR_FACTOR, 0.001)
PARAM(Solver.GS_LOOPS, 1)
//PARAM(Solver.GS_THRESHOLD, 99)
PARAM(Solver.ITERATIVE, "MAT_CR")
#if USE_OPTMIZATIONS

View File

@ -13,7 +13,6 @@ NETLIST_START(dummy)
PARAM(Solver.ACCURACY, 1e-8)
PARAM(Solver.NR_LOOPS, 300)
PARAM(Solver.GS_LOOPS, 1)
PARAM(Solver.GS_THRESHOLD, 6)
//PARAM(Solver.ITERATIVE, "W")
PARAM(Solver.ITERATIVE, "MAT_CR")
//PARAM(Solver.ITERATIVE, "MAT")

View File

@ -18,7 +18,6 @@ NETLIST_START(main)
PARAM(Solver.SOR_FACTOR, 1.0)
//PARAM(Solver.CONVERG, 1.0)
PARAM(Solver.GS_LOOPS, 5)
PARAM(Solver.GS_THRESHOLD, 5)
SUBMODEL(op1, opamp_fast)
/* Wired as non - inverting amplifier like in LM3900 datasheet */

View File

@ -18,7 +18,6 @@ NETLIST_START(main)
PARAM(Solver.NR_LOOPS, 30000 )
//PARAM(Solver.CONVERG, 1.0)
PARAM(Solver.GS_LOOPS, 30)
PARAM(Solver.GS_THRESHOLD, 99)
// Tie up +5 to opamps thought it's not currently needed
// Stay compatible

View File

@ -130,6 +130,13 @@ NETLIB_UPDATE(solver)
}
}
template <class C>
std::unique_ptr<matrix_solver_t> create_it(netlist_t &nl, pstring name, solver_parameters_t &params, unsigned size)
{
typedef C solver;
return plib::make_unique<solver>(nl, name, &params, size);
}
template <int m_N, int storage_N>
std::unique_ptr<matrix_solver_t> NETLIB_NAME(solver)::create_solver(unsigned size, const bool use_specific)
{
@ -140,55 +147,48 @@ std::unique_ptr<matrix_solver_t> NETLIB_NAME(solver)::create_solver(unsigned siz
return plib::make_unique<matrix_solver_direct2_t>(netlist(), solvername, &m_params);
else
{
if (static_cast<int>(size) >= m_gs_threshold())
if (pstring("SOR_MAT").equals(m_iterative_solver()))
{
if (pstring("SOR_MAT").equals(m_iterative_solver()))
{
typedef matrix_solver_SOR_mat_t<m_N,storage_N> solver_sor_mat;
return plib::make_unique<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 plib::make_unique<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 plib::make_unique<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 plib::make_unique<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 plib::make_unique<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 plib::make_unique<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 plib::make_unique<solver_GMRES>(netlist(), solvername, &m_params, size);
}
else
{
netlist().log().fatal("Unknown solver type: {1}\n", m_iterative_solver());
return nullptr;
}
return create_it<matrix_solver_SOR_mat_t<m_N, storage_N>>(netlist(), solvername, m_params, size);
//typedef matrix_solver_SOR_mat_t<m_N,storage_N> solver_sor_mat;
//return plib::make_unique<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 plib::make_unique<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 plib::make_unique<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 plib::make_unique<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 plib::make_unique<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 plib::make_unique<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 plib::make_unique<solver_GMRES>(netlist(), solvername, &m_params, size);
}
else
{
typedef matrix_solver_direct_t<m_N,storage_N> solver_D;
return plib::make_unique<solver_D>(netlist(), solvername, &m_params, size);
netlist().log().fatal("Unknown solver type: {1}\n", m_iterative_solver());
return nullptr;
}
}
}
@ -297,6 +297,7 @@ void NETLIB_NAME(solver)::post_start()
switch (net_count)
{
#if 1
case 1:
ms = create_solver<1,1>(1, use_specific);
break;
@ -343,6 +344,7 @@ void NETLIB_NAME(solver)::post_start()
case 87:
ms = create_solver<87,87>(87, use_specific);
break;
#endif
#endif
default:
netlist().log().warning("No specific solver found for netlist of size {1}", net_count);
@ -354,7 +356,8 @@ void NETLIB_NAME(solver)::post_start()
{
ms = create_solver<0,32>(net_count, use_specific);
}
else if (net_count <= 64)
else
if (net_count <= 64)
{
ms = create_solver<0,64>(net_count, use_specific);
}

View File

@ -49,7 +49,6 @@ NETLIB_OBJECT(solver)
, m_sor(*this, "SOR_FACTOR", 1.059)
, m_iterative_solver(*this, "ITERATIVE", "SOR")
, m_accuracy(*this, "ACCURACY", 1e-7)
, m_gs_threshold(*this, "GS_THRESHOLD", 6) // below this value, gaussian elimination is used
, m_gs_loops(*this, "GS_LOOPS",9) // Gauss-Seidel loops
/* general parameters */
@ -92,7 +91,6 @@ protected:
param_double_t m_sor;
param_str_t m_iterative_solver;
param_double_t m_accuracy;
param_int_t m_gs_threshold;
param_int_t m_gs_loops;
param_double_t m_gmin;
param_logic_t m_pivot;

View File

@ -313,7 +313,6 @@ NETLIST_START(kidniki)
PARAM(Solver.ACCURACY, 1e-8)
PARAM(Solver.NR_LOOPS, 300)
PARAM(Solver.GS_LOOPS, 1)
PARAM(Solver.GS_THRESHOLD, 6)
//PARAM(Solver.ITERATIVE, "SOR")
PARAM(Solver.ITERATIVE, "MAT_CR")
//PARAM(Solver.ITERATIVE, "GMRES")

View File

@ -220,7 +220,6 @@ NETLIST_START(mario)
SOLVER(Solver, 48000)
PARAM(Solver.ACCURACY, 1e-6)
PARAM(Solver.SOR_FACTOR, 1.0)
PARAM(Solver.GS_THRESHOLD, 5)
PARAM(Solver.GS_LOOPS, 1)
/* Dynamic timestepping avoids excessive newton loops on startup */
PARAM(Solver.DYNAMIC_LTE, 5e-2)

View File

@ -91,11 +91,9 @@ CIRCUIT_LAYOUT( breakout )
#if (SLOW_BUT_ACCURATE)
SOLVER(Solver, 48000)
PARAM(Solver.ACCURACY, 1e-8) // less accuracy and diode will not work
PARAM(Solver.GS_THRESHOLD, 6)
#else
SOLVER(Solver, 48000)
PARAM(Solver.ACCURACY, 1e-6)
PARAM(Solver.GS_THRESHOLD, 6)
PARAM(Solver.DYNAMIC_TS, 0)
//PARAM(Solver.LTE, 1e-10)
PARAM(Solver.MIN_TIMESTEP, 1e-8)