def make_nodal_circuit(ckt, reference='gnd'): """ Add attributes to Circuit/Elements/Terminals for nodal analysis Similar to nodal.make_nodal_circuit but in addition calls create_additional_indexes() """ nodal.make_nodal_circuit(ckt, reference) # Generate sparse-matrix index mappings for elem in ckt.nD_nlinElem: create_additional_indexes(elem)
def make_nodal_circuit(ckt, termList = None): """ Add attributes to Circuit/Elements/Terminals for nodal analysis Similar to nodal.make_nodal_circuit but in addition calls create_additional_indexes() """ nodal.make_nodal_circuit(ckt, termList) # Generate sparse-matrix index mappings for elem in ckt.nD_nlinElem: create_additional_indexes(elem)
def run(self, circuit): """ Calculates a AC sweep by solving nodal equations around The parameter to be swept is specified in the analysis options """ # for now just print some fixed stuff print('******************************************************') print(' AC sweep analysis') print('******************************************************') if hasattr(circuit, 'title'): print('\n', circuit.title, '\n') # Only works with flattened circuits if not circuit._flattened: circuit.flatten() circuit.init() nd.make_nodal_circuit(circuit) dc = nd.DCNodal(circuit) x0 = dc.get_guess() sV = dc.get_source() print('System dimension: {0}'.format(circuit.nD_dimension)) # solve equations try: print('Calculating DC operating point ... ', end='') sys.stdout.flush() (x, res, iterations) = solve(x0, sV, dc.convergence_helpers) print('Succeded.\n') except NoConvergenceError as ce: print('Failed.\n') print(ce) return dc.save_OP(x) # Create frequency vector if self.log: fvec = np.logspace(start = np.log10(self.start), stop = np.log10(self.stop), num = self.num) else: fvec = np.linspace(start = self.start, stop = self.stop, num = self.num) # Perform analysis nd.run_AC(circuit, fvec) # Process output requests. analysis.process_requests(circuit, 'ac', fvec, 'Frequency [Hz]', 'aC_V', log = self.log) analysis.process_requests(circuit, 'ac_mag', fvec, 'Frequency [Hz]', 'aC_V', lambda x: abs(x), log = self.log) analysis.process_requests(circuit, 'ac_phase', fvec, 'Frequency [Hz]', 'aC_V', lambda v: 180./np.pi * np.angle(v), 'degrees', self.log) analysis.process_requests(circuit, 'ac_dB', fvec, 'Frequency [Hz]', 'aC_V', lambda v: 20. * np.log10(v), 'dB', self.log) def getvec(termname): return circuit.termDict[termname].aC_V if self.shell: analysis.ipython_drop(""" Available commands: fvec: frequency vector getvec(<terminal>) to retrieve AC result vector """, globals(), locals())
def run(self, circuit): """ Calculates a AC sweep by solving nodal equations around The parameter to be swept is specified in the analysis options """ # for now just print some fixed stuff print('******************************************************') print(' AC sweep analysis') print('******************************************************') if hasattr(circuit, 'title'): print('\n', circuit.title, '\n') # Only works with flattened circuits if not circuit._flattened: circuit.flatten() circuit.init() nd.make_nodal_circuit(circuit) dc = nd.DCNodal(circuit) x0 = dc.get_guess() sV = dc.get_source() print('System dimension: {0}'.format(circuit.nD_dimension)) # solve equations try: print('Calculating DC operating point ... ', end='') sys.stdout.flush() (x, res, iterations) = solve(x0, sV, dc.convergence_helpers) print('Succeded.\n') except NoConvergenceError as ce: print('Failed.\n') print(ce) return dc.save_OP(x) # Create frequency vector if self.log: fvec = np.logspace(start=np.log10(self.start), stop=np.log10(self.stop), num=self.num) else: fvec = np.linspace(start=self.start, stop=self.stop, num=self.num) # Perform analysis nd.run_AC(circuit, fvec) # Process output requests. analysis.process_requests(circuit, 'ac', fvec, 'Frequency [Hz]', 'aC_V', log=self.log) analysis.process_requests(circuit, 'ac_mag', fvec, 'Frequency [Hz]', 'aC_V', lambda x: abs(x), log=self.log) analysis.process_requests(circuit, 'ac_phase', fvec, 'Frequency [Hz]', 'aC_V', lambda v: 180. / np.pi * np.angle(v), 'degrees', self.log) analysis.process_requests(circuit, 'ac_dB', fvec, 'Frequency [Hz]', 'aC_V', lambda v: 20. * np.log10(v), 'dB', self.log) def getvec(termname): return circuit.find_term(termname).aC_V if self.shell: analysis.ipython_drop( """ Available commands: fvec: frequency vector getvec(<terminal>) to retrieve AC result vector """, globals(), locals())