mirror of
https://github.com/holub/mame
synced 2025-06-07 13:23:50 +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 pvector_t<matrix_solver_t *> list_t;
|
||||||
typedef core_device_t::list_t dev_list_t;
|
typedef core_device_t::list_t dev_list_t;
|
||||||
|
|
||||||
enum eSolverType
|
enum eSortType
|
||||||
{
|
{
|
||||||
GAUSSIAN_ELIMINATION,
|
NOSORT,
|
||||||
GAUSS_SEIDEL
|
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();
|
virtual ~matrix_solver_t();
|
||||||
|
|
||||||
void setup(analog_net_t::list_t &nets) { vsetup(nets); }
|
void setup(analog_net_t::list_t &nets) { vsetup(nets); }
|
||||||
@ -107,7 +108,6 @@ public:
|
|||||||
|
|
||||||
ATTR_COLD int get_net_idx(net_t *net);
|
ATTR_COLD int get_net_idx(net_t *net);
|
||||||
|
|
||||||
eSolverType type() const { return m_type; }
|
|
||||||
plog_base<NL_DEBUG> &log() { return netlist().log(); }
|
plog_base<NL_DEBUG> &log() { return netlist().log(); }
|
||||||
|
|
||||||
virtual void log_stats();
|
virtual void log_stats();
|
||||||
@ -165,7 +165,7 @@ private:
|
|||||||
|
|
||||||
void update_inputs();
|
void update_inputs();
|
||||||
|
|
||||||
const eSolverType m_type;
|
const eSortType m_sort;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
@ -122,7 +122,7 @@ class matrix_solver_direct_t: public matrix_solver_t
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
matrix_solver_direct_t(const solver_parameters_t *params, const int size);
|
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();
|
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>
|
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_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)
|
, m_dim(size)
|
||||||
{
|
{
|
||||||
#if (NL_USE_DYNAMIC_ALLOCATION)
|
#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>
|
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_direct_t<m_N, _storage_N>::matrix_solver_direct_t(const eSortType sort, const solver_parameters_t *params, const int size)
|
||||||
: matrix_solver_t(type, params)
|
: matrix_solver_t(sort, params)
|
||||||
, m_dim(size)
|
, m_dim(size)
|
||||||
{
|
{
|
||||||
#if (NL_USE_DYNAMIC_ALLOCATION)
|
#if (NL_USE_DYNAMIC_ALLOCATION)
|
||||||
|
@ -29,7 +29,7 @@ class matrix_solver_GCR_t: public matrix_solver_direct_t<m_N, _storage_N>
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
matrix_solver_GCR_t(const solver_parameters_t *params, int size)
|
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:
|
public:
|
||||||
|
|
||||||
matrix_solver_GMRES_t(const solver_parameters_t *params, int size)
|
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_iLU_preconditioning(true)
|
||||||
, m_use_more_precise_stop_condition(false)
|
, m_use_more_precise_stop_condition(false)
|
||||||
, m_accuracy_mult(1.0)
|
, m_accuracy_mult(1.0)
|
||||||
|
@ -53,7 +53,6 @@ class matrix_solver_sm_t: public matrix_solver_t
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
matrix_solver_sm_t(const solver_parameters_t *params, const int size);
|
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();
|
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>
|
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_sm_t<m_N, _storage_N>::matrix_solver_sm_t(const solver_parameters_t *params, const int size)
|
||||||
: matrix_solver_t(GAUSSIAN_ELIMINATION, params)
|
: matrix_solver_t(NOSORT, 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)
|
|
||||||
, m_dim(size)
|
, m_dim(size)
|
||||||
{
|
{
|
||||||
#if (NL_USE_DYNAMIC_ALLOCATION)
|
#if (NL_USE_DYNAMIC_ALLOCATION)
|
||||||
|
@ -25,7 +25,7 @@ class matrix_solver_SOR_t: public matrix_solver_direct_t<m_N, _storage_N>
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
matrix_solver_SOR_t(const solver_parameters_t *params, int size)
|
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)
|
, m_lp_fact(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@ class matrix_solver_SOR_mat_t: public matrix_solver_direct_t<m_N, _storage_N>
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
matrix_solver_SOR_mat_t(const solver_parameters_t *params, int size)
|
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_omega(params->m_sor)
|
||||||
, m_lp_fact(0)
|
, m_lp_fact(0)
|
||||||
, m_gs_fail(0)
|
, m_gs_fail(0)
|
||||||
|
@ -59,7 +59,6 @@ class matrix_solver_w_t: public matrix_solver_t
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
matrix_solver_w_t(const solver_parameters_t *params, const int size);
|
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();
|
virtual ~matrix_solver_w_t();
|
||||||
|
|
||||||
@ -391,19 +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>
|
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_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)
|
|
||||||
{
|
|
||||||
for (unsigned k = 0; k < N(); k++)
|
|
||||||
{
|
|
||||||
m_last_RHS[k] = 0.0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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_cnt(0)
|
||||||
, m_dim(size)
|
, m_dim(size)
|
||||||
{
|
{
|
||||||
|
@ -94,7 +94,7 @@ ATTR_COLD void terms_t::set_pointers()
|
|||||||
// matrix_solver
|
// 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_calculations(0),
|
||||||
m_stat_newton_raphson(0),
|
m_stat_newton_raphson(0),
|
||||||
m_stat_vsolver_calls(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_iterative_total(0),
|
||||||
m_params(*params),
|
m_params(*params),
|
||||||
m_cur_ts(0),
|
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
|
pfree(m_rails_temp[k]); // no longer needed
|
||||||
|
|
||||||
m_rails_temp.clear();
|
m_rails_temp.clear();
|
||||||
#if 1
|
|
||||||
|
|
||||||
/* Sort in descending order by number of connected matrix voltages.
|
/* Sort in descending order by number of connected matrix voltages.
|
||||||
* The idea is, that for Gauss-Seidel algo the first voltage computed
|
* The idea is, that for Gauss-Seidel algo the first voltage computed
|
||||||
@ -245,7 +244,9 @@ ATTR_COLD void matrix_solver_t::setup_matrix()
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int sort_order = -1;//(type() == GAUSS_SEIDEL ? 1 : -1);
|
if (m_sort != NOSORT)
|
||||||
|
{
|
||||||
|
int sort_order = (m_sort == DESCENDING ? 1 : -1);
|
||||||
|
|
||||||
for (unsigned k = 0; k < iN - 1; k++)
|
for (unsigned k = 0; k < iN - 1; k++)
|
||||||
for (unsigned i = k+1; i < iN; i++)
|
for (unsigned i = k+1; i < iN; i++)
|
||||||
@ -264,8 +265,7 @@ ATTR_COLD void matrix_solver_t::setup_matrix()
|
|||||||
if (other[i] != -1)
|
if (other[i] != -1)
|
||||||
other[i] = get_net_idx(&m_terms[k]->terms()[i]->m_otherterm->net());
|
other[i] = get_net_idx(&m_terms[k]->terms()[i]->m_otherterm->net());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/* create a list of non zero elements. */
|
/* create a list of non zero elements. */
|
||||||
for (unsigned k = 0; k < iN; k++)
|
for (unsigned k = 0; k < iN; k++)
|
||||||
|
Loading…
Reference in New Issue
Block a user