###
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`

.