Exemple #1
0
    def simulate(self, tmax, nout=500, maxsteps=5000, rtol=1e-8, verbose=False, test_jac_args=None):
        if not hasattr(self, 't0'):
            self.assemble(verbose)
        if test_jac_args is not None:
            self.test_jacobian(*test_jac_args)
        sim = IDA(self)
        flag, _, _ = sim.make_consistent('IDA_YA_YDP_INIT')
        translation = {0:'SUCCESS', 1:'TSTOP_RETURN', 2:'ROOT_RETURN',
            99:'WARNING', -1 :'TOO_MUCH_WORK', -2 :'TOO_MUCH_ACC',
            -3 :'ERR_FAIL', -4 :'CONV_FAIL', -5 :'LINIT_FAIL',
            -6 :'LSETUP_FAIL', -7 :'LSOLVE_FAIL', -8 :'RES_FAIL',
            -9 :'REP_RES_ERR', -10:'RTFUNC_FAIL', -11:'CONSTR_FAIL',
            -12:'FIRST_RES_FAIL', -13:'LINESEARCH_FAIL', -14:'NO_RECOVERY',
            -20:'MEM_NULL', -21:'MEM_FAIL', -22:'ILL_INPUT', -23:'NO_MALLOC',
            -24:'BAD_EWT', -25:'BAD_K', -26:'BAD_T', -27:'BAD_DKY'}
        if flag < 0:
            raise ArithmeticError('make_consistent failed with flag = IDA_%s' % translation[flag])
        if flag != 0:
            warn('make_consistent returned IDA_%s' % translation[flag])
        sim.rtol = rtol
        sim.maxsteps = maxsteps
        T,Y,Yd = sim.simulate(tmax, nout)
        ncnt  = len(self.nodes)
        nterm = len(self.terminals)

        self.T = T
        Vs    = Y [:, :ncnt]
        dVsdt = Yd[:, :ncnt]
        Is    = Y [:, ncnt:(ncnt+nterm)]
        dIsdt = Yd[:, ncnt:(ncnt+nterm)]
        Qs    = Y [:, (ncnt+nterm):]
        dQsdt = Yd[:, (ncnt+nterm):]

        for i,node in enumerate(self.nodes):
            for term in node:
                term.V    = Vs[:, i]
                term.dVdt = dVsdt[:, i]

        for i,term in enumerate(self.terminals):
            term.I    = Is[:, i]
            term.dIdt = dIsdt[:, i]

        for i,state in enumerate(self.states):
            state.val = Qs[:, i]
            state.der = dQsdt[:, i]