Beispiel #1
0
    def _set_mass_mtx(self, tol):
        """set up the mass matrix"""

        self.M = numpy.matrix(numpy.zeros((self.n_nodes, self.n_nodes)))

        # 1st step: handle boundary modes
        self.M[0, 0] = 2. / 3.
        self.M[0, -1] = self.M[-1, 0] = 1. / 3.
        self.M[-1, -1] = 2. / 3.

        if self.n_nodes > 2:
            self.M[0, 1] = self.M[1, 0] = \
                jacobi_orthogonal_constant(0, 1, 1) / 8.
            self.M[1, -1] = self.M[-1, 1] = \
                jacobi_orthogonal_constant(0, 1, 1) / 8.

        if self.n_nodes > 3:
            self.M[0, 2] = self.M[2, 0] = \
                - jacobi_orthogonal_constant(1, 1, 1) / 16.
            self.M[2, -1] = self.M[-1, 2] = \
                jacobi_orthogonal_constant(1, 1, 1) / 16.

        # 2nd step: handle interior modes
        for i, p in enumerate(self.expn[1:-1]):
            for j in range(i + 1, min(self.n_nodes - 1, i + 2 + 2), 2):
                pi = (p * self.expn[j]).integral()
                self.M[i + 1, j] = self.M[j, i + 1] = pi(1) - pi(-1)
Beispiel #2
0
        def A(i):
            def Ac(i, j):
                return (i + 1) * (j + 1) / 16.

            a1, a2, a3, a4 = jacobi_recr_coeffs(i - 1, 0, 0)
            a1 /= a3
            a4 /= a3

            try:
                b1, b2, b3, b4 = jacobi_recr_coeffs(i - 3, 0, 0)
                b1 /= b3
                b4 /= b3
            except JacobiOrderError:
                b1 = b3 = b4 = 0
            except:
                raise

            c1, c2, c3, c4 = jacobi_recr_coeffs(i + 1, 0, 0)
            c1 /= c3
            c4 /= c3

            try:
                A1 = Ac(i, i-2) * \
                    a4 * b1 * jacobi_orthogonal_constant(i-2, 0, 0)
            except JacobiOrderError:
                A1 = 0
            except:
                raise

            A2 = a1 * a1 * jacobi_orthogonal_constant(i, 0, 0)
            try:
                A2 += a4 * a4 * jacobi_orthogonal_constant(i - 2, 0, 0)
            except JacobiOrderError:
                A2 += 0
            except:
                raise

            A2 *= Ac(i, i)

            A3 = Ac(i, i + 2) * a1 * c4 * jacobi_orthogonal_constant(i, 0, 0)

            return A1, A2, A3
Beispiel #3
0
        def B(i):
            def Bc(i, j):
                return -(i + 1) * (j - 1) / 16.

            a1, a2, a3, a4 = jacobi_recr_coeffs(i - 1, 0, 0)
            a1 /= a3
            a4 /= a3

            B1 = 0

            try:
                B2 = Bc(i, i) * a4 * jacobi_orthogonal_constant(i - 2, 0, 0)
            except JacobiOrderError:
                B2 = 0
            except:
                raise

            B3 = Bc(i, i + 2) * a1 * jacobi_orthogonal_constant(i, 0, 0)

            return B1, B2, B3
Beispiel #4
0
        def C(i):
            def Cc(i, j):
                return -(j + 1) * (i - 1) / 16.

            try:
                a1, a2, a3, a4 = jacobi_recr_coeffs(i - 2, 0, 0)
                a1 /= a3
                a4 /= a3
            except JacobiOrderError:
                a1 = a4 = 0
            except:
                raise

            try:
                C1 = Cc(i, i - 2) * a4 * jacobi_orthogonal_constant(
                    i - 3, 0, 0)
            except JacobiOrderError:
                C1 = 0
            except:
                raise
            C2 = Cc(i, i) * a1 * jacobi_orthogonal_constant(i - 1, 0, 0)
            C3 = 0

            return C1, C2, C3
Beispiel #5
0
        def D(i):
            def Dc(i, j):
                return (j - 1) * (i - 1) / 16.

            D1 = 0

            try:
                D2 = Dc(i, i) * jacobi_orthogonal_constant(i - 2, 0, 0)
            except JacobiOrderError:
                D2 = 0
            except:
                raise

            D3 = 0

            return D1, D2, D3
Beispiel #6
0
    def _set_weak_laplacian(self, tol=1e-12):
        """set up the mass matrix"""

        self.wL = numpy.matrix(numpy.zeros((self.n_nodes, self.n_nodes)))

        # boundary-boundary
        self.wL[0, 0] = self.wL[-1, -1] = 0.5
        self.wL[0, -1] = self.wL[-1, 0] = -0.5

        # boundary-interior
        # all zeros

        # interior-interior
        # only diagonal entities are non-zeros
        for i in range(1, self.n_nodes - 1):
            self.wL[i, i] = \
                i * (i + 1) * jacobi_orthogonal_constant(i-1, 1, 1) / 16.