この記事について
『(Number of) ITERATIONS DID NOT SATISFY CONVERGENCE REQUIREMENTS FOR THE POINT (Number) (EQLBRM) 』なエラーが出た時の対処法メモ.多分末尾にこんな感じのエラーが出てると思う.
......
50 ITERATIONS DID NOT SATISFY CONVERGENCE REQUIREMENTS FOR THE POINT 1 (EQLBRM)
RP-1311に全部書いてある(はず)ので隅から隅まで読んで♡という話ではある.
結論としての対処法
2つ方法を書いておくが,問題の根っこは同じなので途中までは同じ.
・まずCEAで反復計算が止まったときのoutputファイルの一番下の方を見る
......
POINT ITN T AL O H C NA 1 33 300.000 32.007 -151.095 -5.903 -27.295 13.070 ADD AL2O3(a) 1 11 300.000 -176.638 -108.215 -5.589 -28.487 -30.063 ADD NaOH(a) 1 4 300.000 -176.638 -108.215 -5.586 -28.495 -64.654 ADD H2O(L) 1 3 300.000 -171.194 -111.845 -5.579 -28.508 -61.031 ADD NaALO2(a) SINGULAR MATRIX, ITERATION 0 VARIABLE 9(EQLBRM) TRY REMOVING CONDENSED SPECIES (EQLBRM) REMOVE H2O(L) 50 ITERATIONS DID NOT SATISFY CONVERGENCE REQUIREMENTS FOR THE POINT 1 (EQLBRM)
ここの途中に出てくる"ADD なんちゃら"の部分に書いてある反応種を全部抜き出してメモする.
このあと方法①と方法②に分かれる.たぶん方法①のほうが正しいと思う
・方法① : inpファイルのDataset outとDataset endの間にDataset inseオプションを使い,問題になる反応種を最初から計算に含める
......
output short insert NaALO2(a) end
みたいな感じ.複数個の場合はスペース2つ挟んで入れたい反応種を書き連ねる.
・方法②(非推奨) : その反応種を無視できると判断できる場合,同様にDataset outとDataset endの間にDataset omitオプションを使って問題になる反応種を計算から除外する.
......
output short omit NaALO2(a) end
みたいな感じ.いずれの場合も種名は正確に(ライブラリに入ってる種名で)書かないと死ぬ.
環境
Macbook pro 13-inch 2020 (macOS Monterey ver12.6.6)
NASA-GLENN Chemical Equilibrium Program CEA2 04/21/04
LAST thermo.inp UPDATE: 9/09/04
NASA CEAについて
言わずとしれた化学平衡計算プログラム.我らの御神体にして御本尊.神.本邦では今現在もはや入手できないと聞く.たぶんRP-1311に全部書いてある.筆者は正直中身は全然わからないまま,便利なツールとしてのみ用いている.
https://www1.grc.nasa.gov/research-and-engineering/ceaweb/
何が問題だったのか
(未確定,推定)おそらく反復計算初期値パラメータに含まれていない凝縮種をあとから追加する際にパラメータが変だったので発散している……?(ふわふわ理解)
問題発生の過程
ある混合物の生成熱計算をしていたところ(tpモード常温常圧条件),CEAがエラーを吐いて止まる現象が発生.
50 ITERATIONS DID NOT SATISFY CONVERGENCE REQUIREMENTS FOR THE POINT 1 (EQLBRM) CALCULATIONS STOPPED AFTER POINT 0(EQLBRM)
問題解決の過程
①RP1311-2の該当箇所(6.2)を確認する:
(Number of) ITERATIONS DID NOT SATISFY CONVERGENCE REQUIREMENTS FOR THE POINT (Number) (EQLBRM)
Fatal error. The maximum number of iterations permitted to obtain convergence is either 50+ Ns/2 if trace is included in the outp dataset or 50 otherwise. Generally, convergence is obtained in considerably fewer iterations. The number 50 + Ns/2 was somewhat arbitrarily selected to indicate that, if convergence has not been reached by that number, the problem probably will not converge at all. This situation occurs rarely. When it occurs, this message is printed, as well as the first EQLBRM message. If the cause of nonconvergence is not obvious from the output, it may be helpful to rerun the problem with intermediate output. An examination of this output often pinpoints the source of the difficulty.
・致命的なエラーだよ
・反復は(traceオプションを使ってない場合は)普通50回までで,それまでに収束しないケースはめったにないよ(なんかおかしいよ)
・出力から原因がわかんない場合は中間結果を出力するモード(intermediate output)で実行してその出力を調べるといいよ
なるほど?
②intermediateを入れて再実行する(RP1311-2の2.5.2参照).
この場合,outputにdebug=(計算ポイント)を入力する.今回はPOINT 1でしか計算していないので
......
output debug=1 end
こんな感じ.やたらと長い出力が出てくる.どうにも収束せず発散しているっぽい雰囲気はわかるのだが,詳細はちんぷんかんぷんでぜんぜんわからず.この辺はわたしの無理解によるものなので,分かる人は分かるかもしれない(分かる人はこんなブログ見ない).
③RP1311-2 6.2の文中に出てきたtraceオプションを試す(RP1311-2 2.5.6参照).
先に見た①の内容的に,traceオプションを使うと収束制限回数が変わるようなので試してみる.同様に
......
output debug=1 trace=1.e-15 end
とする.とんでもなく長い出力が出てきて,収束判定が伸びているのはわかるが(145回まで伸びていた),結局収束せず.
しかしながら,やたら長い行列式を眺めてるとなんか変な値があることに気づく.Njは他の物質ではすべてゼロか正の値なのに,NaALO2(a)だけはマイナスの値を取っている.この辺でNaAlO2(a)が怪しいとにらみ始める.
④NaAlO2(a)のthermo.libを確認する
先に断っておくと,ここは本当に無駄足だった.Nasa PolynomialとAerothem format(あとNISTの偉大さ)を再確認するだけのお話.
(この時点で正気を失っていたので)thermo.libに収録されているNaAlO2(a)の熱化学データがおかしいのではないか,近似がうまく行ってないのではないか?と疑い始める.NISTが作っている,NIST-JANAF Thermochemical Tablesが種本になっているっぽいので,このデータをもとにプロットしてThermoとNIST-JANEFの比較,あとついでに見つけたAerochem formatでの比較を試みた.

