This important task is performed in mastruct.c for structures not exhibiting cyclic symmetry and mastructcs.c for cyclic symmetric structures. Let us focus on matruct.c.

The active degrees of freedom are stored in a two-dimensional field nactdof. It has as many rows as there are nodes in the model and four columns since each node has one temperature degree of freedom and three translational degrees. Because the 1-d and 2-d elements are expanded into 3-d elements in routine “gen3delem.f” there is no need for rotational degrees of freedom. In C this field is mapped into a one-dimensional field starting with the degrees of freedom of node 1, then those of node 2, and so on. At first, all entries in nactdof are deactivated (set to zero). Then they are (de)activated according to the following algorithm:

- In a mechanical or a thermomechanical analysis the translational degrees of freedom of all nodes belonging to elements are activated.
- In a thermal or a thermomechanical analysis the temperature degree of freedom of all nodes belonging to elements are activated.
- All degrees of freedom belonging to MPC's are activated (dependent and independent)
- The degrees of freedom corresponding to SPC's are deactivated by setting them to -2*i (i.e. a negative number) where i is the number of the SPC.
- The degrees of freedom corresponding to the dependent side of MPC's are deactivated by setting them to -(2*i-1) (i.e. a negative number) where i is the number of the MPC.

Then, the active degrees of freedom are numbered (positive numbers). Subsequently, the structure of the matrix is determined on basis of the topology of the elements and the multiple point constraints.

For SPOOLES, ARPACK and the iterative methods the storage scheme is limited to the nonzero SUBdiagonal positions of the matrix only. The scheme is as it is because of historical reasons, and I do not think there is any reason not to use another scheme, such as a SUPERdiagonal storage. The storage is described as follows:

- the field irow contains the row numbers of the SUBdiagonal nonzero's, column per column.
- icol(i) contains the number of SUBdiagonal nonzero's in column i.
- jq(i) contains the location in field irow of the first SUBdiagonal nonzero in column i

All three fields are one-dimensional, the size of irow corresponds with the number of nonzero SUBdiagonal entries in the matrix, the size of icol and jq is the number of active degrees of freedom. The diagonal entries of the matrix stored separately and consequently no storage information for these items is needed.

The thermal entries, if any, are stored after the mechanical entries, if any. The number of mechanical entries is neq[0] (C-notation), the total number of entries (mechanical and thermal) is neq[1]. In the same way the number of nonzero mechanical SUBdiagonal entries is nzs[0], the total number of SUBdiagonal entries is nzs[1]. In thermomechanical applications the mechanical and thermal sub-matrices are assumed to be distinct, i.e. there is no connection in the stiffness matrix between the mechanical and the thermal degrees of freedom. Therefore, the mechanical and thermal degrees of freedom occupy two distinct areas in the storage field irow.

File mastructcs calculates the storage for cyclic symmetric structures. These are characterized by the double amount of degrees of freedom, since cyclic symmetry results in a complex system which is reduced to a real system twice the size. The cyclic symmetry equations are linear equations with complex coefficients and require a separate treatment. The fields used for the storage, however, are the same.