def get_local_reconstruction_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_reconstruction_operator = np.zeros( ((unknown.field_dimension) * cell_basis_k1.basis_dimension, local_problem_size)) # -------------------------------------------------------------------------------------------------------------- derivative_directions = range(unknown.problem_dimension) directions = range(unknown.field_dimension) m_cell_grad_phi_k1_grad_phi_k1_sum = np.zeros( (cell_basis_k1.basis_dimension, cell_basis_k1.basis_dimension)) m_cell_grad_phi_k1_grad_phi_l_sum = np.zeros( (cell_basis_k1.basis_dimension, cell_basis_l.basis_dimension)) for j in derivative_directions: m_cell_grad_phi_k1_grad_phi_k1 = Integration.get_cell_stiffness_matrix_in_cell( cell, cell_basis_k1, cell_basis_k1, j) m_cell_grad_phi_k1_grad_phi_k1_sum += m_cell_grad_phi_k1_grad_phi_k1 m_cell_grad_phi_k1_grad_phi_l = Integration.get_cell_stiffness_matrix_in_cell( cell, cell_basis_k1, cell_basis_l, j) m_cell_grad_phi_k1_grad_phi_l_sum += m_cell_grad_phi_k1_grad_phi_l for f, face in enumerate(faces): passmat = Operator.get_face_passmat(cell, face) normal_vector_component = passmat[-1, j] m_face_grad_phi_k1_phi_l_sum = np.zeros( (cell_basis_k1.basis_dimension, cell_basis_l.basis_dimension)) m_face_grad_phi_k1_psi_k_sum = np.zeros( (cell_basis_k1.basis_dimension, face_basis_k.basis_dimension)) for j in derivative_directions: m_face_grad_phi_k1_psi_k = Integration.get_hybrid_advection_matrix_in_face( cell, face, cell_basis_k1, face_basis_k, passmat, j) m_face_grad_phi_k1_psi_k_sum += m_face_grad_phi_k1_psi_k m_face_phi_l_grad_phi_k1 = Integration.get_cell_advection_matrix_in_face( cell, face, cell_basis_l, cell_basis_k1, j) m_face_grad_phi_k1_phi_l = m_face_phi_l_grad_phi_k1.T m_face_grad_phi_k1_phi_l_sum += m_face_grad_phi_k1_phi_l for i in directions: # -------------------------------------------------------------------------------------------------- # bkbjkj # -------------------------------------------------------------------------------------------------- r0 = i * cell_basis_k1.basis_dimension r1 = (i + 1) * cell_basis_k1.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) c0_T = i * cell_basis_l.basis_dimension c1_T = (i + 1) * cell_basis_l.basis_dimension # -------------------------------------------------------------------------------------------------- # rec # -------------------------------------------------------------------------------------------------- local_reconstruction_operator[r0:r1, c0_F:c1_F] += ( m_face_grad_phi_k1_psi_k_sum * normal_vector_component) local_reconstruction_operator[r0:r1, c0_T:c1_T] -= ( m_face_grad_phi_k1_phi_l_sum * normal_vector_component) for i in directions: r0 = i * cell_basis_k1.basis_dimension r1 = (i + 1) * cell_basis_k1.basis_dimension m_cell_grad_phi_k1_grad_phi_k1_sum_inv = np.linalg.inv( m_cell_grad_phi_k1_grad_phi_k1_sum[1:, 1:]) local_reconstruction_operator[r0 + 1:r1, :] = ( m_cell_grad_phi_k1_grad_phi_k1_sum_inv @ local_reconstruction_operator[r0 + 1:r1, :]) # ------------------------------------------------------------------------------------------------------ cell_integration_vector_k1 = Integration.get_cell_integration_vector( cell, cell_basis_k1) cell_integration_vector_l = Integration.get_cell_integration_vector( cell, cell_basis_l) # ------------------------------------------------------------------------------------------------------ m_mat = np.zeros( (cell_basis_l.basis_dimension, local_problem_size)) c0_m = i * cell_basis_l.basis_dimension c1_m = (i + 1) * cell_basis_l.basis_dimension m_mat[:, c0_m:c1_m] += np.eye(cell_basis_l.basis_dimension) # ------------------------------------------------------------------------------------------------------ a = (cell_integration_vector_l @ m_mat - cell_integration_vector_k1[1:] @ local_reconstruction_operator[r0 + 1:r1, :]) a = (1.0 / cell_integration_vector_k1[0]) * a local_reconstruction_operator[r0:r0 + 1, :] = a # for i in directions: # r0 = i * cell_basis_k1.basis_dimension # r1 = (i + 1) * cell_basis_k1.basis_dimension # c0_T = i * cell_basis_l.basis_dimension # c1_T = (i + 1) * cell_basis_l.basis_dimension # # # local_reconstruction_operator[r0:r1, c0_T:c1_T] += m_cell_grad_phi_k1_grad_phi_l_sum # local_reconstruction_operator[r0:r1, :] = local_reconstruction_operator[r0:r1, :] # for j in derivative_directions: # # ------------------------------------------------------------------------------------------------------ # # Compting matrices 1 # # ------------------------------------------------------------------------------------------------------ # m_cell_grad_phi_k1_grad_phi_k1 = Integration.get_cell_stiffness_matrix_in_cell( # cell, cell_basis_k1, cell_basis_k1, j # ) # m_cell_grad_phi_k1_grad_phi_k1_sum += m_cell_grad_phi_k1_grad_phi_k1 # m_cell_grad_phi_k1_grad_phi_l = Integration.get_cell_stiffness_matrix_in_cell( # cell, cell_basis_k1, 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_grad_phi_k1_psi_k # m_face_grad_phi_k1_psi_k = Integration.get_hybrid_advection_matrix_in_face( # cell, face, cell_basis_k1, face_basis_k, passmat, j # ) # # m_face_grad_phi_k1_phi_l = Integration.get_cell_advection_matrix_in_face( # # cell, face, cell_basis_k1, cell_basis_l, j # # ) # m_face_phi_l_grad_phi_k1 = Integration.get_cell_advection_matrix_in_face( # cell, face, cell_basis_l, cell_basis_k1, j # ) # m_face_grad_phi_k1_phi_l = m_face_phi_l_grad_phi_k1.T # for i in directions: # # -------------------------------------------------------------------------------------------------- # # bkbjkj # # -------------------------------------------------------------------------------------------------- # r0 = i * cell_basis_k1.basis_dimension # r1 = (i + 1) * cell_basis_k1.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 # ) # # -------------------------------------------------------------------------------------------------- # # rec # # -------------------------------------------------------------------------------------------------- # local_reconstruction_operator[r0:r1, c0_F:c1_F] += ( # m_face_grad_phi_k1_psi_k * normal_vector_component # ) # local_reconstruction_operator[r0:r1, c0_T:c1_T] -= ( # m_face_grad_phi_k1_phi_l * normal_vector_component # ) # for i in directions: # r0 = i * cell_basis_k1.basis_dimension # r1 = (i + 1) * cell_basis_k1.basis_dimension # # ------------------------------------------------------------------------------------------------------ # c0_T = i * cell_basis_l.basis_dimension # c1_T = (i + 1) * cell_basis_l.basis_dimension # local_reconstruction_operator[r0:r1, c0_T:c1_T] += m_cell_grad_phi_k1_grad_phi_l # # -------------------------------------------------------------------------------------------------------------- # for i in directions: # # a_sum = np.zeros((local_problem_size,)) # # for i_sum in directions: # r0 = i * cell_basis_k1.basis_dimension # r1 = (i + 1) * cell_basis_k1.basis_dimension # # print("grad_matrx : \n{}".format(m_cell_grad_phi_k1_grad_phi_k1_sum[1:, 1:])) # m_cell_grad_phi_k1_grad_phi_k1_sum_inv = np.linalg.inv(m_cell_grad_phi_k1_grad_phi_k1_sum[1:, 1:]) # local_reconstruction_operator[r0 + 1 : r1, :] = ( # m_cell_grad_phi_k1_grad_phi_k1_sum_inv @ local_reconstruction_operator[r0 + 1 : r1, :] # ) # # ------------------------------------------------------------------------------------------------------ # cell_integration_vector_k1 = Integration.get_cell_integration_vector(cell, cell_basis_k1) # cell_integration_vector_l = Integration.get_cell_integration_vector(cell, cell_basis_l) # # ------------------------------------------------------------------------------------------------------ # m_mat = np.zeros((cell_basis_l.basis_dimension, local_problem_size)) # c0_m = i * cell_basis_l.basis_dimension # c1_m = (i + 1) * cell_basis_l.basis_dimension # m_mat[:, c0_m:c1_m] += np.eye(cell_basis_l.basis_dimension) # # ------------------------------------------------------------------------------------------------------ # a = ( # cell_integration_vector_l @ m_mat # - cell_integration_vector_k1[1:] @ local_reconstruction_operator[r0 + 1 : r1, :] # ) # a = (1.0 / cell_integration_vector_k1[0]) * a # local_reconstruction_operator[r0 : r0 + 1, :] = a return local_reconstruction_operator
def compute_hybrid_matrices( self, cell: Cell, faces: List[Face], cell_basis_l: Basis, cell_basis_k: Basis, cell_basis_k1: Basis, face_basis_k: Basis, unknown: Unknown, ): """ ================================================================================================================ Method : ================================================================================================================ ================================================================================================================ Parameters : ================================================================================================================ - ================================================================================================================ Returns : ================================================================================================================ - """ # ============================================================================================================== # GRADIENT OPERATOR / STABILIZATION OPERATOR # ============================================================================================================== mat_F_phi_k_phi_l_list = [] mat_F_phi_k_psi_k_list = [] for mface in mfaces: mat_F_phi_k_phi_l = Integration.get_cell_mass_matrix_in_face( mcell.cell, mface.face, cell_basis_k, cell_basis_l) mat_F_phi_k_phi_l_list.append(mat_F_phi_k_phi_l_list) # ---------------------------------------------------------------------------------------------------------- mat_F_phi_k_psi_k = Integration.get_hybrid_mass_matrix_in_face( mcell.cell, mface.face, cell_basis_k, face_basis_k, mface.face.reference_frame_transformation_matrix) mat_F_phi_k_psi_k_list.append(mat_F_phi_k_psi_k) # ============================================================================================================== # RECONSTRUCTION OPERATOR # ============================================================================================================== mat_F_grad_phi_k1_psi_k_list = [] mat_F_grad_phi_k1_phi_l_list = [] for mface in mfaces: mat_F_grad_phi_k1_psi_k_j_list = [] mat_F_grad_phi_k1_phi_l_j_list = [] for j in range(len(unknown.problem_dimension)): # ------------------------------------------------------------------------------------------------------ mat_F_grad_phi_k1_psi_k_j = Integration.get_hybrid_advection_matrix_in_face( mcell.cell, mface.face, cell_basis_k1, face_basis_k, mface.face.reference_frame_transformation_matrix, j, ) mat_F_grad_phi_k1_psi_k_j_list.append( mat_F_grad_phi_k1_psi_k_j) # ------------------------------------------------------------------------------------------------------ mat_F_phi_l_grad_phi_k1_j = Integration.get_cell_advection_matrix_in_face( mcell.cell, mface.face, cell_basis_l, cell_basis_k1, j) # ------------------------------------------------------------------------------------------------------ mat_F_grad_phi_k1_phi_l_j = mat_F_phi_l_grad_phi_k1_j.T mat_F_grad_phi_k1_phi_l_j_list.append( mat_F_grad_phi_k1_phi_l_j) # ---------------------------------------------------------------------------------------------------------- mat_F_grad_phi_k1_psi_k_list.append(mat_F_grad_phi_k1_psi_k_j_list) mat_F_grad_phi_k1_phi_l_list.append(mat_F_grad_phi_k1_phi_l_j_list) # ============================================================================================================== # STABILIZATION OPERATOR # ============================================================================================================== mat_F_psi_k_phi_k1_list = [] for mface in mfaces: mat_F_phi_k1_psi_k = Integration.get_hybrid_mass_matrix_in_face( mcell.cell, mface.face, cell_basis_k1, face_basis_k, mface.face.reference_frame_transformation_matrix) mat_F_psi_k_phi_k1_list.append(mat_F_phi_k1_psi_k) return ( mat_F_phi_k_phi_l_list, mat_F_phi_k_psi_k_list, mat_F_grad_phi_k1_psi_k_list, mat_F_grad_phi_k1_phi_l_list, mat_F_psi_k_phi_k1_list, )
def __init__( self, cell_faces_connectivity_matrix: Mat, mcell: Mcell, mfaces: List[Mface], cell_basis_l: Basis, cell_basis_k: Basis, cell_basis_k1: Basis, unknown: Unknown, ): """ ================================================================================================================ Class : ================================================================================================================ The Mbox class ================================================================================================================ Parameters : ================================================================================================================ - ================================================================================================================ Attributes : ================================================================================================================ - """ # ============================================================================================================== # GRADIENT OPERATOR / STABILIZATION OPERATOR # ============================================================================================================== self.mat_F_phi_k_phi_l_list = [] self.mat_F_phi_k_psi_k_list = [] for mface in mfaces: mat_F_phi_k_phi_l = Integration.get_cell_mass_matrix_in_face( mcell.cell, mface.face, cell_basis_k, cell_basis_l) self.mat_F_phi_k_phi_l_list.append(mat_F_phi_k_phi_l_list) # ---------------------------------------------------------------------------------------------------------- mat_F_phi_k_psi_k = Integration.get_hybrid_mass_matrix_in_face( mcell.cell, mface.face, cell_basis_k, face_basis_k, mface.face.reference_frame_transformation_matrix) self.mat_F_phi_k_psi_k_list.append(mat_F_phi_k_psi_k) # ============================================================================================================== # RECONSTRUCTION OPERATOR # ============================================================================================================== self.mat_F_grad_phi_k1_psi_k_list = [] self.mat_F_grad_phi_k1_phi_l_list = [] for mface in mfaces: mat_F_grad_phi_k1_psi_k_j_list = [] mat_F_grad_phi_k1_phi_l_j_list = [] for j in range(len(unknown.problem_dimension)): # ------------------------------------------------------------------------------------------------------ mat_F_grad_phi_k1_psi_k_j = Integration.get_hybrid_advection_matrix_in_face( mcell.cell, mface.face, cell_basis_k1, face_basis_k, mface.face.reference_frame_transformation_matrix, j, ) mat_F_grad_phi_k1_psi_k_j_list.append( mat_F_grad_phi_k1_psi_k_j) # ------------------------------------------------------------------------------------------------------ mat_F_phi_l_grad_phi_k1_j = Integration.get_cell_advection_matrix_in_face( mcell.cell, mface.face, cell_basis_l, cell_basis_k1, j) # ------------------------------------------------------------------------------------------------------ mat_F_grad_phi_k1_phi_l_j = mat_F_phi_l_grad_phi_k1_j.T mat_F_grad_phi_k1_phi_l_j_list.append( mat_F_grad_phi_k1_phi_l_j) # ---------------------------------------------------------------------------------------------------------- self.mat_F_grad_phi_k1_psi_k_list.append( mat_F_grad_phi_k1_psi_k_j_list) self.mat_F_grad_phi_k1_phi_l_list.append( mat_F_grad_phi_k1_phi_l_j_list) # ============================================================================================================== # STABILIZATION OPERATOR # ============================================================================================================== self.mat_F_psi_k_phi_k1_list = [] for mface in mfaces: mat_F_phi_k1_psi_k = Integration.get_hybrid_mass_matrix_in_face( mcell.cell, mface.face, cell_basis_k1, face_basis_k, mface.face.reference_frame_transformation_matrix) self.mat_F_psi_k_phi_k1_list.append(mat_F_phi_k1_psi_k)