Esempio n. 1
0
 def dpdx(self, l, xi):
     """
     Calculates dp/dx (see [1]).
     
     [1] M. S. Olufsen. Modeling of the Arterial System with Reference to an Anesthesia Simulator. PhD thesis, University of Roskilde, Denmark, 1998.
     
     :param l: Position, either M+1/2 or -1/2.
     :param xi: Area.
     :returns: Solution to dp/dx
     """
     if l > self.L:
         x_0 = self.L - self.dx
         x_1 = self.L
         f_l = utils.extrapolate(l, [x_0, x_1], [self.f[-2], self.f[-1]])
         A0_l = utils.extrapolate(l, [x_0, x_1], [self.A0[-2], self.A0[-1]])
     elif l < 0.0:
         x_0 = self.dx
         x_1 = 0.0
         f_l = utils.extrapolate(l, [x_0, x_1], [self.f[1], self.f[0]])
         A0_l = utils.extrapolate(l, [x_0, x_1], [self.A0[1], self.A0[0]])
     elif l == self.L:
         f_l = self.f[-1]
         A0_l = self.A0[-1]
     else:
         f_l = self.f[0]
         A0_l = self.A0[0]
     return f_l / 2 * np.sqrt(A0_l / xi**3)
Esempio n. 2
0
 def dFdxi1(self, l, xi2):
     """
     Calculates dF/dx_1 (see [1]).
     
     [1] M. S. Olufsen. Modeling of the Arterial System with Reference to an Anesthesia Simulator. PhD thesis, University of Roskilde, Denmark, 1998.
     
     :param l: Position, either M+1/2 or -1/2.
     :param xi: Area.
     :returns: Solution to dF/dx_1
     """
     if l > self.L:
         x_0 = self.L - self.dx
         x_1 = self.L
         R0_l = utils.extrapolate(
             l, [x_0, x_1],
             [np.sqrt(self.A0[-2] / np.pi),
              np.sqrt(self.A0[-1] / np.pi)])
     elif l < 0.0:
         x_0 = self.dx
         x_1 = 0.0
         R0_l = utils.extrapolate(
             l, [x_0, x_1],
             [np.sqrt(self.A0[1] / np.pi),
              np.sqrt(self.A0[0] / np.pi)])
     elif l == self.L:
         R0_l = np.sqrt(self.A0[-1] / np.pi)
     else:
         R0_l = np.sqrt(self.A0[0] / np.pi)
     return -2 * np.pi * R0_l / (self.delta * self.Re * xi2)
Esempio n. 3
0
    def dBdxdxi(self, l, xi):
        """
        Calculates d^2B/dxdx_i (see [1]).
        
        [1] M. S. Olufsen. Modeling of the Arterial System with Reference to an Anesthesia Simulator. PhD thesis, University of Roskilde, Denmark, 1998.
        
        :param l: Position, either M+1/2 or -1/2.
        :param xi: Area.
        :returns: Solution to d^2B/dxdx_i
        """

        if l > self.L:
            x_0 = self.L-self.dx
            x_1 = self.L
            f_l = utils.extrapolate(l, [x_0, x_1], [self.f[-2], self.f[-1]])   
            df_l = utils.extrapolate(l, [x_0, x_1], [self.df[-2], self.df[-1]])   
            A0_l = utils.extrapolate(l, [x_0, x_1], [self.A0[-2], self.A0[-1]])  
            xgrad_l = utils.extrapolate(l, [x_0, x_1],
                                        [self.xgrad[-2], self.xgrad[-1]])
        elif l < 0.0:
            x_0 = self.dx
            x_1 = 0.0
            f_l = utils.extrapolate(l, [x_0, x_1], [self.f[1], self.f[0]])   
            df_l = utils.extrapolate(l, [x_0, x_1], [self.df[1], self.df[0]])   
            A0_l = utils.extrapolate(l, [x_0, x_1], [self.A0[1], self.A0[0]])  
            xgrad_l = utils.extrapolate(l, [x_0, x_1],
                                        [self.xgrad[1], self.xgrad[0]])
        elif l == self.L:
            f_l = self.f[-1]   
            df_l = self.df[-1]
            A0_l = self.A0[-1]
            xgrad_l = self.xgrad[-1]
        else:
            f_l = self.f[0]   
            df_l = self.df[0]
            A0_l = self.A0[0]
            xgrad_l = self.xgrad[0]
        return (1/(2*np.sqrt(xi)) * (f_l*np.sqrt(np.pi) +\
                                    df_l*np.sqrt(A0_l)) - df_l) * xgrad_l
