# Read MAT and LUD Files Using Fortran

Read the .mat file that contains the elements of the MoM matrix A and the .lud file that contains the LU decomposition of the モーメント法 matrix A.

The .mat and .lud files are binary files, written in the native platform coding (for example, little-endian coding on the INTEL / AMD CPUs), and have a Fortran block structure using the COMPLEX data type (in either single or double precision).

Reading can be done again from Fortran using the following code fragment:
   CHARACTER MD5_CHECK*32
INTEGER VERSION
LOGICAL FILE_SINGLE_PRECISION
INTEGER ROWS, COLUMNS
INTEGER I, J

OPEN (19, FILE="filename", FORM='UNFORMATTED')

IF (VERSION.GE.2) THEN
ELSE
FILE_SINGLE_PRECISION = .FALSE.
END IF

DO J=1, COLUMNS
IF (FILE_SINGLE_PRECISION) THEN
ELSE
END IF
END DO

CLOSE (19)
MATRIX
a two dimensional array at least ROWS*COLUMNS in size to store the data in double precision (declared as DOUBLE COMPLEX).
MATRIX_S
a two dimensional array at least ROWS*COLUMNS in size to store the data in single precision (declared as COMPLEX).
The command above,
        READ (19) (MATRIX_S(I,J), I=1, ROWS)
reads a complete column of the matrix at once.

## File Structure

The structure of the .mat and .lud files are as follows:
    | length=4       | VERSION (4 bytes)                | length=4       |
| length=32      | MD5_CHECK (32 bytes)             | length=32      |
(| length=4       | FILE_SINGLE_PRECISION (4 bytes)  | length=4       |) -- Only present if VERSION >= 2
| length=4       | ROWS (4 bytes)                   | length=4       |
| length=4       | COLUMNS (4 bytes)                | length=4       |
| length=ROWS*es | MATRIX(:,1) (ROW*es bytes)       | length=ROWS*es |  -- es is 8 or 16 bytes depending on precision.
| length=ROWS*es | MATRIX(:,2) (ROW*es bytes)       | length=ROWS*es |
...
| length=ROWS*es | MATRIX(:,COLUMNS) (ROW*es bytes) | length=ROWS*es |
Here each record of interest is preceded by a length field that indicates the size (in bytes) of the record.
Note: The size of the length field is 4 bytes.

When reading these files using an external utility, such as one written in C or MATLAB, these length fields must also be considered. They can either be ignored or can be used to detect errors in the reading process.