def derivatives(self, vec_z): r""" Calculate partial derivatives for given equations. Returns ------- mat_deriv : ndarray Matrix of partial derivatives. """ ###################################################################### # derivatives fluid, mass flow and pressure balance are static k = self.num_nw_fluids * 2 + 4 ###################################################################### # derivatives for energy balance equation i = 0 for inl in self.inl: self.mat_deriv[k, i, 0] = inl.h.val_SI self.mat_deriv[k, i, 2] = inl.m.val_SI i += 1 j = 0 for outl in self.outl: self.mat_deriv[k, j + i, 0] = -outl.h.val_SI self.mat_deriv[k, j + i, 2] = -outl.m.val_SI j += 1 k += 1 ###################################################################### # derivatives of equations for saturated states at outlets self.mat_deriv[k, 2, 1] = dh_mix_dpQ(self.outl[0].to_flow(), 0) self.mat_deriv[k, 2, 2] = -1 k += 1 self.mat_deriv[k, 3, 1] = dh_mix_dpQ(self.outl[1].to_flow(), 1) self.mat_deriv[k, 3, 2] = -1 k += 1
def derivatives(self): r""" Calculates matrix of partial derivatives for given equations. Returns ------- mat_deriv : ndarray Matrix of partial derivatives. """ mat_deriv = [] ###################################################################### # derivatives for fluid balance equations mat_deriv += self.fl_deriv ###################################################################### # derivatives for mass flow balance equation mat_deriv += self.m_deriv ###################################################################### # derivatives for pressure eqauations mat_deriv += self.p_deriv ###################################################################### # derivatives for energy balance equation deriv = np.zeros((1, 4, self.num_fl + 3)) k = 0 for i in self.inl: deriv[0, k, 0] = i.h.val_SI deriv[0, k, 2] = i.m.val_SI k += 1 j = 0 for o in self.outl: deriv[0, j + k, 0] = -o.h.val_SI deriv[0, j + k, 2] = -o.m.val_SI j += 1 mat_deriv += deriv.tolist() ###################################################################### # derivatives of equations for saturated states at outlets x_deriv = np.zeros((2, 4, self.num_fl + 3)) x_deriv[0, 2, 1] = dh_mix_dpQ(self.outl[0].to_flow(), 0) x_deriv[0, 2, 2] = -1 x_deriv[1, 3, 1] = dh_mix_dpQ(self.outl[1].to_flow(), 1) x_deriv[1, 3, 2] = -1 mat_deriv += x_deriv.tolist() return np.asarray(mat_deriv)
def outlet_states_deriv(self, increment_filter, k): r""" Calculate partial derivatives of outlet states. Parameters ---------- increment_filter : ndarray Matrix for filtering non-changing variables. k : int Position of derivatives in Jacobian matrix (k-th equation). """ self.jacobian[k, self.num_i, 1] = dh_mix_dpQ(self.outl[0].get_flow(), 0) self.jacobian[k, self.num_i, 2] = -1 self.jacobian[k + 1, self.num_i + 1, 1] = ( dh_mix_dpQ(self.outl[1].get_flow(), 1)) self.jacobian[k + 1, self.num_i + 1, 2] = -1
def overheating_deriv(self, increment_filter, k): """ Calculate partial derivatives for cold side outlet state. Parameters ---------- increment_filter : ndarray Matrix for filtering non-changing variables. k : int Position of derivatives in Jacobian matrix (k-th equation). """ self.jacobian[k, 5, 1] = -dh_mix_dpQ(self.outl[0].get_flow(), 0) self.jacobian[k, 5, 2] = 1
def subcooling_deriv(self, increment_filter, k): """ Calculate partial derivates of subcooling function. Parameters ---------- increment_filter : ndarray Matrix for filtering non-changing variables. k : int Position of derivatives in Jacobian matrix (k-th equation). """ self.jacobian[k, 2, 1] = -dh_mix_dpQ(self.outl[0].get_flow(), 0) self.jacobian[k, 2, 2] = 1
def saturated_gas_deriv(self, increment_filter, k): r""" Partial derivatives of saturated gas at hot side outlet function. Parameters ---------- increment_filter : ndarray Matrix for filtering non-changing variables. k : int Position of derivatives in Jacobian matrix (k-th equation). """ o1 = self.outl[0].get_flow() self.jacobian[k, 2, 1] = -dh_mix_dpQ(o1, 1) self.jacobian[k, 2, 2] = 1
def derivatives(self, increment_filter): r"""Calculate matrix of partial derivatives for given equations.""" ###################################################################### # derivatives fluid and mass balance are static k = self.num_nw_fluids * 3 + 3 ###################################################################### # derivatives for energy balance equation # mat_deriv += self.energy_deriv() for i in range(3): self.jacobian[k, i, 0] = (self.outl[i].h.val_SI - self.inl[i].h.val_SI) self.jacobian[k, i, 2] = -self.inl[i].m.val_SI self.jacobian[k, i + 3, 2] = self.inl[i].m.val_SI k += 1 ###################################################################### # derivatives for specified heat transfer if self.Q.is_set: self.jacobian[k, 2, 0] = (self.outl[2].h.val_SI - self.inl[2].h.val_SI) self.jacobian[k, 2, 2] = -self.inl[2].m.val_SI self.jacobian[k, 5, 2] = self.inl[2].m.val_SI k += 1 ###################################################################### # derivatives for specified pressure ratio at hot side 1 if self.pr1.is_set: self.jacobian[k, 0, 1] = self.pr1.val self.jacobian[k, 3, 1] = -1 k += 1 ###################################################################### # derivatives for specified pressure ratio at hot side 2 if self.pr2.is_set: self.jacobian[k, 1, 1] = self.pr2.val self.jacobian[k, 4, 1] = -1 k += 1 ###################################################################### # derivatives for specified pressure ratio at cold side if self.pr3.is_set: self.jacobian[k, 2, 1] = self.pr3.val self.jacobian[k, 5, 1] = -1 k += 1 ###################################################################### # derivatives for specified zeta at hot side 1 if self.zeta1.is_set: f = self.zeta_func if not increment_filter[0, 0]: self.jacobian[k, 0, 0] = self.numeric_deriv(f, 'm', 0, zeta='zeta1', inconn=0, outconn=0) if not increment_filter[0, 1]: self.jacobian[k, 0, 1] = self.numeric_deriv(f, 'p', 0, zeta='zeta1', inconn=0, outconn=0) if not increment_filter[0, 2]: self.jacobian[k, 0, 2] = self.numeric_deriv(f, 'h', 0, zeta='zeta1', inconn=0, outconn=0) if not increment_filter[3, 1]: self.jacobian[k, 3, 1] = self.numeric_deriv(f, 'p', 3, zeta='zeta1', inconn=0, outconn=0) if not increment_filter[3, 2]: self.jacobian[k, 3, 2] = self.numeric_deriv(f, 'h', 3, zeta='zeta1', inconn=0, outconn=0) k += 1 ###################################################################### # derivatives for specified zeta at hot side 2 if self.zeta2.is_set: f = self.zeta_func if not increment_filter[1, 0]: self.jacobian[k, 1, 0] = self.numeric_deriv(f, 'm', 1, zeta='zeta2', inconn=1, outconn=1) if not increment_filter[1, 1]: self.jacobian[k, 1, 1] = self.numeric_deriv(f, 'p', 1, zeta='zeta2', inconn=1, outconn=1) if not increment_filter[1, 2]: self.jacobian[k, 1, 2] = self.numeric_deriv(f, 'h', 1, zeta='zeta2', inconn=1, outconn=1) if not increment_filter[4, 1]: self.jacobian[k, 4, 1] = self.numeric_deriv(f, 'p', 4, zeta='zeta2', inconn=1, outconn=1) if not increment_filter[4, 2]: self.jacobian[k, 4, 2] = self.numeric_deriv(f, 'h', 4, zeta='zeta2', inconn=1, outconn=1) k += 1 ###################################################################### # derivatives for specified zeta at cold side if self.zeta3.is_set: f = self.zeta_func if not increment_filter[2, 0]: self.jacobian[k, 2, 0] = self.numeric_deriv(f, 'm', 2, zeta='zeta3', inconn=2, outconn=2) if not increment_filter[2, 1]: self.jacobian[k, 2, 1] = self.numeric_deriv(f, 'p', 2, zeta='zeta3', inconn=2, outconn=2) if not increment_filter[2, 2]: self.jacobian[k, 2, 2] = self.numeric_deriv(f, 'h', 2, zeta='zeta3', inconn=2, outconn=2) if not increment_filter[5, 1]: self.jacobian[k, 5, 1] = self.numeric_deriv(f, 'p', 5, zeta='zeta3', inconn=2, outconn=2) if not increment_filter[5, 2]: self.jacobian[k, 5, 2] = self.numeric_deriv(f, 'h', 5, zeta='zeta3', inconn=2, outconn=2) k += 1 ###################################################################### # derivatives for saturated liquid at hot side 1 outlet equation if self.subcooling.val is False: o1 = self.outl[0].to_flow() self.jacobian[k, 3, 1] = -dh_mix_dpQ(o1, 0) self.jacobian[k, 3, 2] = 1 k += 1 ###################################################################### # derivatives for saturated gas at cold side outlet 3 equation if self.overheating.val is False: o3 = self.outl[2].to_flow() self.jacobian[k, 5, 1] = -dh_mix_dpQ(o3, 1) self.jacobian[k, 5, 2] = 1 k += 1