Esempio n. 4
0
 def residuals(x, parent, d1, d2, theta, gamma, U_p_np, U_d1_np, U_d2_np):
     """
     Calculates the residual equations for using Newton's method to solve bifurcation inlet and outlet boundary conditions [1].
     
     [1] M. S. Olufsen. Modeling of the Arterial System with Reference to an Anesthesia Simulator. PhD thesis, University of Roskilde, Denmark, 1998.
     [2] R. J. LeVeque. Numerical Methods for Conservation Laws. Birkhauser Verlag, Basel, Switzerland, 2nd edition, 1992.
     
     :param x: Solution of the system of equations.
     :param parent: Artery object of the parent vessel.
     :param d1: Artery object of the first daughter vessel.
     :param d2: Artery object of the second daughter vessel.
     :param theta: dt/dx
     :param gamma: dt/2
     :param U_p_np: U_(M-1/2)^(n+1/2) [2]
     :param U_p_np: U_(M-1/2)^(n+1/2) [2]
     :returns: The residual equations for Newton's method.
     """
     f_p_mp = utils.extrapolate(parent.L + parent.dx / 2,
                                [parent.L - parent.dx, parent.L],
                                [parent.f[-2], parent.f[-1]])
     f_d1_mp = utils.extrapolate(-d1.dx / 2, [d1.dx, 0.0],
                                 [d1.f[1], d1.f[0]])
     f_d2_mp = utils.extrapolate(-d2.dx / 2, [d2.dx, 0.0],
                                 [d2.f[1], d2.f[0]])
     A0_p_mp = utils.extrapolate(parent.L + parent.dx / 2,
                                 [parent.L - parent.dx, parent.L],
                                 [parent.A0[-2], parent.A0[-1]])
     A0_d1_mp = utils.extrapolate(-d1.dx / 2, [d1.dx, 0.0],
                                  [d1.A0[1], d1.A0[0]])
     A0_d2_mp = utils.extrapolate(-d2.dx / 2, [d2.dx, 0.0],
                                  [d2.A0[1], d2.A0[0]])
     R0_p_mp = np.sqrt(A0_p_mp / np.pi)
     R0_d1_mp = np.sqrt(A0_d1_mp / np.pi)
     R0_d2_mp = np.sqrt(A0_d2_mp / np.pi)
     B_p_mp = f_p_mp * np.sqrt(x[11] * A0_p_mp)
     B_d1_mp = f_d1_mp * np.sqrt(x[14] * A0_d1_mp)
     B_d2_mp = f_d2_mp * np.sqrt(x[17] * A0_d2_mp)
     k1 = parent.U0[1,-1] + theta * (parent.F(U_p_np, j=-1)[1]) +\
             gamma * (parent.S(U_p_np, j=-1)[1])
     k2 = d1.U0[1,0] - theta * (d1.F(U_d1_np, j=0)[1]) +\
             gamma * (d1.S(U_d1_np, j=0)[1])
     k3 = d2.U0[1,0] - theta * (d2.F(U_d2_np, j=0)[1]) +\
             gamma * (d2.S(U_d2_np, j=0)[1])
     k4 = parent.U0[0, -1] + theta * parent.F(U_p_np, j=-1)[0]
     k5 = d1.U0[0, 0] - theta * d1.F(U_d1_np, j=0)[0]
     k6 = d2.U0[0, 0] - theta * d2.F(U_d2_np, j=0)[0]
     k7 = U_p_np[1] / 2
     k8 = U_d1_np[1] / 2
     k9 = U_d2_np[1] / 2
     k10 = U_p_np[0] / 2
     k11 = U_d1_np[0] / 2
     k12 = U_d2_np[0] / 2
     k15a = -parent.f[-1] + d1.f[0]
     k15b = d1.f[0] * np.sqrt(d1.A0[0])
     k16a = -parent.f[-1] + d2.f[0]
     k16b = d2.f[0] * np.sqrt(d2.A0[0])
     k156 = parent.f[-1] * np.sqrt(parent.A0[-1])
     fr1 = k1 - x[0] - theta*(x[2]**2/x[11] + B_p_mp) +\
             gamma*(-2*np.pi*R0_p_mp*x[2]/(parent.delta*parent.Re*x[11]) +\
             parent.dBdx(parent.L+parent.dx/2, x[11]))
     fr2 = k2 - x[3] + theta*(x[5]**2/x[14] + B_d1_mp) +\
             gamma*(-2*np.pi*R0_d1_mp*x[5]/(d1.delta*d1.Re*x[14]) +\
             d1.dBdx(-d1.dx/2, x[14]))
     fr3 = k3 - x[6] + theta*(x[8]**2/x[17] + B_d2_mp) +\
             gamma*(-2*np.pi*R0_d2_mp*x[8]/(d2.delta*d2.Re*x[17]) +\
             d2.dBdx(-d2.dx/2, x[17]))
     fr4 = -x[9] - theta * x[2] + k4
     fr5 = -x[12] + theta * x[5] + k5
     fr6 = -x[15] + theta * x[8] + k6
     fr7 = -x[1] + x[2] / 2 + k7
     fr8 = -x[4] + x[5] / 2 + k8
     fr9 = -x[7] + x[8] / 2 + k9
     fr10 = -x[10] + x[11] / 2 + k10
     fr11 = -x[13] + x[14] / 2 + k11
     fr12 = -x[16] + x[17] / 2 + k12
     fr13 = -x[1] + x[4] + x[7]
     fr14 = -x[0] + x[3] + x[6]
     fr15 = k156 / np.sqrt(x[10]) - k15b / np.sqrt(x[13]) + k15a
     fr16 = k156 / np.sqrt(x[10]) - k16b / np.sqrt(x[16]) + k16a
     fr17 = k156 / np.sqrt(x[9]) - k15b / np.sqrt(x[12]) + k15a
     fr18 = k156 / np.sqrt(x[9]) - k16b / np.sqrt(x[15]) + k16a
     return np.array([
         fr1, fr2, fr3, fr4, fr5, fr6, fr7, fr8, fr9, fr10, fr11, fr12,
         fr13, fr14, fr15, fr16, fr17, fr18
     ])