summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/solver/nld_solver.cpp
diff options
context:
space:
mode:
author couriersud <couriersud@arcor.de>2016-04-15 02:00:15 +0200
committer couriersud <couriersud@arcor.de>2016-04-15 02:09:41 +0200
commitd9df811529f5858a0ae737ad5dee3aecf496bfec (patch)
tree2e9ff0f3df741d33d1911af86c5517099ce11f8f /src/lib/netlist/solver/nld_solver.cpp
parentcd0441b678487ce3f2b34eeed57f253b1621d76c (diff)
Significant speed improvement:
- added a new solver using compressed row format - fixed sorting As a result, netlist performance on kidniki nearly doubled. The performance increase is mainly due to the fact that sorting decreases the number of operations for gaussian elimination of the kidniki matrix from ~7800 to 707. In addition, compressed row format improves L1 usage. [Couriersud]
Diffstat (limited to 'src/lib/netlist/solver/nld_solver.cpp')
-rw-r--r--src/lib/netlist/solver/nld_solver.cpp22
1 files changed, 13 insertions, 9 deletions
diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp
index 216a2566c05..5924966efa2 100644
--- a/src/lib/netlist/solver/nld_solver.cpp
+++ b/src/lib/netlist/solver/nld_solver.cpp
@@ -43,7 +43,7 @@
#if 1
#include "nld_ms_direct.h"
-//#include "nld_ms_gcr.h"
+#include "nld_ms_gcr.h"
#else
#include "nld_ms_direct_lu.h"
#endif
@@ -223,7 +223,7 @@ ATTR_COLD void matrix_solver_t::setup_matrix()
pfree(m_rails_temp[k]); // no longer needed
m_rails_temp.clear();
-#if 0
+#if 1
/* Sort in descending order by number of connected matrix voltages.
* The idea is, that for Gauss-Seidel algo the first voltage computed
@@ -245,15 +245,15 @@ ATTR_COLD void matrix_solver_t::setup_matrix()
*
*/
- int sort_order = (type() == GAUSS_SEIDEL ? 1 : -1) * -1;
+ int sort_order = -1;//(type() == GAUSS_SEIDEL ? 1 : -1);
- for (unsigned k = 0; k < iN / 2; k++)
- for (unsigned i = 0; i < iN - 1; i++)
+ for (unsigned k = 0; k < iN - 1; k++)
+ for (unsigned i = k+1; i < iN; i++)
{
- if ((m_terms[i]->m_railstart - m_terms[i+1]->m_railstart) * sort_order < 0)
+ if (((int) m_terms[k]->m_railstart - (int) m_terms[i]->m_railstart) * sort_order < 0)
{
- std::swap(m_terms[i], m_terms[i+1]);
- std::swap(m_nets[i], m_nets[i+1]);
+ std::swap(m_terms[i], m_terms[k]);
+ std::swap(m_nets[i], m_nets[k]);
}
}
@@ -720,10 +720,14 @@ matrix_solver_t * NETLIB_NAME(solver)::create_solver(int size, const bool use_sp
typedef matrix_solver_SOR_mat_t<m_N,_storage_N> solver_sor_mat;
return palloc(solver_sor_mat(&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(&m_params, size));
+ }
else if (pstring("MAT").equals(m_iterative_solver))
{
typedef matrix_solver_direct_t<m_N,_storage_N> solver_mat;
- //typedef matrix_solver_GCR_t<m_N,_storage_N> solver_mat;
return palloc(solver_mat(&m_params, size));
}
else if (pstring("SM").equals(m_iterative_solver))