周期構造を持たない構造体に対しては mastruct.c で、周期対称性を持つ構造体に対しては mastructcs.c で重要な処理が行なわれます。まず matruct.c を見てみましょう。
有効な自由度は2次元フィールド nactdof に保存されます。このフィールドはモデル内の節点と同じ数の行と4つの列を持ちます。これは各節点は1つの温度自由度と3つの平行移動自由度を持つためです。1次元要素、2次元要素はルーチン「gen3delem.f」で3次元要素に拡張されるので、回転自由度は不要です。C ではこのフィールドは1次元フィールドにマッピングされます。このフィールドは節点1の自由度から始まり、次に節点2の自由度……という風に続きます。まず最初に nactdof 内のエントリーが無効化(ゼロを設定)されます。それから以下のアルゴリズムに従ってそおフィールドが(無効化または)有効化されるのです。
次に有効化されている自由度に番号(正の数)が付けられ、その後、行列の構造が要素のトポロジーと多点拘束から決定されます。
SPOOLES、ARPACK、反復法では保存スキームは行列の非ゼロな準対角位置に限定されます。スキームがこうなっているのは歴史的な事情からで、これ以外のスキーム、例えば超対角への保存は使えないと私が考えているわけではありません。保存データは以下の様に記述されます。
3つのフィールドは全て1次元で、irow のサイズは行列の非ゼロな準対角成分の数と、icol と jq のサイズは有効な自由度の数と対応します。行列の対角成分は別に保存されるのでこれらについては保存データ情報は不要です。
熱的な成分が存在する場合には、機械的な成分の後ろに保存されます。機械的な成分の数は neq[0](C言語表記)、成分の総数は neq[1] になります。同様に非ゼロの機械的準対角成分は nzs[0]、準対角成分の総数は nzs[1]になります。熱機械問題では機械と熱の部分行列は分離されていると仮定されます。つまり剛性行列内で機械的自由度と熱的自由度の間にはつながりはないとされるのです。従って機械的自由度と熱的自由度は保存フィールド irow の2つの分離された領域を占めます
mastructcs ファイルでは周期対称性のある構造体の保存データが計算されます。このデータは自由度の量の2倍になります。これは周期対称性があると複素数系になり実数系の2倍のサイズがいるためです。周期対称性のある方程式は複素数の係数を持つ線形方程式となるので異なる扱いが必要になりますが、保存データのためのフィールドは同一です。