def get_i(self, xVec): """ Calculate total current returns iVec = G' xVec + i'(xVec) xVec: input vector of nodal voltages. iVec: output vector of currents """ # Linear contribution self.iVec[:] = self.Gp * xVec dcounter = 0 # Nonlinear contribution for elem in self.ckt.nD_nlinElem: # first have to retrieve port voltages from xVec xin = np.zeros(elem.nD_nxin) set_xin(xin, elem.nD_vpos, elem.nD_vneg, xVec) if elem.nDelays: # Apply delay to port voltages for i in xrange(-elem.nDelays, 0): (xin[i], dc) = delay_interp(elem.nD_delay[i], xin[i], self.im.h, self._dpsteps, self.tdVecList[dcounter][i]) dcounter += 1 outV = elem.eval(xin) # Update iVec. outV may have extra charge elements but # they are not used in the following set_i(self.iVec, elem.nD_cpos, elem.nD_cneg, outV) set_i(self.iVec, elem.nD_qpos, elem.nD_qneg, self.im.a0 * outV[len(elem.csOutPorts):]) return self.iVec
def get_i_Jac(self, xVec): """ Calculate total current and Jacobian Returns (iVec, Jac):: iVec = G' xVec + i'(xVec) Jac = G' + (di'/dx)(xVec) xVec: input vector of nodal voltages. iVec: output vector of currents Jac: system Jacobian """ # Linear contribution self.iVec[:] = self.Gp * xVec dcounter = 0 # Nonlinear contribution self._mbase = self._mbaseLin for elem in self.ckt.nD_nlinElem: # first have to retrieve port voltages from xVec xin = np.zeros(elem.nD_nxin) set_xin(xin, elem.nD_vpos, elem.nD_vneg, xVec) if elem.nDelays: # Derivative coefficients dc = np.empty_like(elem.nD_delay) # Apply delay to port voltages for i in xrange(-elem.nDelays, 0): (xin[i], dc[i]) = delay_interp(elem.nD_delay[i], xin[i], self.im.h, self._dpsteps, self.tdVecList[dcounter][i]) dcounter += 1 (outV, outJac) = elem.eval_and_deriv(xin) # Multiply Jacobian columns by derivative factors for i in xrange(-elem.nDelays, 0): outJac[:,i] *= dc[i] else: (outV, outJac) = elem.eval_and_deriv(xin) # Update iVec and Jacobian now. outV may have extra charge # elements but they are not used in the following set_i(self.iVec, elem.nD_cpos, elem.nD_cneg, outV) set_i(self.iVec, elem.nD_qpos, elem.nD_qneg, self.im.a0 * outV[len(elem.csOutPorts):]) self.set_Jac(self.Jaccoo, outJac, *elem.nD_csidx) qJac = self.im.a0 * outJac[len(elem.csOutPorts):,:] self.set_Jac(self.Jaccoo, qJac, *elem.nD_qsidx) return (self.iVec, self.Jaccoo)
def get_i_Jac(self, xVec): """ Calculate total current and Jacobian Returns (iVec, Jac):: iVec = G' xVec + i'(xVec) Jac = G' + (di'/dx)(xVec) xVec: input vector of nodal voltages. iVec: output vector of currents Jac: system Jacobian """ # Linear contribution self.iVec[:] = self.Gp * xVec dcounter = 0 # Nonlinear contribution self._mbase = self._mbaseLin for elem in self.ckt.nD_nlinElem: # first have to retrieve port voltages from xVec xin = np.zeros(elem.nD_nxin) set_xin(xin, elem.nD_vpos, elem.nD_vneg, xVec) if elem.nDelays: # Derivative coefficients dc = np.empty_like(elem.nD_delay) # Apply delay to port voltages for i in xrange(-elem.nDelays, 0): (xin[i], dc[i]) = delay_interp(elem.nD_delay[i], xin[i], self.im.h, self._dpsteps, self.tdVecList[dcounter][i]) dcounter += 1 (outV, outJac) = elem.eval_and_deriv(xin) # Multiply Jacobian columns by derivative factors for i in xrange(-elem.nDelays, 0): outJac[:, i] *= dc[i] else: (outV, outJac) = elem.eval_and_deriv(xin) # Update iVec and Jacobian now. outV may have extra charge # elements but they are not used in the following set_i(self.iVec, elem.nD_cpos, elem.nD_cneg, outV) set_i(self.iVec, elem.nD_qpos, elem.nD_qneg, self.im.a0 * outV[len(elem.csOutPorts):]) self.set_Jac(self.Jaccoo, outJac, *elem.nD_csidx) qJac = self.im.a0 * outJac[len(elem.csOutPorts):, :] self.set_Jac(self.Jaccoo, qJac, *elem.nD_qsidx) return (self.iVec, self.Jaccoo)