diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h index f778a7e61f5..80c932823e9 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.h +++ b/src/lib/netlist/solver/nld_matrix_solver.h @@ -76,13 +76,14 @@ public: typedef pvector_t list_t; typedef core_device_t::list_t dev_list_t; - enum eSolverType + enum eSortType { - GAUSSIAN_ELIMINATION, - GAUSS_SEIDEL + NOSORT, + ASCENDING, + DESCENDING }; - matrix_solver_t(const eSolverType type, const solver_parameters_t *params); + matrix_solver_t(const eSortType sort, const solver_parameters_t *params); virtual ~matrix_solver_t(); void setup(analog_net_t::list_t &nets) { vsetup(nets); } @@ -107,7 +108,6 @@ public: ATTR_COLD int get_net_idx(net_t *net); - eSolverType type() const { return m_type; } plog_base &log() { return netlist().log(); } virtual void log_stats(); @@ -165,7 +165,7 @@ private: void update_inputs(); - const eSolverType m_type; + const eSortType m_sort; }; template diff --git a/src/lib/netlist/solver/nld_ms_direct.h b/src/lib/netlist/solver/nld_ms_direct.h index d87befca7c5..ee3f3cfecb9 100644 --- a/src/lib/netlist/solver/nld_ms_direct.h +++ b/src/lib/netlist/solver/nld_ms_direct.h @@ -122,7 +122,7 @@ class matrix_solver_direct_t: public matrix_solver_t public: matrix_solver_direct_t(const solver_parameters_t *params, const int size); - matrix_solver_direct_t(const eSolverType type, const solver_parameters_t *params, const int size); + matrix_solver_direct_t(const eSortType sort, const solver_parameters_t *params, const int size); virtual ~matrix_solver_direct_t(); @@ -1022,7 +1022,7 @@ inline int matrix_solver_direct_t::vsolve_non_dynamic(const boo template matrix_solver_direct_t::matrix_solver_direct_t(const solver_parameters_t *params, const int size) -: matrix_solver_t(GAUSSIAN_ELIMINATION, params) +: matrix_solver_t(ASCENDING, params) , m_dim(size) { #if (NL_USE_DYNAMIC_ALLOCATION) @@ -1038,8 +1038,8 @@ matrix_solver_direct_t::matrix_solver_direct_t(const solver_par } template -matrix_solver_direct_t::matrix_solver_direct_t(const eSolverType type, const solver_parameters_t *params, const int size) -: matrix_solver_t(type, params) +matrix_solver_direct_t::matrix_solver_direct_t(const eSortType sort, const solver_parameters_t *params, const int size) +: matrix_solver_t(sort, params) , m_dim(size) { #if (NL_USE_DYNAMIC_ALLOCATION) diff --git a/src/lib/netlist/solver/nld_ms_gcr.h b/src/lib/netlist/solver/nld_ms_gcr.h index 47ad4259475..9aecb3ba8fe 100644 --- a/src/lib/netlist/solver/nld_ms_gcr.h +++ b/src/lib/netlist/solver/nld_ms_gcr.h @@ -29,7 +29,7 @@ class matrix_solver_GCR_t: public matrix_solver_direct_t public: matrix_solver_GCR_t(const solver_parameters_t *params, int size) - : matrix_solver_direct_t(matrix_solver_t::GAUSSIAN_ELIMINATION, params, size) + : matrix_solver_direct_t(matrix_solver_t::ASCENDING, params, size) { } diff --git a/src/lib/netlist/solver/nld_ms_gmres.h b/src/lib/netlist/solver/nld_ms_gmres.h index 8c47f67e2b4..8663da061d6 100644 --- a/src/lib/netlist/solver/nld_ms_gmres.h +++ b/src/lib/netlist/solver/nld_ms_gmres.h @@ -27,7 +27,7 @@ class matrix_solver_GMRES_t: public matrix_solver_direct_t public: matrix_solver_GMRES_t(const solver_parameters_t *params, int size) - : matrix_solver_direct_t(matrix_solver_t::GAUSSIAN_ELIMINATION, params, size) + : matrix_solver_direct_t(matrix_solver_t::ASCENDING, params, size) , m_use_iLU_preconditioning(true) , m_use_more_precise_stop_condition(false) , m_accuracy_mult(1.0) diff --git a/src/lib/netlist/solver/nld_ms_sm.h b/src/lib/netlist/solver/nld_ms_sm.h index fa9e23233e4..f83240c789a 100644 --- a/src/lib/netlist/solver/nld_ms_sm.h +++ b/src/lib/netlist/solver/nld_ms_sm.h @@ -53,7 +53,6 @@ class matrix_solver_sm_t: public matrix_solver_t public: matrix_solver_sm_t(const solver_parameters_t *params, const int size); - matrix_solver_sm_t(const eSolverType type, const solver_parameters_t *params, const int size); virtual ~matrix_solver_sm_t(); @@ -326,21 +325,7 @@ inline int matrix_solver_sm_t::vsolve_non_dynamic(const bool ne template matrix_solver_sm_t::matrix_solver_sm_t(const solver_parameters_t *params, const int size) -: matrix_solver_t(GAUSSIAN_ELIMINATION, params) -, m_dim(size) -{ -#if (NL_USE_DYNAMIC_ALLOCATION) - m_A = palloc_array(nl_ext_double, N() * m_pitch); -#endif - for (unsigned k = 0; k < N(); k++) - { - m_last_RHS[k] = 0.0; - } -} - -template -matrix_solver_sm_t::matrix_solver_sm_t(const eSolverType type, const solver_parameters_t *params, const int size) -: matrix_solver_t(type, params) +: matrix_solver_t(NOSORT, params) , m_dim(size) { #if (NL_USE_DYNAMIC_ALLOCATION) diff --git a/src/lib/netlist/solver/nld_ms_sor.h b/src/lib/netlist/solver/nld_ms_sor.h index 801f2efa1a0..aa824263b81 100644 --- a/src/lib/netlist/solver/nld_ms_sor.h +++ b/src/lib/netlist/solver/nld_ms_sor.h @@ -25,7 +25,7 @@ class matrix_solver_SOR_t: public matrix_solver_direct_t public: matrix_solver_SOR_t(const solver_parameters_t *params, int size) - : matrix_solver_direct_t(matrix_solver_t::GAUSS_SEIDEL, params, size) + : matrix_solver_direct_t(matrix_solver_t::DESCENDING, params, size) , m_lp_fact(0) { } diff --git a/src/lib/netlist/solver/nld_ms_sor_mat.h b/src/lib/netlist/solver/nld_ms_sor_mat.h index 4c6ceee1eb1..b57ba3cded1 100644 --- a/src/lib/netlist/solver/nld_ms_sor_mat.h +++ b/src/lib/netlist/solver/nld_ms_sor_mat.h @@ -29,7 +29,7 @@ class matrix_solver_SOR_mat_t: public matrix_solver_direct_t public: matrix_solver_SOR_mat_t(const solver_parameters_t *params, int size) - : matrix_solver_direct_t(matrix_solver_t::GAUSS_SEIDEL, params, size) + : matrix_solver_direct_t(matrix_solver_t::DESCENDING, params, size) , m_omega(params->m_sor) , m_lp_fact(0) , m_gs_fail(0) diff --git a/src/lib/netlist/solver/nld_ms_w.h b/src/lib/netlist/solver/nld_ms_w.h index bfb55989765..fe7a4389566 100644 --- a/src/lib/netlist/solver/nld_ms_w.h +++ b/src/lib/netlist/solver/nld_ms_w.h @@ -59,7 +59,6 @@ class matrix_solver_w_t: public matrix_solver_t public: matrix_solver_w_t(const solver_parameters_t *params, const int size); - matrix_solver_w_t(const eSolverType type, const solver_parameters_t *params, const int size); virtual ~matrix_solver_w_t(); @@ -391,7 +390,7 @@ inline int matrix_solver_w_t::vsolve_non_dynamic(const bool new template matrix_solver_w_t::matrix_solver_w_t(const solver_parameters_t *params, const int size) -: matrix_solver_t(GAUSSIAN_ELIMINATION, params) +: matrix_solver_t(NOSORT, params) ,m_cnt(0) , m_dim(size) { @@ -401,18 +400,6 @@ matrix_solver_w_t::matrix_solver_w_t(const solver_parameters_t } } -template -matrix_solver_w_t::matrix_solver_w_t(const eSolverType type, const solver_parameters_t *params, const int size) -: matrix_solver_t(type, params) -,m_cnt(0) -, m_dim(size) -{ - for (unsigned k = 0; k < N(); k++) - { - m_last_RHS[k] = 0.0; - } -} - NETLIB_NAMESPACE_DEVICES_END() #endif /* NLD_MS_DIRECT_H_ */ diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index 95b4f0077d0..da04a62eb8a 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -94,7 +94,7 @@ ATTR_COLD void terms_t::set_pointers() // matrix_solver // ---------------------------------------------------------------------------------------- -ATTR_COLD matrix_solver_t::matrix_solver_t(const eSolverType type, const solver_parameters_t *params) +ATTR_COLD matrix_solver_t::matrix_solver_t(const eSortType sort, const solver_parameters_t *params) : m_stat_calculations(0), m_stat_newton_raphson(0), m_stat_vsolver_calls(0), @@ -102,7 +102,7 @@ ATTR_COLD matrix_solver_t::matrix_solver_t(const eSolverType type, const solver_ m_iterative_total(0), m_params(*params), m_cur_ts(0), - m_type(type) + m_sort(sort) { } @@ -223,7 +223,6 @@ ATTR_COLD void matrix_solver_t::setup_matrix() pfree(m_rails_temp[k]); // no longer needed m_rails_temp.clear(); -#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,27 +244,28 @@ ATTR_COLD void matrix_solver_t::setup_matrix() * */ - int sort_order = -1;//(type() == GAUSS_SEIDEL ? 1 : -1); - - for (unsigned k = 0; k < iN - 1; k++) - for (unsigned i = k+1; i < iN; i++) - { - if (((int) m_terms[k]->m_railstart - (int) m_terms[i]->m_railstart) * sort_order < 0) - { - std::swap(m_terms[i], m_terms[k]); - std::swap(m_nets[i], m_nets[k]); - } - } - - for (unsigned k = 0; k < iN; k++) + if (m_sort != NOSORT) { - int *other = m_terms[k]->net_other(); - for (unsigned i = 0; i < m_terms[k]->count(); i++) - if (other[i] != -1) - other[i] = get_net_idx(&m_terms[k]->terms()[i]->m_otherterm->net()); - } + int sort_order = (m_sort == DESCENDING ? 1 : -1); -#endif + for (unsigned k = 0; k < iN - 1; k++) + for (unsigned i = k+1; i < iN; i++) + { + if (((int) m_terms[k]->m_railstart - (int) m_terms[i]->m_railstart) * sort_order < 0) + { + std::swap(m_terms[i], m_terms[k]); + std::swap(m_nets[i], m_nets[k]); + } + } + + for (unsigned k = 0; k < iN; k++) + { + int *other = m_terms[k]->net_other(); + for (unsigned i = 0; i < m_terms[k]->count(); i++) + if (other[i] != -1) + other[i] = get_net_idx(&m_terms[k]->terms()[i]->m_otherterm->net()); + } + } /* create a list of non zero elements. */ for (unsigned k = 0; k < iN; k++)