周波数応答解析が領域分割(MPI並列)に対応していない

概要

周波数応答解析(!SOLUTION, TYPE=DYNAMIC で !DYNAMIC 第1データ行の idx_resp = 2)は逐次実行に 限定されており、hecmw_part1 で分割したメッシュを mpirun で解析できない。固有値解析も 時刻歴応答解析もMPI並列に対応しているため、周波数応答解析だけが単一プロセスのメモリに 収まる規模に制限される。

master の 4d88c790 で確認した原因は次の4点である。

  1. 解析本体がランク0のガード内からしか呼ばれない。この内部では行列作成・境界条件・質量行列・ 可視化という集団通信を含むルーチンを呼ぶため、複数プロセスで起動するとランク0だけが 集団通信に入り、他ランクは通過してデッドロックまたは不正終了となる。

  2. 固有ベクトル・荷重・変位などの作業配列が nn_internal で確保されている。逐次実行では n_node と一致するため顕在化しないが、分散メッシュでは外部節点分が不足する。 結果出力は n_node 長の節点値配列を要求する。

  3. モード係数の内積が領域内で閉じており、領域間の総和が取られていない。該当箇所には 分散メッシュには allreduce が要るという趣旨のコメントが残されている。

  4. !DYNAMIC で指定するモニタ節点がローカル節点番号として扱われている。逐次実行では グローバル節点IDと一致するが、分散メッシュでは別の節点を指すか配列外参照となる。

また、!EIGENREAD の開始モードを1以外にすると、read_eigen_vector_res が固有ベクトルを 配列の相対添字ではなく絶対モード番号の位置に格納するため、配列外への書き込みまたは 別モードへの格納が起きる。これは逐次・並列を問わず発生する。