Fix startup when there are no timestep devices present, i.e. Capacitors

or inductors. (nw)
This commit is contained in:
couriersud 2017-01-06 22:20:28 +01:00
parent 02108b60e8
commit e788dc5dbe
4 changed files with 47 additions and 12 deletions

View File

@ -119,25 +119,38 @@ NETLIB_UPDATE(R_base)
NETLIB_UPDATE_PARAM(R)
{
update_dev();
if (m_R() > 1e-9)
set_R(m_R());
else
set_R(1e-9);
set_R(std::max(m_R(), netlist().gmin()));
}
NETLIB_RESET(R)
{
NETLIB_NAME(twoterm)::reset();
set_R(std::max(m_R(), netlist().gmin()));
}
// ----------------------------------------------------------------------------------------
// nld_POT
// ----------------------------------------------------------------------------------------
NETLIB_UPDATE_PARAM(POT)
NETLIB_RESET(POT)
{
nl_double v = m_Dial();
if (m_DialIsLog())
v = (std::exp(v) - 1.0) / (std::exp(1.0) - 1.0);
m_R1.set_R(std::max(m_R() * v, netlist().gmin()));
m_R2.set_R(std::max(m_R() * (NL_FCONST(1.0) - v), netlist().gmin()));
}
NETLIB_UPDATE_PARAM(POT)
{
m_R1.update_dev();
m_R2.update_dev();
nl_double v = m_Dial();
if (m_DialIsLog())
v = (std::exp(v) - 1.0) / (std::exp(1.0) - 1.0);
m_R1.set_R(std::max(m_R() * v, netlist().gmin()));
m_R2.set_R(std::max(m_R() * (NL_FCONST(1.0) - v), netlist().gmin()));
@ -147,7 +160,7 @@ NETLIB_UPDATE_PARAM(POT)
// nld_POT2
// ----------------------------------------------------------------------------------------
NETLIB_UPDATE_PARAM(POT2)
NETLIB_RESET(POT2)
{
nl_double v = m_Dial();
@ -155,9 +168,20 @@ NETLIB_UPDATE_PARAM(POT2)
v = (std::exp(v) - 1.0) / (std::exp(1.0) - 1.0);
if (m_Reverse())
v = 1.0 - v;
m_R1.set_R(std::max(m_R() * v, netlist().gmin()));
}
NETLIB_UPDATE_PARAM(POT2)
{
m_R1.update_dev();
nl_double v = m_Dial();
if (m_DialIsLog())
v = (std::exp(v) - 1.0) / (std::exp(1.0) - 1.0);
if (m_Reverse())
v = 1.0 - v;
m_R1.set_R(std::max(m_R() * v, netlist().gmin()));
}
@ -222,6 +246,15 @@ NETLIB_TIMESTEP(L)
// nld_D
// ----------------------------------------------------------------------------------------
NETLIB_RESET(D)
{
nl_double Is = m_model.model_value("IS");
nl_double n = m_model.model_value("N");
m_D.set_param(Is, n, netlist().gmin());
set(m_D.G(), 0.0, m_D.Ieq());
}
NETLIB_UPDATE_PARAM(D)
{
nl_double Is = m_model.model_value("IS");

View File

@ -189,7 +189,7 @@ NETLIB_OBJECT_DERIVED(R, R_base)
protected:
//NETLIB_RESETI() { }
NETLIB_RESETI();
//NETLIB_UPDATEI() { }
NETLIB_UPDATE_PARAMI();
};
@ -216,7 +216,7 @@ NETLIB_OBJECT(POT)
}
//NETLIB_UPDATEI();
//NETLIB_RESETI();
NETLIB_RESETI();
NETLIB_UPDATE_PARAMI();
private:
@ -243,7 +243,7 @@ NETLIB_OBJECT(POT2)
}
//NETLIB_UPDATEI();
//NETLIB_RESETI();
NETLIB_RESETI();
NETLIB_UPDATE_PARAMI();
private:
@ -375,7 +375,7 @@ public:
param_model_t m_model;
protected:
//NETLIB_RESETI();
NETLIB_RESETI();
NETLIB_UPDATEI();
NETLIB_UPDATE_PARAMI();

View File

@ -449,7 +449,6 @@ const netlist_time matrix_solver_t::solve()
step(delta);
solve_base();
const netlist_time next_time_step = compute_next_timestep(delta.as_double());
update_inputs();
return next_time_step;

View File

@ -87,6 +87,9 @@ NETLIB_UPDATE(solver)
if (m_params.m_dynamic)
return;
/* force solving during start up if there are no time-step devices */
/* FIXME: Needs a more elegant solution */
bool force_solve = (netlist().time() < netlist_time::from_double(2 * m_params.m_max_timestep));
#if HAS_OPENMP && USE_OPENMP
const std::size_t t_cnt = m_mat_solvers.size();
@ -114,7 +117,7 @@ NETLIB_UPDATE(solver)
}
#else
for (auto & solver : m_mat_solvers)
if (solver->has_timestep_devices())
if (solver->has_timestep_devices() || force_solve)
// Ignore return value
ATTR_UNUSED const netlist_time ts = solver->solve();
#endif