Exemple #1
0
    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
Exemple #2
0
    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)
Exemple #3
0
    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
Exemple #4
0
    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
Exemple #5
0
    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
Exemple #6
0
    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
Exemple #7
0
    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