hecmw_streqr が比較の過程で実引数を大文字に書き換える

hecmw_setup_util の hecmw_streqr は2つの名前が大文字小文字を無視して等しいかを返す関数だが、比較の前に hecmw_strupr を実引数に対して呼んでいるため、判定するだけで呼び出し側のデータが大文字に書き換わる。hecMESH の集合名・材料名・振幅名や、cntファイル由来の名前バッファが対象になる。書き換えは len_trim が一致するときだけ、しかも判定結果が偽の場合にも起きるため、同じ配列の中に大文字化された要素とされていない要素が混在する。

また、intent(in) の仮引数をそのまま hecmw_streqr に渡す呼び出し経路がある。hecmw_setup_util_f.f90 の append_new_group と fstr_setup_util.f90 の append_new_amplitude がこれにあたる。intent(in) の仮引数への書き込みは規格違反であり、その先の実引数が定数の場合は読み取り専用領域への書き込みとなってSIGSEGVで停止する。現在の呼び出し元はいずれも変数を渡しているため顕在化していない。

比較用の大文字化は、iachar で取り出した文字コードを局所変数の上で行えば足りる。そうすれば実引数を変えずに同じ判定ができ、s1 と s2 を intent(in) で宣言できる。

副作用による大文字化に頼らず == で名前を比較している箇所も残っている。!CONTACT_INTERFERENCE の接触ペア名がこれで、cntファイルに小文字で書くと Error:(INTERFERENCE) Inconsistence of contact_pair in CONTACTS: 1 で停止する。mshファイルの名前は読み込み時に常に大文字化されるのに対し、cntファイルの値は原文のまま保持されるためである。!CONTACT と !EMBED は読み込み時に fstr_strupr を適用しているが、!CONTACT_INTERFERENCE だけ漏れている。tests/with_mumps/contact_slag_mumps の 2box_hex_nofric に !CONTACT_INTERFERENCE を加え、接触ペア名を小文字にすると再現する。