diff options
Diffstat (limited to 'src/lib/netlist/solver/nld_solver.cpp')
-rw-r--r-- | src/lib/netlist/solver/nld_solver.cpp | 29 |
1 files changed, 12 insertions, 17 deletions
diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index 45643d88ea5..5d17056637a 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -33,6 +33,7 @@ #include <algorithm> #include <cmath> // <<= needed by windows build +#include <memory> #include "../nl_lists.h" @@ -80,14 +81,6 @@ void NETLIB_NAME(solver)::stop() s->log_stats(); } -NETLIB_NAME(solver)::~NETLIB_NAME(solver)() -{ - for (auto &s : m_mat_solvers) - { - plib::pfree(s); - } -} - NETLIB_UPDATE(solver) { if (m_params.m_dynamic_ts) @@ -100,7 +93,7 @@ NETLIB_UPDATE(solver) std::size_t nthreads = std::min(static_cast<std::size_t>(m_parallel()), plib::omp::get_max_threads()); - std::vector<matrix_solver_t *> &solvers = (force_solve ? m_mat_solvers : m_mat_solvers_timestepping); + std::vector<matrix_solver_t *> &solvers = (force_solve ? m_mat_solvers_all : m_mat_solvers_timestepping); if (nthreads > 1 && solvers.size() > 1) { @@ -129,13 +122,13 @@ NETLIB_UPDATE(solver) } template <class C> -matrix_solver_t * create_it(netlist_state_t &nl, pstring name, solver_parameters_t ¶ms, std::size_t size) +std::unique_ptr<matrix_solver_t> create_it(netlist_state_t &nl, pstring name, solver_parameters_t ¶ms, std::size_t size) { - return plib::palloc<C>(nl, name, ¶ms, size); + return plib::make_unique<C>(nl, name, ¶ms, size); } template <typename FT, int SIZE> -matrix_solver_t * NETLIB_NAME(solver)::create_solver(std::size_t size, const pstring &solvername) +std::unique_ptr<matrix_solver_t> NETLIB_NAME(solver)::create_solver(std::size_t size, const pstring &solvername) { if (m_method() == "SOR_MAT") { @@ -283,7 +276,7 @@ void NETLIB_NAME(solver)::post_start() log().verbose("Found {1} net groups in {2} nets\n", splitter.groups.size(), state().nets().size()); for (auto & grp : splitter.groups) { - matrix_solver_t *ms; + std::unique_ptr<matrix_solver_t> ms; std::size_t net_count = grp.size(); pstring sname = plib::pfmt("Solver_{1}")(m_mat_solvers.size()); @@ -292,13 +285,13 @@ void NETLIB_NAME(solver)::post_start() #if 1 case 1: if (use_specific) - ms = plib::palloc<matrix_solver_direct1_t<double>>(state(), sname, &m_params); + ms = plib::make_unique<matrix_solver_direct1_t<double>>(state(), sname, &m_params); else ms = create_solver<double, 1>(1, sname); break; case 2: if (use_specific) - ms = plib::palloc<matrix_solver_direct2_t<double>>(state(), sname, &m_params); + ms = plib::make_unique<matrix_solver_direct2_t<double>>(state(), sname, &m_params); else ms = create_solver<double, 2>(2, sname); break; @@ -403,9 +396,11 @@ void NETLIB_NAME(solver)::post_start() } } - m_mat_solvers.push_back(ms); + m_mat_solvers_all.push_back(ms.get()); if (ms->has_timestep_devices()) - m_mat_solvers_timestepping.push_back(ms); + m_mat_solvers_timestepping.push_back(ms.get()); + + m_mat_solvers.emplace_back(std::move(ms)); } } |