やはり先人は偉大
完璧に一致していた.NASA Polynomialは偉大だった(正気に戻る).
⑤覚悟を決めてRP1311-1を読み始める
tpモードではギブス自由エネルギーの最小化を解いているのでそのへん(RP1311-1 2.3節以下)を読むがぜんぜんなんもわからず.
(完全に余談だが,3章冒頭に "(前略)2.3.1項・2.3.2項・2.4.1項・2.4.2項で議論したNewton-Rapson法によって平衡計算を行うのに難しいことはひとつも無いはずである" とか書かれており,生きていてごめんなさい……の顔になった)
引き続いて3章を読み進めていく.と,
(3.1節後半)
確かに,この単純な手順では初期推定値がよくないことが多い.しかし,数多くの化学系に対して計算可能である汎用化学計算プログラムを構築するためには,"良い推定値を得るために多くの特別なルーチンを考案する"という代替案よりも,この手法の方が好ましいと我々は考えている.さらに,この推定技法は,任意の点スケジュールの最初の計算点に対してのみ使用される.最初の計算点以降のすべてのポイントでは,前の計算点の結果が次の初期推定値として機能する.
良い初期推定値を得ようとしない場合,収束が "保証 "されるのかという疑問が生じる.この疑問については3.3節で議論する.
ん?
(3.3節後半)
3.2節で指摘したように,CEAプログラムが許容する最大反復回数は50+NS/2である.このプログラムによって解かれた数百種類の問題のほとんどでは,この回数より少ない回数で収束が得られた.任意の初期推定値から開始する最初の計算点では,典型的な反復回数は8~20回であった.その後の計算点では,以前の計算点の結果を初期推定に使用するため、反復回数は3~10回が典型的であった.たとえば,パートIIで示したサンプル問題では,最初の計算点の反復回数は9~15回であった.特殊な場合では,補正行列の解が得られないことがありうる.このような状況に対処する技法については3.6節で述べる.
エラーは"50 ITERATIONS DID NOT SATISFY CONVERGENCE
REQUIREMENTS"でしたね.
(3.4節冒頭)
INSERTレコードが使用されない限り(本レポートのパートIIを参照),設定された計算点のうち最初の計算点の計算が収束するまでの反復においては,プログラムは気体種のみを考慮する.最初の計算点以降の各計算点においては,プログラムは一つ前の計算点の結果を初期推定値として使用する.収束するたびに,プログラムは自動的に濃縮された化学種が含まれているか,あるいは除去されているかを確認する.
ここでようやく"INSERT"オプションにたどり着く.
⑥RP-1311-2に戻って"insert"で検索.
(2.6.3冒頭)
dataset inseは,現在の問題における予定された計算スケジュールについて,最初の計算点での計算にどの凝縮種を生成物として含めるかを指定する.化学種名は生成物熱力学データファイルthermo.lib(付録B)で指定されたものでなければならない.このデータセットは通常任意であるが,収束を得るために必要な場合もある.
はい.なるほど…….そうですか.
insertオプションを使って,怪しいと睨んでいた凝縮種の皆さんを初回から計算にぶちこんだら完璧に機能したので方法が確立.同様にomitしても機能したが,あまり健全ではないのでinsertが正しいでしょう,という気がする(収束しなかったら弾かれるわけだし).
反省点
ちゃんとツールは理解してから使いましょう.マニュアルとか揃ってるものは特に.
あと後進のためにマニュアルをみんな作ろうね,できればわかりやすいやつ <どくへび>


