def __init__(self, cell: Cell, cell_basis_l: Basis, cell_basis_k: Basis, cell_basis_k1: Basis, unknown: Unknown): """ ================================================================================================================ Class : ================================================================================================================ ================================================================================================================ Parameters : ================================================================================================================ ================================================================================================================ Attributes : ================================================================================================================ """ # -------------------------------------------------------------------------------------------------------------- # Building the cell # -------------------------------------------------------------------------------------------------------------- centroid = cell.centroid volume = cell.volume quadrature_points = cell.quadrature_points quadrature_weights = cell.quadrature_weights # -------------------------------------------------------------------------------------------------------------- super().__init__(centroid, volume, diameter, quadrature_points, quadrature_weights) m_phi_k_phi_k = Integration.get_cell_mass_matrix_in_cell(cell, cell_basis_k, cell_basis_k) m_phi_k_phi_k_inv = np.linalg.inv(m_phi_k_phi_k) m_grad_phi_k1_grad_phi_k1_list = [] m_phi_k_grad_phi_l_list = [] m_grad_phi_k1_phi_l_list = [] for j in range(unknown.problem_dimension): # ---------------------------------------------------------------------------------------------------------- m_grad_phi_k1_grad_phi_k1_j = Integration.get_cell_stiffness_matrix_in_cell( cell, cell_basis_k1, cell_basis_k1, j ) m_grad_phi_k1_grad_phi_k1_list.append(m_grad_phi_k1_grad_phi_k1_j) # ---------------------------------------------------------------------------------------------------------- m_phi_k_grad_phi_l_j = Integration.get_cell_advection_matrix_in_cell(cell, cell_basis_k, cell_basis_l, j) m_phi_k_grad_phi_l_list.append(m_phi_k_grad_phi_l_j) # ---------------------------------------------------------------------------------------------------------- m_phi_l_grad_phi_k1_j = Integration.get_cell_advection_matrix_in_cell(cell, cell_basis_l, cell_basis_k1, j) m_grad_phi_k1_phi_l_j = m_phi_l_grad_phi_k1_j.T m_grad_phi_k1_phi_l_list.append(m_grad_phi_k1_phi_l_j)
def compute_cell_matrices(self, cell: Cell, cell_basis_l: Basis, cell_basis_k: Basis, cell_basis_k1: Basis, unknown: Unknown): """ ================================================================================================================ Method : ================================================================================================================ ================================================================================================================ Parameters : ================================================================================================================ - ================================================================================================================ Returns : ================================================================================================================ - """ # ============================================================================================================== # GRADIENT OPERATOR # ============================================================================================================== # left-hand side # -------------------------------------------------------------------------------------------------------------- mat_T_phi_k_phi_k = Integration.get_cell_mass_matrix_in_cell( cell, cell_basis_k, cell_basis_k) mat_T_phi_k_phi_k_inv = np.linalg.inv(mat_T_phi_k_phi_k) # -------------------------------------------------------------------------------------------------------------- # right-hand side # -------------------------------------------------------------------------------------------------------------- mat_T_phi_k_grad_phi_l_list = [] for j in range(unknown.problem_dimension): mat_T_phi_k_grad_phi_l = Integration.get_cell_advection_matrix_in_cell( cell, cell_basis_k, cell_basis_l, j) mat_T_phi_k_grad_phi_l_list.append(mat_T_phi_k_grad_phi_l) # ============================================================================================================== # RECONSTRUCTION OPERATOR # ============================================================================================================== # left-hand side # -------------------------------------------------------------------------------------------------------------- mat_T_grad_phi_k1_grad_phi_k1_inv_list = [] for j in range(unknown.problem_dimension): mat_T_grad_phi_k1_grad_phi_k1_j = Integration.get_cell_stiffness_matrix_in_cell( cell, cell_basis_k1, cell_basis_k1, j) mat_T_grad_phi_k1_grad_phi_k1_inv_list.append( mat_T_grad_phi_k1_grad_phi_k1_j) # -------------------------------------------------------------------------------------------------------------- # right-hand side # -------------------------------------------------------------------------------------------------------------- mat_T_grad_phi_k1_phi_l_list = [] for j in range(unknown.problem_dimension): mat_T_phi_l_grad_phi_k1_j = Integration.get_cell_advection_matrix_in_cell( cell, cell_basis_l, cell_basis_k1, j) mat_T_grad_phi_k1_phi_l_j = mat_T_phi_l_grad_phi_k1_j.T mat_T_grad_phi_k1_phi_l_list.append(mat_T_grad_phi_k1_phi_l_j) # ============================================================================================================== # STABILIZATION OPERATOR # ============================================================================================================== mat_T_phi_k_phi_k1 = Integration.get_cell_mass_matrix_in_cell( cell, cell_basis_k, cell_basis_k1) proj_T_T_k1_k = mat_T_phi_k_phi_k_inv @ mat_T_phi_k_phi_k1 # ============================================================================================================== # PROJECTION OPERATOR # ============================================================================================================== mat_T_phi_l_phi_l = Integration.get_cell_mass_matrix_in_cell( cell, cell_basis_l, cell_basis_l) mat_T_phi_l_phi_l_inv = np.linalg.inv(mat_T_phi_l_phi_l) return ( mat_T_phi_k_phi_k_inv, mat_T_phi_k_grad_phi_l_list, mat_T_grad_phi_k1_grad_phi_k1_inv_list, mat_T_grad_phi_k1_phi_l_list, proj_T_T_k1_k, )
def __init__( self, cell_vertices_connectivity_matrix: Mat, cell: Cell, cell_basis_l: Basis, cell_basis_k: Basis, cell_basis_k1: Basis, ): """ ================================================================================================================ Class : ================================================================================================================ The Mcell class ================================================================================================================ Parameters : ================================================================================================================ - ================================================================================================================ Attributes : ================================================================================================================ - """ # ============================================================================================================== # GRADIENT OPERATOR # ============================================================================================================== # left-hand side # -------------------------------------------------------------------------------------------------------------- mat_T_phi_k_phi_k = Integration.get_cell_mass_matrix_in_cell( cell, cell_basis_k, cell_basis_k) mat_T_phi_k_phi_k_inv = np.linalg.inv(mat_T_phi_k_phi_k) # -------------------------------------------------------------------------------------------------------------- # right-hand side # -------------------------------------------------------------------------------------------------------------- mat_T_phi_k_grad_phi_l_x = Integration.get_cell_advection_matrix_in_cell( cell, cell_basis_k, cell_basis_l, 0) mat_T_phi_k_grad_phi_l_y = Integration.get_cell_advection_matrix_in_cell( cell, cell_basis_k, cell_basis_l, 1) mat_T_phi_k_grad_phi_l_list = [ mat_T_phi_k_grad_phi_l_x, mat_T_phi_k_grad_phi_l_y ] # ============================================================================================================== # RECONSTRUCTION OPERATOR # ============================================================================================================== # left-hand side # -------------------------------------------------------------------------------------------------------------- mat_T_grad_phi_k1_grad_phi_k1_x = Integration.get_cell_stiffness_matrix_in_cell( cell, cell_basis_k1, cell_basis_k1, 0) mat_T_grad_phi_k1_grad_phi_k1_y = Integration.get_cell_stiffness_matrix_in_cell( cell, cell_basis_k1, cell_basis_k1, 1) mat_T_grad_phi_k1_grad_phi_k1_inv_list = [ mat_T_grad_phi_k1_grad_phi_k1_x, mat_T_grad_phi_k1_grad_phi_k1_y ] # -------------------------------------------------------------------------------------------------------------- # right-hand side # -------------------------------------------------------------------------------------------------------------- mat_T_phi_l_grad_phi_k1_x = Integration.get_cell_advection_matrix_in_cell( cell, cell_basis_l, cell_basis_k1, 0) mat_T_phi_l_grad_phi_k1_y = Integration.get_cell_advection_matrix_in_cell( cell, cell_basis_l, cell_basis_k1, 1) mat_T_grad_phi_k1_phi_l_list = [ mat_T_phi_l_grad_phi_k1_x, mat_T_phi_l_grad_phi_k1_y ] # ============================================================================================================== # STABILIZATION OPERATOR # ============================================================================================================== mat_T_phi_k_phi_k1 = Integration.get_cell_mass_matrix_in_cell( cell, cell_basis_k, cell_basis_k1) proj_T_T_k1_k = mat_T_phi_k_phi_k_inv @ mat_T_phi_k_phi_k1 # ============================================================================================================== # PROJECTION OPERATOR # ============================================================================================================== mat_T_phi_l_phi_l = Integration.get_cell_mass_matrix_in_cell( cell, cell_basis_l, cell_basis_l) mat_T_phi_l_phi_l_inv = np.linalg.inv(mat_T_phi_l_phi_l)
def get_local_gradient_operator( self, cell: Cell, faces: List[Face], cell_basis_l: Basis, cell_basis_k: Basis, cell_basis_k1: Basis, face_basis_k: Basis, unknown: Unknown, ) -> Mat: """ ================================================================================================================ Method : ================================================================================================================ ================================================================================================================ Parameters : ================================================================================================================ - ================================================================================================================ Returns : ================================================================================================================ - """ # -------------------------------------------------------------------------------------------------------------- # Getting the local problem size depending on the problem dimension and the field dimension # -------------------------------------------------------------------------------------------------------------- local_problem_size = self.get_local_problem_size( faces, cell_basis_l, face_basis_k, unknown) # -------------------------------------------------------------------------------------------------------------- # Initializing the local gradient operator matrix # -------------------------------------------------------------------------------------------------------------- local_gradient_operator = np.zeros( (len(unknown.indices) * cell_basis_k.basis_dimension, local_problem_size)) # -------------------------------------------------------------------------------------------------------------- m_cell_phi_k_phi_k = Integration.get_cell_mass_matrix_in_cell( cell, cell_basis_k, cell_basis_k) m_cell_phi_k_phi_k_inv = np.linalg.inv(m_cell_phi_k_phi_k) # -------------------------------------------------------------------------------------------------------------- derivative_directions = range(unknown.problem_dimension) directions = range(unknown.field_dimension) for j in derivative_directions: # ---------------------------------------------------------------------------------------------------------- # Compting matrices 1 # ---------------------------------------------------------------------------------------------------------- m_cell_phi_k_grad_phi_l = Integration.get_cell_advection_matrix_in_cell( cell, cell_basis_k, cell_basis_l, j) for f, face in enumerate(faces): passmat = Operator.get_face_passmat(cell, face) normal_vector_component = passmat[-1, j] # m_face_phi_l_psi_k = Integration.get_hybrid_mass_matrix_in_face( # cell, face, cell_basis_l, face_basis_k, passmat # ) m_face_phi_k_psi_k = Integration.get_hybrid_mass_matrix_in_face( cell, face, cell_basis_k, face_basis_k, passmat) m_face_phi_k_phi_l = Integration.get_cell_mass_matrix_in_face( cell, face, cell_basis_k, cell_basis_l) for i in directions: # -------------------------------------------------------------------------------------------------- # bkbjkj # -------------------------------------------------------------------------------------------------- line = self.get_line_from_indices(i, j, unknown) r0 = line * cell_basis_k.basis_dimension r1 = (line + 1) * cell_basis_k.basis_dimension # -------------------------------------------------------------------------------------------------- c0_T = i * cell_basis_l.basis_dimension c1_T = (i + 1) * cell_basis_l.basis_dimension # -------------------------------------------------------------------------------------------------- # Getting the indices corresponding to the face_index-th face for the field on the ith axis # -------------------------------------------------------------------------------------------------- c0_F = (unknown.field_dimension * cell_basis_l.basis_dimension + f * unknown.field_dimension * face_basis_k.basis_dimension + i * face_basis_k.basis_dimension) c1_F = (unknown.field_dimension * cell_basis_l.basis_dimension + f * unknown.field_dimension * face_basis_k.basis_dimension + (i + 1) * face_basis_k.basis_dimension) # -------------------------------------------------------------------------------------------------- # grad # -------------------------------------------------------------------------------------------------- # local_gradient_operator[r0:r1, c0_T:c1_T] += m_cell_phi_k_grad_phi_l local_gradient_operator[ r0:r1, c0_F: c1_F] += m_face_phi_k_psi_k * normal_vector_component local_gradient_operator[ r0:r1, c0_T: c1_T] -= m_face_phi_k_phi_l * normal_vector_component for i in directions: line = self.get_line_from_indices(i, j, unknown) r0 = line * cell_basis_k.basis_dimension r1 = (line + 1) * cell_basis_k.basis_dimension # ------------------------------------------------------------------------------------------------------ c0_T = i * cell_basis_l.basis_dimension c1_T = (i + 1) * cell_basis_l.basis_dimension local_gradient_operator[r0:r1, c0_T:c1_T] += m_cell_phi_k_grad_phi_l local_gradient_operator[ r0: r1, :] = m_cell_phi_k_phi_k_inv @ local_gradient_operator[ r0:r1, :] return local_gradient_operator
def __init__( self, cell_vertices_connectivity_matrix: Mat, cell: Cell, cell_basis_l: Basis, cell_basis_k: Basis, cell_basis_k1: Basis, unknown: Unknown, ): """ ================================================================================================================ Class : ================================================================================================================ The Mcell class ================================================================================================================ Parameters : ================================================================================================================ - ================================================================================================================ Attributes : ================================================================================================================ - """ # ============================================================================================================== # GRADIENT OPERATOR # ============================================================================================================== # left-hand side # -------------------------------------------------------------------------------------------------------------- mat_T_phi_k_phi_k = Integration.get_cell_mass_matrix_in_cell( cell, cell_basis_k, cell_basis_k) self.mat_T_phi_k_phi_k_inv = np.linalg.inv(mat_T_phi_k_phi_k) # -------------------------------------------------------------------------------------------------------------- # right-hand side # -------------------------------------------------------------------------------------------------------------- self.mat_T_phi_k_grad_phi_l_list = [] for j in range(unknown.problem_dimension): mat_T_phi_k_grad_phi_l = Integration.get_cell_advection_matrix_in_cell( cell, cell_basis_k, cell_basis_l, j) self.mat_T_phi_k_grad_phi_l_list.append(mat_T_phi_k_grad_phi_l) # ============================================================================================================== # RECONSTRUCTION OPERATOR # ============================================================================================================== # left-hand side # -------------------------------------------------------------------------------------------------------------- self.mat_T_grad_phi_k1_grad_phi_k1_inv_list = [] for j in range(unknown.problem_dimension): mat_T_grad_phi_k1_grad_phi_k1_j = Integration.get_cell_stiffness_matrix_in_cell( cell, cell_basis_k1, cell_basis_k1, j) self.mat_T_grad_phi_k1_grad_phi_k1_inv_list.append( mat_T_grad_phi_k1_grad_phi_k1_j) # -------------------------------------------------------------------------------------------------------------- # right-hand side # -------------------------------------------------------------------------------------------------------------- self.mat_T_grad_phi_k1_phi_l_list = [] for j in range(unknown.problem_dimension): mat_T_phi_l_grad_phi_k1_j = Integration.get_cell_advection_matrix_in_cell( cell, cell_basis_l, cell_basis_k1, j) mat_T_grad_phi_k1_phi_l_j = mat_T_phi_l_grad_phi_k1_j.T self.mat_T_grad_phi_k1_phi_l_list.append(mat_T_grad_phi_k1_phi_l_j) # ============================================================================================================== # STABILIZATION OPERATOR # ============================================================================================================== mat_T_phi_k_phi_k1 = Integration.get_cell_mass_matrix_in_cell( cell, cell_basis_k, cell_basis_k1) self.proj_T_T_k1_k = mat_T_phi_k_phi_k_inv @ mat_T_phi_k_phi_k1 # ============================================================================================================== # PROJECTION OPERATOR # ============================================================================================================== mat_T_phi_l_phi_l = Integration.get_cell_mass_matrix_in_cell( cell, cell_basis_l, cell_basis_l) self.mat_T_phi_l_phi_l_inv = np.linalg.inv(mat_T_phi_l_phi_l)
def compute_cell_matrices(self, cell: Cell, cell_basis_l: Basis, cell_basis_k: Basis, cell_basis_k1: Basis): """ ================================================================================================================ Method : ================================================================================================================ ================================================================================================================ Parameters : ================================================================================================================ - ================================================================================================================ Returns : ================================================================================================================ - """ # ============================================================================================================== # GRADIENT OPERATOR # ============================================================================================================== # left-hand side # -------------------------------------------------------------------------------------------------------------- mat_T_phi_k_phi_k = Integration.get_cell_mass_matrix_in_cell( cell, cell_basis_k, cell_basis_k) mat_T_phi_k_phi_k_inv = np.linalg.inv(mat_T_phi_k_phi_k) # -------------------------------------------------------------------------------------------------------------- # right-hand side # -------------------------------------------------------------------------------------------------------------- mat_T_phi_k_grad_phi_l_x = Integration.get_cell_advection_matrix_in_cell( cell, cell_basis_k, cell_basis_l, 0) mat_T_phi_k_grad_phi_l_list = [mat_T_phi_k_grad_phi_l_x] # ============================================================================================================== # RECONSTRUCTION OPERATOR # ============================================================================================================== # left-hand side # -------------------------------------------------------------------------------------------------------------- mat_T_grad_phi_k1_grad_phi_k1_x = Integration.get_cell_stiffness_matrix_in_cell( cell, cell_basis_k1, cell_basis_k1, 0) mat_T_grad_phi_k1_grad_phi_k1_inv_list = [ mat_T_grad_phi_k1_grad_phi_k1_x ] # -------------------------------------------------------------------------------------------------------------- # right-hand side # -------------------------------------------------------------------------------------------------------------- mat_T_phi_l_grad_phi_k1_x = Integration.get_cell_advection_matrix_in_cell( cell, cell_basis_l, cell_basis_k1, 0) mat_T_grad_phi_k1_phi_l_x = mat_T_phi_l_grad_phi_k1_x.T mat_T_grad_phi_k1_phi_l_list = [mat_T_grad_phi_k1_phi_l_x] # ============================================================================================================== # STABILIZATION OPERATOR # ============================================================================================================== mat_T_phi_k_phi_k1 = Integration.get_cell_mass_matrix_in_cell( cell, cell_basis_k, cell_basis_k1) proj_T_T_k1_k = mat_T_phi_k_phi_k_inv @ mat_T_phi_k_phi_k1 # ============================================================================================================== # PROJECTION OPERATOR # ============================================================================================================== mat_T_phi_l_phi_l = Integration.get_cell_mass_matrix_in_cell( cell, cell_basis_l, cell_basis_l) mat_T_phi_l_phi_l_inv = np.linalg.inv(mat_T_phi_l_phi_l) return ( mat_T_phi_k_phi_k_inv, mat_T_phi_k_grad_phi_l_list, mat_T_grad_phi_k1_grad_phi_k1_inv_list, mat_T_grad_phi_k1_phi_l_list, proj_T_T_k1_k, )