summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/solver/nld_solver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/solver/nld_solver.cpp')
-rw-r--r--src/lib/netlist/solver/nld_solver.cpp29
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 &params, std::size_t size)
+std::unique_ptr<matrix_solver_t> create_it(netlist_state_t &nl, pstring name, solver_parameters_t &params, std::size_t size)
{
- return plib::palloc<C>(nl, name, &params, size);
+ return plib::make_unique<C>(nl, name, &params, 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));
}
}