SetSparsity
The SetSparsity
method is used to establish the sparsity pattern in a CSR (Compressed Sparse Row) matrix based on finite element degrees of freedom (FEDOF). This is a crucial operation for efficiently assembling and storing finite element matrices. The method offers two implementations to handle different sparsity pattern generation scenarios.
Interface 1
Single FEDOF Sparsity Pattern
MODULE SUBROUTINE SetSparsity1(obj, mat)
CLASS(FEDOF_), INTENT(INOUT) :: obj
TYPE(CSRMatrix_), INTENT(INOUT) :: mat
END SUBROUTINE SetSparsity1
Purpose
Creates a sparsity pattern in a CSR matrix using a single FEDOF object. This implementation is typically used for matrices representing operations within a single finite element space (like mass or stiffness matrices).
Parameters
obj
: The FEDOF object that contains degree of freedom informationmat
: The CSR matrix where the sparsity pattern will be established
Algorithm
- Retrieves the mesh pointer from the FEDOF object
- Allocates connectivity array based on maximum total connectivity
- For each element in the mesh:
- Gets the connectivity for the element
- For each degree of freedom in the element:
- Sets the sparsity pattern in the matrix for this DOF with respect to all other DOFs in the element
- Finalizes the sparsity pattern
Interface 2
FEDOF to FEDOF Interaction
MODULE SUBROUTINE SetSparsity2(obj, col_fedof, cellToCell, mat, ivar, jvar)
CLASS(FEDOF_), INTENT(INOUT) :: obj
CLASS(FEDOF_), INTENT(INOUT) :: col_fedof
INTEGER(I4B), INTENT(IN) :: cellToCell(:)
TYPE(CSRMatrix_), INTENT(INOUT) :: mat
INTEGER(I4B), INTENT(IN) :: ivar
INTEGER(I4B), INTENT(IN) :: jvar
END SUBROUTINE SetSparsity2
Purpose
Creates a sparsity pattern in a CSR matrix using two FEDOF objects. This implementation is used for matrices representing operations between different finite element spaces (like coupling or transfer matrices).
Parameters
obj
: The row FEDOF object that contains degree of freedom informationcol_fedof
: The column FEDOF object that contains degree of freedom informationcellToCell
: Array mapping element indices from row to column meshmat
: The CSR matrix where the sparsity pattern will be establishedivar
: Physical variable index in rowjvar
: Physical variable index in column
Algorithm
- Retrieves mesh pointers from both FEDOF objects
- Allocates connectivity arrays for both row and column elements
- For each element in the row mesh:
- Gets the connectivity for the row element
- Finds the corresponding element in the column mesh using cellToCell
- Gets the connectivity for the column element
- For each DOF in the row element:
- Sets the sparsity pattern in the matrix for this row DOF with respect to all column DOFs
Interface 3
Multiple FEDOF Interactions
INTERFACE FEDOFSetSparsity
MODULE SUBROUTINE SetSparsity3(fedofs, mat)
CLASS(FEDOFPointer_), INTENT(INOUT) :: fedofs(:)
TYPE(CSRMatrix_), INTENT(INOUT) :: mat
END SUBROUTINE SetSparsity3
END INTERFACE FEDOFSetSparsity
There is also a third implementation (SetSparsity3
) that handles sparsity pattern generation for multiple FEDOF objects. This is particularly useful for complex coupled problems with multiple physics or domains.
Usage Example
! For a single FEDOF (e.g., creating a stiffness matrix)
TYPE(FEDOF_) :: myFEDOF
TYPE(CSRMatrix_) :: stiffnessMatrix
! Set up the sparsity pattern for the matrix
CALL myFEDOF%SetSparsity(stiffnessMatrix)
! For FEDOF to FEDOF interaction (e.g., coupling two different fields)
TYPE(FEDOF_) :: velocityFEDOF, pressureFEDOF
TYPE(CSRMatrix_) :: couplingMatrix
INTEGER(I4B), ALLOCATABLE :: cellMap(:)
! Set up cellMap to map between velocity and pressure elements
! ...
! Set up the sparsity pattern for the coupling matrix
CALL velocityFEDOF%SetSparsity(pressureFEDOF, cellMap, couplingMatrix, 1, 2)
Notes
- The sparsity pattern defines which entries in the matrix are non-zero, allowing for efficient storage and computation.
- The methods check various conditions in debug mode to ensure validity of the inputs.
- The third variant (
SetSparsity3
) is particularly useful for block matrices with multiple physical variables. - After setting the sparsity pattern, the matrix can be assembled efficiently by only computing and storing the non-zero entries.