Simplify solver infrastructure.

This commit is contained in:
couriersud 2016-04-18 18:31:43 +02:00
parent 222adaf847
commit 4bf89be02c
9 changed files with 38 additions and 66 deletions

View File

@ -76,13 +76,14 @@ public:
typedef pvector_t<matrix_solver_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<NL_DEBUG> &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 <typename T>

View File

@ -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<m_N, _storage_N>::vsolve_non_dynamic(const boo
template <unsigned m_N, unsigned _storage_N>
matrix_solver_direct_t<m_N, _storage_N>::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<m_N, _storage_N>::matrix_solver_direct_t(const solver_par
}
template <unsigned m_N, unsigned _storage_N>
matrix_solver_direct_t<m_N, _storage_N>::matrix_solver_direct_t(const eSolverType type, const solver_parameters_t *params, const int size)
: matrix_solver_t(type, params)
matrix_solver_direct_t<m_N, _storage_N>::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)

View File

@ -29,7 +29,7 @@ class matrix_solver_GCR_t: public matrix_solver_direct_t<m_N, _storage_N>
public:
matrix_solver_GCR_t(const solver_parameters_t *params, int size)
: matrix_solver_direct_t<m_N, _storage_N>(matrix_solver_t::GAUSSIAN_ELIMINATION, params, size)
: matrix_solver_direct_t<m_N, _storage_N>(matrix_solver_t::ASCENDING, params, size)
{
}

View File

@ -27,7 +27,7 @@ class matrix_solver_GMRES_t: public matrix_solver_direct_t<m_N, _storage_N>
public:
matrix_solver_GMRES_t(const solver_parameters_t *params, int size)
: matrix_solver_direct_t<m_N, _storage_N>(matrix_solver_t::GAUSSIAN_ELIMINATION, params, size)
: matrix_solver_direct_t<m_N, _storage_N>(matrix_solver_t::ASCENDING, params, size)
, m_use_iLU_preconditioning(true)
, m_use_more_precise_stop_condition(false)
, m_accuracy_mult(1.0)

View File

@ -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<m_N, _storage_N>::vsolve_non_dynamic(const bool ne
template <unsigned m_N, unsigned _storage_N>
matrix_solver_sm_t<m_N, _storage_N>::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 <unsigned m_N, unsigned _storage_N>
matrix_solver_sm_t<m_N, _storage_N>::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)

View File

@ -25,7 +25,7 @@ class matrix_solver_SOR_t: public matrix_solver_direct_t<m_N, _storage_N>
public:
matrix_solver_SOR_t(const solver_parameters_t *params, int size)
: matrix_solver_direct_t<m_N, _storage_N>(matrix_solver_t::GAUSS_SEIDEL, params, size)
: matrix_solver_direct_t<m_N, _storage_N>(matrix_solver_t::DESCENDING, params, size)
, m_lp_fact(0)
{
}

View File

@ -29,7 +29,7 @@ class matrix_solver_SOR_mat_t: public matrix_solver_direct_t<m_N, _storage_N>
public:
matrix_solver_SOR_mat_t(const solver_parameters_t *params, int size)
: matrix_solver_direct_t<m_N, _storage_N>(matrix_solver_t::GAUSS_SEIDEL, params, size)
: matrix_solver_direct_t<m_N, _storage_N>(matrix_solver_t::DESCENDING, params, size)
, m_omega(params->m_sor)
, m_lp_fact(0)
, m_gs_fail(0)

View File

@ -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<m_N, _storage_N>::vsolve_non_dynamic(const bool new
template <unsigned m_N, unsigned _storage_N>
matrix_solver_w_t<m_N, _storage_N>::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<m_N, _storage_N>::matrix_solver_w_t(const solver_parameters_t
}
}
template <unsigned m_N, unsigned _storage_N>
matrix_solver_w_t<m_N, _storage_N>::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_ */

View File

@ -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++)