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]