気象データでRange check error
TRNSYSでタイムステップを1h未満(例えば0.25h)にして1年以上の期間を計算しようとしたら、2年目でRange check errorになってしまいます。
FORTRANの割と深刻な感じのエラーメッセージが表示されます(下記)
forrtl: severe(408):fort:(10): Subscript #1 of the array P has value 8765 which is greater than the upper bound of 8764
調べてみるとType99(気象データリーダー)で発生しています。
さっそくType99をデバッグしてみると2年目の計算に入る際に宣言した配列を超えて値を参照しようとしています。(配列100個なのに、存在しない101番目を参照している感じ。ソースコードがあると、こういうとき便利でいいですね)
どうも補間処理が絡んで発生している印象なんですが、複雑すぎていまいちよく分からない。発生状況としては次の条件が揃うと、ほぼ確実に
- タイムステップが1h未満(0.25hなど)、補間処理が発生するタイムステップ
- 年越し(年末年始を挟む)、データの先頭への戻りが発生する
対策
悩むこと数時間。ソースコードを解析して修正を試みるも、うまく行かない。(思ったのと違う処理をしているらしい)迂闊に書き換えると、他の影響も気になる。締め切りは迫る。。。ああ、どうしよう。
で、最終的には気象データを2年分用意する事で解決しました。
これどういう理屈かというと、Type99は1年分のデータを読み込んで順に値を出力しますが、年を超える計算ではデータの先頭へ戻って値を出力します。エラーは先頭へ戻す処理で発生しているので、逆に戻らないようにデータを多めに用意してあげれば回避することができます。(早く気づけよ自分。。。)
実は気象データは24hの倍数のデータが用意されていれば何日分でも処理してくれます。通常は1年分のデータが用意されているわけですが、その部分を計算期間に合わせて2年分用意してあげれば先頭へ戻らなくなります。
ということで、データをコピーして、単純に(先頭へ戻らないよう)2年目のデータを用意してあげます。
Type99 AMeDAS の例
図は拡張アメダス気象データ(拡張AMeDAS、EA気象データ)用の気象データリーダー、Type99 AMeDAS のデータファイルの例です。Header部分(1行目から<data>行まで)はそのまま、Data部分をコピーして2年分のデータを用意してください。
こうすると、エラーの原因が回避できるので、2年分の計算もできるようになります。
追記
開発元へレポート済みですが、なかなか複雑な処理をしていようです。しばらくはこの対策が有効そうです。
動作環境
以下の環境で動作を確認しています。
- Windows11 Pro(64bit, 22H2)
- TRNSYS18.04.0001(64bit)