示例#1
0
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)
示例#2
0
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)
示例#3
0
文件: ac.py 项目: AndySze/cardoon
    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())
示例#4
0
    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())