27th March 2023

# HSL_MA78: Sparse unsymmetric finite-element system: multifrontal out of core

HSL_MA78 solves one or more sets of sparse unsymmetric equations $$\mathbf{AX} = \mathbf{B}$$ or $$\mathbf{A} ^T \mathbf{X} = \mathbf{B}$$ using an out-of-core multifrontal method. The $$n \times n$$ matrix $$\mathbf{A}$$ must be in unassembled element form, that is, $\mathbf{A} = \sum_ {k=1} ^ m \mathbf{A} ^{(k)}$

where the summation is over elements and $$\mathbf{A} ^{(k)}$$ is nonzero only in those rows and columns that correspond to variables in the $$k$$th element. For each $$k$$, the user must supply a list specifying which columns of $$\mathbf{A}$$ are associated with $$\mathbf{A} ^{(k)}$$, and an array containing $$\mathbf{A} ^{(k)}$$ in packed form. It is permissible for some of the rows and corresponding columns to be empty, that is, to appear in none of the matrices $$\mathbf{A} ^{(k)}$$; such rows and columns are ignored in determining whether the matrix is singular.

The multifrontal method is a variant of sparse Gaussian elimination. It involves the factorization $\mathbf{A} = \mathbf{PLDUQ}$

where $$\mathbf{P}$$ and $$\mathbf{Q}$$ are a permutation matrices, $$\mathbf{L}$$ and $$\mathbf{U}$$ are unit lower and upper triangular matrices, respectively, and $$\mathbf{D}$$ is a diagonal matrix. The factorization is performed by the subroutine MA78_factor and is controlled by an elimination tree that is constructed by the subroutine MA78_analyse, which needs the lists of variables in elements and an elimination sequence. Once a matrix has been factorized, any number of calls to the subroutine MA78_solve may be made for different right-hand sides $$\mathbf{B}$$. An option exists for computing the residuals. For large problems, the matrix data and the computed factors are held in direct-access files.

The efficiency of HSL_MA78 is dependent on the elimination order that the user supplies. A suitable ordering may be obtained by first assembling the sparsity pattern of the matrix $$\mathbf{A}$$ (MC57 can be used to do this) and then calling the HSL package HSL_MA68.