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]))
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()
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]))