回転楕円体格子系のための格子変換内挿テーブル生成パッケージ (SPRING; SPheroidal Coordinates Regridding INterpolation table Generator)のプログラムのひとつ。
解像度変換及び格子変換内挿テーブル(以下「変換テーブル」)の生成を行う。
・格子変換の際は基本的に変換テーブルも同時に生成する。
本バージョンにおいて、変換テーブルを生成せず直接格子変換が可能なのは以下のケースに限られる。
(1) ラスター vs ラスター (mode: intpl)
(2) グリッド vs グリッド (mode: intpl)
最終的には全てのケースで直接変換を可能にする予定。
[2020/03/30]
・格子線の位置関係を求めるアルゴリズムの例外処理におけるバグを修正した。(mod_rt__MP_detRelationsOfGrids)
・変換テーブルの整形において配列の大きさが異なっていたのを修正した。(mod_rt__MP_makeRegriddingTable_raster)
[2020/03/27]
・ラスターデータ読み込み時の南北反転バグを修正した。(mod_io__MP_readValue)
・ラスター格子同士の解像度変換において、変換テーブルを生成しない直接変換スキームを実装した。(mod_io, mod_rt, mod_regrid)
[2020/03/20]
・ラスター格子同士の変換テーブルを作成するサブルーチンを追加した。(mod_rt__MP_makeRegriddingTable_Raster)
・格子変換後の値を (1.0 - 欠損面積率) で除して補完する機能を追加した。(mod_io__MP_readConf__IP_init_inout_regrid, __IP_set_inout_regrid, def_types)
・欠損格子の番号のデフォルト値を NaN から 0 に変更した。 (mod_io__MP_readConf__IP_init_input_grid, __IP_set_input_grid, def_types)
・サブルーチン名を変更した。(lib_utils __MP_extend_array => __MP_extend_array)
[2020/03/18]
・非ラスターグリッド同士の変換テーブルの長さを求めるルーチンのアルゴリズムを修正した。(mod_rt__MP_makeRegriddingTable_notRaster)
・非等間隔格子の検証部分における参照格子番号のずれを修正した。(mod_rt__MP_detRelationsOfGrid)
[2020/03/08]
・場合により入力格子番号の南北が逆転するバグを修正した。 (mod_io__MP_setIndices)
・出力データの整形時に生じるバグを修正した。 (mod_io__MP_writeRegriddedValue__IP_formatByIdxMap)
・各 namelist の outputFormat のデフォルト値を 'row' から 'formatted' に変更した。 (mod_io__MP_read_conf)
[2020/03/06]
・ファイルの読み込み終了時に装置番号が解放されないバグを修正した。 (lib_io_binary__MP_read_binary_conv)
・設定ファイルの namelist/inout_regrid/ dir が反映されないバグを修正した。 (mod_io__MP_read_conf__IP_set_inout_regrid)
1) ファイルと親ディレクトリ
入力・出力ファイルが存在するディレクトリを
dir(又は
dir_*)という変数で指定できる。
指定するとその
namelist内の全てのファイルに適用される。
ただし絶対パスで記述されたファイルには適用されない。
(例) dir = '/home/akira/'
file1 = 'sample1.txt'
file2 = '/data7/akira/sample2.txt'
この場合、
file1は
'/home/akira/sample1.txt'、
file2は
'/data7/akira/sample2.txt'として読み込まれる。
2) 変数型
入出力データの変数型を指定できる。指定可能な型とその表記は次のとおり。ただしデータによっては一部無効。
型 |
namelist内の表記 |
1バイト整数 |
int1 |
2バイト整数 |
int2 |
4バイト整数 |
int4 |
8バイト整数 |
int8 |
4バイト浮動小数点数 (単精度実数) |
real |
8バイト浮動小数点数 (倍精度実数) |
dble |
3) エンディアン
endian(又は
endian_*)という変数でデータのエンディアンを指定できる。
リトルエンディアンの場合
'little_endian'、ビッグエンディアンの場合
'big_endian'とする。
デフォルトでは
'little_endian'である。
4) 古いデータの削除
出力ファイルが既に存在する場合にそのファイルを消去するか否かを
replaceという変数で指定できる。
デフォルトでは
.false.であり、単に上書きされる。
1. 設定ファイルを作成する。詳細は後述。
2. adm/Mkincludeを編集する。
2. src/libに移動し次のコマンドを実行する。必要に応じてMakefileを編集する。
3. src/regridに移動し次のコマンドを実行する。必要に応じてMakefileを編集する。
4. メインプログラム main を実行する。コマンドライン引数に設定ファイルを与える。
1. namelist/input_grid_origin/, /input_grid_destination/
◇ 格子系を定義する
変数 |
型 |
必須 |
説明 |
デフォルト値 |
nx |
int4 |
o |
経度方向の格子数 |
0 |
ny |
int4 |
o |
緯度方向の格子数 |
0 |
west |
dble |
|
西端の経度 |
0 |
east |
dble |
|
東端の経度 |
360 |
south |
dble |
|
南端の緯度 |
-90 |
north |
dble |
|
北端の緯度 |
90 |
south2north |
logical |
|
格子の南北の始まりが南である |
.true. |
raster |
logical |
|
格子がラスターデータである |
.false. |
dir |
char* |
|
入力ファイルの親ディレクトリ |
|
file_lon |
char* |
|
南北方向格子線の経度のファイル |
|
file_lat |
char* |
|
東西方向格子線の緯度のファイル |
|
file_idxmap |
char* |
|
格子番号のファイル |
|
file_idxout |
char* |
|
出力格子番号のファイル |
|
dtype_coord |
char |
|
file_lat、file_lonの変数型 |
dble |
dtype_idxmap |
char |
|
file_idxmapの変数型 |
int4 |
dtype_idxout |
char |
|
file_idxoutの変数型 |
int4 |
length_idxout |
int4 |
|
file_idxoutの格納データ数 |
0 |
miss_idx |
int8 |
|
格子番号の欠損値 |
0 |
endian |
char |
|
上記データのエンディアン |
little_endian |
latlon_deg |
logical |
|
緯度経度の単位が度である |
.true. |
namelist/input_grid_origin/、/input_grid_destination/
● それぞれ変換元(=送信側)格子、変換先(=受信側)格子を指す。
file_lon、file_lat
● 格子線の緯度経度情報。
●
file_lonには東端から西端までの大きさ
nx+1の
1次元配列を、
file_latは南端から北端(または北端から南端)までの大きさ
ny+1の
1次元配列を格納する。
格子の中心緯度経度ではなく格子線の緯度経度であることに注意。
● 入力は任意。与えない場合、経度は
west、
east、
nxから、緯度は
south、
north、
ny から自動的に等間隔の格子線が設定される。
file_idxmap、file_idxout、miss_idx、south2north
●
file_idxmapは格子番号を明示的に与えるためのファイルで、格子番号を
(nx,ny)の形の配列で記録しておく。この格子番号はマッピングテーブルの格子番号データに反映される。
● 入力は基本的に任意であるが、
rasterが
.true.の時は必須である(後述)。
●
miss_idxで指定した番号を持つ格子は欠損格子と見なされ、マッピングテーブルには含まれず、また格子変換の計算においてもその格子は無視される(つまりその格子が持つ値は内挿計算等の結果に一切影響しない)。
なお内部的には一度倍精度浮動小数点数として読み込まれたのち四捨五入して整数化される。したがって設定ファイルで浮動小数点数として指定することも可能であるが、実質的には整数型の引数と考えてよい。
● 格子番号の配列は
south、west等で指定した領域と対応している必要があり、デフォルトでは
(1,1)が西南端、
(nx,ny)が東北端の格子番号を示すものと解釈される。
南北については入れ替えが可能で、
south2northを
.false.とすると、
(1,1)が西北端、
(nx,ny)が東南端と見なされる。
ただし
file_latが指定されている場合は
south2northは無視され、南北の方向は緯度情報の格納順から判断される。
●
file_idxmapで明示的に格子番号を与えない場合、領域内の格子に
1から
nx*nyの通し番号が自動的に与えられる。
この際
south2northが
.true.であれば(あるいは
file_latの持つデータが南から北の並びになっていれば)南から北に向かって番号が大きくなる。また経度方向を先に数えるため、例えば
(nx,1)=(1,1)+nx-1となる。
●
file_idxoutは出力データの形を制御するのに用いる。マッピングテーブルの誤差データ、格子変換の出力データなどを、これに記録された格子番号配列データと対応した形で出力することが可能となる(実際にこれを用いるかはそれぞれの出力データについて指定する)。
図1. 自動的に与えられた格子番号の例 (south2northが.true.の場合)。
図2. 海洋部分を欠損格子とする場合の格子番号の例。このときmiss_idxを-1とする。なおここでは陸面について通し番号が与えられているが、これはユーザーが自由に決めることが出来る。
raster
● 入力データが何らかの格子系をラスター化したものであるとき、これを
.true.とする。また
file_idxmapが必須となる。
● ここでラスターデータは、何らかの格子系を格子数
nx*nyの(高解像度)緯度経度格子で表現したものを指す。高解像度格子は対応する元格子の格子番号を持っており、それを
(nx,ny)の配列として保存したものが
file_idxmapとなる。
図3. ラスター化されたNICAM格子。中央図の緑色の緯度経度格子はいずれも格子番号1299を持つ。
2. namelist/output_regriddingTable/
◇ マッピングテーブルの出力を制御する
変数 |
型 |
必須 |
説明 |
デフォルト値 |
dir |
char* |
|
出力ファイルの親ディレクトリ |
|
file_send |
char* |
|
送信側格子番号の出力ファイル |
|
file_recv |
char* |
|
受信側格子番号の出力ファイル |
|
file_area |
char* |
|
格子の重複面積の出力ファイル |
|
file_coef |
char* |
|
内挿の重みの出力ファイル |
|
dtype_send |
char |
|
file_sendの変数型 |
int4 |
dtype_recv |
char |
|
file_recvの変数型 |
int4 |
dtype_area |
char |
|
file_areaの変数型 |
dble |
dtype_coef |
char |
|
file_coefの変数型 |
dble |
rec_send |
int4 |
|
file_sendのレコード番号 |
1 |
rec_recv |
int4 |
|
file_recvのレコード番号 |
1 |
rec_area |
int4 |
|
file_areaのレコード番号 |
1 |
rec_coef |
int4 |
|
file_coefのレコード番号 |
1 |
file_area_org |
char* |
|
送信側格子面積の出力ファイル |
|
file_area_dst |
char* |
|
受信側格子面積の出力ファイル |
|
file_area_send |
char* |
|
送信側格子面積の出力ファイル |
|
file_area_recv |
char* |
|
受信側格子面積の出力ファイル |
|
file_rerr_send |
char* |
|
送信側格子面積の相対誤差の出力ファイル |
|
file_rerr_recv |
char* |
|
受信側格子面積の相対誤差の出力ファイル |
|
dtype_area_org |
char |
|
file_area_orgの変数型 |
dble |
dtype_area_dst |
char |
|
file_area_dstの変数型 |
dble |
dtype_area_send |
char |
|
file_area_sendの変数型 |
dble |
dtype_area_recv |
char |
|
file_area_recvの変数型 |
dble |
dtype_rerr_send |
char |
|
file_rerr_sendの変数型 |
dble |
dtype_rerr_recv |
char |
|
file_rerr_recvの変数型 |
dble |
rec_area_org |
int4 |
|
file_area_orgのレコード番号 |
1 |
rec_area_dst |
int4 |
|
file_area_dstのレコード番号 |
1 |
rec_area_send |
char |
|
file_area_sendのレコード番号 |
1 |
rec_area_recv |
char |
|
file_area_recvのレコード番号 |
1 |
rec_rerr_send |
int4 |
|
file_rerr_sendのレコード番号 |
1 |
rec_rerr_recv |
int4 |
|
file_rerr_recvのレコード番号 |
1 |
miss_debug |
dble |
|
file_area_*, file_rerr_*の欠損値 |
NaN |
outputFormat |
char |
|
file_area_*, file_rerr_*の出力形式 |
formatted |
outputFormat_org |
char |
|
file_area_org, file_rerr_orgの出力形式 |
formatted |
outputFormat_dst |
char |
|
file_area_dst, file_rerr_dstの出力形式 |
formatted |
endian |
char |
|
出力ファイルのエンディアン |
little_endian |
replace |
logical |
|
出力ファイルが既に存在する場合削除する |
.false. |
file_area_org、file_area_send、file_rerr_send、outputFormat_org、miss_debug
●
file_area_org、file_area_sendに出力されるのは、いずれも変換元格子(=送信側格子)の面積である。
● 前者(S1)は入力データから直接計算したもの、後者(S2)はマッピングテーブルから計算したもので、
file_rerr_sendにはその相対誤差
(S2-S1)/S1が出力される。
● そのまま出力する場合は
outputFormat_orgを
'row'、格子番号で整形する場合は
'formatted'とする。
namelist
/input_grid_origin/で
file_idxoutが指定されていた場合、それに対応した形で出力が行われる。
すなわち
file_idxoutが持つ格子番号配列と同じ形状で、各要素が格子番号に対応した値(面積又は相対誤差)を持つような配列が出力される。
これが指定されていない場合は自動的に生成された格子番号が用いられる。
● 欠損格子の面積と相対誤差は
miss_debugとなる。
●
file_area_dst、file_area_recv、file_rerr_recvについても同様である。
outputFormat、outputFormat_org、outputFormat_dst
outputFormat_org又は
outputFormat_dstの値が指定されていない場合、
outputFormatの値が用いられる。
outputFormatも指定されていない場合はデフォルト値が用いられる。
3. namelist/input_regriddingTable/
◇ 既に存在するマッピングテーブルを用いる
変数 |
型 |
必須 |
説明 |
デフォルト値 |
length |
int8 |
|
入力ファイルの要素数 |
0 |
dir |
char* |
|
入力ファイルの親ディレクト |
|
file_send |
char* |
|
送信側格子番号の入力ファイル |
|
file_recv |
char* |
|
受信側格子番号の入力ファイル |
|
file_coef |
char* |
|
内挿の重みの入力ファイル |
|
dtype_send |
char |
|
送信側格子番号のデータ型 |
int4 |
dtype_recv |
char |
|
受信側格子番号のデータ型 |
int4 |
dtype_coef |
char |
|
内挿の重みのデータ型 |
int4 |
rec_send |
int4 |
|
送信側格子番号のレコード番号 |
1 |
rec_recv |
int4 |
|
受信側格子番号のレコード番号 |
1 |
rec_coef |
int4 |
|
内挿の重みのレコード番号 |
1 |
endian |
char |
|
入力ファイルのエンディアン |
little_endian |
length
● 各ファイルに記録されたデータの要素数(ファイル間で共通)。
4. namelist/inout_regrid/
◇ データの格子変換を行う
変数 |
型 |
必須 |
説明 |
デフォルト値 |
mode |
char |
|
内挿方式 |
intpl |
kind |
char |
|
変換元データの形式 |
(他の設定に依存) |
dir |
char* |
|
入出力ファイルの親ディレクトリ |
|
dir_val_in |
char* |
|
file_val_in の親ディレクトリ |
|
dir_val_out |
char* |
|
file_val_out の親ディレクトリ |
|
dir_idxmap |
char* |
|
file_idxmap の親ディレクトリ |
|
dir_idxout |
char* |
|
file_idxout の親ディレクトリ |
|
dir_missfrac |
char* |
|
file_missfrac の親ディレクトリ |
|
file_val_in |
char* |
|
変換元データのファイル |
|
file_val_out |
char* |
|
変換先データのファイル |
|
file_idxmap |
char* |
|
変換元データの形状のファイル |
|
file_idxout |
char* |
|
変換先データの形状のファイル |
|
file_missfrac |
char* |
|
変換先格子の欠損値の割合のファイル |
|
dtype_val_in |
char |
|
file_val_in の変数型 |
dble |
dtype_val_out |
char |
|
file_val_out の変数型 |
dble |
dtype_idxmap |
char |
|
file_idxmap の変数型 |
int4 |
dtype_idxout |
char |
|
file_idxout の変数型 |
int4 |
dtype_missfrac |
char |
|
file_missfrac の変数型 |
dble |
rec_val_in |
int4 |
|
file_val_in のレコード番号 |
1 |
rec_val_out |
int4 |
|
file_val_out のレコード番号 |
1 |
rec_idxmap |
int4 |
|
file_idxmap のレコード番号 |
1 |
rec_idxout |
int4 |
|
file_idxout のレコード番号 |
1 |
rec_missfrac |
int4 |
|
file_missfrac のレコード番号 |
1 |
endian_val_in |
char |
|
file_val_in のエンディアン |
little_endian |
endian_val_out |
char |
|
file_val_out のエンディアン |
little_endian |
endian_idxmap |
char |
|
file_idxmap のエンディアン |
little_endian |
endian_idxout |
char |
|
file_idxout のエンディアン |
little_endian |
endian_missfrac |
char |
|
file_missfrac のエンディアン |
little_endian |
miss_val_in |
char |
|
file_val_in の欠損値 |
NaN |
miss_val_out |
char |
|
file_val_out の欠損値 |
NaN |
length_idxmap |
int8 |
|
file_val_in, file_idxmap の要素数 |
0 |
length_idxout |
int8 |
|
file_val_out, file_idxout の要素数 |
0 |
thresh_miss |
dble |
|
欠損値の割合の閾値 |
1.d0 |
complement |
logical |
|
変換後の値を補完する |
.false. |
outputFormat |
char |
|
出力形式 |
formatted |
endian |
char |
|
入出力ファイルのエンディアン |
little_endian |
replace |
logical |
|
出力ファイルが既に存在する場合削除する |
.false. |
● この
namelistはいくつでも指定することが出来る。従って送信側格子(変換先格子。以後
SEND)と受信側格子(変換元格子。以後
RECV)の組み合わせが同じであれば複数のデータを一度の実行でまとめて変換することが出来る。
なお設定は
namelist間で一切継承されない。
mode
● 内挿方式。
'intpl'、'select'が指定可能。
●
'intpl'では重み付け平均を行う。
●
'select'では面積率の最も大きい値を選択する。
● 欠損値の扱いについては後述の
thresh_missの項を参照。
kind
● 変換元データの形式。
'grid'、'raster'、'index'が指定可能。
基本的に他の設定ファイルに依存して自動的に決定されるが、明示的に指定することも可能。
●
'grid'は格子系がグリッドで定義されている(ラスターで定義されていない)場合のみ有効である。
このとき変換元データ (
file_val_in)はグリッドと同じ形状
(nx,ny)を持った配列として読み込まれる。
●
'raster'は格子系がラスターで定義されている場合のみ有効である。
このとき変換元データ(
file_val_in)はラスターと同じ形状
(nx,ny)を持った配列として読み込まれる。
●
'index'では変換元データが
file_idxmapと対応するものと解釈される。
thesh_miss
● 変換先格子の欠損面積率
\(f_{miss}\)は次で定義される。
$$ f_{miss} = (S_1 + S_2) / S $$
ここで
\(S_1\):
RECVと
SENDとの重複部分の中で、
SENDが欠損値
miss_val_inである部分の面積、
\(S_2\):
RECVの中で、
SENDが定義されていない部分の面積、
\(S\):
RECVの面積。
\(f_{miss}\) >
thresh_missのとき、
RECVには欠損値
miss_val_outが与えられる。
complement
● 変換先格子の中で、変換元欠損格子との重複面積の占める割合を欠損面積率と呼ぶ。格子変換は重複面積率を重みとして重み付け平均によって行われるため、欠損面積率が大きいほど変換先の値は小さくなりやすい。
これを避けたい場合、
complementを
.true.とすることで、変換先の値を
(1.0 - 欠損面積率)で除して補完し、欠損面積率の影響を排除することができる。ただし、欠損面積率が
thresh_missを超えており、変換先の値が欠損値となっている格子に対しては適用されない。
5. namelist/opt_earth/
◇ 地球の定数を設定する
変数 |
型 |
必須 |
説明 |
デフォルト値 |
mode |
char |
|
地球の形状 |
sphere |
radius |
dble |
|
地球半径(m) |
6378100.0 |
eqradius |
dble |
|
赤道半径(m) |
6378137.0 |
flattening |
dble |
|
扁平率 |
1/298.257222101 |
eccentricity2 |
dble |
|
離心率の平方 |
flattening*(2-flattening) |
eccentricity |
dble |
|
離心率 |
eccentricity2**0.5 |
mode
●
'sphere'、'ellips'のいずれかが指定可能。
'sphere'のとき地球は完全球体、
'ellips'のとき回転楕円体として扱われる。
radius
●
mode が
'sphere'のときのみ有効。
eqradius、eccentricity2、eccentricity、flattening
●
mode が
'ellips'のときのみ有効。
●
eccentricity、eccentricity2、flatteningは、このうちいずれか一つのみ指定可能。
eccentricity\(e\)、
flattening\(f\)の関係式は次のとおり。
$$ e^2 = f(2-f) $$
● デフォルトでは
GRS80楕円体として表の値が与えられる。