def main(args): if len(args) < 2: print('Usage: python ' + args[0] + ' input.txt [output.txt]') sys.exit() parser = Parser() comps_linear = [] comps_diodes = [] with open(args[1]) as file: for line in file: comp = parser.next_entry(line) if comp is not None: if isinstance(comp, spicemix.Diode): comps_diodes.append(comp) else: comps_linear.append(comp) n, m = find_n_m_size(comps_linear + comps_diodes) builder = StampBuilder(n, m) for comp in comps_linear: builder.add_component(comp) prev = start_appr for d in comps_diodes: d.set_vol_zero(start_appr) if len(comps_diodes) > 0: # the_p = comps_diodes[len(comps_diodes) - 1].get_p_node() min = start_appr while True: prepared_builder = deepcopy(builder) for d in comps_diodes: prepared_builder.add_component(d) prepared_builder.clear_zer() a, z = prepared_builder.get_a_z() solution = gaussian_elimintaion(a, z) for d in comps_diodes: kek = d.get_p_node() - 1 if solution[kek] < min: min = solution[kek] for d in comps_diodes: d.set_vol_zero(min) dx = fabs(comps_diodes[0].get_value() - prev) prev = comps_diodes[0].get_value() if dx < eps: break # why python hasnt do while ? else: builder.clear_zer() a, z = builder.get_a_z() solution = gaussian_elimintaion(a, z) if len(args) > 2: form_output(args[2], solution, n, m) else: print_matrix(solution)
def test_correct_type_nodes_anything(self): comps_linear = [] comps_diodes = [] for entry, value in self.entries.items(): comp = self.parser.next_entry(entry) if isinstance(comp, spicemix.Diode): comp.set_voltage(0.8) if comp is None and value is not None: raise Exception('There is a component but parser returns None') if comp is not None: self.assertEqual(comp.get_id(), value[1], 'Wrong id') self.assertEqual(comp.get_p_node(), value[2], 'Wrong p node') self.assertEqual(comp.get_n_node(), value[3], 'Wrong n node') self.assertEqual(comp.get_value(), value[4], 'Wrong value') assert isinstance(comp, value[0]) if isinstance(comp, spicemix.Diode): comps_diodes.append(comp) else: comps_linear.append(comp) for c in comps_linear: self.builder.add_component(c) for c in comps_diodes: c.set_vol_zero(self.v0) self.builder.add_component(c) n, m = find_n_m_size(comps_linear + comps_diodes) self.assertEqual(n, self.n) self.assertEqual(m, self.m) self.builder.clear_zer() builder_a, builder_z = self.builder.get_a_z() self.assertEqual(self.cut_matrix_a, builder_a) self.assertEqual(self.cut_matrix_z, builder_z) gaussian.print_matrix( gaussian.gaussian_elimintaion(self.cut_matrix_a, self.cut_matrix_z))
def test_correct_type_nodes_anything(self): comps_linear = [] comps_diodes = [] for entry, value in self.entries.items(): comp = self.parser.next_entry(entry) if isinstance(comp, spicemix.Diode): comp.set_voltage(0.8) if comp is None and value is not None: raise Exception('There is a component but parser returns None') if comp is not None: self.assertEqual(comp.get_id(), value[1], 'Wrong id') self.assertEqual(comp.get_p_node(), value[2], 'Wrong p node') self.assertEqual(comp.get_n_node(), value[3], 'Wrong n node') self.assertEqual(comp.get_value(), value[4], 'Wrong value') assert isinstance(comp, value[0]) if isinstance(comp, spicemix.Diode): comps_diodes.append(comp) else: comps_linear.append(comp) for c in comps_linear: self.builder.add_component(c) for c in comps_diodes: c.set_vol_zero(self.v0) self.builder.add_component(c) n, m = find_n_m_size(comps_linear + comps_diodes) self.assertEqual(n, self.n) self.assertEqual(m, self.m) self.builder.clear_zer() builder_a, builder_z = self.builder.get_a_z() self.assertEqual(self.cut_matrix_a, builder_a) self.assertEqual(self.cut_matrix_z, builder_z) gaussian.print_matrix(gaussian.gaussian_elimintaion(self.cut_matrix_a, self.cut_matrix_z))