mirror of
https://github.com/holub/mame
synced 2025-04-20 15:32:45 +03:00
Simplify solver infrastructure.
This commit is contained in:
parent
222adaf847
commit
4bf89be02c
@ -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>
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
{
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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_ */
|
||||
|
@ -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++)
|
||||
|
Loading…
Reference in New Issue
Block a user