예제 #1
0
    def set_numQuadPts_for_bilinear(self, numQuadPts):
        self.numQuadPts = np.asarray(numQuadPts)

        self.points, self.weights = quad.Quadrature.get_gauss_quad(numQuadPts)

        if self.problemType == 1 or self.problemType == 2:

            self.basisAtQuadPts = np.empty(self.grid.order + 1, np)
            for I in itertools.product(
                    *[range(n) for n in (self.grid.order + 1)]):
                self.basisAtQuadPts[I] = np.zeros(numQuadPts)

            basis = self.grid.referenceElement.nodal_basis

            for I in itertools.product(
                    *[range(n) for n in (self.grid.order + 1)]):
                for J in itertools.product(*[range(n) for n in (numQuadPts)]):
                    self.basisAtQuadPts[I][J] = basis[I].value(self.points[J])

        if self.problemType == 2:
            self.basisGradAtQuadPts = np.empty(self.grid.order + 1, np)

            for I in itertools.product(
                    *[range(n) for n in (self.grid.order + 1)]):
                self.basisGradAtQuadPts[I] = np.zeros(
                    np.hstack((numQuadPts, self.grid.domain.dimension)))

            basisGrad = self.grid.referenceElement.nodal_basis_gradient

            for I in itertools.product(
                    *[range(n) for n in (self.grid.order + 1)]):
                for J in itertools.product(*[range(n) for n in (numQuadPts)]):
                    self.basisGradAtQuadPts[I][J] = np.asarray(
                        polyNd.get_value_for_polyNdarray(
                            basisGrad[I], self.points[J]))
예제 #2
0
    def build_interpolation_operators(self):

        order_double_grid = self.grid.referenceElement.order_double_grid
        order = self.grid.referenceElement.order

        RefElement = RectReferenceElement(1, [order[0]])
        RefElement.set_order_double_grid([order_double_grid[0]])

        RefElement.set_nodal_coord()
        RefElement.set_nodal_coord_double_grid()

        RefElement.set_nodal_basis()
        RefElement.set_nodal_basis_double_grid()
        RefElement.set_first_order_derivatives()

        basis = RefElement.nodal_basis
        basisGrad = RefElement.nodal_basis_gradient

        if self.problemType == 1 or self.problemType == 2:
            B = np.zeros((order_double_grid[0] + 1, order[0] + 1))

            i = 0
            for I in itertools.product(
                    *[range(n) for n in RefElement.numNodes]):
                S = tuple(I[::-1])
                j = 0
                for J in itertools.product(
                        *[range(n) for n in RefElement.numNodes_double_grid]):
                    T = tuple(J[::-1])
                    B[j, i] = basis[S].value(RefElement.coord_double_grid[T])
                    j += 1
                i += 1

            self.grid.referenceElement.B = scsp.csr_matrix(B)
            self.grid.referenceElement.B_adj = scsp.csr_matrix(B.T)

        if self.problemType == 2:

            self.grid.referenceElement.B_1 = self.grid.referenceElement.B
            self.grid.referenceElement.B_1_adj = scsp.csr_matrix(B.T)

            B_2 = scsp.lil_matrix((order_double_grid[0] + 1, order[0] + 1))

            for i in range(np.prod(RefElement.numNodes)):
                S = RefElement.get_local_nodeID(i)
                for j in range(np.prod(RefElement.numNodes_double_grid)):
                    T = RefElement.get_local_nodeID(i)
                    B_2[j, i] = polyNd.get_value_for_polyNdarray(
                        basisGrad[i], RefElement.coord_double_grid[j])

            self.grid.referenceElement.B_2 = B_2.tocsr()
            self.grid.referenceElement.B_2_adj = B_2.transpose().tocsr()
예제 #3
0
    def build_interpolation_operators(self):
        numNodes_double_grid = self.grid.referenceElement.numNodes_double_grid
        numNodes = self.grid.referenceElement.numNodes
        basis = self.grid.referenceElement.nodal_basis

        if self.problemType == 1:
            B = np.zeros((np.prod(numNodes_double_grid), np.prod(numNodes)))

            i = 0
            for I in itertools.product(*[range(n) for n in numNodes]):
                S = tuple(I[::-1])
                j = 0
                for J in itertools.product(
                        *[range(n) for n in numNodes_double_grid]):
                    T = tuple(J[::-1])
                    B[j, i] = basis[S].value(
                        self.grid.referenceElement.coord_double_grid[T])
                    j += 1
                i += 1

            self.grid.referenceElement.B = scsp.csr_matrix(B)
            self.grid.referenceElement.B_adj = scsp.csr_matrix(B.T)

        elif self.problemType == 2:

            basisGrad = self.grid.referenceElement.nodal_basis_gradient
            B = np.zeros((self.grid.domain.dimension,
                          np.prod(numNodes_double_grid), np.prod(numNodes)))

            i = 0
            for I in itertools.product(*[range(n) for n in numNodes]):
                S = tuple(I[::-1])
                j = 0
                for J in itertools.product(
                        *[range(n) for n in numNodes_double_grid]):
                    T = tuple(J[::-1])
                    B[:, j, i] = polyNd.get_value_for_polyNdarray(
                        basisGrad[S],
                        self.grid.referenceElement.coord_double_grid[T])
                    j += 1
                i += 1

            for dim in range(self.grid.domain.dimension):
                self.grid.referenceElement.B.append(
                    scsp.csr_matrix(B[dim, :, :]))

            for k in range(np.prod(numNodes)):
                self.grid.referenceElement.B_adj.append(
                    scsp.csr_matrix(B[:, :, k]))