Пример #1
0
 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)
Пример #2
0
 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,
     )
Пример #3
0
 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)
Пример #4
0
 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
Пример #5
0
 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)
Пример #6
0
 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,
     )