summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/solver/nld_ms_direct2.h
diff options
context:
space:
mode:
author ImJezze <jezze@gmx.net>2015-10-20 21:34:36 +0200
committer ImJezze <jezze@gmx.net>2015-10-20 21:34:36 +0200
commita7b8acbe3eebcf17367baa642375cfa47ae4ea85 (patch)
tree854b859d6176802c0278f4b00de3f7c774e02dda /src/lib/netlist/solver/nld_ms_direct2.h
parent4610935e796661874bb4ee7ec6536d9423aeb7be (diff)
parent74aae76c4e3e257f99d139c4febb5d86d1419e50 (diff)
Merge pull request #6 from mamedev/master
Sync to base master
Diffstat (limited to 'src/lib/netlist/solver/nld_ms_direct2.h')
-rw-r--r--src/lib/netlist/solver/nld_ms_direct2.h68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/lib/netlist/solver/nld_ms_direct2.h b/src/lib/netlist/solver/nld_ms_direct2.h
new file mode 100644
index 00000000000..f78c36770e6
--- /dev/null
+++ b/src/lib/netlist/solver/nld_ms_direct2.h
@@ -0,0 +1,68 @@
+// license:GPL-2.0+
+// copyright-holders:Couriersud
+/*
+ * nld_ms_direct1.h
+ *
+ */
+
+#ifndef NLD_MS_DIRECT2_H_
+#define NLD_MS_DIRECT2_H_
+
+#include "solver/nld_ms_direct.h"
+#include "solver/nld_solver.h"
+
+NETLIB_NAMESPACE_DEVICES_START()
+
+class matrix_solver_direct2_t: public matrix_solver_direct_t<2,2>
+{
+public:
+
+ matrix_solver_direct2_t(const solver_parameters_t *params)
+ : matrix_solver_direct_t<2, 2>(params, 2)
+ {}
+ ATTR_HOT inline int vsolve_non_dynamic(const bool newton_raphson);
+protected:
+ ATTR_HOT virtual nl_double vsolve();
+private:
+};
+
+// ----------------------------------------------------------------------------------------
+// matrix_solver - Direct2
+// ----------------------------------------------------------------------------------------
+
+ATTR_HOT nl_double matrix_solver_direct2_t::vsolve()
+{
+ solve_base<matrix_solver_direct2_t>(this);
+ return this->compute_next_timestep();
+}
+
+ATTR_HOT inline int matrix_solver_direct2_t::vsolve_non_dynamic(ATTR_UNUSED const bool newton_raphson)
+{
+ build_LE_A();
+ build_LE_RHS(m_RHS);
+
+ const nl_double a = A(0,0);
+ const nl_double b = A(0,1);
+ const nl_double c = A(1,0);
+ const nl_double d = A(1,1);
+
+ nl_double new_val[2];
+ new_val[1] = (a * m_RHS[1] - c * m_RHS[0]) / (a * d - b * c);
+ new_val[0] = (m_RHS[0] - b * new_val[1]) / a;
+
+ if (is_dynamic())
+ {
+ nl_double err = this->delta(new_val);
+ store(new_val);
+ if (err > m_params.m_accuracy )
+ return 2;
+ else
+ return 1;
+ }
+ store(new_val);
+ return 1;
+}
+
+NETLIB_NAMESPACE_DEVICES_END()
+
+#endif /* NLD_MS_DIRECT2_H_ */